@qwen-code/qwen-code 0.21.7-nightly.20260808.4ec0371e6 → 0.21.8

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 (254) hide show
  1. package/README.md +2 -0
  2. package/bundled/qc-helper/docs/configuration/settings.md +12 -8
  3. package/bundled/qc-helper/docs/features/commands.md +1 -1
  4. package/bundled/qc-helper/docs/features/hooks.md +50 -0
  5. package/bundled/qc-helper/docs/integration-jetbrains.md +1 -0
  6. package/bundled/qc-helper/docs/qwen-serve.md +1 -1
  7. package/bundled/qc-helper/docs/reference/keyboard-shortcuts.md +50 -36
  8. package/bundled/review/SKILL.md +24 -5
  9. package/chunks/{MaxSizedBox-COZBVNCI.js → MaxSizedBox-7PM6BGJ5.js} +13 -10
  10. package/chunks/{StandaloneSessionPicker-3OF2FS6S.js → StandaloneSessionPicker-3UQHM7GV.js} +29 -26
  11. package/chunks/{acp-startup-profiler-ORIQ2CCQ.js → acp-startup-profiler-B5BYAMYQ.js} +2 -2
  12. package/chunks/{acpAgent-3JCJ6KWG.js → acpAgent-5UWLFV6V.js} +369 -148
  13. package/chunks/{agent-DBSC47CD.js → agent-624T2BLO.js} +13 -10
  14. package/chunks/{agent-headless-ZJHZ7I3S.js → agent-headless-2EE5J2KX.js} +13 -10
  15. package/chunks/{bridge-NFBYT4ZI.js → bridge-JENKGFFP.js} +15 -12
  16. package/chunks/{ca-NYKNH222.js → ca-ZLKAB4K3.js} +6 -0
  17. package/chunks/{channel-management-service-LXSJXQGM.js → channel-management-service-DDWUPHMU.js} +1 -1
  18. package/chunks/{channel-settings-store-LABKDKSI.js → channel-settings-store-SA6JZSPH.js} +21 -18
  19. package/chunks/{channel-worker-group-MTW2AGT3.js → channel-worker-group-E67EN3RV.js} +2 -2
  20. package/chunks/{channel-worker-manager-UU6PTQSI.js → channel-worker-manager-SW4C45CF.js} +2 -2
  21. package/chunks/{chunk-CJXIIILK.js → chunk-2FRY5CRX.js} +1 -1
  22. package/chunks/{chunk-HKCYGZZ4.js → chunk-2ILAOM2I.js} +30 -13
  23. package/chunks/{chunk-LDY4J4G6.js → chunk-2M4K4KYS.js} +176 -119
  24. package/chunks/{chunk-22NBYCPD.js → chunk-3P2LV43B.js} +1 -1
  25. package/chunks/{chunk-XCG76UE6.js → chunk-3PY4LPJF.js} +17 -129
  26. package/chunks/{chunk-26ISE5EG.js → chunk-3SE7J4DR.js} +3 -3
  27. package/chunks/{chunk-APMRLB2H.js → chunk-3WNQOYHQ.js} +12 -12
  28. package/chunks/{chunk-O7VQ3F22.js → chunk-4ALIARFY.js} +1 -1
  29. package/chunks/{chunk-FJ6YHWHZ.js → chunk-4DU3NCHG.js} +47 -54
  30. package/chunks/{chunk-BGG4MBYD.js → chunk-4PYCZH2V.js} +4 -187
  31. package/chunks/{chunk-3HS6Y4UA.js → chunk-4WU6NY7F.js} +2 -2
  32. package/chunks/{chunk-JRIJOZXO.js → chunk-5ZGR6RKJ.js} +3 -3
  33. package/chunks/{chunk-3K7FH2KQ.js → chunk-67N6HB5H.js} +1310 -171
  34. package/chunks/{chunk-ZQGHESAS.js → chunk-6TR7CFXH.js} +1 -1
  35. package/chunks/{chunk-EZ53KMUN.js → chunk-757GB46F.js} +1 -1
  36. package/chunks/{chunk-5YT3Y33M.js → chunk-77QVBFCU.js} +3 -3
  37. package/chunks/{chunk-5PGKKSO6.js → chunk-7DVT4LVV.js} +35 -28
  38. package/chunks/{chunk-IMK3SJ43.js → chunk-7VUERJHS.js} +1066 -597
  39. package/chunks/{chunk-KPMB4JEZ.js → chunk-B52AWKBB.js} +64 -20
  40. package/chunks/{chunk-R2KZWK5Z.js → chunk-BF224XHL.js} +2 -2
  41. package/chunks/{chunk-TSYIQDG7.js → chunk-BF52U4XJ.js} +1 -1
  42. package/chunks/{chunk-LDUGDB5H.js → chunk-C5VWPTGT.js} +1 -1
  43. package/chunks/{chunk-W7U4ESW2.js → chunk-CG3WBKJK.js} +1 -1
  44. package/chunks/chunk-COBO5EBO.js +135 -0
  45. package/chunks/{chunk-ACHMWGC5.js → chunk-DQSDACD2.js} +1 -1
  46. package/chunks/{chunk-VT3VNFVW.js → chunk-DX5W5AON.js} +2 -2
  47. package/chunks/{chunk-JACAHYEN.js → chunk-E4ZBKMSF.js} +4 -4
  48. package/chunks/{chunk-MV7VUCIG.js → chunk-EIVICVHM.js} +4 -4
  49. package/chunks/{chunk-YHEEE624.js → chunk-EN2TKTFH.js} +1 -1
  50. package/chunks/chunk-F6WFNA7U.js +22 -0
  51. package/chunks/{chunk-Z6W3XDLN.js → chunk-FN6YXJOP.js} +1 -1
  52. package/chunks/{chunk-BJKFFPX2.js → chunk-FWBXMANW.js} +3 -3
  53. package/chunks/{chunk-764F335K.js → chunk-FYAXKJK7.js} +314 -63
  54. package/chunks/{chunk-XIDHBXUI.js → chunk-GBDINRIL.js} +3 -3
  55. package/chunks/{chunk-Z5ZAWED3.js → chunk-GOEVOFQI.js} +3 -3
  56. package/chunks/{chunk-ZKUJ4AO7.js → chunk-GQCEQPYQ.js} +3 -3
  57. package/chunks/{chunk-BFSQBXHV.js → chunk-GXSNGY5M.js} +399 -534
  58. package/chunks/{chunk-3ARO4N5G.js → chunk-HA3SAB64.js} +22 -69
  59. package/chunks/{chunk-3ULCB3NE.js → chunk-HV76SFIA.js} +1 -1
  60. package/chunks/{chunk-LMEIS6WW.js → chunk-HWX5HPUG.js} +3 -3
  61. package/chunks/{chunk-VLFX3L3X.js → chunk-IBYULW65.js} +6 -6
  62. package/chunks/{chunk-SDUDZNF4.js → chunk-IUQ52YJK.js} +1 -1
  63. package/chunks/{chunk-H2352CX2.js → chunk-IYES5WOT.js} +2 -2
  64. package/chunks/{chunk-CE5UCTKO.js → chunk-KAQCJO6Y.js} +1 -1
  65. package/chunks/{chunk-DPH3MUAP.js → chunk-KKDVZLGL.js} +1 -1
  66. package/chunks/{chunk-R574ATRM.js → chunk-M2PNLYGY.js} +41 -0
  67. package/chunks/{chunk-P7HUJDBZ.js → chunk-M3STHEMM.js} +11 -16
  68. package/chunks/{chunk-VDS2WYM5.js → chunk-NGYI5EF5.js} +2 -2
  69. package/chunks/{chunk-ALGGS7UH.js → chunk-NPQ5ZKRP.js} +82 -1
  70. package/chunks/{chunk-GUFY6D3E.js → chunk-NPUXXRJI.js} +1 -1
  71. package/chunks/{chunk-4Q6N3SNL.js → chunk-NVRDQFCX.js} +1 -1
  72. package/chunks/{chunk-77WOUGCA.js → chunk-OHKJVAKG.js} +7 -7
  73. package/chunks/{chunk-TAOSTUHI.js → chunk-PG62DFWD.js} +10 -10
  74. package/chunks/{chunk-REHWPCG2.js → chunk-PLFATELK.js} +1 -1
  75. package/chunks/{chunk-APNNM3JC.js → chunk-QGHSP65Z.js} +2 -2
  76. package/chunks/{chunk-HY2INPTA.js → chunk-QQWD7LZV.js} +4 -4
  77. package/chunks/{chunk-P74TZRXD.js → chunk-QXVSWG66.js} +1 -1
  78. package/chunks/{chunk-TX3KSSDN.js → chunk-S3Y3GBFD.js} +1 -1
  79. package/chunks/{chunk-B23P3YWE.js → chunk-SNRT2TJJ.js} +6 -23
  80. package/chunks/chunk-SR7RZ4MS.js +202 -0
  81. package/chunks/{chunk-F3LPXDJP.js → chunk-TE3ZAJE7.js} +13 -3
  82. package/chunks/{chunk-AB4A73VL.js → chunk-TKSZJ5BV.js} +1 -1
  83. package/chunks/{chunk-RZMGG3HP.js → chunk-U5SLIG7E.js} +1 -1
  84. package/chunks/chunk-UA5H3DS2.js +203 -0
  85. package/chunks/{chunk-JSJTZ6GO.js → chunk-VWMUDKLC.js} +3 -3
  86. package/chunks/{chunk-RGTB44BO.js → chunk-VXZ5HAOV.js} +1 -1
  87. package/chunks/{chunk-BCMJPTXV.js → chunk-WG6542MA.js} +1 -1
  88. package/chunks/{chunk-AG3P2RES.js → chunk-WV5J6Q6N.js} +1 -1
  89. package/chunks/{chunk-MIA37QO3.js → chunk-XHD7CRP2.js} +2 -2
  90. package/chunks/{chunk-KKRGVSHC.js → chunk-XZKQT2B2.js} +4 -4
  91. package/chunks/{chunk-4QJJHIZ5.js → chunk-Y4TETC74.js} +5 -5
  92. package/chunks/{chunk-QKJT5K4Q.js → chunk-YEF7XEO2.js} +3 -3
  93. package/chunks/{chunk-UKAYEQDU.js → chunk-YHJFF7KH.js} +131 -38
  94. package/chunks/{chunk-64YLXLMY.js → chunk-YOM7DEGB.js} +2 -2
  95. package/chunks/{chunk-BN3OROB3.js → chunk-ZCLLJARV.js} +9 -9
  96. package/chunks/{chunk-RFA6VDCR.js → chunk-ZHA242R4.js} +2 -2
  97. package/chunks/{chunk-L4OW63GW.js → chunk-ZPLALRXZ.js} +17 -9
  98. package/chunks/{computer-use-QLJ27OCZ.js → computer-use-ESQYJ3JY.js} +13 -10
  99. package/chunks/{config-utils-KIEXWA4F.js → config-utils-XQHBJP7G.js} +2 -2
  100. package/chunks/{contextCommand-JDTOJRBO.js → contextCommand-CX3YF4ZE.js} +15 -12
  101. package/chunks/{core-runtime-MZIAVYQC.js → core-runtime-DIAU7JMG.js} +13 -10
  102. package/chunks/{create-sub-session-YBBCNSHE.js → create-sub-session-HDPD6HOA.js} +13 -10
  103. package/chunks/{daemon-SCTQMM7Z.js → daemon-VZBGJUNL.js} +30 -0
  104. package/chunks/{daemon-status-provider-BZ7RD4ZJ.js → daemon-status-provider-H6O4UQ4F.js} +19 -16
  105. package/chunks/{daemon-trust-policy-2E4C3M7S.js → daemon-trust-policy-BNUXG6MT.js} +20 -17
  106. package/chunks/{daemon-trust-policy-monitor-UYLFH6RW.js → daemon-trust-policy-monitor-E4EQ7GF4.js} +20 -17
  107. package/chunks/{de-VL76CPLV.js → de-LIW4XVLN.js} +5 -0
  108. package/chunks/{deferred-core-runtime-6XZYMJZB.js → deferred-core-runtime-CBMSHPAU.js} +13 -10
  109. package/chunks/{dist-BATY7GI4.js → dist-EEEQGCZA.js} +731 -136
  110. package/chunks/{dist-26RK5XZO.js → dist-MKX5OSFF.js} +4 -3
  111. package/chunks/{earlyInputCapture-LATQCGDC.js → earlyInputCapture-UIOP7OIN.js} +13 -10
  112. package/chunks/{edit-72DP57CD.js → edit-ITMZYFKA.js} +13 -10
  113. package/chunks/{en-IRJ2WN5T.js → en-SY5GTIGX.js} +6 -0
  114. package/chunks/{enter-worktree-B4FY2ZPP.js → enter-worktree-S4PL5UV6.js} +13 -10
  115. package/chunks/{enterPlanMode-TQBWGCPL.js → enterPlanMode-YV52NNJT.js} +13 -10
  116. package/chunks/{environment-MOGZGZDS.js → environment-NGOWPRZV.js} +17 -14
  117. package/chunks/{errors-PGON5GH7.js → errors-BU26DTDX.js} +15 -12
  118. package/chunks/{exit-worktree-EYUD4YP2.js → exit-worktree-XRM6LH5F.js} +13 -10
  119. package/chunks/{exitPlanMode-4Q7BSQXR.js → exitPlanMode-ZLI5F7KR.js} +13 -10
  120. package/chunks/{fast-path-WI7D5MER.js → fast-path-UJWORIED.js} +3 -3
  121. package/chunks/{fast-path-settings-YBRL24DB.js → fast-path-settings-37WQD5B2.js} +6 -3
  122. package/chunks/{fr-GK3HQYVB.js → fr-RQFO7U4P.js} +5 -0
  123. package/chunks/{gemini-ZXURGM6Y.js → gemini-ZSKNDUMU.js} +55 -48
  124. package/chunks/{geminiContentGenerator-EOODO75Y.js → geminiContentGenerator-YGEXOEKD.js} +1 -1
  125. package/chunks/{glob-QNRIUOS6.js → glob-7KZG44BR.js} +13 -10
  126. package/chunks/{goal-tools-QSYW65HV.js → goal-tools-PXWN5VK3.js} +3 -1
  127. package/chunks/{grep-56MTW67B.js → grep-6ZFC7RJ5.js} +13 -10
  128. package/chunks/{handleAutoUpdate-XGFIPVT4.js → handleAutoUpdate-KSEL3TQS.js} +17 -14
  129. package/chunks/{i18n-RZB35L4B.js → i18n-ZIUXBW5V.js} +14 -11
  130. package/chunks/{image-gen-OE2EEKN3.js → image-gen-AUIZJJNK.js} +6 -4
  131. package/chunks/{initializer-YPVMTMKD.js → initializer-7AHY3N6Q.js} +20 -17
  132. package/chunks/{installationInfo-ZTMTMYNW.js → installationInfo-VGBXMYLY.js} +14 -11
  133. package/chunks/{ja-3FA46IKD.js → ja-KOZKHJHZ.js} +5 -0
  134. package/chunks/{list-NIW3WID5.js → list-PSFKQHLB.js} +23 -20
  135. package/chunks/{loadedSettingsAdapter-VSLILTOZ.js → loadedSettingsAdapter-FTMRCTOF.js} +20 -17
  136. package/chunks/{loggingContentGenerator-KFZYVAGV.js → loggingContentGenerator-MZAN52UV.js} +5 -3
  137. package/chunks/{managed-npm-update-WHTA2K5V.js → managed-npm-update-O4NHK45X.js} +14 -11
  138. package/chunks/{mcp-7KGK3CS3.js → mcp-6CFP2AYQ.js} +20 -17
  139. package/chunks/{monitor-FDWEJQWP.js → monitor-DAKD6OU4.js} +13 -10
  140. package/chunks/{nonInteractiveCli-2MVJ6TCS.js → nonInteractiveCli-RC7VIUZL.js} +49 -44
  141. package/chunks/{notebook-edit-ZUVK2XWE.js → notebook-edit-474DPMRL.js} +13 -10
  142. package/chunks/{openaiContentGenerator-TNLWOPH5.js → openaiContentGenerator-2NFY2MWO.js} +6 -3
  143. package/chunks/{pidfile-BB6SKPH2.js → pidfile-KBFVDNQP.js} +13 -10
  144. package/chunks/{processUtils-WKHJOPDH.js → processUtils-6GRYH4Y3.js} +2 -2
  145. package/chunks/{pt-3AOBKPIJ.js → pt-U6AOCTMF.js} +5 -0
  146. package/chunks/{qwenContentGenerator-FZS2DYF7.js → qwenContentGenerator-KAHU6IZY.js} +14 -11
  147. package/chunks/{qwenOAuth2-UYMYRXBB.js → qwenOAuth2-RRQTCP4W.js} +6 -4
  148. package/chunks/{read-file-FMTE6LPA.js → read-file-3M6WXDXP.js} +4 -2
  149. package/chunks/{resumeHistoryUtils-Z34RCZFF.js → resumeHistoryUtils-D6TAY3HX.js} +16 -13
  150. package/chunks/{ripGrep-DUIYUZGM.js → ripGrep-PLPENT3E.js} +13 -10
  151. package/chunks/{ru-VJRAMC4W.js → ru-CMX4UMYP.js} +5 -0
  152. package/chunks/{run-qwen-serve-KOHHR3F4.js → run-qwen-serve-ZAFIJKJC.js} +93 -40
  153. package/chunks/{runtime-K4NTZSAU.js → runtime-ZED7CYOZ.js} +23 -20
  154. package/chunks/{scheduler-6G6AMURS.js → scheduler-MD3AL2W5.js} +13 -10
  155. package/chunks/{serve-NMG2TM5K.js → serve-E3VUDRZN.js} +20 -17
  156. package/chunks/{server-FS7KDELS.js → server-OWMEMAKR.js} +381 -192
  157. package/chunks/{session-XZADUVKJ.js → session-HZ57QK7K.js} +141 -81
  158. package/chunks/{settings-G75R6FOA.js → settings-V7BR3RKP.js} +19 -16
  159. package/chunks/{shell-3D3PMQHE.js → shell-23OMNMW6.js} +13 -10
  160. package/chunks/{skill-TSEYMVQ2.js → skill-6HBDYZRS.js} +4 -2
  161. package/chunks/{skill-settings-HJC2CPBJ.js → skill-settings-HWJLTU7M.js} +19 -16
  162. package/chunks/{spawnChannel-YWCN74G5.js → spawnChannel-N6KKUW5B.js} +13 -10
  163. package/chunks/{standalone-update-HLYOLX6V.js → standalone-update-QGIKHATD.js} +15 -12
  164. package/chunks/{startInteractiveUI-ROUIQ5KU.js → startInteractiveUI-GX2CRL42.js} +269 -118
  165. package/chunks/{team-create-OTP5SSB2.js → team-create-CFFKU7KL.js} +13 -10
  166. package/chunks/{team-plan-approval-TQX5TMXU.js → team-plan-approval-6EFOKR6A.js} +13 -10
  167. package/chunks/{terminal-image-renderer-KF3GKNWW.js → terminal-image-renderer-TLDNACQY.js} +13 -10
  168. package/chunks/{theme-manager-XVWAAGAM.js → theme-manager-5LJ3H7VO.js} +13 -10
  169. package/chunks/{tool-search-7N4D4O56.js → tool-search-UJV3A24H.js} +4 -2
  170. package/chunks/{total-session-admission-ZQ4VKIRW.js → total-session-admission-D63QYXGO.js} +15 -12
  171. package/chunks/{trustedFolders-4XYFPWVV.js → trustedFolders-KZCOB53W.js} +17 -12
  172. package/chunks/{update-relaunch-L4GSBLUU.js → update-relaunch-IFILM3SA.js} +5 -5
  173. package/chunks/{updateCheck-PCUTVRFE.js → updateCheck-YZ2CRCFC.js} +16 -13
  174. package/chunks/{useAutoAcceptIndicator-WMXY7MND.js → useAutoAcceptIndicator-AXEVNA3Q.js} +22 -19
  175. package/chunks/{validateNonInterActiveAuth-5S3U2D56.js → validateNonInterActiveAuth-3WTOJFWA.js} +44 -41
  176. package/chunks/{version-P57IQU2T.js → version-GXK7OHZY.js} +1 -1
  177. package/chunks/{web-fetch-5ZLLLCDD.js → web-fetch-ILB4GAVR.js} +10 -6
  178. package/chunks/{web-search-NELKANTW.js → web-search-HKRPGPZZ.js} +5 -3
  179. package/chunks/{workflow-RXKBF3LO.js → workflow-FXIPRQQA.js} +735 -134
  180. package/chunks/{workspace-providers-status-HAEMNAWC.js → workspace-providers-status-NYHC7HSR.js} +22 -19
  181. package/chunks/{workspace-registration-store-U3U3YM6V.js → workspace-registration-store-AKEB7OMW.js} +1 -1
  182. package/chunks/{workspace-registry-ZFP33GVB.js → workspace-registry-CDAS5TVZ.js} +15 -12
  183. package/chunks/{workspace-service-QMISJBMA.js → workspace-service-PAMUKMAV.js} +23 -20
  184. package/chunks/{workspace-skills-status-K7EOUGXL.js → workspace-skills-status-YQSHCCMS.js} +20 -17
  185. package/chunks/{workspace-trust-reconciler-BFPKULDZ.js → workspace-trust-reconciler-RPTXOIY2.js} +22 -19
  186. package/chunks/{write-file-2F76RRFE.js → write-file-CGS57TS4.js} +13 -10
  187. package/chunks/{zh-ARWDLDLR.js → zh-AGL2FVBI.js} +6 -0
  188. package/chunks/{zh-TW-Y4RGI3P7.js → zh-TW-KI66MHQY.js} +6 -0
  189. package/chunks/{zoom-image-DPR22XWY.js → zoom-image-E7D72GYV.js} +4 -2
  190. package/cli.js +13 -13
  191. package/locales/ca.js +10 -0
  192. package/locales/de.js +9 -0
  193. package/locales/en.js +10 -0
  194. package/locales/fr.js +9 -0
  195. package/locales/ja.js +9 -0
  196. package/locales/pt.js +9 -0
  197. package/locales/ru.js +9 -0
  198. package/locales/zh-TW.js +10 -0
  199. package/locales/zh.js +10 -0
  200. package/package.json +3 -3
  201. package/web-shell/assets/{arc-CunFPPcQ.js → arc-DybZaz32.js} +1 -1
  202. package/web-shell/assets/{architectureDiagram-3BPJPVTR-D3SqCgeM.js → architectureDiagram-3BPJPVTR-jN3qBd19.js} +1 -1
  203. package/web-shell/assets/{blockDiagram-GPEHLZMM-CPRx90S_.js → blockDiagram-GPEHLZMM-Ct5DZPrj.js} +1 -1
  204. package/web-shell/assets/{c4Diagram-AAUBKEIU-CahP9Ue4.js → c4Diagram-AAUBKEIU-CUAFMlUG.js} +1 -1
  205. package/web-shell/assets/channel-BMwLrwLW.js +1 -0
  206. package/web-shell/assets/{chunk-2J33WTMH-DckIWZ12.js → chunk-2J33WTMH-CuV8n90B.js} +1 -1
  207. package/web-shell/assets/{chunk-4BX2VUAB-D2Kfctyn.js → chunk-4BX2VUAB-BUzl_kls.js} +1 -1
  208. package/web-shell/assets/{chunk-55IACEB6-DkI11FTX.js → chunk-55IACEB6-BnDBLX6A.js} +1 -1
  209. package/web-shell/assets/{chunk-727SXJPM-rR-TSCIi.js → chunk-727SXJPM-B83uTOjm.js} +1 -1
  210. package/web-shell/assets/{chunk-AQP2D5EJ-DFGKcGRO.js → chunk-AQP2D5EJ-DM3HLgpT.js} +1 -1
  211. package/web-shell/assets/{chunk-FMBD7UC4-CjWqcTPE.js → chunk-FMBD7UC4-CSQ5hgyb.js} +1 -1
  212. package/web-shell/assets/{chunk-ND2GUHAM-RXe-87UV.js → chunk-ND2GUHAM-BWOF4SxX.js} +1 -1
  213. package/web-shell/assets/{chunk-QZHKN3VN-Dz0c_Yrn.js → chunk-QZHKN3VN-BsOH9LMi.js} +1 -1
  214. package/web-shell/assets/classDiagram-4FO5ZUOK-BGDv98jY.js +1 -0
  215. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-BGDv98jY.js +1 -0
  216. package/web-shell/assets/{cose-bilkent-S5V4N54A-ZHF0-jvV.js → cose-bilkent-S5V4N54A-IENqH2iJ.js} +1 -1
  217. package/web-shell/assets/{dagre-BM42HDAG-7Umz_ygJ.js → dagre-BM42HDAG--dyzDTGo.js} +1 -1
  218. package/web-shell/assets/{diagram-2AECGRRQ-DomN8nxq.js → diagram-2AECGRRQ-BE7Dcqof.js} +1 -1
  219. package/web-shell/assets/{diagram-5GNKFQAL-eebvj2OL.js → diagram-5GNKFQAL-Cr8-5OTj.js} +1 -1
  220. package/web-shell/assets/{diagram-KO2AKTUF-IR1mmn9d.js → diagram-KO2AKTUF-Bzey3uAY.js} +1 -1
  221. package/web-shell/assets/{diagram-LMA3HP47-CKysx5KF.js → diagram-LMA3HP47-sErl28Xb.js} +1 -1
  222. package/web-shell/assets/{diagram-OG6HWLK6-cBy5puHn.js → diagram-OG6HWLK6-Dq30ATIo.js} +1 -1
  223. package/web-shell/assets/{erDiagram-TEJ5UH35-B5RJagPG.js → erDiagram-TEJ5UH35-BkCoEfVW.js} +1 -1
  224. package/web-shell/assets/{flowDiagram-I6XJVG4X-CfHgDmPg.js → flowDiagram-I6XJVG4X-DHwO0rrI.js} +1 -1
  225. package/web-shell/assets/{ganttDiagram-6RSMTGT7-DUfFF5nb.js → ganttDiagram-6RSMTGT7-s7vAPxWq.js} +1 -1
  226. package/web-shell/assets/{gitGraphDiagram-PVQCEYII-M9dt57k5.js → gitGraphDiagram-PVQCEYII-CQxhwPOU.js} +1 -1
  227. package/web-shell/assets/{index-B8e-CkuC.css → index-Bckpjr-I.css} +1 -1
  228. package/web-shell/assets/{index-CKjO4myk.js → index-CF4wApWp.js} +1 -1
  229. package/web-shell/assets/{index-Dc-fTO0V.js → index-DwEr9HEW.js} +316 -316
  230. package/web-shell/assets/{infoDiagram-5YYISTIA-CTKMmIro.js → infoDiagram-5YYISTIA-BnFrD0bq.js} +1 -1
  231. package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-DJIJDP4s.js → ishikawaDiagram-YF4QCWOH-Bf9zK5NK.js} +1 -1
  232. package/web-shell/assets/{journeyDiagram-JHISSGLW-DgRnvn6S.js → journeyDiagram-JHISSGLW-CyGAhsxi.js} +1 -1
  233. package/web-shell/assets/{kanban-definition-UN3LZRKU-VUwO8yrg.js → kanban-definition-UN3LZRKU-CbsK5akB.js} +1 -1
  234. package/web-shell/assets/{linear-BCvgV5I_.js → linear-cQsF4P8D.js} +1 -1
  235. package/web-shell/assets/{mermaid.core-mv_kVV6q.js → mermaid.core-Z4HVqrKY.js} +5 -5
  236. package/web-shell/assets/{mindmap-definition-RKZ34NQL-sfnjMlOd.js → mindmap-definition-RKZ34NQL-CYnrBo_f.js} +1 -1
  237. package/web-shell/assets/{pieDiagram-4H26LBE5-BlhICse4.js → pieDiagram-4H26LBE5-CBzOfhrs.js} +1 -1
  238. package/web-shell/assets/{quadrantDiagram-W4KKPZXB-BgTQzwen.js → quadrantDiagram-W4KKPZXB-D4LK1Ebn.js} +1 -1
  239. package/web-shell/assets/{requirementDiagram-4Y6WPE33-CZ-FTrrN.js → requirementDiagram-4Y6WPE33-Bzti2Lcj.js} +1 -1
  240. package/web-shell/assets/{sankeyDiagram-5OEKKPKP-G5Wp_jn3.js → sankeyDiagram-5OEKKPKP-yTBw5Z2s.js} +1 -1
  241. package/web-shell/assets/{sequenceDiagram-3UESZ5HK-C8MKZ3i1.js → sequenceDiagram-3UESZ5HK-D07UVRiZ.js} +1 -1
  242. package/web-shell/assets/{stateDiagram-AJRCARHV-Bo0ZDm7y.js → stateDiagram-AJRCARHV-UE_lHsTn.js} +1 -1
  243. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-DC6xgXjX.js +1 -0
  244. package/web-shell/assets/{timeline-definition-PNZ67QCA-M3L9E01f.js → timeline-definition-PNZ67QCA-DRvYdiTs.js} +1 -1
  245. package/web-shell/assets/{vennDiagram-CIIHVFJN-DD4eHCrm.js → vennDiagram-CIIHVFJN-CQLIXs0u.js} +1 -1
  246. package/web-shell/assets/{wardley-L42UT6IY-DNEL_3g4.js → wardley-L42UT6IY-JZz_Xqse.js} +1 -1
  247. package/web-shell/assets/{wardleyDiagram-YWT4CUSO-q484OoqI.js → wardleyDiagram-YWT4CUSO--i7BiJwB.js} +1 -1
  248. package/web-shell/assets/{xychartDiagram-2RQKCTM6-4mcNt1Yg.js → xychartDiagram-2RQKCTM6-Bkc-bW0S.js} +1 -1
  249. package/web-shell/index.html +2 -2
  250. package/chunks/chunk-ALFTV7GA.js +0 -92
  251. package/web-shell/assets/channel-zbv7GWAw.js +0 -1
  252. package/web-shell/assets/classDiagram-4FO5ZUOK-DSjLkJJZ.js +0 -1
  253. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-DSjLkJJZ.js +0 -1
  254. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-31TSCPcH.js +0 -1
