@qwen-code/qwen-code 0.19.2 → 0.19.3

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 (282) hide show
  1. package/bundled/extension-creator/SKILL.md +357 -0
  2. package/bundled/loop/SKILL.md +12 -7
  3. package/bundled/loop/SKILL.test.ts +32 -0
  4. package/bundled/qc-helper/SKILL.md +14 -14
  5. package/bundled/qc-helper/docs/configuration/auth.md +11 -11
  6. package/bundled/qc-helper/docs/configuration/model-providers.md +13 -13
  7. package/bundled/qc-helper/docs/configuration/settings.md +60 -60
  8. package/bundled/qc-helper/docs/features/commands.md +108 -77
  9. package/bundled/qc-helper/docs/features/memory.md +52 -0
  10. package/bundled/qc-helper/docs/qwen-serve.md +24 -2
  11. package/bundled/qc-helper/docs/support/tos-privacy.md +16 -3
  12. package/chunks/{MaxSizedBox-7RERNLFK.js → MaxSizedBox-QNF3EIGU.js} +29 -30
  13. package/chunks/{StandaloneSessionPicker-S22XBSN6.js → StandaloneSessionPicker-Z52JTYST.js} +42 -40
  14. package/chunks/{acpAgent-4MCETHF2.js → acpAgent-7RZUOWOM.js} +406 -118
  15. package/chunks/{agent-K3ENVYSB.js → agent-4FG7WTHJ.js} +24 -26
  16. package/chunks/{agent-headless-HO3V3A3A.js → agent-headless-RQ5BTX3G.js} +24 -26
  17. package/chunks/{anthropicContentGenerator-E3TQ5XJJ.js → anthropicContentGenerator-PFITVL7Y.js} +31 -13
  18. package/chunks/{artifact-tool-QA4KRO3B.js → artifact-tool-D2X7G3C3.js} +2 -2
  19. package/chunks/{askUserQuestion-HMWXW6VN.js → askUserQuestion-UGETICJQ.js} +2 -2
  20. package/chunks/{bridge-4LV2HBH2.js → bridge-JL2PMCIW.js} +29 -32
  21. package/chunks/{ca-7WC7ELX6.js → ca-IUFWESZL.js} +1 -0
  22. package/chunks/{chunk-3UALQ56H.js → chunk-3227DZO4.js} +1 -1
  23. package/chunks/{chunk-JTYRZODB.js → chunk-3TV3HUWZ.js} +16 -7
  24. package/chunks/{chunk-NYOHZYHM.js → chunk-4LUZAKMK.js} +45 -3
  25. package/chunks/{chunk-EL5IHQON.js → chunk-4QK3O43S.js} +6 -27
  26. package/chunks/chunk-5GOVVXEV.js +73 -0
  27. package/chunks/{chunk-R36VMVEP.js → chunk-6V4NZFUS.js} +5 -5
  28. package/chunks/{chunk-XKBP7M7A.js → chunk-ADCIHOQZ.js} +138 -28
  29. package/chunks/chunk-BC3C4F3Q.js +40 -0
  30. package/chunks/{chunk-CGEGHF2C.js → chunk-BKXBARJZ.js} +1 -1
  31. package/chunks/chunk-BMFMJINR.js +45 -0
  32. package/chunks/chunk-BTLJ2MF5.js +690 -0
  33. package/chunks/{chunk-OIC6S73E.js → chunk-BUUQ5HPX.js} +1 -1
  34. package/chunks/{chunk-2BIF2NVV.js → chunk-BVSVIN45.js} +2 -2
  35. package/chunks/{chunk-JXQ23SNT.js → chunk-BW4KCQFD.js} +54 -2
  36. package/chunks/{chunk-TOEGRAVX.js → chunk-BX5YO7UW.js} +17 -5
  37. package/chunks/{chunk-5RVSM6NW.js → chunk-BXSHL2SF.js} +1 -1
  38. package/chunks/{chunk-UN3C6GOR.js → chunk-CF6BB3LT.js} +0 -107
  39. package/chunks/{chunk-Z7XXFPGP.js → chunk-CKQA6AWF.js} +1 -1
  40. package/chunks/{chunk-I2RFAW6Q.js → chunk-CNLEDYE3.js} +7 -5
  41. package/chunks/{chunk-PRYMDRBV.js → chunk-DDMOU62Q.js} +1 -1
  42. package/chunks/chunk-EDMZZFDU.js +11213 -0
  43. package/chunks/{chunk-IRJWHZWU.js → chunk-EJYJYJZ2.js} +70 -3
  44. package/chunks/{chunk-OQHQHJRK.js → chunk-F3ZYSEY6.js} +151 -4775
  45. package/chunks/chunk-FKAVULLM.js +4909 -0
  46. package/chunks/{chunk-TZM5JIAX.js → chunk-FNJ7BDPH.js} +6 -6
  47. package/chunks/{chunk-EXMX5YHG.js → chunk-FXKVLFFY.js} +1 -1
  48. package/chunks/{chunk-EX4W6ZYG.js → chunk-GGBIN5K7.js} +1 -1
  49. package/chunks/{chunk-BS64PXY3.js → chunk-GT2FGICD.js} +1 -1
  50. package/chunks/{chunk-HG6YKEBI.js → chunk-HPZTOP4I.js} +75 -23
  51. package/chunks/{chunk-OTBK43JR.js → chunk-HYCC3XM3.js} +1 -1
  52. package/chunks/{chunk-3QFE4OTE.js → chunk-HZT4UCFB.js} +4 -4
  53. package/chunks/{chunk-GYZQA2FO.js → chunk-I2LYBGNI.js} +1 -1
  54. package/chunks/{chunk-TMBPDHXD.js → chunk-I4H7PRWQ.js} +1 -1
  55. package/chunks/{chunk-2BAQ3ACS.js → chunk-J33ZR6OJ.js} +404 -4
  56. package/chunks/{chunk-4W4T77MO.js → chunk-J7FA27RO.js} +109 -6
  57. package/chunks/{chunk-S566HKUS.js → chunk-JE5FVRPC.js} +38 -7
  58. package/chunks/{chunk-CGOMICBE.js → chunk-JJXWTVSK.js} +1 -1
  59. package/chunks/{chunk-EEEZIVFJ.js → chunk-JOLIREYR.js} +1 -1
  60. package/chunks/{chunk-DBZUXSSV.js → chunk-JVHEVCAU.js} +5 -5
  61. package/chunks/chunk-K5XU6E4T.js +167 -0
  62. package/chunks/{chunk-EW6C27XX.js → chunk-KMGMKW5Q.js} +1 -1
  63. package/chunks/{chunk-D5E5TMYH.js → chunk-L7OKCI7T.js} +4 -2
  64. package/chunks/{chunk-ZUAXI2OA.js → chunk-M2U5NM24.js} +188 -11366
  65. package/chunks/{chunk-CI5O6SQL.js → chunk-MNF6S5PR.js} +4 -4
  66. package/chunks/{chunk-FPACXT7T.js → chunk-N4EJFBN5.js} +421 -163
  67. package/chunks/chunk-NDOC6M5S.js +481 -0
  68. package/chunks/{chunk-HGNSRCRB.js → chunk-NL4C3H6C.js} +1 -1
  69. package/chunks/{chunk-GZCJS5WH.js → chunk-O2VBQ3Y2.js} +2 -2
  70. package/chunks/{chunk-VQRYPFCV.js → chunk-O75BHFQW.js} +10 -460
  71. package/chunks/{chunk-WGAEWQTF.js → chunk-ODLIHNOY.js} +1 -2
  72. package/chunks/{chunk-J6AW7O5D.js → chunk-PDE7CSDS.js} +2 -2
  73. package/chunks/{chunk-5R4SBCX6.js → chunk-PR32FRT6.js} +3 -3
  74. package/chunks/{chunk-LLFFKXZZ.js → chunk-QE6KJYLT.js} +56 -29
  75. package/chunks/{chunk-3RJ3ZPPR.js → chunk-QI7GOGJR.js} +7 -7
  76. package/chunks/{chunk-XU5P23GN.js → chunk-QLDPRILK.js} +3 -3
  77. package/chunks/{chunk-WA5OJGFL.js → chunk-QNKBEJO2.js} +359 -76
  78. package/chunks/{chunk-UAARVVBI.js → chunk-QWFNTRH4.js} +1 -1
  79. package/chunks/chunk-QYUE6W3T.js +123 -0
  80. package/chunks/{chunk-5JZLXFPD.js → chunk-R5OP2ATH.js} +11 -11
  81. package/chunks/{chunk-BNXANYLH.js → chunk-RD6YJJJ6.js} +81 -1
  82. package/chunks/{chunk-2TJ3YN6Q.js → chunk-RRFZXMYP.js} +380 -400
  83. package/chunks/{chunk-ZN5T4BHI.js → chunk-RYLJU2DY.js} +1 -1
  84. package/chunks/{chunk-ZD3NW5KL.js → chunk-S7AKE7HL.js} +3 -3
  85. package/chunks/{chunk-BG4BIP7F.js → chunk-SBBN4BWR.js} +4 -2
  86. package/chunks/{chunk-T2VDEFUU.js → chunk-SKQZZVAV.js} +2 -2
  87. package/chunks/{chunk-USGMPVOY.js → chunk-SLNKLLEO.js} +14 -9
  88. package/chunks/chunk-SMXULRAN.js +37 -0
  89. package/chunks/{chunk-PF523XJX.js → chunk-SMYQZVZ3.js} +1 -1
  90. package/chunks/{chunk-I5T6PIBQ.js → chunk-STUWFKGD.js} +1001 -887
  91. package/chunks/{chunk-UAARJR2G.js → chunk-T4T2FNV4.js} +2 -2
  92. package/chunks/{chunk-F6XNTYNE.js → chunk-U3KSMM7G.js} +8 -4
  93. package/chunks/chunk-UFLGERMB.js +813 -0
  94. package/chunks/{chunk-BGUDAULQ.js → chunk-UO5GVXQE.js} +5 -5
  95. package/chunks/{chunk-C4K3FEQ2.js → chunk-UX4SGCGN.js} +32 -3
  96. package/chunks/{chunk-RS4HRC75.js → chunk-UYT3MWEB.js} +85 -8
  97. package/chunks/{chunk-VYFMN7C6.js → chunk-VBZ452JT.js} +113 -24
  98. package/chunks/{chunk-KBXLIVWQ.js → chunk-VVLOGDB6.js} +2 -2
  99. package/chunks/{chunk-TXVGVZYR.js → chunk-XJYUPHRC.js} +3 -3
  100. package/chunks/{chunk-2JD55C6G.js → chunk-Y6YMRS3U.js} +2 -2
  101. package/chunks/{chunk-PXFFKNCO.js → chunk-YAINVQ3Q.js} +2961 -1349
  102. package/chunks/{chunk-X6EDWN44.js → chunk-ZP6UKOPB.js} +1 -1
  103. package/chunks/{computer-use-6BBRNT6S.js → computer-use-JGB36FDW.js} +103 -52
  104. package/chunks/{contextCommand-UJAJ6N57.js → contextCommand-WYU6OQ2F.js} +26 -28
  105. package/chunks/{cron-create-4KQE6YLH.js → cron-create-SKEY55RG.js} +4 -4
  106. package/chunks/{cron-delete-THME66UP.js → cron-delete-I3NAT32Z.js} +6 -6
  107. package/chunks/{cron-list-7A54SJ5N.js → cron-list-6XRRL6TH.js} +5 -5
  108. package/chunks/daemon-status-provider-HH2EC5FI.js +65 -0
  109. package/chunks/{de-ACHALDED.js → de-EOW5PVHF.js} +1 -0
  110. package/chunks/{dist-BOOH5JWN.js → dist-663NZ6MI.js} +1 -1
  111. package/chunks/{dist-QHJRBCMP.js → dist-J37VXPLD.js} +46 -5
  112. package/chunks/{dist-OD2FY543.js → dist-LB6OGPVM.js} +1 -1
  113. package/chunks/{dist-BD27IA3L.js → dist-NHEYYB2B.js} +2 -2
  114. package/chunks/{dist-QFFZWACU.js → dist-PQPZ5Q4N.js} +1 -1
  115. package/chunks/{earlyInputCapture-X6KMCSHD.js → earlyInputCapture-44RISVVJ.js} +25 -27
  116. package/chunks/{edit-7J6WXARF.js → edit-NN6GM5DT.js} +68 -30
  117. package/chunks/{en-NCUBOJOY.js → en-HPWEJBTR.js} +8 -0
  118. package/chunks/{enter-worktree-KULCKJPJ.js → enter-worktree-PB3O2C7D.js} +24 -26
  119. package/chunks/{enterPlanMode-H2CIOLMH.js → enterPlanMode-YQFNNSUA.js} +24 -26
  120. package/chunks/{errors-6G2JYR54.js → errors-LS7XU5DZ.js} +26 -28
  121. package/chunks/{exit-worktree-ECBWBVC5.js → exit-worktree-E2FTNSBK.js} +24 -26
  122. package/chunks/{exitPlanMode-DQV56GTW.js → exitPlanMode-GLYK2BUB.js} +24 -26
  123. package/chunks/{fast-path-35JJFS3C.js → fast-path-WQ6M7LI7.js} +4 -4
  124. package/chunks/{fast-path-settings-TSVI53EB.js → fast-path-settings-OAGU3X5H.js} +3 -2
  125. package/chunks/{fr-GVKZ27MF.js → fr-BN5NKSAC.js} +1 -0
  126. package/chunks/{gemini-NDTG7WAX.js → gemini-2YFLVA2M.js} +204 -103
  127. package/chunks/{geminiContentGenerator-XTG6SFLA.js → geminiContentGenerator-XV6SV6CD.js} +4 -4
  128. package/chunks/{glob-SJ2JBZK4.js → glob-2H6CDDMK.js} +24 -26
  129. package/chunks/{grep-BRMWFEWR.js → grep-VXIUXM3C.js} +24 -26
  130. package/chunks/{headlessSafetyWarnings-LJ6FJX77.js → headlessSafetyWarnings-TBE35GJ4.js} +24 -26
  131. package/chunks/initializer-2Y7SLOKV.js +61 -0
  132. package/chunks/{ja-FKZ2WZ4D.js → ja-7DEUB2TS.js} +1 -0
  133. package/chunks/{keychain-token-storage-CSYMNRPP.js → keychain-token-storage-YLMDLKXT.js} +2 -2
  134. package/chunks/list-ZAFHZ7OS.js +65 -0
  135. package/chunks/loadedSettingsAdapter-6KJXD6M3.js +60 -0
  136. package/chunks/{loop-wakeup-33GPXJLA.js → loop-wakeup-CITGGQHA.js} +7 -7
  137. package/chunks/{ls-BYQY7RVV.js → ls-R5WP4BGZ.js} +4 -4
  138. package/chunks/{lsp-X54RO4IV.js → lsp-GSICJMMW.js} +2 -2
  139. package/chunks/{monitor-DH7KFSJV.js → monitor-HKLRS2HQ.js} +24 -26
  140. package/chunks/nonInteractiveCli-5W4GIZQM.js +96 -0
  141. package/chunks/{notebook-edit-D4R4ZLMA.js → notebook-edit-Y6SKSGTT.js} +52 -26
  142. package/chunks/{openaiContentGenerator-F74IPQ6E.js → openaiContentGenerator-J7G2FYJT.js} +13 -14
  143. package/chunks/{pt-SY5NCFGR.js → pt-TNZRNLQB.js} +1 -0
  144. package/chunks/{qwenContentGenerator-ATTK5P4D.js → qwenContentGenerator-5XIEM5GV.js} +26 -28
  145. package/chunks/{qwenOAuth2-K4AASPCV.js → qwenOAuth2-AG3PFFLZ.js} +4 -4
  146. package/chunks/{read-file-767G23OY.js → read-file-J7D552ZJ.js} +9 -10
  147. package/chunks/{read-mcp-resource-I5HCZJ6X.js → read-mcp-resource-DQQW7H7T.js} +2 -2
  148. package/chunks/{ripGrep-4OMMGSWX.js → ripGrep-IEIFIWP4.js} +24 -26
  149. package/chunks/{ru-FWNXJG4F.js → ru-NIAUBKCN.js} +1 -0
  150. package/chunks/{run-qwen-serve-REKSTYRA.js → run-qwen-serve-SGEEVMXD.js} +149 -41
  151. package/chunks/{scheduler-UNTFDQLG.js → scheduler-7CQI3S4Q.js} +24 -26
  152. package/chunks/{send-message-2DAFXEYP.js → send-message-EE4TWKVU.js} +2 -2
  153. package/chunks/{serve-KZ56QB5S.js → serve-V6GVZR6U.js} +31 -31
  154. package/chunks/{server-BV5TZUMU.js → server-4QMUWXPW.js} +6996 -5864
  155. package/chunks/{session-OIBXFSGD.js → session-NRO7UFOY.js} +62 -57
  156. package/chunks/{settings-WJTCBIRA.js → settings-SGWRDQSC.js} +30 -30
  157. package/chunks/{shell-WC52IBHW.js → shell-62ANGIHL.js} +24 -26
  158. package/chunks/{skill-U7F7JR4M.js → skill-VWAQAWW6.js} +39 -13
  159. package/chunks/{spawnChannel-EI2E5BCW.js → spawnChannel-3VHW5EPY.js} +26 -28
  160. package/chunks/{src-4F6FBZFI.js → src-KUV5J5Q2.js} +52 -28
  161. package/chunks/{startInteractiveUI-SFRVB3CE.js → startInteractiveUI-6EYJN3JV.js} +2588 -2371
  162. package/chunks/{syntheticOutput-PPS3HDVA.js → syntheticOutput-T5YHQ6S2.js} +3 -3
  163. package/chunks/{task-create-OUYCA553.js → task-create-BLY7RHXX.js} +6 -6
  164. package/chunks/{task-list-WAX7I2IA.js → task-list-3QUYNVYR.js} +5 -5
  165. package/chunks/{task-stop-CAIL6FNH.js → task-stop-U4RATK2V.js} +2 -2
  166. package/chunks/{task-update-AHEO5OUT.js → task-update-U54O7KJX.js} +6 -6
  167. package/chunks/{team-create-3WC7CIIW.js → team-create-LPOGCPM7.js} +24 -26
  168. package/chunks/{team-delete-HGHFG23B.js → team-delete-LKBYPASD.js} +5 -5
  169. package/chunks/{theme-manager-DICFCT3P.js → theme-manager-LYLGAERF.js} +25 -27
  170. package/chunks/{todoWrite-IFBMN3FH.js → todoWrite-OYXKTVYN.js} +4 -4
  171. package/chunks/{tool-search-L5K7HLER.js → tool-search-YPUFJ3ZQ.js} +102 -18
  172. package/chunks/trustedFolders-5B24TMEA.js +73 -0
  173. package/chunks/types-QX5C3CHJ.js +12 -0
  174. package/chunks/{validateNonInterActiveAuth-GCH4Z6KI.js → validateNonInterActiveAuth-BTDTYOVT.js} +57 -54
  175. package/chunks/{web-fetch-B5IIQ5TT.js → web-fetch-EEB5LZYU.js} +28 -15
  176. package/chunks/{workflow-OB3AND7I.js → workflow-LAWIW5LI.js} +32 -33
  177. package/chunks/workspace-providers-status-PIAFVYHA.js +62 -0
  178. package/chunks/workspace-service-YAIOD4HG.js +71 -0
  179. package/chunks/{write-file-SEXBNDZM.js → write-file-PCV226DJ.js} +63 -30
  180. package/chunks/{zh-RBEGQVQT.js → zh-5EUYXASN.js} +8 -0
  181. package/chunks/{zh-TW-QGAVRXT3.js → zh-TW-TR3XYGE5.js} +8 -0
  182. package/cli-entry.js +20 -9
  183. package/cli.js +6 -6
  184. package/locales/ca.js +2 -0
  185. package/locales/de.js +2 -0
  186. package/locales/en.js +14 -0
  187. package/locales/fr.js +2 -0
  188. package/locales/ja.js +1 -0
  189. package/locales/pt.js +2 -0
  190. package/locales/ru.js +2 -0
  191. package/locales/zh-TW.js +12 -0
  192. package/locales/zh.js +12 -0
  193. package/node_modules/@qwen-code/audio-capture/dist/index.d.ts +35 -0
  194. package/node_modules/@qwen-code/audio-capture/dist/index.js +48 -0
  195. package/node_modules/@qwen-code/audio-capture/dist/index.js.map +1 -0
  196. package/node_modules/@qwen-code/audio-capture/dist/platform.d.ts +7 -0
  197. package/node_modules/@qwen-code/audio-capture/dist/platform.js +18 -0
  198. package/node_modules/@qwen-code/audio-capture/dist/platform.js.map +1 -0
  199. package/node_modules/@qwen-code/audio-capture/node_modules/node-gyp-build/LICENSE +21 -0
  200. package/node_modules/@qwen-code/audio-capture/node_modules/node-gyp-build/README.md +58 -0
  201. package/node_modules/@qwen-code/audio-capture/node_modules/node-gyp-build/SECURITY.md +5 -0
  202. package/node_modules/@qwen-code/audio-capture/node_modules/node-gyp-build/bin.js +84 -0
  203. package/node_modules/@qwen-code/audio-capture/node_modules/node-gyp-build/build-test.js +19 -0
  204. package/node_modules/@qwen-code/audio-capture/node_modules/node-gyp-build/index.js +6 -0
  205. package/node_modules/@qwen-code/audio-capture/node_modules/node-gyp-build/node-gyp-build.js +207 -0
  206. package/node_modules/@qwen-code/audio-capture/node_modules/node-gyp-build/optional.js +7 -0
  207. package/node_modules/@qwen-code/audio-capture/node_modules/node-gyp-build/package.json +43 -0
  208. package/node_modules/@qwen-code/audio-capture/package.json +30 -0
  209. package/node_modules/@qwen-code/audio-capture/prebuilds/darwin-arm64/@qwen-code+audio-capture.node +0 -0
  210. package/node_modules/@qwen-code/audio-capture/prebuilds/darwin-x64/@qwen-code+audio-capture.node +0 -0
  211. package/node_modules/@qwen-code/audio-capture/prebuilds/linux-arm64/@qwen-code+audio-capture.node +0 -0
  212. package/node_modules/@qwen-code/audio-capture/prebuilds/linux-x64/@qwen-code+audio-capture.node +0 -0
  213. package/node_modules/@qwen-code/audio-capture/prebuilds/win32-x64/@qwen-code+audio-capture.node +0 -0
  214. package/package.json +6 -3
  215. package/web-shell/assets/{arc-D_ae_Y9k.js → arc-DA7r8Ueo.js} +1 -1
  216. package/web-shell/assets/{architectureDiagram-3BPJPVTR-BMLRjppa.js → architectureDiagram-3BPJPVTR-ZDUxPtZ2.js} +1 -1
  217. package/web-shell/assets/{blockDiagram-GPEHLZMM-qVDQC8KL.js → blockDiagram-GPEHLZMM-vrtOf1kJ.js} +1 -1
  218. package/web-shell/assets/{c4Diagram-AAUBKEIU-CxWS6MBd.js → c4Diagram-AAUBKEIU-BHFjzIi4.js} +1 -1
  219. package/web-shell/assets/channel-iRo68q4Q.js +1 -0
  220. package/web-shell/assets/{chunk-2J33WTMH-BtNuY5Yp.js → chunk-2J33WTMH-mdeQVz59.js} +1 -1
  221. package/web-shell/assets/{chunk-4BX2VUAB-BU-x368d.js → chunk-4BX2VUAB-BkKMlwBX.js} +1 -1
  222. package/web-shell/assets/{chunk-55IACEB6-DRgTLvBu.js → chunk-55IACEB6-B7bnXNfu.js} +1 -1
  223. package/web-shell/assets/{chunk-727SXJPM-D2aElv7q.js → chunk-727SXJPM-DGz8Mm6i.js} +1 -1
  224. package/web-shell/assets/{chunk-AQP2D5EJ-BwHCMRQ0.js → chunk-AQP2D5EJ-BQAydUNk.js} +1 -1
  225. package/web-shell/assets/{chunk-FMBD7UC4-BMyPH-ku.js → chunk-FMBD7UC4-GHr2LN_p.js} +1 -1
  226. package/web-shell/assets/{chunk-ND2GUHAM-BNKTstUf.js → chunk-ND2GUHAM-7R91lnUx.js} +1 -1
  227. package/web-shell/assets/{chunk-QZHKN3VN-gD3vsFId.js → chunk-QZHKN3VN-aTJD3lSQ.js} +1 -1
  228. package/web-shell/assets/classDiagram-4FO5ZUOK-iHF24a8X.js +1 -0
  229. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-iHF24a8X.js +1 -0
  230. package/web-shell/assets/{cose-bilkent-S5V4N54A-BG9FAsXE.js → cose-bilkent-S5V4N54A-BTf8t1RL.js} +1 -1
  231. package/web-shell/assets/{dagre-BM42HDAG-Cy1sR7om.js → dagre-BM42HDAG-_sgp3WuA.js} +1 -1
  232. package/web-shell/assets/default-aEtf0G7-.svg +1 -0
  233. package/web-shell/assets/{diagram-2AECGRRQ-Bxi1I_Vu.js → diagram-2AECGRRQ-CROtRy1w.js} +1 -1
  234. package/web-shell/assets/{diagram-5GNKFQAL-BGCJjO6y.js → diagram-5GNKFQAL-BqGRzwSc.js} +1 -1
  235. package/web-shell/assets/{diagram-KO2AKTUF-CMTeLXp7.js → diagram-KO2AKTUF-CMrcEtA7.js} +1 -1
  236. package/web-shell/assets/{diagram-LMA3HP47-BN1wyAGh.js → diagram-LMA3HP47-BRydGNW5.js} +1 -1
  237. package/web-shell/assets/{diagram-OG6HWLK6-UYSG_zcp.js → diagram-OG6HWLK6-D0ilgNjV.js} +1 -1
  238. package/web-shell/assets/{erDiagram-TEJ5UH35-DqXL08lw.js → erDiagram-TEJ5UH35-2lnQeJUM.js} +1 -1
  239. package/web-shell/assets/{flowDiagram-I6XJVG4X-BPJ9SFji.js → flowDiagram-I6XJVG4X-C_ZMdQiC.js} +1 -1
  240. package/web-shell/assets/{ganttDiagram-6RSMTGT7-BEd9Pnms.js → ganttDiagram-6RSMTGT7-Dw9V_Ny0.js} +1 -1
  241. package/web-shell/assets/{gitGraphDiagram-PVQCEYII-DrNRH3oi.js → gitGraphDiagram-PVQCEYII-HDXI-F1B.js} +1 -1
  242. package/web-shell/assets/index-CHmzAWys.css +5 -0
  243. package/web-shell/assets/index-w6GTOHh1.js +713 -0
  244. package/web-shell/assets/{infoDiagram-5YYISTIA-CFYBrkVI.js → infoDiagram-5YYISTIA-CuB8Ebua.js} +1 -1
  245. package/web-shell/assets/insert-DmRbh9Rv.svg +1 -0
  246. package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-Dxsddth7.js → ishikawaDiagram-YF4QCWOH-D_tyhVwh.js} +1 -1
  247. package/web-shell/assets/{journeyDiagram-JHISSGLW-DxaDK80t.js → journeyDiagram-JHISSGLW-CgCwJQNU.js} +1 -1
  248. package/web-shell/assets/{kanban-definition-UN3LZRKU-Q0jQCOct.js → kanban-definition-UN3LZRKU-PZUtcbPx.js} +1 -1
  249. package/web-shell/assets/{linear-DGGM2kcP.js → linear-CZqRdJIU.js} +1 -1
  250. package/web-shell/assets/{mermaid.core-ByoxnWut.js → mermaid.core-CPW_4UEF.js} +5 -5
  251. package/web-shell/assets/{mindmap-definition-RKZ34NQL-C0ZseHsi.js → mindmap-definition-RKZ34NQL-D_Y75ID7.js} +1 -1
  252. package/web-shell/assets/{pieDiagram-4H26LBE5-MQXNhl5A.js → pieDiagram-4H26LBE5-Q4dTyLeF.js} +1 -1
  253. package/web-shell/assets/{quadrantDiagram-W4KKPZXB-DIR4ee2A.js → quadrantDiagram-W4KKPZXB-ckw329Ft.js} +1 -1
  254. package/web-shell/assets/queue-DWpnpFgW.svg +1 -0
  255. package/web-shell/assets/{requirementDiagram-4Y6WPE33-BTR0UdYQ.js → requirementDiagram-4Y6WPE33-DbVDm4It.js} +1 -1
  256. package/web-shell/assets/{sankeyDiagram-5OEKKPKP-sfnhMELN.js → sankeyDiagram-5OEKKPKP-CHuZ_ecH.js} +1 -1
  257. package/web-shell/assets/{sequenceDiagram-3UESZ5HK-DXczHOHH.js → sequenceDiagram-3UESZ5HK-DU2YSpq-.js} +1 -1
  258. package/web-shell/assets/{stateDiagram-AJRCARHV-DdE_KQFH.js → stateDiagram-AJRCARHV-CA9PEBUo.js} +1 -1
  259. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-t1LRI0oY.js +1 -0
  260. package/web-shell/assets/{timeline-definition-PNZ67QCA-DIc61uE8.js → timeline-definition-PNZ67QCA-Bhlo4WVc.js} +1 -1
  261. package/web-shell/assets/{vennDiagram-CIIHVFJN-BF7ODmxB.js → vennDiagram-CIIHVFJN-6xtPLsyl.js} +1 -1
  262. package/web-shell/assets/{wardley-L42UT6IY-3pc1MEaw.js → wardley-L42UT6IY-3eozmXPf.js} +1 -1
  263. package/web-shell/assets/{wardleyDiagram-YWT4CUSO-9jnPcZuP.js → wardleyDiagram-YWT4CUSO-BOn6hKss.js} +1 -1
  264. package/web-shell/assets/{xychartDiagram-2RQKCTM6-DcthaZK6.js → xychartDiagram-2RQKCTM6-BsP4-I_y.js} +1 -1
  265. package/web-shell/index.html +2 -2
  266. package/chunks/chunk-5P5XGNYH.js +0 -93
  267. package/chunks/chunk-B6HQGTYR.js +0 -410
  268. package/chunks/chunk-SEZC2725.js +0 -36
  269. package/chunks/chunk-SYCJMSIJ.js +0 -82
  270. package/chunks/daemon-status-provider-CSL3BUOY.js +0 -68
  271. package/chunks/initializer-P5AXF7PV.js +0 -61
  272. package/chunks/list-6COK34BP.js +0 -65
  273. package/chunks/loadedSettingsAdapter-XIUTN245.js +0 -60
  274. package/chunks/nonInteractiveCli-7575LBXP.js +0 -91
  275. package/chunks/workspace-providers-status-ZIR5EPOO.js +0 -62
  276. package/chunks/workspace-service-OM5D4OI2.js +0 -60
  277. package/web-shell/assets/channel-DYPNiTww.js +0 -1
  278. package/web-shell/assets/classDiagram-4FO5ZUOK-p_g25Tni.js +0 -1
  279. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-p_g25Tni.js +0 -1
  280. package/web-shell/assets/index-CpOXWDPh.js +0 -714
  281. package/web-shell/assets/index-oVK7qhre.css +0 -5
  282. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-BHUSEndU.js +0 -1
