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

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 (323) hide show
  1. package/bundled/qc-helper/docs/configuration/settings.md +10 -0
  2. package/bundled/qc-helper/docs/features/code-review.md +1 -1
  3. package/bundled/qc-helper/docs/qwen-serve.md +34 -34
  4. package/bundled/review/SKILL.md +55 -36
  5. package/chunks/{MaxSizedBox-EIK4BHBQ.js → MaxSizedBox-GFI5RYXH.js} +41 -41
  6. package/chunks/{StandaloneSessionPicker-NHVJDRYD.js → StandaloneSessionPicker-JFWRY4V2.js} +60 -60
  7. package/chunks/{acp-startup-profiler-JMJBZDVO.js → acp-startup-profiler-TVI2OVUN.js} +2 -2
  8. package/chunks/{acpAgent-37UDZP64.js → acpAgent-7YC6SNIS.js} +672 -428
  9. package/chunks/{agent-FAWBG7PP.js → agent-43KVQSB5.js} +38 -38
  10. package/chunks/{agent-headless-SHK4PCCH.js → agent-headless-P2N7PDGQ.js} +38 -38
  11. package/chunks/{anthropicContentGenerator-4JSC3ZFL.js → anthropicContentGenerator-ZBBX5VMY.js} +6 -6
  12. package/chunks/{artifact-tool-FRMBPDPB.js → artifact-tool-RWJAKYBZ.js} +2 -2
  13. package/chunks/{askUserQuestion-7G3LI3IZ.js → askUserQuestion-IQCA2SOX.js} +2 -2
  14. package/chunks/{bridge-DEAYNDCI.js → bridge-ZBMNALLA.js} +44 -44
  15. package/chunks/{channel-management-service-SKAN6NOB.js → channel-management-service-5ZYX4ROW.js} +4 -4
  16. package/chunks/{channel-settings-store-UIGYER6R.js → channel-settings-store-ZJWM7EDP.js} +45 -45
  17. package/chunks/{channel-worker-group-YPTB5ASD.js → channel-worker-group-QFJKXO7R.js} +5 -5
  18. package/chunks/{channel-worker-manager-4EHJSPRH.js → channel-worker-manager-PWD2UURZ.js} +5 -5
  19. package/chunks/{channel-worker-supervisor-DZKHYFHV.js → channel-worker-supervisor-XQJBGFCM.js} +3 -3
  20. package/chunks/{chunk-GZGDJ4E6.js → chunk-2ASWIM4A.js} +1 -1
  21. package/chunks/{chunk-DP3IHZGG.js → chunk-2AUM35J5.js} +59 -7
  22. package/chunks/{chunk-T4FTABSW.js → chunk-2N6CV4PW.js} +1 -1
  23. package/chunks/{chunk-5PWLQ7SK.js → chunk-2RTRFLWH.js} +11 -4
  24. package/chunks/{chunk-TYGKUOEG.js → chunk-2U3UCXZ3.js} +2 -1
  25. package/chunks/{chunk-QZ5G26ZE.js → chunk-32SNBMNP.js} +12 -12
  26. package/chunks/{chunk-NPE3STIW.js → chunk-3JI5D6RU.js} +3 -3
  27. package/chunks/{chunk-E5BWLU5J.js → chunk-3MJ44LNC.js} +59 -23
  28. package/chunks/{chunk-QUESTNOP.js → chunk-4JS2QK7P.js} +1 -1
  29. package/chunks/{chunk-L7T742G2.js → chunk-4X5J3V2I.js} +47 -3
  30. package/chunks/{chunk-IQFYO5BF.js → chunk-5KZNWF2M.js} +1 -1
  31. package/chunks/{chunk-EXG2R5UR.js → chunk-62TIEFNN.js} +8 -8
  32. package/chunks/{chunk-T6W4KACQ.js → chunk-67F2BEYW.js} +1 -1
  33. package/chunks/{chunk-NELCY6JT.js → chunk-6LDLDK6E.js} +1 -1
  34. package/chunks/{chunk-5I5NMQCU.js → chunk-6NQWER7D.js} +3 -3
  35. package/chunks/{chunk-732MOPEM.js → chunk-6OJDN5ZT.js} +1 -1
  36. package/chunks/{chunk-GLWWPFTW.js → chunk-6SU6OW5Z.js} +1 -1
  37. package/chunks/{chunk-TEKFBSMY.js → chunk-6T5HCY34.js} +3 -3
  38. package/chunks/{chunk-AQHNAA7E.js → chunk-7JL5YBSA.js} +1 -1
  39. package/chunks/{chunk-NWPO6I7V.js → chunk-7WUMS2UA.js} +1 -1
  40. package/chunks/{chunk-O5G7IQGM.js → chunk-A2QIWDFO.js} +347 -85
  41. package/chunks/{chunk-KT4OWAAZ.js → chunk-A4BAHMJF.js} +3 -3
  42. package/chunks/{chunk-N7NBMAMW.js → chunk-A6GQUQ7I.js} +2 -2
  43. package/chunks/{chunk-XLQS3VI6.js → chunk-AAZWJAPQ.js} +2 -2
  44. package/chunks/{chunk-LT532KF4.js → chunk-ADJDLEVO.js} +1 -1
  45. package/chunks/{chunk-VWD7SNNN.js → chunk-APQTLUZ3.js} +2120 -2085
  46. package/chunks/{chunk-AJX4ITUG.js → chunk-ARL4UGRW.js} +3 -3
  47. package/chunks/{chunk-ZQSNP4TG.js → chunk-B2BKFWJK.js} +2 -2
  48. package/chunks/{chunk-SAQHDAUJ.js → chunk-B66LYK4B.js} +452 -57
  49. package/chunks/{chunk-6ZIIHBNV.js → chunk-B7IBCWDW.js} +3 -3
  50. package/chunks/{chunk-5UPJ774B.js → chunk-BGIKUE5J.js} +1 -1
  51. package/chunks/{chunk-2J53A6MV.js → chunk-BNRIQWXW.js} +3 -3
  52. package/chunks/{chunk-CZXQ4UZA.js → chunk-BXAGPCYH.js} +1 -1
  53. package/chunks/{chunk-IEP44U2R.js → chunk-C2DR57L6.js} +1 -1
  54. package/chunks/{chunk-TBVNYG5B.js → chunk-CDDLHCC2.js} +3 -3
  55. package/chunks/{chunk-CG3OQDNY.js → chunk-CJNKGZLC.js} +6 -6
  56. package/chunks/{chunk-UZPWH6SP.js → chunk-CTEGMF77.js} +285 -125
  57. package/chunks/{chunk-3TT6MZHJ.js → chunk-DUFZ3OW6.js} +35 -35
  58. package/chunks/{chunk-ZWPWQEF5.js → chunk-E74YSVIN.js} +1 -1
  59. package/chunks/{chunk-RQVVXDHS.js → chunk-ECDXUCEO.js} +4 -4
  60. package/chunks/{chunk-47FQVRCO.js → chunk-EGB2PIYM.js} +1 -1
  61. package/chunks/{chunk-JL3LC3CQ.js → chunk-FB5CQZMK.js} +1 -1
  62. package/chunks/{chunk-U6PTKAOW.js → chunk-FNVF5RR4.js} +1 -1
  63. package/chunks/{chunk-O4BBDP2G.js → chunk-FTGU6G45.js} +2 -2
  64. package/chunks/{chunk-ZGWY4YUB.js → chunk-FVHLDSQS.js} +2 -2
  65. package/chunks/{chunk-RRQJPCRQ.js → chunk-FXWGMPAP.js} +2 -2
  66. package/chunks/{chunk-P64FPV3G.js → chunk-GDNDZJSG.js} +2 -2
  67. package/chunks/{chunk-M6HXP2SG.js → chunk-GHOUZ5X4.js} +1892 -622
  68. package/chunks/{chunk-M6SXIXBV.js → chunk-H2U4FK62.js} +6 -6
  69. package/chunks/{chunk-EFIMD5VA.js → chunk-H6BFLALJ.js} +1 -1
  70. package/chunks/{chunk-TYCXSMZU.js → chunk-HOJZ2QQA.js} +3 -3
  71. package/chunks/{chunk-Y66OOMKS.js → chunk-HWCHDINS.js} +21 -21
  72. package/chunks/{chunk-4GLFFNP3.js → chunk-HY5OHJEC.js} +5 -5
  73. package/chunks/{chunk-P2UCMHDT.js → chunk-IJCZP2MA.js} +2 -2
  74. package/chunks/{chunk-I4XSOFH2.js → chunk-JBZYGFIB.js} +1 -1
  75. package/chunks/{chunk-HBZUU4AE.js → chunk-JGD35ZSJ.js} +4 -4
  76. package/chunks/{chunk-DAX3G67A.js → chunk-JOVJCXN4.js} +1 -1
  77. package/chunks/{chunk-YI6UGZF5.js → chunk-JRMUA53D.js} +12 -12
  78. package/chunks/{chunk-CTQE2NB2.js → chunk-JRTJEGSP.js} +1 -1
  79. package/chunks/{chunk-MZSJ43WV.js → chunk-JVY7FHUZ.js} +15 -2
  80. package/chunks/{chunk-K7JW6V5O.js → chunk-JW5UEE3V.js} +1 -1
  81. package/chunks/{chunk-GYBDYWMV.js → chunk-JXS2JNMZ.js} +2 -2
  82. package/chunks/{chunk-L2GTEEEU.js → chunk-K5IDV3PC.js} +44 -1
  83. package/chunks/{chunk-N3FJOQX7.js → chunk-KB4ISUT3.js} +4 -4
  84. package/chunks/{chunk-GJJQV4PY.js → chunk-KK3FEHPJ.js} +1 -1
  85. package/chunks/{chunk-2AZMF6G5.js → chunk-KTWUFHS4.js} +2 -2
  86. package/chunks/{chunk-7D4KEFOT.js → chunk-L3YACXS2.js} +3 -3
  87. package/chunks/{chunk-575MI5K3.js → chunk-LIBTBTHP.js} +4 -4
  88. package/chunks/{chunk-JS4Q5NG5.js → chunk-LSMCI42W.js} +3 -3
  89. package/chunks/{chunk-YZJVVQD3.js → chunk-MTV5W6WN.js} +7 -7
  90. package/chunks/{chunk-UOMZKPI5.js → chunk-MUN34TTF.js} +7 -7
  91. package/chunks/{chunk-LHY6HBRA.js → chunk-N3J3CO35.js} +4 -4
  92. package/chunks/{chunk-TRYJ3BVE.js → chunk-N56NYJWY.js} +7 -7
  93. package/chunks/{chunk-3ZYX7AUR.js → chunk-NAOHSM56.js} +1 -1
  94. package/chunks/{chunk-URK542T4.js → chunk-NF5J2WFA.js} +15 -2
  95. package/chunks/{chunk-OPBATTFQ.js → chunk-NHZF4VCD.js} +1 -1
  96. package/chunks/{chunk-QTI7SRXI.js → chunk-NM33GGOM.js} +3 -3
  97. package/chunks/{chunk-F6AOBFUN.js → chunk-NW7SPXVG.js} +1 -1
  98. package/chunks/{chunk-J7DNMZFO.js → chunk-NX5QZVRS.js} +1 -1
  99. package/chunks/{chunk-WFRHWDBT.js → chunk-O4MVJKSX.js} +5 -5
  100. package/chunks/{chunk-NC4O6UE6.js → chunk-O6SLWH4X.js} +2 -2
  101. package/chunks/{chunk-V4MJ56RS.js → chunk-OIZWCOYC.js} +5 -5
  102. package/chunks/{chunk-JXK3WAP7.js → chunk-ORR5EFCL.js} +4 -4
  103. package/chunks/{chunk-EYY4IBPV.js → chunk-OSA2TFDI.js} +2 -2
  104. package/chunks/{chunk-KPVVWKF3.js → chunk-PSTHNTHF.js} +1 -1
  105. package/chunks/{chunk-4M2F7OG7.js → chunk-PYLVQ6RT.js} +6 -6
  106. package/chunks/{chunk-6AECVSVX.js → chunk-Q7ALOKK7.js} +3 -3
  107. package/chunks/{chunk-EYW54TBD.js → chunk-QEWAHAW2.js} +3 -3
  108. package/chunks/{chunk-N5ULBHP3.js → chunk-QSDPJROT.js} +2 -2
  109. package/chunks/{chunk-DYVCDQW2.js → chunk-QSMZHJ62.js} +1 -1
  110. package/chunks/{chunk-MDFUBQAQ.js → chunk-QWAI7FNT.js} +17 -17
  111. package/chunks/{chunk-M4OYAR6J.js → chunk-QXFAQDBV.js} +2 -2
  112. package/chunks/{chunk-ILVATFYJ.js → chunk-SFBRH5RY.js} +19 -15
  113. package/chunks/{chunk-EYS3GGM3.js → chunk-SKRHR6N2.js} +1 -1
  114. package/chunks/{chunk-6LYDH7VT.js → chunk-SNHBRO4C.js} +2 -2
  115. package/chunks/{chunk-5TXOGH4I.js → chunk-T4G33L3W.js} +3 -3
  116. package/chunks/{chunk-32VOOMEF.js → chunk-TB6DPBE4.js} +4 -4
  117. package/chunks/{chunk-DEG7R6Z6.js → chunk-TN3REXN4.js} +8 -8
  118. package/chunks/{chunk-MWZYNOCG.js → chunk-TNETSI2A.js} +3 -3
  119. package/chunks/{chunk-ZV4XVYL3.js → chunk-TROB4PZY.js} +4 -4
  120. package/chunks/{chunk-O5AZPHYZ.js → chunk-U5C2GIN2.js} +24 -16
  121. package/chunks/{chunk-3GCU5O2E.js → chunk-U7ROFHSH.js} +1 -1
  122. package/chunks/{chunk-HB6QW4LM.js → chunk-UAAWNTOC.js} +15 -12
  123. package/chunks/{chunk-HHGQGTJQ.js → chunk-UFHPAMAV.js} +4 -0
  124. package/chunks/{chunk-V3LXMASR.js → chunk-UHF5VBKO.js} +1 -1
  125. package/chunks/{chunk-FRH4SSGX.js → chunk-UPUAGRKY.js} +2 -2
  126. package/chunks/{chunk-6S52N6PG.js → chunk-UQPLUR4A.js} +2 -2
  127. package/chunks/{chunk-KIFRFCCB.js → chunk-UWIJU22K.js} +66 -19
  128. package/chunks/{chunk-HGCQ5SE7.js → chunk-UXEO7E3V.js} +21 -0
  129. package/chunks/{chunk-M2PY7CNK.js → chunk-V2U6FOJB.js} +2 -2
  130. package/chunks/{chunk-7SUQZ7QH.js → chunk-V3NMFQD2.js} +2 -2
  131. package/chunks/{chunk-6XZERB6P.js → chunk-VPZMLGD3.js} +3 -3
  132. package/chunks/{chunk-UNCIELQJ.js → chunk-VRQD5D7R.js} +1 -1
  133. package/chunks/{chunk-YTYPRVIZ.js → chunk-VUTOV2HG.js} +2 -2
  134. package/chunks/{chunk-7LZ7DK4D.js → chunk-VYDQD5J4.js} +1 -1
  135. package/chunks/{chunk-XCGIMOLN.js → chunk-WCCLLK7X.js} +14 -1
  136. package/chunks/{chunk-JEMR2FTD.js → chunk-WIHSDI6U.js} +4 -4
  137. package/chunks/{chunk-VJNBRRZG.js → chunk-WZMH7II3.js} +1 -1
  138. package/chunks/{chunk-XWUQ4IH5.js → chunk-XJ6IMYUS.js} +7 -7
  139. package/chunks/{chunk-3XZYK76R.js → chunk-XL6GYJL2.js} +1 -1
  140. package/chunks/{chunk-KNXA5XXK.js → chunk-XUBM2A4F.js} +7 -7
  141. package/chunks/{chunk-ENEEQMGM.js → chunk-XY7DGTIC.js} +1 -1
  142. package/chunks/{chunk-SSAOTDK7.js → chunk-Y2EOB7WZ.js} +1 -1
  143. package/chunks/{chunk-VQZXRLEX.js → chunk-Y2HK3ELT.js} +3 -3
  144. package/chunks/{chunk-FDWH6CBK.js → chunk-Y5C24BUY.js} +5 -5
  145. package/chunks/{chunk-5HBFERG5.js → chunk-YI5G32RU.js} +3 -3
  146. package/chunks/{chunk-MPBRV3UU.js → chunk-YMB77M76.js} +15 -0
  147. package/chunks/{chunk-KNQZXSLW.js → chunk-YY23TR4M.js} +23 -9
  148. package/chunks/{chunk-4ETA3KRC.js → chunk-ZA2JN5IZ.js} +3 -3
  149. package/chunks/{chunk-IX7CFQGA.js → chunk-ZPZANKVP.js} +3 -3
  150. package/chunks/{chunk-XTH2OMDS.js → chunk-ZRT36RSF.js} +1 -1
  151. package/chunks/{chunk-M2NMFAFR.js → chunk-ZZ7RUTJ4.js} +1 -1
  152. package/chunks/{computer-use-S4JEU5P7.js → computer-use-J5VUY257.js} +38 -38
  153. package/chunks/{config-utils-TXVKR27S.js → config-utils-7JZQN6L2.js} +4 -4
  154. package/chunks/{contextCommand-2H5OH2HW.js → contextCommand-RCTGC36R.js} +40 -40
  155. package/chunks/{core-runtime-IAQ4DD4Y.js → core-runtime-REBZ5ZYE.js} +38 -38
  156. package/chunks/{create-sub-session-Y4WYDZGC.js → create-sub-session-23ULO5PO.js} +2 -2
  157. package/chunks/{create-sub-session-EKHKXJAA.js → create-sub-session-TEEUROAZ.js} +38 -38
  158. package/chunks/{cron-create-ZOVA3CC2.js → cron-create-5WUTNKNF.js} +4 -4
  159. package/chunks/{cron-delete-7Z3H4LJY.js → cron-delete-JEQ27YPS.js} +4 -4
  160. package/chunks/{cron-list-UHGX3IQG.js → cron-list-IXGCA7UR.js} +4 -4
  161. package/chunks/{daemon-PXIC4ZDK.js → daemon-UBVOQMWY.js} +2 -1
  162. package/chunks/{daemon-status-provider-LPYR2GXY.js → daemon-status-provider-SV7KRLJ4.js} +49 -49
  163. package/chunks/{daemon-trust-policy-7JOBVFH3.js → daemon-trust-policy-LFUJ4NGF.js} +44 -44
  164. package/chunks/{daemon-trust-policy-monitor-OU3NRHAR.js → daemon-trust-policy-monitor-BQZ77NDD.js} +44 -44
  165. package/chunks/{deferred-core-runtime-SFT3KI2C.js → deferred-core-runtime-F4XOQJQL.js} +38 -38
  166. package/chunks/{dispatch-B53LNEO4.js → dispatch-FW7DX2CR.js} +7 -1
  167. package/chunks/{display-image-ZE3GZNIK.js → display-image-CAD7RAUM.js} +4 -4
  168. package/chunks/{dist-BNWP6IZL.js → dist-362MN6CP.js} +2 -2
  169. package/chunks/{dist-EFJILGIS.js → dist-5VDE7U3A.js} +1 -1
  170. package/chunks/{dist-AVUYBK7L.js → dist-6RK4U6VU.js} +1 -1
  171. package/chunks/{dist-KTYDJNYM.js → dist-B3ODKYEB.js} +1 -1
  172. package/chunks/{dist-NPS52B2V.js → dist-CCUH2Z4C.js} +1 -1
  173. package/chunks/{dist-BW2LDPV3.js → dist-DANKRAB3.js} +1 -1
  174. package/chunks/{dist-PKSRQAR2.js → dist-EZHCZSW6.js} +1 -1
  175. package/chunks/{dist-ZWDH5HLS.js → dist-M3XMEIP2.js} +1 -1
  176. package/chunks/{earlyInputCapture-27RPWE2D.js → earlyInputCapture-JAJXDT2N.js} +39 -39
  177. package/chunks/{edit-WXVZ7FHS.js → edit-OXBMFY5B.js} +38 -38
  178. package/chunks/{enter-worktree-TYMVXFLA.js → enter-worktree-XS4JX4PO.js} +38 -38
  179. package/chunks/{enterPlanMode-FT4MRU5N.js → enterPlanMode-J6PDPFFT.js} +38 -38
  180. package/chunks/{environment-Z6OMA34I.js → environment-BQW6FAZL.js} +40 -40
  181. package/chunks/{errors-YMXK2GG3.js → errors-TMSN7AZN.js} +40 -40
  182. package/chunks/{exit-worktree-ODZUQLGJ.js → exit-worktree-2RIE6DAO.js} +38 -38
  183. package/chunks/{exitPlanMode-MBPAPBBV.js → exitPlanMode-QQL27HU4.js} +38 -38
  184. package/chunks/{fast-path-ZU5T6XSN.js → fast-path-TSGUVE5K.js} +4 -4
  185. package/chunks/{gemini-OZK6AIMC.js → gemini-RLTFENFV.js} +86 -86
  186. package/chunks/{geminiContentGenerator-MC6ZKWZG.js → geminiContentGenerator-B6W6PSO7.js} +6 -6
  187. package/chunks/{glob-KJ4A4ZOM.js → glob-JKVAHWL5.js} +38 -38
  188. package/chunks/{goal-tools-JDK2SNMV.js → goal-tools-LQFO4BRY.js} +4 -4
  189. package/chunks/{grep-QWBLG564.js → grep-6CN23ZPS.js} +38 -38
  190. package/chunks/{handleAutoUpdate-M3ACKDKF.js → handleAutoUpdate-Y6BUNMBG.js} +42 -42
  191. package/chunks/{i18n-FPW7XZL5.js → i18n-Y5PM6L5V.js} +39 -39
  192. package/chunks/{image-gen-OTFC2S7L.js → image-gen-DC2IQZ73.js} +10 -10
  193. package/chunks/{initializer-5HKUXXBT.js → initializer-OYKKBNHO.js} +45 -45
  194. package/chunks/{installationInfo-4OA6UW7V.js → installationInfo-63AFHLWA.js} +39 -39
  195. package/chunks/{keychain-token-storage-JTWUYFU7.js → keychain-token-storage-GU75J2T2.js} +2 -2
  196. package/chunks/{list-3TKZ264A.js → list-KA63R3R6.js} +47 -47
  197. package/chunks/{list-agents-4GQ2XNEU.js → list-agents-5PNMK2AM.js} +2 -2
  198. package/chunks/{loadedSettingsAdapter-IRUANLS2.js → loadedSettingsAdapter-IGBJN7C5.js} +44 -44
  199. package/chunks/{loggingContentGenerator-D4URLH2A.js → loggingContentGenerator-Z3NADCTQ.js} +115 -93
  200. package/chunks/{loop-wakeup-HOQI3K5D.js → loop-wakeup-OV65FEGR.js} +5 -5
  201. package/chunks/{ls-FSHISLLA.js → ls-RPRSX26R.js} +4 -4
  202. package/chunks/{lsp-APQJ5ZEZ.js → lsp-IWTJWFLT.js} +2 -2
  203. package/chunks/{managed-npm-update-2O7XSAWJ.js → managed-npm-update-HA262PFM.js} +41 -41
  204. package/chunks/{mcp-AFVHCHKT.js → mcp-T5ZUOKT3.js} +44 -44
  205. package/chunks/{monitor-PY4WDSX3.js → monitor-SLGY7CYB.js} +38 -38
  206. package/chunks/nonInteractiveCli-R5PK5B5G.js +166 -0
  207. package/chunks/{notebook-edit-GEPL33NO.js → notebook-edit-STSSB5KQ.js} +38 -38
  208. package/chunks/{openaiContentGenerator-ACYSXQ6R.js → openaiContentGenerator-OQED57JE.js} +24 -24
  209. package/chunks/{opentui-entry-SBAOWW7M.js → opentui-entry-UTJ6MHDI.js} +116 -97
  210. package/chunks/{pidfile-SUNYCAA4.js → pidfile-GES3MIHH.js} +39 -39
  211. package/chunks/{processUtils-F7LP7YUV.js → processUtils-FU6VMUOL.js} +2 -2
  212. package/chunks/{qwenContentGenerator-BB6IPELF.js → qwenContentGenerator-HWJSEGUL.js} +43 -43
  213. package/chunks/{qwenOAuth2-OU3WGDOI.js → qwenOAuth2-PAIR7XEW.js} +9 -9
  214. package/chunks/{read-file-GORBXJTS.js → read-file-IYEBTQT5.js} +12 -12
  215. package/chunks/{read-mcp-resource-TJSJRH4F.js → read-mcp-resource-THCSZHXO.js} +2 -2
  216. package/chunks/{read-package-up-TCM6I7S2.js → read-package-up-K6RKTL5D.js} +1 -1
  217. package/chunks/{record-artifact-FXF5LHPE.js → record-artifact-76YYQA5F.js} +3 -3
  218. package/chunks/{resumeHistoryUtils-FOAJJJWK.js → resumeHistoryUtils-WP446RP5.js} +44 -44
  219. package/chunks/{ripGrep-RNLIZGCY.js → ripGrep-VV2CRCL2.js} +38 -38
  220. package/chunks/{run-qwen-serve-GVMMX3IU.js → run-qwen-serve-AHQCTALV.js} +160 -71
  221. package/chunks/{runtime-RNBZ5FDD.js → runtime-AUUZGDK6.js} +49 -49
  222. package/chunks/{scheduler-NTRFSPIP.js → scheduler-Y4UPEURR.js} +40 -40
  223. package/chunks/{sdk-exporters-http-2VPMAPFI.js → sdk-exporters-http-A7XLKZO7.js} +11 -7
  224. package/chunks/{sdk-impl-5W3JUCWF.js → sdk-impl-XO4UF6PR.js} +11 -8
  225. package/chunks/{send-message-RBYLV5NY.js → send-message-P5SLP57G.js} +6 -6
  226. package/chunks/{serve-H3PGA26U.js → serve-WI3SE4MY.js} +47 -47
  227. package/chunks/{server-SUXD2F3C.js → server-G6JU6UWL.js} +264 -159
  228. package/chunks/{session-MTFVUWWM.js → session-2AO2UACB.js} +85 -85
  229. package/chunks/{settings-GUJ3TN2J.js → settings-3HRWSH66.js} +43 -43
  230. package/chunks/{shell-C2UP5FF2.js → shell-AR7XFLHA.js} +38 -38
  231. package/chunks/{skill-4XCNK55E.js → skill-K6NOUUYM.js} +16 -16
  232. package/chunks/{skill-settings-Y2BU27XM.js → skill-settings-IOXQYS6X.js} +43 -43
  233. package/chunks/{spawnChannel-UUUUK734.js → spawnChannel-V6P6HF4V.js} +40 -40
  234. package/chunks/{standalone-update-MJ722XZ4.js → standalone-update-K5G3L2OJ.js} +40 -40
  235. package/chunks/{startInteractiveUI-TCPIPNGN.js → startInteractiveUI-TRRP52QX.js} +125 -115
  236. package/chunks/{syntheticOutput-D3Z64LJC.js → syntheticOutput-SEW4NA47.js} +3 -3
  237. package/chunks/{task-create-URFZ5EUX.js → task-create-247EAVF7.js} +10 -10
  238. package/chunks/{task-list-6JDFMPUW.js → task-list-ZJN4QHLK.js} +5 -5
  239. package/chunks/{task-stop-HHUGCD25.js → task-stop-MAYQJ42I.js} +2 -2
  240. package/chunks/{task-update-DVV6CUGI.js → task-update-SU5TMZGG.js} +10 -10
  241. package/chunks/{team-create-WZWH2NJI.js → team-create-IEEEBLE2.js} +38 -38
  242. package/chunks/{team-delete-PZGGBQLM.js → team-delete-3XVRPQBP.js} +5 -5
  243. package/chunks/{team-plan-approval-SUZQJCWJ.js → team-plan-approval-SJGNS5JL.js} +38 -38
  244. package/chunks/{terminal-image-renderer-BCUN3Z3W.js → terminal-image-renderer-C4RQMC67.js} +40 -40
  245. package/chunks/{theme-manager-UGMFDREN.js → theme-manager-IKZQJQ6C.js} +39 -39
  246. package/chunks/{todoWrite-WINAZSZI.js → todoWrite-IE2YTCK7.js} +4 -4
  247. package/chunks/{tool-search-B6F3MPUZ.js → tool-search-4UVNFYWU.js} +16 -16
  248. package/chunks/{total-session-admission-MQLBJ5WL.js → total-session-admission-DIN6FTZP.js} +44 -44
  249. package/chunks/{trustedFolders-2XST7U5C.js → trustedFolders-IAHOLV6A.js} +39 -39
  250. package/chunks/{update-relaunch-OVC7YNGD.js → update-relaunch-5QSJ5CWP.js} +5 -5
  251. package/chunks/{updateCheck-YAKM36WQ.js → updateCheck-N4RT7HOZ.js} +44 -44
  252. package/chunks/{useAutoAcceptIndicator-RF6FVX3S.js → useAutoAcceptIndicator-25T26VZS.js} +46 -46
  253. package/chunks/{validateNonInterActiveAuth-IPPXFNQH.js → validateNonInterActiveAuth-MCTVPLFE.js} +81 -81
  254. package/chunks/{version-4IDFEXOU.js → version-6PLZ7PCV.js} +2 -2
  255. package/chunks/{web-fetch-NUOLHXPN.js → web-fetch-5ANX6FSM.js} +16 -16
  256. package/chunks/{web-search-LVOOV4XZ.js → web-search-KQJWWRHW.js} +9 -9
  257. package/chunks/{workflow-JSTYTG3K.js → workflow-C57ZKFUF.js} +111 -46
  258. package/chunks/{workspace-providers-status-U4EYXA4K.js → workspace-providers-status-3QAE4G4Y.js} +47 -47
  259. package/chunks/{workspace-registration-store-OG66U3CB.js → workspace-registration-store-Q3J5LV6T.js} +1 -1
  260. package/chunks/{workspace-registry-WSHWQRQQ.js → workspace-registry-DSJ5NAII.js} +44 -44
  261. package/chunks/{workspace-service-QZXQHX2F.js → workspace-service-QW5LH7FA.js} +49 -49
  262. package/chunks/{workspace-skills-status-VRBHEX5O.js → workspace-skills-status-N34ALJPZ.js} +45 -45
  263. package/chunks/{workspace-trust-reconciler-FCRIUIOF.js → workspace-trust-reconciler-YTOL7QEV.js} +50 -50
  264. package/chunks/{write-file-PYL3JCCD.js → write-file-MSFRVUZB.js} +38 -38
  265. package/chunks/{zoom-image-RS6MU26F.js → zoom-image-4TQA5GHG.js} +12 -12
  266. package/cli.js +13 -13
  267. package/package.json +4 -4
  268. package/web-shell/assets/{arc-CgGUyHWd.js → arc-lZ04kynw.js} +1 -1
  269. package/web-shell/assets/{architectureDiagram-3BPJPVTR-BR0Qv-1Y.js → architectureDiagram-3BPJPVTR-B1wZVhzD.js} +1 -1
  270. package/web-shell/assets/{blockDiagram-GPEHLZMM-DIoaceaI.js → blockDiagram-GPEHLZMM-CO0e0yJt.js} +1 -1
  271. package/web-shell/assets/{c4Diagram-AAUBKEIU-Bc5k6BbI.js → c4Diagram-AAUBKEIU-Dfpo6Qie.js} +1 -1
  272. package/web-shell/assets/channel-BxvRq3pV.js +1 -0
  273. package/web-shell/assets/{chunk-2J33WTMH-DtPEz2WX.js → chunk-2J33WTMH-BvxArftT.js} +1 -1
  274. package/web-shell/assets/{chunk-4BX2VUAB-Dydo6ydE.js → chunk-4BX2VUAB-BS2XXjGY.js} +1 -1
  275. package/web-shell/assets/{chunk-55IACEB6-DD9_VWXm.js → chunk-55IACEB6-CYL6h3Ph.js} +1 -1
  276. package/web-shell/assets/{chunk-727SXJPM-DVI2m59k.js → chunk-727SXJPM-C-cWPX30.js} +1 -1
  277. package/web-shell/assets/{chunk-AQP2D5EJ-luatmaTN.js → chunk-AQP2D5EJ-CJLxNbVV.js} +1 -1
  278. package/web-shell/assets/{chunk-FMBD7UC4-Duy8NTIi.js → chunk-FMBD7UC4-DwfzKywA.js} +1 -1
  279. package/web-shell/assets/{chunk-ND2GUHAM-CrL1yhms.js → chunk-ND2GUHAM-BI5raYHQ.js} +1 -1
  280. package/web-shell/assets/{chunk-QZHKN3VN-C7BX6bu1.js → chunk-QZHKN3VN-_GkNI90J.js} +1 -1
  281. package/web-shell/assets/classDiagram-4FO5ZUOK-tL8nAxYf.js +1 -0
  282. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-tL8nAxYf.js +1 -0
  283. package/web-shell/assets/{cose-bilkent-S5V4N54A-BTzs7mIi.js → cose-bilkent-S5V4N54A-BAVLNxh9.js} +1 -1
  284. package/web-shell/assets/{dagre-BM42HDAG-3VTUmWts.js → dagre-BM42HDAG-BD4XNLqp.js} +1 -1
  285. package/web-shell/assets/{diagram-2AECGRRQ-Ehdp75GN.js → diagram-2AECGRRQ-WO567p8w.js} +1 -1
  286. package/web-shell/assets/{diagram-5GNKFQAL-B3wu3teE.js → diagram-5GNKFQAL-mAk23VWO.js} +1 -1
  287. package/web-shell/assets/{diagram-KO2AKTUF-DjgTSf2S.js → diagram-KO2AKTUF-YQEeHKze.js} +1 -1
  288. package/web-shell/assets/{diagram-LMA3HP47-Br9mwjY3.js → diagram-LMA3HP47-CMVjxAjv.js} +1 -1
  289. package/web-shell/assets/{diagram-OG6HWLK6-D4xz5M-z.js → diagram-OG6HWLK6-42hPvbM-.js} +1 -1
  290. package/web-shell/assets/{erDiagram-TEJ5UH35-CXayWlG_.js → erDiagram-TEJ5UH35-CXU_cPfu.js} +1 -1
  291. package/web-shell/assets/{flowDiagram-I6XJVG4X-CLonjQTi.js → flowDiagram-I6XJVG4X-D-3TdhMT.js} +1 -1
  292. package/web-shell/assets/{ganttDiagram-6RSMTGT7-BTySFT-1.js → ganttDiagram-6RSMTGT7-CsgkXolz.js} +1 -1
  293. package/web-shell/assets/{gitGraphDiagram-PVQCEYII--2WcUjOe.js → gitGraphDiagram-PVQCEYII-B6Q3PBLD.js} +1 -1
  294. package/web-shell/assets/{index-DPJHkFOG.js → index-BFrkGj2B.js} +1 -1
  295. package/web-shell/assets/index-BgjULKyF.css +5 -0
  296. package/web-shell/assets/index-CxXlPYfl.js +1789 -0
  297. package/web-shell/assets/{infoDiagram-5YYISTIA-9vpgAf1m.js → infoDiagram-5YYISTIA-jiAfSXp8.js} +1 -1
  298. package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-DcRpHnAW.js → ishikawaDiagram-YF4QCWOH-BWif5KeJ.js} +1 -1
  299. package/web-shell/assets/{journeyDiagram-JHISSGLW-C2TKorRm.js → journeyDiagram-JHISSGLW-B-GAZthS.js} +1 -1
  300. package/web-shell/assets/{kanban-definition-UN3LZRKU-DdsFwB8b.js → kanban-definition-UN3LZRKU-9TEuATdL.js} +1 -1
  301. package/web-shell/assets/{linear-7PjRvJrf.js → linear-dy_QPfyE.js} +1 -1
  302. package/web-shell/assets/{mermaid.core-raDXa11C.js → mermaid.core-DB2uLAnq.js} +5 -5
  303. package/web-shell/assets/{mindmap-definition-RKZ34NQL-DLHc-PRN.js → mindmap-definition-RKZ34NQL-ey_dyxi-.js} +1 -1
  304. package/web-shell/assets/{pieDiagram-4H26LBE5-BftYpeTW.js → pieDiagram-4H26LBE5-_6BuMdDj.js} +1 -1
  305. package/web-shell/assets/{quadrantDiagram-W4KKPZXB-O-6ygOYn.js → quadrantDiagram-W4KKPZXB-B2rM19W2.js} +1 -1
  306. package/web-shell/assets/{requirementDiagram-4Y6WPE33-BmZWVufJ.js → requirementDiagram-4Y6WPE33-DWj8b7vW.js} +1 -1
  307. package/web-shell/assets/{sankeyDiagram-5OEKKPKP-2x5beiWt.js → sankeyDiagram-5OEKKPKP-D5dtYh0N.js} +1 -1
  308. package/web-shell/assets/{sequenceDiagram-3UESZ5HK-BH8uKokQ.js → sequenceDiagram-3UESZ5HK-DVkdn_qW.js} +1 -1
  309. package/web-shell/assets/{stateDiagram-AJRCARHV-Dq1MFgX_.js → stateDiagram-AJRCARHV-DgwD_fi6.js} +1 -1
  310. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-BWGkVGVB.js +1 -0
  311. package/web-shell/assets/{timeline-definition-PNZ67QCA-Cl2WKbv9.js → timeline-definition-PNZ67QCA-vNr_1UNX.js} +1 -1
  312. package/web-shell/assets/{vennDiagram-CIIHVFJN-BqoRo_Q-.js → vennDiagram-CIIHVFJN-ChFcGAcu.js} +1 -1
  313. package/web-shell/assets/{wardley-L42UT6IY-BTxp-Yot.js → wardley-L42UT6IY-C8PXoSWk.js} +1 -1
  314. package/web-shell/assets/{wardleyDiagram-YWT4CUSO-DFXVCSH2.js → wardleyDiagram-YWT4CUSO-C2nqOV6i.js} +1 -1
  315. package/web-shell/assets/{xychartDiagram-2RQKCTM6-qQhWx0aE.js → xychartDiagram-2RQKCTM6-BntaqhSB.js} +1 -1
  316. package/web-shell/index.html +2 -2
  317. package/chunks/nonInteractiveCli-ZHW6F76F.js +0 -166
  318. package/web-shell/assets/channel-D2b9IYpS.js +0 -1
  319. package/web-shell/assets/classDiagram-4FO5ZUOK-DHatTCmD.js +0 -1
  320. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-DHatTCmD.js +0 -1
  321. package/web-shell/assets/index-CIFO52Wx.css +0 -5
  322. package/web-shell/assets/index-bhq3CUUF.js +0 -1789
  323. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-spuAYji6.js +0 -1
