@qwen-code/qwen-code 0.20.2-headless-image-routing.1 → 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-PLQQB22E.js → StandaloneSessionPicker-BIRMPLRD.js} +66 -59
  7. package/chunks/{acp-startup-profiler-N3RHHXJ3.js → acp-startup-profiler-RV3IV562.js} +2 -2
  8. package/chunks/{acpAgent-AIVK2EM5.js → acpAgent-6J2U72PQ.js} +705 -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-GHIZ4MSZ.js → build-RV63TIRH.js} +2 -3
  16. package/chunks/{ca-N6VVUFVB.js → ca-25EDXPFZ.js} +2 -0
  17. package/chunks/{channel-worker-group-QZV2SP5U.js → channel-worker-group-2ZD7TVAT.js} +8 -7
  18. package/chunks/{channel-worker-manager-3GMAU45H.js → channel-worker-manager-4OA4BCGB.js} +190 -30
  19. package/chunks/{channel-worker-supervisor-QCXSXCRY.js → channel-worker-supervisor-V7KCFJTS.js} +7 -6
  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-4DWTDZGS.js → chunk-2NH6DYI4.js} +12 -12
  24. package/chunks/chunk-2SCDWPXI.js +246 -0
  25. package/chunks/{chunk-QE4KFTBS.js → chunk-2X55UKQE.js} +3 -3
  26. package/chunks/{chunk-QBUDF33N.js → chunk-3QMGYBFN.js} +1 -1
  27. package/chunks/{chunk-3OAKYHRG.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-GHRSKGHF.js → chunk-4WIZGAH3.js} +7 -7
  31. package/chunks/{chunk-CAS7CB3T.js → chunk-55DJUCI2.js} +87 -29
  32. package/chunks/{chunk-QNLNLENL.js → chunk-5I2IWRSH.js} +2 -2
  33. package/chunks/{chunk-H24SOJIQ.js → chunk-5NBDS5S6.js} +147 -7
  34. package/chunks/{chunk-E4IMU4Y5.js → chunk-63P4EL5V.js} +1 -1
  35. package/chunks/chunk-6FGBXPWM.js +293 -0
  36. package/chunks/{chunk-FFFM6NJV.js → chunk-6GMVPFB2.js} +155 -73
  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-FZPTCQY7.js → chunk-7JURR4JT.js} +1 -1
  40. package/chunks/{chunk-Q6NAKZTA.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-YO2XRXY6.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-FRPDJNK3.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-ZDP2Y2AL.js → chunk-CIKQ7KKO.js} +4625 -8645
  52. package/chunks/{chunk-PEJWA3QQ.js → chunk-D3UEZIQH.js} +4 -2
  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-JC26SJ5Y.js → chunk-EBJQ6AXW.js} +13 -12
  58. package/chunks/{chunk-RCWKCN2Z.js → chunk-EPDRMGT4.js} +164 -17
  59. package/chunks/{chunk-FUFCALSJ.js → chunk-ETSW4KLJ.js} +2 -2
  60. package/chunks/{chunk-KHOVYUHX.js → chunk-FNQ6T3CV.js} +20 -3
  61. package/chunks/{chunk-SP5WRGVG.js → chunk-FQK6JAFG.js} +72 -23
  62. package/chunks/{chunk-NWZY2SPY.js → chunk-FSITMZJH.js} +8 -8
  63. package/chunks/{chunk-6RLROE6G.js → chunk-GLWP3FDB.js} +80 -15
  64. package/chunks/{chunk-KPBVP6SL.js → chunk-GSN55ZRI.js} +5 -5
  65. package/chunks/{chunk-MLYGPZGU.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-5G3ZVADU.js → chunk-IJTOWOD7.js} +17 -6
  69. package/chunks/chunk-IKCX4CCL.js +469 -0
  70. package/chunks/{chunk-LPEONXNV.js → chunk-IKYJHJNF.js} +3 -3
  71. package/chunks/{chunk-DTZY2SH2.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-46DK772E.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-RKWX4CMO.js → chunk-JVPM2ULZ.js} +6 -6
  78. package/chunks/{chunk-ENPCQK44.js → chunk-JXJFVC6E.js} +37 -18
  79. package/chunks/{chunk-NABLFI57.js → chunk-JZA3JUDJ.js} +1 -1
  80. package/chunks/{chunk-CGLQAVZE.js → chunk-K36B6G2O.js} +5 -5
  81. package/chunks/{chunk-GPSKDNEE.js → chunk-K4XWPEWB.js} +4 -4
  82. package/chunks/{chunk-QOZOIPSF.js → chunk-KIM5GUMA.js} +650 -113
  83. package/chunks/{chunk-JZSM2IZ3.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-O2XSCRCS.js → chunk-LB6DUZ26.js} +259 -67
  88. package/chunks/chunk-LEH5C7FV.js +232 -0
  89. package/chunks/{chunk-RWV32G2M.js → chunk-LH2BYDQ5.js} +6 -4
  90. package/chunks/{chunk-QKTHJXCS.js → chunk-LK7CHLVP.js} +79 -2
  91. package/chunks/{chunk-VRRF3GW5.js → chunk-LKEJ26GS.js} +11 -11
  92. package/chunks/{chunk-SQFXI7VK.js → chunk-LQIW3YFY.js} +227 -41
  93. package/chunks/chunk-LS77BEZP.js +405 -0
  94. package/chunks/{chunk-BSHD62QJ.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-3HFNGB2O.js → chunk-MVSUYZDT.js} +4 -4
  99. package/chunks/{chunk-T5IO6FZ4.js → chunk-MZAXJAUM.js} +1 -1
  100. package/chunks/{chunk-QKNXKTZX.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-CS2FSS7W.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-7THPNISK.js → chunk-PC6JANNU.js} +5 -5
  108. package/chunks/{chunk-OTQ6PSZC.js → chunk-PHOF65IG.js} +3498 -1030
  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-RECUEJ7B.js → chunk-PSOO6YXD.js} +18 -15
  113. package/chunks/{chunk-X6N25LXS.js → chunk-PWTZEM3C.js} +2 -2
  114. package/chunks/{chunk-5NJTNQUW.js → chunk-PWVFN2LF.js} +1 -1
  115. package/chunks/{chunk-7AUH6A4T.js → chunk-Q4M4MDQ4.js} +2 -2
  116. package/chunks/{chunk-EZPB6S2I.js → chunk-QAF7NMK7.js} +1 -1
  117. package/chunks/{chunk-5GI55PF5.js → chunk-R5AFZNQW.js} +5 -5
  118. package/chunks/{chunk-T5B5NQZX.js → chunk-RF3EXIHJ.js} +47 -60
  119. package/chunks/{chunk-4K7VDKAD.js → chunk-RHLZR4E5.js} +1 -1
  120. package/chunks/{chunk-TJDW42MV.js → chunk-RIBKPMRP.js} +220 -141
  121. package/chunks/{chunk-RVLZCXEE.js → chunk-RWTEFFPU.js} +82 -3
  122. package/chunks/{chunk-L5QZGCRH.js → chunk-RZIX2G32.js} +1 -1
  123. package/chunks/{chunk-LLKWRXSS.js → chunk-SQCQ4KO2.js} +350 -418
  124. package/chunks/{chunk-THJNPLI4.js → chunk-TARRHLLG.js} +1 -0
  125. package/chunks/{chunk-XCXYRDHB.js → chunk-TEHGS6UP.js} +47 -18
  126. package/chunks/{chunk-PQIVAWXN.js → chunk-TGILQ3YH.js} +8 -8
  127. package/chunks/{chunk-Q2YKNMLS.js → chunk-TOFQCPDC.js} +43 -10
  128. package/chunks/{chunk-L3KUB6XM.js → chunk-TPRQ7RZH.js} +586 -242
  129. package/chunks/{chunk-T4TZQJ7W.js → chunk-TWPJO254.js} +5 -16
  130. package/chunks/{chunk-HIP6TVWA.js → chunk-U7M2DMGW.js} +3 -3
  131. package/chunks/{chunk-ACW3VNUE.js → chunk-UDX5OBWR.js} +41 -9
  132. package/chunks/{chunk-LW2FUYBN.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-O4BHWVUD.js → chunk-VIA5XA4U.js} +5 -2
  137. package/chunks/{chunk-EBXZ2YGV.js → chunk-VRYUBFMC.js} +1 -1
  138. package/chunks/{chunk-TWVE5ZS5.js → chunk-VULLI6WQ.js} +172 -6
  139. package/chunks/{chunk-LNDD3IML.js → chunk-WCXCRJYB.js} +1 -1
  140. package/chunks/{chunk-2LI23QA6.js → chunk-X5XDDSSH.js} +1 -1
  141. package/chunks/{chunk-Q35QUZDQ.js → chunk-Y34KJKDC.js} +1 -1
  142. package/chunks/{chunk-7NR2AIK6.js → chunk-YBL3QUDD.js} +2 -2
  143. package/chunks/{chunk-H4AR2JQF.js → chunk-YH6G52F2.js} +3 -3
  144. package/chunks/{chunk-MBOJHHPI.js → chunk-YPE6A4GC.js} +2 -2
  145. package/chunks/{chunk-3EK5ZOUQ.js → chunk-YX324OPW.js} +1 -1
  146. package/chunks/{chunk-4PTLZ3NX.js → chunk-Z2BC6UJ5.js} +3 -3
  147. package/chunks/{chunk-QLJUC7TG.js → chunk-ZD6UTE4A.js} +1 -1
  148. package/chunks/{chunk-LX3COOXF.js → chunk-ZFDTEDCF.js} +6 -6
  149. package/chunks/chunk-ZJHVAS7M.js +289 -0
  150. package/chunks/{chunk-4OWXOUYF.js → chunk-ZNAUOR2I.js} +15 -12
  151. package/chunks/{chunk-T2L47JJK.js → chunk-ZOIFNCKL.js} +4 -4
  152. package/chunks/{computer-use-2VIV73WK.js → computer-use-SOQ4E3VX.js} +43 -35
  153. package/chunks/{config-utils-FYTBZLCJ.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-XDHHC2P4.js → create-sub-session-QRJLW5BV.js} +43 -35
  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-CS6SFEXC.js → edit-OBDSQURM.js} +43 -35
  171. package/chunks/{en-USMCCJAJ.js → en-MTWBNGDO.js} +15 -0
  172. package/chunks/{enter-worktree-LMAL75DY.js → enter-worktree-U6MRPQ2P.js} +43 -35
  173. package/chunks/{enterPlanMode-WVJB4DSS.js → enterPlanMode-BC5QUZZ2.js} +43 -35
  174. package/chunks/{environment-6YHC4JAJ.js → environment-W5UFC2CH.js} +46 -38
  175. package/chunks/errors-M7CLORXH.js +88 -0
  176. package/chunks/{exit-worktree-KPFD742L.js → exit-worktree-DGNYMECB.js} +43 -35
  177. package/chunks/{exitPlanMode-UEJS6CDY.js → exitPlanMode-GXTBWQAR.js} +43 -35
  178. package/chunks/{fast-path-G2N4NRCA.js → fast-path-JJZFJANL.js} +6 -6
  179. package/chunks/{fast-path-settings-DAOVFADC.js → fast-path-settings-WQJU2LAT.js} +2 -2
  180. package/chunks/{fr-WVHEBDDB.js → fr-45RLL55O.js} +1 -0
  181. package/chunks/{gemini-2MDVIOVT.js → gemini-QS36EBZV.js} +132 -102
  182. package/chunks/{geminiContentGenerator-ZXTDBMFR.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-562XFLIZ.js → glob-V7R3PSK3.js} +43 -35
  189. package/chunks/{grep-MGEFBDQK.js → grep-QYPSK7OP.js} +43 -35
  190. package/chunks/handleAutoUpdate-6DBEZYPV.js +81 -0
  191. package/chunks/{i18n-R6HJENXA.js → i18n-VUJJZIMU.js} +44 -36
  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-4KNYSOYC.js → managed-npm-update-JYEMMXA3.js} +94 -38
  206. package/chunks/mcp-6DBDJPFU.js +83 -0
  207. package/chunks/{monitor-DMHKE4SW.js → monitor-R3ODH5U6.js} +45 -36
  208. package/chunks/node-UUDY34IG.js +305 -0
  209. package/chunks/nonInteractiveCli-MOYCYBBU.js +141 -0
  210. package/chunks/{notebook-edit-35SJGEOR.js → notebook-edit-BNOK452R.js} +43 -35
  211. package/chunks/{openaiContentGenerator-5LPAFXPF.js → openaiContentGenerator-WMCU3O2H.js} +27 -17
  212. package/chunks/pidfile-TFRZZZIO.js +86 -0
  213. package/chunks/{processUtils-GM2I55KF.js → processUtils-RT7UNCC2.js} +2 -2
  214. package/chunks/{pt-OK455PLH.js → pt-22Q3FP73.js} +1 -0
  215. package/chunks/{qwenContentGenerator-HKOYNP7H.js → qwenContentGenerator-HHCRK4SX.js} +56 -42
  216. package/chunks/{qwenOAuth2-NUUYC3V5.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-5VH3F4NW.js → run-qwen-serve-FU6HEM4J.js} +271 -57
  224. package/chunks/{runtime-OH77YH7W.js → runtime-XXRRTNP6.js} +55 -45
  225. package/chunks/{scheduler-WJQSLCSV.js → scheduler-G2ZS2Z7E.js} +43 -35
  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-E4N4AI6Z.js → server-4UMH7OIZ.js} +2362 -411
  232. package/chunks/{session-5YUWIOQE.js → session-K3O3Q2SV.js} +105 -87
  233. package/chunks/{settings-YY7ZSFO7.js → settings-CR2EWTBA.js} +53 -45
  234. package/chunks/shell-HH3PF3A2.js +83 -0
  235. package/chunks/{skill-PAIDX3EU.js → skill-I3SDA4MB.js} +17 -16
  236. package/chunks/spawnChannel-RWNDBXGA.js +82 -0
  237. package/chunks/{src-IZXLJI5M.js → src-GE4TTTML.js} +302 -184
  238. package/chunks/{standalone-update-X675JVBL.js → standalone-update-Q6WFRZZQ.js} +45 -37
  239. package/chunks/{startInteractiveUI-ND2IVBU3.js → startInteractiveUI-SLZGHRPH.js} +747 -310
  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-2DEYNMMN.js → team-create-YJALH5D2.js} +46 -38
  246. package/chunks/{team-delete-BB3CG3QF.js → team-delete-QE2UXJL7.js} +7 -7
  247. package/chunks/{team-plan-approval-65AVAOCT.js → team-plan-approval-34QFYKGN.js} +43 -35
  248. package/chunks/theme-manager-SWRILQHI.js +77 -0
  249. package/chunks/{todoWrite-KRAUN54W.js → todoWrite-VQ7FKOHL.js} +5 -5
  250. package/chunks/{tool-search-ZQP3SMTV.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-LURI52LP.js → trustedFolders-KHXHY6PY.js} +44 -36
  255. package/chunks/{update-relaunch-BPWFIDLM.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-HWD6Y22I.js → validateNonInterActiveAuth-3R223G3R.js} +89 -80
  259. package/chunks/{version-OD4JAFG7.js → version-HS7YSFHV.js} +1 -1
  260. package/chunks/{web-fetch-RFBKNU24.js → web-fetch-NKCSG7ZE.js} +18 -16
  261. package/chunks/{web-search-AKTVS5YZ.js → web-search-S62WAP4S.js} +13 -27
  262. package/chunks/{workflow-VZVCOSZN.js → workflow-QAGU5RU4.js} +44 -36
  263. package/chunks/workspace-providers-status-QSVZUETE.js +86 -0
  264. package/chunks/{workspace-registration-store-Q5SFJSX4.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-3XQIBACV.js +0 -78
  333. package/chunks/agent-QXD5NSKA.js +0 -73
  334. package/chunks/agent-headless-4VXR2TBK.js +0 -67
  335. package/chunks/bridge-GIBRSPE6.js +0 -81
  336. package/chunks/chunk-CBOQ3HY7.js +0 -2019
  337. package/chunks/chunk-MA6GYKK7.js +0 -6928
  338. package/chunks/contextCommand-XQU7KLIH.js +0 -72
  339. package/chunks/daemon-status-provider-KQVNB4VA.js +0 -80
  340. package/chunks/earlyInputCapture-WP5SA3KH.js +0 -74
  341. package/chunks/errors-JEYPXX4S.js +0 -80
  342. package/chunks/handleAutoUpdate-2VJPAW43.js +0 -73
  343. package/chunks/initializer-UOX67ZFQ.js +0 -78
  344. package/chunks/installationInfo-NQNY34X3.js +0 -72
  345. package/chunks/list-2Z7KS7ZF.js +0 -81
  346. package/chunks/loadedSettingsAdapter-LIYY3LE4.js +0 -75
  347. package/chunks/mcp-AJ4QW3JA.js +0 -75
  348. package/chunks/nonInteractiveCli-PUSO5QF6.js +0 -134
  349. package/chunks/pidfile-EH2JW2PB.js +0 -78
  350. package/chunks/read-file-JZ5VXILQ.js +0 -31
  351. package/chunks/resumeHistoryUtils-Z3HG4WKM.js +0 -84
  352. package/chunks/ripGrep-JNLJCT2B.js +0 -65
  353. package/chunks/serve-NN5FXWR6.js +0 -81
  354. package/chunks/shell-FXT3NVC6.js +0 -75
  355. package/chunks/spawnChannel-XAWLXNOD.js +0 -74
  356. package/chunks/theme-manager-2WZHPK2M.js +0 -69
  357. package/chunks/total-session-admission-HULB2TEQ.js +0 -75
  358. package/chunks/updateCheck-D4ESCHBJ.js +0 -88
  359. package/chunks/useAutoAcceptIndicator-CBNLOF2P.js +0 -86
  360. package/chunks/workspace-providers-status-TJTVHORI.js +0 -78
  361. package/chunks/workspace-registry-H6VM5WXK.js +0 -79
  362. package/chunks/workspace-service-ZNKD3I2J.js +0 -90
  363. package/chunks/workspace-skills-status-OOBIXADG.js +0 -77
  364. package/chunks/write-file-CAKK5IAO.js +0 -65
  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";
3
6
  import {
4
7
  listCommand
5
- } from "./chunk-Q6NAKZTA.js";
8
+ } from "./chunk-7MVVZO4N.js";
9
+ import {
10
+ getErrorMessage as getErrorMessage2
11
+ } from "./chunk-IKYJHJNF.js";
6
12
  import {
7
13
  ObservedChannelContactStore
8
- } from "./chunk-4K7VDKAD.js";
14
+ } from "./chunk-RHLZR4E5.js";
9
15
  import {
10
16
  escapeAnsiCtrlCodes
11
- } from "./chunk-RS7MT2QG.js";
17
+ } from "./chunk-IPUUTYMV.js";
12
18
  import {
13
19
  stringWidth
14
- } from "./chunk-H2XVO6NE.js";
20
+ } from "./chunk-2MIN6GRR.js";
15
21
  import {
16
22
  loadUndici
17
23
  } from "./chunk-3Z43GZUQ.js";
