@qwen-code/qwen-code 0.21.12-preview.3 → 0.21.12

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 (348) hide show
  1. package/bundled/qc-helper/docs/configuration/settings.md +10 -0
  2. package/bundled/qc-helper/docs/features/channels/overview.md +1 -1
  3. package/bundled/qc-helper/docs/features/channels/plugins.md +11 -11
  4. package/bundled/qc-helper/docs/features/code-review.md +1 -1
  5. package/bundled/qc-helper/docs/qwen-serve.md +99 -34
  6. package/bundled/review/SKILL.md +55 -36
  7. package/chunks/{MaxSizedBox-EIK4BHBQ.js → MaxSizedBox-ZSJJ2D5S.js} +46 -46
  8. package/chunks/{StandaloneSessionPicker-NHVJDRYD.js → StandaloneSessionPicker-WHUHQXSA.js} +65 -66
  9. package/chunks/{acp-startup-profiler-JMJBZDVO.js → acp-startup-profiler-SVPUHLXV.js} +2 -2
  10. package/chunks/{acpAgent-37UDZP64.js → acpAgent-7JOAESF5.js} +960 -539
  11. package/chunks/{agent-FAWBG7PP.js → agent-E6V3VXQR.js} +42 -42
  12. package/chunks/{agent-headless-SHK4PCCH.js → agent-headless-OEQNFOMH.js} +42 -42
  13. package/chunks/{anthropicContentGenerator-4JSC3ZFL.js → anthropicContentGenerator-YDT4EOKO.js} +25 -25
  14. package/chunks/{artifact-tool-FRMBPDPB.js → artifact-tool-4GCQQDZI.js} +5 -5
  15. package/chunks/{askUserQuestion-7G3LI3IZ.js → askUserQuestion-HZJJLR3Z.js} +2 -2
  16. package/chunks/{bridge-DEAYNDCI.js → bridge-NPBV53UA.js} +49 -49
  17. package/chunks/{build-RZS65IIX.js → build-GDBLPA24.js} +1 -1
  18. package/chunks/{channel-management-service-SKAN6NOB.js → channel-management-service-OADNGQM3.js} +4 -4
  19. package/chunks/{channel-settings-store-UIGYER6R.js → channel-settings-store-4ODLJ4X2.js} +49 -49
  20. package/chunks/{channel-worker-group-YPTB5ASD.js → channel-worker-group-IHBIHQ45.js} +7 -7
  21. package/chunks/{channel-worker-manager-4EHJSPRH.js → channel-worker-manager-GEHYJ5AE.js} +7 -7
  22. package/chunks/{channel-worker-supervisor-DZKHYFHV.js → channel-worker-supervisor-ZJIIWM4I.js} +5 -5
  23. package/chunks/{chunk-LHOG4E6Y.js → chunk-22C7BQ6D.js} +3 -3
  24. package/chunks/{chunk-DP3IHZGG.js → chunk-2AUM35J5.js} +59 -7
  25. package/chunks/{chunk-2SB4SLKC.js → chunk-2IIJTXYF.js} +1 -3
  26. package/chunks/{chunk-DYVCDQW2.js → chunk-2IVYL3IF.js} +1 -1
  27. package/chunks/{chunk-EYW54TBD.js → chunk-2ZWH53I4.js} +3 -3
  28. package/chunks/{chunk-5I5NMQCU.js → chunk-36XKGB7E.js} +3 -3
  29. package/chunks/{chunk-AQHNAA7E.js → chunk-3AEKDXKT.js} +1 -1
  30. package/chunks/{chunk-M6SXIXBV.js → chunk-3GDBZJD6.js} +6 -6
  31. package/chunks/{chunk-6XZERB6P.js → chunk-3GM5DLBI.js} +5 -5
  32. package/chunks/{chunk-4M2F7OG7.js → chunk-3LDGOQXZ.js} +6 -6
  33. package/chunks/{chunk-BKHCW2BI.js → chunk-3VUENPWF.js} +10 -0
  34. package/chunks/{chunk-ENEEQMGM.js → chunk-45NQKMYB.js} +1 -1
  35. package/chunks/{chunk-MDFUBQAQ.js → chunk-47BGDLJG.js} +119 -27
  36. package/chunks/{chunk-EFIMD5VA.js → chunk-4AOVQPJU.js} +1 -1
  37. package/chunks/{chunk-HB6QW4LM.js → chunk-4KM2SYK5.js} +19 -16
  38. package/chunks/{chunk-UNCIELQJ.js → chunk-4XA4QIUA.js} +1 -1
  39. package/chunks/{chunk-2J53A6MV.js → chunk-56HVDG3M.js} +4 -4
  40. package/chunks/{chunk-N3FJOQX7.js → chunk-5AFGJNY6.js} +4 -4
  41. package/chunks/{chunk-2AZMF6G5.js → chunk-5RUCD4ED.js} +2 -2
  42. package/chunks/{chunk-32VOOMEF.js → chunk-62X3CM7Q.js} +7 -7
  43. package/chunks/{chunk-6LYDH7VT.js → chunk-63FNZTWG.js} +2 -2
  44. package/chunks/{chunk-P64FPV3G.js → chunk-6JEIRPLN.js} +47 -4
  45. package/chunks/{chunk-O5G7IQGM.js → chunk-6P5EXEBL.js} +499 -112
  46. package/chunks/{chunk-3ZYX7AUR.js → chunk-6SPD4Z7F.js} +1 -1
  47. package/chunks/{chunk-YZJVVQD3.js → chunk-6ZKSO6K7.js} +7 -7
  48. package/chunks/{chunk-N5ULBHP3.js → chunk-7KJPO7YH.js} +2 -2
  49. package/chunks/{chunk-MZSJ43WV.js → chunk-7U5G6JXI.js} +24 -2
  50. package/chunks/{chunk-K7JW6V5O.js → chunk-A6NRNRKE.js} +1 -1
  51. package/chunks/{chunk-XLQS3VI6.js → chunk-AKBFSOC5.js} +2 -2
  52. package/chunks/{chunk-LT532KF4.js → chunk-AW27A43Y.js} +10 -12
  53. package/chunks/{chunk-M4NWDIFU.js → chunk-AZQ3DT76.js} +1 -1
  54. package/chunks/{chunk-4GLFFNP3.js → chunk-B4VN3VDH.js} +5 -5
  55. package/chunks/{chunk-YTYPRVIZ.js → chunk-BSR5AXZR.js} +4 -3
  56. package/chunks/{chunk-AJX4ITUG.js → chunk-BSSLSQEW.js} +3 -3
  57. package/chunks/{chunk-EYY4IBPV.js → chunk-CGM3E75C.js} +3 -3
  58. package/chunks/{chunk-V4MJ56RS.js → chunk-CIDQISGM.js} +5 -5
  59. package/chunks/{chunk-T6W4KACQ.js → chunk-CPFFU46D.js} +1 -1
  60. package/chunks/{chunk-TYCXSMZU.js → chunk-CQ6IPDQW.js} +3 -3
  61. package/chunks/{chunk-KIFRFCCB.js → chunk-CZ4OWGQQ.js} +67 -22
  62. package/chunks/{chunk-N7NBMAMW.js → chunk-D2RNVVH6.js} +2 -2
  63. package/chunks/{chunk-KPVVWKF3.js → chunk-D7QGE3RT.js} +1 -1
  64. package/chunks/{chunk-TYGKUOEG.js → chunk-DAV4QFD5.js} +3 -11
  65. package/chunks/{chunk-QUESTNOP.js → chunk-DD6O3ZRD.js} +1 -1
  66. package/chunks/{chunk-NWPO6I7V.js → chunk-DEDESZDL.js} +1 -1
  67. package/chunks/{chunk-7LZ7DK4D.js → chunk-DFVXU5YM.js} +1 -1
  68. package/chunks/{chunk-TBVNYG5B.js → chunk-DG4IQ6JG.js} +5 -5
  69. package/chunks/{chunk-SAQHDAUJ.js → chunk-DPTMKFIH.js} +452 -57
  70. package/chunks/{chunk-M6HXP2SG.js → chunk-EBPLKY6U.js} +2192 -849
  71. package/chunks/{chunk-3XZYK76R.js → chunk-EJOGLSNJ.js} +2 -2
  72. package/chunks/{chunk-L7T742G2.js → chunk-FA5K6YI2.js} +47 -3
  73. package/chunks/{chunk-M2NMFAFR.js → chunk-FMIH5KMQ.js} +1 -1
  74. package/chunks/{chunk-HHGQGTJQ.js → chunk-FQDCO3CJ.js} +10 -1
  75. package/chunks/{chunk-V3LXMASR.js → chunk-FRHQQC2Z.js} +1 -1
  76. package/chunks/{chunk-732MOPEM.js → chunk-G6MUFRNI.js} +1 -1
  77. package/chunks/{chunk-KNXA5XXK.js → chunk-GXTMEATA.js} +15 -34
  78. package/chunks/{chunk-7SUQZ7QH.js → chunk-GZDWTBT3.js} +2 -2
  79. package/chunks/{chunk-IQFYO5BF.js → chunk-H7TMVHKE.js} +1 -1
  80. package/chunks/{chunk-KNQZXSLW.js → chunk-HG3UBTJ4.js} +23 -9
  81. package/chunks/{chunk-MPBRV3UU.js → chunk-HOSVOUDK.js} +71 -0
  82. package/chunks/{chunk-OPBATTFQ.js → chunk-HTYND72J.js} +1 -1
  83. package/chunks/{chunk-I4XSOFH2.js → chunk-I7BT2MME.js} +1 -1
  84. package/chunks/{chunk-LHY6HBRA.js → chunk-IH4Z54RJ.js} +7 -5
  85. package/chunks/{chunk-GYBDYWMV.js → chunk-IRSLAS4M.js} +2 -2
  86. package/chunks/{chunk-UZPWH6SP.js → chunk-IX4PWUDU.js} +401 -173
  87. package/chunks/{chunk-KT4OWAAZ.js → chunk-JRIVMPD2.js} +3 -3
  88. package/chunks/{chunk-Q7YDKOGY.js → chunk-JVEGA3MM.js} +1 -1
  89. package/chunks/{chunk-O5AZPHYZ.js → chunk-K34GJQOZ.js} +138 -16
  90. package/chunks/{chunk-L2GTEEEU.js → chunk-K5IDV3PC.js} +44 -1
  91. package/chunks/{chunk-5HBFERG5.js → chunk-KEC5FHLM.js} +3 -3
  92. package/chunks/{chunk-5PWLQ7SK.js → chunk-KLOMACIR.js} +15 -8
  93. package/chunks/{chunk-XWUQ4IH5.js → chunk-KWX56CHZ.js} +7 -7
  94. package/chunks/{chunk-VQZXRLEX.js → chunk-LCX5B364.js} +3 -3
  95. package/chunks/{chunk-CTQE2NB2.js → chunk-LSRI3ND3.js} +1 -1
  96. package/chunks/{chunk-5TXOGH4I.js → chunk-LUISTZXI.js} +3 -3
  97. package/chunks/{chunk-6AECVSVX.js → chunk-MAKIANMX.js} +3 -3
  98. package/chunks/{chunk-M4OYAR6J.js → chunk-MDNUCDKZ.js} +2 -2
  99. package/chunks/{chunk-CZXQ4UZA.js → chunk-MELQSJOU.js} +1 -1
  100. package/chunks/{chunk-6ZIIHBNV.js → chunk-MUNA4QDC.js} +4 -4
  101. package/chunks/{chunk-E5BWLU5J.js → chunk-N4SVADAV.js} +305 -143
  102. package/chunks/{chunk-URK542T4.js → chunk-NF5J2WFA.js} +15 -2
  103. package/chunks/{chunk-GJJQV4PY.js → chunk-NLFLYSS4.js} +1 -1
  104. package/chunks/{chunk-FRH4SSGX.js → chunk-NW2GIPG3.js} +2 -4
  105. package/chunks/{chunk-JS4Q5NG5.js → chunk-NX4A23LY.js} +3 -3
  106. package/chunks/{chunk-DEG7R6Z6.js → chunk-OK47XBYH.js} +79 -36
  107. package/chunks/{chunk-7D4KEFOT.js → chunk-OPVF453Q.js} +3 -3
  108. package/chunks/{chunk-J7DNMZFO.js → chunk-OR64CU46.js} +1 -1
  109. package/chunks/{chunk-DAX3G67A.js → chunk-OWGRUU7F.js} +1 -1
  110. package/chunks/{chunk-M2PY7CNK.js → chunk-OWXFBIB6.js} +2 -2
  111. package/chunks/{chunk-NELCY6JT.js → chunk-OYWVIXHT.js} +1 -3
  112. package/chunks/{chunk-V7RNNPGC.js → chunk-P5Y23G2L.js} +18 -1
  113. package/chunks/{chunk-QZ5G26ZE.js → chunk-PTSEETCO.js} +27 -27
  114. package/chunks/{chunk-IEP44U2R.js → chunk-PVXEJB66.js} +1 -1
  115. package/chunks/{chunk-NC4O6UE6.js → chunk-PZW46OTB.js} +2 -2
  116. package/chunks/{chunk-RQVVXDHS.js → chunk-Q4ZPYNIZ.js} +4 -4
  117. package/chunks/{chunk-QSWDGAIC.js → chunk-QILD6R27.js} +1 -1
  118. package/chunks/{chunk-GLWWPFTW.js → chunk-QLTATTPS.js} +1 -1
  119. package/chunks/{chunk-QTI7SRXI.js → chunk-QPBFRWCP.js} +3 -3
  120. package/chunks/{chunk-3TT6MZHJ.js → chunk-QSD4UH74.js} +842 -62
  121. package/chunks/{chunk-TEKFBSMY.js → chunk-RDVNSJQU.js} +3 -3
  122. package/chunks/{chunk-NPE3STIW.js → chunk-ROIJYS5K.js} +6 -6
  123. package/chunks/{chunk-JEMR2FTD.js → chunk-RQJA2YYO.js} +4 -4
  124. package/chunks/{chunk-YI6UGZF5.js → chunk-S6TCTH4Z.js} +13 -13
  125. package/chunks/{chunk-ZGWY4YUB.js → chunk-SYHXR6WM.js} +5 -5
  126. package/chunks/{chunk-O4BBDP2G.js → chunk-TB4YFWXG.js} +2 -2
  127. package/chunks/{chunk-ILVATFYJ.js → chunk-TDESMS7M.js} +22 -18
  128. package/chunks/{chunk-47FQVRCO.js → chunk-TMFWI4RC.js} +1 -1
  129. package/chunks/{chunk-T4FTABSW.js → chunk-TQDFSQQF.js} +1 -1
  130. package/chunks/{chunk-ZV4XVYL3.js → chunk-TTRH3RTQ.js} +4 -4
  131. package/chunks/{chunk-ZWPWQEF5.js → chunk-TXP5NGG3.js} +1 -1
  132. package/chunks/{chunk-E3GLDLYB.js → chunk-TYAMGABM.js} +0 -6
  133. package/chunks/{chunk-VWD7SNNN.js → chunk-UI5UGEF4.js} +1082 -926
  134. package/chunks/{chunk-MWZYNOCG.js → chunk-ULNWG62W.js} +3 -3
  135. package/chunks/{chunk-HGCQ5SE7.js → chunk-UXEO7E3V.js} +21 -0
  136. package/chunks/{chunk-U6PTKAOW.js → chunk-V6OBVAST.js} +1 -1
  137. package/chunks/{chunk-5UPJ774B.js → chunk-VIFA5VJD.js} +1 -1
  138. package/chunks/{chunk-Y66OOMKS.js → chunk-VLHR7F4E.js} +595 -58
  139. package/chunks/{chunk-EYS3GGM3.js → chunk-VPV7WBVT.js} +1 -1
  140. package/chunks/{chunk-XCGIMOLN.js → chunk-WCCLLK7X.js} +14 -1
  141. package/chunks/{chunk-JL3LC3CQ.js → chunk-WCEI6J56.js} +1 -1
  142. package/chunks/{chunk-JXK3WAP7.js → chunk-WDVDVWJ3.js} +6 -6
  143. package/chunks/{chunk-ZQSNP4TG.js → chunk-WI6GIM2M.js} +2 -2
  144. package/chunks/{chunk-TRYJ3BVE.js → chunk-WM3LUQLO.js} +7 -7
  145. package/chunks/{chunk-VJNBRRZG.js → chunk-WZMH7II3.js} +1 -1
  146. package/chunks/{chunk-HBZUU4AE.js → chunk-X5SLJOMF.js} +9 -7
  147. package/chunks/{chunk-FDWH6CBK.js → chunk-XAFIL4BD.js} +7 -7
  148. package/chunks/{chunk-P2UCMHDT.js → chunk-XDRXOSAD.js} +3 -3
  149. package/chunks/{chunk-RRQJPCRQ.js → chunk-XH3KAV2G.js} +2 -2
  150. package/chunks/{chunk-F6AOBFUN.js → chunk-YBHUXEC6.js} +1 -1
  151. package/chunks/{chunk-GZGDJ4E6.js → chunk-YBVVOSOH.js} +1 -1
  152. package/chunks/{chunk-EXG2R5UR.js → chunk-YCHNAKC5.js} +16 -14
  153. package/chunks/{chunk-XTH2OMDS.js → chunk-YIGGWOJE.js} +1 -1
  154. package/chunks/{chunk-IX7CFQGA.js → chunk-YILJKX2T.js} +3 -3
  155. package/chunks/{chunk-SSAOTDK7.js → chunk-YX2RDGAL.js} +1 -1
  156. package/chunks/{chunk-6S52N6PG.js → chunk-ZBB5EZZV.js} +2 -2
  157. package/chunks/{chunk-3GCU5O2E.js → chunk-ZLCT4C5A.js} +1 -1
  158. package/chunks/{chunk-4ETA3KRC.js → chunk-ZMY2P4L3.js} +3 -3
  159. package/chunks/{chunk-575MI5K3.js → chunk-ZQUY3ZJU.js} +4 -4
  160. package/chunks/{computer-use-S4JEU5P7.js → computer-use-F4URV4TU.js} +45 -45
  161. package/chunks/{config-utils-TXVKR27S.js → config-utils-Z3OW3IQG.js} +4 -4
  162. package/chunks/{contextCommand-2H5OH2HW.js → contextCommand-IGSS2U5J.js} +44 -44
  163. package/chunks/{core-runtime-IAQ4DD4Y.js → core-runtime-H5CZDN3A.js} +42 -42
  164. package/chunks/{create-sub-session-EKHKXJAA.js → create-sub-session-PA7MFTHK.js} +42 -42
  165. package/chunks/{create-sub-session-Y4WYDZGC.js → create-sub-session-XT6DLYOE.js} +2 -2
  166. package/chunks/{cron-create-ZOVA3CC2.js → cron-create-2JZ2TWTF.js} +4 -4
  167. package/chunks/{cron-delete-7Z3H4LJY.js → cron-delete-CTPD2P26.js} +4 -4
  168. package/chunks/{cron-list-UHGX3IQG.js → cron-list-V44KHAF6.js} +4 -4
  169. package/chunks/{daemon-PXIC4ZDK.js → daemon-GED37WOX.js} +30 -2
  170. package/chunks/daemon-git-worktree-guard-LZDCNJGV.js +2062 -0
  171. package/chunks/daemon-status-provider-QYM57Z44.js +102 -0
  172. package/chunks/{daemon-trust-policy-7JOBVFH3.js → daemon-trust-policy-TSRVEYZR.js} +48 -48
  173. package/chunks/{daemon-trust-policy-monitor-OU3NRHAR.js → daemon-trust-policy-monitor-2K2YETMT.js} +48 -48
  174. package/chunks/{deferred-core-runtime-SFT3KI2C.js → deferred-core-runtime-FKJ3OYE7.js} +44 -44
  175. package/chunks/{devtools-X6ROTKHE.js → devtools-4QFYJT6U.js} +1 -1
  176. package/chunks/{display-image-ZE3GZNIK.js → display-image-M2ELAVN4.js} +4 -4
  177. package/chunks/{dist-KTYDJNYM.js → dist-4ZPG4BY6.js} +2 -2
  178. package/chunks/{dist-NPS52B2V.js → dist-BROOP2EG.js} +1 -1
  179. package/chunks/{dist-BW2LDPV3.js → dist-IYYN3RUT.js} +2 -2
  180. package/chunks/{dist-EFJILGIS.js → dist-JWMKPWT5.js} +3 -1
  181. package/chunks/{dist-AVUYBK7L.js → dist-K7IQB53U.js} +1 -1
  182. package/chunks/{dist-PKSRQAR2.js → dist-MAQXAQ2Y.js} +1 -1
  183. package/chunks/{dist-BNWP6IZL.js → dist-WJ4BHIEW.js} +2 -2
  184. package/chunks/{dist-ZWDH5HLS.js → dist-YEPL4RAW.js} +1 -1
  185. package/chunks/{earlyInputCapture-27RPWE2D.js → earlyInputCapture-WJBSJQUF.js} +43 -43
  186. package/chunks/{edit-WXVZ7FHS.js → edit-X73LA4YO.js} +50 -49
  187. package/chunks/{enter-worktree-TYMVXFLA.js → enter-worktree-CLRQTIVN.js} +47 -47
  188. package/chunks/{enterPlanMode-FT4MRU5N.js → enterPlanMode-6BDYUQ5T.js} +48 -48
  189. package/chunks/{environment-Z6OMA34I.js → environment-WOAJXJDJ.js} +44 -44
  190. package/chunks/{errors-YMXK2GG3.js → errors-7OY5MXYY.js} +44 -44
  191. package/chunks/{exit-worktree-ODZUQLGJ.js → exit-worktree-TFFJXCRT.js} +47 -47
  192. package/chunks/{exitPlanMode-MBPAPBBV.js → exitPlanMode-WDURQMIU.js} +42 -42
  193. package/chunks/{external-tool-guard-provider-5HTGOPGU.js → external-tool-guard-provider-TE4DRY36.js} +1 -1
  194. package/chunks/{fast-path-ZU5T6XSN.js → fast-path-QQLGC37M.js} +5 -5
  195. package/chunks/{gemini-OZK6AIMC.js → gemini-VHE62IJL.js} +110 -105
  196. package/chunks/{geminiContentGenerator-MC6ZKWZG.js → geminiContentGenerator-VSHIEGAQ.js} +11 -11
  197. package/chunks/{glob-KJ4A4ZOM.js → glob-VMEEDDLO.js} +49 -49
  198. package/chunks/{goal-tools-JDK2SNMV.js → goal-tools-M4UDAZXP.js} +4 -4
  199. package/chunks/{grep-QWBLG564.js → grep-F4UAR7KX.js} +47 -47
  200. package/chunks/{handleAutoUpdate-M3ACKDKF.js → handleAutoUpdate-GN7Z6QAC.js} +46 -46
  201. package/chunks/{i18n-FPW7XZL5.js → i18n-ETW24DHW.js} +43 -43
  202. package/chunks/{image-gen-OTFC2S7L.js → image-gen-YPK2AZT4.js} +11 -11
  203. package/chunks/{initializer-5HKUXXBT.js → initializer-UA6KQ7MS.js} +49 -49
  204. package/chunks/{installationInfo-4OA6UW7V.js → installationInfo-P7OTIR4P.js} +43 -43
  205. package/chunks/{keychain-token-storage-JTWUYFU7.js → keychain-token-storage-NKKCUHI2.js} +2 -2
  206. package/chunks/{list-3TKZ264A.js → list-GRAMIQOT.js} +51 -51
  207. package/chunks/{list-agents-4GQ2XNEU.js → list-agents-O6WSY4CT.js} +2 -2
  208. package/chunks/{loadedSettingsAdapter-IRUANLS2.js → loadedSettingsAdapter-5O2TDS3I.js} +48 -48
  209. package/chunks/{loggingContentGenerator-D4URLH2A.js → loggingContentGenerator-J2J2AANS.js} +151 -120
  210. package/chunks/{loop-wakeup-HOQI3K5D.js → loop-wakeup-GVQRMUKS.js} +5 -5
  211. package/chunks/{ls-FSHISLLA.js → ls-6W2D7TKU.js} +6 -6
  212. package/chunks/{lsp-APQJ5ZEZ.js → lsp-NJ4KFBI2.js} +2 -2
  213. package/chunks/{managed-npm-update-2O7XSAWJ.js → managed-npm-update-WMV5ITKU.js} +45 -45
  214. package/chunks/{mcp-AFVHCHKT.js → mcp-XLP33CAI.js} +48 -48
  215. package/chunks/{monitor-PY4WDSX3.js → monitor-2MM23VDV.js} +47 -47
  216. package/chunks/{node-YSOU44FX.js → node-UUDY34IG.js} +3 -3
  217. package/chunks/nonInteractiveCli-KTA5K6FS.js +163 -0
  218. package/chunks/{notebook-edit-GEPL33NO.js → notebook-edit-QD4TRKLY.js} +47 -47
  219. package/chunks/{openaiContentGenerator-ACYSXQ6R.js → openaiContentGenerator-KLHSPVN2.js} +31 -31
  220. package/chunks/{pidfile-SUNYCAA4.js → pidfile-RQGZBNXT.js} +43 -43
  221. package/chunks/{processUtils-F7LP7YUV.js → processUtils-HZZDA2VV.js} +2 -2
  222. package/chunks/{qwenContentGenerator-BB6IPELF.js → qwenContentGenerator-T75M2Z3B.js} +50 -50
  223. package/chunks/{qwenOAuth2-OU3WGDOI.js → qwenOAuth2-5QZU444W.js} +10 -10
  224. package/chunks/{read-file-GORBXJTS.js → read-file-LOVUSBJC.js} +12 -12
  225. package/chunks/{read-mcp-resource-TJSJRH4F.js → read-mcp-resource-GWCP23WG.js} +2 -2
  226. package/chunks/{read-package-up-TCM6I7S2.js → read-package-up-K6RKTL5D.js} +1 -1
  227. package/chunks/{record-artifact-FXF5LHPE.js → record-artifact-IYQDEYMV.js} +3 -3
  228. package/chunks/{resumeHistoryUtils-FOAJJJWK.js → resumeHistoryUtils-LVKSSQII.js} +50 -50
  229. package/chunks/{ripGrep-RNLIZGCY.js → ripGrep-ZJSHKB6H.js} +42 -42
  230. package/chunks/{run-qwen-serve-GVMMX3IU.js → run-qwen-serve-GZW7B4WK.js} +186 -90
  231. package/chunks/{runtime-RNBZ5FDD.js → runtime-MYRXEO2E.js} +53 -53
  232. package/chunks/{scheduler-NTRFSPIP.js → scheduler-DPTPI6FW.js} +44 -44
  233. package/chunks/{sdk-exporters-grpc-4QKV6MCX.js → sdk-exporters-grpc-54L4LS5L.js} +2 -2
  234. package/chunks/{sdk-exporters-http-2VPMAPFI.js → sdk-exporters-http-NHBYB5FZ.js} +21 -17
  235. package/chunks/{sdk-impl-5W3JUCWF.js → sdk-impl-SK4P5WON.js} +17 -14
  236. package/chunks/{send-message-RBYLV5NY.js → send-message-O7FO63UK.js} +6 -6
  237. package/chunks/{serve-H3PGA26U.js → serve-XCG4XCDA.js} +52 -52
  238. package/chunks/{server-SUXD2F3C.js → server-AWQHKXLG.js} +310 -200
  239. package/chunks/{session-MTFVUWWM.js → session-P5FKNCNR.js} +94 -97
  240. package/chunks/{settings-GUJ3TN2J.js → settings-CSYVIP2R.js} +47 -47
  241. package/chunks/{shell-C2UP5FF2.js → shell-EGTSUO2P.js} +42 -42
  242. package/chunks/{skill-4XCNK55E.js → skill-IFUD72GF.js} +22 -22
  243. package/chunks/{skill-settings-Y2BU27XM.js → skill-settings-YOE7LBHE.js} +47 -47
  244. package/chunks/{spawnChannel-UUUUK734.js → spawnChannel-PQSZIOLY.js} +45 -47
  245. package/chunks/{standalone-update-MJ722XZ4.js → standalone-update-RB2EGUSF.js} +44 -44
  246. package/chunks/{startInteractiveUI-TCPIPNGN.js → startInteractiveUI-KMYUJ2MU.js} +3040 -2399
  247. package/chunks/{syntheticOutput-D3Z64LJC.js → syntheticOutput-DVHJMUGV.js} +3 -3
  248. package/chunks/{task-create-URFZ5EUX.js → task-create-4NC7PDI4.js} +11 -11
  249. package/chunks/{task-list-6JDFMPUW.js → task-list-LBSRMOC7.js} +5 -5
  250. package/chunks/{task-stop-HHUGCD25.js → task-stop-YFNATTIM.js} +2 -2
  251. package/chunks/{task-update-DVV6CUGI.js → task-update-BPLM52GD.js} +12 -12
  252. package/chunks/{team-create-WZWH2NJI.js → team-create-B6A6MJBT.js} +47 -47
  253. package/chunks/{team-delete-PZGGBQLM.js → team-delete-MKYMYBFM.js} +5 -5
  254. package/chunks/{team-plan-approval-SUZQJCWJ.js → team-plan-approval-5WO3CXXU.js} +48 -48
  255. package/chunks/{terminal-image-renderer-BCUN3Z3W.js → terminal-image-renderer-BTRE2GEU.js} +44 -44
  256. package/chunks/{theme-manager-UGMFDREN.js → theme-manager-XL2N5SBY.js} +43 -43
  257. package/chunks/{todoWrite-WINAZSZI.js → todoWrite-K5K7NRE5.js} +4 -4
  258. package/chunks/{tool-search-B6F3MPUZ.js → tool-search-QNBLXUGR.js} +18 -18
  259. package/chunks/{total-session-admission-MQLBJ5WL.js → total-session-admission-N4E5SFBO.js} +49 -49
  260. package/chunks/{trustedFolders-2XST7U5C.js → trustedFolders-MQS46LIU.js} +43 -43
  261. package/chunks/{update-relaunch-OVC7YNGD.js → update-relaunch-536KRL33.js} +5 -5
  262. package/chunks/{updateCheck-YAKM36WQ.js → updateCheck-QJI2SYWF.js} +48 -48
  263. package/chunks/{useAutoAcceptIndicator-RF6FVX3S.js → useAutoAcceptIndicator-7QASHD46.js} +51 -51
  264. package/chunks/{validateNonInterActiveAuth-IPPXFNQH.js → validateNonInterActiveAuth-ZNRGWBLV.js} +86 -88
  265. package/chunks/{version-4IDFEXOU.js → version-DBEQAFRW.js} +2 -2
  266. package/chunks/{web-fetch-NUOLHXPN.js → web-fetch-MBIVXKPE.js} +21 -21
  267. package/chunks/{web-search-LVOOV4XZ.js → web-search-4LBIN6VF.js} +16 -16
  268. package/chunks/{workflow-JSTYTG3K.js → workflow-LNMA55HY.js} +127 -61
  269. package/chunks/{workspace-providers-status-U4EYXA4K.js → workspace-providers-status-PDDMI6ST.js} +51 -51
  270. package/chunks/{workspace-registration-store-OG66U3CB.js → workspace-registration-store-BGRKKIYR.js} +1 -1
  271. package/chunks/{workspace-registry-WSHWQRQQ.js → workspace-registry-L4NCJ34K.js} +49 -49
  272. package/chunks/{workspace-service-QZXQHX2F.js → workspace-service-LOXYKYTR.js} +54 -54
  273. package/chunks/{workspace-skills-status-VRBHEX5O.js → workspace-skills-status-IJ5FOQI6.js} +49 -49
  274. package/chunks/{workspace-trust-reconciler-FCRIUIOF.js → workspace-trust-reconciler-H36TCR2S.js} +57 -57
  275. package/chunks/{write-file-PYL3JCCD.js → write-file-JJAY7JSP.js} +42 -42
  276. package/chunks/{zoom-image-RS6MU26F.js → zoom-image-4MVVVM7E.js} +12 -12
  277. package/cli.js +18 -17
  278. package/package.json +4 -4
  279. package/web-shell/assets/{arc-CgGUyHWd.js → arc-B-89zHN4.js} +1 -1
  280. package/web-shell/assets/{architectureDiagram-3BPJPVTR-BR0Qv-1Y.js → architectureDiagram-3BPJPVTR-BkcOncHk.js} +1 -1
  281. package/web-shell/assets/{blockDiagram-GPEHLZMM-DIoaceaI.js → blockDiagram-GPEHLZMM-DQ4yboaF.js} +1 -1
  282. package/web-shell/assets/{c4Diagram-AAUBKEIU-Bc5k6BbI.js → c4Diagram-AAUBKEIU-C_8ZjPDI.js} +1 -1
  283. package/web-shell/assets/channel-Du2WFns8.js +1 -0
  284. package/web-shell/assets/{chunk-2J33WTMH-DtPEz2WX.js → chunk-2J33WTMH-naKVe1Bm.js} +1 -1
  285. package/web-shell/assets/{chunk-4BX2VUAB-Dydo6ydE.js → chunk-4BX2VUAB-DdoViKT2.js} +1 -1
  286. package/web-shell/assets/{chunk-55IACEB6-DD9_VWXm.js → chunk-55IACEB6-DUDQZEwU.js} +1 -1
  287. package/web-shell/assets/{chunk-727SXJPM-DVI2m59k.js → chunk-727SXJPM-BqpDTR5s.js} +1 -1
  288. package/web-shell/assets/{chunk-AQP2D5EJ-luatmaTN.js → chunk-AQP2D5EJ-CdmEknkT.js} +1 -1
  289. package/web-shell/assets/{chunk-FMBD7UC4-Duy8NTIi.js → chunk-FMBD7UC4-CH7fFTLB.js} +1 -1
  290. package/web-shell/assets/{chunk-ND2GUHAM-CrL1yhms.js → chunk-ND2GUHAM-ObgSuFKF.js} +1 -1
  291. package/web-shell/assets/{chunk-QZHKN3VN-C7BX6bu1.js → chunk-QZHKN3VN-D9fKdv_s.js} +1 -1
  292. package/web-shell/assets/classDiagram-4FO5ZUOK-Zw0HafH6.js +1 -0
  293. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-Zw0HafH6.js +1 -0
  294. package/web-shell/assets/{cose-bilkent-S5V4N54A-BTzs7mIi.js → cose-bilkent-S5V4N54A-CvzATMx9.js} +1 -1
  295. package/web-shell/assets/{dagre-BM42HDAG-3VTUmWts.js → dagre-BM42HDAG-M_xU21QW.js} +1 -1
  296. package/web-shell/assets/{diagram-2AECGRRQ-Ehdp75GN.js → diagram-2AECGRRQ-CNrl9sW1.js} +1 -1
  297. package/web-shell/assets/{diagram-5GNKFQAL-B3wu3teE.js → diagram-5GNKFQAL-CUweVT6T.js} +1 -1
  298. package/web-shell/assets/{diagram-KO2AKTUF-DjgTSf2S.js → diagram-KO2AKTUF-D3n6Lxjo.js} +1 -1
  299. package/web-shell/assets/{diagram-LMA3HP47-Br9mwjY3.js → diagram-LMA3HP47-0SeFPK4t.js} +1 -1
  300. package/web-shell/assets/{diagram-OG6HWLK6-D4xz5M-z.js → diagram-OG6HWLK6-DAgyEwge.js} +1 -1
  301. package/web-shell/assets/{erDiagram-TEJ5UH35-CXayWlG_.js → erDiagram-TEJ5UH35-CzxBBDIK.js} +1 -1
  302. package/web-shell/assets/{flowDiagram-I6XJVG4X-CLonjQTi.js → flowDiagram-I6XJVG4X-B0uj0jyo.js} +1 -1
  303. package/web-shell/assets/{ganttDiagram-6RSMTGT7-BTySFT-1.js → ganttDiagram-6RSMTGT7-DFzcj5km.js} +1 -1
  304. package/web-shell/assets/{gitGraphDiagram-PVQCEYII--2WcUjOe.js → gitGraphDiagram-PVQCEYII-DylJ_Fc9.js} +1 -1
  305. package/web-shell/assets/index-BIGQygTL.css +5 -0
  306. package/web-shell/assets/{index-DPJHkFOG.js → index-BKSAnXU9.js} +1 -1
  307. package/web-shell/assets/index-J7OMTqAN.js +1789 -0
  308. package/web-shell/assets/{infoDiagram-5YYISTIA-9vpgAf1m.js → infoDiagram-5YYISTIA-BYMcJVMI.js} +1 -1
  309. package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-DcRpHnAW.js → ishikawaDiagram-YF4QCWOH-t1quI1S3.js} +1 -1
  310. package/web-shell/assets/{journeyDiagram-JHISSGLW-C2TKorRm.js → journeyDiagram-JHISSGLW-YM_QVUJm.js} +1 -1
  311. package/web-shell/assets/{kanban-definition-UN3LZRKU-DdsFwB8b.js → kanban-definition-UN3LZRKU-jw8OddK1.js} +1 -1
  312. package/web-shell/assets/{linear-7PjRvJrf.js → linear-Dlr3RVuP.js} +1 -1
  313. package/web-shell/assets/{mermaid.core-raDXa11C.js → mermaid.core-CqGKzNzd.js} +5 -5
  314. package/web-shell/assets/{mindmap-definition-RKZ34NQL-DLHc-PRN.js → mindmap-definition-RKZ34NQL-BqureoOS.js} +1 -1
  315. package/web-shell/assets/{pieDiagram-4H26LBE5-BftYpeTW.js → pieDiagram-4H26LBE5-Da20HkK1.js} +1 -1
  316. package/web-shell/assets/{quadrantDiagram-W4KKPZXB-O-6ygOYn.js → quadrantDiagram-W4KKPZXB-BsNlMvJy.js} +1 -1
  317. package/web-shell/assets/{requirementDiagram-4Y6WPE33-BmZWVufJ.js → requirementDiagram-4Y6WPE33-DzVCQCse.js} +1 -1
  318. package/web-shell/assets/{sankeyDiagram-5OEKKPKP-2x5beiWt.js → sankeyDiagram-5OEKKPKP-BMo16voT.js} +1 -1
  319. package/web-shell/assets/{sequenceDiagram-3UESZ5HK-BH8uKokQ.js → sequenceDiagram-3UESZ5HK-Bgi-pdHk.js} +1 -1
  320. package/web-shell/assets/{stateDiagram-AJRCARHV-Dq1MFgX_.js → stateDiagram-AJRCARHV-xaPQXwGk.js} +1 -1
  321. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-D5RqimXD.js +1 -0
  322. package/web-shell/assets/{timeline-definition-PNZ67QCA-Cl2WKbv9.js → timeline-definition-PNZ67QCA-C_9RuvKG.js} +1 -1
  323. package/web-shell/assets/{vennDiagram-CIIHVFJN-BqoRo_Q-.js → vennDiagram-CIIHVFJN-Bgu6vdla.js} +1 -1
  324. package/web-shell/assets/{wardley-L42UT6IY-BTxp-Yot.js → wardley-L42UT6IY-CFTZ8IrX.js} +1 -1
  325. package/web-shell/assets/{wardleyDiagram-YWT4CUSO-DFXVCSH2.js → wardleyDiagram-YWT4CUSO-BASW9Vmt.js} +1 -1
  326. package/web-shell/assets/{xychartDiagram-2RQKCTM6-qQhWx0aE.js → xychartDiagram-2RQKCTM6--Nh-CD3F.js} +1 -1
  327. package/web-shell/index.html +2 -2
  328. package/chunks/chunk-CG3OQDNY.js +0 -649
  329. package/chunks/chunk-L34XSHIZ.js +0 -28
  330. package/chunks/chunk-N2TNM3QB.js +0 -9
  331. package/chunks/chunk-UOMZKPI5.js +0 -830
  332. package/chunks/chunk-WFRHWDBT.js +0 -622
  333. package/chunks/chunk-WLML6VIA.js +0 -18
  334. package/chunks/chunk-ZBBVBZBR.js +0 -137
  335. package/chunks/chunk-bdqvmfwv-OHYAFAAO.js +0 -17446
  336. package/chunks/daemon-status-provider-LPYR2GXY.js +0 -103
  337. package/chunks/dispatch-B53LNEO4.js +0 -37
  338. package/chunks/nonInteractiveCli-ZHW6F76F.js +0 -166
  339. package/chunks/opentui-entry-SBAOWW7M.js +0 -52325
  340. package/chunks/runtime-gate-T4ICWGQJ.js +0 -89
  341. package/chunks/wrapper-46Z24CTM.js +0 -35
  342. package/web-shell/assets/channel-D2b9IYpS.js +0 -1
  343. package/web-shell/assets/classDiagram-4FO5ZUOK-DHatTCmD.js +0 -1
  344. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-DHatTCmD.js +0 -1
  345. package/web-shell/assets/index-CIFO52Wx.css +0 -5
  346. package/web-shell/assets/index-bhq3CUUF.js +0 -1789
  347. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-spuAYji6.js +0 -1
  348. /package/chunks/{chunk-44CTCCLY.js → chunk-NWNEANAT.js} +0 -0
