@qwen-code/qwen-code 0.21.8 → 0.21.9

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 (258) hide show
  1. package/README.md +2 -1
  2. package/bundled/qc-helper/docs/configuration/settings.md +32 -30
  3. package/bundled/qc-helper/docs/extension/introduction.md +15 -1
  4. package/bundled/qc-helper/docs/features/code-review.md +2 -0
  5. package/bundled/qc-helper/docs/qwen-serve-deploy-local.md +1 -1
  6. package/bundled/qc-helper/docs/qwen-serve.md +42 -39
  7. package/bundled/review/SKILL.md +11 -7
  8. package/chunks/{MaxSizedBox-7PM6BGJ5.js → MaxSizedBox-6BZANW7X.js} +9 -9
  9. package/chunks/{StandaloneSessionPicker-3UQHM7GV.js → StandaloneSessionPicker-VDC5KE7T.js} +28 -25
  10. package/chunks/{acpAgent-5UWLFV6V.js → acpAgent-F2NSBCUF.js} +1433 -706
  11. package/chunks/{agent-624T2BLO.js → agent-VOHJOEBB.js} +8 -8
  12. package/chunks/{agent-headless-2EE5J2KX.js → agent-headless-J5NFOPHP.js} +8 -8
  13. package/chunks/{bridge-JENKGFFP.js → bridge-NQIZZLAS.js} +13 -13
  14. package/chunks/{channel-management-service-DDWUPHMU.js → channel-management-service-PHELKOW2.js} +4 -4
  15. package/chunks/{channel-settings-store-SA6JZSPH.js → channel-settings-store-VIY2OENO.js} +17 -15
  16. package/chunks/{channel-worker-group-E67EN3RV.js → channel-worker-group-MSHT6CWR.js} +6 -6
  17. package/chunks/{channel-worker-manager-SW4C45CF.js → channel-worker-manager-XXD3GDSK.js} +6 -6
  18. package/chunks/{channel-worker-supervisor-5SRD24FG.js → channel-worker-supervisor-IVSDIMI4.js} +4 -4
  19. package/chunks/{chunk-S3Y3GBFD.js → chunk-23VQTELM.js} +2 -2
  20. package/chunks/{chunk-XZKQT2B2.js → chunk-3WDYBTTI.js} +5 -5
  21. package/chunks/{chunk-YEF7XEO2.js → chunk-3XVDTHBJ.js} +3 -3
  22. package/chunks/{chunk-IBYULW65.js → chunk-46YJDYCU.js} +145 -10
  23. package/chunks/chunk-4JRM2BSM.js +48 -0
  24. package/chunks/{chunk-L4N6TIP7.js → chunk-4TRQPFDP.js} +4 -2
  25. package/chunks/{chunk-5ZGR6RKJ.js → chunk-4XQNB3KN.js} +3 -3
  26. package/chunks/chunk-5EJZE3FP.js +140 -0
  27. package/chunks/{chunk-XHD7CRP2.js → chunk-5RBDAGC6.js} +2 -2
  28. package/chunks/{chunk-KJZ26VBX.js → chunk-67EWJE77.js} +1 -1
  29. package/chunks/{chunk-TE3ZAJE7.js → chunk-6Q5ABMTU.js} +1 -1
  30. package/chunks/{chunk-U5SLIG7E.js → chunk-7AEPJGL4.js} +1 -1
  31. package/chunks/{chunk-OHKJVAKG.js → chunk-7GOYZQPR.js} +20 -1977
  32. package/chunks/{chunk-3SE7J4DR.js → chunk-7S4JBJLU.js} +3 -3
  33. package/chunks/{chunk-TKSZJ5BV.js → chunk-AKJQSWV4.js} +3 -3
  34. package/chunks/{chunk-E4ZBKMSF.js → chunk-ATMO54WE.js} +6 -6
  35. package/chunks/{chunk-KKDVZLGL.js → chunk-BAMN6XSD.js} +1 -1
  36. package/chunks/{chunk-IUQ52YJK.js → chunk-BIRWP6LU.js} +1 -1
  37. package/chunks/{chunk-AKA24BGO.js → chunk-BT6GQIEJ.js} +1 -1
  38. package/chunks/{chunk-ZCLLJARV.js → chunk-BZP4QPNK.js} +10 -10
  39. package/chunks/{chunk-2M5N3DHY.js → chunk-CMOBWHWW.js} +1 -1
  40. package/chunks/{chunk-WV5J6Q6N.js → chunk-D7BXVKSF.js} +1 -1
  41. package/chunks/{chunk-NLREQJFK.js → chunk-DA4HRSBW.js} +15 -0
  42. package/chunks/{chunk-GOEVOFQI.js → chunk-DH5YXSIF.js} +3 -3
  43. package/chunks/{chunk-DIWZNWZT.js → chunk-DX3RGJMS.js} +13 -2
  44. package/chunks/{chunk-PLFATELK.js → chunk-DZUO626D.js} +1 -1
  45. package/chunks/{chunk-NGYI5EF5.js → chunk-E2FPSSKP.js} +8 -8
  46. package/chunks/{chunk-ZPLALRXZ.js → chunk-FBMCDU63.js} +4 -137
  47. package/chunks/{chunk-2ILAOM2I.js → chunk-FCLHHEUK.js} +17 -16
  48. package/chunks/{chunk-SNRT2TJJ.js → chunk-G2TX5ZXC.js} +3 -3
  49. package/chunks/{chunk-C5VWPTGT.js → chunk-GAKGOXTC.js} +1 -1
  50. package/chunks/{chunk-QQWD7LZV.js → chunk-HADWBW5R.js} +4 -4
  51. package/chunks/{chunk-77QVBFCU.js → chunk-HZGBKOX3.js} +3 -3
  52. package/chunks/{chunk-RPWVIXDB.js → chunk-I5VM3SKY.js} +4 -4
  53. package/chunks/{chunk-7VUERJHS.js → chunk-II6G3EY6.js} +325 -104
  54. package/chunks/{chunk-FN6YXJOP.js → chunk-IOEZE2YT.js} +1 -1
  55. package/chunks/chunk-JUWS2Z5K.js +1995 -0
  56. package/chunks/{chunk-VXZ5HAOV.js → chunk-K4ADGWHU.js} +1 -1
  57. package/chunks/{chunk-YOM7DEGB.js → chunk-KSAFZ5TA.js} +2 -2
  58. package/chunks/{chunk-KAQCJO6Y.js → chunk-KTKYGS2P.js} +35 -9
  59. package/chunks/{chunk-GBDINRIL.js → chunk-KTQGGPGV.js} +3 -3
  60. package/chunks/{chunk-6M26GBKX.js → chunk-L2AFWWJE.js} +42 -3
  61. package/chunks/{chunk-QXVSWG66.js → chunk-LHEC5V6G.js} +2 -2
  62. package/chunks/{chunk-J26HHFI5.js → chunk-LP2QGNSP.js} +32 -2
  63. package/chunks/{chunk-HWX5HPUG.js → chunk-LZZLUCRS.js} +108 -11
  64. package/chunks/{chunk-KTJFU7RT.js → chunk-MFDYOYZZ.js} +2 -2
  65. package/chunks/{chunk-3WNQOYHQ.js → chunk-MHP476D3.js} +74 -31
  66. package/chunks/{chunk-Y4TETC74.js → chunk-MTCYGTWH.js} +4 -4
  67. package/chunks/{chunk-EN2TKTFH.js → chunk-NV3F44FL.js} +6 -2
  68. package/chunks/{chunk-BF52U4XJ.js → chunk-OGDIJKHK.js} +1 -1
  69. package/chunks/{chunk-7DVT4LVV.js → chunk-OGNFHGIG.js} +3 -3
  70. package/chunks/{chunk-IYES5WOT.js → chunk-P2FK2HBV.js} +2 -2
  71. package/chunks/{chunk-2M4K4KYS.js → chunk-P3RBMQ4P.js} +4 -4
  72. package/chunks/{chunk-FYAXKJK7.js → chunk-P4ZEZSJZ.js} +692 -106
  73. package/chunks/{chunk-UFALT4LK.js → chunk-PBRVUF5B.js} +1 -1
  74. package/chunks/{chunk-LKRMNRSN.js → chunk-PDPFQ2FO.js} +2 -0
  75. package/chunks/{chunk-6TR7CFXH.js → chunk-PNBBJOCP.js} +1 -1
  76. package/chunks/{chunk-M3STHEMM.js → chunk-PVOGHGSF.js} +5 -5
  77. package/chunks/{chunk-4WU6NY7F.js → chunk-QSNSL4R4.js} +2 -2
  78. package/chunks/{chunk-DQSDACD2.js → chunk-RBHQXGDK.js} +1 -1
  79. package/chunks/{chunk-ZHA242R4.js → chunk-RVSTTOJ4.js} +2 -2
  80. package/chunks/{chunk-EIVICVHM.js → chunk-SCAZZ3Q4.js} +4 -4
  81. package/chunks/{chunk-BF224XHL.js → chunk-T5RLUXWJ.js} +2 -2
  82. package/chunks/{chunk-B52AWKBB.js → chunk-T6HEQR2Q.js} +16 -5
  83. package/chunks/{chunk-FWBXMANW.js → chunk-THIKWITR.js} +3 -3
  84. package/chunks/{chunk-WG6542MA.js → chunk-TQCYNLNJ.js} +1 -1
  85. package/chunks/chunk-TQOF5KBL.js +71 -0
  86. package/chunks/{chunk-NPUXXRJI.js → chunk-TZ6KJ44L.js} +1 -1
  87. package/chunks/{chunk-YHJFF7KH.js → chunk-UJUM2SRN.js} +147 -47
  88. package/chunks/{chunk-4ALIARFY.js → chunk-UYAUA63Q.js} +1 -1
  89. package/chunks/chunk-VFMASYQA.js +389 -0
  90. package/chunks/chunk-VGHZT6JR.js +51 -0
  91. package/chunks/{chunk-ZWBUH5UP.js → chunk-VKJ4KTPJ.js} +1 -1
  92. package/chunks/{chunk-QGHSP65Z.js → chunk-VNNWAZSI.js} +2 -2
  93. package/chunks/{chunk-757GB46F.js → chunk-W3FSZSF2.js} +1 -1
  94. package/chunks/{chunk-GQCEQPYQ.js → chunk-WGK4TSB7.js} +3 -3
  95. package/chunks/{chunk-PG62DFWD.js → chunk-WP5VOXF7.js} +6 -127
  96. package/chunks/{chunk-NVRDQFCX.js → chunk-XTY5DN4Y.js} +1 -1
  97. package/chunks/{chunk-GXSNGY5M.js → chunk-XX7QFP34.js} +1677 -1307
  98. package/chunks/{chunk-3PY4LPJF.js → chunk-YGT2AUJ7.js} +84 -4
  99. package/chunks/{chunk-4DU3NCHG.js → chunk-YTFDX4PR.js} +8 -3
  100. package/chunks/{chunk-OA4JVLSA.js → chunk-Z7VOMGDC.js} +22 -1
  101. package/chunks/{chunk-DX5W5AON.js → chunk-ZBXGWQ4S.js} +3 -3
  102. package/chunks/chunk-ZLBIFIMV.js +1099 -0
  103. package/chunks/{chunk-HA3SAB64.js → chunk-ZOSTTOUJ.js} +1 -1
  104. package/chunks/{chunk-VWMUDKLC.js → chunk-ZTQSOV56.js} +4 -4
  105. package/chunks/{computer-use-ESQYJ3JY.js → computer-use-PMZ7ICGY.js} +8 -8
  106. package/chunks/{config-utils-XQHBJP7G.js → config-utils-ULCSRMWD.js} +4 -4
  107. package/chunks/{contextCommand-CX3YF4ZE.js → contextCommand-GEZU7YHE.js} +11 -10
  108. package/chunks/{core-runtime-DIAU7JMG.js → core-runtime-HRJI2MN6.js} +8 -8
  109. package/chunks/{create-sub-session-HDPD6HOA.js → create-sub-session-VBNVI4YU.js} +9 -9
  110. package/chunks/{daemon-VZBGJUNL.js → daemon-POSQPD3G.js} +115 -7
  111. package/chunks/{daemon-status-provider-H6O4UQ4F.js → daemon-status-provider-N4CRQKFI.js} +18 -18
  112. package/chunks/{daemon-trust-policy-BNUXG6MT.js → daemon-trust-policy-BHO3JUHM.js} +16 -14
  113. package/chunks/{daemon-trust-policy-monitor-E4EQ7GF4.js → daemon-trust-policy-monitor-YEKJ2726.js} +16 -14
  114. package/chunks/{deferred-core-runtime-CBMSHPAU.js → deferred-core-runtime-SH57E3J3.js} +8 -8
  115. package/chunks/{dist-KVISB2O2.js → dist-3NTTUAHT.js} +1 -1
  116. package/chunks/{dist-RCH3I7SS.js → dist-6BMOAE3Z.js} +2 -2
  117. package/chunks/{dist-IRL7WA5Z.js → dist-B2CGTW6T.js} +1 -1
  118. package/chunks/{dist-TUSWNE2I.js → dist-EWW3J4HQ.js} +1 -1
  119. package/chunks/{dist-HIACTZEK.js → dist-EZE3V3Q7.js} +1 -1
  120. package/chunks/{dist-EEEQGCZA.js → dist-J47AXBZC.js} +1 -1
  121. package/chunks/{dist-MKX5OSFF.js → dist-OTUO3AS2.js} +4 -1088
  122. package/chunks/{dist-MBF3I5MX.js → dist-Z3CS4OVP.js} +1 -1
  123. package/chunks/{earlyInputCapture-UIOP7OIN.js → earlyInputCapture-B2JJ2HME.js} +8 -8
  124. package/chunks/{edit-ITMZYFKA.js → edit-7FTXENAN.js} +10 -8
  125. package/chunks/{enter-worktree-S4PL5UV6.js → enter-worktree-JPHV2PBG.js} +8 -8
  126. package/chunks/{enterPlanMode-YV52NNJT.js → enterPlanMode-CGBJ3AHJ.js} +8 -8
  127. package/chunks/{environment-NGOWPRZV.js → environment-LXASZAHD.js} +11 -11
  128. package/chunks/{errors-BU26DTDX.js → errors-XIGVT2AD.js} +10 -10
  129. package/chunks/{exit-worktree-XRM6LH5F.js → exit-worktree-DKSGXW65.js} +8 -8
  130. package/chunks/{exitPlanMode-ZLI5F7KR.js → exitPlanMode-THFL2HYN.js} +8 -8
  131. package/chunks/{fast-path-UJWORIED.js → fast-path-4NXAT5UL.js} +4 -3
  132. package/chunks/{fast-path-settings-37WQD5B2.js → fast-path-settings-RPAVBD7P.js} +2 -2
  133. package/chunks/{gemini-ZSKNDUMU.js → gemini-B3N6FACU.js} +56 -60
  134. package/chunks/{geminiContentGenerator-YGEXOEKD.js → geminiContentGenerator-YYFE2HIE.js} +1 -1
  135. package/chunks/{glob-7KZG44BR.js → glob-BPHSCFJP.js} +8 -8
  136. package/chunks/{grep-6ZFC7RJ5.js → grep-ROZIRFLU.js} +8 -8
  137. package/chunks/{handleAutoUpdate-KSEL3TQS.js → handleAutoUpdate-WV6SPZQB.js} +13 -12
  138. package/chunks/{i18n-ZIUXBW5V.js → i18n-YWJWPQKD.js} +13 -11
  139. package/chunks/{image-gen-AUIZJJNK.js → image-gen-SISRZ6FS.js} +1 -1
  140. package/chunks/{initializer-7AHY3N6Q.js → initializer-66OAD6GO.js} +16 -14
  141. package/chunks/{installationInfo-VGBXMYLY.js → installationInfo-3YUGIP36.js} +9 -9
  142. package/chunks/{list-PSFKQHLB.js → list-VEYR66XB.js} +19 -17
  143. package/chunks/{loadedSettingsAdapter-FTMRCTOF.js → loadedSettingsAdapter-V2JCPCYD.js} +16 -14
  144. package/chunks/{loggingContentGenerator-MZAN52UV.js → loggingContentGenerator-RBLNDREC.js} +6 -6
  145. package/chunks/main-PXAUXNF2.js +8 -0
  146. package/chunks/{managed-npm-update-O4NHK45X.js → managed-npm-update-C5ID5R4R.js} +9 -9
  147. package/chunks/{mcp-6CFP2AYQ.js → mcp-OZ54NZJQ.js} +16 -14
  148. package/chunks/{monitor-DAKD6OU4.js → monitor-7Y4TVFTK.js} +18 -14
  149. package/chunks/{nonInteractiveCli-RC7VIUZL.js → nonInteractiveCli-QEK4LHAC.js} +51 -49
  150. package/chunks/{notebook-edit-474DPMRL.js → notebook-edit-OG35EBGY.js} +9 -8
  151. package/chunks/{openaiContentGenerator-2NFY2MWO.js → openaiContentGenerator-443BNRPJ.js} +5 -5
  152. package/chunks/{pidfile-KBFVDNQP.js → pidfile-ZK4OLRZA.js} +8 -8
  153. package/chunks/{processUtils-6GRYH4Y3.js → processUtils-4YGB4RUZ.js} +2 -2
  154. package/chunks/{qwenContentGenerator-KAHU6IZY.js → qwenContentGenerator-D5C2LCSZ.js} +9 -9
  155. package/chunks/{qwenOAuth2-RRQTCP4W.js → qwenOAuth2-Z4YQBMYN.js} +1 -1
  156. package/chunks/{read-file-3M6WXDXP.js → read-file-EXTJLWMU.js} +4 -4
  157. package/chunks/{resumeHistoryUtils-D6TAY3HX.js → resumeHistoryUtils-UPCGRJUL.js} +13 -12
  158. package/chunks/{ripGrep-PLPENT3E.js → ripGrep-QBVIRCU4.js} +8 -8
  159. package/chunks/{run-qwen-serve-ZAFIJKJC.js → run-qwen-serve-ZYGJNE3E.js} +169 -68
  160. package/chunks/{runtime-ZED7CYOZ.js → runtime-BZZ4LWCP.js} +21 -19
  161. package/chunks/{scheduler-MD3AL2W5.js → scheduler-YNQNOU2E.js} +135 -15
  162. package/chunks/{sdk-exporters-http-KHAB5JSD.js → sdk-exporters-http-XVTZQRCE.js} +2 -2
  163. package/chunks/{sdk-impl-KD7FSTC3.js → sdk-impl-7W7AKCS4.js} +7 -3
  164. package/chunks/{serve-E3VUDRZN.js → serve-LJHAXDCH.js} +18 -14
  165. package/chunks/{server-OWMEMAKR.js → server-ADMLELR6.js} +1229 -1098
  166. package/chunks/{session-HZ57QK7K.js → session-YKZXFFTM.js} +55 -53
  167. package/chunks/{settings-V7BR3RKP.js → settings-EQBUAQ7Y.js} +15 -13
  168. package/chunks/{shell-23OMNMW6.js → shell-3QZOJGTT.js} +8 -8
  169. package/chunks/{skill-6HBDYZRS.js → skill-UWSSMXE7.js} +5 -5
  170. package/chunks/{skill-settings-HWJLTU7M.js → skill-settings-T6MLB7NU.js} +15 -13
  171. package/chunks/{spawnChannel-N6KKUW5B.js → spawnChannel-VS7ZFUFP.js} +11 -11
  172. package/chunks/{standalone-update-QGIKHATD.js → standalone-update-2W26SRRO.js} +11 -10
  173. package/chunks/{startInteractiveUI-GX2CRL42.js → startInteractiveUI-CVS7K3D6.js} +86 -75
  174. package/chunks/{team-create-CFFKU7KL.js → team-create-4WFTNNUL.js} +8 -8
  175. package/chunks/{team-plan-approval-6EFOKR6A.js → team-plan-approval-DBYI33S3.js} +8 -8
  176. package/chunks/{terminal-image-renderer-TLDNACQY.js → terminal-image-renderer-S5WPPQKH.js} +8 -8
  177. package/chunks/{theme-manager-5LJ3H7VO.js → theme-manager-LI2RIOVR.js} +8 -8
  178. package/chunks/{tool-search-UJV3A24H.js → tool-search-4773EUQ4.js} +4 -4
  179. package/chunks/{total-session-admission-D63QYXGO.js → total-session-admission-PAY5CH2Z.js} +16 -15
  180. package/chunks/{trustedFolders-KZCOB53W.js → trustedFolders-FRSLE674.js} +9 -9
  181. package/chunks/{types-ML3TRJQ5.js → types-WYCFCEHR.js} +5 -3
  182. package/chunks/{update-relaunch-IFILM3SA.js → update-relaunch-ZSFQTU6M.js} +5 -5
  183. package/chunks/{updateCheck-YZ2CRCFC.js → updateCheck-AXWSO7KA.js} +12 -11
  184. package/chunks/{useAutoAcceptIndicator-AXEVNA3Q.js → useAutoAcceptIndicator-VHLXIA7U.js} +18 -16
  185. package/chunks/{validateNonInterActiveAuth-3WTOJFWA.js → validateNonInterActiveAuth-PDJECMFU.js} +48 -46
  186. package/chunks/{version-GXK7OHZY.js → version-RBN764QS.js} +1 -1
  187. package/chunks/{web-fetch-ILB4GAVR.js → web-fetch-7BJK42AF.js} +4 -4
  188. package/chunks/{web-search-HKRPGPZZ.js → web-search-L2CILQXV.js} +4 -3
  189. package/chunks/{workflow-FXIPRQQA.js → workflow-5VH2R74I.js} +170 -137
  190. package/chunks/{workspace-providers-status-NYHC7HSR.js → workspace-providers-status-OZTQ6JFH.js} +19 -17
  191. package/chunks/{workspace-registration-store-AKEB7OMW.js → workspace-registration-store-IX5RJQS5.js} +1 -1
  192. package/chunks/{workspace-registry-CDAS5TVZ.js → workspace-registry-73N4BGG4.js} +16 -15
  193. package/chunks/{workspace-service-PAMUKMAV.js → workspace-service-I5RUPSNV.js} +26 -22
  194. package/chunks/{workspace-skills-status-YQSHCCMS.js → workspace-skills-status-DMK6VYDO.js} +17 -15
  195. package/chunks/{workspace-trust-reconciler-RPTXOIY2.js → workspace-trust-reconciler-QX4RL3TC.js} +24 -21
  196. package/chunks/{write-file-CGS57TS4.js → write-file-UGDD5UTS.js} +8 -8
  197. package/chunks/{zoom-image-E7D72GYV.js → zoom-image-ZAHEO3YP.js} +4 -4
  198. package/cli.js +12 -12
  199. package/package.json +3 -3
  200. package/web-shell/assets/{arc-DybZaz32.js → arc-CHY4saMJ.js} +1 -1
  201. package/web-shell/assets/{architectureDiagram-3BPJPVTR-jN3qBd19.js → architectureDiagram-3BPJPVTR-Bu6CwvHj.js} +1 -1
  202. package/web-shell/assets/{blockDiagram-GPEHLZMM-Ct5DZPrj.js → blockDiagram-GPEHLZMM-XGt6iGf_.js} +1 -1
  203. package/web-shell/assets/{c4Diagram-AAUBKEIU-CUAFMlUG.js → c4Diagram-AAUBKEIU-CBbYl19W.js} +1 -1
  204. package/web-shell/assets/channel-B40srHOa.js +1 -0
  205. package/web-shell/assets/{chunk-2J33WTMH-CuV8n90B.js → chunk-2J33WTMH-BEhmVrdx.js} +1 -1
  206. package/web-shell/assets/{chunk-4BX2VUAB-BUzl_kls.js → chunk-4BX2VUAB-fQLyE0Bg.js} +1 -1
  207. package/web-shell/assets/{chunk-55IACEB6-BnDBLX6A.js → chunk-55IACEB6-yGdtyx4a.js} +1 -1
  208. package/web-shell/assets/{chunk-727SXJPM-B83uTOjm.js → chunk-727SXJPM-DYbX2GLo.js} +1 -1
  209. package/web-shell/assets/{chunk-AQP2D5EJ-DM3HLgpT.js → chunk-AQP2D5EJ-DyKTEsYn.js} +1 -1
  210. package/web-shell/assets/{chunk-FMBD7UC4-CSQ5hgyb.js → chunk-FMBD7UC4-D8Uy_GzX.js} +1 -1
  211. package/web-shell/assets/{chunk-ND2GUHAM-BWOF4SxX.js → chunk-ND2GUHAM-C8wNR2K7.js} +1 -1
  212. package/web-shell/assets/{chunk-QZHKN3VN-BsOH9LMi.js → chunk-QZHKN3VN-BnybNxnt.js} +1 -1
  213. package/web-shell/assets/classDiagram-4FO5ZUOK-qumcXQW_.js +1 -0
  214. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-qumcXQW_.js +1 -0
  215. package/web-shell/assets/{cose-bilkent-S5V4N54A-IENqH2iJ.js → cose-bilkent-S5V4N54A-jq4uiFRp.js} +1 -1
  216. package/web-shell/assets/{dagre-BM42HDAG--dyzDTGo.js → dagre-BM42HDAG-Bs7oye1U.js} +1 -1
  217. package/web-shell/assets/{diagram-2AECGRRQ-BE7Dcqof.js → diagram-2AECGRRQ-BHGGJNyM.js} +1 -1
  218. package/web-shell/assets/{diagram-5GNKFQAL-Cr8-5OTj.js → diagram-5GNKFQAL-BJezVLGT.js} +1 -1
  219. package/web-shell/assets/{diagram-KO2AKTUF-Bzey3uAY.js → diagram-KO2AKTUF-5JzQN_rL.js} +1 -1
  220. package/web-shell/assets/{diagram-LMA3HP47-sErl28Xb.js → diagram-LMA3HP47-BlPYOgY9.js} +1 -1
  221. package/web-shell/assets/{diagram-OG6HWLK6-Dq30ATIo.js → diagram-OG6HWLK6-CtMHEaFK.js} +1 -1
  222. package/web-shell/assets/{erDiagram-TEJ5UH35-BkCoEfVW.js → erDiagram-TEJ5UH35-CRNdq2AB.js} +1 -1
  223. package/web-shell/assets/{flowDiagram-I6XJVG4X-DHwO0rrI.js → flowDiagram-I6XJVG4X-De1WwLzu.js} +1 -1
  224. package/web-shell/assets/{ganttDiagram-6RSMTGT7-s7vAPxWq.js → ganttDiagram-6RSMTGT7-YbWfL5Zn.js} +1 -1
  225. package/web-shell/assets/{gitGraphDiagram-PVQCEYII-CQxhwPOU.js → gitGraphDiagram-PVQCEYII-DzCN8bmd.js} +1 -1
  226. package/web-shell/assets/index-BDOGGGaN.css +5 -0
  227. package/web-shell/assets/{index-CF4wApWp.js → index-CocPvF9Q.js} +1 -1
  228. package/web-shell/assets/index-DSH2KrMc.js +1771 -0
  229. package/web-shell/assets/{infoDiagram-5YYISTIA-BnFrD0bq.js → infoDiagram-5YYISTIA-DLHoopnE.js} +1 -1
  230. package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-Bf9zK5NK.js → ishikawaDiagram-YF4QCWOH-XnbU04SS.js} +1 -1
  231. package/web-shell/assets/{journeyDiagram-JHISSGLW-CyGAhsxi.js → journeyDiagram-JHISSGLW-CipPyEeJ.js} +1 -1
  232. package/web-shell/assets/{kanban-definition-UN3LZRKU-CbsK5akB.js → kanban-definition-UN3LZRKU-DrSeyE5d.js} +1 -1
  233. package/web-shell/assets/{linear-cQsF4P8D.js → linear-LrBKnAo_.js} +1 -1
  234. package/web-shell/assets/{mermaid.core-Z4HVqrKY.js → mermaid.core-C3U9UVmf.js} +5 -5
  235. package/web-shell/assets/{mindmap-definition-RKZ34NQL-CYnrBo_f.js → mindmap-definition-RKZ34NQL-DqRWgC9H.js} +1 -1
  236. package/web-shell/assets/{pieDiagram-4H26LBE5-CBzOfhrs.js → pieDiagram-4H26LBE5-BNXY5p6H.js} +1 -1
  237. package/web-shell/assets/{quadrantDiagram-W4KKPZXB-D4LK1Ebn.js → quadrantDiagram-W4KKPZXB-Ccj9QzE4.js} +1 -1
  238. package/web-shell/assets/{requirementDiagram-4Y6WPE33-Bzti2Lcj.js → requirementDiagram-4Y6WPE33-CjPM2_gx.js} +1 -1
  239. package/web-shell/assets/{sankeyDiagram-5OEKKPKP-yTBw5Z2s.js → sankeyDiagram-5OEKKPKP-C0RsvKbj.js} +1 -1
  240. package/web-shell/assets/{sequenceDiagram-3UESZ5HK-D07UVRiZ.js → sequenceDiagram-3UESZ5HK-ClN1P5z7.js} +1 -1
  241. package/web-shell/assets/{stateDiagram-AJRCARHV-UE_lHsTn.js → stateDiagram-AJRCARHV-By0eiB2Y.js} +1 -1
  242. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-Ds0WlK3F.js +1 -0
  243. package/web-shell/assets/{timeline-definition-PNZ67QCA-DRvYdiTs.js → timeline-definition-PNZ67QCA-g_iaSQgv.js} +1 -1
  244. package/web-shell/assets/{vennDiagram-CIIHVFJN-CQLIXs0u.js → vennDiagram-CIIHVFJN-y9ZqJ-TD.js} +1 -1
  245. package/web-shell/assets/{wardley-L42UT6IY-JZz_Xqse.js → wardley-L42UT6IY-BVVfaxpF.js} +1 -1
  246. package/web-shell/assets/{wardleyDiagram-YWT4CUSO--i7BiJwB.js → wardleyDiagram-YWT4CUSO-D3ooZKZT.js} +1 -1
  247. package/web-shell/assets/{xychartDiagram-2RQKCTM6-Bkc-bW0S.js → xychartDiagram-2RQKCTM6-6GXrY6M1.js} +1 -1
  248. package/web-shell/index.html +2 -2
  249. package/chunks/chunk-RXFQM6FQ.js +0 -42
  250. package/chunks/chunk-UA5H3DS2.js +0 -203
  251. package/web-shell/assets/channel-BMwLrwLW.js +0 -1
  252. package/web-shell/assets/classDiagram-4FO5ZUOK-BGDv98jY.js +0 -1
  253. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-BGDv98jY.js +0 -1
  254. package/web-shell/assets/index-Bckpjr-I.css +0 -5
  255. package/web-shell/assets/index-DwEr9HEW.js +0 -1768
  256. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-DC6xgXjX.js +0 -1
  257. /package/chunks/{chunk-VXZBKKQR.js → chunk-NTTBXH7U.js} +0 -0
  258. /package/chunks/{chunk-GRC5HGPI.js → chunk-OIBUG24X.js} +0 -0
