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

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 (291) hide show
  1. package/bundled/extension-creator/SKILL.md +357 -0
  2. package/bundled/loop/SKILL.md +34 -10
  3. package/bundled/loop/SKILL.test.ts +52 -0
  4. package/bundled/loop/autonomous-loop.test.ts +59 -0
  5. package/bundled/loop/autonomous-loop.ts +102 -0
  6. package/bundled/loop/loop-task-file.test.ts +1064 -0
  7. package/bundled/loop/loop-task-file.ts +404 -0
  8. package/bundled/loop/loop-tick-resolver.test.ts +864 -0
  9. package/bundled/loop/loop-tick-resolver.ts +416 -0
  10. package/bundled/qc-helper/SKILL.md +26 -19
  11. package/bundled/qc-helper/docs/configuration/auth.md +11 -11
  12. package/bundled/qc-helper/docs/configuration/model-providers.md +13 -13
  13. package/bundled/qc-helper/docs/configuration/settings.md +77 -75
  14. package/bundled/qc-helper/docs/features/channels/plugins.md +1 -1
  15. package/bundled/qc-helper/docs/features/commands.md +108 -77
  16. package/bundled/qc-helper/docs/features/hooks.md +6 -1
  17. package/bundled/qc-helper/docs/features/memory.md +53 -1
  18. package/bundled/qc-helper/docs/features/status-line.md +3 -3
  19. package/bundled/qc-helper/docs/ide-integration/ide-integration.md +4 -4
  20. package/bundled/qc-helper/docs/qwen-serve.md +24 -2
  21. package/bundled/qc-helper/docs/support/tos-privacy.md +16 -3
  22. package/bundled/qc-helper/docs/support/troubleshooting.md +6 -0
  23. package/chunks/{MaxSizedBox-7RERNLFK.js → MaxSizedBox-UZHJ73JB.js} +29 -27
  24. package/chunks/{StandaloneSessionPicker-S22XBSN6.js → StandaloneSessionPicker-GGUIZWCE.js} +42 -37
  25. package/chunks/{acpAgent-4MCETHF2.js → acpAgent-QYZFICEZ.js} +1292 -332
  26. package/chunks/{agent-K3ENVYSB.js → agent-2EN7YNSW.js} +24 -23
  27. package/chunks/{agent-headless-HO3V3A3A.js → agent-headless-SLTEZ5LV.js} +24 -23
  28. package/chunks/{anthropicContentGenerator-E3TQ5XJJ.js → anthropicContentGenerator-CA3JTAMO.js} +33 -12
  29. package/chunks/{artifact-tool-QA4KRO3B.js → artifact-tool-RM7WINJO.js} +3 -3
  30. package/chunks/{askUserQuestion-HMWXW6VN.js → askUserQuestion-J3P6QAJ7.js} +2 -2
  31. package/chunks/{bridge-4LV2HBH2.js → bridge-HZVAUTMX.js} +29 -28
  32. package/chunks/{ca-7WC7ELX6.js → ca-RYOETBUW.js} +10 -9
  33. package/chunks/{chunk-JXQ23SNT.js → chunk-2JKEQWDZ.js} +623 -78
  34. package/chunks/chunk-32MCHZQC.js +73 -0
  35. package/chunks/{chunk-PXFFKNCO.js → chunk-35FH347N.js} +5308 -2500
  36. package/chunks/{chunk-5JZLXFPD.js → chunk-3O2BJMFW.js} +11 -11
  37. package/chunks/{chunk-2JD55C6G.js → chunk-3TK7FSCP.js} +2 -2
  38. package/chunks/{chunk-USGMPVOY.js → chunk-4722VFFU.js} +19 -10
  39. package/chunks/chunk-6FIWYVN4.js +4932 -0
  40. package/chunks/{chunk-I2RFAW6Q.js → chunk-7SP275SH.js} +7 -5
  41. package/chunks/{chunk-5R4SBCX6.js → chunk-AIBPG5MB.js} +3 -3
  42. package/chunks/{chunk-C4K3FEQ2.js → chunk-AVQDCKNF.js} +124 -21
  43. package/chunks/{chunk-OTBK43JR.js → chunk-B236XPGF.js} +1 -1
  44. package/chunks/{chunk-WA5OJGFL.js → chunk-B5MPZI4K.js} +458 -125
  45. package/chunks/{chunk-5DWXLGOM.js → chunk-BJBWRCSK.js} +1 -1
  46. package/chunks/{chunk-4W4T77MO.js → chunk-BLAE2TCO.js} +109 -6
  47. package/chunks/chunk-BMFMJINR.js +45 -0
  48. package/chunks/{chunk-T2VDEFUU.js → chunk-BZHLWC6T.js} +2 -2
  49. package/chunks/{chunk-XU5P23GN.js → chunk-CA4ML3VH.js} +3 -3
  50. package/chunks/{chunk-WGAEWQTF.js → chunk-DBR7PF4B.js} +1 -2
  51. package/chunks/{chunk-S566HKUS.js → chunk-DHXWNSJA.js} +15 -1
  52. package/chunks/{chunk-LLFFKXZZ.js → chunk-DJ25MIU2.js} +167 -43
  53. package/chunks/{chunk-KBXLIVWQ.js → chunk-DX3TKXNT.js} +2 -2
  54. package/chunks/{chunk-OIC6S73E.js → chunk-E5I6YSNO.js} +1 -1
  55. package/chunks/{chunk-TXVGVZYR.js → chunk-ESVSWG6Z.js} +3 -3
  56. package/chunks/{chunk-EX4W6ZYG.js → chunk-EUURTJY7.js} +1 -1
  57. package/chunks/{chunk-QBZ22PQX.js → chunk-EWALXUAD.js} +3 -1
  58. package/chunks/{chunk-F6XNTYNE.js → chunk-FQDMX5IL.js} +30 -307
  59. package/chunks/{chunk-3QFE4OTE.js → chunk-FR3II765.js} +4 -4
  60. package/chunks/{chunk-VYFMN7C6.js → chunk-FV4SQ54H.js} +382 -55
  61. package/chunks/{chunk-ZD3NW5KL.js → chunk-FZY7NH37.js} +63 -9
  62. package/chunks/{chunk-CI5O6SQL.js → chunk-G525INVW.js} +4 -4
  63. package/chunks/{chunk-CGOMICBE.js → chunk-GDIG7TMG.js} +34 -1
  64. package/chunks/{chunk-R2BXK7SX.js → chunk-GHOTR7HL.js} +6 -1
  65. package/chunks/{chunk-TZM5JIAX.js → chunk-GZKQ36JS.js} +10 -7
  66. package/chunks/{chunk-BS64PXY3.js → chunk-HIYUAXBG.js} +1 -1
  67. package/chunks/{chunk-TMBPDHXD.js → chunk-HTWHAN44.js} +1 -1
  68. package/chunks/{chunk-EL5IHQON.js → chunk-HUGAEYZR.js} +6 -27
  69. package/chunks/{chunk-2BIF2NVV.js → chunk-HWG4XLD7.js} +2 -2
  70. package/chunks/{chunk-I5T6PIBQ.js → chunk-I4MXURND.js} +1076 -954
  71. package/chunks/{chunk-JTYRZODB.js → chunk-IBEM64M4.js} +39 -11
  72. package/chunks/{chunk-XKBP7M7A.js → chunk-IKO44NAT.js} +149 -31
  73. package/chunks/{chunk-2BAQ3ACS.js → chunk-JERW36RG.js} +404 -4
  74. package/chunks/{chunk-TOEGRAVX.js → chunk-JV7A66DR.js} +28 -16
  75. package/chunks/{chunk-3RJ3ZPPR.js → chunk-KKQWC6WS.js} +7 -7
  76. package/chunks/{chunk-EXMX5YHG.js → chunk-KXVVXAAC.js} +1 -1
  77. package/chunks/{chunk-Z7XXFPGP.js → chunk-LDWTYE33.js} +1 -1
  78. package/chunks/{chunk-X6EDWN44.js → chunk-LWGLBVWA.js} +1 -1
  79. package/chunks/{chunk-NYOHZYHM.js → chunk-LXEW6BHF.js} +45 -3
  80. package/chunks/{chunk-BGUDAULQ.js → chunk-LXGWLOCM.js} +5 -5
  81. package/chunks/{chunk-ZUAXI2OA.js → chunk-M2U5NM24.js} +188 -11366
  82. package/chunks/{chunk-BNXANYLH.js → chunk-MOUXUCXQ.js} +81 -1
  83. package/chunks/{chunk-FPACXT7T.js → chunk-MTJVHQDP.js} +534 -164
  84. package/chunks/{chunk-UAARJR2G.js → chunk-N4V4VBP6.js} +2 -2
  85. package/chunks/chunk-NIOPRZNN.js +27 -0
  86. package/chunks/{chunk-2TJ3YN6Q.js → chunk-NOYV2NXI.js} +517 -490
  87. package/chunks/{chunk-PRYMDRBV.js → chunk-NPQWQYU6.js} +1 -1
  88. package/chunks/{chunk-J6AW7O5D.js → chunk-NVTRORSK.js} +2 -2
  89. package/chunks/{chunk-PF523XJX.js → chunk-OE5J6UA7.js} +1 -1
  90. package/chunks/{chunk-RS4HRC75.js → chunk-OEY3YAL2.js} +99 -8
  91. package/chunks/{chunk-R36VMVEP.js → chunk-PLQTLKMR.js} +5 -5
  92. package/chunks/{chunk-UN3C6GOR.js → chunk-PPFWEV7G.js} +10 -108
  93. package/chunks/chunk-Q3JOGB4U.js +481 -0
  94. package/chunks/{chunk-HG6YKEBI.js → chunk-Q7TDHJ2G.js} +192 -30
  95. package/chunks/{chunk-EW6C27XX.js → chunk-QHHNFG22.js} +9 -3
  96. package/chunks/chunk-QYUE6W3T.js +123 -0
  97. package/chunks/{chunk-GZCJS5WH.js → chunk-SJBIFVD2.js} +2 -2
  98. package/chunks/{chunk-3UALQ56H.js → chunk-T42ACHFI.js} +1 -1
  99. package/chunks/chunk-T44AF4I6.js +690 -0
  100. package/chunks/{chunk-DBZUXSSV.js → chunk-TMILTLP3.js} +6 -6
  101. package/chunks/{chunk-EEEZIVFJ.js → chunk-TOAUDIS7.js} +1 -1
  102. package/chunks/chunk-UAKXW3DN.js +30 -0
  103. package/chunks/{chunk-VQRYPFCV.js → chunk-V5YJAUHW.js} +10 -460
  104. package/chunks/{chunk-D5E5TMYH.js → chunk-VHRREANT.js} +16 -2
  105. package/chunks/{chunk-5RVSM6NW.js → chunk-VN4CKYUW.js} +1 -1
  106. package/chunks/chunk-VXGPYF7U.js +37 -0
  107. package/chunks/{chunk-UAARVVBI.js → chunk-WGY3GIPP.js} +1 -1
  108. package/chunks/{chunk-GYZQA2FO.js → chunk-WJAY4WXR.js} +1 -1
  109. package/chunks/chunk-XKSCTXPK.js +167 -0
  110. package/chunks/chunk-YCEHOJZJ.js +840 -0
  111. package/chunks/{chunk-BG4BIP7F.js → chunk-YCRTJYSQ.js} +4 -2
  112. package/chunks/{chunk-CGEGHF2C.js → chunk-YPCPZSZB.js} +1 -1
  113. package/chunks/chunk-YTFBURQD.js +313 -0
  114. package/chunks/{chunk-HGNSRCRB.js → chunk-YXK4GPYO.js} +1 -1
  115. package/chunks/{chunk-OQHQHJRK.js → chunk-Z34RYLRO.js} +151 -4775
  116. package/chunks/chunk-ZGSV5ORL.js +11273 -0
  117. package/chunks/{computer-use-6BBRNT6S.js → computer-use-FCNWHVPW.js} +103 -49
  118. package/chunks/{contextCommand-UJAJ6N57.js → contextCommand-FVFMZZEU.js} +26 -25
  119. package/chunks/{cron-create-4KQE6YLH.js → cron-create-IY5NMIHQ.js} +4 -4
  120. package/chunks/{cron-delete-THME66UP.js → cron-delete-OLNEQWKO.js} +6 -6
  121. package/chunks/{cron-list-7A54SJ5N.js → cron-list-YAUAUV24.js} +5 -5
  122. package/chunks/{daemon-status-provider-CSL3BUOY.js → daemon-status-provider-42JEXENZ.js} +32 -32
  123. package/chunks/{de-ACHALDED.js → de-HB5NJXGB.js} +10 -9
  124. package/chunks/{dist-BD27IA3L.js → dist-4FCNM6KJ.js} +2 -2
  125. package/chunks/{dist-OD2FY543.js → dist-K4XZILIO.js} +1 -1
  126. package/chunks/{dist-BOOH5JWN.js → dist-SU6L7ZNJ.js} +114 -9
  127. package/chunks/{dist-QHJRBCMP.js → dist-UKPWQJCL.js} +44 -2
  128. package/chunks/{dist-QFFZWACU.js → dist-VD7HXTML.js} +20 -9
  129. package/chunks/{earlyInputCapture-X6KMCSHD.js → earlyInputCapture-FFFEC6P4.js} +25 -24
  130. package/chunks/{edit-7J6WXARF.js → edit-32ILSGZY.js} +72 -30
  131. package/chunks/{en-NCUBOJOY.js → en-U3LWGSFX.js} +19 -9
  132. package/chunks/{enter-worktree-KULCKJPJ.js → enter-worktree-XWZKIN6A.js} +24 -23
  133. package/chunks/{enterPlanMode-H2CIOLMH.js → enterPlanMode-LPFFY7BJ.js} +24 -23
  134. package/chunks/{errors-6G2JYR54.js → errors-UXBPYPI2.js} +26 -25
  135. package/chunks/{exit-worktree-ECBWBVC5.js → exit-worktree-IBS4UIU7.js} +24 -23
  136. package/chunks/{exitPlanMode-DQV56GTW.js → exitPlanMode-JA72YHII.js} +24 -23
  137. package/chunks/{fast-path-35JJFS3C.js → fast-path-7UU67Y2W.js} +30 -13
  138. package/chunks/{fast-path-settings-TSVI53EB.js → fast-path-settings-UQLRFDQP.js} +3 -2
  139. package/chunks/{fr-GVKZ27MF.js → fr-XY3NQFCM.js} +10 -9
  140. package/chunks/{gemini-NDTG7WAX.js → gemini-GMVKJNMX.js} +211 -105
  141. package/chunks/{geminiContentGenerator-XTG6SFLA.js → geminiContentGenerator-7NIFF2L4.js} +4 -4
  142. package/chunks/{glob-SJ2JBZK4.js → glob-4NJCW5HI.js} +24 -23
  143. package/chunks/{grep-BRMWFEWR.js → grep-PAIMLQEL.js} +24 -23
  144. package/chunks/{initializer-P5AXF7PV.js → initializer-R6KU4VYM.js} +31 -28
  145. package/chunks/{ja-FKZ2WZ4D.js → ja-J7YAG7SA.js} +10 -9
  146. package/chunks/{keychain-token-storage-CSYMNRPP.js → keychain-token-storage-GPAKRDKQ.js} +2 -2
  147. package/chunks/{list-6COK34BP.js → list-H7LXAO64.js} +32 -29
  148. package/chunks/{loadedSettingsAdapter-XIUTN245.js → loadedSettingsAdapter-H27JMTLU.js} +30 -27
  149. package/chunks/{loop-wakeup-33GPXJLA.js → loop-wakeup-Y3OIRQFM.js} +7 -7
  150. package/chunks/{ls-BYQY7RVV.js → ls-TVJEYS7O.js} +4 -4
  151. package/chunks/{lsp-X54RO4IV.js → lsp-JZSDVR3F.js} +2 -2
  152. package/chunks/{monitor-DH7KFSJV.js → monitor-JSIHDPXP.js} +24 -23
  153. package/chunks/nonInteractiveCli-Y4CHOETG.js +100 -0
  154. package/chunks/{notebook-edit-D4R4ZLMA.js → notebook-edit-SHRNL2UM.js} +52 -23
  155. package/chunks/{openaiContentGenerator-F74IPQ6E.js → openaiContentGenerator-ORZZ7VFO.js} +13 -12
  156. package/chunks/{pt-SY5NCFGR.js → pt-6RTAA6SS.js} +10 -9
  157. package/chunks/{qwenContentGenerator-ATTK5P4D.js → qwenContentGenerator-H643PL2G.js} +26 -25
  158. package/chunks/{qwenOAuth2-K4AASPCV.js → qwenOAuth2-OI2B7PES.js} +5 -4
  159. package/chunks/{read-file-767G23OY.js → read-file-5PRNPTTY.js} +8 -8
  160. package/chunks/{read-mcp-resource-I5HCZJ6X.js → read-mcp-resource-QTXGKTEV.js} +2 -2
  161. package/chunks/{ripGrep-4OMMGSWX.js → ripGrep-JIKZMABJ.js} +24 -23
  162. package/chunks/{ru-FWNXJG4F.js → ru-AUBGJ2C4.js} +10 -9
  163. package/chunks/{run-qwen-serve-REKSTYRA.js → run-qwen-serve-PQV7QOHZ.js} +284 -52
  164. package/chunks/{scheduler-UNTFDQLG.js → scheduler-OS3R5MGU.js} +24 -23
  165. package/chunks/{send-message-2DAFXEYP.js → send-message-DKGHWSTF.js} +2 -2
  166. package/chunks/{serve-KZ56QB5S.js → serve-LVYZDKCZ.js} +31 -29
  167. package/chunks/{server-BV5TZUMU.js → server-P4YIH35I.js} +11458 -8447
  168. package/chunks/{session-OIBXFSGD.js → session-DE4TZBKH.js} +195 -58
  169. package/chunks/{settings-WJTCBIRA.js → settings-DFTYMJYF.js} +30 -27
  170. package/chunks/{shell-WC52IBHW.js → shell-3GNQLNV7.js} +24 -23
  171. package/chunks/{skill-U7F7JR4M.js → skill-NCNG4KKZ.js} +38 -11
  172. package/chunks/{spawnChannel-EI2E5BCW.js → spawnChannel-DHRIMDVL.js} +26 -25
  173. package/chunks/{src-4F6FBZFI.js → src-PNZYGM3R.js} +104 -28
  174. package/chunks/{startInteractiveUI-SFRVB3CE.js → startInteractiveUI-P6GZBFQW.js} +2817 -2500
  175. package/chunks/{syntheticOutput-PPS3HDVA.js → syntheticOutput-X7L5HWLN.js} +3 -3
  176. package/chunks/{task-create-OUYCA553.js → task-create-AWEUI4GI.js} +6 -6
  177. package/chunks/{task-list-WAX7I2IA.js → task-list-KZ3VJLDU.js} +5 -5
  178. package/chunks/{task-stop-CAIL6FNH.js → task-stop-GUNOZKJ5.js} +2 -2
  179. package/chunks/{task-update-AHEO5OUT.js → task-update-Y56GP6DU.js} +6 -6
  180. package/chunks/{team-create-3WC7CIIW.js → team-create-6JMW3KQK.js} +24 -23
  181. package/chunks/{team-delete-HGHFG23B.js → team-delete-6AFRGDJY.js} +5 -5
  182. package/chunks/{theme-manager-DICFCT3P.js → theme-manager-FEHQO22G.js} +25 -24
  183. package/chunks/{todoWrite-IFBMN3FH.js → todoWrite-JRS6NOEU.js} +4 -4
  184. package/chunks/{tool-search-L5K7HLER.js → tool-search-IXAEKS7J.js} +101 -16
  185. package/chunks/trustedFolders-SJRXNHZE.js +76 -0
  186. package/chunks/types-QX5C3CHJ.js +12 -0
  187. package/chunks/{validateNonInterActiveAuth-GCH4Z6KI.js → validateNonInterActiveAuth-HCH7OBDH.js} +56 -51
  188. package/chunks/{web-fetch-B5IIQ5TT.js → web-fetch-RELNL37A.js} +29 -15
  189. package/chunks/{workflow-OB3AND7I.js → workflow-M2COBI7R.js} +38 -32
  190. package/chunks/{workspace-providers-status-ZIR5EPOO.js → workspace-providers-status-GOCWYDMK.js} +32 -29
  191. package/chunks/workspace-service-34C7SUBU.js +75 -0
  192. package/chunks/{write-file-SEXBNDZM.js → write-file-E52WRXZL.js} +67 -31
  193. package/chunks/{zh-RBEGQVQT.js → zh-F5T4WWZO.js} +19 -9
  194. package/chunks/{zh-TW-QGAVRXT3.js → zh-TW-LKLBTZHE.js} +19 -9
  195. package/cli-entry.js +20 -9
  196. package/cli.js +6 -6
  197. package/locales/ca.js +15 -13
  198. package/locales/de.js +15 -13
  199. package/locales/en.js +31 -13
  200. package/locales/fr.js +16 -14
  201. package/locales/ja.js +15 -14
  202. package/locales/pt.js +15 -13
  203. package/locales/ru.js +15 -13
  204. package/locales/zh-TW.js +28 -12
  205. package/locales/zh.js +28 -12
  206. package/node_modules/@qwen-code/audio-capture/dist/index.d.ts +35 -0
  207. package/node_modules/@qwen-code/audio-capture/dist/index.js +48 -0
  208. package/node_modules/@qwen-code/audio-capture/dist/index.js.map +1 -0
  209. package/node_modules/@qwen-code/audio-capture/dist/platform.d.ts +7 -0
  210. package/node_modules/@qwen-code/audio-capture/dist/platform.js +18 -0
  211. package/node_modules/@qwen-code/audio-capture/dist/platform.js.map +1 -0
  212. package/node_modules/@qwen-code/audio-capture/node_modules/node-gyp-build/LICENSE +21 -0
  213. package/node_modules/@qwen-code/audio-capture/node_modules/node-gyp-build/README.md +58 -0
  214. package/node_modules/@qwen-code/audio-capture/node_modules/node-gyp-build/SECURITY.md +5 -0
  215. package/node_modules/@qwen-code/audio-capture/node_modules/node-gyp-build/bin.js +84 -0
  216. package/node_modules/@qwen-code/audio-capture/node_modules/node-gyp-build/build-test.js +19 -0
  217. package/node_modules/@qwen-code/audio-capture/node_modules/node-gyp-build/index.js +6 -0
  218. package/node_modules/@qwen-code/audio-capture/node_modules/node-gyp-build/node-gyp-build.js +207 -0
  219. package/node_modules/@qwen-code/audio-capture/node_modules/node-gyp-build/optional.js +7 -0
  220. package/node_modules/@qwen-code/audio-capture/node_modules/node-gyp-build/package.json +43 -0
  221. package/node_modules/@qwen-code/audio-capture/package.json +30 -0
  222. package/node_modules/@qwen-code/audio-capture/prebuilds/darwin-arm64/@qwen-code+audio-capture.node +0 -0
  223. package/node_modules/@qwen-code/audio-capture/prebuilds/darwin-x64/@qwen-code+audio-capture.node +0 -0
  224. package/node_modules/@qwen-code/audio-capture/prebuilds/linux-arm64/@qwen-code+audio-capture.node +0 -0
  225. package/node_modules/@qwen-code/audio-capture/prebuilds/linux-x64/@qwen-code+audio-capture.node +0 -0
  226. package/node_modules/@qwen-code/audio-capture/prebuilds/win32-x64/@qwen-code+audio-capture.node +0 -0
  227. package/package.json +18 -6
  228. package/patches/chrome-devtools-mcp+1.4.0.patch +31 -0
  229. package/postinstall.js +50 -0
  230. package/web-shell/assets/{arc-D_ae_Y9k.js → arc-C2DILvUl.js} +1 -1
  231. package/web-shell/assets/{architectureDiagram-3BPJPVTR-BMLRjppa.js → architectureDiagram-3BPJPVTR-b8gZ2cNw.js} +1 -1
  232. package/web-shell/assets/{blockDiagram-GPEHLZMM-qVDQC8KL.js → blockDiagram-GPEHLZMM-BuRpghMj.js} +1 -1
  233. package/web-shell/assets/{c4Diagram-AAUBKEIU-CxWS6MBd.js → c4Diagram-AAUBKEIU-2ItdhFmE.js} +1 -1
  234. package/web-shell/assets/channel-eRvn2UA3.js +1 -0
  235. package/web-shell/assets/{chunk-2J33WTMH-BtNuY5Yp.js → chunk-2J33WTMH-B1QXa0q3.js} +1 -1
  236. package/web-shell/assets/{chunk-4BX2VUAB-BU-x368d.js → chunk-4BX2VUAB-DXfhKlNq.js} +1 -1
  237. package/web-shell/assets/{chunk-55IACEB6-DRgTLvBu.js → chunk-55IACEB6-ClSNjxLo.js} +1 -1
  238. package/web-shell/assets/{chunk-727SXJPM-D2aElv7q.js → chunk-727SXJPM-Dsh2wisB.js} +1 -1
  239. package/web-shell/assets/{chunk-AQP2D5EJ-BwHCMRQ0.js → chunk-AQP2D5EJ-C1TkY5AR.js} +1 -1
  240. package/web-shell/assets/{chunk-FMBD7UC4-BMyPH-ku.js → chunk-FMBD7UC4-CGtN9XR6.js} +1 -1
  241. package/web-shell/assets/{chunk-ND2GUHAM-BNKTstUf.js → chunk-ND2GUHAM-BHiPi1SS.js} +1 -1
  242. package/web-shell/assets/{chunk-QZHKN3VN-gD3vsFId.js → chunk-QZHKN3VN-CzG3I5o1.js} +1 -1
  243. package/web-shell/assets/classDiagram-4FO5ZUOK-YZNwy1rx.js +1 -0
  244. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-YZNwy1rx.js +1 -0
  245. package/web-shell/assets/{cose-bilkent-S5V4N54A-BG9FAsXE.js → cose-bilkent-S5V4N54A-EgrIoH_K.js} +1 -1
  246. package/web-shell/assets/{dagre-BM42HDAG-Cy1sR7om.js → dagre-BM42HDAG-BUnpdX8S.js} +1 -1
  247. package/web-shell/assets/default-aEtf0G7-.svg +1 -0
  248. package/web-shell/assets/{diagram-2AECGRRQ-Bxi1I_Vu.js → diagram-2AECGRRQ-BlLUCVYu.js} +1 -1
  249. package/web-shell/assets/{diagram-5GNKFQAL-BGCJjO6y.js → diagram-5GNKFQAL-FG-enmjQ.js} +1 -1
  250. package/web-shell/assets/{diagram-KO2AKTUF-CMTeLXp7.js → diagram-KO2AKTUF-BlzmTONk.js} +1 -1
  251. package/web-shell/assets/{diagram-LMA3HP47-BN1wyAGh.js → diagram-LMA3HP47-CoBQ8mIx.js} +1 -1
  252. package/web-shell/assets/{diagram-OG6HWLK6-UYSG_zcp.js → diagram-OG6HWLK6-DvxV6sX8.js} +1 -1
  253. package/web-shell/assets/{erDiagram-TEJ5UH35-DqXL08lw.js → erDiagram-TEJ5UH35-Jq1tpAoj.js} +1 -1
  254. package/web-shell/assets/{flowDiagram-I6XJVG4X-BPJ9SFji.js → flowDiagram-I6XJVG4X-CbtYOry5.js} +1 -1
  255. package/web-shell/assets/{ganttDiagram-6RSMTGT7-BEd9Pnms.js → ganttDiagram-6RSMTGT7-ZEn2VEKR.js} +1 -1
  256. package/web-shell/assets/{gitGraphDiagram-PVQCEYII-DrNRH3oi.js → gitGraphDiagram-PVQCEYII-BZh-LkhJ.js} +1 -1
  257. package/web-shell/assets/index-5FhE0ORO.css +5 -0
  258. package/web-shell/assets/index-CDTGmqVm.js +720 -0
  259. package/web-shell/assets/{infoDiagram-5YYISTIA-CFYBrkVI.js → infoDiagram-5YYISTIA-B9HuZygK.js} +1 -1
  260. package/web-shell/assets/insert-DmRbh9Rv.svg +1 -0
  261. package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-Dxsddth7.js → ishikawaDiagram-YF4QCWOH-D76cNpYG.js} +1 -1
  262. package/web-shell/assets/{journeyDiagram-JHISSGLW-DxaDK80t.js → journeyDiagram-JHISSGLW-6bGo7P1t.js} +1 -1
  263. package/web-shell/assets/{kanban-definition-UN3LZRKU-Q0jQCOct.js → kanban-definition-UN3LZRKU-DuYyRBvB.js} +1 -1
  264. package/web-shell/assets/{linear-DGGM2kcP.js → linear-CpdSW1BC.js} +1 -1
  265. package/web-shell/assets/{mermaid.core-ByoxnWut.js → mermaid.core-s5xbZMMj.js} +5 -5
  266. package/web-shell/assets/{mindmap-definition-RKZ34NQL-C0ZseHsi.js → mindmap-definition-RKZ34NQL-go01fZ2y.js} +1 -1
  267. package/web-shell/assets/{pieDiagram-4H26LBE5-MQXNhl5A.js → pieDiagram-4H26LBE5-BfuZiEHO.js} +1 -1
  268. package/web-shell/assets/{quadrantDiagram-W4KKPZXB-DIR4ee2A.js → quadrantDiagram-W4KKPZXB-DsoINqV6.js} +1 -1
  269. package/web-shell/assets/queue-DWpnpFgW.svg +1 -0
  270. package/web-shell/assets/{requirementDiagram-4Y6WPE33-BTR0UdYQ.js → requirementDiagram-4Y6WPE33-B7FU4LiU.js} +1 -1
  271. package/web-shell/assets/{sankeyDiagram-5OEKKPKP-sfnhMELN.js → sankeyDiagram-5OEKKPKP-BEDjFnGB.js} +1 -1
  272. package/web-shell/assets/{sequenceDiagram-3UESZ5HK-DXczHOHH.js → sequenceDiagram-3UESZ5HK-gzmmL5tK.js} +1 -1
  273. package/web-shell/assets/{stateDiagram-AJRCARHV-DdE_KQFH.js → stateDiagram-AJRCARHV-BtHD4IN_.js} +1 -1
  274. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-DFy6gLDd.js +1 -0
  275. package/web-shell/assets/{timeline-definition-PNZ67QCA-DIc61uE8.js → timeline-definition-PNZ67QCA-T_8gmMCf.js} +1 -1
  276. package/web-shell/assets/{vennDiagram-CIIHVFJN-BF7ODmxB.js → vennDiagram-CIIHVFJN-DdjuqnjO.js} +1 -1
  277. package/web-shell/assets/{wardley-L42UT6IY-3pc1MEaw.js → wardley-L42UT6IY-Cgtrvb37.js} +1 -1
  278. package/web-shell/assets/{wardleyDiagram-YWT4CUSO-9jnPcZuP.js → wardleyDiagram-YWT4CUSO-BW3f3-yW.js} +1 -1
  279. package/web-shell/assets/{xychartDiagram-2RQKCTM6-DcthaZK6.js → xychartDiagram-2RQKCTM6-BUS9IKkc.js} +1 -1
  280. package/web-shell/index.html +2 -2
  281. package/chunks/chunk-B6HQGTYR.js +0 -410
  282. package/chunks/chunk-RKIZXJMB.js +0 -13
  283. package/chunks/headlessSafetyWarnings-LJ6FJX77.js +0 -57
  284. package/chunks/nonInteractiveCli-7575LBXP.js +0 -91
  285. package/chunks/workspace-service-OM5D4OI2.js +0 -60
  286. package/web-shell/assets/channel-DYPNiTww.js +0 -1
  287. package/web-shell/assets/classDiagram-4FO5ZUOK-p_g25Tni.js +0 -1
  288. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-p_g25Tni.js +0 -1
  289. package/web-shell/assets/index-CpOXWDPh.js +0 -714
  290. package/web-shell/assets/index-oVK7qhre.css +0 -5
  291. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-BHUSEndU.js +0 -1