@@ -2,17 +2,17 @@
2
2
  "use strict";
3
3
  import {
4
4
  listCommand
5
- } from "./chunk-575MI5K3.js";
5
+ } from "./chunk-LIBTBTHP.js";
6
6
  import {
7
7
  getErrorMessage as getErrorMessage2
8
- } from "./chunk-TEKFBSMY.js";
8
+ } from "./chunk-6T5HCY34.js";
9
9
  import {
10
10
  serveCommand
11
- } from "./chunk-ILVATFYJ.js";
11
+ } from "./chunk-SFBRH5RY.js";
12
12
  import {
13
13
  OBSERVED_CONTACT_MAX_FRESH_WITHIN_SECONDS,
14
14
  ObservedChannelContactStore
15
- } from "./chunk-47FQVRCO.js";
15
+ } from "./chunk-EGB2PIYM.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-5KZNWF2M.js";
32
32
  import {
33
33
  collectProviderModelsForProtocol,
34
34
  getAuthTypeFromEnv,
35
35
  resolveCliGenerationConfig
36
- } from "./chunk-NPE3STIW.js";
36
+ } from "./chunk-3JI5D6RU.js";
37
37
  import {
38
38
  resolveSkillSettings
39
39
  } from "./chunk-Z4X5MTRT.js";
