@qwen-code/qwen-code 0.20.2-jobbench-no-todo-write.0 → 0.21.0

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 (370) hide show
  1. package/bundled/qc-helper/docs/configuration/settings.md +5 -0
  2. package/bundled/qc-helper/docs/features/sub-agents.md +23 -5
  3. package/bundled/qc-helper/docs/integration-github-action.md +9 -9
  4. package/bundled/review/SKILL.md +7 -3
  5. package/chunks/MaxSizedBox-5DPPWPGT.js +85 -0
  6. package/chunks/{StandaloneSessionPicker-WBRBHD2M.js → StandaloneSessionPicker-BIRMPLRD.js} +66 -58
  7. package/chunks/{acp-startup-profiler-N3RHHXJ3.js → acp-startup-profiler-RV3IV562.js} +2 -2
  8. package/chunks/{acpAgent-BBQZ33CA.js → acpAgent-6J2U72PQ.js} +706 -182
  9. package/chunks/agent-6ODUANDO.js +81 -0
  10. package/chunks/agent-headless-7BYQTMHW.js +75 -0
  11. package/chunks/{anthropicContentGenerator-HGWAHO24.js → anthropicContentGenerator-75BKLTSP.js} +117 -43
  12. package/chunks/{artifact-tool-56T5IMBP.js → artifact-tool-Y5T7GG7F.js} +3 -3
  13. package/chunks/{askUserQuestion-E25OBIC2.js → askUserQuestion-2H6747FR.js} +3 -3
  14. package/chunks/bridge-ZUB64FAE.js +90 -0
  15. package/chunks/{build-SSCNEHZZ.js → build-RV63TIRH.js} +2 -3
  16. package/chunks/{ca-N6VVUFVB.js → ca-25EDXPFZ.js} +2 -0
  17. package/chunks/{channel-worker-group-LFBT7K64.js → channel-worker-group-2ZD7TVAT.js} +7 -6
  18. package/chunks/{channel-worker-manager-3RUPERG2.js → channel-worker-manager-4OA4BCGB.js} +189 -29
  19. package/chunks/{channel-worker-supervisor-A3KVATD3.js → channel-worker-supervisor-V7KCFJTS.js} +6 -5
  20. package/chunks/{chunk-TYQMGACW.js → chunk-22C7BQ6D.js} +508 -10967
  21. package/chunks/chunk-2JZBVYTU.js +452 -0
  22. package/chunks/{chunk-H2XVO6NE.js → chunk-2MIN6GRR.js} +1 -1
  23. package/chunks/{chunk-B2HSPMD4.js → chunk-2NH6DYI4.js} +12 -12
  24. package/chunks/chunk-2SCDWPXI.js +246 -0
  25. package/chunks/{chunk-JK26TQON.js → chunk-2X55UKQE.js} +3 -3
  26. package/chunks/{chunk-7VUQQBR7.js → chunk-3QMGYBFN.js} +2 -65
  27. package/chunks/{chunk-UMCULC5M.js → chunk-3RN6GBKS.js} +1 -1
  28. package/chunks/{chunk-QR6U5QPP.js → chunk-3SJ43L4W.js} +4 -0
  29. package/chunks/chunk-46UV252V.js +128 -0
  30. package/chunks/{chunk-GPMVHZP4.js → chunk-4WIZGAH3.js} +7 -7
  31. package/chunks/{chunk-CI3GWKGJ.js → chunk-55DJUCI2.js} +87 -29
  32. package/chunks/{chunk-QNLNLENL.js → chunk-5I2IWRSH.js} +2 -2
  33. package/chunks/{chunk-D7WXIW7H.js → chunk-5NBDS5S6.js} +145 -5
  34. package/chunks/{chunk-E4IMU4Y5.js → chunk-63P4EL5V.js} +1 -1
  35. package/chunks/chunk-6FGBXPWM.js +293 -0
  36. package/chunks/{chunk-NEEB7UEN.js → chunk-6GMVPFB2.js} +153 -72
  37. package/chunks/{chunk-KWK7UE6L.js → chunk-6OUGMXDC.js} +6 -6
  38. package/chunks/{chunk-QRUIS3DN.js → chunk-6PEXNQTX.js} +22 -1
  39. package/chunks/{chunk-77OZOGPT.js → chunk-7JURR4JT.js} +1 -1
  40. package/chunks/{chunk-4MWNZNJ4.js → chunk-7MVVZO4N.js} +4 -4
  41. package/chunks/{chunk-6ZBPS62S.js → chunk-7ZCNENPP.js} +1 -1
  42. package/chunks/{chunk-6X4GWOPW.js → chunk-A5L3JMUA.js} +1 -1
  43. package/chunks/{chunk-B3I77W5J.js → chunk-ACY3A37B.js} +3 -3
  44. package/chunks/chunk-AMDSOFFV.js +10860 -0
  45. package/chunks/{chunk-RV4C2ZFG.js → chunk-BIQWWWJN.js} +1 -1
  46. package/chunks/{chunk-ZHERRXZJ.js → chunk-BJX6ZSUK.js} +4 -4
  47. package/chunks/chunk-BK2UNYWD.js +29 -0
  48. package/chunks/{chunk-7TLUW4ZE.js → chunk-BKHWX6I2.js} +3 -3
  49. package/chunks/chunk-BPJSQIJX.js +100 -0
  50. package/chunks/{chunk-M7WBGLYP.js → chunk-BULDBTYC.js} +2 -0
  51. package/chunks/{chunk-H4A4A2SY.js → chunk-CIKQ7KKO.js} +4625 -8645
  52. package/chunks/{chunk-QZJY47IE.js → chunk-D3UEZIQH.js} +7 -5
  53. package/chunks/chunk-DHHOYAPR.js +1462 -0
  54. package/chunks/{chunk-LESHKUWF.js → chunk-DLWL3Z7A.js} +5 -3
  55. package/chunks/{chunk-XHATNRQA.js → chunk-DP3IHZGG.js} +0 -2
  56. package/chunks/chunk-E5TUC6CA.js +479 -0
  57. package/chunks/{chunk-6NRFYMKG.js → chunk-EBJQ6AXW.js} +11 -10
  58. package/chunks/{chunk-HABKX6LY.js → chunk-EPDRMGT4.js} +164 -17
  59. package/chunks/{chunk-P2BQZ7H7.js → chunk-ETSW4KLJ.js} +2 -2
  60. package/chunks/{chunk-KHOVYUHX.js → chunk-FNQ6T3CV.js} +20 -3
  61. package/chunks/{chunk-64EG42HV.js → chunk-FQK6JAFG.js} +72 -23
  62. package/chunks/{chunk-L6U47G5P.js → chunk-FSITMZJH.js} +8 -8
  63. package/chunks/{chunk-6RLROE6G.js → chunk-GLWP3FDB.js} +80 -15
  64. package/chunks/{chunk-CXIOPXRR.js → chunk-GSN55ZRI.js} +5 -5
  65. package/chunks/{chunk-LVA5OHQO.js → chunk-H4SBPHSA.js} +3 -3
  66. package/chunks/chunk-H5FFA6TH.js +902 -0
  67. package/chunks/{chunk-TDKQP3M6.js → chunk-HIJQF5B5.js} +1 -1
  68. package/chunks/{chunk-NXE6SQIV.js → chunk-IJTOWOD7.js} +14 -3
  69. package/chunks/chunk-IKCX4CCL.js +469 -0
  70. package/chunks/{chunk-7SSWNGEJ.js → chunk-IKYJHJNF.js} +3 -3
  71. package/chunks/{chunk-64XKYOXK.js → chunk-IO3IX5Q4.js} +1 -1
  72. package/chunks/{chunk-RS7MT2QG.js → chunk-IPUUTYMV.js} +2 -4
  73. package/chunks/{chunk-XU457J4V.js → chunk-IRH27ZC2.js} +2 -2
  74. package/chunks/{chunk-SVIMKSEI.js → chunk-J24WCGIN.js} +4 -4
  75. package/chunks/{chunk-4LVZNIDO.js → chunk-J56UI34H.js} +4 -13
  76. package/chunks/{chunk-TJTKSVIV.js → chunk-JLU636DO.js} +5 -1
  77. package/chunks/{chunk-7PIL2BYF.js → chunk-JVPM2ULZ.js} +6 -6
  78. package/chunks/{chunk-KBB5O3JO.js → chunk-JXJFVC6E.js} +37 -18
  79. package/chunks/chunk-JZA3JUDJ.js +82 -0
  80. package/chunks/{chunk-45PO6ZIS.js → chunk-K36B6G2O.js} +5 -5
  81. package/chunks/{chunk-GPSKDNEE.js → chunk-K4XWPEWB.js} +4 -4
  82. package/chunks/{chunk-K7EUPLIP.js → chunk-KIM5GUMA.js} +654 -117
  83. package/chunks/{chunk-42W5BDEY.js → chunk-KMQ33DO4.js} +7 -5
  84. package/chunks/{chunk-E2UVIFI2.js → chunk-KRXPRVGL.js} +0 -1
  85. package/chunks/{chunk-WHGVTP7Q.js → chunk-L26JL52R.js} +3 -3
  86. package/chunks/{chunk-7Z6JQEL6.js → chunk-L5UHQJTJ.js} +1 -1
  87. package/chunks/{chunk-26CBI4DC.js → chunk-LB6DUZ26.js} +259 -67
  88. package/chunks/chunk-LEH5C7FV.js +232 -0
  89. package/chunks/{chunk-UTGFTJ2H.js → chunk-LH2BYDQ5.js} +6 -4
  90. package/chunks/{chunk-QKTHJXCS.js → chunk-LK7CHLVP.js} +79 -2
  91. package/chunks/{chunk-V7WNRZL7.js → chunk-LKEJ26GS.js} +11 -11
  92. package/chunks/{chunk-6VPLV3L3.js → chunk-LQIW3YFY.js} +227 -41
  93. package/chunks/chunk-LS77BEZP.js +405 -0
  94. package/chunks/{chunk-5WDRI7US.js → chunk-M4FMGVY4.js} +3 -3
  95. package/chunks/{chunk-57FIIFJN.js → chunk-M5JM7OSF.js} +1 -1
  96. package/chunks/{chunk-7362QS5B.js → chunk-MB4MZHMJ.js} +80 -37
  97. package/chunks/{chunk-4K56OJFJ.js → chunk-MUP3T3AD.js} +1 -1
  98. package/chunks/{chunk-CJQ3FZ2G.js → chunk-MVSUYZDT.js} +4 -4
  99. package/chunks/{chunk-6FZYKBKV.js → chunk-MZAXJAUM.js} +1 -1
  100. package/chunks/{chunk-32L4D2O2.js → chunk-NH6KE4JX.js} +3 -3
  101. package/chunks/chunk-NIBLUX3Y.js +934 -0
  102. package/chunks/{chunk-OQB4EXO4.js → chunk-NL7LTRLR.js} +1 -1
  103. package/chunks/{chunk-6S5HSCOI.js → chunk-OFDOK3VM.js} +5 -5
  104. package/chunks/{chunk-LIZRAKPB.js → chunk-OHNBB4XR.js} +1 -1
  105. package/chunks/{chunk-MDZTPSXO.js → chunk-OKY7HXPG.js} +2 -2
  106. package/chunks/{chunk-NHDKSOEY.js → chunk-P3QQPMQA.js} +5 -5
  107. package/chunks/{chunk-4SCOLXTD.js → chunk-PC6JANNU.js} +5 -5
  108. package/chunks/{chunk-IWALV67J.js → chunk-PHOF65IG.js} +4300 -1284
  109. package/chunks/{chunk-OQ5SYCPE.js → chunk-PJIZUQVC.js} +2 -2
  110. package/chunks/{chunk-5DTTYNB7.js → chunk-PQNHRFJC.js} +16 -3
  111. package/chunks/{chunk-YM3SZTH4.js → chunk-PR75REBZ.js} +18 -1
  112. package/chunks/{chunk-5XORMWA2.js → chunk-PSOO6YXD.js} +18 -15
  113. package/chunks/{chunk-X6N25LXS.js → chunk-PWTZEM3C.js} +2 -2
  114. package/chunks/{chunk-GSX6P2JW.js → chunk-PWVFN2LF.js} +1 -1
  115. package/chunks/{chunk-AHX6AKPD.js → chunk-Q4M4MDQ4.js} +2 -2
  116. package/chunks/{chunk-3EHJ44GG.js → chunk-QAF7NMK7.js} +1 -1
  117. package/chunks/{chunk-WSYKDFYR.js → chunk-R5AFZNQW.js} +5 -5
  118. package/chunks/{chunk-63DJBU32.js → chunk-RF3EXIHJ.js} +39 -18
  119. package/chunks/{chunk-4K7VDKAD.js → chunk-RHLZR4E5.js} +1 -1
  120. package/chunks/{chunk-SXPSOMQ4.js → chunk-RIBKPMRP.js} +220 -141
  121. package/chunks/{chunk-RVLZCXEE.js → chunk-RWTEFFPU.js} +82 -3
  122. package/chunks/{chunk-ZUTM4LHM.js → chunk-RZIX2G32.js} +1 -1
  123. package/chunks/{chunk-ZKBNRL6O.js → chunk-SQCQ4KO2.js} +336 -404
  124. package/chunks/{chunk-THJNPLI4.js → chunk-TARRHLLG.js} +1 -0
  125. package/chunks/{chunk-RHYFF54J.js → chunk-TEHGS6UP.js} +50 -21
  126. package/chunks/{chunk-ACQJPDDS.js → chunk-TGILQ3YH.js} +8 -8
  127. package/chunks/{chunk-Q2YKNMLS.js → chunk-TOFQCPDC.js} +43 -10
  128. package/chunks/{chunk-ACZIBDYD.js → chunk-TPRQ7RZH.js} +587 -176
  129. package/chunks/{chunk-T4TZQJ7W.js → chunk-TWPJO254.js} +5 -16
  130. package/chunks/{chunk-7MWABCXU.js → chunk-U7M2DMGW.js} +3 -3
  131. package/chunks/{chunk-KQQ757OQ.js → chunk-UDX5OBWR.js} +41 -9
  132. package/chunks/{chunk-SRPZG4ER.js → chunk-USTWD7QV.js} +6 -4
  133. package/chunks/{chunk-NPQDJGKU.js → chunk-UUUTRMI2.js} +1 -1
  134. package/chunks/chunk-UW5EOVUN.js +249 -0
  135. package/chunks/{chunk-6IL7KRLE.js → chunk-VAK25FTU.js} +1 -1
  136. package/chunks/{chunk-TDDFEPBX.js → chunk-VIA5XA4U.js} +5 -2
  137. package/chunks/{chunk-3BJDQVE6.js → chunk-VRYUBFMC.js} +1 -1
  138. package/chunks/{chunk-PLQODS7F.js → chunk-VULLI6WQ.js} +172 -6
  139. package/chunks/{chunk-GN45XAAU.js → chunk-WCXCRJYB.js} +1 -1
  140. package/chunks/{chunk-2LI23QA6.js → chunk-X5XDDSSH.js} +1 -1
  141. package/chunks/{chunk-O32RMIMO.js → chunk-Y34KJKDC.js} +1 -1
  142. package/chunks/{chunk-7ZD5EKXE.js → chunk-YBL3QUDD.js} +2 -2
  143. package/chunks/{chunk-H4AR2JQF.js → chunk-YH6G52F2.js} +3 -3
  144. package/chunks/{chunk-3G3UUMRS.js → chunk-YPE6A4GC.js} +2 -2
  145. package/chunks/{chunk-3F2JUWCH.js → chunk-YX324OPW.js} +1 -1
  146. package/chunks/{chunk-CGIDQG6J.js → chunk-Z2BC6UJ5.js} +3 -3
  147. package/chunks/{chunk-QLJUC7TG.js → chunk-ZD6UTE4A.js} +1 -1
  148. package/chunks/{chunk-ZPWJZHJ2.js → chunk-ZFDTEDCF.js} +6 -6
  149. package/chunks/chunk-ZJHVAS7M.js +289 -0
  150. package/chunks/{chunk-XAGLQITN.js → chunk-ZNAUOR2I.js} +15 -12
  151. package/chunks/{chunk-T2L47JJK.js → chunk-ZOIFNCKL.js} +4 -4
  152. package/chunks/{computer-use-RZ3UUWYW.js → computer-use-SOQ4E3VX.js} +43 -34
  153. package/chunks/{config-utils-SQUBZEQM.js → config-utils-7V7GGIW6.js} +3 -3
  154. package/chunks/contextCommand-JLHYA34Z.js +80 -0
  155. package/chunks/{create-sub-session-AZ77LBL3.js → create-sub-session-IWW2IZ2T.js} +3 -3
  156. package/chunks/{create-sub-session-EQG73FT6.js → create-sub-session-QRJLW5BV.js} +43 -34
  157. package/chunks/{cron-create-KTWJM7QT.js → cron-create-YIID5XAW.js} +6 -6
  158. package/chunks/{cron-delete-2P3I5ULL.js → cron-delete-ZVHYCEP2.js} +5 -5
  159. package/chunks/{cron-list-PXDPGEDQ.js → cron-list-XEGS463Q.js} +5 -5
  160. package/chunks/{daemon-RAPSDJH7.js → daemon-YO6433NF.js} +350 -53
  161. package/chunks/daemon-status-provider-2233Q37D.js +89 -0
  162. package/chunks/{de-4IBXM7CN.js → de-HGRCYDEJ.js} +1 -0
  163. package/chunks/{dist-UIFWIFRO.js → dist-46NQKLTW.js} +2 -2
  164. package/chunks/{dist-XRYV6TJP.js → dist-AIKFMUKK.js} +50 -4
  165. package/chunks/{dist-XBJVSWS2.js → dist-BBLXMS3N.js} +14 -2
  166. package/chunks/{dist-OMW6WDEO.js → dist-F6IBUDR4.js} +40 -9
  167. package/chunks/{dist-PJLG2XYX.js → dist-WEAHOXDM.js} +1 -1
  168. package/chunks/{dist-OAV7LJGJ.js → dist-YFNEUWSE.js} +26 -2
  169. package/chunks/earlyInputCapture-A7NDU3PF.js +82 -0
  170. package/chunks/{edit-XRSKQPHQ.js → edit-OBDSQURM.js} +43 -34
  171. package/chunks/{en-USMCCJAJ.js → en-MTWBNGDO.js} +15 -0
  172. package/chunks/{enter-worktree-WAHCWE6I.js → enter-worktree-U6MRPQ2P.js} +43 -34
  173. package/chunks/{enterPlanMode-QIOYLDCF.js → enterPlanMode-BC5QUZZ2.js} +43 -34
  174. package/chunks/{environment-T3FXCDJI.js → environment-W5UFC2CH.js} +46 -37
  175. package/chunks/errors-M7CLORXH.js +88 -0
  176. package/chunks/{exit-worktree-RHVTLX6T.js → exit-worktree-DGNYMECB.js} +43 -34
  177. package/chunks/{exitPlanMode-UATOE2GQ.js → exitPlanMode-GXTBWQAR.js} +43 -34
  178. package/chunks/{fast-path-J3RHOYSZ.js → fast-path-JJZFJANL.js} +6 -6
  179. package/chunks/{fast-path-settings-XB3CPUJT.js → fast-path-settings-WQJU2LAT.js} +2 -2
  180. package/chunks/{fr-WVHEBDDB.js → fr-45RLL55O.js} +1 -0
  181. package/chunks/{gemini-P72OGOH6.js → gemini-QS36EBZV.js} +133 -102
  182. package/chunks/{geminiContentGenerator-F6EG5FXF.js → geminiContentGenerator-AG4KB6CV.js} +14 -8
  183. package/chunks/{getMachineId-bsd-QFVLPUPT.js → getMachineId-bsd-V7W3GODC.js} +1 -1
  184. package/chunks/{getMachineId-darwin-DGMQQE2E.js → getMachineId-darwin-TDO75DQP.js} +1 -1
  185. package/chunks/{getMachineId-linux-R4Z6CSWC.js → getMachineId-linux-TF43WQT2.js} +1 -1
  186. package/chunks/{getMachineId-unsupported-Z3SBVBUV.js → getMachineId-unsupported-ZGUO3TXT.js} +1 -1
  187. package/chunks/{getMachineId-win-SCK5UFDT.js → getMachineId-win-ECFYZZFQ.js} +1 -1
  188. package/chunks/{glob-WHASQZRX.js → glob-V7R3PSK3.js} +43 -34
  189. package/chunks/{grep-LS7AADJ3.js → grep-QYPSK7OP.js} +43 -34
  190. package/chunks/handleAutoUpdate-6DBEZYPV.js +81 -0
  191. package/chunks/{i18n-IMVASWIF.js → i18n-VUJJZIMU.js} +44 -35
  192. package/chunks/image-gen-Z3VPGKRC.js +240 -0
  193. package/chunks/initializer-UWAK5U5O.js +86 -0
  194. package/chunks/installationInfo-6O2YAA52.js +80 -0
  195. package/chunks/{ja-KY4ROZTE.js → ja-B7DF7DFG.js} +1 -0
  196. package/chunks/{keychain-token-storage-6ACJDYIB.js → keychain-token-storage-MDTG3WRM.js} +3 -3
  197. package/chunks/{kittyProtocolDetector-HCNNKJTI.js → kittyProtocolDetector-MBRTDRBK.js} +5 -3
  198. package/chunks/list-GB4ESM3T.js +89 -0
  199. package/chunks/list-agents-5KJJHR6I.js +80 -0
  200. package/chunks/loadedSettingsAdapter-OT6JVQ7U.js +83 -0
  201. package/chunks/loggingContentGenerator-HS3S5H3Q.js +1077 -0
  202. package/chunks/{loop-wakeup-RNMRVA66.js → loop-wakeup-FXKNNYSY.js} +7 -7
  203. package/chunks/{ls-J2ZI5XYK.js → ls-NTK6VOQJ.js} +5 -5
  204. package/chunks/{lsp-UMS3NUB5.js → lsp-2JI24STP.js} +3 -3
  205. package/chunks/{managed-npm-update-L6UY7OM7.js → managed-npm-update-JYEMMXA3.js} +94 -37
  206. package/chunks/mcp-6DBDJPFU.js +83 -0
  207. package/chunks/{monitor-DXYFB5QD.js → monitor-R3ODH5U6.js} +45 -35
  208. package/chunks/node-UUDY34IG.js +305 -0
  209. package/chunks/nonInteractiveCli-MOYCYBBU.js +141 -0
  210. package/chunks/{notebook-edit-KGD7YJEA.js → notebook-edit-BNOK452R.js} +43 -34
  211. package/chunks/{openaiContentGenerator-C74A2XAU.js → openaiContentGenerator-WMCU3O2H.js} +27 -17
  212. package/chunks/pidfile-TFRZZZIO.js +86 -0
  213. package/chunks/{processUtils-GUT5B4R6.js → processUtils-RT7UNCC2.js} +2 -2
  214. package/chunks/{pt-OK455PLH.js → pt-22Q3FP73.js} +1 -0
  215. package/chunks/{qwenContentGenerator-PT46FQPA.js → qwenContentGenerator-HHCRK4SX.js} +56 -41
  216. package/chunks/{qwenOAuth2-S7DZHUUU.js → qwenOAuth2-OWLB5AKH.js} +14 -27
  217. package/chunks/read-file-APMO3PSX.js +31 -0
  218. package/chunks/{read-mcp-resource-F6HYMDUY.js → read-mcp-resource-4DKQWGHD.js} +3 -3
  219. package/chunks/{record-artifact-7GCFLDD7.js → record-artifact-RQKFYO5B.js} +3 -3
  220. package/chunks/resumeHistoryUtils-6KRYEAWZ.js +91 -0
  221. package/chunks/ripGrep-BEJDEDXW.js +73 -0
  222. package/chunks/{ru-7SPDGMGD.js → ru-FZCNZHDC.js} +1 -0
  223. package/chunks/{run-qwen-serve-QO4PT5NV.js → run-qwen-serve-FU6HEM4J.js} +276 -62
  224. package/chunks/{runtime-EOTXBUM6.js → runtime-XXRRTNP6.js} +55 -44
  225. package/chunks/{scheduler-MAIQ2PHR.js → scheduler-G2ZS2Z7E.js} +43 -34
  226. package/chunks/{sdk-exporters-grpc-ETLH47EP.js → sdk-exporters-grpc-AK3LGHNO.js} +3 -3
  227. package/chunks/{sdk-exporters-http-T3POX73F.js → sdk-exporters-http-FYBSUCPD.js} +6 -6
  228. package/chunks/{sdk-impl-NSLPDH6I.js → sdk-impl-GMVPB7NB.js} +6 -6
  229. package/chunks/{send-message-PYIJ2PZL.js → send-message-Q6OOR6BR.js} +46 -9
  230. package/chunks/serve-7BSTXJ4T.js +89 -0
  231. package/chunks/{server-CBCC3XQC.js → server-4UMH7OIZ.js} +2348 -396
  232. package/chunks/{session-RQUEFQDL.js → session-K3O3Q2SV.js} +107 -88
  233. package/chunks/{settings-QHXCJDSR.js → settings-CR2EWTBA.js} +53 -44
  234. package/chunks/shell-HH3PF3A2.js +83 -0
  235. package/chunks/{skill-WHSGTGKP.js → skill-I3SDA4MB.js} +17 -15
  236. package/chunks/spawnChannel-RWNDBXGA.js +82 -0
  237. package/chunks/{src-F3HKX47D.js → src-GE4TTTML.js} +290 -171
  238. package/chunks/{standalone-update-BKLONSVI.js → standalone-update-Q6WFRZZQ.js} +45 -36
  239. package/chunks/{startInteractiveUI-TNJ37X5W.js → startInteractiveUI-SLZGHRPH.js} +736 -298
  240. package/chunks/{syntheticOutput-H7RTI5KL.js → syntheticOutput-I3757IWH.js} +4 -4
  241. package/chunks/{task-create-7474AJJD.js → task-create-N7WQSGYA.js} +10 -10
  242. package/chunks/{task-list-633HGOIB.js → task-list-FOPULZEP.js} +7 -7
  243. package/chunks/{task-stop-MNUGHPIA.js → task-stop-H6RHXFVQ.js} +4 -4
  244. package/chunks/{task-update-66GQB5LI.js → task-update-M57TFZJT.js} +10 -10
  245. package/chunks/{team-create-LUHJ7ZCC.js → team-create-YJALH5D2.js} +44 -35
  246. package/chunks/{team-delete-BB3CG3QF.js → team-delete-QE2UXJL7.js} +7 -7
  247. package/chunks/{team-plan-approval-X3DYRL6L.js → team-plan-approval-34QFYKGN.js} +43 -34
  248. package/chunks/theme-manager-SWRILQHI.js +77 -0
  249. package/chunks/todoWrite-VQ7FKOHL.js +358 -0
  250. package/chunks/{tool-search-BAWOETUY.js → tool-search-NF7GB6LE.js} +16 -16
  251. package/chunks/total-session-admission-DLHHHLD3.js +84 -0
  252. package/chunks/{tree-sitter-FS4VPMZA.js → tree-sitter-4D7QS7F6.js} +1 -1
  253. package/chunks/{tree-sitter-bash-6B46JJCV.js → tree-sitter-bash-VEJGF5XF.js} +1 -1
  254. package/chunks/{trustedFolders-4UEOIKOF.js → trustedFolders-KHXHY6PY.js} +44 -35
  255. package/chunks/{update-relaunch-WDWABT5P.js → update-relaunch-WBUZJC5O.js} +5 -5
  256. package/chunks/updateCheck-RKL6M5XN.js +92 -0
  257. package/chunks/useAutoAcceptIndicator-CFQ5BUJL.js +93 -0
  258. package/chunks/{validateNonInterActiveAuth-OKUE3JLF.js → validateNonInterActiveAuth-3R223G3R.js} +91 -81
  259. package/chunks/{version-GMUULLWB.js → version-HS7YSFHV.js} +1 -1
  260. package/chunks/{web-fetch-JBWTMPFN.js → web-fetch-NKCSG7ZE.js} +18 -16
  261. package/chunks/{web-search-27COJHJT.js → web-search-S62WAP4S.js} +13 -27
  262. package/chunks/{workflow-5L37J7YF.js → workflow-QAGU5RU4.js} +44 -35
  263. package/chunks/workspace-providers-status-QSVZUETE.js +86 -0
  264. package/chunks/{workspace-registration-store-TYPYXIP6.js → workspace-registration-store-24JMHDGF.js} +2 -2
  265. package/chunks/workspace-registry-UT4RBNBM.js +88 -0
  266. package/chunks/workspace-service-JFWRUS4V.js +98 -0
  267. package/chunks/workspace-skills-status-ZBBKJOI2.js +85 -0
  268. package/chunks/write-file-VHIXW5M7.js +73 -0
  269. package/chunks/{zh-WY5DWYZD.js → zh-LUIGBD55.js} +15 -0
  270. package/chunks/{zh-TW-BM47YBFH.js → zh-TW-F5KG2IYD.js} +15 -0
  271. package/cli-entry.js +10 -1
  272. package/cli.js +13 -13
  273. package/locales/ca.js +2 -0
  274. package/locales/de.js +1 -0
  275. package/locales/en.js +25 -0
  276. package/locales/fr.js +1 -0
  277. package/locales/ja.js +1 -0
  278. package/locales/pt.js +1 -0
  279. package/locales/ru.js +1 -0
  280. package/locales/zh-TW.js +23 -0
  281. package/locales/zh.js +23 -0
  282. package/package.json +3 -3
  283. package/web-shell/assets/{arc-BWFm0SI0.js → arc-DcbWnB9T.js} +1 -1
  284. package/web-shell/assets/{architectureDiagram-3BPJPVTR-CZ_yL-DQ.js → architectureDiagram-3BPJPVTR-kMMF5sud.js} +1 -1
  285. package/web-shell/assets/{blockDiagram-GPEHLZMM-B9F9mJvG.js → blockDiagram-GPEHLZMM-Htl9vTJS.js} +1 -1
  286. package/web-shell/assets/{c4Diagram-AAUBKEIU-BUdwJW5f.js → c4Diagram-AAUBKEIU-BnZnm0mQ.js} +1 -1
  287. package/web-shell/assets/channel-Cq7YKtfC.js +1 -0
  288. package/web-shell/assets/{chunk-2J33WTMH-w4cF-qlF.js → chunk-2J33WTMH-DziB7kDG.js} +1 -1
  289. package/web-shell/assets/{chunk-4BX2VUAB-BXwURxHJ.js → chunk-4BX2VUAB-CmkD8daw.js} +1 -1
  290. package/web-shell/assets/{chunk-55IACEB6-Gem3LalC.js → chunk-55IACEB6-CHAd9A_U.js} +1 -1
  291. package/web-shell/assets/{chunk-727SXJPM-A3ddVojI.js → chunk-727SXJPM-Dqaam3fE.js} +1 -1
  292. package/web-shell/assets/{chunk-AQP2D5EJ-CjHZ5L_R.js → chunk-AQP2D5EJ-D_-saBYM.js} +1 -1
  293. package/web-shell/assets/{chunk-FMBD7UC4-CKgdgcpv.js → chunk-FMBD7UC4-B9r_veWD.js} +1 -1
  294. package/web-shell/assets/{chunk-ND2GUHAM-Cn2Dykjb.js → chunk-ND2GUHAM-B3EaCSpL.js} +1 -1
  295. package/web-shell/assets/{chunk-QZHKN3VN--0SyraC5.js → chunk-QZHKN3VN-CYq8x9mn.js} +1 -1
  296. package/web-shell/assets/classDiagram-4FO5ZUOK-CQ9aC1Tg.js +1 -0
  297. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-CQ9aC1Tg.js +1 -0
  298. package/web-shell/assets/{cose-bilkent-S5V4N54A-CphhAity.js → cose-bilkent-S5V4N54A-D0ng4uiB.js} +1 -1
  299. package/web-shell/assets/{dagre-BM42HDAG-DU--jiKp.js → dagre-BM42HDAG-DCZollQv.js} +1 -1
  300. package/web-shell/assets/{diagram-2AECGRRQ-BzvuZw1Y.js → diagram-2AECGRRQ-Dfk2pWS0.js} +1 -1
  301. package/web-shell/assets/{diagram-5GNKFQAL-D84-49Y0.js → diagram-5GNKFQAL-kX38ltWR.js} +1 -1
  302. package/web-shell/assets/{diagram-KO2AKTUF-DQTq-3_3.js → diagram-KO2AKTUF-CJz2vsXh.js} +1 -1
  303. package/web-shell/assets/{diagram-LMA3HP47-8FTrshzN.js → diagram-LMA3HP47-BvMLZm_7.js} +1 -1
  304. package/web-shell/assets/{diagram-OG6HWLK6-BCjpDBCm.js → diagram-OG6HWLK6-l7kfStkO.js} +1 -1
  305. package/web-shell/assets/{erDiagram-TEJ5UH35-BtRObkmg.js → erDiagram-TEJ5UH35-BSVa8GGT.js} +1 -1
  306. package/web-shell/assets/{flowDiagram-I6XJVG4X-DTrW6oxy.js → flowDiagram-I6XJVG4X-CoawKIXH.js} +1 -1
  307. package/web-shell/assets/{ganttDiagram-6RSMTGT7-BgPNSW6j.js → ganttDiagram-6RSMTGT7-DFUDH0zF.js} +1 -1
  308. package/web-shell/assets/{gitGraphDiagram-PVQCEYII-BTclNgGV.js → gitGraphDiagram-PVQCEYII-Y2pvpT4e.js} +1 -1
  309. package/web-shell/assets/{index-CxA7AqY6.js → index-D0GX0zZf.js} +1 -1
  310. package/web-shell/assets/index-D9haPt0X.css +5 -0
  311. package/web-shell/assets/index-ckX9Pq5k.js +1230 -0
  312. package/web-shell/assets/{infoDiagram-5YYISTIA-DCE4AJt2.js → infoDiagram-5YYISTIA-CU8_zLiX.js} +1 -1
  313. package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-C8iE6q4Y.js → ishikawaDiagram-YF4QCWOH-AVQiV0DU.js} +1 -1
  314. package/web-shell/assets/{journeyDiagram-JHISSGLW-C_dxdyEc.js → journeyDiagram-JHISSGLW-DQ0VSKa3.js} +1 -1
  315. package/web-shell/assets/{kanban-definition-UN3LZRKU-Dw3n1u3w.js → kanban-definition-UN3LZRKU-BqnWqsE_.js} +1 -1
  316. package/web-shell/assets/{linear-C2BF2zJ9.js → linear-BkoihsaA.js} +1 -1
  317. package/web-shell/assets/{mermaid.core-CGTQU3MA.js → mermaid.core-5RJs-31j.js} +5 -5
  318. package/web-shell/assets/{mindmap-definition-RKZ34NQL-BVFZm9ZC.js → mindmap-definition-RKZ34NQL-D33Bxnpd.js} +1 -1
  319. package/web-shell/assets/{pieDiagram-4H26LBE5-Cc-TNN3n.js → pieDiagram-4H26LBE5-BuEAw3BH.js} +1 -1
  320. package/web-shell/assets/{quadrantDiagram-W4KKPZXB-CgW3Rzsi.js → quadrantDiagram-W4KKPZXB-Kox_usEq.js} +1 -1
  321. package/web-shell/assets/{requirementDiagram-4Y6WPE33-BAaj0Y3B.js → requirementDiagram-4Y6WPE33-CNjeUif0.js} +1 -1
  322. package/web-shell/assets/{sankeyDiagram-5OEKKPKP-XJWmekxS.js → sankeyDiagram-5OEKKPKP-BCd2OL_U.js} +1 -1
  323. package/web-shell/assets/{sequenceDiagram-3UESZ5HK-CtRc_0wf.js → sequenceDiagram-3UESZ5HK-CF2ZTsz0.js} +1 -1
  324. package/web-shell/assets/{stateDiagram-AJRCARHV-WCnvMGy5.js → stateDiagram-AJRCARHV-qenSzHtm.js} +1 -1
  325. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-B7W4zlCr.js +1 -0
  326. package/web-shell/assets/{timeline-definition-PNZ67QCA-C9cRx49L.js → timeline-definition-PNZ67QCA-B5DyWdgs.js} +1 -1
  327. package/web-shell/assets/{vennDiagram-CIIHVFJN-BvXOCEt-.js → vennDiagram-CIIHVFJN-DqP4I_o_.js} +1 -1
  328. package/web-shell/assets/{wardley-L42UT6IY-ByafGtzu.js → wardley-L42UT6IY-CJe2e4mg.js} +1 -1
  329. package/web-shell/assets/{wardleyDiagram-YWT4CUSO-CozAnw8x.js → wardleyDiagram-YWT4CUSO-BMDSw-Rr.js} +1 -1
  330. package/web-shell/assets/{xychartDiagram-2RQKCTM6-Camu9Qvq.js → xychartDiagram-2RQKCTM6-BTVZYkxD.js} +1 -1
  331. package/web-shell/index.html +17 -13
  332. package/chunks/MaxSizedBox-HNWBEL5H.js +0 -77
  333. package/chunks/agent-KTMY6SF3.js +0 -72
  334. package/chunks/agent-headless-HJ56ZZOW.js +0 -66
  335. package/chunks/bridge-AMC5AD7W.js +0 -80
  336. package/chunks/chunk-CBOQ3HY7.js +0 -2019
  337. package/chunks/chunk-UHGNAWHK.js +0 -6928
  338. package/chunks/contextCommand-PW4GINQU.js +0 -71
  339. package/chunks/daemon-status-provider-3IWTBWQ3.js +0 -79
  340. package/chunks/earlyInputCapture-TYNI3B6E.js +0 -73
  341. package/chunks/errors-QAWTJTAW.js +0 -79
  342. package/chunks/handleAutoUpdate-V5A3JHOG.js +0 -72
  343. package/chunks/initializer-JJLF5JCJ.js +0 -77
  344. package/chunks/installationInfo-LAWMHQAG.js +0 -71
  345. package/chunks/list-L2ECB6UM.js +0 -80
  346. package/chunks/loadedSettingsAdapter-RLMZ4Z3E.js +0 -74
  347. package/chunks/mcp-E4O7Z6FO.js +0 -74
  348. package/chunks/nonInteractiveCli-GU2UKULE.js +0 -131
  349. package/chunks/pidfile-IWQWZNZV.js +0 -77
  350. package/chunks/read-file-ZOCXW4AD.js +0 -31
  351. package/chunks/resumeHistoryUtils-TJWRDE2L.js +0 -83
  352. package/chunks/ripGrep-OFKAW2VE.js +0 -64
  353. package/chunks/serve-UB4CF67Q.js +0 -80
  354. package/chunks/shell-RPK7EAOC.js +0 -74
  355. package/chunks/spawnChannel-IUP3ZNMT.js +0 -73
  356. package/chunks/theme-manager-ALL7F4CJ.js +0 -68
  357. package/chunks/total-session-admission-PLONPNXI.js +0 -74
  358. package/chunks/updateCheck-PVROE4GR.js +0 -87
  359. package/chunks/useAutoAcceptIndicator-6BNLNN5S.js +0 -85
  360. package/chunks/workspace-providers-status-2U3IF4TX.js +0 -77
  361. package/chunks/workspace-registry-DLQDDDIF.js +0 -78
  362. package/chunks/workspace-service-7K3LF4QX.js +0 -89
  363. package/chunks/workspace-skills-status-4DOZ3DBS.js +0 -76
  364. package/chunks/write-file-PTPXDKZ3.js +0 -64
  365. package/web-shell/assets/channel-DiLlxxIf.js +0 -1
  366. package/web-shell/assets/classDiagram-4FO5ZUOK-CkylTdM4.js +0 -1
  367. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-CkylTdM4.js +0 -1
  368. package/web-shell/assets/index-CGtQqOIa.css +0 -5
  369. package/web-shell/assets/index-TtM0hVjU.js +0 -1207
  370. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-D1gzH2Ue.js +0 -1