@@ -1,14 +1,14 @@
1
1
  // Force strict mode and setup for ESM
2
2
  "use strict";
3
- import {
4
- serveCommand
5
- } from "./chunk-HWX5HPUG.js";
6
3
  import {
7
4
  listCommand
8
- } from "./chunk-EIVICVHM.js";
5
+ } from "./chunk-SCAZZ3Q4.js";
6
+ import {
7
+ serveCommand
8
+ } from "./chunk-LZZLUCRS.js";
9
9
  import {
10
10
  getErrorMessage as getErrorMessage2
11
- } from "./chunk-IYES5WOT.js";
11
+ } from "./chunk-P2FK2HBV.js";
12
12
  import {
13
13
  OBSERVED_CONTACT_MAX_FRESH_WITHIN_SECONDS,
14
14
  ObservedChannelContactStore
@@ -23,16 +23,17 @@ import {
23
23
  loadUndici
24
24
  } from "./chunk-3Z43GZUQ.js";
25
25
  import {
26
- isLoopbackBind
27
- } from "./chunk-RXFQM6FQ.js";
26
+ isLoopbackBind,
27
+ isValidSessionId
28
+ } from "./chunk-TQOF5KBL.js";
29
+ import {
30
+ resolvePath
31
+ } from "./chunk-AOHJKPKL.js";
28
32
  import {
29
33
  collectProviderModelsForProtocol,
30
34
  getAuthTypeFromEnv,
31
35
  resolveCliGenerationConfig
32
- } from "./chunk-GBDINRIL.js";
33
- import {
34
- resolvePath
35
- } from "./chunk-AOHJKPKL.js";
36
+ } from "./chunk-KTQGGPGV.js";
36
37
  import {
37
38
  resolveSkillSettings
38
39
  } from "./chunk-Z4X5MTRT.js";