24
+ import {
25
+ resolvePath
26
+ } from "./chunk-ZD6UTE4A.js";
18
27
  import {
19
28
  isLoopbackBind
20
29
  } from "./chunk-RXFQM6FQ.js";
21
- import {
22
- serveCommand
23
- } from "./chunk-KPBVP6SL.js";
24
- import {
25
- getErrorMessage as getErrorMessage2
26
- } from "./chunk-LPEONXNV.js";
27
- import {
28
- collectProviderModelsForProtocol,
29
- getAuthTypeFromEnv,
30
- resolveCliGenerationConfig
31
- } from "./chunk-JZSM2IZ3.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,26 +42,45 @@ import {
46
42
  registerToolCallDispatch,
47
43
  selectFirstModel,
48
44
  sessionsPath
49
- } from "./chunk-RECUEJ7B.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-7THPNISK.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-GHRSKGHF.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";
63
76
  import {
64
77
  canonicalizeWorkspace
65
78
  } from "./chunk-2RFKHEXL.js";
66
79
  import {
67
80
  CHANNEL_DAEMON_WORKER_SENTINEL,
68
81
  CHANNEL_WORKER_HEARTBEAT_INTERVAL_MS,
82
+ ChannelDeliveryError,
83
+ MAX_CHANNEL_DELIVERIES_IN_FLIGHT,
69
84
  MAX_CHANNEL_STARTUP_FAILURES,
70
85
  MAX_CHANNEL_STARTUP_FAILURE_CHANNEL_LENGTH,
71
86
  MAX_CHANNEL_STARTUP_FAILURE_CODE_LENGTH,
@@ -74,31 +89,19 @@ import {
74
89
  QWEN_DAEMON_URL_ENV,
75
90
  QWEN_DAEMON_WORKSPACE_ENV,
76
91
  QWEN_SERVER_TOKEN_ENV,
92
+ isChannelDeliveryError,
93
+ isChannelDeliveryMessage,
77
94
  isChannelStartupReportAckMessage,
78
95
  isChannelWebhookTaskMessage,
79
96
  normalizeWorkerDiagnostic,
80
97
  sanitizeWorkerDiagnostic
81
- } from "./chunk-QKTHJXCS.js";
98
+ } from "./chunk-LK7CHLVP.js";
82
99
  import {
83
100
  normalizeServeChannelSelection
84
- } from "./chunk-TJTKSVIV.js";
101
+ } from "./chunk-JLU636DO.js";
85
102
  import {
86
103
  redactLogCredentials
87
104
  } from "./chunk-M5GB774H.js";
