@qwen-code/qwen-code 0.19.3-nightly.20260701.a974594d7 → 0.19.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (234) hide show
  1. package/bundled/loop/loop-tick-resolver.test.ts +42 -0
  2. package/bundled/loop/loop-tick-resolver.ts +1 -1
  3. package/bundled/qc-helper/docs/configuration/auth.md +1 -1
  4. package/bundled/qc-helper/docs/configuration/settings.md +23 -11
  5. package/bundled/qc-helper/docs/features/approval-mode.md +3 -0
  6. package/bundled/qc-helper/docs/features/auto-mode.md +40 -0
  7. package/bundled/qc-helper/docs/features/channels/overview.md +81 -18
  8. package/bundled/qc-helper/docs/features/code-review.md +17 -61
  9. package/bundled/qc-helper/docs/features/commands.md +6 -6
  10. package/bundled/qc-helper/docs/features/mcp.md +3 -1
  11. package/bundled/qc-helper/docs/features/scheduled-tasks.md +10 -0
  12. package/bundled/qc-helper/docs/qwen-serve.md +19 -0
  13. package/bundled/review/DESIGN.md +21 -26
  14. package/bundled/review/SKILL.md +45 -129
  15. package/chunks/{MaxSizedBox-UZHJ73JB.js → MaxSizedBox-ERTNFI22.js} +20 -18
  16. package/chunks/{StandaloneSessionPicker-GGUIZWCE.js → StandaloneSessionPicker-Y5NGRLRY.js} +32 -29
  17. package/chunks/{acpAgent-QYZFICEZ.js → acpAgent-UMN6OYTR.js} +473 -187
  18. package/chunks/{agent-2EN7YNSW.js → agent-56DZU4ZU.js} +17 -15
  19. package/chunks/{agent-headless-SLTEZ5LV.js → agent-headless-SR7N2IJG.js} +17 -15
  20. package/chunks/{anthropicContentGenerator-CA3JTAMO.js → anthropicContentGenerator-5OZFO6WQ.js} +1 -1
  21. package/chunks/{artifact-tool-RM7WINJO.js → artifact-tool-JVZMHA4B.js} +1 -1
  22. package/chunks/{askUserQuestion-J3P6QAJ7.js → askUserQuestion-CMJZ2F3D.js} +1 -1
  23. package/chunks/{bridge-HZVAUTMX.js → bridge-AUHNFOUS.js} +23 -21
  24. package/chunks/channel-worker-supervisor-A74FV522.js +308 -0
  25. package/chunks/{chunk-N4V4VBP6.js → chunk-2X2JUE47.js} +2 -2
  26. package/chunks/{chunk-JV7A66DR.js → chunk-4VZH35PN.js} +528 -358
  27. package/chunks/{chunk-M2U5NM24.js → chunk-54YZOP7P.js} +309 -72
  28. package/chunks/{chunk-WGY3GIPP.js → chunk-6AQR7732.js} +1 -1
  29. package/chunks/{chunk-FR3II765.js → chunk-6CIIP6OE.js} +4 -4
  30. package/chunks/{chunk-IKO44NAT.js → chunk-6TLY5W3B.js} +2 -2
  31. package/chunks/{chunk-VN4CKYUW.js → chunk-73H73ASU.js} +1 -1
  32. package/chunks/{chunk-IBEM64M4.js → chunk-75X2VLSH.js} +36 -25
  33. package/chunks/{chunk-PLQTLKMR.js → chunk-7KPI4LAI.js} +3 -3
  34. package/chunks/{chunk-NVTRORSK.js → chunk-7VPC7D7O.js} +2 -2
  35. package/chunks/chunk-AHNXYU4O.js +24 -0
  36. package/chunks/{chunk-MTJVHQDP.js → chunk-B7KGXIPZ.js} +302 -257
  37. package/chunks/{chunk-35FH347N.js → chunk-BFG6OZN7.js} +16097 -16236
  38. package/chunks/{chunk-T44AF4I6.js → chunk-BNJLLAQ7.js} +1 -1
  39. package/chunks/{chunk-OEY3YAL2.js → chunk-BQNJBEUA.js} +2 -2
  40. package/chunks/{chunk-Q7TDHJ2G.js → chunk-C2IHHGBZ.js} +10 -10
  41. package/chunks/chunk-CG7SVARK.js +367 -0
  42. package/chunks/{chunk-7SP275SH.js → chunk-CS5XYDBO.js} +5 -5
  43. package/chunks/{chunk-V5YJAUHW.js → chunk-CUGEBAKG.js} +1 -1
  44. package/chunks/{chunk-FQDMX5IL.js → chunk-D5KISTLW.js} +309 -72
  45. package/chunks/{chunk-I4MXURND.js → chunk-DQ74W65K.js} +356 -468
  46. package/chunks/chunk-E5A7LHNN.js +51 -0
  47. package/chunks/{chunk-3PJXIDKI.js → chunk-E6US47KI.js} +3 -27
  48. package/chunks/chunk-EDAGQADF.js +21 -0
  49. package/chunks/{chunk-HUGAEYZR.js → chunk-FNLXLI4I.js} +2 -2
  50. package/chunks/{chunk-WJAY4WXR.js → chunk-FYKX6XOT.js} +1 -1
  51. package/chunks/{chunk-CA4ML3VH.js → chunk-G7OQ3RFJ.js} +1 -1
  52. package/chunks/{chunk-VHRREANT.js → chunk-GICCHL2Q.js} +3 -1
  53. package/chunks/{chunk-QHHNFG22.js → chunk-GLPV75ES.js} +1 -1
  54. package/chunks/{chunk-LD2XBG6Z.js → chunk-GO6LNQXT.js} +1 -39
  55. package/chunks/chunk-HI55Z6PR.js +3523 -0
  56. package/chunks/{chunk-B5MPZI4K.js → chunk-HJDF3ZVU.js} +2670 -1233
  57. package/chunks/{chunk-GDIG7TMG.js → chunk-HRZB5CSC.js} +1 -1
  58. package/chunks/{chunk-LDWTYE33.js → chunk-J3F7X3LW.js} +1 -1
  59. package/chunks/{chunk-FV4SQ54H.js → chunk-KVPFPC4J.js} +227 -85
  60. package/chunks/{chunk-Q3JOGB4U.js → chunk-L7QPM2YD.js} +1 -1
  61. package/chunks/{chunk-4722VFFU.js → chunk-L7VH7HQA.js} +6 -6
  62. package/chunks/{chunk-HWG4XLD7.js → chunk-LKWAVAB5.js} +1 -1
  63. package/chunks/{chunk-YCRTJYSQ.js → chunk-MEQWZGK5.js} +1 -1
  64. package/chunks/{chunk-6FIWYVN4.js → chunk-MKHC4BYZ.js} +30 -5
  65. package/chunks/{chunk-YCEHOJZJ.js → chunk-MNDTD5E5.js} +65 -38
  66. package/chunks/{chunk-ZGSV5ORL.js → chunk-MVZXZWGT.js} +809 -759
  67. package/chunks/chunk-MX2YXRER.js +44 -0
  68. package/chunks/{chunk-TMILTLP3.js → chunk-ND25GXEU.js} +21 -4
  69. package/chunks/{chunk-AIBPG5MB.js → chunk-OAFUMTWW.js} +2 -2
  70. package/chunks/chunk-OJCECIJA.js +238 -0
  71. package/chunks/{chunk-EUURTJY7.js → chunk-PIYV6COW.js} +1 -1
  72. package/chunks/{chunk-LXEW6BHF.js → chunk-Q7VHIRDD.js} +1 -1
  73. package/chunks/{chunk-DBR7PF4B.js → chunk-QAFQLTXG.js} +1 -1
  74. package/chunks/{chunk-3TK7FSCP.js → chunk-QMIND2AS.js} +3 -3
  75. package/chunks/{chunk-ESVSWG6Z.js → chunk-QOMAHFYI.js} +1 -1
  76. package/chunks/{chunk-J37FGIOA.js → chunk-QXPI7FEC.js} +38 -4
  77. package/chunks/chunk-RM3PGSGL.js +66 -0
  78. package/chunks/chunk-RNBYOUGV.js +42 -0
  79. package/chunks/chunk-S5EQPDTM.js +91 -0
  80. package/chunks/{chunk-GZKQ36JS.js → chunk-SFN4TEHY.js} +4 -4
  81. package/chunks/{chunk-DHXWNSJA.js → chunk-T22H4V4R.js} +42 -0
  82. package/chunks/{chunk-LXGWLOCM.js → chunk-TENOUWY2.js} +1 -1
  83. package/chunks/{chunk-BLAE2TCO.js → chunk-TTFNVEO5.js} +3 -3
  84. package/chunks/{chunk-FZY7NH37.js → chunk-UANCYOOQ.js} +1 -1
  85. package/chunks/{chunk-E5I6YSNO.js → chunk-UQFP2FEF.js} +1 -1
  86. package/chunks/{chunk-3O2BJMFW.js → chunk-UQYOMM6J.js} +4 -4
  87. package/chunks/{chunk-JERW36RG.js → chunk-UT5JU5DJ.js} +15 -15
  88. package/chunks/{chunk-DJ25MIU2.js → chunk-VKGG724L.js} +8 -8
  89. package/chunks/{chunk-G525INVW.js → chunk-W2ZOAX7F.js} +3 -3
  90. package/chunks/{chunk-HIYUAXBG.js → chunk-W6X4FGWX.js} +1 -1
  91. package/chunks/{chunk-OE5J6UA7.js → chunk-XCUFHOAD.js} +1 -1
  92. package/chunks/{chunk-KXVVXAAC.js → chunk-YBDZ63KI.js} +3 -3
  93. package/chunks/{chunk-Z34RYLRO.js → chunk-ZJP5T7IA.js} +1 -1
  94. package/chunks/{chunk-NOYV2NXI.js → chunk-ZXCVPMIK.js} +411 -43
  95. package/chunks/{computer-use-FCNWHVPW.js → computer-use-VWN5HH6A.js} +20 -18
  96. package/chunks/{contextCommand-FVFMZZEU.js → contextCommand-DFFG5KDJ.js} +19 -17
  97. package/chunks/{cron-create-IY5NMIHQ.js → cron-create-CSSWJ67I.js} +1 -1
  98. package/chunks/{cron-delete-OLNEQWKO.js → cron-delete-E56CFQ7A.js} +1 -1
  99. package/chunks/{cron-list-YAUAUV24.js → cron-list-BKSINY6Y.js} +1 -1
  100. package/chunks/daemon-5T6IHWJV.js +8430 -0
  101. package/chunks/{daemon-status-provider-42JEXENZ.js → daemon-status-provider-V5UY7O7J.js} +26 -24
  102. package/chunks/{dist-4FCNM6KJ.js → dist-2HDL5SHQ.js} +2 -2
  103. package/chunks/{dist-SU6L7ZNJ.js → dist-B7SSDVWT.js} +3 -3
  104. package/chunks/{dist-VD7HXTML.js → dist-BL3SL665.js} +1 -1
  105. package/chunks/{dist-UKPWQJCL.js → dist-TAVAGZU6.js} +37 -13
  106. package/chunks/{dist-K4XZILIO.js → dist-XBOVZ3R5.js} +26 -5
  107. package/chunks/{earlyInputCapture-FFFEC6P4.js → earlyInputCapture-VVYU4FDO.js} +17 -15
  108. package/chunks/{edit-32ILSGZY.js → edit-F35PTMBA.js} +17 -15
  109. package/chunks/{en-U3LWGSFX.js → en-FZREZFPO.js} +18 -0
  110. package/chunks/{enter-worktree-XWZKIN6A.js → enter-worktree-3DIW7EGJ.js} +17 -15
  111. package/chunks/{enterPlanMode-LPFFY7BJ.js → enterPlanMode-QNXT77KP.js} +27 -15
  112. package/chunks/{errors-UXBPYPI2.js → errors-M53YG76R.js} +19 -17
  113. package/chunks/{exit-worktree-IBS4UIU7.js → exit-worktree-BSDWNWHZ.js} +17 -15
  114. package/chunks/{exitPlanMode-JA72YHII.js → exitPlanMode-EL7AY327.js} +41 -23
  115. package/chunks/{fast-path-7UU67Y2W.js → fast-path-DUCSMUFW.js} +2 -2
  116. package/chunks/{gemini-GMVKJNMX.js → gemini-F3IERB37.js} +59 -51
  117. package/chunks/{geminiContentGenerator-7NIFF2L4.js → geminiContentGenerator-6OULAKFQ.js} +1 -1
  118. package/chunks/{glob-4NJCW5HI.js → glob-ZMLFTD4T.js} +17 -15
  119. package/chunks/{grep-PAIMLQEL.js → grep-H5X66EI7.js} +17 -15
  120. package/chunks/{initializer-R6KU4VYM.js → initializer-LEOT2OLH.js} +21 -19
  121. package/chunks/{list-H7LXAO64.js → list-M3DKXML6.js} +23 -21
  122. package/chunks/{loadedSettingsAdapter-H27JMTLU.js → loadedSettingsAdapter-OKMQFGGG.js} +21 -19
  123. package/chunks/{loop-wakeup-Y3OIRQFM.js → loop-wakeup-FPBAVVPR.js} +2 -2
  124. package/chunks/{ls-TVJEYS7O.js → ls-UGWQXPTY.js} +1 -1
  125. package/chunks/{lsp-JZSDVR3F.js → lsp-24WV7NXB.js} +1 -1
  126. package/chunks/{monitor-JSIHDPXP.js → monitor-ARL5P45R.js} +19 -16
  127. package/chunks/{nonInteractiveCli-Y4CHOETG.js → nonInteractiveCli-NUVLF3YR.js} +53 -45
  128. package/chunks/{notebook-edit-SHRNL2UM.js → notebook-edit-ANTZ2DDY.js} +17 -15
  129. package/chunks/{openaiContentGenerator-ORZZ7VFO.js → openaiContentGenerator-TFGMKGHN.js} +6 -6
  130. package/chunks/pidfile-AWTL4C63.js +72 -0
  131. package/chunks/{qwenContentGenerator-H643PL2G.js → qwenContentGenerator-6QWAYTWS.js} +18 -16
  132. package/chunks/{qwenOAuth2-OI2B7PES.js → qwenOAuth2-LWLA6MQG.js} +3 -3
  133. package/chunks/{read-file-5PRNPTTY.js → read-file-EJY73XQ3.js} +4 -4
  134. package/chunks/{read-mcp-resource-QTXGKTEV.js → read-mcp-resource-NCBTPP7X.js} +1 -1
  135. package/chunks/{ripGrep-JIKZMABJ.js → ripGrep-HC4SA6CQ.js} +17 -15
  136. package/chunks/{run-qwen-serve-PQV7QOHZ.js → run-qwen-serve-AGLZ642J.js} +291 -55
  137. package/chunks/{scheduler-OS3R5MGU.js → scheduler-TURO7NGY.js} +17 -15
  138. package/chunks/{send-message-DKGHWSTF.js → send-message-3S2NYS3O.js} +5 -3
  139. package/chunks/{serve-LVYZDKCZ.js → serve-5DAMOIDW.js} +22 -19
  140. package/chunks/{server-P4YIH35I.js → server-4AGEK2HC.js} +2268 -1222
  141. package/chunks/{session-DE4TZBKH.js → session-7ZOQUC4Y.js} +54 -46
  142. package/chunks/{settings-DFTYMJYF.js → settings-DR4V6L5Y.js} +20 -18
  143. package/chunks/{shell-3GNQLNV7.js → shell-H5WFKUXH.js} +17 -15
  144. package/chunks/{skill-NCNG4KKZ.js → skill-ANHU5ZCR.js} +4 -4
  145. package/chunks/{spawnChannel-DHRIMDVL.js → spawnChannel-VN5LJV7Z.js} +19 -17
  146. package/chunks/{src-PNZYGM3R.js → src-OVZLTVVM.js} +49 -17
  147. package/chunks/{startInteractiveUI-P6GZBFQW.js → startInteractiveUI-OA22V32P.js} +11110 -10670
  148. package/chunks/{syntheticOutput-X7L5HWLN.js → syntheticOutput-SV7GBHZ5.js} +2 -2
  149. package/chunks/{task-create-AWEUI4GI.js → task-create-W2H2UJCH.js} +6 -5
  150. package/chunks/{task-list-KZ3VJLDU.js → task-list-THBOPV4G.js} +5 -4
  151. package/chunks/{task-stop-GUNOZKJ5.js → task-stop-33FVCNCJ.js} +1 -1
  152. package/chunks/{task-update-Y56GP6DU.js → task-update-LVFQLXEI.js} +6 -5
  153. package/chunks/{team-create-6JMW3KQK.js → team-create-OYL5CAQO.js} +17 -15
  154. package/chunks/{team-delete-6AFRGDJY.js → team-delete-NTUQ25UY.js} +5 -4
  155. package/chunks/{theme-manager-FEHQO22G.js → theme-manager-XCMPF2SI.js} +17 -15
  156. package/chunks/{todoWrite-JRS6NOEU.js → todoWrite-SEPO2RI3.js} +1 -1
  157. package/chunks/{tool-search-IXAEKS7J.js → tool-search-YXW55X6Z.js} +29 -5
  158. package/chunks/{trustedFolders-SJRXNHZE.js → trustedFolders-TEPGM5YL.js} +18 -16
  159. package/chunks/{validateNonInterActiveAuth-HCH7OBDH.js → validateNonInterActiveAuth-OQIS7WUE.js} +50 -42
  160. package/chunks/{web-fetch-RELNL37A.js → web-fetch-OE7LHURA.js} +4 -4
  161. package/chunks/{workflow-M2COBI7R.js → workflow-RTUWORAP.js} +48 -27
  162. package/chunks/{workspace-providers-status-GOCWYDMK.js → workspace-providers-status-DM2XANVB.js} +23 -21
  163. package/chunks/{workspace-service-34C7SUBU.js → workspace-service-VKBI2KZD.js} +27 -25
  164. package/chunks/{write-file-E52WRXZL.js → write-file-WGALQ53L.js} +17 -15
  165. package/chunks/{zh-TW-LKLBTZHE.js → zh-TW-6GIKXEAN.js} +18 -0
  166. package/chunks/{zh-F5T4WWZO.js → zh-V3B4TFWL.js} +18 -0
  167. package/cli.js +6 -6
  168. package/locales/en.js +30 -0
  169. package/locales/fr.js +1 -2
  170. package/locales/ja.js +1 -2
  171. package/locales/zh-TW.js +29 -0
  172. package/locales/zh.js +29 -0
  173. package/node_modules/@qwen-code/audio-capture/package.json +1 -1
  174. package/node_modules/@qwen-code/audio-capture/prebuilds/darwin-arm64/@qwen-code+audio-capture.node +0 -0
  175. package/node_modules/@qwen-code/audio-capture/prebuilds/darwin-x64/@qwen-code+audio-capture.node +0 -0
  176. package/node_modules/@qwen-code/audio-capture/prebuilds/win32-x64/@qwen-code+audio-capture.node +0 -0
  177. package/package.json +3 -3
  178. package/web-shell/assets/{arc-C2DILvUl.js → arc-Det5Ccum.js} +1 -1
  179. package/web-shell/assets/{architectureDiagram-3BPJPVTR-b8gZ2cNw.js → architectureDiagram-3BPJPVTR-DqNWVFpl.js} +1 -1
  180. package/web-shell/assets/{blockDiagram-GPEHLZMM-BuRpghMj.js → blockDiagram-GPEHLZMM-CYl7tYBi.js} +1 -1
  181. package/web-shell/assets/{c4Diagram-AAUBKEIU-2ItdhFmE.js → c4Diagram-AAUBKEIU-DaAEi0NQ.js} +1 -1
  182. package/web-shell/assets/channel-Bm0bFauD.js +1 -0
  183. package/web-shell/assets/{chunk-2J33WTMH-B1QXa0q3.js → chunk-2J33WTMH-Df2CDEE2.js} +1 -1
  184. package/web-shell/assets/{chunk-4BX2VUAB-DXfhKlNq.js → chunk-4BX2VUAB-DNBFcyL2.js} +1 -1
  185. package/web-shell/assets/{chunk-55IACEB6-ClSNjxLo.js → chunk-55IACEB6-BKjF-0HI.js} +1 -1
  186. package/web-shell/assets/{chunk-727SXJPM-Dsh2wisB.js → chunk-727SXJPM-DYwAwfIM.js} +1 -1
  187. package/web-shell/assets/{chunk-AQP2D5EJ-C1TkY5AR.js → chunk-AQP2D5EJ-C6FswLqy.js} +1 -1
  188. package/web-shell/assets/{chunk-FMBD7UC4-CGtN9XR6.js → chunk-FMBD7UC4-DRWAcZSY.js} +1 -1
  189. package/web-shell/assets/{chunk-ND2GUHAM-BHiPi1SS.js → chunk-ND2GUHAM-AoL16mNR.js} +1 -1
  190. package/web-shell/assets/{chunk-QZHKN3VN-CzG3I5o1.js → chunk-QZHKN3VN-a8PtLMck.js} +1 -1
  191. package/web-shell/assets/classDiagram-4FO5ZUOK--NgUfb55.js +1 -0
  192. package/web-shell/assets/classDiagram-v2-Q7XG4LA2--NgUfb55.js +1 -0
  193. package/web-shell/assets/{cose-bilkent-S5V4N54A-EgrIoH_K.js → cose-bilkent-S5V4N54A-C4Aeu5qf.js} +1 -1
  194. package/web-shell/assets/{dagre-BM42HDAG-BUnpdX8S.js → dagre-BM42HDAG-BOulamjo.js} +1 -1
  195. package/web-shell/assets/{diagram-2AECGRRQ-BlLUCVYu.js → diagram-2AECGRRQ-D1wt2ykO.js} +1 -1
  196. package/web-shell/assets/{diagram-5GNKFQAL-FG-enmjQ.js → diagram-5GNKFQAL-BRseus-O.js} +1 -1
  197. package/web-shell/assets/{diagram-KO2AKTUF-BlzmTONk.js → diagram-KO2AKTUF-XSMkNzpZ.js} +1 -1
  198. package/web-shell/assets/{diagram-LMA3HP47-CoBQ8mIx.js → diagram-LMA3HP47-21KNLqoi.js} +1 -1
  199. package/web-shell/assets/{diagram-OG6HWLK6-DvxV6sX8.js → diagram-OG6HWLK6-DnUI8F5G.js} +1 -1
  200. package/web-shell/assets/{erDiagram-TEJ5UH35-Jq1tpAoj.js → erDiagram-TEJ5UH35-BVSOMuM2.js} +1 -1
  201. package/web-shell/assets/{flowDiagram-I6XJVG4X-CbtYOry5.js → flowDiagram-I6XJVG4X-fYtDPJsW.js} +1 -1
  202. package/web-shell/assets/{ganttDiagram-6RSMTGT7-ZEn2VEKR.js → ganttDiagram-6RSMTGT7-CmRXosW_.js} +1 -1
  203. package/web-shell/assets/{gitGraphDiagram-PVQCEYII-BZh-LkhJ.js → gitGraphDiagram-PVQCEYII-DPrmySxO.js} +1 -1
  204. package/web-shell/assets/index-BpKnmyFV.js +717 -0
  205. package/web-shell/assets/index-fLrtxpOG.css +5 -0
  206. package/web-shell/assets/{infoDiagram-5YYISTIA-B9HuZygK.js → infoDiagram-5YYISTIA-x3VbEuCV.js} +1 -1
  207. package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-D76cNpYG.js → ishikawaDiagram-YF4QCWOH-SmitHRMC.js} +1 -1
  208. package/web-shell/assets/{journeyDiagram-JHISSGLW-6bGo7P1t.js → journeyDiagram-JHISSGLW-BxvA551S.js} +1 -1
  209. package/web-shell/assets/{kanban-definition-UN3LZRKU-DuYyRBvB.js → kanban-definition-UN3LZRKU-DNHC16jY.js} +1 -1
  210. package/web-shell/assets/{linear-CpdSW1BC.js → linear-CQ6irBL9.js} +1 -1
  211. package/web-shell/assets/{mermaid.core-s5xbZMMj.js → mermaid.core-DtB6NO1e.js} +72 -72
  212. package/web-shell/assets/{mindmap-definition-RKZ34NQL-go01fZ2y.js → mindmap-definition-RKZ34NQL-QKMAgV2v.js} +1 -1
  213. package/web-shell/assets/{pieDiagram-4H26LBE5-BfuZiEHO.js → pieDiagram-4H26LBE5-bvb6dGn6.js} +1 -1
  214. package/web-shell/assets/{quadrantDiagram-W4KKPZXB-DsoINqV6.js → quadrantDiagram-W4KKPZXB-DLgdlG4D.js} +1 -1
  215. package/web-shell/assets/{requirementDiagram-4Y6WPE33-B7FU4LiU.js → requirementDiagram-4Y6WPE33-2M9YH4GF.js} +1 -1
  216. package/web-shell/assets/{sankeyDiagram-5OEKKPKP-BEDjFnGB.js → sankeyDiagram-5OEKKPKP-DzwfclTH.js} +1 -1
  217. package/web-shell/assets/{sequenceDiagram-3UESZ5HK-gzmmL5tK.js → sequenceDiagram-3UESZ5HK-BvPmTuy2.js} +1 -1
  218. package/web-shell/assets/{stateDiagram-AJRCARHV-BtHD4IN_.js → stateDiagram-AJRCARHV-BjwUmrJF.js} +1 -1
  219. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-C4L8zXeL.js +1 -0
  220. package/web-shell/assets/{timeline-definition-PNZ67QCA-T_8gmMCf.js → timeline-definition-PNZ67QCA-CXzS6qqz.js} +1 -1
  221. package/web-shell/assets/{vennDiagram-CIIHVFJN-DdjuqnjO.js → vennDiagram-CIIHVFJN-yRSolF5B.js} +1 -1
  222. package/web-shell/assets/{wardley-L42UT6IY-Cgtrvb37.js → wardley-L42UT6IY-ClLJjHPG.js} +1 -1
  223. package/web-shell/assets/{wardleyDiagram-YWT4CUSO-BW3f3-yW.js → wardleyDiagram-YWT4CUSO-VIa6t2p2.js} +1 -1
  224. package/web-shell/assets/{xychartDiagram-2RQKCTM6-BUS9IKkc.js → xychartDiagram-2RQKCTM6-CtmrkezW.js} +1 -1
  225. package/web-shell/index.html +18 -2
  226. package/chunks/chunk-2JKEQWDZ.js +0 -1596
  227. package/chunks/chunk-32MCHZQC.js +0 -73
  228. package/chunks/chunk-UAKXW3DN.js +0 -30
  229. package/web-shell/assets/channel-eRvn2UA3.js +0 -1
  230. package/web-shell/assets/classDiagram-4FO5ZUOK-YZNwy1rx.js +0 -1
  231. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-YZNwy1rx.js +0 -1
  232. package/web-shell/assets/index-5FhE0ORO.css +0 -5
  233. package/web-shell/assets/index-CDTGmqVm.js +0 -720
  234. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-DFy6gLDd.js +0 -1
