@qwen-code/qwen-code 0.21.1 → 0.21.2

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 (321) hide show
  1. package/bundled/qc-helper/docs/configuration/settings.md +1 -0
  2. package/bundled/qc-helper/docs/features/channels/_meta.ts +1 -0
  3. package/bundled/qc-helper/docs/features/channels/github.md +42 -10
  4. package/bundled/qc-helper/docs/features/channels/gitlab.md +171 -0
  5. package/bundled/qc-helper/docs/features/code-review.md +20 -0
  6. package/bundled/qc-helper/docs/features/hooks.md +20 -0
  7. package/bundled/qc-helper/docs/features/sub-agents.md +22 -8
  8. package/bundled/qc-helper/docs/qwen-serve.md +7 -5
  9. package/bundled/review/SKILL.md +1 -1
  10. package/chunks/{MaxSizedBox-VI3ROJJA.js → MaxSizedBox-TQBQ247P.js} +42 -38
  11. package/chunks/{StandaloneSessionPicker-LYXKD2EV.js → StandaloneSessionPicker-2HPTKCLX.js} +58 -54
  12. package/chunks/{acp-startup-profiler-DFVPFQ6C.js → acp-startup-profiler-2C4A5ZTJ.js} +2 -2
  13. package/chunks/{acpAgent-WN5SRDQO.js → acpAgent-PS6EDGH3.js} +431 -168
  14. package/chunks/{agent-K6ECSM64.js → agent-VDOUB35F.js} +38 -34
  15. package/chunks/{agent-headless-NO4Y2HOE.js → agent-headless-EO53EFS2.js} +38 -34
  16. package/chunks/{anthropicContentGenerator-V2QOGVYD.js → anthropicContentGenerator-OFHSZJBF.js} +6 -6
  17. package/chunks/{artifact-tool-6K6U7XYJ.js → artifact-tool-RDN2W7ND.js} +2 -2
  18. package/chunks/{askUserQuestion-GD2IJJ7I.js → askUserQuestion-OZERWH5R.js} +2 -2
  19. package/chunks/{bridge-3KJEWDNE.js → bridge-W7AZSRZQ.js} +42 -38
  20. package/chunks/{build-S6DO7LMM.js → build-GDBLPA24.js} +1 -1
  21. package/chunks/{channel-management-service-XR7GZSWF.js → channel-management-service-5S7YCWX5.js} +20 -5
  22. package/chunks/{channel-settings-store-HW4FXXUA.js → channel-settings-store-JFVRSNER.js} +44 -40
  23. package/chunks/{channel-worker-group-XDPTDWTX.js → channel-worker-group-OVWGYMZS.js} +5 -5
  24. package/chunks/{channel-worker-manager-YYEHVRRE.js → channel-worker-manager-H55GKOQA.js} +5 -5
  25. package/chunks/{channel-worker-supervisor-74HTWA2G.js → channel-worker-supervisor-CABBXYHK.js} +3 -3
  26. package/chunks/{chunk-UWMLWVCA.js → chunk-2IIJTXYF.js} +26 -10
  27. package/chunks/{chunk-VYOXCEPJ.js → chunk-2KKCCLPT.js} +1 -1
  28. package/chunks/{chunk-T4TXDL7G.js → chunk-2LEOZTBT.js} +36 -24
  29. package/chunks/{chunk-XWWKIXVD.js → chunk-3APUUXRF.js} +1 -1
  30. package/chunks/{chunk-TCIFAA7K.js → chunk-3F2WDAV6.js} +2 -2
  31. package/chunks/{chunk-SGFT55XI.js → chunk-3I6DUGQD.js} +1 -1
  32. package/chunks/{chunk-ZURDMIDR.js → chunk-44F4LBWZ.js} +228 -71
  33. package/chunks/{chunk-GKX7E4CO.js → chunk-45IOTAUS.js} +1 -1
  34. package/chunks/{chunk-6QIGFD5W.js → chunk-4KP2F2TE.js} +1 -1
  35. package/chunks/{chunk-X5WNMMIA.js → chunk-54YCNSK5.js} +4241 -1636
  36. package/chunks/{chunk-P4WOAOJW.js → chunk-56Z7QEAQ.js} +67 -21
  37. package/chunks/{chunk-UPUG4GXM.js → chunk-5NNHICSA.js} +3 -3
  38. package/chunks/{chunk-LGAOC3ZS.js → chunk-675H6PLP.js} +1 -1
  39. package/chunks/{chunk-5KTQXHPY.js → chunk-6CQWRWUC.js} +3 -3
  40. package/chunks/chunk-6FMJLI5M.js +1591 -0
  41. package/chunks/{chunk-GZ3RCT54.js → chunk-6MPDY6ZG.js} +1 -1
  42. package/chunks/{chunk-RCUQIPTN.js → chunk-6PQPKTXP.js} +1 -1
  43. package/chunks/{chunk-KCO4FLFJ.js → chunk-6TAASXWL.js} +3 -3
  44. package/chunks/{chunk-JHNRZMHI.js → chunk-77V3VIKL.js} +9 -9
  45. package/chunks/{chunk-CAPPWD3X.js → chunk-7KAXXBER.js} +3 -3
  46. package/chunks/{chunk-A4COXFB3.js → chunk-7SJN2IWT.js} +5 -5
  47. package/chunks/{chunk-Y4IHBGBP.js → chunk-7ULQIS27.js} +1 -1
  48. package/chunks/{chunk-5MKRTI4T.js → chunk-A7Y5H4TX.js} +4 -4
  49. package/chunks/{chunk-CVHIL5IG.js → chunk-AOHY3QJ3.js} +13 -6
  50. package/chunks/chunk-AQ37AY7B.js +93 -0
  51. package/chunks/{chunk-OCESJA77.js → chunk-AUOULH6Q.js} +45 -45
  52. package/chunks/{chunk-UBEPNVDI.js → chunk-BBIQAX4V.js} +3 -3
  53. package/chunks/{chunk-JSD33JG6.js → chunk-CBBP4BMC.js} +23 -9
  54. package/chunks/{chunk-ZHBO7WVX.js → chunk-CNTR4GR6.js} +1 -1
  55. package/chunks/{chunk-PB3MBFKG.js → chunk-CO2U743O.js} +4 -4
  56. package/chunks/{chunk-XZC5VLBZ.js → chunk-CPZAH673.js} +4 -0
  57. package/chunks/{chunk-T3O2B4XO.js → chunk-CU47KXB5.js} +3 -3
  58. package/chunks/{chunk-2LKVPASC.js → chunk-D4HTUMGX.js} +3 -3
  59. package/chunks/{chunk-BNWB5CYE.js → chunk-D6MDRSZ6.js} +7 -7
  60. package/chunks/{chunk-7BAU433D.js → chunk-DEEABGH2.js} +867 -91
  61. package/chunks/{chunk-52ZSWYEG.js → chunk-DQ2O5QOJ.js} +1 -1
  62. package/chunks/{chunk-WBSMNTSV.js → chunk-DSFHVTWD.js} +2 -2
  63. package/chunks/{chunk-PT722TDT.js → chunk-DUNI4EBW.js} +701 -86
  64. package/chunks/{chunk-UHUSJ6X7.js → chunk-E2BHWIDT.js} +19 -4
  65. package/chunks/{chunk-T2QMKU3R.js → chunk-E2FN6SM7.js} +17 -5
  66. package/chunks/{chunk-W4MIWP6M.js → chunk-E6CJ2SMM.js} +2 -2
  67. package/chunks/{chunk-5ZF5XXTS.js → chunk-EQNUDTL6.js} +2 -2
  68. package/chunks/{chunk-2N7CODY5.js → chunk-EU5TBFJI.js} +2 -2
  69. package/chunks/{chunk-TFRMVU6R.js → chunk-FANRZEAJ.js} +1 -1
  70. package/chunks/{chunk-WBL3FJEU.js → chunk-FC4KQFCS.js} +1 -1
  71. package/chunks/{chunk-GNR2RNMP.js → chunk-FCYYAB4S.js} +2 -2
  72. package/chunks/{chunk-FNMZK765.js → chunk-FJ5WUMUQ.js} +1 -1
  73. package/chunks/{chunk-J7OACQDE.js → chunk-FNDXMN7I.js} +71 -49
  74. package/chunks/{chunk-U3E3UQAA.js → chunk-FS674JW4.js} +3 -3
  75. package/chunks/{chunk-S7W2GKIO.js → chunk-G7XXKQYS.js} +2 -0
  76. package/chunks/{chunk-VWOOBLTY.js → chunk-GJ2GBPBD.js} +2 -2
  77. package/chunks/{chunk-TBBV36Y4.js → chunk-GL4JOZXU.js} +4 -4
  78. package/chunks/{chunk-FTD6DP4T.js → chunk-GURGAJTX.js} +2 -1
  79. package/chunks/{chunk-65PQENQP.js → chunk-H6I4PGRV.js} +5 -5
  80. package/chunks/{chunk-7XATOOE7.js → chunk-HC45LTEN.js} +1 -1
  81. package/chunks/{chunk-VCPIZRYH.js → chunk-HIVKI6O6.js} +7 -7
  82. package/chunks/{chunk-HMRM2A3U.js → chunk-HX6RLYUO.js} +3 -3
  83. package/chunks/{chunk-GZXCZHCT.js → chunk-I3G5JWBV.js} +1 -1
  84. package/chunks/{chunk-2XSLTRFZ.js → chunk-I5BT7ADR.js} +2 -2
  85. package/chunks/{chunk-GATT5TKW.js → chunk-IGTHU3T4.js} +1 -1
  86. package/chunks/{chunk-4G2BISNC.js → chunk-IIUGIWWY.js} +1 -1
  87. package/chunks/{chunk-7I5GTCT4.js → chunk-JCJ7LKNA.js} +5104 -4817
  88. package/chunks/{chunk-657BH7VM.js → chunk-JE2CEOBO.js} +2 -2
  89. package/chunks/{chunk-S3TWXGKA.js → chunk-JE7KQ2UP.js} +4 -2
  90. package/chunks/{chunk-BPZKP57P.js → chunk-JJPKFJBT.js} +3 -3
  91. package/chunks/{chunk-6PE7N3A4.js → chunk-JLZ3RBQG.js} +7 -5
  92. package/chunks/{chunk-2LQTH543.js → chunk-JXVC2PL3.js} +2 -2
  93. package/chunks/{chunk-JCW2R7WC.js → chunk-K623ENWT.js} +3 -79
  94. package/chunks/{chunk-T2NCM2ET.js → chunk-K6KS3LTN.js} +2 -749
  95. package/chunks/{chunk-6RPMI2AB.js → chunk-KR32NIAN.js} +6 -6
  96. package/chunks/{chunk-XBYYDKAZ.js → chunk-KWHKHSIS.js} +8 -7
  97. package/chunks/{chunk-EVKE2FZL.js → chunk-KXDONCPU.js} +4 -4
  98. package/chunks/{chunk-5TBMQLGG.js → chunk-L2E5GFAG.js} +2 -2
  99. package/chunks/{chunk-MHAIJPTD.js → chunk-L32VV3ZJ.js} +12 -12
  100. package/chunks/{chunk-OKF7JF3R.js → chunk-LHKCY7DY.js} +3 -3
  101. package/chunks/{chunk-LW3RFMG7.js → chunk-LOY7RWQG.js} +3 -3
  102. package/chunks/{chunk-AQIDMUGU.js → chunk-LYI2PZDK.js} +1 -1
  103. package/chunks/{chunk-YGF33UXG.js → chunk-MB32MS4U.js} +12 -3
  104. package/chunks/{chunk-Y6AXW2OG.js → chunk-MM7TH7ZM.js} +1 -1
  105. package/chunks/{chunk-2DN4J57Y.js → chunk-N4ACHWNH.js} +1 -1
  106. package/chunks/{chunk-M7OONWYU.js → chunk-NBD76HUW.js} +4 -2
  107. package/chunks/{chunk-A2D5BAVP.js → chunk-NHFEMWAZ.js} +1 -1
  108. package/chunks/{chunk-3EFXSQCM.js → chunk-NTDH4IML.js} +7 -7
  109. package/chunks/chunk-O6GEWCJA.js +21 -0
  110. package/chunks/{chunk-7DXQIJID.js → chunk-OFZKFPYG.js} +3 -3
  111. package/chunks/{chunk-JTV5K7NH.js → chunk-P5VC5USY.js} +1 -1
  112. package/chunks/{chunk-Q43KPN7X.js → chunk-P755N4CS.js} +3 -3
  113. package/chunks/{chunk-XFZYFU3I.js → chunk-PCK4B6LR.js} +1 -1
  114. package/chunks/{chunk-EJGJIBRS.js → chunk-PJOHNFIY.js} +3 -3
  115. package/chunks/{chunk-WUZ7H6DP.js → chunk-PVNQRENX.js} +1 -1
  116. package/chunks/{chunk-LO4ROVP4.js → chunk-PZEXDV3H.js} +106 -8
  117. package/chunks/{chunk-WZRWHXFE.js → chunk-Q3T5KA2V.js} +1 -1
  118. package/chunks/{chunk-QIZKCVM3.js → chunk-Q5WZTTWE.js} +4 -4
  119. package/chunks/{chunk-BGTQCTQW.js → chunk-QARJNL2V.js} +3 -3
  120. package/chunks/{chunk-GXIJHV66.js → chunk-QCXGC7QB.js} +3 -3
  121. package/chunks/{chunk-DZLYR4U3.js → chunk-QDK4F2N5.js} +1 -1
  122. package/chunks/{chunk-NOKIVHOL.js → chunk-QTHQ6Z5X.js} +1 -1
  123. package/chunks/{chunk-A3NDJ5SB.js → chunk-R2XWGR75.js} +2 -2
  124. package/chunks/{chunk-JX27F6QS.js → chunk-RDJOB6S3.js} +1 -1
  125. package/chunks/{chunk-TV64SXKD.js → chunk-RG64CDT2.js} +4 -4
  126. package/chunks/{chunk-JFMA7Y5M.js → chunk-RSVPYAGK.js} +5 -5
  127. package/chunks/{chunk-64LQLPL7.js → chunk-SHN4KHDK.js} +3 -3
  128. package/chunks/chunk-T3CHYWJZ.js +758 -0
  129. package/chunks/{chunk-PONHVBRT.js → chunk-TEGJSJDF.js} +2 -2
  130. package/chunks/{chunk-75GFAX4R.js → chunk-THVU3RNH.js} +1 -1
  131. package/chunks/{record-artifact-XAMSFSW4.js → chunk-TIRRPCFS.js} +22 -7
  132. package/chunks/{chunk-HV26XH34.js → chunk-TTJZAIFP.js} +3 -3
  133. package/chunks/{chunk-JMONIXMJ.js → chunk-TZTAV5RH.js} +1 -1
  134. package/chunks/{chunk-7AEJDLRA.js → chunk-UV6KF7T3.js} +2 -2
  135. package/chunks/{chunk-PLDQBIO6.js → chunk-V25K5ID7.js} +1 -1
  136. package/chunks/{chunk-S4WJVPZW.js → chunk-V4XNUDPE.js} +3 -3
  137. package/chunks/{chunk-2FAK6PNM.js → chunk-VEMNQMHA.js} +2 -2
  138. package/chunks/{chunk-CQL64ESB.js → chunk-VMX5RZQH.js} +12 -10
  139. package/chunks/{chunk-EIF3FXTB.js → chunk-W3UKBMSI.js} +63 -18
  140. package/chunks/{chunk-TDL6LB4K.js → chunk-WWCMSZII.js} +21 -9
  141. package/chunks/{chunk-5YKDXHUY.js → chunk-XP4L6KS3.js} +2 -2
  142. package/chunks/{chunk-RPLGZJV2.js → chunk-XQK4XXTN.js} +1 -1
  143. package/chunks/{chunk-KAMYKP7E.js → chunk-XUGZYLDH.js} +1 -1
  144. package/chunks/{chunk-MR5EAQ5M.js → chunk-YANIWTRZ.js} +1 -1
  145. package/chunks/{chunk-3L2SPEBH.js → chunk-YGE3IXJP.js} +1 -1
  146. package/chunks/{chunk-BCZFQXWK.js → chunk-YUFIEIWC.js} +1 -1
  147. package/chunks/{chunk-75MIQ3LV.js → chunk-Z3S5EMOW.js} +4 -4
  148. package/chunks/{chunk-BMFALVGQ.js → chunk-ZMOJ7ISP.js} +1 -1
  149. package/chunks/{chunk-GEBV2JGB.js → chunk-ZPZ7ZJEE.js} +1 -1
  150. package/chunks/{computer-use-ZTIDHMMA.js → computer-use-5QWCFNKD.js} +38 -34
  151. package/chunks/{config-utils-NYSXDMEQ.js → config-utils-WADIDWGG.js} +4 -4
  152. package/chunks/{contextCommand-2PIEU37Z.js → contextCommand-4Z7T7TUM.js} +40 -36
  153. package/chunks/{core-runtime-3XEYLQFK.js → core-runtime-6N4EFC2Q.js} +38 -34
  154. package/chunks/{create-sub-session-SBYUMSSS.js → create-sub-session-62YZWVAY.js} +2 -2
  155. package/chunks/{create-sub-session-R76FVXCI.js → create-sub-session-AEREHZBQ.js} +38 -34
  156. package/chunks/{cron-create-2QK6TCEC.js → cron-create-6E7GIQTG.js} +4 -4
  157. package/chunks/{cron-delete-FDCDFYMG.js → cron-delete-JD26XY3W.js} +4 -4
  158. package/chunks/{cron-list-XN3WVBTP.js → cron-list-CUWFB44G.js} +4 -4
  159. package/chunks/{daemon-Q2AB5Z23.js → daemon-PCNCI5YU.js} +72 -3
  160. package/chunks/{daemon-status-provider-3XJI6CAL.js → daemon-status-provider-DDF7C5M7.js} +46 -42
  161. package/chunks/{daemon-trust-policy-ILUDTLHD.js → daemon-trust-policy-Q4KSOJTR.js} +43 -39
  162. package/chunks/{daemon-trust-policy-monitor-HS3PKKRO.js → daemon-trust-policy-monitor-V6FTE3IY.js} +43 -39
  163. package/chunks/{deferred-core-runtime-X4QV662U.js → deferred-core-runtime-GHJ5GQHK.js} +38 -34
  164. package/chunks/{dist-BSTVRPMT.js → dist-26BIMQT6.js} +276 -16
  165. package/chunks/{dist-SV7Q3AWJ.js → dist-2PERFI23.js} +12 -9
  166. package/chunks/{dist-DOLYHMXE.js → dist-OAOC5OV4.js} +2 -2
  167. package/chunks/{dist-YGBBMK3Z.js → dist-PVEAFLHY.js} +5 -4
  168. package/chunks/{dist-HVRQ2CFL.js → dist-SL2LUMML.js} +1180 -5
  169. package/chunks/dist-ULIG4M5H.js +13415 -0
  170. package/chunks/{dist-IXQEQWRG.js → dist-WGMNT3JQ.js} +1 -1
  171. package/chunks/{dist-SSU66DM4.js → dist-ZHXOBXDN.js} +1 -1
  172. package/chunks/{earlyInputCapture-XKLZT7ZD.js → earlyInputCapture-TQXLLISD.js} +39 -35
  173. package/chunks/{edit-HHGIOTQ2.js → edit-FJEUV6KZ.js} +38 -34
  174. package/chunks/{enter-worktree-ZN7PUQ46.js → enter-worktree-7GE3TZ4P.js} +38 -34
  175. package/chunks/{enterPlanMode-EIFIDSIV.js → enterPlanMode-KR5TMPCJ.js} +38 -34
  176. package/chunks/{environment-XXQ75D2Q.js → environment-SWL3CMB3.js} +40 -36
  177. package/chunks/{errors-4GMVU7CK.js → errors-XQE7BGZV.js} +40 -36
  178. package/chunks/{exit-worktree-GXMI4ATY.js → exit-worktree-CHKTYNCV.js} +38 -34
  179. package/chunks/{exitPlanMode-34UVY7M6.js → exitPlanMode-QYAG6LWX.js} +38 -34
  180. package/chunks/{fast-path-VPIVA7L6.js → fast-path-Z2K7W6DC.js} +2 -2
  181. package/chunks/{gemini-4BWIK4WD.js → gemini-YU4XKEDG.js} +91 -87
  182. package/chunks/{geminiContentGenerator-3XVV5MSS.js → geminiContentGenerator-ZZX6NBO4.js} +6 -6
  183. package/chunks/{glob-TZ2ABCJG.js → glob-VYF5CXSX.js} +38 -34
  184. package/chunks/goal-tools-HGO6VXPB.js +335 -0
  185. package/chunks/{grep-BEF463NA.js → grep-5DP5ZUTW.js} +38 -34
  186. package/chunks/{handleAutoUpdate-L6ERF36Y.js → handleAutoUpdate-UVBJ56DL.js} +42 -38
  187. package/chunks/{i18n-FMM5FDXR.js → i18n-UQNYHEUD.js} +39 -35
  188. package/chunks/{image-gen-HHVLF7HS.js → image-gen-WHPIZNWF.js} +9 -9
  189. package/chunks/{initializer-625TIAIO.js → initializer-GMIICF4W.js} +44 -40
  190. package/chunks/{installationInfo-6AM4I2Y3.js → installationInfo-4MGG4WVI.js} +39 -35
  191. package/chunks/{keychain-token-storage-72IYCAZV.js → keychain-token-storage-IKO4G53C.js} +2 -2
  192. package/chunks/list-CPN2W334.js +92 -0
  193. package/chunks/{list-agents-R6KDXQR3.js → list-agents-PXJ7ZUFB.js} +2 -2
  194. package/chunks/{loadedSettingsAdapter-SPUTNKAV.js → loadedSettingsAdapter-ZQAV5NDO.js} +43 -39
  195. package/chunks/{loggingContentGenerator-LKOF7XI7.js → loggingContentGenerator-5E7W4IEP.js} +18 -18
  196. package/chunks/{loop-wakeup-3IQKCYAH.js → loop-wakeup-Y26NQZ5I.js} +13 -6
  197. package/chunks/{ls-DKZ37A7N.js → ls-ONQTTMQR.js} +4 -4
  198. package/chunks/{lsp-QNWN7KN3.js → lsp-YGHHRGMD.js} +2 -2
  199. package/chunks/{managed-npm-update-ACQGGIN5.js → managed-npm-update-MKKAXYXA.js} +39 -35
  200. package/chunks/{mcp-SZLHKFJW.js → mcp-V5NTJF6X.js} +43 -39
  201. package/chunks/{monitor-DF52UVHI.js → monitor-CO3ASY6E.js} +38 -34
  202. package/chunks/nonInteractiveCli-ZJYEOO7U.js +148 -0
  203. package/chunks/{notebook-edit-FCWS4XVN.js → notebook-edit-Z7AEE6FM.js} +38 -34
  204. package/chunks/{openaiContentGenerator-7LDK3DCJ.js → openaiContentGenerator-CA3MQOP3.js} +19 -19
  205. package/chunks/{pidfile-6ERW3DF4.js → pidfile-NL7MKDRU.js} +39 -35
  206. package/chunks/{processUtils-COKZAMUP.js → processUtils-PB5K2DYH.js} +2 -2
  207. package/chunks/{qwenContentGenerator-TKWUMR7N.js → qwenContentGenerator-JYFNDCOS.js} +44 -40
  208. package/chunks/{qwenOAuth2-7HMU47SF.js → qwenOAuth2-W2ALKQDD.js} +8 -8
  209. package/chunks/{read-file-X6DRC574.js → read-file-IEOR5H5W.js} +11 -11
  210. package/chunks/{read-mcp-resource-GFTWYXMK.js → read-mcp-resource-U2IJN5HM.js} +2 -2
  211. package/chunks/record-artifact-MGPJ7EG4.js +21 -0
  212. package/chunks/{resumeHistoryUtils-PFPM2GWM.js → resumeHistoryUtils-BNBTP5AS.js} +44 -40
  213. package/chunks/{ripGrep-OWV2IVJC.js → ripGrep-UMQODKEB.js} +38 -34
  214. package/chunks/{run-qwen-serve-TSTCO4XE.js → run-qwen-serve-RN2R6QQW.js} +116 -65
  215. package/chunks/{runtime-DAUPSUKI.js → runtime-QFJ2MJF5.js} +48 -44
  216. package/chunks/{scheduler-KMADMT26.js → scheduler-AMYUFOZI.js} +38 -34
  217. package/chunks/{sdk-exporters-http-WO556XNU.js → sdk-exporters-http-4BQANSJ6.js} +3 -3
  218. package/chunks/{sdk-impl-LPAVACSF.js → sdk-impl-Z4VXWVFX.js} +3 -3
  219. package/chunks/{send-message-SAWK4DZX.js → send-message-PMP4ATVM.js} +6 -11
  220. package/chunks/{serve-NNRWS6F4.js → serve-EIIYJVX3.js} +43 -39
  221. package/chunks/{server-WEH7DVCH.js → server-EP2LLAPD.js} +1768 -712
  222. package/chunks/{session-WXC56V2I.js → session-GMPZBLOW.js} +83 -79
  223. package/chunks/{settings-DJDXFDZ3.js → settings-LN7RNKBS.js} +47 -43
  224. package/chunks/{shell-JN5VRQXD.js → shell-EM2OWU5X.js} +38 -34
  225. package/chunks/{skill-SGXPKJCS.js → skill-T5VPSK73.js} +17 -16
  226. package/chunks/{skill-settings-VJ5PDMZI.js → skill-settings-GMR3GMNY.js} +42 -38
  227. package/chunks/{spawnChannel-ETMJW7YX.js → spawnChannel-YPCU62DI.js} +40 -36
  228. package/chunks/{standalone-update-MK3Z7KBI.js → standalone-update-JAKIM2NF.js} +40 -36
  229. package/chunks/{startInteractiveUI-ZCGIXPGT.js → startInteractiveUI-YETQWGYF.js} +774 -779
  230. package/chunks/{syntheticOutput-355CB6CJ.js → syntheticOutput-D7E6ZFKR.js} +3 -3
  231. package/chunks/{task-create-INGWNUG4.js → task-create-NFCYD43L.js} +10 -9
  232. package/chunks/{task-list-5XNNGTF4.js → task-list-TAVMGEVD.js} +5 -5
  233. package/chunks/{task-stop-4ROAOBXH.js → task-stop-ZDF2UJRM.js} +2 -2
  234. package/chunks/{task-update-CRK5VWWZ.js → task-update-6L7LHGEX.js} +10 -9
  235. package/chunks/{team-create-QQGAJG7P.js → team-create-LFJ6HGNY.js} +38 -34
  236. package/chunks/{team-delete-S2RCXA4P.js → team-delete-DPGGRQBU.js} +5 -5
  237. package/chunks/{team-plan-approval-RT7Q5R6O.js → team-plan-approval-C2KLSDGO.js} +38 -34
  238. package/chunks/{theme-manager-EEWIQJ7J.js → theme-manager-JQ3ZGBP5.js} +39 -35
  239. package/chunks/{todoWrite-7WM3VDMY.js → todoWrite-2UO5G6G6.js} +32 -4
  240. package/chunks/{tool-search-Z3Z4AYKP.js → tool-search-FAZBFRJZ.js} +15 -14
  241. package/chunks/{total-session-admission-44JKRWQD.js → total-session-admission-5CALIVYO.js} +42 -38
  242. package/chunks/{trustedFolders-X2JEIO57.js → trustedFolders-KOPSP44S.js} +39 -35
  243. package/chunks/{update-relaunch-VWNPYDIP.js → update-relaunch-6QL2TICS.js} +5 -5
  244. package/chunks/{updateCheck-KAQH67DV.js → updateCheck-4Q6RIKFW.js} +41 -37
  245. package/chunks/{useAutoAcceptIndicator-JH6BCF7S.js → useAutoAcceptIndicator-Q5BMKZV3.js} +47 -43
  246. package/chunks/{validateNonInterActiveAuth-GIUJ2UFS.js → validateNonInterActiveAuth-GKOC5F6Z.js} +79 -75
  247. package/chunks/{version-BGLYIJUY.js → version-VSATY2LD.js} +1 -1
  248. package/chunks/{web-fetch-OTDU4VQF.js → web-fetch-JCLKL6NL.js} +14 -14
  249. package/chunks/{web-search-FP6SIHPR.js → web-search-DSQTFUBX.js} +8 -8
  250. package/chunks/{workflow-YCIVBYSB.js → workflow-M6QAVKVJ.js} +41 -37
  251. package/chunks/workspace-providers-status-YKLTLMJA.js +89 -0
  252. package/chunks/{workspace-registration-store-OTMS3H4C.js → workspace-registration-store-5DMGKU64.js} +1 -1
  253. package/chunks/{workspace-registry-O63R6IZ4.js → workspace-registry-PTYUSYXX.js} +42 -38
  254. package/chunks/{workspace-service-M6LLHKJ5.js → workspace-service-25ML3T47.js} +48 -44
  255. package/chunks/{workspace-skills-status-C2V7BAIS.js → workspace-skills-status-YKZWOYRX.js} +44 -40
  256. package/chunks/{workspace-trust-reconciler-IBUPOUJN.js → workspace-trust-reconciler-5FI2S3OS.js} +47 -43
  257. package/chunks/write-file-AY7VLP5X.js +78 -0
  258. package/chunks/zoom-image-S4LJZMD5.js +224 -0
  259. package/cli.js +50 -16
  260. package/package.json +3 -3
  261. package/web-shell/assets/{arc-75-Wdeo3.js → arc-xjArKHU2.js} +1 -1
  262. package/web-shell/assets/{architectureDiagram-3BPJPVTR-FKeXQbyP.js → architectureDiagram-3BPJPVTR-BgrQDNYG.js} +1 -1
  263. package/web-shell/assets/{blockDiagram-GPEHLZMM-CY0vc-A3.js → blockDiagram-GPEHLZMM-CXxWC-1_.js} +1 -1
  264. package/web-shell/assets/{c4Diagram-AAUBKEIU-CNP-A-8u.js → c4Diagram-AAUBKEIU-Dx1tLm3v.js} +1 -1
  265. package/web-shell/assets/channel-B1cyk94G.js +1 -0
  266. package/web-shell/assets/{chunk-2J33WTMH-GybS4Gii.js → chunk-2J33WTMH-CBxjogVR.js} +1 -1
  267. package/web-shell/assets/{chunk-4BX2VUAB-02H91V8v.js → chunk-4BX2VUAB-izb-rY5W.js} +1 -1
  268. package/web-shell/assets/{chunk-55IACEB6-D3M-2VT6.js → chunk-55IACEB6-NzLyvSb8.js} +1 -1
  269. package/web-shell/assets/{chunk-727SXJPM-CCu29u4H.js → chunk-727SXJPM-DVyKb0dl.js} +1 -1
  270. package/web-shell/assets/{chunk-AQP2D5EJ-CaFKWgrn.js → chunk-AQP2D5EJ-BtqL7NzB.js} +1 -1
  271. package/web-shell/assets/{chunk-FMBD7UC4-ZZpPqIwQ.js → chunk-FMBD7UC4-iNpdKIO0.js} +1 -1
  272. package/web-shell/assets/{chunk-ND2GUHAM-D22DqGs8.js → chunk-ND2GUHAM-DI7cbFmX.js} +1 -1
  273. package/web-shell/assets/{chunk-QZHKN3VN-Bu85S0fw.js → chunk-QZHKN3VN-3Y_-xFYs.js} +1 -1
  274. package/web-shell/assets/classDiagram-4FO5ZUOK-BpBYZoRE.js +1 -0
  275. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-BpBYZoRE.js +1 -0
  276. package/web-shell/assets/{cose-bilkent-S5V4N54A-f1CK1Gwe.js → cose-bilkent-S5V4N54A--raRatZn.js} +1 -1
  277. package/web-shell/assets/{dagre-BM42HDAG-D0Ow8F_n.js → dagre-BM42HDAG-B8SU70mO.js} +1 -1
  278. package/web-shell/assets/{diagram-2AECGRRQ-BPrmTWp8.js → diagram-2AECGRRQ-ewgoakXo.js} +1 -1
  279. package/web-shell/assets/{diagram-5GNKFQAL-HccuFAzy.js → diagram-5GNKFQAL-Bm_JLTnS.js} +1 -1
  280. package/web-shell/assets/{diagram-KO2AKTUF-BrS76mbA.js → diagram-KO2AKTUF-DEIUjUy9.js} +1 -1
  281. package/web-shell/assets/{diagram-LMA3HP47-V7T9lU-5.js → diagram-LMA3HP47-C2Wmrpj-.js} +1 -1
  282. package/web-shell/assets/{diagram-OG6HWLK6-DKidyJMR.js → diagram-OG6HWLK6-CtYe6bFx.js} +1 -1
  283. package/web-shell/assets/{erDiagram-TEJ5UH35-DBadZIkp.js → erDiagram-TEJ5UH35-DfpHcWLV.js} +1 -1
  284. package/web-shell/assets/{flowDiagram-I6XJVG4X-BymfqdNJ.js → flowDiagram-I6XJVG4X-CAiUhio5.js} +1 -1
  285. package/web-shell/assets/{ganttDiagram-6RSMTGT7-DOw340jf.js → ganttDiagram-6RSMTGT7-CYc7ezr4.js} +1 -1
  286. package/web-shell/assets/{gitGraphDiagram-PVQCEYII-_8EiD8sl.js → gitGraphDiagram-PVQCEYII-70lbkcRS.js} +1 -1
  287. package/web-shell/assets/index-C1k3PDuU.css +5 -0
  288. package/web-shell/assets/index-C2GE3DAF.js +74 -0
  289. package/web-shell/assets/index-DZLIXILO.js +1750 -0
  290. package/web-shell/assets/{index-CKIadvET.js → index-Ww86nT9f.js} +1 -1
  291. package/web-shell/assets/{infoDiagram-5YYISTIA-D61KYQBu.js → infoDiagram-5YYISTIA-C7e8DWPa.js} +1 -1
  292. package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-CsiXSpNx.js → ishikawaDiagram-YF4QCWOH-BYLr2op-.js} +1 -1
  293. package/web-shell/assets/{journeyDiagram-JHISSGLW-Sdfionyh.js → journeyDiagram-JHISSGLW-hEibAHKX.js} +1 -1
  294. package/web-shell/assets/{kanban-definition-UN3LZRKU-C3WI3Cnl.js → kanban-definition-UN3LZRKU-F2rt8Uhp.js} +1 -1
  295. package/web-shell/assets/{linear-Dpigcc62.js → linear-DPhyNezd.js} +1 -1
  296. package/web-shell/assets/{mermaid.core-Ct97pqgW.js → mermaid.core-ZUtnug0n.js} +5 -5
  297. package/web-shell/assets/{mindmap-definition-RKZ34NQL-BzeaN0rB.js → mindmap-definition-RKZ34NQL-DDWcMoi8.js} +1 -1
  298. package/web-shell/assets/{pieDiagram-4H26LBE5-CvjgcbVD.js → pieDiagram-4H26LBE5-CTRKzw1_.js} +1 -1
  299. package/web-shell/assets/{quadrantDiagram-W4KKPZXB-BUzgTNdH.js → quadrantDiagram-W4KKPZXB-CAEwYG_z.js} +1 -1
  300. package/web-shell/assets/{requirementDiagram-4Y6WPE33-B7zKlgUQ.js → requirementDiagram-4Y6WPE33-CRjnH9D9.js} +1 -1
  301. package/web-shell/assets/{sankeyDiagram-5OEKKPKP-Bb9CQgrT.js → sankeyDiagram-5OEKKPKP-LPQT_sOd.js} +1 -1
  302. package/web-shell/assets/{sequenceDiagram-3UESZ5HK-DJ6V7itG.js → sequenceDiagram-3UESZ5HK-Ht2Iqvb0.js} +1 -1
  303. package/web-shell/assets/{stateDiagram-AJRCARHV-IImflERY.js → stateDiagram-AJRCARHV-CIUdqOXu.js} +1 -1
  304. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-BmqqQZ6w.js +1 -0
  305. package/web-shell/assets/{timeline-definition-PNZ67QCA-6Q_uWHKh.js → timeline-definition-PNZ67QCA-BcilneZF.js} +1 -1
  306. package/web-shell/assets/{vennDiagram-CIIHVFJN-TmyKyjwv.js → vennDiagram-CIIHVFJN-BljwiiH1.js} +1 -1
  307. package/web-shell/assets/{wardley-L42UT6IY-CRh9uiPv.js → wardley-L42UT6IY-DeKjkYjq.js} +1 -1
  308. package/web-shell/assets/{wardleyDiagram-YWT4CUSO-59TKAW8w.js → wardleyDiagram-YWT4CUSO-L3U1H7KG.js} +1 -1
  309. package/web-shell/assets/{xychartDiagram-2RQKCTM6-GCSUIK2L.js → xychartDiagram-2RQKCTM6-IJnWsgMT.js} +1 -1
  310. package/web-shell/index.html +2 -2
  311. package/chunks/list-L2GA674Y.js +0 -88
  312. package/chunks/nonInteractiveCli-5T7KYKLK.js +0 -144
  313. package/chunks/workspace-providers-status-S35YAIUS.js +0 -85
  314. package/chunks/write-file-3BZC3EAE.js +0 -72
  315. package/chunks/zoom-image-TZ6S2O57.js +0 -351
  316. package/web-shell/assets/channel-DPYMT76A.js +0 -1
  317. package/web-shell/assets/classDiagram-4FO5ZUOK--JstsIgL.js +0 -1
  318. package/web-shell/assets/classDiagram-v2-Q7XG4LA2--JstsIgL.js +0 -1
  319. package/web-shell/assets/index-D1eXNRHe.js +0 -1389
  320. package/web-shell/assets/index-DVLD4CQq.css +0 -5
  321. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-CYI_YoNR.js +0 -1