@@ -53,17 +53,17 @@ import {
53
53
  registerToolCallDispatch,
54
54
  selectFirstModel,
55
55
  sessionsPath
56
- } from "./chunk-TRYJ3BVE.js";
56
+ } from "./chunk-N56NYJWY.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-N3J3CO35.js";
64
64
  import {
65
65
  parseChannelConfig
66
- } from "./chunk-YTYPRVIZ.js";
66
+ } from "./chunk-VUTOV2HG.js";
67
67
  import {
68
68
  findCliEntryPath
69
69
  } from "./chunk-V6WHFGST.js";
@@ -73,7 +73,7 @@ import {
73
73
  clearAccount,
74
74
  loadAccount,
75
75
  saveAccount
76
- } from "./chunk-3GCU5O2E.js";
76
+ } from "./chunk-U7ROFHSH.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-JW5UEE3V.js";
105
105
  import {
106
106
  normalizeServeChannelSelection
107
107
  } from "./chunk-ALMR3E6Q.js";
@@ -121,45 +121,45 @@ import {
121
121
  isChannelProactiveDeliveryError,
122
122
  sanitizeLogText,
123
123
  sanitizePromptText
124
- } from "./chunk-LT532KF4.js";
124
+ } from "./chunk-ADJDLEVO.js";
125
125
  import {
126
126
  readServiceInfo,
127
127
  removeServiceInfo,
128
128
  signalService,
129
129
  waitForExit,
130
130
  writeServiceInfo
131
- } from "./chunk-AQHNAA7E.js";
131
+ } from "./chunk-7JL5YBSA.js";
132
132
  import {
133
133
  assembleMcpServers,
134
134
  getPendingGatedMcpServers,
135
135
  mcpCommand
136
- } from "./chunk-4M2F7OG7.js";
136
+ } from "./chunk-PYLVQ6RT.js";
137
137
  import {
138
138
  loadSettings
139
- } from "./chunk-M6SXIXBV.js";
139
+ } from "./chunk-H2U4FK62.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-JXS2JNMZ.js";
147
147
  import {
148
148
  loadEnvironment
149
- } from "./chunk-RRQJPCRQ.js";
149
+ } from "./chunk-FXWGMPAP.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-V2U6FOJB.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-ZA2JN5IZ.js";
163
163
  import {
164
164
  require_strip_json_comments
165
165
  } from "./chunk-NPQ5ZKRP.js";