@@ -4,7 +4,7 @@ import {
4
4
  ansiRegex,
5
5
  init_ansi_regex,
6
6
  stripAnsi
7
- } from "./chunk-35FH347N.js";
7
+ } from "./chunk-BFG6OZN7.js";
8
8
  import {
9
9
  init_esbuild_shims
10
10
  } from "./chunk-A4BMJM77.js";
@@ -2,7 +2,7 @@
2
2
  "use strict";
3
3
  import {
4
4
  getGlobalQwenDir
5
- } from "./chunk-2JKEQWDZ.js";
5
+ } from "./chunk-HI55Z6PR.js";
6
6
  import {
7
7
  init_esbuild_shims
8
8
  } from "./chunk-A4BMJM77.js";
@@ -1,5 +1,16 @@
1
1
  // Force strict mode and setup for ESM
2
2
  "use strict";
3
+ import {
4
+ MID_TURN_QUEUE_DRAIN_METHOD
5
+ } from "./chunk-EWALXUAD.js";
6
+ import {
7
+ DEFAULT_RING_SIZE,
8
+ EVENT_SCHEMA_VERSION,
9
+ EventBus
10
+ } from "./chunk-ALX6BUYW.js";
11
+ import {
12
+ defaultSpawnChannelFactory
13
+ } from "./chunk-YBDZ63KI.js";
3
14
  import {
4
15
  MCP_RESTART_SERVER_DEADLINE_MS
5
16
  } from "./chunk-P7M4GA57.js";