@@ -28,6 +28,16 @@ import {
28
28
  createIdleWorkspaceHooksStatus
29
29
  } from "./chunk-NLREQJFK.js";
30
30
  import {
31
+ ACTIVE_WORK_CLOSE_IF_UNHELD_PARAM,
32
+ ACTIVE_WORK_CLOSE_TIMEOUT_MS,
33
+ ACTIVE_WORK_HEARTBEAT_INTERVAL_MS,
34
+ ACTIVE_WORK_HEARTBEAT_META_KEY,
35
+ ACTIVE_WORK_HEARTBEAT_VERSION,
36
+ ACTIVE_WORK_HOLD_CATEGORIES,
37
+ ACTIVE_WORK_MAX_SESSION_HOLDS,
38
+ ACTIVE_WORK_MAX_SNAPSHOT_SESSIONS,
39
+ ACTIVE_WORK_NOTIFICATION_METHOD,
40
+ ACTIVE_WORK_STALE_INTERVALS,
31
41
  CHANNEL_STARTUP_PROFILE_META_KEY,
32
42
  CHANNEL_STARTUP_PROFILE_VERSION,
33
43
  DAEMON_CHANNEL_DELIVERY_META_KEY,
@@ -44,8 +54,9 @@ import {
44
54
  TODO_STOP_GUARD_CONTINUATION_CLAIM_METHOD,
45
55
  TODO_STOP_GUARD_QUEUE_RELEASE_METHOD,
46
56
  WORKTREE_MCP_DEFER_META_KEY,
57
+ clampActiveWorkIntervalMs,
47
58
  isValidTrustedModelPrompt
48
- } from "./chunk-R574ATRM.js";
59
+ } from "./chunk-M2PNLYGY.js";
49
60
  import {
50
61
  BranchWhilePromptActiveError,
51
62
  CancelSentinelCollisionError,
@@ -100,7 +111,7 @@ import {
100
111
  metadataBudgetBytes,
101
112
  normalizeSnapshotPayload,
102
113
  stableSessionArtifactId
103
- } from "./chunk-BFSQBXHV.js";
114
+ } from "./chunk-GXSNGY5M.js";
104
115
  import {
105
116
  DAEMON_TRACEPARENT_META_KEY,
106
117
  DAEMON_TRACESTATE_META_KEY
@@ -109,7 +120,7 @@ import {
109
120
  INVOCATION_CONTEXT_META_KEY,
110
121
  PRIVATE_ACP_CAPABILITY_ENV,
111
122
  PRIVATE_PARENT_CAPABILITY_META_KEY
112
- } from "./chunk-XCG76UE6.js";
123
+ } from "./chunk-3PY4LPJF.js";
113
124
  import {
114
125
  init_esbuild_shims
115
126
  } from "./chunk-5O2XNYP6.js";