@@ -1,5 +1,26 @@
1
1
  // Force strict mode and setup for ESM
2
2
  "use strict";
3
+ import {
4
+ buildPermissionSettings
5
+ } from "./chunk-ODLIHNOY.js";
6
+ import {
7
+ resolveVoiceStreamConfig,
8
+ resolveVoiceTranscriptionConfig,
9
+ transcribeVoiceAudio
10
+ } from "./chunk-BTLJ2MF5.js";
11
+ import {
12
+ getVoiceSettingsScope,
13
+ isSelectableVoiceModel,
14
+ isVoiceEnabled,
15
+ readVoiceLanguage,
16
+ readVoiceMode,
17
+ readVoiceModel,
18
+ resolveVoiceTransport
19
+ } from "./chunk-4LUZAKMK.js";
20
+ import {
21
+ WorkspacePermissionRulesSessionRequiredError,
22
+ WorkspaceSettingsPartialPersistError
23
+ } from "./chunk-BMFMJINR.js";
3
24
  import {
4
25
  MCP_RESTART_SERVER_DEADLINE_MS
5
26
  } from "./chunk-P7M4GA57.js";
@@ -11,10 +32,11 @@ import {
11
32
  WorkspaceInitPathEscapeError,
12
33
  WorkspaceInitRaceError,
13
34
  WorkspaceInitSymlinkError
14
- } from "./chunk-S566HKUS.js";
35
+ } from "./chunk-JE5FVRPC.js";
15
36
  import {
16
- writeStderrLine
17
- } from "./chunk-Y6Z2O3WR.js";
37
+ getPersistScopeForModelSelection,
38
+ loadSettings
39
+ } from "./chunk-FKAVULLM.js";
18
40
  import {
19
41
  SERVE_CONTROL_EXT_METHODS,
20
42
  SERVE_STATUS_EXT_METHODS,
@@ -27,7 +49,19 @@ import {
27
49
  createIdleWorkspaceProvidersStatus,
28
50
  createIdleWorkspaceSkillsStatus,
29
51
  mapDomainErrorToErrorKind
30
- } from "./chunk-D5E5TMYH.js";
52
+ } from "./chunk-L7OKCI7T.js";
53
+ import {
54
+ getWorkspaceTrustStatus
55
+ } from "./chunk-F3ZYSEY6.js";
56
+ import {
57
+ writeStderrLine
58
+ } from "./chunk-Y6Z2O3WR.js";
59
+ import {
60
+ ModelsConfig
61
+ } from "./chunk-YAINVQ3Q.js";
62
+ import {
63
+ createDebugLogger
64
+ } from "./chunk-UX4SGCGN.js";
31
65
  import {
32
66
  init_esbuild_shims
33
67
  } from "./chunk-A4BMJM77.js";