@@ -22,26 +33,10 @@ import {
22
33
  SessionShellDisabledError,
23
34
  WorkspaceMismatchError,
24
35
  isNotCurrentlyGeneratingCancelError
25
- } from "./chunk-DHXWNSJA.js";
26
- import {
27
- MID_TURN_QUEUE_DRAIN_METHOD
28
- } from "./chunk-EWALXUAD.js";
36
+ } from "./chunk-T22H4V4R.js";
29
37
  import {
30
38
  canonicalizeWorkspace
31
39
  } from "./chunk-SEZC2725.js";
32
- import {
33
- DEFAULT_RING_SIZE,
34
- EVENT_SCHEMA_VERSION,
35
- EventBus
36
- } from "./chunk-ALX6BUYW.js";
37
- import {
38
- defaultSpawnChannelFactory
39
- } from "./chunk-KXVVXAAC.js";
40
- import {
41
- ClientSideConnection,
42
- PROTOCOL_VERSION,
43
- RequestError
44
- } from "./chunk-UFC57OYT.js";
45
40
  import {
46
41
  BridgeChannelClosedError,
47
42
  BridgeTimeoutError,
@@ -50,15 +45,20 @@ import {
50
45
  STATUS_SCHEMA_VERSION,
51
46
  createIdleWorkspaceExtensionsStatus,
52
47
  createIdleWorkspaceHooksStatus
53
- } from "./chunk-VHRREANT.js";
48
+ } from "./chunk-GICCHL2Q.js";
49
+ import {
50
+ ClientSideConnection,
51
+ PROTOCOL_VERSION,
52
+ RequestError
53
+ } from "./chunk-UFC57OYT.js";
54
54
  import {
55
55
  ShellExecutionService,
56
56
  TrustGateError
57
- } from "./chunk-35FH347N.js";
57
+ } from "./chunk-BFG6OZN7.js";
58
58
  import {
59
59
  DAEMON_TRACEPARENT_META_KEY,
60
60
  DAEMON_TRACESTATE_META_KEY
61
- } from "./chunk-B5MPZI4K.js";
61
+ } from "./chunk-HJDF3ZVU.js";
62
62
  import {
63
63
  init_esbuild_shims
64
64
  } from "./chunk-A4BMJM77.js";