@@ -2,17 +2,17 @@
2
2
  "use strict";
3
3
  import {
4
4
  listCommand
5
- } from "./chunk-575MI5K3.js";
5
+ } from "./chunk-ZQUY3ZJU.js";
6
6
  import {
7
7
  getErrorMessage as getErrorMessage2
8
- } from "./chunk-TEKFBSMY.js";
8
+ } from "./chunk-RDVNSJQU.js";
9
9
  import {
10
10
  serveCommand
11
- } from "./chunk-ILVATFYJ.js";
11
+ } from "./chunk-TDESMS7M.js";
12
12
  import {
13
13
  OBSERVED_CONTACT_MAX_FRESH_WITHIN_SECONDS,
14
14
  ObservedChannelContactStore
15
- } from "./chunk-47FQVRCO.js";
15
+ } from "./chunk-TMFWI4RC.js";
16
16
  import {
17
17
  escapeAnsiCtrlCodes
18
18
  } from "./chunk-4NFY2S7N.js";
@@ -28,12 +28,12 @@ import {
28
28
  } from "./chunk-TQOF5KBL.js";
29
29
  import {
30
30
  resolvePath
31
- } from "./chunk-IQFYO5BF.js";
31
+ } from "./chunk-H7TMVHKE.js";
32
32
  import {
33
33
  collectProviderModelsForProtocol,
34
34
  getAuthTypeFromEnv,
35
35
  resolveCliGenerationConfig
36
- } from "./chunk-NPE3STIW.js";
36
+ } from "./chunk-ROIJYS5K.js";
37
37
  import {
38
38
  resolveSkillSettings
39
39
  } from "./chunk-Z4X5MTRT.js";