@@ -1580,6 +1591,42 @@ var MultiClientPermissionMediator = class {
1580
1591
  };
1581
1592
 
1582
1593
  // packages/acp-bridge/src/bridgeClient.ts
1594
+ function parseActiveWorkSnapshot(params) {
1595
+ const seq = params["seq"];
1596
+ const sessions = params["sessions"];
1597
+ if (params["v"] !== ACTIVE_WORK_HEARTBEAT_VERSION || typeof seq !== "number" || !Number.isSafeInteger(seq) || seq <= 0 || !Array.isArray(sessions) || sessions.length > ACTIVE_WORK_MAX_SNAPSHOT_SESSIONS) {
1598
+ return void 0;
1599
+ }
1600
+ const parsed = [];
1601
+ for (const raw of sessions) {
1602
+ if (typeof raw !== "object" || raw === null) return void 0;
1603
+ const entry = raw;
1604
+ const sessionId = entry["sessionId"];
1605
+ const holds = entry["holds"];
1606
+ if (typeof sessionId !== "string" || !Array.isArray(holds) || holds.length > ACTIVE_WORK_MAX_SESSION_HOLDS) {
1607
+ return void 0;
1608
+ }
1609
+ const parsedHolds = [];
1610
+ for (const rawHold of holds) {
1611
+ if (typeof rawHold !== "object" || rawHold === null) return void 0;
1612
+ const hold = rawHold;
1613
+ const category = hold["category"];
1614
+ const id = hold["id"];
1615
+ if (typeof id !== "string" || typeof category !== "string" || !ACTIVE_WORK_HOLD_CATEGORIES.includes(
1616
+ category
1617
+ )) {
1618
+ return void 0;
1619
+ }
1620
+ parsedHolds.push({
1621
+ category,
1622
+ id
1623
+ });
1624
+ }
1625
+ parsed.push({ sessionId, holds: parsedHolds });
1626
+ }
1627
+ return { v: ACTIVE_WORK_HEARTBEAT_VERSION, seq, sessions: parsed };
1628
+ }
1629
+ __name(parseActiveWorkSnapshot, "parseActiveWorkSnapshot");
1583
1630
  var PUBLISH_ARTIFACT_TOOL_NAME = "artifact";