@@ -1,5 +1,22 @@
1
1
  // Force strict mode and setup for ESM
2
2
  "use strict";
3
+ import {
4
+ buildPermissionSettings
5
+ } from "./chunk-DBR7PF4B.js";
6
+ import {
7
+ resolveVoiceStreamConfig,
8
+ resolveVoiceTranscriptionConfig,
9
+ transcribeVoiceAudio
10
+ } from "./chunk-T44AF4I6.js";
11
+ import {
12
+ getVoiceSettingsScope,
13
+ isSelectableVoiceModel,
14
+ isVoiceEnabled,
15
+ readVoiceLanguage,
16
+ readVoiceMode,
17
+ readVoiceModel,
18
+ resolveVoiceTransport
19
+ } from "./chunk-LXEW6BHF.js";
3
20
  import {
4
21
  MCP_RESTART_SERVER_DEADLINE_MS
5
22
  } from "./chunk-P7M4GA57.js";
@@ -11,10 +28,15 @@ import {
11
28
  WorkspaceInitPathEscapeError,
12
29
  WorkspaceInitRaceError,
13
30
  WorkspaceInitSymlinkError
14
- } from "./chunk-S566HKUS.js";
31
+ } from "./chunk-DHXWNSJA.js";
15
32
  import {
16
- writeStderrLine
17
- } from "./chunk-Y6Z2O3WR.js";
33
+ WorkspacePermissionRulesSessionRequiredError,
34
+ WorkspaceSettingsPartialPersistError
35
+ } from "./chunk-BMFMJINR.js";
36
+ import {
37
+ getPersistScopeForModelSelection,
38
+ loadSettings
39
+ } from "./chunk-6FIWYVN4.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-VHRREANT.js";
53
+ import {
54
+ getWorkspaceTrustStatus
55
+ } from "./chunk-Z34RYLRO.js";
56
+ import {
57
+ writeStderrLine
58
+ } from "./chunk-Y6Z2O3WR.js";
59
+ import {
60
+ ModelsConfig
61
+ } from "./chunk-35FH347N.js";
62
+ import {
63
+ createDebugLogger
64
+ } from "./chunk-AVQDCKNF.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,7 +2,7 @@
2
2
  "use strict";