@@ -52,17 +53,24 @@ import {
52
53
  registerToolCallDispatch,
53
54
  selectFirstModel,
54
55
  sessionsPath
55
- } from "./chunk-E4ZBKMSF.js";
56
+ } from "./chunk-ATMO54WE.js";
56
57
  import {
57
58
  getExtensionManager,
58
59
  requestChoicePluginNonInteractive,
59
60
  requestConsentNonInteractive,
60
61
  requestConsentOrFail,
61
62
  resolveExtensionCommandScope
62
- } from "./chunk-QQWD7LZV.js";
63
+ } from "./chunk-HADWBW5R.js";
63
64
  import {
64
65
  parseChannelConfig
65
- } from "./chunk-QXVSWG66.js";
66
+ } from "./chunk-LHEC5V6G.js";
67
+ import {
68
+ DEFAULT_BASE_URL,
69
+ buildHeaders,
70
+ clearAccount,
71
+ loadAccount,
72
+ saveAccount
73
+ } from "./chunk-VKJ4KTPJ.js";
66
74
  import {
67
75
  findCliEntryPath
68
76
  } from "./chunk-V6WHFGST.js";
@@ -93,16 +101,16 @@ import {
93
101
  import {
94
102
  normalizeWorkerDiagnostic,
95
103
  sanitizeWorkerDiagnostic
96
- } from "./chunk-UFALT4LK.js";
104
+ } from "./chunk-PBRVUF5B.js";
97
105
  import {
98
106
  normalizeServeChannelSelection
99
107
  } from "./chunk-ALMR3E6Q.js";