@@ -196,12 +196,11 @@ import {
196
196
  redactUrlCredentials,
197
197
  removeChannelMemoryEntries,
198
198
  resolveBundleDir,
199
- sessionIdContext,
200
199
  stripAnsiAndControl,
201
200
  unquoteCStylePath,
202
201
  updateChannelMemoryEntry,
203
202
  updateSetting
204
- } from "./chunk-M6HXP2SG.js";
203
+ } from "./chunk-GHOUZ5X4.js";
205
204
  import {
206
205
  parsePositiveIntegerEnv
207
206
  } from "./chunk-6PVPNMXU.js";
@@ -211,32 +210,36 @@ import {
211
210
  } from "./chunk-IRH27ZC2.js";
212
211
  import {
213
212
  require_dist
214
- } from "./chunk-2AZMF6G5.js";
213
+ } from "./chunk-KTWUFHS4.js";
215
214
  import {
215
+ addDaemonRequestAttribute,
216
216
  parseBooleanEnvFlag,
217
217
  resolveTelemetrySettings
218
- } from "./chunk-O5AZPHYZ.js";
218
+ } from "./chunk-U5C2GIN2.js";
219
219
  import {
220
220
  getAllGeminiMdFilenames,
221
221
  parseLineTolerant,
222
222
  setGeminiMdFilename
223
- } from "./chunk-HB6QW4LM.js";
223
+ } from "./chunk-UAAWNTOC.js";
224
224
  import {
225
225
  SchemaValidator,
226
226
  ToolNames
227
- } from "./chunk-XTH2OMDS.js";
227
+ } from "./chunk-ZRT36RSF.js";
228
228
  import {
229
229
  DEFAULT_QWEN_EMBEDDING_MODEL
230
230
  } from "./chunk-F6WFNA7U.js";