3
3
  import {
4
4
  createDebugLogger
5
- } from "./chunk-C4K3FEQ2.js";
5
+ } from "./chunk-AVQDCKNF.js";
6
6
  import {
7
7
  init_esbuild_shims
8
8
  } from "./chunk-A4BMJM77.js";
@@ -14140,10 +14140,22 @@ var ajvOptions = {
14140
14140
  // strictSchema defaults to true and prevents use of JSON schemas that
14141
14141
  // include unrecognized keywords. The JSON schema spec specifically allows
14142
14142
  // for the use of non-standard keywords and the spec-compliant behavior
14143
- // is to ignore those keywords. Note that setting this to false also
14144
- // allows use of non-standard or custom formats (the unknown format value
14145
- // will be logged but the schema will still be considered valid).
14146
- strictSchema: false
14143
+ // is to ignore those keywords.
14144
+ strictSchema: false,
14145
+ // Ajv still validates known formats, but MCP/OpenAPI schemas often include
14146
+ // annotation-only formats like uint64 that would otherwise spam stderr.
14147
+ logger: {
14148
+ // eslint-disable-next-line no-console
14149
+ log: /* @__PURE__ */ __name((...args) => console.log(...args), "log"),
14150
+ warn: /* @__PURE__ */ __name((...args) => {
14151
+ if (typeof args[0] === "string" && args[0].startsWith("unknown format ")) {
14152
+ return;
14153
+ }
14154
+ console.warn(...args);
14155
+ }, "warn"),
14156
+ // eslint-disable-next-line no-console
14157
+ error: /* @__PURE__ */ __name((...args) => console.error(...args), "error")
14158
+ }
14147
14159
  };