@@ -1,40 +1,36 @@
1
1
  // Force strict mode and setup for ESM
2
2
  "use strict";
3
+ import {
4
+ serveCommand
5
+ } from "./chunk-GSN55ZRI.js";
6
+ import {
7
+ listCommand
8
+ } from "./chunk-7MVVZO4N.js";
9
+ import {
10
+ getErrorMessage as getErrorMessage2
11
+ } from "./chunk-IKYJHJNF.js";
3
12
  import {
4
13
  ObservedChannelContactStore
5
- } from "./chunk-4K7VDKAD.js";
14
+ } from "./chunk-RHLZR4E5.js";
6
15
  import {
7
16
  escapeAnsiCtrlCodes
8
- } from "./chunk-RS7MT2QG.js";
17
+ } from "./chunk-IPUUTYMV.js";
9
18
  import {
10
19
  stringWidth
11
- } from "./chunk-H2XVO6NE.js";
20
+ } from "./chunk-2MIN6GRR.js";
12
21
  import {
13
22
  loadUndici
14
23
  } from "./chunk-3Z43GZUQ.js";
24
+ import {
25
+ resolvePath
26
+ } from "./chunk-ZD6UTE4A.js";
15
27
  import {
16
28
  isLoopbackBind
17
29
  } from "./chunk-RXFQM6FQ.js";