100
- import {
101
- EXTERNAL_TOOL_GUARD_TOKEN_ENV
102
- } from "./chunk-BKHCW2BI.js";
103
108
  import {
104
109
  redactLogCredentials
105
110
  } from "./chunk-M5GB774H.js";
111
+ import {
112
+ EXTERNAL_TOOL_GUARD_TOKEN_ENV
113
+ } from "./chunk-BKHCW2BI.js";
106
114
  import {
107
115
  readServiceInfo,
108
116
  removeServiceInfo,
@@ -110,13 +118,6 @@ import {
110
118
  waitForExit,
111
119
  writeServiceInfo
112
120
  } from "./chunk-UVX4Y6IN.js";
113
- import {
114
- DEFAULT_BASE_URL,
115
- buildHeaders,
116
- clearAccount,
117
- loadAccount,
118
- saveAccount
119
- } from "./chunk-ZWBUH5UP.js";
120
121
  import {
121
122
  AcpBridge,
122
123
  ChannelLoopScheduler,
@@ -127,38 +128,38 @@ import {
127
128
  isChannelProactiveDeliveryError,
128
129
  sanitizeLogText,
129
130
  sanitizePromptText
130
- } from "./chunk-DIWZNWZT.js";
131
+ } from "./chunk-DX3RGJMS.js";
131
132
  import {
132
133
  assembleMcpServers,
133
134
  getPendingGatedMcpServers,
134
135
  mcpCommand
135
- } from "./chunk-Y4TETC74.js";
136
+ } from "./chunk-MTCYGTWH.js";
136
137
  import {
137
138
  loadSettings
138
- } from "./chunk-OHKJVAKG.js";
139
+ } from "./chunk-JUWS2Z5K.js";
139
140
  import {
140
141
  detectSystemLanguage,
141
142
  getCurrentLanguage,
142
143
  initializeI18n,
143
144
  resolveLanguageSetting,
144
145
  t
145
- } from "./chunk-PG62DFWD.js";
146
+ } from "./chunk-WP5VOXF7.js";
146
147
  import {
147
148
  loadEnvironment
148
- } from "./chunk-B52AWKBB.js";
149
+ } from "./chunk-T6HEQR2Q.js";
149
150
  import {
150
151
  resolveAcpChannelFallback,
151
152
  scrubAndReportInheritedLoaderEnv
152
- } from "./chunk-UA5H3DS2.js";
153
+ } from "./chunk-VFMASYQA.js";
153
154
  import {
154
155
  getCliVersion
155
- } from "./chunk-FN6YXJOP.js";
156
+ } from "./chunk-IOEZE2YT.js";
156
157
  import {
157
158
  getPackageJson
158
159
  } from "./chunk-VJNBRRZG.js";
159
160
  import {
160
161
  isWorkspaceTrusted
161
- } from "./chunk-HA3SAB64.js";
162
+ } from "./chunk-ZOSTTOUJ.js";
162
163
  import {
163
164
  require_strip_json_comments
164
165
  } from "./chunk-NPQ5ZKRP.js";
