@qwen-code/qwen-code 0.21.12-preview.3 → 0.21.12-preview.4
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/code-review.md +1 -1
- package/bundled/qc-helper/docs/qwen-serve.md +34 -34
- package/bundled/review/SKILL.md +55 -36
- package/chunks/{MaxSizedBox-EIK4BHBQ.js → MaxSizedBox-GFI5RYXH.js} +41 -41
- package/chunks/{StandaloneSessionPicker-NHVJDRYD.js → StandaloneSessionPicker-JFWRY4V2.js} +60 -60
- package/chunks/{acp-startup-profiler-JMJBZDVO.js → acp-startup-profiler-TVI2OVUN.js} +2 -2
- package/chunks/{acpAgent-37UDZP64.js → acpAgent-7YC6SNIS.js} +672 -428
- package/chunks/{agent-FAWBG7PP.js → agent-43KVQSB5.js} +38 -38
- package/chunks/{agent-headless-SHK4PCCH.js → agent-headless-P2N7PDGQ.js} +38 -38
- package/chunks/{anthropicContentGenerator-4JSC3ZFL.js → anthropicContentGenerator-ZBBX5VMY.js} +6 -6
- package/chunks/{artifact-tool-FRMBPDPB.js → artifact-tool-RWJAKYBZ.js} +2 -2
- package/chunks/{askUserQuestion-7G3LI3IZ.js → askUserQuestion-IQCA2SOX.js} +2 -2
- package/chunks/{bridge-DEAYNDCI.js → bridge-ZBMNALLA.js} +44 -44
- package/chunks/{channel-management-service-SKAN6NOB.js → channel-management-service-5ZYX4ROW.js} +4 -4
- package/chunks/{channel-settings-store-UIGYER6R.js → channel-settings-store-ZJWM7EDP.js} +45 -45
- package/chunks/{channel-worker-group-YPTB5ASD.js → channel-worker-group-QFJKXO7R.js} +5 -5
- package/chunks/{channel-worker-manager-4EHJSPRH.js → channel-worker-manager-PWD2UURZ.js} +5 -5
- package/chunks/{channel-worker-supervisor-DZKHYFHV.js → channel-worker-supervisor-XQJBGFCM.js} +3 -3
- package/chunks/{chunk-GZGDJ4E6.js → chunk-2ASWIM4A.js} +1 -1
- package/chunks/{chunk-DP3IHZGG.js → chunk-2AUM35J5.js} +59 -7
- package/chunks/{chunk-T4FTABSW.js → chunk-2N6CV4PW.js} +1 -1
- package/chunks/{chunk-5PWLQ7SK.js → chunk-2RTRFLWH.js} +11 -4
- package/chunks/{chunk-TYGKUOEG.js → chunk-2U3UCXZ3.js} +2 -1
- package/chunks/{chunk-QZ5G26ZE.js → chunk-32SNBMNP.js} +12 -12
- package/chunks/{chunk-NPE3STIW.js → chunk-3JI5D6RU.js} +3 -3
- package/chunks/{chunk-E5BWLU5J.js → chunk-3MJ44LNC.js} +59 -23
- package/chunks/{chunk-QUESTNOP.js → chunk-4JS2QK7P.js} +1 -1
- package/chunks/{chunk-L7T742G2.js → chunk-4X5J3V2I.js} +47 -3
- package/chunks/{chunk-IQFYO5BF.js → chunk-5KZNWF2M.js} +1 -1
- package/chunks/{chunk-EXG2R5UR.js → chunk-62TIEFNN.js} +8 -8
- package/chunks/{chunk-T6W4KACQ.js → chunk-67F2BEYW.js} +1 -1
- package/chunks/{chunk-NELCY6JT.js → chunk-6LDLDK6E.js} +1 -1
- package/chunks/{chunk-5I5NMQCU.js → chunk-6NQWER7D.js} +3 -3
- package/chunks/{chunk-732MOPEM.js → chunk-6OJDN5ZT.js} +1 -1
- package/chunks/{chunk-GLWWPFTW.js → chunk-6SU6OW5Z.js} +1 -1
- package/chunks/{chunk-TEKFBSMY.js → chunk-6T5HCY34.js} +3 -3
- package/chunks/{chunk-AQHNAA7E.js → chunk-7JL5YBSA.js} +1 -1
- package/chunks/{chunk-NWPO6I7V.js → chunk-7WUMS2UA.js} +1 -1
- package/chunks/{chunk-O5G7IQGM.js → chunk-A2QIWDFO.js} +347 -85
- package/chunks/{chunk-KT4OWAAZ.js → chunk-A4BAHMJF.js} +3 -3
- package/chunks/{chunk-N7NBMAMW.js → chunk-A6GQUQ7I.js} +2 -2
- package/chunks/{chunk-XLQS3VI6.js → chunk-AAZWJAPQ.js} +2 -2
- package/chunks/{chunk-LT532KF4.js → chunk-ADJDLEVO.js} +1 -1
- package/chunks/{chunk-VWD7SNNN.js → chunk-APQTLUZ3.js} +2120 -2085
- package/chunks/{chunk-AJX4ITUG.js → chunk-ARL4UGRW.js} +3 -3
- package/chunks/{chunk-ZQSNP4TG.js → chunk-B2BKFWJK.js} +2 -2
- package/chunks/{chunk-SAQHDAUJ.js → chunk-B66LYK4B.js} +452 -57
- package/chunks/{chunk-6ZIIHBNV.js → chunk-B7IBCWDW.js} +3 -3
- package/chunks/{chunk-5UPJ774B.js → chunk-BGIKUE5J.js} +1 -1
- package/chunks/{chunk-2J53A6MV.js → chunk-BNRIQWXW.js} +3 -3
- package/chunks/{chunk-CZXQ4UZA.js → chunk-BXAGPCYH.js} +1 -1
- package/chunks/{chunk-IEP44U2R.js → chunk-C2DR57L6.js} +1 -1
- package/chunks/{chunk-TBVNYG5B.js → chunk-CDDLHCC2.js} +3 -3
- package/chunks/{chunk-CG3OQDNY.js → chunk-CJNKGZLC.js} +6 -6
- package/chunks/{chunk-UZPWH6SP.js → chunk-CTEGMF77.js} +285 -125
- package/chunks/{chunk-3TT6MZHJ.js → chunk-DUFZ3OW6.js} +35 -35
- package/chunks/{chunk-ZWPWQEF5.js → chunk-E74YSVIN.js} +1 -1
- package/chunks/{chunk-RQVVXDHS.js → chunk-ECDXUCEO.js} +4 -4
- package/chunks/{chunk-47FQVRCO.js → chunk-EGB2PIYM.js} +1 -1
- package/chunks/{chunk-JL3LC3CQ.js → chunk-FB5CQZMK.js} +1 -1
- package/chunks/{chunk-U6PTKAOW.js → chunk-FNVF5RR4.js} +1 -1
- package/chunks/{chunk-O4BBDP2G.js → chunk-FTGU6G45.js} +2 -2
- package/chunks/{chunk-ZGWY4YUB.js → chunk-FVHLDSQS.js} +2 -2
- package/chunks/{chunk-RRQJPCRQ.js → chunk-FXWGMPAP.js} +2 -2
- package/chunks/{chunk-P64FPV3G.js → chunk-GDNDZJSG.js} +2 -2
- package/chunks/{chunk-M6HXP2SG.js → chunk-GHOUZ5X4.js} +1892 -622
- package/chunks/{chunk-M6SXIXBV.js → chunk-H2U4FK62.js} +6 -6
- package/chunks/{chunk-EFIMD5VA.js → chunk-H6BFLALJ.js} +1 -1
- package/chunks/{chunk-TYCXSMZU.js → chunk-HOJZ2QQA.js} +3 -3
- package/chunks/{chunk-Y66OOMKS.js → chunk-HWCHDINS.js} +21 -21
- package/chunks/{chunk-4GLFFNP3.js → chunk-HY5OHJEC.js} +5 -5
- package/chunks/{chunk-P2UCMHDT.js → chunk-IJCZP2MA.js} +2 -2
- package/chunks/{chunk-I4XSOFH2.js → chunk-JBZYGFIB.js} +1 -1
- package/chunks/{chunk-HBZUU4AE.js → chunk-JGD35ZSJ.js} +4 -4
- package/chunks/{chunk-DAX3G67A.js → chunk-JOVJCXN4.js} +1 -1
- package/chunks/{chunk-YI6UGZF5.js → chunk-JRMUA53D.js} +12 -12
- package/chunks/{chunk-CTQE2NB2.js → chunk-JRTJEGSP.js} +1 -1
- package/chunks/{chunk-MZSJ43WV.js → chunk-JVY7FHUZ.js} +15 -2
- package/chunks/{chunk-K7JW6V5O.js → chunk-JW5UEE3V.js} +1 -1
- package/chunks/{chunk-GYBDYWMV.js → chunk-JXS2JNMZ.js} +2 -2
- package/chunks/{chunk-L2GTEEEU.js → chunk-K5IDV3PC.js} +44 -1
- package/chunks/{chunk-N3FJOQX7.js → chunk-KB4ISUT3.js} +4 -4
- package/chunks/{chunk-GJJQV4PY.js → chunk-KK3FEHPJ.js} +1 -1
- package/chunks/{chunk-2AZMF6G5.js → chunk-KTWUFHS4.js} +2 -2
- package/chunks/{chunk-7D4KEFOT.js → chunk-L3YACXS2.js} +3 -3
- package/chunks/{chunk-575MI5K3.js → chunk-LIBTBTHP.js} +4 -4
- package/chunks/{chunk-JS4Q5NG5.js → chunk-LSMCI42W.js} +3 -3
- package/chunks/{chunk-YZJVVQD3.js → chunk-MTV5W6WN.js} +7 -7
- package/chunks/{chunk-UOMZKPI5.js → chunk-MUN34TTF.js} +7 -7
- package/chunks/{chunk-LHY6HBRA.js → chunk-N3J3CO35.js} +4 -4
- package/chunks/{chunk-TRYJ3BVE.js → chunk-N56NYJWY.js} +7 -7
- package/chunks/{chunk-3ZYX7AUR.js → chunk-NAOHSM56.js} +1 -1
- package/chunks/{chunk-URK542T4.js → chunk-NF5J2WFA.js} +15 -2
- package/chunks/{chunk-OPBATTFQ.js → chunk-NHZF4VCD.js} +1 -1
- package/chunks/{chunk-QTI7SRXI.js → chunk-NM33GGOM.js} +3 -3
- package/chunks/{chunk-F6AOBFUN.js → chunk-NW7SPXVG.js} +1 -1
- package/chunks/{chunk-J7DNMZFO.js → chunk-NX5QZVRS.js} +1 -1
- package/chunks/{chunk-WFRHWDBT.js → chunk-O4MVJKSX.js} +5 -5
- package/chunks/{chunk-NC4O6UE6.js → chunk-O6SLWH4X.js} +2 -2
- package/chunks/{chunk-V4MJ56RS.js → chunk-OIZWCOYC.js} +5 -5
- package/chunks/{chunk-JXK3WAP7.js → chunk-ORR5EFCL.js} +4 -4
- package/chunks/{chunk-EYY4IBPV.js → chunk-OSA2TFDI.js} +2 -2
- package/chunks/{chunk-KPVVWKF3.js → chunk-PSTHNTHF.js} +1 -1
- package/chunks/{chunk-4M2F7OG7.js → chunk-PYLVQ6RT.js} +6 -6
- package/chunks/{chunk-6AECVSVX.js → chunk-Q7ALOKK7.js} +3 -3
- package/chunks/{chunk-EYW54TBD.js → chunk-QEWAHAW2.js} +3 -3
- package/chunks/{chunk-N5ULBHP3.js → chunk-QSDPJROT.js} +2 -2
- package/chunks/{chunk-DYVCDQW2.js → chunk-QSMZHJ62.js} +1 -1
- package/chunks/{chunk-MDFUBQAQ.js → chunk-QWAI7FNT.js} +17 -17
- package/chunks/{chunk-M4OYAR6J.js → chunk-QXFAQDBV.js} +2 -2
- package/chunks/{chunk-ILVATFYJ.js → chunk-SFBRH5RY.js} +19 -15
- package/chunks/{chunk-EYS3GGM3.js → chunk-SKRHR6N2.js} +1 -1
- package/chunks/{chunk-6LYDH7VT.js → chunk-SNHBRO4C.js} +2 -2
- package/chunks/{chunk-5TXOGH4I.js → chunk-T4G33L3W.js} +3 -3
- package/chunks/{chunk-32VOOMEF.js → chunk-TB6DPBE4.js} +4 -4
- package/chunks/{chunk-DEG7R6Z6.js → chunk-TN3REXN4.js} +8 -8
- package/chunks/{chunk-MWZYNOCG.js → chunk-TNETSI2A.js} +3 -3
- package/chunks/{chunk-ZV4XVYL3.js → chunk-TROB4PZY.js} +4 -4
- package/chunks/{chunk-O5AZPHYZ.js → chunk-U5C2GIN2.js} +24 -16
- package/chunks/{chunk-3GCU5O2E.js → chunk-U7ROFHSH.js} +1 -1
- package/chunks/{chunk-HB6QW4LM.js → chunk-UAAWNTOC.js} +15 -12
- package/chunks/{chunk-HHGQGTJQ.js → chunk-UFHPAMAV.js} +4 -0
- package/chunks/{chunk-V3LXMASR.js → chunk-UHF5VBKO.js} +1 -1
- package/chunks/{chunk-FRH4SSGX.js → chunk-UPUAGRKY.js} +2 -2
- package/chunks/{chunk-6S52N6PG.js → chunk-UQPLUR4A.js} +2 -2
- package/chunks/{chunk-KIFRFCCB.js → chunk-UWIJU22K.js} +66 -19
- package/chunks/{chunk-HGCQ5SE7.js → chunk-UXEO7E3V.js} +21 -0
- package/chunks/{chunk-M2PY7CNK.js → chunk-V2U6FOJB.js} +2 -2
- package/chunks/{chunk-7SUQZ7QH.js → chunk-V3NMFQD2.js} +2 -2
- package/chunks/{chunk-6XZERB6P.js → chunk-VPZMLGD3.js} +3 -3
- package/chunks/{chunk-UNCIELQJ.js → chunk-VRQD5D7R.js} +1 -1
- package/chunks/{chunk-YTYPRVIZ.js → chunk-VUTOV2HG.js} +2 -2
- package/chunks/{chunk-7LZ7DK4D.js → chunk-VYDQD5J4.js} +1 -1
- package/chunks/{chunk-XCGIMOLN.js → chunk-WCCLLK7X.js} +14 -1
- package/chunks/{chunk-JEMR2FTD.js → chunk-WIHSDI6U.js} +4 -4
- package/chunks/{chunk-VJNBRRZG.js → chunk-WZMH7II3.js} +1 -1
- package/chunks/{chunk-XWUQ4IH5.js → chunk-XJ6IMYUS.js} +7 -7
- package/chunks/{chunk-3XZYK76R.js → chunk-XL6GYJL2.js} +1 -1
- package/chunks/{chunk-KNXA5XXK.js → chunk-XUBM2A4F.js} +7 -7
- package/chunks/{chunk-ENEEQMGM.js → chunk-XY7DGTIC.js} +1 -1
- package/chunks/{chunk-SSAOTDK7.js → chunk-Y2EOB7WZ.js} +1 -1
- package/chunks/{chunk-VQZXRLEX.js → chunk-Y2HK3ELT.js} +3 -3
- package/chunks/{chunk-FDWH6CBK.js → chunk-Y5C24BUY.js} +5 -5
- package/chunks/{chunk-5HBFERG5.js → chunk-YI5G32RU.js} +3 -3
- package/chunks/{chunk-MPBRV3UU.js → chunk-YMB77M76.js} +15 -0
- package/chunks/{chunk-KNQZXSLW.js → chunk-YY23TR4M.js} +23 -9
- package/chunks/{chunk-4ETA3KRC.js → chunk-ZA2JN5IZ.js} +3 -3
- package/chunks/{chunk-IX7CFQGA.js → chunk-ZPZANKVP.js} +3 -3
- package/chunks/{chunk-XTH2OMDS.js → chunk-ZRT36RSF.js} +1 -1
- package/chunks/{chunk-M2NMFAFR.js → chunk-ZZ7RUTJ4.js} +1 -1
- package/chunks/{computer-use-S4JEU5P7.js → computer-use-J5VUY257.js} +38 -38
- package/chunks/{config-utils-TXVKR27S.js → config-utils-7JZQN6L2.js} +4 -4
- package/chunks/{contextCommand-2H5OH2HW.js → contextCommand-RCTGC36R.js} +40 -40
- package/chunks/{core-runtime-IAQ4DD4Y.js → core-runtime-REBZ5ZYE.js} +38 -38
- package/chunks/{create-sub-session-Y4WYDZGC.js → create-sub-session-23ULO5PO.js} +2 -2
- package/chunks/{create-sub-session-EKHKXJAA.js → create-sub-session-TEEUROAZ.js} +38 -38
- package/chunks/{cron-create-ZOVA3CC2.js → cron-create-5WUTNKNF.js} +4 -4
- package/chunks/{cron-delete-7Z3H4LJY.js → cron-delete-JEQ27YPS.js} +4 -4
- package/chunks/{cron-list-UHGX3IQG.js → cron-list-IXGCA7UR.js} +4 -4
- package/chunks/{daemon-PXIC4ZDK.js → daemon-UBVOQMWY.js} +2 -1
- package/chunks/{daemon-status-provider-LPYR2GXY.js → daemon-status-provider-SV7KRLJ4.js} +49 -49
- package/chunks/{daemon-trust-policy-7JOBVFH3.js → daemon-trust-policy-LFUJ4NGF.js} +44 -44
- package/chunks/{daemon-trust-policy-monitor-OU3NRHAR.js → daemon-trust-policy-monitor-BQZ77NDD.js} +44 -44
- package/chunks/{deferred-core-runtime-SFT3KI2C.js → deferred-core-runtime-F4XOQJQL.js} +38 -38
- package/chunks/{dispatch-B53LNEO4.js → dispatch-FW7DX2CR.js} +7 -1
- package/chunks/{display-image-ZE3GZNIK.js → display-image-CAD7RAUM.js} +4 -4
- package/chunks/{dist-BNWP6IZL.js → dist-362MN6CP.js} +2 -2
- package/chunks/{dist-EFJILGIS.js → dist-5VDE7U3A.js} +1 -1
- package/chunks/{dist-AVUYBK7L.js → dist-6RK4U6VU.js} +1 -1
- package/chunks/{dist-KTYDJNYM.js → dist-B3ODKYEB.js} +1 -1
- package/chunks/{dist-NPS52B2V.js → dist-CCUH2Z4C.js} +1 -1
- package/chunks/{dist-BW2LDPV3.js → dist-DANKRAB3.js} +1 -1
- package/chunks/{dist-PKSRQAR2.js → dist-EZHCZSW6.js} +1 -1
- package/chunks/{dist-ZWDH5HLS.js → dist-M3XMEIP2.js} +1 -1
- package/chunks/{earlyInputCapture-27RPWE2D.js → earlyInputCapture-JAJXDT2N.js} +39 -39
- package/chunks/{edit-WXVZ7FHS.js → edit-OXBMFY5B.js} +38 -38
- package/chunks/{enter-worktree-TYMVXFLA.js → enter-worktree-XS4JX4PO.js} +38 -38
- package/chunks/{enterPlanMode-FT4MRU5N.js → enterPlanMode-J6PDPFFT.js} +38 -38
- package/chunks/{environment-Z6OMA34I.js → environment-BQW6FAZL.js} +40 -40
- package/chunks/{errors-YMXK2GG3.js → errors-TMSN7AZN.js} +40 -40
- package/chunks/{exit-worktree-ODZUQLGJ.js → exit-worktree-2RIE6DAO.js} +38 -38
- package/chunks/{exitPlanMode-MBPAPBBV.js → exitPlanMode-QQL27HU4.js} +38 -38
- package/chunks/{fast-path-ZU5T6XSN.js → fast-path-TSGUVE5K.js} +4 -4
- package/chunks/{gemini-OZK6AIMC.js → gemini-RLTFENFV.js} +86 -86
- package/chunks/{geminiContentGenerator-MC6ZKWZG.js → geminiContentGenerator-B6W6PSO7.js} +6 -6
- package/chunks/{glob-KJ4A4ZOM.js → glob-JKVAHWL5.js} +38 -38
- package/chunks/{goal-tools-JDK2SNMV.js → goal-tools-LQFO4BRY.js} +4 -4
- package/chunks/{grep-QWBLG564.js → grep-6CN23ZPS.js} +38 -38
- package/chunks/{handleAutoUpdate-M3ACKDKF.js → handleAutoUpdate-Y6BUNMBG.js} +42 -42
- package/chunks/{i18n-FPW7XZL5.js → i18n-Y5PM6L5V.js} +39 -39
- package/chunks/{image-gen-OTFC2S7L.js → image-gen-DC2IQZ73.js} +10 -10
- package/chunks/{initializer-5HKUXXBT.js → initializer-OYKKBNHO.js} +45 -45
- package/chunks/{installationInfo-4OA6UW7V.js → installationInfo-63AFHLWA.js} +39 -39
- package/chunks/{keychain-token-storage-JTWUYFU7.js → keychain-token-storage-GU75J2T2.js} +2 -2
- package/chunks/{list-3TKZ264A.js → list-KA63R3R6.js} +47 -47
- package/chunks/{list-agents-4GQ2XNEU.js → list-agents-5PNMK2AM.js} +2 -2
- package/chunks/{loadedSettingsAdapter-IRUANLS2.js → loadedSettingsAdapter-IGBJN7C5.js} +44 -44
- package/chunks/{loggingContentGenerator-D4URLH2A.js → loggingContentGenerator-Z3NADCTQ.js} +115 -93
- package/chunks/{loop-wakeup-HOQI3K5D.js → loop-wakeup-OV65FEGR.js} +5 -5
- package/chunks/{ls-FSHISLLA.js → ls-RPRSX26R.js} +4 -4
- package/chunks/{lsp-APQJ5ZEZ.js → lsp-IWTJWFLT.js} +2 -2
- package/chunks/{managed-npm-update-2O7XSAWJ.js → managed-npm-update-HA262PFM.js} +41 -41
- package/chunks/{mcp-AFVHCHKT.js → mcp-T5ZUOKT3.js} +44 -44
- package/chunks/{monitor-PY4WDSX3.js → monitor-SLGY7CYB.js} +38 -38
- package/chunks/nonInteractiveCli-R5PK5B5G.js +166 -0
- package/chunks/{notebook-edit-GEPL33NO.js → notebook-edit-STSSB5KQ.js} +38 -38
- package/chunks/{openaiContentGenerator-ACYSXQ6R.js → openaiContentGenerator-OQED57JE.js} +24 -24
- package/chunks/{opentui-entry-SBAOWW7M.js → opentui-entry-UTJ6MHDI.js} +116 -97
- package/chunks/{pidfile-SUNYCAA4.js → pidfile-GES3MIHH.js} +39 -39
- package/chunks/{processUtils-F7LP7YUV.js → processUtils-FU6VMUOL.js} +2 -2
- package/chunks/{qwenContentGenerator-BB6IPELF.js → qwenContentGenerator-HWJSEGUL.js} +43 -43
- package/chunks/{qwenOAuth2-OU3WGDOI.js → qwenOAuth2-PAIR7XEW.js} +9 -9
- package/chunks/{read-file-GORBXJTS.js → read-file-IYEBTQT5.js} +12 -12
- package/chunks/{read-mcp-resource-TJSJRH4F.js → read-mcp-resource-THCSZHXO.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-76YYQA5F.js} +3 -3
- package/chunks/{resumeHistoryUtils-FOAJJJWK.js → resumeHistoryUtils-WP446RP5.js} +44 -44
- package/chunks/{ripGrep-RNLIZGCY.js → ripGrep-VV2CRCL2.js} +38 -38
- package/chunks/{run-qwen-serve-GVMMX3IU.js → run-qwen-serve-AHQCTALV.js} +160 -71
- package/chunks/{runtime-RNBZ5FDD.js → runtime-AUUZGDK6.js} +49 -49
- package/chunks/{scheduler-NTRFSPIP.js → scheduler-Y4UPEURR.js} +40 -40
- package/chunks/{sdk-exporters-http-2VPMAPFI.js → sdk-exporters-http-A7XLKZO7.js} +11 -7
- package/chunks/{sdk-impl-5W3JUCWF.js → sdk-impl-XO4UF6PR.js} +11 -8
- package/chunks/{send-message-RBYLV5NY.js → send-message-P5SLP57G.js} +6 -6
- package/chunks/{serve-H3PGA26U.js → serve-WI3SE4MY.js} +47 -47
- package/chunks/{server-SUXD2F3C.js → server-G6JU6UWL.js} +264 -159
- package/chunks/{session-MTFVUWWM.js → session-2AO2UACB.js} +85 -85
- package/chunks/{settings-GUJ3TN2J.js → settings-3HRWSH66.js} +43 -43
- package/chunks/{shell-C2UP5FF2.js → shell-AR7XFLHA.js} +38 -38
- package/chunks/{skill-4XCNK55E.js → skill-K6NOUUYM.js} +16 -16
- package/chunks/{skill-settings-Y2BU27XM.js → skill-settings-IOXQYS6X.js} +43 -43
- package/chunks/{spawnChannel-UUUUK734.js → spawnChannel-V6P6HF4V.js} +40 -40
- package/chunks/{standalone-update-MJ722XZ4.js → standalone-update-K5G3L2OJ.js} +40 -40
- package/chunks/{startInteractiveUI-TCPIPNGN.js → startInteractiveUI-TRRP52QX.js} +125 -115
- package/chunks/{syntheticOutput-D3Z64LJC.js → syntheticOutput-SEW4NA47.js} +3 -3
- package/chunks/{task-create-URFZ5EUX.js → task-create-247EAVF7.js} +10 -10
- package/chunks/{task-list-6JDFMPUW.js → task-list-ZJN4QHLK.js} +5 -5
- package/chunks/{task-stop-HHUGCD25.js → task-stop-MAYQJ42I.js} +2 -2
- package/chunks/{task-update-DVV6CUGI.js → task-update-SU5TMZGG.js} +10 -10
- package/chunks/{team-create-WZWH2NJI.js → team-create-IEEEBLE2.js} +38 -38
- package/chunks/{team-delete-PZGGBQLM.js → team-delete-3XVRPQBP.js} +5 -5
- package/chunks/{team-plan-approval-SUZQJCWJ.js → team-plan-approval-SJGNS5JL.js} +38 -38
- package/chunks/{terminal-image-renderer-BCUN3Z3W.js → terminal-image-renderer-C4RQMC67.js} +40 -40
- package/chunks/{theme-manager-UGMFDREN.js → theme-manager-IKZQJQ6C.js} +39 -39
- package/chunks/{todoWrite-WINAZSZI.js → todoWrite-IE2YTCK7.js} +4 -4
- package/chunks/{tool-search-B6F3MPUZ.js → tool-search-4UVNFYWU.js} +16 -16
- package/chunks/{total-session-admission-MQLBJ5WL.js → total-session-admission-DIN6FTZP.js} +44 -44
- package/chunks/{trustedFolders-2XST7U5C.js → trustedFolders-IAHOLV6A.js} +39 -39
- package/chunks/{update-relaunch-OVC7YNGD.js → update-relaunch-5QSJ5CWP.js} +5 -5
- package/chunks/{updateCheck-YAKM36WQ.js → updateCheck-N4RT7HOZ.js} +44 -44
- package/chunks/{useAutoAcceptIndicator-RF6FVX3S.js → useAutoAcceptIndicator-25T26VZS.js} +46 -46
- package/chunks/{validateNonInterActiveAuth-IPPXFNQH.js → validateNonInterActiveAuth-MCTVPLFE.js} +81 -81
- package/chunks/{version-4IDFEXOU.js → version-6PLZ7PCV.js} +2 -2
- package/chunks/{web-fetch-NUOLHXPN.js → web-fetch-5ANX6FSM.js} +16 -16
- package/chunks/{web-search-LVOOV4XZ.js → web-search-KQJWWRHW.js} +9 -9
- package/chunks/{workflow-JSTYTG3K.js → workflow-C57ZKFUF.js} +111 -46
- package/chunks/{workspace-providers-status-U4EYXA4K.js → workspace-providers-status-3QAE4G4Y.js} +47 -47
- package/chunks/{workspace-registration-store-OG66U3CB.js → workspace-registration-store-Q3J5LV6T.js} +1 -1
- package/chunks/{workspace-registry-WSHWQRQQ.js → workspace-registry-DSJ5NAII.js} +44 -44
- package/chunks/{workspace-service-QZXQHX2F.js → workspace-service-QW5LH7FA.js} +49 -49
- package/chunks/{workspace-skills-status-VRBHEX5O.js → workspace-skills-status-N34ALJPZ.js} +45 -45
- package/chunks/{workspace-trust-reconciler-FCRIUIOF.js → workspace-trust-reconciler-YTOL7QEV.js} +50 -50
- package/chunks/{write-file-PYL3JCCD.js → write-file-MSFRVUZB.js} +38 -38
- package/chunks/{zoom-image-RS6MU26F.js → zoom-image-4TQA5GHG.js} +12 -12
- package/cli.js +13 -13
- package/package.json +4 -4
- package/web-shell/assets/{arc-CgGUyHWd.js → arc-lZ04kynw.js} +1 -1
- package/web-shell/assets/{architectureDiagram-3BPJPVTR-BR0Qv-1Y.js → architectureDiagram-3BPJPVTR-B1wZVhzD.js} +1 -1
- package/web-shell/assets/{blockDiagram-GPEHLZMM-DIoaceaI.js → blockDiagram-GPEHLZMM-CO0e0yJt.js} +1 -1
- package/web-shell/assets/{c4Diagram-AAUBKEIU-Bc5k6BbI.js → c4Diagram-AAUBKEIU-Dfpo6Qie.js} +1 -1
- package/web-shell/assets/channel-BxvRq3pV.js +1 -0
- package/web-shell/assets/{chunk-2J33WTMH-DtPEz2WX.js → chunk-2J33WTMH-BvxArftT.js} +1 -1
- package/web-shell/assets/{chunk-4BX2VUAB-Dydo6ydE.js → chunk-4BX2VUAB-BS2XXjGY.js} +1 -1
- package/web-shell/assets/{chunk-55IACEB6-DD9_VWXm.js → chunk-55IACEB6-CYL6h3Ph.js} +1 -1
- package/web-shell/assets/{chunk-727SXJPM-DVI2m59k.js → chunk-727SXJPM-C-cWPX30.js} +1 -1
- package/web-shell/assets/{chunk-AQP2D5EJ-luatmaTN.js → chunk-AQP2D5EJ-CJLxNbVV.js} +1 -1
- package/web-shell/assets/{chunk-FMBD7UC4-Duy8NTIi.js → chunk-FMBD7UC4-DwfzKywA.js} +1 -1
- package/web-shell/assets/{chunk-ND2GUHAM-CrL1yhms.js → chunk-ND2GUHAM-BI5raYHQ.js} +1 -1
- package/web-shell/assets/{chunk-QZHKN3VN-C7BX6bu1.js → chunk-QZHKN3VN-_GkNI90J.js} +1 -1
- package/web-shell/assets/classDiagram-4FO5ZUOK-tL8nAxYf.js +1 -0
- package/web-shell/assets/classDiagram-v2-Q7XG4LA2-tL8nAxYf.js +1 -0
- package/web-shell/assets/{cose-bilkent-S5V4N54A-BTzs7mIi.js → cose-bilkent-S5V4N54A-BAVLNxh9.js} +1 -1
- package/web-shell/assets/{dagre-BM42HDAG-3VTUmWts.js → dagre-BM42HDAG-BD4XNLqp.js} +1 -1
- package/web-shell/assets/{diagram-2AECGRRQ-Ehdp75GN.js → diagram-2AECGRRQ-WO567p8w.js} +1 -1
- package/web-shell/assets/{diagram-5GNKFQAL-B3wu3teE.js → diagram-5GNKFQAL-mAk23VWO.js} +1 -1
- package/web-shell/assets/{diagram-KO2AKTUF-DjgTSf2S.js → diagram-KO2AKTUF-YQEeHKze.js} +1 -1
- package/web-shell/assets/{diagram-LMA3HP47-Br9mwjY3.js → diagram-LMA3HP47-CMVjxAjv.js} +1 -1
- package/web-shell/assets/{diagram-OG6HWLK6-D4xz5M-z.js → diagram-OG6HWLK6-42hPvbM-.js} +1 -1
- package/web-shell/assets/{erDiagram-TEJ5UH35-CXayWlG_.js → erDiagram-TEJ5UH35-CXU_cPfu.js} +1 -1
- package/web-shell/assets/{flowDiagram-I6XJVG4X-CLonjQTi.js → flowDiagram-I6XJVG4X-D-3TdhMT.js} +1 -1
- package/web-shell/assets/{ganttDiagram-6RSMTGT7-BTySFT-1.js → ganttDiagram-6RSMTGT7-CsgkXolz.js} +1 -1
- package/web-shell/assets/{gitGraphDiagram-PVQCEYII--2WcUjOe.js → gitGraphDiagram-PVQCEYII-B6Q3PBLD.js} +1 -1
- package/web-shell/assets/{index-DPJHkFOG.js → index-BFrkGj2B.js} +1 -1
- package/web-shell/assets/index-BgjULKyF.css +5 -0
- package/web-shell/assets/index-CxXlPYfl.js +1789 -0
- package/web-shell/assets/{infoDiagram-5YYISTIA-9vpgAf1m.js → infoDiagram-5YYISTIA-jiAfSXp8.js} +1 -1
- package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-DcRpHnAW.js → ishikawaDiagram-YF4QCWOH-BWif5KeJ.js} +1 -1
- package/web-shell/assets/{journeyDiagram-JHISSGLW-C2TKorRm.js → journeyDiagram-JHISSGLW-B-GAZthS.js} +1 -1
- package/web-shell/assets/{kanban-definition-UN3LZRKU-DdsFwB8b.js → kanban-definition-UN3LZRKU-9TEuATdL.js} +1 -1
- package/web-shell/assets/{linear-7PjRvJrf.js → linear-dy_QPfyE.js} +1 -1
- package/web-shell/assets/{mermaid.core-raDXa11C.js → mermaid.core-DB2uLAnq.js} +5 -5
- package/web-shell/assets/{mindmap-definition-RKZ34NQL-DLHc-PRN.js → mindmap-definition-RKZ34NQL-ey_dyxi-.js} +1 -1
- package/web-shell/assets/{pieDiagram-4H26LBE5-BftYpeTW.js → pieDiagram-4H26LBE5-_6BuMdDj.js} +1 -1
- package/web-shell/assets/{quadrantDiagram-W4KKPZXB-O-6ygOYn.js → quadrantDiagram-W4KKPZXB-B2rM19W2.js} +1 -1
- package/web-shell/assets/{requirementDiagram-4Y6WPE33-BmZWVufJ.js → requirementDiagram-4Y6WPE33-DWj8b7vW.js} +1 -1
- package/web-shell/assets/{sankeyDiagram-5OEKKPKP-2x5beiWt.js → sankeyDiagram-5OEKKPKP-D5dtYh0N.js} +1 -1
- package/web-shell/assets/{sequenceDiagram-3UESZ5HK-BH8uKokQ.js → sequenceDiagram-3UESZ5HK-DVkdn_qW.js} +1 -1
- package/web-shell/assets/{stateDiagram-AJRCARHV-Dq1MFgX_.js → stateDiagram-AJRCARHV-DgwD_fi6.js} +1 -1
- package/web-shell/assets/stateDiagram-v2-BHNVJYJU-BWGkVGVB.js +1 -0
- package/web-shell/assets/{timeline-definition-PNZ67QCA-Cl2WKbv9.js → timeline-definition-PNZ67QCA-vNr_1UNX.js} +1 -1
- package/web-shell/assets/{vennDiagram-CIIHVFJN-BqoRo_Q-.js → vennDiagram-CIIHVFJN-ChFcGAcu.js} +1 -1
- package/web-shell/assets/{wardley-L42UT6IY-BTxp-Yot.js → wardley-L42UT6IY-C8PXoSWk.js} +1 -1
- package/web-shell/assets/{wardleyDiagram-YWT4CUSO-DFXVCSH2.js → wardleyDiagram-YWT4CUSO-C2nqOV6i.js} +1 -1
- package/web-shell/assets/{xychartDiagram-2RQKCTM6-qQhWx0aE.js → xychartDiagram-2RQKCTM6-BntaqhSB.js} +1 -1
- package/web-shell/index.html +2 -2
- package/chunks/nonInteractiveCli-ZHW6F76F.js +0 -166
- 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
|
@@ -2,17 +2,17 @@
|
|
|
2
2
|
"use strict";
|
|
3
3
|
import {
|
|
4
4
|
listCommand
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-LIBTBTHP.js";
|
|
6
6
|
import {
|
|
7
7
|
getErrorMessage as getErrorMessage2
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-6T5HCY34.js";
|
|
9
9
|
import {
|
|
10
10
|
serveCommand
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-SFBRH5RY.js";
|
|
12
12
|
import {
|
|
13
13
|
OBSERVED_CONTACT_MAX_FRESH_WITHIN_SECONDS,
|
|
14
14
|
ObservedChannelContactStore
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-EGB2PIYM.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-5KZNWF2M.js";
|
|
32
32
|
import {
|
|
33
33
|
collectProviderModelsForProtocol,
|
|
34
34
|
getAuthTypeFromEnv,
|
|
35
35
|
resolveCliGenerationConfig
|
|
36
|
-
} from "./chunk-
|
|
36
|
+
} from "./chunk-3JI5D6RU.js";
|
|
37
37
|
import {
|
|
38
38
|
resolveSkillSettings
|
|
39
39
|
} from "./chunk-Z4X5MTRT.js";
|
|
@@ -53,17 +53,17 @@ import {
|
|
|
53
53
|
registerToolCallDispatch,
|
|
54
54
|
selectFirstModel,
|
|
55
55
|
sessionsPath
|
|
56
|
-
} from "./chunk-
|
|
56
|
+
} from "./chunk-N56NYJWY.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-N3J3CO35.js";
|
|
64
64
|
import {
|
|
65
65
|
parseChannelConfig
|
|
66
|
-
} from "./chunk-
|
|
66
|
+
} from "./chunk-VUTOV2HG.js";
|
|
67
67
|
import {
|
|
68
68
|
findCliEntryPath
|
|
69
69
|
} from "./chunk-V6WHFGST.js";
|
|
@@ -73,7 +73,7 @@ import {
|
|
|
73
73
|
clearAccount,
|
|
74
74
|
loadAccount,
|
|
75
75
|
saveAccount
|
|
76
|
-
} from "./chunk-
|
|
76
|
+
} from "./chunk-U7ROFHSH.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-JW5UEE3V.js";
|
|
105
105
|
import {
|
|
106
106
|
normalizeServeChannelSelection
|
|
107
107
|
} from "./chunk-ALMR3E6Q.js";
|
|
@@ -121,45 +121,45 @@ import {
|
|
|
121
121
|
isChannelProactiveDeliveryError,
|
|
122
122
|
sanitizeLogText,
|
|
123
123
|
sanitizePromptText
|
|
124
|
-
} from "./chunk-
|
|
124
|
+
} from "./chunk-ADJDLEVO.js";
|
|
125
125
|
import {
|
|
126
126
|
readServiceInfo,
|
|
127
127
|
removeServiceInfo,
|
|
128
128
|
signalService,
|
|
129
129
|
waitForExit,
|
|
130
130
|
writeServiceInfo
|
|
131
|
-
} from "./chunk-
|
|
131
|
+
} from "./chunk-7JL5YBSA.js";
|
|
132
132
|
import {
|
|
133
133
|
assembleMcpServers,
|
|
134
134
|
getPendingGatedMcpServers,
|
|
135
135
|
mcpCommand
|
|
136
|
-
} from "./chunk-
|
|
136
|
+
} from "./chunk-PYLVQ6RT.js";
|
|
137
137
|
import {
|
|
138
138
|
loadSettings
|
|
139
|
-
} from "./chunk-
|
|
139
|
+
} from "./chunk-H2U4FK62.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-JXS2JNMZ.js";
|
|
147
147
|
import {
|
|
148
148
|
loadEnvironment
|
|
149
|
-
} from "./chunk-
|
|
149
|
+
} from "./chunk-FXWGMPAP.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-V2U6FOJB.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-ZA2JN5IZ.js";
|
|
163
163
|
import {
|
|
164
164
|
require_strip_json_comments
|
|
165
165
|
} from "./chunk-NPQ5ZKRP.js";
|
|
@@ -196,12 +196,11 @@ import {
|
|
|
196
196
|
redactUrlCredentials,
|
|
197
197
|
removeChannelMemoryEntries,
|
|
198
198
|
resolveBundleDir,
|
|
199
|
-
sessionIdContext,
|
|
200
199
|
stripAnsiAndControl,
|
|
201
200
|
unquoteCStylePath,
|
|
202
201
|
updateChannelMemoryEntry,
|
|
203
202
|
updateSetting
|
|
204
|
-
} from "./chunk-
|
|
203
|
+
} from "./chunk-GHOUZ5X4.js";
|
|
205
204
|
import {
|
|
206
205
|
parsePositiveIntegerEnv
|
|
207
206
|
} from "./chunk-6PVPNMXU.js";
|
|
@@ -211,32 +210,36 @@ import {
|
|
|
211
210
|
} from "./chunk-IRH27ZC2.js";
|
|
212
211
|
import {
|
|
213
212
|
require_dist
|
|
214
|
-
} from "./chunk-
|
|
213
|
+
} from "./chunk-KTWUFHS4.js";
|
|
215
214
|
import {
|
|
215
|
+
addDaemonRequestAttribute,
|
|
216
216
|
parseBooleanEnvFlag,
|
|
217
217
|
resolveTelemetrySettings
|
|
218
|
-
} from "./chunk-
|
|
218
|
+
} from "./chunk-U5C2GIN2.js";
|
|
219
219
|
import {
|
|
220
220
|
getAllGeminiMdFilenames,
|
|
221
221
|
parseLineTolerant,
|
|
222
222
|
setGeminiMdFilename
|
|
223
|
-
} from "./chunk-
|
|
223
|
+
} from "./chunk-UAAWNTOC.js";
|
|
224
224
|
import {
|
|
225
225
|
SchemaValidator,
|
|
226
226
|
ToolNames
|
|
227
|
-
} from "./chunk-
|
|
227
|
+
} from "./chunk-ZRT36RSF.js";
|
|
228
228
|
import {
|
|
229
229
|
DEFAULT_QWEN_EMBEDDING_MODEL
|
|
230
230
|
} from "./chunk-F6WFNA7U.js";
|
|
231
231
|
import {
|
|
232
232
|
atomicWriteFileSync
|
|
233
|
-
} from "./chunk-
|
|
233
|
+
} from "./chunk-NW7SPXVG.js";
|
|
234
234
|
import {
|
|
235
235
|
isTlsVerificationDisabled
|
|
236
|
-
} from "./chunk-
|
|
236
|
+
} from "./chunk-H6BFLALJ.js";
|
|
237
237
|
import {
|
|
238
238
|
recordChannelMemoryRecallMetrics
|
|
239
|
-
} from "./chunk-
|
|
239
|
+
} from "./chunk-3MJ44LNC.js";
|
|
240
|
+
import {
|
|
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-YMB77M76.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-UBVOQMWY.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-UBVOQMWY.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-UBVOQMWY.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-UBVOQMWY.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-UBVOQMWY.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;
|
|
@@ -14246,6 +14309,7 @@ function validateFindings(raw) {
|
|
|
14246
14309
|
const heldRaw = o.heldByMeasurement;
|
|
14247
14310
|
const heldFile = heldRaw && typeof heldRaw === "object" ? asString(heldRaw, "file") : void 0;
|
|
14248
14311
|
const shortSummary = asString(o, "shortSummary") ?? asString(o, "short_summary");
|
|
14312
|
+
const witness = asString(o, "witness");
|
|
14249
14313
|
return {
|
|
14250
14314
|
id,
|
|
14251
14315
|
severity,
|
|
@@ -14254,6 +14318,7 @@ function validateFindings(raw) {
|
|
|
14254
14318
|
summary,
|
|
14255
14319
|
shortSummary: shortSummary ? compressSummary(shortSummary) : compressSummary(summary),
|
|
14256
14320
|
failureScenario,
|
|
14321
|
+
...witness ? { witness } : {},
|
|
14257
14322
|
...asString(o, "suggestedFix") || asString(o, "suggested_fix") ? {
|
|
14258
14323
|
suggestedFix: asString(o, "suggestedFix") ?? asString(o, "suggested_fix")
|
|
14259
14324
|
} : {},
|
|
@@ -14319,6 +14384,24 @@ Held back from Critical by measurement: \`test-delta\` reran the failing test co
|
|
|
14319
14384
|
return { findings: out, held, readjudicated };
|
|
14320
14385
|
}
|
|
14321
14386
|
__name(holdCriticalsFailingOnBase, "holdCriticalsFailingOnBase");
|
|
14387
|
+
function holdUnwitnessedCriticals(findings) {
|
|
14388
|
+
const unwitnessed = [];
|
|
14389
|
+
const out = findings.map((f) => {
|
|
14390
|
+
if (f.severity !== "Critical" || f.confidence !== "high" || f.source !== "review" || f.witness !== void 0) {
|
|
14391
|
+
return f;
|
|
14392
|
+
}
|
|
14393
|
+
unwitnessed.push(f.id);
|
|
14394
|
+
return {
|
|
14395
|
+
...f,
|
|
14396
|
+
confidence: "low",
|
|
14397
|
+
failureScenario: `${f.failureScenario}
|
|
14398
|
+
|
|
14399
|
+
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.`
|
|
14400
|
+
};
|
|
14401
|
+
});
|
|
14402
|
+
return { findings: out, unwitnessed };
|
|
14403
|
+
}
|
|
14404
|
+
__name(holdUnwitnessedCriticals, "holdUnwitnessedCriticals");
|
|
14322
14405
|
var WORKSPACE_IN_COMMAND_RE = /--workspace="([^"]+)"/;
|
|
14323
14406
|
function repoRelative(path3, workspace) {
|
|
14324
14407
|
const at = path3.indexOf("::");
|
|
@@ -14553,6 +14636,8 @@ var findingsCommand = {
|
|
|
14553
14636
|
shared
|
|
14554
14637
|
));
|
|
14555
14638
|
}
|
|
14639
|
+
const witnessHold = holdUnwitnessedCriticals(findings);
|
|
14640
|
+
findings = witnessHold.findings;
|
|
14556
14641
|
const report = buildReport(findings);
|
|
14557
14642
|
const target = resolve6(out);
|
|
14558
14643
|
mkdirSync6(dirname5(target), { recursive: true });
|
|
@@ -14567,6 +14652,11 @@ var findingsCommand = {
|
|
|
14567
14652
|
`findings: ${h.id} held back from Critical \u2014 test-delta measured ${h.file} as failing on the merge base too`
|
|
14568
14653
|
);
|
|
14569
14654
|
}
|
|
14655
|
+
for (const id of witnessHold.unwitnessed) {
|
|
14656
|
+
writeStderrLine(
|
|
14657
|
+
`findings: ${id} filed at low confidence \u2014 a confirmed Critical carried neither a witness nor a 'not run' reason (Step 4's witness rule)`
|
|
14658
|
+
);
|
|
14659
|
+
}
|
|
14570
14660
|
for (const r of readjudicated) {
|
|
14571
14661
|
writeStderrLine(
|
|
14572
14662
|
`findings: ${r.id} left at Critical \u2014 it already carries the ${r.file} measurement and was raised again anyway`
|
|
@@ -14833,6 +14923,7 @@ __name(layerAuditGate, "layerAuditGate");
|
|
|
14833
14923
|
|
|
14834
14924
|
// packages/cli/src/commands/review/lib/ledger.ts
|
|
14835
14925
|
init_esbuild_shims();
|
|
14926
|
+
var SHA_RE = /^[0-9a-f]{7,64}$/;
|
|
14836
14927
|
var LEDGER_MAX_FINDINGS = 50;
|
|
14837
14928
|
var LEDGER_MAX_TITLE = 80;
|
|
14838
14929
|
var LEDGER_MAX_FILE = 200;
|
|
@@ -14848,6 +14939,7 @@ function serializeLedger(ledger) {
|
|
|
14848
14939
|
const render = /* @__PURE__ */ __name((findings, dropped) => {
|
|
14849
14940
|
const payload = { v: 1, round: ledger.round, findings };
|
|
14850
14941
|
if (dropped > 0) payload.dropped = dropped;
|
|
14942
|
+
else if (ledger.sha && SHA_RE.test(ledger.sha)) payload.sha = ledger.sha;
|
|
14851
14943
|
return `${OPEN}${JSON.stringify(payload).replace(/--/g, "-\\u002d")}${CLOSE}`;
|
|
14852
14944
|
}, "render");
|
|
14853
14945
|
const total = ledger.findings.length;
|
|
@@ -14872,19 +14964,28 @@ function parseLedger(body) {
|
|
|
14872
14964
|
return null;
|
|
14873
14965
|
}
|
|
14874
14966
|
if (!Array.isArray(raw.findings)) return null;
|
|
14875
|
-
const
|
|
14967
|
+
const valid = raw.findings.filter(
|
|
14876
14968
|
(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
|
-
)
|
|
14969
|
+
);
|
|
14970
|
+
const findings = valid.slice(0, LEDGER_MAX_FINDINGS).map((f) => ({
|
|
14878
14971
|
...f,
|
|
14879
14972
|
title: f.title.slice(0, LEDGER_MAX_TITLE),
|
|
14880
14973
|
file: f.file.slice(0, LEDGER_MAX_FILE)
|
|
14881
14974
|
}));
|
|
14882
|
-
const
|
|
14975
|
+
const declared = Number.isInteger(raw.dropped) && raw.dropped > 0 ? raw.dropped : 0;
|
|
14976
|
+
const dropped = declared + (valid.length - findings.length) || void 0;
|
|
14977
|
+
const sha = (
|
|
14978
|
+
// Normalised on READ as the serializer holds on WRITE: a hand-edited
|
|
14979
|
+
// marker carrying both `dropped` and `sha` would certify a range its
|
|
14980
|
+
// own work list admits is partial.
|
|
14981
|
+
typeof raw.sha === "string" && SHA_RE.test(raw.sha) && !dropped ? raw.sha : void 0
|
|
14982
|
+
);
|
|
14883
14983
|
return {
|
|
14884
14984
|
v: 1,
|
|
14885
14985
|
round: raw.round,
|
|
14886
14986
|
findings,
|
|
14887
|
-
...dropped ? { dropped } : {}
|
|
14987
|
+
...dropped ? { dropped } : {},
|
|
14988
|
+
...sha ? { sha } : {}
|
|
14888
14989
|
};
|
|
14889
14990
|
} catch {
|
|
14890
14991
|
return null;
|
|
@@ -14943,6 +15044,14 @@ function reviewFooter(modelId, cliVersion) {
|
|
|
14943
15044
|
}
|
|
14944
15045
|
__name(reviewFooter, "reviewFooter");
|
|
14945
15046
|
var REVIEW_FOOTER_RE = /\s*(?:_— (?:(?! via Qwen Code \/review)[^\n])* via Qwen Code \/review(?: \(v[^\n)]*\))?_?\s*)+$/;
|
|
15047
|
+
var STRIP_TAIL_LIMIT = 8192;
|
|
15048
|
+
function stripReviewFooter(body) {
|
|
15049
|
+
if (!body.includes(FOOTER_MARKER)) return body;
|
|
15050
|
+
const tail2 = body.slice(-STRIP_TAIL_LIMIT);
|
|
15051
|
+
const stripped = tail2.replace(REVIEW_FOOTER_RE, "");
|
|
15052
|
+
return stripped === tail2 ? body : body.slice(0, body.length - tail2.length) + stripped;
|
|
15053
|
+
}
|
|
15054
|
+
__name(stripReviewFooter, "stripReviewFooter");
|
|
14946
15055
|
function isFooterSafeModelId(modelId) {
|
|
14947
15056
|
return !/[\n\r]/.test(modelId) && !modelId.includes(FOOTER_MARKER);
|
|
14948
15057
|
}
|
|
@@ -15056,10 +15165,6 @@ function toStringList(value, field) {
|
|
|
15056
15165
|
return [...value];
|
|
15057
15166
|
}
|
|
15058
15167
|
__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
15168
|
function toBool(value, field) {
|
|
15064
15169
|
if (value === void 0 || value === null) return false;
|
|
15065
15170
|
if (typeof value !== "boolean") {
|
|
@@ -15070,15 +15175,15 @@ function toBool(value, field) {
|
|
|
15070
15175
|
return value;
|
|
15071
15176
|
}
|
|
15072
15177
|
__name(toBool, "toBool");
|
|
15073
|
-
function composeReview(input, cliVersion = "unknown") {
|
|
15074
|
-
const result = composeReviewBody(input, cliVersion);
|
|
15075
|
-
const marker = ledgerMarkerFor(input);
|
|
15178
|
+
function composeReview(input, cliVersion = "unknown", attribution = true) {
|
|
15179
|
+
const result = composeReviewBody(input, cliVersion, attribution);
|
|
15180
|
+
const marker = ledgerMarkerFor(input, result.cappedBy);
|
|
15076
15181
|
return marker ? { ...result, body: `${result.body}
|
|
15077
15182
|
|
|
15078
15183
|
${marker}` } : result;
|
|
15079
15184
|
}
|
|
15080
15185
|
__name(composeReview, "composeReview");
|
|
15081
|
-
function ledgerMarkerFor(input) {
|
|
15186
|
+
function ledgerMarkerFor(input, cappedBy) {
|
|
15082
15187
|
try {
|
|
15083
15188
|
if (!input.planPath) return null;
|
|
15084
15189
|
const plan = JSON.parse(readFileSync13(input.planPath, "utf8"));
|
|
@@ -15100,19 +15205,22 @@ function ledgerMarkerFor(input) {
|
|
|
15100
15205
|
prevRound = prev.round;
|
|
15101
15206
|
} catch {
|
|
15102
15207
|
}
|
|
15103
|
-
|
|
15104
|
-
|
|
15208
|
+
const failClosed = (input.cannotTellCriticals?.length ?? 0) > 0 || cappedBy.length > 0;
|
|
15209
|
+
const sha = !failClosed && typeof plan.fetchedSha === "string" ? plan.fetchedSha : void 0;
|
|
15210
|
+
return serializeLedger({
|
|
15211
|
+
...buildLedger(
|
|
15105
15212
|
prevRound + 1,
|
|
15106
15213
|
input.draftedComments ?? [],
|
|
15107
15214
|
toStringList(input.bodyCriticals, "bodyCriticals").map(stripReviewFooter).filter((entry) => entry.trim() !== "")
|
|
15108
|
-
)
|
|
15109
|
-
|
|
15215
|
+
),
|
|
15216
|
+
...sha ? { sha } : {}
|
|
15217
|
+
});
|
|
15110
15218
|
} catch {
|
|
15111
15219
|
return null;
|
|
15112
15220
|
}
|
|
15113
15221
|
}
|
|
15114
15222
|
__name(ledgerMarkerFor, "ledgerMarkerFor");
|
|
15115
|
-
function composeReviewBody(input, cliVersion) {
|
|
15223
|
+
function composeReviewBody(input, cliVersion, attribution) {
|
|
15116
15224
|
const criticalsInline = toCount(input.criticalsInline, "criticalsInline");
|
|
15117
15225
|
const suggestionsInline = toCount(
|
|
15118
15226
|
input.suggestionsInline,
|
|
@@ -15343,15 +15451,19 @@ function composeReviewBody(input, cliVersion) {
|
|
|
15343
15451
|
"presubmit.downgradeReasons"
|
|
15344
15452
|
);
|
|
15345
15453
|
const modelId = input.modelId;
|
|
15346
|
-
|
|
15347
|
-
|
|
15348
|
-
|
|
15349
|
-
|
|
15350
|
-
|
|
15351
|
-
|
|
15352
|
-
|
|
15353
|
-
|
|
15354
|
-
|
|
15454
|
+
let footer = "";
|
|
15455
|
+
if (attribution) {
|
|
15456
|
+
if (typeof modelId !== "string" || modelId.trim() === "") {
|
|
15457
|
+
throw new TypeError(
|
|
15458
|
+
"compose-review: modelId is required (the public footer names the reviewing model)"
|
|
15459
|
+
);
|
|
15460
|
+
}
|
|
15461
|
+
if (!isFooterSafeModelId(modelId)) {
|
|
15462
|
+
throw new TypeError(
|
|
15463
|
+
"compose-review: modelId is interpolated into the public footer verbatim \u2014 it must be a single line that does not contain the footer marker"
|
|
15464
|
+
);
|
|
15465
|
+
}
|
|
15466
|
+
footer = reviewFooter(modelId, cliVersion);
|
|
15355
15467
|
}
|
|
15356
15468
|
const c = criticalsInline + bodyCriticals.length;
|
|
15357
15469
|
const s = suggestionsInline + suggestionsDiscarded;
|
|
@@ -15399,7 +15511,6 @@ function composeReviewBody(input, cliVersion) {
|
|
|
15399
15511
|
}
|
|
15400
15512
|
}
|
|
15401
15513
|
}
|
|
15402
|
-
const footer = reviewFooter(modelId, cliVersion);
|
|
15403
15514
|
const bilingual = bilingualFromPlan(input.planPath, input.prBodyFetcher);
|
|
15404
15515
|
const render = /* @__PURE__ */ __name((parts, sep9) => {
|
|
15405
15516
|
const en = parts.map((p) => p.en).join(sep9);
|
|
@@ -15413,7 +15524,7 @@ function composeReviewBody(input, cliVersion) {
|
|
|
15413
15524
|
${zh}
|
|
15414
15525
|
|
|
15415
15526
|
</details>` : en;
|
|
15416
|
-
return `${text2}
|
|
15527
|
+
return footer === "" ? text2 : `${text2}
|
|
15417
15528
|
|
|
15418
15529
|
${footer}`;
|
|
15419
15530
|
}, "render");
|
|
@@ -15999,7 +16110,8 @@ var composeReviewCommand = {
|
|
|
15999
16110
|
},
|
|
16000
16111
|
// Same pin as `submit`: the startup stamp, not a version resolved at
|
|
16001
16112
|
// compose time — a shared runner can rewrite the install mid-session.
|
|
16002
|
-
footerVersion(process.env["QWEN_CODE_STARTUP_VERSION"]) ?? await getCliVersion()
|
|
16113
|
+
footerVersion(process.env["QWEN_CODE_STARTUP_VERSION"]) ?? await getCliVersion(),
|
|
16114
|
+
operatorReviewSettings().attribution
|
|
16003
16115
|
);
|
|
16004
16116
|
const json = JSON.stringify(
|
|
16005
16117
|
{ ...result, verdictLine: verdictLine(result) },
|
|
@@ -17939,7 +18051,7 @@ function renderLedgerSection(ledger) {
|
|
|
17939
18051
|
return [
|
|
17940
18052
|
"## Previous /review round (machine ledger)",
|
|
17941
18053
|
"",
|
|
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
|
|
18054
|
+
`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
18055
|
// A truncated ledger must not read like a complete one. `dropped` exists
|
|
17944
18056
|
// to draw that line, and this is the only place a reader sees the list.
|
|
17945
18057
|
...ledger.dropped ? [
|
|
@@ -18867,7 +18979,7 @@ async function runPresubmit(args) {
|
|
|
18867
18979
|
`repos/${owner}/${repo}/pulls/${prNumber}/comments`
|
|
18868
18980
|
);
|
|
18869
18981
|
const qwenComments = allComments.filter(
|
|
18870
|
-
(c) => /via Qwen Code \/review/.test(c.body ?? "")
|
|
18982
|
+
(c) => /via Qwen Code \/review/.test(c.body ?? "") || !c.in_reply_to_id && me !== "" && (c.user?.login ?? "").toLowerCase() === me.toLowerCase() && severityOf(c) !== null
|
|
18871
18983
|
);
|
|
18872
18984
|
const repliedToIds = /* @__PURE__ */ new Set();
|
|
18873
18985
|
for (const c of allComments) {
|
|
@@ -19117,14 +19229,15 @@ function reviewWriteAuthorization(req) {
|
|
|
19117
19229
|
} catch {
|
|
19118
19230
|
return {
|
|
19119
19231
|
ok: false,
|
|
19120
|
-
why: `no review arguments were recorded at ${path3}, so this run cannot show that \`--comment\` was requested`
|
|
19232
|
+
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
19233
|
};
|
|
19122
19234
|
}
|
|
19123
|
-
const verdict = parseReviewArgs(raw);
|
|
19235
|
+
const verdict = parseReviewArgs(raw, { comment: req.defaultComment });
|
|
19124
19236
|
if (!verdict.comment.effective) {
|
|
19237
|
+
const commentRequested = verdict.comment.requested || req.defaultComment === true;
|
|
19125
19238
|
return {
|
|
19126
19239
|
ok: false,
|
|
19127
|
-
why: `\`--comment\` was not in the review arguments (${JSON.stringify(raw.trim())})`
|
|
19240
|
+
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
19241
|
};
|
|
19129
19242
|
}
|
|
19130
19243
|
const t2 = verdict.target;
|
|
@@ -19161,7 +19274,7 @@ function reviewWriteAuthorization(req) {
|
|
|
19161
19274
|
}
|
|
19162
19275
|
return {
|
|
19163
19276
|
ok: true,
|
|
19164
|
-
why: `\`--comment\` was in the review arguments for #${authorisedPr}`
|
|
19277
|
+
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
19278
|
};
|
|
19166
19279
|
}
|
|
19167
19280
|
__name(reviewWriteAuthorization, "reviewWriteAuthorization");
|
|
@@ -19403,6 +19516,7 @@ function runPublishAssets(args) {
|
|
|
19403
19516
|
const effectiveHost = resolveGhHost(args.host);
|
|
19404
19517
|
const auth = reviewWriteAuthorization({
|
|
19405
19518
|
userAuthorized: args.userAuthorized,
|
|
19519
|
+
defaultComment: args.defaultComment,
|
|
19406
19520
|
skillArgs: args.skillArgs,
|
|
19407
19521
|
pr: args.pr,
|
|
19408
19522
|
// Bind the REVIEWED repo when the caller names it, never the assets repo:
|
|
@@ -19609,7 +19723,11 @@ var publishAssetsCommand = {
|
|
|
19609
19723
|
out: argv["out"],
|
|
19610
19724
|
host: argv["host"],
|
|
19611
19725
|
userAuthorized: Boolean(argv["user-authorized"]),
|
|
19612
|
-
skillArgs: argv["skill-args"]
|
|
19726
|
+
skillArgs: argv["skill-args"],
|
|
19727
|
+
// The same operator-scope resolution as `submit`: the two callers of
|
|
19728
|
+
// the shared gate must agree on what authorises a run, or a run that
|
|
19729
|
+
// posts the review still refuses to publish its evidence images.
|
|
19730
|
+
defaultComment: operatorReviewSettings().comment
|
|
19613
19731
|
});
|
|
19614
19732
|
}, "handler")
|
|
19615
19733
|
};
|
|
@@ -20318,6 +20436,7 @@ function buildChunkAgentPrompt(report, id, rules) {
|
|
|
20318
20436
|
"",
|
|
20319
20437
|
` Uncoverable: chunk ${chunk2.id} \u2014 line exceeds the read limit`
|
|
20320
20438
|
);
|
|
20439
|
+
return parts.join("\n");
|
|
20321
20440
|
} else if (chunk2.oversized) {
|
|
20322
20441
|
parts.push(
|
|
20323
20442
|
"",
|
|
@@ -20332,6 +20451,8 @@ function buildChunkAgentPrompt(report, id, rules) {
|
|
|
20332
20451
|
"",
|
|
20333
20452
|
"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
20453
|
"",
|
|
20454
|
+
"**Shape check (part of code quality \u2014 the altitude lens, scoped to your territory).** For the code in YOUR chunk: " + ENUMERATION_TRAP_LENS,
|
|
20455
|
+
"",
|
|
20335
20456
|
FINDING_FORMAT,
|
|
20336
20457
|
"",
|
|
20337
20458
|
SEVERITY,
|
|
@@ -23840,9 +23961,8 @@ function isDiffLine(n) {
|
|
|
23840
23961
|
return typeof n === "number" && Number.isSafeInteger(n) && n > 0;
|
|
23841
23962
|
}
|
|
23842
23963
|
__name(isDiffLine, "isDiffLine");
|
|
23843
|
-
function normalizeInlineComments(comments, modelId, cliVersion) {
|
|
23844
|
-
|
|
23845
|
-
const footer = reviewFooter(modelId, cliVersion);
|
|
23964
|
+
function normalizeInlineComments(comments, modelId, cliVersion, attribution) {
|
|
23965
|
+
const footer = attribution && typeof modelId === "string" && modelId.trim() !== "" ? reviewFooter(modelId, cliVersion) : void 0;
|
|
23846
23966
|
return comments.map(
|
|
23847
23967
|
(comment2) => (
|
|
23848
23968
|
// An empty body stays empty: this runs BEFORE the consistency check, and
|
|
@@ -23850,7 +23970,9 @@ function normalizeInlineComments(comments, modelId, cliVersion) {
|
|
|
23850
23970
|
// names it ('has no body — an empty comment').
|
|
23851
23971
|
typeof comment2.body === "string" && comment2.body.trim() !== "" ? {
|
|
23852
23972
|
...comment2,
|
|
23853
|
-
|
|
23973
|
+
// Forged footers are stripped even with attribution off: a comment
|
|
23974
|
+
// authored by the model must not carry one the operator turned off.
|
|
23975
|
+
body: footer === void 0 ? stripReviewFooter(comment2.body) : `${stripReviewFooter(comment2.body)}
|
|
23854
23976
|
|
|
23855
23977
|
${footer}`
|
|
23856
23978
|
} : comment2
|
|
@@ -23858,9 +23980,10 @@ ${footer}`
|
|
|
23858
23980
|
);
|
|
23859
23981
|
}
|
|
23860
23982
|
__name(normalizeInlineComments, "normalizeInlineComments");
|
|
23861
|
-
function authorization(args) {
|
|
23983
|
+
function authorization(args, defaultComment) {
|
|
23862
23984
|
return reviewWriteAuthorization({
|
|
23863
23985
|
userAuthorized: args.userAuthorized,
|
|
23986
|
+
defaultComment,
|
|
23864
23987
|
skillArgs: args.skillArgs,
|
|
23865
23988
|
pr: args.pr,
|
|
23866
23989
|
repo: args.repo,
|
|
@@ -23871,7 +23994,7 @@ function authorization(args) {
|
|
|
23871
23994
|
});
|
|
23872
23995
|
}
|
|
23873
23996
|
__name(authorization, "authorization");
|
|
23874
|
-
function compose(payload, cliVersion) {
|
|
23997
|
+
function compose(payload, cliVersion, attribution) {
|
|
23875
23998
|
const comments = payload.comments ?? [];
|
|
23876
23999
|
const state = payload.state ?? {};
|
|
23877
24000
|
const { criticalsInline, suggestionsInline } = countInlineFindings(comments);
|
|
@@ -23891,7 +24014,8 @@ function compose(payload, cliVersion) {
|
|
|
23891
24014
|
suggestionsInline,
|
|
23892
24015
|
draftedComments: comments
|
|
23893
24016
|
},
|
|
23894
|
-
cliVersion
|
|
24017
|
+
cliVersion,
|
|
24018
|
+
attribution
|
|
23895
24019
|
);
|
|
23896
24020
|
return { event: r.event, body: r.body, cappedBy: r.cappedBy };
|
|
23897
24021
|
}
|
|
@@ -23971,7 +24095,8 @@ function inconsistencies(payload, event2) {
|
|
|
23971
24095
|
return problems;
|
|
23972
24096
|
}
|
|
23973
24097
|
__name(inconsistencies, "inconsistencies");
|
|
23974
|
-
function runSubmit(args, cliVersion = "unknown") {
|
|
24098
|
+
function runSubmit(args, cliVersion = "unknown", opts = {}) {
|
|
24099
|
+
const { attribution = true, defaultComment = false } = opts;
|
|
23975
24100
|
setGhHost(args.host);
|
|
23976
24101
|
if (!isOwnerRepo(args.repo)) {
|
|
23977
24102
|
throw new Error(
|
|
@@ -23991,11 +24116,12 @@ function runSubmit(args, cliVersion = "unknown") {
|
|
|
23991
24116
|
`Cannot read review JSON ${args.review}: ${err.message}`
|
|
23992
24117
|
);
|
|
23993
24118
|
}
|
|
23994
|
-
const auth = authorization(args);
|
|
24119
|
+
const auth = authorization(args, defaultComment);
|
|
23995
24120
|
if (!auth.ok) {
|
|
24121
|
+
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
24122
|
writeStderrLine(
|
|
23997
24123
|
`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.
|
|
24124
|
+
Posting is a public, irreversible write, and this run has no authorisation for one. ${advice}`
|
|
23999
24125
|
);
|
|
24000
24126
|
writeStdoutLine(
|
|
24001
24127
|
JSON.stringify({ posted: false, reason: auth.why }, null, 2)
|
|
@@ -24015,14 +24141,15 @@ Posting is a public, irreversible write, and this run has no authorisation for o
|
|
|
24015
24141
|
comments: normalizeInlineComments(
|
|
24016
24142
|
payload.comments ?? [],
|
|
24017
24143
|
payload.state?.modelId,
|
|
24018
|
-
cliVersion
|
|
24144
|
+
cliVersion,
|
|
24145
|
+
attribution
|
|
24019
24146
|
)
|
|
24020
24147
|
};
|
|
24021
24148
|
let event2;
|
|
24022
24149
|
let body;
|
|
24023
24150
|
let cappedBy;
|
|
24024
24151
|
try {
|
|
24025
|
-
({ event: event2, body, cappedBy } = compose(payload, cliVersion));
|
|
24152
|
+
({ event: event2, body, cappedBy } = compose(payload, cliVersion, attribution));
|
|
24026
24153
|
} catch (err) {
|
|
24027
24154
|
throw new Error(
|
|
24028
24155
|
`The review state does not compose into a verdict; refusing to post:
|
|
@@ -24122,7 +24249,7 @@ var submitCommand = {
|
|
|
24122
24249
|
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
24250
|
}).option("skill-args", {
|
|
24124
24251
|
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."
|
|
24252
|
+
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
24253
|
}).option("user-authorized", {
|
|
24127
24254
|
type: "boolean",
|
|
24128
24255
|
default: false,
|
|
@@ -24137,7 +24264,11 @@ var submitCommand = {
|
|
|
24137
24264
|
}), "builder"),
|
|
24138
24265
|
handler: /* @__PURE__ */ __name(async (argv) => {
|
|
24139
24266
|
const cliVersion = footerVersion(process.env["QWEN_CODE_STARTUP_VERSION"]) ?? await getCliVersion();
|
|
24140
|
-
|
|
24267
|
+
const review = operatorReviewSettings();
|
|
24268
|
+
runSubmit(argv, cliVersion, {
|
|
24269
|
+
attribution: review.attribution,
|
|
24270
|
+
defaultComment: review.comment
|
|
24271
|
+
});
|
|
24141
24272
|
}, "handler")
|
|
24142
24273
|
};
|
|
24143
24274
|
|
|
@@ -27361,10 +27492,10 @@ var updateCommand3 = {
|
|
|
27361
27492
|
stdioHelpers,
|
|
27362
27493
|
{ updateEventEmitter }
|
|
27363
27494
|
] = await Promise.all([
|
|
27364
|
-
import("./settings-
|
|
27365
|
-
import("./updateCheck-
|
|
27366
|
-
import("./installationInfo-
|
|
27367
|
-
import("./standalone-update-
|
|
27495
|
+
import("./settings-3HRWSH66.js"),
|
|
27496
|
+
import("./updateCheck-N4RT7HOZ.js"),
|
|
27497
|
+
import("./installationInfo-63AFHLWA.js"),
|
|
27498
|
+
import("./standalone-update-K5G3L2OJ.js"),
|
|
27368
27499
|
import("./stdioHelpers-7A2EE64Z.js"),
|
|
27369
27500
|
import("./updateEventEmitter-5MKC7BLQ.js")
|
|
27370
27501
|
]);
|
|
@@ -28439,6 +28570,9 @@ async function loadCliConfig(settings, argv, cwd = process.cwd(), overrideExtens
|
|
|
28439
28570
|
const screenReader = argv.screenReader !== void 0 ? argv.screenReader : settings.ui?.accessibility?.screenReader ?? false;
|
|
28440
28571
|
let sessionId;
|
|
28441
28572
|
let sessionData;
|
|
28573
|
+
let sessionRestoreProjection;
|
|
28574
|
+
const sessionRestoreProjectionSource = hostPolicy?.sessionRestore?.projectionSource;
|
|
28575
|
+
let deferProjectionUntilWriterLease = false;
|
|
28442
28576
|
if (argv.continue || argv.resume) {
|
|
28443
28577
|
const sessionService = new SessionService(cwd);
|
|
28444
28578
|
if (argv.continue) {
|
|
@@ -28454,8 +28588,19 @@ async function loadCliConfig(settings, argv, cwd = process.cwd(), overrideExtens
|
|
|
28454
28588
|
}
|
|
28455
28589
|
if (argv.resume) {
|
|
28456
28590
|
sessionId = argv.resume;
|
|
28457
|
-
|
|
28458
|
-
if (
|
|
28591
|
+
deferProjectionUntilWriterLease = sessionRestoreProjectionSource !== void 0 && (argv.chatRecording ?? settings.general?.chatRecording ?? true) && isAcpMode === true && settings.experimental?.sessionWriterLease === true;
|
|
28592
|
+
if (sessionRestoreProjectionSource) {
|
|
28593
|
+
if (!deferProjectionUntilWriterLease && !argv.forkSession) {
|
|
28594
|
+
addDaemonRequestAttribute(
|
|
28595
|
+
"qwen-code.daemon.session_restore.projection_acquisition",
|
|
28596
|
+
"preloaded"
|
|
28597
|
+
);
|
|
28598
|
+
sessionRestoreProjection = await sessionRestoreProjectionSource(sessionId);
|
|
28599
|
+
}
|
|
28600
|
+
} else {
|
|
28601
|
+
sessionData = await sessionService.loadSession(argv.resume);
|
|
28602
|
+
}
|
|
28603
|
+
if (!sessionRestoreProjectionSource && !sessionData) {
|
|
28459
28604
|
const message = `No saved session found with ID ${argv.resume}. Run \`qwen --resume\` without an ID to choose from existing sessions.`;
|
|
28460
28605
|
writeStderrLine(message);
|
|
28461
28606
|
process.exit(1);
|
|
@@ -28473,10 +28618,21 @@ async function loadCliConfig(settings, argv, cwd = process.cwd(), overrideExtens
|
|
|
28473
28618
|
process.exit(1);
|
|
28474
28619
|
}
|
|
28475
28620
|
sessionId = forkedSessionId;
|
|
28476
|
-
|
|
28477
|
-
|
|
28478
|
-
|
|
28479
|
-
|
|
28621
|
+
if (sessionRestoreProjectionSource) {
|
|
28622
|
+
sessionData = void 0;
|
|
28623
|
+
if (!deferProjectionUntilWriterLease) {
|
|
28624
|
+
addDaemonRequestAttribute(
|
|
28625
|
+
"qwen-code.daemon.session_restore.projection_acquisition",
|
|
28626
|
+
"preloaded"
|
|
28627
|
+
);
|
|
28628
|
+
sessionRestoreProjection = await sessionRestoreProjectionSource(forkedSessionId);
|
|
28629
|
+
}
|
|
28630
|
+
} else {
|
|
28631
|
+
sessionData = await sessionService.loadSession(forkedSessionId);
|
|
28632
|
+
if (!sessionData) {
|
|
28633
|
+
writeStderrLine(`Failed to load forked session ${forkedSessionId}.`);
|
|
28634
|
+
process.exit(1);
|
|
28635
|
+
}
|
|
28480
28636
|
}
|
|
28481
28637
|
}
|
|
28482
28638
|
} else if (argv.sandboxSessionId) {
|
|
@@ -28502,6 +28658,8 @@ async function loadCliConfig(settings, argv, cwd = process.cwd(), overrideExtens
|
|
|
28502
28658
|
}
|
|
28503
28659
|
const modelProvidersConfig = settings.modelProviders;
|
|
28504
28660
|
const providerProtocolConfig = settings.providerProtocol;
|
|
28661
|
+
const restoreSessionId = sessionId;
|
|
28662
|
+
const boundSessionRestoreProjectionSource = sessionRestoreProjectionSource && restoreSessionId ? () => sessionRestoreProjectionSource(restoreSessionId) : void 0;
|
|
28505
28663
|
const cliMcpServers = parseMcpConfig(argv.mcpConfig);
|
|
28506
28664
|
const topTierMcpServers = sessionMcpServers || cliMcpServers ? { ...sessionMcpServers, ...cliMcpServers ?? {} } : void 0;
|
|
28507
28665
|
const mcpServers = bareMode || safeMode ? { ...topTierMcpServers } : assembleMcpServers(settings.mcpServers, cwd, topTierMcpServers);
|
|
@@ -28509,6 +28667,8 @@ async function loadCliConfig(settings, argv, cwd = process.cwd(), overrideExtens
|
|
|
28509
28667
|
const configParams = {
|
|
28510
28668
|
sessionId,
|
|
28511
28669
|
sessionData,
|
|
28670
|
+
sessionRestoreProjection,
|
|
28671
|
+
sessionRestoreProjectionSource: boundSessionRestoreProjectionSource,
|
|
28512
28672
|
embeddingModel: DEFAULT_QWEN_EMBEDDING_MODEL,
|
|
28513
28673
|
sandbox: sandboxConfig,
|
|
28514
28674
|
targetDir: cwd,
|
|
@@ -28526,7 +28686,7 @@ async function loadCliConfig(settings, argv, cwd = process.cwd(), overrideExtens
|
|
|
28526
28686
|
disabledSlashCommands: disabledSlashCommands.length > 0 ? disabledSlashCommands : void 0,
|
|
28527
28687
|
disabledSkillNamesProvider: bareMode || safeMode ? void 0 : disabledSkillNamesProvider,
|
|
28528
28688
|
terminalImageRenderSupportProvider: interactive ? async () => {
|
|
28529
|
-
const { getTerminalImageRenderSupport } = await import("./terminal-image-renderer-
|
|
28689
|
+
const { getTerminalImageRenderSupport } = await import("./terminal-image-renderer-C4RQMC67.js");
|
|
28530
28690
|
return getTerminalImageRenderSupport();
|
|
28531
28691
|
} : void 0,
|
|
28532
28692
|
disabledSkillLevels: bareMode || safeMode || !Array.isArray(settings.skills?.disabledLevels) ? void 0 : settings.skills.disabledLevels.filter(isSkillLevel),
|