88
- import {
89
- readServiceInfo,
90
- removeServiceInfo,
91
- signalService,
92
- waitForExit,
93
- writeServiceInfo
94
- } from "./chunk-RV4C2ZFG.js";
95
- import {
96
- DEFAULT_BASE_URL,
97
- buildHeaders,
98
- clearAccount,
99
- loadAccount,
100
- saveAccount
101
- } from "./chunk-2LI23QA6.js";
102
105
  import {
103
106
  AcpBridge,
104
107
  ChannelLoopScheduler,
@@ -106,40 +109,39 @@ import {
106
109
  DaemonChannelBridge,
107
110
  PairingStore,
108
111
  SessionRouter,
112
+ isChannelProactiveDeliveryError,
109
113
  sanitizeLogText,
110
114
  sanitizePromptText
111
- } from "./chunk-RVLZCXEE.js";
115
+ } from "./chunk-RWTEFFPU.js";
112
116
  import {
113
- assembleMcpServers,
114
- getPendingGatedMcpServers,
115
- mcpCommand
116
- } from "./chunk-RKWX4CMO.js";
117
+ readServiceInfo,
118
+ removeServiceInfo,
119
+ signalService,
120
+ waitForExit,
121
+ writeServiceInfo
122
+ } from "./chunk-BIQWWWJN.js";
117
123
  import {
118
124
  loadSettings
119
- } from "./chunk-XCXYRDHB.js";
125
+ } from "./chunk-TEHGS6UP.js";
120
126
  import {
121
127
  detectSystemLanguage,
122
128
  getCurrentLanguage,
123
129
  initializeI18n,
124
130
  resolveLanguageSetting,
125
131
  t
126
- } from "./chunk-VRRF3GW5.js";
132
+ } from "./chunk-LKEJ26GS.js";
127
133
  import {
128
134
  loadEnvironment
129
- } from "./chunk-RWV32G2M.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-3EK5ZOUQ.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-4PTLZ3NX.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,28 +186,32 @@ import {
180
186
  unquoteCStylePath,
181
187
  updateChannelMemoryEntry,
182
188
  updateSetting
183
- } from "./chunk-OTQ6PSZC.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
- MODEL_GENERATION_CONFIG_FIELDS,
191
199
  getAllGeminiMdFilenames,
192
- resolveTelemetrySettings,
193
200
  setGeminiMdFilename
194
- } from "./chunk-ZDP2Y2AL.js";
201
+ } from "./chunk-CIKQ7KKO.js";
202
+ import {
203
+ DEFAULT_QWEN_EMBEDDING_MODEL
204
+ } from "./chunk-IKCX4CCL.js";
195
205
  import {
196
206
  isTlsVerificationDisabled
197
- } from "./chunk-CBOQ3HY7.js";
207
+ } from "./chunk-2JZBVYTU.js";
198
208
  import {
199
209
  recordChannelMemoryRecallMetrics
200
- } from "./chunk-7362QS5B.js";
210
+ } from "./chunk-MB4MZHMJ.js";
201
211
  import {
202
212
  SchemaValidator,
203
213
  ToolNames
204
- } from "./chunk-YM3SZTH4.js";
214
+ } from "./chunk-PR75REBZ.js";
205
215
  import {
206
216
  FatalConfigError,
207
217
  FatalSandboxError,
@@ -209,7 +219,7 @@ import {
209
219
  createDebugLogger,
210
220
  getErrorMessage,
211
221
  isNodeError
212
- } from "./chunk-OQB4EXO4.js";
222
+ } from "./chunk-NL7LTRLR.js";
213
223
  import {
214
224
  init_esbuild_shims
215
225
  } from "./chunk-5O2XNYP6.js";
@@ -2132,6 +2142,28 @@ var BridgeChannelMemoryIntentClassifier = class {
2132
2142
  }
2133
2143
  };
2134
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
+
2135
2167
  // packages/cli/src/commands/channel/start.ts
2136
2168
  var MAX_CRASH_RESTARTS = 3;
2137
2169
  var CRASH_WINDOW_MS = 5 * 60 * 1e3;
@@ -2159,25 +2191,6 @@ function channelMemoryOptions(getBridge, cwd) {
2159
2191
  };
2160
2192
  }
2161
2193
  __name(channelMemoryOptions, "channelMemoryOptions");