@@ -53,27 +53,27 @@ import {
53
53
  registerToolCallDispatch,
54
54
  selectFirstModel,
55
55
  sessionsPath
56
- } from "./chunk-TRYJ3BVE.js";
56
+ } from "./chunk-WM3LUQLO.js";
57
57
  import {
58
58
  getExtensionManager,
59
59
  requestChoicePluginNonInteractive,
60
60
  requestConsentNonInteractive,
61
61
  requestConsentOrFail,
62
62
  resolveExtensionCommandScope
63
- } from "./chunk-LHY6HBRA.js";
63
+ } from "./chunk-IH4Z54RJ.js";
64
64
  import {
65
65
  parseChannelConfig
66
- } from "./chunk-YTYPRVIZ.js";
67
- import {
68
- findCliEntryPath
69
- } from "./chunk-V6WHFGST.js";
66
+ } from "./chunk-BSR5AXZR.js";
70
67
  import {
71
68
  DEFAULT_BASE_URL,
72
69
  buildHeaders,
73
70
  clearAccount,
74
71
  loadAccount,
75
72
  saveAccount
76
- } from "./chunk-3GCU5O2E.js";
73
+ } from "./chunk-ZLCT4C5A.js";
74
+ import {
75
+ findCliEntryPath
76
+ } from "./chunk-V6WHFGST.js";
77
77
  import {
78
78
  canonicalizeWorkspace
79
79
  } from "./chunk-6PLDPT2C.js";
@@ -101,7 +101,7 @@ import {
101
101
  import {
102
102
  normalizeWorkerDiagnostic,
103
103
  sanitizeWorkerDiagnostic
104
- } from "./chunk-K7JW6V5O.js";
104
+ } from "./chunk-A6NRNRKE.js";
105
105
  import {
106
106
  normalizeServeChannelSelection
107
107
  } from "./chunk-ALMR3E6Q.js";
@@ -110,7 +110,14 @@ import {
110
110
  } from "./chunk-M5GB774H.js";
111
111
  import {
112
112
  EXTERNAL_TOOL_GUARD_TOKEN_ENV
113
- } from "./chunk-BKHCW2BI.js";
113
+ } from "./chunk-3VUENPWF.js";
114
+ import {
115
+ readServiceInfo,
116
+ removeServiceInfo,
117
+ signalService,
118
+ waitForExit,
119
+ writeServiceInfo
120
+ } from "./chunk-3AEKDXKT.js";
114
121
  import {
115
122
  AcpBridge,
116
123
  ChannelLoopScheduler,
@@ -121,45 +128,38 @@ import {
121
128
  isChannelProactiveDeliveryError,
122
129
  sanitizeLogText,
123
130
  sanitizePromptText
124
- } from "./chunk-LT532KF4.js";
125
- import {
126
- readServiceInfo,
127
- removeServiceInfo,
128
- signalService,
129
- waitForExit,
130
- writeServiceInfo
131
- } from "./chunk-AQHNAA7E.js";
131
+ } from "./chunk-AW27A43Y.js";
132
132
  import {
133
133
  assembleMcpServers,
134
134
  getPendingGatedMcpServers,
135
135
  mcpCommand
136
- } from "./chunk-4M2F7OG7.js";
136
+ } from "./chunk-3LDGOQXZ.js";
137
137
  import {
138
138
  loadSettings
139
- } from "./chunk-M6SXIXBV.js";
139
+ } from "./chunk-3GDBZJD6.js";
140
140
  import {
141
141
  detectSystemLanguage,
142
142
  getCurrentLanguage,
143
143
  initializeI18n,
144
144
  resolveLanguageSetting,
145
145
  t
146
- } from "./chunk-GYBDYWMV.js";
146
+ } from "./chunk-IRSLAS4M.js";
147
147
  import {
148
148
  loadEnvironment
149
- } from "./chunk-RRQJPCRQ.js";
149
+ } from "./chunk-XH3KAV2G.js";
150
150
  import {
151
151
  resolveAcpChannelFallback,
152
152
  scrubAndReportInheritedLoaderEnv
153
153
  } from "./chunk-MS7GNABG.js";
154
154
  import {
155
155
  getCliVersion
156
- } from "./chunk-M2PY7CNK.js";
156
+ } from "./chunk-OWXFBIB6.js";
157
157
  import {
158
158
  getPackageJson
159
- } from "./chunk-VJNBRRZG.js";
159
+ } from "./chunk-WZMH7II3.js";
160
160
  import {
161
161
  isWorkspaceTrusted
162
- } from "./chunk-4ETA3KRC.js";
162
+ } from "./chunk-ZMY2P4L3.js";
163
163
  import {
164
164
  require_strip_json_comments
165
165
  } from "./chunk-NPQ5ZKRP.js";