@@ -200,7 +201,7 @@ import {
200
201
  unquoteCStylePath,
201
202
  updateChannelMemoryEntry,
202
203
  updateSetting
203
- } from "./chunk-GXSNGY5M.js";
204
+ } from "./chunk-XX7QFP34.js";
204
205
  import {
205
206
  nextFireTime,
206
207
  parseCron
@@ -211,12 +212,12 @@ import {
211
212
  import {
212
213
  parseBooleanEnvFlag,
213
214
  resolveTelemetrySettings
214
- } from "./chunk-L4N6TIP7.js";
215
+ } from "./chunk-4TRQPFDP.js";
215
216
  import {
216
217
  getAllGeminiMdFilenames,
217
218
  parseLineTolerant,
218
219
  setGeminiMdFilename
219
- } from "./chunk-3PY4LPJF.js";
220
+ } from "./chunk-YGT2AUJ7.js";
220
221
  import {
221
222
  SchemaValidator,
222
223
  ToolNames
@@ -232,7 +233,7 @@ import {
232
233
  } from "./chunk-FOGU3LJX.js";
233
234
  import {
234
235
  recordChannelMemoryRecallMetrics
235
- } from "./chunk-6M26GBKX.js";
236
+ } from "./chunk-L2AFWWJE.js";
236
237
  import {
237
238
  FatalConfigError,
238
239
  FatalSandboxError,
@@ -2730,7 +2731,7 @@ var stopCommand = {
2730
2731
  if (argv["daemon-url"]) {
2731
2732
  const token = argv.token ?? process.env[QWEN_SERVER_TOKEN_ENV] ?? process.env[QWEN_DAEMON_TOKEN_ENV];
2732
2733
  try {
2733
- const sdk = await import("./daemon-VZBGJUNL.js");
2734
+ const sdk = await import("./daemon-POSQPD3G.js");
2734
2735
  const client = new sdk.DaemonClient({
2735
2736
  baseUrl: argv["daemon-url"],
2736
2737
  ...token ? { token } : {}
@@ -2916,7 +2917,7 @@ var statusCommand = {
2916
2917
  if (argv["daemon-url"]) {
2917
2918
  const token = argv.token ?? process.env[QWEN_SERVER_TOKEN_ENV] ?? process.env[QWEN_DAEMON_TOKEN_ENV];
2918
2919
  try {
2919
- const sdk = await import("./daemon-VZBGJUNL.js");
2920
+ const sdk = await import("./daemon-POSQPD3G.js");
2920
2921
  const client = new sdk.DaemonClient({
2921
2922
  baseUrl: argv["daemon-url"],
2922
2923
  ...token ? { token } : {}
@@ -3027,7 +3028,7 @@ var reloadCommand = {
3027
3028
  const token = resolveToken(argv.token);
3028
3029
  let sdk;
3029
3030
  try {
3030
- sdk = await import("./daemon-VZBGJUNL.js");
3031
+ sdk = await import("./daemon-POSQPD3G.js");
3031
3032
  } catch (err) {
3032
3033
  writeStderrLine(
3033
3034
  `[Channel] Failed to load daemon SDK: ${safeChannelCommandErrorMessage(err)}`
@@ -3107,7 +3108,7 @@ var setCommand2 = {
3107
3108
  const selection = names[0] === "all" ? { mode: "all" } : { mode: "names", names };
3108
3109
  let sdk;
3109
3110
  try {
3110
- sdk = await import("./daemon-VZBGJUNL.js");
3111
+ sdk = await import("./daemon-POSQPD3G.js");
3111
3112
  } catch (error) {
3112
3113
  writeStderrLine(
3113
3114
  `[Channel] Failed to load daemon SDK: ${safeChannelCommandErrorMessage(error)}`
@@ -3233,7 +3234,7 @@ function createDaemonChannelBridgeFacade(bridge, opts) {
3233
3234
  }
3234
3235
  __name(createDaemonChannelBridgeFacade, "createDaemonChannelBridgeFacade");
3235
3236
  async function loadDaemonSdk() {
3236
- return await import("./daemon-VZBGJUNL.js");
3237
+ return await import("./daemon-POSQPD3G.js");
3237
3238
  }
3238
3239
  __name(loadDaemonSdk, "loadDaemonSdk");
3239
3240
  function selectedChannelNames(channelsConfig, selection) {
@@ -4881,6 +4882,12 @@ function execGhWithRetry(args, options) {
4881
4882
  __name(execGhWithRetry, "execGhWithRetry");
4882
4883
  var ghHost;
4883
4884
  var HOSTNAME_RE = /^[A-Za-z0-9.-]+(?::\d+)?$/;
4885
+ var REPO_SEGMENT = /^[A-Za-z0-9._-]+$/;
4886
+ function isOwnerRepo(repo) {
4887
+ const parts = repo.split("/");
4888
+ return parts.length === 2 && parts.every((p) => REPO_SEGMENT.test(p) && p !== "." && p !== "..");
4889
+ }
4890
+ __name(isOwnerRepo, "isOwnerRepo");
4884
4891
  function setGhHost(host) {
4885
4892
  if (host === void 0 || host === "") {
4886
4893
  ghHost = void 0;
@@ -7095,6 +7102,8 @@ import { join as join9 } from "node:path";
7095
7102
  var DEADLINE_ENV = "QWEN_REVIEW_DEADLINE_EPOCH";
7096
7103
  var RESERVE_ENV = "QWEN_REVIEW_DEADLINE_RESERVE_SECONDS";
7097
7104
  var DEFAULT_RESERVE_SECONDS = 4800;
7105
+ var DEFAULT_COMPOSE_FLOOR_SECONDS = 1200;
7106
+ var COMPOSE_FLOOR_ENV = "QWEN_REVIEW_DEADLINE_COMPOSE_FLOOR_SECONDS";
7098
7107
  var DEFAULT_ROUND_SECONDS = 1800;
7099
7108
  var MIN_OBSERVED_ROUND_SECONDS = 600;
7100
7109
  var STAMPS_FILE = "budget-rounds.json";
@@ -7153,17 +7162,31 @@ function expectedRoundSeconds(planPath, round, nowMs = Date.now()) {
7153
7162
  return Math.max(MIN_OBSERVED_ROUND_SECONDS, maxSeconds);
7154
7163
  }
7155
7164
  __name(expectedRoundSeconds, "expectedRoundSeconds");
7156
- function reverseAuditBudgetExhausted(env, roundCostSeconds, nowMs = Date.now()) {
7165
+ function readDeadlineSeconds(env) {
7157
7166
  const raw = env[DEADLINE_ENV];
7158
7167
  if (raw === void 0 || raw.trim() === "") return null;
7159
7168
  const deadline = Number(raw);
7160
7169
  if (!Number.isFinite(deadline) || deadline <= 0) return null;
7161
- let reserve = DEFAULT_RESERVE_SECONDS;
7162
- const reserveRaw = env[RESERVE_ENV];
7163
- if (reserveRaw !== void 0 && reserveRaw.trim() !== "") {
7164
- const r = Number(reserveRaw);
7165
- if (Number.isFinite(r) && r >= 0) reserve = r;
7170
+ return deadline;
7171
+ }
7172
+ __name(readDeadlineSeconds, "readDeadlineSeconds");
7173
+ function readNonNegativeSeconds(env, key, fallback) {
7174
+ const raw = env[key];
7175
+ if (raw !== void 0 && raw.trim() !== "") {
7176
+ const v = Number(raw);
7177
+ if (Number.isFinite(v) && v >= 0) return v;
7166
7178
  }
7179
+ return fallback;
7180
+ }
7181
+ __name(readNonNegativeSeconds, "readNonNegativeSeconds");
7182
+ function reverseAuditBudgetExhausted(env, roundCostSeconds, nowMs = Date.now()) {
7183
+ const deadline = readDeadlineSeconds(env);
7184
+ if (deadline === null) return null;
7185
+ const reserve = readNonNegativeSeconds(
7186
+ env,
7187
+ RESERVE_ENV,
7188
+ DEFAULT_RESERVE_SECONDS
7189
+ );
7167
7190
  const remainingSeconds = Math.floor(deadline - nowMs / 1e3);
7168
7191
  if (remainingSeconds >= reserve + roundCostSeconds) return null;
7169
7192
  return {
@@ -7173,6 +7196,26 @@ function reverseAuditBudgetExhausted(env, roundCostSeconds, nowMs = Date.now())
7173
7196
  };
7174
7197
  }
7175
7198
  __name(reverseAuditBudgetExhausted, "reverseAuditBudgetExhausted");
7199
+ function verifyBudgetExhausted(env, nowMs = Date.now()) {
7200
+ const deadline = readDeadlineSeconds(env);
7201
+ if (deadline === null) return null;
7202
+ const floor = readNonNegativeSeconds(
7203
+ env,
7204
+ COMPOSE_FLOOR_ENV,
7205
+ DEFAULT_COMPOSE_FLOOR_SECONDS
7206
+ );
7207
+ if (floor <= 0) return null;
7208
+ const remainingSeconds = Math.floor(deadline - nowMs / 1e3);
7209
+ if (remainingSeconds > floor) return null;
7210
+ return { remainingSeconds, composeFloorSeconds: floor };
7211
+ }
7212
+ __name(verifyBudgetExhausted, "verifyBudgetExhausted");
7213
+ function verifyBudgetMessage(spent) {
7214
+ const minutesLeft = Math.max(0, Math.floor(spent.remainingSeconds / 60));
7215
+ const floorMinutes = Math.round(spent.composeFloorSeconds / 60);
7216
+ return `VERIFY BUDGET: ${minutesLeft} minute(s) remain before this review's deadline \u2014 at or below the ${floorMinutes}-minute floor compose-review and submission need, so no verification shard will be built. This is a termination rule, not an error: do not rebuild the verifier. Proceed to Step 6 NOW and compose. Findings still carrying \`\u2014 [unverified]\` keep that tag: compose-review caps the verdict on it and never treats an unverified finding as a confirmed blocker \u2014 everything earlier rounds confirmed still posts. A review that stops verifying here reports what it proved; one that keeps verifying past this floor is killed before it posts anything.`;
7217
+ }
7218
+ __name(verifyBudgetMessage, "verifyBudgetMessage");
7176
7219
  var BUDGET_STOP_PHRASE = "review time budget";
7177
7220
  function budgetStopDisclosure(round) {
7178
7221
  const which = round !== void 0 ? `round ${round}` : "the next round";
@@ -7195,6 +7238,45 @@ function budgetStopEntryZh(round) {
7195
7238
  return `${d.subjectZh}\u2014\u2014${d.reasonZh}`;
7196
7239
  }
7197
7240
  __name(budgetStopEntryZh, "budgetStopEntryZh");
7241
+ var ROUND_CAP_PHRASE = "reverse-audit round cap";
7242
+ function roundCapStopDisclosure(cap) {
7243
+ return {
7244
+ subject: "reverse audit",
7245
+ reason: `did not converge within the ${ROUND_CAP_PHRASE} of ${cap}`,
7246
+ subjectZh: "\u53CD\u5411\u5BA1\u8BA1",
7247
+ reasonZh: `\u5728 ${cap} \u8F6E\u7684\u53CD\u5BA1\u8F6E\u6570\u4E0A\u9650\u5185\u672A\u6536\u655B`
7248
+ };
7249
+ }
7250
+ __name(roundCapStopDisclosure, "roundCapStopDisclosure");
7251
+ function roundCapStopEntry(cap) {
7252
+ const d = roundCapStopDisclosure(cap);
7253
+ return `${d.subject} \u2014 ${d.reason}`;
7254
+ }
7255
+ __name(roundCapStopEntry, "roundCapStopEntry");
7256
+ function roundCapStopEntryZh(cap) {
7257
+ const d = roundCapStopDisclosure(cap);
7258
+ return `${d.subjectZh}\u2014\u2014${d.reasonZh}`;
7259
+ }
7260
+ __name(roundCapStopEntryZh, "roundCapStopEntryZh");
7261
+ function writeRoundCapStop(planPath, cap, round, nowMs = Date.now()) {
7262
+ try {
7263
+ const dir = promptRecordDir(planPath);
7264
+ mkdirSync5(dir, { recursive: true });
7265
+ const stop = {
7266
+ cause: "round-cap",
7267
+ cap,
7268
+ entry: roundCapStopEntry(cap),
7269
+ entryZh: roundCapStopEntryZh(cap),
7270
+ round: round ?? null,
7271
+ remainingSeconds: 0,
7272
+ reserveSeconds: 0,
7273
+ atMs: nowMs
7274
+ };
7275
+ writeFileSync5(join9(dir, STOP_FILE), JSON.stringify(stop, null, 2));
7276
+ } catch {
7277
+ }
7278
+ }
7279
+ __name(writeRoundCapStop, "writeRoundCapStop");
7198
7280
  function writeBudgetStop(planPath, spent, round, nowMs = Date.now()) {
7199
7281
  try {
7200
7282
  const dir = promptRecordDir(planPath);
@@ -7233,13 +7315,16 @@ function reverseAuditBudgetMessage(spent, round) {
7233
7315
  const reserveMinutes = Math.round(spent.reserveSeconds / 60);
7234
7316
  const roundMinutes = Math.round(spent.expectedRoundSeconds / 60);
7235
7317
  const which = round !== void 0 ? `round ${round}` : "the next round";
7236
- return `BUDGET: ${minutesLeft} minute(s) remain before this review's deadline \u2014 not enough for the ~${roundMinutes}-minute round being asked for plus the ${reserveMinutes}-minute reserve kept for its verification, compose-review and submission \u2014 so no further reverse-audit round will be built. This is the loop's termination rule, not an error: do not rebuild ${which} and do not relaunch auditors. A budget-stop marker has been recorded and compose-review will disclose it and cap the verdict itself; also add exactly this entry to unreviewedDimensions so the terminal report says it too \u2014 \`${budgetStopEntry(round)}\` \u2014 and proceed to Step 6 with the findings already confirmed. Spend what time remains only on verifying findings already in hand, composing, and submitting. A review that stops here still reports everything it proved; a review that runs past its deadline is killed holding all of it.`;
7318
+ return `BUDGET: ${minutesLeft} minute(s) remain before this review's deadline \u2014 not enough for the ~${roundMinutes}-minute round being asked for plus the ${reserveMinutes}-minute reserve kept for its verification, compose-review and submission \u2014 so no further reverse-audit round will be built. This is the loop's termination rule, not an error: do not rebuild ${which} and do not relaunch auditors. A budget-stop marker has been recorded and compose-review will disclose it and cap the verdict itself; also add exactly this entry to unreviewedDimensions so the terminal report says it too \u2014 \`${budgetStopEntry(round)}\` \u2014 and proceed to Step 6. Verify the last round's findings ONLY through \`agent-prompt --role verify\` (never a hand-rolled agent) \u2014 it is gated on the compose floor and will refuse once too little time remains, leaving any still-\`[unverified]\` findings tagged for compose-review to cap \u2014 then compose and submit. Do NOT re-verify findings already confirmed in earlier rounds. A review that stops here still reports everything it proved; a review that runs past its deadline is killed holding all of it.`;
7237
7319
  }
7238
7320
  __name(reverseAuditBudgetMessage, "reverseAuditBudgetMessage");
7239
7321
 
7240
7322
  // packages/cli/src/commands/review/lib/budget.ts
7241
7323
  init_esbuild_shims();
7242
7324
  var SWEEP_FLOOR = 25;
7325
+ var MAX_REVERSE_AUDIT_ROUNDS = 5;
7326
+ var HUGE_REVERSE_AUDIT_ROUNDS = 3;
7327
+ var HUGE_DIFF_FLOOR = 3e3;
7243
7328
  var SPECIALIST_FLOOR = 80;
7244
7329
  var LINES_PER_ANGLE = 60;
7245
7330
  var MIN_INLINE_ANGLES = 3;
@@ -7261,16 +7346,28 @@ function reviewBudget(input) {
7261
7346
  return {
7262
7347
  inlineAngles,
7263
7348
  sweep: effective >= SWEEP_FLOOR,
7264
- specialistCap: src >= SPECIALIST_FLOOR ? 2 : 0,
7349
+ // Agent 8 sheds in the huge zone. A specialist is a whole-diff pass on
7350
+ // top of the base fan-out, and on a diff too big to finish that extra
7351
+ // pass is the marginal cost that guarantees zero posted output — while
7352
+ // the per-chunk fan-out already covers the ground. Finishability over
7353
+ // an added depth pass, in exactly the band where the review otherwise
7354
+ // posts nothing.
7355
+ specialistCap: src >= SPECIALIST_FLOOR && effective < HUGE_DIFF_FLOOR ? 2 : 0,
7265
7356
  verifyShard: VERIFY_SHARD,
7266
7357
  agentToolBudget: clamp(
7267
7358
  MIN_AGENT_TOOL_BUDGET + Math.floor(effective / LINES_PER_TOOL_CALL),
7268
7359
  MIN_AGENT_TOOL_BUDGET,
7269
7360
  MAX_AGENT_TOOL_BUDGET
7270
- )
7361
+ ),
7362
+ reverseAuditRounds: effective >= HUGE_DIFF_FLOOR ? HUGE_REVERSE_AUDIT_ROUNDS : MAX_REVERSE_AUDIT_ROUNDS
7271
7363
  };
7272
7364
  }
7273
7365
  __name(reviewBudget, "reviewBudget");
7366
+ function reverseAuditRoundCap(budget) {
7367
+ const v = budget?.reverseAuditRounds;
7368
+ return typeof v === "number" && Number.isInteger(v) && v >= HUGE_REVERSE_AUDIT_ROUNDS && v <= MAX_REVERSE_AUDIT_ROUNDS ? v : MAX_REVERSE_AUDIT_ROUNDS;
7369
+ }
7370
+ __name(reverseAuditRoundCap, "reverseAuditRoundCap");
7274
7371
  var MAX_TOTAL_TOOL_CALLS = 200;
7275
7372
  function launchToolBudget(planBudget, territoryLines, mandatoryReads) {
7276
7373
  const base = clamp(
@@ -7292,10 +7389,10 @@ function launchToolBudget(planBudget, territoryLines, mandatoryReads) {
7292
7389
  );
7293
7390
  }
7294
7391
  __name(launchToolBudget, "launchToolBudget");
7295
- var BUDGET_GAP_LINE_RE = /^[ \t]*(?:[-*+]|\d+[.)])?[ \t]*(`?)[*_~]{0,3}(?:budget gap|预算(?:缺口|不足|用尽))[*_~]{0,3}[ \t]*[::][*_~]{0,3}[ \t]*(.+?)[ \t]*$/i;
7392
+ var BUDGET_GAP_LINE_RE = /^(?:[ \t]*(?:[-*+]|\d+[.)]))?[ \t]*(`?)[*_~]{0,3}(?:budget gap|预算(?:缺口|不足|用尽))[*_~]{0,3}[ \t]*[::][*_~]{0,3}[ \t]*(.+)$/i;
7296
7393
  var GAP_HINT_RE = /budget gap|预算(?:缺口|不足|用尽)/i;
7297
7394
  var INLINE_BUDGET_GAP_RE = /(?:budget gap|预算(?:缺口|不足|用尽))[*_~`]{0,3}[ \t]*[::]/i;
7298
- var PLACEHOLDER_GAP_RE = /^(?:<[^>]*>|none\b.*|n\/a\b.*|nothing\b.*|no (?:gaps?|checks?)\b.*|[-—*_~`]+)$/i;
7395
+ var PLACEHOLDER_GAP_RE = /^(?:<[^>]*>$|[-—*_~`]+$|(?:none|n\/a|nothing|no (?:gaps?|checks?))\b(?:[.!…,;:\s]*$|\s+(?:skipped|found|to report)\b[.!…,;:\s]*$|\s*[-—–]\s*(?:stayed\s+(?:under|within|below)\s+budget\b[.!…,;:\s]*$|(?:all|every(?:thing)?|planned|further|no further)\b(?:(?!\b(?:but|except|excepting|excluding)\b).)*(?<!\b(?:none|nothing|no|zero|never|not)\s)\b(?:complete[ds]?|done|finished|covered)\b[.!…,;:\s]*$)|\s*\(\s*(?:all|every(?:thing)?)\b(?:(?!\b(?:but|except|excepting|excluding)\b)[^()])*(?<!\b(?:none|nothing|no|zero|never|not)\s)\b(?:complete[ds]?|done|finished|covered)\b[.!…,;:\s]*\)\s*$))/i;
7299
7396
  var MAX_GAP_LENGTH = 160;
7300
7397
  var MAX_GAPS_PER_AGENT = 8;
7301
7398
  var DANGEROUS_CHARS_RE = (
@@ -7325,6 +7422,13 @@ function stripWrappers(s) {
7325
7422
  return out;
7326
7423
  }
7327
7424
  __name(stripWrappers, "stripWrappers");
7425
+ var TRAILING_GAP_CHAR_RE = /[.!…,;:\s]/;
7426
+ function stripTrailingGapChars(s) {
7427
+ let end = s.length;
7428
+ while (end > 0 && TRAILING_GAP_CHAR_RE.test(s.charAt(end - 1))) end--;
7429
+ return s.slice(0, end);
7430
+ }
7431
+ __name(stripTrailingGapChars, "stripTrailingGapChars");
7328
7432
  function truncateGap(s) {
7329
7433
  const points = [...s];
7330
7434
  return points.length > MAX_GAP_LENGTH ? `${points.slice(0, MAX_GAP_LENGTH).join("")}\u2026` : s;
@@ -7342,7 +7446,8 @@ function budgetGapDisclosures(finalText) {
7342
7446
  }
7343
7447
  if (inFence) continue;
7344
7448
  if (/^[ \t]*>/.test(line)) continue;
7345
- const m = BUDGET_GAP_LINE_RE.exec(line.replace(DANGEROUS_CHARS_RE, " "));
7449
+ const sanitized = line.replace(DANGEROUS_CHARS_RE, " ").trimEnd();
7450
+ const m = BUDGET_GAP_LINE_RE.exec(sanitized);
7346
7451
  if (!m) continue;
7347
7452
  let raw = m[2] ?? "";
7348
7453
  if (m[1] === "`") {
@@ -7350,11 +7455,12 @@ function budgetGapDisclosures(finalText) {
7350
7455
  raw = raw.slice(0, -1);
7351
7456
  }
7352
7457
  raw = stripWrappers(raw.trim()).trim();
7353
- const normalized = raw.replace(/[.!…,;:\s]+$/, "").trim();
7354
- if (normalized.length === 0 || PLACEHOLDER_GAP_RE.test(normalized)) {
7458
+ const normalized = stripTrailingGapChars(raw).trim();
7459
+ const unparenthesized = normalized.startsWith("(") && normalized.endsWith(")") ? normalized.slice(1, -1).trim() : normalized;
7460
+ if (normalized.length === 0 || PLACEHOLDER_GAP_RE.test(unparenthesized)) {
7355
7461
  continue;
7356
7462
  }
7357
- const key = normalized.toLowerCase();
7463
+ const key = stripTrailingGapChars(unparenthesized).toLowerCase();
7358
7464
  if (seen.has(key)) continue;
7359
7465
  seen.add(key);
7360
7466
  gaps.push(truncateGap(raw));
@@ -8131,6 +8237,82 @@ function withMarker(line) {
8131
8237
  return line.startsWith(CRITICAL_PREFIX) ? line : `${CRITICAL_PREFIX} ${line}`;
8132
8238
  }
8133
8239
  __name(withMarker, "withMarker");
8240
+ function planPrIdentity(plan) {
8241
+ if (typeof plan !== "object" || plan === null) return null;
8242
+ const p = plan;
8243
+ const ownerRepo = typeof p.ownerRepo === "string" && isOwnerRepo(p.ownerRepo) ? p.ownerRepo : null;
8244
+ const prNumber = isPositivePrNumber(p.prNumber) ? String(p.prNumber) : null;
8245
+ const host = typeof p.host === "string" && HOSTNAME_RE.test(p.host) ? p.host : null;
8246
+ return ownerRepo && prNumber ? { ownerRepo, prNumber, host } : null;
8247
+ }
8248
+ __name(planPrIdentity, "planPrIdentity");
8249
+ function prIdentityFromPlan(planPath) {
8250
+ if (!planPath) return null;
8251
+ try {
8252
+ return planPrIdentity(JSON.parse(readFileSync10(planPath, "utf8")));
8253
+ } catch {
8254
+ return null;
8255
+ }
8256
+ }
8257
+ __name(prIdentityFromPlan, "prIdentityFromPlan");
8258
+ function linkifyCommentRefs(text, pr) {
8259
+ if (!pr || text.includes("](")) return text;
8260
+ const host = (resolveGhHost(pr.host ?? getGhHost()) ?? "github.com").toLowerCase().replace(/:0*443$/, "").replace(/\.$/, "").replace(/^www\.github\.com$/, "github.com");
8261
+ const base = `https://${host}/${pr.ownerRepo}/pull/${pr.prNumber}`;
8262
+ const commentRef = host === "github.com" ? /\b(issue-level )?comment (\d{6,})\b/gi : /\b(issue-level )?comment (\d+)\b/gi;
8263
+ const issueLevelEntry = /\bissue(?:-level)?\s+comment\b/i.test(text);
8264
+ return text.replace(
8265
+ commentRef,
8266
+ (_m, issueLevel, id) => issueLevel || issueLevelEntry ? `[${issueLevel ?? ""}comment ${id}](${base}#issuecomment-${id})` : `[comment ${id}](${base}#discussion_r${id})`
8267
+ );
8268
+ }
8269
+ __name(linkifyCommentRefs, "linkifyCommentRefs");
8270
+ function formatCannotTell(cannotTell, pr) {
8271
+ const parsed = cannotTell.map((raw) => {
8272
+ const unmarked = raw.startsWith(CRITICAL_PREFIX) ? raw.slice(CRITICAL_PREFIX.length).trim() : raw;
8273
+ const line = linkifyCommentRefs(
8274
+ unmarked.includes("\n") ? unmarked.split("\n").map((seg) => seg.trim()).filter((seg) => seg !== "").join(" ") : unmarked,
8275
+ pr
8276
+ );
8277
+ const idx = line.indexOf(" \u2014 ");
8278
+ return idx === -1 ? { head: line, reason: null } : {
8279
+ head: line.slice(0, idx),
8280
+ reason: line.slice(idx + 3).trim() || null
8281
+ };
8282
+ });
8283
+ const groups = [];
8284
+ const byReason = /* @__PURE__ */ new Map();
8285
+ for (const p of parsed) {
8286
+ const existing = p.reason === null ? void 0 : byReason.get(p.reason);
8287
+ if (existing) {
8288
+ existing.heads.push(p.head);
8289
+ continue;
8290
+ }
8291
+ const group = { reason: p.reason, heads: [p.head] };
8292
+ groups.push(group);
8293
+ if (p.reason !== null) byReason.set(p.reason, group);
8294
+ }
8295
+ const lines = [];
8296
+ for (const { reason, heads } of groups) {
8297
+ if (heads.length === 1) {
8298
+ lines.push(
8299
+ `- ${CRITICAL_PREFIX} ${heads[0]}${reason === null ? "" : ` \u2014 ${reason}`}`
8300
+ );
8301
+ } else {
8302
+ lines.push(
8303
+ `- ${CRITICAL_PREFIX} ${heads.length} entries \u2014 ${reason}:`,
8304
+ ...heads.map((head) => ` - ${head}`)
8305
+ );
8306
+ }
8307
+ }
8308
+ return {
8309
+ en: `Unresolved, please confirm:
8310
+
8311
+ ${lines.join("\n")}`,
8312
+ zh: `\u672A\u51B3\uFF0C\u8BF7\u786E\u8BA4\uFF1A\u5171 ${cannotTell.length} \u6761\uFF08\u539F\u6587\u672A\u7FFB\u8BD1\uFF0C\u5217\u8868\u89C1\u4E0A\u65B9\u82F1\u6587\u90E8\u5206\uFF09\u3002`
8313
+ };
8314
+ }
8315
+ __name(formatCannotTell, "formatCannotTell");
8134
8316
  function toCount(value, field) {
8135
8317
  if (value === void 0 || value === null) return 0;
8136
8318
  if (typeof value !== "number" || !Number.isInteger(value) || value < 0) {
@@ -8152,7 +8334,7 @@ function toStringList(value, field) {
8152
8334
  }
8153
8335
  __name(toStringList, "toStringList");
8154
8336
  function stripReviewFooter(entry) {
8155
- return entry.replace(REVIEW_FOOTER_RE, "");
8337
+ return entry.includes(FOOTER_MARKER) ? entry.replace(REVIEW_FOOTER_RE, "") : entry;
8156
8338
  }
8157
8339
  __name(stripReviewFooter, "stripReviewFooter");
8158
8340
  function toBool(value, field) {
@@ -8235,12 +8417,16 @@ function composeReviewBody(input, cliVersion) {
8235
8417
  if (input.planPath) {
8236
8418
  const stop = readBudgetStop(input.planPath);
8237
8419
  if (stop !== null) {
8420
+ const isRoundCap = stop.cause === "round-cap";
8421
+ const phrase = isRoundCap ? ROUND_CAP_PHRASE : BUDGET_STOP_PHRASE;
8238
8422
  for (let i = unreviewed.length - 1; i >= 0; i--) {
8239
- if (unreviewed[i].includes(BUDGET_STOP_PHRASE)) {
8423
+ if (unreviewed[i].includes(phrase)) {
8240
8424
  unreviewed.splice(i, 1);
8241
8425
  }
8242
8426
  }
8243
- budgetEntry = budgetStopDisclosure(stop.round ?? void 0);
8427
+ budgetEntry = isRoundCap ? roundCapStopDisclosure(
8428
+ typeof stop.cap === "number" ? stop.cap : MAX_REVERSE_AUDIT_ROUNDS
8429
+ ) : budgetStopDisclosure(stop.round ?? void 0);
8244
8430
  coverageEntries.push(budgetEntry);
8245
8431
  }
8246
8432
  }
@@ -8619,12 +8805,7 @@ ${footer}`;
8619
8805
  zh: reason ? `\u672A\u5BA1\u67E5\uFF1A${shownZh.join("\u3001")}\u2014\u2014${reasonZh}\u3002` : `\u672A\u5BA1\u67E5\uFF1A${shownZh.join("\u3001")}\u3002`
8620
8806
  });
8621
8807
  }
8622
- const cannotTellBlock = cannotTell.length === 0 ? [] : [
8623
- {
8624
- en: `Unresolved, please confirm: ${cannotTell.map((l) => withMarker(l)).join(" ")}`,
8625
- zh: `\u672A\u51B3\uFF0C\u8BF7\u786E\u8BA4\uFF1A${cannotTell.map((l) => withMarker(l)).join(" ")}`
8626
- }
8627
- ];
8808
+ const cannotTellBlock = cannotTell.length === 0 ? [] : [formatCannotTell(cannotTell, prIdentityFromPlan(input.planPath))];
8628
8809
  const bodyCriticalBlock = bodyCriticals.map((l) => withMarker(l)).map((l) => ({ en: l, zh: l }));
8629
8810
  const contextUnavailableClause = {
8630
8811
  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.",
@@ -8746,6 +8927,7 @@ ${footer}`;
8746
8927
  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`
8747
8928
  });
8748
8929
  }
8930
+ const openerCount = clauses.length;
8749
8931
  clauses.push(...cannotTellBlock);
8750
8932
  clauses.push(...notReviewedParts);
8751
8933
  clauses.push(...unverifiedTagsBlock);
@@ -8755,9 +8937,19 @@ ${footer}`;
8755
8937
  if (downgradedFrom === "Request changes" || criticalsUnverified) {
8756
8938
  clauses.push(...bodyCriticalBlock);
8757
8939
  }
8940
+ const openerParts = clauses.slice(0, openerCount);
8941
+ const paragraphs = [
8942
+ ...openerParts.length > 0 ? [
8943
+ {
8944
+ en: openerParts.map((c2) => c2.en).join(" "),
8945
+ zh: openerParts.map((c2) => c2.zh).join(" ")
8946
+ }
8947
+ ] : [],
8948
+ ...clauses.slice(openerCount)
8949
+ ];
8758
8950
  return {
8759
8951
  event: event2,
8760
- body: render(clauses, " "),
8952
+ body: render(paragraphs, "\n\n"),
8761
8953
  baseEvent,
8762
8954
  cappedBy,
8763
8955
  downgraded,
@@ -8955,14 +9147,14 @@ function bilingualFromPlan(planPath, fetchPrBody2 = fetchPrBodyViaGh) {
8955
9147
  } catch {
8956
9148
  return false;
8957
9149
  }
8958
- if (typeof plan?.prDescriptionHasHan === "boolean") {
8959
- return plan.prDescriptionHasHan;
9150
+ const han = plan?.prDescriptionHasHan;
9151
+ if (typeof han === "boolean") {
9152
+ return han;
8960
9153
  }
8961
- const ownerRepo = typeof plan?.ownerRepo === "string" && plan.ownerRepo ? plan.ownerRepo : void 0;
8962
- const prNumber = isPositivePrNumber(plan?.prNumber) ? String(plan.prNumber) : void 0;
8963
- if (!ownerRepo || !prNumber) return false;
9154
+ const pr = planPrIdentity(plan);
9155
+ if (!pr) return false;
8964
9156
  try {
8965
- return new RegExp("\\p{Script=Han}", "u").test(fetchPrBody2(ownerRepo, prNumber));
9157
+ return new RegExp("\\p{Script=Han}", "u").test(fetchPrBody2(pr.ownerRepo, pr.prNumber));
8966
9158
  } catch {
8967
9159
  return false;
8968
9160
  }
@@ -13579,7 +13771,6 @@ import { dirname as dirname16, join as join14, resolve as resolve17 } from "node
13579
13771
  init_esbuild_shims();
13580
13772
  import { readFileSync as readFileSync20, statSync as statSync11 } from "node:fs";
13581
13773
  import { resolve as resolve16, sep as sep6 } from "node:path";
13582
- var REVERSE_AUDIT_MAX_ROUNDS = 5;
13583
13774
  var RECORD_KEY_RE = /^reverse-audit--chunk-(\d+)--round-(\d+)--[0-9a-f]+$/;
13584
13775
  var REVERSE_AUDIT_MARKER = "reverse-audit";
13585
13776
  function bakedRanges(prompt, diffPath) {
@@ -13744,8 +13935,9 @@ function scheduleReverseAuditRound(planPath, chunkIds, round, env = process.env,
13744
13935
  dryRounds: [lastTwo[0].round, lastTwo[1].round],
13745
13936
  // The next even round — this branch only runs on odd rounds, so
13746
13937
  // that is always round + 1. Whether the cap allows it is the note
13747
- // composer's question, not the schedule's (see
13748
- // REVERSE_AUDIT_MAX_ROUNDS).
13938
+ // composer's question, not the schedule's: the plan's cap
13939
+ // (`reverseAuditRoundCap` in budget.ts, floored at the huge-diff
13940
+ // tier's 3) is what the admission gate enforces.
13749
13941
  nextColdCheck: round + 1
13750
13942
  });
13751
13943
  }
@@ -14698,7 +14890,15 @@ function requireAuditableChunks(report) {
14698
14890
  return chunks;
14699
14891
  }
14700
14892
  __name(requireAuditableChunks, "requireAuditableChunks");
14701
- function admitReverseAuditRound(planPath, round) {
14893
+ function admitReverseAuditRound(planPath, round, cap) {
14894
+ if (typeof round === "number" && round > cap) {
14895
+ writeRoundCapStop(planPath, cap, round);
14896
+ writeStderrLine(
14897
+ `ROUND CAP: the plan's reverse-audit round cap is ${cap}, and round ${round} is past it. This is a termination rule, not an error \u2014 do not rebuild or retry. A marker has been recorded and compose-review will cap the verdict; still add \`${roundCapStopEntry(cap)}\` to unreviewedDimensions so the terminal report agrees. If the cap round reported findings whose verdicts have not landed, launch their verifiers alone and wait, then proceed to Step 6.`
14898
+ );
14899
+ process.exitCode = 4;
14900
+ return false;
14901
+ }
14702
14902
  const spent = reverseAuditBudgetExhausted(
14703
14903
  process.env,
14704
14904
  expectedRoundSeconds(planPath, round)
@@ -14722,7 +14922,8 @@ __name(refuseConverged, "refuseConverged");
14722
14922
  function runAllChunks(report, planPath, role, findingsContent, rules, round) {
14723
14923
  const chunks = requireAuditableChunks(report);
14724
14924
  let schedule = null;
14725
- if (role === "reverse-audit" && round !== void 0 && round >= 3) {
14925
+ const retirementReadsFrom = 3;
14926
+ if (role === "reverse-audit" && round !== void 0 && round >= retirementReadsFrom) {
14726
14927
  try {
14727
14928
  schedule = scheduleReverseAuditRound(
14728
14929
  planPath,
@@ -14739,7 +14940,11 @@ function runAllChunks(report, planPath, role, findingsContent, rules, round) {
14739
14940
  refuseConverged();
14740
14941
  return;
14741
14942
  }
14742
- if (role === "reverse-audit" && !admitReverseAuditRound(planPath, round)) {
14943
+ if (role === "reverse-audit" && !admitReverseAuditRound(
14944
+ planPath,
14945
+ round,
14946
+ reverseAuditRoundCap(report.budget)
14947
+ )) {
14743
14948
  return;
14744
14949
  }
14745
14950
  const dueSet = schedule === null ? null : new Set(schedule.due);
@@ -14771,10 +14976,11 @@ function runAllChunks(report, planPath, role, findingsContent, rules, round) {
14771
14976
  ` + printed;
14772
14977
  });
14773
14978
  const scope = skipped.length === 0 ? "one per chunk" : `one per chunk still under audit (${skipped.length} retired chunk(s) skipped; the retirement note after the end-of-round line says which \u2014 relay it to the terminal)`;
14979
+ const planRoundCap = reverseAuditRoundCap(report.budget);
14774
14980
  const retirementNote = skipped.length === 0 ? [] : [
14775
14981
  `retirement: a chunk whose two most recent audits are substantive dry receipts is cold-checked on alternating rounds instead of audited on every one; a cold check that yields returns it to every-round auditing. Skipped this round:
14776
14982
  ` + skipped.map(
14777
- (s) => `chunk ${s.chunkId} \u2014 retired: dry in rounds ${s.dryRounds[0]} and ${s.dryRounds[1]}, ` + (s.nextColdCheck > REVERSE_AUDIT_MAX_ROUNDS ? `certificate final \u2014 the ${REVERSE_AUDIT_MAX_ROUNDS}-round hard cap leaves the loop no round for a cold check` : `next cold check round ${s.nextColdCheck}`)
14983
+ (s) => `chunk ${s.chunkId} \u2014 retired: dry in rounds ${s.dryRounds.join(" and ")}, ` + (s.nextColdCheck > planRoundCap ? `certificate final \u2014 the ${planRoundCap}-round cap leaves the loop no round for a cold check` : `next cold check round ${s.nextColdCheck}`)
14778
14984
  ).join("\n")
14779
14985
  ];
14780
14986
  writeStdoutLine(
@@ -14941,9 +15147,21 @@ function runAgentPrompt(args) {
14941
15147
  );
14942
15148
  }
14943
15149
  }
14944
- if (args.role === "reverse-audit" && !hasChunk && !args.allChunks && !admitReverseAuditRound(args.plan, args.round)) {
15150
+ if (args.role === "reverse-audit" && !hasChunk && !args.allChunks && !admitReverseAuditRound(
15151
+ args.plan,
15152
+ args.round,
15153
+ reverseAuditRoundCap(report.budget)
15154
+ )) {
14945
15155
  return;
14946
15156
  }
15157
+ if (args.role === "verify") {
15158
+ const spent = verifyBudgetExhausted(process.env);
15159
+ if (spent !== null) {
15160
+ writeStderrLine(verifyBudgetMessage(spent));
15161
+ process.exitCode = 4;
15162
+ return;
15163
+ }
15164
+ }
14947
15165
  if (args.role === "reverse-audit" && hasChunk && !readRoundStamps(args.plan).some((s) => s.round === (args.round ?? null))) {
14948
15166
  if (args.round !== void 0) {
14949
15167
  let schedule = null;
@@ -14963,7 +15181,12 @@ function runAgentPrompt(args) {
14963
15181
  return;
14964
15182
  }
14965
15183
  }
14966
- if (!admitReverseAuditRound(args.plan, args.round)) return;
15184
+ if (!admitReverseAuditRound(
15185
+ args.plan,
15186
+ args.round,
15187
+ reverseAuditRoundCap(report.budget)
15188
+ ))
15189
+ return;
14967
15190
  }
14968
15191
  if (args.allChunks && args.role && findingsContent !== void 0) {
14969
15192
  runAllChunks(
@@ -15020,7 +15243,7 @@ function runAgentPrompt(args) {
15020
15243
  __name(runAgentPrompt, "runAgentPrompt");
15021
15244
  var agentPromptCommand = {
15022
15245
  command: "agent-prompt",
15023
- describe: "Build a review agent's launch prompt from the plan (the diff path, its line ranges and the agent's own brief are welded in, not left to the caller to remember). Exit codes: 0 built; 4 the review time budget refused another reverse-audit round (a termination rule, not an error \u2014 see the BUDGET line on stderr); 5 the reverse audit CONVERGED \u2014 every chunk holds two consecutive substantive dry audits and none is due a cold check, so stop the loop and proceed to Step 6 (also a termination rule, and a clean one: no disclosure is owed); anything else is a bad call or a broken plan.",
15246
+ describe: "Build a review agent's launch prompt from the plan (the diff path, its line ranges and the agent's own brief are welded in, not left to the caller to remember). Exit codes: 0 built; 4 a build was refused \u2014 the review time budget refused another reverse-audit round (BUDGET line on stderr), the plan's round cap refused one (ROUND CAP line), or the compose floor refused a verifier so compose/submit still fit (VERIFY BUDGET line) \u2014 all termination rules, not errors: stop and compose, do not retry; 5 the reverse audit CONVERGED \u2014 every chunk holds two consecutive substantive dry audits and none is due a cold check, so stop the loop and proceed to Step 6 (also a termination rule, and a clean one: no disclosure is owed); anything else is a bad call or a broken plan.",
15024
15247
  builder: /* @__PURE__ */ __name((yargs) => yargs.option("plan", {
15025
15248
  type: "string",
15026
15249
  demandOption: true,
@@ -17526,15 +17749,9 @@ function inconsistencies(payload, event2) {
17526
17749
  return problems;
17527
17750
  }
17528
17751
  __name(inconsistencies, "inconsistencies");
17529
- var REPO_SEGMENT = /^[A-Za-z0-9._-]+$/;
17530
- function isRepo(repo) {
17531
- const parts = repo.split("/");
17532
- return parts.length === 2 && parts.every((p) => REPO_SEGMENT.test(p) && p !== "." && p !== "..");
17533
- }
17534
- __name(isRepo, "isRepo");
17535
17752
  function runSubmit(args, cliVersion = "unknown") {
17536
17753
  setGhHost(args.host);
17537
- if (!isRepo(args.repo)) {
17754
+ if (!isOwnerRepo(args.repo)) {
17538
17755
  throw new Error(
17539
17756
  `--repo ${JSON.stringify(args.repo)} is not <owner>/<repo>.`
17540
17757
  );
@@ -17624,8 +17841,17 @@ Posting is a public, irreversible write, and this run has no authorisation for o
17624
17841
  "--input",
17625
17842
  "-"
17626
17843
  );
17844
+ let reviewId;
17845
+ let reviewUrl;
17846
+ try {
17847
+ const parsed = JSON.parse(response);
17848
+ if (typeof parsed.id === "number") reviewId = parsed.id;
17849
+ if (typeof parsed.html_url === "string" && parsed.html_url.trim() !== "") {
17850
+ reviewUrl = parsed.html_url;
17851
+ }
17852
+ } catch {
17853
+ }
17627
17854
  try {
17628
- const reviewId = JSON.parse(response).id;
17629
17855
  if (typeof reviewId === "number") {
17630
17856
  const receiptPath = tmpFile(`pr-${args.pr}`, "submit-receipt.json");
17631
17857
  const priorIds = readReceiptIds(receiptPath);
@@ -17640,7 +17866,7 @@ Posting is a public, irreversible write, and this run has no authorisation for o
17640
17866
  } catch {
17641
17867
  }
17642
17868
  writeStderrLine(
17643
- `Posted ${event2} to ${args.repo}#${args.pr} \u2014 ${auth.why}` + (cappedBy.length ? ` (capped by ${cappedBy.join(", ")})` : "") + "."
17869
+ `Posted ${event2} to ${args.repo}#${args.pr} \u2014 ${auth.why}` + (cappedBy.length ? ` (capped by ${cappedBy.join(", ")})` : "") + "." + (reviewUrl ? ` ${reviewUrl}` : "")
17644
17870
  );
17645
17871
  writeStdoutLine(
17646
17872
  JSON.stringify(
@@ -17648,7 +17874,8 @@ Posting is a public, irreversible write, and this run has no authorisation for o
17648
17874
  posted: true,
17649
17875
  event: event2,
17650
17876
  cappedBy,
17651
- inlineComments: post.comments.length
17877
+ inlineComments: post.comments.length,
17878
+ ...reviewUrl ? { url: reviewUrl } : {}
17652
17879
  },
17653
17880
  null,
17654
17881
  2
@@ -20912,10 +21139,10 @@ var updateCommand3 = {
20912
21139
  stdioHelpers,
20913
21140
  { updateEventEmitter }
20914
21141
  ] = await Promise.all([
20915
- import("./settings-V7BR3RKP.js"),
20916
- import("./updateCheck-YZ2CRCFC.js"),
20917
- import("./installationInfo-VGBXMYLY.js"),
20918
- import("./standalone-update-QGIKHATD.js"),
21142
+ import("./settings-EQBUAQ7Y.js"),
21143
+ import("./updateCheck-AXWSO7KA.js"),
21144
+ import("./installationInfo-3YUGIP36.js"),
21145
+ import("./standalone-update-2W26SRRO.js"),
20919
21146
  import("./stdioHelpers-7A2EE64Z.js"),
20920
21147
  import("./updateEventEmitter-5MKC7BLQ.js")
20921
21148
  ]);
@@ -21004,11 +21231,6 @@ var updateCommand3 = {
21004
21231
  };
21005
21232
 
21006
21233
  // packages/cli/src/config/config.ts
21007
- var SESSION_ID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}(-agent-[a-zA-Z0-9_.-]+)?$/i;
21008
- function isValidSessionId(value) {
21009
- return SESSION_ID_REGEX.test(value);
21010
- }
21011
- __name(isValidSessionId, "isValidSessionId");
21012
21234
  var debugLogger4 = createDebugLogger("CONFIG");
21013
21235
  function resolveLocaleForExtensions(settings) {
21014
21236
  const envLang = process.env["QWEN_CODE_LANG"];
@@ -22082,7 +22304,7 @@ async function loadCliConfig(settings, argv, cwd = process.cwd(), overrideExtens
22082
22304
  disabledSlashCommands: disabledSlashCommands.length > 0 ? disabledSlashCommands : void 0,
22083
22305
  disabledSkillNamesProvider: bareMode || safeMode ? void 0 : disabledSkillNamesProvider,
22084
22306
  terminalImageRenderSupportProvider: interactive ? async () => {
22085
- const { getTerminalImageRenderSupport } = await import("./terminal-image-renderer-TLDNACQY.js");
22307
+ const { getTerminalImageRenderSupport } = await import("./terminal-image-renderer-S5WPPQKH.js");
22086
22308
  return getTerminalImageRenderSupport();
22087
22309
  } : void 0,
22088
22310
  disabledSkillLevels: bareMode || safeMode || !Array.isArray(settings.skills?.disabledLevels) ? void 0 : settings.skills.disabledLevels.filter(isSkillLevel),
@@ -22494,7 +22716,6 @@ export {
22494
22716
  staleArgsWarning,
22495
22717
  skillArgsNote,
22496
22718
  RunBudgetEnforcer,
22497
- isValidSessionId,
22498
22719
  parseArguments,
22499
22720
  loadHierarchicalGeminiMemory,
22500
22721
  isDebugMode,