@qwen-code/qwen-code 0.21.12-preview.3 → 0.21.12
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.
- package/bundled/qc-helper/docs/configuration/settings.md +10 -0
- package/bundled/qc-helper/docs/features/channels/overview.md +1 -1
- package/bundled/qc-helper/docs/features/channels/plugins.md +11 -11
- package/bundled/qc-helper/docs/features/code-review.md +1 -1
- package/bundled/qc-helper/docs/qwen-serve.md +99 -34
- package/bundled/review/SKILL.md +55 -36
- package/chunks/{MaxSizedBox-EIK4BHBQ.js → MaxSizedBox-ZSJJ2D5S.js} +46 -46
- package/chunks/{StandaloneSessionPicker-NHVJDRYD.js → StandaloneSessionPicker-WHUHQXSA.js} +65 -66
- package/chunks/{acp-startup-profiler-JMJBZDVO.js → acp-startup-profiler-SVPUHLXV.js} +2 -2
- package/chunks/{acpAgent-37UDZP64.js → acpAgent-7JOAESF5.js} +960 -539
- package/chunks/{agent-FAWBG7PP.js → agent-E6V3VXQR.js} +42 -42
- package/chunks/{agent-headless-SHK4PCCH.js → agent-headless-OEQNFOMH.js} +42 -42
- package/chunks/{anthropicContentGenerator-4JSC3ZFL.js → anthropicContentGenerator-YDT4EOKO.js} +25 -25
- package/chunks/{artifact-tool-FRMBPDPB.js → artifact-tool-4GCQQDZI.js} +5 -5
- package/chunks/{askUserQuestion-7G3LI3IZ.js → askUserQuestion-HZJJLR3Z.js} +2 -2
- package/chunks/{bridge-DEAYNDCI.js → bridge-NPBV53UA.js} +49 -49
- package/chunks/{build-RZS65IIX.js → build-GDBLPA24.js} +1 -1
- package/chunks/{channel-management-service-SKAN6NOB.js → channel-management-service-OADNGQM3.js} +4 -4
- package/chunks/{channel-settings-store-UIGYER6R.js → channel-settings-store-4ODLJ4X2.js} +49 -49
- package/chunks/{channel-worker-group-YPTB5ASD.js → channel-worker-group-IHBIHQ45.js} +7 -7
- package/chunks/{channel-worker-manager-4EHJSPRH.js → channel-worker-manager-GEHYJ5AE.js} +7 -7
- package/chunks/{channel-worker-supervisor-DZKHYFHV.js → channel-worker-supervisor-ZJIIWM4I.js} +5 -5
- package/chunks/{chunk-LHOG4E6Y.js → chunk-22C7BQ6D.js} +3 -3
- package/chunks/{chunk-DP3IHZGG.js → chunk-2AUM35J5.js} +59 -7
- package/chunks/{chunk-2SB4SLKC.js → chunk-2IIJTXYF.js} +1 -3
- package/chunks/{chunk-DYVCDQW2.js → chunk-2IVYL3IF.js} +1 -1
- package/chunks/{chunk-EYW54TBD.js → chunk-2ZWH53I4.js} +3 -3
- package/chunks/{chunk-5I5NMQCU.js → chunk-36XKGB7E.js} +3 -3
- package/chunks/{chunk-AQHNAA7E.js → chunk-3AEKDXKT.js} +1 -1
- package/chunks/{chunk-M6SXIXBV.js → chunk-3GDBZJD6.js} +6 -6
- package/chunks/{chunk-6XZERB6P.js → chunk-3GM5DLBI.js} +5 -5
- package/chunks/{chunk-4M2F7OG7.js → chunk-3LDGOQXZ.js} +6 -6
- package/chunks/{chunk-BKHCW2BI.js → chunk-3VUENPWF.js} +10 -0
- package/chunks/{chunk-ENEEQMGM.js → chunk-45NQKMYB.js} +1 -1
- package/chunks/{chunk-MDFUBQAQ.js → chunk-47BGDLJG.js} +119 -27
- package/chunks/{chunk-EFIMD5VA.js → chunk-4AOVQPJU.js} +1 -1
- package/chunks/{chunk-HB6QW4LM.js → chunk-4KM2SYK5.js} +19 -16
- package/chunks/{chunk-UNCIELQJ.js → chunk-4XA4QIUA.js} +1 -1
- package/chunks/{chunk-2J53A6MV.js → chunk-56HVDG3M.js} +4 -4
- package/chunks/{chunk-N3FJOQX7.js → chunk-5AFGJNY6.js} +4 -4
- package/chunks/{chunk-2AZMF6G5.js → chunk-5RUCD4ED.js} +2 -2
- package/chunks/{chunk-32VOOMEF.js → chunk-62X3CM7Q.js} +7 -7
- package/chunks/{chunk-6LYDH7VT.js → chunk-63FNZTWG.js} +2 -2
- package/chunks/{chunk-P64FPV3G.js → chunk-6JEIRPLN.js} +47 -4
- package/chunks/{chunk-O5G7IQGM.js → chunk-6P5EXEBL.js} +499 -112
- package/chunks/{chunk-3ZYX7AUR.js → chunk-6SPD4Z7F.js} +1 -1
- package/chunks/{chunk-YZJVVQD3.js → chunk-6ZKSO6K7.js} +7 -7
- package/chunks/{chunk-N5ULBHP3.js → chunk-7KJPO7YH.js} +2 -2
- package/chunks/{chunk-MZSJ43WV.js → chunk-7U5G6JXI.js} +24 -2
- package/chunks/{chunk-K7JW6V5O.js → chunk-A6NRNRKE.js} +1 -1
- package/chunks/{chunk-XLQS3VI6.js → chunk-AKBFSOC5.js} +2 -2
- package/chunks/{chunk-LT532KF4.js → chunk-AW27A43Y.js} +10 -12
- package/chunks/{chunk-M4NWDIFU.js → chunk-AZQ3DT76.js} +1 -1
- package/chunks/{chunk-4GLFFNP3.js → chunk-B4VN3VDH.js} +5 -5
- package/chunks/{chunk-YTYPRVIZ.js → chunk-BSR5AXZR.js} +4 -3
- package/chunks/{chunk-AJX4ITUG.js → chunk-BSSLSQEW.js} +3 -3
- package/chunks/{chunk-EYY4IBPV.js → chunk-CGM3E75C.js} +3 -3
- package/chunks/{chunk-V4MJ56RS.js → chunk-CIDQISGM.js} +5 -5
- package/chunks/{chunk-T6W4KACQ.js → chunk-CPFFU46D.js} +1 -1
- package/chunks/{chunk-TYCXSMZU.js → chunk-CQ6IPDQW.js} +3 -3
- package/chunks/{chunk-KIFRFCCB.js → chunk-CZ4OWGQQ.js} +67 -22
- package/chunks/{chunk-N7NBMAMW.js → chunk-D2RNVVH6.js} +2 -2
- package/chunks/{chunk-KPVVWKF3.js → chunk-D7QGE3RT.js} +1 -1
- package/chunks/{chunk-TYGKUOEG.js → chunk-DAV4QFD5.js} +3 -11
- package/chunks/{chunk-QUESTNOP.js → chunk-DD6O3ZRD.js} +1 -1
- package/chunks/{chunk-NWPO6I7V.js → chunk-DEDESZDL.js} +1 -1
- package/chunks/{chunk-7LZ7DK4D.js → chunk-DFVXU5YM.js} +1 -1
- package/chunks/{chunk-TBVNYG5B.js → chunk-DG4IQ6JG.js} +5 -5
- package/chunks/{chunk-SAQHDAUJ.js → chunk-DPTMKFIH.js} +452 -57
- package/chunks/{chunk-M6HXP2SG.js → chunk-EBPLKY6U.js} +2192 -849
- package/chunks/{chunk-3XZYK76R.js → chunk-EJOGLSNJ.js} +2 -2
- package/chunks/{chunk-L7T742G2.js → chunk-FA5K6YI2.js} +47 -3
- package/chunks/{chunk-M2NMFAFR.js → chunk-FMIH5KMQ.js} +1 -1
- package/chunks/{chunk-HHGQGTJQ.js → chunk-FQDCO3CJ.js} +10 -1
- package/chunks/{chunk-V3LXMASR.js → chunk-FRHQQC2Z.js} +1 -1
- package/chunks/{chunk-732MOPEM.js → chunk-G6MUFRNI.js} +1 -1
- package/chunks/{chunk-KNXA5XXK.js → chunk-GXTMEATA.js} +15 -34
- package/chunks/{chunk-7SUQZ7QH.js → chunk-GZDWTBT3.js} +2 -2
- package/chunks/{chunk-IQFYO5BF.js → chunk-H7TMVHKE.js} +1 -1
- package/chunks/{chunk-KNQZXSLW.js → chunk-HG3UBTJ4.js} +23 -9
- package/chunks/{chunk-MPBRV3UU.js → chunk-HOSVOUDK.js} +71 -0
- package/chunks/{chunk-OPBATTFQ.js → chunk-HTYND72J.js} +1 -1
- package/chunks/{chunk-I4XSOFH2.js → chunk-I7BT2MME.js} +1 -1
- package/chunks/{chunk-LHY6HBRA.js → chunk-IH4Z54RJ.js} +7 -5
- package/chunks/{chunk-GYBDYWMV.js → chunk-IRSLAS4M.js} +2 -2
- package/chunks/{chunk-UZPWH6SP.js → chunk-IX4PWUDU.js} +401 -173
- package/chunks/{chunk-KT4OWAAZ.js → chunk-JRIVMPD2.js} +3 -3
- package/chunks/{chunk-Q7YDKOGY.js → chunk-JVEGA3MM.js} +1 -1
- package/chunks/{chunk-O5AZPHYZ.js → chunk-K34GJQOZ.js} +138 -16
- package/chunks/{chunk-L2GTEEEU.js → chunk-K5IDV3PC.js} +44 -1
- package/chunks/{chunk-5HBFERG5.js → chunk-KEC5FHLM.js} +3 -3
- package/chunks/{chunk-5PWLQ7SK.js → chunk-KLOMACIR.js} +15 -8
- package/chunks/{chunk-XWUQ4IH5.js → chunk-KWX56CHZ.js} +7 -7
- package/chunks/{chunk-VQZXRLEX.js → chunk-LCX5B364.js} +3 -3
- package/chunks/{chunk-CTQE2NB2.js → chunk-LSRI3ND3.js} +1 -1
- package/chunks/{chunk-5TXOGH4I.js → chunk-LUISTZXI.js} +3 -3
- package/chunks/{chunk-6AECVSVX.js → chunk-MAKIANMX.js} +3 -3
- package/chunks/{chunk-M4OYAR6J.js → chunk-MDNUCDKZ.js} +2 -2
- package/chunks/{chunk-CZXQ4UZA.js → chunk-MELQSJOU.js} +1 -1
- package/chunks/{chunk-6ZIIHBNV.js → chunk-MUNA4QDC.js} +4 -4
- package/chunks/{chunk-E5BWLU5J.js → chunk-N4SVADAV.js} +305 -143
- package/chunks/{chunk-URK542T4.js → chunk-NF5J2WFA.js} +15 -2
- package/chunks/{chunk-GJJQV4PY.js → chunk-NLFLYSS4.js} +1 -1
- package/chunks/{chunk-FRH4SSGX.js → chunk-NW2GIPG3.js} +2 -4
- package/chunks/{chunk-JS4Q5NG5.js → chunk-NX4A23LY.js} +3 -3
- package/chunks/{chunk-DEG7R6Z6.js → chunk-OK47XBYH.js} +79 -36
- package/chunks/{chunk-7D4KEFOT.js → chunk-OPVF453Q.js} +3 -3
- package/chunks/{chunk-J7DNMZFO.js → chunk-OR64CU46.js} +1 -1
- package/chunks/{chunk-DAX3G67A.js → chunk-OWGRUU7F.js} +1 -1
- package/chunks/{chunk-M2PY7CNK.js → chunk-OWXFBIB6.js} +2 -2
- package/chunks/{chunk-NELCY6JT.js → chunk-OYWVIXHT.js} +1 -3
- package/chunks/{chunk-V7RNNPGC.js → chunk-P5Y23G2L.js} +18 -1
- package/chunks/{chunk-QZ5G26ZE.js → chunk-PTSEETCO.js} +27 -27
- package/chunks/{chunk-IEP44U2R.js → chunk-PVXEJB66.js} +1 -1
- package/chunks/{chunk-NC4O6UE6.js → chunk-PZW46OTB.js} +2 -2
- package/chunks/{chunk-RQVVXDHS.js → chunk-Q4ZPYNIZ.js} +4 -4
- package/chunks/{chunk-QSWDGAIC.js → chunk-QILD6R27.js} +1 -1
- package/chunks/{chunk-GLWWPFTW.js → chunk-QLTATTPS.js} +1 -1
- package/chunks/{chunk-QTI7SRXI.js → chunk-QPBFRWCP.js} +3 -3
- package/chunks/{chunk-3TT6MZHJ.js → chunk-QSD4UH74.js} +842 -62
- package/chunks/{chunk-TEKFBSMY.js → chunk-RDVNSJQU.js} +3 -3
- package/chunks/{chunk-NPE3STIW.js → chunk-ROIJYS5K.js} +6 -6
- package/chunks/{chunk-JEMR2FTD.js → chunk-RQJA2YYO.js} +4 -4
- package/chunks/{chunk-YI6UGZF5.js → chunk-S6TCTH4Z.js} +13 -13
- package/chunks/{chunk-ZGWY4YUB.js → chunk-SYHXR6WM.js} +5 -5
- package/chunks/{chunk-O4BBDP2G.js → chunk-TB4YFWXG.js} +2 -2
- package/chunks/{chunk-ILVATFYJ.js → chunk-TDESMS7M.js} +22 -18
- package/chunks/{chunk-47FQVRCO.js → chunk-TMFWI4RC.js} +1 -1
- package/chunks/{chunk-T4FTABSW.js → chunk-TQDFSQQF.js} +1 -1
- package/chunks/{chunk-ZV4XVYL3.js → chunk-TTRH3RTQ.js} +4 -4
- package/chunks/{chunk-ZWPWQEF5.js → chunk-TXP5NGG3.js} +1 -1
- package/chunks/{chunk-E3GLDLYB.js → chunk-TYAMGABM.js} +0 -6
- package/chunks/{chunk-VWD7SNNN.js → chunk-UI5UGEF4.js} +1082 -926
- package/chunks/{chunk-MWZYNOCG.js → chunk-ULNWG62W.js} +3 -3
- package/chunks/{chunk-HGCQ5SE7.js → chunk-UXEO7E3V.js} +21 -0
- package/chunks/{chunk-U6PTKAOW.js → chunk-V6OBVAST.js} +1 -1
- package/chunks/{chunk-5UPJ774B.js → chunk-VIFA5VJD.js} +1 -1
- package/chunks/{chunk-Y66OOMKS.js → chunk-VLHR7F4E.js} +595 -58
- package/chunks/{chunk-EYS3GGM3.js → chunk-VPV7WBVT.js} +1 -1
- package/chunks/{chunk-XCGIMOLN.js → chunk-WCCLLK7X.js} +14 -1
- package/chunks/{chunk-JL3LC3CQ.js → chunk-WCEI6J56.js} +1 -1
- package/chunks/{chunk-JXK3WAP7.js → chunk-WDVDVWJ3.js} +6 -6
- package/chunks/{chunk-ZQSNP4TG.js → chunk-WI6GIM2M.js} +2 -2
- package/chunks/{chunk-TRYJ3BVE.js → chunk-WM3LUQLO.js} +7 -7
- package/chunks/{chunk-VJNBRRZG.js → chunk-WZMH7II3.js} +1 -1
- package/chunks/{chunk-HBZUU4AE.js → chunk-X5SLJOMF.js} +9 -7
- package/chunks/{chunk-FDWH6CBK.js → chunk-XAFIL4BD.js} +7 -7
- package/chunks/{chunk-P2UCMHDT.js → chunk-XDRXOSAD.js} +3 -3
- package/chunks/{chunk-RRQJPCRQ.js → chunk-XH3KAV2G.js} +2 -2
- package/chunks/{chunk-F6AOBFUN.js → chunk-YBHUXEC6.js} +1 -1
- package/chunks/{chunk-GZGDJ4E6.js → chunk-YBVVOSOH.js} +1 -1
- package/chunks/{chunk-EXG2R5UR.js → chunk-YCHNAKC5.js} +16 -14
- package/chunks/{chunk-XTH2OMDS.js → chunk-YIGGWOJE.js} +1 -1
- package/chunks/{chunk-IX7CFQGA.js → chunk-YILJKX2T.js} +3 -3
- package/chunks/{chunk-SSAOTDK7.js → chunk-YX2RDGAL.js} +1 -1
- package/chunks/{chunk-6S52N6PG.js → chunk-ZBB5EZZV.js} +2 -2
- package/chunks/{chunk-3GCU5O2E.js → chunk-ZLCT4C5A.js} +1 -1
- package/chunks/{chunk-4ETA3KRC.js → chunk-ZMY2P4L3.js} +3 -3
- package/chunks/{chunk-575MI5K3.js → chunk-ZQUY3ZJU.js} +4 -4
- package/chunks/{computer-use-S4JEU5P7.js → computer-use-F4URV4TU.js} +45 -45
- package/chunks/{config-utils-TXVKR27S.js → config-utils-Z3OW3IQG.js} +4 -4
- package/chunks/{contextCommand-2H5OH2HW.js → contextCommand-IGSS2U5J.js} +44 -44
- package/chunks/{core-runtime-IAQ4DD4Y.js → core-runtime-H5CZDN3A.js} +42 -42
- package/chunks/{create-sub-session-EKHKXJAA.js → create-sub-session-PA7MFTHK.js} +42 -42
- package/chunks/{create-sub-session-Y4WYDZGC.js → create-sub-session-XT6DLYOE.js} +2 -2
- package/chunks/{cron-create-ZOVA3CC2.js → cron-create-2JZ2TWTF.js} +4 -4
- package/chunks/{cron-delete-7Z3H4LJY.js → cron-delete-CTPD2P26.js} +4 -4
- package/chunks/{cron-list-UHGX3IQG.js → cron-list-V44KHAF6.js} +4 -4
- package/chunks/{daemon-PXIC4ZDK.js → daemon-GED37WOX.js} +30 -2
- package/chunks/daemon-git-worktree-guard-LZDCNJGV.js +2062 -0
- package/chunks/daemon-status-provider-QYM57Z44.js +102 -0
- package/chunks/{daemon-trust-policy-7JOBVFH3.js → daemon-trust-policy-TSRVEYZR.js} +48 -48
- package/chunks/{daemon-trust-policy-monitor-OU3NRHAR.js → daemon-trust-policy-monitor-2K2YETMT.js} +48 -48
- package/chunks/{deferred-core-runtime-SFT3KI2C.js → deferred-core-runtime-FKJ3OYE7.js} +44 -44
- package/chunks/{devtools-X6ROTKHE.js → devtools-4QFYJT6U.js} +1 -1
- package/chunks/{display-image-ZE3GZNIK.js → display-image-M2ELAVN4.js} +4 -4
- package/chunks/{dist-KTYDJNYM.js → dist-4ZPG4BY6.js} +2 -2
- package/chunks/{dist-NPS52B2V.js → dist-BROOP2EG.js} +1 -1
- package/chunks/{dist-BW2LDPV3.js → dist-IYYN3RUT.js} +2 -2
- package/chunks/{dist-EFJILGIS.js → dist-JWMKPWT5.js} +3 -1
- package/chunks/{dist-AVUYBK7L.js → dist-K7IQB53U.js} +1 -1
- package/chunks/{dist-PKSRQAR2.js → dist-MAQXAQ2Y.js} +1 -1
- package/chunks/{dist-BNWP6IZL.js → dist-WJ4BHIEW.js} +2 -2
- package/chunks/{dist-ZWDH5HLS.js → dist-YEPL4RAW.js} +1 -1
- package/chunks/{earlyInputCapture-27RPWE2D.js → earlyInputCapture-WJBSJQUF.js} +43 -43
- package/chunks/{edit-WXVZ7FHS.js → edit-X73LA4YO.js} +50 -49
- package/chunks/{enter-worktree-TYMVXFLA.js → enter-worktree-CLRQTIVN.js} +47 -47
- package/chunks/{enterPlanMode-FT4MRU5N.js → enterPlanMode-6BDYUQ5T.js} +48 -48
- package/chunks/{environment-Z6OMA34I.js → environment-WOAJXJDJ.js} +44 -44
- package/chunks/{errors-YMXK2GG3.js → errors-7OY5MXYY.js} +44 -44
- package/chunks/{exit-worktree-ODZUQLGJ.js → exit-worktree-TFFJXCRT.js} +47 -47
- package/chunks/{exitPlanMode-MBPAPBBV.js → exitPlanMode-WDURQMIU.js} +42 -42
- package/chunks/{external-tool-guard-provider-5HTGOPGU.js → external-tool-guard-provider-TE4DRY36.js} +1 -1
- package/chunks/{fast-path-ZU5T6XSN.js → fast-path-QQLGC37M.js} +5 -5
- package/chunks/{gemini-OZK6AIMC.js → gemini-VHE62IJL.js} +110 -105
- package/chunks/{geminiContentGenerator-MC6ZKWZG.js → geminiContentGenerator-VSHIEGAQ.js} +11 -11
- package/chunks/{glob-KJ4A4ZOM.js → glob-VMEEDDLO.js} +49 -49
- package/chunks/{goal-tools-JDK2SNMV.js → goal-tools-M4UDAZXP.js} +4 -4
- package/chunks/{grep-QWBLG564.js → grep-F4UAR7KX.js} +47 -47
- package/chunks/{handleAutoUpdate-M3ACKDKF.js → handleAutoUpdate-GN7Z6QAC.js} +46 -46
- package/chunks/{i18n-FPW7XZL5.js → i18n-ETW24DHW.js} +43 -43
- package/chunks/{image-gen-OTFC2S7L.js → image-gen-YPK2AZT4.js} +11 -11
- package/chunks/{initializer-5HKUXXBT.js → initializer-UA6KQ7MS.js} +49 -49
- package/chunks/{installationInfo-4OA6UW7V.js → installationInfo-P7OTIR4P.js} +43 -43
- package/chunks/{keychain-token-storage-JTWUYFU7.js → keychain-token-storage-NKKCUHI2.js} +2 -2
- package/chunks/{list-3TKZ264A.js → list-GRAMIQOT.js} +51 -51
- package/chunks/{list-agents-4GQ2XNEU.js → list-agents-O6WSY4CT.js} +2 -2
- package/chunks/{loadedSettingsAdapter-IRUANLS2.js → loadedSettingsAdapter-5O2TDS3I.js} +48 -48
- package/chunks/{loggingContentGenerator-D4URLH2A.js → loggingContentGenerator-J2J2AANS.js} +151 -120
- package/chunks/{loop-wakeup-HOQI3K5D.js → loop-wakeup-GVQRMUKS.js} +5 -5
- package/chunks/{ls-FSHISLLA.js → ls-6W2D7TKU.js} +6 -6
- package/chunks/{lsp-APQJ5ZEZ.js → lsp-NJ4KFBI2.js} +2 -2
- package/chunks/{managed-npm-update-2O7XSAWJ.js → managed-npm-update-WMV5ITKU.js} +45 -45
- package/chunks/{mcp-AFVHCHKT.js → mcp-XLP33CAI.js} +48 -48
- package/chunks/{monitor-PY4WDSX3.js → monitor-2MM23VDV.js} +47 -47
- package/chunks/{node-YSOU44FX.js → node-UUDY34IG.js} +3 -3
- package/chunks/nonInteractiveCli-KTA5K6FS.js +163 -0
- package/chunks/{notebook-edit-GEPL33NO.js → notebook-edit-QD4TRKLY.js} +47 -47
- package/chunks/{openaiContentGenerator-ACYSXQ6R.js → openaiContentGenerator-KLHSPVN2.js} +31 -31
- package/chunks/{pidfile-SUNYCAA4.js → pidfile-RQGZBNXT.js} +43 -43
- package/chunks/{processUtils-F7LP7YUV.js → processUtils-HZZDA2VV.js} +2 -2
- package/chunks/{qwenContentGenerator-BB6IPELF.js → qwenContentGenerator-T75M2Z3B.js} +50 -50
- package/chunks/{qwenOAuth2-OU3WGDOI.js → qwenOAuth2-5QZU444W.js} +10 -10
- package/chunks/{read-file-GORBXJTS.js → read-file-LOVUSBJC.js} +12 -12
- package/chunks/{read-mcp-resource-TJSJRH4F.js → read-mcp-resource-GWCP23WG.js} +2 -2
- package/chunks/{read-package-up-TCM6I7S2.js → read-package-up-K6RKTL5D.js} +1 -1
- package/chunks/{record-artifact-FXF5LHPE.js → record-artifact-IYQDEYMV.js} +3 -3
- package/chunks/{resumeHistoryUtils-FOAJJJWK.js → resumeHistoryUtils-LVKSSQII.js} +50 -50
- package/chunks/{ripGrep-RNLIZGCY.js → ripGrep-ZJSHKB6H.js} +42 -42
- package/chunks/{run-qwen-serve-GVMMX3IU.js → run-qwen-serve-GZW7B4WK.js} +186 -90
- package/chunks/{runtime-RNBZ5FDD.js → runtime-MYRXEO2E.js} +53 -53
- package/chunks/{scheduler-NTRFSPIP.js → scheduler-DPTPI6FW.js} +44 -44
- package/chunks/{sdk-exporters-grpc-4QKV6MCX.js → sdk-exporters-grpc-54L4LS5L.js} +2 -2
- package/chunks/{sdk-exporters-http-2VPMAPFI.js → sdk-exporters-http-NHBYB5FZ.js} +21 -17
- package/chunks/{sdk-impl-5W3JUCWF.js → sdk-impl-SK4P5WON.js} +17 -14
- package/chunks/{send-message-RBYLV5NY.js → send-message-O7FO63UK.js} +6 -6
- package/chunks/{serve-H3PGA26U.js → serve-XCG4XCDA.js} +52 -52
- package/chunks/{server-SUXD2F3C.js → server-AWQHKXLG.js} +310 -200
- package/chunks/{session-MTFVUWWM.js → session-P5FKNCNR.js} +94 -97
- package/chunks/{settings-GUJ3TN2J.js → settings-CSYVIP2R.js} +47 -47
- package/chunks/{shell-C2UP5FF2.js → shell-EGTSUO2P.js} +42 -42
- package/chunks/{skill-4XCNK55E.js → skill-IFUD72GF.js} +22 -22
- package/chunks/{skill-settings-Y2BU27XM.js → skill-settings-YOE7LBHE.js} +47 -47
- package/chunks/{spawnChannel-UUUUK734.js → spawnChannel-PQSZIOLY.js} +45 -47
- package/chunks/{standalone-update-MJ722XZ4.js → standalone-update-RB2EGUSF.js} +44 -44
- package/chunks/{startInteractiveUI-TCPIPNGN.js → startInteractiveUI-KMYUJ2MU.js} +3040 -2399
- package/chunks/{syntheticOutput-D3Z64LJC.js → syntheticOutput-DVHJMUGV.js} +3 -3
- package/chunks/{task-create-URFZ5EUX.js → task-create-4NC7PDI4.js} +11 -11
- package/chunks/{task-list-6JDFMPUW.js → task-list-LBSRMOC7.js} +5 -5
- package/chunks/{task-stop-HHUGCD25.js → task-stop-YFNATTIM.js} +2 -2
- package/chunks/{task-update-DVV6CUGI.js → task-update-BPLM52GD.js} +12 -12
- package/chunks/{team-create-WZWH2NJI.js → team-create-B6A6MJBT.js} +47 -47
- package/chunks/{team-delete-PZGGBQLM.js → team-delete-MKYMYBFM.js} +5 -5
- package/chunks/{team-plan-approval-SUZQJCWJ.js → team-plan-approval-5WO3CXXU.js} +48 -48
- package/chunks/{terminal-image-renderer-BCUN3Z3W.js → terminal-image-renderer-BTRE2GEU.js} +44 -44
- package/chunks/{theme-manager-UGMFDREN.js → theme-manager-XL2N5SBY.js} +43 -43
- package/chunks/{todoWrite-WINAZSZI.js → todoWrite-K5K7NRE5.js} +4 -4
- package/chunks/{tool-search-B6F3MPUZ.js → tool-search-QNBLXUGR.js} +18 -18
- package/chunks/{total-session-admission-MQLBJ5WL.js → total-session-admission-N4E5SFBO.js} +49 -49
- package/chunks/{trustedFolders-2XST7U5C.js → trustedFolders-MQS46LIU.js} +43 -43
- package/chunks/{update-relaunch-OVC7YNGD.js → update-relaunch-536KRL33.js} +5 -5
- package/chunks/{updateCheck-YAKM36WQ.js → updateCheck-QJI2SYWF.js} +48 -48
- package/chunks/{useAutoAcceptIndicator-RF6FVX3S.js → useAutoAcceptIndicator-7QASHD46.js} +51 -51
- package/chunks/{validateNonInterActiveAuth-IPPXFNQH.js → validateNonInterActiveAuth-ZNRGWBLV.js} +86 -88
- package/chunks/{version-4IDFEXOU.js → version-DBEQAFRW.js} +2 -2
- package/chunks/{web-fetch-NUOLHXPN.js → web-fetch-MBIVXKPE.js} +21 -21
- package/chunks/{web-search-LVOOV4XZ.js → web-search-4LBIN6VF.js} +16 -16
- package/chunks/{workflow-JSTYTG3K.js → workflow-LNMA55HY.js} +127 -61
- package/chunks/{workspace-providers-status-U4EYXA4K.js → workspace-providers-status-PDDMI6ST.js} +51 -51
- package/chunks/{workspace-registration-store-OG66U3CB.js → workspace-registration-store-BGRKKIYR.js} +1 -1
- package/chunks/{workspace-registry-WSHWQRQQ.js → workspace-registry-L4NCJ34K.js} +49 -49
- package/chunks/{workspace-service-QZXQHX2F.js → workspace-service-LOXYKYTR.js} +54 -54
- package/chunks/{workspace-skills-status-VRBHEX5O.js → workspace-skills-status-IJ5FOQI6.js} +49 -49
- package/chunks/{workspace-trust-reconciler-FCRIUIOF.js → workspace-trust-reconciler-H36TCR2S.js} +57 -57
- package/chunks/{write-file-PYL3JCCD.js → write-file-JJAY7JSP.js} +42 -42
- package/chunks/{zoom-image-RS6MU26F.js → zoom-image-4MVVVM7E.js} +12 -12
- package/cli.js +18 -17
- package/package.json +4 -4
- package/web-shell/assets/{arc-CgGUyHWd.js → arc-B-89zHN4.js} +1 -1
- package/web-shell/assets/{architectureDiagram-3BPJPVTR-BR0Qv-1Y.js → architectureDiagram-3BPJPVTR-BkcOncHk.js} +1 -1
- package/web-shell/assets/{blockDiagram-GPEHLZMM-DIoaceaI.js → blockDiagram-GPEHLZMM-DQ4yboaF.js} +1 -1
- package/web-shell/assets/{c4Diagram-AAUBKEIU-Bc5k6BbI.js → c4Diagram-AAUBKEIU-C_8ZjPDI.js} +1 -1
- package/web-shell/assets/channel-Du2WFns8.js +1 -0
- package/web-shell/assets/{chunk-2J33WTMH-DtPEz2WX.js → chunk-2J33WTMH-naKVe1Bm.js} +1 -1
- package/web-shell/assets/{chunk-4BX2VUAB-Dydo6ydE.js → chunk-4BX2VUAB-DdoViKT2.js} +1 -1
- package/web-shell/assets/{chunk-55IACEB6-DD9_VWXm.js → chunk-55IACEB6-DUDQZEwU.js} +1 -1
- package/web-shell/assets/{chunk-727SXJPM-DVI2m59k.js → chunk-727SXJPM-BqpDTR5s.js} +1 -1
- package/web-shell/assets/{chunk-AQP2D5EJ-luatmaTN.js → chunk-AQP2D5EJ-CdmEknkT.js} +1 -1
- package/web-shell/assets/{chunk-FMBD7UC4-Duy8NTIi.js → chunk-FMBD7UC4-CH7fFTLB.js} +1 -1
- package/web-shell/assets/{chunk-ND2GUHAM-CrL1yhms.js → chunk-ND2GUHAM-ObgSuFKF.js} +1 -1
- package/web-shell/assets/{chunk-QZHKN3VN-C7BX6bu1.js → chunk-QZHKN3VN-D9fKdv_s.js} +1 -1
- package/web-shell/assets/classDiagram-4FO5ZUOK-Zw0HafH6.js +1 -0
- package/web-shell/assets/classDiagram-v2-Q7XG4LA2-Zw0HafH6.js +1 -0
- package/web-shell/assets/{cose-bilkent-S5V4N54A-BTzs7mIi.js → cose-bilkent-S5V4N54A-CvzATMx9.js} +1 -1
- package/web-shell/assets/{dagre-BM42HDAG-3VTUmWts.js → dagre-BM42HDAG-M_xU21QW.js} +1 -1
- package/web-shell/assets/{diagram-2AECGRRQ-Ehdp75GN.js → diagram-2AECGRRQ-CNrl9sW1.js} +1 -1
- package/web-shell/assets/{diagram-5GNKFQAL-B3wu3teE.js → diagram-5GNKFQAL-CUweVT6T.js} +1 -1
- package/web-shell/assets/{diagram-KO2AKTUF-DjgTSf2S.js → diagram-KO2AKTUF-D3n6Lxjo.js} +1 -1
- package/web-shell/assets/{diagram-LMA3HP47-Br9mwjY3.js → diagram-LMA3HP47-0SeFPK4t.js} +1 -1
- package/web-shell/assets/{diagram-OG6HWLK6-D4xz5M-z.js → diagram-OG6HWLK6-DAgyEwge.js} +1 -1
- package/web-shell/assets/{erDiagram-TEJ5UH35-CXayWlG_.js → erDiagram-TEJ5UH35-CzxBBDIK.js} +1 -1
- package/web-shell/assets/{flowDiagram-I6XJVG4X-CLonjQTi.js → flowDiagram-I6XJVG4X-B0uj0jyo.js} +1 -1
- package/web-shell/assets/{ganttDiagram-6RSMTGT7-BTySFT-1.js → ganttDiagram-6RSMTGT7-DFzcj5km.js} +1 -1
- package/web-shell/assets/{gitGraphDiagram-PVQCEYII--2WcUjOe.js → gitGraphDiagram-PVQCEYII-DylJ_Fc9.js} +1 -1
- package/web-shell/assets/index-BIGQygTL.css +5 -0
- package/web-shell/assets/{index-DPJHkFOG.js → index-BKSAnXU9.js} +1 -1
- package/web-shell/assets/index-J7OMTqAN.js +1789 -0
- package/web-shell/assets/{infoDiagram-5YYISTIA-9vpgAf1m.js → infoDiagram-5YYISTIA-BYMcJVMI.js} +1 -1
- package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-DcRpHnAW.js → ishikawaDiagram-YF4QCWOH-t1quI1S3.js} +1 -1
- package/web-shell/assets/{journeyDiagram-JHISSGLW-C2TKorRm.js → journeyDiagram-JHISSGLW-YM_QVUJm.js} +1 -1
- package/web-shell/assets/{kanban-definition-UN3LZRKU-DdsFwB8b.js → kanban-definition-UN3LZRKU-jw8OddK1.js} +1 -1
- package/web-shell/assets/{linear-7PjRvJrf.js → linear-Dlr3RVuP.js} +1 -1
- package/web-shell/assets/{mermaid.core-raDXa11C.js → mermaid.core-CqGKzNzd.js} +5 -5
- package/web-shell/assets/{mindmap-definition-RKZ34NQL-DLHc-PRN.js → mindmap-definition-RKZ34NQL-BqureoOS.js} +1 -1
- package/web-shell/assets/{pieDiagram-4H26LBE5-BftYpeTW.js → pieDiagram-4H26LBE5-Da20HkK1.js} +1 -1
- package/web-shell/assets/{quadrantDiagram-W4KKPZXB-O-6ygOYn.js → quadrantDiagram-W4KKPZXB-BsNlMvJy.js} +1 -1
- package/web-shell/assets/{requirementDiagram-4Y6WPE33-BmZWVufJ.js → requirementDiagram-4Y6WPE33-DzVCQCse.js} +1 -1
- package/web-shell/assets/{sankeyDiagram-5OEKKPKP-2x5beiWt.js → sankeyDiagram-5OEKKPKP-BMo16voT.js} +1 -1
- package/web-shell/assets/{sequenceDiagram-3UESZ5HK-BH8uKokQ.js → sequenceDiagram-3UESZ5HK-Bgi-pdHk.js} +1 -1
- package/web-shell/assets/{stateDiagram-AJRCARHV-Dq1MFgX_.js → stateDiagram-AJRCARHV-xaPQXwGk.js} +1 -1
- package/web-shell/assets/stateDiagram-v2-BHNVJYJU-D5RqimXD.js +1 -0
- package/web-shell/assets/{timeline-definition-PNZ67QCA-Cl2WKbv9.js → timeline-definition-PNZ67QCA-C_9RuvKG.js} +1 -1
- package/web-shell/assets/{vennDiagram-CIIHVFJN-BqoRo_Q-.js → vennDiagram-CIIHVFJN-Bgu6vdla.js} +1 -1
- package/web-shell/assets/{wardley-L42UT6IY-BTxp-Yot.js → wardley-L42UT6IY-CFTZ8IrX.js} +1 -1
- package/web-shell/assets/{wardleyDiagram-YWT4CUSO-DFXVCSH2.js → wardleyDiagram-YWT4CUSO-BASW9Vmt.js} +1 -1
- package/web-shell/assets/{xychartDiagram-2RQKCTM6-qQhWx0aE.js → xychartDiagram-2RQKCTM6--Nh-CD3F.js} +1 -1
- package/web-shell/index.html +2 -2
- package/chunks/chunk-CG3OQDNY.js +0 -649
- package/chunks/chunk-L34XSHIZ.js +0 -28
- package/chunks/chunk-N2TNM3QB.js +0 -9
- package/chunks/chunk-UOMZKPI5.js +0 -830
- package/chunks/chunk-WFRHWDBT.js +0 -622
- package/chunks/chunk-WLML6VIA.js +0 -18
- package/chunks/chunk-ZBBVBZBR.js +0 -137
- package/chunks/chunk-bdqvmfwv-OHYAFAAO.js +0 -17446
- package/chunks/daemon-status-provider-LPYR2GXY.js +0 -103
- package/chunks/dispatch-B53LNEO4.js +0 -37
- package/chunks/nonInteractiveCli-ZHW6F76F.js +0 -166
- package/chunks/opentui-entry-SBAOWW7M.js +0 -52325
- package/chunks/runtime-gate-T4ICWGQJ.js +0 -89
- package/chunks/wrapper-46Z24CTM.js +0 -35
- package/web-shell/assets/channel-D2b9IYpS.js +0 -1
- package/web-shell/assets/classDiagram-4FO5ZUOK-DHatTCmD.js +0 -1
- package/web-shell/assets/classDiagram-v2-Q7XG4LA2-DHatTCmD.js +0 -1
- package/web-shell/assets/index-CIFO52Wx.css +0 -5
- package/web-shell/assets/index-bhq3CUUF.js +0 -1789
- package/web-shell/assets/stateDiagram-v2-BHNVJYJU-spuAYji6.js +0 -1
- /package/chunks/{chunk-44CTCCLY.js → chunk-NWNEANAT.js} +0 -0
|
@@ -2,17 +2,17 @@
|
|
|
2
2
|
"use strict";
|
|
3
3
|
import {
|
|
4
4
|
listCommand
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-ZQUY3ZJU.js";
|
|
6
6
|
import {
|
|
7
7
|
getErrorMessage as getErrorMessage2
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-RDVNSJQU.js";
|
|
9
9
|
import {
|
|
10
10
|
serveCommand
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-TDESMS7M.js";
|
|
12
12
|
import {
|
|
13
13
|
OBSERVED_CONTACT_MAX_FRESH_WITHIN_SECONDS,
|
|
14
14
|
ObservedChannelContactStore
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-TMFWI4RC.js";
|
|
16
16
|
import {
|
|
17
17
|
escapeAnsiCtrlCodes
|
|
18
18
|
} from "./chunk-4NFY2S7N.js";
|
|
@@ -28,12 +28,12 @@ import {
|
|
|
28
28
|
} from "./chunk-TQOF5KBL.js";
|
|
29
29
|
import {
|
|
30
30
|
resolvePath
|
|
31
|
-
} from "./chunk-
|
|
31
|
+
} from "./chunk-H7TMVHKE.js";
|
|
32
32
|
import {
|
|
33
33
|
collectProviderModelsForProtocol,
|
|
34
34
|
getAuthTypeFromEnv,
|
|
35
35
|
resolveCliGenerationConfig
|
|
36
|
-
} from "./chunk-
|
|
36
|
+
} from "./chunk-ROIJYS5K.js";
|
|
37
37
|
import {
|
|
38
38
|
resolveSkillSettings
|
|
39
39
|
} from "./chunk-Z4X5MTRT.js";
|
|
@@ -53,27 +53,27 @@ import {
|
|
|
53
53
|
registerToolCallDispatch,
|
|
54
54
|
selectFirstModel,
|
|
55
55
|
sessionsPath
|
|
56
|
-
} from "./chunk-
|
|
56
|
+
} from "./chunk-WM3LUQLO.js";
|
|
57
57
|
import {
|
|
58
58
|
getExtensionManager,
|
|
59
59
|
requestChoicePluginNonInteractive,
|
|
60
60
|
requestConsentNonInteractive,
|
|
61
61
|
requestConsentOrFail,
|
|
62
62
|
resolveExtensionCommandScope
|
|
63
|
-
} from "./chunk-
|
|
63
|
+
} from "./chunk-IH4Z54RJ.js";
|
|
64
64
|
import {
|
|
65
65
|
parseChannelConfig
|
|
66
|
-
} from "./chunk-
|
|
67
|
-
import {
|
|
68
|
-
findCliEntryPath
|
|
69
|
-
} from "./chunk-V6WHFGST.js";
|
|
66
|
+
} from "./chunk-BSR5AXZR.js";
|
|
70
67
|
import {
|
|
71
68
|
DEFAULT_BASE_URL,
|
|
72
69
|
buildHeaders,
|
|
73
70
|
clearAccount,
|
|
74
71
|
loadAccount,
|
|
75
72
|
saveAccount
|
|
76
|
-
} from "./chunk-
|
|
73
|
+
} from "./chunk-ZLCT4C5A.js";
|
|
74
|
+
import {
|
|
75
|
+
findCliEntryPath
|
|
76
|
+
} from "./chunk-V6WHFGST.js";
|
|
77
77
|
import {
|
|
78
78
|
canonicalizeWorkspace
|
|
79
79
|
} from "./chunk-6PLDPT2C.js";
|
|
@@ -101,7 +101,7 @@ import {
|
|
|
101
101
|
import {
|
|
102
102
|
normalizeWorkerDiagnostic,
|
|
103
103
|
sanitizeWorkerDiagnostic
|
|
104
|
-
} from "./chunk-
|
|
104
|
+
} from "./chunk-A6NRNRKE.js";
|
|
105
105
|
import {
|
|
106
106
|
normalizeServeChannelSelection
|
|
107
107
|
} from "./chunk-ALMR3E6Q.js";
|
|
@@ -110,7 +110,14 @@ import {
|
|
|
110
110
|
} from "./chunk-M5GB774H.js";
|
|
111
111
|
import {
|
|
112
112
|
EXTERNAL_TOOL_GUARD_TOKEN_ENV
|
|
113
|
-
} from "./chunk-
|
|
113
|
+
} from "./chunk-3VUENPWF.js";
|
|
114
|
+
import {
|
|
115
|
+
readServiceInfo,
|
|
116
|
+
removeServiceInfo,
|
|
117
|
+
signalService,
|
|
118
|
+
waitForExit,
|
|
119
|
+
writeServiceInfo
|
|
120
|
+
} from "./chunk-3AEKDXKT.js";
|
|
114
121
|
import {
|
|
115
122
|
AcpBridge,
|
|
116
123
|
ChannelLoopScheduler,
|
|
@@ -121,45 +128,38 @@ import {
|
|
|
121
128
|
isChannelProactiveDeliveryError,
|
|
122
129
|
sanitizeLogText,
|
|
123
130
|
sanitizePromptText
|
|
124
|
-
} from "./chunk-
|
|
125
|
-
import {
|
|
126
|
-
readServiceInfo,
|
|
127
|
-
removeServiceInfo,
|
|
128
|
-
signalService,
|
|
129
|
-
waitForExit,
|
|
130
|
-
writeServiceInfo
|
|
131
|
-
} from "./chunk-AQHNAA7E.js";
|
|
131
|
+
} from "./chunk-AW27A43Y.js";
|
|
132
132
|
import {
|
|
133
133
|
assembleMcpServers,
|
|
134
134
|
getPendingGatedMcpServers,
|
|
135
135
|
mcpCommand
|
|
136
|
-
} from "./chunk-
|
|
136
|
+
} from "./chunk-3LDGOQXZ.js";
|
|
137
137
|
import {
|
|
138
138
|
loadSettings
|
|
139
|
-
} from "./chunk-
|
|
139
|
+
} from "./chunk-3GDBZJD6.js";
|
|
140
140
|
import {
|
|
141
141
|
detectSystemLanguage,
|
|
142
142
|
getCurrentLanguage,
|
|
143
143
|
initializeI18n,
|
|
144
144
|
resolveLanguageSetting,
|
|
145
145
|
t
|
|
146
|
-
} from "./chunk-
|
|
146
|
+
} from "./chunk-IRSLAS4M.js";
|
|
147
147
|
import {
|
|
148
148
|
loadEnvironment
|
|
149
|
-
} from "./chunk-
|
|
149
|
+
} from "./chunk-XH3KAV2G.js";
|
|
150
150
|
import {
|
|
151
151
|
resolveAcpChannelFallback,
|
|
152
152
|
scrubAndReportInheritedLoaderEnv
|
|
153
153
|
} from "./chunk-MS7GNABG.js";
|
|
154
154
|
import {
|
|
155
155
|
getCliVersion
|
|
156
|
-
} from "./chunk-
|
|
156
|
+
} from "./chunk-OWXFBIB6.js";
|
|
157
157
|
import {
|
|
158
158
|
getPackageJson
|
|
159
|
-
} from "./chunk-
|
|
159
|
+
} from "./chunk-WZMH7II3.js";
|
|
160
160
|
import {
|
|
161
161
|
isWorkspaceTrusted
|
|
162
|
-
} from "./chunk-
|
|
162
|
+
} from "./chunk-ZMY2P4L3.js";
|
|
163
163
|
import {
|
|
164
164
|
require_strip_json_comments
|
|
165
165
|
} from "./chunk-NPQ5ZKRP.js";
|
|
@@ -193,15 +193,12 @@ import {
|
|
|
193
193
|
parseInstallSource,
|
|
194
194
|
promptForSetting,
|
|
195
195
|
readChannelMemory,
|
|
196
|
-
redactUrlCredentials,
|
|
197
196
|
removeChannelMemoryEntries,
|
|
198
197
|
resolveBundleDir,
|
|
199
|
-
sessionIdContext,
|
|
200
|
-
stripAnsiAndControl,
|
|
201
198
|
unquoteCStylePath,
|
|
202
199
|
updateChannelMemoryEntry,
|
|
203
200
|
updateSetting
|
|
204
|
-
} from "./chunk-
|
|
201
|
+
} from "./chunk-EBPLKY6U.js";
|
|
205
202
|
import {
|
|
206
203
|
parsePositiveIntegerEnv
|
|
207
204
|
} from "./chunk-6PVPNMXU.js";
|
|
@@ -211,32 +208,38 @@ import {
|
|
|
211
208
|
} from "./chunk-IRH27ZC2.js";
|
|
212
209
|
import {
|
|
213
210
|
require_dist
|
|
214
|
-
} from "./chunk-
|
|
211
|
+
} from "./chunk-5RUCD4ED.js";
|
|
215
212
|
import {
|
|
213
|
+
addDaemonRequestAttribute,
|
|
216
214
|
parseBooleanEnvFlag,
|
|
217
215
|
resolveTelemetrySettings
|
|
218
|
-
} from "./chunk-
|
|
216
|
+
} from "./chunk-K34GJQOZ.js";
|
|
219
217
|
import {
|
|
220
218
|
getAllGeminiMdFilenames,
|
|
221
219
|
parseLineTolerant,
|
|
222
220
|
setGeminiMdFilename
|
|
223
|
-
} from "./chunk-
|
|
221
|
+
} from "./chunk-4KM2SYK5.js";
|
|
224
222
|
import {
|
|
225
223
|
SchemaValidator,
|
|
226
224
|
ToolNames
|
|
227
|
-
} from "./chunk-
|
|
225
|
+
} from "./chunk-YIGGWOJE.js";
|
|
228
226
|
import {
|
|
229
227
|
DEFAULT_QWEN_EMBEDDING_MODEL
|
|
230
228
|
} from "./chunk-F6WFNA7U.js";
|
|
229
|
+
import {
|
|
230
|
+
isTlsVerificationDisabled
|
|
231
|
+
} from "./chunk-4AOVQPJU.js";
|
|
231
232
|
import {
|
|
232
233
|
atomicWriteFileSync
|
|
233
|
-
} from "./chunk-
|
|
234
|
+
} from "./chunk-YBHUXEC6.js";
|
|
234
235
|
import {
|
|
235
|
-
|
|
236
|
-
|
|
236
|
+
recordChannelMemoryRecallMetrics,
|
|
237
|
+
redactUrlCredentials,
|
|
238
|
+
stripAnsiAndControl
|
|
239
|
+
} from "./chunk-N4SVADAV.js";
|
|
237
240
|
import {
|
|
238
|
-
|
|
239
|
-
} from "./chunk-
|
|
241
|
+
sessionIdContext
|
|
242
|
+
} from "./chunk-K5IDV3PC.js";
|
|
240
243
|
import {
|
|
241
244
|
FatalConfigError,
|
|
242
245
|
FatalSandboxError,
|
|
@@ -244,7 +247,7 @@ import {
|
|
|
244
247
|
createDebugLogger,
|
|
245
248
|
getErrorMessage,
|
|
246
249
|
isNodeError
|
|
247
|
-
} from "./chunk-
|
|
250
|
+
} from "./chunk-HOSVOUDK.js";
|
|
248
251
|
import {
|
|
249
252
|
writeStderrLine,
|
|
250
253
|
writeStderrLineSafe,
|
|
@@ -2985,7 +2988,7 @@ var stopCommand = {
|
|
|
2985
2988
|
if (argv["daemon-url"]) {
|
|
2986
2989
|
const token = argv.token ?? process.env[QWEN_SERVER_TOKEN_ENV] ?? process.env[QWEN_DAEMON_TOKEN_ENV];
|
|
2987
2990
|
try {
|
|
2988
|
-
const sdk = await import("./daemon-
|
|
2991
|
+
const sdk = await import("./daemon-GED37WOX.js");
|
|
2989
2992
|
const client = new sdk.DaemonClient({
|
|
2990
2993
|
baseUrl: argv["daemon-url"],
|
|
2991
2994
|
...token ? { token } : {}
|
|
@@ -3171,7 +3174,7 @@ var statusCommand = {
|
|
|
3171
3174
|
if (argv["daemon-url"]) {
|
|
3172
3175
|
const token = argv.token ?? process.env[QWEN_SERVER_TOKEN_ENV] ?? process.env[QWEN_DAEMON_TOKEN_ENV];
|
|
3173
3176
|
try {
|
|
3174
|
-
const sdk = await import("./daemon-
|
|
3177
|
+
const sdk = await import("./daemon-GED37WOX.js");
|
|
3175
3178
|
const client = new sdk.DaemonClient({
|
|
3176
3179
|
baseUrl: argv["daemon-url"],
|
|
3177
3180
|
...token ? { token } : {}
|
|
@@ -3282,7 +3285,7 @@ var reloadCommand = {
|
|
|
3282
3285
|
const token = resolveToken(argv.token);
|
|
3283
3286
|
let sdk;
|
|
3284
3287
|
try {
|
|
3285
|
-
sdk = await import("./daemon-
|
|
3288
|
+
sdk = await import("./daemon-GED37WOX.js");
|
|
3286
3289
|
} catch (err) {
|
|
3287
3290
|
writeStderrLine(
|
|
3288
3291
|
`[Channel] Failed to load daemon SDK: ${safeChannelCommandErrorMessage(err)}`
|
|
@@ -3362,7 +3365,7 @@ var setCommand2 = {
|
|
|
3362
3365
|
const selection = names[0] === "all" ? { mode: "all" } : { mode: "names", names };
|
|
3363
3366
|
let sdk;
|
|
3364
3367
|
try {
|
|
3365
|
-
sdk = await import("./daemon-
|
|
3368
|
+
sdk = await import("./daemon-GED37WOX.js");
|
|
3366
3369
|
} catch (error) {
|
|
3367
3370
|
writeStderrLine(
|
|
3368
3371
|
`[Channel] Failed to load daemon SDK: ${safeChannelCommandErrorMessage(error)}`
|
|
@@ -3430,7 +3433,7 @@ function createDaemonSessionFactory({
|
|
|
3430
3433
|
sessionScope: "thread"
|
|
3431
3434
|
};
|
|
3432
3435
|
if (req.sessionId) {
|
|
3433
|
-
return await DaemonSessionClient.
|
|
3436
|
+
return await DaemonSessionClient.resume(
|
|
3434
3437
|
client,
|
|
3435
3438
|
req.sessionId,
|
|
3436
3439
|
daemonReq,
|
|
@@ -3491,7 +3494,7 @@ function createDaemonChannelBridgeFacade(bridge, opts) {
|
|
|
3491
3494
|
}
|
|
3492
3495
|
__name(createDaemonChannelBridgeFacade, "createDaemonChannelBridgeFacade");
|
|
3493
3496
|
async function loadDaemonSdk() {
|
|
3494
|
-
return await import("./daemon-
|
|
3497
|
+
return await import("./daemon-GED37WOX.js");
|
|
3495
3498
|
}
|
|
3496
3499
|
__name(loadDaemonSdk, "loadDaemonSdk");
|
|
3497
3500
|
function selectedChannelNames(channelsConfig, selection) {
|
|
@@ -4626,6 +4629,18 @@ init_esbuild_shims();
|
|
|
4626
4629
|
import { mkdirSync as mkdirSync2, readFileSync as readFileSync4, writeFileSync as writeFileSync2 } from "node:fs";
|
|
4627
4630
|
import { dirname as dirname2 } from "node:path";
|
|
4628
4631
|
|
|
4632
|
+
// packages/cli/src/commands/review/lib/review-settings.ts
|
|
4633
|
+
init_esbuild_shims();
|
|
4634
|
+
function operatorReviewSettings() {
|
|
4635
|
+
const review = loadSettings(void 0, { skipWorkspaceSettings: true }).merged.review;
|
|
4636
|
+
return {
|
|
4637
|
+
attribution: typeof review?.attribution === "boolean" ? review.attribution : true,
|
|
4638
|
+
comment: review?.comment === true,
|
|
4639
|
+
effort: typeof review?.effort === "string" ? review.effort : void 0
|
|
4640
|
+
};
|
|
4641
|
+
}
|
|
4642
|
+
__name(operatorReviewSettings, "operatorReviewSettings");
|
|
4643
|
+
|
|
4629
4644
|
// packages/cli/src/commands/review/lib/stale-bundle.ts
|
|
4630
4645
|
init_esbuild_shims();
|
|
4631
4646
|
import { createHash } from "node:crypto";
|
|
@@ -4900,19 +4915,29 @@ function classifyToken(token) {
|
|
|
4900
4915
|
return { type: "file", path: token };
|
|
4901
4916
|
}
|
|
4902
4917
|
__name(classifyToken, "classifyToken");
|
|
4903
|
-
function parseReviewArgs(raw) {
|
|
4918
|
+
function parseReviewArgs(raw, defaults = {}) {
|
|
4904
4919
|
const tokens = tokenizeArgs(raw);
|
|
4905
4920
|
const warnings = [];
|
|
4906
4921
|
const unknownFlags = [];
|
|
4907
|
-
let
|
|
4922
|
+
let commentRequestedByFlag = false;
|
|
4908
4923
|
let fixRequested = false;
|
|
4909
4924
|
let explicitEffort = null;
|
|
4925
|
+
let configuredEffort;
|
|
4926
|
+
let invalidConfiguredEffort;
|
|
4927
|
+
if (defaults.effort !== void 0) {
|
|
4928
|
+
const normalized = asEffort(defaults.effort);
|
|
4929
|
+
if (normalized !== null) {
|
|
4930
|
+
configuredEffort = normalized;
|
|
4931
|
+
} else {
|
|
4932
|
+
invalidConfiguredEffort = defaults.effort;
|
|
4933
|
+
}
|
|
4934
|
+
}
|
|
4910
4935
|
const effortIssues = [];
|
|
4911
4936
|
const kept = [];
|
|
4912
4937
|
for (let i = 0; i < tokens.length; i++) {
|
|
4913
4938
|
const token = tokens[i];
|
|
4914
4939
|
if (token === "--comment") {
|
|
4915
|
-
|
|
4940
|
+
commentRequestedByFlag = true;
|
|
4916
4941
|
continue;
|
|
4917
4942
|
}
|
|
4918
4943
|
if (token === "--fix") {
|
|
@@ -4991,8 +5016,9 @@ function parseReviewArgs(raw) {
|
|
|
4991
5016
|
);
|
|
4992
5017
|
}
|
|
4993
5018
|
const isPr = target.type === "pr-number" || target.type === "pr-url";
|
|
5019
|
+
const commentRequested = commentRequestedByFlag || defaults.comment === true;
|
|
4994
5020
|
const commentEffective = commentRequested && isPr;
|
|
4995
|
-
if (
|
|
5021
|
+
if (commentRequestedByFlag && !isPr) {
|
|
4996
5022
|
warnings.push(
|
|
4997
5023
|
"Warning: `--comment` flag is ignored because the review target is not a PR."
|
|
4998
5024
|
);
|
|
@@ -5008,6 +5034,9 @@ function parseReviewArgs(raw) {
|
|
|
5008
5034
|
if (explicitEffort !== null) {
|
|
5009
5035
|
effort = explicitEffort;
|
|
5010
5036
|
effortSource = "explicit";
|
|
5037
|
+
} else if (configuredEffort !== void 0) {
|
|
5038
|
+
effort = configuredEffort;
|
|
5039
|
+
effortSource = "configured";
|
|
5011
5040
|
} else {
|
|
5012
5041
|
effort = isPr ? "high" : "medium";
|
|
5013
5042
|
effortSource = "default";
|
|
@@ -5016,7 +5045,7 @@ function parseReviewArgs(raw) {
|
|
|
5016
5045
|
effort = "high";
|
|
5017
5046
|
effortSource = "forced-by-comment";
|
|
5018
5047
|
warnings.push(
|
|
5019
|
-
"`--comment` requires a verified review; running at high effort."
|
|
5048
|
+
commentRequestedByFlag ? "`--comment` requires a verified review; running at high effort." : "`review.comment` is enabled in settings; posting requires a verified review \u2014 running at high effort."
|
|
5020
5049
|
);
|
|
5021
5050
|
}
|
|
5022
5051
|
if (fixEffective && effort === "low") {
|
|
@@ -5026,7 +5055,7 @@ function parseReviewArgs(raw) {
|
|
|
5026
5055
|
"`--fix` edits your working tree, so it requires verified findings; running at medium effort."
|
|
5027
5056
|
);
|
|
5028
5057
|
}
|
|
5029
|
-
const resolution = effortSource === "explicit" ? `--effort ${effort} (the last valid occurrence) is in effect` : effortSource === "forced-by-comment" ? "`--comment` forces high effort" : effortSource === "forced-by-fix" ? "`--fix` forces at least medium effort" : "using the default effort";
|
|
5058
|
+
const resolution = effortSource === "explicit" ? `--effort ${effort} (the last valid occurrence) is in effect` : effortSource === "forced-by-comment" ? commentRequestedByFlag ? "`--comment` forces high effort" : "the `review.comment` setting forces high effort" : effortSource === "forced-by-fix" ? "`--fix` forces at least medium effort" : effortSource === "configured" ? "using the configured review.effort" : "using the default effort";
|
|
5030
5059
|
for (const issue of effortIssues) {
|
|
5031
5060
|
switch (issue.kind) {
|
|
5032
5061
|
case "invalid-eq":
|
|
@@ -5051,11 +5080,16 @@ function parseReviewArgs(raw) {
|
|
|
5051
5080
|
break;
|
|
5052
5081
|
}
|
|
5053
5082
|
}
|
|
5083
|
+
if (invalidConfiguredEffort !== void 0) {
|
|
5084
|
+
warnings.push(
|
|
5085
|
+
`Invalid review.effort value ${JSON.stringify(invalidConfiguredEffort)} in settings; ${resolution}.`
|
|
5086
|
+
);
|
|
5087
|
+
}
|
|
5054
5088
|
return {
|
|
5055
5089
|
target,
|
|
5056
5090
|
effort,
|
|
5057
5091
|
effortSource,
|
|
5058
|
-
comment: { requested:
|
|
5092
|
+
comment: { requested: commentRequestedByFlag, effective: commentEffective },
|
|
5059
5093
|
fix: { requested: fixRequested, effective: fixEffective },
|
|
5060
5094
|
extraTokens,
|
|
5061
5095
|
unknownFlags,
|
|
@@ -5063,6 +5097,14 @@ function parseReviewArgs(raw) {
|
|
|
5063
5097
|
};
|
|
5064
5098
|
}
|
|
5065
5099
|
__name(parseReviewArgs, "parseReviewArgs");
|
|
5100
|
+
function reviewDefaultsFromSettings() {
|
|
5101
|
+
const review = operatorReviewSettings();
|
|
5102
|
+
return {
|
|
5103
|
+
effort: review.effort === void 0 || review.effort.toLowerCase() === "auto" ? void 0 : review.effort,
|
|
5104
|
+
comment: review.comment
|
|
5105
|
+
};
|
|
5106
|
+
}
|
|
5107
|
+
__name(reviewDefaultsFromSettings, "reviewDefaultsFromSettings");
|
|
5066
5108
|
var parseArgsCommand = {
|
|
5067
5109
|
command: "parse-args [raw]",
|
|
5068
5110
|
describe: "Parse the /review skill argument string (--comment, --fix, --effort, target disambiguation) and emit the verdict as JSON; pass the string on stdin via --stdin (a positional that begins with a dash never reaches this handler \u2014 yargs rejects it as an unknown flag)",
|
|
@@ -5099,7 +5141,7 @@ var parseArgsCommand = {
|
|
|
5099
5141
|
if (bundleNotice) {
|
|
5100
5142
|
writeStderrLineSafe(bundleNotice);
|
|
5101
5143
|
}
|
|
5102
|
-
const parsed = parseReviewArgs(rawStr);
|
|
5144
|
+
const parsed = parseReviewArgs(rawStr, reviewDefaultsFromSettings());
|
|
5103
5145
|
const json = JSON.stringify(parsed, null, 2);
|
|
5104
5146
|
if (out) {
|
|
5105
5147
|
mkdirSync2(dirname2(out), { recursive: true });
|
|
@@ -11402,40 +11444,55 @@ function renderShellLayerBriefList(taxonomy = SHELL_MODEL_LAYERS) {
|
|
|
11402
11444
|
}
|
|
11403
11445
|
__name(renderShellLayerBriefList, "renderShellLayerBriefList");
|
|
11404
11446
|
var LAYER_RECEIPT_LINE_RE = /^[ \t]*(?:[-*+]|\d+[.)])?[ \t]*[*_~]{0,3}layer\s+walked[*_~]{0,3}[ \t]*[::][\s*_~`]*([a-z][a-z0-9-]*)/i;
|
|
11405
|
-
var
|
|
11447
|
+
var TRAILING_STITCH = new RegExp("^[\\p{P}\\p{S}]*(?:[^\\s\\p{P}\\p{S}]|\\p{Pc})", "u");
|
|
11406
11448
|
var MD = new lib_default2({ html: true });
|
|
11407
|
-
|
|
11408
|
-
|
|
11449
|
+
var DROPPED_INLINE = "\0";
|
|
11450
|
+
var BIDI_CONTROL = new RegExp("\\p{Bidi_Control}", "gu");
|
|
11451
|
+
var INVISIBLE_FORMAT = /[\p{Cf}\p{Variation_Selector}\u000B\u034F\u000C\u2028\u2029]/gu;
|
|
11452
|
+
function* usedLines(finalText) {
|
|
11453
|
+
const src = finalText.replace(/\r\n?/g, "\n");
|
|
11409
11454
|
let tokens;
|
|
11410
11455
|
try {
|
|
11411
|
-
tokens = MD.parse(
|
|
11456
|
+
tokens = MD.parse(src, {});
|
|
11412
11457
|
} catch {
|
|
11413
|
-
|
|
11458
|
+
yield* src.split("\n");
|
|
11459
|
+
return;
|
|
11414
11460
|
}
|
|
11461
|
+
let blockquoteDepth = 0;
|
|
11415
11462
|
for (const t2 of tokens) {
|
|
11416
|
-
if (t2.
|
|
11417
|
-
|
|
11463
|
+
if (t2.type === "blockquote_open") blockquoteDepth++;
|
|
11464
|
+
else if (t2.type === "blockquote_close") blockquoteDepth--;
|
|
11465
|
+
else if (t2.type === "inline" && blockquoteDepth === 0) {
|
|
11466
|
+
let prose = "";
|
|
11467
|
+
for (const c of t2.children ?? []) {
|
|
11468
|
+
if (c.type === "text")
|
|
11469
|
+
prose += c.content.replace(/[\r\n]+/g, " ").replace(BIDI_CONTROL, DROPPED_INLINE).replace(INVISIBLE_FORMAT, "");
|
|
11470
|
+
else if (c.type === "softbreak" || c.type === "hardbreak")
|
|
11471
|
+
prose += "\n";
|
|
11472
|
+
else if (c.type === "html_inline" && // A real GitHub break: `<br>`, self-closing, or with attributes — but
|
|
11473
|
+
// NOT a `<br-…>` custom element (a hyphen keeps the tag name going, and
|
|
11474
|
+
// GitHub strips the non-allowlisted tag, leaving no break). After `br`
|
|
11475
|
+
// the tag must END, or continue with whitespace/slash then attributes.
|
|
11476
|
+
/^<br(?:[ \t\n\f\r/][^>]*)?>$/i.test(c.content))
|
|
11477
|
+
prose += "\n";
|
|
11478
|
+
else if (c.type === "code_inline" || c.type === "html_inline" || c.type === "image")
|
|
11479
|
+
prose += DROPPED_INLINE;
|
|
11480
|
+
}
|
|
11481
|
+
yield* prose.split("\n");
|
|
11418
11482
|
}
|
|
11419
11483
|
}
|
|
11420
|
-
return quoted;
|
|
11421
|
-
}
|
|
11422
|
-
__name(quotedLines, "quotedLines");
|
|
11423
|
-
function* usedLines(finalText) {
|
|
11424
|
-
const src = finalText.replace(/\r\n?/g, "\n");
|
|
11425
|
-
const quoted = quotedLines(src);
|
|
11426
|
-
const lines = src.split("\n");
|
|
11427
|
-
for (let i = 0; i < lines.length; i++) {
|
|
11428
|
-
if (!quoted.has(i)) yield lines[i];
|
|
11429
|
-
}
|
|
11430
11484
|
}
|
|
11431
11485
|
__name(usedLines, "usedLines");
|
|
11432
11486
|
function parseLayerReceipts(finalText, taxonomy = SHELL_MODEL_LAYERS) {
|
|
11433
11487
|
const ids = /* @__PURE__ */ new Set();
|
|
11434
|
-
|
|
11488
|
+
const bare = finalText.replace(/[*_~`[\]()]/g, "");
|
|
11489
|
+
if (!/layer/i.test(bare) && !/walked/i.test(bare) && !/&[#a-z]/i.test(finalText))
|
|
11490
|
+
return ids;
|
|
11435
11491
|
const known = new Set(taxonomy.map((l) => l.id));
|
|
11436
11492
|
for (const line of usedLines(finalText)) {
|
|
11437
11493
|
const m = LAYER_RECEIPT_LINE_RE.exec(line);
|
|
11438
11494
|
if (!m) continue;
|
|
11495
|
+
if (TRAILING_STITCH.test(line.slice(m[0].length))) continue;
|
|
11439
11496
|
const id = m[1].toLowerCase();
|
|
11440
11497
|
if (known.has(id)) ids.add(id);
|
|
11441
11498
|
}
|
|
@@ -11506,6 +11563,7 @@ function isRepositoryContextRoleId(value) {
|
|
|
11506
11563
|
__name(isRepositoryContextRoleId, "isRepositoryContextRoleId");
|
|
11507
11564
|
var REVERSE_AUDIT_EXAMPLE_RECEIPT = "No issues found \u2014 re-walked the reconnect state machine and the two changed exports' call sites; every gap I checked was already in the list";
|
|
11508
11565
|
var MODELED_SYSTEM_EXECUTION_LENS = `- **A model of another system's EXECUTION, diverging in state \u2014 not only its syntax.** Beyond a parser that *reads* a format two ways, an *interpreter* \u2014 a guard, sandbox, or permission model that re-implements how another system (a shell, git, a query engine) RUNS \u2014 can have its model of that system's runtime state drift from the real thing. Syntax divergence is one token read two ways; **state divergence** is the model carrying the wrong VALUE across a boundary the real system crosses differently, so the guard allows what it would have denied. Enumerate the boundaries where the modeled system carries state across a call, and for each ask what the real system does that the model does not: what SURVIVES a function call or \`eval\` (working directory, exported vars, shell options, defined functions) that a subshell or \`$(\u2026)\` does NOT propagate back but DOES inherit; what name-resolution order applies (a function shadowing \`git\`/\`cd\`, \`command\`/\`builtin\` bypassing it, \`export -f\` importing a function into a child shell); which options (\`set -a\`) a child or substitution inherits. The bug shape is a recursive evaluator that computes a nested body's post-state and then DISCARDS or fails to merge it, so a later check runs against state the real system has already moved past. **A second bug shape is state that only ACCUMULATES:** the real system has operations that DELETE what earlier ones added \u2014 \`unset -f\`/\`unalias\`/\`export -n -f\` remove a definition or its export attribute, \`set +a\`/\`+o\` clears an option, \`cd -\`/\`popd\` walks a directory back \u2014 so a model that grows an add-only map of definitions, export attributes, or options and never removes an entry diverges the moment the real system removes one (a \`git\` function defined, then \`unset -f\`'d, still replayed against a stale body while the real shell resolves the external program). For every piece of modeled state, check the model has a REMOVAL path for every ADD path the real system does. **When the boundary is subtle, do not argue it \u2014 run it:** build the payload, execute it against the real system (\`run_shell_command\` real bash/git in the worktree), trace the same payload through the model, and state the divergence with BOTH observed behaviours. A guard that models an executable system and is reviewed only by reading is judged against the very model of that system whose gaps are the vulnerability \u2014 the reading and the code share the blind spot by construction.`;
|
|
11566
|
+
var ENUMERATION_TRAP_LENS = `A change that HAND-ROLLS parsing or matching of a surface whose **entrance space is unbounded** \u2014 untrusted input read a rendered format's way, a re-implemented general grammar, \`indexOf\`/\`slice\`/regex over structured input whose per-corner special-cases keep accumulating ("match what the renderer renders" logic, a growing hand-listed case set) \u2014 has **no last corner**, so enumerating cases never converges. (Adversarial input alone does NOT make a surface unbounded: a small, exhaustively specified grammar has a bounded, enumerable set of productions and IS closable by exhaustive validation \u2014 do not demand a structural replacement there. The trigger is unboundedness of the entrance space, not the mere hostility of the input.) The finding is the SHAPE, not the current corner: name the class-closing fix \u2014 defer to a real parser, the tool's own authoritative structured output, or a fail-closed decision \u2014 and file it ONCE, in place of enumerating cases. **Carry ONE demonstrated corner as the finding's witness** \u2014 the concrete input/state and the line(s) that produce the wrong outcome, executed against the real code where you can \u2014 so a verifier can confirm it at high confidence and it posts; that corner is the class's evidence, not a separate finding. Severity follows the risk the shape carries \u2014 a hand-rolled parser that can be fooled into a wrong result is **Critical**.`;
|
|
11509
11567
|
var BRIEFS = {
|
|
11510
11568
|
"0": {
|
|
11511
11569
|
// Budget-exempt: Issue-sized mandatory work, not diff-sized: a small bugfix
|
|
@@ -11663,7 +11721,7 @@ Not your dimension: whether the change is at the right depth (3b owns altitude a
|
|
|
11663
11721
|
publicLabel: "the altitude and abstraction pass",
|
|
11664
11722
|
publicLabelZh: "\u4FEE\u590D\u5C42\u6B21\u4E0E\u62BD\u8C61\u5408\u7406\u6027\u68C0\u67E5",
|
|
11665
11723
|
readsDiff: true,
|
|
11666
|
-
brief: `You are **Agent 3b: Altitude & Abstraction Fit**. One question, walked to the end: **is each change at the right depth?**
|
|
11724
|
+
brief: `You are **Agent 3b: Altitude & Abstraction Fit**. One question, walked to the end: **is each change at the right depth, and the right SHAPE for what it re-implements?**
|
|
11667
11725
|
|
|
11668
11726
|
Altitude is the failure that reads as correct at every individual line and is wrong as a whole. For each change ask where the problem it addresses actually lives, and compare that to where the fix was written:
|
|
11669
11727
|
|
|
@@ -11671,6 +11729,7 @@ Altitude is the failure that reads as correct at every individual line and is wr
|
|
|
11671
11729
|
- **Too shallow in the other direction \u2014 the wrong owner.** The defect is upstream (another module, another service, the data's producer) and the diff compensates for it downstream. Say whose bug it is.
|
|
11672
11730
|
- **Too deep \u2014 over-engineering.** A new abstraction, indirection layer, options object, or configuration point serving exactly one call site; a generalisation for a second case that does not exist. The cost is real and concrete: every future reader pays for the indirection, and the shape is fixed by a single example that may be unrepresentative.
|
|
11673
11731
|
- **Blast radius.** When a change to shared infrastructure exists to serve one caller, name the *other* callers it now also affects, and what it means for them.
|
|
11732
|
+
- **Wrong shape \u2014 the enumeration trap.** ${ENUMERATION_TRAP_LENS} Filed here as this change's altitude finding, once, in place of enumerating its cases.
|
|
11674
11733
|
|
|
11675
11734
|
Every finding needs the concrete cost, not an aesthetic judgement: what breaks next, what has to be repeated, who else is affected. "This should be more general" with no named next caller is not a finding.
|
|
11676
11735
|
|
|
@@ -11921,6 +11980,8 @@ For each finding you were given:
|
|
|
11921
11980
|
|
|
11922
11981
|
**When the fix IS a threshold, measure the threshold.** A guard built on a ratio or length cutoff makes the fix's coverage an empirical number, not a reading: hold every other variable fixed, vary the guarded quantity, and binary-search the boundary where behaviour flips. Then put that number next to what the linked issue actually reports \u2014 a live verification of a prose-ratio guard measured the minimum recovering payload at ~473 chars with the issue's own preamble held fixed, which proved the fix covered the issue's \`edit\`/\`write_file\` half and silently declined its \`run_shell_command\` half. "Fix is narrower than its claim, here is the boundary, here is the half it misses" is a finding no amount of code-reading produces.
|
|
11923
11982
|
|
|
11983
|
+
**When the defect is mechanically enumerable, sweep the real population \u2014 the count is the verdict.** For a claim about a pattern, a predicate, or a parser ("this misclassifies X", "this mishandles shape Y"), do not stop at the one reported instance: run the check over every real instance this repo holds (every workflow step body, every call site, every input the code will actually see) and report the count. "195 of 434 real \`run:\` bodies reach this path" confirms the finding, sizes its severity, and hands the author a number they can re-run rather than argue with \u2014 and a count of **zero** is the quoted contradiction that rejects it. Two rules keep a sweep evidence rather than theatre: its oracle must be an **external authority** \u2014 the real parser, the real tool, \`bash -n\` \u2014 never your own reimplementation of the logic under test, because a mirror shares the blind spots of what it mirrors and mirrored sweeps have manufactured false findings out of their own bugs; and spot-check one hit by reading it before you quote a nonzero count.
|
|
11984
|
+
|
|
11924
11985
|
**A suggested fix you did not run is a hypothesis; say which one you are giving.** When a finding's fix is cheap to apply, patch it in, re-run the same probe/harness to show it works, then revert \u2014 and state that every other number in your report comes from the unmodified PR (the contamination line is what lets a reader trust the rest). A fix too costly to verify is still worth proposing, labeled untested.
|
|
11925
11986
|
|
|
11926
11987
|
**A probabilistic failure gets a RATE, not an anecdote.** For a timing/race claim, run N repetitions per arm and report the rates as the verdict; amplify with full CPU load to force the window open (a live case went from 4/11 idle to 5/5 loaded). And attribute honestly: a lower idle rate with no structural change is luck, not a fix. Fake-timer tests hardcode one ordering by construction \u2014 they cannot discriminate a race, so a green fake-timer suite is non-evidence here.
|
|
@@ -11981,6 +12042,8 @@ Return, for each finding, one verdict:
|
|
|
11981
12042
|
- **confirmed (low confidence)** \u2014 the mechanism is real but the trigger is uncertain (timing, environment, configuration). Say what would confirm it. Carry the severity.
|
|
11982
12043
|
- **rejected** \u2014 the code does not do what the finding claims (**quote the contradicting code**), or it matches an Exclusion Criterion (one-line reason).
|
|
11983
12044
|
|
|
12045
|
+
**A confirmed Critical returns its witness.** Alongside the verdict, include a \`witness:\` line quoting the observed output that settled it \u2014 the probe's two sides, the A/B's \`BASE:\`/\`PR:\` pair, the extracted step's run, the sweep count \u2014 trimmed to the deciding lines. When every run-capability above is genuinely inapplicable and the confirmation rests on the trace alone, write the one line \`witness: not run \u2014 <why no run could settle this claim>\` instead; writing that line is also the moment you notice when the claim was runnable after all. This is mechanical downstream \u2014 enforced in code at the findings canonicalization, not merely by the orchestrator's read of its rules: a confirmed Critical returning neither the witness nor the reason line is filed at **low confidence** \u2014 terminal-only, never posted \u2014 whatever your prose argued, because the evidence a run produced is the one part of a Critical its author can act on without re-deriving the bug.
|
|
12046
|
+
|
|
11984
12047
|
**Rejecting a Critical carries a higher bar than anything else, and it is one-way.** A rejected Critical is gone \u2014 no later stage revisits it, it vanishes from both the pull request and the terminal. To reject one you must **quote the specific code that contradicts the claim**. A passing test, a plausible-looking guard, or "I could not reproduce the reasoning" is not enough \u2014 when you cannot quote the contradiction, the floor is \`confirmed (low confidence)\`, never rejection. Downgrading is reversible; a human still sees a low-confidence finding under "Needs Human Review". Rejection is not.
|
|
11985
12048
|
|
|
11986
12049
|
**For anything non-Critical, when uncertain, downgrade to low confidence rather than rejecting.** Reserve outright rejection for a finding that clearly does not match the code (it describes behaviour the code does not have) or matches an Exclusion Criterion. Low confidence is for "likely real, needs human judgement", not for "I have no idea" \u2014 a vague suspicion with no concrete evidence in the code can still be rejected.
|
|
@@ -12016,7 +12079,7 @@ If you find no new gap in your scope, say so **and name what you re-examined** \
|
|
|
12016
12079
|
|
|
12017
12080
|
// packages/cli/src/commands/review/lib/repository-context.ts
|
|
12018
12081
|
var REPOSITORY_CONTEXT_VERSION = 1;
|
|
12019
|
-
var MAX_ARRAY_ITEMS =
|
|
12082
|
+
var MAX_ARRAY_ITEMS = 256;
|
|
12020
12083
|
var MAX_PROVIDER_LENGTH = 64;
|
|
12021
12084
|
var MAX_LABEL_LENGTH = 120;
|
|
12022
12085
|
var MAX_TOKEN_LENGTH = 160;
|
|
@@ -13053,6 +13116,29 @@ function contextRoleRunsInThisReview(role, plan, mode) {
|
|
|
13053
13116
|
}
|
|
13054
13117
|
__name(contextRoleRunsInThisReview, "contextRoleRunsInThisReview");
|
|
13055
13118
|
|
|
13119
|
+
// packages/cli/src/commands/review/lib/agent-identity.ts
|
|
13120
|
+
init_esbuild_shims();
|
|
13121
|
+
var CHUNK_ROLE_RE = /^chunk\s+(\d+)\s+of\s+\d+$/i;
|
|
13122
|
+
var IDENTITY_LINE_RE = /^You are review agent `([^`\n]+)`(.*)$/;
|
|
13123
|
+
function labelFromIdentityLine(line) {
|
|
13124
|
+
const m = IDENTITY_LINE_RE.exec(line.replace(/\r$/, ""));
|
|
13125
|
+
if (!m) return null;
|
|
13126
|
+
const [, role, rest] = m;
|
|
13127
|
+
const chunk2 = CHUNK_ROLE_RE.exec(role);
|
|
13128
|
+
if (chunk2) return `chunk ${chunk2[1]}`;
|
|
13129
|
+
const round = /\(round (\d+)\)/.exec(rest);
|
|
13130
|
+
if (round) return `agent ${role} (round ${round[1]})`;
|
|
13131
|
+
const file = /Your file: `([^`\n]+)`/.exec(rest);
|
|
13132
|
+
if (file) return `agent ${role} (${file[1]})`;
|
|
13133
|
+
return `agent ${role}`;
|
|
13134
|
+
}
|
|
13135
|
+
__name(labelFromIdentityLine, "labelFromIdentityLine");
|
|
13136
|
+
function labelFromLaunchPrompt(prompt) {
|
|
13137
|
+
const m = /^You are review agent `[^`\n]+`[^\n]*/m.exec(prompt);
|
|
13138
|
+
return m ? labelFromIdentityLine(m[0]) : null;
|
|
13139
|
+
}
|
|
13140
|
+
__name(labelFromLaunchPrompt, "labelFromLaunchPrompt");
|
|
13141
|
+
|
|
13056
13142
|
// packages/cli/src/commands/review/lib/deadline.ts
|
|
13057
13143
|
init_esbuild_shims();
|
|
13058
13144
|
import {
|
|
@@ -13391,7 +13477,12 @@ __name(launchToolBudget, "launchToolBudget");
|
|
|
13391
13477
|
var BUDGET_GAP_LINE_RE = /^(?:[ \t]*(?:[-*+]|\d+[.)]))?[ \t]*(`?)[*_~]{0,3}(?:budget gap|预算(?:缺口|不足|用尽))[*_~]{0,3}[ \t]*[::][*_~]{0,3}[ \t]*(.+)$/i;
|
|
13392
13478
|
var GAP_HINT_RE = /budget gap|预算(?:缺口|不足|用尽)/i;
|
|
13393
13479
|
var INLINE_BUDGET_GAP_RE = /(?:budget gap|预算(?:缺口|不足|用尽))[*_~`]{0,3}[ \t]*[::]/i;
|
|
13394
|
-
var
|
|
13480
|
+
var BUDGET_QUALIFIED = "(?:under|within|below|inside)\\s+(?:the\\s+)?(?:tool(?:[- ]call)?\\s+)?budget";
|
|
13481
|
+
var COMPLETION_TAIL = `(?:\\s+${BUDGET_QUALIFIED})?`;
|
|
13482
|
+
var PLACEHOLDER_GAP_RE = new RegExp(
|
|
13483
|
+
`^(?:<[^>]*>$|[-\u2014*_~\`]+$|(?:none|n/a|nothing|no (?:gaps?|checks?))\\b(?:[.!\u2026,;:\\s]*$|\\s+(?:skipped|found|to report)\\b[.!\u2026,;:\\s]*$|\\s*[-\u2014\u2013]\\s*(?:stayed\\s+${BUDGET_QUALIFIED}\\b[.!\u2026,;:\\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${COMPLETION_TAIL}[.!\u2026,;:\\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${COMPLETION_TAIL}[.!\u2026,;:\\s]*\\)\\s*$))`,
|
|
13484
|
+
"i"
|
|
13485
|
+
);
|
|
13395
13486
|
var MAX_GAP_LENGTH = 160;
|
|
13396
13487
|
var MAX_GAPS_PER_AGENT = 8;
|
|
13397
13488
|
var DANGEROUS_CHARS_RE = (
|
|
@@ -13577,6 +13668,8 @@ function publicRoleLabelZh(req) {
|
|
|
13577
13668
|
__name(publicRoleLabelZh, "publicRoleLabelZh");
|
|
13578
13669
|
function label(rec, chunk2) {
|
|
13579
13670
|
if (chunk2 !== null) return `chunk ${chunk2}`;
|
|
13671
|
+
const identity = labelFromLaunchPrompt(rec.launchPrompt);
|
|
13672
|
+
if (identity !== null) return identity;
|
|
13580
13673
|
const first = rec.launchPrompt.split("\n")[0]?.trim() ?? "";
|
|
13581
13674
|
if (first) return first.replace(/\s+/g, " ");
|
|
13582
13675
|
return rec.agentName || rec.agentId;
|
|
@@ -14246,6 +14339,7 @@ function validateFindings(raw) {
|
|
|
14246
14339
|
const heldRaw = o.heldByMeasurement;
|
|
14247
14340
|
const heldFile = heldRaw && typeof heldRaw === "object" ? asString(heldRaw, "file") : void 0;
|
|
14248
14341
|
const shortSummary = asString(o, "shortSummary") ?? asString(o, "short_summary");
|
|
14342
|
+
const witness = asString(o, "witness");
|
|
14249
14343
|
return {
|
|
14250
14344
|
id,
|
|
14251
14345
|
severity,
|
|
@@ -14254,6 +14348,7 @@ function validateFindings(raw) {
|
|
|
14254
14348
|
summary,
|
|
14255
14349
|
shortSummary: shortSummary ? compressSummary(shortSummary) : compressSummary(summary),
|
|
14256
14350
|
failureScenario,
|
|
14351
|
+
...witness ? { witness } : {},
|
|
14257
14352
|
...asString(o, "suggestedFix") || asString(o, "suggested_fix") ? {
|
|
14258
14353
|
suggestedFix: asString(o, "suggestedFix") ?? asString(o, "suggested_fix")
|
|
14259
14354
|
} : {},
|
|
@@ -14319,6 +14414,24 @@ Held back from Critical by measurement: \`test-delta\` reran the failing test co
|
|
|
14319
14414
|
return { findings: out, held, readjudicated };
|
|
14320
14415
|
}
|
|
14321
14416
|
__name(holdCriticalsFailingOnBase, "holdCriticalsFailingOnBase");
|
|
14417
|
+
function holdUnwitnessedCriticals(findings) {
|
|
14418
|
+
const unwitnessed = [];
|
|
14419
|
+
const out = findings.map((f) => {
|
|
14420
|
+
if (f.severity !== "Critical" || f.confidence !== "high" || f.source !== "review" || f.witness !== void 0) {
|
|
14421
|
+
return f;
|
|
14422
|
+
}
|
|
14423
|
+
unwitnessed.push(f.id);
|
|
14424
|
+
return {
|
|
14425
|
+
...f,
|
|
14426
|
+
confidence: "low",
|
|
14427
|
+
failureScenario: `${f.failureScenario}
|
|
14428
|
+
|
|
14429
|
+
Filed at low confidence by the witness rule: this confirmed Critical arrived with neither a witness (the executed evidence that settled the verdict) nor a \`not run \u2014 <reason>\` line. Attach either and it stands at high confidence again.`
|
|
14430
|
+
};
|
|
14431
|
+
});
|
|
14432
|
+
return { findings: out, unwitnessed };
|
|
14433
|
+
}
|
|
14434
|
+
__name(holdUnwitnessedCriticals, "holdUnwitnessedCriticals");
|
|
14322
14435
|
var WORKSPACE_IN_COMMAND_RE = /--workspace="([^"]+)"/;
|
|
14323
14436
|
function repoRelative(path3, workspace) {
|
|
14324
14437
|
const at = path3.indexOf("::");
|
|
@@ -14553,6 +14666,8 @@ var findingsCommand = {
|
|
|
14553
14666
|
shared
|
|
14554
14667
|
));
|
|
14555
14668
|
}
|
|
14669
|
+
const witnessHold = holdUnwitnessedCriticals(findings);
|
|
14670
|
+
findings = witnessHold.findings;
|
|
14556
14671
|
const report = buildReport(findings);
|
|
14557
14672
|
const target = resolve6(out);
|
|
14558
14673
|
mkdirSync6(dirname5(target), { recursive: true });
|
|
@@ -14567,6 +14682,11 @@ var findingsCommand = {
|
|
|
14567
14682
|
`findings: ${h.id} held back from Critical \u2014 test-delta measured ${h.file} as failing on the merge base too`
|
|
14568
14683
|
);
|
|
14569
14684
|
}
|
|
14685
|
+
for (const id of witnessHold.unwitnessed) {
|
|
14686
|
+
writeStderrLine(
|
|
14687
|
+
`findings: ${id} filed at low confidence \u2014 a confirmed Critical carried neither a witness nor a 'not run' reason (Step 4's witness rule)`
|
|
14688
|
+
);
|
|
14689
|
+
}
|
|
14570
14690
|
for (const r of readjudicated) {
|
|
14571
14691
|
writeStderrLine(
|
|
14572
14692
|
`findings: ${r.id} left at Critical \u2014 it already carries the ${r.file} measurement and was raised again anyway`
|
|
@@ -14833,6 +14953,7 @@ __name(layerAuditGate, "layerAuditGate");
|
|
|
14833
14953
|
|
|
14834
14954
|
// packages/cli/src/commands/review/lib/ledger.ts
|
|
14835
14955
|
init_esbuild_shims();
|
|
14956
|
+
var SHA_RE = /^[0-9a-f]{7,64}$/;
|
|
14836
14957
|
var LEDGER_MAX_FINDINGS = 50;
|
|
14837
14958
|
var LEDGER_MAX_TITLE = 80;
|
|
14838
14959
|
var LEDGER_MAX_FILE = 200;
|
|
@@ -14848,6 +14969,7 @@ function serializeLedger(ledger) {
|
|
|
14848
14969
|
const render = /* @__PURE__ */ __name((findings, dropped) => {
|
|
14849
14970
|
const payload = { v: 1, round: ledger.round, findings };
|
|
14850
14971
|
if (dropped > 0) payload.dropped = dropped;
|
|
14972
|
+
else if (ledger.sha && SHA_RE.test(ledger.sha)) payload.sha = ledger.sha;
|
|
14851
14973
|
return `${OPEN}${JSON.stringify(payload).replace(/--/g, "-\\u002d")}${CLOSE}`;
|
|
14852
14974
|
}, "render");
|
|
14853
14975
|
const total = ledger.findings.length;
|
|
@@ -14872,19 +14994,28 @@ function parseLedger(body) {
|
|
|
14872
14994
|
return null;
|
|
14873
14995
|
}
|
|
14874
14996
|
if (!Array.isArray(raw.findings)) return null;
|
|
14875
|
-
const
|
|
14997
|
+
const valid = raw.findings.filter(
|
|
14876
14998
|
(f) => !!f && typeof f.id === "string" && (f.sev === "C" || f.sev === "S") && typeof f.file === "string" && typeof f.title === "string" && (f.line === void 0 || Number.isInteger(f.line))
|
|
14877
|
-
)
|
|
14999
|
+
);
|
|
15000
|
+
const findings = valid.slice(0, LEDGER_MAX_FINDINGS).map((f) => ({
|
|
14878
15001
|
...f,
|
|
14879
15002
|
title: f.title.slice(0, LEDGER_MAX_TITLE),
|
|
14880
15003
|
file: f.file.slice(0, LEDGER_MAX_FILE)
|
|
14881
15004
|
}));
|
|
14882
|
-
const
|
|
15005
|
+
const declared = Number.isInteger(raw.dropped) && raw.dropped > 0 ? raw.dropped : 0;
|
|
15006
|
+
const dropped = declared + (valid.length - findings.length) || void 0;
|
|
15007
|
+
const sha = (
|
|
15008
|
+
// Normalised on READ as the serializer holds on WRITE: a hand-edited
|
|
15009
|
+
// marker carrying both `dropped` and `sha` would certify a range its
|
|
15010
|
+
// own work list admits is partial.
|
|
15011
|
+
typeof raw.sha === "string" && SHA_RE.test(raw.sha) && !dropped ? raw.sha : void 0
|
|
15012
|
+
);
|
|
14883
15013
|
return {
|
|
14884
15014
|
v: 1,
|
|
14885
15015
|
round: raw.round,
|
|
14886
15016
|
findings,
|
|
14887
|
-
...dropped ? { dropped } : {}
|
|
15017
|
+
...dropped ? { dropped } : {},
|
|
15018
|
+
...sha ? { sha } : {}
|
|
14888
15019
|
};
|
|
14889
15020
|
} catch {
|
|
14890
15021
|
return null;
|
|
@@ -14943,6 +15074,14 @@ function reviewFooter(modelId, cliVersion) {
|
|
|
14943
15074
|
}
|
|
14944
15075
|
__name(reviewFooter, "reviewFooter");
|
|
14945
15076
|
var REVIEW_FOOTER_RE = /\s*(?:_— (?:(?! via Qwen Code \/review)[^\n])* via Qwen Code \/review(?: \(v[^\n)]*\))?_?\s*)+$/;
|
|
15077
|
+
var STRIP_TAIL_LIMIT = 8192;
|
|
15078
|
+
function stripReviewFooter(body) {
|
|
15079
|
+
if (!body.includes(FOOTER_MARKER)) return body;
|
|
15080
|
+
const tail2 = body.slice(-STRIP_TAIL_LIMIT);
|
|
15081
|
+
const stripped = tail2.replace(REVIEW_FOOTER_RE, "");
|
|
15082
|
+
return stripped === tail2 ? body : body.slice(0, body.length - tail2.length) + stripped;
|
|
15083
|
+
}
|
|
15084
|
+
__name(stripReviewFooter, "stripReviewFooter");
|
|
14946
15085
|
function isFooterSafeModelId(modelId) {
|
|
14947
15086
|
return !/[\n\r]/.test(modelId) && !modelId.includes(FOOTER_MARKER);
|
|
14948
15087
|
}
|
|
@@ -15056,10 +15195,6 @@ function toStringList(value, field) {
|
|
|
15056
15195
|
return [...value];
|
|
15057
15196
|
}
|
|
15058
15197
|
__name(toStringList, "toStringList");
|
|
15059
|
-
function stripReviewFooter(entry) {
|
|
15060
|
-
return entry.includes(FOOTER_MARKER) ? entry.replace(REVIEW_FOOTER_RE, "") : entry;
|
|
15061
|
-
}
|
|
15062
|
-
__name(stripReviewFooter, "stripReviewFooter");
|
|
15063
15198
|
function toBool(value, field) {
|
|
15064
15199
|
if (value === void 0 || value === null) return false;
|
|
15065
15200
|
if (typeof value !== "boolean") {
|
|
@@ -15070,15 +15205,15 @@ function toBool(value, field) {
|
|
|
15070
15205
|
return value;
|
|
15071
15206
|
}
|
|
15072
15207
|
__name(toBool, "toBool");
|
|
15073
|
-
function composeReview(input, cliVersion = "unknown") {
|
|
15074
|
-
const result = composeReviewBody(input, cliVersion);
|
|
15075
|
-
const marker = ledgerMarkerFor(input);
|
|
15208
|
+
function composeReview(input, cliVersion = "unknown", attribution = true) {
|
|
15209
|
+
const result = composeReviewBody(input, cliVersion, attribution);
|
|
15210
|
+
const marker = ledgerMarkerFor(input, result.cappedBy);
|
|
15076
15211
|
return marker ? { ...result, body: `${result.body}
|
|
15077
15212
|
|
|
15078
15213
|
${marker}` } : result;
|
|
15079
15214
|
}
|
|
15080
15215
|
__name(composeReview, "composeReview");
|
|
15081
|
-
function ledgerMarkerFor(input) {
|
|
15216
|
+
function ledgerMarkerFor(input, cappedBy) {
|
|
15082
15217
|
try {
|
|
15083
15218
|
if (!input.planPath) return null;
|
|
15084
15219
|
const plan = JSON.parse(readFileSync13(input.planPath, "utf8"));
|
|
@@ -15100,19 +15235,22 @@ function ledgerMarkerFor(input) {
|
|
|
15100
15235
|
prevRound = prev.round;
|
|
15101
15236
|
} catch {
|
|
15102
15237
|
}
|
|
15103
|
-
|
|
15104
|
-
|
|
15238
|
+
const failClosed = (input.cannotTellCriticals?.length ?? 0) > 0 || cappedBy.length > 0;
|
|
15239
|
+
const sha = !failClosed && typeof plan.fetchedSha === "string" ? plan.fetchedSha : void 0;
|
|
15240
|
+
return serializeLedger({
|
|
15241
|
+
...buildLedger(
|
|
15105
15242
|
prevRound + 1,
|
|
15106
15243
|
input.draftedComments ?? [],
|
|
15107
15244
|
toStringList(input.bodyCriticals, "bodyCriticals").map(stripReviewFooter).filter((entry) => entry.trim() !== "")
|
|
15108
|
-
)
|
|
15109
|
-
|
|
15245
|
+
),
|
|
15246
|
+
...sha ? { sha } : {}
|
|
15247
|
+
});
|
|
15110
15248
|
} catch {
|
|
15111
15249
|
return null;
|
|
15112
15250
|
}
|
|
15113
15251
|
}
|
|
15114
15252
|
__name(ledgerMarkerFor, "ledgerMarkerFor");
|
|
15115
|
-
function composeReviewBody(input, cliVersion) {
|
|
15253
|
+
function composeReviewBody(input, cliVersion, attribution) {
|
|
15116
15254
|
const criticalsInline = toCount(input.criticalsInline, "criticalsInline");
|
|
15117
15255
|
const suggestionsInline = toCount(
|
|
15118
15256
|
input.suggestionsInline,
|
|
@@ -15343,15 +15481,19 @@ function composeReviewBody(input, cliVersion) {
|
|
|
15343
15481
|
"presubmit.downgradeReasons"
|
|
15344
15482
|
);
|
|
15345
15483
|
const modelId = input.modelId;
|
|
15346
|
-
|
|
15347
|
-
|
|
15348
|
-
|
|
15349
|
-
|
|
15350
|
-
|
|
15351
|
-
|
|
15352
|
-
|
|
15353
|
-
|
|
15354
|
-
|
|
15484
|
+
let footer = "";
|
|
15485
|
+
if (attribution) {
|
|
15486
|
+
if (typeof modelId !== "string" || modelId.trim() === "") {
|
|
15487
|
+
throw new TypeError(
|
|
15488
|
+
"compose-review: modelId is required (the public footer names the reviewing model)"
|
|
15489
|
+
);
|
|
15490
|
+
}
|
|
15491
|
+
if (!isFooterSafeModelId(modelId)) {
|
|
15492
|
+
throw new TypeError(
|
|
15493
|
+
"compose-review: modelId is interpolated into the public footer verbatim \u2014 it must be a single line that does not contain the footer marker"
|
|
15494
|
+
);
|
|
15495
|
+
}
|
|
15496
|
+
footer = reviewFooter(modelId, cliVersion);
|
|
15355
15497
|
}
|
|
15356
15498
|
const c = criticalsInline + bodyCriticals.length;
|
|
15357
15499
|
const s = suggestionsInline + suggestionsDiscarded;
|
|
@@ -15399,7 +15541,6 @@ function composeReviewBody(input, cliVersion) {
|
|
|
15399
15541
|
}
|
|
15400
15542
|
}
|
|
15401
15543
|
}
|
|
15402
|
-
const footer = reviewFooter(modelId, cliVersion);
|
|
15403
15544
|
const bilingual = bilingualFromPlan(input.planPath, input.prBodyFetcher);
|
|
15404
15545
|
const render = /* @__PURE__ */ __name((parts, sep9) => {
|
|
15405
15546
|
const en = parts.map((p) => p.en).join(sep9);
|
|
@@ -15413,7 +15554,7 @@ function composeReviewBody(input, cliVersion) {
|
|
|
15413
15554
|
${zh}
|
|
15414
15555
|
|
|
15415
15556
|
</details>` : en;
|
|
15416
|
-
return `${text2}
|
|
15557
|
+
return footer === "" ? text2 : `${text2}
|
|
15417
15558
|
|
|
15418
15559
|
${footer}`;
|
|
15419
15560
|
}, "render");
|
|
@@ -15999,7 +16140,8 @@ var composeReviewCommand = {
|
|
|
15999
16140
|
},
|
|
16000
16141
|
// Same pin as `submit`: the startup stamp, not a version resolved at
|
|
16001
16142
|
// compose time — a shared runner can rewrite the install mid-session.
|
|
16002
|
-
footerVersion(process.env["QWEN_CODE_STARTUP_VERSION"]) ?? await getCliVersion()
|
|
16143
|
+
footerVersion(process.env["QWEN_CODE_STARTUP_VERSION"]) ?? await getCliVersion(),
|
|
16144
|
+
operatorReviewSettings().attribution
|
|
16003
16145
|
);
|
|
16004
16146
|
const json = JSON.stringify(
|
|
16005
16147
|
{ ...result, verdictLine: verdictLine(result) },
|
|
@@ -17939,7 +18081,7 @@ function renderLedgerSection(ledger) {
|
|
|
17939
18081
|
return [
|
|
17940
18082
|
"## Previous /review round (machine ledger)",
|
|
17941
18083
|
"",
|
|
17942
|
-
`Round ${ledger.round}, recovered from the marker this account's last posted review carried. **Every entry below is owed a this-round ruling** (fixed / still stands / cannot tell) under Step 6's previous-round rules \u2014 the ledger is a work list, not a verdict; re-assert each claim against the code before repeating or retiring it
|
|
18084
|
+
`Round ${ledger.round}${ledger.sha ? `, reviewed at \`${code2(ledger.sha)}\`` : ""}, recovered from the marker this account's last posted review carried. **Every entry below is owed a this-round ruling** (fixed / still stands / cannot tell / superseded by <class-id>) under Step 6's previous-round rules \u2014 the ledger is a work list, not a verdict; re-assert each claim against the code before repeating or retiring it.${ledger.sha ? ` The reviewed-at sha is the incremental anchor Step 1's recovered-anchor check reads from the side file \u2014 validate it is an ancestor of the fetched head before scoping to it.` : ""}`,
|
|
17943
18085
|
// A truncated ledger must not read like a complete one. `dropped` exists
|
|
17944
18086
|
// to draw that line, and this is the only place a reader sees the list.
|
|
17945
18087
|
...ledger.dropped ? [
|
|
@@ -18867,7 +19009,7 @@ async function runPresubmit(args) {
|
|
|
18867
19009
|
`repos/${owner}/${repo}/pulls/${prNumber}/comments`
|
|
18868
19010
|
);
|
|
18869
19011
|
const qwenComments = allComments.filter(
|
|
18870
|
-
(c) => /via Qwen Code \/review/.test(c.body ?? "")
|
|
19012
|
+
(c) => /via Qwen Code \/review/.test(c.body ?? "") || !c.in_reply_to_id && me !== "" && (c.user?.login ?? "").toLowerCase() === me.toLowerCase() && severityOf(c) !== null
|
|
18871
19013
|
);
|
|
18872
19014
|
const repliedToIds = /* @__PURE__ */ new Set();
|
|
18873
19015
|
for (const c of allComments) {
|
|
@@ -19117,14 +19259,15 @@ function reviewWriteAuthorization(req) {
|
|
|
19117
19259
|
} catch {
|
|
19118
19260
|
return {
|
|
19119
19261
|
ok: false,
|
|
19120
|
-
why: `no review arguments were recorded at ${path3}, so this run cannot show that \`--comment\` was requested`
|
|
19262
|
+
why: req.defaultComment === true ? `no review arguments were recorded at ${path3}, so no recorded invocation names a pull request to bind this write to \u2014 re-run the review naming the pull request` : `no review arguments were recorded at ${path3}, so this run cannot show that \`--comment\` was requested`
|
|
19121
19263
|
};
|
|
19122
19264
|
}
|
|
19123
|
-
const verdict = parseReviewArgs(raw);
|
|
19265
|
+
const verdict = parseReviewArgs(raw, { comment: req.defaultComment });
|
|
19124
19266
|
if (!verdict.comment.effective) {
|
|
19267
|
+
const commentRequested = verdict.comment.requested || req.defaultComment === true;
|
|
19125
19268
|
return {
|
|
19126
19269
|
ok: false,
|
|
19127
|
-
why: `\`--comment\` was not in the review arguments (${JSON.stringify(raw.trim())})`
|
|
19270
|
+
why: commentRequested ? `the review arguments (${JSON.stringify(raw.trim())}) do not name a pull request, so they cannot authorise posting to one` : `\`--comment\` was not in the review arguments (${JSON.stringify(raw.trim())})`
|
|
19128
19271
|
};
|
|
19129
19272
|
}
|
|
19130
19273
|
const t2 = verdict.target;
|
|
@@ -19161,7 +19304,7 @@ function reviewWriteAuthorization(req) {
|
|
|
19161
19304
|
}
|
|
19162
19305
|
return {
|
|
19163
19306
|
ok: true,
|
|
19164
|
-
why: `\`--comment\` was in the review arguments for #${authorisedPr}`
|
|
19307
|
+
why: verdict.comment.requested ? `\`--comment\` was in the review arguments for #${authorisedPr}` : `\`review.comment\` is enabled in settings, and the review arguments name #${authorisedPr}`
|
|
19165
19308
|
};
|
|
19166
19309
|
}
|
|
19167
19310
|
__name(reviewWriteAuthorization, "reviewWriteAuthorization");
|
|
@@ -19403,6 +19546,7 @@ function runPublishAssets(args) {
|
|
|
19403
19546
|
const effectiveHost = resolveGhHost(args.host);
|
|
19404
19547
|
const auth = reviewWriteAuthorization({
|
|
19405
19548
|
userAuthorized: args.userAuthorized,
|
|
19549
|
+
defaultComment: args.defaultComment,
|
|
19406
19550
|
skillArgs: args.skillArgs,
|
|
19407
19551
|
pr: args.pr,
|
|
19408
19552
|
// Bind the REVIEWED repo when the caller names it, never the assets repo:
|
|
@@ -19609,7 +19753,11 @@ var publishAssetsCommand = {
|
|
|
19609
19753
|
out: argv["out"],
|
|
19610
19754
|
host: argv["host"],
|
|
19611
19755
|
userAuthorized: Boolean(argv["user-authorized"]),
|
|
19612
|
-
skillArgs: argv["skill-args"]
|
|
19756
|
+
skillArgs: argv["skill-args"],
|
|
19757
|
+
// The same operator-scope resolution as `submit`: the two callers of
|
|
19758
|
+
// the shared gate must agree on what authorises a run, or a run that
|
|
19759
|
+
// posts the review still refuses to publish its evidence images.
|
|
19760
|
+
defaultComment: operatorReviewSettings().comment
|
|
19613
19761
|
});
|
|
19614
19762
|
}, "handler")
|
|
19615
19763
|
};
|
|
@@ -20289,7 +20437,7 @@ function toolBudgetBlock(report, launch) {
|
|
|
20289
20437
|
"",
|
|
20290
20438
|
"## Tool budget",
|
|
20291
20439
|
"",
|
|
20292
|
-
`About **${total} tool calls** for this whole review \u2014 reads, greps, shell, everything \u2014 and the ~${reads} reads your launch is assigned (your brief, the diff pages, any files your method mandates) are already counted in. It is a soft ceiling. At the ceiling: stop exploring, write your findings from the evidence already in hand, and disclose each unfinished check on its own line, exactly as \`Budget gap: <the check>\` \u2014 the coverage tool reads those lines, so the format is load-bearing. The budget never suppresses a finding: a candidate you can already name goes in your return regardless (at \`Confidence: low\` if the budget stopped you before verifying it).`
|
|
20440
|
+
`About **${total} tool calls** for this whole review \u2014 reads, greps, shell, everything \u2014 and the ~${reads} reads your launch is assigned (your brief, the diff pages, any files your method mandates) are already counted in. It is a soft ceiling. At the ceiling: stop exploring, write your findings from the evidence already in hand, and disclose each unfinished check on its own line, exactly as \`Budget gap: <the check>\` \u2014 the coverage tool reads those lines, so the format is load-bearing. If nothing was cut short, write NO \`Budget gap:\` line at all \u2014 the format is only for checks the ceiling stopped: a "none" put there is at best filtered out, and any wording the filter does not recognize is published in the review body as a phantom coverage gap. The budget never suppresses a finding: a candidate you can already name goes in your return regardless (at \`Confidence: low\` if the budget stopped you before verifying it).`
|
|
20293
20441
|
];
|
|
20294
20442
|
}
|
|
20295
20443
|
__name(toolBudgetBlock, "toolBudgetBlock");
|
|
@@ -20318,6 +20466,7 @@ function buildChunkAgentPrompt(report, id, rules) {
|
|
|
20318
20466
|
"",
|
|
20319
20467
|
` Uncoverable: chunk ${chunk2.id} \u2014 line exceeds the read limit`
|
|
20320
20468
|
);
|
|
20469
|
+
return parts.join("\n");
|
|
20321
20470
|
} else if (chunk2.oversized) {
|
|
20322
20471
|
parts.push(
|
|
20323
20472
|
"",
|
|
@@ -20332,6 +20481,8 @@ function buildChunkAgentPrompt(report, id, rules) {
|
|
|
20332
20481
|
"",
|
|
20333
20482
|
"For your territory only, you own every dimension: line-by-line correctness, the removed-behavior audit of your own deleted lines, security, code quality, performance, test coverage, and the adversarial reading. Two duties are NOT yours, because a chunk agent is structurally blind to them: cross-file tracing (a caller in another chunk) and the cross-chunk half of removed-behavior. Audit the deletions in your own territory; do not conclude a deletion is unreplaced merely because its replacement is not in your range.",
|
|
20334
20483
|
"",
|
|
20484
|
+
"**Shape check (part of code quality \u2014 the altitude lens, scoped to your territory).** For the code in YOUR chunk: " + ENUMERATION_TRAP_LENS,
|
|
20485
|
+
"",
|
|
20335
20486
|
FINDING_FORMAT,
|
|
20336
20487
|
"",
|
|
20337
20488
|
SEVERITY,
|
|
@@ -23840,9 +23991,8 @@ function isDiffLine(n) {
|
|
|
23840
23991
|
return typeof n === "number" && Number.isSafeInteger(n) && n > 0;
|
|
23841
23992
|
}
|
|
23842
23993
|
__name(isDiffLine, "isDiffLine");
|
|
23843
|
-
function normalizeInlineComments(comments, modelId, cliVersion) {
|
|
23844
|
-
|
|
23845
|
-
const footer = reviewFooter(modelId, cliVersion);
|
|
23994
|
+
function normalizeInlineComments(comments, modelId, cliVersion, attribution) {
|
|
23995
|
+
const footer = attribution && typeof modelId === "string" && modelId.trim() !== "" ? reviewFooter(modelId, cliVersion) : void 0;
|
|
23846
23996
|
return comments.map(
|
|
23847
23997
|
(comment2) => (
|
|
23848
23998
|
// An empty body stays empty: this runs BEFORE the consistency check, and
|
|
@@ -23850,7 +24000,9 @@ function normalizeInlineComments(comments, modelId, cliVersion) {
|
|
|
23850
24000
|
// names it ('has no body — an empty comment').
|
|
23851
24001
|
typeof comment2.body === "string" && comment2.body.trim() !== "" ? {
|
|
23852
24002
|
...comment2,
|
|
23853
|
-
|
|
24003
|
+
// Forged footers are stripped even with attribution off: a comment
|
|
24004
|
+
// authored by the model must not carry one the operator turned off.
|
|
24005
|
+
body: footer === void 0 ? stripReviewFooter(comment2.body) : `${stripReviewFooter(comment2.body)}
|
|
23854
24006
|
|
|
23855
24007
|
${footer}`
|
|
23856
24008
|
} : comment2
|
|
@@ -23858,9 +24010,10 @@ ${footer}`
|
|
|
23858
24010
|
);
|
|
23859
24011
|
}
|
|
23860
24012
|
__name(normalizeInlineComments, "normalizeInlineComments");
|
|
23861
|
-
function authorization(args) {
|
|
24013
|
+
function authorization(args, defaultComment) {
|
|
23862
24014
|
return reviewWriteAuthorization({
|
|
23863
24015
|
userAuthorized: args.userAuthorized,
|
|
24016
|
+
defaultComment,
|
|
23864
24017
|
skillArgs: args.skillArgs,
|
|
23865
24018
|
pr: args.pr,
|
|
23866
24019
|
repo: args.repo,
|
|
@@ -23871,7 +24024,7 @@ function authorization(args) {
|
|
|
23871
24024
|
});
|
|
23872
24025
|
}
|
|
23873
24026
|
__name(authorization, "authorization");
|
|
23874
|
-
function compose(payload, cliVersion) {
|
|
24027
|
+
function compose(payload, cliVersion, attribution) {
|
|
23875
24028
|
const comments = payload.comments ?? [];
|
|
23876
24029
|
const state = payload.state ?? {};
|
|
23877
24030
|
const { criticalsInline, suggestionsInline } = countInlineFindings(comments);
|
|
@@ -23891,7 +24044,8 @@ function compose(payload, cliVersion) {
|
|
|
23891
24044
|
suggestionsInline,
|
|
23892
24045
|
draftedComments: comments
|
|
23893
24046
|
},
|
|
23894
|
-
cliVersion
|
|
24047
|
+
cliVersion,
|
|
24048
|
+
attribution
|
|
23895
24049
|
);
|
|
23896
24050
|
return { event: r.event, body: r.body, cappedBy: r.cappedBy };
|
|
23897
24051
|
}
|
|
@@ -23971,7 +24125,8 @@ function inconsistencies(payload, event2) {
|
|
|
23971
24125
|
return problems;
|
|
23972
24126
|
}
|
|
23973
24127
|
__name(inconsistencies, "inconsistencies");
|
|
23974
|
-
function runSubmit(args, cliVersion = "unknown") {
|
|
24128
|
+
function runSubmit(args, cliVersion = "unknown", opts = {}) {
|
|
24129
|
+
const { attribution = true, defaultComment = false } = opts;
|
|
23975
24130
|
setGhHost(args.host);
|
|
23976
24131
|
if (!isOwnerRepo(args.repo)) {
|
|
23977
24132
|
throw new Error(
|
|
@@ -23991,11 +24146,12 @@ function runSubmit(args, cliVersion = "unknown") {
|
|
|
23991
24146
|
`Cannot read review JSON ${args.review}: ${err.message}`
|
|
23992
24147
|
);
|
|
23993
24148
|
}
|
|
23994
|
-
const auth = authorization(args);
|
|
24149
|
+
const auth = authorization(args, defaultComment);
|
|
23995
24150
|
if (!auth.ok) {
|
|
24151
|
+
const advice = auth.why.includes("`--comment` was") ? `This is the correct outcome of a review the user did not ask to publish \u2014 report the findings in the terminal and stop. Re-run with \`--comment\`, or pass --user-authorized only after the user has asked, in a message they typed, for this review to be published.` : `Nothing recorded authorises binding this target \u2014 report the findings in the terminal and stop. Posting to this pull request needs a review invoked naming it, or --user-authorized after the user has asked, in a message they typed, for this review to be published.`;
|
|
23996
24152
|
writeStderrLine(
|
|
23997
24153
|
`REFUSED to post to ${args.repo}#${args.pr}: ${auth.why}.
|
|
23998
|
-
Posting is a public, irreversible write, and this run has no authorisation for one.
|
|
24154
|
+
Posting is a public, irreversible write, and this run has no authorisation for one. ${advice}`
|
|
23999
24155
|
);
|
|
24000
24156
|
writeStdoutLine(
|
|
24001
24157
|
JSON.stringify({ posted: false, reason: auth.why }, null, 2)
|
|
@@ -24015,14 +24171,15 @@ Posting is a public, irreversible write, and this run has no authorisation for o
|
|
|
24015
24171
|
comments: normalizeInlineComments(
|
|
24016
24172
|
payload.comments ?? [],
|
|
24017
24173
|
payload.state?.modelId,
|
|
24018
|
-
cliVersion
|
|
24174
|
+
cliVersion,
|
|
24175
|
+
attribution
|
|
24019
24176
|
)
|
|
24020
24177
|
};
|
|
24021
24178
|
let event2;
|
|
24022
24179
|
let body;
|
|
24023
24180
|
let cappedBy;
|
|
24024
24181
|
try {
|
|
24025
|
-
({ event: event2, body, cappedBy } = compose(payload, cliVersion));
|
|
24182
|
+
({ event: event2, body, cappedBy } = compose(payload, cliVersion, attribution));
|
|
24026
24183
|
} catch (err) {
|
|
24027
24184
|
throw new Error(
|
|
24028
24185
|
`The review state does not compose into a verdict; refusing to post:
|
|
@@ -24122,7 +24279,7 @@ var submitCommand = {
|
|
|
24122
24279
|
describe: "Path to the review JSON (commit_id / comments / state). event and body are computed here from state and the comments \u2014 do not include them."
|
|
24123
24280
|
}).option("skill-args", {
|
|
24124
24281
|
type: "string",
|
|
24125
|
-
describe: "Path to the CLI-written record of the review's invocation arguments (defaults to .qwen/tmp/qwen-skill-args-review.txt). Its `--comment` is what authorises a post. Deliberately NOT the parser's JSON output: that is a document the caller writes, and a caller that wants to post can write anything in it."
|
|
24282
|
+
describe: "Path to the CLI-written record of the review's invocation arguments (defaults to .qwen/tmp/qwen-skill-args-review.txt). Its `--comment` \u2014 or the standing `review.comment` setting \u2014 is what authorises a post. Deliberately NOT the parser's JSON output: that is a document the caller writes, and a caller that wants to post can write anything in it."
|
|
24126
24283
|
}).option("user-authorized", {
|
|
24127
24284
|
type: "boolean",
|
|
24128
24285
|
default: false,
|
|
@@ -24137,7 +24294,11 @@ var submitCommand = {
|
|
|
24137
24294
|
}), "builder"),
|
|
24138
24295
|
handler: /* @__PURE__ */ __name(async (argv) => {
|
|
24139
24296
|
const cliVersion = footerVersion(process.env["QWEN_CODE_STARTUP_VERSION"]) ?? await getCliVersion();
|
|
24140
|
-
|
|
24297
|
+
const review = operatorReviewSettings();
|
|
24298
|
+
runSubmit(argv, cliVersion, {
|
|
24299
|
+
attribution: review.attribution,
|
|
24300
|
+
defaultComment: review.comment
|
|
24301
|
+
});
|
|
24141
24302
|
}, "handler")
|
|
24142
24303
|
};
|
|
24143
24304
|
|
|
@@ -26314,23 +26475,14 @@ var AUDIT_BRIEF_RE = /read_file\(file_path="[^"]*reverse-audit--chunk-(\d+)--rou
|
|
|
26314
26475
|
function labelOf(launch, fallback) {
|
|
26315
26476
|
const nl = launch.indexOf("\n");
|
|
26316
26477
|
const identity = nl === -1 ? launch : launch.slice(0, nl);
|
|
26317
|
-
|
|
26478
|
+
const parsed = labelFromIdentityLine(identity);
|
|
26479
|
+
if (parsed === null) return fallback;
|
|
26318
26480
|
let auditChunk = null;
|
|
26319
26481
|
for (const m of launch.matchAll(AUDIT_BRIEF_RE)) auditChunk = m;
|
|
26320
26482
|
if (auditChunk) {
|
|
26321
26483
|
return `audit chunk ${auditChunk[1]} (round ${auditChunk[2]})`;
|
|
26322
26484
|
}
|
|
26323
|
-
|
|
26324
|
-
if (!role) return fallback;
|
|
26325
|
-
const round = /\(round (\d+)\)/.exec(identity);
|
|
26326
|
-
const chunk2 = CHUNK_RE.exec(role[1]);
|
|
26327
|
-
if (chunk2) return `chunk ${chunk2[1]}`;
|
|
26328
|
-
if (round) {
|
|
26329
|
-
return `agent ${role[1]} (round ${round[1]})`;
|
|
26330
|
-
}
|
|
26331
|
-
const file = /Your file: `([^`]+)`/.exec(identity);
|
|
26332
|
-
if (file) return `agent ${role[1]} (${file[1]})`;
|
|
26333
|
-
return `agent ${role[1]}`;
|
|
26485
|
+
return parsed;
|
|
26334
26486
|
}
|
|
26335
26487
|
__name(labelOf, "labelOf");
|
|
26336
26488
|
function foldEvents(id, label2, events) {
|
|
@@ -26572,7 +26724,50 @@ init_esbuild_shims();
|
|
|
26572
26724
|
import { spawn, execFileSync as execFileSync6 } from "node:child_process";
|
|
26573
26725
|
import { readdirSync as readdirSync9, readFileSync as readFileSync34, realpathSync as realpathSync6, statSync as statSync17 } from "node:fs";
|
|
26574
26726
|
import { dirname as dirname25, join as join24, resolve as resolve26 } from "node:path";
|
|
26575
|
-
|
|
26727
|
+
function classifyRunTarget(target) {
|
|
26728
|
+
if (!target) return { kind: "local" };
|
|
26729
|
+
const { target: t2 } = parseReviewArgs(target);
|
|
26730
|
+
if (t2.type === "pr-number" || t2.type === "pr-url") {
|
|
26731
|
+
return { kind: "pr", number: String(t2.number) };
|
|
26732
|
+
}
|
|
26733
|
+
if (t2.type === "file") {
|
|
26734
|
+
const trimmed = t2.path.replace(/[\\/]+$/, "");
|
|
26735
|
+
return { kind: "file", base: trimmed.split(/[\\/]/).pop() || trimmed };
|
|
26736
|
+
}
|
|
26737
|
+
return { kind: "local" };
|
|
26738
|
+
}
|
|
26739
|
+
__name(classifyRunTarget, "classifyRunTarget");
|
|
26740
|
+
var escapeRe = /* @__PURE__ */ __name((s) => s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "escapeRe");
|
|
26741
|
+
function composedNameFor(cls) {
|
|
26742
|
+
switch (cls.kind) {
|
|
26743
|
+
case "pr":
|
|
26744
|
+
return `qwen-review-pr-${cls.number}-composed.json`;
|
|
26745
|
+
case "file":
|
|
26746
|
+
return `qwen-review-${cls.base}-composed.json`;
|
|
26747
|
+
case "local":
|
|
26748
|
+
default:
|
|
26749
|
+
return "qwen-review-local-composed.json";
|
|
26750
|
+
}
|
|
26751
|
+
}
|
|
26752
|
+
__name(composedNameFor, "composedNameFor");
|
|
26753
|
+
function composedPatternFor(cls) {
|
|
26754
|
+
return new RegExp(`^${escapeRe(composedNameFor(cls))}$`);
|
|
26755
|
+
}
|
|
26756
|
+
__name(composedPatternFor, "composedPatternFor");
|
|
26757
|
+
function reportPatternFor(cls) {
|
|
26758
|
+
switch (cls.kind) {
|
|
26759
|
+
case "pr":
|
|
26760
|
+
return new RegExp(`-pr-${cls.number}\\.md$`);
|
|
26761
|
+
case "file":
|
|
26762
|
+
return new RegExp(
|
|
26763
|
+
cls.base.toLowerCase().endsWith(".md") ? `-${escapeRe(cls.base)}$` : `-${escapeRe(cls.base)}\\.md$`
|
|
26764
|
+
);
|
|
26765
|
+
case "local":
|
|
26766
|
+
default:
|
|
26767
|
+
return /^(?!.*-pr-\d+\.md$).*\.md$/;
|
|
26768
|
+
}
|
|
26769
|
+
}
|
|
26770
|
+
__name(reportPatternFor, "reportPatternFor");
|
|
26576
26771
|
var COMPOSED_POLL_MS = 250;
|
|
26577
26772
|
var SIGNAL_EXIT_CODES = {
|
|
26578
26773
|
SIGHUP: 129,
|
|
@@ -26582,8 +26777,12 @@ var SIGNAL_EXIT_CODES = {
|
|
|
26582
26777
|
var PARENT_SIGNALS = Object.keys(SIGNAL_EXIT_CODES);
|
|
26583
26778
|
function buildReviewPrompt(args) {
|
|
26584
26779
|
const parts = ["/review"];
|
|
26585
|
-
if (args.target) {
|
|
26586
|
-
if (/\s/.test(args.target) || args.target.startsWith("-") || /['"]/.test(args.target))
|
|
26780
|
+
if (args.target !== void 0) {
|
|
26781
|
+
if (args.target.trim() === "" || /\s/.test(args.target) || args.target.startsWith("-") || /['"]/.test(args.target) || // A separators-only path (`/`, `//`, `\`) names no file: it survives
|
|
26782
|
+
// basename extraction as the empty string, which pins the unmatchable
|
|
26783
|
+
// `qwen-review--composed.json` and burns a whole child review before
|
|
26784
|
+
// reporting "no composed verdict". Refuse it here instead.
|
|
26785
|
+
/^[\\/]+$/.test(args.target)) {
|
|
26587
26786
|
throw new Error(
|
|
26588
26787
|
`Invalid review target ${JSON.stringify(args.target)}: expected a single PR number, PR URL, or file path`
|
|
26589
26788
|
);
|
|
@@ -26615,7 +26814,7 @@ function newestArtifactSince(dir, pattern, startMs) {
|
|
|
26615
26814
|
if (mtime < startMs) continue;
|
|
26616
26815
|
if (!best || mtime > best.mtime) best = { path: path3, mtime };
|
|
26617
26816
|
}
|
|
26618
|
-
return best
|
|
26817
|
+
return best;
|
|
26619
26818
|
}
|
|
26620
26819
|
__name(newestArtifactSince, "newestArtifactSince");
|
|
26621
26820
|
function exitCodeFor(completed, event2, failOn) {
|
|
@@ -26705,20 +26904,19 @@ async function runReview(args) {
|
|
|
26705
26904
|
child.stdout?.resume();
|
|
26706
26905
|
child.stderr?.resume();
|
|
26707
26906
|
}
|
|
26907
|
+
const targetClass = classifyRunTarget(args.target);
|
|
26908
|
+
const composedPattern = composedPatternFor(targetClass);
|
|
26708
26909
|
let capturedPath = null;
|
|
26709
26910
|
let capturedVerdict = null;
|
|
26911
|
+
let capturedMtime = -Infinity;
|
|
26710
26912
|
const captureTimer = setInterval(() => {
|
|
26711
|
-
|
|
26712
|
-
|
|
26713
|
-
|
|
26714
|
-
COMPOSED_PATTERN,
|
|
26715
|
-
cutoffMs
|
|
26716
|
-
);
|
|
26717
|
-
if (path3 === null) return;
|
|
26718
|
-
const verdict = readComposed(path3);
|
|
26913
|
+
const best = newestArtifactSince(REVIEW_TMP_DIR, composedPattern, cutoffMs);
|
|
26914
|
+
if (best === null || best.mtime <= capturedMtime) return;
|
|
26915
|
+
const verdict = readComposed(best.path);
|
|
26719
26916
|
if (verdict !== null) {
|
|
26720
|
-
capturedPath =
|
|
26917
|
+
capturedPath = best.path;
|
|
26721
26918
|
capturedVerdict = verdict;
|
|
26919
|
+
capturedMtime = best.mtime;
|
|
26722
26920
|
}
|
|
26723
26921
|
}, COMPOSED_POLL_MS);
|
|
26724
26922
|
let timedOut = false;
|
|
@@ -26761,14 +26959,11 @@ async function runReview(args) {
|
|
|
26761
26959
|
let composedPath = capturedPath;
|
|
26762
26960
|
let composed = capturedVerdict;
|
|
26763
26961
|
if (composed === null) {
|
|
26764
|
-
|
|
26765
|
-
|
|
26766
|
-
COMPOSED_PATTERN,
|
|
26767
|
-
cutoffMs
|
|
26768
|
-
);
|
|
26962
|
+
const best = newestArtifactSince(REVIEW_TMP_DIR, composedPattern, cutoffMs);
|
|
26963
|
+
composedPath = best?.path ?? null;
|
|
26769
26964
|
composed = composedPath ? readComposed(composedPath) : null;
|
|
26770
26965
|
}
|
|
26771
|
-
const reportPath = newestArtifactSince(REVIEWS_DIR,
|
|
26966
|
+
const reportPath = newestArtifactSince(REVIEWS_DIR, reportPatternFor(targetClass), cutoffMs)?.path ?? null;
|
|
26772
26967
|
const completed = composed !== null;
|
|
26773
26968
|
const result = {
|
|
26774
26969
|
completed,
|
|
@@ -26780,6 +26975,7 @@ async function runReview(args) {
|
|
|
26780
26975
|
downgradedFrom: composed?.downgradedFrom ?? null,
|
|
26781
26976
|
remediation: composed?.remediation ?? [],
|
|
26782
26977
|
composedPath: composedPath ? resolve26(composedPath) : null,
|
|
26978
|
+
expectedComposedName: composedNameFor(targetClass),
|
|
26783
26979
|
reportPath: reportPath ? resolve26(reportPath) : null,
|
|
26784
26980
|
childExitCode,
|
|
26785
26981
|
childSignal,
|
|
@@ -26794,7 +26990,10 @@ async function runReview(args) {
|
|
|
26794
26990
|
writeStdoutLine(result.verdictLine ?? `Event: ${result.event}`);
|
|
26795
26991
|
if (result.reportPath) writeStdoutLine(`Report: ${result.reportPath}`);
|
|
26796
26992
|
} else {
|
|
26797
|
-
const detail = composedPath !== null ? `a composed verdict was found at ${resolve26(composedPath)} but could not be parsed` :
|
|
26993
|
+
const detail = composedPath !== null ? `a composed verdict was found at ${resolve26(composedPath)} but could not be parsed` : `no composed verdict was produced (expected ${join24(
|
|
26994
|
+
REVIEW_TMP_DIR,
|
|
26995
|
+
composedNameFor(targetClass)
|
|
26996
|
+
)})`;
|
|
26798
26997
|
writeStdoutLine(
|
|
26799
26998
|
timedOut ? "Review did not complete: timed out." : `Review did not complete: ${detail}${childExitCode !== null ? ` (CLI exit ${childExitCode})` : ""}${childSignal !== null ? ` (killed by ${childSignal})` : ""}.`
|
|
26800
26999
|
);
|
|
@@ -27361,10 +27560,10 @@ var updateCommand3 = {
|
|
|
27361
27560
|
stdioHelpers,
|
|
27362
27561
|
{ updateEventEmitter }
|
|
27363
27562
|
] = await Promise.all([
|
|
27364
|
-
import("./settings-
|
|
27365
|
-
import("./updateCheck-
|
|
27366
|
-
import("./installationInfo-
|
|
27367
|
-
import("./standalone-update-
|
|
27563
|
+
import("./settings-CSYVIP2R.js"),
|
|
27564
|
+
import("./updateCheck-QJI2SYWF.js"),
|
|
27565
|
+
import("./installationInfo-P7OTIR4P.js"),
|
|
27566
|
+
import("./standalone-update-RB2EGUSF.js"),
|
|
27368
27567
|
import("./stdioHelpers-7A2EE64Z.js"),
|
|
27369
27568
|
import("./updateEventEmitter-5MKC7BLQ.js")
|
|
27370
27569
|
]);
|
|
@@ -28439,6 +28638,9 @@ async function loadCliConfig(settings, argv, cwd = process.cwd(), overrideExtens
|
|
|
28439
28638
|
const screenReader = argv.screenReader !== void 0 ? argv.screenReader : settings.ui?.accessibility?.screenReader ?? false;
|
|
28440
28639
|
let sessionId;
|
|
28441
28640
|
let sessionData;
|
|
28641
|
+
let sessionRestoreProjection;
|
|
28642
|
+
const sessionRestoreProjectionSource = hostPolicy?.sessionRestore?.projectionSource;
|
|
28643
|
+
let deferProjectionUntilWriterLease = false;
|
|
28442
28644
|
if (argv.continue || argv.resume) {
|
|
28443
28645
|
const sessionService = new SessionService(cwd);
|
|
28444
28646
|
if (argv.continue) {
|
|
@@ -28454,8 +28656,19 @@ async function loadCliConfig(settings, argv, cwd = process.cwd(), overrideExtens
|
|
|
28454
28656
|
}
|
|
28455
28657
|
if (argv.resume) {
|
|
28456
28658
|
sessionId = argv.resume;
|
|
28457
|
-
|
|
28458
|
-
if (
|
|
28659
|
+
deferProjectionUntilWriterLease = sessionRestoreProjectionSource !== void 0 && (argv.chatRecording ?? settings.general?.chatRecording ?? true) && isAcpMode === true && settings.experimental?.sessionWriterLease === true;
|
|
28660
|
+
if (sessionRestoreProjectionSource) {
|
|
28661
|
+
if (!deferProjectionUntilWriterLease && !argv.forkSession) {
|
|
28662
|
+
addDaemonRequestAttribute(
|
|
28663
|
+
"qwen-code.daemon.session_restore.projection_acquisition",
|
|
28664
|
+
"preloaded"
|
|
28665
|
+
);
|
|
28666
|
+
sessionRestoreProjection = await sessionRestoreProjectionSource(sessionId);
|
|
28667
|
+
}
|
|
28668
|
+
} else {
|
|
28669
|
+
sessionData = await sessionService.loadSession(argv.resume);
|
|
28670
|
+
}
|
|
28671
|
+
if (!sessionRestoreProjectionSource && !sessionData) {
|
|
28459
28672
|
const message = `No saved session found with ID ${argv.resume}. Run \`qwen --resume\` without an ID to choose from existing sessions.`;
|
|
28460
28673
|
writeStderrLine(message);
|
|
28461
28674
|
process.exit(1);
|
|
@@ -28473,10 +28686,21 @@ async function loadCliConfig(settings, argv, cwd = process.cwd(), overrideExtens
|
|
|
28473
28686
|
process.exit(1);
|
|
28474
28687
|
}
|
|
28475
28688
|
sessionId = forkedSessionId;
|
|
28476
|
-
|
|
28477
|
-
|
|
28478
|
-
|
|
28479
|
-
|
|
28689
|
+
if (sessionRestoreProjectionSource) {
|
|
28690
|
+
sessionData = void 0;
|
|
28691
|
+
if (!deferProjectionUntilWriterLease) {
|
|
28692
|
+
addDaemonRequestAttribute(
|
|
28693
|
+
"qwen-code.daemon.session_restore.projection_acquisition",
|
|
28694
|
+
"preloaded"
|
|
28695
|
+
);
|
|
28696
|
+
sessionRestoreProjection = await sessionRestoreProjectionSource(forkedSessionId);
|
|
28697
|
+
}
|
|
28698
|
+
} else {
|
|
28699
|
+
sessionData = await sessionService.loadSession(forkedSessionId);
|
|
28700
|
+
if (!sessionData) {
|
|
28701
|
+
writeStderrLine(`Failed to load forked session ${forkedSessionId}.`);
|
|
28702
|
+
process.exit(1);
|
|
28703
|
+
}
|
|
28480
28704
|
}
|
|
28481
28705
|
}
|
|
28482
28706
|
} else if (argv.sandboxSessionId) {
|
|
@@ -28502,6 +28726,8 @@ async function loadCliConfig(settings, argv, cwd = process.cwd(), overrideExtens
|
|
|
28502
28726
|
}
|
|
28503
28727
|
const modelProvidersConfig = settings.modelProviders;
|
|
28504
28728
|
const providerProtocolConfig = settings.providerProtocol;
|
|
28729
|
+
const restoreSessionId = sessionId;
|
|
28730
|
+
const boundSessionRestoreProjectionSource = sessionRestoreProjectionSource && restoreSessionId ? () => sessionRestoreProjectionSource(restoreSessionId) : void 0;
|
|
28505
28731
|
const cliMcpServers = parseMcpConfig(argv.mcpConfig);
|
|
28506
28732
|
const topTierMcpServers = sessionMcpServers || cliMcpServers ? { ...sessionMcpServers, ...cliMcpServers ?? {} } : void 0;
|
|
28507
28733
|
const mcpServers = bareMode || safeMode ? { ...topTierMcpServers } : assembleMcpServers(settings.mcpServers, cwd, topTierMcpServers);
|
|
@@ -28509,6 +28735,8 @@ async function loadCliConfig(settings, argv, cwd = process.cwd(), overrideExtens
|
|
|
28509
28735
|
const configParams = {
|
|
28510
28736
|
sessionId,
|
|
28511
28737
|
sessionData,
|
|
28738
|
+
sessionRestoreProjection,
|
|
28739
|
+
sessionRestoreProjectionSource: boundSessionRestoreProjectionSource,
|
|
28512
28740
|
embeddingModel: DEFAULT_QWEN_EMBEDDING_MODEL,
|
|
28513
28741
|
sandbox: sandboxConfig,
|
|
28514
28742
|
targetDir: cwd,
|
|
@@ -28526,7 +28754,7 @@ async function loadCliConfig(settings, argv, cwd = process.cwd(), overrideExtens
|
|
|
28526
28754
|
disabledSlashCommands: disabledSlashCommands.length > 0 ? disabledSlashCommands : void 0,
|
|
28527
28755
|
disabledSkillNamesProvider: bareMode || safeMode ? void 0 : disabledSkillNamesProvider,
|
|
28528
28756
|
terminalImageRenderSupportProvider: interactive ? async () => {
|
|
28529
|
-
const { getTerminalImageRenderSupport } = await import("./terminal-image-renderer-
|
|
28757
|
+
const { getTerminalImageRenderSupport } = await import("./terminal-image-renderer-BTRE2GEU.js");
|
|
28530
28758
|
return getTerminalImageRenderSupport();
|
|
28531
28759
|
} : void 0,
|
|
28532
28760
|
disabledSkillLevels: bareMode || safeMode || !Array.isArray(settings.skills?.disabledLevels) ? void 0 : settings.skills.disabledLevels.filter(isSkillLevel),
|