2162
- function createLoopController(store) {
2163
- return {
2164
- create: /* @__PURE__ */ __name((input) => store.create(input), "create"),
2165
- createForTarget: /* @__PURE__ */ __name((input, maxEnabledLoops) => store.createForTarget(input, maxEnabledLoops), "createForTarget"),
2166
- listForTarget: /* @__PURE__ */ __name((channelName, target) => store.listForTarget(channelName, target), "listForTarget"),
2167
- disable: /* @__PURE__ */ __name((id) => store.disable(id), "disable"),
2168
- validateCron: /* @__PURE__ */ __name((cron) => {
2169
- parseCron(cron);
2170
- nextFireTime(cron, /* @__PURE__ */ new Date());
2171
- }, "validateCron"),
2172
- nextFireTime: /* @__PURE__ */ __name((job) => nextFireTime(job.cron, new Date(job.lastFiredAt ?? job.createdAt)), "nextFireTime")
2173
- };
2174
- }
2175
- __name(createLoopController, "createLoopController");
2176
- function isChannelCronEnabled(settings) {
2177
- if (process.env["QWEN_CODE_DISABLE_CRON"] === "1") return false;
2178
- return settings.merged.experimental?.cron !== false;
2179
- }
2180
- __name(isChannelCronEnabled, "isChannelCronEnabled");
2181
2194
  function writeServiceInfoOrExit(channels, cleanup) {
2182
2195
  try {
2183
2196
  writeServiceInfo(channels);
@@ -2265,7 +2278,7 @@ async function startSingle(name, proxy, cronEnabled) {
2265
2278
  sessionsPath()
2266
2279
  );
2267
2280
  const loopStore = cronEnabled ? new ChannelLoopStore({ filePath: channelLoopPath() }) : void 0;
2268
- const loopController = loopStore ? createLoopController(loopStore) : void 0;
2281
+ const loopController = loopStore ? createChannelLoopController(loopStore) : void 0;
2269
2282
  const channels = /* @__PURE__ */ new Map();
2270
2283
  const channel = await createChannel(name, config, bridge, {
2271
2284
  router,
@@ -2399,7 +2412,7 @@ async function startAll(proxy, cronEnabled) {
2399
2412
  await bridge.start();
2400
2413
  const router = new SessionRouter(bridge, defaultCwd, "user", sessionsPath());
2401
2414
  const loopStore = cronEnabled ? new ChannelLoopStore({ filePath: channelLoopPath() }) : void 0;
2402
- const loopController = loopStore ? createLoopController(loopStore) : void 0;
2415
+ const loopController = loopStore ? createChannelLoopController(loopStore) : void 0;
2403
2416
  for (const { name, config } of parsed) {
2404
2417
  router.setChannelScope(name, config.sessionScope);
2405
2418
  }
@@ -2594,7 +2607,7 @@ var stopCommand = {
2594
2607
  if (argv["daemon-url"]) {
2595
2608
  const token = argv.token ?? process.env[QWEN_SERVER_TOKEN_ENV] ?? process.env[QWEN_DAEMON_TOKEN_ENV];
2596
2609
  try {
2597
- const sdk = await import("./daemon-RAPSDJH7.js");
2610
+ const sdk = await import("./daemon-YO6433NF.js");
2598
2611
  const client = new sdk.DaemonClient({
2599
2612
  baseUrl: argv["daemon-url"],
2600
2613
  ...token ? { token } : {}
@@ -2780,7 +2793,7 @@ var statusCommand = {
2780
2793
  if (argv["daemon-url"]) {
2781
2794
  const token = argv.token ?? process.env[QWEN_SERVER_TOKEN_ENV] ?? process.env[QWEN_DAEMON_TOKEN_ENV];
2782
2795
  try {
2783
- const sdk = await import("./daemon-RAPSDJH7.js");
2796
+ const sdk = await import("./daemon-YO6433NF.js");
2784
2797
  const client = new sdk.DaemonClient({
2785
2798
  baseUrl: argv["daemon-url"],
2786
2799
  ...token ? { token } : {}
@@ -2891,7 +2904,7 @@ var reloadCommand = {
2891
2904
  const token = resolveToken(argv.token);
2892
2905
  let sdk;
2893
2906
  try {
2894
- sdk = await import("./daemon-RAPSDJH7.js");
2907
+ sdk = await import("./daemon-YO6433NF.js");
2895
2908
  } catch (err) {
2896
2909
  writeStderrLine(
2897
2910
  `[Channel] Failed to load daemon SDK: ${safeChannelCommandErrorMessage(err)}`
@@ -2971,7 +2984,7 @@ var setCommand2 = {
2971
2984
  const selection = names[0] === "all" ? { mode: "all" } : { mode: "names", names };
2972
2985
  let sdk;
2973
2986
  try {
2974
- sdk = await import("./daemon-RAPSDJH7.js");
2987
+ sdk = await import("./daemon-YO6433NF.js");
2975
2988
  } catch (error) {
2976
2989
  writeStderrLine(
2977
2990
  `[Channel] Failed to load daemon SDK: ${safeChannelCommandErrorMessage(error)}`
@@ -3022,7 +3035,7 @@ var setCommand2 = {
3022
3035
  init_esbuild_shims();
3023
3036
  var SESSION_SHELL_COMMAND_FEATURE = "session_shell_command";
3024
3037
  var MAX_ACTIVE_WEBHOOK_TASKS = 16;
3025
- var WEBHOOK_TASK_SHUTDOWN_DRAIN_MS = 1e4;
3038
+ var WORKER_SHUTDOWN_DRAIN_MS = 1e4;
3026
3039
  function createDaemonSessionFactory({
3027
3040
  client,
3028
3041
  DaemonSessionClient,
@@ -3094,7 +3107,7 @@ function createDaemonChannelBridgeFacade(bridge, opts) {
3094
3107
  }
3095
3108
  __name(createDaemonChannelBridgeFacade, "createDaemonChannelBridgeFacade");
3096
3109
  async function loadDaemonSdk() {
3097
- return await import("./daemon-RAPSDJH7.js");
3110
+ return await import("./daemon-YO6433NF.js");
3098
3111
  }
3099
3112
  __name(loadDaemonSdk, "loadDaemonSdk");
3100
3113
  function selectedChannelNames(channelsConfig, selection) {
@@ -3256,6 +3269,10 @@ async function runChannelDaemonWorker(opts) {
3256
3269
  const observedContacts = new ObservedChannelContactStore(
3257
3270
  daemonObservedContactsPath(daemonWorkspace)
3258
3271
  );
3272
+ const loopStore = isChannelCronEnabled(settings) ? new ChannelLoopStore({
3273
+ filePath: daemonChannelLoopPath(daemonWorkspace)
3274
+ }) : void 0;
3275
+ const loopController = loopStore ? createChannelLoopController(loopStore) : void 0;
3259
3276
  const bridge = new DaemonChannelBridge({
3260
3277
  cwd: daemonWorkspace,
3261
3278
  sessionFactory: createDaemonSessionFactory({
@@ -3267,6 +3284,7 @@ async function runChannelDaemonWorker(opts) {
3267
3284
  });
3268
3285
  const channels = /* @__PURE__ */ new Map();
3269
3286
  const connected = [];
3287
+ let scheduler;
3270
3288
  let connectFailureCount = 0;
3271
3289
  const diagnosticRedaction = {
3272
3290
  ...opts.daemonToken ? { daemonToken: opts.daemonToken } : {},
@@ -3332,7 +3350,8 @@ async function runChannelDaemonWorker(opts) {
3332
3350
  observe: /* @__PURE__ */ __name((channelName, observation) => {
3333
3351
  observedContacts.observe(channelName, observation);
3334
3352
  }, "observe")
3335
- }
3353
+ },
3354
+ ...loopController ? { loopController } : {}
3336
3355
  }),
3337
3356
  startupSignal
3338
3357
  )
@@ -3405,6 +3424,38 @@ async function runChannelDaemonWorker(opts) {
3405
3424
  if (connected.length === 0) {
3406
3425
  throw new Error("No channels connected.");
3407
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
+ }
3408
3459
  opts.sendReady?.({
3409
3460
  channels: connected,
3410
3461
  requestedChannels: parsed.map((p) => p.name),
@@ -3412,6 +3463,19 @@ async function runChannelDaemonWorker(opts) {
3412
3463
  });
3413
3464
  return {
3414
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
+ },
3415
3479
  validateWebhookTask(task) {
3416
3480
  const channel = channels.get(task.channelName);
3417
3481
  if (!channel || !connected.includes(task.channelName)) {
@@ -3431,6 +3495,7 @@ async function runChannelDaemonWorker(opts) {
3431
3495
  }
3432
3496
  },
3433
3497
  async close() {
3498
+ scheduler?.stop();
3434
3499
  disconnectAll();
3435
3500
  try {
3436
3501
  bridge.stop();
@@ -3440,6 +3505,7 @@ async function runChannelDaemonWorker(opts) {
3440
3505
  }
3441
3506
  };
3442
3507
  } catch (err) {
3508
+ scheduler?.stop();
3443
3509
  disconnectAll();
3444
3510
  try {
3445
3511
  bridge.stop();
@@ -3601,8 +3667,58 @@ var daemonWorkerCommand = {
3601
3667
  } catch {
3602
3668
  }
3603
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");
3604
3680
  const activeWebhookTasks = /* @__PURE__ */ new Map();
3681
+ const activeChannelDeliveries = /* @__PURE__ */ new Map();
3605
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
+ }
3606
3722
  if (!isChannelWebhookTaskMessage(message)) return;
3607
3723
  if (message.expiresAt <= Date.now()) {
3608
3724
  sendWebhookTaskResult(message.id, {
@@ -3684,17 +3800,26 @@ var daemonWorkerCommand = {
3684
3800
  clearHeartbeat();
3685
3801
  process.removeListener("message", onMessage);
3686
3802
  try {
3687
- if (activeWebhookTasks.size > 0) {
3803
+ const deliveryCount = activeChannelDeliveries.size;
3804
+ const webhookCount = activeWebhookTasks.size;
3805
+ if (deliveryCount > 0) {
3806
+ writeStderrLine(
3807
+ `[Channel] shutdown: draining ${deliveryCount} channel delivery task(s)...`
3808
+ );
3809
+ }
3810
+ if (webhookCount > 0) {
3688
3811
  writeStderrLine(
3689
- `[Channel] shutdown: draining ${activeWebhookTasks.size} webhook task(s)...`
3812
+ `[Channel] shutdown: draining ${webhookCount} webhook task(s)...`
3690
3813
  );
3814
+ }
3815
+ if (deliveryCount > 0 || webhookCount > 0) {
3691
3816
  await Promise.race([
3692
- Promise.allSettled(activeWebhookTasks.values()),
3817
+ Promise.allSettled([
3818
+ ...activeChannelDeliveries.values(),
3819
+ ...activeWebhookTasks.values()
3820
+ ]),
3693
3821
  new Promise((resolve13) => {
3694
- const timer = setTimeout(
3695
- resolve13,
3696
- WEBHOOK_TASK_SHUTDOWN_DRAIN_MS
3697
- );
3822
+ const timer = setTimeout(resolve13, WORKER_SHUTDOWN_DRAIN_MS);
3698
3823
  timer.unref();
3699
3824
  })
3700
3825
  ]);
@@ -3757,6 +3882,16 @@ function classifyWebhookTaskValidationError(error) {
3757
3882
  return "channel_webhook_enqueue_failed";
3758
3883
  }
3759
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");
3760
3895
 
3761
3896
  // packages/cli/src/commands/channel/pairing.ts
3762
3897
  init_esbuild_shims();
@@ -4638,6 +4773,8 @@ init_esbuild_shims();
4638
4773
  var BRIEFS = {
4639
4774
  "0": {
4640
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",
4641
4778
  readsDiff: true,
4642
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.
4643
4780
 
@@ -4659,6 +4796,8 @@ If \`gh\` fails (auth, rate limit, network), **retry that fetch once**. If it fa
4659
4796
  "1a": {
4660
4797
  reviewsCode: true,
4661
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",
4662
4801
  readsDiff: true,
4663
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.
4664
4803
 
@@ -4675,6 +4814,8 @@ Scope guard: reading the enclosing function is for **context**. A defect entirel
4675
4814
  "1b": {
4676
4815
  reviewsCode: true,
4677
4816
  label: "Agent 1b: Removed-behavior audit",
4817
+ publicLabel: "the removed-behavior audit",
4818
+ publicLabelZh: "\u5220\u9664\u884C\u4E3A\u5BA1\u8BA1",
4678
4819
  readsDiff: true,
4679
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.
4680
4821
 
@@ -4691,6 +4832,8 @@ Each failure scenario must name what input or state now slips past the removed b
4691
4832
  "1c": {
4692
4833
  reviewsCode: true,
4693
4834
  label: "Agent 1c: Cross-file tracer",
4835
+ publicLabel: "the cross-file consistency pass",
4836
+ publicLabelZh: "\u8DE8\u6587\u4EF6\u4E00\u81F4\u6027\u68C0\u67E5",
4694
4837
  readsDiff: true,
4695
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.
4696
4839
 
@@ -4716,6 +4859,8 @@ Expect the three ends to be far apart. The declaration, the pass-through, and th
4716
4859
  "2": {
4717
4860
  reviewsCode: true,
4718
4861
  label: "Agent 2: Security",
4862
+ publicLabel: "the security pass",
4863
+ publicLabelZh: "\u5B89\u5168\u68C0\u67E5",
4719
4864
  readsDiff: true,
4720
4865
  brief: `You are **Agent 2: Security**. Review the diff for:
4721
4866
 
@@ -4731,6 +4876,8 @@ Expect the three ends to be far apart. The declaration, the pass-through, and th
4731
4876
  "3": {
4732
4877
  reviewsCode: true,
4733
4878
  label: "Agent 3: Code quality",
4879
+ publicLabel: "the code-quality pass",
4880
+ publicLabelZh: "\u4EE3\u7801\u8D28\u91CF\u68C0\u67E5",
4734
4881
  readsDiff: true,
4735
4882
  brief: `You are **Agent 3: Code Quality**. Review the diff for:
4736
4883
 
@@ -4743,6 +4890,8 @@ Expect the three ends to be far apart. The declaration, the pass-through, and th
4743
4890
  "4": {
4744
4891
  reviewsCode: true,
4745
4892
  label: "Agent 4: Performance & efficiency",
4893
+ publicLabel: "the performance pass",
4894
+ publicLabelZh: "\u6027\u80FD\u68C0\u67E5",
4746
4895
  readsDiff: true,
4747
4896
  brief: `You are **Agent 4: Performance & Efficiency**. Review the diff for:
4748
4897
 
@@ -4756,6 +4905,8 @@ Expect the three ends to be far apart. The declaration, the pass-through, and th
4756
4905
  "5": {
4757
4906
  reviewsCode: true,
4758
4907
  label: "Agent 5: Test coverage",
4908
+ publicLabel: "the test-coverage pass",
4909
+ publicLabelZh: "\u6D4B\u8BD5\u8986\u76D6\u68C0\u67E5",
4759
4910
  readsDiff: true,
4760
4911
  brief: `You are **Agent 5: Test Coverage**. Review the diff for:
4761
4912
 
@@ -4771,6 +4922,8 @@ Expect the three ends to be far apart. The declaration, the pass-through, and th
4771
4922
  "6a": {
4772
4923
  reviewsCode: true,
4773
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",
4774
4927
  readsDiff: true,
4775
4928
  brief: `You are **Agent 6a: the undirected audit, attacker mindset.**
4776
4929
 
@@ -4789,6 +4942,8 @@ You are undirected on purpose. Do not restrict yourself to the list.`
4789
4942
  "6b": {
4790
4943
  reviewsCode: true,
4791
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",
4792
4947
  readsDiff: true,
4793
4948
  brief: `You are **Agent 6b: the undirected audit, 3 AM oncall mindset.**
4794
4949
 
@@ -4807,6 +4962,8 @@ You are undirected on purpose. Do not restrict yourself to the list.`
4807
4962
  "6c": {
4808
4963
  reviewsCode: true,
4809
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",
4810
4967
  readsDiff: true,
4811
4968
  brief: `You are **Agent 6c: the undirected audit, six-months-later maintainer mindset.**
4812
4969
 
@@ -4824,6 +4981,8 @@ You are undirected on purpose. Do not restrict yourself to the list.`
4824
4981
  },
4825
4982
  "7": {
4826
4983
  label: "Agent 7: Build & test verification",
4984
+ publicLabel: "the build-and-test check",
4985
+ publicLabelZh: "\u6784\u5EFA\u4E0E\u6D4B\u8BD5\u9A8C\u8BC1",
4827
4986
  readsDiff: false,
4828
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.
4829
4988
 
@@ -4838,6 +4997,8 @@ Use \`Source: [build]\` or \`Source: [test]\`, never \`[review]\`.`
4838
4997
  },
4839
4998
  "test-matrix": {
4840
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",
4841
5002
  readsDiff: true,
4842
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.
4843
5004
 
@@ -4848,6 +5009,8 @@ Use \`Source: [build]\` or \`Source: [test]\`, never \`[review]\`.`
4848
5009
  "invariant-a": {
4849
5010
  reviewsCode: true,
4850
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",
4851
5014
  readsDiff: true,
4852
5015
  brief: `You are **invariant agent A: state, timers, and collections.**
4853
5016
 
@@ -4864,6 +5027,8 @@ Report a **Critical** for each violation, and give **both** locations that toget
4864
5027
  "invariant-b": {
4865
5028
  reviewsCode: true,
4866
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",
4867
5032
  readsDiff: true,
4868
5033
  brief: `You are **invariant agent B: counters, return values, and error taxonomies.**
4869
5034
 
@@ -4880,6 +5045,8 @@ Report a **Critical** for each violation, and give **both** locations that toget
4880
5045
  "invariant-c": {
4881
5046
  reviewsCode: true,
4882
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",
4883
5050
  readsDiff: true,
4884
5051
  brief: `You are **invariant agent C: config fields and early returns.**
4885
5052
 
@@ -4897,6 +5064,8 @@ Report a **Critical** for each violation, and give **both** locations that toget
4897
5064
  output: "verdicts",
4898
5065
  acceptsFindings: true,
4899
5066
  label: "Verification agent",
5067
+ publicLabel: "verification",
5068
+ publicLabelZh: "\u9A8C\u8BC1",
4900
5069
  readsDiff: true,
4901
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.
4902
5071
 
@@ -4925,6 +5094,8 @@ Return, for each finding, one verdict:
4925
5094
  acceptsChunk: true,
4926
5095
  acceptsFindings: true,
4927
5096
  label: "Reverse audit agent",
5097
+ publicLabel: "reverse audit",
5098
+ publicLabelZh: "\u53CD\u5411\u5BA1\u8BA1",
4928
5099
  readsDiff: true,
4929
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.
4930
5101
 
@@ -5383,6 +5554,18 @@ function roleLabel(req) {
5383
5554
  return req.file ? `${base} \u2014 ${req.file}` : base;
5384
5555
  }
5385
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");
5386
5569
  function label(rec, chunk) {
5387
5570
  if (chunk !== null) return `chunk ${chunk}`;
5388
5571
  const first = rec.launchPrompt.split("\n")[0]?.trim() ?? "";
@@ -5399,8 +5582,15 @@ function coverageFromTranscripts(planPath, env = process.env) {
5399
5582
  const unopenedAgents = [];
5400
5583
  const rewrittenPrompts = [];
5401
5584
  const disclosures = [];
5402
- const disclose = /* @__PURE__ */ __name((subject, reason) => {
5403
- 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
+ });
5404
5594
  return `${subject} \u2014 ${reason}`;
5405
5595
  }, "disclose");
5406
5596
  const covered = /* @__PURE__ */ new Set();
@@ -5455,7 +5645,10 @@ function coverageFromTranscripts(planPath, env = process.env) {
5455
5645
  rewrittenPrompts.push(
5456
5646
  disclose(
5457
5647
  name,
5458
- "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
+ }
5459
5652
  )
5460
5653
  );
5461
5654
  }
@@ -5465,7 +5658,8 @@ function coverageFromTranscripts(planPath, env = process.env) {
5465
5658
  rewrittenPrompts.push(
5466
5659
  disclose(
5467
5660
  name,
5468
- "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" }
5469
5663
  )
5470
5664
  );
5471
5665
  }
@@ -5502,7 +5696,11 @@ function coverageFromTranscripts(planPath, env = process.env) {
5502
5696
  missingRoles.push(
5503
5697
  disclose(
5504
5698
  "every dimension",
5505
- `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
+ }
5506
5704
  )
5507
5705
  );
5508
5706
  }
@@ -5549,7 +5747,12 @@ function coverageFromTranscripts(planPath, env = process.env) {
5549
5747
  missingRoles.push(
5550
5748
  disclose(
5551
5749
  roleLabel(req),
5552
- "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
+ }
5553
5756
  )
5554
5757
  );
5555
5758
  }
@@ -5563,7 +5766,12 @@ function coverageFromTranscripts(planPath, env = process.env) {
5563
5766
  missingRoles.push(
5564
5767
  disclose(
5565
5768
  roleLabel(req),
5566
- 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
+ }
5567
5775
  )
5568
5776
  );
5569
5777
  missingRoleSelectors.push(selectorOf(req));
@@ -5577,7 +5785,13 @@ function coverageFromTranscripts(planPath, env = process.env) {
5577
5785
  unreadBriefs.push(
5578
5786
  disclose(
5579
5787
  roleLabel(req),
5580
- `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
+ }
5581
5795
  )
5582
5796
  );
5583
5797
  }
@@ -5602,7 +5816,11 @@ function coverageFromTranscripts(planPath, env = process.env) {
5602
5816
  unreadBriefs,
5603
5817
  missingChunks,
5604
5818
  uncoverableChunks: [...uncoverable].sort((a, b) => a - b),
5605
- 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
+ }))
5606
5824
  };
5607
5825
  }
5608
5826
  __name(coverageFromTranscripts, "coverageFromTranscripts");
@@ -5618,6 +5836,7 @@ var REVERSE_AUDIT_GAP = {
5618
5836
  // provable ("no brief was built"), then what that costs ("if at all").
5619
5837
  "not-built": {
5620
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",
5621
5840
  fix: rebuildFix("reverse-audit", "round")
5622
5841
  },
5623
5842
  // Same reach limit as `not-built`: a hand-written auditor that never opened
@@ -5625,6 +5844,7 @@ var REVERSE_AUDIT_GAP = {
5625
5844
  // may not claim the pass did not run — only that it cannot be certified.
5626
5845
  "not-launched": {
5627
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",
5628
5848
  fix: rebuildFix("reverse-audit", "round")
5629
5849
  },
5630
5850
  // `rewritten` is reached only after a successful call OPENED the brief — so
@@ -5633,10 +5853,12 @@ var REVERSE_AUDIT_GAP = {
5633
5853
  // findings, the exact ranges, the guarantee the skill certifies against.
5634
5854
  rewritten: {
5635
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",
5636
5857
  fix: rebuildFix("reverse-audit", "round")
5637
5858
  },
5638
5859
  "brief-unread": {
5639
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",
5640
5862
  fix: "relaunch with the same printed prompt \u2014 the agent must OPEN the brief file the prompt names; that read is the receipt"
5641
5863
  }
5642
5864
  };
@@ -5645,21 +5867,43 @@ var VERIFY_GAP = {
5645
5867
  // before the transcripts are consulted, so it may not assert nobody ran.
5646
5868
  "not-built": {
5647
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",
5648
5871
  fix: rebuildFix("verify", "shard")
5649
5872
  },
5650
5873
  "not-launched": {
5651
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",
5652
5876
  fix: rebuildFix("verify", "shard")
5653
5877
  },
5654
5878
  rewritten: {
5655
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",
5656
5881
  fix: rebuildFix("verify", "shard")
5657
5882
  },
5658
5883
  "brief-unread": {
5659
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",
5660
5886
  fix: "relaunch with the same printed prompt \u2014 the agent must OPEN the brief file the prompt names; that read is the receipt"
5661
5887
  }
5662
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
+ };
5663
5907
  function verificationGaps(planPath, opts, env = process.env) {
5664
5908
  const { plan, mtimeMs } = readPlan(planPath);
5665
5909
  const records = readTranscripts(mtimeMs, env, plan.diffPathAbsolute);
@@ -5695,7 +5939,6 @@ function verificationGaps(planPath, opts, env = process.env) {
5695
5939
  );
5696
5940
  const reverse = bestDelivery(reverseKeys);
5697
5941
  if (reverse !== "ok") {
5698
- gaps.push(`reverse audit \u2014 ${REVERSE_AUDIT_GAP[reverse].gap}`);
5699
5942
  remediation.push(
5700
5943
  `reverse audit: ${REVERSE_AUDIT_GAP[reverse].fix.replace(
5701
5944
  "--plan <plan>",
@@ -5704,14 +5947,14 @@ function verificationGaps(planPath, opts, env = process.env) {
5704
5947
  );
5705
5948
  }
5706
5949
  let unverifiedFindings = false;
5950
+ let verify = null;
5707
5951
  if (opts.postsFindings) {
5708
5952
  const verifyKeys = [...built.keys()].filter(
5709
5953
  (k) => k === "verify" || k.startsWith("verify--")
5710
5954
  );
5711
- const verify = bestDelivery(verifyKeys);
5955
+ verify = bestDelivery(verifyKeys);
5712
5956
  if (verify !== "ok") {
5713
5957
  unverifiedFindings = true;
5714
- gaps.push(`verification \u2014 ${VERIFY_GAP[verify].gap}`);
5715
5958
  remediation.push(
5716
5959
  `verification: ${VERIFY_GAP[verify].fix.replace(
5717
5960
  "--plan <plan>",
@@ -5722,6 +5965,31 @@ function verificationGaps(planPath, opts, env = process.env) {
5722
5965
  );
5723
5966
  }
5724
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
+ }
5725
5993
  return { ok: gaps.length === 0, gaps, remediation, unverifiedFindings };
5726
5994
  }
5727
5995
  __name(verificationGaps, "verificationGaps");
@@ -5819,6 +6087,8 @@ function composeReview(input) {
5819
6087
  const remediation = [];
5820
6088
  const planRef = input.planPath ? shellQuotePath(input.planPath) : "<plan>";
5821
6089
  const missingReceipts = [];
6090
+ let plannedChunks = [];
6091
+ let coveredChunks = [];
5822
6092
  const nonDeterministicBodyCriticals = bodyCriticals.filter(
5823
6093
  (x) => !/\[(?:build|test)\]/i.test(x)
5824
6094
  ).length;
@@ -5827,12 +6097,16 @@ function composeReview(input) {
5827
6097
  if (!input.planPath) {
5828
6098
  coverageEntries.push({
5829
6099
  subject: "coverage",
5830
- 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"
5831
6103
  });
5832
6104
  criticalsUnverified = criticalsNeedingVerify >= 1;
5833
6105
  } else {
5834
6106
  try {
5835
6107
  const cov = coverageFromTranscripts(input.planPath, input.env);
6108
+ plannedChunks = cov.plannedChunks;
6109
+ coveredChunks = cov.coveredChunks;
5836
6110
  for (const id of cov.missingChunks) missingReceipts.push(id);
5837
6111
  for (const id of cov.uncoverableChunks) {
5838
6112
  const prefix = `chunk ${id}`;
@@ -5844,7 +6118,8 @@ function composeReview(input) {
5844
6118
  for (const label2 of cov.idleAgents) {
5845
6119
  coverageEntries.push({
5846
6120
  subject: label2,
5847
- 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"
5848
6123
  });
5849
6124
  }
5850
6125
  if (cov.idleAgents.length > 0) {
@@ -5855,7 +6130,8 @@ function composeReview(input) {
5855
6130
  for (const label2 of cov.blindAgents) {
5856
6131
  coverageEntries.push({
5857
6132
  subject: label2,
5858
- 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"
5859
6135
  });
5860
6136
  }
5861
6137
  if (cov.blindAgents.length > 0) {
@@ -5866,7 +6142,8 @@ function composeReview(input) {
5866
6142
  for (const label2 of cov.unopenedAgents) {
5867
6143
  coverageEntries.push({
5868
6144
  subject: label2,
5869
- 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"
5870
6147
  });
5871
6148
  }
5872
6149
  if (cov.unopenedAgents.length > 0) {
@@ -5892,9 +6169,12 @@ function composeReview(input) {
5892
6169
  }
5893
6170
  } catch (err) {
5894
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`;
5895
6173
  coverageEntries.push({
5896
6174
  subject: "coverage",
5897
- 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`
5898
6178
  });
5899
6179
  }
5900
6180
  try {
@@ -5905,20 +6185,21 @@ function composeReview(input) {
5905
6185
  input.env
5906
6186
  );
5907
6187
  for (const gap of verification.gaps) {
5908
- const cut = gap.indexOf(" \u2014 ");
5909
- coverageEntries.push(
5910
- cut === -1 ? { subject: gap, reason: "" } : {
5911
- subject: gap.slice(0, cut),
5912
- reason: gap.slice(cut + " \u2014 ".length)
5913
- }
5914
- );
6188
+ coverageEntries.push({
6189
+ subject: gap.subject,
6190
+ reason: gap.reason,
6191
+ subjectZh: gap.subjectZh,
6192
+ reasonZh: gap.reasonZh
6193
+ });
5915
6194
  }
5916
6195
  remediation.push(...verification.remediation);
5917
6196
  criticalsUnverified = verification.unverifiedFindings && criticalsNeedingVerify >= 1;
5918
6197
  } catch (err) {
5919
6198
  coverageEntries.push({
5920
6199
  subject: "verification",
5921
- 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`
5922
6203
  });
5923
6204
  criticalsUnverified = criticalsNeedingVerify >= 1;
5924
6205
  }
@@ -5982,9 +6263,23 @@ function composeReview(input) {
5982
6263
  downgradedFrom = "Request changes";
5983
6264
  }
5984
6265
  const footer = `_\u2014 ${modelId} via Qwen Code /review_`;
5985
- 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}
5986
6277
 
5987
- ${footer}`, "finish");
6278
+ </details>` : en;
6279
+ return `${text}
6280
+
6281
+ ${footer}`;
6282
+ }, "render");
5988
6283
  const notReviewedParts = [];
5989
6284
  if (missingReceipts.length > 0) {
5990
6285
  remediation.push(
@@ -5995,15 +6290,29 @@ ${footer}`, "finish");
5995
6290
  (id) => !disclosedSubjects.has(`chunk ${id}`)
5996
6291
  );
5997
6292
  if (unexplainedReceipts.length > 0) {
5998
- notReviewedParts.push(
5999
- `Not reviewed: ${unexplainedReceipts.map((id) => `chunk ${id}`).join(", ")} \u2014 no agent reported covering these; nobody read them.`
6000
- );
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
+ });
6001
6299
  }
6002
6300
  }
6003
6301
  if (uncoverable.length > 0) {
6004
- notReviewedParts.push(
6005
- `Not reviewed: ${uncoverable.join(", ")} \u2014 a line there exceeds the read limit.`
6006
- );
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
+ });
6007
6316
  }
6008
6317
  const covEntries = coverageEntries;
6009
6318
  const callerLeft = [];
@@ -6019,32 +6328,67 @@ ${footer}`, "finish");
6019
6328
  const whiffedDimensions = callerLeft.filter((d) => !d.includes(" \u2014 "));
6020
6329
  const explainedCaller = callerLeft.filter((d) => d.includes(" \u2014 "));
6021
6330
  if (whiffedDimensions.length > 0) {
6022
- notReviewedParts.push(
6023
- `Not reviewed: ${whiffedDimensions.join(", ")} \u2014 the agent returned no evidence of its walk twice.`
6024
- );
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
+ });
6025
6335
  }
6026
6336
  for (const d of explainedCaller) {
6027
- notReviewedParts.push(`Not reviewed: ${d}.`);
6337
+ notReviewedParts.push({
6338
+ en: `Not reviewed: ${d}.`,
6339
+ zh: `\u672A\u5BA1\u67E5\uFF1A${d}\u3002`
6340
+ });
6028
6341
  }
6029
6342
  const seenSubjects = /* @__PURE__ */ new Set();
6030
6343
  const byReason = /* @__PURE__ */ new Map();
6031
- for (const { subject, reason } of covEntries) {
6032
- if (seenSubjects.has(subject)) continue;
6033
- seenSubjects.add(subject);
6034
- const subjects = byReason.get(reason) ?? [];
6035
- subjects.push(subject);
6036
- byReason.set(reason, subjects);
6037
- }
6038
- for (const [reason, subjects] of byReason) {
6039
- notReviewedParts.push(
6040
- reason ? `Not reviewed: ${subjects.join(", ")} \u2014 ${reason}.` : `Not reviewed: ${subjects.join(", ")}.`
6041
- );
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
+ });
6042
6380
  }
6043
6381
  const cannotTellBlock = cannotTell.length === 0 ? [] : [
6044
- `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
+ }
6045
6386
  ];
6046
- const bodyCriticalBlock = bodyCriticals.map((l) => withMarker(l));
6047
- 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
+ };
6048
6392
  if (event === "REQUEST_CHANGES") {
6049
6393
  const parts = [
6050
6394
  ...contextUnavailable ? [contextUnavailableClause] : [],
@@ -6054,7 +6398,7 @@ ${footer}`, "finish");
6054
6398
  ];
6055
6399
  return {
6056
6400
  event,
6057
- body: finish(parts.join("\n\n")),
6401
+ body: render(parts, "\n\n"),
6058
6402
  baseEvent,
6059
6403
  cappedBy,
6060
6404
  downgraded,
@@ -6065,7 +6409,10 @@ ${footer}`, "finish");
6065
6409
  if (event === "APPROVE") {
6066
6410
  return {
6067
6411
  event,
6068
- 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
+ ),
6069
6416
  baseEvent,
6070
6417
  cappedBy,
6071
6418
  downgraded,
@@ -6076,9 +6423,11 @@ ${footer}`, "finish");
6076
6423
  const clauses = [];
6077
6424
  if (downgraded && downgradedFrom) {
6078
6425
  const reasons = downgradeReasons.join("; ");
6079
- clauses.push(
6080
- `\u26A0\uFE0F Downgraded from ${downgradedFrom} to Comment${reasons ? `: ${reasons}` : ""}.`
6081
- );
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
+ });
6082
6431
  }
6083
6432
  if (contextUnavailable) {
6084
6433
  clauses.push(contextUnavailableClause);
@@ -6087,14 +6436,28 @@ ${footer}`, "finish");
6087
6436
  // body could open "Reviewed — no blockers." two lines above "nobody read
6088
6437
  // them." Nothing nobody read can be certified blocker-free.
6089
6438
  missingReceipts.length === 0;
6090
- clauses.push(canCertify ? "Reviewed \u2014 no blockers." : "Reviewed.");
6091
- }
6092
- if (suggestionsInline > 0) clauses.push("Suggestions are inline.");
6093
- 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));
6094
6445
  clauses.push(
6095
- `${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" }
6096
6450
  );
6097
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
+ }
6098
6461
  clauses.push(...cannotTellBlock);
6099
6462
  clauses.push(...notReviewedParts);
6100
6463
  if (downgradedFrom === "Request changes" || criticalsUnverified) {
@@ -6102,7 +6465,7 @@ ${footer}`, "finish");
6102
6465
  }
6103
6466
  return {
6104
6467
  event,
6105
- body: finish(clauses.join(" ")),
6468
+ body: render(clauses, " "),
6106
6469
  baseEvent,
6107
6470
  cappedBy,
6108
6471
  downgraded,
@@ -6111,6 +6474,46 @@ ${footer}`, "finish");
6111
6474
  };
6112
6475
  }
6113
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");
6114
6517
  function readDraftedComments(path3) {
6115
6518
  let raw;
6116
6519
  try {
@@ -6633,7 +7036,7 @@ async function runFetchPr(args) {
6633
7036
  "--repo",
6634
7037
  ownerRepo,
6635
7038
  "--json",
6636
- "headRefName,headRefOid,baseRefName,additions,deletions,changedFiles,isCrossRepository"
7039
+ "headRefName,headRefOid,baseRefName,additions,deletions,changedFiles,isCrossRepository,body"
6637
7040
  );
6638
7041
  meta = JSON.parse(json);
6639
7042
  } catch (err) {
@@ -6721,6 +7124,7 @@ async function runFetchPr(args) {
6721
7124
  baseFetchFailed,
6722
7125
  diffPath,
6723
7126
  diffPathAbsolute,
7127
+ prDescriptionHasHan: new RegExp("\\p{Script=Han}", "u").test(meta.body ?? ""),
6724
7128
  ...buildPlanReport(plan, (path3) => fileLineCount(fetchedSha, path3))
6725
7129
  };
6726
7130
  writeFileSync5(out, stringifyPlanReport(result), "utf8");
@@ -9041,9 +9445,12 @@ ${prompt}`;
9041
9445
  const paramNote = typeof wt === "string" && wt ? `
9042
9446
 
9043
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.`;
9044
9451
  writeStdoutLine(
9045
9452
  [
9046
- `${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,
9047
9454
  ...blocks,
9048
9455
  `\u2500\u2500\u2500\u2500\u2500 end of roster \u2014 ${roster.length} agents \u2500\u2500\u2500\u2500\u2500`
9049
9456
  ].join("\n\n")
@@ -9079,7 +9486,7 @@ function runAllChunks(report, planPath, role, findingsContent, rules, round) {
9079
9486
  });
9080
9487
  writeStdoutLine(
9081
9488
  [
9082
- `${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.`,
9083
9490
  ...blocks,
9084
9491
  `\u2500\u2500\u2500\u2500\u2500 end of round \u2014 ${chunks.length} auditors \u2500\u2500\u2500\u2500\u2500`
9085
9492
  ].join("\n\n")
@@ -10778,10 +11185,10 @@ var updateCommand3 = {
10778
11185
  stdioHelpers,
10779
11186
  { updateEventEmitter }
10780
11187
  ] = await Promise.all([
10781
- import("./settings-YY7ZSFO7.js"),
10782
- import("./updateCheck-D4ESCHBJ.js"),
10783
- import("./installationInfo-NQNY34X3.js"),
10784
- import("./standalone-update-X675JVBL.js"),
11188
+ import("./settings-CR2EWTBA.js"),
11189
+ import("./updateCheck-RKL6M5XN.js"),
11190
+ import("./installationInfo-6O2YAA52.js"),
11191
+ import("./standalone-update-Q6WFRZZQ.js"),
10785
11192
  import("./stdioHelpers-HGIYTWAY.js"),
10786
11193
  import("./updateEventEmitter-5MKC7BLQ.js")
10787
11194
  ]);
@@ -10876,64 +11283,6 @@ function isValidSessionId(value) {
10876
11283
  }
10877
11284
  __name(isValidSessionId, "isValidSessionId");
10878
11285
  var debugLogger4 = createDebugLogger("CONFIG");
10879
- var EXPERIMENTAL_VISION_MODEL_ENV = "VISION_MODEL";
10880
- function getExperimentalVisionConfig(settings, enabled, authType, primaryModel, primaryGenerationConfig, primaryBaseUrl) {
10881
- const visionModel = process.env[EXPERIMENTAL_VISION_MODEL_ENV]?.trim();
10882
- if (!enabled || !visionModel || !authType || !primaryModel || authType === "qwen-oauth" /* QWEN_OAUTH */) {
10883
- return {
10884
- generationConfig: primaryGenerationConfig,
10885
- modelProvidersConfig: settings.modelProviders,
10886
- visionModel: settings.visionModel || void 0,
10887
- registryBaseUrl: void 0
10888
- };
10889
- }
10890
- const inheritedGenerationConfig = {};
10891
- for (const field of MODEL_GENERATION_CONFIG_FIELDS) {
10892
- const value = primaryGenerationConfig?.[field];
10893
- if (value !== void 0) {
10894
- Object.assign(inheritedGenerationConfig, { [field]: value });
10895
- }
10896
- }
10897
- inheritedGenerationConfig.modalities = {
10898
- ...inheritedGenerationConfig.modalities,
10899
- image: true
10900
- };
10901
- const configuredModels = settings.modelProviders?.[authType] ?? [];
10902
- const primaryIndex = configuredModels.findIndex(
10903
- (model) => model.id === primaryModel && (!model.baseUrl || model.baseUrl === primaryBaseUrl)
10904
- );
10905
- const configuredPrimary = configuredModels[primaryIndex];
10906
- const primaryEntry = {
10907
- ...configuredPrimary,
10908
- id: primaryModel,
10909
- ...primaryBaseUrl && { baseUrl: primaryBaseUrl },
10910
- generationConfig: inheritedGenerationConfig
10911
- };
10912
- const syntheticVisionEntry = {
10913
- id: visionModel,
10914
- ...primaryBaseUrl && { baseUrl: primaryBaseUrl },
10915
- capabilities: { vision: true, agent: true },
10916
- generationConfig: inheritedGenerationConfig
10917
- };
10918
- const remainingModels = configuredModels.filter(
10919
- (model, index) => index !== primaryIndex && !(model.id === visionModel && (!model.baseUrl || model.baseUrl === primaryBaseUrl))
10920
- );
10921
- const modelProvidersConfig = {
10922
- ...settings.modelProviders,
10923
- [authType]: [primaryEntry, syntheticVisionEntry, ...remainingModels]
10924
- };
10925
- const qualifiedVisionModel = `${authType}:${visionModel}`;
10926
- return {
10927
- generationConfig: {
10928
- ...primaryGenerationConfig,
10929
- modalities: inheritedGenerationConfig.modalities
10930
- },
10931
- modelProvidersConfig,
10932
- visionModel: primaryBaseUrl ? `${qualifiedVisionModel}\0${primaryBaseUrl}` : qualifiedVisionModel,
10933
- registryBaseUrl: primaryBaseUrl || null
10934
- };
10935
- }
10936
- __name(getExperimentalVisionConfig, "getExperimentalVisionConfig");
10937
11286
  function resolveLocaleForExtensions(settings) {
10938
11287
  const envLang = process.env["QWEN_CODE_LANG"];
10939
11288
  if (envLang) return envLang;
@@ -11890,14 +12239,6 @@ async function loadCliConfig(settings, argv, cwd = process.cwd(), overrideExtens
11890
12239
  env: process.env
11891
12240
  });
11892
12241
  const { model: resolvedModel } = resolvedCliConfig;
11893
- const experimentalVisionConfig = getExperimentalVisionConfig(
11894
- settings,
11895
- !interactive && !argv.acp && !argv.experimentalAcp,
11896
- selectedAuthType,
11897
- resolvedModel,
11898
- resolvedCliConfig.generationConfig,
11899
- resolvedCliConfig.baseUrl
11900
- );
11901
12242
  const toolSearchExplicitlyEnabled = settings.tools?.toolSearch?.enabled;
11902
12243
  const shouldDisableToolSearch = toolSearchExplicitlyEnabled === false || toolSearchExplicitlyEnabled === void 0 && resolvedModel !== void 0 && /deepseek-(v3|v4|chat)/i.test(resolvedModel);
11903
12244
  if (shouldDisableToolSearch) {
@@ -11970,7 +12311,7 @@ async function loadCliConfig(settings, argv, cwd = process.cwd(), overrideExtens
11970
12311
  }
11971
12312
  sessionId = argv["sessionId"];
11972
12313
  }
11973
- const modelProvidersConfig = experimentalVisionConfig.modelProvidersConfig;
12314
+ const modelProvidersConfig = settings.modelProviders;
11974
12315
  const providerProtocolConfig = settings.providerProtocol;
11975
12316
  const cliMcpServers = parseMcpConfig(argv.mcpConfig);
11976
12317
  const topTierMcpServers = sessionMcpServers || cliMcpServers ? { ...sessionMcpServers, ...cliMcpServers ?? {} } : void 0;
@@ -11995,6 +12336,9 @@ async function loadCliConfig(settings, argv, cwd = process.cwd(), overrideExtens
11995
12336
  excludeTools: mergedDeny,
11996
12337
  disabledSlashCommands: disabledSlashCommands.length > 0 ? disabledSlashCommands : void 0,
11997
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()),
11998
12342
  disabledTools: disabledTools.length > 0 ? disabledTools : void 0,
11999
12343
  visibleTools: visibleTools.length > 0 ? visibleTools : void 0,
12000
12344
  // New unified permissions (PermissionManager source of truth).
@@ -12033,14 +12377,13 @@ async function loadCliConfig(settings, argv, cwd = process.cwd(), overrideExtens
12033
12377
  },
12034
12378
  showResponseTokensPerSecond: settings.ui?.showResponseTokensPerSecond === true,
12035
12379
  telemetry: telemetrySettings,
12036
- // Ordinary interactive TUI defers telemetry until after first paint. Auth
12037
- // events emitted before the deferred init are an accepted startup-latency
12038
- // tradeoff. This intentionally differs from IDE deferral: `qwen -i
12039
- // "prompt"` must await IDE context before auto-submit, but telemetry can
12040
- // still initialize after render unless an initial prompt is present.
12041
- 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,
12042
12385
  outboundCorrelation: settings.outboundCorrelation,
12043
- usageStatisticsEnabled: settings.privacy?.usageStatisticsEnabled ?? true,
12386
+ usageStatisticsEnabled: parseBooleanEnvFlag(process.env["QWEN_USAGE_STATISTICS_ENABLED"]) ?? settings.privacy?.usageStatisticsEnabled ?? true,
12044
12387
  clearContextOnIdle: settings.context?.clearContextOnIdle,
12045
12388
  fileFiltering: settings.context?.fileFiltering,
12046
12389
  plansDirectory: settings.plansDirectory,
@@ -12101,8 +12444,8 @@ async function loadCliConfig(settings, argv, cwd = process.cwd(), overrideExtens
12101
12444
  modelProvidersConfig,
12102
12445
  providerProtocolConfig,
12103
12446
  generationConfigSources: resolvedCliConfig.sources,
12104
- generationConfig: experimentalVisionConfig.generationConfig,
12105
- initialModelRegistryBaseUrl: experimentalVisionConfig.registryBaseUrl ?? resolvedCliConfig.registryBaseUrl,
12447
+ generationConfig: resolvedCliConfig.generationConfig,
12448
+ initialModelRegistryBaseUrl: resolvedCliConfig.registryBaseUrl,
12106
12449
  warnings: resolvedCliConfig.warnings,
12107
12450
  bareMode,
12108
12451
  safeMode,
@@ -12142,7 +12485,8 @@ async function loadCliConfig(settings, argv, cwd = process.cwd(), overrideExtens
12142
12485
  memoryAgentTimeoutMinutes: settings.memory?.agentTimeoutMinutes,
12143
12486
  fastModel: settings.fastModel || void 0,
12144
12487
  webSearch: bareMode || safeMode ? void 0 : resolveWebSearchSettings(settings),
12145
- visionModel: experimentalVisionConfig.visionModel,
12488
+ visionModel: settings.visionModel || void 0,
12489
+ imageModel: settings.imageModel || void 0,
12146
12490
  visionBridgeTimeoutMs: settings.visionBridgeTimeoutMs,
12147
12491
  modelFallbacks: resolveModelFallbacks(
12148
12492
  argv.fallbackModel,