14148
14160
  var ajvDefault = new AjvClass(ajvOptions);
14149
14161
  var ajv2020 = new Ajv2020Class(ajvOptions);
@@ -14999,9 +15011,9 @@ var AgentStatistics = class {
14999
15011
  const stats = this.getSummary(now);
15000
15012
  const sr = stats.totalToolCalls > 0 ? stats.successRate ?? stats.successfulToolCalls / stats.totalToolCalls * 100 : 0;
15001
15013
  const lines = [
15002
- `\u{1F4CB} Task Completed: ${taskDesc}`,
15003
- `\u{1F527} Tool Usage: ${stats.totalToolCalls} calls${stats.totalToolCalls ? `, ${sr.toFixed(1)}% success` : ""}`,
15004
- `\u23F1\uFE0F Duration: ${this.fmtDuration(stats.totalDurationMs)} | \u{1F501} Rounds: ${stats.rounds}`
15014
+ `\u25B8 Task Completed: ${taskDesc}`,
15015
+ `\u25CF Tool Usage: ${stats.totalToolCalls} calls${stats.totalToolCalls ? `, ${sr.toFixed(1)}% success` : ""}`,
15016
+ `\u25CF Duration: ${this.fmtDuration(stats.totalDurationMs)} | \u25CF Rounds: ${stats.rounds}`
15005
15017
  ];
15006
15018
  if (typeof stats.totalTokens === "number") {
15007
15019
  const parts = [
@@ -15009,7 +15021,7 @@ var AgentStatistics = class {
15009
15021
  `out ${stats.outputTokens ?? 0}`
15010
15022
  ];
15011
15023
  lines.push(
15012
- `\u{1F522} Tokens: ${stats.totalTokens.toLocaleString()}${parts.length ? ` (${parts.join(", ")})` : ""}`
15024
+ `\u25CF Tokens: ${stats.totalTokens.toLocaleString()}${parts.length ? ` (${parts.join(", ")})` : ""}`
15013
15025
  );
15014
15026
  }
15015
15027
  return lines.join("\n");
@@ -15018,23 +15030,23 @@ var AgentStatistics = class {
15018
15030
  const stats = this.getSummary(now);
15019
15031
  const sr = stats.totalToolCalls > 0 ? stats.successRate ?? stats.successfulToolCalls / stats.totalToolCalls * 100 : 0;
15020
15032
  const lines = [];
15021
- lines.push(`\u{1F4CB} Task Completed: ${taskDesc}`);
15033
+ lines.push(`\u25B8 Task Completed: ${taskDesc}`);
15022
15034
  lines.push(
15023
- `\u23F1\uFE0F Duration: ${this.fmtDuration(stats.totalDurationMs)} | \u{1F501} Rounds: ${stats.rounds}`
15035
+ `\u25CF Duration: ${this.fmtDuration(stats.totalDurationMs)} | \u25CF Rounds: ${stats.rounds}`
15024
15036
  );
15025
15037
  let quality = "Poor execution";
15026
15038
  if (sr >= 95) quality = "Excellent execution";
15027
15039
  else if (sr >= 85) quality = "Good execution";
15028
15040
  else if (sr >= 70) quality = "Fair execution";
15029
- lines.push(`\u2705 Quality: ${quality} (${sr.toFixed(1)}% tool success)`);
15041
+ lines.push(`\u2713 Quality: ${quality} (${sr.toFixed(1)}% tool success)`);
15030
15042
  const d = stats.totalDurationMs;
15031
15043
  let speed = "Long execution - consider breaking down tasks";
15032
15044
  if (d < 1e4) speed = "Fast completion - under 10 seconds";
15033
15045
  else if (d < 6e4) speed = "Good speed - under a minute";
15034
15046
  else if (d < 3e5) speed = "Moderate duration - a few minutes";
15035
- lines.push(`\u{1F680} Speed: ${speed}`);
15047
+ lines.push(`\u25CF Speed: ${speed}`);
15036
15048
  lines.push(
15037
- `\u{1F527} Tools: ${stats.totalToolCalls} calls, ${sr.toFixed(1)}% success (${stats.successfulToolCalls} ok, ${stats.failedToolCalls} failed)`
15049
+ `\u25CF Tools: ${stats.totalToolCalls} calls, ${sr.toFixed(1)}% success (${stats.successfulToolCalls} ok, ${stats.failedToolCalls} failed)`
15038
15050
  );
15039
15051
  if (typeof stats.totalTokens === "number") {
15040
15052
  const parts = [
@@ -15042,7 +15054,7 @@ var AgentStatistics = class {
15042
15054
  `out ${stats.outputTokens ?? 0}`
15043
15055
  ];
15044
15056
  lines.push(
15045
- `\u{1F522} Tokens: ${stats.totalTokens.toLocaleString()} (${parts.join(", ")})`
15057
+ `\u25CF Tokens: ${stats.totalTokens.toLocaleString()} (${parts.join(", ")})`
15046
15058
  );
15047
15059
  }
15048
15060
  if (stats.toolUsage && stats.toolUsage.length) {
@@ -15057,7 +15069,7 @@ var AgentStatistics = class {
15057
15069
  }
15058
15070
  const tips = this.generatePerformanceTips(stats);
15059
15071
  if (tips.length) {
15060
- lines.push("\n\u{1F4A1} Performance Insights:");
15072
+ lines.push("\n\u2605 Performance Insights:");
15061
15073
  for (const tip of tips.slice(0, 3)) lines.push(` - ${tip}`);
15062
15074
  }
15063
15075
  return lines.join("\n");
@@ -7,13 +7,15 @@ import {
7
7
  SETTINGS_DIRECTORY_NAME,
8
8
  V1_INDICATOR_KEYS,
9
9
  getGlobalQwenDirLite,
10
- getPathComparisonVariants,
11
10
  getSystemDefaultsPath,
12
11
  getSystemSettingsPath,
13
- isWithinRoot,
14
- require_strip_json_comments,
15
12
  resolveEnvVarsInObject
16
- } from "./chunk-UN3C6GOR.js";
13
+ } from "./chunk-PPFWEV7G.js";
14
+ import {
15
+ getPathComparisonVariants,
16
+ isWithinRoot,
17
+ require_strip_json_comments
18
+ } from "./chunk-QYUE6W3T.js";
17
19
  import {
18
20
  require_main
19
21
  } from "./chunk-SKAZWEV5.js";
@@ -272,9 +274,7 @@ function readTrustedFolderRulesFastPath() {
272
274
  __name(readTrustedFolderRulesFastPath, "readTrustedFolderRulesFastPath");
273
275
  function buildTrustedFolderRules(trustedFolders) {
274
276
  const rules = [];
275
- for (const [rulePath, trustLevel] of Object.entries(
276
- trustedFolders
277
- )) {
277
+ for (const [rulePath, trustLevel] of Object.entries(trustedFolders)) {
278
278
  if (trustLevel === TRUST_FOLDER) {
279
279
  rules.push({
280
280
  level: "trusted",
@@ -5,7 +5,7 @@ import {
5
5
  } from "./chunk-UFC57OYT.js";
6
6
  import {
7
7
  MissingCliEntryError
8
- } from "./chunk-D5E5TMYH.js";
8
+ } from "./chunk-VHRREANT.js";
9
9
  import {
10
10
  init_esbuild_shims
11
11
  } from "./chunk-A4BMJM77.js";
@@ -2,7 +2,7 @@
2
2
  "use strict";
3
3
  import {
4
4
  getGlobalQwenDir
5
- } from "./chunk-JXQ23SNT.js";
5
+ } from "./chunk-2JKEQWDZ.js";
6
6
  import {
7
7
  init_esbuild_shims
8
8
  } from "./chunk-A4BMJM77.js";
@@ -2,7 +2,7 @@
2
2
  "use strict";
3
3
  import {
4
4
  createDebugLogger
5
- } from "./chunk-C4K3FEQ2.js";
5
+ } from "./chunk-AVQDCKNF.js";
6
6
  import {
7
7
  init_esbuild_shims
8
8
  } from "./chunk-A4BMJM77.js";
@@ -2,7 +2,7 @@
2
2
  "use strict";
3
3
  import {
4
4
  t
5
- } from "./chunk-5JZLXFPD.js";
5
+ } from "./chunk-3O2BJMFW.js";
6
6
  import {
7
7
  init_esbuild_shims
8
8
  } from "./chunk-A4BMJM77.js";
@@ -10,7 +10,7 @@ import {
10
10
  __name
11
11
  } from "./chunk-J2S4EL5Y.js";
12
12
 
13
- // packages/cli/src/ui/voice/voice-model.ts
13
+ // packages/cli/src/services/voice-model.ts
14
14
  init_esbuild_shims();
15
15
  function resolveVoiceTransport(model) {
16
16
  const id = model.toLowerCase();
@@ -44,11 +44,53 @@ function formatUnsupportedVoiceModelMessage(modelName) {
44
44
  }
45
45
  __name(formatUnsupportedVoiceModelMessage, "formatUnsupportedVoiceModelMessage");
46
46
 
47
+ // packages/cli/src/services/voice-settings.ts
48
+ init_esbuild_shims();
49
+ function readVoiceModel(settings) {
50
+ const value = settings.merged?.voiceModel;
51
+ if (typeof value !== "string") {
52
+ return void 0;
53
+ }
54
+ const trimmed = value.trim();
55
+ return trimmed.length > 0 ? trimmed : void 0;
56
+ }
57
+ __name(readVoiceModel, "readVoiceModel");
58
+ function isVoiceEnabled(settings) {
59
+ return settings.merged?.general?.voice?.enabled === true;
60
+ }
61
+ __name(isVoiceEnabled, "isVoiceEnabled");
62
+ function readVoiceMode(settings) {
63
+ return settings.merged?.general?.voice?.mode === "tap" ? "tap" : "hold";
64
+ }
65
+ __name(readVoiceMode, "readVoiceMode");
66
+ function readVoiceLanguage(settings) {
67
+ const language = settings.merged.general?.voice?.language;
68
+ if (typeof language !== "string") {
69
+ return "";
70
+ }
71
+ return language.trim();
72
+ }
73
+ __name(readVoiceLanguage, "readVoiceLanguage");
74
+ function getVoiceSettingsScope(settings, workspaceTrusted = settings.isTrusted === true) {
75
+ return workspaceTrusted && typeof settings.workspace?.settings?.general?.voice?.enabled === "boolean" ? "Workspace" /* Workspace */ : "User" /* User */;
76
+ }
77
+ __name(getVoiceSettingsScope, "getVoiceSettingsScope");
78
+ function isVoiceMode(value) {
79
+ return value === "hold" || value === "tap";
80
+ }
81
+ __name(isVoiceMode, "isVoiceMode");
82
+
47
83
  export {
48
84
  resolveVoiceTransport,
49
85
  isTranscribableVoiceModel,
50
86
  isSelectableVoiceModel,
51
- formatUnsupportedVoiceModelMessage
87
+ formatUnsupportedVoiceModelMessage,
88
+ readVoiceModel,
89
+ isVoiceEnabled,
90
+ readVoiceMode,
91
+ readVoiceLanguage,
92
+ getVoiceSettingsScope,
93
+ isVoiceMode
52
94
  };
53
95
  /**
54
96
  * @license