@@ -193,15 +193,12 @@ import {
193
193
  parseInstallSource,
194
194
  promptForSetting,
195
195
  readChannelMemory,
196
- redactUrlCredentials,
197
196
  removeChannelMemoryEntries,
198
197
  resolveBundleDir,
199
- sessionIdContext,
200
- stripAnsiAndControl,
201
198
  unquoteCStylePath,
202
199
  updateChannelMemoryEntry,
203
200
  updateSetting
204
- } from "./chunk-M6HXP2SG.js";
201
+ } from "./chunk-EBPLKY6U.js";
205
202
  import {
206
203
  parsePositiveIntegerEnv
207
204
  } from "./chunk-6PVPNMXU.js";
@@ -211,32 +208,38 @@ import {
211
208
  } from "./chunk-IRH27ZC2.js";
212
209
  import {
213
210
  require_dist
214
- } from "./chunk-2AZMF6G5.js";
211
+ } from "./chunk-5RUCD4ED.js";
215
212
  import {
213
+ addDaemonRequestAttribute,
216
214
  parseBooleanEnvFlag,
217
215
  resolveTelemetrySettings
218
- } from "./chunk-O5AZPHYZ.js";
216
+ } from "./chunk-K34GJQOZ.js";
219
217
  import {
220
218
  getAllGeminiMdFilenames,
221
219
  parseLineTolerant,
222
220
  setGeminiMdFilename
223
- } from "./chunk-HB6QW4LM.js";
221
+ } from "./chunk-4KM2SYK5.js";
224
222
  import {
225
223
  SchemaValidator,
226
224
  ToolNames
227
- } from "./chunk-XTH2OMDS.js";
225
+ } from "./chunk-YIGGWOJE.js";
228
226
  import {
229
227
  DEFAULT_QWEN_EMBEDDING_MODEL
230
228
  } from "./chunk-F6WFNA7U.js";