@@ -39,6 +73,231 @@ import {
39
73
  init_esbuild_shims();
40
74
  import { promises as fs, constants as fsConstants } from "node:fs";
41
75
  import * as path from "node:path";
76
+
77
+ // packages/cli/src/services/voice-service.ts
78
+ init_esbuild_shims();
79
+ var debugLogger = createDebugLogger("VOICE_SERVICE");
80
+ var EMPTY_WORKSPACE_VOICE_UPDATE_ERROR = "At least one of `enabled`, `mode`, `language`, or `voiceModel` must be provided";
81
+ var WorkspaceVoiceError = class extends Error {
82
+ static {
83
+ __name(this, "WorkspaceVoiceError");
84
+ }
85
+ status;
86
+ code;
87
+ constructor(status, code, message) {
88
+ super(message);
89
+ this.name = "WorkspaceVoiceError";
90
+ this.status = status;
91
+ this.code = code;
92
+ }
93
+ };
94
+ function voiceSettingsScopeToWire(scope) {
95
+ return scope === "Workspace" /* Workspace */ ? "workspace" : "user";
96
+ }
97
+ __name(voiceSettingsScopeToWire, "voiceSettingsScopeToWire");
98
+ function buildWorkspaceVoiceSettingsWrites(settings, update, opts = {}) {
99
+ const voiceSettingsScope = getVoiceSettingsScope(
100
+ settings,
101
+ opts.workspaceTrusted
102
+ );
103
+ const writes = [];
104
+ if (update.voiceModel !== void 0) {
105
+ writes.push({
106
+ scope: getPersistScopeForModelSelection(settings),
107
+ key: "voiceModel",
108
+ value: update.voiceModel
109
+ });
110
+ }
111
+ if (update.mode !== void 0) {
112
+ writes.push({
113
+ scope: voiceSettingsScope,
114
+ key: "general.voice.mode",
115
+ value: update.mode
116
+ });
117
+ }
118
+ if (update.language !== void 0) {
119
+ writes.push({
120
+ scope: voiceSettingsScope,
121
+ key: "general.voice.language",
122
+ value: update.language
123
+ });
124
+ }
125
+ if (update.enabled !== void 0) {
126
+ writes.push({
127
+ scope: voiceSettingsScope,
128
+ key: "general.voice.enabled",
129
+ value: update.enabled
130
+ });
131
+ }
132
+ return writes;
133
+ }
134
+ __name(buildWorkspaceVoiceSettingsWrites, "buildWorkspaceVoiceSettingsWrites");
135
+ function createVoiceModelSource(settings) {
136
+ return new ModelsConfig({
137
+ modelProvidersConfig: settings.merged.modelProviders
138
+ });
139
+ }
140
+ __name(createVoiceModelSource, "createVoiceModelSource");
141
+ function listAvailableVoiceModels(settings) {
142
+ const models = createVoiceModelSource(settings).getAllConfiguredModels();
143
+ const idCounts = /* @__PURE__ */ new Map();
144
+ for (const model of models) {
145
+ idCounts.set(model.id, (idCounts.get(model.id) ?? 0) + 1);
146
+ }
147
+ const duplicateIds = [...idCounts.entries()].filter(([, count]) => count > 1).map(([id]) => id);
148
+ if (duplicateIds.length > 0) {
149
+ debugLogger.debug(
150
+ `Skipping duplicate voice model ids: ${duplicateIds.join(", ")}`
151
+ );
152
+ }
153
+ return models.filter((model) => (idCounts.get(model.id) ?? 0) === 1).filter(isSelectableVoiceModel).map((model) => ({
154
+ id: model.id,
155
+ transport: resolveVoiceTransport(model.id)
156
+ })).filter(
157
+ (model) => model.transport !== "unsupported"
158
+ );
159
+ }
160
+ __name(listAvailableVoiceModels, "listAvailableVoiceModels");
161
+ function hasConfiguredBatchVoiceTranscriptionModel(settings) {
162
+ for (const model of listAvailableVoiceModels(settings)) {
163
+ if (model.transport !== "qwen-asr-chat") {
164
+ continue;
165
+ }
166
+ try {
167
+ validateWorkspaceVoiceConfig(settings, model.id);
168
+ return true;
169
+ } catch (err) {
170
+ debugLogger.debug(
171
+ `Skipping unavailable batch voice model '${model.id}': ${err instanceof Error ? err.message : String(err)}`
172
+ );
173
+ }
174
+ }
175
+ return false;
176
+ }
177
+ __name(hasConfiguredBatchVoiceTranscriptionModel, "hasConfiguredBatchVoiceTranscriptionModel");
178
+ function buildWorkspaceVoiceStatus(workspaceCwd, settings) {
179
+ return {
180
+ v: 1,
181
+ workspaceCwd,
182
+ enabled: isVoiceEnabled(settings),
183
+ mode: readVoiceMode(settings),
184
+ language: readVoiceLanguage(settings),
185
+ voiceModel: readVoiceModel(settings) ?? null,
186
+ availableVoiceModels: listAvailableVoiceModels(settings)
187
+ };
188
+ }
189
+ __name(buildWorkspaceVoiceStatus, "buildWorkspaceVoiceStatus");
190
+ function validateWorkspaceVoiceModel(settings, voiceModel) {
191
+ const models = createVoiceModelSource(settings).getAllConfiguredModels();
192
+ const matches = models.filter((model2) => model2.id === voiceModel);
193
+ if (matches.length === 0) {
194
+ throw new WorkspaceVoiceError(
195
+ 400,
196
+ "unknown_voice_model",
197
+ `Voice model '${voiceModel}' is not configured.`
198
+ );
199
+ }
200
+ if (matches.length > 1) {
201
+ throw new WorkspaceVoiceError(
202
+ 400,
203
+ "ambiguous_voice_model",
204
+ `Voice model '${voiceModel}' is ambiguous.`
205
+ );
206
+ }
207
+ const [model] = matches;
208
+ if (!model || !isSelectableVoiceModel(model)) {
209
+ throw new WorkspaceVoiceError(
210
+ 400,
211
+ "unsupported_voice_model",
212
+ `Voice model '${voiceModel}' cannot be used for transcription.`
213
+ );
214
+ }
215
+ const transport = resolveVoiceTransport(model.id);
216
+ if (transport === "unsupported") {
217
+ throw new WorkspaceVoiceError(
218
+ 400,
219
+ "unsupported_voice_model",
220
+ `Voice model '${voiceModel}' cannot be used for transcription.`
221
+ );
222
+ }
223
+ return { id: model.id, transport };
224
+ }
225
+ __name(validateWorkspaceVoiceModel, "validateWorkspaceVoiceModel");
226
+ function validateWorkspaceVoiceConfig(settings, voiceModel) {
227
+ const descriptor = validateWorkspaceVoiceModel(settings, voiceModel);
228
+ try {
229
+ const config = createVoiceModelSource(settings);
230
+ if (descriptor.transport === "qwen-asr-chat") {
231
+ resolveVoiceTranscriptionConfig({ config, settings, voiceModel });
232
+ } else {
233
+ resolveVoiceStreamConfig({ config, settings, voiceModel });
234
+ }
235
+ } catch (err) {
236
+ throw new WorkspaceVoiceError(
237
+ 400,
238
+ "invalid_voice_model",
239
+ err instanceof Error ? err.message : `Voice model '${voiceModel}' is not configured for transcription.`
240
+ );
241
+ }
242
+ return descriptor;
243
+ }
244
+ __name(validateWorkspaceVoiceConfig, "validateWorkspaceVoiceConfig");
245
+ function validateWorkspaceVoiceState(settings, update) {
246
+ if (update.enabled === void 0 && update.mode === void 0 && update.language === void 0 && update.voiceModel === void 0) {
247
+ throw new WorkspaceVoiceError(
248
+ 400,
249
+ "invalid_voice_update",
250
+ EMPTY_WORKSPACE_VOICE_UPDATE_ERROR
251
+ );
252
+ }
253
+ const nextEnabled = update.enabled ?? isVoiceEnabled(settings);
254
+ const nextVoiceModel = update.voiceModel ?? readVoiceModel(settings);
255
+ if (update.voiceModel) {
256
+ validateWorkspaceVoiceModel(settings, update.voiceModel);
257
+ }
258
+ if (!nextEnabled) {
259
+ return;
260
+ }
261
+ if (!nextVoiceModel) {
262
+ throw new WorkspaceVoiceError(
263
+ 400,
264
+ "voice_model_required",
265
+ "A valid voiceModel is required before enabling voice."
266
+ );
267
+ }
268
+ validateWorkspaceVoiceConfig(settings, nextVoiceModel);
269
+ }
270
+ __name(validateWorkspaceVoiceState, "validateWorkspaceVoiceState");
271
+ async function transcribeWorkspaceVoiceAudio(input) {
272
+ const descriptor = validateWorkspaceVoiceModel(
273
+ input.settings,
274
+ input.voiceModel
275
+ );
276
+ if (descriptor.transport !== "qwen-asr-chat") {
277
+ throw new WorkspaceVoiceError(
278
+ 400,
279
+ "unsupported_voice_model",
280
+ `Voice model '${input.voiceModel}' requires realtime transcription, which is not supported by this daemon endpoint.`
281
+ );
282
+ }
283
+ const text = await transcribeVoiceAudio(
284
+ { data: input.data, mimeType: input.mimeType },
285
+ {
286
+ config: createVoiceModelSource(input.settings),
287
+ settings: input.settings,
288
+ voiceModel: input.voiceModel,
289
+ abortSignal: input.abortSignal
290
+ }
291
+ );
292
+ return {
293
+ text,
294
+ model: input.voiceModel,
295
+ transport: descriptor.transport
296
+ };
297
+ }
298
+ __name(transcribeWorkspaceVoiceAudio, "transcribeWorkspaceVoiceAudio");
299
+
300
+ // packages/cli/src/serve/workspace-service/index.ts
42
301
  async function canonicalizeExistingAncestor(inputPath) {
43
302
  let current = inputPath;
44
303
  while (true) {
@@ -77,6 +336,8 @@ function createDaemonWorkspaceService(deps) {
77
336
  workspaceProvidersStatusProvider,
78
337
  isChannelLive,
79
338
  persistDisabledTools,
339
+ persistSetting,
340
+ persistSettings,
80
341
  queryWorkspaceStatus,
81
342
  invokeWorkspaceCommand,
82
343
  refreshExtensionsForAllSessions: refreshExtensionsForAllSessionsOnBridge,
@@ -185,7 +446,133 @@ function createDaemonWorkspaceService(deps) {
185
446
  () => createIdleWorkspaceExtensionsStatus(boundWorkspace)
186
447
  );
187
448
  },
449
+ async getWorkspaceTrustStatus(_ctx) {
450
+ return getWorkspaceTrustStatus(
451
+ loadSettings(boundWorkspace).merged,
452
+ boundWorkspace
453
+ );
454
+ },
455
+ async getWorkspacePermissionsStatus(_ctx) {
456
+ return buildPermissionSettings(loadSettings(boundWorkspace));
457
+ },
458
+ async getWorkspaceVoiceStatus(_ctx) {
459
+ return buildWorkspaceVoiceStatus(
460
+ boundWorkspace,
461
+ loadSettings(boundWorkspace)
462
+ );
463
+ },
188
464
  // -- Mutations --
465
+ async requestWorkspaceTrustChange(ctx, request) {
466
+ publishWorkspaceEvent({
467
+ type: "trust_change_requested",
468
+ data: {
469
+ workspaceCwd: boundWorkspace,
470
+ desiredState: request.desiredState,
471
+ ...request.reason !== void 0 ? { reason: request.reason } : {}
472
+ },
473
+ originatorClientId: ctx.originatorClientId
474
+ });
475
+ return {
476
+ accepted: false,
477
+ desiredState: request.desiredState,
478
+ requiresOperatorAction: true
479
+ };
480
+ },
481
+ async setWorkspacePermissionRules(ctx, request) {
482
+ const key = `permissions.${request.ruleType}`;
483
+ try {
484
+ const result = await invokeWorkspaceCommand(
485
+ "qwen/permissions/setRules",
486
+ {
487
+ cwd: boundWorkspace,
488
+ scope: request.scope,
489
+ ruleType: request.ruleType,
490
+ rules: request.rules
491
+ }
492
+ );
493
+ publishWorkspaceEvent({
494
+ type: "settings_changed",
495
+ data: { key, value: request.rules, scope: request.scope },
496
+ originatorClientId: ctx.originatorClientId
497
+ });
498
+ return result;
499
+ } catch (err) {
500
+ if (!(err instanceof SessionNotFoundError)) {
501
+ throw err;
502
+ }
503
+ throw new WorkspacePermissionRulesSessionRequiredError();
504
+ }
505
+ },
506
+ async setWorkspaceVoiceSettings(ctx, request) {
507
+ if (!persistSettings && !persistSetting) {
508
+ throw new WorkspaceVoiceError(
509
+ 501,
510
+ "not_implemented",
511
+ "Workspace voice settings persistence is not available"
512
+ );
513
+ }
514
+ const settings = loadSettings(boundWorkspace);
515
+ validateWorkspaceVoiceState(settings, request);
516
+ const workspaceTrusted = getWorkspaceTrustStatus(settings.merged, boundWorkspace).effective.state === "trusted";
517
+ const writes = buildWorkspaceVoiceSettingsWrites(settings, request, {
518
+ workspaceTrusted
519
+ });
520
+ const publishWrite = /* @__PURE__ */ __name((write) => {
521
+ publishWorkspaceEvent({
522
+ type: "settings_changed",
523
+ data: {
524
+ key: write.key,
525
+ value: write.value,
526
+ scope: voiceSettingsScopeToWire(write.scope)
527
+ },
528
+ originatorClientId: ctx.originatorClientId
529
+ });
530
+ }, "publishWrite");
531
+ if (persistSettings) {
532
+ try {
533
+ await persistSettings(boundWorkspace, writes);
534
+ } catch (err) {
535
+ if (err instanceof WorkspaceSettingsPartialPersistError) {
536
+ for (const write of err.committedWrites) {
537
+ publishWrite(write);
538
+ }
539
+ }
540
+ throw err;
541
+ }
542
+ for (const write of writes) {
543
+ publishWrite(write);
544
+ }
545
+ } else {
546
+ const committed = [];
547
+ for (const write of writes) {
548
+ try {
549
+ await persistSetting(
550
+ boundWorkspace,
551
+ write.scope,
552
+ write.key,
553
+ write.value
554
+ );
555
+ } catch (err) {
556
+ writeStderrLine(
557
+ `qwen serve: workspace voice partial persist error (workspace=${boundWorkspace}, committed=${committed.length}/${writes.length}, failedKey=${write.key}, failedScope=${voiceSettingsScopeToWire(write.scope)}): ${err instanceof Error ? err.message : String(err)}`
558
+ );
559
+ throw new WorkspaceSettingsPartialPersistError(
560
+ `Voice settings partial persist failed: committed=${committed.length}/${writes.length}`,
561
+ committed,
562
+ err
563
+ );
564
+ }
565
+ committed.push(write);
566
+ }
567
+ for (const write of committed) {
568
+ publishWrite(write);
569
+ }
570
+ }
571
+ return buildWorkspaceVoiceStatus(
572
+ boundWorkspace,
573
+ loadSettings(boundWorkspace)
574
+ );
575
+ },
189
576
  async setWorkspaceToolEnabled(ctx, toolName, enabled) {
190
577
  await persistDisabledTools(boundWorkspace, toolName, enabled);
191
578
  publishWorkspaceEvent({
@@ -477,8 +864,21 @@ function createDaemonWorkspaceService(deps) {
477
864
  __name(createDaemonWorkspaceService, "createDaemonWorkspaceService");
478
865
 
479
866
  export {
867
+ EMPTY_WORKSPACE_VOICE_UPDATE_ERROR,
868
+ WorkspaceVoiceError,
869
+ voiceSettingsScopeToWire,
870
+ buildWorkspaceVoiceSettingsWrites,
871
+ hasConfiguredBatchVoiceTranscriptionModel,
872
+ buildWorkspaceVoiceStatus,
873
+ validateWorkspaceVoiceState,
874
+ transcribeWorkspaceVoiceAudio,
480
875
  createDaemonWorkspaceService
481
876
  };
877
+ /**
878
+ * @license
879
+ * Copyright 2025 Qwen
880
+ * SPDX-License-Identifier: Apache-2.0
881
+ */
482
882
  /**
483
883
  * @license
484
884
  * Copyright 2025 Qwen Team
@@ -2,16 +2,16 @@
2
2
  "use strict";
3
3
  import {
4
4
  getEffectiveSupportedModes
5
- } from "./chunk-JTYRZODB.js";
5
+ } from "./chunk-3TV3HUWZ.js";
6
6
  import {
7
7
  require_jsx_runtime
8
- } from "./chunk-UAARJR2G.js";
8
+ } from "./chunk-T4T2FNV4.js";
9
9
  import {
10
10
  require_react
11
11
  } from "./chunk-KYMBIKIW.js";
12
12
  import {
13
13
  uiTelemetryService
14
- } from "./chunk-WA5OJGFL.js";
14
+ } from "./chunk-QNKBEJO2.js";
15
15
  import {
16
16
  init_esbuild_shims
17
17
  } from "./chunk-A4BMJM77.js";
@@ -24,6 +24,12 @@ import {
24
24
  init_esbuild_shims();
25
25
  var import_react = __toESM(require_react(), 1);
26
26
  var import_jsx_runtime = __toESM(require_jsx_runtime(), 1);
27
+ var EMPTY_SKILL_METRICS = {
28
+ totalCalls: 0,
29
+ totalSuccess: 0,
30
+ totalFail: 0,
31
+ byName: {}
32
+ };
27
33
  function areModelMetricsCoreEqual(a, b) {
28
34
  if (a.api.totalRequests !== b.api.totalRequests || a.api.totalErrors !== b.api.totalErrors || a.api.totalLatencyMs !== b.api.totalLatencyMs) {
29
35
  return false;
@@ -59,6 +65,27 @@ function areToolCallStatsEqual(a, b) {
59
65
  return true;
60
66
  }
61
67
  __name(areToolCallStatsEqual, "areToolCallStatsEqual");
68
+ function areSkillCallStatsEqual(a, b) {
69
+ return a.count === b.count && a.success === b.success && a.fail === b.fail;
70
+ }
71
+ __name(areSkillCallStatsEqual, "areSkillCallStatsEqual");
72
+ function areSkillMetricsEqual(a, b) {
73
+ if (a.totalCalls !== b.totalCalls || a.totalSuccess !== b.totalSuccess || a.totalFail !== b.totalFail) {
74
+ return false;
75
+ }
76
+ const aKeys = Object.keys(a.byName);
77
+ const bKeys = Object.keys(b.byName);
78
+ if (aKeys.length !== bKeys.length) return false;
79
+ for (const key of aKeys) {
80
+ const skillA = a.byName[key];
81
+ const skillB = b.byName[key];
82
+ if (!skillB || !areSkillCallStatsEqual(skillA, skillB)) {
83
+ return false;
84
+ }
85
+ }
86
+ return true;
87
+ }
88
+ __name(areSkillMetricsEqual, "areSkillMetricsEqual");
62
89
  function areMetricsEqual(a, b) {
63
90
  if (a === b) return true;
64
91
  if (!a || !b) return false;
@@ -83,6 +110,12 @@ function areMetricsEqual(a, b) {
83
110
  return false;
84
111
  }
85
112
  }
113
+ if (!areSkillMetricsEqual(
114
+ a.skills ?? EMPTY_SKILL_METRICS,
115
+ b.skills ?? EMPTY_SKILL_METRICS
116
+ )) {
117
+ return false;
118
+ }
86
119
  const modelsAKeys = Object.keys(a.models);
87
120
  const modelsBKeys = Object.keys(b.models);
88
121
  if (modelsAKeys.length !== modelsBKeys.length) return false;
@@ -94,13 +127,82 @@ function areMetricsEqual(a, b) {
94
127
  return true;
95
128
  }
96
129
  __name(areMetricsEqual, "areMetricsEqual");
130
+ function cloneSessionMetrics(metrics) {
131
+ return {
132
+ models: Object.fromEntries(
133
+ Object.entries(metrics.models).map(([name, model]) => [
134
+ name,
135
+ {
136
+ api: { ...model.api },
137
+ tokens: { ...model.tokens },
138
+ bySource: Object.fromEntries(
139
+ Object.entries(model.bySource).map(([source, sourceMetrics]) => [
140
+ source,
141
+ {
142
+ api: { ...sourceMetrics.api },
143
+ tokens: { ...sourceMetrics.tokens }
144
+ }
145
+ ])
146
+ )
147
+ }
148
+ ])
149
+ ),
150
+ tools: {
151
+ totalCalls: metrics.tools.totalCalls,
152
+ totalSuccess: metrics.tools.totalSuccess,
153
+ totalFail: metrics.tools.totalFail,
154
+ totalDurationMs: metrics.tools.totalDurationMs,
155
+ totalDecisions: { ...metrics.tools.totalDecisions },
156
+ byName: Object.fromEntries(
157
+ Object.entries(metrics.tools.byName).map(([name, stats]) => [
158
+ name,
159
+ {
160
+ count: stats.count,
161
+ success: stats.success,
162
+ fail: stats.fail,
163
+ durationMs: stats.durationMs,
164
+ decisions: { ...stats.decisions }
165
+ }
166
+ ])
167
+ )
168
+ },
169
+ files: {
170
+ totalLinesAdded: metrics.files.totalLinesAdded,
171
+ totalLinesRemoved: metrics.files.totalLinesRemoved
172
+ },
173
+ ...metrics.skills ? {
174
+ skills: {
175
+ totalCalls: metrics.skills.totalCalls,
176
+ totalSuccess: metrics.skills.totalSuccess,
177
+ totalFail: metrics.skills.totalFail,
178
+ byName: Object.fromEntries(
179
+ Object.entries(metrics.skills.byName).map(([name, stats]) => [
180
+ name,
181
+ {
182
+ count: stats.count,
183
+ success: stats.success,
184
+ fail: stats.fail
185
+ }
186
+ ])
187
+ )
188
+ }
189
+ } : {}
190
+ };
191
+ }
192
+ __name(cloneSessionMetrics, "cloneSessionMetrics");
193
+ function getMetricsForDisplay(sessionId) {
194
+ return cloneSessionMetrics(
195
+ sessionId ? uiTelemetryService.getMetricsForSession(sessionId) : uiTelemetryService.getMetrics()
196
+ );
197
+ }
198
+ __name(getMetricsForDisplay, "getMetricsForDisplay");
97
199
  var SessionStatsContext = (0, import_react.createContext)(
98
200
  void 0
99
201
  );
100
202
  var createDefaultStats = /* @__PURE__ */ __name((sessionId = "") => ({
101
203
  sessionId,
102
204
  sessionStartTime: /* @__PURE__ */ new Date(),
103
- metrics: uiTelemetryService.getMetrics(),
205
+ metrics: getMetricsForDisplay(sessionId),
104
206
  lastPromptTokenCount: 0,
105
207
  promptCount: 0
106
208
  }), "createDefaultStats");
@@ -114,12 +216,13 @@ var SessionStatsProvider = /* @__PURE__ */ __name(({ sessionId, children }) => {
114
216
  lastPromptTokenCount
115
217
  }) => {
116
218
  setStats((prevState) => {
117
- if (prevState.lastPromptTokenCount === lastPromptTokenCount && areMetricsEqual(prevState.metrics, metrics)) {
219
+ const nextMetrics = prevState.sessionId ? getMetricsForDisplay(prevState.sessionId) : cloneSessionMetrics(metrics);
220
+ if (prevState.lastPromptTokenCount === lastPromptTokenCount && areMetricsEqual(prevState.metrics, nextMetrics)) {
118
221
  return prevState;
119
222
  }
120
223
  return {
121
224
  ...prevState,
122
- metrics,
225
+ metrics: nextMetrics,
123
226
  lastPromptTokenCount
124
227
  };
125
228
  });
@@ -1,8 +1,5 @@
1
1
  // Force strict mode and setup for ESM
2
2
  "use strict";
3
- import {
4
- MAX_WORKSPACE_PATH_LENGTH
5
- } from "./chunk-SEZC2725.js";
6
3
  import {
7
4
  init_esbuild_shims
8
5
  } from "./chunk-A4BMJM77.js";
@@ -10,6 +7,24 @@ import {
10
7
  __name
11
8
  } from "./chunk-J2S4EL5Y.js";
12
9
 
10
+ // packages/acp-bridge/src/workspacePaths.ts
11
+ init_esbuild_shims();
12
+ import { realpathSync } from "node:fs";
13
+ import * as path from "node:path";
14
+ function canonicalizeWorkspace(p) {
15
+ const resolved = path.resolve(p);
16
+ try {
17
+ return realpathSync.native(resolved);
18
+ } catch (err) {
19
+ if (err && typeof err === "object" && err.code === "ENOENT") {
20
+ return resolved;
21
+ }
22
+ throw err;
23
+ }
24
+ }
25
+ __name(canonicalizeWorkspace, "canonicalizeWorkspace");
26
+ var MAX_WORKSPACE_PATH_LENGTH = 4096;
27
+
13
28
  // packages/acp-bridge/src/bridgeErrors.ts
14
29
  init_esbuild_shims();
15
30
  var NOT_CURRENTLY_GENERATING_CANCEL_MESSAGE = "Not currently generating";
@@ -220,12 +235,12 @@ var WorkspaceInitConflictError = class extends Error {
220
235
  }
221
236
  path;
222
237
  existingSize;
223
- constructor(path, existingSize) {
238
+ constructor(path2, existingSize) {
224
239
  super(
225
- `Workspace file ${path} already exists (${existingSize} bytes); pass {force: true} to overwrite.`
240
+ `Workspace file ${path2} already exists (${existingSize} bytes); pass {force: true} to overwrite.`
226
241
  );
227
242
  this.name = "WorkspaceInitConflictError";
228
- this.path = path;
243
+ this.path = path2;
229
244
  this.existingSize = existingSize;
230
245
  }
231
246
  };
@@ -331,8 +346,23 @@ var BranchWhilePromptActiveError = class extends Error {
331
346
  this.sessionId = sessionId;
332
347
  }
333
348
  };
349
+ var CdWhilePromptActiveError = class extends Error {
350
+ static {
351
+ __name(this, "CdWhilePromptActiveError");
352
+ }
353
+ sessionId;
354
+ constructor(sessionId) {
355
+ super(
356
+ `Cannot change directory for session ${sessionId}: a prompt is currently active`
357
+ );
358
+ this.name = "CdWhilePromptActiveError";
359
+ this.sessionId = sessionId;
360
+ }
361
+ };
334
362
 
335
363
  export {
364
+ canonicalizeWorkspace,
365
+ MAX_WORKSPACE_PATH_LENGTH,
336
366
  NOT_CURRENTLY_GENERATING_CANCEL_MESSAGE,
337
367
  isNotCurrentlyGeneratingCancelError,
338
368
  SessionNotFoundError,
@@ -357,7 +387,8 @@ export {
357
387
  McpServerRestartFailedError,
358
388
  SessionBusyError,
359
389
  InvalidRewindTargetError,
360
- BranchWhilePromptActiveError
390
+ BranchWhilePromptActiveError,
391
+ CdWhilePromptActiveError
361
392
  };
362
393
  /**
363
394
  * @license