@@ -337,6 +337,7 @@ If you are experiencing performance issues with file searching (e.g., with `@` c
337
337
  | `tools.computerUse.maxImageDimension` | number | Longest-edge pixel cap applied to cua-driver screenshots (via `set_config`'s `max_image_dimension`). `-1` (default) keeps cua-driver's built-in default (1568); `0` disables resizing (full resolution); a positive value caps the longest edge. Lower caps cut vision-token cost at the expense of fine detail. | `-1` | Requires restart: Yes. Env override: `QWEN_COMPUTER_USE_MAX_IMAGE_DIMENSION` (a non-negative integer; takes precedence over this setting) |
338
338
  | `tools.computerUse.idleTimeoutMs` | number | Milliseconds to keep the cua-driver process alive after the last `computer_use__*` call. The default is `300000` (5 minutes). Set to `0` to keep it running until Qwen Code exits. | `300000` | Requires restart: Yes |
339
339
  | `tools.toolSearch.enabled` | boolean | Load MCP tools on demand via ToolSearch to reduce prompt size. Disable this for models that rely on prefix-based KV caching (e.g. DeepSeek) to keep the prompt prefix stable and maximize cache hit rates. | `true` | Requires restart: Yes |
340
+ | `tools.toolSearch.threshold` | number | Context-window percentage used as the session-start budget for preloading deferred tools (bundled built-ins and MCP alike). When the combined schemas of every deferred tool fit within this budget, they are all declared upfront instead of loaded on demand via ToolSearch — a stable declaration list keeps prefix KV caches valid for the whole session. Set `0` to always load deferred tools on demand. | `10` | Requires restart: Yes |
340
341
 
341
342
  > [!note]
342
343
  >
@@ -7,5 +7,6 @@ export default {
7
7
  feishu: 'Feishu',
8
8
  qqbot: 'QQ Bot',
9
9
  github: 'GitHub',
10
+ gitlab: 'GitLab',
10
11
  plugins: 'Plugins',
11
12
  };
@@ -4,7 +4,8 @@ This guide covers setting up a Qwen Code channel that monitors GitHub notificati
4
4
 
5
5
  ## Prerequisites
6
6
 
7
- - A GitHub account (or a dedicated bot account)
7
+ - A GitHub account for the channel. Use a dedicated bot account when the PAT
8
+ owner also needs to operate the channel.
8
9
  - A GitHub Personal Access Token (PAT) with `notifications` and `public_repo` (or `repo`) scopes
9
10
 
10
11
  ## Creating a Token
@@ -26,10 +27,12 @@ Add the channel to `~/.qwen/settings.json`:
26
27
  "type": "github",
27
28
  "token": "$GITHUB_TOKEN",
28
29
  "pollInterval": 60000,
30
+ "reasonFilter": ["mention", "review_requested", "assign"],
29
31
  "senderPolicy": "allowlist",
30
- "allowedUsers": ["your-github-username"],
32
+ "allowedUsers": ["operator-github-username"],
31
33
  "sessionScope": "chat_thread",
32
34
  "cwd": "/path/to/your/project",
35
+ "blockStreaming": "off",
33
36
  "groupPolicy": "open",
34
37
  "groups": {
35
38
  "*": { "requireMention": true }
@@ -45,6 +48,13 @@ Set the token as an environment variable:
45
48
  export GITHUB_TOKEN="ghp_your_token_here"
46
49
  ```
47
50
 
51
+ The PAT owner cannot trigger its own channel: GitHub self-activity does not
52
+ provide a usable notification, and the adapter intentionally ignores its own
53
+ comments to prevent reply loops. If the PAT owner needs to operate the channel,
54
+ use a separate bot-owned PAT and put only operator accounts in `allowedUsers`.
55
+ Startup rejects an allowlist containing only the PAT owner and warns when the
56
+ PAT owner appears alongside other operators.
57
+
48
58
  ### GitHub Enterprise
49
59
 
50
60
  For GitHub Enterprise Server, set `baseUrl`:
@@ -57,14 +67,22 @@ For GitHub Enterprise Server, set `baseUrl`:
57
67
 
58
68
  ## Configuration Options
59
69
 
60
- | Option | Default | Description |
61
- | ------------------------- | ------------------------ | -------------------------------------------------------------------------------- |
62
- | `token` | (required) | Classic PAT with `notifications` scope |
63
- | `pollInterval` | `60000` | Poll interval in ms |
64
- | `baseUrl` | `https://api.github.com` | API base URL (for GHE) |
65
- | `groupPolicy` | `"disabled"` | Must be `"open"` for notifications to flow |
66
- | `senderPolicy` | `"allowlist"` | Who can trigger the bot |
67
- | `groups.*.requireMention` | `true` | Require @mentions for ordinary comments; directed notification reasons still run |
70
+ | Option | Default | Description |
71
+ | ------------------------- | ------------------------ | --------------------------------------------------------------------------------------------- |
72
+ | `token` | (required) | Classic PAT with `notifications` scope |
73
+ | `pollInterval` | `60000` | Poll interval in ms |
74
+ | `baseUrl` | `https://api.github.com` | API base URL (for GHE) |
75
+ | `groupPolicy` | `"disabled"` | Must be `"open"` for notifications to flow |
76
+ | `senderPolicy` | `"allowlist"` | Who can trigger the bot |
77
+ | `groups.*.requireMention` | `true` | Require @mentions for ordinary comments; directed notification reasons still run |
78
+ | `blockStreaming` | `"off"` | Always forced to `"off"`; intermediate model chunks aren't published; `"on"` is not supported |
79
+ | `reasonFilter` | unset | Optional allowlist of GitHub notification reasons to process |
80
+
81
+ Use `reasonFilter` to drop noisy notification classes such as `ci_activity` or `state_change`. Do not use `reasonFilter: ["mention"]` as a replacement for `groups.*.requireMention`: GitHub's `mention` reason is sticky at the thread level, so real new @mentions can arrive later under `comment`, `subscribed`, `author`, or other reasons and would be skipped.
82
+
83
+ Valid `reasonFilter` values are `mention`, `review_requested`, `assign`, `author`, `comment`, `ci_activity`, `manual`, `state_change`, `subscribed`, `team_mention`, `security_alert`, `approval_requested`, `invitation`, `member_feature_requested`, and `security_advisory_credit`.
84
+
85
+ Filtered notifications are still marked read before they are skipped. Removing the filter later will not replay notifications the channel already skipped.
68
86
 
69
87
  ## ⚠️ Security
70
88
 
@@ -92,6 +110,20 @@ The comment window is `(previousCursor, currentMaxUpdatedAt]` — comments alrea
92
110
 
93
111
  Non-comment activity (push, label changes) bumps the notification's `updated_at` but produces zero new comments in the window, so re-fetched threads are skipped without triggering the agent.
94
112
 
113
+ ## Response Feedback
114
+
115
+ For an accepted issue or pull-request comment, the channel adds GitHub's `👀` reaction while the agent is working, then removes it when the run completes, fails, or is cancelled. Both operations are best-effort: a reaction API or permission failure is logged and never prevents the final response.
116
+
117
+ ### Final-only output
118
+
119
+ The GitHub channel always forces final-only delivery. The adapter sets `blockStreaming` to `"off"`, so intermediate model chunks are never published as separate comments and `blockStreaming: "on"` is not supported.
120
+
121
+ ```json
122
+ {
123
+ "blockStreaming": "off"
124
+ }
125
+ ```
126
+
95
127
  ## Known Limitations
96
128
 
97
129
  - **First start skips existing unread notifications.** The cursor initializes to "now" on first launch. Notifications created before the bot starts are not processed unless the thread receives new activity afterwards.
@@ -0,0 +1,171 @@
1
+ # GitLab
2
+
3
+ This guide covers setting up a Qwen Code channel that monitors GitLab todos and responds to mentions on issues and merge requests.
4
+
5
+ ## Prerequisites
6
+
7
+ - A GitLab account (or a dedicated bot account)
8
+ - A GitLab Personal Access Token with `read_api` and `api` scopes
9
+
10
+ ## Creating a Token
11
+
12
+ 1. Go to **Preferences → Access Tokens**
13
+ 2. Create a token with these scopes:
14
+ - **read_api** — read todos and project data
15
+ - **api** — post notes (comments) on issues/MRs
16
+ 3. Save the token securely as an environment variable
17
+
18
+ ## Configuration
19
+
20
+ Add the channel to `~/.qwen/settings.json`:
21
+
22
+ ```json
23
+ {
24
+ "channels": {
25
+ "my-gitlab": {
26
+ "type": "gitlab",
27
+ "token": "$GITLAB_TOKEN",
28
+ "pollInterval": 60000,
29
+ "senderPolicy": "open",
30
+ "sessionScope": "chat_thread",
31
+ "cwd": "/path/to/your/project",
32
+ "groupPolicy": "open",
33
+ "action_prompt_template": {
34
+ "mentioned": "Project: %project% | URL: %project_url% | Author: %author% | Type: %target_type% | IID: %iid% | Title: %title% | Description: %description% | TodoID: %todo_id%"
35
+ }
36
+ }
37
+ }
38
+ }
39
+ ```
40
+
41
+ Set the token as an environment variable:
42
+
43
+ ```bash
44
+ export GITLAB_TOKEN="glpat-your_token_here"
45
+ ```
46
+
47
+ ### Self-hosted GitLab
48
+
49
+ For self-hosted instances, set `baseUrl`:
50
+
51
+ ```json
52
+ {
53
+ "baseUrl": "https://gitlab.example.com"
54
+ }
55
+ ```
56
+
57
+ ## Configuration Options
58
+
59
+ | Option | Default | Description |
60
+ | ------------------------ | ------------------------- | ---------------------------------------------------------- |
61
+ | `token` | (required) | PAT with `read_api` + `api` scopes |
62
+ | `pollInterval` | `60000` | Poll interval in ms |
63
+ | `baseUrl` | `https://gitlab.com` | GitLab instance URL |
64
+ | `action_prompt_template` | (required for processing) | Maps GitLab action names to metadata templates |
65
+ | `groupPolicy` | `"disabled"` | Must be `"open"`, or `"allowlist"` with the project listed |
66
+ | `senderPolicy` | `"allowlist"` | Who can trigger the bot |
67
+
68
+ ## action_prompt_template
69
+
70
+ This field controls which todo actions are processed and how metadata is rendered. Only actions with a configured template are dispatched; all others are skipped and marked done.
71
+
72
+ ```json
73
+ {
74
+ "action_prompt_template": {
75
+ "mentioned": "Project: %project% | Author: %author% | Title: %title%"
76
+ }
77
+ }
78
+ ```
79
+
80
+ The `directly_addressed` action (comment starting with `@bot`) automatically falls back to the `mentioned` template if not explicitly configured.
81
+
82
+ ### Available Action Keys
83
+
84
+ | Key | Trigger |
85
+ | --------------------- | ------------------------------------------------------------------------ |
86
+ | `mentioned` | Someone @mentions the bot in a comment or description (not at the start) |
87
+ | `directly_addressed` | A comment **starts with** `@bot` (falls back to `mentioned` template) |
88
+ | `assigned` | Someone assigns the bot to an issue/MR |
89
+ | `review_requested` | Someone requests the bot as a reviewer on an MR |
90
+ | `approval_required` | An MR requires the bot's approval (approval rules) |
91
+ | `marked` | Someone marks the bot's comment/issue/MR (star) |
92
+ | `build_failed` | A CI/CD pipeline fails on the bot's branch/MR |
93
+ | `unmergeable` | An MR the bot is involved with becomes unmergeable (conflicts) |
94
+ | `merge_train_removed` | An MR is removed from the merge train |
95
+
96
+ Only keys present in `action_prompt_template` are processed. Unconfigured actions are skipped and marked done silently.
97
+
98
+ ### Template Variables
99
+
100
+ | Variable | Value |
101
+ | --------------- | --------------------------------- |
102
+ | `%project%` | Project path (e.g., `owner/repo`) |
103
+ | `%project_url%` | Full project URL |
104
+ | `%author%` | Todo author username |
105
+ | `%target_type%` | `Issue` or `MergeRequest` |
106
+ | `%iid%` | Issue/MR internal ID |
107
+ | `%title%` | Issue/MR title |
108
+ | `%description%` | Issue/MR description body |
109
+ | `%todo_id%` | GitLab todo ID |
110
+ | `%%` | Literal `%` (escape) |
111
+
112
+ Unknown variables are preserved as-is in the output.
113
+
114
+ ### Prompt Assembly
115
+
116
+ The template renders into `envelope.metadata` (structured context). The triggering text (`todo.body` or description) goes into `envelope.text` (primary prompt). The base class assembles the final prompt sent to the agent:
117
+
118
+ ```
119
+ [alice] please fix this bug
120
+
121
+ Project: owner/repo | URL: https://gitlab.com/owner/repo | Author: alice | Type: Issue | IID: 42 | Title: Test Issue | Description: ... | TodoID: 100
122
+ ```
123
+
124
+ - Line 1: `[sender]` prefix + `envelope.text` (with `@bot` stripped)
125
+ - Line 3: `envelope.metadata` (rendered template, sanitized)
126
+
127
+ You do **not** need a `%body%` variable — the comment/description text is always the primary prompt content, and the template provides supplementary context below it.
128
+
129
+ ## ⚠️ Security
130
+
131
+ On a **public project**, setting `senderPolicy: "open"` allows **any GitLab user** who @mentions the bot to submit prompts that drive the agent in your `cwd`.
132
+
133
+ Always use `senderPolicy: "allowlist"` with explicit `allowedUsers` on public projects.
134
+
135
+ ## Mention Detection
136
+
137
+ The adapter always sets `isMentioned = true` on dispatched envelopes, because GitLab has already determined the mention when creating the todo. The `action_prompt_template` config is the real event filter — only actions with a configured template are processed. The `@bot` mention is stripped from the message text before dispatch via `stripBotMention`.
138
+
139
+ ### ⚠️ groupPolicy Must Be "open" or "allowlist"
140
+
141
+ `groupPolicy` must be set to `"open"`, or `"allowlist"` with the project explicitly listed, for todos to be processed. The default value `"disabled"` drops all mentions: todos are marked done and the cursor advances, but no dispatch occurs. A rejection is logged (`preflight rejected reason=group_disabled`) but the todo is still consumed. If your bot is not responding to mentions, check that `groupPolicy` is not `"disabled"`.
142
+
143
+ ## How It Works
144
+
145
+ The adapter uses GitLab's Todos API as the message source:
146
+
147
+ 1. **Poll** `GET /todos?state=pending` for new todos
148
+ 2. **First-poll drain**: if the cursor has never been initialized (`initialized: false`), all pending todos are marked done without dispatch and the cursor advances to the max todo ID. This prevents a backlog flood on first start.
149
+ 3. **Clean up stale todos**: todos with `id <= cursor` are marked done (best-effort) to prevent them from being re-fetched on every poll
150
+ 4. **Filter** by `id > cursor` and configured `action_prompt_template`
151
+ 5. **Detect mention type** via `target_url` anchor:
152
+ - `#note_123` present → comment mention → text is `todo.body` (the comment)
153
+ - No anchor → description mention → text is the issue/MR description
154
+ 6. **Dispatch** the envelope through `handleInbound` (requires `groupPolicy: "open"` or `"allowlist"` with the project listed)
155
+ 7. **Advance cursor** and **mark todo done** (best-effort)
156
+
157
+ The cursor (`lastProcessedId`) advances regardless of dispatch success or failure. Failed dispatches post a ⚠️ error comment on the issue/MR and are not retried — the user can re-mention the bot to trigger a new todo.
158
+
159
+ ## Known Limitations
160
+
161
+ - **First start skips existing pending todos.** The cursor initializes to `{ lastProcessedId: 0, initialized: false }` on first launch. On the first poll cycle, all pre-existing pending todos are marked done without dispatch (the `initialized` flag gates this one-time drain), preventing a backlog flood.
162
+ - The bot does not read prior conversation history — only the triggering content is processed.
163
+ - **Confidential (internal) notes:** If someone @mentions the bot in a confidential note, the todo body contains that internal text and the agent will process it. The bot's reply is always posted as a **public** note, potentially exposing internal discussion. GitLab's todo API does not expose note visibility, so the adapter cannot filter this. Avoid @mentioning the bot in confidential notes.
164
+ - Requires `read_api` + `api` PAT scopes. Group-level or project-level tokens work if they have these scopes.
165
+ - Todos for Epics, Designs, and Alerts are skipped (only Issues and MRs are processed).
166
+
167
+ ## Starting the Channel
168
+
169
+ ```bash
170
+ qwen channel start my-gitlab
171
+ ```
@@ -277,6 +277,26 @@ The deterministic halves of the pipeline — argument parsing (`qwen review pars
277
277
 
278
278
  Every run ends with one machine-readable line (`Review complete: <target> — <disposition>`), so scripts and CI wrappers can detect completion and outcome with a single `^Review complete: ` match.
279
279
 
280
+ ## Headless runs (`qwen review run`)
281
+
282
+ `/review` is interactive. When a script or CI job needs to run a review and act on its outcome, use the headless wrapper:
283
+
284
+ ```bash
285
+ qwen review run [target] [--json] [--fail-on request-changes] [--comment] [--quiet]
286
+ ```
287
+
288
+ `target` is a PR number, a PR URL, or a file path; omit it to review the local working tree. The command runs this build's own CLI non-interactively (with stdin closed, so slash-command detection survives), streams the child's progress to **stderr**, and prints the verdict to **stdout** — or, with `--json`, the full result object. The verdict is read from the artifact `compose-review` writes (the same JSON the skill treats as the verdict authority), never parsed from the model's prose.
289
+
290
+ The exit code is the contract a gate should read:
291
+
292
+ | Exit | Meaning |
293
+ | ---- | ------------------------------------------------------------------------------------------------- |
294
+ | `0` | The review completed (whatever it decided) |
295
+ | `1` | It never reached a verdict — the child failed, timed out, or left no composed artifact |
296
+ | `3` | It completed with `REQUEST_CHANGES` **and** `--fail-on request-changes` was set (opt-in blocking) |
297
+
298
+ `3` (not `2`) lets a gate distinguish "the review is blocking" from "the tool broke" — yargs already uses `1` for usage errors — without parsing any output. `--timeout-minutes` (default 120, floored at 1) terminates a hung review and exits `1`, and cancelling the command (Ctrl+C / SIGTERM) terminates the review's process group rather than orphaning it.
299
+
280
300
  ## Cross-file Impact Analysis
281
301
 
282
302
  A dedicated cross-file tracer (Agent 1c) owns this walk end-to-end. When code changes modify exported functions, classes, or interfaces, it searches for all callers and checks compatibility:
@@ -103,6 +103,24 @@ HTTP hooks send hook input as POST requests to specified URLs. They support URL
103
103
  - **DNS Validation**: Validates domain resolution before requests to prevent DNS rebinding attacks
104
104
  - **Environment Variable Interpolation**: `${VAR}` syntax, only allows variables in `allowedEnvVars` whitelist
105
105
 
106
+ #### Allowing private-network hooks (managed environments only)
107
+
108
+ By default, HTTP hooks cannot target private or link-local IP ranges. In platform-managed environments where the hook receiver is a first-party, VPC-internal endpoint (for example, an internal API gateway resolving to `172.16.0.0/12`), you can relax the IP-range checks with:
109
+
110
+ ```json
111
+ {
112
+ "security": {
113
+ "allowPrivateNetworkHooks": true
114
+ }
115
+ }
116
+ ```
117
+
118
+ - This setting is **only honored from User, System, and SystemDefaults settings scopes**. A value set in Workspace (project) settings is ignored and logged as a warning, so a cloned repository can never self-grant this bypass.
119
+ - The flag relaxes only the general private/CGNAT/link-local **range** checks. Cloud metadata endpoints stay blocked in every configuration: the `BLOCKED_HOSTS` list is matched literally (`metadata.google.internal`, `metadata.azure.internal`, ...), and the metadata IPs `169.254.169.254` and `100.100.100.200` are blocked in all serialized forms (including IPv4-mapped IPv6 such as `::ffff:a9fe:a9fe`) and after DNS resolution.
120
+ - The `security.allowedHttpHookUrls` whitelist still applies independently. In managed environments, pair this flag with a whitelist so only the intended internal endpoints are reachable.
121
+
122
+ > **Warning:** Enabling this flag lets hooks reach internal infrastructure on your network. Enable it only in trusted, managed settings — never in a repository you do not control.
123
+
106
124
  **Example:**
107
125
 
108
126
  ```json
@@ -539,6 +557,8 @@ Sequential UserPromptSubmit hooks can append `additionalContext` to `prompt`; `s
539
557
  - `reason`: human-readable explanation for the decision
540
558
  - `hookSpecificOutput.additionalContext`: additional context to append to the prompt (optional)
541
559
 
560
+ When sent to the model, injected `additionalContext` is appended as its own message part wrapped in a reserved `<qwen:user-prompt-submit-context>...</qwen:user-prompt-submit-context>` tag, so it stays distinguishable from user-authored text in model history and session transcripts. Angle brackets in hook output are escaped before wrapping, so hook content cannot close or forge the tag. The session transcript also records the user's original prompt text separately; the interactive TUI and the ACP/export transcript-replay path display that original text rather than the injected context.
561
+
542
562
  **Note**: Since UserPromptSubmitOutput extends HookOutput, all standard fields are available but only additionalContext in hookSpecificOutput is specifically defined for this event.
543
563
 
544
564
  **Example Output**:
@@ -25,14 +25,28 @@ Only `subagent_type: "fork"` accepts `fork_turns`:
25
25
 
26
26
  Tool responses and pure system reminders do not count as user turns. Regular named subagents and agent-team teammates do not accept `fork_turns`; they keep their separate conversation context.
27
27
 
28
+ ## Restricting Fork Tool Execution with `fork_tools`
29
+
30
+ Only `subagent_type: "fork"` accepts `fork_tools`. The array may contain exact canonical tool names, such as `read_file` and `grep_search`, or MCP server patterns such as `mcp__github`. The fork still receives the same model-visible tool declarations as an unrestricted fork, preserving its prompt-cache prefix, but its task prompt identifies the restriction and a call not matched by `fork_tools` is rejected before scheduling or approval.
31
+
32
+ - Omitting `fork_tools` preserves unrestricted fork execution.
33
+ - An empty array rejects every tool call.
34
+ - `*` is not accepted; omit `fork_tools` when unrestricted execution is intended.
35
+ - Tool names cannot have surrounding whitespace. Wildcards are accepted only as `mcp__*` or as a trailing MCP tool-prefix pattern such as `mcp__github__read_*`.
36
+ - `mcp__*` intentionally allows every MCP tool while still denying unlisted built-in tools.
37
+ - Shell command argument patterns are not supported. Listing `run_shell_command` allows that tool to proceed through its normal permission checks but does not pre-approve any command.
38
+
39
+ This is a per-invocation restriction supplied by the caller. It narrows a child fork's capabilities but is not an administrator-enforced security sandbox because the caller can omit or expand the list.
40
+
28
41
  ### How Fork Differs from Named Subagents
29
42
 
30
- | | Named Subagent | Fork Subagent |
31
- | ------------- | -------------------------------------------------------------- | --------------------------------------------------------------------------------------- |
32
- | Context | Starts fresh with no parent conversation history | Inherits all parent history by default; `fork_turns` can select a bounded recent window |
33
- | System prompt | Uses its own configured prompt | Uses parent's exact system prompt (for cache sharing) |
34
- | Execution | Background by default; supports an explicit foreground opt-out | Always detached; parent continues immediately |
35
- | Use case | Specialized tasks (testing, docs) | Parallel tasks that need the current context |
43
+ | | Named Subagent | Fork Subagent |
44
+ | ------------- | -------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- |
45
+ | Context | Starts fresh with no parent conversation history | Inherits all parent history by default; `fork_turns` can select a bounded recent window |
46
+ | System prompt | Uses its own configured prompt | Uses parent's exact system prompt (for cache sharing) |
47
+ | Tools | Configured declaration set | Keeps the parent-derived declaration set; `fork_tools` can independently narrow execution without changing that set |
48
+ | Execution | Background by default; supports an explicit foreground opt-out | Always detached; parent continues immediately |
49
+ | Use case | Specialized tasks (testing, docs) | Parallel tasks that need the current context |
36
50
 
37
51
  ### When Fork is Used
38
52
 
@@ -46,9 +60,9 @@ The AI automatically uses fork when it needs to:
46
60
 
47
61
  All forks share the parent's exact API request prefix (system prompt, tools, conversation history), enabling DashScope prompt cache hits. When 3 forks run in parallel, the shared prefix is cached once and reused — saving 80%+ token costs compared to independent subagents.
48
62
 
49
- ### Recursive Fork Prevention
63
+ ### Recursive Delegation Prevention
50
64
 
51
- Fork children cannot create further forks. This is enforced at runtime — if a fork attempts to spawn another fork, it receives an error instructing it to execute tasks directly.
65
+ Fork children cannot spawn any further sub-agent. This is enforced at runtime — if a fork calls the Agent tool, it receives an error instructing it to execute tasks directly.
52
66
 
53
67
  ### Current Limitation
54
68
 
@@ -218,17 +218,19 @@ remediation.
218
218
 
219
219
  The daemon also exposes workspace file helpers:
220
220
 
221
- - `GET /file` reads text files and returns a raw-byte `sha256:<hex>` hash.
221
+ - `GET /file` reads text files. Full-snapshot responses return a raw-byte
222
+ `sha256:<hex>` hash; finite-line windows from files above 256 KiB omit it.
222
223
  - `GET /file/bytes` reads bounded raw byte windows and returns base64 content.
223
224
  - `POST /file/write` creates or replaces text files.
224
225
  - `POST /file/edit` applies one exact text replacement.
225
226
 
226
227
  Write/edit are **strict mutation routes**: even on loopback they require a
227
228
  configured bearer token, otherwise they return `token_required`. Replacements
228
- and edits require the latest `expectedHash` from `GET /file` (or a full-window
229
- `GET /file/bytes`). `create` never overwrites. Explicit writes to ignored paths
230
- are allowed but audited. Binary writes, delete/move/mkdir, and recursive parent
231
- creation are not part of this surface.
229
+ and edits require the latest `expectedHash` from a full-snapshot `GET /file`
230
+ (or a full-window `GET /file/bytes`). A partial large-file window cannot be
231
+ used as an optimistic-concurrency token. `create` never overwrites. Explicit
232
+ writes to ignored paths are allowed but audited. Binary writes,
233
+ delete/move/mkdir, and recursive parent creation are not part of this surface.
232
234
 
233
235
  ### 3. Open a session
234
236
 
@@ -444,7 +444,7 @@ An agent that finds nothing must say so **and say what it walked** — `No issue
444
444
  | `4` | **Performance & efficiency.** N+1s, leaks, needless re-renders, bad data structures, bundle size. **Reproduces the PR's claimed numbers** rather than trusting them — confirms a cheap deterministic claim (bundle bytes, tree-shake) or flags an unreproducible/unsubstantiated benchmark as unverified. |
445
445
  | `5` | **Test coverage.** Specific untested paths in the diff, never "coverage is low"; a missing test is a Suggestion. **Mutation-tests the tests the diff adds/changes** — a test that stays green when the code under it is broken is vacuous — a Suggestion, Critical only when it asserts the opposite, was weakened in-diff, or lets a named incorrect behaviour ship (report the behaviour, not the gap). |
446
446
  | `6a` `6b` `6c` | **Undirected audit, three personas** — attacker, 3 AM oncall, six-months-later maintainer. The framings force diverse paths; the union of what they find is the point, so all three run. |
447
- | `7` | **Build & test verification** (needs a local tree). Runs _one_ build and _one_ test command, and the **test-efficacy probe** — which reverts the diff's source, keeps its tests, and reports the ones that pass anyway. Its evidence is the commands it ran. `Source: [build]` / `[test]`, never `[review]`. |
447
+ | `7` | **Build & test verification** (needs a local tree). Runs _one_ build and _one_ test command, and the **test-efficacy probe** — which reverts the diff's source, keeps its tests, and reports the ones that pass anyway, and deletes individual added safety statements (mutants) to find the ones no test notices. Its evidence is the commands it ran. `Source: [build]` / `[test]`, never `[review]`. |
448
448
  | `test-matrix` | **Test coverage matrix** (Step 3B). Maps each behavioural change to the test that exercises it — the pairing a territory agent cannot see, because it holds either the implementation or the test, rarely both. |
449
449
  | `invariant-a` `invariant-b` `invariant-c` | **Whole-file invariants** on a `heavy` file, one checklist slice each: (a) mutable fields, timers, collections; (b) retry counters, ignored return values, error taxonomies; (c) config fields, early returns. |
450
450
 
@@ -4,71 +4,75 @@ import {
4
4
  MINIMUM_MAX_HEIGHT,
5
5
  MaxSizedBox,
6
6
  setMaxSizedBoxDebugging
7
- } from "./chunk-U3E3UQAA.js";
8
- import "./chunk-GKX7E4CO.js";
7
+ } from "./chunk-FS674JW4.js";
8
+ import "./chunk-45IOTAUS.js";
9
9
  import "./chunk-SV5PQVQE.js";
10
- import "./chunk-GATT5TKW.js";
11
- import "./chunk-UWMLWVCA.js";
10
+ import "./chunk-2IIJTXYF.js";
11
+ import "./chunk-IGTHU3T4.js";
12
12
  import "./chunk-5QWWOFGG.js";
13
13
  import "./chunk-YDLJGZHL.js";
14
14
  import "./chunk-2MIN6GRR.js";
15
15
  import "./chunk-QHTIBUWB.js";
16
16
  import "./chunk-RKUWKYED.js";
17
- import "./chunk-X5WNMMIA.js";
17
+ import "./chunk-54YCNSK5.js";
18
+ import "./chunk-5M6IDOMF.js";
18
19
  import "./chunk-TWPJO254.js";
19
20
  import "./chunk-H6XPXXMH.js";
20
- import "./chunk-5M6IDOMF.js";
21
- import "./chunk-UPUG4GXM.js";
22
- import "./chunk-64LQLPL7.js";
23
- import "./chunk-2LQTH543.js";
21
+ import "./chunk-AOHY3QJ3.js";
22
+ import "./chunk-5NNHICSA.js";
23
+ import "./chunk-SHN4KHDK.js";
24
+ import "./chunk-JXVC2PL3.js";
24
25
  import "./chunk-KRXPRVGL.js";
25
- import "./chunk-BMFALVGQ.js";
26
- import "./chunk-CVHIL5IG.js";
26
+ import "./chunk-6PVPNMXU.js";
27
+ import "./chunk-ZMOJ7ISP.js";
27
28
  import "./chunk-IRH27ZC2.js";
28
29
  import "./chunk-QHWCP53L.js";
29
- import "./chunk-PONHVBRT.js";
30
+ import "./chunk-TEGJSJDF.js";
31
+ import "./chunk-TIRRPCFS.js";
32
+ import "./chunk-O6GEWCJA.js";
30
33
  import "./chunk-T26EAKDL.js";
31
- import "./chunk-6PVPNMXU.js";
32
34
  import "./chunk-CPBF7KYF.js";
33
- import "./chunk-6QIGFD5W.js";
34
- import "./chunk-XWWKIXVD.js";
35
- import "./chunk-75GFAX4R.js";
36
- import "./chunk-OKF7JF3R.js";
37
- import "./chunk-JSD33JG6.js";
35
+ import "./chunk-4KP2F2TE.js";
36
+ import "./chunk-3APUUXRF.js";
37
+ import "./chunk-THVU3RNH.js";
38
+ import "./chunk-LHKCY7DY.js";
39
+ import "./chunk-6FMJLI5M.js";
40
+ import "./chunk-CBBP4BMC.js";
38
41
  import "./chunk-S6LOFUVP.js";
39
- import "./chunk-JCW2R7WC.js";
40
- import "./chunk-2DN4J57Y.js";
42
+ import "./chunk-K623ENWT.js";
43
+ import "./chunk-AQ37AY7B.js";
44
+ import "./chunk-N4ACHWNH.js";
41
45
  import "./chunk-ZPJWUGCS.js";
42
- import "./chunk-2LKVPASC.js";
46
+ import "./chunk-D4HTUMGX.js";
43
47
  import "./chunk-NAVJD2PQ.js";
44
- import "./chunk-LW3RFMG7.js";
45
- import "./chunk-W4MIWP6M.js";
48
+ import "./chunk-LOY7RWQG.js";
49
+ import "./chunk-E6CJ2SMM.js";
46
50
  import "./chunk-DGEIYUC3.js";
47
51
  import "./chunk-MPHPFVKK.js";
48
52
  import "./chunk-GLNBDYUX.js";
49
53
  import "./chunk-DJ2GSRLV.js";
50
- import "./chunk-5KTQXHPY.js";
51
- import "./chunk-75MIQ3LV.js";
54
+ import "./chunk-6CQWRWUC.js";
55
+ import "./chunk-Z3S5EMOW.js";
52
56
  import "./chunk-2J3OJGTL.js";
53
57
  import "./chunk-P3QQPMQA.js";
54
- import "./chunk-RPLGZJV2.js";
58
+ import "./chunk-XQK4XXTN.js";
55
59
  import "./chunk-GLCZKT5V.js";
56
- import "./chunk-DZLYR4U3.js";
57
- import "./chunk-PT722TDT.js";
60
+ import "./chunk-QDK4F2N5.js";
61
+ import "./chunk-DUNI4EBW.js";
58
62
  import "./chunk-VGC4I5JJ.js";
59
- import "./chunk-SGFT55XI.js";
60
- import "./chunk-Y4IHBGBP.js";
61
- import "./chunk-Y6AXW2OG.js";
62
- import "./chunk-VCPIZRYH.js";
63
+ import "./chunk-3I6DUGQD.js";
64
+ import "./chunk-7ULQIS27.js";
65
+ import "./chunk-MM7TH7ZM.js";
66
+ import "./chunk-HIVKI6O6.js";
63
67
  import "./chunk-46UV252V.js";
64
68
  import "./chunk-ZBVS26BY.js";
65
- import "./chunk-WZRWHXFE.js";
66
- import "./chunk-A3NDJ5SB.js";
67
- import "./chunk-7XATOOE7.js";
68
- import "./chunk-BGTQCTQW.js";
69
+ import "./chunk-Q3T5KA2V.js";
70
+ import "./chunk-R2XWGR75.js";
71
+ import "./chunk-HC45LTEN.js";
72
+ import "./chunk-QARJNL2V.js";
69
73
  import "./chunk-W4RQUHY3.js";
70
- import "./chunk-S7W2GKIO.js";
71
- import "./chunk-UHUSJ6X7.js";
74
+ import "./chunk-G7XXKQYS.js";
75
+ import "./chunk-E2BHWIDT.js";
72
76
  import "./chunk-VOQXFAY5.js";
73
77
  import "./chunk-75DOP5OR.js";
74
78
  import "./chunk-DMTGGOSA.js";