@qwen-code/qwen-code 0.18.2 → 0.18.3-nightly.20260621.6b2f800ab
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 +64 -492
- package/bundled/loop/SKILL.md +53 -26
- package/bundled/loop/SKILL.test.ts +67 -0
- package/bundled/qc-helper/docs/configuration/auth.md +7 -6
- package/bundled/qc-helper/docs/configuration/model-providers.md +16 -2
- package/bundled/qc-helper/docs/configuration/settings.md +51 -44
- package/bundled/qc-helper/docs/extension/introduction.md +38 -0
- package/bundled/qc-helper/docs/features/approval-mode.md +2 -0
- package/bundled/qc-helper/docs/features/channels/_meta.ts +1 -0
- package/bundled/qc-helper/docs/features/channels/overview.md +4 -4
- package/bundled/qc-helper/docs/features/channels/qqbot.md +179 -0
- package/bundled/qc-helper/docs/features/commands.md +49 -0
- package/bundled/qc-helper/docs/features/followup-suggestions.md +10 -6
- package/bundled/qc-helper/docs/features/hooks.md +6 -3
- package/bundled/qc-helper/docs/features/status-line.md +4 -2
- package/bundled/qc-helper/docs/qwen-serve.md +9 -4
- package/bundled/qc-helper/docs/reference/keyboard-shortcuts.md +11 -5
- package/bundled/qc-helper/docs/support/troubleshooting.md +5 -0
- package/chunks/{agent-P5U6QLWL.js → agent-66UJLGYF.js} +24 -23
- package/chunks/{agent-headless-24356DC7.js → agent-headless-XWKLG7OO.js} +24 -23
- package/chunks/{anthropicContentGenerator-KLBHYGH6.js → anthropicContentGenerator-5S4OMMNL.js} +9 -7
- package/chunks/{askUserQuestion-QPZXR3UO.js → askUserQuestion-WHVYL2S2.js} +2 -2
- package/chunks/{ca-RK4QPLIX.js → ca-K6MD665I.js} +42 -2
- package/chunks/{chunk-WPTCDQN6.js → chunk-26ZYKTYZ.js} +2 -2
- package/chunks/{chunk-O4PICXES.js → chunk-2MPVVENX.js} +14 -6
- package/chunks/{chunk-VIEIRAK3.js → chunk-2O3NAOJG.js} +4 -2
- package/chunks/{chunk-NNIYWQIS.js → chunk-42HGOMED.js} +2 -1
- package/chunks/{chunk-B4ZF2KSI.js → chunk-AE6RQU6F.js} +2 -2
- package/chunks/{chunk-FIQECJTQ.js → chunk-ATLUHLZE.js} +1 -1
- package/chunks/{chunk-BJ5HQ23U.js → chunk-C6MI2ASN.js} +9 -10
- package/chunks/{chunk-LYRSMKLS.js → chunk-CTHZVIMD.js} +2 -2
- package/chunks/{chunk-MN5RAXVB.js → chunk-CX3SGIPK.js} +18 -6
- package/chunks/{chunk-IQHSD7K5.js → chunk-FH4P6RQA.js} +1 -1
- package/chunks/{chunk-LYSND7KR.js → chunk-G4BUMVEY.js} +12 -2
- package/chunks/{chunk-YJDVHAGL.js → chunk-GBN55AWZ.js} +2 -2
- package/chunks/{chunk-ZNUMXPNK.js → chunk-GOMVJKBL.js} +7 -3
- package/chunks/{chunk-NGDXHX3A.js → chunk-GRVAP37P.js} +63 -11
- package/chunks/{chunk-CPVI5J2L.js → chunk-ID533GA3.js} +1 -1
- package/chunks/{chunk-VU6A2OBJ.js → chunk-JXQ23SNT.js} +217 -219
- package/chunks/{chunk-ZMIBJS45.js → chunk-KGV3F6UF.js} +1 -1
- package/chunks/{chunk-SFRV6BGY.js → chunk-LF6BKGZT.js} +3 -3
- package/chunks/{chunk-LXYWINWF.js → chunk-LTN3VYMZ.js} +1 -1
- package/chunks/{chunk-IDYDPBBN.js → chunk-MSJ2MXJ6.js} +3 -3
- package/chunks/{chunk-25FFAMED.js → chunk-NLCTUNOS.js} +1048 -295
- package/chunks/{chunk-JZEKEWO5.js → chunk-TOSAOARP.js} +6 -6
- package/chunks/{chunk-M7OBURJM.js → chunk-VIA5MAE5.js} +24 -12
- package/chunks/{chunk-RTTAC5VW.js → chunk-VKILGMZQ.js} +1 -1
- package/chunks/{chunk-QFJ67S5R.js → chunk-VN7FXOAW.js} +732 -617
- package/chunks/{chunk-HA2UEYZP.js → chunk-WE6TNQJU.js} +13 -6
- package/chunks/chunk-XGU3ETVO.js +1026 -0
- package/chunks/{chunk-ZOFNJQNJ.js → chunk-XU7BKR3B.js} +3 -3
- package/chunks/{chunk-QP4R5FTG.js → chunk-Z7XXFPGP.js} +4 -3
- package/chunks/{chunk-TW522KN6.js → chunk-ZTQ26VBE.js} +13 -6
- package/chunks/{chunk-EQ5NHJBY.js → chunk-ZV5QED4A.js} +109573 -106663
- package/chunks/{computer-use-EGW2I2HZ.js → computer-use-5AHVGVR3.js} +26 -24
- package/chunks/contextCommand-PTDKJROT.js +54 -0
- package/chunks/{cron-create-DQKRQMCP.js → cron-create-THNDTYXU.js} +6 -6
- package/chunks/{cron-delete-DOFPHFTI.js → cron-delete-BS5H6TFJ.js} +6 -6
- package/chunks/{cron-list-RCVOO3CB.js → cron-list-7OBVHT7K.js} +24 -10
- package/chunks/{de-FGPM4KW5.js → de-K2F3T3TR.js} +41 -1
- package/chunks/{dist-2UCAYOX7.js → dist-BD27IA3L.js} +16 -5
- package/chunks/{dist-UH7CYT7F.js → dist-DZ6AJDX4.js} +52 -11
- package/chunks/{dist-KF43SZZV.js → dist-GKRNVFBH.js} +5 -1
- package/chunks/{dist-33LHH26D.js → dist-KIYB7DQW.js} +1 -1
- package/chunks/dist-QFFZWACU.js +2136 -0
- package/chunks/{edit-FJSOCDO2.js → edit-ADXZN3M7.js} +26 -27
- package/chunks/{en-VP6XPGEC.js → en-KGSAKBJP.js} +232 -0
- package/chunks/{enter-worktree-X6MVFDLR.js → enter-worktree-F5SJSHNH.js} +24 -23
- package/chunks/{enterPlanMode-MZAEQZH3.js → enterPlanMode-MCQ4HWPP.js} +52 -28
- package/chunks/{exit-worktree-RM2UPOYQ.js → exit-worktree-26AFS3YQ.js} +191 -41
- package/chunks/{exitPlanMode-7BVY3CWJ.js → exitPlanMode-UOPIPSEA.js} +85 -46
- package/chunks/{fr-ATYBVCLT.js → fr-2CAQEOK6.js} +41 -1
- package/chunks/{geminiContentGenerator-A6JHLUHK.js → geminiContentGenerator-RJA7BIHQ.js} +4 -4
- package/chunks/{glob-L3AZLCV6.js → glob-AWTDID4C.js} +26 -24
- package/chunks/{grep-SNCPCXIP.js → grep-QJ5TEMYZ.js} +96 -43
- package/chunks/{ja-W2QEA2OI.js → ja-QWL7V6OJ.js} +41 -1
- package/chunks/{keychain-token-storage-QSTRHKKL.js → keychain-token-storage-YHXIWXIB.js} +2 -2
- package/chunks/loop-wakeup-SSBWZ64K.js +167 -0
- package/chunks/{ls-TRD77UTS.js → ls-YPFUHZRQ.js} +3 -3
- package/chunks/{lsp-2VFWQPZS.js → lsp-FD6DNVAF.js} +2 -2
- package/chunks/{monitor-TS6WL6DN.js → monitor-SQYLCQAK.js} +24 -23
- package/chunks/{notebook-edit-26RNH24J.js → notebook-edit-7RR3ABQ5.js} +25 -26
- package/chunks/{openaiContentGenerator-7CA63X5G.js → openaiContentGenerator-2CHXJZ4A.js} +14 -11
- package/chunks/{pt-ZKEWJFBW.js → pt-2SPOLMAY.js} +41 -1
- package/chunks/{qwenContentGenerator-4WJTJXFZ.js → qwenContentGenerator-ZXEKDN2J.js} +27 -26
- package/chunks/{qwenOAuth2-KK433U33.js → qwenOAuth2-WZ54YZ4J.js} +4 -4
- package/chunks/{read-file-EUIHK6HD.js → read-file-AZAKLZFP.js} +9 -8
- package/chunks/{ripGrep-7J5B22W2.js → ripGrep-T5PS4VWB.js} +24 -23
- package/chunks/{ru-VEKTPJ74.js → ru-35IVJTEH.js} +41 -1
- package/chunks/{scheduler-J3OUGTTS.js → scheduler-VZ5KYSX6.js} +24 -23
- package/chunks/{send-message-QZOC5GA2.js → send-message-FWFTX62Q.js} +2 -2
- package/chunks/{serve-VF4ZNUJP.js → serve-RN6CHKG3.js} +1308 -291
- package/chunks/{shell-G6XCJAG3.js → shell-ANALFMWT.js} +24 -23
- package/chunks/{skill-7OVC6JIH.js → skill-JIKQTL4U.js} +11 -10
- package/chunks/{src-XV5MLRND.js → src-EMRXVZY7.js} +159 -59
- package/chunks/{syntheticOutput-WJSUK4SZ.js → syntheticOutput-JY5NEDTV.js} +3 -3
- package/chunks/{task-create-GGSC27HO.js → task-create-IGILDV25.js} +7 -7
- package/chunks/{task-list-EDHHHSK4.js → task-list-KBEJVAAG.js} +6 -6
- package/chunks/{task-stop-WR5PDVZY.js → task-stop-WFTMQ6AC.js} +2 -2
- package/chunks/{task-update-UR7NUHBV.js → task-update-UIVX7ZEV.js} +7 -7
- package/chunks/{team-create-JXSC7ROC.js → team-create-BVKQF4WK.js} +26 -25
- package/chunks/{team-delete-FC33URJK.js → team-delete-LPOXDPVB.js} +6 -6
- package/chunks/{todoWrite-GO2ME7ZV.js → todoWrite-R4RIJKOD.js} +4 -4
- package/chunks/{tool-search-YRWSWA2H.js → tool-search-E4VYDNQO.js} +9 -8
- package/chunks/{web-fetch-NLLATYIL.js → web-fetch-JU7SS6KE.js} +5 -5
- package/chunks/{workflow-ZN3DYFMU.js → workflow-VDPJJYAF.js} +242 -39
- package/chunks/{write-file-355M4V7Z.js → write-file-NCN66V2C.js} +26 -27
- package/chunks/{zh-TW-6YFNCKTA.js → zh-TW-BSG6BUWK.js} +232 -2
- package/chunks/{zh-OIXDDQHB.js → zh-X4KM6MTW.js} +233 -0
- package/cli.js +11094 -5768
- package/examples/agent/agents/diary.md +1 -1
- package/examples/mcp-server/qwen-extension.json +8 -1
- package/examples/starter/agents/diary.md +1 -1
- package/locales/ca.js +67 -2
- package/locales/de.js +68 -2
- package/locales/en.js +304 -0
- package/locales/fr.js +69 -2
- package/locales/ja.js +65 -2
- package/locales/pt.js +67 -2
- package/locales/ru.js +68 -2
- package/locales/zh-TW.js +288 -2
- package/locales/zh.js +288 -0
- package/package.json +4 -3
- package/web-shell/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/web-shell/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/web-shell/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/web-shell/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/web-shell/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/web-shell/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/web-shell/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/web-shell/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/web-shell/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/web-shell/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/web-shell/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/web-shell/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/web-shell/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/web-shell/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/web-shell/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/web-shell/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/web-shell/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/web-shell/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/web-shell/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/web-shell/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/web-shell/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/web-shell/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/web-shell/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/web-shell/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/web-shell/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/web-shell/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/web-shell/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/web-shell/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/web-shell/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/web-shell/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/web-shell/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/web-shell/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/web-shell/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/web-shell/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/web-shell/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/web-shell/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/web-shell/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/web-shell/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/web-shell/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/web-shell/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/web-shell/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/web-shell/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/web-shell/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/web-shell/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/web-shell/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/web-shell/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/web-shell/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/web-shell/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/web-shell/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/web-shell/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/web-shell/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/web-shell/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/web-shell/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/web-shell/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/web-shell/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/web-shell/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/web-shell/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/web-shell/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/web-shell/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/web-shell/assets/abap-DsBKuouk.js +1 -0
- package/web-shell/assets/actionscript-3-D_z4Izcz.js +1 -0
- package/web-shell/assets/ada-727ZlQH0.js +1 -0
- package/web-shell/assets/andromeeda-C3khCPGq.js +1 -0
- package/web-shell/assets/angular-html-LfdN0zeE.js +1 -0
- package/web-shell/assets/angular-ts-CKsD7JZE.js +1 -0
- package/web-shell/assets/apache-Dn00JSTd.js +1 -0
- package/web-shell/assets/apex-COJ4H7py.js +1 -0
- package/web-shell/assets/apl-BBq3IX1j.js +1 -0
- package/web-shell/assets/applescript-Bu5BbsvL.js +1 -0
- package/web-shell/assets/ara-7O62HKoU.js +1 -0
- package/web-shell/assets/arc-CRFN10gD.js +1 -0
- package/web-shell/assets/architectureDiagram-3BPJPVTR-IRlu1CpH.js +36 -0
- package/web-shell/assets/asciidoc-BPT9niGB.js +1 -0
- package/web-shell/assets/asm-Dhn9LcZ4.js +1 -0
- package/web-shell/assets/astro-CqkE3fuf.js +1 -0
- package/web-shell/assets/aurora-x-D-2ljcwZ.js +1 -0
- package/web-shell/assets/awk-eg146-Ew.js +1 -0
- package/web-shell/assets/ayu-dark-Cv9koXgw.js +1 -0
- package/web-shell/assets/ballerina-Du268qiB.js +1 -0
- package/web-shell/assets/bat-fje9CFhw.js +1 -0
- package/web-shell/assets/beancount-BwXTMy5W.js +1 -0
- package/web-shell/assets/berry-3xVqZejG.js +1 -0
- package/web-shell/assets/bibtex-xW4inM5L.js +1 -0
- package/web-shell/assets/bicep-DHo0CJ0O.js +1 -0
- package/web-shell/assets/blade-a8OxSdnT.js +1 -0
- package/web-shell/assets/blockDiagram-GPEHLZMM-htIZ6iw8.js +132 -0
- package/web-shell/assets/bsl-Dgyn0ogV.js +1 -0
- package/web-shell/assets/c-C3t2pwGQ.js +1 -0
- package/web-shell/assets/c4Diagram-AAUBKEIU-A2GoRq3O.js +10 -0
- package/web-shell/assets/cadence-DNquZEk8.js +1 -0
- package/web-shell/assets/cairo--RitsXJZ.js +1 -0
- package/web-shell/assets/catppuccin-frappe-CD_QflpE.js +1 -0
- package/web-shell/assets/catppuccin-latte-DRW-0cLl.js +1 -0
- package/web-shell/assets/catppuccin-macchiato-C-_shW-Y.js +1 -0
- package/web-shell/assets/catppuccin-mocha-LGGdnPYs.js +1 -0
- package/web-shell/assets/channel-WwImfsc7.js +1 -0
- package/web-shell/assets/chunk-2J33WTMH-CdP2AC6u.js +1 -0
- package/web-shell/assets/chunk-4BX2VUAB-DrA07nW2.js +1 -0
- package/web-shell/assets/chunk-55IACEB6-CFGnVU2f.js +1 -0
- package/web-shell/assets/chunk-727SXJPM-BTMkq3Tk.js +206 -0
- package/web-shell/assets/chunk-AQP2D5EJ-C9sYg04Z.js +231 -0
- package/web-shell/assets/chunk-FMBD7UC4-Cag-cj6I.js +15 -0
- package/web-shell/assets/chunk-ND2GUHAM-CDSTFoR7.js +1 -0
- package/web-shell/assets/chunk-QZHKN3VN-CN9Z6oOs.js +1 -0
- package/web-shell/assets/clarity-BHOwM8T6.js +1 -0
- package/web-shell/assets/classDiagram-4FO5ZUOK-CJKQYFeJ.js +1 -0
- package/web-shell/assets/classDiagram-v2-Q7XG4LA2-CJKQYFeJ.js +1 -0
- package/web-shell/assets/clojure-DxSadP1t.js +1 -0
- package/web-shell/assets/cmake-DbXoA79R.js +1 -0
- package/web-shell/assets/cobol-PTqiYgYu.js +1 -0
- package/web-shell/assets/codeowners-Bp6g37R7.js +1 -0
- package/web-shell/assets/codeql-sacFqUAJ.js +1 -0
- package/web-shell/assets/coffee-dyiR41kL.js +1 -0
- package/web-shell/assets/common-lisp-C7gG9l05.js +1 -0
- package/web-shell/assets/coq-Dsg_Bt_b.js +1 -0
- package/web-shell/assets/cose-bilkent-S5V4N54A-DuN9j8Du.js +1 -0
- package/web-shell/assets/cpp-BksuvNSY.js +1 -0
- package/web-shell/assets/crystal-DtDmRg-F.js +1 -0
- package/web-shell/assets/csharp-D9R-vmeu.js +1 -0
- package/web-shell/assets/css-BPhBrDlE.js +1 -0
- package/web-shell/assets/csv-B0qRVHPH.js +1 -0
- package/web-shell/assets/cue-DtFQj3wx.js +1 -0
- package/web-shell/assets/cypher-m2LEI-9-.js +1 -0
- package/web-shell/assets/cytoscape.esm-CUqq0XTU.js +331 -0
- package/web-shell/assets/d-BoXegm-a.js +1 -0
- package/web-shell/assets/dagre-BM42HDAG-ByCWe45f.js +4 -0
- package/web-shell/assets/dark-plus-C3mMm8J8.js +1 -0
- package/web-shell/assets/dart-B9wLZaAG.js +1 -0
- package/web-shell/assets/dax-ClGRhx96.js +1 -0
- package/web-shell/assets/defaultLocale-DX6XiGOO.js +1 -0
- package/web-shell/assets/desktop-DEIpsLCJ.js +1 -0
- package/web-shell/assets/diagram-2AECGRRQ-eWyU_pKZ.js +43 -0
- package/web-shell/assets/diagram-5GNKFQAL-0Bfu3Fq5.js +10 -0
- package/web-shell/assets/diagram-KO2AKTUF-B6KBKkQP.js +3 -0
- package/web-shell/assets/diagram-LMA3HP47-TToDmeA_.js +24 -0
- package/web-shell/assets/diagram-OG6HWLK6-CQCkC2Yx.js +24 -0
- package/web-shell/assets/diff-BgYniUM_.js +1 -0
- package/web-shell/assets/docker-COcR7UxN.js +1 -0
- package/web-shell/assets/dotenv-BjQB5zDj.js +1 -0
- package/web-shell/assets/dracula-BzJJZx-M.js +1 -0
- package/web-shell/assets/dracula-soft-BXkSAIEj.js +1 -0
- package/web-shell/assets/dream-maker-C-nORZOA.js +1 -0
- package/web-shell/assets/edge-D5gP-w-T.js +1 -0
- package/web-shell/assets/elixir-CLiX3zqd.js +1 -0
- package/web-shell/assets/elm-CmHSxxaM.js +1 -0
- package/web-shell/assets/emacs-lisp-BX77sIaO.js +1 -0
- package/web-shell/assets/erDiagram-TEJ5UH35-Cm9ls1iB.js +85 -0
- package/web-shell/assets/erb-BYTLMnw6.js +1 -0
- package/web-shell/assets/erlang-B-DoSBHF.js +1 -0
- package/web-shell/assets/everforest-dark-BgDCqdQA.js +1 -0
- package/web-shell/assets/everforest-light-C8M2exoo.js +1 -0
- package/web-shell/assets/fennel-bCA53EVm.js +1 -0
- package/web-shell/assets/fish-w-ucz2PV.js +1 -0
- package/web-shell/assets/flowDiagram-I6XJVG4X-Dyoz80Pv.js +162 -0
- package/web-shell/assets/fluent-Dayu4EKP.js +1 -0
- package/web-shell/assets/fortran-fixed-form-TqA4NnZg.js +1 -0
- package/web-shell/assets/fortran-free-form-DKXYxT9g.js +1 -0
- package/web-shell/assets/fsharp-XplgxFYe.js +1 -0
- package/web-shell/assets/ganttDiagram-6RSMTGT7-Cfut9yaU.js +292 -0
- package/web-shell/assets/gdresource-BHYsBjWJ.js +1 -0
- package/web-shell/assets/gdscript-DfxzS6Rs.js +1 -0
- package/web-shell/assets/gdshader-SKMF96pI.js +1 -0
- package/web-shell/assets/genie-ajMbGru0.js +1 -0
- package/web-shell/assets/gherkin--30QC5Em.js +1 -0
- package/web-shell/assets/git-commit-i4q6IMui.js +1 -0
- package/web-shell/assets/git-rebase-B-v9cOL2.js +1 -0
- package/web-shell/assets/gitGraphDiagram-PVQCEYII-BCuJdlfD.js +106 -0
- package/web-shell/assets/github-dark-DHJKELXO.js +1 -0
- package/web-shell/assets/github-dark-default-Cuk6v7N8.js +1 -0
- package/web-shell/assets/github-dark-dimmed-DH5Ifo-i.js +1 -0
- package/web-shell/assets/github-dark-high-contrast-E3gJ1_iC.js +1 -0
- package/web-shell/assets/github-light-DAi9KRSo.js +1 -0
- package/web-shell/assets/github-light-default-D7oLnXFd.js +1 -0
- package/web-shell/assets/github-light-high-contrast-BfjtVDDH.js +1 -0
- package/web-shell/assets/gleam-B430Bg39.js +1 -0
- package/web-shell/assets/glimmer-js-D-cwc0-E.js +1 -0
- package/web-shell/assets/glimmer-ts-pgjy16dm.js +1 -0
- package/web-shell/assets/glsl-DBO2IWDn.js +1 -0
- package/web-shell/assets/gnuplot-CM8KxXT1.js +1 -0
- package/web-shell/assets/go-B1SYOhNW.js +1 -0
- package/web-shell/assets/graph-qsFoMdT2.js +1 -0
- package/web-shell/assets/graphql-cDcHW_If.js +1 -0
- package/web-shell/assets/groovy-DkBy-JyN.js +1 -0
- package/web-shell/assets/hack-D1yCygmZ.js +1 -0
- package/web-shell/assets/haml-B2EZWmdv.js +1 -0
- package/web-shell/assets/handlebars-BQGss363.js +1 -0
- package/web-shell/assets/haskell-BILxekzW.js +1 -0
- package/web-shell/assets/haxe-C5wWYbrZ.js +1 -0
- package/web-shell/assets/hcl-HzYwdGDm.js +1 -0
- package/web-shell/assets/hjson-T-Tgc4AT.js +1 -0
- package/web-shell/assets/hlsl-ifBTmRxC.js +1 -0
- package/web-shell/assets/houston-DnULxvSX.js +1 -0
- package/web-shell/assets/html-C2L_23MC.js +1 -0
- package/web-shell/assets/html-derivative-CSfWNPLT.js +1 -0
- package/web-shell/assets/http-FRrOvY1W.js +1 -0
- package/web-shell/assets/hxml-TIA70rKU.js +1 -0
- package/web-shell/assets/hy-BMj5Y0dO.js +1 -0
- package/web-shell/assets/imba-bv_oIlVt.js +1 -0
- package/web-shell/assets/index-BDZiTAkl.css +1 -0
- package/web-shell/assets/index-DaebdpHq.js +516 -0
- package/web-shell/assets/infoDiagram-5YYISTIA-CXKxF2VL.js +2 -0
- package/web-shell/assets/ini-BjABl1g7.js +1 -0
- package/web-shell/assets/init-Gi6I4Gst.js +1 -0
- package/web-shell/assets/ishikawaDiagram-YF4QCWOH-DE7HWSU8.js +70 -0
- package/web-shell/assets/java-xI-RfyKK.js +1 -0
- package/web-shell/assets/javascript-ySlJ1b_l.js +1 -0
- package/web-shell/assets/jinja-DGy0s7-h.js +1 -0
- package/web-shell/assets/jison-BqZprYcd.js +1 -0
- package/web-shell/assets/journeyDiagram-JHISSGLW-D__YUfds.js +139 -0
- package/web-shell/assets/json-BQoSv7ci.js +1 -0
- package/web-shell/assets/json5-w8dY5SsB.js +1 -0
- package/web-shell/assets/jsonc-TU54ms6u.js +1 -0
- package/web-shell/assets/jsonl-DREVFZK8.js +1 -0
- package/web-shell/assets/jsonnet-BfivnA6A.js +1 -0
- package/web-shell/assets/jssm-P4WzXJd0.js +1 -0
- package/web-shell/assets/jsx-BAng5TT0.js +1 -0
- package/web-shell/assets/julia-BBuGR-5E.js +1 -0
- package/web-shell/assets/kanagawa-dragon-CkXjmgJE.js +1 -0
- package/web-shell/assets/kanagawa-lotus-CfQXZHmo.js +1 -0
- package/web-shell/assets/kanagawa-wave-DWedfzmr.js +1 -0
- package/web-shell/assets/kanban-definition-UN3LZRKU-D82R169M.js +89 -0
- package/web-shell/assets/kotlin-B5lbUyaz.js +1 -0
- package/web-shell/assets/kusto-mebxcVVE.js +1 -0
- package/web-shell/assets/laserwave-DUszq2jm.js +1 -0
- package/web-shell/assets/latex-C-cWTeAZ.js +1 -0
- package/web-shell/assets/layout-CNYaLpI5.js +1 -0
- package/web-shell/assets/lean-XBlWyCtg.js +1 -0
- package/web-shell/assets/less-BfCpw3nA.js +1 -0
- package/web-shell/assets/light-plus-B7mTdjB0.js +1 -0
- package/web-shell/assets/linear-DpyMbKqT.js +1 -0
- package/web-shell/assets/liquid-D3W5UaiH.js +1 -0
- package/web-shell/assets/log-Cc5clBb7.js +1 -0
- package/web-shell/assets/logo-IuBKFhSY.js +1 -0
- package/web-shell/assets/lua-CvWAzNxB.js +1 -0
- package/web-shell/assets/luau-Du5NY7AG.js +1 -0
- package/web-shell/assets/make-Bvotw-X0.js +1 -0
- package/web-shell/assets/markdown-UIAJJxZW.js +1 -0
- package/web-shell/assets/marko-z0MBrx5-.js +1 -0
- package/web-shell/assets/material-theme-D5KoaKCx.js +1 -0
- package/web-shell/assets/material-theme-darker-BfHTSMKl.js +1 -0
- package/web-shell/assets/material-theme-lighter-B0m2ddpp.js +1 -0
- package/web-shell/assets/material-theme-ocean-CyktbL80.js +1 -0
- package/web-shell/assets/material-theme-palenight-Csfq5Kiy.js +1 -0
- package/web-shell/assets/matlab-D9-PGadD.js +1 -0
- package/web-shell/assets/mdc-DB_EDNY_.js +1 -0
- package/web-shell/assets/mdx-sdHcTMYB.js +1 -0
- package/web-shell/assets/mermaid-Ci6OQyBP.js +1 -0
- package/web-shell/assets/mermaid.core-D1KEFDhn.js +309 -0
- package/web-shell/assets/min-dark-CafNBF8u.js +1 -0
- package/web-shell/assets/min-light-CTRr51gU.js +1 -0
- package/web-shell/assets/mindmap-definition-RKZ34NQL-BwVUFGFE.js +96 -0
- package/web-shell/assets/mipsasm-BC5c_5Pe.js +1 -0
- package/web-shell/assets/mojo-Tz6hzZYG.js +1 -0
- package/web-shell/assets/monokai-D4h5O-jR.js +1 -0
- package/web-shell/assets/move-DB_GagMm.js +1 -0
- package/web-shell/assets/narrat-DLbgOhZU.js +1 -0
- package/web-shell/assets/nextflow-B0XVJmRM.js +1 -0
- package/web-shell/assets/nginx-D_VnBJ67.js +1 -0
- package/web-shell/assets/night-owl-C39BiMTA.js +1 -0
- package/web-shell/assets/nim-ZlGxZxc3.js +1 -0
- package/web-shell/assets/nix-shcSOmrb.js +1 -0
- package/web-shell/assets/nord-Ddv68eIx.js +1 -0
- package/web-shell/assets/nushell-D4Tzg5kh.js +1 -0
- package/web-shell/assets/objective-c-Deuh7S70.js +1 -0
- package/web-shell/assets/objective-cpp-BUEGK8hf.js +1 -0
- package/web-shell/assets/ocaml-BNioltXt.js +1 -0
- package/web-shell/assets/one-dark-pro-GBQ2dnAY.js +1 -0
- package/web-shell/assets/one-light-PoHY5YXO.js +1 -0
- package/web-shell/assets/ordinal-Cboi1Yqb.js +1 -0
- package/web-shell/assets/pascal-JqZropPD.js +1 -0
- package/web-shell/assets/perl-CHQXSrWU.js +1 -0
- package/web-shell/assets/php-B5ebYQev.js +1 -0
- package/web-shell/assets/pieDiagram-4H26LBE5-BO_qoEGx.js +30 -0
- package/web-shell/assets/plastic-3e1v2bzS.js +1 -0
- package/web-shell/assets/plsql-LKU2TuZ1.js +1 -0
- package/web-shell/assets/po-BFLt1xDp.js +1 -0
- package/web-shell/assets/poimandres-CS3Unz2-.js +1 -0
- package/web-shell/assets/polar-DKykz6zU.js +1 -0
- package/web-shell/assets/postcss-B3ZDOciz.js +1 -0
- package/web-shell/assets/powerquery-CSHBycmS.js +1 -0
- package/web-shell/assets/powershell-BIEUsx6d.js +1 -0
- package/web-shell/assets/prisma-B48N-Iqd.js +1 -0
- package/web-shell/assets/prolog-BY-TUvya.js +1 -0
- package/web-shell/assets/proto-zocC4JxJ.js +1 -0
- package/web-shell/assets/pug-CM9l7STV.js +1 -0
- package/web-shell/assets/puppet-Cza_XSSt.js +1 -0
- package/web-shell/assets/purescript-Bg-kzb6g.js +1 -0
- package/web-shell/assets/python-DhUJRlN_.js +1 -0
- package/web-shell/assets/qml-D8XfuvdV.js +1 -0
- package/web-shell/assets/qmldir-C8lEn-DE.js +1 -0
- package/web-shell/assets/qss-DhMKtDLN.js +1 -0
- package/web-shell/assets/quadrantDiagram-W4KKPZXB-Cx0ZaWPo.js +7 -0
- package/web-shell/assets/r-CwjWoCRV.js +1 -0
- package/web-shell/assets/racket-CzouJOBO.js +1 -0
- package/web-shell/assets/raku-B1bQXN8T.js +1 -0
- package/web-shell/assets/razor-CNLDkMZG.js +1 -0
- package/web-shell/assets/red-bN70gL4F.js +1 -0
- package/web-shell/assets/reg-5LuOXUq_.js +1 -0
- package/web-shell/assets/regexp-DWJ3fJO_.js +1 -0
- package/web-shell/assets/rel-DJlmqQ1C.js +1 -0
- package/web-shell/assets/requirementDiagram-4Y6WPE33-BJPXejOA.js +84 -0
- package/web-shell/assets/riscv-QhoSD0DR.js +1 -0
- package/web-shell/assets/rose-pine-CmCqftbK.js +1 -0
- package/web-shell/assets/rose-pine-dawn-Ds-gbosJ.js +1 -0
- package/web-shell/assets/rose-pine-moon-CjDtw9vr.js +1 -0
- package/web-shell/assets/rst-4NLicBqY.js +1 -0
- package/web-shell/assets/ruby-DeZ3UC14.js +1 -0
- package/web-shell/assets/rust-Be6lgOlo.js +1 -0
- package/web-shell/assets/sankeyDiagram-5OEKKPKP-C1xeIL9i.js +40 -0
- package/web-shell/assets/sas-BmTFh92c.js +1 -0
- package/web-shell/assets/sass-BJ4Li9vH.js +1 -0
- package/web-shell/assets/scala-DQVVAn-B.js +1 -0
- package/web-shell/assets/scheme-BJGe-b2p.js +1 -0
- package/web-shell/assets/scss-C31hgJw-.js +1 -0
- package/web-shell/assets/sdbl-BLhTXw86.js +1 -0
- package/web-shell/assets/sequenceDiagram-3UESZ5HK-CSYKQUjf.js +162 -0
- package/web-shell/assets/shaderlab-B7qAK45m.js +1 -0
- package/web-shell/assets/shellscript-atvbtKCR.js +1 -0
- package/web-shell/assets/shellsession-C_rIy8kc.js +1 -0
- package/web-shell/assets/slack-dark-BthQWCQV.js +1 -0
- package/web-shell/assets/slack-ochin-DqwNpetd.js +1 -0
- package/web-shell/assets/smalltalk-DkLiglaE.js +1 -0
- package/web-shell/assets/snazzy-light-Bw305WKR.js +1 -0
- package/web-shell/assets/solarized-dark-DXbdFlpD.js +1 -0
- package/web-shell/assets/solarized-light-L9t79GZl.js +1 -0
- package/web-shell/assets/solidity-C1w2a3ep.js +1 -0
- package/web-shell/assets/soy-C-lX7w71.js +1 -0
- package/web-shell/assets/sparql-bYkjHRlG.js +1 -0
- package/web-shell/assets/splunk-Cf8iN4DR.js +1 -0
- package/web-shell/assets/sql-COK4E0Yg.js +1 -0
- package/web-shell/assets/ssh-config-BknIz3MU.js +1 -0
- package/web-shell/assets/stata-DorPZHa4.js +1 -0
- package/web-shell/assets/stateDiagram-AJRCARHV-d9hiHlAW.js +1 -0
- package/web-shell/assets/stateDiagram-v2-BHNVJYJU-DgReoybQ.js +1 -0
- package/web-shell/assets/stylus-BeQkCIfX.js +1 -0
- package/web-shell/assets/svelte-MSaWC3Je.js +1 -0
- package/web-shell/assets/swift-BSxZ-RaX.js +1 -0
- package/web-shell/assets/synthwave-84-CbfX1IO0.js +1 -0
- package/web-shell/assets/system-verilog-C7L56vO4.js +1 -0
- package/web-shell/assets/systemd-CUnW07Te.js +1 -0
- package/web-shell/assets/talonscript-C1XDQQGZ.js +1 -0
- package/web-shell/assets/tasl-CQjiPCtT.js +1 -0
- package/web-shell/assets/tcl-DQ1-QYvQ.js +1 -0
- package/web-shell/assets/templ-dwX3ZSMB.js +1 -0
- package/web-shell/assets/terraform-BbSNqyBO.js +1 -0
- package/web-shell/assets/tex-rYs2v40G.js +1 -0
- package/web-shell/assets/timeline-definition-PNZ67QCA-BhCBkq8k.js +120 -0
- package/web-shell/assets/tokyo-night-DBQeEorK.js +1 -0
- package/web-shell/assets/toml-CB2ApiWb.js +1 -0
- package/web-shell/assets/ts-tags-CipyTH0X.js +1 -0
- package/web-shell/assets/tsv-B_m7g4N7.js +1 -0
- package/web-shell/assets/tsx-B6W0miNI.js +1 -0
- package/web-shell/assets/turtle-BMR_PYu6.js +1 -0
- package/web-shell/assets/twig-NC5TFiHP.js +1 -0
- package/web-shell/assets/typescript-Dj6nwHGl.js +1 -0
- package/web-shell/assets/typespec-BpWG_bgh.js +1 -0
- package/web-shell/assets/typst-BVUVsWT6.js +1 -0
- package/web-shell/assets/v-CAQ2eGtk.js +1 -0
- package/web-shell/assets/vala-BFOHcciG.js +1 -0
- package/web-shell/assets/vb-CdO5JTpU.js +1 -0
- package/web-shell/assets/vennDiagram-CIIHVFJN-DPPFWp_y.js +34 -0
- package/web-shell/assets/verilog-CJaU5se_.js +1 -0
- package/web-shell/assets/vesper-BEBZ7ncR.js +1 -0
- package/web-shell/assets/vhdl-DYoNaHQp.js +1 -0
- package/web-shell/assets/viml-m4uW47V2.js +1 -0
- package/web-shell/assets/vitesse-black-Bkuqu6BP.js +1 -0
- package/web-shell/assets/vitesse-dark-D0r3Knsf.js +1 -0
- package/web-shell/assets/vitesse-light-CVO1_9PV.js +1 -0
- package/web-shell/assets/vue-BuYVFjOK.js +1 -0
- package/web-shell/assets/vue-html-xdeiXROB.js +1 -0
- package/web-shell/assets/vyper-nyqBNV6O.js +1 -0
- package/web-shell/assets/wardley-L42UT6IY-CcOUIgXY.js +173 -0
- package/web-shell/assets/wardleyDiagram-YWT4CUSO-p7oR5X7r.js +78 -0
- package/web-shell/assets/wasm-C6j12Q_x.js +1 -0
- package/web-shell/assets/wasm-CG6Dc4jp.js +1 -0
- package/web-shell/assets/wenyan-7A4Fjokl.js +1 -0
- package/web-shell/assets/wgsl-CB0Krxn9.js +1 -0
- package/web-shell/assets/wikitext-DCE3LsBG.js +1 -0
- package/web-shell/assets/wolfram-C3FkfJm5.js +1 -0
- package/web-shell/assets/xml-e3z08dGr.js +1 -0
- package/web-shell/assets/xsl-Dd0NUgwM.js +1 -0
- package/web-shell/assets/xychartDiagram-2RQKCTM6-Dfr7-SEy.js +7 -0
- package/web-shell/assets/yaml-CVw76BM1.js +1 -0
- package/web-shell/assets/zenscript-HnGAYVZD.js +1 -0
- package/web-shell/assets/zig-BVz_zdnA.js +1 -0
- package/web-shell/index.html +23 -0
- package/chunks/chunk-C64WAJOC.js +0 -117
- package/chunks/contextCommand-HI2X2Y7I.js +0 -53
|
@@ -18,6 +18,16 @@ You can manage extensions at runtime within the interactive CLI using `/extensio
|
|
|
18
18
|
| `/extensions install <source>` | Install an extension from a git URL, local path, npm package, or marketplace |
|
|
19
19
|
| `/extensions explore [source]` | Open extensions source page(Gemini or ClaudeCode) in your browser |
|
|
20
20
|
|
|
21
|
+
#### The interactive extension manager
|
|
22
|
+
|
|
23
|
+
Running `/extensions` (or `/extensions manage`) opens an interactive manager with three tabs. Press `Tab` or the `←`/`→` arrows to switch between them.
|
|
24
|
+
|
|
25
|
+
- **Discover** — browse plugins from your configured marketplace sources. Type to search, `Enter` to view a plugin's details, and install it (you'll be asked to choose an install scope). Press `Ctrl+R` to re-fetch the listings, and `Esc` to go back.
|
|
26
|
+
- **Installed** — your installed extensions, grouped by scope (**User level**, **Project level**, and favorites). Use `↑`/`↓` to navigate, `Space` to enable/disable an extension, `f` to favorite it, and `Enter` to open its details. MCP servers bundled by an extension appear nested under their parent extension with live connection status; you can enable or disable each server individually from there.
|
|
27
|
+
- **Sources** — manage the marketplace sources that feed the Discover tab. Use `↑`/`↓` to navigate, `Enter` to select a source, and `d` to remove one. These are the same sources managed by the `qwen extensions sources` CLI commands described below.
|
|
28
|
+
|
|
29
|
+
Changes made here hot-reload immediately, without restarting Qwen Code.
|
|
30
|
+
|
|
21
31
|
### CLI Extension Management
|
|
22
32
|
|
|
23
33
|
You can also manage extensions using `qwen extensions` CLI commands. Note that changes made via CLI commands will be reflected in active CLI sessions on restart.
|
|
@@ -133,6 +143,34 @@ qwen extensions install /path/to/your/extension
|
|
|
133
143
|
|
|
134
144
|
Note that we create a copy of the installed extension, so you will need to run `qwen extensions update` to pull in changes from both locally-defined extensions and those on GitHub.
|
|
135
145
|
|
|
146
|
+
#### Choosing an install scope
|
|
147
|
+
|
|
148
|
+
By default, an installed extension is enabled globally (user scope). Pass `--scope project` to enable it only for the current workspace:
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
qwen extensions install <source> --scope project
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
`--scope workspace` is accepted as an alias of `--scope project`. This matches the scope choice offered when installing from the `/extensions manage` Discover tab.
|
|
155
|
+
|
|
156
|
+
### Managing marketplace sources
|
|
157
|
+
|
|
158
|
+
Marketplace sources (Claude plugin marketplaces) power the Discover tab in `/extensions manage`. You can manage them from the CLI as well:
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
# Add a marketplace (owner/repo, git URL, https URL to marketplace.json, or local path)
|
|
162
|
+
qwen extensions sources add <source>
|
|
163
|
+
|
|
164
|
+
# List configured marketplaces
|
|
165
|
+
qwen extensions sources list
|
|
166
|
+
|
|
167
|
+
# Re-fetch a marketplace's plugin listing
|
|
168
|
+
qwen extensions sources update <name>
|
|
169
|
+
|
|
170
|
+
# Remove a marketplace
|
|
171
|
+
qwen extensions sources remove <name>
|
|
172
|
+
```
|
|
173
|
+
|
|
136
174
|
### Uninstalling an extension
|
|
137
175
|
|
|
138
176
|
To uninstall, run `qwen extensions uninstall extension-name`, so, in the case of the install example:
|
|
@@ -52,6 +52,8 @@ If you are in Normal Mode, **Shift+Tab** (or **Tab** on Windows) first switches
|
|
|
52
52
|
|
|
53
53
|
The `/plan` command provides a quick shortcut for entering and exiting Plan Mode:
|
|
54
54
|
|
|
55
|
+
Regular planning requests do not switch modes by themselves. If you want the read-only Plan Mode workflow, use `/plan`, the keyboard shortcut, or set the approval mode to `plan` explicitly.
|
|
56
|
+
|
|
55
57
|
```bash
|
|
56
58
|
/plan # Enter plan mode
|
|
57
59
|
/plan refactor the auth module # Enter plan mode and start planning
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Channels
|
|
2
2
|
|
|
3
|
-
Channels let you interact with a Qwen Code agent from messaging platforms like Telegram, WeChat, or DingTalk, instead of the terminal. You send messages from your phone or desktop chat app, and the agent responds just like it would in the CLI.
|
|
3
|
+
Channels let you interact with a Qwen Code agent from messaging platforms like Telegram, WeChat, QQ, or DingTalk, instead of the terminal. You send messages from your phone or desktop chat app, and the agent responds just like it would in the CLI.
|
|
4
4
|
|
|
5
5
|
## How It Works
|
|
6
6
|
|
|
@@ -15,7 +15,7 @@ All channels share one agent process with isolated sessions per user. Each chann
|
|
|
15
15
|
|
|
16
16
|
## Quick Start
|
|
17
17
|
|
|
18
|
-
1. Set up a bot on your messaging platform (see channel-specific guides: [Telegram](./telegram), [WeChat](./weixin), [DingTalk](./dingtalk))
|
|
18
|
+
1. Set up a bot on your messaging platform (see channel-specific guides: [Telegram](./telegram), [WeChat](./weixin), [QQ Bot](./qqbot), [DingTalk](./dingtalk))
|
|
19
19
|
2. Add the channel configuration to `~/.qwen/settings.json`
|
|
20
20
|
3. Run `qwen channel start` to start all channels, or `qwen channel start <name>` for a single channel
|
|
21
21
|
|
|
@@ -49,7 +49,7 @@ Channels are configured under the `channels` key in `settings.json`. Each channe
|
|
|
49
49
|
|
|
50
50
|
| Option | Required | Description |
|
|
51
51
|
| ------------------------ | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
52
|
-
| `type` | Yes | Channel type: `telegram`, `weixin`, `dingtalk`, or a custom type from an extension (see [Plugins](./plugins))
|
|
52
|
+
| `type` | Yes | Channel type: `telegram`, `weixin`, `qq`, `dingtalk`, `feishu`, or a custom type from an extension (see [Plugins](./plugins)) |
|
|
53
53
|
| `token` | Telegram | Bot token. Supports `$ENV_VAR` syntax to read from environment variables. Not needed for WeChat or DingTalk |
|
|
54
54
|
| `clientId` | DingTalk | DingTalk AppKey. Supports `$ENV_VAR` syntax |
|
|
55
55
|
| `clientSecret` | DingTalk | DingTalk AppSecret. Supports `$ENV_VAR` syntax |
|
|
@@ -292,7 +292,7 @@ Channels support slash commands. These are handled locally (no agent round-trip)
|
|
|
292
292
|
|
|
293
293
|
All other slash commands (e.g., `/compress`, `/summary`) are forwarded to the agent.
|
|
294
294
|
|
|
295
|
-
These commands work on all channel types (Telegram, WeChat, DingTalk).
|
|
295
|
+
These commands work on all channel types (Telegram, WeChat, QQ, DingTalk).
|
|
296
296
|
|
|
297
297
|
## Running
|
|
298
298
|
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
# QQ Bot (QQ机器人)
|
|
2
|
+
|
|
3
|
+
This guide covers setting up a Qwen Code channel on QQ via the official QQ Bot Open Platform API.
|
|
4
|
+
|
|
5
|
+
## Prerequisites
|
|
6
|
+
|
|
7
|
+
- A QQ account (mobile app for scanning the QR code)
|
|
8
|
+
|
|
9
|
+
## Setup
|
|
10
|
+
|
|
11
|
+
### QR Code Login
|
|
12
|
+
|
|
13
|
+
Start the channel — the first time it will show a QR code. Scan it with your QQ app to activate. No developer account or manual registration needed. Credentials are saved and reused automatically.
|
|
14
|
+
|
|
15
|
+
```json
|
|
16
|
+
{
|
|
17
|
+
"channels": {
|
|
18
|
+
"my-qq": {
|
|
19
|
+
"type": "qq"
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
qwen channel start my-qq
|
|
27
|
+
# Scan the QR code in the terminal with your QQ app
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Manual Configuration (Developer Portal)
|
|
31
|
+
|
|
32
|
+
You can also use credentials from the [QQ Bot Open Platform](https://q.qq.com/) developer portal if you already have an app registered there:
|
|
33
|
+
|
|
34
|
+
```json
|
|
35
|
+
{
|
|
36
|
+
"channels": {
|
|
37
|
+
"my-qq": {
|
|
38
|
+
"type": "qq",
|
|
39
|
+
"appID": "YOUR_APP_ID",
|
|
40
|
+
"appSecret": "$QQ_APP_SECRET"
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Set the secret as an environment variable:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
export QQ_APP_SECRET=<your-app-secret>
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Configuration
|
|
53
|
+
|
|
54
|
+
```json
|
|
55
|
+
{
|
|
56
|
+
"channels": {
|
|
57
|
+
"my-qq": {
|
|
58
|
+
"type": "qq",
|
|
59
|
+
"appID": "YOUR_APP_ID",
|
|
60
|
+
"appSecret": "$QQ_APP_SECRET",
|
|
61
|
+
"sandbox": false,
|
|
62
|
+
"senderPolicy": "open",
|
|
63
|
+
"sessionScope": "user",
|
|
64
|
+
"cwd": "/path/to/your/project",
|
|
65
|
+
"instructions": "你是一个通过 QQ Bot 对话的 AI 助手。回复控制在 2000 字符以内。",
|
|
66
|
+
"blockStreaming": "on",
|
|
67
|
+
"groupPolicy": "disabled",
|
|
68
|
+
"groups": {
|
|
69
|
+
"*": { "requireMention": true }
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### QQ-Specific Options
|
|
77
|
+
|
|
78
|
+
| Option | Default | Description |
|
|
79
|
+
| ----------- | ------- | --------------------------------------------------------------------------------- |
|
|
80
|
+
| `appID` | — | QQ Bot AppID from developer portal. If omitted, QR code login is used. |
|
|
81
|
+
| `appSecret` | — | QQ Bot AppSecret. Supports `$ENV_VAR` syntax. If omitted, QR code login is used. |
|
|
82
|
+
| `sandbox` | `false` | Set to `true` to use the QQ sandbox API environment (`sandbox.api.sgroup.qq.com`) |
|
|
83
|
+
|
|
84
|
+
All standard channel options (see [Channel Overview](./overview#options)) are also supported:
|
|
85
|
+
`senderPolicy`, `allowedUsers`, `sessionScope`, `cwd`, `instructions`, `groupPolicy`, `groups`, `dispatchMode`, `blockStreaming`, `blockStreamingChunk`, `blockStreamingCoalesce`.
|
|
86
|
+
|
|
87
|
+
## Running
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
# Start only the QQ channel
|
|
91
|
+
qwen channel start my-qq
|
|
92
|
+
|
|
93
|
+
# Or start all configured channels together
|
|
94
|
+
qwen channel start
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Open QQ and send a message to your bot. You should see the response arrive in your chat.
|
|
98
|
+
|
|
99
|
+
## Group Chats
|
|
100
|
+
|
|
101
|
+
To use the bot in QQ groups:
|
|
102
|
+
|
|
103
|
+
1. Set `groupPolicy` to `"allowlist"` or `"open"` in your channel config
|
|
104
|
+
2. Add the bot to a QQ group via the QQ Bot Open Platform dashboard or by having a group admin invite it
|
|
105
|
+
3. Group members must **@mention** the bot to trigger a response
|
|
106
|
+
|
|
107
|
+
QQ Bot API V2 only delivers group messages that @mention the bot — the bot does not see all group messages. By default, `requireMention` is `true` and should be left that way for QQ.
|
|
108
|
+
|
|
109
|
+
See [Group Chats](./overview#group-chats) for full details on group policies and mention gating.
|
|
110
|
+
|
|
111
|
+
## Markdown Support
|
|
112
|
+
|
|
113
|
+
The QQ Bot channel supports Markdown formatting (`msg_type=2`). The agent's Markdown responses are sent as-is, and QQ renders them with rich formatting (bold, italic, code blocks, links, lists).
|
|
114
|
+
|
|
115
|
+
If the QQ server rejects a Markdown message for any reason, the channel automatically retries it as plain text — so your messages always go through even if the bot's Markdown capability is restricted server-side.
|
|
116
|
+
|
|
117
|
+
This is the opposite of the WeChat channel, which strips all Markdown. You can let the agent use full Markdown with the QQ channel.
|
|
118
|
+
|
|
119
|
+
## Token Management
|
|
120
|
+
|
|
121
|
+
Access tokens expire after approximately 2 hours. The channel automatically refreshes them at 80% of their TTL (typically ~1.6 hours). If a refresh fails, it retries after 60 seconds.
|
|
122
|
+
|
|
123
|
+
Token refresh continues across WebSocket reconnects — the channel never goes offline due to an expired token as long as the AppID and AppSecret remain valid.
|
|
124
|
+
|
|
125
|
+
## Connection Resilience
|
|
126
|
+
|
|
127
|
+
- **Auto-reconnect:** On WebSocket disconnect, the channel retries with exponential backoff (up to 20 attempts, max 30 seconds between retries)
|
|
128
|
+
- **Session resume:** If the WebSocket drops briefly, the channel uses QQ's `RESUME` opcode to restore the session without losing in-flight messages
|
|
129
|
+
- **Cross-server context continuation:** Chat sessions and routing state are persisted to disk. If the daemon restarts, conversations continue from where they left off
|
|
130
|
+
- **Heartbeat monitoring:** HEARTBEAT_ACK timeouts are detected and force a reconnection to avoid zombie connections
|
|
131
|
+
- **Message deduplication:** Replayed messages after a reconnect are detected and skipped
|
|
132
|
+
|
|
133
|
+
## Tips
|
|
134
|
+
|
|
135
|
+
- **Use Markdown freely** — Unlike WeChat, QQ renders Markdown natively. Bold, code blocks, lists, and links all work.
|
|
136
|
+
- **Keep responses under 2000 characters** — Longer responses are automatically split into chunks. Adding a length hint to your instructions helps the agent stay concise.
|
|
137
|
+
- **Sandbox for testing** — Set `"sandbox": true` to use the sandbox API during development. No production messages will be affected.
|
|
138
|
+
- **Restrict access** — Use `senderPolicy: "allowlist"` for a fixed set of QQ users, or `"pairing"` to approve new users from the CLI. See [DM Pairing](./overview#dm-pairing) for details.
|
|
139
|
+
|
|
140
|
+
## Key Differences from Telegram
|
|
141
|
+
|
|
142
|
+
| Area | QQ Bot | Telegram |
|
|
143
|
+
| ---------------- | ------------------------------------------- | --------------------------------------------- |
|
|
144
|
+
| Authentication | QR code login or AppID/AppSecret | Static bot token from BotFather |
|
|
145
|
+
| Markdown | Native QQ Markdown with plaintext fallback | HTML-formatted from agent Markdown |
|
|
146
|
+
| Token lifecycle | 2h TTL, auto-refresh at 80% | Permanent bot token |
|
|
147
|
+
| Group messages | Only @mention messages are delivered to bot | Bot sees all messages (with privacy mode off) |
|
|
148
|
+
| Typing indicator | Not available (QQ API limitation) | "Working..." message |
|
|
149
|
+
| Sandbox mode | Supported for testing | Not available |
|
|
150
|
+
|
|
151
|
+
## Troubleshooting
|
|
152
|
+
|
|
153
|
+
### Bot doesn't respond
|
|
154
|
+
|
|
155
|
+
- Check the terminal output for errors
|
|
156
|
+
- Verify the channel is running (`qwen channel status`)
|
|
157
|
+
- If using `senderPolicy: "allowlist"`, make sure your QQ user ID is in `allowedUsers`
|
|
158
|
+
- On first start, a QR code will appear in the terminal — scan it with your QQ app
|
|
159
|
+
|
|
160
|
+
### Bot doesn't respond in groups
|
|
161
|
+
|
|
162
|
+
- Check that `groupPolicy` is set to `"allowlist"` or `"open"` (default is `"disabled"`)
|
|
163
|
+
- **You must @mention the bot** — QQ only delivers messages that tag the bot
|
|
164
|
+
- Verify the bot has been added to the group
|
|
165
|
+
|
|
166
|
+
### QR code login is stuck
|
|
167
|
+
|
|
168
|
+
- The QR code is displayed in the terminal. Scan it with your QQ mobile app (Me → Scan)
|
|
169
|
+
- If the QR code expires (typically after a few minutes), restart the channel to get a new one
|
|
170
|
+
|
|
171
|
+
### Markdown messages appear as plain text
|
|
172
|
+
|
|
173
|
+
- The QQ server may have rejected the Markdown message and the channel silently fell back to plain text. Check the terminal for `"Markdown rejected"` log messages
|
|
174
|
+
- This is unusual on the QQ Bot Open Platform but can happen if the bot's Markdown capability is restricted server-side
|
|
175
|
+
|
|
176
|
+
### Token expired after long downtime
|
|
177
|
+
|
|
178
|
+
- If the channel is offline for more than 2 hours, the access token will have expired. The channel fetches a fresh token on reconnect — no action needed
|
|
179
|
+
- If the AppSecret itself is invalid (e.g., rotated in the developer portal), update the `appSecret` field or delete `~/.qwen/channels/<name>-credentials.json` to re-trigger QR code login
|
|
@@ -94,6 +94,7 @@ Commands for managing AI tools and models.
|
|
|
94
94
|
| `/arena` | Manage Arena sessions | `/arena start`, `/arena status` |
|
|
95
95
|
| `/goal` | Set a goal — keep working until condition met | `/goal <condition>`, `/goal clear` |
|
|
96
96
|
| `/tasks` | List background tasks | `/tasks` |
|
|
97
|
+
| `/workflows` | Inspect workflow runs | `/workflows`, `/workflows <runId>` |
|
|
97
98
|
| `/lsp` | Show LSP server status | `/lsp` |
|
|
98
99
|
| `/trust` | Manage folder trust settings | `/trust` |
|
|
99
100
|
|
|
@@ -526,3 +527,51 @@ Requirements:
|
|
|
526
527
|
| Shell Escaping | Prevent command injection | Automatic processing |
|
|
527
528
|
| Execution Confirmation | Avoid accidental execution | Dialog confirmation |
|
|
528
529
|
| Error Reporting | Help diagnose issues | View error information |
|
|
530
|
+
|
|
531
|
+
## 5. CLI Subcommands
|
|
532
|
+
|
|
533
|
+
These commands are run from the shell as `qwen <subcommand>` before starting an interactive session.
|
|
534
|
+
|
|
535
|
+
### Session Management
|
|
536
|
+
|
|
537
|
+
| Command | Description | Usage Examples |
|
|
538
|
+
| -------------------- | --------------------------------- | ------------------------------------------------------------ |
|
|
539
|
+
| `qwen sessions list` | List recent conversation sessions | `qwen sessions list`, `qwen sessions list --json --limit 50` |
|
|
540
|
+
|
|
541
|
+
#### `qwen sessions list`
|
|
542
|
+
|
|
543
|
+
Lists your recent Qwen Code sessions with metadata.
|
|
544
|
+
|
|
545
|
+
**Flags:**
|
|
546
|
+
|
|
547
|
+
| Flag | Type | Default | Description |
|
|
548
|
+
| --------- | ------- | ------- | ----------------------------------------------- |
|
|
549
|
+
| `--json` | boolean | `false` | Output as JSON Lines (one JSON object per line) |
|
|
550
|
+
| `--limit` | number | `20` | Maximum number of sessions to show |
|
|
551
|
+
|
|
552
|
+
**Human-readable output (default):**
|
|
553
|
+
|
|
554
|
+
A table with columns: SESSION ID, STARTED (UTC timestamp), TITLE, BRANCH, PROMPT.
|
|
555
|
+
|
|
556
|
+
**JSON output (`--json`):**
|
|
557
|
+
|
|
558
|
+
Outputs JSON Lines on stdout. Each line is a JSON object with fields:
|
|
559
|
+
|
|
560
|
+
```
|
|
561
|
+
sessionId, startTime, mtime, prompt, gitBranch, customTitle, titleSource, filePath, cwd
|
|
562
|
+
```
|
|
563
|
+
|
|
564
|
+
The "has more sessions" hint is emitted via stderr so piping to `jq` remains safe.
|
|
565
|
+
|
|
566
|
+
**Examples:**
|
|
567
|
+
|
|
568
|
+
```bash
|
|
569
|
+
# Show last 20 sessions (default)
|
|
570
|
+
qwen sessions list
|
|
571
|
+
|
|
572
|
+
# Show last 50 sessions
|
|
573
|
+
qwen sessions list --limit 50
|
|
574
|
+
|
|
575
|
+
# Output as JSON for scripting
|
|
576
|
+
qwen sessions list --json | jq .
|
|
577
|
+
```
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
# Followup Suggestions
|
|
2
2
|
|
|
3
|
-
Qwen Code can predict what you want to type next and show it as
|
|
3
|
+
Qwen Code can predict what you want to type next and show it as placeholder text in the input area. This feature uses an LLM call to analyze the conversation context and generate a natural next step suggestion.
|
|
4
4
|
|
|
5
5
|
This feature works end-to-end in the CLI. In the WebUI, the hook and UI plumbing are available, but host applications must trigger suggestion generation and wire the followup state for suggestions to appear.
|
|
6
6
|
|
|
7
7
|
## How It Works
|
|
8
8
|
|
|
9
|
-
After Qwen Code finishes responding, a suggestion appears as dimmed text in the input area after a short delay (~300ms). For example, after fixing a bug, you might see:
|
|
9
|
+
After Qwen Code finishes responding, a suggestion appears as dimmed placeholder text in the input area after a short delay (~300ms). For example, after fixing a bug, you might see:
|
|
10
10
|
|
|
11
11
|
```
|
|
12
12
|
> run the tests
|
|
@@ -19,10 +19,12 @@ The suggestion is generated by sending the conversation history to the model, wh
|
|
|
19
19
|
| Key | Action |
|
|
20
20
|
| ------------- | ------------------------------------------------ |
|
|
21
21
|
| `Tab` | Accept the suggestion and fill it into the input |
|
|
22
|
-
| `Enter` | Accept the suggestion and
|
|
22
|
+
| `Enter` | Accept the suggestion and fill it into the input |
|
|
23
23
|
| `Right Arrow` | Accept the suggestion and fill it into the input |
|
|
24
24
|
| Any typing | Dismiss the suggestion and type normally |
|
|
25
25
|
|
|
26
|
+
`Enter` fills the input rather than submitting, so accepting a suggested slash command (e.g. `/clear`) never auto-executes — you submit it yourself with a second `Enter`.
|
|
27
|
+
|
|
26
28
|
## When Suggestions Appear
|
|
27
29
|
|
|
28
30
|
Suggestions are generated when all of the following conditions are met:
|
|
@@ -32,7 +34,7 @@ Suggestions are generated when all of the following conditions are met:
|
|
|
32
34
|
- There are no errors in the most recent response
|
|
33
35
|
- No confirmation dialogs are pending (e.g., shell confirmation, permissions)
|
|
34
36
|
- The approval mode is not set to `plan`
|
|
35
|
-
- The feature is enabled
|
|
37
|
+
- The feature is enabled (on by default — set `ui.enableFollowupSuggestions` to `false` to turn it off)
|
|
36
38
|
|
|
37
39
|
Suggestions will not appear in non-interactive mode (e.g., headless/SDK mode).
|
|
38
40
|
|
|
@@ -44,7 +46,7 @@ Suggestions are automatically dismissed when:
|
|
|
44
46
|
|
|
45
47
|
## Fast Model
|
|
46
48
|
|
|
47
|
-
By default, suggestions use the same model as your main conversation. For
|
|
49
|
+
By default, suggestions use the same model as your main conversation. For lower-latency suggestions, configure a dedicated fast model:
|
|
48
50
|
|
|
49
51
|
### Via command
|
|
50
52
|
|
|
@@ -64,6 +66,8 @@ Or use `/model --fast` (without a model name) to open a selection dialog.
|
|
|
64
66
|
|
|
65
67
|
The fast model is used for prompt suggestions and speculative execution. When not configured, the main conversation model is used as fallback.
|
|
66
68
|
|
|
69
|
+
> **Cost note:** A fast model lowers latency, but it does not always lower cost. Suggestion generation reuses your conversation's prefix cache (via `ui.enableCacheSharing`, on by default) — but a prefix cache is per-model. Pointing `fastModel` at a different model forks to a separate cache, so the whole conversation history is re-billed as uncached input on the fast model. On long conversations, the default (main model + shared cache) can be **cheaper** than a fast model, since most of the history is billed at the discounted cached rate. Set `fastModel` when latency matters more than per-turn cost.
|
|
70
|
+
|
|
67
71
|
Thinking/reasoning mode is automatically disabled for all background tasks (suggestion generation and speculation), regardless of your main model's thinking configuration. This avoids wasting tokens on internal reasoning that isn't needed for these tasks.
|
|
68
72
|
|
|
69
73
|
## Configuration
|
|
@@ -72,7 +76,7 @@ These settings can be configured in `settings.json`:
|
|
|
72
76
|
|
|
73
77
|
| Setting | Type | Default | Description |
|
|
74
78
|
| ------------------------------ | ------- | ------- | ------------------------------------------------------------------ |
|
|
75
|
-
| `ui.enableFollowupSuggestions` | boolean | `
|
|
79
|
+
| `ui.enableFollowupSuggestions` | boolean | `true` | Enable or disable followup suggestions |
|
|
76
80
|
| `ui.enableCacheSharing` | boolean | `true` | Use cache-aware forked queries to reduce cost (experimental) |
|
|
77
81
|
| `ui.enableSpeculation` | boolean | `false` | Speculatively execute suggestions before submission (experimental) |
|
|
78
82
|
| `fastModel` | string | `""` | Model for prompt suggestions and speculative execution |
|
|
@@ -384,7 +384,8 @@ Hook output supports three categories of fields:
|
|
|
384
384
|
"permission_mode": "default | plan | auto_edit | yolo",
|
|
385
385
|
"tool_name": "name of the tool being executed",
|
|
386
386
|
"tool_input": "object containing the tool's input parameters",
|
|
387
|
-
"tool_use_id": "unique identifier for this tool use instance"
|
|
387
|
+
"tool_use_id": "unique identifier for this tool use instance (internal format, e.g., toolu_xxx)",
|
|
388
|
+
"tool_call_id": "original API call ID from the LLM provider (e.g., call_xxx for OpenAI/Qwen) (optional)"
|
|
388
389
|
}
|
|
389
390
|
```
|
|
390
391
|
|
|
@@ -422,7 +423,8 @@ Hook output supports three categories of fields:
|
|
|
422
423
|
"tool_name": "name of the tool that was executed",
|
|
423
424
|
"tool_input": "object containing the tool's input parameters",
|
|
424
425
|
"tool_response": "object containing the tool's response",
|
|
425
|
-
"tool_use_id": "unique identifier for this tool use instance"
|
|
426
|
+
"tool_use_id": "unique identifier for this tool use instance (internal format, e.g., toolu_xxx)",
|
|
427
|
+
"tool_call_id": "original API call ID from the LLM provider (e.g., call_xxx for OpenAI/Qwen) (optional)"
|
|
426
428
|
}
|
|
427
429
|
```
|
|
428
430
|
|
|
@@ -453,7 +455,8 @@ Hook output supports three categories of fields:
|
|
|
453
455
|
```json
|
|
454
456
|
{
|
|
455
457
|
"permission_mode": "default | plan | auto_edit | yolo",
|
|
456
|
-
"tool_use_id": "unique identifier for the tool use",
|
|
458
|
+
"tool_use_id": "unique identifier for the tool use (internal format, e.g., toolu_xxx)",
|
|
459
|
+
"tool_call_id": "original API call ID from the LLM provider (e.g., call_xxx for OpenAI/Qwen) (optional)",
|
|
457
460
|
"tool_name": "name of the tool that failed",
|
|
458
461
|
"tool_input": "object containing the tool's input parameters",
|
|
459
462
|
"error": "error message describing the failure",
|
|
@@ -88,8 +88,8 @@ Add a `statusLine` object under the `ui` key in `~/.qwen/settings.json`:
|
|
|
88
88
|
| `model` | | Current model name without reasoning level |
|
|
89
89
|
| `git-branch` | Yes | Current Git branch name (hidden when not in a git repo) |
|
|
90
90
|
| `context-remaining` | Yes | Percentage of context window remaining (e.g. `Context 65.7% left`) |
|
|
91
|
-
| `total-input-tokens` | |
|
|
92
|
-
| `total-output-tokens` | |
|
|
91
|
+
| `total-input-tokens` | | Cumulative input tokens used in session (e.g. `30.0k total in`) |
|
|
92
|
+
| `total-output-tokens` | | Cumulative output tokens used in session (e.g. `5.0k total out`) |
|
|
93
93
|
| `current-dir` | Yes | Current working directory |
|
|
94
94
|
| `project-name` | | Project name (basename of working directory) |
|
|
95
95
|
| `pull-request-number` | | Open PR number for the current branch (requires `gh` CLI) |
|
|
@@ -103,6 +103,8 @@ Add a `statusLine` object under the `ui` key in `~/.qwen/settings.json`:
|
|
|
103
103
|
|
|
104
104
|
Items marked **Default** are pre-selected when you first open the `/statusline` dialog.
|
|
105
105
|
|
|
106
|
+
`total-input-tokens` and `total-output-tokens` are session totals. They add up token usage across turns, so input tokens can grow quickly because each new model request includes the current conversation context again. Use `used-tokens` when you want the current prompt size instead of cumulative session spend.
|
|
107
|
+
|
|
106
108
|
### Example output
|
|
107
109
|
|
|
108
110
|
With the default items, the status line looks like:
|
|
@@ -10,6 +10,7 @@ Run Qwen Code as a local HTTP daemon so multiple clients (IDE plugins, web UIs,
|
|
|
10
10
|
|
|
11
11
|
## What it gives you
|
|
12
12
|
|
|
13
|
+
- **Built-in Web Shell UI** — `qwen serve` serves the browser-based Web Shell at its root (`http://127.0.0.1:4170/`) out of the box; run `qwen serve --open` to launch it in your browser automatically. It is served on the same origin as the API, so no second port or reverse proxy is needed. Pass `--no-web` for an API-only daemon.
|
|
13
14
|
- **One agent process, many clients** — under the default `sessionScope: 'single'`, every client connecting to the daemon shares one ACP session. Live cross-client collaboration on the same conversation, the same file diffs, the same permission prompts.
|
|
14
15
|
- **Reconnect-safe streaming** — SSE with `Last-Event-ID` reconnect lets a client drop and pick up exactly where it left off (within the ring's replay window).
|
|
15
16
|
- **First-responder permissions** — when the agent asks for permission to run a tool, every connected client sees the request; whichever client answers first wins.
|
|
@@ -63,6 +64,8 @@ qwen serve
|
|
|
63
64
|
|
|
64
65
|
The default bind is `127.0.0.1:4170`. Bearer auth is **off** on loopback so local development "just works". The daemon binds to the current working directory; use `--workspace /path/to/dir` to override.
|
|
65
66
|
|
|
67
|
+
**Open the Web Shell UI.** Browse to `http://127.0.0.1:4170/` (or start the daemon with `qwen serve --open` to launch it automatically) for the full browser terminal — chat, diffs, tool calls, and permission prompts. The UI is served at the daemon root on the same origin as the API. The rest of this guide uses raw HTTP so you can script against the API directly.
|
|
68
|
+
|
|
66
69
|
### 2. Sanity-check it
|
|
67
70
|
|
|
68
71
|
```bash
|
|
@@ -161,7 +164,7 @@ curl -N http://127.0.0.1:4170/session/$SESSION_ID/events
|
|
|
161
164
|
The `data:` line is the **full event envelope** — `{id?, v, type, data, originatorClientId?}` — JSON-stringified on a single line. The ACP payload (the `sessionUpdate` block in this example) sits under `data` inside that envelope. The SSE-level `id:` / `event:` lines are convenience for EventSource clients; the same values appear inside the JSON envelope so raw-`fetch` consumers get them too.
|
|
162
165
|
|
|
163
166
|
Open this **before** sending the prompt — the SSE replay buffer holds the
|
|
164
|
-
last
|
|
167
|
+
last 8000 events so a late subscriber can catch up via `Last-Event-ID`,
|
|
165
168
|
but for the simple "watch a single prompt" case it's easiest to subscribe
|
|
166
169
|
first and let it stream live.
|
|
167
170
|
|
|
@@ -230,6 +233,8 @@ The token comparison is constant-time (SHA-256 + `crypto.timingSafeEqual`); 401
|
|
|
230
233
|
| `--mcp-budget-mode <m>` | `warn` / `off` | How `--mcp-client-budget` is enforced. `warn` (default when budget set): no refusal, snapshot's `budgets[0].status` flips to `warning` at ≥75% of budget. `enforce`: connects past the cap are refused, per-server cell shows `disabledReason: 'budget'`, deterministic by `mcpServers` declaration order. `off` (default when budget unset): pure observability. Boot rejects `enforce` without a budget. |
|
|
231
234
|
| `--http-bridge` | `true` | Stage 1 mode: one `qwen --acp` child per daemon (bound to one workspace at boot, per [#3803](https://github.com/QwenLM/qwen-code/issues/3803) §02); N sessions multiplex onto that child via ACP `newSession()`. Stage 2 native in-process becomes available later. |
|
|
232
235
|
| `--allow-origin <pat>` | — | T2.4 ([#4514](https://github.com/QwenLM/qwen-code/issues/4514)). Cross-origin allowlist for browser webui clients. Repeatable. Each value is `*` (any origin — boot refuses if no bearer token is configured; `--require-auth` on loopback is recommended so `/health` and `/demo` are also bearer-gated, since both are pre-auth on loopback by default) or a canonical URL origin (`<scheme>://<host>[:<port>]`, no trailing slash / path / userinfo / query). **Subdomain wildcards (`https://*.example.com`) are intentionally unsupported** — list each subdomain explicitly, or use `*` with a configured token (and `--require-auth` for full hardening). Matched origins receive CORS response headers (`Access-Control-Allow-Origin`, `Vary: Origin`, methods, headers, max-age, and exposed `Retry-After`); unmatched origins still get a 403 with the same envelope as today's wall. `Origin: null` (sandboxed iframes, file:// docs) is always rejected, even under `*`. Pre-flight via `caps.features.allow_origin`. Loopback self-origin hits are unaffected. |
|
|
236
|
+
| `--web` / `--no-web` | `true` | Serve the built Web Shell SPA at the daemon root (`GET /`, `/assets/*`, and SPA deep-link fallback). The static shell is registered **before** the bearer-auth gate — a browser can't attach a token to a `<script>` subresource or an address-bar navigation, the shell carries no secrets, and every API route stays token-gated regardless. On non-loopback binds a one-line stderr warning notes the UI is reachable without auth. Use `--no-web` for an API-only daemon. No effect when the build omits the Web Shell assets (the daemon logs a breadcrumb and runs API-only). |
|
|
237
|
+
| `--open` | `false` | After the listener is up, open the Web Shell in your default browser at the daemon URL (with `#token=` appended as a URL fragment when a token is configured — a fragment is never sent to the server, keeping the token out of access logs and Referer headers). No-op with `--no-web`, or in headless / CI / SSH environments where no browser is available. |
|
|
233
238
|
|
|
234
239
|
> **Sizing the load knobs.** `--max-sessions` is the **new-child** cap.
|
|
235
240
|
> Three other layers also limit load — when sizing for a high-concurrency
|
|
@@ -357,7 +362,7 @@ for await (const event of session.events()) {
|
|
|
357
362
|
|
|
358
363
|
Pre-flight `caps.features.session_load` / `caps.features.session_resume` before calling — older daemons return `404`. `unstable_session_resume` is still advertised as a deprecated compatibility alias. Concurrent same-action requests for the same id coalesce; cross-action races (a `load` racing a `resume`) get `409 restore_in_progress` with `Retry-After: 5`. See the [protocol reference](../developers/qwen-serve-protocol.md) for the full error envelope.
|
|
359
364
|
|
|
360
|
-
Note: history replay is bounded by the SSE ring (default
|
|
365
|
+
Note: history replay is bounded by the SSE ring (default 8000 frames). Long histories with chatty turns can exceed that — earliest frames are dropped silently. For very long sessions, prefer `resume` and rely on the client's local persisted UI.
|
|
361
366
|
|
|
362
367
|
## Durability model
|
|
363
368
|
|
|
@@ -365,7 +370,7 @@ Note: history replay is bounded by the SSE ring (default 4000 frames). Long hist
|
|
|
365
370
|
|
|
366
371
|
- A child process crash publishes `session_died` and removes the live session from the daemon's maps. The persisted on-disk session **can** be reloaded via `POST /session/:id/load` if a fresh agent child is spawnable.
|
|
367
372
|
- A daemon restart loses every in-flight live session. The persisted sessions remain on disk and can be loaded against a new daemon process, subject to the same workspace binding rules.
|
|
368
|
-
- Long client disconnects (>5 min on a chatty turn) can outrun the SSE replay ring (default
|
|
373
|
+
- Long client disconnects (>5 min on a chatty turn) can outrun the SSE replay ring (default 8000 frames) — `Last-Event-ID` reconnect succeeds but state may be incoherent. For mobile / flaky-network clients, plan to re-open SSE on long drops or call `POST /session/:id/load` to replay from disk.
|
|
369
374
|
- File operations (`writeTextFile`) are atomic across crashes (write-then-rename); they aren't atomic across daemon restarts in the sense of replaying — the file write either landed or it didn't.
|
|
370
375
|
|
|
371
376
|
If your integration needs server-side cross-restart durability beyond what `session/load` covers (e.g. server-managed retry queues), you still need application-level state recovery. Don't hold long-running, restart-sensitive state inside the daemon's session.
|
|
@@ -383,7 +388,7 @@ Stage 1's contract is sized for prototyping. Per [#3889 chiga0 downstream-consum
|
|
|
383
388
|
|
|
384
389
|
3. ~~**Client-initiated heartbeat path**~~ — shipped via [#4175](https://github.com/QwenLM/qwen-code/issues/4175) PR 9. `POST /session/:id/heartbeat` records last-seen timestamps on the daemon (capability tag `client_heartbeat`); SDK helpers are `DaemonClient.heartbeat()` / `DaemonSessionClient.heartbeat()`.
|
|
385
390
|
4. **`permission_already_resolved` event** when a vote loses the first-responder race — currently UIs have to infer state from a `404`.
|
|
386
|
-
5.
|
|
391
|
+
5. ~~**Larger replay ring**~~ — bumped to 8000. **Per-session-configurable ring** still open — mobile / chatty-turn workloads may need per-session overrides.
|
|
387
392
|
6. **`slow_client_warning` event before `client_evicted`** — soft backpressure so well-behaved slow clients can self-throttle (trim render depth, drop chunks) before being terminated.
|
|
388
393
|
|
|
389
394
|
**Integration ergonomics:**
|
|
@@ -51,11 +51,11 @@ This document lists the available keyboard shortcuts in Qwen Code.
|
|
|
51
51
|
|
|
52
52
|
## Suggestions
|
|
53
53
|
|
|
54
|
-
| Shortcut
|
|
55
|
-
|
|
|
56
|
-
| `Down Arrow`
|
|
57
|
-
| `Tab` / `Enter`
|
|
58
|
-
| `Up Arrow`
|
|
54
|
+
| Shortcut | Description |
|
|
55
|
+
| ----------------------- | -------------------------------------- |
|
|
56
|
+
| `Down Arrow` / `Ctrl+N` | Navigate down through the suggestions. |
|
|
57
|
+
| `Tab` / `Enter` | Accept the selected suggestion. |
|
|
58
|
+
| `Up Arrow` / `Ctrl+P` | Navigate up through the suggestions. |
|
|
59
59
|
|
|
60
60
|
## Radio Button Select
|
|
61
61
|
|
|
@@ -83,6 +83,12 @@ Active only when `ui.useTerminalBuffer` is enabled (Settings → UI → Virtuali
|
|
|
83
83
|
|
|
84
84
|
When `ui.useTerminalBuffer` is on, the terminal forwards mouse events to qwen-code so the wheel can drive the in-app viewport. As a side effect, **native click-and-drag text selection is consumed by the program** — hold `Shift` (or `Option` on macOS Terminal / iTerm) while dragging to bypass mouse capture and select text the usual way.
|
|
85
85
|
|
|
86
|
+
### tmux trackpad scrolling
|
|
87
|
+
|
|
88
|
+
Inside tmux, some terminals translate trackpad or wheel gestures into plain `Up Arrow` and `Down Arrow` sequences before qwen-code sees them. Those bytes are identical to real arrow-key presses, so qwen-code cannot tell whether you meant to scroll the viewport or navigate prompt history.
|
|
89
|
+
|
|
90
|
+
If trackpad scrolling changes the prompt history in tmux, enable `ui.useTerminalBuffer`; then use `Shift+Up` / `Shift+Down`, or the mouse wheel when tmux forwards wheel events to the app. If you prefer host scrollback, adjust your tmux mouse bindings for wheel events.
|
|
91
|
+
|
|
86
92
|
## IDE Integration
|
|
87
93
|
|
|
88
94
|
| Shortcut | Description |
|
|
@@ -85,6 +85,11 @@ This guide provides solutions to common issues and debugging tips, including top
|
|
|
85
85
|
- **Cause:** The `DEBUG` and `DEBUG_MODE` variables are automatically excluded from project `.env` files to prevent interference with the CLI behavior.
|
|
86
86
|
- **Solution:** Use a `.qwen/.env` file instead, or configure the `advanced.excludedEnvVars` setting in your `settings.json` to exclude fewer variables.
|
|
87
87
|
|
|
88
|
+
- **Trackpad scrolling in tmux changes prompt history instead of scrolling the conversation**
|
|
89
|
+
- **Issue:** In a tmux session, trackpad or wheel scrolling may cycle through previous prompts, similar to pressing `Up Arrow` or `Down Arrow`.
|
|
90
|
+
- **Cause:** tmux can translate wheel gestures into plain arrow-key sequences. Those sequences are indistinguishable from real arrow-key presses by the time qwen-code receives them.
|
|
91
|
+
- **Solution:** Enable `ui.useTerminalBuffer`; then use `Shift+Up` / `Shift+Down`, or the mouse wheel when tmux forwards wheel events to the app. If you prefer host scrollback, adjust your tmux mouse bindings for wheel events.
|
|
92
|
+
|
|
88
93
|
## IDE Companion not connecting
|
|
89
94
|
|
|
90
95
|
- Ensure VS Code has a single workspace folder open.
|