18
- import {
19
- serveCommand
20
- } from "./chunk-CXIOPXRR.js";
21
- import {
22
- listCommand
23
- } from "./chunk-4MWNZNJ4.js";
24
- import {
25
- getErrorMessage as getErrorMessage2
26
- } from "./chunk-7SSWNGEJ.js";
27
- import {
28
- collectProviderModelsForProtocol,
29
- getAuthTypeFromEnv,
30
- resolveCliGenerationConfig
31
- } from "./chunk-42W5BDEY.js";
32
- import {
33
- resolvePath
34
- } from "./chunk-QLJUC7TG.js";
35
30
  import {
36
31
  channelLoopPath,
37
32
  createChannel,
33
+ daemonChannelLoopPath,
38
34
  daemonObservedContactsPath,
39
35
  daemonSessionRoutesPath,
40
36
  loadChannelsConfig,
@@ -46,23 +42,45 @@ import {
46
42
  registerToolCallDispatch,
47
43
  selectFirstModel,
48
44
  sessionsPath
49
- } from "./chunk-5XORMWA2.js";
45
+ } from "./chunk-PSOO6YXD.js";
50
46
  import {
51
47
  getExtensionManager,
52
48
  requestChoicePluginNonInteractive,
53
49
  requestConsentNonInteractive,
54
50
  requestConsentOrFail,
55
51
  resolveExtensionCommandScope
56
- } from "./chunk-4SCOLXTD.js";
52
+ } from "./chunk-PC6JANNU.js";
53
+ import {
54
+ collectProviderModelsForProtocol,
55
+ getAuthTypeFromEnv,
56
+ resolveCliGenerationConfig
57
+ } from "./chunk-KMQ33DO4.js";
58
+ import {
59
+ DEFAULT_BASE_URL,
60
+ buildHeaders,
61
+ clearAccount,
62
+ loadAccount,
63
+ saveAccount
64
+ } from "./chunk-X5XDDSSH.js";
57
65
  import {
58
66
  parseChannelConfig
59
- } from "./chunk-GPMVHZP4.js";
67
+ } from "./chunk-4WIZGAH3.js";
60
68
  import {
61
69
  findCliEntryPath
62
70
  } from "./chunk-V6WHFGST.js";
71
+ import {
72
+ assembleMcpServers,
73
+ getPendingGatedMcpServers,
74
+ mcpCommand
75
+ } from "./chunk-JVPM2ULZ.js";
76
+ import {
77
+ canonicalizeWorkspace
78
+ } from "./chunk-2RFKHEXL.js";
63
79
  import {
64
80
  CHANNEL_DAEMON_WORKER_SENTINEL,
65
81
  CHANNEL_WORKER_HEARTBEAT_INTERVAL_MS,
82
+ ChannelDeliveryError,
83
+ MAX_CHANNEL_DELIVERIES_IN_FLIGHT,
66
84
  MAX_CHANNEL_STARTUP_FAILURES,
67
85
  MAX_CHANNEL_STARTUP_FAILURE_CHANNEL_LENGTH,
68
86
  MAX_CHANNEL_STARTUP_FAILURE_CODE_LENGTH,
@@ -71,31 +89,19 @@ import {
71
89
  QWEN_DAEMON_URL_ENV,
72
90
  QWEN_DAEMON_WORKSPACE_ENV,
73
91
  QWEN_SERVER_TOKEN_ENV,
92
+ isChannelDeliveryError,
93
+ isChannelDeliveryMessage,
74
94
  isChannelStartupReportAckMessage,
75
95
  isChannelWebhookTaskMessage,
76
96
  normalizeWorkerDiagnostic,
77
97
  sanitizeWorkerDiagnostic
78
- } from "./chunk-QKTHJXCS.js";
98
+ } from "./chunk-LK7CHLVP.js";
79
99
  import {
80
100
  normalizeServeChannelSelection
81
- } from "./chunk-TJTKSVIV.js";
101
+ } from "./chunk-JLU636DO.js";
82
102
  import {
83
103
  redactLogCredentials
84
104
  } from "./chunk-M5GB774H.js";
85
- import {
86
- readServiceInfo,
87
- removeServiceInfo,
88
- signalService,
89
- waitForExit,
90
- writeServiceInfo
91
- } from "./chunk-RV4C2ZFG.js";
92
- import {
93
- DEFAULT_BASE_URL,
94
- buildHeaders,
95
- clearAccount,
96
- loadAccount,
97
- saveAccount
98
- } from "./chunk-2LI23QA6.js";
99
105
  import {
100
106
  AcpBridge,
101
107
  ChannelLoopScheduler,
@@ -103,43 +109,39 @@ import {
103
109
  DaemonChannelBridge,
104
110
  PairingStore,
105
111
  SessionRouter,
112
+ isChannelProactiveDeliveryError,
106
113
  sanitizeLogText,
107
114
  sanitizePromptText
108
- } from "./chunk-RVLZCXEE.js";
115
+ } from "./chunk-RWTEFFPU.js";
109
116
  import {
110
- assembleMcpServers,
111
- getPendingGatedMcpServers,
112
- mcpCommand
113
- } from "./chunk-7PIL2BYF.js";
117
+ readServiceInfo,
118
+ removeServiceInfo,
119
+ signalService,
120
+ waitForExit,
121
+ writeServiceInfo
122
+ } from "./chunk-BIQWWWJN.js";
114
123
  import {
115
124
  loadSettings
116
- } from "./chunk-RHYFF54J.js";
125
+ } from "./chunk-TEHGS6UP.js";
117
126
  import {
118
127
  detectSystemLanguage,
119
128
  getCurrentLanguage,
120
129
  initializeI18n,
121
130
  resolveLanguageSetting,
122
131
  t
123
- } from "./chunk-V7WNRZL7.js";
132
+ } from "./chunk-LKEJ26GS.js";
124
133
  import {
125
134
  loadEnvironment
126
- } from "./chunk-UTGFTJ2H.js";
127
- import {
128
- canonicalizeWorkspace
129
- } from "./chunk-2RFKHEXL.js";
130
- import {
131
- hideBin,
132
- yargs_default
133
- } from "./chunk-XFSFZCM5.js";
135
+ } from "./chunk-LH2BYDQ5.js";
134
136
  import {
135
137
  getCliVersion
136
- } from "./chunk-3F2JUWCH.js";
138
+ } from "./chunk-YX324OPW.js";
137
139
  import {
138
140
  getPackageJson
139
141
  } from "./chunk-VJNBRRZG.js";
140
142
  import {
141
143
  isWorkspaceTrusted
142
- } from "./chunk-CGIDQG6J.js";
144
+ } from "./chunk-Z2BC6UJ5.js";
143
145
  import {
144
146
  require_strip_json_comments
145
147
  } from "./chunk-ALGGS7UH.js";
@@ -147,6 +149,10 @@ import {
147
149
  writeStderrLine,
148
150
  writeStdoutLine
149
151
  } from "./chunk-OWAK7LMW.js";
152
+ import {
153
+ hideBin,
154
+ yargs_default
155
+ } from "./chunk-XFSFZCM5.js";
150
156
  import {
151
157
  Config,
152
158
  DEFAULT_TRUNCATE_TOOL_OUTPUT_THRESHOLD,
@@ -180,27 +186,32 @@ import {
180
186
  unquoteCStylePath,
181
187
  updateChannelMemoryEntry,
182
188
  updateSetting
183
- } from "./chunk-IWALV67J.js";
189
+ } from "./chunk-PHOF65IG.js";
184
190
  import {
185
191
  nextFireTime,
186
192
  parseCron
187
- } from "./chunk-XU457J4V.js";
193
+ } from "./chunk-IRH27ZC2.js";
194
+ import {
195
+ parseBooleanEnvFlag,
196
+ resolveTelemetrySettings
197
+ } from "./chunk-NIBLUX3Y.js";
188
198
  import {
189
- DEFAULT_QWEN_EMBEDDING_MODEL,
190
199
  getAllGeminiMdFilenames,
191
- resolveTelemetrySettings,
192
200
  setGeminiMdFilename
193
- } from "./chunk-H4A4A2SY.js";
201
+ } from "./chunk-CIKQ7KKO.js";
202
+ import {
203
+ DEFAULT_QWEN_EMBEDDING_MODEL
204
+ } from "./chunk-IKCX4CCL.js";
194
205
  import {
195
206
  isTlsVerificationDisabled
196
- } from "./chunk-CBOQ3HY7.js";
207
+ } from "./chunk-2JZBVYTU.js";
197
208
  import {
198
209
  recordChannelMemoryRecallMetrics
199
- } from "./chunk-7362QS5B.js";
210
+ } from "./chunk-MB4MZHMJ.js";
200
211
  import {
201
212
  SchemaValidator,
202
213
  ToolNames
203
- } from "./chunk-YM3SZTH4.js";
214
+ } from "./chunk-PR75REBZ.js";
204
215
  import {
205
216
  FatalConfigError,
206
217
  FatalSandboxError,
@@ -208,7 +219,7 @@ import {
208
219
  createDebugLogger,
209
220
  getErrorMessage,
210
221
  isNodeError
211
- } from "./chunk-OQB4EXO4.js";
222
+ } from "./chunk-NL7LTRLR.js";
212
223
  import {
213
224
  init_esbuild_shims
214
225
  } from "./chunk-5O2XNYP6.js";
@@ -2131,6 +2142,28 @@ var BridgeChannelMemoryIntentClassifier = class {
2131
2142
  }
2132
2143
  };
2133
2144
 
2145
+ // packages/cli/src/commands/channel/loop-runtime.ts
2146
+ init_esbuild_shims();
2147
+ function createChannelLoopController(store) {
2148
+ return {
2149
+ create: /* @__PURE__ */ __name((input) => store.create(input), "create"),
2150
+ createForTarget: /* @__PURE__ */ __name((input, maxEnabledLoops) => store.createForTarget(input, maxEnabledLoops), "createForTarget"),
2151
+ listForTarget: /* @__PURE__ */ __name((channelName, target) => store.listForTarget(channelName, target), "listForTarget"),
2152
+ disable: /* @__PURE__ */ __name((id) => store.disable(id), "disable"),
2153
+ validateCron: /* @__PURE__ */ __name((cron) => {
2154
+ parseCron(cron);
2155
+ nextFireTime(cron, /* @__PURE__ */ new Date());
2156
+ }, "validateCron"),
2157
+ nextFireTime: /* @__PURE__ */ __name((job) => nextFireTime(job.cron, new Date(job.lastFiredAt ?? job.createdAt)), "nextFireTime")
2158
+ };
2159
+ }
2160
+ __name(createChannelLoopController, "createChannelLoopController");
2161
+ function isChannelCronEnabled(settings) {
2162
+ if (process.env["QWEN_CODE_DISABLE_CRON"] === "1") return false;
2163
+ return settings.merged.experimental?.cron !== false;
2164
+ }
2165
+ __name(isChannelCronEnabled, "isChannelCronEnabled");
2166
+
2134
2167
  // packages/cli/src/commands/channel/start.ts
2135
2168
  var MAX_CRASH_RESTARTS = 3;
2136
2169
  var CRASH_WINDOW_MS = 5 * 60 * 1e3;