@@ -1909,6 +1909,24 @@ function extractPermissionResponseMetadata(response) {
1909
1909
  return void 0;
1910
1910
  }
1911
1911
  __name(extractPermissionResponseMetadata, "extractPermissionResponseMetadata");
1912
+ function parseWorkspaceMemoryRememberResult(response) {
1913
+ if (response === null || typeof response !== "object" || Array.isArray(response)) {
1914
+ throw new Error("Malformed workspace memory remember response");
1915
+ }
1916
+ const record = response;
1917
+ const summary = record["summary"];
1918
+ const filesTouched = record["filesTouched"];
1919
+ const touchedScopes = record["touchedScopes"];
1920
+ if (summary !== void 0 && typeof summary !== "string" || !Array.isArray(filesTouched) || !filesTouched.every((file) => typeof file === "string") || !Array.isArray(touchedScopes) || !touchedScopes.every((scope) => scope === "user" || scope === "project")) {
1921
+ throw new Error("Malformed workspace memory remember response");
1922
+ }
1923
+ return {
1924
+ ...summary === void 0 ? {} : { summary },
1925
+ filesTouched,
1926
+ touchedScopes
1927
+ };
1928
+ }
1929
+ __name(parseWorkspaceMemoryRememberResult, "parseWorkspaceMemoryRememberResult");
1912
1930
  function echoPromptToSessionBus(entry, req, originatorClientId) {
1913
1931
  const prompt = req.prompt;
1914
1932
  if (!Array.isArray(prompt) || prompt.length === 0) return;
@@ -2059,6 +2077,7 @@ __name(extractPromptText, "extractPromptText");
2059
2077
  var DEFAULT_INIT_TIMEOUT_MS = 1e4;
2060
2078
  var PERSIST_TIMEOUT_MS = 5e3;
2061
2079
  var MCP_RESTART_TIMEOUT_MS = 3e5;
2080
+ var WORKSPACE_MEMORY_REMEMBER_TIMEOUT_MS = 3e5;
2062
2081
  var MCP_OAUTH_TIMEOUT_MS = 6e5;
2063
2082
  var DAEMON_RETRY_META_KEY = "qwen.daemon.retry";
2064
2083
  var DAEMON_CONTINUE_META_KEY = "qwen.daemon.continueLastTurn";
@@ -2194,7 +2213,7 @@ function createAcpSessionBridge(opts) {
2194
2213
  cancelIdleTimer();
2195
2214
  idleTimer = setTimeout(() => {
2196
2215
  idleTimer = void 0;
2197
- if (ci.sessionIds.size === 0 && ci.pendingRestoreIds.size === 0) {
2216
+ if (hasNoChannelWork(ci)) {
2198
2217
  writeStderrLine(
2199
2218
  `qwen serve: idle timeout (${timeoutMs}ms) expired, killing channel`
2200
2219
  );
@@ -2204,6 +2223,33 @@ function createAcpSessionBridge(opts) {
2204
2223
  idleTimer.unref();
2205
2224
  }
2206
2225
  __name(startIdleTimer, "startIdleTimer");
2226
+ function hasNoChannelWork(ci, opts2) {
2227
+ const inFlightSpawnCount = ci.sessionSpawnsInFlight - (opts2?.ignoreCurrentSessionSpawn === true ? 1 : 0);
2228
+ const pendingRestoreCount = ci.pendingRestoreIds.size - (opts2?.ignoreRestoreId !== void 0 && ci.pendingRestoreIds.has(opts2.ignoreRestoreId) ? 1 : 0);
2229
+ return ci.sessionIds.size === 0 && pendingRestoreCount === 0 && ci.workspaceControlInFlight === 0 && inFlightSpawnCount === 0;
2230
+ }
2231
+ __name(hasNoChannelWork, "hasNoChannelWork");
2232
+ async function reapPendingEmptyChannel(ci) {
2233
+ if (!ci.emptyReapPending || !hasNoChannelWork(ci)) return;
2234
+ ci.emptyReapPending = false;
2235
+ ci.isDying = true;
2236
+ await ci.channel.kill().catch(() => {
2237
+ });
2238
+ }
2239
+ __name(reapPendingEmptyChannel, "reapPendingEmptyChannel");
2240
+ async function withWorkspaceControl(ci, fn) {
2241
+ ci.workspaceControlInFlight++;
2242
+ try {
2243
+ return await fn();
2244
+ } finally {
2245
+ ci.workspaceControlInFlight = Math.max(
2246
+ 0,
2247
+ ci.workspaceControlInFlight - 1
2248
+ );
2249
+ await reapPendingEmptyChannel(ci);
2250
+ }
2251
+ }
2252
+ __name(withWorkspaceControl, "withWorkspaceControl");
2207
2253
  function startSessionReaper() {
2208
2254
  if (sessionReapIntervalMs <= 0 || sessionIdleTimeoutMs <= 0) {
2209
2255
  writeStderrLine("qwen serve: session reaper disabled");
@@ -2390,6 +2436,9 @@ function createAcpSessionBridge(opts) {
2390
2436
  client,
2391
2437
  sessionIds: /* @__PURE__ */ new Set(),
2392
2438
  pendingRestoreIds: /* @__PURE__ */ new Set(),
2439
+ sessionSpawnsInFlight: 0,
2440
+ workspaceControlInFlight: 0,
2441
+ emptyReapPending: false,
2393
2442
  isDying: false,
2394
2443
  handshakeComplete: false
2395
2444
  };
@@ -2493,63 +2542,75 @@ function createAcpSessionBridge(opts) {
2493
2542
  __name(ensureChannel, "ensureChannel");
2494
2543
  async function doSpawn(modelServiceId, effectiveScope, requestedClientId) {
2495
2544
  const ci = await ensureChannel();
2545
+ ci.sessionSpawnsInFlight++;
2546
+ let sessionRegistered = false;
2496
2547
  let newSessionResp;
2497
2548
  try {
2498
- newSessionResp = await telemetry.withSpan(
2499
- "session.new",
2500
- {
2501
- "qwen-code.daemon.bridge.operation": "session.new",
2502
- "qwen-code.daemon.session_scope": effectiveScope
2503
- },
2504
- async () => await withTimeout(
2505
- ci.connection.newSession({
2506
- cwd: boundWorkspace,
2507
- mcpServers: []
2508
- }),
2509
- initTimeoutMs,
2510
- "newSession"
2511
- )
2549
+ try {
2550
+ newSessionResp = await telemetry.withSpan(
2551
+ "session.new",
2552
+ {
2553
+ "qwen-code.daemon.bridge.operation": "session.new",
2554
+ "qwen-code.daemon.session_scope": effectiveScope
2555
+ },
2556
+ async () => await withTimeout(
2557
+ ci.connection.newSession({
2558
+ cwd: boundWorkspace,
2559
+ mcpServers: []
2560
+ }),
2561
+ initTimeoutMs,
2562
+ "newSession"
2563
+ )
2564
+ );
2565
+ } catch (err) {
2566
+ if (hasNoChannelWork(ci, { ignoreCurrentSessionSpawn: true })) {
2567
+ ci.isDying = true;
2568
+ await ci.channel.kill().catch(() => {
2569
+ });
2570
+ } else {
2571
+ ci.emptyReapPending = true;
2572
+ }
2573
+ throw err;
2574
+ }
2575
+ if (shuttingDown) {
2576
+ throw new Error("AcpSessionBridge is shutting down");
2577
+ }
2578
+ const entry = createSessionEntry(
2579
+ ci,
2580
+ newSessionResp.sessionId,
2581
+ boundWorkspace
2512
2582
  );
2513
- } catch (err) {
2514
- if (ci.sessionIds.size === 0) {
2515
- ci.isDying = true;
2516
- await ci.channel.kill().catch(() => {
2583
+ sessionRegistered = true;
2584
+ seedSnapshotCaches(entry, newSessionResp);
2585
+ const clientId = registerClient(entry, requestedClientId);
2586
+ if (effectiveScope === "single" && !defaultEntry) defaultEntry = entry;
2587
+ if (modelServiceId) {
2588
+ await applyModelServiceId(
2589
+ entry,
2590
+ modelServiceId,
2591
+ initTimeoutMs,
2592
+ clientId
2593
+ ).catch(() => {
2517
2594
  });
2518
2595
  }
2519
- throw err;
2520
- }
2521
- if (shuttingDown) {
2522
- throw new Error("AcpSessionBridge is shutting down");
2523
- }
2524
- const entry = createSessionEntry(
2525
- ci,
2526
- newSessionResp.sessionId,
2527
- boundWorkspace
2528
- );
2529
- seedSnapshotCaches(entry, newSessionResp);
2530
- const clientId = registerClient(entry, requestedClientId);
2531
- if (effectiveScope === "single" && !defaultEntry) defaultEntry = entry;
2532
- if (modelServiceId) {
2533
- await applyModelServiceId(
2534
- entry,
2535
- modelServiceId,
2536
- initTimeoutMs,
2537
- clientId
2538
- ).catch(() => {
2539
- });
2540
- }
2541
- if (!byId.has(entry.sessionId)) {
2542
- throw new Error(
2543
- `Session ${entry.sessionId} died during model-switch initialization`
2544
- );
2596
+ if (!byId.has(entry.sessionId)) {
2597
+ throw new Error(
2598
+ `Session ${entry.sessionId} died during model-switch initialization`
2599
+ );
2600
+ }
2601
+ return {
2602
+ sessionId: entry.sessionId,
2603
+ workspaceCwd: entry.workspaceCwd,
2604
+ attached: false,
2605
+ clientId,
2606
+ createdAt: entry.createdAt
2607
+ };
2608
+ } finally {
2609
+ ci.sessionSpawnsInFlight = Math.max(0, ci.sessionSpawnsInFlight - 1);
2610
+ if (!sessionRegistered) {
2611
+ await reapPendingEmptyChannel(ci);
2612
+ }
2545
2613
  }
2546
- return {
2547
- sessionId: entry.sessionId,
2548
- workspaceCwd: entry.workspaceCwd,
2549
- attached: false,
2550
- clientId,
2551
- createdAt: entry.createdAt
2552
- };
2553
2614
  }
2554
2615
  __name(doSpawn, "doSpawn");
2555
2616
  async function applyModelServiceId(entry, modelId, timeoutMs, originatorClientId) {
@@ -2688,13 +2749,24 @@ function createAcpSessionBridge(opts) {
2688
2749
  ]);
2689
2750
  return response;
2690
2751
  }, "requestSessionStatus");
2691
- const notifyAgentSessionClose = /* @__PURE__ */ __name(async (entry, ci, label) => {
2692
- if (!ci || ci.channel !== entry.channel) return;
2752
+ const notifyAgentSessionClose = /* @__PURE__ */ __name(async (entry, ci, label, opts2) => {
2753
+ if (!ci || ci.channel !== entry.channel) {
2754
+ if (opts2?.throwOnFailure === true) {
2755
+ writeStderrLine(
2756
+ `qwen serve: ${label} ACP session close channel unavailable for session ${JSON.stringify(entry.sessionId)}; agent close skipped`
2757
+ );
2758
+ throw new Error(
2759
+ `ACP session close channel unavailable for ${entry.sessionId}`
2760
+ );
2761
+ }
2762
+ return;
2763
+ }
2693
2764
  try {
2694
2765
  await Promise.race([
2695
2766
  withTimeout(
2696
2767
  entry.connection.extMethod(SERVE_CONTROL_EXT_METHODS.sessionClose, {
2697
- sessionId: entry.sessionId
2768
+ sessionId: entry.sessionId,
2769
+ ...opts2?.requireFlush === true ? { requireFlush: true } : {}
2698
2770
  }),
2699
2771
  initTimeoutMs,
2700
2772
  SERVE_CONTROL_EXT_METHODS.sessionClose
@@ -2707,6 +2779,9 @@ function createAcpSessionBridge(opts) {
2707
2779
  err instanceof Error ? err.message : err
2708
2780
  )}`
2709
2781
  );
2782
+ if (opts2?.throwOnFailure === true) {
2783
+ throw err;
2784
+ }
2710
2785
  }
2711
2786
  }, "notifyAgentSessionClose");
2712
2787
  const broadcastWorkspaceEvent = /* @__PURE__ */ __name((envelope, skipSessionId) => {
@@ -3009,10 +3084,11 @@ function createAcpSessionBridge(opts) {
3009
3084
  if (isAcpSessionResourceNotFound(err, req.sessionId)) {
3010
3085
  throw new SessionNotFoundError(req.sessionId);
3011
3086
  }
3012
- if (ci.sessionIds.size === 0 && ci.pendingRestoreIds.size === 1 && ci.pendingRestoreIds.has(req.sessionId)) {
3087
+ ci.emptyReapPending = hasNoChannelWork(ci, {
3088
+ ignoreRestoreId: req.sessionId
3089
+ });
3090
+ if (ci.emptyReapPending) {
3013
3091
  ci.isDying = true;
3014
- await ci.channel.kill().catch(() => {
3015
- });
3016
3092
  }
3017
3093
  throw err;
3018
3094
  }
@@ -3063,7 +3139,7 @@ function createAcpSessionBridge(opts) {
3063
3139
  hasActivePrompt: entry.promptActive,
3064
3140
  ...replayFieldsFor(entry, action)
3065
3141
  };
3066
- })().finally(() => {
3142
+ })().finally(async () => {
3067
3143
  ci?.pendingRestoreIds.delete(req.sessionId);
3068
3144
  ci?.client.clearRestoreInFlight(req.sessionId);
3069
3145
  pendingRestoreEvents.delete(req.sessionId);
@@ -3071,6 +3147,9 @@ function createAcpSessionBridge(opts) {
3071
3147
  restoreEvents.close();
3072
3148
  ci?.client.markSessionClosed(req.sessionId);
3073
3149
  }
3150
+ if (ci) {
3151
+ await reapPendingEmptyChannel(ci);
3152
+ }
3074
3153
  });
3075
3154
  inFlightRestores.set(req.sessionId, { action, promise, coalesceState });
3076
3155
  try {
@@ -3103,6 +3182,13 @@ function createAcpSessionBridge(opts) {
3103
3182
  `qwen serve: closeSession channelInfoForEntry returned undefined for session ${JSON.stringify(sessionId)} \u2014 channel cleanup skipped (entry's channel already torn down)`
3104
3183
  );
3105
3184
  }
3185
+ const requireAgentClose = closeOpts?.requireAgentClose === true;
3186
+ if (requireAgentClose) {
3187
+ await notifyAgentSessionClose(entry, ci, "closeSession", {
3188
+ throwOnFailure: true,
3189
+ requireFlush: true
3190
+ });
3191
+ }
3106
3192
  if (ci && ci.channel === entry.channel) {
3107
3193
  ci.sessionIds.delete(sessionId);
3108
3194
  }
@@ -3133,7 +3219,9 @@ function createAcpSessionBridge(opts) {
3133
3219
  } catch {
3134
3220
  }
3135
3221
  entry.events.close();
3136
- await notifyAgentSessionClose(entry, ci, "closeSession");
3222
+ if (!requireAgentClose) {
3223
+ await notifyAgentSessionClose(entry, ci, "closeSession");
3224
+ }
3137
3225
  try {
3138
3226
  await telemetry.withSpan(
3139
3227
  "session.close.cancel_active_prompt",
@@ -3145,8 +3233,11 @@ function createAcpSessionBridge(opts) {
3145
3233
  );
3146
3234
  } catch {
3147
3235
  }
3148
- if (ci && ci.sessionIds.size === 0 && ci.pendingRestoreIds.size === 0) {
3149
- await startIdleTimer(ci, `closeSession "${sessionId}"`);
3236
+ if (ci && hasNoChannelWork(ci)) {
3237
+ await reapPendingEmptyChannel(ci);
3238
+ if (!ci.isDying) {
3239
+ await startIdleTimer(ci, `closeSession "${sessionId}"`);
3240
+ }
3150
3241
  }
3151
3242
  }
3152
3243
  __name(closeSessionImpl, "closeSessionImpl");
@@ -4003,6 +4094,54 @@ function createAcpSessionBridge(opts) {
4003
4094
  );
4004
4095
  return response;
4005
4096
  },
4097
+ async isWorkspaceMemoryRememberAvailable() {
4098
+ const info = await ensureChannel();
4099
+ try {
4100
+ const response = await withWorkspaceControl(
4101
+ info,
4102
+ () => withTimeout(
4103
+ Promise.race([
4104
+ info.connection.extMethod(
4105
+ SERVE_CONTROL_EXT_METHODS.workspaceMemoryRememberAvailability,
4106
+ { cwd: boundWorkspace }
4107
+ ),
4108
+ getChannelClosedReject(info)
4109
+ ]),
4110
+ initTimeoutMs,
4111
+ SERVE_CONTROL_EXT_METHODS.workspaceMemoryRememberAvailability
4112
+ )
4113
+ );
4114
+ return response !== null && typeof response === "object" && response["available"] === true;
4115
+ } finally {
4116
+ if (hasNoChannelWork(info)) {
4117
+ await startIdleTimer(info, "workspace memory remember availability");
4118
+ }
4119
+ }
4120
+ },
4121
+ async runWorkspaceMemoryRemember(request) {
4122
+ const info = await ensureChannel();
4123
+ try {
4124
+ const response = await withWorkspaceControl(
4125
+ info,
4126
+ () => withTimeout(
4127
+ Promise.race([
4128
+ info.connection.extMethod(
4129
+ SERVE_CONTROL_EXT_METHODS.workspaceMemoryRemember,
4130
+ { ...request, cwd: boundWorkspace }
4131
+ ),
4132
+ getChannelClosedReject(info)
4133
+ ]),
4134
+ WORKSPACE_MEMORY_REMEMBER_TIMEOUT_MS,
4135
+ SERVE_CONTROL_EXT_METHODS.workspaceMemoryRemember
4136
+ )
4137
+ );
4138
+ return parseWorkspaceMemoryRememberResult(response);
4139
+ } finally {
4140
+ if (hasNoChannelWork(info)) {
4141
+ await startIdleTimer(info, "workspace memory remember");
4142
+ }
4143
+ }
4144
+ },
4006
4145
  async getWorkspaceMcpToolsStatus(serverName) {
4007
4146
  return requestWorkspaceStatus(
4008
4147
  SERVE_STATUS_EXT_METHODS.workspaceMcpTools,
@@ -4961,8 +5100,11 @@ function createAcpSessionBridge(opts) {
4961
5100
  } catch {
4962
5101
  }
4963
5102
  entry.events.close();
4964
- if (ci && ci.sessionIds.size === 0 && ci.pendingRestoreIds.size === 0) {
4965
- await startIdleTimer(ci, `killSession "${sessionId}"`);
5103
+ if (ci && hasNoChannelWork(ci)) {
5104
+ await reapPendingEmptyChannel(ci);
5105
+ if (!ci.isDying) {
5106
+ await startIdleTimer(ci, `killSession "${sessionId}"`);
5107
+ }
4966
5108
  }
4967
5109
  },
4968
5110
  async detachClient(sessionId, clientId) {
@@ -5049,7 +5191,7 @@ function createAcpSessionBridge(opts) {
5049
5191
  if (shuttingDown) return;
5050
5192
  const ci = await ensureChannel();
5051
5193
  const idleMs = resolvedChannelIdleTimeoutMs();
5052
- if (idleMs > 0 && ci.sessionIds.size === 0 && ci.pendingRestoreIds.size === 0) {
5194
+ if (idleMs > 0 && hasNoChannelWork(ci)) {
5053
5195
  await startIdleTimer(ci);
5054
5196
  }
5055
5197
  }
@@ -2,7 +2,7 @@
2
2
  "use strict";
3
3
  import {
4
4
  require_undici
5
- } from "./chunk-M2U5NM24.js";
5
+ } from "./chunk-54YZOP7P.js";
6
6
  import {
7
7
  writeStderrLine
8
8
  } from "./chunk-Y6Z2O3WR.js";
@@ -6,17 +6,17 @@ import {
6
6
  parseAcpBaseModelId,
7
7
  resolveCliGenerationConfig,
8
8
  sanitizeProviderBaseUrl
9
- } from "./chunk-OEY3YAL2.js";
10
- import {
11
- loadSettings
12
- } from "./chunk-6FIWYVN4.js";
9
+ } from "./chunk-BQNJBEUA.js";
13
10
  import {
14
11
  STATUS_SCHEMA_VERSION
15
- } from "./chunk-VHRREANT.js";
12
+ } from "./chunk-GICCHL2Q.js";
13
+ import {
14
+ loadSettings
15
+ } from "./chunk-MKHC4BYZ.js";
16
16
  import {
17
17
  ModelsConfig,
18
18
  resolveProviderProtocol
19
- } from "./chunk-35FH347N.js";
19
+ } from "./chunk-BFG6OZN7.js";
20
20
  import {
21
21
  tokenLimit
22
22
  } from "./chunk-YTFBURQD.js";
@@ -7,7 +7,7 @@ import {
7
7
  TEAMMATE_COLORS,
8
8
  TEAMS_DIR,
9
9
  TEAM_CONFIG_FILENAME
10
- } from "./chunk-LD2XBG6Z.js";
10
+ } from "./chunk-E5A7LHNN.js";
11
11
  import {
12
12
  atomicWriteJSON
13
13
  } from "./chunk-T42ACHFI.js";
@@ -5,7 +5,7 @@ import {
5
5
  } from "./chunk-OFEVLU4C.js";
6
6
  import {
7
7
  SchemaValidator
8
- } from "./chunk-JV7A66DR.js";
8
+ } from "./chunk-4VZH35PN.js";
9
9
  import {
10
10
  init_esbuild_shims
11
11
  } from "./chunk-A4BMJM77.js";
@@ -6,7 +6,7 @@ import {
6
6
  getLanguageNameFromLocale,
7
7
  getLanguageSettingsOptions,
8
8
  t
9
- } from "./chunk-3O2BJMFW.js";
9
+ } from "./chunk-UQYOMM6J.js";
10
10
  import {
11
11
  DEFAULT_DARK_THEME_NAME,
12
12
  DEFAULT_LIGHT_THEME_NAME
@@ -29,7 +29,7 @@ import {
29
29
  import {
30
30
  isWorkspaceTrusted,
31
31
  updateSettingsFilePreservingFormat
32
- } from "./chunk-Z34RYLRO.js";
32
+ } from "./chunk-ZJP5T7IA.js";
33
33
  import {
34
34
  require_strip_json_comments
35
35
  } from "./chunk-QYUE6W3T.js";
@@ -40,7 +40,7 @@ import {
40
40
  DEFAULT_TRUNCATE_TOOL_OUTPUT_LINES,
41
41
  DEFAULT_TRUNCATE_TOOL_OUTPUT_THRESHOLD,
42
42
  stripRuntimeSnapshotPrefix
43
- } from "./chunk-35FH347N.js";
43
+ } from "./chunk-BFG6OZN7.js";
44
44
  import {
45
45
  require_main
46
46
  } from "./chunk-SKAZWEV5.js";
@@ -50,7 +50,7 @@ import {
50
50
  import {
51
51
  DEFAULT_SENSITIVE_SPAN_ATTRIBUTE_MAX_LENGTH,
52
52
  SENSITIVE_SPAN_ATTRIBUTE_MAX_LENGTH_LIMIT
53
- } from "./chunk-B5MPZI4K.js";
53
+ } from "./chunk-HJDF3ZVU.js";
54
54
  import {
55
55
  FatalConfigError,
56
56
  QWEN_DIR,
@@ -857,7 +857,7 @@ var SETTINGS_SCHEMA = {
857
857
  category: "UI",
858
858
  requiresRestart: false,
859
859
  default: false,
860
- description: "Render conversation history in an in-app scrollable viewport instead of the terminal scrollback buffer. Recommended if you see flicker, scroll-storm, or interface freeze on long sessions, after Ctrl+O, after Ctrl+E / Ctrl+F (expand), after window resize, or when alt-tabbing back. Scroll with Shift+\u2191/\u2193 (line), PgUp/PgDn (page), Ctrl+Home/End (top/bottom), or the mouse wheel. Does NOT use the host terminal scrollback while enabled; for native text selection, hold Shift (or Option on macOS) while dragging.",
860
+ description: "Render conversation history in an in-app scrollable viewport instead of the terminal scrollback buffer. Recommended if you see flicker, scroll-storm, or interface freeze on long sessions, after Ctrl+O, after Ctrl+E / Ctrl+F (expand), after window resize, or when alt-tabbing back. Scroll with Shift+\u2191/\u2193 (line), PgUp/PgDn (page), Ctrl+Home/End (top/bottom), or the mouse wheel. Also enables mouse interactions: click an option in a menu/dialog to select it, hover to highlight it, and click in the prompt to position the cursor. Does NOT use the host terminal scrollback while enabled; for native text selection, hold Shift (or Option on macOS) while dragging.",
861
861
  showInDialog: true
862
862
  },
863
863
  shellOutputMaxLines: {
@@ -1773,6 +1773,15 @@ var SETTINGS_SCHEMA = {
1773
1773
  description: "Environment / context lines injected into the classifier system prompt.",
1774
1774
  showInDialog: false,
1775
1775
  mergeStrategy: "union" /* UNION */
1776
+ },
1777
+ classifyAllShell: {
1778
+ type: "boolean",
1779
+ label: "Classify All Shell Commands",
1780
+ category: "Tools",
1781
+ requiresRestart: true,
1782
+ default: false,
1783
+ description: "Route ALL shell commands through the auto-mode classifier, including read-only commands that would otherwise be auto-approved. Provides defense-in-depth for production environments.",
1784
+ showInDialog: false
1776
1785
  }
1777
1786
  }
1778
1787
  }
@@ -2124,6 +2133,17 @@ var SETTINGS_SCHEMA = {
2124
2133
  description: 'A list of MCP servers to exclude. Supports glob patterns (e.g. "*puppeteer*"). Takes precedence over mcp.allowed.',
2125
2134
  showInDialog: false,
2126
2135
  mergeStrategy: "concat" /* CONCAT */
2136
+ },
2137
+ toolIdleTimeoutMs: {
2138
+ type: "number",
2139
+ label: "MCP Tool Idle Timeout (ms)",
2140
+ category: "MCP",
2141
+ requiresRestart: false,
2142
+ default: 3e5,
2143
+ minimum: 1e4,
2144
+ maximum: 36e5,
2145
+ description: "Idle timeout in milliseconds for MCP tool calls. If the MCP server does not produce any response or progress update within this time, the call is aborted. Default: 300000 (5 minutes). Can be overridden via QWEN_CODE_MCP_TOOL_IDLE_TIMEOUT_MS environment variable.",
2146
+ showInDialog: false
2127
2147
  }
2128
2148
  }
2129
2149
  },
@@ -2978,6 +2998,10 @@ function getEffectiveValue(key, settings, mergedSettings) {
2978
2998
  return definition.default;
2979
2999
  }
2980
3000
  __name(getEffectiveValue, "getEffectiveValue");
3001
+ function getAllSettingKeys() {
3002
+ return Object.keys(getFlattenedSchema());
3003
+ }
3004
+ __name(getAllSettingKeys, "getAllSettingKeys");
2981
3005
  var SETTINGS_DIALOG_ORDER = [
2982
3006
  // Workflow Control - most impactful setting
2983
3007
  "tools.approvalMode",
@@ -4882,6 +4906,7 @@ export {
4882
4906
  getNestedValue,
4883
4907
  getNestedProperty,
4884
4908
  getEffectiveValue,
4909
+ getAllSettingKeys,
4885
4910
  validateSettingValue,
4886
4911
  getDialogSettingKeys,
4887
4912
  settingExistsInScope,