229
+ import {
230
+ isTlsVerificationDisabled
231
+ } from "./chunk-4AOVQPJU.js";
231
232
  import {
232
233
  atomicWriteFileSync
233
- } from "./chunk-F6AOBFUN.js";
234
+ } from "./chunk-YBHUXEC6.js";
234
235
  import {
235
- isTlsVerificationDisabled
236
- } from "./chunk-EFIMD5VA.js";
236
+ recordChannelMemoryRecallMetrics,
237
+ redactUrlCredentials,
238
+ stripAnsiAndControl
239
+ } from "./chunk-N4SVADAV.js";
237
240
  import {
238
- recordChannelMemoryRecallMetrics
239
- } from "./chunk-E5BWLU5J.js";
241
+ sessionIdContext
242
+ } from "./chunk-K5IDV3PC.js";
240
243
  import {
241
244
  FatalConfigError,
242
245
  FatalSandboxError,
@@ -244,7 +247,7 @@ import {
244
247
  createDebugLogger,
245
248
  getErrorMessage,
246
249
  isNodeError
247
- } from "./chunk-MPBRV3UU.js";
250
+ } from "./chunk-HOSVOUDK.js";
248
251
  import {
249
252
  writeStderrLine,
250
253
  writeStderrLineSafe,
@@ -2985,7 +2988,7 @@ var stopCommand = {
2985
2988
  if (argv["daemon-url"]) {
2986
2989
  const token = argv.token ?? process.env[QWEN_SERVER_TOKEN_ENV] ?? process.env[QWEN_DAEMON_TOKEN_ENV];
2987
2990
  try {
2988
- const sdk = await import("./daemon-PXIC4ZDK.js");
2991
+ const sdk = await import("./daemon-GED37WOX.js");
2989
2992
  const client = new sdk.DaemonClient({
2990
2993
  baseUrl: argv["daemon-url"],
2991
2994
  ...token ? { token } : {}
@@ -3171,7 +3174,7 @@ var statusCommand = {
3171
3174
  if (argv["daemon-url"]) {
3172
3175
  const token = argv.token ?? process.env[QWEN_SERVER_TOKEN_ENV] ?? process.env[QWEN_DAEMON_TOKEN_ENV];
3173
3176
  try {
3174
- const sdk = await import("./daemon-PXIC4ZDK.js");
3177
+ const sdk = await import("./daemon-GED37WOX.js");
3175
3178
  const client = new sdk.DaemonClient({
3176
3179
  baseUrl: argv["daemon-url"],
3177
3180
  ...token ? { token } : {}
@@ -3282,7 +3285,7 @@ var reloadCommand = {
3282
3285
  const token = resolveToken(argv.token);
3283
3286
  let sdk;
3284
3287
  try {
3285
- sdk = await import("./daemon-PXIC4ZDK.js");
3288
+ sdk = await import("./daemon-GED37WOX.js");
3286
3289
  } catch (err) {
3287
3290
  writeStderrLine(
3288
3291
  `[Channel] Failed to load daemon SDK: ${safeChannelCommandErrorMessage(err)}`
@@ -3362,7 +3365,7 @@ var setCommand2 = {
3362
3365
  const selection = names[0] === "all" ? { mode: "all" } : { mode: "names", names };
3363
3366
  let sdk;
3364
3367
  try {
3365
- sdk = await import("./daemon-PXIC4ZDK.js");
3368
+ sdk = await import("./daemon-GED37WOX.js");
3366
3369
  } catch (error) {
3367
3370
  writeStderrLine(
3368
3371
  `[Channel] Failed to load daemon SDK: ${safeChannelCommandErrorMessage(error)}`
@@ -3430,7 +3433,7 @@ function createDaemonSessionFactory({
3430
3433
  sessionScope: "thread"
3431
3434
  };
3432
3435
  if (req.sessionId) {
3433
- return await DaemonSessionClient.load(
3436
+ return await DaemonSessionClient.resume(
3434
3437
  client,
3435
3438
  req.sessionId,
3436
3439
  daemonReq,
@@ -3491,7 +3494,7 @@ function createDaemonChannelBridgeFacade(bridge, opts) {
3491
3494
  }
3492
3495
  __name(createDaemonChannelBridgeFacade, "createDaemonChannelBridgeFacade");
3493
3496
  async function loadDaemonSdk() {
3494
- return await import("./daemon-PXIC4ZDK.js");
3497
+ return await import("./daemon-GED37WOX.js");
3495
3498
  }
3496
3499
  __name(loadDaemonSdk, "loadDaemonSdk");
3497
3500
  function selectedChannelNames(channelsConfig, selection) {
@@ -4626,6 +4629,18 @@ init_esbuild_shims();
4626
4629
  import { mkdirSync as mkdirSync2, readFileSync as readFileSync4, writeFileSync as writeFileSync2 } from "node:fs";
4627
4630
  import { dirname as dirname2 } from "node:path";
4628
4631
 
4632
+ // packages/cli/src/commands/review/lib/review-settings.ts
4633
+ init_esbuild_shims();
4634
+ function operatorReviewSettings() {
4635
+ const review = loadSettings(void 0, { skipWorkspaceSettings: true }).merged.review;
4636
+ return {
4637
+ attribution: typeof review?.attribution === "boolean" ? review.attribution : true,
4638
+ comment: review?.comment === true,
4639
+ effort: typeof review?.effort === "string" ? review.effort : void 0
4640
+ };
4641
+ }
4642
+ __name(operatorReviewSettings, "operatorReviewSettings");
4643
+
4629
4644
  // packages/cli/src/commands/review/lib/stale-bundle.ts
4630
4645
  init_esbuild_shims();
4631
4646
  import { createHash } from "node:crypto";
@@ -4900,19 +4915,29 @@ function classifyToken(token) {
4900
4915
  return { type: "file", path: token };
4901
4916
  }
4902
4917
  __name(classifyToken, "classifyToken");
4903
- function parseReviewArgs(raw) {
4918
+ function parseReviewArgs(raw, defaults = {}) {
4904
4919
  const tokens = tokenizeArgs(raw);
4905
4920
  const warnings = [];
4906
4921
  const unknownFlags = [];
4907
- let commentRequested = false;
4922
+ let commentRequestedByFlag = false;
4908
4923
  let fixRequested = false;
4909
4924
  let explicitEffort = null;
4925
+ let configuredEffort;
4926
+ let invalidConfiguredEffort;
4927
+ if (defaults.effort !== void 0) {
4928
+ const normalized = asEffort(defaults.effort);
4929
+ if (normalized !== null) {
4930
+ configuredEffort = normalized;
4931
+ } else {
4932
+ invalidConfiguredEffort = defaults.effort;
4933
+ }
4934
+ }
4910
4935
  const effortIssues = [];
4911
4936
  const kept = [];
4912
4937
  for (let i = 0; i < tokens.length; i++) {
4913
4938
  const token = tokens[i];
4914
4939
  if (token === "--comment") {
4915
- commentRequested = true;
4940
+ commentRequestedByFlag = true;
4916
4941
  continue;
4917
4942
  }
4918
4943
  if (token === "--fix") {
@@ -4991,8 +5016,9 @@ function parseReviewArgs(raw) {
4991
5016
  );
4992
5017
  }
4993
5018
  const isPr = target.type === "pr-number" || target.type === "pr-url";
5019
+ const commentRequested = commentRequestedByFlag || defaults.comment === true;
4994
5020
  const commentEffective = commentRequested && isPr;
4995
- if (commentRequested && !isPr) {
5021
+ if (commentRequestedByFlag && !isPr) {
4996
5022
  warnings.push(
4997
5023
  "Warning: `--comment` flag is ignored because the review target is not a PR."
4998
5024
  );
@@ -5008,6 +5034,9 @@ function parseReviewArgs(raw) {
5008
5034
  if (explicitEffort !== null) {
5009
5035
  effort = explicitEffort;
5010
5036
  effortSource = "explicit";
5037
+ } else if (configuredEffort !== void 0) {
5038
+ effort = configuredEffort;
5039
+ effortSource = "configured";
5011
5040
  } else {
5012
5041
  effort = isPr ? "high" : "medium";
5013
5042
  effortSource = "default";
@@ -5016,7 +5045,7 @@ function parseReviewArgs(raw) {
5016
5045
  effort = "high";
5017
5046
  effortSource = "forced-by-comment";
5018
5047
  warnings.push(
5019
- "`--comment` requires a verified review; running at high effort."
5048
+ commentRequestedByFlag ? "`--comment` requires a verified review; running at high effort." : "`review.comment` is enabled in settings; posting requires a verified review \u2014 running at high effort."
5020
5049
  );
5021
5050
  }
5022
5051
  if (fixEffective && effort === "low") {
@@ -5026,7 +5055,7 @@ function parseReviewArgs(raw) {
5026
5055
  "`--fix` edits your working tree, so it requires verified findings; running at medium effort."
5027
5056
  );
5028
5057
  }
5029
- const resolution = effortSource === "explicit" ? `--effort ${effort} (the last valid occurrence) is in effect` : effortSource === "forced-by-comment" ? "`--comment` forces high effort" : effortSource === "forced-by-fix" ? "`--fix` forces at least medium effort" : "using the default effort";
5058
+ const resolution = effortSource === "explicit" ? `--effort ${effort} (the last valid occurrence) is in effect` : effortSource === "forced-by-comment" ? commentRequestedByFlag ? "`--comment` forces high effort" : "the `review.comment` setting forces high effort" : effortSource === "forced-by-fix" ? "`--fix` forces at least medium effort" : effortSource === "configured" ? "using the configured review.effort" : "using the default effort";
5030
5059
  for (const issue of effortIssues) {
5031
5060
  switch (issue.kind) {
5032
5061
  case "invalid-eq":
@@ -5051,11 +5080,16 @@ function parseReviewArgs(raw) {
5051
5080
  break;
5052
5081
  }
5053
5082
  }
5083
+ if (invalidConfiguredEffort !== void 0) {
5084
+ warnings.push(
5085
+ `Invalid review.effort value ${JSON.stringify(invalidConfiguredEffort)} in settings; ${resolution}.`
5086
+ );
5087
+ }
5054
5088
  return {
5055
5089
  target,
5056
5090
  effort,
5057
5091
  effortSource,
5058
- comment: { requested: commentRequested, effective: commentEffective },
5092
+ comment: { requested: commentRequestedByFlag, effective: commentEffective },
5059
5093
  fix: { requested: fixRequested, effective: fixEffective },
5060
5094
  extraTokens,
5061
5095
  unknownFlags,
@@ -5063,6 +5097,14 @@ function parseReviewArgs(raw) {
5063
5097
  };
5064
5098
  }
5065
5099
  __name(parseReviewArgs, "parseReviewArgs");
5100
+ function reviewDefaultsFromSettings() {
5101
+ const review = operatorReviewSettings();
5102
+ return {
5103
+ effort: review.effort === void 0 || review.effort.toLowerCase() === "auto" ? void 0 : review.effort,
5104
+ comment: review.comment
5105
+ };
5106
+ }
5107
+ __name(reviewDefaultsFromSettings, "reviewDefaultsFromSettings");
5066
5108
  var parseArgsCommand = {
5067
5109
  command: "parse-args [raw]",
5068
5110
  describe: "Parse the /review skill argument string (--comment, --fix, --effort, target disambiguation) and emit the verdict as JSON; pass the string on stdin via --stdin (a positional that begins with a dash never reaches this handler \u2014 yargs rejects it as an unknown flag)",
@@ -5099,7 +5141,7 @@ var parseArgsCommand = {
5099
5141
  if (bundleNotice) {
5100
5142
  writeStderrLineSafe(bundleNotice);
5101
5143
  }
5102
- const parsed = parseReviewArgs(rawStr);
5144
+ const parsed = parseReviewArgs(rawStr, reviewDefaultsFromSettings());
5103
5145
  const json = JSON.stringify(parsed, null, 2);
5104
5146
  if (out) {
5105
5147
  mkdirSync2(dirname2(out), { recursive: true });
@@ -11402,40 +11444,55 @@ function renderShellLayerBriefList(taxonomy = SHELL_MODEL_LAYERS) {
11402
11444
  }
11403
11445
  __name(renderShellLayerBriefList, "renderShellLayerBriefList");
11404
11446
  var LAYER_RECEIPT_LINE_RE = /^[ \t]*(?:[-*+]|\d+[.)])?[ \t]*[*_~]{0,3}layer\s+walked[*_~]{0,3}[ \t]*[::][\s*_~`]*([a-z][a-z0-9-]*)/i;
11405
- var LAYER_HINT_RE = /layer\s+walked/i;
11447
+ var TRAILING_STITCH = new RegExp("^[\\p{P}\\p{S}]*(?:[^\\s\\p{P}\\p{S}]|\\p{Pc})", "u");
11406
11448
  var MD = new lib_default2({ html: true });
11407
- function quotedLines(text2) {
11408
- const quoted = /* @__PURE__ */ new Set();
11449
+ var DROPPED_INLINE = "\0";
11450
+ var BIDI_CONTROL = new RegExp("\\p{Bidi_Control}", "gu");
11451
+ var INVISIBLE_FORMAT = /[\p{Cf}\p{Variation_Selector}\u000B\u034F\u000C\u2028\u2029]/gu;
11452
+ function* usedLines(finalText) {
11453
+ const src = finalText.replace(/\r\n?/g, "\n");
11409
11454
  let tokens;
11410
11455
  try {
11411
- tokens = MD.parse(text2, {});
11456
+ tokens = MD.parse(src, {});
11412
11457
  } catch {
11413
- return quoted;
11458
+ yield* src.split("\n");
11459
+ return;
11414
11460
  }
11461
+ let blockquoteDepth = 0;
11415
11462
  for (const t2 of tokens) {
11416
- if (t2.map && (t2.type === "fence" || t2.type === "code_block" || t2.type === "html_block" || t2.type === "blockquote_open")) {
11417
- for (let i = t2.map[0]; i < t2.map[1]; i++) quoted.add(i);
11463
+ if (t2.type === "blockquote_open") blockquoteDepth++;
11464
+ else if (t2.type === "blockquote_close") blockquoteDepth--;
11465
+ else if (t2.type === "inline" && blockquoteDepth === 0) {
11466
+ let prose = "";
11467
+ for (const c of t2.children ?? []) {
11468
+ if (c.type === "text")
11469
+ prose += c.content.replace(/[\r\n]+/g, " ").replace(BIDI_CONTROL, DROPPED_INLINE).replace(INVISIBLE_FORMAT, "");
11470
+ else if (c.type === "softbreak" || c.type === "hardbreak")
11471
+ prose += "\n";
11472
+ else if (c.type === "html_inline" && // A real GitHub break: `<br>`, self-closing, or with attributes — but
11473
+ // NOT a `<br-…>` custom element (a hyphen keeps the tag name going, and
11474
+ // GitHub strips the non-allowlisted tag, leaving no break). After `br`
11475
+ // the tag must END, or continue with whitespace/slash then attributes.
11476
+ /^<br(?:[ \t\n\f\r/][^>]*)?>$/i.test(c.content))
11477
+ prose += "\n";
11478
+ else if (c.type === "code_inline" || c.type === "html_inline" || c.type === "image")
11479
+ prose += DROPPED_INLINE;
11480
+ }
11481
+ yield* prose.split("\n");
11418
11482
  }
11419
11483
  }
11420
- return quoted;
11421
- }
11422
- __name(quotedLines, "quotedLines");
11423
- function* usedLines(finalText) {
11424
- const src = finalText.replace(/\r\n?/g, "\n");
11425
- const quoted = quotedLines(src);
11426
- const lines = src.split("\n");
11427
- for (let i = 0; i < lines.length; i++) {
11428
- if (!quoted.has(i)) yield lines[i];
11429
- }
11430
11484
  }
11431
11485
  __name(usedLines, "usedLines");
11432
11486
  function parseLayerReceipts(finalText, taxonomy = SHELL_MODEL_LAYERS) {
11433
11487
  const ids = /* @__PURE__ */ new Set();
11434
- if (!LAYER_HINT_RE.test(finalText)) return ids;
11488
+ const bare = finalText.replace(/[*_~`[\]()]/g, "");
11489
+ if (!/layer/i.test(bare) && !/walked/i.test(bare) && !/&[#a-z]/i.test(finalText))
11490
+ return ids;
11435
11491
  const known = new Set(taxonomy.map((l) => l.id));
11436
11492
  for (const line of usedLines(finalText)) {
11437
11493
  const m = LAYER_RECEIPT_LINE_RE.exec(line);
11438
11494
  if (!m) continue;
11495
+ if (TRAILING_STITCH.test(line.slice(m[0].length))) continue;
11439
11496
  const id = m[1].toLowerCase();
11440
11497
  if (known.has(id)) ids.add(id);
11441
11498
  }
@@ -11506,6 +11563,7 @@ function isRepositoryContextRoleId(value) {
11506
11563
  __name(isRepositoryContextRoleId, "isRepositoryContextRoleId");
11507
11564
  var REVERSE_AUDIT_EXAMPLE_RECEIPT = "No issues found \u2014 re-walked the reconnect state machine and the two changed exports' call sites; every gap I checked was already in the list";
11508
11565
  var MODELED_SYSTEM_EXECUTION_LENS = `- **A model of another system's EXECUTION, diverging in state \u2014 not only its syntax.** Beyond a parser that *reads* a format two ways, an *interpreter* \u2014 a guard, sandbox, or permission model that re-implements how another system (a shell, git, a query engine) RUNS \u2014 can have its model of that system's runtime state drift from the real thing. Syntax divergence is one token read two ways; **state divergence** is the model carrying the wrong VALUE across a boundary the real system crosses differently, so the guard allows what it would have denied. Enumerate the boundaries where the modeled system carries state across a call, and for each ask what the real system does that the model does not: what SURVIVES a function call or \`eval\` (working directory, exported vars, shell options, defined functions) that a subshell or \`$(\u2026)\` does NOT propagate back but DOES inherit; what name-resolution order applies (a function shadowing \`git\`/\`cd\`, \`command\`/\`builtin\` bypassing it, \`export -f\` importing a function into a child shell); which options (\`set -a\`) a child or substitution inherits. The bug shape is a recursive evaluator that computes a nested body's post-state and then DISCARDS or fails to merge it, so a later check runs against state the real system has already moved past. **A second bug shape is state that only ACCUMULATES:** the real system has operations that DELETE what earlier ones added \u2014 \`unset -f\`/\`unalias\`/\`export -n -f\` remove a definition or its export attribute, \`set +a\`/\`+o\` clears an option, \`cd -\`/\`popd\` walks a directory back \u2014 so a model that grows an add-only map of definitions, export attributes, or options and never removes an entry diverges the moment the real system removes one (a \`git\` function defined, then \`unset -f\`'d, still replayed against a stale body while the real shell resolves the external program). For every piece of modeled state, check the model has a REMOVAL path for every ADD path the real system does. **When the boundary is subtle, do not argue it \u2014 run it:** build the payload, execute it against the real system (\`run_shell_command\` real bash/git in the worktree), trace the same payload through the model, and state the divergence with BOTH observed behaviours. A guard that models an executable system and is reviewed only by reading is judged against the very model of that system whose gaps are the vulnerability \u2014 the reading and the code share the blind spot by construction.`;
11566
+ var ENUMERATION_TRAP_LENS = `A change that HAND-ROLLS parsing or matching of a surface whose **entrance space is unbounded** \u2014 untrusted input read a rendered format's way, a re-implemented general grammar, \`indexOf\`/\`slice\`/regex over structured input whose per-corner special-cases keep accumulating ("match what the renderer renders" logic, a growing hand-listed case set) \u2014 has **no last corner**, so enumerating cases never converges. (Adversarial input alone does NOT make a surface unbounded: a small, exhaustively specified grammar has a bounded, enumerable set of productions and IS closable by exhaustive validation \u2014 do not demand a structural replacement there. The trigger is unboundedness of the entrance space, not the mere hostility of the input.) The finding is the SHAPE, not the current corner: name the class-closing fix \u2014 defer to a real parser, the tool's own authoritative structured output, or a fail-closed decision \u2014 and file it ONCE, in place of enumerating cases. **Carry ONE demonstrated corner as the finding's witness** \u2014 the concrete input/state and the line(s) that produce the wrong outcome, executed against the real code where you can \u2014 so a verifier can confirm it at high confidence and it posts; that corner is the class's evidence, not a separate finding. Severity follows the risk the shape carries \u2014 a hand-rolled parser that can be fooled into a wrong result is **Critical**.`;
11509
11567
  var BRIEFS = {
11510
11568
  "0": {
11511
11569
  // Budget-exempt: Issue-sized mandatory work, not diff-sized: a small bugfix
@@ -11663,7 +11721,7 @@ Not your dimension: whether the change is at the right depth (3b owns altitude a
11663
11721
  publicLabel: "the altitude and abstraction pass",
11664
11722
  publicLabelZh: "\u4FEE\u590D\u5C42\u6B21\u4E0E\u62BD\u8C61\u5408\u7406\u6027\u68C0\u67E5",
11665
11723
  readsDiff: true,
11666
- brief: `You are **Agent 3b: Altitude & Abstraction Fit**. One question, walked to the end: **is each change at the right depth?**
11724
+ brief: `You are **Agent 3b: Altitude & Abstraction Fit**. One question, walked to the end: **is each change at the right depth, and the right SHAPE for what it re-implements?**
11667
11725
 
11668
11726
  Altitude is the failure that reads as correct at every individual line and is wrong as a whole. For each change ask where the problem it addresses actually lives, and compare that to where the fix was written:
11669
11727
 
@@ -11671,6 +11729,7 @@ Altitude is the failure that reads as correct at every individual line and is wr
11671
11729
  - **Too shallow in the other direction \u2014 the wrong owner.** The defect is upstream (another module, another service, the data's producer) and the diff compensates for it downstream. Say whose bug it is.
11672
11730
  - **Too deep \u2014 over-engineering.** A new abstraction, indirection layer, options object, or configuration point serving exactly one call site; a generalisation for a second case that does not exist. The cost is real and concrete: every future reader pays for the indirection, and the shape is fixed by a single example that may be unrepresentative.
11673
11731
  - **Blast radius.** When a change to shared infrastructure exists to serve one caller, name the *other* callers it now also affects, and what it means for them.
11732
+ - **Wrong shape \u2014 the enumeration trap.** ${ENUMERATION_TRAP_LENS} Filed here as this change's altitude finding, once, in place of enumerating its cases.
11674
11733
 
11675
11734
  Every finding needs the concrete cost, not an aesthetic judgement: what breaks next, what has to be repeated, who else is affected. "This should be more general" with no named next caller is not a finding.
11676
11735
 
@@ -11921,6 +11980,8 @@ For each finding you were given:
11921
11980
 
11922
11981
  **When the fix IS a threshold, measure the threshold.** A guard built on a ratio or length cutoff makes the fix's coverage an empirical number, not a reading: hold every other variable fixed, vary the guarded quantity, and binary-search the boundary where behaviour flips. Then put that number next to what the linked issue actually reports \u2014 a live verification of a prose-ratio guard measured the minimum recovering payload at ~473 chars with the issue's own preamble held fixed, which proved the fix covered the issue's \`edit\`/\`write_file\` half and silently declined its \`run_shell_command\` half. "Fix is narrower than its claim, here is the boundary, here is the half it misses" is a finding no amount of code-reading produces.
11923
11982
 
11983
+ **When the defect is mechanically enumerable, sweep the real population \u2014 the count is the verdict.** For a claim about a pattern, a predicate, or a parser ("this misclassifies X", "this mishandles shape Y"), do not stop at the one reported instance: run the check over every real instance this repo holds (every workflow step body, every call site, every input the code will actually see) and report the count. "195 of 434 real \`run:\` bodies reach this path" confirms the finding, sizes its severity, and hands the author a number they can re-run rather than argue with \u2014 and a count of **zero** is the quoted contradiction that rejects it. Two rules keep a sweep evidence rather than theatre: its oracle must be an **external authority** \u2014 the real parser, the real tool, \`bash -n\` \u2014 never your own reimplementation of the logic under test, because a mirror shares the blind spots of what it mirrors and mirrored sweeps have manufactured false findings out of their own bugs; and spot-check one hit by reading it before you quote a nonzero count.
11984
+
11924
11985
  **A suggested fix you did not run is a hypothesis; say which one you are giving.** When a finding's fix is cheap to apply, patch it in, re-run the same probe/harness to show it works, then revert \u2014 and state that every other number in your report comes from the unmodified PR (the contamination line is what lets a reader trust the rest). A fix too costly to verify is still worth proposing, labeled untested.
11925
11986
 
11926
11987
  **A probabilistic failure gets a RATE, not an anecdote.** For a timing/race claim, run N repetitions per arm and report the rates as the verdict; amplify with full CPU load to force the window open (a live case went from 4/11 idle to 5/5 loaded). And attribute honestly: a lower idle rate with no structural change is luck, not a fix. Fake-timer tests hardcode one ordering by construction \u2014 they cannot discriminate a race, so a green fake-timer suite is non-evidence here.
@@ -11981,6 +12042,8 @@ Return, for each finding, one verdict:
11981
12042
  - **confirmed (low confidence)** \u2014 the mechanism is real but the trigger is uncertain (timing, environment, configuration). Say what would confirm it. Carry the severity.
11982
12043
  - **rejected** \u2014 the code does not do what the finding claims (**quote the contradicting code**), or it matches an Exclusion Criterion (one-line reason).
11983
12044
 
12045
+ **A confirmed Critical returns its witness.** Alongside the verdict, include a \`witness:\` line quoting the observed output that settled it \u2014 the probe's two sides, the A/B's \`BASE:\`/\`PR:\` pair, the extracted step's run, the sweep count \u2014 trimmed to the deciding lines. When every run-capability above is genuinely inapplicable and the confirmation rests on the trace alone, write the one line \`witness: not run \u2014 <why no run could settle this claim>\` instead; writing that line is also the moment you notice when the claim was runnable after all. This is mechanical downstream \u2014 enforced in code at the findings canonicalization, not merely by the orchestrator's read of its rules: a confirmed Critical returning neither the witness nor the reason line is filed at **low confidence** \u2014 terminal-only, never posted \u2014 whatever your prose argued, because the evidence a run produced is the one part of a Critical its author can act on without re-deriving the bug.
12046
+
11984
12047
  **Rejecting a Critical carries a higher bar than anything else, and it is one-way.** A rejected Critical is gone \u2014 no later stage revisits it, it vanishes from both the pull request and the terminal. To reject one you must **quote the specific code that contradicts the claim**. A passing test, a plausible-looking guard, or "I could not reproduce the reasoning" is not enough \u2014 when you cannot quote the contradiction, the floor is \`confirmed (low confidence)\`, never rejection. Downgrading is reversible; a human still sees a low-confidence finding under "Needs Human Review". Rejection is not.
11985
12048
 
11986
12049
  **For anything non-Critical, when uncertain, downgrade to low confidence rather than rejecting.** Reserve outright rejection for a finding that clearly does not match the code (it describes behaviour the code does not have) or matches an Exclusion Criterion. Low confidence is for "likely real, needs human judgement", not for "I have no idea" \u2014 a vague suspicion with no concrete evidence in the code can still be rejected.
@@ -12016,7 +12079,7 @@ If you find no new gap in your scope, say so **and name what you re-examined** \
12016
12079
 
12017
12080
  // packages/cli/src/commands/review/lib/repository-context.ts
12018
12081
  var REPOSITORY_CONTEXT_VERSION = 1;
12019
- var MAX_ARRAY_ITEMS = 128;
12082
+ var MAX_ARRAY_ITEMS = 256;
12020
12083
  var MAX_PROVIDER_LENGTH = 64;
12021
12084
  var MAX_LABEL_LENGTH = 120;
12022
12085
  var MAX_TOKEN_LENGTH = 160;
@@ -13053,6 +13116,29 @@ function contextRoleRunsInThisReview(role, plan, mode) {
13053
13116
  }
13054
13117
  __name(contextRoleRunsInThisReview, "contextRoleRunsInThisReview");
13055
13118
 
13119
+ // packages/cli/src/commands/review/lib/agent-identity.ts
13120
+ init_esbuild_shims();
13121
+ var CHUNK_ROLE_RE = /^chunk\s+(\d+)\s+of\s+\d+$/i;
13122
+ var IDENTITY_LINE_RE = /^You are review agent `([^`\n]+)`(.*)$/;
13123
+ function labelFromIdentityLine(line) {
13124
+ const m = IDENTITY_LINE_RE.exec(line.replace(/\r$/, ""));
13125
+ if (!m) return null;
13126
+ const [, role, rest] = m;
13127
+ const chunk2 = CHUNK_ROLE_RE.exec(role);
13128
+ if (chunk2) return `chunk ${chunk2[1]}`;
13129
+ const round = /\(round (\d+)\)/.exec(rest);
13130
+ if (round) return `agent ${role} (round ${round[1]})`;
13131
+ const file = /Your file: `([^`\n]+)`/.exec(rest);
13132
+ if (file) return `agent ${role} (${file[1]})`;
13133
+ return `agent ${role}`;
13134
+ }
13135
+ __name(labelFromIdentityLine, "labelFromIdentityLine");
13136
+ function labelFromLaunchPrompt(prompt) {
13137
+ const m = /^You are review agent `[^`\n]+`[^\n]*/m.exec(prompt);
13138
+ return m ? labelFromIdentityLine(m[0]) : null;
13139
+ }
13140
+ __name(labelFromLaunchPrompt, "labelFromLaunchPrompt");
13141
+
13056
13142
  // packages/cli/src/commands/review/lib/deadline.ts
13057
13143
  init_esbuild_shims();
13058
13144
  import {
@@ -13391,7 +13477,12 @@ __name(launchToolBudget, "launchToolBudget");
13391
13477
  var BUDGET_GAP_LINE_RE = /^(?:[ \t]*(?:[-*+]|\d+[.)]))?[ \t]*(`?)[*_~]{0,3}(?:budget gap|预算(?:缺口|不足|用尽))[*_~]{0,3}[ \t]*[::][*_~]{0,3}[ \t]*(.+)$/i;
13392
13478
  var GAP_HINT_RE = /budget gap|预算(?:缺口|不足|用尽)/i;
13393
13479
  var INLINE_BUDGET_GAP_RE = /(?:budget gap|预算(?:缺口|不足|用尽))[*_~`]{0,3}[ \t]*[::]/i;
13394
- 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;
13480
+ var BUDGET_QUALIFIED = "(?:under|within|below|inside)\\s+(?:the\\s+)?(?:tool(?:[- ]call)?\\s+)?budget";
13481
+ var COMPLETION_TAIL = `(?:\\s+${BUDGET_QUALIFIED})?`;
13482
+ var PLACEHOLDER_GAP_RE = new RegExp(
13483
+ `^(?:<[^>]*>$|[-\u2014*_~\`]+$|(?:none|n/a|nothing|no (?:gaps?|checks?))\\b(?:[.!\u2026,;:\\s]*$|\\s+(?:skipped|found|to report)\\b[.!\u2026,;:\\s]*$|\\s*[-\u2014\u2013]\\s*(?:stayed\\s+${BUDGET_QUALIFIED}\\b[.!\u2026,;:\\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${COMPLETION_TAIL}[.!\u2026,;:\\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${COMPLETION_TAIL}[.!\u2026,;:\\s]*\\)\\s*$))`,
13484
+ "i"
13485
+ );
13395
13486
  var MAX_GAP_LENGTH = 160;
13396
13487
  var MAX_GAPS_PER_AGENT = 8;
13397
13488
  var DANGEROUS_CHARS_RE = (
@@ -13577,6 +13668,8 @@ function publicRoleLabelZh(req) {
13577
13668
  __name(publicRoleLabelZh, "publicRoleLabelZh");
13578
13669
  function label(rec, chunk2) {
13579
13670
  if (chunk2 !== null) return `chunk ${chunk2}`;
13671
+ const identity = labelFromLaunchPrompt(rec.launchPrompt);
13672
+ if (identity !== null) return identity;
13580
13673
  const first = rec.launchPrompt.split("\n")[0]?.trim() ?? "";
13581
13674
  if (first) return first.replace(/\s+/g, " ");
13582
13675
  return rec.agentName || rec.agentId;
@@ -14246,6 +14339,7 @@ function validateFindings(raw) {
14246
14339
  const heldRaw = o.heldByMeasurement;
14247
14340
  const heldFile = heldRaw && typeof heldRaw === "object" ? asString(heldRaw, "file") : void 0;
14248
14341
  const shortSummary = asString(o, "shortSummary") ?? asString(o, "short_summary");
14342
+ const witness = asString(o, "witness");
14249
14343
  return {
14250
14344
  id,
14251
14345
  severity,
@@ -14254,6 +14348,7 @@ function validateFindings(raw) {
14254
14348
  summary,
14255
14349
  shortSummary: shortSummary ? compressSummary(shortSummary) : compressSummary(summary),
14256
14350
  failureScenario,
14351
+ ...witness ? { witness } : {},
14257
14352
  ...asString(o, "suggestedFix") || asString(o, "suggested_fix") ? {
14258
14353
  suggestedFix: asString(o, "suggestedFix") ?? asString(o, "suggested_fix")
14259
14354
  } : {},
@@ -14319,6 +14414,24 @@ Held back from Critical by measurement: \`test-delta\` reran the failing test co
14319
14414
  return { findings: out, held, readjudicated };
14320
14415
  }
14321
14416
  __name(holdCriticalsFailingOnBase, "holdCriticalsFailingOnBase");
14417
+ function holdUnwitnessedCriticals(findings) {
14418
+ const unwitnessed = [];
14419
+ const out = findings.map((f) => {
14420
+ if (f.severity !== "Critical" || f.confidence !== "high" || f.source !== "review" || f.witness !== void 0) {
14421
+ return f;
14422
+ }
14423
+ unwitnessed.push(f.id);
14424
+ return {
14425
+ ...f,
14426
+ confidence: "low",
14427
+ failureScenario: `${f.failureScenario}
14428
+
14429
+ Filed at low confidence by the witness rule: this confirmed Critical arrived with neither a witness (the executed evidence that settled the verdict) nor a \`not run \u2014 <reason>\` line. Attach either and it stands at high confidence again.`
14430
+ };
14431
+ });
14432
+ return { findings: out, unwitnessed };
14433
+ }
14434
+ __name(holdUnwitnessedCriticals, "holdUnwitnessedCriticals");
14322
14435
  var WORKSPACE_IN_COMMAND_RE = /--workspace="([^"]+)"/;
14323
14436
  function repoRelative(path3, workspace) {
14324
14437
  const at = path3.indexOf("::");
@@ -14553,6 +14666,8 @@ var findingsCommand = {
14553
14666
  shared
14554
14667
  ));
14555
14668
  }
14669
+ const witnessHold = holdUnwitnessedCriticals(findings);
14670
+ findings = witnessHold.findings;
14556
14671
  const report = buildReport(findings);
14557
14672
  const target = resolve6(out);
14558
14673
  mkdirSync6(dirname5(target), { recursive: true });
@@ -14567,6 +14682,11 @@ var findingsCommand = {
14567
14682
  `findings: ${h.id} held back from Critical \u2014 test-delta measured ${h.file} as failing on the merge base too`
14568
14683
  );
14569
14684
  }
14685
+ for (const id of witnessHold.unwitnessed) {
14686
+ writeStderrLine(
14687
+ `findings: ${id} filed at low confidence \u2014 a confirmed Critical carried neither a witness nor a 'not run' reason (Step 4's witness rule)`
14688
+ );
14689
+ }
14570
14690
  for (const r of readjudicated) {
14571
14691
  writeStderrLine(
14572
14692
  `findings: ${r.id} left at Critical \u2014 it already carries the ${r.file} measurement and was raised again anyway`
@@ -14833,6 +14953,7 @@ __name(layerAuditGate, "layerAuditGate");
14833
14953
 
14834
14954
  // packages/cli/src/commands/review/lib/ledger.ts
14835
14955
  init_esbuild_shims();
14956
+ var SHA_RE = /^[0-9a-f]{7,64}$/;
14836
14957
  var LEDGER_MAX_FINDINGS = 50;
14837
14958
  var LEDGER_MAX_TITLE = 80;
14838
14959
  var LEDGER_MAX_FILE = 200;
@@ -14848,6 +14969,7 @@ function serializeLedger(ledger) {
14848
14969
  const render = /* @__PURE__ */ __name((findings, dropped) => {
14849
14970
  const payload = { v: 1, round: ledger.round, findings };
14850
14971
  if (dropped > 0) payload.dropped = dropped;
14972
+ else if (ledger.sha && SHA_RE.test(ledger.sha)) payload.sha = ledger.sha;
14851
14973
  return `${OPEN}${JSON.stringify(payload).replace(/--/g, "-\\u002d")}${CLOSE}`;
14852
14974
  }, "render");
14853
14975
  const total = ledger.findings.length;
@@ -14872,19 +14994,28 @@ function parseLedger(body) {
14872
14994
  return null;
14873
14995
  }
14874
14996
  if (!Array.isArray(raw.findings)) return null;
14875
- const findings = raw.findings.filter(
14997
+ const valid = raw.findings.filter(
14876
14998
  (f) => !!f && typeof f.id === "string" && (f.sev === "C" || f.sev === "S") && typeof f.file === "string" && typeof f.title === "string" && (f.line === void 0 || Number.isInteger(f.line))
14877
- ).slice(0, LEDGER_MAX_FINDINGS).map((f) => ({
14999
+ );
15000
+ const findings = valid.slice(0, LEDGER_MAX_FINDINGS).map((f) => ({
14878
15001
  ...f,
14879
15002
  title: f.title.slice(0, LEDGER_MAX_TITLE),
14880
15003
  file: f.file.slice(0, LEDGER_MAX_FILE)
14881
15004
  }));
14882
- const dropped = Number.isInteger(raw.dropped) && raw.dropped > 0 ? raw.dropped : void 0;
15005
+ const declared = Number.isInteger(raw.dropped) && raw.dropped > 0 ? raw.dropped : 0;
15006
+ const dropped = declared + (valid.length - findings.length) || void 0;
15007
+ const sha = (
15008
+ // Normalised on READ as the serializer holds on WRITE: a hand-edited
15009
+ // marker carrying both `dropped` and `sha` would certify a range its
15010
+ // own work list admits is partial.
15011
+ typeof raw.sha === "string" && SHA_RE.test(raw.sha) && !dropped ? raw.sha : void 0
15012
+ );
14883
15013
  return {
14884
15014
  v: 1,
14885
15015
  round: raw.round,
14886
15016
  findings,
14887
- ...dropped ? { dropped } : {}
15017
+ ...dropped ? { dropped } : {},
15018
+ ...sha ? { sha } : {}
14888
15019
  };
14889
15020
  } catch {
14890
15021
  return null;
@@ -14943,6 +15074,14 @@ function reviewFooter(modelId, cliVersion) {
14943
15074
  }
14944
15075
  __name(reviewFooter, "reviewFooter");
14945
15076
  var REVIEW_FOOTER_RE = /\s*(?:_— (?:(?! via Qwen Code \/review)[^\n])* via Qwen Code \/review(?: \(v[^\n)]*\))?_?\s*)+$/;
15077
+ var STRIP_TAIL_LIMIT = 8192;
15078
+ function stripReviewFooter(body) {
15079
+ if (!body.includes(FOOTER_MARKER)) return body;
15080
+ const tail2 = body.slice(-STRIP_TAIL_LIMIT);
15081
+ const stripped = tail2.replace(REVIEW_FOOTER_RE, "");
15082
+ return stripped === tail2 ? body : body.slice(0, body.length - tail2.length) + stripped;
15083
+ }
15084
+ __name(stripReviewFooter, "stripReviewFooter");
14946
15085
  function isFooterSafeModelId(modelId) {
14947
15086
  return !/[\n\r]/.test(modelId) && !modelId.includes(FOOTER_MARKER);
14948
15087
  }
@@ -15056,10 +15195,6 @@ function toStringList(value, field) {
15056
15195
  return [...value];
15057
15196
  }
15058
15197
  __name(toStringList, "toStringList");
15059
- function stripReviewFooter(entry) {
15060
- return entry.includes(FOOTER_MARKER) ? entry.replace(REVIEW_FOOTER_RE, "") : entry;
15061
- }
15062
- __name(stripReviewFooter, "stripReviewFooter");
15063
15198
  function toBool(value, field) {
15064
15199
  if (value === void 0 || value === null) return false;
15065
15200
  if (typeof value !== "boolean") {
@@ -15070,15 +15205,15 @@ function toBool(value, field) {
15070
15205
  return value;
15071
15206
  }
15072
15207
  __name(toBool, "toBool");
15073
- function composeReview(input, cliVersion = "unknown") {
15074
- const result = composeReviewBody(input, cliVersion);
15075
- const marker = ledgerMarkerFor(input);
15208
+ function composeReview(input, cliVersion = "unknown", attribution = true) {
15209
+ const result = composeReviewBody(input, cliVersion, attribution);
15210
+ const marker = ledgerMarkerFor(input, result.cappedBy);
15076
15211
  return marker ? { ...result, body: `${result.body}
15077
15212
 
15078
15213
  ${marker}` } : result;
15079
15214
  }
15080
15215
  __name(composeReview, "composeReview");
15081
- function ledgerMarkerFor(input) {
15216
+ function ledgerMarkerFor(input, cappedBy) {
15082
15217
  try {
15083
15218
  if (!input.planPath) return null;
15084
15219
  const plan = JSON.parse(readFileSync13(input.planPath, "utf8"));
@@ -15100,19 +15235,22 @@ function ledgerMarkerFor(input) {
15100
15235
  prevRound = prev.round;
15101
15236
  } catch {
15102
15237
  }
15103
- return serializeLedger(
15104
- buildLedger(
15238
+ const failClosed = (input.cannotTellCriticals?.length ?? 0) > 0 || cappedBy.length > 0;
15239
+ const sha = !failClosed && typeof plan.fetchedSha === "string" ? plan.fetchedSha : void 0;
15240
+ return serializeLedger({
15241
+ ...buildLedger(
15105
15242
  prevRound + 1,
15106
15243
  input.draftedComments ?? [],
15107
15244
  toStringList(input.bodyCriticals, "bodyCriticals").map(stripReviewFooter).filter((entry) => entry.trim() !== "")
15108
- )
15109
- );
15245
+ ),
15246
+ ...sha ? { sha } : {}
15247
+ });
15110
15248
  } catch {
15111
15249
  return null;
15112
15250
  }
15113
15251
  }
15114
15252
  __name(ledgerMarkerFor, "ledgerMarkerFor");
15115
- function composeReviewBody(input, cliVersion) {
15253
+ function composeReviewBody(input, cliVersion, attribution) {
15116
15254
  const criticalsInline = toCount(input.criticalsInline, "criticalsInline");
15117
15255
  const suggestionsInline = toCount(
15118
15256
  input.suggestionsInline,
@@ -15343,15 +15481,19 @@ function composeReviewBody(input, cliVersion) {
15343
15481
  "presubmit.downgradeReasons"
15344
15482
  );
15345
15483
  const modelId = input.modelId;
15346
- if (typeof modelId !== "string" || modelId.trim() === "") {
15347
- throw new TypeError(
15348
- "compose-review: modelId is required (the public footer names the reviewing model)"
15349
- );
15350
- }
15351
- if (!isFooterSafeModelId(modelId)) {
15352
- throw new TypeError(
15353
- "compose-review: modelId is interpolated into the public footer verbatim \u2014 it must be a single line that does not contain the footer marker"
15354
- );
15484
+ let footer = "";
15485
+ if (attribution) {
15486
+ if (typeof modelId !== "string" || modelId.trim() === "") {
15487
+ throw new TypeError(
15488
+ "compose-review: modelId is required (the public footer names the reviewing model)"
15489
+ );
15490
+ }
15491
+ if (!isFooterSafeModelId(modelId)) {
15492
+ throw new TypeError(
15493
+ "compose-review: modelId is interpolated into the public footer verbatim \u2014 it must be a single line that does not contain the footer marker"
15494
+ );
15495
+ }
15496
+ footer = reviewFooter(modelId, cliVersion);
15355
15497
  }
15356
15498
  const c = criticalsInline + bodyCriticals.length;
15357
15499
  const s = suggestionsInline + suggestionsDiscarded;
@@ -15399,7 +15541,6 @@ function composeReviewBody(input, cliVersion) {
15399
15541
  }
15400
15542
  }
15401
15543
  }
15402
- const footer = reviewFooter(modelId, cliVersion);
15403
15544
  const bilingual = bilingualFromPlan(input.planPath, input.prBodyFetcher);
15404
15545
  const render = /* @__PURE__ */ __name((parts, sep9) => {
15405
15546
  const en = parts.map((p) => p.en).join(sep9);
@@ -15413,7 +15554,7 @@ function composeReviewBody(input, cliVersion) {
15413
15554
  ${zh}
15414
15555
 
15415
15556
  </details>` : en;
15416
- return `${text2}
15557
+ return footer === "" ? text2 : `${text2}
15417
15558
 
15418
15559
  ${footer}`;
15419
15560
  }, "render");
@@ -15999,7 +16140,8 @@ var composeReviewCommand = {
15999
16140
  },
16000
16141
  // Same pin as `submit`: the startup stamp, not a version resolved at
16001
16142
  // compose time — a shared runner can rewrite the install mid-session.
16002
- footerVersion(process.env["QWEN_CODE_STARTUP_VERSION"]) ?? await getCliVersion()
16143
+ footerVersion(process.env["QWEN_CODE_STARTUP_VERSION"]) ?? await getCliVersion(),
16144
+ operatorReviewSettings().attribution
16003
16145
  );
16004
16146
  const json = JSON.stringify(
16005
16147
  { ...result, verdictLine: verdictLine(result) },
@@ -17939,7 +18081,7 @@ function renderLedgerSection(ledger) {
17939
18081
  return [
17940
18082
  "## Previous /review round (machine ledger)",
17941
18083
  "",
17942
- `Round ${ledger.round}, recovered from the marker this account's last posted review carried. **Every entry below is owed a this-round ruling** (fixed / still stands / cannot tell) under Step 6's previous-round rules \u2014 the ledger is a work list, not a verdict; re-assert each claim against the code before repeating or retiring it.`,
18084
+ `Round ${ledger.round}${ledger.sha ? `, reviewed at \`${code2(ledger.sha)}\`` : ""}, recovered from the marker this account's last posted review carried. **Every entry below is owed a this-round ruling** (fixed / still stands / cannot tell / superseded by <class-id>) under Step 6's previous-round rules \u2014 the ledger is a work list, not a verdict; re-assert each claim against the code before repeating or retiring it.${ledger.sha ? ` The reviewed-at sha is the incremental anchor Step 1's recovered-anchor check reads from the side file \u2014 validate it is an ancestor of the fetched head before scoping to it.` : ""}`,
17943
18085
  // A truncated ledger must not read like a complete one. `dropped` exists
17944
18086
  // to draw that line, and this is the only place a reader sees the list.
17945
18087
  ...ledger.dropped ? [
@@ -18867,7 +19009,7 @@ async function runPresubmit(args) {
18867
19009
  `repos/${owner}/${repo}/pulls/${prNumber}/comments`
18868
19010
  );
18869
19011
  const qwenComments = allComments.filter(
18870
- (c) => /via Qwen Code \/review/.test(c.body ?? "")
19012
+ (c) => /via Qwen Code \/review/.test(c.body ?? "") || !c.in_reply_to_id && me !== "" && (c.user?.login ?? "").toLowerCase() === me.toLowerCase() && severityOf(c) !== null
18871
19013
  );
18872
19014
  const repliedToIds = /* @__PURE__ */ new Set();
18873
19015
  for (const c of allComments) {
@@ -19117,14 +19259,15 @@ function reviewWriteAuthorization(req) {
19117
19259
  } catch {
19118
19260
  return {
19119
19261
  ok: false,
19120
- why: `no review arguments were recorded at ${path3}, so this run cannot show that \`--comment\` was requested`
19262
+ why: req.defaultComment === true ? `no review arguments were recorded at ${path3}, so no recorded invocation names a pull request to bind this write to \u2014 re-run the review naming the pull request` : `no review arguments were recorded at ${path3}, so this run cannot show that \`--comment\` was requested`
19121
19263
  };
19122
19264
  }
19123
- const verdict = parseReviewArgs(raw);
19265
+ const verdict = parseReviewArgs(raw, { comment: req.defaultComment });
19124
19266
  if (!verdict.comment.effective) {
19267
+ const commentRequested = verdict.comment.requested || req.defaultComment === true;
19125
19268
  return {
19126
19269
  ok: false,
19127
- why: `\`--comment\` was not in the review arguments (${JSON.stringify(raw.trim())})`
19270
+ why: commentRequested ? `the review arguments (${JSON.stringify(raw.trim())}) do not name a pull request, so they cannot authorise posting to one` : `\`--comment\` was not in the review arguments (${JSON.stringify(raw.trim())})`
19128
19271
  };
19129
19272
  }
19130
19273
  const t2 = verdict.target;
@@ -19161,7 +19304,7 @@ function reviewWriteAuthorization(req) {
19161
19304
  }
19162
19305
  return {
19163
19306
  ok: true,
19164
- why: `\`--comment\` was in the review arguments for #${authorisedPr}`
19307
+ why: verdict.comment.requested ? `\`--comment\` was in the review arguments for #${authorisedPr}` : `\`review.comment\` is enabled in settings, and the review arguments name #${authorisedPr}`
19165
19308
  };
19166
19309
  }
19167
19310
  __name(reviewWriteAuthorization, "reviewWriteAuthorization");
@@ -19403,6 +19546,7 @@ function runPublishAssets(args) {
19403
19546
  const effectiveHost = resolveGhHost(args.host);
19404
19547
  const auth = reviewWriteAuthorization({
19405
19548
  userAuthorized: args.userAuthorized,
19549
+ defaultComment: args.defaultComment,
19406
19550
  skillArgs: args.skillArgs,
19407
19551
  pr: args.pr,
19408
19552
  // Bind the REVIEWED repo when the caller names it, never the assets repo:
@@ -19609,7 +19753,11 @@ var publishAssetsCommand = {
19609
19753
  out: argv["out"],
19610
19754
  host: argv["host"],
19611
19755
  userAuthorized: Boolean(argv["user-authorized"]),
19612
- skillArgs: argv["skill-args"]
19756
+ skillArgs: argv["skill-args"],
19757
+ // The same operator-scope resolution as `submit`: the two callers of
19758
+ // the shared gate must agree on what authorises a run, or a run that
19759
+ // posts the review still refuses to publish its evidence images.
19760
+ defaultComment: operatorReviewSettings().comment
19613
19761
  });
19614
19762
  }, "handler")
19615
19763
  };
@@ -20289,7 +20437,7 @@ function toolBudgetBlock(report, launch) {
20289
20437
  "",
20290
20438
  "## Tool budget",
20291
20439
  "",
20292
- `About **${total} tool calls** for this whole review \u2014 reads, greps, shell, everything \u2014 and the ~${reads} reads your launch is assigned (your brief, the diff pages, any files your method mandates) are already counted in. It is a soft ceiling. At the ceiling: stop exploring, write your findings from the evidence already in hand, and disclose each unfinished check on its own line, exactly as \`Budget gap: <the check>\` \u2014 the coverage tool reads those lines, so the format is load-bearing. The budget never suppresses a finding: a candidate you can already name goes in your return regardless (at \`Confidence: low\` if the budget stopped you before verifying it).`
20440
+ `About **${total} tool calls** for this whole review \u2014 reads, greps, shell, everything \u2014 and the ~${reads} reads your launch is assigned (your brief, the diff pages, any files your method mandates) are already counted in. It is a soft ceiling. At the ceiling: stop exploring, write your findings from the evidence already in hand, and disclose each unfinished check on its own line, exactly as \`Budget gap: <the check>\` \u2014 the coverage tool reads those lines, so the format is load-bearing. If nothing was cut short, write NO \`Budget gap:\` line at all \u2014 the format is only for checks the ceiling stopped: a "none" put there is at best filtered out, and any wording the filter does not recognize is published in the review body as a phantom coverage gap. The budget never suppresses a finding: a candidate you can already name goes in your return regardless (at \`Confidence: low\` if the budget stopped you before verifying it).`
20293
20441
  ];
20294
20442
  }
20295
20443
  __name(toolBudgetBlock, "toolBudgetBlock");
@@ -20318,6 +20466,7 @@ function buildChunkAgentPrompt(report, id, rules) {
20318
20466
  "",
20319
20467
  ` Uncoverable: chunk ${chunk2.id} \u2014 line exceeds the read limit`
20320
20468
  );
20469
+ return parts.join("\n");
20321
20470
  } else if (chunk2.oversized) {
20322
20471
  parts.push(
20323
20472
  "",
@@ -20332,6 +20481,8 @@ function buildChunkAgentPrompt(report, id, rules) {
20332
20481
  "",
20333
20482
  "For your territory only, you own every dimension: line-by-line correctness, the removed-behavior audit of your own deleted lines, security, code quality, performance, test coverage, and the adversarial reading. Two duties are NOT yours, because a chunk agent is structurally blind to them: cross-file tracing (a caller in another chunk) and the cross-chunk half of removed-behavior. Audit the deletions in your own territory; do not conclude a deletion is unreplaced merely because its replacement is not in your range.",
20334
20483
  "",
20484
+ "**Shape check (part of code quality \u2014 the altitude lens, scoped to your territory).** For the code in YOUR chunk: " + ENUMERATION_TRAP_LENS,
20485
+ "",
20335
20486
  FINDING_FORMAT,
20336
20487
  "",
20337
20488
  SEVERITY,
@@ -23840,9 +23991,8 @@ function isDiffLine(n) {
23840
23991
  return typeof n === "number" && Number.isSafeInteger(n) && n > 0;
23841
23992
  }
23842
23993
  __name(isDiffLine, "isDiffLine");
23843
- function normalizeInlineComments(comments, modelId, cliVersion) {
23844
- if (typeof modelId !== "string" || modelId.trim() === "") return comments;
23845
- const footer = reviewFooter(modelId, cliVersion);
23994
+ function normalizeInlineComments(comments, modelId, cliVersion, attribution) {
23995
+ const footer = attribution && typeof modelId === "string" && modelId.trim() !== "" ? reviewFooter(modelId, cliVersion) : void 0;
23846
23996
  return comments.map(
23847
23997
  (comment2) => (
23848
23998
  // An empty body stays empty: this runs BEFORE the consistency check, and
@@ -23850,7 +24000,9 @@ function normalizeInlineComments(comments, modelId, cliVersion) {
23850
24000
  // names it ('has no body — an empty comment').
23851
24001
  typeof comment2.body === "string" && comment2.body.trim() !== "" ? {
23852
24002
  ...comment2,
23853
- body: `${comment2.body.replace(REVIEW_FOOTER_RE, "")}
24003
+ // Forged footers are stripped even with attribution off: a comment
24004
+ // authored by the model must not carry one the operator turned off.
24005
+ body: footer === void 0 ? stripReviewFooter(comment2.body) : `${stripReviewFooter(comment2.body)}
23854
24006
 
23855
24007
  ${footer}`
23856
24008
  } : comment2
@@ -23858,9 +24010,10 @@ ${footer}`
23858
24010
  );
23859
24011
  }
23860
24012
  __name(normalizeInlineComments, "normalizeInlineComments");
23861
- function authorization(args) {
24013
+ function authorization(args, defaultComment) {
23862
24014
  return reviewWriteAuthorization({
23863
24015
  userAuthorized: args.userAuthorized,
24016
+ defaultComment,
23864
24017
  skillArgs: args.skillArgs,
23865
24018
  pr: args.pr,
23866
24019
  repo: args.repo,
@@ -23871,7 +24024,7 @@ function authorization(args) {
23871
24024
  });
23872
24025
  }
23873
24026
  __name(authorization, "authorization");
23874
- function compose(payload, cliVersion) {
24027
+ function compose(payload, cliVersion, attribution) {
23875
24028
  const comments = payload.comments ?? [];
23876
24029
  const state = payload.state ?? {};
23877
24030
  const { criticalsInline, suggestionsInline } = countInlineFindings(comments);
@@ -23891,7 +24044,8 @@ function compose(payload, cliVersion) {
23891
24044
  suggestionsInline,
23892
24045
  draftedComments: comments
23893
24046
  },
23894
- cliVersion
24047
+ cliVersion,
24048
+ attribution
23895
24049
  );
23896
24050
  return { event: r.event, body: r.body, cappedBy: r.cappedBy };
23897
24051
  }
@@ -23971,7 +24125,8 @@ function inconsistencies(payload, event2) {
23971
24125
  return problems;
23972
24126
  }
23973
24127
  __name(inconsistencies, "inconsistencies");
23974
- function runSubmit(args, cliVersion = "unknown") {
24128
+ function runSubmit(args, cliVersion = "unknown", opts = {}) {
24129
+ const { attribution = true, defaultComment = false } = opts;
23975
24130
  setGhHost(args.host);
23976
24131
  if (!isOwnerRepo(args.repo)) {
23977
24132
  throw new Error(
@@ -23991,11 +24146,12 @@ function runSubmit(args, cliVersion = "unknown") {
23991
24146
  `Cannot read review JSON ${args.review}: ${err.message}`
23992
24147
  );
23993
24148
  }
23994
- const auth = authorization(args);
24149
+ const auth = authorization(args, defaultComment);
23995
24150
  if (!auth.ok) {
24151
+ const advice = auth.why.includes("`--comment` was") ? `This is the correct outcome of a review the user did not ask to publish \u2014 report the findings in the terminal and stop. Re-run with \`--comment\`, or pass --user-authorized only after the user has asked, in a message they typed, for this review to be published.` : `Nothing recorded authorises binding this target \u2014 report the findings in the terminal and stop. Posting to this pull request needs a review invoked naming it, or --user-authorized after the user has asked, in a message they typed, for this review to be published.`;
23996
24152
  writeStderrLine(
23997
24153
  `REFUSED to post to ${args.repo}#${args.pr}: ${auth.why}.
23998
- Posting is a public, irreversible write, and this run has no authorisation for one. This is the correct outcome of a review the user did not ask to publish \u2014 report the findings in the terminal and stop. Re-run with \`--comment\`, or pass --user-authorized only after the user has asked, in a message they typed, for this review to be published.`
24154
+ Posting is a public, irreversible write, and this run has no authorisation for one. ${advice}`
23999
24155
  );
24000
24156
  writeStdoutLine(
24001
24157
  JSON.stringify({ posted: false, reason: auth.why }, null, 2)
@@ -24015,14 +24171,15 @@ Posting is a public, irreversible write, and this run has no authorisation for o
24015
24171
  comments: normalizeInlineComments(
24016
24172
  payload.comments ?? [],
24017
24173
  payload.state?.modelId,
24018
- cliVersion
24174
+ cliVersion,
24175
+ attribution
24019
24176
  )
24020
24177
  };
24021
24178
  let event2;
24022
24179
  let body;
24023
24180
  let cappedBy;
24024
24181
  try {
24025
- ({ event: event2, body, cappedBy } = compose(payload, cliVersion));
24182
+ ({ event: event2, body, cappedBy } = compose(payload, cliVersion, attribution));
24026
24183
  } catch (err) {
24027
24184
  throw new Error(
24028
24185
  `The review state does not compose into a verdict; refusing to post:
@@ -24122,7 +24279,7 @@ var submitCommand = {
24122
24279
  describe: "Path to the review JSON (commit_id / comments / state). event and body are computed here from state and the comments \u2014 do not include them."
24123
24280
  }).option("skill-args", {
24124
24281
  type: "string",
24125
- describe: "Path to the CLI-written record of the review's invocation arguments (defaults to .qwen/tmp/qwen-skill-args-review.txt). Its `--comment` is what authorises a post. Deliberately NOT the parser's JSON output: that is a document the caller writes, and a caller that wants to post can write anything in it."
24282
+ describe: "Path to the CLI-written record of the review's invocation arguments (defaults to .qwen/tmp/qwen-skill-args-review.txt). Its `--comment` \u2014 or the standing `review.comment` setting \u2014 is what authorises a post. Deliberately NOT the parser's JSON output: that is a document the caller writes, and a caller that wants to post can write anything in it."
24126
24283
  }).option("user-authorized", {
24127
24284
  type: "boolean",
24128
24285
  default: false,
@@ -24137,7 +24294,11 @@ var submitCommand = {
24137
24294
  }), "builder"),
24138
24295
  handler: /* @__PURE__ */ __name(async (argv) => {
24139
24296
  const cliVersion = footerVersion(process.env["QWEN_CODE_STARTUP_VERSION"]) ?? await getCliVersion();
24140
- runSubmit(argv, cliVersion);
24297
+ const review = operatorReviewSettings();
24298
+ runSubmit(argv, cliVersion, {
24299
+ attribution: review.attribution,
24300
+ defaultComment: review.comment
24301
+ });
24141
24302
  }, "handler")
24142
24303
  };
24143
24304
 
@@ -26314,23 +26475,14 @@ var AUDIT_BRIEF_RE = /read_file\(file_path="[^"]*reverse-audit--chunk-(\d+)--rou
26314
26475
  function labelOf(launch, fallback) {
26315
26476
  const nl = launch.indexOf("\n");
26316
26477
  const identity = nl === -1 ? launch : launch.slice(0, nl);
26317
- if (!identity.startsWith("You are review agent `")) return fallback;
26478
+ const parsed = labelFromIdentityLine(identity);
26479
+ if (parsed === null) return fallback;
26318
26480
  let auditChunk = null;
26319
26481
  for (const m of launch.matchAll(AUDIT_BRIEF_RE)) auditChunk = m;
26320
26482
  if (auditChunk) {
26321
26483
  return `audit chunk ${auditChunk[1]} (round ${auditChunk[2]})`;
26322
26484
  }
26323
- const role = /^You are review agent `([^`]+)`/.exec(identity);
26324
- if (!role) return fallback;
26325
- const round = /\(round (\d+)\)/.exec(identity);
26326
- const chunk2 = CHUNK_RE.exec(role[1]);
26327
- if (chunk2) return `chunk ${chunk2[1]}`;
26328
- if (round) {
26329
- return `agent ${role[1]} (round ${round[1]})`;
26330
- }
26331
- const file = /Your file: `([^`]+)`/.exec(identity);
26332
- if (file) return `agent ${role[1]} (${file[1]})`;
26333
- return `agent ${role[1]}`;
26485
+ return parsed;
26334
26486
  }
26335
26487
  __name(labelOf, "labelOf");
26336
26488
  function foldEvents(id, label2, events) {
@@ -26572,7 +26724,50 @@ init_esbuild_shims();
26572
26724
  import { spawn, execFileSync as execFileSync6 } from "node:child_process";
26573
26725
  import { readdirSync as readdirSync9, readFileSync as readFileSync34, realpathSync as realpathSync6, statSync as statSync17 } from "node:fs";
26574
26726
  import { dirname as dirname25, join as join24, resolve as resolve26 } from "node:path";
26575
- var COMPOSED_PATTERN = /^qwen-review-.*composed\.json$/;
26727
+ function classifyRunTarget(target) {
26728
+ if (!target) return { kind: "local" };
26729
+ const { target: t2 } = parseReviewArgs(target);
26730
+ if (t2.type === "pr-number" || t2.type === "pr-url") {
26731
+ return { kind: "pr", number: String(t2.number) };
26732
+ }
26733
+ if (t2.type === "file") {
26734
+ const trimmed = t2.path.replace(/[\\/]+$/, "");
26735
+ return { kind: "file", base: trimmed.split(/[\\/]/).pop() || trimmed };
26736
+ }
26737
+ return { kind: "local" };
26738
+ }
26739
+ __name(classifyRunTarget, "classifyRunTarget");
26740
+ var escapeRe = /* @__PURE__ */ __name((s) => s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "escapeRe");
26741
+ function composedNameFor(cls) {
26742
+ switch (cls.kind) {
26743
+ case "pr":
26744
+ return `qwen-review-pr-${cls.number}-composed.json`;
26745
+ case "file":
26746
+ return `qwen-review-${cls.base}-composed.json`;
26747
+ case "local":
26748
+ default:
26749
+ return "qwen-review-local-composed.json";
26750
+ }
26751
+ }
26752
+ __name(composedNameFor, "composedNameFor");
26753
+ function composedPatternFor(cls) {
26754
+ return new RegExp(`^${escapeRe(composedNameFor(cls))}$`);
26755
+ }
26756
+ __name(composedPatternFor, "composedPatternFor");
26757
+ function reportPatternFor(cls) {
26758
+ switch (cls.kind) {
26759
+ case "pr":
26760
+ return new RegExp(`-pr-${cls.number}\\.md$`);
26761
+ case "file":
26762
+ return new RegExp(
26763
+ cls.base.toLowerCase().endsWith(".md") ? `-${escapeRe(cls.base)}$` : `-${escapeRe(cls.base)}\\.md$`
26764
+ );
26765
+ case "local":
26766
+ default:
26767
+ return /^(?!.*-pr-\d+\.md$).*\.md$/;
26768
+ }
26769
+ }
26770
+ __name(reportPatternFor, "reportPatternFor");
26576
26771
  var COMPOSED_POLL_MS = 250;
26577
26772
  var SIGNAL_EXIT_CODES = {
26578
26773
  SIGHUP: 129,
@@ -26582,8 +26777,12 @@ var SIGNAL_EXIT_CODES = {
26582
26777
  var PARENT_SIGNALS = Object.keys(SIGNAL_EXIT_CODES);
26583
26778
  function buildReviewPrompt(args) {
26584
26779
  const parts = ["/review"];
26585
- if (args.target) {
26586
- if (/\s/.test(args.target) || args.target.startsWith("-") || /['"]/.test(args.target)) {
26780
+ if (args.target !== void 0) {
26781
+ if (args.target.trim() === "" || /\s/.test(args.target) || args.target.startsWith("-") || /['"]/.test(args.target) || // A separators-only path (`/`, `//`, `\`) names no file: it survives
26782
+ // basename extraction as the empty string, which pins the unmatchable
26783
+ // `qwen-review--composed.json` and burns a whole child review before
26784
+ // reporting "no composed verdict". Refuse it here instead.
26785
+ /^[\\/]+$/.test(args.target)) {
26587
26786
  throw new Error(
26588
26787
  `Invalid review target ${JSON.stringify(args.target)}: expected a single PR number, PR URL, or file path`
26589
26788
  );
@@ -26615,7 +26814,7 @@ function newestArtifactSince(dir, pattern, startMs) {
26615
26814
  if (mtime < startMs) continue;
26616
26815
  if (!best || mtime > best.mtime) best = { path: path3, mtime };
26617
26816
  }
26618
- return best ? best.path : null;
26817
+ return best;
26619
26818
  }
26620
26819
  __name(newestArtifactSince, "newestArtifactSince");
26621
26820
  function exitCodeFor(completed, event2, failOn) {
@@ -26705,20 +26904,19 @@ async function runReview(args) {
26705
26904
  child.stdout?.resume();
26706
26905
  child.stderr?.resume();
26707
26906
  }
26907
+ const targetClass = classifyRunTarget(args.target);
26908
+ const composedPattern = composedPatternFor(targetClass);
26708
26909
  let capturedPath = null;
26709
26910
  let capturedVerdict = null;
26911
+ let capturedMtime = -Infinity;
26710
26912
  const captureTimer = setInterval(() => {
26711
- if (capturedVerdict !== null) return;
26712
- const path3 = newestArtifactSince(
26713
- REVIEW_TMP_DIR,
26714
- COMPOSED_PATTERN,
26715
- cutoffMs
26716
- );
26717
- if (path3 === null) return;
26718
- const verdict = readComposed(path3);
26913
+ const best = newestArtifactSince(REVIEW_TMP_DIR, composedPattern, cutoffMs);
26914
+ if (best === null || best.mtime <= capturedMtime) return;
26915
+ const verdict = readComposed(best.path);
26719
26916
  if (verdict !== null) {
26720
- capturedPath = path3;
26917
+ capturedPath = best.path;
26721
26918
  capturedVerdict = verdict;
26919
+ capturedMtime = best.mtime;
26722
26920
  }
26723
26921
  }, COMPOSED_POLL_MS);
26724
26922
  let timedOut = false;
@@ -26761,14 +26959,11 @@ async function runReview(args) {
26761
26959
  let composedPath = capturedPath;
26762
26960
  let composed = capturedVerdict;
26763
26961
  if (composed === null) {
26764
- composedPath = newestArtifactSince(
26765
- REVIEW_TMP_DIR,
26766
- COMPOSED_PATTERN,
26767
- cutoffMs
26768
- );
26962
+ const best = newestArtifactSince(REVIEW_TMP_DIR, composedPattern, cutoffMs);
26963
+ composedPath = best?.path ?? null;
26769
26964
  composed = composedPath ? readComposed(composedPath) : null;
26770
26965
  }
26771
- const reportPath = newestArtifactSince(REVIEWS_DIR, /\.md$/, cutoffMs);
26966
+ const reportPath = newestArtifactSince(REVIEWS_DIR, reportPatternFor(targetClass), cutoffMs)?.path ?? null;
26772
26967
  const completed = composed !== null;
26773
26968
  const result = {
26774
26969
  completed,
@@ -26780,6 +26975,7 @@ async function runReview(args) {
26780
26975
  downgradedFrom: composed?.downgradedFrom ?? null,
26781
26976
  remediation: composed?.remediation ?? [],
26782
26977
  composedPath: composedPath ? resolve26(composedPath) : null,
26978
+ expectedComposedName: composedNameFor(targetClass),
26783
26979
  reportPath: reportPath ? resolve26(reportPath) : null,
26784
26980
  childExitCode,
26785
26981
  childSignal,
@@ -26794,7 +26990,10 @@ async function runReview(args) {
26794
26990
  writeStdoutLine(result.verdictLine ?? `Event: ${result.event}`);
26795
26991
  if (result.reportPath) writeStdoutLine(`Report: ${result.reportPath}`);
26796
26992
  } else {
26797
- const detail = composedPath !== null ? `a composed verdict was found at ${resolve26(composedPath)} but could not be parsed` : "no composed verdict was produced";
26993
+ const detail = composedPath !== null ? `a composed verdict was found at ${resolve26(composedPath)} but could not be parsed` : `no composed verdict was produced (expected ${join24(
26994
+ REVIEW_TMP_DIR,
26995
+ composedNameFor(targetClass)
26996
+ )})`;
26798
26997
  writeStdoutLine(
26799
26998
  timedOut ? "Review did not complete: timed out." : `Review did not complete: ${detail}${childExitCode !== null ? ` (CLI exit ${childExitCode})` : ""}${childSignal !== null ? ` (killed by ${childSignal})` : ""}.`
26800
26999
  );
@@ -27361,10 +27560,10 @@ var updateCommand3 = {
27361
27560
  stdioHelpers,
27362
27561
  { updateEventEmitter }
27363
27562
  ] = await Promise.all([
27364
- import("./settings-GUJ3TN2J.js"),
27365
- import("./updateCheck-YAKM36WQ.js"),
27366
- import("./installationInfo-4OA6UW7V.js"),
27367
- import("./standalone-update-MJ722XZ4.js"),
27563
+ import("./settings-CSYVIP2R.js"),
27564
+ import("./updateCheck-QJI2SYWF.js"),
27565
+ import("./installationInfo-P7OTIR4P.js"),
27566
+ import("./standalone-update-RB2EGUSF.js"),
27368
27567
  import("./stdioHelpers-7A2EE64Z.js"),
27369
27568
  import("./updateEventEmitter-5MKC7BLQ.js")
27370
27569
  ]);
@@ -28439,6 +28638,9 @@ async function loadCliConfig(settings, argv, cwd = process.cwd(), overrideExtens
28439
28638
  const screenReader = argv.screenReader !== void 0 ? argv.screenReader : settings.ui?.accessibility?.screenReader ?? false;
28440
28639
  let sessionId;
28441
28640
  let sessionData;
28641
+ let sessionRestoreProjection;
28642
+ const sessionRestoreProjectionSource = hostPolicy?.sessionRestore?.projectionSource;
28643
+ let deferProjectionUntilWriterLease = false;
28442
28644
  if (argv.continue || argv.resume) {
28443
28645
  const sessionService = new SessionService(cwd);
28444
28646
  if (argv.continue) {
@@ -28454,8 +28656,19 @@ async function loadCliConfig(settings, argv, cwd = process.cwd(), overrideExtens
28454
28656
  }
28455
28657
  if (argv.resume) {
28456
28658
  sessionId = argv.resume;
28457
- sessionData = await sessionService.loadSession(argv.resume);
28458
- if (!sessionData) {
28659
+ deferProjectionUntilWriterLease = sessionRestoreProjectionSource !== void 0 && (argv.chatRecording ?? settings.general?.chatRecording ?? true) && isAcpMode === true && settings.experimental?.sessionWriterLease === true;
28660
+ if (sessionRestoreProjectionSource) {
28661
+ if (!deferProjectionUntilWriterLease && !argv.forkSession) {
28662
+ addDaemonRequestAttribute(
28663
+ "qwen-code.daemon.session_restore.projection_acquisition",
28664
+ "preloaded"
28665
+ );
28666
+ sessionRestoreProjection = await sessionRestoreProjectionSource(sessionId);
28667
+ }
28668
+ } else {
28669
+ sessionData = await sessionService.loadSession(argv.resume);
28670
+ }
28671
+ if (!sessionRestoreProjectionSource && !sessionData) {
28459
28672
  const message = `No saved session found with ID ${argv.resume}. Run \`qwen --resume\` without an ID to choose from existing sessions.`;
28460
28673
  writeStderrLine(message);
28461
28674
  process.exit(1);
@@ -28473,10 +28686,21 @@ async function loadCliConfig(settings, argv, cwd = process.cwd(), overrideExtens
28473
28686
  process.exit(1);
28474
28687
  }
28475
28688
  sessionId = forkedSessionId;
28476
- sessionData = await sessionService.loadSession(forkedSessionId);
28477
- if (!sessionData) {
28478
- writeStderrLine(`Failed to load forked session ${forkedSessionId}.`);
28479
- process.exit(1);
28689
+ if (sessionRestoreProjectionSource) {
28690
+ sessionData = void 0;
28691
+ if (!deferProjectionUntilWriterLease) {
28692
+ addDaemonRequestAttribute(
28693
+ "qwen-code.daemon.session_restore.projection_acquisition",
28694
+ "preloaded"
28695
+ );
28696
+ sessionRestoreProjection = await sessionRestoreProjectionSource(forkedSessionId);
28697
+ }
28698
+ } else {
28699
+ sessionData = await sessionService.loadSession(forkedSessionId);
28700
+ if (!sessionData) {
28701
+ writeStderrLine(`Failed to load forked session ${forkedSessionId}.`);
28702
+ process.exit(1);
28703
+ }
28480
28704
  }
28481
28705
  }
28482
28706
  } else if (argv.sandboxSessionId) {
@@ -28502,6 +28726,8 @@ async function loadCliConfig(settings, argv, cwd = process.cwd(), overrideExtens
28502
28726
  }
28503
28727
  const modelProvidersConfig = settings.modelProviders;
28504
28728
  const providerProtocolConfig = settings.providerProtocol;
28729
+ const restoreSessionId = sessionId;
28730
+ const boundSessionRestoreProjectionSource = sessionRestoreProjectionSource && restoreSessionId ? () => sessionRestoreProjectionSource(restoreSessionId) : void 0;
28505
28731
  const cliMcpServers = parseMcpConfig(argv.mcpConfig);
28506
28732
  const topTierMcpServers = sessionMcpServers || cliMcpServers ? { ...sessionMcpServers, ...cliMcpServers ?? {} } : void 0;
28507
28733
  const mcpServers = bareMode || safeMode ? { ...topTierMcpServers } : assembleMcpServers(settings.mcpServers, cwd, topTierMcpServers);
@@ -28509,6 +28735,8 @@ async function loadCliConfig(settings, argv, cwd = process.cwd(), overrideExtens
28509
28735
  const configParams = {
28510
28736
  sessionId,
28511
28737
  sessionData,
28738
+ sessionRestoreProjection,
28739
+ sessionRestoreProjectionSource: boundSessionRestoreProjectionSource,
28512
28740
  embeddingModel: DEFAULT_QWEN_EMBEDDING_MODEL,
28513
28741
  sandbox: sandboxConfig,
28514
28742
  targetDir: cwd,
@@ -28526,7 +28754,7 @@ async function loadCliConfig(settings, argv, cwd = process.cwd(), overrideExtens
28526
28754
  disabledSlashCommands: disabledSlashCommands.length > 0 ? disabledSlashCommands : void 0,
28527
28755
  disabledSkillNamesProvider: bareMode || safeMode ? void 0 : disabledSkillNamesProvider,
28528
28756
  terminalImageRenderSupportProvider: interactive ? async () => {
28529
- const { getTerminalImageRenderSupport } = await import("./terminal-image-renderer-BCUN3Z3W.js");
28757
+ const { getTerminalImageRenderSupport } = await import("./terminal-image-renderer-BTRE2GEU.js");
28530
28758
  return getTerminalImageRenderSupport();
28531
28759
  } : void 0,
28532
28760
  disabledSkillLevels: bareMode || safeMode || !Array.isArray(settings.skills?.disabledLevels) ? void 0 : settings.skills.disabledLevels.filter(isSkillLevel),