@@ -2158,25 +2191,6 @@ function channelMemoryOptions(getBridge, cwd) {
2158
2191
  };
2159
2192
  }
2160
2193
  __name(channelMemoryOptions, "channelMemoryOptions");
2161
- function createLoopController(store) {
2162
- return {
2163
- create: /* @__PURE__ */ __name((input) => store.create(input), "create"),
2164
- createForTarget: /* @__PURE__ */ __name((input, maxEnabledLoops) => store.createForTarget(input, maxEnabledLoops), "createForTarget"),
2165
- listForTarget: /* @__PURE__ */ __name((channelName, target) => store.listForTarget(channelName, target), "listForTarget"),
2166
- disable: /* @__PURE__ */ __name((id) => store.disable(id), "disable"),
2167
- validateCron: /* @__PURE__ */ __name((cron) => {
2168
- parseCron(cron);
2169
- nextFireTime(cron, /* @__PURE__ */ new Date());
2170
- }, "validateCron"),
2171
- nextFireTime: /* @__PURE__ */ __name((job) => nextFireTime(job.cron, new Date(job.lastFiredAt ?? job.createdAt)), "nextFireTime")
2172
- };
2173
- }
2174
- __name(createLoopController, "createLoopController");
2175
- function isChannelCronEnabled(settings) {
2176
- if (process.env["QWEN_CODE_DISABLE_CRON"] === "1") return false;
2177
- return settings.merged.experimental?.cron !== false;
2178
- }
2179
- __name(isChannelCronEnabled, "isChannelCronEnabled");
2180
2194
  function writeServiceInfoOrExit(channels, cleanup) {
2181
2195
  try {
2182
2196
  writeServiceInfo(channels);
@@ -2264,7 +2278,7 @@ async function startSingle(name, proxy, cronEnabled) {
2264
2278
  sessionsPath()
2265
2279
  );
2266
2280
  const loopStore = cronEnabled ? new ChannelLoopStore({ filePath: channelLoopPath() }) : void 0;
2267
- const loopController = loopStore ? createLoopController(loopStore) : void 0;
2281
+ const loopController = loopStore ? createChannelLoopController(loopStore) : void 0;
2268
2282
  const channels = /* @__PURE__ */ new Map();
2269
2283
  const channel = await createChannel(name, config, bridge, {
2270
2284
  router,
@@ -2398,7 +2412,7 @@ async function startAll(proxy, cronEnabled) {
2398
2412
  await bridge.start();
2399
2413
  const router = new SessionRouter(bridge, defaultCwd, "user", sessionsPath());
2400
2414
  const loopStore = cronEnabled ? new ChannelLoopStore({ filePath: channelLoopPath() }) : void 0;
2401
- const loopController = loopStore ? createLoopController(loopStore) : void 0;
2415
+ const loopController = loopStore ? createChannelLoopController(loopStore) : void 0;
2402
2416
  for (const { name, config } of parsed) {
2403
2417
  router.setChannelScope(name, config.sessionScope);
2404
2418
  }
@@ -2593,7 +2607,7 @@ var stopCommand = {
2593
2607
  if (argv["daemon-url"]) {
2594
2608
  const token = argv.token ?? process.env[QWEN_SERVER_TOKEN_ENV] ?? process.env[QWEN_DAEMON_TOKEN_ENV];
2595
2609
  try {
2596
- const sdk = await import("./daemon-RAPSDJH7.js");
2610
+ const sdk = await import("./daemon-YO6433NF.js");
2597
2611
  const client = new sdk.DaemonClient({
2598
2612
  baseUrl: argv["daemon-url"],
2599
2613
  ...token ? { token } : {}
@@ -2779,7 +2793,7 @@ var statusCommand = {
2779
2793
  if (argv["daemon-url"]) {
2780
2794
  const token = argv.token ?? process.env[QWEN_SERVER_TOKEN_ENV] ?? process.env[QWEN_DAEMON_TOKEN_ENV];
2781
2795
  try {
2782
- const sdk = await import("./daemon-RAPSDJH7.js");
2796
+ const sdk = await import("./daemon-YO6433NF.js");
2783
2797
  const client = new sdk.DaemonClient({
2784
2798
  baseUrl: argv["daemon-url"],
2785
2799
  ...token ? { token } : {}
@@ -2890,7 +2904,7 @@ var reloadCommand = {
2890
2904
  const token = resolveToken(argv.token);
2891
2905
  let sdk;
2892
2906
  try {
2893
- sdk = await import("./daemon-RAPSDJH7.js");
2907
+ sdk = await import("./daemon-YO6433NF.js");
2894
2908
  } catch (err) {
2895
2909
  writeStderrLine(
2896
2910
  `[Channel] Failed to load daemon SDK: ${safeChannelCommandErrorMessage(err)}`
@@ -2970,7 +2984,7 @@ var setCommand2 = {
2970
2984
  const selection = names[0] === "all" ? { mode: "all" } : { mode: "names", names };
2971
2985
  let sdk;
2972
2986
  try {
2973
- sdk = await import("./daemon-RAPSDJH7.js");
2987
+ sdk = await import("./daemon-YO6433NF.js");
2974
2988
  } catch (error) {
2975
2989
  writeStderrLine(
2976
2990
  `[Channel] Failed to load daemon SDK: ${safeChannelCommandErrorMessage(error)}`
@@ -3021,7 +3035,7 @@ var setCommand2 = {
3021
3035
  init_esbuild_shims();
3022
3036
  var SESSION_SHELL_COMMAND_FEATURE = "session_shell_command";
3023
3037
  var MAX_ACTIVE_WEBHOOK_TASKS = 16;
3024
- var WEBHOOK_TASK_SHUTDOWN_DRAIN_MS = 1e4;
3038
+ var WORKER_SHUTDOWN_DRAIN_MS = 1e4;
3025
3039
  function createDaemonSessionFactory({
3026
3040
  client,
3027
3041
  DaemonSessionClient,
@@ -3093,7 +3107,7 @@ function createDaemonChannelBridgeFacade(bridge, opts) {
3093
3107
  }
3094
3108
  __name(createDaemonChannelBridgeFacade, "createDaemonChannelBridgeFacade");
3095
3109
  async function loadDaemonSdk() {
3096
- return await import("./daemon-RAPSDJH7.js");
3110
+ return await import("./daemon-YO6433NF.js");
3097
3111
  }
3098
3112
  __name(loadDaemonSdk, "loadDaemonSdk");
3099
3113
  function selectedChannelNames(channelsConfig, selection) {
@@ -3255,6 +3269,10 @@ async function runChannelDaemonWorker(opts) {
3255
3269
  const observedContacts = new ObservedChannelContactStore(
3256
3270
  daemonObservedContactsPath(daemonWorkspace)
3257
3271
  );
3272
+ const loopStore = isChannelCronEnabled(settings) ? new ChannelLoopStore({
3273
+ filePath: daemonChannelLoopPath(daemonWorkspace)
3274
+ }) : void 0;
3275
+ const loopController = loopStore ? createChannelLoopController(loopStore) : void 0;
3258
3276
  const bridge = new DaemonChannelBridge({
3259
3277
  cwd: daemonWorkspace,
3260
3278
  sessionFactory: createDaemonSessionFactory({
@@ -3266,6 +3284,7 @@ async function runChannelDaemonWorker(opts) {
3266
3284
  });
3267
3285
  const channels = /* @__PURE__ */ new Map();
3268
3286
  const connected = [];
3287
+ let scheduler;
3269
3288
  let connectFailureCount = 0;
3270
3289
  const diagnosticRedaction = {
3271
3290
  ...opts.daemonToken ? { daemonToken: opts.daemonToken } : {},
@@ -3331,7 +3350,8 @@ async function runChannelDaemonWorker(opts) {
3331
3350
  observe: /* @__PURE__ */ __name((channelName, observation) => {
3332
3351
  observedContacts.observe(channelName, observation);
3333
3352
  }, "observe")
3334
- }
3353
+ },
3354
+ ...loopController ? { loopController } : {}
3335
3355
  }),
3336
3356
  startupSignal
3337
3357
  )
@@ -3404,6 +3424,38 @@ async function runChannelDaemonWorker(opts) {
3404
3424
  if (connected.length === 0) {
3405
3425
  throw new Error("No channels connected.");
3406
3426
  }
3427
+ if (loopStore) {
3428
+ const schedulerChannels = /* @__PURE__ */ new Map();
3429
+ for (const name of connected) {
3430
+ const channel = channels.get(name);
3431
+ schedulerChannels.set(name, {
3432
+ runLoopPrompt: /* @__PURE__ */ __name(async (job, options) => {
3433
+ let jobWorkspace;
3434
+ try {
3435
+ jobWorkspace = canonicalizeWorkspace(job.cwd);
3436
+ } catch {
3437
+ jobWorkspace = void 0;
3438
+ }
3439
+ if (jobWorkspace !== daemonWorkspace) {
3440
+ await loopStore.disable(job.id).catch(() => false);
3441
+ writeStderrLine(
3442
+ `[Channel] Disabled loop "${sanitizeLogText(job.id, 128)}": its workspace does not match this daemon worker.`
3443
+ );
3444
+ throw new Error(
3445
+ `Loop ${sanitizeLogText(job.id, 128)} is outside daemon workspace and was disabled.`
3446
+ );
3447
+ }
3448
+ return channel.runLoopPrompt(job, options);
3449
+ }, "runLoopPrompt")
3450
+ });
3451
+ }
3452
+ scheduler = new ChannelLoopScheduler({
3453
+ store: loopStore,
3454
+ channels: schedulerChannels,
3455
+ nextFireTime
3456
+ });
3457
+ scheduler.start();
3458
+ }
3407
3459
  opts.sendReady?.({
3408
3460
  channels: connected,
3409
3461
  requestedChannels: parsed.map((p) => p.name),
@@ -3411,6 +3463,19 @@ async function runChannelDaemonWorker(opts) {
3411
3463
  });
3412
3464
  return {
3413
3465
  channels: connected,
3466
+ async deliverChannelMessage(request) {
3467
+ const channel = channels.get(request.channelName);
3468
+ if (!channel || !connected.includes(request.channelName)) {
3469
+ throw new ChannelDeliveryError(
3470
+ "channel_worker_unavailable",
3471
+ `Channel "${request.channelName}" is not running.`
3472
+ );
3473
+ }
3474
+ await channel.deliverProactive(
3475
+ { channelName: request.channelName, ...request.target },
3476
+ request.text
3477
+ );
3478
+ },
3414
3479
  validateWebhookTask(task) {
3415
3480
  const channel = channels.get(task.channelName);
3416
3481
  if (!channel || !connected.includes(task.channelName)) {
@@ -3430,6 +3495,7 @@ async function runChannelDaemonWorker(opts) {
3430
3495
  }
3431
3496
  },
3432
3497
  async close() {
3498
+ scheduler?.stop();
3433
3499
  disconnectAll();
3434
3500
  try {
3435
3501
  bridge.stop();
@@ -3439,6 +3505,7 @@ async function runChannelDaemonWorker(opts) {
3439
3505
  }
3440
3506
  };
3441
3507
  } catch (err) {
3508
+ scheduler?.stop();
3442
3509
  disconnectAll();
3443
3510
  try {
3444
3511
  bridge.stop();
@@ -3600,8 +3667,58 @@ var daemonWorkerCommand = {
3600
3667
  } catch {
3601
3668
  }
3602
3669
  }, "sendWebhookTaskResult");
3670
+ const sendChannelDeliveryResult = /* @__PURE__ */ __name((id, result) => {
3671
+ try {
3672
+ process.send?.({
3673
+ type: "channel_delivery_result",
3674
+ id,
3675
+ ...result
3676
+ });
3677
+ } catch {
3678
+ }
3679
+ }, "sendChannelDeliveryResult");
3603
3680
  const activeWebhookTasks = /* @__PURE__ */ new Map();
3681
+ const activeChannelDeliveries = /* @__PURE__ */ new Map();
3604
3682
  const onMessage = /* @__PURE__ */ __name((message) => {
3683
+ if (isChannelDeliveryMessage(message)) {
3684
+ if (message.expiresAt <= Date.now()) {
3685
+ sendChannelDeliveryResult(message.id, {
3686
+ ok: false,
3687
+ code: "channel_delivery_timeout",
3688
+ error: "Channel delivery IPC timed out."
3689
+ });
3690
+ return;
3691
+ }
3692
+ if (activeChannelDeliveries.size >= MAX_CHANNEL_DELIVERIES_IN_FLIGHT) {
3693
+ sendChannelDeliveryResult(message.id, {
3694
+ ok: false,
3695
+ code: "channel_delivery_queue_full",
3696
+ error: "Channel delivery queue is full."
3697
+ });
3698
+ return;
3699
+ }
3700
+ const deliveryId = message.id;
3701
+ const delivery = handle.deliverChannelMessage(message.request).then(() => {
3702
+ sendChannelDeliveryResult(deliveryId, { ok: true });
3703
+ }).catch((error) => {
3704
+ sendChannelDeliveryResult(deliveryId, {
3705
+ ok: false,
3706
+ code: classifyChannelDeliveryError(error),
3707
+ error: sanitizeWorkerDiagnostic(
3708
+ error instanceof Error ? error.message : String(error),
3709
+ 512,
3710
+ {
3711
+ ...daemonToken ? { daemonToken } : {},
3712
+ workerEnv: process.env
3713
+ }
3714
+ )
3715
+ });
3716
+ }).finally(() => {
3717
+ activeChannelDeliveries.delete(deliveryId);
3718
+ });
3719
+ activeChannelDeliveries.set(deliveryId, delivery);
3720
+ return;
3721
+ }
3605
3722
  if (!isChannelWebhookTaskMessage(message)) return;
3606
3723
  if (message.expiresAt <= Date.now()) {
3607
3724
  sendWebhookTaskResult(message.id, {
@@ -3683,17 +3800,26 @@ var daemonWorkerCommand = {
3683
3800
  clearHeartbeat();
3684
3801
  process.removeListener("message", onMessage);
3685
3802
  try {
3686
- if (activeWebhookTasks.size > 0) {
3803
+ const deliveryCount = activeChannelDeliveries.size;
3804
+ const webhookCount = activeWebhookTasks.size;
3805
+ if (deliveryCount > 0) {
3687
3806
  writeStderrLine(
3688
- `[Channel] shutdown: draining ${activeWebhookTasks.size} webhook task(s)...`
3807
+ `[Channel] shutdown: draining ${deliveryCount} channel delivery task(s)...`
3689
3808
  );
3809
+ }
3810
+ if (webhookCount > 0) {
3811
+ writeStderrLine(
3812
+ `[Channel] shutdown: draining ${webhookCount} webhook task(s)...`
3813
+ );
3814
+ }
3815
+ if (deliveryCount > 0 || webhookCount > 0) {
3690
3816
  await Promise.race([
3691
- Promise.allSettled(activeWebhookTasks.values()),
3817
+ Promise.allSettled([
3818
+ ...activeChannelDeliveries.values(),
3819
+ ...activeWebhookTasks.values()
3820
+ ]),
3692
3821
  new Promise((resolve13) => {
3693
- const timer = setTimeout(
3694
- resolve13,
3695
- WEBHOOK_TASK_SHUTDOWN_DRAIN_MS
3696
- );
3822
+ const timer = setTimeout(resolve13, WORKER_SHUTDOWN_DRAIN_MS);
3697
3823
  timer.unref();
3698
3824
  })
3699
3825
  ]);
@@ -3756,6 +3882,16 @@ function classifyWebhookTaskValidationError(error) {
3756
3882
  return "channel_webhook_enqueue_failed";
3757
3883
  }
3758
3884
  __name(classifyWebhookTaskValidationError, "classifyWebhookTaskValidationError");
3885
+ function classifyChannelDeliveryError(error) {
3886
+ if (isChannelDeliveryError(error)) {
3887
+ return error.code;
3888
+ }
3889
+ if (isChannelProactiveDeliveryError(error) && error.disposition === "permanent") {
3890
+ return "channel_delivery_rejected";
3891
+ }
3892
+ return "channel_delivery_failed";
3893
+ }
3894
+ __name(classifyChannelDeliveryError, "classifyChannelDeliveryError");
3759
3895
 
3760
3896
  // packages/cli/src/commands/channel/pairing.ts
3761
3897
  init_esbuild_shims();
@@ -4637,6 +4773,8 @@ init_esbuild_shims();
4637
4773
  var BRIEFS = {
4638
4774
  "0": {
4639
4775
  label: "Agent 0: Issue fidelity & root-cause ownership",
4776
+ publicLabel: "the linked-issue fidelity pass",
4777
+ publicLabelZh: "\u5173\u8054 issue \u4E00\u81F4\u6027\u68C0\u67E5",
4640
4778
  readsDiff: true,
4641
4779
  brief: `You are **Agent 0: Issue Fidelity & Root-Cause Ownership**. Your scope is issue fidelity, not general code review \u2014 do not report ordinary code defects; other agents own those.
4642
4780
 
@@ -4658,6 +4796,8 @@ If \`gh\` fails (auth, rate limit, network), **retry that fetch once**. If it fa
4658
4796
  "1a": {
4659
4797
  reviewsCode: true,
4660
4798
  label: "Agent 1a: Line-by-line correctness",
4799
+ publicLabel: "the line-by-line correctness pass",
4800
+ publicLabelZh: "\u9010\u884C\u6B63\u786E\u6027\u68C0\u67E5",
4661
4801
  readsDiff: true,
4662
4802
  brief: `You are **Agent 1a: the line-by-line scan**. Your dimension is defined by *how you walk*, not by a topic \u2014 a topical "find correctness bugs" brief makes every agent converge on the same visibly-suspicious hunks, which is redundancy, not coverage.
4663
4803
 
@@ -4674,6 +4814,8 @@ Scope guard: reading the enclosing function is for **context**. A defect entirel
4674
4814
  "1b": {
4675
4815
  reviewsCode: true,
4676
4816
  label: "Agent 1b: Removed-behavior audit",
4817
+ publicLabel: "the removed-behavior audit",
4818
+ publicLabelZh: "\u5220\u9664\u884C\u4E3A\u5BA1\u8BA1",
4677
4819
  readsDiff: true,
4678
4820
  brief: `You are **Agent 1b: the removed-behavior audit**. You own the diff's **deleted side**, and you are the only agent who can see it: the \`-\` lines exist *only* in the diff. The post-change tree carries no trace of what was removed \u2014 the line is simply not there, and nothing marks where it was \u2014 so no agent reading the new code alone can find this class of defect.
4679
4821
 
@@ -4690,6 +4832,8 @@ Each failure scenario must name what input or state now slips past the removed b
4690
4832
  "1c": {
4691
4833
  reviewsCode: true,
4692
4834
  label: "Agent 1c: Cross-file tracer",
4835
+ publicLabel: "the cross-file consistency pass",
4836
+ publicLabelZh: "\u8DE8\u6587\u4EF6\u4E00\u81F4\u6027\u68C0\u67E5",
4693
4837
  readsDiff: true,
4694
4838
  brief: `You are **Agent 1c: the cross-file tracer**. You own the *whole* cross-file walk, end to end. It used to be a duty shared by six agents, and a duty shared by six agents is a duty nobody finishes while the same symbols get grepped six times.
4695
4839
 
@@ -4715,6 +4859,8 @@ Expect the three ends to be far apart. The declaration, the pass-through, and th
4715
4859
  "2": {
4716
4860
  reviewsCode: true,
4717
4861
  label: "Agent 2: Security",
4862
+ publicLabel: "the security pass",
4863
+ publicLabelZh: "\u5B89\u5168\u68C0\u67E5",
4718
4864
  readsDiff: true,
4719
4865
  brief: `You are **Agent 2: Security**. Review the diff for:
4720
4866
 
@@ -4730,6 +4876,8 @@ Expect the three ends to be far apart. The declaration, the pass-through, and th
4730
4876
  "3": {
4731
4877
  reviewsCode: true,
4732
4878
  label: "Agent 3: Code quality",
4879
+ publicLabel: "the code-quality pass",
4880
+ publicLabelZh: "\u4EE3\u7801\u8D28\u91CF\u68C0\u67E5",
4733
4881
  readsDiff: true,
4734
4882
  brief: `You are **Agent 3: Code Quality**. Review the diff for:
4735
4883
 
@@ -4742,6 +4890,8 @@ Expect the three ends to be far apart. The declaration, the pass-through, and th
4742
4890
  "4": {
4743
4891
  reviewsCode: true,
4744
4892
  label: "Agent 4: Performance & efficiency",
4893
+ publicLabel: "the performance pass",
4894
+ publicLabelZh: "\u6027\u80FD\u68C0\u67E5",
4745
4895
  readsDiff: true,
4746
4896
  brief: `You are **Agent 4: Performance & Efficiency**. Review the diff for:
4747
4897
 
@@ -4755,6 +4905,8 @@ Expect the three ends to be far apart. The declaration, the pass-through, and th
4755
4905
  "5": {
4756
4906
  reviewsCode: true,
4757
4907
  label: "Agent 5: Test coverage",
4908
+ publicLabel: "the test-coverage pass",
4909
+ publicLabelZh: "\u6D4B\u8BD5\u8986\u76D6\u68C0\u67E5",
4758
4910
  readsDiff: true,
4759
4911
  brief: `You are **Agent 5: Test Coverage**. Review the diff for:
4760
4912
 
@@ -4770,6 +4922,8 @@ Expect the three ends to be far apart. The declaration, the pass-through, and th
4770
4922
  "6a": {
4771
4923
  reviewsCode: true,
4772
4924
  label: "Agent 6a: Undirected audit \u2014 attacker mindset",
4925
+ publicLabel: "the open-ended audit (attacker mindset)",
4926
+ publicLabelZh: "\u5F00\u653E\u5F0F\u5BA1\u8BA1\uFF08\u653B\u51FB\u8005\u89C6\u89D2\uFF09",
4773
4927
  readsDiff: true,
4774
4928
  brief: `You are **Agent 6a: the undirected audit, attacker mindset.**
4775
4929
 
@@ -4788,6 +4942,8 @@ You are undirected on purpose. Do not restrict yourself to the list.`
4788
4942
  "6b": {
4789
4943
  reviewsCode: true,
4790
4944
  label: "Agent 6b: Undirected audit \u2014 3 AM oncall mindset",
4945
+ publicLabel: "the open-ended audit (oncall mindset)",
4946
+ publicLabelZh: "\u5F00\u653E\u5F0F\u5BA1\u8BA1\uFF08\u503C\u73ED\u6392\u969C\u89C6\u89D2\uFF09",
4791
4947
  readsDiff: true,
4792
4948
  brief: `You are **Agent 6b: the undirected audit, 3 AM oncall mindset.**
4793
4949
 
@@ -4806,6 +4962,8 @@ You are undirected on purpose. Do not restrict yourself to the list.`
4806
4962
  "6c": {
4807
4963
  reviewsCode: true,
4808
4964
  label: "Agent 6c: Undirected audit \u2014 six-months-later maintainer",
4965
+ publicLabel: "the open-ended audit (maintainer mindset)",
4966
+ publicLabelZh: "\u5F00\u653E\u5F0F\u5BA1\u8BA1\uFF08\u540E\u7EED\u7EF4\u62A4\u8005\u89C6\u89D2\uFF09",
4809
4967
  readsDiff: true,
4810
4968
  brief: `You are **Agent 6c: the undirected audit, six-months-later maintainer mindset.**
4811
4969
 
@@ -4823,6 +4981,8 @@ You are undirected on purpose. Do not restrict yourself to the list.`
4823
4981
  },
4824
4982
  "7": {
4825
4983
  label: "Agent 7: Build & test verification",
4984
+ publicLabel: "the build-and-test check",
4985
+ publicLabelZh: "\u6784\u5EFA\u4E0E\u6D4B\u8BD5\u9A8C\u8BC1",
4826
4986
  readsDiff: false,
4827
4987
  brief: `You are **Agent 7: Build & Test Verification**. You do not review the diff \u2014 you run the project's own deterministic checks and report what they say. Your evidence is **the commands you ran and their output**; a return that names no command has not done this job.
4828
4988
 
@@ -4837,6 +4997,8 @@ Use \`Source: [build]\` or \`Source: [test]\`, never \`[review]\`.`
4837
4997
  },
4838
4998
  "test-matrix": {
4839
4999
  label: "Test coverage matrix (whole-diff)",
5000
+ publicLabel: "the whole-diff test-coverage check",
5001
+ publicLabelZh: "\u5168 diff \u6D4B\u8BD5\u8986\u76D6\u68C0\u67E5",
4840
5002
  readsDiff: true,
4841
5003
  brief: `You are the **test-coverage matrix** agent \u2014 Agent 5's cross-chunk counterpart. The territory agents each see either an implementation or a test, rarely both. You see the whole diff, so you own the pairing.
4842
5004
 
@@ -4847,6 +5009,8 @@ Use \`Source: [build]\` or \`Source: [test]\`, never \`[review]\`.`
4847
5009
  "invariant-a": {
4848
5010
  reviewsCode: true,
4849
5011
  label: "Invariant agent A: state, timers, collections",
5012
+ publicLabel: "the invariant check (state, timers, collections)",
5013
+ publicLabelZh: "\u4E0D\u53D8\u91CF\u68C0\u67E5\uFF08\u72B6\u6001\u3001\u5B9A\u65F6\u5668\u3001\u96C6\u5408\uFF09",
4850
5014
  readsDiff: true,
4851
5015
  brief: `You are **invariant agent A: state, timers, and collections.**
4852
5016
 
@@ -4863,6 +5027,8 @@ Report a **Critical** for each violation, and give **both** locations that toget
4863
5027
  "invariant-b": {
4864
5028
  reviewsCode: true,
4865
5029
  label: "Invariant agent B: counters, return values, error taxonomies",
5030
+ publicLabel: "the invariant check (counters, return values, error taxonomies)",
5031
+ publicLabelZh: "\u4E0D\u53D8\u91CF\u68C0\u67E5\uFF08\u8BA1\u6570\u5668\u3001\u8FD4\u56DE\u503C\u3001\u9519\u8BEF\u5206\u7C7B\uFF09",
4866
5032
  readsDiff: true,
4867
5033
  brief: `You are **invariant agent B: counters, return values, and error taxonomies.**
4868
5034
 
@@ -4879,6 +5045,8 @@ Report a **Critical** for each violation, and give **both** locations that toget
4879
5045
  "invariant-c": {
4880
5046
  reviewsCode: true,
4881
5047
  label: "Invariant agent C: config fields, early returns",
5048
+ publicLabel: "the invariant check (config fields, early returns)",
5049
+ publicLabelZh: "\u4E0D\u53D8\u91CF\u68C0\u67E5\uFF08\u914D\u7F6E\u5B57\u6BB5\u3001\u63D0\u524D\u8FD4\u56DE\uFF09",
4882
5050
  readsDiff: true,
4883
5051
  brief: `You are **invariant agent C: config fields and early returns.**
4884
5052
 
@@ -4896,6 +5064,8 @@ Report a **Critical** for each violation, and give **both** locations that toget
4896
5064
  output: "verdicts",
4897
5065
  acceptsFindings: true,
4898
5066
  label: "Verification agent",
5067
+ publicLabel: "verification",
5068
+ publicLabelZh: "\u9A8C\u8BC1",
4899
5069
  readsDiff: true,
4900
5070
  brief: `You are a **verification agent**. You do not look for new problems \u2014 you rule on the findings you were handed, listed in the message that launched you, each with a file, a line, an issue, and a **failure scenario**. The failure scenario is the finding's testable claim, and your verdict is the **result of tracing it through the real code**, not a plausibility vote on how the finding reads.
4901
5071
 
@@ -4924,6 +5094,8 @@ Return, for each finding, one verdict:
4924
5094
  acceptsChunk: true,
4925
5095
  acceptsFindings: true,
4926
5096
  label: "Reverse audit agent",
5097
+ publicLabel: "reverse audit",
5098
+ publicLabelZh: "\u53CD\u5411\u5BA1\u8BA1",
4927
5099
  readsDiff: true,
4928
5100
  brief: `You are a **reverse audit agent**. Prior agents have already reviewed this diff and their confirmed findings are listed in the message that launched you. Your job is not to re-report them \u2014 it is to find the **gaps**: the important issues no prior agent or round caught.
4929
5101
 
@@ -5382,6 +5554,18 @@ function roleLabel(req) {
5382
5554
  return req.file ? `${base} \u2014 ${req.file}` : base;
5383
5555
  }
5384
5556
  __name(roleLabel, "roleLabel");
5557
+ function publicRoleLabel(req) {
5558
+ if (req.role === "chunk") return void 0;
5559
+ const base = BRIEFS[req.role].publicLabel;
5560
+ return req.file ? `${base} on ${req.file}` : base;
5561
+ }
5562
+ __name(publicRoleLabel, "publicRoleLabel");
5563
+ function publicRoleLabelZh(req) {
5564
+ if (req.role === "chunk") return void 0;
5565
+ const base = BRIEFS[req.role].publicLabelZh;
5566
+ return req.file ? `${base}\uFF08${req.file}\uFF09` : base;
5567
+ }
5568
+ __name(publicRoleLabelZh, "publicRoleLabelZh");
5385
5569
  function label(rec, chunk) {
5386
5570
  if (chunk !== null) return `chunk ${chunk}`;
5387
5571
  const first = rec.launchPrompt.split("\n")[0]?.trim() ?? "";
@@ -5398,8 +5582,15 @@ function coverageFromTranscripts(planPath, env = process.env) {
5398
5582
  const unopenedAgents = [];
5399
5583
  const rewrittenPrompts = [];
5400
5584
  const disclosures = [];
5401
- const disclose = /* @__PURE__ */ __name((subject, reason) => {
5402
- disclosures.push({ subject, reason });
5585
+ const disclose = /* @__PURE__ */ __name((subject, reason, pub) => {
5586
+ disclosures.push({
5587
+ subject,
5588
+ reason,
5589
+ publicSubject: pub?.subject,
5590
+ publicReason: pub?.reason,
5591
+ subjectZh: pub?.subjectZh,
5592
+ reasonZh: pub?.reasonZh
5593
+ });
5403
5594
  return `${subject} \u2014 ${reason}`;
5404
5595
  }, "disclose");
5405
5596
  const covered = /* @__PURE__ */ new Set();
@@ -5454,7 +5645,10 @@ function coverageFromTranscripts(planPath, env = process.env) {
5454
5645
  rewrittenPrompts.push(
5455
5646
  disclose(
5456
5647
  name,
5457
- "ran on a prompt the run wrote itself (none was built for this chunk), so the brief with its method and rules never reached it"
5648
+ "ran on a prompt the run wrote itself (none was built for this chunk), so the brief with its method and rules never reached it",
5649
+ {
5650
+ reasonZh: "\u8FD0\u884C\u5728\u8FD9\u6B21 run \u81EA\u884C\u7F16\u5199\u7684 prompt \u4E0A\uFF08\u8BE5 chunk \u4ECE\u672A\u6784\u5EFA\u8FC7 prompt\uFF09\uFF0C\u627F\u8F7D\u65B9\u6CD5\u4E0E\u89C4\u5219\u7684 brief \u4ECE\u672A\u5230\u8FBE\u8BE5 agent"
5651
+ }
5458
5652
  )
5459
5653
  );
5460
5654
  }
@@ -5464,7 +5658,8 @@ function coverageFromTranscripts(planPath, env = process.env) {
5464
5658
  rewrittenPrompts.push(
5465
5659
  disclose(
5466
5660
  name,
5467
- "launched with a prompt that is not the one the CLI built"
5661
+ "launched with a prompt that is not the one the CLI built",
5662
+ { reasonZh: "\u542F\u52A8\u65F6\u4F7F\u7528\u7684 prompt \u4E0D\u662F CLI \u6784\u5EFA\u7684\u90A3\u4E00\u4EFD" }
5468
5663
  )
5469
5664
  );
5470
5665
  }
@@ -5501,7 +5696,11 @@ function coverageFromTranscripts(planPath, env = process.env) {
5501
5696
  missingRoles.push(
5502
5697
  disclose(
5503
5698
  "every dimension",
5504
- `none of the ${roster.length} required agents is on record as launched with a prompt this skill built, so this diff was reviewed, if at all, from prompts the run wrote for itself: no record shows the severity bar, the finding format or this project's own rules reaching an agent`
5699
+ `none of the ${roster.length} required agents is on record as launched with a prompt this skill built, so this diff was reviewed, if at all, from prompts the run wrote for itself: no record shows the severity bar, the finding format or this project's own rules reaching an agent`,
5700
+ {
5701
+ subjectZh: "\u6240\u6709\u7EF4\u5EA6",
5702
+ reasonZh: `${roster.length} \u4E2A\u5FC5\u9700 agent \u4E2D\u6CA1\u6709\u4EFB\u4F55\u4E00\u4E2A\u6709\u8BB0\u5F55\u8868\u660E\u662F\u7528\u672C skill \u6784\u5EFA\u7684 prompt \u542F\u52A8\u7684\uFF0C\u8FD9\u4E2A diff \u5373\u4FBF\u88AB\u5BA1\u67E5\u8FC7\uFF0C\u4E5F\u662F\u57FA\u4E8E\u8FD9\u6B21 run \u81EA\u884C\u7F16\u5199\u7684 prompt\uFF1A\u6CA1\u6709\u8BB0\u5F55\u8868\u660E\u4E25\u91CD\u7EA7\u522B\u6807\u51C6\u3001\u53D1\u73B0\u683C\u5F0F\u6216\u672C\u9879\u76EE\u81EA\u5DF1\u7684\u89C4\u5219\u5230\u8FBE\u8FC7\u4EFB\u4F55 agent`
5703
+ }
5505
5704
  )
5506
5705
  );
5507
5706
  }
@@ -5548,7 +5747,12 @@ function coverageFromTranscripts(planPath, env = process.env) {
5548
5747
  missingRoles.push(
5549
5748
  disclose(
5550
5749
  roleLabel(req),
5551
- "no record shows its brief reaching an agent, so this dimension was reviewed, if at all, from a prompt the run wrote for itself"
5750
+ "no record shows its brief reaching an agent, so this dimension was reviewed, if at all, from a prompt the run wrote for itself",
5751
+ {
5752
+ subject: publicRoleLabel(req),
5753
+ subjectZh: publicRoleLabelZh(req),
5754
+ reasonZh: "\u6CA1\u6709\u8BB0\u5F55\u8868\u660E\u5B83\u7684 brief \u5230\u8FBE\u8FC7\u4EFB\u4F55 agent\uFF0C\u8FD9\u4E2A\u7EF4\u5EA6\u5373\u4FBF\u88AB\u5BA1\u67E5\u8FC7\uFF0C\u4E5F\u662F\u57FA\u4E8E\u8FD9\u6B21 run \u81EA\u884C\u7F16\u5199\u7684 prompt"
5755
+ }
5552
5756
  )
5553
5757
  );
5554
5758
  }
@@ -5562,7 +5766,12 @@ function coverageFromTranscripts(planPath, env = process.env) {
5562
5766
  missingRoles.push(
5563
5767
  disclose(
5564
5768
  roleLabel(req),
5565
- anyMatch ? "its prompt reached only an agent already credited with another block; one agent was given several blocks, and one transcript cannot certify two dimensions" : "its prompt was built, but no agent on record was launched with it"
5769
+ anyMatch ? "its prompt reached only an agent already credited with another block; one agent was given several blocks, and one transcript cannot certify two dimensions" : "its prompt was built, but no agent on record was launched with it",
5770
+ {
5771
+ subject: publicRoleLabel(req),
5772
+ subjectZh: publicRoleLabelZh(req),
5773
+ reasonZh: anyMatch ? "\u5B83\u7684 prompt \u53EA\u5230\u8FBE\u4E86\u4E00\u4E2A\u5DF2\u88AB\u8BB0\u5165\u5176\u4ED6\u533A\u5757\u7684 agent\uFF1B\u4E00\u4E2A agent \u88AB\u585E\u8FDB\u4E86\u591A\u4E2A\u533A\u5757\uFF0C\u800C\u4E00\u4EFD\u8FD0\u884C\u8BB0\u5F55\u65E0\u6CD5\u4E3A\u4E24\u4E2A\u7EF4\u5EA6\u4F5C\u8BC1" : "\u5B83\u7684 prompt \u5DF2\u6784\u5EFA\uFF0C\u4F46\u6CA1\u6709\u4EFB\u4F55 agent \u6709\u8BB0\u5F55\u7528\u5B83\u542F\u52A8\u8FC7"
5774
+ }
5566
5775
  )
5567
5776
  );
5568
5777
  missingRoleSelectors.push(selectorOf(req));
@@ -5576,7 +5785,13 @@ function coverageFromTranscripts(planPath, env = process.env) {
5576
5785
  unreadBriefs.push(
5577
5786
  disclose(
5578
5787
  roleLabel(req),
5579
- `never opened its brief (${brief}), so it reviewed without the instructions it was launched to follow`
5788
+ `never opened its brief (${brief}), so it reviewed without the instructions it was launched to follow`,
5789
+ {
5790
+ subject: publicRoleLabel(req),
5791
+ reason: "never opened its brief, so it reviewed without the instructions it was launched to follow",
5792
+ subjectZh: publicRoleLabelZh(req),
5793
+ reasonZh: "\u4ECE\u672A\u6253\u5F00\u81EA\u5DF1\u7684 brief\uFF0C\u5BA1\u67E5\u65F6\u7F3A\u5931\u4E86\u5B83\u672C\u5E94\u9075\u5FAA\u7684\u6307\u4EE4"
5794
+ }
5580
5795
  )
5581
5796
  );
5582
5797
  }
@@ -5601,7 +5816,11 @@ function coverageFromTranscripts(planPath, env = process.env) {
5601
5816
  unreadBriefs,
5602
5817
  missingChunks,
5603
5818
  uncoverableChunks: [...uncoverable].sort((a, b) => a - b),
5604
- coveredChunks: [...covered].sort((a, b) => a - b)
5819
+ coveredChunks: [...covered].sort((a, b) => a - b),
5820
+ plannedChunks: plan.chunks.map((c) => ({
5821
+ id: c.id,
5822
+ files: (c.files ?? []).map((f) => f?.path).filter((p) => typeof p === "string" && p !== "")
5823
+ }))
5605
5824
  };
5606
5825
  }
5607
5826
  __name(coverageFromTranscripts, "coverageFromTranscripts");
@@ -5617,6 +5836,7 @@ var REVERSE_AUDIT_GAP = {
5617
5836
  // provable ("no brief was built"), then what that costs ("if at all").
5618
5837
  "not-built": {
5619
5838
  gap: "no auditor was launched with a prompt this skill builds \u2014 the pass that hunts what the rest of the review missed ran, if at all, without the method its brief carries",
5839
+ gapZh: "\u6CA1\u6709\u5BA1\u8BA1 agent \u662F\u7528\u672C skill \u6784\u5EFA\u7684 prompt \u542F\u52A8\u7684\u2014\u2014\u8D1F\u8D23\u641C\u5BFB\u8BC4\u5BA1\u5176\u4F59\u90E8\u5206\u9057\u6F0F\u95EE\u9898\u7684\u8FD9\u9053\u5DE5\u5E8F\uFF0C\u5373\u4FBF\u8FD0\u884C\u8FC7\uFF0C\u4E5F\u7F3A\u5931\u4E86 brief \u627F\u8F7D\u7684\u65B9\u6CD5",
5620
5840
  fix: rebuildFix("reverse-audit", "round")
5621
5841
  },
5622
5842
  // Same reach limit as `not-built`: a hand-written auditor that never opened
@@ -5624,6 +5844,7 @@ var REVERSE_AUDIT_GAP = {
5624
5844
  // may not claim the pass did not run — only that it cannot be certified.
5625
5845
  "not-launched": {
5626
5846
  gap: "its prompt was built, but no agent was launched with it \u2014 the pass that hunts what the rest of the review missed ran, if at all, without the method its brief carries, and cannot be certified",
5847
+ gapZh: "\u5B83\u7684 prompt \u5DF2\u6784\u5EFA\uFF0C\u4F46\u6CA1\u6709 agent \u7528\u5B83\u542F\u52A8\u2014\u2014\u8D1F\u8D23\u641C\u5BFB\u8BC4\u5BA1\u5176\u4F59\u90E8\u5206\u9057\u6F0F\u95EE\u9898\u7684\u8FD9\u9053\u5DE5\u5E8F\uFF0C\u5373\u4FBF\u8FD0\u884C\u8FC7\uFF0C\u4E5F\u7F3A\u5931\u4E86 brief \u627F\u8F7D\u7684\u65B9\u6CD5\uFF0C\u65E0\u6CD5\u4F5C\u8BC1",
5627
5848
  fix: rebuildFix("reverse-audit", "round")
5628
5849
  },
5629
5850
  // `rewritten` is reached only after a successful call OPENED the brief — so
@@ -5632,10 +5853,12 @@ var REVERSE_AUDIT_GAP = {
5632
5853
  // findings, the exact ranges, the guarantee the skill certifies against.
5633
5854
  rewritten: {
5634
5855
  gap: "an auditor ran and opened its brief, but no agent was launched with the prompt the CLI built \u2014 the launch was written by hand, and what the agent was actually asked is not what this skill certifies",
5856
+ gapZh: "\u6709\u5BA1\u8BA1 agent \u8FD0\u884C\u5E76\u6253\u5F00\u4E86\u81EA\u5DF1\u7684 brief\uFF0C\u4F46\u6CA1\u6709 agent \u662F\u7528 CLI \u6784\u5EFA\u7684 prompt \u542F\u52A8\u7684\u2014\u2014\u542F\u52A8 prompt \u662F\u624B\u5199\u7684\uFF0Cagent \u5B9E\u9645\u88AB\u8981\u6C42\u505A\u7684\u5E76\u4E0D\u662F\u672C skill \u6240\u8BA4\u8BC1\u7684\u5185\u5BB9",
5635
5857
  fix: rebuildFix("reverse-audit", "round")
5636
5858
  },
5637
5859
  "brief-unread": {
5638
5860
  gap: "it was launched with the built prompt but never opened its brief, so it audited without the gaps-only method and the finding format it was launched to follow",
5861
+ gapZh: "\u5B83\u7528\u6784\u5EFA\u7684 prompt \u542F\u52A8\uFF0C\u5374\u4ECE\u672A\u6253\u5F00\u81EA\u5DF1\u7684 brief\uFF0C\u5BA1\u8BA1\u65F6\u7F3A\u5931\u4E86\u53EA\u62A5\u7F3A\u53E3\u7684\u65B9\u6CD5\u548C\u5B83\u672C\u5E94\u9075\u5FAA\u7684\u53D1\u73B0\u683C\u5F0F",
5639
5862
  fix: "relaunch with the same printed prompt \u2014 the agent must OPEN the brief file the prompt names; that read is the receipt"
5640
5863
  }
5641
5864
  };
@@ -5644,21 +5867,43 @@ var VERIFY_GAP = {
5644
5867
  // before the transcripts are consulted, so it may not assert nobody ran.
5645
5868
  "not-built": {
5646
5869
  gap: "the review posts findings, but no verifier was launched with a prompt this skill builds \u2014 they were ruled on, if at all, without the verdict bar its brief carries",
5870
+ gapZh: "\u672C\u6B21\u8BC4\u5BA1\u53D1\u5E03\u4E86\u53D1\u73B0\uFF0C\u4F46\u6CA1\u6709\u9A8C\u8BC1 agent \u662F\u7528\u672C skill \u6784\u5EFA\u7684 prompt \u542F\u52A8\u7684\u2014\u2014\u8FD9\u4E9B\u53D1\u73B0\u5373\u4FBF\u88AB\u88C1\u5B9A\u8FC7\uFF0C\u4E5F\u7F3A\u5931\u4E86 brief \u627F\u8F7D\u7684\u88C1\u5B9A\u6807\u51C6",
5647
5871
  fix: rebuildFix("verify", "shard")
5648
5872
  },
5649
5873
  "not-launched": {
5650
5874
  gap: "its prompt was built, but no agent was launched with it, so the posted findings cannot be counted as verified",
5875
+ gapZh: "\u5B83\u7684 prompt \u5DF2\u6784\u5EFA\uFF0C\u4F46\u6CA1\u6709 agent \u7528\u5B83\u542F\u52A8\uFF0C\u53D1\u5E03\u7684\u53D1\u73B0\u4E0D\u80FD\u7B97\u4F5C\u5DF2\u9A8C\u8BC1",
5651
5876
  fix: rebuildFix("verify", "shard")
5652
5877
  },
5653
5878
  rewritten: {
5654
5879
  gap: "a verifier ran and opened its brief, but no agent was launched with the prompt the CLI built \u2014 the launch was written by hand, and the posted findings cannot be counted as verified against it",
5880
+ gapZh: "\u6709\u9A8C\u8BC1 agent \u8FD0\u884C\u5E76\u6253\u5F00\u4E86\u81EA\u5DF1\u7684 brief\uFF0C\u4F46\u6CA1\u6709 agent \u662F\u7528 CLI \u6784\u5EFA\u7684 prompt \u542F\u52A8\u7684\u2014\u2014\u542F\u52A8 prompt \u662F\u624B\u5199\u7684\uFF0C\u53D1\u5E03\u7684\u53D1\u73B0\u4E0D\u80FD\u7B97\u4F5C\u7ECF\u5B83\u9A8C\u8BC1",
5655
5881
  fix: rebuildFix("verify", "shard")
5656
5882
  },
5657
5883
  "brief-unread": {
5658
5884
  gap: "it was launched with the built prompt but never opened its brief, so it ruled on the findings without the verdict bar it was launched to apply",
5885
+ gapZh: "\u5B83\u7528\u6784\u5EFA\u7684 prompt \u542F\u52A8\uFF0C\u5374\u4ECE\u672A\u6253\u5F00\u81EA\u5DF1\u7684 brief\uFF0C\u88C1\u5B9A\u53D1\u73B0\u65F6\u7F3A\u5931\u4E86\u5B83\u672C\u5E94\u4F7F\u7528\u7684\u88C1\u5B9A\u6807\u51C6",
5659
5886
  fix: "relaunch with the same printed prompt \u2014 the agent must OPEN the brief file the prompt names; that read is the receipt"
5660
5887
  }
5661
5888
  };
5889
+ var COMBINED_STEP45_GAP = {
5890
+ "not-built": {
5891
+ en: "neither the verifier nor the reverse auditor was launched with a prompt this skill builds \u2014 the posted findings were ruled on, and the misses the rest of the review left were hunted, if at all, without the briefs this skill certifies against",
5892
+ zh: "\u9A8C\u8BC1 agent \u4E0E\u53CD\u5411\u5BA1\u8BA1 agent \u90FD\u6CA1\u6709\u7528\u672C skill \u6784\u5EFA\u7684 prompt \u542F\u52A8\u2014\u2014\u53D1\u5E03\u7684\u53D1\u73B0\u5373\u4FBF\u88AB\u88C1\u5B9A\u8FC7\u3001\u8BC4\u5BA1\u5176\u4F59\u90E8\u5206\u9057\u6F0F\u7684\u95EE\u9898\u5373\u4FBF\u88AB\u641C\u5BFB\u8FC7\uFF0C\u4E5F\u90FD\u7F3A\u5931\u4E86\u672C skill \u7528\u4EE5\u8BA4\u8BC1\u7684 brief"
5893
+ },
5894
+ "not-launched": {
5895
+ en: "both prompts were built, but no agent was launched with either \u2014 the posted findings cannot be counted as verified, and the pass that hunts what the rest of the review missed cannot be certified",
5896
+ zh: "\u4E24\u4EFD prompt \u90FD\u5DF2\u6784\u5EFA\uFF0C\u4F46\u90FD\u6CA1\u6709 agent \u7528\u5B83\u4EEC\u542F\u52A8\u2014\u2014\u53D1\u5E03\u7684\u53D1\u73B0\u4E0D\u80FD\u7B97\u4F5C\u5DF2\u9A8C\u8BC1\uFF0C\u641C\u5BFB\u8BC4\u5BA1\u9057\u6F0F\u95EE\u9898\u7684\u5DE5\u5E8F\u4E5F\u65E0\u6CD5\u4F5C\u8BC1"
5897
+ },
5898
+ rewritten: {
5899
+ en: "each ran and opened its brief, but neither was launched with the prompt the CLI built \u2014 the launches were written by hand, so the posted findings cannot be counted as verified, and what the agents were actually asked is not what this skill certifies",
5900
+ zh: "\u4E24\u8005\u90FD\u8FD0\u884C\u5E76\u6253\u5F00\u4E86\u5404\u81EA\u7684 brief\uFF0C\u4F46\u90FD\u4E0D\u662F\u7528 CLI \u6784\u5EFA\u7684 prompt \u542F\u52A8\u7684\u2014\u2014\u542F\u52A8 prompt \u662F\u624B\u5199\u7684\uFF0C\u53D1\u5E03\u7684\u53D1\u73B0\u4E0D\u80FD\u7B97\u4F5C\u5DF2\u9A8C\u8BC1\uFF0Cagent \u5B9E\u9645\u88AB\u8981\u6C42\u505A\u7684\u4E5F\u4E0D\u662F\u672C skill \u6240\u8BA4\u8BC1\u7684\u5185\u5BB9"
5901
+ },
5902
+ "brief-unread": {
5903
+ en: "each was launched with its built prompt and never opened its brief, so the findings were ruled on without the verdict bar, and the audit ran without the gaps-only method it was launched to follow",
5904
+ zh: "\u4E24\u8005\u90FD\u7528\u6784\u5EFA\u7684 prompt \u542F\u52A8\uFF0C\u5374\u90FD\u4ECE\u672A\u6253\u5F00\u81EA\u5DF1\u7684 brief\u2014\u2014\u53D1\u73B0\u7684\u88C1\u5B9A\u7F3A\u5931\u4E86\u88C1\u5B9A\u6807\u51C6\uFF0C\u5BA1\u8BA1\u4E5F\u7F3A\u5931\u4E86\u5B83\u672C\u5E94\u9075\u5FAA\u7684\u53EA\u62A5\u7F3A\u53E3\u7684\u65B9\u6CD5"
5905
+ }
5906
+ };
5662
5907
  function verificationGaps(planPath, opts, env = process.env) {
5663
5908
  const { plan, mtimeMs } = readPlan(planPath);
5664
5909
  const records = readTranscripts(mtimeMs, env, plan.diffPathAbsolute);
@@ -5694,7 +5939,6 @@ function verificationGaps(planPath, opts, env = process.env) {
5694
5939
  );
5695
5940
  const reverse = bestDelivery(reverseKeys);
5696
5941
  if (reverse !== "ok") {
5697
- gaps.push(`reverse audit \u2014 ${REVERSE_AUDIT_GAP[reverse].gap}`);
5698
5942
  remediation.push(
5699
5943
  `reverse audit: ${REVERSE_AUDIT_GAP[reverse].fix.replace(
5700
5944
  "--plan <plan>",
@@ -5703,14 +5947,14 @@ function verificationGaps(planPath, opts, env = process.env) {
5703
5947
  );
5704
5948
  }
5705
5949
  let unverifiedFindings = false;
5950
+ let verify = null;
5706
5951
  if (opts.postsFindings) {
5707
5952
  const verifyKeys = [...built.keys()].filter(
5708
5953
  (k) => k === "verify" || k.startsWith("verify--")
5709
5954
  );
5710
- const verify = bestDelivery(verifyKeys);
5955
+ verify = bestDelivery(verifyKeys);
5711
5956
  if (verify !== "ok") {
5712
5957
  unverifiedFindings = true;
5713
- gaps.push(`verification \u2014 ${VERIFY_GAP[verify].gap}`);
5714
5958
  remediation.push(
5715
5959
  `verification: ${VERIFY_GAP[verify].fix.replace(
5716
5960
  "--plan <plan>",
@@ -5721,6 +5965,31 @@ function verificationGaps(planPath, opts, env = process.env) {
5721
5965
  );
5722
5966
  }
5723
5967
  }
5968
+ if (reverse !== "ok" && verify !== null && verify === reverse) {
5969
+ gaps.push({
5970
+ subject: "verification and reverse audit",
5971
+ reason: COMBINED_STEP45_GAP[reverse].en,
5972
+ subjectZh: "\u9A8C\u8BC1\u4E0E\u53CD\u5411\u5BA1\u8BA1",
5973
+ reasonZh: COMBINED_STEP45_GAP[reverse].zh
5974
+ });
5975
+ } else {
5976
+ if (reverse !== "ok") {
5977
+ gaps.push({
5978
+ subject: "reverse audit",
5979
+ reason: REVERSE_AUDIT_GAP[reverse].gap,
5980
+ subjectZh: "\u53CD\u5411\u5BA1\u8BA1",
5981
+ reasonZh: REVERSE_AUDIT_GAP[reverse].gapZh
5982
+ });
5983
+ }
5984
+ if (verify !== null && verify !== "ok") {
5985
+ gaps.push({
5986
+ subject: "verification",
5987
+ reason: VERIFY_GAP[verify].gap,
5988
+ subjectZh: "\u9A8C\u8BC1",
5989
+ reasonZh: VERIFY_GAP[verify].gapZh
5990
+ });
5991
+ }
5992
+ }
5724
5993
  return { ok: gaps.length === 0, gaps, remediation, unverifiedFindings };
5725
5994
  }
5726
5995
  __name(verificationGaps, "verificationGaps");
@@ -5818,6 +6087,8 @@ function composeReview(input) {
5818
6087
  const remediation = [];
5819
6088
  const planRef = input.planPath ? shellQuotePath(input.planPath) : "<plan>";
5820
6089
  const missingReceipts = [];
6090
+ let plannedChunks = [];
6091
+ let coveredChunks = [];
5821
6092
  const nonDeterministicBodyCriticals = bodyCriticals.filter(
5822
6093
  (x) => !/\[(?:build|test)\]/i.test(x)
5823
6094
  ).length;
@@ -5826,12 +6097,16 @@ function composeReview(input) {
5826
6097
  if (!input.planPath) {
5827
6098
  coverageEntries.push({
5828
6099
  subject: "coverage",
5829
- reason: "no plan was given, so this run cannot show that any of the diff was read"
6100
+ reason: "no plan was given, so this run cannot show that any of the diff was read",
6101
+ subjectZh: "\u8986\u76D6\u60C5\u51B5",
6102
+ reasonZh: "\u672A\u63D0\u4F9B plan\uFF0C\u672C\u6B21\u8FD0\u884C\u65E0\u6CD5\u8BC1\u660E diff \u7684\u4EFB\u4F55\u90E8\u5206\u88AB\u8BFB\u8FC7"
5830
6103
  });
5831
6104
  criticalsUnverified = criticalsNeedingVerify >= 1;
5832
6105
  } else {
5833
6106
  try {
5834
6107
  const cov = coverageFromTranscripts(input.planPath, input.env);
6108
+ plannedChunks = cov.plannedChunks;
6109
+ coveredChunks = cov.coveredChunks;
5835
6110
  for (const id of cov.missingChunks) missingReceipts.push(id);
5836
6111
  for (const id of cov.uncoverableChunks) {
5837
6112
  const prefix = `chunk ${id}`;
@@ -5843,7 +6118,8 @@ function composeReview(input) {
5843
6118
  for (const label2 of cov.idleAgents) {
5844
6119
  coverageEntries.push({
5845
6120
  subject: label2,
5846
- reason: "the agent made no tool call: it read nothing"
6121
+ reason: "the agent made no tool call: it read nothing",
6122
+ reasonZh: "\u8BE5 agent \u672A\u53D1\u8D77\u4EFB\u4F55\u5DE5\u5177\u8C03\u7528\uFF1A\u5B83\u4EC0\u4E48\u90FD\u6CA1\u8BFB"
5847
6123
  });
5848
6124
  }
5849
6125
  if (cov.idleAgents.length > 0) {
@@ -5854,7 +6130,8 @@ function composeReview(input) {
5854
6130
  for (const label2 of cov.blindAgents) {
5855
6131
  coverageEntries.push({
5856
6132
  subject: label2,
5857
- reason: "launched with a prompt that never named the diff file, so it could not have read it"
6133
+ reason: "launched with a prompt that never named the diff file, so it could not have read it",
6134
+ reasonZh: "\u542F\u52A8 prompt \u4ECE\u672A\u63D0\u5230 diff \u6587\u4EF6\uFF0C\u5B83\u4E0D\u53EF\u80FD\u8BFB\u8FC7 diff"
5858
6135
  });
5859
6136
  }
5860
6137
  if (cov.blindAgents.length > 0) {
@@ -5865,7 +6142,8 @@ function composeReview(input) {
5865
6142
  for (const label2 of cov.unopenedAgents) {
5866
6143
  coverageEntries.push({
5867
6144
  subject: label2,
5868
- reason: "pointed at diff lines it never opened: it made tool calls, but none of them read the diff"
6145
+ reason: "pointed at diff lines it never opened: it made tool calls, but none of them read the diff",
6146
+ reasonZh: "\u5B83\u88AB\u6307\u5411 diff \u7684\u884C\u5374\u4ECE\u672A\u6253\u5F00\uFF1A\u6709\u5DE5\u5177\u8C03\u7528\uFF0C\u4F46\u6CA1\u6709\u4E00\u6B21\u8BFB\u53D6 diff"
5869
6147
  });
5870
6148
  }
5871
6149
  if (cov.unopenedAgents.length > 0) {
@@ -5891,9 +6169,12 @@ function composeReview(input) {
5891
6169
  }
5892
6170
  } catch (err) {
5893
6171
  const why = err instanceof TranscriptsUnavailableError ? `could not read the agents' transcripts (${err.message})` : `the plan could not be used (${err.message})`;
6172
+ const whyZh = err instanceof TranscriptsUnavailableError ? `\u65E0\u6CD5\u8BFB\u53D6 agent \u7684\u8FD0\u884C\u8BB0\u5F55\uFF08${err.message}\uFF09` : `plan \u65E0\u6CD5\u4F7F\u7528\uFF08${err.message}\uFF09`;
5894
6173
  coverageEntries.push({
5895
6174
  subject: "coverage",
5896
- reason: `${why}, so this run cannot show that any of the diff was read`
6175
+ reason: `${why}, so this run cannot show that any of the diff was read`,
6176
+ subjectZh: "\u8986\u76D6\u60C5\u51B5",
6177
+ reasonZh: `${whyZh}\uFF0C\u672C\u6B21\u8FD0\u884C\u65E0\u6CD5\u8BC1\u660E diff \u7684\u4EFB\u4F55\u90E8\u5206\u88AB\u8BFB\u8FC7`
5897
6178
  });
5898
6179
  }
5899
6180
  try {
@@ -5904,20 +6185,21 @@ function composeReview(input) {
5904
6185
  input.env
5905
6186
  );
5906
6187
  for (const gap of verification.gaps) {
5907
- const cut = gap.indexOf(" \u2014 ");
5908
- coverageEntries.push(
5909
- cut === -1 ? { subject: gap, reason: "" } : {
5910
- subject: gap.slice(0, cut),
5911
- reason: gap.slice(cut + " \u2014 ".length)
5912
- }
5913
- );
6188
+ coverageEntries.push({
6189
+ subject: gap.subject,
6190
+ reason: gap.reason,
6191
+ subjectZh: gap.subjectZh,
6192
+ reasonZh: gap.reasonZh
6193
+ });
5914
6194
  }
5915
6195
  remediation.push(...verification.remediation);
5916
6196
  criticalsUnverified = verification.unverifiedFindings && criticalsNeedingVerify >= 1;
5917
6197
  } catch (err) {
5918
6198
  coverageEntries.push({
5919
6199
  subject: "verification",
5920
- reason: `could not check that Step 4 and Step 5 ran (${err.message})`
6200
+ reason: `could not check that Step 4 and Step 5 ran (${err.message})`,
6201
+ subjectZh: "\u9A8C\u8BC1",
6202
+ reasonZh: `\u65E0\u6CD5\u68C0\u67E5\u6B65\u9AA4 4 \u4E0E\u6B65\u9AA4 5 \u662F\u5426\u8FD0\u884C\uFF08${err.message}\uFF09`
5921
6203
  });
5922
6204
  criticalsUnverified = criticalsNeedingVerify >= 1;
5923
6205
  }
@@ -5981,9 +6263,23 @@ function composeReview(input) {
5981
6263
  downgradedFrom = "Request changes";
5982
6264
  }
5983
6265
  const footer = `_\u2014 ${modelId} via Qwen Code /review_`;
5984
- const finish = /* @__PURE__ */ __name((text) => text === "" ? "" : `${text}
6266
+ const bilingual = bilingualFromPlan(input.planPath);
6267
+ const render = /* @__PURE__ */ __name((parts, sep3) => {
6268
+ const en = parts.map((p) => p.en).join(sep3);
6269
+ if (en === "") return "";
6270
+ const zh = parts.map((p) => p.zh).join(sep3);
6271
+ const text = bilingual && zh !== en ? `${en}
6272
+
6273
+ <details>
6274
+ <summary>\u4E2D\u6587\u8BF4\u660E</summary>
6275
+
6276
+ ${zh}
6277
+
6278
+ </details>` : en;
6279
+ return `${text}
5985
6280
 
5986
- ${footer}`, "finish");
6281
+ ${footer}`;
6282
+ }, "render");
5987
6283
  const notReviewedParts = [];
5988
6284
  if (missingReceipts.length > 0) {
5989
6285
  remediation.push(
@@ -5994,15 +6290,29 @@ ${footer}`, "finish");
5994
6290
  (id) => !disclosedSubjects.has(`chunk ${id}`)
5995
6291
  );
5996
6292
  if (unexplainedReceipts.length > 0) {
5997
- notReviewedParts.push(
5998
- `Not reviewed: ${unexplainedReceipts.map((id) => `chunk ${id}`).join(", ")} \u2014 no agent reported covering these; nobody read them.`
5999
- );
6293
+ const gap = describeChunkGap(unexplainedReceipts, plannedChunks);
6294
+ const pron = gap.plural ? "them" : "it";
6295
+ notReviewedParts.push({
6296
+ en: `Not reviewed: ${gap.phrase} \u2014 no agent reported covering ${pron}; nobody read ${pron}.`,
6297
+ zh: `\u672A\u5BA1\u67E5\uFF1A${gap.phraseZh}\u2014\u2014\u6CA1\u6709 agent \u62A5\u544A\u8986\u76D6\u8FC7\u8FD9\u90E8\u5206\uFF0C\u4E5F\u6CA1\u6709\u4EBA\u8BFB\u8FC7\u5B83\u3002`
6298
+ });
6000
6299
  }
6001
6300
  }
6002
6301
  if (uncoverable.length > 0) {
6003
- notReviewedParts.push(
6004
- `Not reviewed: ${uncoverable.join(", ")} \u2014 a line there exceeds the read limit.`
6005
- );
6302
+ const bareIds = [];
6303
+ const callerNamed = [];
6304
+ for (const e of uncoverable) {
6305
+ const m = /^chunk (\d+)$/.exec(e);
6306
+ if (m) bareIds.push(Number(m[1]));
6307
+ else callerNamed.push(e);
6308
+ }
6309
+ const bareGap = bareIds.length > 0 ? describeChunkGap(bareIds, plannedChunks) : null;
6310
+ const shown = [...bareGap ? [bareGap.phrase] : [], ...callerNamed];
6311
+ const shownZh = [...bareGap ? [bareGap.phraseZh] : [], ...callerNamed];
6312
+ notReviewedParts.push({
6313
+ en: `Not reviewed: ${shown.join(", ")} \u2014 a line there exceeds the read limit.`,
6314
+ zh: `\u672A\u5BA1\u67E5\uFF1A${shownZh.join("\u3001")}\u2014\u2014\u5176\u4E2D\u6709\u4E00\u884C\u8D85\u51FA\u5355\u6B21\u8BFB\u53D6\u4E0A\u9650\u3002`
6315
+ });
6006
6316
  }
6007
6317
  const covEntries = coverageEntries;
6008
6318
  const callerLeft = [];
@@ -6018,32 +6328,67 @@ ${footer}`, "finish");
6018
6328
  const whiffedDimensions = callerLeft.filter((d) => !d.includes(" \u2014 "));
6019
6329
  const explainedCaller = callerLeft.filter((d) => d.includes(" \u2014 "));
6020
6330
  if (whiffedDimensions.length > 0) {
6021
- notReviewedParts.push(
6022
- `Not reviewed: ${whiffedDimensions.join(", ")} \u2014 the agent returned no evidence of its walk twice.`
6023
- );
6331
+ notReviewedParts.push({
6332
+ en: `Not reviewed: ${whiffedDimensions.join(", ")} \u2014 the agent returned no evidence of its walk twice.`,
6333
+ zh: `\u672A\u5BA1\u67E5\uFF1A${whiffedDimensions.join("\u3001")}\u2014\u2014\u8BE5 agent \u8FDE\u7EED\u4E24\u6B21\u672A\u8FD4\u56DE\u4EFB\u4F55\u68C0\u67E5\u8FC7\u7A0B\u7684\u8BC1\u636E\u3002`
6334
+ });
6024
6335
  }
6025
6336
  for (const d of explainedCaller) {
6026
- notReviewedParts.push(`Not reviewed: ${d}.`);
6337
+ notReviewedParts.push({
6338
+ en: `Not reviewed: ${d}.`,
6339
+ zh: `\u672A\u5BA1\u67E5\uFF1A${d}\u3002`
6340
+ });
6027
6341
  }
6028
6342
  const seenSubjects = /* @__PURE__ */ new Set();
6029
6343
  const byReason = /* @__PURE__ */ new Map();
6030
- for (const { subject, reason } of covEntries) {
6031
- if (seenSubjects.has(subject)) continue;
6032
- seenSubjects.add(subject);
6033
- const subjects = byReason.get(reason) ?? [];
6034
- subjects.push(subject);
6035
- byReason.set(reason, subjects);
6036
- }
6037
- for (const [reason, subjects] of byReason) {
6038
- notReviewedParts.push(
6039
- reason ? `Not reviewed: ${subjects.join(", ")} \u2014 ${reason}.` : `Not reviewed: ${subjects.join(", ")}.`
6040
- );
6344
+ const reasonZhOf = /* @__PURE__ */ new Map();
6345
+ for (const e of covEntries) {
6346
+ if (seenSubjects.has(e.subject)) continue;
6347
+ seenSubjects.add(e.subject);
6348
+ const key = e.publicReason ?? e.reason;
6349
+ const group = byReason.get(key) ?? [];
6350
+ group.push({
6351
+ subject: e.subject,
6352
+ publicSubject: e.publicSubject,
6353
+ subjectZh: e.subjectZh
6354
+ });
6355
+ byReason.set(key, group);
6356
+ if (e.reasonZh !== void 0 && !reasonZhOf.has(key)) {
6357
+ reasonZhOf.set(key, e.reasonZh);
6358
+ }
6359
+ }
6360
+ for (const [reason, entries] of byReason) {
6361
+ const chunkIds = [];
6362
+ const named = [];
6363
+ const namedZh = [];
6364
+ for (const e of entries) {
6365
+ const m = /^chunk (\d+)$/.exec(e.subject);
6366
+ if (m) chunkIds.push(Number(m[1]));
6367
+ else {
6368
+ named.push(e.publicSubject ?? e.subject);
6369
+ namedZh.push(e.subjectZh ?? e.publicSubject ?? e.subject);
6370
+ }
6371
+ }
6372
+ const gap = chunkIds.length > 0 ? describeChunkGap(chunkIds, plannedChunks) : null;
6373
+ const shown = [...gap ? [gap.phrase] : [], ...named];
6374
+ const shownZh = [...gap ? [gap.phraseZh] : [], ...namedZh];
6375
+ const reasonZh = reasonZhOf.get(reason) ?? reason;
6376
+ notReviewedParts.push({
6377
+ en: reason ? `Not reviewed: ${shown.join(", ")} \u2014 ${reason}.` : `Not reviewed: ${shown.join(", ")}.`,
6378
+ zh: reason ? `\u672A\u5BA1\u67E5\uFF1A${shownZh.join("\u3001")}\u2014\u2014${reasonZh}\u3002` : `\u672A\u5BA1\u67E5\uFF1A${shownZh.join("\u3001")}\u3002`
6379
+ });
6041
6380
  }
6042
6381
  const cannotTellBlock = cannotTell.length === 0 ? [] : [
6043
- `Unresolved, please confirm: ${cannotTell.map((l) => withMarker(l)).join(" ")}`
6382
+ {
6383
+ en: `Unresolved, please confirm: ${cannotTell.map((l) => withMarker(l)).join(" ")}`,
6384
+ zh: `\u672A\u51B3\uFF0C\u8BF7\u786E\u8BA4\uFF1A${cannotTell.map((l) => withMarker(l)).join(" ")}`
6385
+ }
6044
6386
  ];
6045
- const bodyCriticalBlock = bodyCriticals.map((l) => withMarker(l));
6046
- const contextUnavailableClause = "Reviewed diff-only \u2014 the PR\u2019s existing discussion could not be fetched, so this is not an approval and not a no-blockers claim.";
6387
+ const bodyCriticalBlock = bodyCriticals.map((l) => withMarker(l)).map((l) => ({ en: l, zh: l }));
6388
+ const contextUnavailableClause = {
6389
+ en: "Reviewed diff-only \u2014 the PR\u2019s existing discussion could not be fetched, so this is not an approval and not a no-blockers claim.",
6390
+ zh: '\u4EC5\u5BA1\u67E5\u4E86 diff\u2014\u2014\u65E0\u6CD5\u83B7\u53D6 PR \u5DF2\u6709\u7684\u8BA8\u8BBA\uFF0C\u56E0\u6B64\u8FD9\u4E0D\u6784\u6210\u6279\u51C6\uFF0C\u4E5F\u4E0D\u6784\u6210"\u65E0\u963B\u65AD\u95EE\u9898"\u7684\u7ED3\u8BBA\u3002'
6391
+ };
6047
6392
  if (event === "REQUEST_CHANGES") {
6048
6393
  const parts = [
6049
6394
  ...contextUnavailable ? [contextUnavailableClause] : [],
@@ -6053,7 +6398,7 @@ ${footer}`, "finish");
6053
6398
  ];
6054
6399
  return {
6055
6400
  event,
6056
- body: finish(parts.join("\n\n")),
6401
+ body: render(parts, "\n\n"),
6057
6402
  baseEvent,
6058
6403
  cappedBy,
6059
6404
  downgraded,
@@ -6064,7 +6409,10 @@ ${footer}`, "finish");
6064
6409
  if (event === "APPROVE") {
6065
6410
  return {
6066
6411
  event,
6067
- body: finish("No issues found. LGTM! \u2705"),
6412
+ body: render(
6413
+ [{ en: "No issues found. LGTM! \u2705", zh: "\u672A\u53D1\u73B0\u95EE\u9898\u3002LGTM\uFF01\u2705" }],
6414
+ " "
6415
+ ),
6068
6416
  baseEvent,
6069
6417
  cappedBy,
6070
6418
  downgraded,
@@ -6075,9 +6423,11 @@ ${footer}`, "finish");
6075
6423
  const clauses = [];
6076
6424
  if (downgraded && downgradedFrom) {
6077
6425
  const reasons = downgradeReasons.join("; ");
6078
- clauses.push(
6079
- `\u26A0\uFE0F Downgraded from ${downgradedFrom} to Comment${reasons ? `: ${reasons}` : ""}.`
6080
- );
6426
+ const fromZh = downgradedFrom === "Approve" ? "\u6279\u51C6" : "\u8BF7\u6C42\u4FEE\u6539";
6427
+ clauses.push({
6428
+ en: `\u26A0\uFE0F Downgraded from ${downgradedFrom} to Comment${reasons ? `: ${reasons}` : ""}.`,
6429
+ zh: `\u26A0\uFE0F \u5DF2\u4ECE${fromZh}\u964D\u7EA7\u4E3A\u8BC4\u8BBA${reasons ? `\uFF1A${reasons}` : ""}\u3002`
6430
+ });
6081
6431
  }
6082
6432
  if (contextUnavailable) {
6083
6433
  clauses.push(contextUnavailableClause);
@@ -6086,14 +6436,28 @@ ${footer}`, "finish");
6086
6436
  // body could open "Reviewed — no blockers." two lines above "nobody read
6087
6437
  // them." Nothing nobody read can be certified blocker-free.
6088
6438
  missingReceipts.length === 0;
6089
- clauses.push(canCertify ? "Reviewed \u2014 no blockers." : "Reviewed.");
6090
- }
6091
- if (suggestionsInline > 0) clauses.push("Suggestions are inline.");
6092
- if (suggestionsDiscarded > 0) {
6439
+ const disclosedChunkIds = /* @__PURE__ */ new Set();
6440
+ for (const e of coverageEntries) {
6441
+ const m = /^chunk (\d+)$/.exec(e.subject);
6442
+ if (m) disclosedChunkIds.add(Number(m[1]));
6443
+ }
6444
+ const nothingCertified = coverageEntries.some((e) => e.subject === "coverage") || plannedChunks.length > 0 && coveredChunks.every((id) => disclosedChunkIds.has(id));
6093
6445
  clauses.push(
6094
- `${suggestionsDiscarded} Suggestion-level finding(s) could not be anchored to a changed line and were dropped; nothing further to act on here.`
6446
+ nothingCertified ? {
6447
+ en: "\u26A0\uFE0F This run could not certify that any of this diff was reviewed.",
6448
+ zh: "\u26A0\uFE0F \u672C\u6B21\u8FD0\u884C\u65E0\u6CD5\u8BC1\u660E\u8FD9\u4E2A diff \u7684\u4EFB\u4F55\u90E8\u5206\u7ECF\u8FC7\u4E86\u5BA1\u67E5\u3002"
6449
+ } : canCertify ? { en: "Reviewed \u2014 no blockers.", zh: "\u5DF2\u5BA1\u67E5\u2014\u2014\u65E0\u963B\u65AD\u95EE\u9898\u3002" } : { en: "Reviewed.", zh: "\u5DF2\u5BA1\u67E5\u3002" }
6095
6450
  );
6096
6451
  }
6452
+ if (suggestionsInline > 0) {
6453
+ clauses.push({ en: "Suggestions are inline.", zh: "\u5EFA\u8BAE\u89C1\u884C\u5185\u8BC4\u8BBA\u3002" });
6454
+ }
6455
+ if (suggestionsDiscarded > 0) {
6456
+ clauses.push({
6457
+ en: `${suggestionsDiscarded} Suggestion-level finding(s) could not be anchored to a changed line and were dropped; nothing further to act on here.`,
6458
+ zh: `${suggestionsDiscarded} \u6761\u5EFA\u8BAE\u7EA7\u53D1\u73B0\u65E0\u6CD5\u951A\u5B9A\u5230\u6539\u52A8\u884C\uFF0C\u5DF2\u4E22\u5F03\uFF1B\u6B64\u5904\u65E0\u9700\u8FDB\u4E00\u6B65\u5904\u7406\u3002`
6459
+ });
6460
+ }
6097
6461
  clauses.push(...cannotTellBlock);
6098
6462
  clauses.push(...notReviewedParts);
6099
6463
  if (downgradedFrom === "Request changes" || criticalsUnverified) {
@@ -6101,7 +6465,7 @@ ${footer}`, "finish");
6101
6465
  }
6102
6466
  return {
6103
6467
  event,
6104
- body: finish(clauses.join(" ")),
6468
+ body: render(clauses, " "),
6105
6469
  baseEvent,
6106
6470
  cappedBy,
6107
6471
  downgraded,
@@ -6110,6 +6474,46 @@ ${footer}`, "finish");
6110
6474
  };
6111
6475
  }
6112
6476
  __name(composeReview, "composeReview");
6477
+ function describeChunkGap(ids, planned) {
6478
+ const uniq = [...new Set(ids)].sort((a, b) => a - b);
6479
+ const inGap = new Set(uniq);
6480
+ if (planned.length > 0 && planned.every((p) => inGap.has(p.id))) {
6481
+ return { phrase: "the entire diff", phraseZh: "\u6574\u4E2A diff", plural: false };
6482
+ }
6483
+ const byId = new Map(planned.map((p) => [p.id, p.files]));
6484
+ const files = [];
6485
+ let allKnown = planned.length > 0;
6486
+ for (const id of uniq) {
6487
+ const f = byId.get(id) ?? [];
6488
+ if (f.length === 0) allKnown = false;
6489
+ for (const p of f) {
6490
+ if (!files.includes(p)) files.push(p);
6491
+ }
6492
+ }
6493
+ if (allKnown && files.length <= 4) {
6494
+ return {
6495
+ phrase: `the diff ${uniq.length === 1 ? "section" : "sections"} covering ${files.join(", ")}`,
6496
+ phraseZh: `\u6D89\u53CA ${files.join("\u3001")} \u7684 diff \u7247\u6BB5`,
6497
+ plural: uniq.length > 1
6498
+ };
6499
+ }
6500
+ return {
6501
+ phrase: planned.length > 0 ? `${uniq.length} of the diff's ${planned.length} sections` : `${uniq.length} ${uniq.length === 1 ? "section" : "sections"} of the diff`,
6502
+ phraseZh: planned.length > 0 ? `diff ${planned.length} \u4E2A\u7247\u6BB5\u4E2D\u7684 ${uniq.length} \u4E2A` : `diff \u4E2D\u7684 ${uniq.length} \u4E2A\u7247\u6BB5`,
6503
+ plural: uniq.length > 1
6504
+ };
6505
+ }
6506
+ __name(describeChunkGap, "describeChunkGap");
6507
+ function bilingualFromPlan(planPath) {
6508
+ if (!planPath) return false;
6509
+ try {
6510
+ const plan = JSON.parse(readFileSync7(planPath, "utf8"));
6511
+ return plan?.prDescriptionHasHan === true;
6512
+ } catch {
6513
+ return false;
6514
+ }
6515
+ }
6516
+ __name(bilingualFromPlan, "bilingualFromPlan");
6113
6517
  function readDraftedComments(path3) {
6114
6518
  let raw;
6115
6519
  try {
@@ -6632,7 +7036,7 @@ async function runFetchPr(args) {
6632
7036
  "--repo",
6633
7037
  ownerRepo,
6634
7038
  "--json",
6635
- "headRefName,headRefOid,baseRefName,additions,deletions,changedFiles,isCrossRepository"
7039
+ "headRefName,headRefOid,baseRefName,additions,deletions,changedFiles,isCrossRepository,body"
6636
7040
  );
6637
7041
  meta = JSON.parse(json);
6638
7042
  } catch (err) {
@@ -6720,6 +7124,7 @@ async function runFetchPr(args) {
6720
7124
  baseFetchFailed,
6721
7125
  diffPath,
6722
7126
  diffPathAbsolute,
7127
+ prDescriptionHasHan: new RegExp("\\p{Script=Han}", "u").test(meta.body ?? ""),
6723
7128
  ...buildPlanReport(plan, (path3) => fileLineCount(fetchedSha, path3))
6724
7129
  };
6725
7130
  writeFileSync5(out, stringifyPlanReport(result), "utf8");
@@ -9040,9 +9445,12 @@ ${prompt}`;
9040
9445
  const paramNote = typeof wt === "string" && wt ? `
9041
9446
 
9042
9447
  **Agent tool parameters (worktree mode):** Set \`working_dir: "${wt}"\` and \`subagent_type: "general-purpose"\`, \`run_in_background: false\` on EVERY agent call below. Do NOT set \`isolation\` \u2014 the worktree already exists; \`isolation\` creates a new copy and is mutually exclusive with \`working_dir\`.` : "";
9448
+ const descNote = `
9449
+
9450
+ The \`description\` parameter of each Agent call is the task name the user watches while the agent runs \u2014 write it in your output language, translating the block's \u2500\u2500\u2500\u2500\u2500 separator label (keep the role/chunk id visible). Display only: the prompt itself stays the block VERBATIM.`;
9043
9451
  writeStdoutLine(
9044
9452
  [
9045
- `${roster.length} agents required. Launch one agent per block below, passing its block VERBATIM \u2014 copy, do not retype. The \u2500\u2500\u2500\u2500\u2500 lines are separators, not part of any prompt. This is the same roster \`check-coverage\` reads out of the plan: a block you skip or reword is a dimension nobody reviewed. Blocks are numbered \`agent k of ${roster.length}\` and the output ends with an end-of-roster line \u2014 if either is missing, this output was truncated in transit: every prompt is also recorded on disk, so rebuild just the missing blocks with --chunk <id>, or --role <r> (--file <path> for an invariant agent), plus the same --rules this call was given.` + paramNote,
9453
+ `${roster.length} agents required. Launch one agent per block below, passing its block VERBATIM \u2014 copy, do not retype. The \u2500\u2500\u2500\u2500\u2500 lines are separators, not part of any prompt. This is the same roster \`check-coverage\` reads out of the plan: a block you skip or reword is a dimension nobody reviewed. Blocks are numbered \`agent k of ${roster.length}\` and the output ends with an end-of-roster line \u2014 if either is missing, this output was truncated in transit: every prompt is also recorded on disk, so rebuild just the missing blocks with --chunk <id>, or --role <r> (--file <path> for an invariant agent), plus the same --rules this call was given.` + descNote + paramNote,
9046
9454
  ...blocks,
9047
9455
  `\u2500\u2500\u2500\u2500\u2500 end of roster \u2014 ${roster.length} agents \u2500\u2500\u2500\u2500\u2500`
9048
9456
  ].join("\n\n")
@@ -9078,7 +9486,7 @@ function runAllChunks(report, planPath, role, findingsContent, rules, round) {
9078
9486
  });
9079
9487
  writeStdoutLine(
9080
9488
  [
9081
- `${chunks.length} auditors required this round \u2014 one per chunk. Launch one agent per block below, passing its block VERBATIM \u2014 copy, do not retype, and NEVER sample this output (no \`| head\`): the text IS the deliverable, and a launch reconstructed from a sample matches no record. Blocks are numbered \`auditor k of ${chunks.length}\` and the output ends with an end-of-round line \u2014 if either is missing, the output was truncated in transit; rebuild just the missing chunks with --chunk <id>.`,
9489
+ `${chunks.length} auditors required this round \u2014 one per chunk. Launch one agent per block below, passing its block VERBATIM \u2014 copy, do not retype, and NEVER sample this output (no \`| head\`): the text IS the deliverable, and a launch reconstructed from a sample matches no record. Blocks are numbered \`auditor k of ${chunks.length}\` and the output ends with an end-of-round line \u2014 if either is missing, the output was truncated in transit; rebuild just the missing chunks with --chunk <id>. Write each Agent call's \`description\` (the task name the user watches) in your output language, translating the separator label \u2014 display only; the prompt stays the block VERBATIM.`,
9082
9490
  ...blocks,
9083
9491
  `\u2500\u2500\u2500\u2500\u2500 end of round \u2014 ${chunks.length} auditors \u2500\u2500\u2500\u2500\u2500`
9084
9492
  ].join("\n\n")
@@ -10777,10 +11185,10 @@ var updateCommand3 = {
10777
11185
  stdioHelpers,
10778
11186
  { updateEventEmitter }
10779
11187
  ] = await Promise.all([
10780
- import("./settings-QHXCJDSR.js"),
10781
- import("./updateCheck-PVROE4GR.js"),
10782
- import("./installationInfo-LAWMHQAG.js"),
10783
- import("./standalone-update-BKLONSVI.js"),
11188
+ import("./settings-CR2EWTBA.js"),
11189
+ import("./updateCheck-RKL6M5XN.js"),
11190
+ import("./installationInfo-6O2YAA52.js"),
11191
+ import("./standalone-update-Q6WFRZZQ.js"),
10784
11192
  import("./stdioHelpers-HGIYTWAY.js"),
10785
11193
  import("./updateEventEmitter-5MKC7BLQ.js")
10786
11194
  ]);
@@ -11928,6 +12336,9 @@ async function loadCliConfig(settings, argv, cwd = process.cwd(), overrideExtens
11928
12336
  excludeTools: mergedDeny,
11929
12337
  disabledSlashCommands: disabledSlashCommands.length > 0 ? disabledSlashCommands : void 0,
11930
12338
  disabledSkillNamesProvider: bareMode || safeMode ? void 0 : disabledSkillNamesProvider,
12339
+ customSkillDirs: bareMode || safeMode ? void 0 : (Array.isArray(settings.skills?.directories) ? settings.skills.directories : []).filter(
12340
+ (d) => typeof d === "string" && d.trim().length > 0
12341
+ ).map((d) => d.trim()),
11931
12342
  disabledTools: disabledTools.length > 0 ? disabledTools : void 0,
11932
12343
  visibleTools: visibleTools.length > 0 ? visibleTools : void 0,
11933
12344
  // New unified permissions (PermissionManager source of truth).
@@ -11966,14 +12377,13 @@ async function loadCliConfig(settings, argv, cwd = process.cwd(), overrideExtens
11966
12377
  },
11967
12378
  showResponseTokensPerSecond: settings.ui?.showResponseTokensPerSecond === true,
11968
12379
  telemetry: telemetrySettings,
11969
- // Ordinary interactive TUI defers telemetry until after first paint. Auth
11970
- // events emitted before the deferred init are an accepted startup-latency
11971
- // tradeoff. This intentionally differs from IDE deferral: `qwen -i
11972
- // "prompt"` must await IDE context before auto-submit, but telemetry can
11973
- // still initialize after render unless an initial prompt is present.
11974
- deferTelemetryInitialization: interactive && !isAcpMode && !question,
12380
+ // Ordinary interactive TUI defers telemetry until after first paint; ACP
12381
+ // defers it until after the initialize response is written. Events emitted
12382
+ // before deferred init are an accepted startup-latency tradeoff. `qwen -i
12383
+ // "prompt"` still initializes eagerly because it auto-submits after render.
12384
+ deferTelemetryInitialization: isAcpMode || interactive && !question,
11975
12385
  outboundCorrelation: settings.outboundCorrelation,
11976
- usageStatisticsEnabled: settings.privacy?.usageStatisticsEnabled ?? true,
12386
+ usageStatisticsEnabled: parseBooleanEnvFlag(process.env["QWEN_USAGE_STATISTICS_ENABLED"]) ?? settings.privacy?.usageStatisticsEnabled ?? true,
11977
12387
  clearContextOnIdle: settings.context?.clearContextOnIdle,
11978
12388
  fileFiltering: settings.context?.fileFiltering,
11979
12389
  plansDirectory: settings.plansDirectory,
@@ -12076,6 +12486,7 @@ async function loadCliConfig(settings, argv, cwd = process.cwd(), overrideExtens
12076
12486
  fastModel: settings.fastModel || void 0,
12077
12487
  webSearch: bareMode || safeMode ? void 0 : resolveWebSearchSettings(settings),
12078
12488
  visionModel: settings.visionModel || void 0,
12489
+ imageModel: settings.imageModel || void 0,
12079
12490
  visionBridgeTimeoutMs: settings.visionBridgeTimeoutMs,
12080
12491
  modelFallbacks: resolveModelFallbacks(
12081
12492
  argv.fallbackModel,