231
231
  import {
232
232
  atomicWriteFileSync
233
- } from "./chunk-F6AOBFUN.js";
233
+ } from "./chunk-NW7SPXVG.js";
234
234
  import {
235
235
  isTlsVerificationDisabled
236
- } from "./chunk-EFIMD5VA.js";
236
+ } from "./chunk-H6BFLALJ.js";
237
237
  import {
238
238
  recordChannelMemoryRecallMetrics
239
- } from "./chunk-E5BWLU5J.js";
239
+ } from "./chunk-3MJ44LNC.js";
240
+ import {
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-YMB77M76.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-UBVOQMWY.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-UBVOQMWY.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-UBVOQMWY.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-UBVOQMWY.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-UBVOQMWY.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;
@@ -14246,6 +14309,7 @@ function validateFindings(raw) {
14246
14309
  const heldRaw = o.heldByMeasurement;
14247
14310
  const heldFile = heldRaw && typeof heldRaw === "object" ? asString(heldRaw, "file") : void 0;
14248
14311
  const shortSummary = asString(o, "shortSummary") ?? asString(o, "short_summary");
14312
+ const witness = asString(o, "witness");
14249
14313
  return {
14250
14314
  id,
14251
14315
  severity,
@@ -14254,6 +14318,7 @@ function validateFindings(raw) {
14254
14318
  summary,
14255
14319
  shortSummary: shortSummary ? compressSummary(shortSummary) : compressSummary(summary),
14256
14320
  failureScenario,
14321
+ ...witness ? { witness } : {},
14257
14322
  ...asString(o, "suggestedFix") || asString(o, "suggested_fix") ? {
14258
14323
  suggestedFix: asString(o, "suggestedFix") ?? asString(o, "suggested_fix")
14259
14324
  } : {},
@@ -14319,6 +14384,24 @@ Held back from Critical by measurement: \`test-delta\` reran the failing test co
14319
14384
  return { findings: out, held, readjudicated };
14320
14385
  }
14321
14386
  __name(holdCriticalsFailingOnBase, "holdCriticalsFailingOnBase");
14387
+ function holdUnwitnessedCriticals(findings) {
14388
+ const unwitnessed = [];
14389
+ const out = findings.map((f) => {
14390
+ if (f.severity !== "Critical" || f.confidence !== "high" || f.source !== "review" || f.witness !== void 0) {
14391
+ return f;
14392
+ }
14393
+ unwitnessed.push(f.id);
14394
+ return {
14395
+ ...f,
14396
+ confidence: "low",
14397
+ failureScenario: `${f.failureScenario}
14398
+
14399
+ 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.`
14400
+ };
14401
+ });
14402
+ return { findings: out, unwitnessed };
14403
+ }
14404
+ __name(holdUnwitnessedCriticals, "holdUnwitnessedCriticals");
14322
14405
  var WORKSPACE_IN_COMMAND_RE = /--workspace="([^"]+)"/;
14323
14406
  function repoRelative(path3, workspace) {
14324
14407
  const at = path3.indexOf("::");
@@ -14553,6 +14636,8 @@ var findingsCommand = {
14553
14636
  shared
14554
14637
  ));
14555
14638
  }
14639
+ const witnessHold = holdUnwitnessedCriticals(findings);
14640
+ findings = witnessHold.findings;
14556
14641
  const report = buildReport(findings);
14557
14642
  const target = resolve6(out);
14558
14643
  mkdirSync6(dirname5(target), { recursive: true });
@@ -14567,6 +14652,11 @@ var findingsCommand = {
14567
14652
  `findings: ${h.id} held back from Critical \u2014 test-delta measured ${h.file} as failing on the merge base too`
14568
14653
  );
14569
14654
  }
14655
+ for (const id of witnessHold.unwitnessed) {
14656
+ writeStderrLine(
14657
+ `findings: ${id} filed at low confidence \u2014 a confirmed Critical carried neither a witness nor a 'not run' reason (Step 4's witness rule)`
14658
+ );
14659
+ }
14570
14660
  for (const r of readjudicated) {
14571
14661
  writeStderrLine(
14572
14662
  `findings: ${r.id} left at Critical \u2014 it already carries the ${r.file} measurement and was raised again anyway`
@@ -14833,6 +14923,7 @@ __name(layerAuditGate, "layerAuditGate");
14833
14923
 
14834
14924
  // packages/cli/src/commands/review/lib/ledger.ts
14835
14925
  init_esbuild_shims();
14926
+ var SHA_RE = /^[0-9a-f]{7,64}$/;
14836
14927
  var LEDGER_MAX_FINDINGS = 50;
14837
14928
  var LEDGER_MAX_TITLE = 80;
14838
14929
  var LEDGER_MAX_FILE = 200;
@@ -14848,6 +14939,7 @@ function serializeLedger(ledger) {
14848
14939
  const render = /* @__PURE__ */ __name((findings, dropped) => {
14849
14940
  const payload = { v: 1, round: ledger.round, findings };
14850
14941
  if (dropped > 0) payload.dropped = dropped;
14942
+ else if (ledger.sha && SHA_RE.test(ledger.sha)) payload.sha = ledger.sha;
14851
14943
  return `${OPEN}${JSON.stringify(payload).replace(/--/g, "-\\u002d")}${CLOSE}`;
14852
14944
  }, "render");
14853
14945
  const total = ledger.findings.length;
@@ -14872,19 +14964,28 @@ function parseLedger(body) {
14872
14964
  return null;
14873
14965
  }
14874
14966
  if (!Array.isArray(raw.findings)) return null;
14875
- const findings = raw.findings.filter(
14967
+ const valid = raw.findings.filter(
14876
14968
  (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) => ({
14969
+ );
14970
+ const findings = valid.slice(0, LEDGER_MAX_FINDINGS).map((f) => ({
14878
14971
  ...f,
14879
14972
  title: f.title.slice(0, LEDGER_MAX_TITLE),
14880
14973
  file: f.file.slice(0, LEDGER_MAX_FILE)
14881
14974
  }));
14882
- const dropped = Number.isInteger(raw.dropped) && raw.dropped > 0 ? raw.dropped : void 0;
14975
+ const declared = Number.isInteger(raw.dropped) && raw.dropped > 0 ? raw.dropped : 0;
14976
+ const dropped = declared + (valid.length - findings.length) || void 0;
14977
+ const sha = (
14978
+ // Normalised on READ as the serializer holds on WRITE: a hand-edited
14979
+ // marker carrying both `dropped` and `sha` would certify a range its
14980
+ // own work list admits is partial.
14981
+ typeof raw.sha === "string" && SHA_RE.test(raw.sha) && !dropped ? raw.sha : void 0
14982
+ );
14883
14983
  return {
14884
14984
  v: 1,
14885
14985
  round: raw.round,
14886
14986
  findings,
14887
- ...dropped ? { dropped } : {}
14987
+ ...dropped ? { dropped } : {},
14988
+ ...sha ? { sha } : {}
14888
14989
  };
14889
14990
  } catch {
14890
14991
  return null;
@@ -14943,6 +15044,14 @@ function reviewFooter(modelId, cliVersion) {
14943
15044
  }
14944
15045
  __name(reviewFooter, "reviewFooter");
14945
15046
  var REVIEW_FOOTER_RE = /\s*(?:_— (?:(?! via Qwen Code \/review)[^\n])* via Qwen Code \/review(?: \(v[^\n)]*\))?_?\s*)+$/;
15047
+ var STRIP_TAIL_LIMIT = 8192;
15048
+ function stripReviewFooter(body) {
15049
+ if (!body.includes(FOOTER_MARKER)) return body;
15050
+ const tail2 = body.slice(-STRIP_TAIL_LIMIT);
15051
+ const stripped = tail2.replace(REVIEW_FOOTER_RE, "");
15052
+ return stripped === tail2 ? body : body.slice(0, body.length - tail2.length) + stripped;
15053
+ }
15054
+ __name(stripReviewFooter, "stripReviewFooter");
14946
15055
  function isFooterSafeModelId(modelId) {
14947
15056
  return !/[\n\r]/.test(modelId) && !modelId.includes(FOOTER_MARKER);
14948
15057
  }
@@ -15056,10 +15165,6 @@ function toStringList(value, field) {
15056
15165
  return [...value];
15057
15166
  }
15058
15167
  __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
15168
  function toBool(value, field) {
15064
15169
  if (value === void 0 || value === null) return false;
15065
15170
  if (typeof value !== "boolean") {
@@ -15070,15 +15175,15 @@ function toBool(value, field) {
15070
15175
  return value;
15071
15176
  }
15072
15177
  __name(toBool, "toBool");
15073
- function composeReview(input, cliVersion = "unknown") {
15074
- const result = composeReviewBody(input, cliVersion);
15075
- const marker = ledgerMarkerFor(input);
15178
+ function composeReview(input, cliVersion = "unknown", attribution = true) {
15179
+ const result = composeReviewBody(input, cliVersion, attribution);
15180
+ const marker = ledgerMarkerFor(input, result.cappedBy);
15076
15181
  return marker ? { ...result, body: `${result.body}
15077
15182
 
15078
15183
  ${marker}` } : result;
15079
15184
  }
15080
15185
  __name(composeReview, "composeReview");
15081
- function ledgerMarkerFor(input) {
15186
+ function ledgerMarkerFor(input, cappedBy) {
15082
15187
  try {
15083
15188
  if (!input.planPath) return null;
15084
15189
  const plan = JSON.parse(readFileSync13(input.planPath, "utf8"));
@@ -15100,19 +15205,22 @@ function ledgerMarkerFor(input) {
15100
15205
  prevRound = prev.round;
15101
15206
  } catch {
15102
15207
  }
15103
- return serializeLedger(
15104
- buildLedger(
15208
+ const failClosed = (input.cannotTellCriticals?.length ?? 0) > 0 || cappedBy.length > 0;
15209
+ const sha = !failClosed && typeof plan.fetchedSha === "string" ? plan.fetchedSha : void 0;
15210
+ return serializeLedger({
15211
+ ...buildLedger(
15105
15212
  prevRound + 1,
15106
15213
  input.draftedComments ?? [],
15107
15214
  toStringList(input.bodyCriticals, "bodyCriticals").map(stripReviewFooter).filter((entry) => entry.trim() !== "")
15108
- )
15109
- );
15215
+ ),
15216
+ ...sha ? { sha } : {}
15217
+ });
15110
15218
  } catch {
15111
15219
  return null;
15112
15220
  }
15113
15221
  }
15114
15222
  __name(ledgerMarkerFor, "ledgerMarkerFor");
15115
- function composeReviewBody(input, cliVersion) {
15223
+ function composeReviewBody(input, cliVersion, attribution) {
15116
15224
  const criticalsInline = toCount(input.criticalsInline, "criticalsInline");
15117
15225
  const suggestionsInline = toCount(
15118
15226
  input.suggestionsInline,
@@ -15343,15 +15451,19 @@ function composeReviewBody(input, cliVersion) {
15343
15451
  "presubmit.downgradeReasons"
15344
15452
  );
15345
15453
  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
- );
15454
+ let footer = "";
15455
+ if (attribution) {
15456
+ if (typeof modelId !== "string" || modelId.trim() === "") {
15457
+ throw new TypeError(
15458
+ "compose-review: modelId is required (the public footer names the reviewing model)"
15459
+ );
15460
+ }
15461
+ if (!isFooterSafeModelId(modelId)) {
15462
+ throw new TypeError(
15463
+ "compose-review: modelId is interpolated into the public footer verbatim \u2014 it must be a single line that does not contain the footer marker"
15464
+ );
15465
+ }
15466
+ footer = reviewFooter(modelId, cliVersion);
15355
15467
  }
15356
15468
  const c = criticalsInline + bodyCriticals.length;
15357
15469
  const s = suggestionsInline + suggestionsDiscarded;
@@ -15399,7 +15511,6 @@ function composeReviewBody(input, cliVersion) {
15399
15511
  }
15400
15512
  }
15401
15513
  }
15402
- const footer = reviewFooter(modelId, cliVersion);
15403
15514
  const bilingual = bilingualFromPlan(input.planPath, input.prBodyFetcher);
15404
15515
  const render = /* @__PURE__ */ __name((parts, sep9) => {
15405
15516
  const en = parts.map((p) => p.en).join(sep9);
@@ -15413,7 +15524,7 @@ function composeReviewBody(input, cliVersion) {
15413
15524
  ${zh}
15414
15525
 
15415
15526
  </details>` : en;
15416
- return `${text2}
15527
+ return footer === "" ? text2 : `${text2}
15417
15528
 
15418
15529
  ${footer}`;
15419
15530
  }, "render");
@@ -15999,7 +16110,8 @@ var composeReviewCommand = {
15999
16110
  },
16000
16111
  // Same pin as `submit`: the startup stamp, not a version resolved at
16001
16112
  // compose time — a shared runner can rewrite the install mid-session.
16002
- footerVersion(process.env["QWEN_CODE_STARTUP_VERSION"]) ?? await getCliVersion()
16113
+ footerVersion(process.env["QWEN_CODE_STARTUP_VERSION"]) ?? await getCliVersion(),
16114
+ operatorReviewSettings().attribution
16003
16115
  );
16004
16116
  const json = JSON.stringify(
16005
16117
  { ...result, verdictLine: verdictLine(result) },
@@ -17939,7 +18051,7 @@ function renderLedgerSection(ledger) {
17939
18051
  return [
17940
18052
  "## Previous /review round (machine ledger)",
17941
18053
  "",
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.`,
18054
+ `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
18055
  // A truncated ledger must not read like a complete one. `dropped` exists
17944
18056
  // to draw that line, and this is the only place a reader sees the list.
17945
18057
  ...ledger.dropped ? [
@@ -18867,7 +18979,7 @@ async function runPresubmit(args) {
18867
18979
  `repos/${owner}/${repo}/pulls/${prNumber}/comments`
18868
18980
  );
18869
18981
  const qwenComments = allComments.filter(
18870
- (c) => /via Qwen Code \/review/.test(c.body ?? "")
18982
+ (c) => /via Qwen Code \/review/.test(c.body ?? "") || !c.in_reply_to_id && me !== "" && (c.user?.login ?? "").toLowerCase() === me.toLowerCase() && severityOf(c) !== null
18871
18983
  );
18872
18984
  const repliedToIds = /* @__PURE__ */ new Set();
18873
18985
  for (const c of allComments) {
@@ -19117,14 +19229,15 @@ function reviewWriteAuthorization(req) {
19117
19229
  } catch {
19118
19230
  return {
19119
19231
  ok: false,
19120
- why: `no review arguments were recorded at ${path3}, so this run cannot show that \`--comment\` was requested`
19232
+ 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
19233
  };
19122
19234
  }
19123
- const verdict = parseReviewArgs(raw);
19235
+ const verdict = parseReviewArgs(raw, { comment: req.defaultComment });
19124
19236
  if (!verdict.comment.effective) {
19237
+ const commentRequested = verdict.comment.requested || req.defaultComment === true;
19125
19238
  return {
19126
19239
  ok: false,
19127
- why: `\`--comment\` was not in the review arguments (${JSON.stringify(raw.trim())})`
19240
+ 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
19241
  };
19129
19242
  }
19130
19243
  const t2 = verdict.target;
@@ -19161,7 +19274,7 @@ function reviewWriteAuthorization(req) {
19161
19274
  }
19162
19275
  return {
19163
19276
  ok: true,
19164
- why: `\`--comment\` was in the review arguments for #${authorisedPr}`
19277
+ 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
19278
  };
19166
19279
  }
19167
19280
  __name(reviewWriteAuthorization, "reviewWriteAuthorization");
@@ -19403,6 +19516,7 @@ function runPublishAssets(args) {
19403
19516
  const effectiveHost = resolveGhHost(args.host);
19404
19517
  const auth = reviewWriteAuthorization({
19405
19518
  userAuthorized: args.userAuthorized,
19519
+ defaultComment: args.defaultComment,
19406
19520
  skillArgs: args.skillArgs,
19407
19521
  pr: args.pr,
19408
19522
  // Bind the REVIEWED repo when the caller names it, never the assets repo:
@@ -19609,7 +19723,11 @@ var publishAssetsCommand = {
19609
19723
  out: argv["out"],
19610
19724
  host: argv["host"],
19611
19725
  userAuthorized: Boolean(argv["user-authorized"]),
19612
- skillArgs: argv["skill-args"]
19726
+ skillArgs: argv["skill-args"],
19727
+ // The same operator-scope resolution as `submit`: the two callers of
19728
+ // the shared gate must agree on what authorises a run, or a run that
19729
+ // posts the review still refuses to publish its evidence images.
19730
+ defaultComment: operatorReviewSettings().comment
19613
19731
  });
19614
19732
  }, "handler")
19615
19733
  };
@@ -20318,6 +20436,7 @@ function buildChunkAgentPrompt(report, id, rules) {
20318
20436
  "",
20319
20437
  ` Uncoverable: chunk ${chunk2.id} \u2014 line exceeds the read limit`
20320
20438
  );
20439
+ return parts.join("\n");
20321
20440
  } else if (chunk2.oversized) {
20322
20441
  parts.push(
20323
20442
  "",
@@ -20332,6 +20451,8 @@ function buildChunkAgentPrompt(report, id, rules) {
20332
20451
  "",
20333
20452
  "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
20453
  "",
20454
+ "**Shape check (part of code quality \u2014 the altitude lens, scoped to your territory).** For the code in YOUR chunk: " + ENUMERATION_TRAP_LENS,
20455
+ "",
20335
20456
  FINDING_FORMAT,
20336
20457
  "",
20337
20458
  SEVERITY,
@@ -23840,9 +23961,8 @@ function isDiffLine(n) {
23840
23961
  return typeof n === "number" && Number.isSafeInteger(n) && n > 0;
23841
23962
  }
23842
23963
  __name(isDiffLine, "isDiffLine");
23843
- function normalizeInlineComments(comments, modelId, cliVersion) {
23844
- if (typeof modelId !== "string" || modelId.trim() === "") return comments;
23845
- const footer = reviewFooter(modelId, cliVersion);
23964
+ function normalizeInlineComments(comments, modelId, cliVersion, attribution) {
23965
+ const footer = attribution && typeof modelId === "string" && modelId.trim() !== "" ? reviewFooter(modelId, cliVersion) : void 0;
23846
23966
  return comments.map(
23847
23967
  (comment2) => (
23848
23968
  // An empty body stays empty: this runs BEFORE the consistency check, and
@@ -23850,7 +23970,9 @@ function normalizeInlineComments(comments, modelId, cliVersion) {
23850
23970
  // names it ('has no body — an empty comment').
23851
23971
  typeof comment2.body === "string" && comment2.body.trim() !== "" ? {
23852
23972
  ...comment2,
23853
- body: `${comment2.body.replace(REVIEW_FOOTER_RE, "")}
23973
+ // Forged footers are stripped even with attribution off: a comment
23974
+ // authored by the model must not carry one the operator turned off.
23975
+ body: footer === void 0 ? stripReviewFooter(comment2.body) : `${stripReviewFooter(comment2.body)}
23854
23976
 
23855
23977
  ${footer}`
23856
23978
  } : comment2
@@ -23858,9 +23980,10 @@ ${footer}`
23858
23980
  );
23859
23981
  }
23860
23982
  __name(normalizeInlineComments, "normalizeInlineComments");
23861
- function authorization(args) {
23983
+ function authorization(args, defaultComment) {
23862
23984
  return reviewWriteAuthorization({
23863
23985
  userAuthorized: args.userAuthorized,
23986
+ defaultComment,
23864
23987
  skillArgs: args.skillArgs,
23865
23988
  pr: args.pr,
23866
23989
  repo: args.repo,
@@ -23871,7 +23994,7 @@ function authorization(args) {
23871
23994
  });
23872
23995
  }
23873
23996
  __name(authorization, "authorization");
23874
- function compose(payload, cliVersion) {
23997
+ function compose(payload, cliVersion, attribution) {
23875
23998
  const comments = payload.comments ?? [];
23876
23999
  const state = payload.state ?? {};
23877
24000
  const { criticalsInline, suggestionsInline } = countInlineFindings(comments);
@@ -23891,7 +24014,8 @@ function compose(payload, cliVersion) {
23891
24014
  suggestionsInline,
23892
24015
  draftedComments: comments
23893
24016
  },
23894
- cliVersion
24017
+ cliVersion,
24018
+ attribution
23895
24019
  );
23896
24020
  return { event: r.event, body: r.body, cappedBy: r.cappedBy };
23897
24021
  }
@@ -23971,7 +24095,8 @@ function inconsistencies(payload, event2) {
23971
24095
  return problems;
23972
24096
  }
23973
24097
  __name(inconsistencies, "inconsistencies");
23974
- function runSubmit(args, cliVersion = "unknown") {
24098
+ function runSubmit(args, cliVersion = "unknown", opts = {}) {
24099
+ const { attribution = true, defaultComment = false } = opts;
23975
24100
  setGhHost(args.host);
23976
24101
  if (!isOwnerRepo(args.repo)) {
23977
24102
  throw new Error(
@@ -23991,11 +24116,12 @@ function runSubmit(args, cliVersion = "unknown") {
23991
24116
  `Cannot read review JSON ${args.review}: ${err.message}`
23992
24117
  );
23993
24118
  }
23994
- const auth = authorization(args);
24119
+ const auth = authorization(args, defaultComment);
23995
24120
  if (!auth.ok) {
24121
+ 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
24122
  writeStderrLine(
23997
24123
  `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.`
24124
+ Posting is a public, irreversible write, and this run has no authorisation for one. ${advice}`
23999
24125
  );
24000
24126
  writeStdoutLine(
24001
24127
  JSON.stringify({ posted: false, reason: auth.why }, null, 2)
@@ -24015,14 +24141,15 @@ Posting is a public, irreversible write, and this run has no authorisation for o
24015
24141
  comments: normalizeInlineComments(
24016
24142
  payload.comments ?? [],
24017
24143
  payload.state?.modelId,
24018
- cliVersion
24144
+ cliVersion,
24145
+ attribution
24019
24146
  )
24020
24147
  };
24021
24148
  let event2;
24022
24149
  let body;
24023
24150
  let cappedBy;
24024
24151
  try {
24025
- ({ event: event2, body, cappedBy } = compose(payload, cliVersion));
24152
+ ({ event: event2, body, cappedBy } = compose(payload, cliVersion, attribution));
24026
24153
  } catch (err) {
24027
24154
  throw new Error(
24028
24155
  `The review state does not compose into a verdict; refusing to post:
@@ -24122,7 +24249,7 @@ var submitCommand = {
24122
24249
  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
24250
  }).option("skill-args", {
24124
24251
  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."
24252
+ 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
24253
  }).option("user-authorized", {
24127
24254
  type: "boolean",
24128
24255
  default: false,
@@ -24137,7 +24264,11 @@ var submitCommand = {
24137
24264
  }), "builder"),
24138
24265
  handler: /* @__PURE__ */ __name(async (argv) => {
24139
24266
  const cliVersion = footerVersion(process.env["QWEN_CODE_STARTUP_VERSION"]) ?? await getCliVersion();
24140
- runSubmit(argv, cliVersion);
24267
+ const review = operatorReviewSettings();
24268
+ runSubmit(argv, cliVersion, {
24269
+ attribution: review.attribution,
24270
+ defaultComment: review.comment
24271
+ });
24141
24272
  }, "handler")
24142
24273
  };
24143
24274
 
@@ -27361,10 +27492,10 @@ var updateCommand3 = {
27361
27492
  stdioHelpers,
27362
27493
  { updateEventEmitter }
27363
27494
  ] = await Promise.all([
27364
- import("./settings-GUJ3TN2J.js"),
27365
- import("./updateCheck-YAKM36WQ.js"),
27366
- import("./installationInfo-4OA6UW7V.js"),
27367
- import("./standalone-update-MJ722XZ4.js"),
27495
+ import("./settings-3HRWSH66.js"),
27496
+ import("./updateCheck-N4RT7HOZ.js"),
27497
+ import("./installationInfo-63AFHLWA.js"),
27498
+ import("./standalone-update-K5G3L2OJ.js"),
27368
27499
  import("./stdioHelpers-7A2EE64Z.js"),
27369
27500
  import("./updateEventEmitter-5MKC7BLQ.js")
27370
27501
  ]);
@@ -28439,6 +28570,9 @@ async function loadCliConfig(settings, argv, cwd = process.cwd(), overrideExtens
28439
28570
  const screenReader = argv.screenReader !== void 0 ? argv.screenReader : settings.ui?.accessibility?.screenReader ?? false;
28440
28571
  let sessionId;
28441
28572
  let sessionData;
28573
+ let sessionRestoreProjection;
28574
+ const sessionRestoreProjectionSource = hostPolicy?.sessionRestore?.projectionSource;
28575
+ let deferProjectionUntilWriterLease = false;
28442
28576
  if (argv.continue || argv.resume) {
28443
28577
  const sessionService = new SessionService(cwd);
28444
28578
  if (argv.continue) {
@@ -28454,8 +28588,19 @@ async function loadCliConfig(settings, argv, cwd = process.cwd(), overrideExtens
28454
28588
  }
28455
28589
  if (argv.resume) {
28456
28590
  sessionId = argv.resume;
28457
- sessionData = await sessionService.loadSession(argv.resume);
28458
- if (!sessionData) {
28591
+ deferProjectionUntilWriterLease = sessionRestoreProjectionSource !== void 0 && (argv.chatRecording ?? settings.general?.chatRecording ?? true) && isAcpMode === true && settings.experimental?.sessionWriterLease === true;
28592
+ if (sessionRestoreProjectionSource) {
28593
+ if (!deferProjectionUntilWriterLease && !argv.forkSession) {
28594
+ addDaemonRequestAttribute(
28595
+ "qwen-code.daemon.session_restore.projection_acquisition",
28596
+ "preloaded"
28597
+ );
28598
+ sessionRestoreProjection = await sessionRestoreProjectionSource(sessionId);
28599
+ }
28600
+ } else {
28601
+ sessionData = await sessionService.loadSession(argv.resume);
28602
+ }
28603
+ if (!sessionRestoreProjectionSource && !sessionData) {
28459
28604
  const message = `No saved session found with ID ${argv.resume}. Run \`qwen --resume\` without an ID to choose from existing sessions.`;
28460
28605
  writeStderrLine(message);
28461
28606
  process.exit(1);
@@ -28473,10 +28618,21 @@ async function loadCliConfig(settings, argv, cwd = process.cwd(), overrideExtens
28473
28618
  process.exit(1);
28474
28619
  }
28475
28620
  sessionId = forkedSessionId;
28476
- sessionData = await sessionService.loadSession(forkedSessionId);
28477
- if (!sessionData) {
28478
- writeStderrLine(`Failed to load forked session ${forkedSessionId}.`);
28479
- process.exit(1);
28621
+ if (sessionRestoreProjectionSource) {
28622
+ sessionData = void 0;
28623
+ if (!deferProjectionUntilWriterLease) {
28624
+ addDaemonRequestAttribute(
28625
+ "qwen-code.daemon.session_restore.projection_acquisition",
28626
+ "preloaded"
28627
+ );
28628
+ sessionRestoreProjection = await sessionRestoreProjectionSource(forkedSessionId);
28629
+ }
28630
+ } else {
28631
+ sessionData = await sessionService.loadSession(forkedSessionId);
28632
+ if (!sessionData) {
28633
+ writeStderrLine(`Failed to load forked session ${forkedSessionId}.`);
28634
+ process.exit(1);
28635
+ }
28480
28636
  }
28481
28637
  }
28482
28638
  } else if (argv.sandboxSessionId) {
@@ -28502,6 +28658,8 @@ async function loadCliConfig(settings, argv, cwd = process.cwd(), overrideExtens
28502
28658
  }
28503
28659
  const modelProvidersConfig = settings.modelProviders;
28504
28660
  const providerProtocolConfig = settings.providerProtocol;
28661
+ const restoreSessionId = sessionId;
28662
+ const boundSessionRestoreProjectionSource = sessionRestoreProjectionSource && restoreSessionId ? () => sessionRestoreProjectionSource(restoreSessionId) : void 0;
28505
28663
  const cliMcpServers = parseMcpConfig(argv.mcpConfig);
28506
28664
  const topTierMcpServers = sessionMcpServers || cliMcpServers ? { ...sessionMcpServers, ...cliMcpServers ?? {} } : void 0;
28507
28665
  const mcpServers = bareMode || safeMode ? { ...topTierMcpServers } : assembleMcpServers(settings.mcpServers, cwd, topTierMcpServers);
@@ -28509,6 +28667,8 @@ async function loadCliConfig(settings, argv, cwd = process.cwd(), overrideExtens
28509
28667
  const configParams = {
28510
28668
  sessionId,
28511
28669
  sessionData,
28670
+ sessionRestoreProjection,
28671
+ sessionRestoreProjectionSource: boundSessionRestoreProjectionSource,
28512
28672
  embeddingModel: DEFAULT_QWEN_EMBEDDING_MODEL,
28513
28673
  sandbox: sandboxConfig,
28514
28674
  targetDir: cwd,
@@ -28526,7 +28686,7 @@ async function loadCliConfig(settings, argv, cwd = process.cwd(), overrideExtens
28526
28686
  disabledSlashCommands: disabledSlashCommands.length > 0 ? disabledSlashCommands : void 0,
28527
28687
  disabledSkillNamesProvider: bareMode || safeMode ? void 0 : disabledSkillNamesProvider,
28528
28688
  terminalImageRenderSupportProvider: interactive ? async () => {
28529
- const { getTerminalImageRenderSupport } = await import("./terminal-image-renderer-BCUN3Z3W.js");
28689
+ const { getTerminalImageRenderSupport } = await import("./terminal-image-renderer-C4RQMC67.js");
28530
28690
  return getTerminalImageRenderSupport();
28531
28691
  } : void 0,
28532
28692
  disabledSkillLevels: bareMode || safeMode || !Array.isArray(settings.skills?.disabledLevels) ? void 0 : settings.skills.disabledLevels.filter(isSkillLevel),