1584
1631
  var MAX_CHANNEL_DELIVERY_TEXT_CHARS = 1e5;
1585
1632
  var MAX_CHANNEL_DELIVERY_FIELD_CHARS = 2048;
@@ -1840,7 +1887,7 @@ function sliceLineRange(content, startLine, endLine) {
1840
1887
  }
1841
1888
  __name(sliceLineRange, "sliceLineRange");
1842
1889
  var BridgeClient = class {
1843
- constructor(resolveEntry, resolvePendingRestoreEvents, mediator, permissionTimeoutMs, maxPendingPerSession, fileSystem, onModelPromoted, onModePromoted, clientMcpSender, ownsSession = () => true, onTokenUsage, onCreateSubSession, onGenerationEvent, onWorkspaceGenerationEvent, onChannelDelivery, hasSessionSpawnInFlight = () => false, getLiveScreenContextCaptureHandler = () => void 0, getLiveTaskToolRequestHandler = () => void 0, getLiveSpeakToUserHandler = () => void 0, externalToolGuard) {
1890
+ constructor(resolveEntry, resolvePendingRestoreEvents, mediator, permissionTimeoutMs, maxPendingPerSession, fileSystem, onModelPromoted, onModePromoted, clientMcpSender, ownsSession = () => true, onTokenUsage, onCreateSubSession, onGenerationEvent, onWorkspaceGenerationEvent, onChannelDelivery, hasSessionSpawnInFlight = () => false, getLiveScreenContextCaptureHandler = () => void 0, getLiveTaskToolRequestHandler = () => void 0, getLiveSpeakToUserHandler = () => void 0, externalToolGuard, onActiveWork) {
1844
1891
  this.resolveEntry = resolveEntry;
1845
1892
  this.resolvePendingRestoreEvents = resolvePendingRestoreEvents;
1846
1893
  this.mediator = mediator;
@@ -1861,6 +1908,7 @@ var BridgeClient = class {
1861
1908
  this.getLiveTaskToolRequestHandler = getLiveTaskToolRequestHandler;
1862
1909
  this.getLiveSpeakToUserHandler = getLiveSpeakToUserHandler;
1863
1910
  this.externalToolGuard = externalToolGuard;
1911
+ this.onActiveWork = onActiveWork;
1864
1912
  }
1865
1913
  static {
1866
1914
  __name(this, "BridgeClient");
@@ -2581,6 +2629,19 @@ var BridgeClient = class {
2581
2629
  * forward-compat.
2582
2630
  */
2583
2631
  async extNotification(method, params) {
2632
+ if (method === ACTIVE_WORK_NOTIFICATION_METHOD) {
2633
+ const snapshot = parseActiveWorkSnapshot(params);
2634
+ if (snapshot) {
2635
+ this.onActiveWork?.({
2636
+ v: ACTIVE_WORK_HEARTBEAT_VERSION,
2637
+ seq: snapshot.seq,
2638
+ sessions: snapshot.sessions.filter(
2639
+ (session) => this.ownsSession(session.sessionId)
2640
+ )
2641
+ });
2642
+ }
2643
+ return;
2644
+ }
2584
2645
  if (method === "_qwencode/end_turn") {
2585
2646
  const sessionId2 = params["sessionId"];
2586
2647
  const reason = params["reason"];
@@ -6207,6 +6268,149 @@ function createAcpSessionBridge(opts) {
6207
6268
  lastActivityTimestamp = Date.now();
6208
6269
  }
6209
6270
  __name(touchActivity, "touchActivity");
6271
+ function entryHasLocalWork(entry) {
6272
+ return entry.pendingPromptCount > 0 || entry.pendingAgentNotificationCount > 0;
6273
+ }
6274
+ __name(entryHasLocalWork, "entryHasLocalWork");
6275
+ function childHoldsAreFresh(entry, capability) {
6276
+ if (entry.childHoldsAt === null) return false;
6277
+ return Date.now() - entry.childHoldsAt <= capability.intervalMs * ACTIVE_WORK_STALE_INTERVALS;
6278
+ }
6279
+ __name(childHoldsAreFresh, "childHoldsAreFresh");
6280
+ function childReportsHeldWork(entry) {
6281
+ const owner = channelInfoForEntry(entry);
6282
+ if (!owner?.activeWork) return false;
6283
+ if (!childHoldsAreFresh(entry, owner.activeWork)) return false;
6284
+ return entry.childHolds !== null && entry.childHolds.size > 0;
6285
+ }
6286
+ __name(childReportsHeldWork, "childReportsHeldWork");
6287
+ function childWorkIsUnknown(entry) {
6288
+ const owner = channelInfoForEntry(entry);
6289
+ if (!owner?.activeWork) return false;
6290
+ return !childHoldsAreFresh(entry, owner.activeWork);
6291
+ }
6292
+ __name(childWorkIsUnknown, "childWorkIsUnknown");
6293
+ function entryHasActiveWork(entry) {
6294
+ return entryHasLocalWork(entry) || childReportsHeldWork(entry) || childWorkIsUnknown(entry);
6295
+ }
6296
+ __name(entryHasActiveWork, "entryHasActiveWork");
6297
+ function entryIsAutoCloseCandidate(entry) {
6298
+ if (byId.get(entry.sessionId) !== entry) return false;
6299
+ if (isClosingOrAuthorizingClose(entry)) return false;
6300
+ if (entry.events.subscriberCount > 0) return false;
6301
+ if (entryHasLocalWork(entry)) return false;
6302
+ const owner = channelInfoForEntry(entry);
6303
+ if (owner?.pendingRestoreIds.has(entry.sessionId)) return false;
6304
+ return !childReportsHeldWork(entry);
6305
+ }
6306
+ __name(entryIsAutoCloseCandidate, "entryIsAutoCloseCandidate");
6307
+ function isClosingOrAuthorizingClose(entry) {
6308
+ return entry.closing || entry.activeWorkCloseInFlight;
6309
+ }
6310
+ __name(isClosingOrAuthorizingClose, "isClosingOrAuthorizingClose");
6311
+ async function maybeCloseIdleSession(entry, reason) {
6312
+ if (!entryIsAutoCloseCandidate(entry)) return;
6313
+ if (entry.spawnOwnerWantedKill && entry.attachCount === 0) {
6314
+ await bridgeApi.killSession(entry.sessionId).catch(() => {
6315
+ });
6316
+ return;
6317
+ }
6318
+ if (entry.clientIds.size > 0) return;
6319
+ await closeIfChildUnheld(entry, {
6320
+ trigger: reason,
6321
+ closeReason: "last_client_detached"
6322
+ });
6323
+ }
6324
+ __name(maybeCloseIdleSession, "maybeCloseIdleSession");
6325
+ async function closeIfChildUnheld(entry, opts2) {
6326
+ entry.activeWorkCloseInFlight = true;
6327
+ try {
6328
+ if (!await confirmChildUnheld(entry)) return;
6329
+ if (byId.get(entry.sessionId) !== entry) return;
6330
+ await closeSessionImpl(entry.sessionId, void 0, {
6331
+ reason: opts2.closeReason
6332
+ }).catch((err) => {
6333
+ writeStderrLine(
6334
+ `qwen serve: deferred close (${opts2.trigger}) failed for ${JSON.stringify(entry.sessionId)}: ${err instanceof Error ? err.stack ?? err.message : String(err)}`
6335
+ );
6336
+ });
6337
+ } finally {
6338
+ entry.activeWorkCloseInFlight = false;
6339
+ }
6340
+ }
6341
+ __name(closeIfChildUnheld, "closeIfChildUnheld");
6342
+ async function confirmChildUnheld(entry) {
6343
+ const info = channelInfoForEntry(entry);
6344
+ if (!info?.activeWork) return true;
6345
+ if (info.isDying) return false;
6346
+ try {
6347
+ const response = await withTimeout(
6348
+ entry.connection.extMethod(SERVE_CONTROL_EXT_METHODS.sessionClose, {
6349
+ sessionId: entry.sessionId,
6350
+ [ACTIVE_WORK_CLOSE_IF_UNHELD_PARAM]: true
6351
+ }),
6352
+ ACTIVE_WORK_CLOSE_TIMEOUT_MS,
6353
+ SERVE_CONTROL_EXT_METHODS.sessionClose
6354
+ );
6355
+ if (response["closed"] === true) {
6356
+ return true;
6357
+ }
6358
+ const holds = response["holds"];
6359
+ if (Array.isArray(holds)) {
6360
+ const adopted = /* @__PURE__ */ new Map();
6361
+ for (const hold of holds) {
6362
+ if (typeof hold !== "object" || hold === null) continue;
6363
+ const record = hold;
6364
+ const id = record["id"];
6365
+ const category = record["category"];
6366
+ if (typeof id === "string" && typeof category === "string" && ACTIVE_WORK_HOLD_CATEGORIES.includes(
6367
+ category
6368
+ )) {
6369
+ adopted.set(id, category);
6370
+ }
6371
+ }
6372
+ entry.childHolds = adopted;
6373
+ entry.childHoldsAt = Date.now();
6374
+ }
6375
+ return false;
6376
+ } catch (err) {
6377
+ writeStderrLine(
6378
+ `qwen serve: close-if-unheld for session ${JSON.stringify(entry.sessionId)} did not resolve (${err instanceof Error ? err.message : String(err)}); leaving it in place for the next snapshot to settle`
6379
+ );
6380
+ return false;
6381
+ }
6382
+ }
6383
+ __name(confirmChildUnheld, "confirmChildUnheld");
6384
+ function applyActiveWorkSnapshot(info, snapshot) {
6385
+ if (!info.activeWork || info.isDying) return;
6386
+ if (snapshot.seq <= info.activeWork.seq) return;
6387
+ info.activeWork.seq = snapshot.seq;
6388
+ const now = Date.now();
6389
+ const reported = /* @__PURE__ */ new Map();
6390
+ for (const session of snapshot.sessions) {
6391
+ const holds = /* @__PURE__ */ new Map();
6392
+ for (const hold of session.holds) holds.set(hold.id, hold.category);
6393
+ reported.set(session.sessionId, holds);
6394
+ }
6395
+ for (const sessionId of Array.from(info.sessionIds)) {
6396
+ const entry = byId.get(sessionId);
6397
+ if (!entry || entry.channel !== info.channel) continue;
6398
+ const holds = reported.get(sessionId) ?? /* @__PURE__ */ new Map();
6399
+ const previouslyHeld = entry.childHolds ? entry.childHolds.size > 0 : void 0;
6400
+ entry.childHolds = holds;
6401
+ entry.childHoldsAt = now;
6402
+ if (previouslyHeld !== void 0 && previouslyHeld !== holds.size > 0) {
6403
+ touchActivity();
6404
+ }
6405
+ if (holds.size === 0) {
6406
+ void maybeCloseIdleSession(
6407
+ entry,
6408
+ reported.has(sessionId) ? "child_idle" : "child_dropped"
6409
+ );
6410
+ }
6411
+ }
6412
+ }
6413
+ __name(applyActiveWorkSnapshot, "applyActiveWorkSnapshot");
6210
6414
  function settleActivePromptState(entry, promptId) {
6211
6415
  if (entry.activePromptId !== promptId) return;
6212
6416
  delete entry.activePromptId;
@@ -6335,21 +6539,17 @@ function createAcpSessionBridge(opts) {
6335
6539
  if (shuttingDown) return;
6336
6540
  const now = Date.now();
6337
6541
  for (const [id, entry] of byId) {
6338
- if (entry.pendingPromptCount > 0) continue;
6339
- if (entry.events.subscriberCount > 0) continue;
6542
+ if (!entryIsAutoCloseCandidate(entry)) continue;
6340
6543
  const lastActive = entry.sessionLastSeenAt ?? Date.parse(entry.createdAt);
6341
6544
  const idle = now - lastActive;
6342
6545
  if (idle < sessionIdleTimeoutMs) continue;
6343
6546
  writeStderrLine(
6344
6547
  `qwen serve: reaping idle session ${JSON.stringify(id)} (idle for ${Math.round(idle / 1e3)}s, threshold ${Math.round(sessionIdleTimeoutMs / 1e3)}s)`
6345
6548
  );
6346
- void closeSessionImpl(id, void 0, { reason: "idle_timeout" }).catch(
6347
- (err) => {
6348
- writeStderrLine(
6349
- `qwen serve: session reaper failed to close ${JSON.stringify(id)}: ${err instanceof Error ? err.stack ?? err.message : String(err)}`
6350
- );
6351
- }
6352
- );
6549
+ void closeIfChildUnheld(entry, {
6550
+ trigger: "idle_timeout",
6551
+ closeReason: "idle_timeout"
6552
+ });
6353
6553
  }
6354
6554
  }, sessionReapIntervalMs);
6355
6555
  sessionReaper.unref();
@@ -6523,18 +6723,7 @@ function createAcpSessionBridge(opts) {
6523
6723
  entry.attachCount - (released + (attachCountDelta - 1))
6524
6724
  );
6525
6725
  unregisterClient(entry, clientId);
6526
- if (entry.spawnOwnerWantedKill && entry.attachCount === 0 && entry.events.subscriberCount === 0) {
6527
- await bridgeApi.killSession(entry.sessionId).catch(() => {
6528
- });
6529
- } else if (entry.clientIds.size === 0 && entry.events.subscriberCount === 0 && entry.pendingPromptCount === 0) {
6530
- await closeSessionImpl(entry.sessionId, void 0, {
6531
- reason: "last_client_detached"
6532
- }).catch((err) => {
6533
- writeStderrLine(
6534
- `qwen serve: close-on-attach-rollback failed for ${JSON.stringify(entry.sessionId)}: ${err instanceof Error ? err.stack ?? err.message : String(err)}`
6535
- );
6536
- });
6537
- }
6726
+ await maybeCloseIdleSession(entry, "attach_rollback");
6538
6727
  }, "rollbackAttachRegistration");
6539
6728
  const resolveTrustedClientId = /* @__PURE__ */ __name((entry, clientId) => {
6540
6729
  if (clientId === void 0) return void 0;
@@ -6563,6 +6752,7 @@ function createAcpSessionBridge(opts) {
6563
6752
  })
6564
6753
  );
6565
6754
  const sessionIds = /* @__PURE__ */ new Set();
6755
+ const infoRef = {};
6566
6756
  let client;
6567
6757
  let connection;
6568
6758
  try {
@@ -6664,7 +6854,12 @@ function createAcpSessionBridge(opts) {
6664
6854
  () => liveScreenContextCaptureHandler,
6665
6855
  () => liveTaskToolRequestHandler,
6666
6856
  () => liveSpeakToUserHandler,
6667
- opts.externalToolGuard
6857
+ opts.externalToolGuard,
6858
+ (snapshot) => {
6859
+ const currentInfo = infoRef.current;
6860
+ if (!currentInfo) return;
6861
+ applyActiveWorkSnapshot(currentInfo, snapshot);
6862
+ }
6668
6863
  );
6669
6864
  connection = new ClientSideConnection(() => client, channel.stream);
6670
6865
  } catch (error) {
@@ -6702,6 +6897,7 @@ function createAcpSessionBridge(opts) {
6702
6897
  isDying: false,
6703
6898
  handshakeComplete: false
6704
6899
  };
6900
+ infoRef.current = info;
6705
6901
  aliveChannels.add(info);
6706
6902
  if (aliveChannels.size > 2) {
6707
6903
  writeStderrLine(
@@ -6789,6 +6985,10 @@ function createAcpSessionBridge(opts) {
6789
6985
  connection.initialize({
6790
6986
  protocolVersion: PROTOCOL_VERSION,
6791
6987
  _meta: {
6988
+ [ACTIVE_WORK_HEARTBEAT_META_KEY]: {
6989
+ v: ACTIVE_WORK_HEARTBEAT_VERSION,
6990
+ intervalMs: ACTIVE_WORK_HEARTBEAT_INTERVAL_MS
6991
+ },
6792
6992
  [CHANNEL_STARTUP_PROFILE_META_KEY]: {
6793
6993
  v: CHANNEL_STARTUP_PROFILE_VERSION
6794
6994
  },
@@ -6813,6 +7013,19 @@ function createAcpSessionBridge(opts) {
6813
7013
  );
6814
7014
  }
6815
7015
  }
7016
+ const activeWorkCapability = isRecord3(response._meta) ? response._meta[ACTIVE_WORK_HEARTBEAT_META_KEY] : void 0;
7017
+ if (isRecord3(activeWorkCapability) && activeWorkCapability["v"] === ACTIVE_WORK_HEARTBEAT_VERSION) {
7018
+ const advertised = activeWorkCapability["categories"];
7019
+ info.activeWork = {
7020
+ intervalMs: clampActiveWorkIntervalMs(
7021
+ activeWorkCapability["intervalMs"]
7022
+ ),
7023
+ categories: Array.isArray(advertised) ? ACTIVE_WORK_HOLD_CATEGORIES.filter(
7024
+ (category) => advertised.includes(category)
7025
+ ) : [],
7026
+ seq: 0
7027
+ };
7028
+ }
6816
7029
  try {
6817
7030
  const attributes = getChannelStartupProfileAttributes(
6818
7031
  response,
@@ -7697,6 +7910,7 @@ function createAcpSessionBridge(opts) {
7697
7910
  cwdChangeQueue: Promise.resolve(),
7698
7911
  promptQueue: Promise.resolve(),
7699
7912
  pendingPromptCount: 0,
7913
+ pendingAgentNotificationCount: 0,
7700
7914
  pendingPromptList: [],
7701
7915
  midTurnMessageQueue: [],
7702
7916
  modelChangeQueue: Promise.resolve(),
@@ -7711,6 +7925,9 @@ function createAcpSessionBridge(opts) {
7711
7925
  attachRefs: /* @__PURE__ */ new Map(),
7712
7926
  spawnOwnerWantedKill: false,
7713
7927
  promptActive: false,
7928
+ childHolds: null,
7929
+ childHoldsAt: null,
7930
+ activeWorkCloseInFlight: false,
7714
7931
  retryAllowed: false
7715
7932
  };
7716
7933
  ci.sessionIds.add(entry.sessionId);
@@ -8021,7 +8238,7 @@ function createAcpSessionBridge(opts) {
8021
8238
  const hideInheritedHistory = action === "load" && req.hideInheritedHistory === true;
8022
8239
  const existing = byId.get(req.sessionId);
8023
8240
  if (existing) {
8024
- if (existing.closing) {
8241
+ if (isClosingOrAuthorizingClose(existing)) {
8025
8242
  throw new SessionNotFoundError(
8026
8243
  req.sessionId,
8027
8244
  "The session is closing; retry after close completes"
@@ -8029,7 +8246,7 @@ function createAcpSessionBridge(opts) {
8029
8246
  }
8030
8247
  const replayFields = action === "load" && req.historyPageSize !== void 0 ? await refreshedReplayFieldsFor(existing, req.historyPageSize) : replayFieldsFor(existing, action);
8031
8248
  const historyAnchorRecordId = action === "load" ? await resolveHistoryAnchorRecordId(existing, replayFields) : void 0;
8032
- if (byId.get(req.sessionId) !== existing || existing.closing) {
8249
+ if (byId.get(req.sessionId) !== existing || isClosingOrAuthorizingClose(existing)) {
8033
8250
  throw new SessionNotFoundError(req.sessionId);
8034
8251
  }
8035
8252
  existing.attachCount++;
@@ -8216,6 +8433,12 @@ function createAcpSessionBridge(opts) {
8216
8433
  const racedEntry = byId.get(req.sessionId);
8217
8434
  if (racedEntry) {
8218
8435
  restoreEvents.close();
8436
+ if (isClosingOrAuthorizingClose(racedEntry)) {
8437
+ throw new SessionNotFoundError(
8438
+ req.sessionId,
8439
+ "The session is closing; retry after close completes"
8440
+ );
8441
+ }
8219
8442
  racedEntry.attachCount += 1 + coalesceState.count;
8220
8443
  const clientId2 = registerClient(racedEntry, req.clientId);
8221
8444
  recordAttachRef(racedEntry, clientId2);
@@ -8537,6 +8760,44 @@ function createAcpSessionBridge(opts) {
8537
8760
  get activePromptCount() {
8538
8761
  return activePromptCounter;
8539
8762
  },
8763
+ get activeWork() {
8764
+ for (const entry of byId.values()) {
8765
+ if (entryHasActiveWork(entry)) return true;
8766
+ }
8767
+ return false;
8768
+ },
8769
+ /**
8770
+ * Raw coverage counts rather than a pre-collapsed grade.
8771
+ *
8772
+ * The grade has to be computed over the whole daemon, not per runtime and
8773
+ * then combined: a runtime with zero Sessions is vacuously `full`, and
8774
+ * folding that in as evidence made a deployment whose only real Sessions
8775
+ * were unreported aggregate to `partial`. Counts compose; grades do not.
8776
+ */
8777
+ get activeWorkCoverage() {
8778
+ let covered = 0;
8779
+ let onNegotiatedChannel = 0;
8780
+ let total = 0;
8781
+ let oldestCoveredReportAt = null;
8782
+ for (const entry of byId.values()) {
8783
+ total++;
8784
+ const owner = channelInfoForEntry(entry);
8785
+ const capability = owner?.activeWork;
8786
+ if (!capability) continue;
8787
+ onNegotiatedChannel++;
8788
+ if (ACTIVE_WORK_HOLD_CATEGORIES.some(
8789
+ (category) => !capability.categories.includes(category)
8790
+ )) {
8791
+ continue;
8792
+ }
8793
+ if (!childHoldsAreFresh(entry, capability)) continue;
8794
+ covered++;
8795
+ if (entry.childHoldsAt !== null && (oldestCoveredReportAt === null || entry.childHoldsAt < oldestCoveredReportAt)) {
8796
+ oldestCoveredReportAt = entry.childHoldsAt;
8797
+ }
8798
+ }
8799
+ return { total, covered, onNegotiatedChannel, oldestCoveredReportAt };
8800
+ },
8540
8801
  get lastActivityAt() {
8541
8802
  return lastActivityTimestamp;
8542
8803
  },
@@ -8579,7 +8840,7 @@ function createAcpSessionBridge(opts) {
8579
8840
  if (effectiveScope === "single") {
8580
8841
  const existing = defaultEntry;
8581
8842
  if (existing) {
8582
- if (existing.closing) {
8843
+ if (isClosingOrAuthorizingClose(existing)) {
8583
8844
  throw new SessionNotFoundError(
8584
8845
  existing.sessionId,
8585
8846
  "The session is closing; retry after close completes"
@@ -8699,7 +8960,7 @@ function createAcpSessionBridge(opts) {
8699
8960
  const queuedAt = Date.now();
8700
8961
  const entry = byId.get(sessionId);
8701
8962
  if (!entry) return Promise.reject(new SessionNotFoundError(sessionId));
8702
- if (entry.closing) {
8963
+ if (isClosingOrAuthorizingClose(entry)) {
8703
8964
  return Promise.reject(
8704
8965
  new SessionNotFoundError(
8705
8966
  sessionId,
@@ -9076,15 +9337,7 @@ function createAcpSessionBridge(opts) {
9076
9337
  );
9077
9338
  entry.midTurnMessageQueue.length = 0;
9078
9339
  }
9079
- if (entry.clientIds.size === 0 && entry.events.subscriberCount === 0 && entry.pendingPromptCount === 0 && byId.get(sessionId) === entry) {
9080
- void closeSessionImpl(sessionId, void 0, {
9081
- reason: "last_client_detached"
9082
- }).catch((err) => {
9083
- writeStderrLine(
9084
- `qwen serve: deferred close-on-prompt-complete failed for ${JSON.stringify(sessionId)}: ${err instanceof Error ? err.stack ?? err.message : String(err)}`
9085
- );
9086
- });
9087
- }
9340
+ void maybeCloseIdleSession(entry, "prompt_settled");
9088
9341
  }).catch(() => {
9089
9342
  });
9090
9343
  return result;
@@ -10405,18 +10658,27 @@ function createAcpSessionBridge(opts) {
10405
10658
  if (!entry) throw new SessionNotFoundError(sessionId);
10406
10659
  const info = channelInfoForEntry(entry);
10407
10660
  if (!info || info.isDying) throw new SessionNotFoundError(sessionId);
10408
- const response = await Promise.race([
10409
- withTimeout(
10410
- entry.connection.extMethod(
10411
- SERVE_CONTROL_EXT_METHODS.sessionBackgroundNotification,
10412
- { sessionId, ...notification }
10661
+ entry.pendingAgentNotificationCount++;
10662
+ try {
10663
+ const response = await Promise.race([
10664
+ withTimeout(
10665
+ entry.connection.extMethod(
10666
+ SERVE_CONTROL_EXT_METHODS.sessionBackgroundNotification,
10667
+ { sessionId, ...notification }
10668
+ ),
10669
+ initTimeoutMs,
10670
+ SERVE_CONTROL_EXT_METHODS.sessionBackgroundNotification
10413
10671
  ),
10414
- initTimeoutMs,
10415
- SERVE_CONTROL_EXT_METHODS.sessionBackgroundNotification
10416
- ),
10417
- getTransportClosedReject(entry)
10418
- ]);
10419
- return { sessionId, accepted: response["accepted"] === true };
10672
+ getTransportClosedReject(entry)
10673
+ ]);
10674
+ return { sessionId, accepted: response["accepted"] === true };
10675
+ } finally {
10676
+ entry.pendingAgentNotificationCount = Math.max(
10677
+ 0,
10678
+ entry.pendingAgentNotificationCount - 1
10679
+ );
10680
+ void maybeCloseIdleSession(entry, "agent_notification_settled");
10681
+ }
10420
10682
  },
10421
10683
  async generateSessionBtw(sessionId, question, signal, _context) {
10422
10684
  const entry = byId.get(sessionId);
@@ -10657,7 +10919,7 @@ function createAcpSessionBridge(opts) {
10657
10919
  async rewindSession(sessionId, req, context) {
10658
10920
  const entry = byId.get(sessionId);
10659
10921
  if (!entry) throw new SessionNotFoundError(sessionId);
10660
- if (entry.closing) {
10922
+ if (isClosingOrAuthorizingClose(entry)) {
10661
10923
  throw new SessionNotFoundError(sessionId, "The session is closing");
10662
10924
  }
10663
10925
  const info = channelInfoForEntry(entry);
@@ -11147,18 +11409,7 @@ function createAcpSessionBridge(opts) {
11147
11409
  if (entry.attachCount > 0) entry.attachCount--;
11148
11410
  }
11149
11411
  unregisterClient(entry, clientId);
11150
- if (entry.spawnOwnerWantedKill && entry.attachCount === 0 && entry.events.subscriberCount === 0) {
11151
- await this.killSession(sessionId).catch(() => {
11152
- });
11153
- } else if (entry.clientIds.size === 0 && entry.events.subscriberCount === 0 && entry.pendingPromptCount === 0) {
11154
- await closeSessionImpl(sessionId, void 0, {
11155
- reason: "last_client_detached"
11156
- }).catch((err) => {
11157
- writeStderrLine(
11158
- `qwen serve: close-on-last-detach failed for ${JSON.stringify(sessionId)}: ${err instanceof Error ? err.stack ?? err.message : String(err)}`
11159
- );
11160
- });
11161
- }
11412
+ await maybeCloseIdleSession(entry, "last_client_detached");
11162
11413
  },
11163
11414
  killAllSync() {
11164
11415
  shuttingDown = true;
@@ -3,13 +3,13 @@
3
3
  import {
4
4
  resolveModelConfig,
5
5
  resolveProviderProtocol
6
- } from "./chunk-BFSQBXHV.js";
6
+ } from "./chunk-GXSNGY5M.js";
7
7
  import {
8
8
  external_exports
9
9
  } from "./chunk-H6XPXXMH.js";
10
10
  import {
11
11
  stripRuntimeSnapshotPrefix
12
- } from "./chunk-RGTB44BO.js";
12
+ } from "./chunk-VXZ5HAOV.js";
13
13
  import {
14
14
  REASONING_EFFORT_TIERS,
15
15
  normalizeReasoningEffort
@@ -17,7 +17,7 @@ import {
17
17
  import {
18
18
  AuthType,
19
19
  MODEL_GENERATION_CONFIG_FIELDS
20
- } from "./chunk-P7HUJDBZ.js";
20
+ } from "./chunk-M3STHEMM.js";
21
21
  import {
22
22
  init_esbuild_shims
23
23
  } from "./chunk-5O2XNYP6.js";
@@ -2,19 +2,19 @@
2
2
  "use strict";
3
3
  import {
4
4
  t
5
- } from "./chunk-TAOSTUHI.js";
5
+ } from "./chunk-PG62DFWD.js";
6
6
  import {
7
7
  computeThresholds,
8
8
  getCoreSystemPrompt,
9
9
  resolveInteractionMode
10
- } from "./chunk-BFSQBXHV.js";
10
+ } from "./chunk-GXSNGY5M.js";
11
11
  import {
12
12
  buildSkillLlmContent
13
13
  } from "./chunk-K623ENWT.js";
14
14
  import {
15
15
  DiscoveredMCPTool,
16
16
  uiTelemetryService
17
- } from "./chunk-XCG76UE6.js";
17
+ } from "./chunk-3PY4LPJF.js";
18
18
  import {
19
19
  ToolNames
20
20
  } from "./chunk-PYQADEFD.js";
@@ -2,17 +2,17 @@
2
2
  "use strict";
3
3
  import {
4
4
  performStandaloneUpdate
5
- } from "./chunk-RFA6VDCR.js";
5
+ } from "./chunk-ZHA242R4.js";
6
6
  import {
7
7
  updateEventEmitter
8
8
  } from "./chunk-YAF2MQZ6.js";
9
9
  import {
10
10
  t
11
- } from "./chunk-TAOSTUHI.js";
11
+ } from "./chunk-PG62DFWD.js";
12
12
  import {
13
13
  getInstallationInfo,
14
14
  resolveUpdateCommand
15
- } from "./chunk-SDUDZNF4.js";
15
+ } from "./chunk-IUQ52YJK.js";
16
16
  import {
17
17
  createDebugLogger
18
18
  } from "./chunk-OIVKILPI.js";