@qwen-code/qwen-code 0.21.8-nightly.20260810.55e20db328 → 0.21.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- package/bundled/qc-helper/docs/configuration/settings.md +2 -1
- package/bundled/qc-helper/docs/features/code-review.md +2 -0
- package/bundled/qc-helper/docs/qwen-serve.md +38 -37
- package/bundled/review/SKILL.md +7 -7
- package/chunks/{MaxSizedBox-A52T4GEU.js → MaxSizedBox-6BZANW7X.js} +3 -3
- package/chunks/{StandaloneSessionPicker-4J654SOB.js → StandaloneSessionPicker-VDC5KE7T.js} +19 -16
- package/chunks/{acpAgent-65AM4AOR.js → acpAgent-F2NSBCUF.js} +49 -40
- package/chunks/{agent-SVQ7U7NJ.js → agent-VOHJOEBB.js} +3 -3
- package/chunks/{agent-headless-XXGY2SQO.js → agent-headless-J5NFOPHP.js} +3 -3
- package/chunks/{bridge-Y32B5S3G.js → bridge-NQIZZLAS.js} +4 -4
- package/chunks/{channel-settings-store-OW43U6VB.js → channel-settings-store-VIY2OENO.js} +11 -9
- package/chunks/{chunk-OR6R3IUW.js → chunk-23VQTELM.js} +1 -1
- package/chunks/{chunk-VHXPSL57.js → chunk-3WDYBTTI.js} +4 -4
- package/chunks/{chunk-FAD7OC7V.js → chunk-3XVDTHBJ.js} +2 -2
- package/chunks/{chunk-7XX5IBXL.js → chunk-46YJDYCU.js} +6 -6
- package/chunks/{chunk-FYB4GIDW.js → chunk-4XQNB3KN.js} +2 -2
- package/chunks/chunk-5EJZE3FP.js +140 -0
- package/chunks/{chunk-DPMJLKUP.js → chunk-5RBDAGC6.js} +2 -2
- package/chunks/{chunk-D2D7J3EW.js → chunk-7AEPJGL4.js} +1 -1
- package/chunks/{chunk-HKI3KHAO.js → chunk-7GOYZQPR.js} +19 -1976
- package/chunks/{chunk-2ASQDZSJ.js → chunk-7S4JBJLU.js} +3 -3
- package/chunks/{chunk-EISUQQPS.js → chunk-ATMO54WE.js} +2 -2
- package/chunks/{chunk-NZMXUSKS.js → chunk-BAMN6XSD.js} +1 -1
- package/chunks/{chunk-2545EHZR.js → chunk-BIRWP6LU.js} +1 -1
- package/chunks/{chunk-UGUKH3SU.js → chunk-BZP4QPNK.js} +9 -9
- package/chunks/{chunk-AUWN7BAG.js → chunk-D7BXVKSF.js} +1 -1
- package/chunks/{chunk-TXO5BMR2.js → chunk-DH5YXSIF.js} +2 -2
- package/chunks/{chunk-OSVH4SMN.js → chunk-FBMCDU63.js} +3 -3
- package/chunks/{chunk-GY24H6IA.js → chunk-FCLHHEUK.js} +10 -10
- package/chunks/{chunk-FWWQIFDT.js → chunk-G2TX5ZXC.js} +3 -3
- package/chunks/{chunk-HDYQYYWB.js → chunk-GAKGOXTC.js} +1 -1
- package/chunks/{chunk-TWFFY5BP.js → chunk-HADWBW5R.js} +4 -4
- package/chunks/{chunk-E2N554HK.js → chunk-HZGBKOX3.js} +2 -2
- package/chunks/{chunk-V47QNK5W.js → chunk-II6G3EY6.js} +288 -72
- package/chunks/{chunk-ZV7LTLFE.js → chunk-IOEZE2YT.js} +1 -1
- package/chunks/chunk-JUWS2Z5K.js +1995 -0
- package/chunks/{chunk-F3II4BTZ.js → chunk-K4ADGWHU.js} +1 -1
- package/chunks/{chunk-5ZTS3OQ3.js → chunk-KSAFZ5TA.js} +1 -1
- package/chunks/{chunk-KMS57JDD.js → chunk-KTKYGS2P.js} +29 -6
- package/chunks/{chunk-HWXGX534.js → chunk-KTQGGPGV.js} +3 -3
- package/chunks/{chunk-ZIKTCMQF.js → chunk-LZZLUCRS.js} +5 -5
- package/chunks/{chunk-S5CULOHB.js → chunk-MHP476D3.js} +64 -21
- package/chunks/{chunk-PNVPFARW.js → chunk-MTCYGTWH.js} +4 -4
- package/chunks/{chunk-WQYWK4DG.js → chunk-OGDIJKHK.js} +1 -1
- package/chunks/{chunk-WH6QMLUW.js → chunk-OGNFHGIG.js} +3 -3
- package/chunks/{chunk-P5ULXPK5.js → chunk-P2FK2HBV.js} +2 -2
- package/chunks/{chunk-5WZL724W.js → chunk-P3RBMQ4P.js} +3 -3
- package/chunks/{chunk-4EOURKA4.js → chunk-P4ZEZSJZ.js} +177 -17
- package/chunks/{chunk-RQ6U2JJQ.js → chunk-PNBBJOCP.js} +1 -1
- package/chunks/{chunk-E2T7FLDU.js → chunk-PVOGHGSF.js} +5 -5
- package/chunks/{chunk-EUVOKP6Y.js → chunk-QSNSL4R4.js} +1 -1
- package/chunks/{chunk-RYQMJCUO.js → chunk-RBHQXGDK.js} +1 -1
- package/chunks/{chunk-ZI5IH2HP.js → chunk-RVSTTOJ4.js} +2 -2
- package/chunks/{chunk-OW2BWT2P.js → chunk-SCAZZ3Q4.js} +4 -4
- package/chunks/{chunk-OBP6QWD5.js → chunk-T5RLUXWJ.js} +2 -2
- package/chunks/{chunk-KP25NJNM.js → chunk-T6HEQR2Q.js} +16 -5
- package/chunks/{chunk-RMPLEWF3.js → chunk-THIKWITR.js} +2 -2
- package/chunks/{chunk-V2226RFW.js → chunk-TQCYNLNJ.js} +1 -1
- package/chunks/{chunk-O277O7U6.js → chunk-TZ6KJ44L.js} +1 -1
- package/chunks/{chunk-ZCJBCKL5.js → chunk-UJUM2SRN.js} +115 -29
- package/chunks/{chunk-3KJQZEN3.js → chunk-UYAUA63Q.js} +1 -1
- package/chunks/chunk-VFMASYQA.js +389 -0
- package/chunks/chunk-VGHZT6JR.js +51 -0
- package/chunks/{chunk-H4JC7LZX.js → chunk-W3FSZSF2.js} +1 -1
- package/chunks/{chunk-YFRFZCIP.js → chunk-WGK4TSB7.js} +3 -3
- package/chunks/{chunk-BL65MO72.js → chunk-WP5VOXF7.js} +6 -127
- package/chunks/{chunk-T2O6NIOY.js → chunk-XTY5DN4Y.js} +1 -1
- package/chunks/{chunk-47ZUMGGY.js → chunk-XX7QFP34.js} +56 -55
- package/chunks/{chunk-ZSNBQXMZ.js → chunk-YTFDX4PR.js} +8 -3
- package/chunks/{chunk-F6TUUA2U.js → chunk-ZBXGWQ4S.js} +2 -2
- package/chunks/{chunk-YR7ZQ4RD.js → chunk-ZOSTTOUJ.js} +1 -1
- package/chunks/{chunk-UAB6J2IE.js → chunk-ZTQSOV56.js} +3 -3
- package/chunks/{computer-use-SLN7DV2E.js → computer-use-PMZ7ICGY.js} +3 -3
- package/chunks/{contextCommand-EHFYX6FW.js → contextCommand-GEZU7YHE.js} +6 -5
- package/chunks/{core-runtime-FBSP5IIG.js → core-runtime-HRJI2MN6.js} +3 -3
- package/chunks/{create-sub-session-WC7YGVSL.js → create-sub-session-VBNVI4YU.js} +3 -3
- package/chunks/{daemon-VSX3FHTY.js → daemon-POSQPD3G.js} +26 -3
- package/chunks/{daemon-status-provider-WW2AD2T7.js → daemon-status-provider-N4CRQKFI.js} +8 -8
- package/chunks/{daemon-trust-policy-E4MAYWPI.js → daemon-trust-policy-BHO3JUHM.js} +11 -9
- package/chunks/{daemon-trust-policy-monitor-XVIDV6T4.js → daemon-trust-policy-monitor-YEKJ2726.js} +11 -9
- package/chunks/{deferred-core-runtime-5SVUC6UC.js → deferred-core-runtime-SH57E3J3.js} +3 -3
- package/chunks/{earlyInputCapture-72FYHYRD.js → earlyInputCapture-B2JJ2HME.js} +3 -3
- package/chunks/{edit-SWVVWHXW.js → edit-7FTXENAN.js} +5 -3
- package/chunks/{enter-worktree-2HF6WQEO.js → enter-worktree-JPHV2PBG.js} +3 -3
- package/chunks/{enterPlanMode-OW6S7L4P.js → enterPlanMode-CGBJ3AHJ.js} +3 -3
- package/chunks/{environment-LRTBTDXH.js → environment-LXASZAHD.js} +6 -6
- package/chunks/{errors-4CO2DME6.js → errors-XIGVT2AD.js} +5 -5
- package/chunks/{exit-worktree-GHJEIRGL.js → exit-worktree-DKSGXW65.js} +3 -3
- package/chunks/{exitPlanMode-JVP4FNNK.js → exitPlanMode-THFL2HYN.js} +3 -3
- package/chunks/{fast-path-HCCY7GR2.js → fast-path-4NXAT5UL.js} +3 -3
- package/chunks/{fast-path-settings-MN5QQQET.js → fast-path-settings-RPAVBD7P.js} +2 -2
- package/chunks/{gemini-V3YVRKXU.js → gemini-B3N6FACU.js} +39 -44
- package/chunks/{geminiContentGenerator-LVPMQUWX.js → geminiContentGenerator-YYFE2HIE.js} +1 -1
- package/chunks/{glob-7HRXHYDR.js → glob-BPHSCFJP.js} +3 -3
- package/chunks/{grep-BITQUON5.js → grep-ROZIRFLU.js} +3 -3
- package/chunks/{handleAutoUpdate-DKFY454S.js → handleAutoUpdate-WV6SPZQB.js} +8 -7
- package/chunks/{i18n-53BQIQSH.js → i18n-YWJWPQKD.js} +8 -6
- package/chunks/{image-gen-H62FLDFB.js → image-gen-SISRZ6FS.js} +1 -1
- package/chunks/{initializer-Q7NUQRSU.js → initializer-66OAD6GO.js} +11 -9
- package/chunks/{installationInfo-BWFHT7WU.js → installationInfo-3YUGIP36.js} +4 -4
- package/chunks/{list-OWQKR6JK.js → list-VEYR66XB.js} +14 -12
- package/chunks/{loadedSettingsAdapter-HNPKQMFA.js → loadedSettingsAdapter-V2JCPCYD.js} +11 -9
- package/chunks/{loggingContentGenerator-A5I3VQUC.js → loggingContentGenerator-RBLNDREC.js} +1 -1
- package/chunks/{managed-npm-update-CUUJGUTV.js → managed-npm-update-C5ID5R4R.js} +4 -4
- package/chunks/{mcp-GJSC7ZPO.js → mcp-OZ54NZJQ.js} +11 -9
- package/chunks/{monitor-TZ2II7JM.js → monitor-7Y4TVFTK.js} +3 -3
- package/chunks/{nonInteractiveCli-22RS4EVH.js → nonInteractiveCli-QEK4LHAC.js} +35 -33
- package/chunks/{notebook-edit-YZC3YPY2.js → notebook-edit-OG35EBGY.js} +4 -3
- package/chunks/{openaiContentGenerator-OIGO5XNF.js → openaiContentGenerator-443BNRPJ.js} +1 -1
- package/chunks/{pidfile-QJQ65RJ2.js → pidfile-ZK4OLRZA.js} +3 -3
- package/chunks/{processUtils-V5VSDIKS.js → processUtils-4YGB4RUZ.js} +2 -2
- package/chunks/{qwenContentGenerator-HXM25BGB.js → qwenContentGenerator-D5C2LCSZ.js} +3 -3
- package/chunks/{qwenOAuth2-7MTMS2Z5.js → qwenOAuth2-Z4YQBMYN.js} +1 -1
- package/chunks/{read-file-PMGXB3ZB.js → read-file-EXTJLWMU.js} +1 -1
- package/chunks/{resumeHistoryUtils-YUTPLHUH.js → resumeHistoryUtils-UPCGRJUL.js} +7 -6
- package/chunks/{ripGrep-XUS66YIV.js → ripGrep-QBVIRCU4.js} +3 -3
- package/chunks/{run-qwen-serve-4NVSU75L.js → run-qwen-serve-ZYGJNE3E.js} +67 -51
- package/chunks/{runtime-QLRVP6HM.js → runtime-BZZ4LWCP.js} +12 -10
- package/chunks/{scheduler-PBB2NSOP.js → scheduler-YNQNOU2E.js} +131 -11
- package/chunks/{serve-BWKTRX72.js → serve-LJHAXDCH.js} +11 -9
- package/chunks/{server-E7CH7WPK.js → server-ADMLELR6.js} +256 -750
- package/chunks/{session-QEKSJ6YU.js → session-YKZXFFTM.js} +36 -34
- package/chunks/{settings-BRAOSJIM.js → settings-EQBUAQ7Y.js} +10 -8
- package/chunks/{shell-OF3CK4AT.js → shell-3QZOJGTT.js} +3 -3
- package/chunks/{skill-HLH2NO2H.js → skill-UWSSMXE7.js} +1 -1
- package/chunks/{skill-settings-DRPU7YI5.js → skill-settings-T6MLB7NU.js} +10 -8
- package/chunks/{spawnChannel-4KO7YTFM.js → spawnChannel-VS7ZFUFP.js} +3 -3
- package/chunks/{standalone-update-DJN2R3YW.js → standalone-update-2W26SRRO.js} +6 -5
- package/chunks/{startInteractiveUI-O3WQQ2WC.js → startInteractiveUI-CVS7K3D6.js} +55 -45
- package/chunks/{team-create-2E4ACBJD.js → team-create-4WFTNNUL.js} +3 -3
- package/chunks/{team-plan-approval-LWIDXYOA.js → team-plan-approval-DBYI33S3.js} +3 -3
- package/chunks/{terminal-image-renderer-PJM7663W.js → terminal-image-renderer-S5WPPQKH.js} +3 -3
- package/chunks/{theme-manager-FDQTM3RP.js → theme-manager-LI2RIOVR.js} +3 -3
- package/chunks/{tool-search-TL5ZXBF4.js → tool-search-4773EUQ4.js} +1 -1
- package/chunks/{total-session-admission-LS6EY5KT.js → total-session-admission-PAY5CH2Z.js} +4 -4
- package/chunks/{trustedFolders-5RWP5OB7.js → trustedFolders-FRSLE674.js} +4 -4
- package/chunks/{update-relaunch-HWQ4USKY.js → update-relaunch-ZSFQTU6M.js} +5 -5
- package/chunks/{updateCheck-EZMBTEIR.js → updateCheck-AXWSO7KA.js} +7 -6
- package/chunks/{useAutoAcceptIndicator-JDMI627A.js → useAutoAcceptIndicator-VHLXIA7U.js} +11 -9
- package/chunks/{validateNonInterActiveAuth-RRUHC5RO.js → validateNonInterActiveAuth-PDJECMFU.js} +32 -30
- package/chunks/{version-XS4UTKUX.js → version-RBN764QS.js} +1 -1
- package/chunks/{web-fetch-2JV7H6OM.js → web-fetch-7BJK42AF.js} +1 -1
- package/chunks/{web-search-RCTN2GAM.js → web-search-L2CILQXV.js} +2 -2
- package/chunks/{workflow-6MKLKQ6R.js → workflow-5VH2R74I.js} +4 -4
- package/chunks/{workspace-providers-status-YZ2IJ4DK.js → workspace-providers-status-OZTQ6JFH.js} +13 -11
- package/chunks/{workspace-registration-store-IYN72LBS.js → workspace-registration-store-IX5RJQS5.js} +1 -1
- package/chunks/{workspace-registry-7LFBZQLT.js → workspace-registry-73N4BGG4.js} +4 -4
- package/chunks/{workspace-service-2EHSPRJB.js → workspace-service-I5RUPSNV.js} +14 -12
- package/chunks/{workspace-skills-status-5VJ2D5HN.js → workspace-skills-status-DMK6VYDO.js} +11 -9
- package/chunks/{workspace-trust-reconciler-X2LZ6XCI.js → workspace-trust-reconciler-QX4RL3TC.js} +12 -10
- package/chunks/{write-file-CJK6SCCF.js → write-file-UGDD5UTS.js} +3 -3
- package/chunks/{zoom-image-BVW4RFYW.js → zoom-image-ZAHEO3YP.js} +1 -1
- package/cli.js +12 -12
- package/package.json +3 -3
- package/web-shell/assets/{arc-DDtoJrAW.js → arc-CHY4saMJ.js} +1 -1
- package/web-shell/assets/{architectureDiagram-3BPJPVTR-BAInIW4O.js → architectureDiagram-3BPJPVTR-Bu6CwvHj.js} +1 -1
- package/web-shell/assets/{blockDiagram-GPEHLZMM-ChPDk7fP.js → blockDiagram-GPEHLZMM-XGt6iGf_.js} +1 -1
- package/web-shell/assets/{c4Diagram-AAUBKEIU-Cd9BJuUy.js → c4Diagram-AAUBKEIU-CBbYl19W.js} +1 -1
- package/web-shell/assets/channel-B40srHOa.js +1 -0
- package/web-shell/assets/{chunk-2J33WTMH-COQkLp56.js → chunk-2J33WTMH-BEhmVrdx.js} +1 -1
- package/web-shell/assets/{chunk-4BX2VUAB-GUJshQ_l.js → chunk-4BX2VUAB-fQLyE0Bg.js} +1 -1
- package/web-shell/assets/{chunk-55IACEB6-Boaa7c10.js → chunk-55IACEB6-yGdtyx4a.js} +1 -1
- package/web-shell/assets/{chunk-727SXJPM-CcRXaly2.js → chunk-727SXJPM-DYbX2GLo.js} +1 -1
- package/web-shell/assets/{chunk-AQP2D5EJ-BY0OARHh.js → chunk-AQP2D5EJ-DyKTEsYn.js} +1 -1
- package/web-shell/assets/{chunk-FMBD7UC4-DLFQfv0S.js → chunk-FMBD7UC4-D8Uy_GzX.js} +1 -1
- package/web-shell/assets/{chunk-ND2GUHAM-C_S0u-D2.js → chunk-ND2GUHAM-C8wNR2K7.js} +1 -1
- package/web-shell/assets/{chunk-QZHKN3VN-DP9m64hw.js → chunk-QZHKN3VN-BnybNxnt.js} +1 -1
- package/web-shell/assets/classDiagram-4FO5ZUOK-qumcXQW_.js +1 -0
- package/web-shell/assets/classDiagram-v2-Q7XG4LA2-qumcXQW_.js +1 -0
- package/web-shell/assets/{cose-bilkent-S5V4N54A-CGY6zGE1.js → cose-bilkent-S5V4N54A-jq4uiFRp.js} +1 -1
- package/web-shell/assets/{dagre-BM42HDAG-yB7whKNn.js → dagre-BM42HDAG-Bs7oye1U.js} +1 -1
- package/web-shell/assets/{diagram-2AECGRRQ-Bdlc59La.js → diagram-2AECGRRQ-BHGGJNyM.js} +1 -1
- package/web-shell/assets/{diagram-5GNKFQAL-BUClP18L.js → diagram-5GNKFQAL-BJezVLGT.js} +1 -1
- package/web-shell/assets/{diagram-KO2AKTUF-aZm08kjn.js → diagram-KO2AKTUF-5JzQN_rL.js} +1 -1
- package/web-shell/assets/{diagram-LMA3HP47-7DGwEkxC.js → diagram-LMA3HP47-BlPYOgY9.js} +1 -1
- package/web-shell/assets/{diagram-OG6HWLK6-CAGKayxx.js → diagram-OG6HWLK6-CtMHEaFK.js} +1 -1
- package/web-shell/assets/{erDiagram-TEJ5UH35-CptoHHQi.js → erDiagram-TEJ5UH35-CRNdq2AB.js} +1 -1
- package/web-shell/assets/{flowDiagram-I6XJVG4X-CNOH0s7Q.js → flowDiagram-I6XJVG4X-De1WwLzu.js} +1 -1
- package/web-shell/assets/{ganttDiagram-6RSMTGT7-CCQuCU3y.js → ganttDiagram-6RSMTGT7-YbWfL5Zn.js} +1 -1
- package/web-shell/assets/{gitGraphDiagram-PVQCEYII-B7gv9f4E.js → gitGraphDiagram-PVQCEYII-DzCN8bmd.js} +1 -1
- package/web-shell/assets/index-BDOGGGaN.css +5 -0
- package/web-shell/assets/{index-BoUPVvpf.js → index-CocPvF9Q.js} +1 -1
- package/web-shell/assets/index-DSH2KrMc.js +1771 -0
- package/web-shell/assets/{infoDiagram-5YYISTIA-Bb3KYEbR.js → infoDiagram-5YYISTIA-DLHoopnE.js} +1 -1
- package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-DWEzbAGi.js → ishikawaDiagram-YF4QCWOH-XnbU04SS.js} +1 -1
- package/web-shell/assets/{journeyDiagram-JHISSGLW-CmxwEqeb.js → journeyDiagram-JHISSGLW-CipPyEeJ.js} +1 -1
- package/web-shell/assets/{kanban-definition-UN3LZRKU-Ci0gDD8O.js → kanban-definition-UN3LZRKU-DrSeyE5d.js} +1 -1
- package/web-shell/assets/{linear-BqxZqGhS.js → linear-LrBKnAo_.js} +1 -1
- package/web-shell/assets/{mermaid.core-BDAFffHv.js → mermaid.core-C3U9UVmf.js} +5 -5
- package/web-shell/assets/{mindmap-definition-RKZ34NQL-Btvx-xvS.js → mindmap-definition-RKZ34NQL-DqRWgC9H.js} +1 -1
- package/web-shell/assets/{pieDiagram-4H26LBE5-CKAg7yG7.js → pieDiagram-4H26LBE5-BNXY5p6H.js} +1 -1
- package/web-shell/assets/{quadrantDiagram-W4KKPZXB-DIt8E1mC.js → quadrantDiagram-W4KKPZXB-Ccj9QzE4.js} +1 -1
- package/web-shell/assets/{requirementDiagram-4Y6WPE33-BA7mQWQJ.js → requirementDiagram-4Y6WPE33-CjPM2_gx.js} +1 -1
- package/web-shell/assets/{sankeyDiagram-5OEKKPKP-D0JppnVU.js → sankeyDiagram-5OEKKPKP-C0RsvKbj.js} +1 -1
- package/web-shell/assets/{sequenceDiagram-3UESZ5HK-29DIQFjB.js → sequenceDiagram-3UESZ5HK-ClN1P5z7.js} +1 -1
- package/web-shell/assets/{stateDiagram-AJRCARHV-iiXMdK--.js → stateDiagram-AJRCARHV-By0eiB2Y.js} +1 -1
- package/web-shell/assets/stateDiagram-v2-BHNVJYJU-Ds0WlK3F.js +1 -0
- package/web-shell/assets/{timeline-definition-PNZ67QCA-CeF7ngSW.js → timeline-definition-PNZ67QCA-g_iaSQgv.js} +1 -1
- package/web-shell/assets/{vennDiagram-CIIHVFJN-Beilq8D6.js → vennDiagram-CIIHVFJN-y9ZqJ-TD.js} +1 -1
- package/web-shell/assets/{wardley-L42UT6IY-DOYjY4zO.js → wardley-L42UT6IY-BVVfaxpF.js} +1 -1
- package/web-shell/assets/{wardleyDiagram-YWT4CUSO-Dtqp8o18.js → wardleyDiagram-YWT4CUSO-D3ooZKZT.js} +1 -1
- package/web-shell/assets/{xychartDiagram-2RQKCTM6-cdAc0Dfv.js → xychartDiagram-2RQKCTM6-6GXrY6M1.js} +1 -1
- package/web-shell/index.html +2 -2
- package/chunks/chunk-R4ZA6GBK.js +0 -208
- package/web-shell/assets/channel-0OQklTfP.js +0 -1
- package/web-shell/assets/classDiagram-4FO5ZUOK-CZ4-apsu.js +0 -1
- package/web-shell/assets/classDiagram-v2-Q7XG4LA2-CZ4-apsu.js +0 -1
- package/web-shell/assets/index-D1YQXYsB.css +0 -5
- package/web-shell/assets/index-J4N7zCmU.js +0 -1768
- package/web-shell/assets/stateDiagram-v2-BHNVJYJU-CEGK3l80.js +0 -1
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
staleArgsWarning,
|
|
9
9
|
validateAuthMethod,
|
|
10
10
|
writeSkillArgs
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-II6G3EY6.js";
|
|
12
12
|
import {
|
|
13
13
|
calculateCost,
|
|
14
14
|
computeSessionStats,
|
|
@@ -17,7 +17,7 @@ import {
|
|
|
17
17
|
findInlineMathExpressions,
|
|
18
18
|
getSystemInfoFields,
|
|
19
19
|
levelLabel
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-5RBDAGC6.js";
|
|
21
21
|
import {
|
|
22
22
|
isKittyProtocolEnabled
|
|
23
23
|
} from "./chunk-NYX53SV4.js";
|
|
@@ -28,16 +28,16 @@ import {
|
|
|
28
28
|
} from "./chunk-NV3F44FL.js";
|
|
29
29
|
import {
|
|
30
30
|
contextCommand
|
|
31
|
-
} from "./chunk-
|
|
31
|
+
} from "./chunk-DH5YXSIF.js";
|
|
32
32
|
import {
|
|
33
33
|
themeManager
|
|
34
34
|
} from "./chunk-CTJLZLB5.js";
|
|
35
35
|
import {
|
|
36
36
|
rollbackStandaloneUpdate
|
|
37
|
-
} from "./chunk-
|
|
37
|
+
} from "./chunk-RVSTTOJ4.js";
|
|
38
38
|
import {
|
|
39
39
|
getErrorMessage as getErrorMessage2
|
|
40
|
-
} from "./chunk-
|
|
40
|
+
} from "./chunk-P2FK2HBV.js";
|
|
41
41
|
import {
|
|
42
42
|
GITHUB_WORKFLOW_PATHS,
|
|
43
43
|
INSIGHT_CSS,
|
|
@@ -51,10 +51,11 @@ import {
|
|
|
51
51
|
toJson,
|
|
52
52
|
toJsonl,
|
|
53
53
|
toMarkdown
|
|
54
|
-
} from "./chunk-
|
|
54
|
+
} from "./chunk-P3RBMQ4P.js";
|
|
55
55
|
import {
|
|
56
56
|
stripUnsafeCharacters,
|
|
57
|
-
toCodePoints
|
|
57
|
+
toCodePoints,
|
|
58
|
+
truncateToWidth
|
|
58
59
|
} from "./chunk-4NFY2S7N.js";
|
|
59
60
|
import {
|
|
60
61
|
isValidSessionId
|
|
@@ -66,12 +67,12 @@ import {
|
|
|
66
67
|
isVoiceEnabled,
|
|
67
68
|
readVoiceMode,
|
|
68
69
|
readVoiceModel
|
|
69
|
-
} from "./chunk-
|
|
70
|
+
} from "./chunk-GAKGOXTC.js";
|
|
70
71
|
import {
|
|
71
72
|
getExtendedSystemInfo,
|
|
72
73
|
getGitVersion,
|
|
73
74
|
getNpmVersion
|
|
74
|
-
} from "./chunk-
|
|
75
|
+
} from "./chunk-7S4JBJLU.js";
|
|
75
76
|
import {
|
|
76
77
|
formatDuration,
|
|
77
78
|
formatTokenCount
|
|
@@ -79,7 +80,7 @@ import {
|
|
|
79
80
|
import {
|
|
80
81
|
isInlineModelOverrideAllowed,
|
|
81
82
|
parseAcpModelOption
|
|
82
|
-
} from "./chunk-
|
|
83
|
+
} from "./chunk-KTQGGPGV.js";
|
|
83
84
|
import {
|
|
84
85
|
OUTPUT_LANGUAGE_AUTO,
|
|
85
86
|
getAllSettingKeys,
|
|
@@ -91,22 +92,24 @@ import {
|
|
|
91
92
|
resolveOutputLanguageOrPreserveAuto,
|
|
92
93
|
validateSettingValue,
|
|
93
94
|
writeOutputLanguageAndRegisterPath
|
|
94
|
-
} from "./chunk-
|
|
95
|
+
} from "./chunk-JUWS2Z5K.js";
|
|
95
96
|
import {
|
|
96
|
-
SUPPORTED_LANGUAGES,
|
|
97
97
|
getCurrentLanguage,
|
|
98
|
-
getSupportedLanguageIds,
|
|
99
|
-
resolveSupportedLanguage,
|
|
100
98
|
setLanguageAsync,
|
|
101
99
|
t
|
|
102
|
-
} from "./chunk-
|
|
100
|
+
} from "./chunk-WP5VOXF7.js";
|
|
101
|
+
import {
|
|
102
|
+
SUPPORTED_LANGUAGES,
|
|
103
|
+
getSupportedLanguageIds,
|
|
104
|
+
resolveSupportedLanguage
|
|
105
|
+
} from "./chunk-5EJZE3FP.js";
|
|
103
106
|
import {
|
|
104
107
|
getInstallationInfo
|
|
105
|
-
} from "./chunk-
|
|
108
|
+
} from "./chunk-BIRWP6LU.js";
|
|
106
109
|
import {
|
|
107
110
|
isFolderTrustEnabled,
|
|
108
111
|
loadTrustedFolders
|
|
109
|
-
} from "./chunk-
|
|
112
|
+
} from "./chunk-ZOSTTOUJ.js";
|
|
110
113
|
import {
|
|
111
114
|
require_strip_json_comments
|
|
112
115
|
} from "./chunk-NPQ5ZKRP.js";
|
|
@@ -180,13 +183,13 @@ import {
|
|
|
180
183
|
runForkedAgent,
|
|
181
184
|
tryGenerateSessionTitle,
|
|
182
185
|
unregisterGoalHook
|
|
183
|
-
} from "./chunk-
|
|
186
|
+
} from "./chunk-XX7QFP34.js";
|
|
184
187
|
import {
|
|
185
188
|
external_exports
|
|
186
189
|
} from "./chunk-H6XPXXMH.js";
|
|
187
190
|
import {
|
|
188
191
|
resolveModelId
|
|
189
|
-
} from "./chunk-
|
|
192
|
+
} from "./chunk-K4ADGWHU.js";
|
|
190
193
|
import {
|
|
191
194
|
getAutoSkillCuratorStatus,
|
|
192
195
|
parse,
|
|
@@ -259,7 +262,7 @@ import {
|
|
|
259
262
|
isCpuProfileRecording,
|
|
260
263
|
startCpuProfile,
|
|
261
264
|
stopCpuProfile
|
|
262
|
-
} from "./chunk-
|
|
265
|
+
} from "./chunk-OGDIJKHK.js";
|
|
263
266
|
import {
|
|
264
267
|
init_esbuild_shims
|
|
265
268
|
} from "./chunk-5O2XNYP6.js";
|
|
@@ -2049,7 +2052,7 @@ var approvalModeCommand = {
|
|
|
2049
2052
|
};
|
|
2050
2053
|
}
|
|
2051
2054
|
}
|
|
2052
|
-
const autoModeNotices = mode === "auto" /* AUTO */ && priorMode !== "auto" /* AUTO */ && config ? await import("./useAutoAcceptIndicator-
|
|
2055
|
+
const autoModeNotices = mode === "auto" /* AUTO */ && priorMode !== "auto" /* AUTO */ && config ? await import("./useAutoAcceptIndicator-VHLXIA7U.js") : void 0;
|
|
2053
2056
|
if (config) {
|
|
2054
2057
|
try {
|
|
2055
2058
|
config.setApprovalMode(mode);
|
|
@@ -2816,6 +2819,88 @@ function resetBackgroundStateForSessionSwitch(config) {
|
|
|
2816
2819
|
config.getWorkflowRunRegistry().reset();
|
|
2817
2820
|
}
|
|
2818
2821
|
__name(resetBackgroundStateForSessionSwitch, "resetBackgroundStateForSessionSwitch");
|
|
2822
|
+
var MAX_LISTED_BLOCKING_ENTRIES = 10;
|
|
2823
|
+
var MAX_BLOCKING_LABEL_WIDTH = 80;
|
|
2824
|
+
function describeBlockingBackgroundWork(config) {
|
|
2825
|
+
const now = Date.now();
|
|
2826
|
+
const entries = [];
|
|
2827
|
+
for (const entry of config.getBackgroundTaskRegistry().getAll()) {
|
|
2828
|
+
if (!entry.isBackgrounded || entry.status !== "running") continue;
|
|
2829
|
+
entries.push({
|
|
2830
|
+
startTime: entry.startTime,
|
|
2831
|
+
id: entry.agentId,
|
|
2832
|
+
label: buildBackgroundEntryLabel(entry),
|
|
2833
|
+
status: entry.status,
|
|
2834
|
+
isWorkflowRun: false
|
|
2835
|
+
});
|
|
2836
|
+
}
|
|
2837
|
+
for (const entry of config.getMonitorRegistry().getRunning()) {
|
|
2838
|
+
entries.push({
|
|
2839
|
+
startTime: entry.startTime,
|
|
2840
|
+
id: entry.monitorId,
|
|
2841
|
+
label: entry.description,
|
|
2842
|
+
status: entry.status,
|
|
2843
|
+
isWorkflowRun: false
|
|
2844
|
+
});
|
|
2845
|
+
}
|
|
2846
|
+
for (const entry of config.getBackgroundShellRegistry().getAll()) {
|
|
2847
|
+
if (entry.status !== "running") continue;
|
|
2848
|
+
entries.push({
|
|
2849
|
+
startTime: entry.startTime,
|
|
2850
|
+
id: entry.shellId,
|
|
2851
|
+
label: entry.command,
|
|
2852
|
+
status: entry.status,
|
|
2853
|
+
isWorkflowRun: false
|
|
2854
|
+
});
|
|
2855
|
+
}
|
|
2856
|
+
for (const entry of config.getWorkflowRunRegistry().list()) {
|
|
2857
|
+
if (entry.status !== "running" && entry.status !== "pausing") continue;
|
|
2858
|
+
entries.push({
|
|
2859
|
+
startTime: entry.startTime,
|
|
2860
|
+
id: entry.runId,
|
|
2861
|
+
label: entry.meta?.name ?? entry.runId,
|
|
2862
|
+
status: entry.status,
|
|
2863
|
+
isWorkflowRun: true
|
|
2864
|
+
});
|
|
2865
|
+
}
|
|
2866
|
+
if (entries.length === 0) return void 0;
|
|
2867
|
+
entries.sort((a, b) => a.startTime - b.startTime);
|
|
2868
|
+
const listed = entries.slice(0, MAX_LISTED_BLOCKING_ENTRIES);
|
|
2869
|
+
const lines = listed.map((entry) => {
|
|
2870
|
+
const label = truncateToWidth(
|
|
2871
|
+
stripUnsafeCharacters(entry.label).replace(/[\r\n]+/g, " "),
|
|
2872
|
+
MAX_BLOCKING_LABEL_WIDTH
|
|
2873
|
+
);
|
|
2874
|
+
return ` [${entry.id}] ${label} (${entry.status} ${formatDuration(
|
|
2875
|
+
now - entry.startTime,
|
|
2876
|
+
{ hideTrailingZeros: true }
|
|
2877
|
+
)})`;
|
|
2878
|
+
});
|
|
2879
|
+
const overflow = entries.length - listed.length;
|
|
2880
|
+
if (overflow > 0) {
|
|
2881
|
+
lines.push(` \u2026and ${overflow} more`);
|
|
2882
|
+
}
|
|
2883
|
+
return {
|
|
2884
|
+
lines,
|
|
2885
|
+
hasTaskEntries: entries.some((entry) => !entry.isWorkflowRun),
|
|
2886
|
+
hasWorkflowRuns: entries.some((entry) => entry.isWorkflowRun)
|
|
2887
|
+
};
|
|
2888
|
+
}
|
|
2889
|
+
__name(describeBlockingBackgroundWork, "describeBlockingBackgroundWork");
|
|
2890
|
+
function buildBackgroundWorkBlockedMessage(config, baseMessage) {
|
|
2891
|
+
const blocking = describeBlockingBackgroundWork(config);
|
|
2892
|
+
if (!blocking) return baseMessage;
|
|
2893
|
+
const surfaces = [
|
|
2894
|
+
...blocking.hasTaskEntries ? ["/tasks"] : [],
|
|
2895
|
+
...blocking.hasWorkflowRuns ? ["/workflows"] : []
|
|
2896
|
+
].join(" and ");
|
|
2897
|
+
return [
|
|
2898
|
+
baseMessage,
|
|
2899
|
+
...blocking.lines,
|
|
2900
|
+
`Use ${surfaces} to inspect them, then retry.`
|
|
2901
|
+
].join("\n");
|
|
2902
|
+
}
|
|
2903
|
+
__name(buildBackgroundWorkBlockedMessage, "buildBackgroundWorkBlockedMessage");
|
|
2819
2904
|
|
|
2820
2905
|
// packages/cli/src/ui/commands/clearCommand.ts
|
|
2821
2906
|
import process2 from "node:process";
|
|
@@ -2838,12 +2923,12 @@ var clearCommand = {
|
|
|
2838
2923
|
}
|
|
2839
2924
|
if (config) {
|
|
2840
2925
|
if (hasBlockingBackgroundWork(config)) {
|
|
2841
|
-
const
|
|
2842
|
-
context.ui.setDebugMessage(
|
|
2926
|
+
const baseMessage = "Stop the current session's running background tasks before starting a new session.";
|
|
2927
|
+
context.ui.setDebugMessage(baseMessage);
|
|
2843
2928
|
return {
|
|
2844
2929
|
type: "message",
|
|
2845
2930
|
messageType: "error",
|
|
2846
|
-
content
|
|
2931
|
+
content: buildBackgroundWorkBlockedMessage(config, baseMessage)
|
|
2847
2932
|
};
|
|
2848
2933
|
}
|
|
2849
2934
|
config.getHookSystem()?.fireSessionEndEvent("clear" /* Clear */).catch((err) => {
|
|
@@ -6787,7 +6872,7 @@ var expandNowCommand = {
|
|
|
6787
6872
|
content: t("History is already expanded in this session.")
|
|
6788
6873
|
};
|
|
6789
6874
|
}
|
|
6790
|
-
const { expandCollapsedHistory } = await import("./resumeHistoryUtils-
|
|
6875
|
+
const { expandCollapsedHistory } = await import("./resumeHistoryUtils-UPCGRJUL.js");
|
|
6791
6876
|
const updated = expandCollapsedHistory(history);
|
|
6792
6877
|
loadHistory(updated);
|
|
6793
6878
|
refreshStatic();
|
|
@@ -14023,10 +14108,10 @@ var updateCommand = {
|
|
|
14023
14108
|
{ performStandaloneUpdate },
|
|
14024
14109
|
installationInfo
|
|
14025
14110
|
] = await Promise.all([
|
|
14026
|
-
import("./updateCheck-
|
|
14027
|
-
import("./processUtils-
|
|
14028
|
-
import("./standalone-update-
|
|
14029
|
-
import("./installationInfo-
|
|
14111
|
+
import("./updateCheck-AXWSO7KA.js"),
|
|
14112
|
+
import("./processUtils-4YGB4RUZ.js"),
|
|
14113
|
+
import("./standalone-update-2W26SRRO.js"),
|
|
14114
|
+
import("./installationInfo-3YUGIP36.js")
|
|
14030
14115
|
]);
|
|
14031
14116
|
const { formatUpdateInstructions, getInstallationInfo: getInstallationInfo2 } = installationInfo;
|
|
14032
14117
|
const settings = context.services.settings;
|
|
@@ -16280,6 +16365,7 @@ export {
|
|
|
16280
16365
|
formatApprovalModeDescription,
|
|
16281
16366
|
hasBlockingBackgroundWork,
|
|
16282
16367
|
resetBackgroundStateForSessionSwitch,
|
|
16368
|
+
buildBackgroundWorkBlockedMessage,
|
|
16283
16369
|
isAtCommand,
|
|
16284
16370
|
hasSlashCommandPathSeparator,
|
|
16285
16371
|
isSlashCommand,
|
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
// Force strict mode and setup for ESM
|
|
2
|
+
"use strict";
|
|
3
|
+
import {
|
|
4
|
+
writeStderrLineSafe
|
|
5
|
+
} from "./chunk-KGJGEEVR.js";
|
|
6
|
+
import {
|
|
7
|
+
init_esbuild_shims
|
|
8
|
+
} from "./chunk-5O2XNYP6.js";
|
|
9
|
+
import {
|
|
10
|
+
__name
|
|
11
|
+
} from "./chunk-J2S4EL5Y.js";
|
|
12
|
+
|
|
13
|
+
// packages/cli/src/config/acp-channel-fallback.ts
|
|
14
|
+
init_esbuild_shims();
|
|
15
|
+
var QWEN_CODE_SERVE_ENV = "QWEN_CODE_SERVE";
|
|
16
|
+
var QWEN_CODE_DESKTOP_ENV = "QWEN_CODE_DESKTOP";
|
|
17
|
+
function resolveAcpChannelFallback(env = process.env) {
|
|
18
|
+
if (env[QWEN_CODE_DESKTOP_ENV] === "1") {
|
|
19
|
+
return "desktop";
|
|
20
|
+
}
|
|
21
|
+
if (env[QWEN_CODE_SERVE_ENV] === "1") {
|
|
22
|
+
return "daemon";
|
|
23
|
+
}
|
|
24
|
+
return "ACP";
|
|
25
|
+
}
|
|
26
|
+
__name(resolveAcpChannelFallback, "resolveAcpChannelFallback");
|
|
27
|
+
|
|
28
|
+
// packages/cli/src/config/shared-env-keys.ts
|
|
29
|
+
init_esbuild_shims();
|
|
30
|
+
var DEFAULT_EXCLUDED_ENV_VARS = ["DEBUG", "DEBUG_MODE"];
|
|
31
|
+
var ENV_CORRUPTED_PATH = "QWEN_CODE_SETTINGS_CORRUPTED_PATH";
|
|
32
|
+
var ENV_WAS_RECOVERED = "QWEN_CODE_SETTINGS_WAS_RECOVERED";
|
|
33
|
+
var ENV_ACP_REPEATED_TOOL_FAILURE_GUARD = "QWEN_CODE_ACP_REPEATED_TOOL_FAILURE_GUARD";
|
|
34
|
+
var PROJECT_ENV_HARDCODED_EXCLUSIONS = [
|
|
35
|
+
"QWEN_HOME",
|
|
36
|
+
"QWEN_RUNTIME_DIR",
|
|
37
|
+
"QWEN_CODE_MCP_APPROVALS_PATH",
|
|
38
|
+
"QWEN_CODE_TRUSTED_FOLDERS_PATH",
|
|
39
|
+
// Runtime attribution markers are stamped by trusted launchers. A project
|
|
40
|
+
// `.env` must not spoof client channel telemetry.
|
|
41
|
+
QWEN_CODE_SERVE_ENV,
|
|
42
|
+
QWEN_CODE_DESKTOP_ENV,
|
|
43
|
+
ENV_CORRUPTED_PATH,
|
|
44
|
+
ENV_WAS_RECOVERED,
|
|
45
|
+
// This is an operator rollout policy. A project must not be able to promote
|
|
46
|
+
// itself from the default shadow cohort into warning or enforcement.
|
|
47
|
+
ENV_ACP_REPEATED_TOOL_FAILURE_GUARD,
|
|
48
|
+
// QWEN_TLS_INSECURE (and NODE_TLS_REJECT_UNAUTHORIZED, which it mirrors)
|
|
49
|
+
// disable TLS certificate verification for all outbound API connections. A
|
|
50
|
+
// project `.env` must never enable either — that would let an untrusted repo
|
|
51
|
+
// silently turn off MITM protection. Opt-in stays with the user via the
|
|
52
|
+
// `--insecure` flag, the shell environment, or a home `.env`. The initial
|
|
53
|
+
// `.env` load only consults this list, so both keys must be here (not just
|
|
54
|
+
// RELOAD_EXCLUDED_KEYS, which only applies on reload).
|
|
55
|
+
"QWEN_TLS_INSECURE",
|
|
56
|
+
"NODE_TLS_REJECT_UNAUTHORIZED",
|
|
57
|
+
// NODE_EXTRA_CA_CERTS reaches the same outcome by adding a TLS trust
|
|
58
|
+
// anchor instead of disabling verification.
|
|
59
|
+
"NODE_EXTRA_CA_CERTS",
|
|
60
|
+
// The non-Node TLS trust-anchor vars reach the SAME MITM outcome for the
|
|
61
|
+
// curl/git/openssl/python tools a session subprocess routinely shells out
|
|
62
|
+
// to: they are honored unconditionally as a CA bundle/dir, and npm/pip
|
|
63
|
+
// honor their own equivalents (npm_config_cafile / npm_config_ca / PIP_CERT
|
|
64
|
+
// as attacker CAs, npm_config_strict_ssl=false disables verification with
|
|
65
|
+
// no CA at all; GIT_SSL_CAPATH is git's directory-form twin of
|
|
66
|
+
// GIT_SSL_CAINFO). A project `.env` pointing any of them at an attacker CA
|
|
67
|
+
// lets an untrusted repo silently intercept token-bearing traffic
|
|
68
|
+
// (git/npm/pip fetches) for every workspace's sessions — the exact outcome
|
|
69
|
+
// NODE_EXTRA_CA_CERTS is blocked for. Like NODE_EXTRA_CA_CERTS these stay
|
|
70
|
+
// reject-from-project-`.env` only: a value the operator set in their own
|
|
71
|
+
// login shell or home `.env` is their trusted choice and is preserved.
|
|
72
|
+
"SSL_CERT_FILE",
|
|
73
|
+
"SSL_CERT_DIR",
|
|
74
|
+
"CURL_CA_BUNDLE",
|
|
75
|
+
"REQUESTS_CA_BUNDLE",
|
|
76
|
+
"GIT_SSL_CAINFO",
|
|
77
|
+
"GIT_SSL_CAPATH",
|
|
78
|
+
"npm_config_cafile",
|
|
79
|
+
"npm_config_ca",
|
|
80
|
+
// npm treats underscore/hyphen spellings of a config key as the same key
|
|
81
|
+
// (see canonicalLoaderKey below), so both forms of strict-ssl are listed.
|
|
82
|
+
"npm_config_strict_ssl",
|
|
83
|
+
"npm_config_strict-ssl",
|
|
84
|
+
"PIP_CERT",
|
|
85
|
+
// CURL_HOME / WGETRC redirect curl/wget at attacker rc files
|
|
86
|
+
// (`$CURL_HOME/.curlrc`, the file WGETRC names) whose `proxy`, `cacert`, or
|
|
87
|
+
// `insecure` directives intercept or downgrade the same token-bearing
|
|
88
|
+
// traffic — the config-file-redirect class this list already blocks for npm
|
|
89
|
+
// (`npm_config_userconfig`), git (`GIT_CONFIG_GLOBAL`), and OpenSSL
|
|
90
|
+
// (`OPENSSL_CONF`).
|
|
91
|
+
"CURL_HOME",
|
|
92
|
+
"WGETRC",
|
|
93
|
+
// PIP_CONFIG_FILE redirects all of pip's configuration at the file it
|
|
94
|
+
// names — index-url, trusted-host, proxy, cert, or client-cert in an
|
|
95
|
+
// attacker file sends session pip traffic or credentials to attacker
|
|
96
|
+
// infrastructure — the same config-file-redirect class as
|
|
97
|
+
// npm_config_userconfig and GIT_CONFIG_GLOBAL.
|
|
98
|
+
"PIP_CONFIG_FILE",
|
|
99
|
+
// The git command-execution env family: git runs these on any invocation in
|
|
100
|
+
// a session subprocess. GIT_SSH_COMMAND / GIT_SSH (its documented legacy
|
|
101
|
+
// counterpart, still exec'd by git for SSH transports) / GIT_EXTERNAL_DIFF
|
|
102
|
+
// execute a command directly; GIT_ASKPASS / GIT_PROXY_COMMAND / GIT_EDITOR
|
|
103
|
+
// / GIT_SEQUENCE_EDITOR are exec'd conditionally (credential prompt, proxy
|
|
104
|
+
// transport, editor, `git rebase -i` todo-list edit);
|
|
105
|
+
// GIT_EXEC_PATH redirects git's own remote-helper/subcommand lookup at an
|
|
106
|
+
// attacker directory and GIT_TEMPLATE_DIR plants hooks that run after the
|
|
107
|
+
// next clone/init; GIT_CONFIG_* injects arbitrary config (`core.hooksPath`,
|
|
108
|
+
// `core.fsmonitor`, …) that turns a routine `git commit` into
|
|
109
|
+
// attacker-code execution as the daemon user — GIT_CONFIG_PARAMETERS
|
|
110
|
+
// carries the same injection as one quoted string, so it is blocked with
|
|
111
|
+
// GIT_CONFIG_COUNT and the numbered pairs. core/utils/git-branches.ts
|
|
112
|
+
// scrubs the config-injection subset from the repo's own git invocations,
|
|
113
|
+
// so a project `.env` setting this family contradicts that model. Numbered
|
|
114
|
+
// GIT_CONFIG_KEY_<n>/GIT_CONFIG_VALUE_<n> pairs are matched by numeric
|
|
115
|
+
// suffix below.
|
|
116
|
+
"GIT_SSH_COMMAND",
|
|
117
|
+
"GIT_SSH",
|
|
118
|
+
"GIT_EXEC_PATH",
|
|
119
|
+
"GIT_TEMPLATE_DIR",
|
|
120
|
+
"GIT_ASKPASS",
|
|
121
|
+
"GIT_PROXY_COMMAND",
|
|
122
|
+
"GIT_EDITOR",
|
|
123
|
+
"GIT_SEQUENCE_EDITOR",
|
|
124
|
+
"GIT_EXTERNAL_DIFF",
|
|
125
|
+
"GIT_CONFIG_GLOBAL",
|
|
126
|
+
"GIT_CONFIG_SYSTEM",
|
|
127
|
+
// git merges `$XDG_CONFIG_HOME/git/config` with `~/.gitconfig`, so a
|
|
128
|
+
// project `.env` redirecting XDG_CONFIG_HOME plants the same config
|
|
129
|
+
// injection (`core.hooksPath`, …) the GIT_CONFIG_* keys block — without
|
|
130
|
+
// naming a git config file at all.
|
|
131
|
+
"XDG_CONFIG_HOME",
|
|
132
|
+
"GIT_CONFIG_COUNT",
|
|
133
|
+
"GIT_CONFIG_PARAMETERS",
|
|
134
|
+
// git falls back to executing $SSH_ASKPASS for passphrase prompts (its
|
|
135
|
+
// askpass order is GIT_ASKPASS > core.askPass > SSH_ASKPASS, and ssh runs
|
|
136
|
+
// it whenever SSH_ASKPASS_REQUIRE=force or no terminal is available), so a
|
|
137
|
+
// project `.env` pointing it at an attacker script is code execution on
|
|
138
|
+
// any git/ssh auth challenge. SSH_ASKPASS_REQUIRE stays settable: it only
|
|
139
|
+
// selects *when* the askpass program runs, and with SSH_ASKPASS
|
|
140
|
+
// project-blocked it has no program to execute.
|
|
141
|
+
"SSH_ASKPASS",
|
|
142
|
+
// less executes $LESSOPEN as an input preprocessor on every file a session
|
|
143
|
+
// views (and $LESSCLOSE on exit whenever the preprocessor ran), so a
|
|
144
|
+
// project `.env` setting either is attacker command execution the first
|
|
145
|
+
// time a session runs `less`.
|
|
146
|
+
"LESSOPEN",
|
|
147
|
+
"LESSCLOSE",
|
|
148
|
+
// node-gyp interpreter selection: node-gyp's find-python.js executes
|
|
149
|
+
// NODE_GYP_FORCE_PYTHON / npm_config_python / PYTHON as the build Python,
|
|
150
|
+
// so a project `.env` pointing them at an attacker script is code execution
|
|
151
|
+
// during any native-addon `npm install` in another workspace's session.
|
|
152
|
+
// Unlike the pure-injection loader keys these have a legitimate
|
|
153
|
+
// operator-shell use (selecting a real interpreter), so they are
|
|
154
|
+
// reject-from-project-`.env` only, not scrubbed from the launch env.
|
|
155
|
+
"NODE_GYP_FORCE_PYTHON",
|
|
156
|
+
"npm_config_python",
|
|
157
|
+
"PYTHON",
|
|
158
|
+
// CPython executes $PYTHONSTARTUP at interactive startup — the Python
|
|
159
|
+
// analogue of NODE_REPL_EXTERNAL_MODULE. It stays reject-only (like
|
|
160
|
+
// PYTHON) because operators legitimately set it in their own shells.
|
|
161
|
+
"PYTHONSTARTUP",
|
|
162
|
+
// git's documented editor fallback chain (GIT_EDITOR → core.editor →
|
|
163
|
+
// $VISUAL → $EDITOR) executes these exactly like the blocked GIT_EDITOR,
|
|
164
|
+
// and the CLI's own useLaunchEditor spawns them from ordinary interactive
|
|
165
|
+
// flows.
|
|
166
|
+
"VISUAL",
|
|
167
|
+
"EDITOR",
|
|
168
|
+
// npm runs `$npm_config_git` as the git binary for install-from-git and
|
|
169
|
+
// similar flows, so a project `.env` pointing it at an attacker script is
|
|
170
|
+
// the same exec redirect as the interpreter keys above.
|
|
171
|
+
"npm_config_git",
|
|
172
|
+
// The CLI itself execs $BROWSER via openBrowserSecurely (core/utils/
|
|
173
|
+
// secure-browser-launcher.ts) before any CI/DISPLAY gate, so a project
|
|
174
|
+
// `.env` pointing it at an attacker script runs on any browser-launch
|
|
175
|
+
// flow.
|
|
176
|
+
"BROWSER",
|
|
177
|
+
// QWEN_CLI_ENTRY is the script path daemon-spawned session processes run.
|
|
178
|
+
// A project `.env` or settings.env fixing it turns
|
|
179
|
+
// `cd <untrusted repo> && qwen serve` into code execution as the daemon
|
|
180
|
+
// via an attacker-chosen ACP entrypoint, for every workspace's sessions.
|
|
181
|
+
"QWEN_CLI_ENTRY",
|
|
182
|
+
// QWEN_CDP_MCP_COMMAND is the command the daemon spawns as the
|
|
183
|
+
// browser-automation MCP adapter, and QWEN_SERVE_CDP_TUNNEL_OVER_WS
|
|
184
|
+
// switches that tunnel surface on. A project `.env` or settings.env fixing
|
|
185
|
+
// either hijacks the daemon the same way QWEN_CLI_ENTRY does; values the
|
|
186
|
+
// operator set in the daemon's launch env still apply.
|
|
187
|
+
"QWEN_CDP_MCP_COMMAND",
|
|
188
|
+
"QWEN_SERVE_CDP_TUNNEL_OVER_WS",
|
|
189
|
+
// DEV gates the daemon's inherited-loader-env scrub (run-qwen-serve.ts);
|
|
190
|
+
// only the dev harness (scripts/dev.js) stamps it into the launch env. A
|
|
191
|
+
// project file setting it would silently keep loader vars in the base env
|
|
192
|
+
// distributed to every workspace's session children — reopening the #8653
|
|
193
|
+
// vector for any repo whose .env happens to carry DEV=true.
|
|
194
|
+
"DEV"
|
|
195
|
+
];
|
|
196
|
+
var HARDCODED_PROJECT_ENV_EXCLUSIONS = new Set(
|
|
197
|
+
PROJECT_ENV_HARDCODED_EXCLUSIONS.map((key) => key.toLowerCase())
|
|
198
|
+
);
|
|
199
|
+
var HARDCODED_PROJECT_ENV_EXCLUSION_PATTERNS = [
|
|
200
|
+
/^git_config_key_\d+$/u,
|
|
201
|
+
/^git_config_value_\d+$/u
|
|
202
|
+
];
|
|
203
|
+
function isHardcodedProjectEnvExclusion(key) {
|
|
204
|
+
const lowerKey = key.toLowerCase();
|
|
205
|
+
return HARDCODED_PROJECT_ENV_EXCLUSIONS.has(lowerKey) || HARDCODED_PROJECT_ENV_EXCLUSION_PATTERNS.some(
|
|
206
|
+
(pattern) => pattern.test(lowerKey)
|
|
207
|
+
);
|
|
208
|
+
}
|
|
209
|
+
__name(isHardcodedProjectEnvExclusion, "isHardcodedProjectEnvExclusion");
|
|
210
|
+
var HOME_ENV_BOOTSTRAP_KEYS = [
|
|
211
|
+
"QWEN_HOME",
|
|
212
|
+
"QWEN_RUNTIME_DIR",
|
|
213
|
+
"QWEN_CODE_MCP_APPROVALS_PATH",
|
|
214
|
+
"QWEN_CODE_TRUSTED_FOLDERS_PATH"
|
|
215
|
+
];
|
|
216
|
+
var INHERITED_LOADER_ENV_KEYS = [
|
|
217
|
+
"NODE_OPTIONS",
|
|
218
|
+
// npm maps its `node-options` config onto npm_config_node_options in the
|
|
219
|
+
// environment, and `npm run` lifecycle scripts apply it like NODE_OPTIONS —
|
|
220
|
+
// the same hijack through an adjacent key. The config-file keys are the
|
|
221
|
+
// same hijack one level up: they point npm at an attacker-chosen .npmrc
|
|
222
|
+
// that can itself set node-options/script-shell/ignore-scripts, and `npm
|
|
223
|
+
// run` itself exports them into the script environment.
|
|
224
|
+
"npm_config_node_options",
|
|
225
|
+
"npm_config_userconfig",
|
|
226
|
+
"npm_config_globalconfig",
|
|
227
|
+
"npm_config_script_shell",
|
|
228
|
+
"npm_config_prefix",
|
|
229
|
+
"NODE_PATH",
|
|
230
|
+
// OPENSSL_CONF points Node's startup crypto init at an attacker `.cnf`
|
|
231
|
+
// whose `nodejs_conf` section can dlopen an arbitrary engine/provider `.so`
|
|
232
|
+
// before any user code runs — a pure code-injection vector with no benign
|
|
233
|
+
// cross-workspace inheritance, so it is scrubbed like NODE_OPTIONS.
|
|
234
|
+
"OPENSSL_CONF",
|
|
235
|
+
// NODE_REPL_EXTERNAL_MODULE makes a spawned `node` REPL require() an
|
|
236
|
+
// attacker file at startup. npm_config_node_gyp overrides the node-gyp
|
|
237
|
+
// *script* npm's shim runs verbatim (`"$npm_config_node_gyp" "$@"`), and
|
|
238
|
+
// npm_config_init_module is require()d by `npm init` (even `-y`). All three
|
|
239
|
+
// are executable/module redirects with no legitimate login-shell use, so
|
|
240
|
+
// they join the scrubbed loader set rather than the reject-only tier.
|
|
241
|
+
"NODE_REPL_EXTERNAL_MODULE",
|
|
242
|
+
"npm_config_node_gyp",
|
|
243
|
+
"npm_config_init_module",
|
|
244
|
+
"LD_PRELOAD",
|
|
245
|
+
"LD_AUDIT",
|
|
246
|
+
"DYLD_INSERT_LIBRARIES",
|
|
247
|
+
"BASH_ENV",
|
|
248
|
+
// zsh sources $ZDOTDIR/.zshenv on every invocation, including
|
|
249
|
+
// non-interactive `zsh -c` — the zsh analogue of BASH_ENV.
|
|
250
|
+
"ZDOTDIR"
|
|
251
|
+
// BASH_FUNC_* exported-function definitions are bash's other env-driven
|
|
252
|
+
// code-import channel (non-interactive `bash -c` still imports them);
|
|
253
|
+
// matched by prefix in isLoaderEnvKey, not listed here.
|
|
254
|
+
];
|
|
255
|
+
var canonicalLoaderKey = /* @__PURE__ */ __name((key) => key.toLowerCase().replace(/_/gu, "-"), "canonicalLoaderKey");
|
|
256
|
+
var LOADER_ENV_KEYS = new Set(
|
|
257
|
+
INHERITED_LOADER_ENV_KEYS.map(canonicalLoaderKey)
|
|
258
|
+
);
|
|
259
|
+
function isLoaderEnvKey(key) {
|
|
260
|
+
const canonical = canonicalLoaderKey(key);
|
|
261
|
+
return canonical.startsWith("bash-func-") || LOADER_ENV_KEYS.has(canonical);
|
|
262
|
+
}
|
|
263
|
+
__name(isLoaderEnvKey, "isLoaderEnvKey");
|
|
264
|
+
function scrubInheritedLoaderEnv(env, snapshotInto) {
|
|
265
|
+
const removedKeys = [];
|
|
266
|
+
for (const key of Object.keys(env)) {
|
|
267
|
+
if (isLoaderEnvKey(key)) {
|
|
268
|
+
const value = env[key];
|
|
269
|
+
if (snapshotInto && value !== void 0) snapshotInto.set(key, value);
|
|
270
|
+
delete env[key];
|
|
271
|
+
removedKeys.push(key);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
return removedKeys;
|
|
275
|
+
}
|
|
276
|
+
__name(scrubInheritedLoaderEnv, "scrubInheritedLoaderEnv");
|
|
277
|
+
function scrubAndReportInheritedLoaderEnv(env, commandLabel, processLabel, snapshotInto) {
|
|
278
|
+
const removedKeys = scrubInheritedLoaderEnv(env, snapshotInto);
|
|
279
|
+
if (removedKeys.length > 0) {
|
|
280
|
+
writeStderrLineSafe(
|
|
281
|
+
`${commandLabel}: scrubbed inherited loader env vars from the ${processLabel} process; session subprocesses will not inherit them: ${removedKeys.join(", ")}`
|
|
282
|
+
);
|
|
283
|
+
}
|
|
284
|
+
return removedKeys;
|
|
285
|
+
}
|
|
286
|
+
__name(scrubAndReportInheritedLoaderEnv, "scrubAndReportInheritedLoaderEnv");
|
|
287
|
+
var sharedProcessEnvScrubDepth = 0;
|
|
288
|
+
var sharedProcessEnvScrubOriginals = /* @__PURE__ */ new Map();
|
|
289
|
+
function acquireInheritedLoaderEnvScrub(env, commandLabel, processLabel) {
|
|
290
|
+
sharedProcessEnvScrubDepth++;
|
|
291
|
+
const removedKeys = scrubAndReportInheritedLoaderEnv(
|
|
292
|
+
env,
|
|
293
|
+
commandLabel,
|
|
294
|
+
processLabel,
|
|
295
|
+
sharedProcessEnvScrubOriginals
|
|
296
|
+
);
|
|
297
|
+
let released = false;
|
|
298
|
+
return {
|
|
299
|
+
removedKeys,
|
|
300
|
+
release() {
|
|
301
|
+
if (released) return;
|
|
302
|
+
released = true;
|
|
303
|
+
sharedProcessEnvScrubDepth--;
|
|
304
|
+
if (sharedProcessEnvScrubDepth > 0) return;
|
|
305
|
+
for (const [key, value] of sharedProcessEnvScrubOriginals) {
|
|
306
|
+
if (!Object.hasOwn(env, key)) env[key] = value;
|
|
307
|
+
}
|
|
308
|
+
sharedProcessEnvScrubOriginals.clear();
|
|
309
|
+
}
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
__name(acquireInheritedLoaderEnvScrub, "acquireInheritedLoaderEnvScrub");
|
|
313
|
+
var reportedLoaderKeyRejections = /* @__PURE__ */ new Map();
|
|
314
|
+
var loaderKeyRejectionReporter;
|
|
315
|
+
function setLoaderKeyRejectionReporter(reporter) {
|
|
316
|
+
loaderKeyRejectionReporter = reporter;
|
|
317
|
+
}
|
|
318
|
+
__name(setLoaderKeyRejectionReporter, "setLoaderKeyRejectionReporter");
|
|
319
|
+
function clearLoaderKeyRejectionReporterIfCurrent(reporter) {
|
|
320
|
+
if (loaderKeyRejectionReporter === reporter) {
|
|
321
|
+
loaderKeyRejectionReporter = void 0;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
__name(clearLoaderKeyRejectionReporterIfCurrent, "clearLoaderKeyRejectionReporterIfCurrent");
|
|
325
|
+
function reportRejectedLoaderKeys(source, candidateKeys) {
|
|
326
|
+
const rejectedKeys = candidateKeys.filter(isLoaderEnvKey);
|
|
327
|
+
const warnedKeys = reportedLoaderKeyRejections.get(source) ?? /* @__PURE__ */ new Set();
|
|
328
|
+
const freshKeys = rejectedKeys.filter((key) => !warnedKeys.has(key));
|
|
329
|
+
if (freshKeys.length === 0) return rejectedKeys;
|
|
330
|
+
for (const key of freshKeys) warnedKeys.add(key);
|
|
331
|
+
reportedLoaderKeyRejections.set(source, warnedKeys);
|
|
332
|
+
if (loaderKeyRejectionReporter) {
|
|
333
|
+
loaderKeyRejectionReporter(source, freshKeys);
|
|
334
|
+
} else {
|
|
335
|
+
writeStderrLineSafe(
|
|
336
|
+
`qwen: ${source} cannot set loader-affecting env vars; ignored: ` + freshKeys.join(", ")
|
|
337
|
+
);
|
|
338
|
+
}
|
|
339
|
+
return rejectedKeys;
|
|
340
|
+
}
|
|
341
|
+
__name(reportRejectedLoaderKeys, "reportRejectedLoaderKeys");
|
|
342
|
+
function resetLoaderKeyRejectionReportingForTesting() {
|
|
343
|
+
reportedLoaderKeyRejections.clear();
|
|
344
|
+
}
|
|
345
|
+
__name(resetLoaderKeyRejectionReportingForTesting, "resetLoaderKeyRejectionReportingForTesting");
|
|
346
|
+
|
|
347
|
+
// packages/cli/src/config/compile-cache.ts
|
|
348
|
+
init_esbuild_shims();
|
|
349
|
+
var PENDING_COMPILE_CACHE_ENV = "QWEN_CODE_PENDING_COMPILE_CACHE";
|
|
350
|
+
function publishPendingCompileCache(env = process.env) {
|
|
351
|
+
const pendingDirectory = env[PENDING_COMPILE_CACHE_ENV];
|
|
352
|
+
delete env[PENDING_COMPILE_CACHE_ENV];
|
|
353
|
+
if (pendingDirectory && !env["NODE_COMPILE_CACHE"] && env["NODE_DISABLE_COMPILE_CACHE"] !== "1") {
|
|
354
|
+
env["NODE_COMPILE_CACHE"] = pendingDirectory;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
__name(publishPendingCompileCache, "publishPendingCompileCache");
|
|
358
|
+
|
|
359
|
+
export {
|
|
360
|
+
QWEN_CODE_SERVE_ENV,
|
|
361
|
+
QWEN_CODE_DESKTOP_ENV,
|
|
362
|
+
resolveAcpChannelFallback,
|
|
363
|
+
DEFAULT_EXCLUDED_ENV_VARS,
|
|
364
|
+
ENV_CORRUPTED_PATH,
|
|
365
|
+
ENV_WAS_RECOVERED,
|
|
366
|
+
ENV_ACP_REPEATED_TOOL_FAILURE_GUARD,
|
|
367
|
+
PROJECT_ENV_HARDCODED_EXCLUSIONS,
|
|
368
|
+
isHardcodedProjectEnvExclusion,
|
|
369
|
+
HOME_ENV_BOOTSTRAP_KEYS,
|
|
370
|
+
isLoaderEnvKey,
|
|
371
|
+
scrubInheritedLoaderEnv,
|
|
372
|
+
scrubAndReportInheritedLoaderEnv,
|
|
373
|
+
acquireInheritedLoaderEnvScrub,
|
|
374
|
+
setLoaderKeyRejectionReporter,
|
|
375
|
+
clearLoaderKeyRejectionReporterIfCurrent,
|
|
376
|
+
reportRejectedLoaderKeys,
|
|
377
|
+
resetLoaderKeyRejectionReportingForTesting,
|
|
378
|
+
publishPendingCompileCache
|
|
379
|
+
};
|
|
380
|
+
/**
|
|
381
|
+
* @license
|
|
382
|
+
* Copyright 2026 Qwen Team
|
|
383
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
384
|
+
*/
|
|
385
|
+
/**
|
|
386
|
+
* @license
|
|
387
|
+
* Copyright 2025 Qwen Team
|
|
388
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
389
|
+
*/
|