@qwen-code/qwen-code 0.19.12 → 0.20.0-nightly.20260721.cda0e0348

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 (280) hide show
  1. package/bundled/qc-helper/docs/configuration/settings.md +1 -1
  2. package/bundled/qc-helper/docs/features/commands.md +54 -0
  3. package/bundled/qc-helper/docs/integration-github-action.md +1 -1
  4. package/bundled/qc-helper/docs/qwen-serve.md +44 -6
  5. package/bundled/review/DESIGN.md +2 -2
  6. package/bundled/review/SKILL.md +13 -9
  7. package/chunks/{MaxSizedBox-QOXLJGAF.js → MaxSizedBox-EE76OHAP.js} +30 -27
  8. package/chunks/{StandaloneSessionPicker-FLV6CGYJ.js → StandaloneSessionPicker-WZH4PC3K.js} +50 -45
  9. package/chunks/{acpAgent-OB2CTF3P.js → acpAgent-2ATF4LMP.js} +437 -156
  10. package/chunks/{agent-CKSI7BTR.js → agent-KTOOFWMV.js} +22 -22
  11. package/chunks/{agent-headless-U36LIYTU.js → agent-headless-WVJCQ27D.js} +22 -22
  12. package/chunks/{anthropicContentGenerator-ZZRGFEES.js → anthropicContentGenerator-W4JLNYWQ.js} +6 -5
  13. package/chunks/{artifact-tool-PHO5XEGZ.js → artifact-tool-WBCAMD3O.js} +2 -2
  14. package/chunks/{askUserQuestion-CEPBT47X.js → askUserQuestion-6DZC4UV5.js} +2 -2
  15. package/chunks/{bridge-AIKTINJG.js → bridge-T4TLAZSJ.js} +25 -25
  16. package/chunks/build-SSCNEHZZ.js +62 -0
  17. package/chunks/{ca-2SL2BXTK.js → ca-ISKASTR5.js} +606 -200
  18. package/chunks/{channel-worker-group-NEUVTPB2.js → channel-worker-group-QZV2SP5U.js} +4 -4
  19. package/chunks/{channel-worker-manager-7CQVOVWV.js → channel-worker-manager-3GMAU45H.js} +4 -4
  20. package/chunks/{channel-worker-supervisor-3BU2KNCZ.js → channel-worker-supervisor-QCXSXCRY.js} +3 -3
  21. package/chunks/{chunk-6ETOSWAO.js → chunk-246TW4IX.js} +3 -3
  22. package/chunks/{chunk-2CCDMJM7.js → chunk-25Y6JSH2.js} +3 -3
  23. package/chunks/{chunk-XSEWNUMZ.js → chunk-2CWOJ2FA.js} +8 -8
  24. package/chunks/{chunk-UZC5VPOJ.js → chunk-2GFRA3MN.js} +3 -3
  25. package/chunks/chunk-2GOPPEHK.js +442 -0
  26. package/chunks/{chunk-MRE77ST5.js → chunk-2ITGJJE2.js} +69 -2216
  27. package/chunks/{chunk-BABX5XRO.js → chunk-2LI23QA6.js} +1 -1
  28. package/chunks/{chunk-EFAXBOQO.js → chunk-32F7BZSK.js} +7 -7
  29. package/chunks/chunk-43T5WDQ7.js +127 -0
  30. package/chunks/{chunk-DJ4VHAFJ.js → chunk-4CWPMWCD.js} +7 -3
  31. package/chunks/{chunk-GMUPIMHF.js → chunk-4RA7PWIY.js} +3 -3
  32. package/chunks/{chunk-6IITZE7O.js → chunk-5JX5EWR5.js} +7 -7
  33. package/chunks/{chunk-OBSLEYCD.js → chunk-5PZ6R37W.js} +29 -2
  34. package/chunks/{chunk-HTHUX2T5.js → chunk-5QWWOFGG.js} +0 -1
  35. package/chunks/{chunk-3DJY4IFO.js → chunk-5SCI6E3E.js} +1 -1
  36. package/chunks/{chunk-GSPWDTYY.js → chunk-5WG2K5RH.js} +53 -16
  37. package/chunks/{chunk-NPMVLWYL.js → chunk-5YVZ2XLV.js} +6 -6
  38. package/chunks/{chunk-TKASNYDS.js → chunk-6DHWO5ZF.js} +3 -3
  39. package/chunks/{chunk-4CHDYDG3.js → chunk-6EFTQYW7.js} +1 -1
  40. package/chunks/{chunk-RKUMFUFM.js → chunk-6MC5ASQK.js} +4 -4
  41. package/chunks/{chunk-HZ4M2UQD.js → chunk-6RVJRVQR.js} +1 -1
  42. package/chunks/{chunk-W6CQPLWM.js → chunk-6ZBPS62S.js} +1 -1
  43. package/chunks/chunk-7KGXAXF7.js +114 -0
  44. package/chunks/{chunk-PK7COE5O.js → chunk-ABIL4ZQU.js} +1 -1
  45. package/chunks/{chunk-OEHCAWUA.js → chunk-ACW3VNUE.js} +2 -2
  46. package/chunks/{chunk-APOFULHK.js → chunk-AWVS63WA.js} +7 -6
  47. package/chunks/{chunk-KGWA7XYL.js → chunk-AY3CSB6F.js} +6 -226
  48. package/chunks/{chunk-XAAEDML2.js → chunk-AYCDXHZB.js} +1 -1
  49. package/chunks/{chunk-42VIHAYT.js → chunk-B452RETY.js} +1 -1
  50. package/chunks/{chunk-VAJS2E2D.js → chunk-BDBMYST4.js} +1 -1
  51. package/chunks/{chunk-5N7M4XYN.js → chunk-BUKOHGBE.js} +5 -5
  52. package/chunks/{chunk-F2RR4HO2.js → chunk-BVLROR2T.js} +1 -1
  53. package/chunks/{chunk-WIYV7CSF.js → chunk-BWK3FX3K.js} +3 -3
  54. package/chunks/{chunk-UE5TZ55T.js → chunk-C27BYUX6.js} +29 -2
  55. package/chunks/{chunk-KRMARA3A.js → chunk-CG2HPAVD.js} +29 -13
  56. package/chunks/{chunk-UOA2IHRI.js → chunk-CPCVCKKF.js} +1 -1
  57. package/chunks/{chunk-HD6EGS5K.js → chunk-CUJX3F4X.js} +31 -6
  58. package/chunks/{chunk-4RPARQ5D.js → chunk-D2VIDMVM.js} +2 -2
  59. package/chunks/{chunk-PUKUUASO.js → chunk-DMRO4GU2.js} +1 -1
  60. package/chunks/{chunk-64GC5EMF.js → chunk-DZZIOIVF.js} +1 -1
  61. package/chunks/{chunk-FUSMC3SZ.js → chunk-E5QFCC4X.js} +13 -8
  62. package/chunks/{chunk-LKR7QQ63.js → chunk-EAUYY7SS.js} +3 -3
  63. package/chunks/{chunk-NE6HHLL3.js → chunk-EDMGFJ3E.js} +2 -2
  64. package/chunks/{chunk-J2MKYJKZ.js → chunk-EIAK6Q2B.js} +2 -2
  65. package/chunks/{chunk-WEPXQKGP.js → chunk-EZVDJFZ7.js} +1 -1
  66. package/chunks/{chunk-NALRQ3SG.js → chunk-FCUUJKZF.js} +394 -128
  67. package/chunks/{chunk-4XCVGEEX.js → chunk-FSL5W5TI.js} +3 -3
  68. package/chunks/{chunk-CHPQFLW6.js → chunk-FYA3Y5JR.js} +5 -5
  69. package/chunks/{chunk-V4PCIS25.js → chunk-FZVSFBNW.js} +69 -7
  70. package/chunks/{chunk-4MPYGENG.js → chunk-G45NOBV7.js} +6 -6
  71. package/chunks/{chunk-OSSDHJDU.js → chunk-G45X5TRN.js} +1 -1
  72. package/chunks/{chunk-3B6PSWHE.js → chunk-GH7OEOYU.js} +4 -4
  73. package/chunks/{chunk-KANTXY7B.js → chunk-GKY2OJ7R.js} +2 -2
  74. package/chunks/chunk-GMGDLUC7.js +37 -0
  75. package/chunks/{chunk-2476XGOU.js → chunk-GPILFVPY.js} +1 -1
  76. package/chunks/{chunk-EISVEV45.js → chunk-H24SOJIQ.js} +2 -2
  77. package/chunks/{chunk-J6NT5YTN.js → chunk-H2XVO6NE.js} +1 -289
  78. package/chunks/{chunk-QIFTJDBY.js → chunk-IM2A6YO3.js} +1 -1
  79. package/chunks/{chunk-R3EDIMYZ.js → chunk-IYZENXFW.js} +1 -1
  80. package/chunks/{chunk-LPHGXXZX.js → chunk-JD3MKVKL.js} +1 -1
  81. package/chunks/{chunk-NUHSLBJZ.js → chunk-JNWZQ27S.js} +15 -9
  82. package/chunks/{chunk-ETN2G32U.js → chunk-JPRLCXAO.js} +4 -4
  83. package/chunks/{chunk-WHQNBBWW.js → chunk-JQMBPGOU.js} +2 -2
  84. package/chunks/{chunk-5QSVANRT.js → chunk-JR6UJ24K.js} +2 -2
  85. package/chunks/{chunk-VLHQMOZK.js → chunk-JRW46GQX.js} +3 -3
  86. package/chunks/{chunk-DUR7BZYK.js → chunk-KRI4VCHX.js} +53 -28
  87. package/chunks/{chunk-PR5XQ73G.js → chunk-KTNIZG2C.js} +2 -2
  88. package/chunks/{chunk-QSG4ZFG4.js → chunk-KTUQMDEP.js} +1 -1
  89. package/chunks/{chunk-HVGJWOR6.js → chunk-L4YSPHR4.js} +2 -2
  90. package/chunks/{chunk-BEZPRKD3.js → chunk-LC5CAVMS.js} +160 -2
  91. package/chunks/{chunk-67Q33DQY.js → chunk-LLDGOZMJ.js} +4 -4
  92. package/chunks/{chunk-UCTCDLDS.js → chunk-LWQ4IAOJ.js} +136 -4
  93. package/chunks/{chunk-GEHSF7MS.js → chunk-NEEB7UEN.js} +2545 -1974
  94. package/chunks/{chunk-GCY7QTCE.js → chunk-NO6XTCYT.js} +1822 -424
  95. package/chunks/{chunk-JCJPZMJV.js → chunk-OOCI5VVU.js} +1 -1
  96. package/chunks/{chunk-XSPFQQRE.js → chunk-OONJNQ42.js} +3 -3
  97. package/chunks/{chunk-ANRANWVE.js → chunk-OP4MOGXF.js} +1 -1
  98. package/chunks/{chunk-GW7BONBU.js → chunk-OV2KB55J.js} +5 -5
  99. package/chunks/{chunk-CPU6I5YV.js → chunk-P64HXIC5.js} +115 -32
  100. package/chunks/{chunk-SGPFJMRP.js → chunk-PBATSWUQ.js} +1 -1
  101. package/chunks/{chunk-GXFYV7MP.js → chunk-PFKNXN67.js} +1106 -592
  102. package/chunks/{chunk-KNGZ5EYL.js → chunk-PYNCSQSI.js} +198 -120
  103. package/chunks/{chunk-I7RRHHYG.js → chunk-QKTHJXCS.js} +1 -1
  104. package/chunks/chunk-QKYTTBYW.js +624 -0
  105. package/chunks/{chunk-76BFY7AF.js → chunk-QTERJVPZ.js} +1 -6
  106. package/chunks/{chunk-W4UN42YP.js → chunk-R3VZNHRX.js} +85 -21
  107. package/chunks/chunk-R5N7NF5D.js +1187 -0
  108. package/chunks/{chunk-ZSDFNE6Y.js → chunk-RF34V75B.js} +3 -3
  109. package/chunks/{chunk-HCCR43AY.js → chunk-RFIAR4YL.js} +1 -1
  110. package/chunks/chunk-RS7MT2QG.js +305 -0
  111. package/chunks/{chunk-BKNPMEN6.js → chunk-RVLZCXEE.js} +162 -17
  112. package/chunks/chunk-SV5PQVQE.js +71 -0
  113. package/chunks/{chunk-3ESL7JXA.js → chunk-U4VGYZN7.js} +3 -3
  114. package/chunks/{chunk-4CA4WUMS.js → chunk-UEY4AYUL.js} +2 -2
  115. package/chunks/{chunk-ZGT623SG.js → chunk-USTF7LPI.js} +12 -12
  116. package/chunks/chunk-V7RNNPGC.js +44 -0
  117. package/chunks/{chunk-VEFR4XJQ.js → chunk-W3BKN3LO.js} +1 -1
  118. package/chunks/{chunk-4SJJT466.js → chunk-WQQDJE2P.js} +94 -177
  119. package/chunks/{chunk-KMJOMWHE.js → chunk-WRRF6TEQ.js} +1 -1
  120. package/chunks/{chunk-GLH2NTPB.js → chunk-XCHUDLER.js} +1 -1
  121. package/chunks/{chunk-7SX6WZNO.js → chunk-XVVH63JG.js} +3 -3
  122. package/chunks/{chunk-N47VAEAJ.js → chunk-XZOBDSDG.js} +2379 -1291
  123. package/chunks/chunk-YGIUIIIF.js +125 -0
  124. package/chunks/{chunk-335ECZTA.js → chunk-ZEOZL37W.js} +1 -1
  125. package/chunks/{computer-use-4PUGCUQK.js → computer-use-M6MGRJF2.js} +22 -22
  126. package/chunks/{config-utils-6PJUXHLI.js → config-utils-MOGE4EVB.js} +3 -3
  127. package/chunks/{contextCommand-C57KTWFV.js → contextCommand-HTRJJYNE.js} +25 -26
  128. package/chunks/{create-sub-session-5Q42XR6I.js → create-sub-session-MB35IHCR.js} +22 -22
  129. package/chunks/{create-sub-session-DIJOV6HV.js → create-sub-session-P26FE5GG.js} +2 -2
  130. package/chunks/{cron-create-X462ERYA.js → cron-create-JWFHBDRQ.js} +4 -4
  131. package/chunks/{cron-delete-SL5UJUM3.js → cron-delete-GDX4E26G.js} +4 -4
  132. package/chunks/{cron-list-3MD6SVXI.js → cron-list-USMAIWPT.js} +4 -4
  133. package/chunks/{daemon-ZW6LHOXT.js → daemon-KLPTQIE4.js} +287 -143
  134. package/chunks/{daemon-status-provider-YPV3UXHT.js → daemon-status-provider-67EKK6S3.js} +29 -29
  135. package/chunks/{dist-NUXRQHC5.js → dist-OAV7LJGJ.js} +1 -1
  136. package/chunks/{dist-XLE6ODMB.js → dist-OMW6WDEO.js} +1 -1
  137. package/chunks/{dist-J2H4KTLB.js → dist-PJLG2XYX.js} +1 -1
  138. package/chunks/{dist-IEQSDXS7.js → dist-UIFWIFRO.js} +2 -2
  139. package/chunks/{dist-IGZMVS5R.js → dist-VGJTZL4E.js} +33 -22
  140. package/chunks/{dist-3DQNQJ6H.js → dist-XBJVSWS2.js} +1 -1
  141. package/chunks/{earlyInputCapture-5VDWSYAM.js → earlyInputCapture-7QJX25AC.js} +23 -23
  142. package/chunks/{edit-GORZTX2U.js → edit-BTPQWGAA.js} +23 -23
  143. package/chunks/{enter-worktree-LJB2AW4L.js → enter-worktree-N3SEYKOO.js} +22 -22
  144. package/chunks/{enterPlanMode-LIIPP37T.js → enterPlanMode-TN2JV5MY.js} +28 -23
  145. package/chunks/{environment-HQ2UHJ35.js → environment-HP6RK262.js} +24 -24
  146. package/chunks/{errors-6JD5VMVQ.js → errors-VHGRDDOQ.js} +24 -24
  147. package/chunks/{exit-worktree-IEP2WHOV.js → exit-worktree-FI3SQY3U.js} +22 -22
  148. package/chunks/{exitPlanMode-U5Z6XBLO.js → exitPlanMode-NZWRVIIY.js} +22 -22
  149. package/chunks/{fast-path-HFKNMP23.js → fast-path-EGP7AXNR.js} +3 -2
  150. package/chunks/{gemini-C2SCJH3N.js → gemini-AN5YMD5O.js} +70 -68
  151. package/chunks/{geminiContentGenerator-ADZTXEKV.js → geminiContentGenerator-ABTMU4FE.js} +4 -4
  152. package/chunks/{glob-GOAPGD6G.js → glob-5YABOPJB.js} +22 -22
  153. package/chunks/{grep-HZLSTX7D.js → grep-U67FKUJT.js} +22 -22
  154. package/chunks/{handleAutoUpdate-UF74WGFE.js → handleAutoUpdate-OOKBP5VD.js} +27 -28
  155. package/chunks/{i18n-FMXIYUOC.js → i18n-GMQV324P.js} +23 -23
  156. package/chunks/{initializer-ERDBM3DU.js → initializer-NWALZGQ5.js} +28 -28
  157. package/chunks/{installationInfo-LROMXYLX.js → installationInfo-Y3M433E7.js} +25 -23
  158. package/chunks/{keychain-token-storage-K23CFKGN.js → keychain-token-storage-DWRJMNH3.js} +2 -2
  159. package/chunks/{list-6JPJROU5.js → list-CQDDWHTS.js} +30 -30
  160. package/chunks/{loadedSettingsAdapter-QCWYUBBF.js → loadedSettingsAdapter-I5KG37EI.js} +27 -27
  161. package/chunks/{loop-wakeup-6H7OENTB.js → loop-wakeup-5GLTUBHA.js} +5 -5
  162. package/chunks/{ls-APTSOOS5.js → ls-FHBY3Y7I.js} +4 -4
  163. package/chunks/{lsp-HPACPJAN.js → lsp-B6VMEW6Y.js} +2 -2
  164. package/chunks/{mcp-3P3KWYWO.js → mcp-24HHCBSP.js} +27 -27
  165. package/chunks/{monitor-LMYKCF6R.js → monitor-Z7NZNNRC.js} +22 -22
  166. package/chunks/nonInteractiveCli-GVF2XDJT.js +126 -0
  167. package/chunks/{notebook-edit-IBEOVZ6A.js → notebook-edit-GFOYAQAZ.js} +23 -23
  168. package/chunks/{openaiContentGenerator-42PZKET5.js → openaiContentGenerator-XAAYV6WR.js} +11 -11
  169. package/chunks/{pidfile-VTBDIGOH.js → pidfile-ILI37KRQ.js} +23 -23
  170. package/chunks/{processUtils-L7ZKOGDG.js → processUtils-LIPJMLVZ.js} +2 -2
  171. package/chunks/{qwenContentGenerator-VR2CNFGI.js → qwenContentGenerator-DLJ3KKGZ.js} +24 -24
  172. package/chunks/{qwenOAuth2-6LS2T3Q6.js → qwenOAuth2-J47FU5PW.js} +11 -11
  173. package/chunks/react-SG7JAQSZ.js +8 -0
  174. package/chunks/{read-file-VSKOE22I.js → read-file-LCQ2KNNP.js} +8 -8
  175. package/chunks/{read-mcp-resource-C6NT52T6.js → read-mcp-resource-AKCL7I43.js} +2 -2
  176. package/chunks/{record-artifact-ENCU7QCL.js → record-artifact-PEUB7727.js} +2 -2
  177. package/chunks/resumeHistoryUtils-PSCSAKA6.js +78 -0
  178. package/chunks/{ripGrep-5V5FLW2A.js → ripGrep-Y2XW4EFC.js} +22 -22
  179. package/chunks/{run-qwen-serve-LSOPP4R2.js → run-qwen-serve-DQ5ZIR36.js} +1459 -148
  180. package/chunks/{runtime-LT7R4CS5.js → runtime-6MQFF2A6.js} +33 -31
  181. package/chunks/{scheduler-YOWQ7KZP.js → scheduler-K4S7NY3G.js} +22 -22
  182. package/chunks/{send-message-5GZ4FX2V.js → send-message-3RHE7HSM.js} +3 -3
  183. package/chunks/{serve-VWLBXKGK.js → serve-JFAAPC5J.js} +27 -27
  184. package/chunks/{server-3RW3FYOH.js → server-QB6CHRZN.js} +866 -271
  185. package/chunks/{session-ZONXFOBQ.js → session-FKPVXAAB.js} +79 -163
  186. package/chunks/{settings-JC3VC53L.js → settings-CADELKSU.js} +26 -26
  187. package/chunks/{shell-2NGEMAVM.js → shell-EON6WVVH.js} +22 -22
  188. package/chunks/{skill-3U2T6H3E.js → skill-FKSYXJ5U.js} +10 -10
  189. package/chunks/{spawnChannel-QEAUPARQ.js → spawnChannel-VM5IHLJO.js} +24 -24
  190. package/chunks/{src-75ZPXO7B.js → src-Q4XB6SVD.js} +66 -22
  191. package/chunks/{standalone-update-UUJWJWYY.js → standalone-update-KGZHPBMA.js} +24 -24
  192. package/chunks/{startInteractiveUI-V7XISPQ6.js → startInteractiveUI-EYDJIIIZ.js} +5484 -2045
  193. package/chunks/{syntheticOutput-ULOVVLY4.js → syntheticOutput-FG5PQKIR.js} +3 -3
  194. package/chunks/{task-create-DUE2PMNI.js → task-create-HX32YXO7.js} +7 -7
  195. package/chunks/{task-list-WVPNX7BZ.js → task-list-QWSY4ZIU.js} +5 -5
  196. package/chunks/{task-stop-CPEQWOT6.js → task-stop-GWC6UWAL.js} +2 -2
  197. package/chunks/{task-update-HY2LNFFB.js → task-update-NCTAB73Q.js} +7 -7
  198. package/chunks/{team-create-R6AXDYPG.js → team-create-CYP3YKYT.js} +22 -22
  199. package/chunks/{team-delete-JJV6IUOA.js → team-delete-KK37HTOG.js} +5 -5
  200. package/chunks/{team-plan-approval-O2ZPPT64.js → team-plan-approval-5LXIFKNV.js} +22 -22
  201. package/chunks/{theme-manager-YIX2IC2D.js → theme-manager-QOUMDWMP.js} +23 -23
  202. package/chunks/{todoWrite-JHHIDOIV.js → todoWrite-ERCAMLFS.js} +4 -4
  203. package/chunks/{tool-search-5IE2VO7X.js → tool-search-Q27QHQU3.js} +9 -9
  204. package/chunks/{total-session-admission-K6APQYEF.js → total-session-admission-HWVCZ2WR.js} +25 -25
  205. package/chunks/{trustedFolders-GPSSPVBF.js → trustedFolders-C6664IQC.js} +23 -23
  206. package/chunks/{update-relaunch-4BVAPX6Y.js → update-relaunch-QC3E4FZW.js} +9 -9
  207. package/chunks/{updateCheck-AHTHWLAM.js → updateCheck-MVUKJMBX.js} +33 -26
  208. package/chunks/useAutoAcceptIndicator-J234IFIS.js +80 -0
  209. package/chunks/{validateNonInterActiveAuth-UKAPCWDM.js → validateNonInterActiveAuth-YPPEKX4N.js} +61 -63
  210. package/chunks/{version-EXGWKKQE.js → version-5IXFQ4PT.js} +1 -1
  211. package/chunks/{web-fetch-ZDNE6FF2.js → web-fetch-L62NQVKN.js} +10 -10
  212. package/chunks/{workflow-G7U6OQWS.js → workflow-6MHBBFQU.js} +23 -23
  213. package/chunks/{workspace-providers-status-W6CEA6YM.js → workspace-providers-status-ZTW2B5QU.js} +30 -30
  214. package/chunks/{workspace-registration-store-OGBMWCLC.js → workspace-registration-store-P6QHCSMU.js} +7 -1
  215. package/chunks/{workspace-registry-ZUWQM44P.js → workspace-registry-R54M5O3W.js} +25 -25
  216. package/chunks/{workspace-service-UXX5P7GU.js → workspace-service-WYLRGM4A.js} +32 -32
  217. package/chunks/{workspace-skills-status-635B5R7N.js → workspace-skills-status-NN5QFU3A.js} +28 -28
  218. package/chunks/{write-file-DR3HN7IH.js → write-file-EAT3CHUK.js} +23 -23
  219. package/cli.js +11 -11
  220. package/locales/ca.js +763 -201
  221. package/package.json +3 -3
  222. package/web-shell/assets/{arc-_dVIKMdB.js → arc-B0iTWRo2.js} +1 -1
  223. package/web-shell/assets/{architectureDiagram-3BPJPVTR-MuN3nKpL.js → architectureDiagram-3BPJPVTR-DSQP4-9D.js} +1 -1
  224. package/web-shell/assets/{blockDiagram-GPEHLZMM-BtmvJjzx.js → blockDiagram-GPEHLZMM-BNPVXVT3.js} +1 -1
  225. package/web-shell/assets/{c4Diagram-AAUBKEIU-Dvi58_BU.js → c4Diagram-AAUBKEIU-DEHfJFiD.js} +1 -1
  226. package/web-shell/assets/channel-tVz-qNSq.js +1 -0
  227. package/web-shell/assets/{chunk-2J33WTMH-YqxOVhS1.js → chunk-2J33WTMH-VZ0uL1p9.js} +1 -1
  228. package/web-shell/assets/{chunk-4BX2VUAB-DoBgbC9z.js → chunk-4BX2VUAB-D5TKmvwG.js} +1 -1
  229. package/web-shell/assets/{chunk-55IACEB6-3NEQrBAr.js → chunk-55IACEB6-BDW1Lcq-.js} +1 -1
  230. package/web-shell/assets/{chunk-727SXJPM-DrCZQxp0.js → chunk-727SXJPM-Cj4h85iM.js} +1 -1
  231. package/web-shell/assets/{chunk-AQP2D5EJ-m_g3zjgv.js → chunk-AQP2D5EJ-5LeqiOhZ.js} +1 -1
  232. package/web-shell/assets/{chunk-FMBD7UC4-D1_crABJ.js → chunk-FMBD7UC4-BaTgsco7.js} +1 -1
  233. package/web-shell/assets/{chunk-ND2GUHAM-BdhgVtBx.js → chunk-ND2GUHAM-t3uGlIUk.js} +1 -1
  234. package/web-shell/assets/{chunk-QZHKN3VN-BlmThhm-.js → chunk-QZHKN3VN-rOnNXL2Q.js} +1 -1
  235. package/web-shell/assets/classDiagram-4FO5ZUOK-CWuaBxYV.js +1 -0
  236. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-CWuaBxYV.js +1 -0
  237. package/web-shell/assets/{cose-bilkent-S5V4N54A-Cbjm_00Z.js → cose-bilkent-S5V4N54A-CcqXykgA.js} +1 -1
  238. package/web-shell/assets/{dagre-BM42HDAG-C39QNVgC.js → dagre-BM42HDAG-Dkjrchoy.js} +1 -1
  239. package/web-shell/assets/{diagram-2AECGRRQ-DNXSAixC.js → diagram-2AECGRRQ-B6lcra9M.js} +1 -1
  240. package/web-shell/assets/{diagram-5GNKFQAL-BCbGUPEA.js → diagram-5GNKFQAL-bAIzq3PT.js} +1 -1
  241. package/web-shell/assets/{diagram-KO2AKTUF-1eujKSDC.js → diagram-KO2AKTUF-G9MAZDNW.js} +1 -1
  242. package/web-shell/assets/{diagram-LMA3HP47-DUMKXgql.js → diagram-LMA3HP47-DVLF1uWZ.js} +1 -1
  243. package/web-shell/assets/{diagram-OG6HWLK6-BFktU3_u.js → diagram-OG6HWLK6-Cf7y20Tc.js} +1 -1
  244. package/web-shell/assets/{erDiagram-TEJ5UH35-BvJC7DLk.js → erDiagram-TEJ5UH35-C7ETZB3o.js} +1 -1
  245. package/web-shell/assets/{flowDiagram-I6XJVG4X-Cgu3PlOt.js → flowDiagram-I6XJVG4X-Cl2xgL6J.js} +1 -1
  246. package/web-shell/assets/{ganttDiagram-6RSMTGT7-DLNXN5Xh.js → ganttDiagram-6RSMTGT7-BgjbMs3q.js} +1 -1
  247. package/web-shell/assets/{gitGraphDiagram-PVQCEYII-BQFRDv6R.js → gitGraphDiagram-PVQCEYII-JVX34Omm.js} +1 -1
  248. package/web-shell/assets/index-48bIcdqF.js +1197 -0
  249. package/web-shell/assets/{index-CdC3pjP3.js → index-BG7Zc4f_.js} +1 -1
  250. package/web-shell/assets/index-BI-JAO07.css +5 -0
  251. package/web-shell/assets/{infoDiagram-5YYISTIA-DT2mOSvp.js → infoDiagram-5YYISTIA-3NYyMeZU.js} +1 -1
  252. package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-9fy_K4bd.js → ishikawaDiagram-YF4QCWOH-C03VCu-U.js} +1 -1
  253. package/web-shell/assets/{journeyDiagram-JHISSGLW-CoGSEuhE.js → journeyDiagram-JHISSGLW-C9PuBRZW.js} +1 -1
  254. package/web-shell/assets/{kanban-definition-UN3LZRKU-BP9hHYIj.js → kanban-definition-UN3LZRKU-C3LvioWR.js} +1 -1
  255. package/web-shell/assets/{linear-uIroDsmp.js → linear-Du6Yw8N_.js} +1 -1
  256. package/web-shell/assets/{mermaid.core-BUwoStsA.js → mermaid.core-BXY5D2-X.js} +5 -5
  257. package/web-shell/assets/{mindmap-definition-RKZ34NQL-DZB-FWim.js → mindmap-definition-RKZ34NQL-2UrHLaDp.js} +1 -1
  258. package/web-shell/assets/{pieDiagram-4H26LBE5-YPptloKl.js → pieDiagram-4H26LBE5-dC03ml45.js} +1 -1
  259. package/web-shell/assets/{quadrantDiagram-W4KKPZXB-dgk3DSzm.js → quadrantDiagram-W4KKPZXB-CD6jARrp.js} +1 -1
  260. package/web-shell/assets/{requirementDiagram-4Y6WPE33-BH2En2i9.js → requirementDiagram-4Y6WPE33-BrK8aXfv.js} +1 -1
  261. package/web-shell/assets/{sankeyDiagram-5OEKKPKP-BB98feeI.js → sankeyDiagram-5OEKKPKP-B5Vitki_.js} +1 -1
  262. package/web-shell/assets/{sequenceDiagram-3UESZ5HK-CunAIGh8.js → sequenceDiagram-3UESZ5HK-CBy2t6Bo.js} +1 -1
  263. package/web-shell/assets/{stateDiagram-AJRCARHV-DTJs_-I2.js → stateDiagram-AJRCARHV-Enrka6T2.js} +1 -1
  264. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-DUtYfXpW.js +1 -0
  265. package/web-shell/assets/{timeline-definition-PNZ67QCA-Cd4AN7O0.js → timeline-definition-PNZ67QCA-CwFq78ss.js} +1 -1
  266. package/web-shell/assets/{vennDiagram-CIIHVFJN-xIG-rUU9.js → vennDiagram-CIIHVFJN-BkOidM0g.js} +1 -1
  267. package/web-shell/assets/{wardley-L42UT6IY-D1UyjIcG.js → wardley-L42UT6IY-D_j13hQW.js} +1 -1
  268. package/web-shell/assets/{wardleyDiagram-YWT4CUSO-BVM0Mb99.js → wardleyDiagram-YWT4CUSO-7EveB1w6.js} +1 -1
  269. package/web-shell/assets/{xychartDiagram-2RQKCTM6-BX31JDSz.js → xychartDiagram-2RQKCTM6-DRkBhMXr.js} +1 -1
  270. package/web-shell/index.html +2 -2
  271. package/chunks/chunk-EDFD7VOX.js +0 -368
  272. package/chunks/chunk-GFYFLDEG.js +0 -709
  273. package/chunks/chunk-LUJQUNKY.js +0 -3288
  274. package/chunks/nonInteractiveCli-YURFHZV5.js +0 -129
  275. package/web-shell/assets/channel-Bi5TehaT.js +0 -1
  276. package/web-shell/assets/classDiagram-4FO5ZUOK-BKhhRdd1.js +0 -1
  277. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-BKhhRdd1.js +0 -1
  278. package/web-shell/assets/index-C_ouplMQ.js +0 -1187
  279. package/web-shell/assets/index-XGDFJE-X.css +0 -5
  280. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-DrfFMYta.js +0 -1
@@ -1,5 +1,10 @@
1
1
  // Force strict mode and setup for ESM
2
2
  "use strict";
3
+ import {
4
+ openQwenAsrRealtimeStream,
5
+ openVoiceStream,
6
+ openVoiceStreamWithRetry
7
+ } from "./chunk-GKY2OJ7R.js";
3
8
  import {
4
9
  GENERATION_MAX_PROMPT_BYTES,
5
10
  MAX_REMEMBER_CONTENT_BYTES,
@@ -14,12 +19,7 @@ import {
14
19
  shouldSuppressRememberErrorDetails,
15
20
  workspaceMemoryFailureCode,
16
21
  workspaceMemoryFailureDiagnostics
17
- } from "./chunk-KRMARA3A.js";
18
- import {
19
- openQwenAsrRealtimeStream,
20
- openVoiceStream,
21
- openVoiceStreamWithRetry
22
- } from "./chunk-KANTXY7B.js";
22
+ } from "./chunk-CG2HPAVD.js";
23
23
  import {
24
24
  SetupGithubError,
25
25
  collectSessionData,
@@ -30,16 +30,16 @@ import {
30
30
  toJson,
31
31
  toJsonl,
32
32
  toMarkdown
33
- } from "./chunk-GXFYV7MP.js";
33
+ } from "./chunk-PFKNXN67.js";
34
34
  import {
35
35
  OBSERVED_CONTACT_MAX_FRESH_WITHIN_SECONDS,
36
36
  ObservedChannelContactStore
37
- } from "./chunk-QSG4ZFG4.js";
38
- import "./chunk-HZ4M2UQD.js";
39
- import "./chunk-J6NT5YTN.js";
37
+ } from "./chunk-KTUQMDEP.js";
38
+ import "./chunk-6RVJRVQR.js";
39
+ import "./chunk-RS7MT2QG.js";
40
+ import "./chunk-H2XVO6NE.js";
40
41
  import "./chunk-QHTIBUWB.js";
41
- import "./chunk-76BFY7AF.js";
42
- import "./chunk-HTHUX2T5.js";
42
+ import "./chunk-QTERJVPZ.js";
43
43
  import "./chunk-L573Z2QZ.js";
44
44
  import {
45
45
  createSingleWorkspaceRegistry,
@@ -77,6 +77,7 @@ import {
77
77
  getDeferredRuntimeRequestTiming,
78
78
  getServeProtocolVersions,
79
79
  hostAllowlist,
80
+ installAccessLogMiddleware,
80
81
  isBrowserAutomationMcpAvailable,
81
82
  isDeepHealthQuery,
82
83
  parseAllowOriginPatterns,
@@ -99,29 +100,29 @@ import {
99
100
  setRateLimiter,
100
101
  unsafeRevealSecret,
101
102
  validateMcpRuntimeServerName
102
- } from "./chunk-BEZPRKD3.js";
103
+ } from "./chunk-LC5CAVMS.js";
103
104
  import {
104
105
  isLoopbackBind
105
106
  } from "./chunk-RXFQM6FQ.js";
106
107
  import {
107
108
  createDaemonStatusProvider
108
- } from "./chunk-67Q33DQY.js";
109
+ } from "./chunk-LLDGOZMJ.js";
109
110
  import "./chunk-LXXMOYPL.js";
110
- import "./chunk-3B6PSWHE.js";
111
+ import "./chunk-GH7OEOYU.js";
111
112
  import "./chunk-E5Z2AVNV.js";
112
113
  import {
113
114
  createWorkspaceProvidersStatusProvider
114
- } from "./chunk-XSEWNUMZ.js";
115
+ } from "./chunk-2CWOJ2FA.js";
115
116
  import {
116
117
  getAuthTypeFromEnv,
117
118
  resolveCliGenerationConfig
118
- } from "./chunk-HVGJWOR6.js";
119
+ } from "./chunk-L4YSPHR4.js";
119
120
  import {
120
121
  snapshotProcessEnv
121
- } from "./chunk-5QSVANRT.js";
122
+ } from "./chunk-JR6UJ24K.js";
122
123
  import {
123
124
  createWorkspaceSkillsStatusProvider
124
- } from "./chunk-VLHQMOZK.js";
125
+ } from "./chunk-JRW46GQX.js";
125
126
  import "./chunk-2W3OOD4W.js";
126
127
  import {
127
128
  EMPTY_WORKSPACE_VOICE_UPDATE_ERROR,
@@ -136,14 +137,14 @@ import {
136
137
  validateWorkspaceSkillName,
137
138
  validateWorkspaceVoiceState,
138
139
  voiceSettingsScopeToWire
139
- } from "./chunk-DUR7BZYK.js";
140
+ } from "./chunk-KRI4VCHX.js";
140
141
  import {
141
142
  PermissionRulesValidationError,
142
143
  buildPermissionSettings,
143
144
  isPermissionRuleType,
144
145
  normalizePermissionRules,
145
146
  readPermissionRuleSet
146
- } from "./chunk-QIFTJDBY.js";
147
+ } from "./chunk-IM2A6YO3.js";
147
148
  import {
148
149
  assertVoiceBaseUrlNetworkAllowed,
149
150
  isStreamingVoiceModel,
@@ -151,13 +152,13 @@ import {
151
152
  resolveVoiceTranscriptionConfig,
152
153
  sanitizeVoiceErrorMessage,
153
154
  transcribeVoiceAudio
154
- } from "./chunk-3ESL7JXA.js";
155
+ } from "./chunk-U4VGYZN7.js";
155
156
  import {
156
157
  isVoiceEnabled,
157
158
  isVoiceMode,
158
159
  readVoiceModel
159
- } from "./chunk-2476XGOU.js";
160
- import "./chunk-F2RR4HO2.js";
160
+ } from "./chunk-GPILFVPY.js";
161
+ import "./chunk-BVLROR2T.js";
161
162
  import {
162
163
  WorkspacePermissionRulesSessionRequiredError,
163
164
  WorkspaceSettingsPartialPersistError,
@@ -173,14 +174,14 @@ import {
173
174
  SessionArtifactValidationError,
174
175
  createAcpSessionBridge,
175
176
  parseSessionSource
176
- } from "./chunk-W4UN42YP.js";
177
+ } from "./chunk-R3VZNHRX.js";
177
178
  import {
178
179
  EVENT_SCHEMA_VERSION,
179
180
  SubscriberLimitExceededError
180
181
  } from "./chunk-6RLROE6G.js";
181
182
  import "./chunk-COH43MRJ.js";
182
183
  import "./chunk-QR6U5QPP.js";
183
- import "./chunk-PUKUUASO.js";
184
+ import "./chunk-DMRO4GU2.js";
184
185
  import {
185
186
  BranchWhilePromptActiveError,
186
187
  CancelSentinelCollisionError,
@@ -217,25 +218,27 @@ import {
217
218
  STATUS_SCHEMA_VERSION,
218
219
  createIdleWorkspaceMemoryStatus,
219
220
  mapDomainErrorToErrorKind
220
- } from "./chunk-64GC5EMF.js";
221
+ } from "./chunk-DZZIOIVF.js";
221
222
  import "./chunk-WBL3FJEU.js";
222
223
  import {
223
224
  daemonObservedContactsPath,
224
225
  loadChannelsConfig
225
- } from "./chunk-HD6EGS5K.js";
226
- import "./chunk-RKUMFUFM.js";
226
+ } from "./chunk-CUJX3F4X.js";
227
+ import "./chunk-6MC5ASQK.js";
227
228
  import "./chunk-57OAHC2Y.js";
228
229
  import {
229
230
  parseChannelWebhookConfigLenient
230
- } from "./chunk-EFAXBOQO.js";
231
- import "./chunk-W6CQPLWM.js";
231
+ } from "./chunk-32F7BZSK.js";
232
+ import "./chunk-6ZBPS62S.js";
232
233
  import "./chunk-V6WHFGST.js";
233
234
  import {
234
235
  MAX_REGISTERED_WORKSPACES,
236
+ WorkspaceDisplayNameValidationError,
235
237
  WorkspaceRegistrationStoreCommittedError,
236
238
  WorkspaceRegistrationStoreLimitError,
239
+ normalizeWorkspaceDisplayName,
237
240
  workspaceRegistrationId
238
- } from "./chunk-UCTCDLDS.js";
241
+ } from "./chunk-LWQ4IAOJ.js";
239
242
  import {
240
243
  MAX_WORKSPACE_PATH_LENGTH,
241
244
  canonicalizeWorkspace,
@@ -249,7 +252,7 @@ import {
249
252
  QWEN_SERVER_TOKEN_ENV,
250
253
  isChannelWebhookEnqueueError,
251
254
  normalizeWorkerDiagnostic
252
- } from "./chunk-I7RRHHYG.js";
255
+ } from "./chunk-QKTHJXCS.js";
253
256
  import {
254
257
  normalizeServeChannelSelection
255
258
  } from "./chunk-TJTKSVIV.js";
@@ -260,7 +263,7 @@ import "./chunk-5HBA2Z7V.js";
260
263
  import "./chunk-T2NCM2ET.js";
261
264
  import {
262
265
  sanitizeLogText
263
- } from "./chunk-BKNPMEN6.js";
266
+ } from "./chunk-RVLZCXEE.js";
264
267
  import "./chunk-UDXSXLER.js";
265
268
  import {
266
269
  getDialogSettingKeys,
@@ -271,20 +274,23 @@ import {
271
274
  getWritableScopes,
272
275
  loadSettings,
273
276
  validateSettingValue
274
- } from "./chunk-6IITZE7O.js";
277
+ } from "./chunk-5JX5EWR5.js";
275
278
  import "./chunk-RKUWKYED.js";
276
279
  import "./chunk-GOXKNSDZ.js";
277
280
  import "./chunk-IDS7MSUP.js";
278
281
  import {
279
- SUPPORTED_LANGUAGES
280
- } from "./chunk-TKASNYDS.js";
281
- import "./chunk-PR5XQ73G.js";
282
+ SUPPORTED_LANGUAGES,
283
+ detectSystemLanguage,
284
+ resolveLanguageSetting,
285
+ resolveSupportedLanguage
286
+ } from "./chunk-6DHWO5ZF.js";
287
+ import "./chunk-KTNIZG2C.js";
282
288
  import "./chunk-QRUIS3DN.js";
283
- import "./chunk-GLH2NTPB.js";
289
+ import "./chunk-XCHUDLER.js";
284
290
  import "./chunk-VJNBRRZG.js";
285
291
  import {
286
292
  getWorkspaceTrustStatus
287
- } from "./chunk-GMUPIMHF.js";
293
+ } from "./chunk-4RA7PWIY.js";
288
294
  import "./chunk-ALGGS7UH.js";
289
295
  import {
290
296
  isWithinRoot as isWithinRoot2
@@ -298,10 +304,13 @@ import {
298
304
  BuiltinAgentRegistry,
299
305
  Client,
300
306
  ClientMcpRegistrar,
307
+ DEFAULT_LOG_LIMIT,
301
308
  ExtensionManager,
302
309
  GROUP_COLOR_OPTIONS,
310
+ GitWorktreeService,
303
311
  IMAGE_CAPABILITY,
304
312
  InvalidSessionTranscriptCursorError,
313
+ MAX_LOG_LIMIT,
305
314
  ModelsConfig,
306
315
  RUNTIME_MCP_IF_ABSENT_CONFIG_FLAG,
307
316
  SESSION_TRANSCRIPT_MAX_INDEX_BYTES,
@@ -325,13 +334,16 @@ import {
325
334
  buildUsageDashboard,
326
335
  detectLineEnding,
327
336
  encodeTextFileContent,
337
+ fetchGitCommitDetail,
328
338
  fetchGitDiff,
329
339
  fetchGitDiffHunksForFile,
340
+ fetchGitLog,
330
341
  getGitWorkingTreeStatus,
331
342
  glob,
332
343
  loadIgnoreRules,
333
344
  loadUsageHistoryWithLive,
334
345
  parseInstallSource,
346
+ readWorktreeSession,
335
347
  redactUrlCredentials,
336
348
  resolveBranchName,
337
349
  resolveProviderProtocol,
@@ -339,18 +351,20 @@ import {
339
351
  stripAnsiAndControl,
340
352
  stripTerminalControlSequences,
341
353
  watchRepoBranch,
342
- writeWorkspaceContextFile
343
- } from "./chunk-GCY7QTCE.js";
354
+ writeWorkspaceContextFile,
355
+ writeWorktreeSession,
356
+ writeWorktreeSessionMarker
357
+ } from "./chunk-NO6XTCYT.js";
344
358
  import "./chunk-5M6IDOMF.js";
345
359
  import "./chunk-T4TZQJ7W.js";
346
360
  import "./chunk-H6XPXXMH.js";
347
361
  import {
348
362
  MAX_JOBS,
349
363
  nextDurableFireMs
350
- } from "./chunk-LKR7QQ63.js";
351
- import "./chunk-4XCVGEEX.js";
352
- import "./chunk-XSPFQQRE.js";
353
- import "./chunk-4RPARQ5D.js";
364
+ } from "./chunk-EAUYY7SS.js";
365
+ import "./chunk-FSL5W5TI.js";
366
+ import "./chunk-OONJNQ42.js";
367
+ import "./chunk-D2VIDMVM.js";
354
368
  import "./chunk-E2UVIFI2.js";
355
369
  import {
356
370
  nextFireTime,
@@ -364,7 +378,7 @@ import {
364
378
  readCronTasks,
365
379
  taskHasLegacyCondition,
366
380
  updateCronTasks
367
- } from "./chunk-J2MKYJKZ.js";
381
+ } from "./chunk-EIAK6Q2B.js";
368
382
  import "./chunk-SZRN75WQ.js";
369
383
  import "./chunk-HTO4JFDZ.js";
370
384
  import "./chunk-CPBF7KYF.js";
@@ -372,12 +386,12 @@ import {
372
386
  APPROVAL_MODES,
373
387
  SubagentError,
374
388
  SubagentErrorCode
375
- } from "./chunk-UOA2IHRI.js";
389
+ } from "./chunk-CPCVCKKF.js";
376
390
  import "./chunk-6AM5D4ME.js";
377
- import "./chunk-OSSDHJDU.js";
378
- import "./chunk-SGPFJMRP.js";
379
- import "./chunk-335ECZTA.js";
380
- import "./chunk-JCJPZMJV.js";
391
+ import "./chunk-G45X5TRN.js";
392
+ import "./chunk-PBATSWUQ.js";
393
+ import "./chunk-ZEOZL37W.js";
394
+ import "./chunk-OOCI5VVU.js";
381
395
  import {
382
396
  QwenOAuth2Client,
383
397
  QwenOAuthPollError,
@@ -386,8 +400,8 @@ import {
386
400
  isDeviceAuthorizationSuccess,
387
401
  isDeviceTokenPending,
388
402
  isDeviceTokenSuccess
389
- } from "./chunk-2CCDMJM7.js";
390
- import "./chunk-6ETOSWAO.js";
403
+ } from "./chunk-25Y6JSH2.js";
404
+ import "./chunk-246TW4IX.js";
391
405
  import "./chunk-JESCGQM3.js";
392
406
  import {
393
407
  addDaemonRequestAttribute,
@@ -402,20 +416,20 @@ import {
402
416
  recordDaemonHttpRequest,
403
417
  recordDaemonHttpResponse,
404
418
  withDaemonRequestSpan
405
- } from "./chunk-CPU6I5YV.js";
419
+ } from "./chunk-P64HXIC5.js";
406
420
  import "./chunk-4WKAA4KS.js";
407
421
  import "./chunk-CR3C7WXL.js";
408
422
  import "./chunk-VGC4I5JJ.js";
409
- import "./chunk-LPHGXXZX.js";
410
- import "./chunk-4CA4WUMS.js";
411
- import "./chunk-VAJS2E2D.js";
412
- import "./chunk-WEPXQKGP.js";
413
- import "./chunk-ANRANWVE.js";
423
+ import "./chunk-JD3MKVKL.js";
424
+ import "./chunk-UEY4AYUL.js";
425
+ import "./chunk-BDBMYST4.js";
426
+ import "./chunk-EZVDJFZ7.js";
427
+ import "./chunk-OP4MOGXF.js";
414
428
  import "./chunk-XVNQMZ2I.js";
415
429
  import "./chunk-FEOZBUMT.js";
416
430
  import "./chunk-DJ2GSRLV.js";
417
- import "./chunk-4CHDYDG3.js";
418
- import "./chunk-V4PCIS25.js";
431
+ import "./chunk-6EFTQYW7.js";
432
+ import "./chunk-FZVSFBNW.js";
419
433
  import "./chunk-A4UCTEB5.js";
420
434
  import "./chunk-XWRJCPHC.js";
421
435
  import "./chunk-TYQMGACW.js";
@@ -428,7 +442,7 @@ import {
428
442
  Storage,
429
443
  createDebugLogger,
430
444
  runWithoutDebugLogSession
431
- } from "./chunk-UE5TZ55T.js";
445
+ } from "./chunk-C27BYUX6.js";
432
446
  import "./chunk-75DOP5OR.js";
433
447
  import "./chunk-DMTGGOSA.js";
434
448
  import "./chunk-YQ3U5MUC.js";
@@ -1742,17 +1756,17 @@ var WorkspaceFileSystemImpl = class {
1742
1756
  * for their `sendFsError` serializer.
1743
1757
  */
1744
1758
  recordAndWrap(err, intent, input) {
1745
- const fs3 = wrapAsFsError(err);
1759
+ const fs5 = wrapAsFsError(err);
1746
1760
  this.deps.audit.recordDenied(this.deps.ctx, {
1747
1761
  intent,
1748
1762
  input,
1749
- errorKind: fs3.kind,
1750
- hint: fs3.hint,
1763
+ errorKind: fs5.kind,
1764
+ hint: fs5.hint,
1751
1765
  // Quote the underlying OS / FsError message so audit
1752
1766
  // consumers debugging a production incident can see the
1753
1767
  // actual cause (errno text, byte counts, glob pattern,
1754
1768
  // etc.) rather than just `errorKind` + `hint`.
1755
- message: fs3.message,
1769
+ message: fs5.message,
1756
1770
  // For glob denials (parse_error pattern rejection,
1757
1771
  // catastrophic walk failures) the input IS the pattern
1758
1772
  // already; surfacing it on the dedicated `pattern` field
@@ -1761,7 +1775,7 @@ var WorkspaceFileSystemImpl = class {
1761
1775
  // branching on intent.
1762
1776
  pattern: intent === "glob" ? input : void 0
1763
1777
  });
1764
- return fs3;
1778
+ return fs5;
1765
1779
  }
1766
1780
  };
1767
1781
  var CONTENT_HASH_RE = /^sha256:[0-9a-f]{64}$/;
@@ -2243,7 +2257,7 @@ async function renameWithRetryLocal(src, dest, retries, delayMs) {
2243
2257
  const retryable = code === "EPERM" || code === "EACCES";
2244
2258
  if (!retryable || attempt === retries) throw err;
2245
2259
  await new Promise(
2246
- (resolve5) => setTimeout(resolve5, delayMs * 2 ** attempt)
2260
+ (resolve6) => setTimeout(resolve6, delayMs * 2 ** attempt)
2247
2261
  );
2248
2262
  }
2249
2263
  }
@@ -2498,12 +2512,12 @@ __name(applyReadHeaders, "applyReadHeaders");
2498
2512
  function sendFsError(res, err, route) {
2499
2513
  applyReadHeaders(res);
2500
2514
  if (isFsError(err)) {
2501
- const fs3 = err;
2502
- res.status(fs3.status).json({
2503
- errorKind: fs3.kind,
2504
- error: fs3.message,
2505
- hint: fs3.hint,
2506
- status: fs3.status
2515
+ const fs5 = err;
2516
+ res.status(fs5.status).json({
2517
+ errorKind: fs5.kind,
2518
+ error: fs5.message,
2519
+ hint: fs5.hint,
2520
+ status: fs5.status
2507
2521
  });
2508
2522
  return;
2509
2523
  }
@@ -2605,13 +2619,13 @@ async function handleGetFile(req, res, deps) {
2605
2619
  });
2606
2620
  return;
2607
2621
  }
2608
- const fs3 = factory.forRequest({
2622
+ const fs5 = factory.forRequest({
2609
2623
  originatorClientId: clientId ?? void 0,
2610
2624
  route: ROUTE2
2611
2625
  });
2612
2626
  try {
2613
- const resolved = await fs3.resolve(queryPath, "read");
2614
- const out = await fs3.readText(resolved, { maxBytes, line, limit });
2627
+ const resolved = await fs5.resolve(queryPath, "read");
2628
+ const out = await fs5.readText(resolved, { maxBytes, line, limit });
2615
2629
  const returnedBytes = Buffer.byteLength(out.content, "utf-8");
2616
2630
  applyReadHeaders(res);
2617
2631
  res.status(200).json({
@@ -2665,13 +2679,13 @@ async function handleGetFileBytes(req, res, deps) {
2665
2679
  });
2666
2680
  return;
2667
2681
  }
2668
- const fs3 = factory.forRequest({
2682
+ const fs5 = factory.forRequest({
2669
2683
  originatorClientId: clientId ?? void 0,
2670
2684
  route: ROUTE2
2671
2685
  });
2672
2686
  try {
2673
- const resolved = await fs3.resolve(queryPath, "read");
2674
- const out = await fs3.readBytesWindow(resolved, {
2687
+ const resolved = await fs5.resolve(queryPath, "read");
2688
+ const out = await fs5.readBytesWindow(resolved, {
2675
2689
  offset: offset ?? 0,
2676
2690
  maxBytes: maxBytes ?? DEFAULT_FILE_BYTES_MAX_BYTES
2677
2691
  });
@@ -2699,13 +2713,13 @@ async function handleGetStat(req, res, deps) {
2699
2713
  if (clientId === null) return;
2700
2714
  const queryPath = requireStringQuery(res, req.query["path"], "path", ROUTE2);
2701
2715
  if (queryPath === null) return;
2702
- const fs3 = factory.forRequest({
2716
+ const fs5 = factory.forRequest({
2703
2717
  originatorClientId: clientId ?? void 0,
2704
2718
  route: ROUTE2
2705
2719
  });
2706
2720
  try {
2707
- const resolved = await fs3.resolve(queryPath, "stat");
2708
- const st = await fs3.stat(resolved);
2721
+ const resolved = await fs5.resolve(queryPath, "stat");
2722
+ const st = await fs5.stat(resolved);
2709
2723
  applyReadHeaders(res);
2710
2724
  res.status(200).json({
2711
2725
  kind: "stat",
@@ -2728,13 +2742,13 @@ async function handleGetList(req, res, deps) {
2728
2742
  const queryPath = requireStringQuery(res, req.query["path"], "path", ROUTE2);
2729
2743
  if (queryPath === null) return;
2730
2744
  const includeIgnored = parseBoolFlag(req.query["includeIgnored"]);
2731
- const fs3 = factory.forRequest({
2745
+ const fs5 = factory.forRequest({
2732
2746
  originatorClientId: clientId ?? void 0,
2733
2747
  route: ROUTE2
2734
2748
  });
2735
2749
  try {
2736
- const resolved = await fs3.resolve(queryPath, "list");
2737
- const entries = await fs3.list(resolved, {
2750
+ const resolved = await fs5.resolve(queryPath, "list");
2751
+ const entries = await fs5.list(resolved, {
2738
2752
  includeIgnored,
2739
2753
  maxEntries: MAX_LIST_ENTRIES + 1
2740
2754
  });
@@ -2787,15 +2801,15 @@ async function handleGetGlob(req, res, deps) {
2787
2801
  }
2788
2802
  const cwdRaw = req.query["cwd"];
2789
2803
  const cwdString = typeof cwdRaw === "string" && cwdRaw.length > 0 ? cwdRaw : void 0;
2790
- const fs3 = factory.forRequest({
2804
+ const fs5 = factory.forRequest({
2791
2805
  originatorClientId: clientId ?? void 0,
2792
2806
  route: ROUTE2
2793
2807
  });
2794
2808
  const start = performance.now();
2795
2809
  try {
2796
- const cwdResolved = cwdString ? await fs3.resolve(cwdString, "list") : void 0;
2810
+ const cwdResolved = cwdString ? await fs5.resolve(cwdString, "list") : void 0;
2797
2811
  const cap = maxResults ?? DEFAULT_GLOB_MAX_RESULTS;
2798
- const probe = await fs3.glob(pattern, {
2812
+ const probe = await fs5.glob(pattern, {
2799
2813
  cwd: cwdResolved,
2800
2814
  includeIgnored,
2801
2815
  maxResults: cap + 1
@@ -2857,7 +2871,7 @@ function registerWorkspaceFileReadRoutes(app, deps) {
2857
2871
  }
2858
2872
  __name(registerWorkspaceFileReadRoutes, "registerWorkspaceFileReadRoutes");
2859
2873
  function registerWorkspaceQualifiedFileReadRoutes(app, deps) {
2860
- const resolve5 = /* @__PURE__ */ __name((req, res) => {
2874
+ const resolve6 = /* @__PURE__ */ __name((req, res) => {
2861
2875
  const runtime = resolveWorkspaceRuntimeFromParam(
2862
2876
  deps.workspaceRegistry,
2863
2877
  req,
@@ -2871,23 +2885,23 @@ function registerWorkspaceQualifiedFileReadRoutes(app, deps) {
2871
2885
  return true;
2872
2886
  }, "resolve");
2873
2887
  app.get("/workspaces/:workspace/file", (req, res) => {
2874
- if (!resolve5(req, res)) return;
2888
+ if (!resolve6(req, res)) return;
2875
2889
  void handleGetFile(req, res, deps);
2876
2890
  });
2877
2891
  app.get("/workspaces/:workspace/file/bytes", (req, res) => {
2878
- if (!resolve5(req, res)) return;
2892
+ if (!resolve6(req, res)) return;
2879
2893
  void handleGetFileBytes(req, res, deps);
2880
2894
  });
2881
2895
  app.get("/workspaces/:workspace/stat", (req, res) => {
2882
- if (!resolve5(req, res)) return;
2896
+ if (!resolve6(req, res)) return;
2883
2897
  void handleGetStat(req, res, deps);
2884
2898
  });
2885
2899
  app.get("/workspaces/:workspace/list", (req, res) => {
2886
- if (!resolve5(req, res)) return;
2900
+ if (!resolve6(req, res)) return;
2887
2901
  void handleGetList(req, res, deps);
2888
2902
  });
2889
2903
  app.get("/workspaces/:workspace/glob", (req, res) => {
2890
- if (!resolve5(req, res)) return;
2904
+ if (!resolve6(req, res)) return;
2891
2905
  void handleGetGlob(req, res, deps);
2892
2906
  });
2893
2907
  }
@@ -2969,7 +2983,7 @@ function validateClientId(clientId, deps, res) {
2969
2983
  }
2970
2984
  __name(validateClientId, "validateClientId");
2971
2985
  function createSetupGithubFileOps(factory, route, originatorClientId) {
2972
- const fs3 = factory.forRequest({
2986
+ const fs5 = factory.forRequest({
2973
2987
  route,
2974
2988
  ...originatorClientId ? { originatorClientId } : {}
2975
2989
  });
@@ -2992,14 +3006,14 @@ function createSetupGithubFileOps(factory, route, originatorClientId) {
2992
3006
  ]);
2993
3007
  },
2994
3008
  async writeTextFile(_gitRepoRoot, relativePath, content) {
2995
- const resolved = await fs3.resolve(relativePath, "write");
2996
- const out = await fs3.writeTextOverwrite(resolved, content);
3009
+ const resolved = await fs5.resolve(relativePath, "write");
3010
+ const out = await fs5.writeTextOverwrite(resolved, content);
2997
3011
  return { sizeBytes: out.sizeBytes };
2998
3012
  },
2999
3013
  async readTextFile(_gitRepoRoot, relativePath) {
3000
3014
  try {
3001
- const resolved = await fs3.resolve(relativePath, "read");
3002
- const out = await fs3.readText(resolved);
3015
+ const resolved = await fs5.resolve(relativePath, "read");
3016
+ const out = await fs5.readText(resolved);
3003
3017
  return out.content;
3004
3018
  } catch (error2) {
3005
3019
  if (isFsError(error2) && error2.kind === "path_not_found") {
@@ -8973,7 +8987,7 @@ var AcpDispatcher = class {
8973
8987
  );
8974
8988
  return;
8975
8989
  }
8976
- const fs3 = this.fsFactory.forRequest({
8990
+ const fs5 = this.fsFactory.forRequest({
8977
8991
  originatorClientId: conn.clientId,
8978
8992
  route: `ACP ${method}`
8979
8993
  });
@@ -9025,8 +9039,8 @@ var AcpDispatcher = class {
9025
9039
  );
9026
9040
  return;
9027
9041
  }
9028
- const resolved = await fs3.resolve(p, "read");
9029
- const out = await fs3.readText(resolved, { maxBytes, line, limit });
9042
+ const resolved = await fs5.resolve(p, "read");
9043
+ const out = await fs5.readText(resolved, { maxBytes, line, limit });
9030
9044
  this.replyConn(conn, id, {
9031
9045
  path: p,
9032
9046
  content: out.content,
@@ -9048,7 +9062,7 @@ var AcpDispatcher = class {
9048
9062
  conn.sendConn(error(id, RPC.INVALID_PARAMS, "`path` required"));
9049
9063
  return;
9050
9064
  }
9051
- const fs3 = this.fsFactory.forRequest({
9065
+ const fs5 = this.fsFactory.forRequest({
9052
9066
  originatorClientId: conn.clientId,
9053
9067
  route: `ACP ${method}`
9054
9068
  });
@@ -9084,8 +9098,8 @@ var AcpDispatcher = class {
9084
9098
  );
9085
9099
  return;
9086
9100
  }
9087
- const resolved = await fs3.resolve(p, "read");
9088
- const buf = await fs3.readBytesWindow(resolved, { offset, maxBytes });
9101
+ const resolved = await fs5.resolve(p, "read");
9102
+ const buf = await fs5.readBytesWindow(resolved, { offset, maxBytes });
9089
9103
  this.replyConn(conn, id, { path: p, ...buf });
9090
9104
  return;
9091
9105
  }
@@ -9103,12 +9117,12 @@ var AcpDispatcher = class {
9103
9117
  conn.sendConn(error(id, RPC.INVALID_PARAMS, "`path` required"));
9104
9118
  return;
9105
9119
  }
9106
- const fs3 = this.fsFactory.forRequest({
9120
+ const fs5 = this.fsFactory.forRequest({
9107
9121
  originatorClientId: conn.clientId,
9108
9122
  route: `ACP ${method}`
9109
9123
  });
9110
- const resolved = await fs3.resolve(p, "read");
9111
- const result = await fs3.stat(resolved);
9124
+ const resolved = await fs5.resolve(p, "read");
9125
+ const result = await fs5.stat(resolved);
9112
9126
  this.replyConn(conn, id, { path: p, ...result });
9113
9127
  return;
9114
9128
  }
@@ -9126,13 +9140,13 @@ var AcpDispatcher = class {
9126
9140
  conn.sendConn(error(id, RPC.INVALID_PARAMS, "`path` required"));
9127
9141
  return;
9128
9142
  }
9129
- const fs3 = this.fsFactory.forRequest({
9143
+ const fs5 = this.fsFactory.forRequest({
9130
9144
  originatorClientId: conn.clientId,
9131
9145
  route: `ACP ${method}`
9132
9146
  });
9133
- const resolved = await fs3.resolve(p, "read");
9147
+ const resolved = await fs5.resolve(p, "read");
9134
9148
  const MAX_LIST = 2e3;
9135
- const entries = await fs3.list(resolved, { maxEntries: MAX_LIST + 1 });
9149
+ const entries = await fs5.list(resolved, { maxEntries: MAX_LIST + 1 });
9136
9150
  const truncated = entries.length > MAX_LIST;
9137
9151
  this.replyConn(conn, id, {
9138
9152
  path: p,
@@ -9157,7 +9171,7 @@ var AcpDispatcher = class {
9157
9171
  );
9158
9172
  return;
9159
9173
  }
9160
- const fs3 = this.fsFactory.forRequest({
9174
+ const fs5 = this.fsFactory.forRequest({
9161
9175
  originatorClientId: conn.clientId,
9162
9176
  route: `ACP ${method}`
9163
9177
  });
@@ -9177,7 +9191,7 @@ var AcpDispatcher = class {
9177
9191
  );
9178
9192
  return;
9179
9193
  }
9180
- const matches = await fs3.glob(pattern, {
9194
+ const matches = await fs5.glob(pattern, {
9181
9195
  maxResults: maxResults + 1
9182
9196
  });
9183
9197
  const truncated = matches.length > maxResults;
@@ -9209,11 +9223,11 @@ var AcpDispatcher = class {
9209
9223
  );
9210
9224
  return;
9211
9225
  }
9212
- const fs3 = this.fsFactory.forRequest({
9226
+ const fs5 = this.fsFactory.forRequest({
9213
9227
  originatorClientId: conn.clientId,
9214
9228
  route: `ACP ${method}`
9215
9229
  });
9216
- const resolved = await fs3.resolve(p, "write");
9230
+ const resolved = await fs5.resolve(p, "write");
9217
9231
  if (Buffer.byteLength(params["content"], "utf8") > 10 * 1024 * 1024) {
9218
9232
  if (id !== void 0)
9219
9233
  conn.sendConn(
@@ -9221,7 +9235,7 @@ var AcpDispatcher = class {
9221
9235
  );
9222
9236
  return;
9223
9237
  }
9224
- await fs3.writeTextOverwrite(resolved, params["content"]);
9238
+ await fs5.writeTextOverwrite(resolved, params["content"]);
9225
9239
  this.replyConn(conn, id, { ok: true, path: p });
9226
9240
  return;
9227
9241
  }
@@ -9250,12 +9264,12 @@ var AcpDispatcher = class {
9250
9264
  );
9251
9265
  return;
9252
9266
  }
9253
- const fs3 = this.fsFactory.forRequest({
9267
+ const fs5 = this.fsFactory.forRequest({
9254
9268
  originatorClientId: conn.clientId,
9255
9269
  route: `ACP ${method}`
9256
9270
  });
9257
- const resolved = await fs3.resolve(p, "write");
9258
- const result = await fs3.edit(
9271
+ const resolved = await fs5.resolve(p, "write");
9272
+ const result = await fs5.edit(
9259
9273
  resolved,
9260
9274
  params["oldText"],
9261
9275
  params["newText"]
@@ -10798,9 +10812,9 @@ var SseStream = class {
10798
10812
  return next;
10799
10813
  }
10800
10814
  doWrite(chunk) {
10801
- return new Promise((resolve5, reject) => {
10815
+ return new Promise((resolve6, reject) => {
10802
10816
  if (this.closed || this.res.writableEnded) {
10803
- resolve5();
10817
+ resolve6();
10804
10818
  return;
10805
10819
  }
10806
10820
  let ok;
@@ -10811,7 +10825,7 @@ var SseStream = class {
10811
10825
  return;
10812
10826
  }
10813
10827
  if (ok) {
10814
- resolve5();
10828
+ resolve6();
10815
10829
  return;
10816
10830
  }
10817
10831
  const cleanup = /* @__PURE__ */ __name(() => {
@@ -10821,11 +10835,11 @@ var SseStream = class {
10821
10835
  }, "cleanup");
10822
10836
  const onDrain = /* @__PURE__ */ __name(() => {
10823
10837
  cleanup();
10824
- resolve5();
10838
+ resolve6();
10825
10839
  }, "onDrain");
10826
10840
  const onCloseEv = /* @__PURE__ */ __name(() => {
10827
10841
  cleanup();
10828
- resolve5();
10842
+ resolve6();
10829
10843
  }, "onCloseEv");
10830
10844
  const onErrorEv = /* @__PURE__ */ __name((err) => {
10831
10845
  cleanup();
@@ -10887,14 +10901,14 @@ var WsStream = class {
10887
10901
  send(message, _id) {
10888
10902
  const data = JSON.stringify(message);
10889
10903
  const next = this.writeChain.then(
10890
- () => new Promise((resolve5, reject) => {
10904
+ () => new Promise((resolve6, reject) => {
10891
10905
  if (this._closed) {
10892
- resolve5();
10906
+ resolve6();
10893
10907
  return;
10894
10908
  }
10895
10909
  this.ws.send(data, (err) => {
10896
10910
  if (err) reject(err);
10897
- else resolve5();
10911
+ else resolve6();
10898
10912
  });
10899
10913
  })
10900
10914
  );
@@ -11199,7 +11213,7 @@ var CdpReverseLink = class {
11199
11213
  throw { code: -32e3, message: "CDP tunnel closed" };
11200
11214
  }
11201
11215
  await this.attach();
11202
- return new Promise((resolve5, reject) => {
11216
+ return new Promise((resolve6, reject) => {
11203
11217
  if (this.disposed) {
11204
11218
  reject({ code: -32e3, message: "CDP tunnel closed" });
11205
11219
  return;
@@ -11210,7 +11224,7 @@ var CdpReverseLink = class {
11210
11224
  `CDP command id=${id} method=${method} timed out after ${this.commandTimeoutMs}ms`
11211
11225
  );
11212
11226
  const progressTimer = this.armProgressLog(id, method);
11213
- this.pending.set(id, { resolve: resolve5, reject, timer, progressTimer });
11227
+ this.pending.set(id, { resolve: resolve6, reject, timer, progressTimer });
11214
11228
  try {
11215
11229
  this.log?.(
11216
11230
  `qwen serve: /cdp forwarded command id=${id} method=${method} to extension`
@@ -11237,7 +11251,7 @@ var CdpReverseLink = class {
11237
11251
  if (this.attached) return Promise.resolve({});
11238
11252
  if (this.attachPromise) return this.attachPromise;
11239
11253
  this.attachPromise = new Promise(
11240
- (resolve5, reject) => {
11254
+ (resolve6, reject) => {
11241
11255
  if (this.disposed) {
11242
11256
  reject({ code: -32e3, message: "CDP tunnel closed" });
11243
11257
  return;
@@ -11247,7 +11261,7 @@ var CdpReverseLink = class {
11247
11261
  this.pendingAttach = {
11248
11262
  id,
11249
11263
  pending: {
11250
- resolve: /* @__PURE__ */ __name((result) => resolve5(result ?? {}), "resolve"),
11264
+ resolve: /* @__PURE__ */ __name((result) => resolve6(result ?? {}), "resolve"),
11251
11265
  reject,
11252
11266
  timer
11253
11267
  }
@@ -11815,7 +11829,7 @@ function isAcpChannelUnavailable(err) {
11815
11829
  }
11816
11830
  __name(isAcpChannelUnavailable, "isAcpChannelUnavailable");
11817
11831
  function delay(ms) {
11818
- return new Promise((resolve5) => setTimeout(resolve5, ms));
11832
+ return new Promise((resolve6) => setTimeout(resolve6, ms));
11819
11833
  }
11820
11834
  __name(delay, "delay");
11821
11835
  function buildChromeDevToolsMcpRuntimeConfig(localPort, hostname, env) {
@@ -11940,7 +11954,7 @@ function mountAcpHttp(app, bridge, opts) {
11940
11954
  if (!enabled) return void 0;
11941
11955
  const daemonEnv = opts.daemonEnv ?? process.env;
11942
11956
  const primaryEnv = opts.workspaceRegistry ? runtimeEffectiveEnv(opts.workspaceRegistry.primary, daemonEnv) : daemonEnv;
11943
- const path15 = opts.path ?? "/acp";
11957
+ const path16 = opts.path ?? "/acp";
11944
11958
  const dispatcherRef = {};
11945
11959
  let disposed = false;
11946
11960
  const rejectIfDisposed = /* @__PURE__ */ __name((res) => {
@@ -12102,7 +12116,7 @@ function mountAcpHttp(app, bridge, opts) {
12102
12116
  const primaryMount = {
12103
12117
  primary: true,
12104
12118
  workspaceCwd: opts.boundWorkspace,
12105
- routeLabel: logSafe(path15),
12119
+ routeLabel: logSafe(path16),
12106
12120
  rateLimitScope: opts.workspaceRegistry?.primary.workspaceId ?? "primary",
12107
12121
  registry,
12108
12122
  dispatcher,
@@ -12256,7 +12270,7 @@ function mountAcpHttp(app, bridge, opts) {
12256
12270
  });
12257
12271
  }, "handleAcpPost");
12258
12272
  app.post(
12259
- path15,
12273
+ path16,
12260
12274
  (req, res) => handleAcpPost(primaryMount, req, res)
12261
12275
  );
12262
12276
  const handleAcpGet = /* @__PURE__ */ __name((mount, req, res) => {
@@ -12346,10 +12360,10 @@ function mountAcpHttp(app, bridge, opts) {
12346
12360
  onPumpSettled();
12347
12361
  });
12348
12362
  }, "handleAcpGet");
12349
- app.get(path15, (req, res) => {
12363
+ app.get(path16, (req, res) => {
12350
12364
  handleAcpGet(primaryMount, req, res);
12351
12365
  });
12352
- app.delete(path15, (req, res) => {
12366
+ app.delete(path16, (req, res) => {
12353
12367
  handleAcpDelete(primaryMount, req, res);
12354
12368
  });
12355
12369
  const createSecondaryAcpMount = /* @__PURE__ */ __name((rt) => {
@@ -12541,7 +12555,7 @@ function mountAcpHttp(app, bridge, opts) {
12541
12555
  const isPluralAcpShape = pluralRawSelector !== null;
12542
12556
  const pluralVoiceRawSelector = opts.workspaceVoiceConnection ? pluralWorkspaceRawSelector(rawPath, PLURAL_VOICE_WS_SUFFIX) : null;
12543
12557
  const isPluralVoiceShape = pluralVoiceRawSelector !== null;
12544
- if (rawPath !== path15 && !isCdpPath && !extraRoute && !isPluralAcpShape && !isPluralVoiceShape) {
12558
+ if (rawPath !== path16 && !isCdpPath && !extraRoute && !isPluralAcpShape && !isPluralVoiceShape) {
12545
12559
  logReject(`unknown-path ${logSafe(rawPath)}`);
12546
12560
  socket.destroy();
12547
12561
  return;
@@ -13066,7 +13080,7 @@ function mountAcpHttp(app, bridge, opts) {
13066
13080
  });
13067
13081
  }, "upgradeListener");
13068
13082
  httpServer.on("upgrade", upgradeListener);
13069
- writeStderrLine(`qwen serve: /acp WebSocket transport enabled on ${path15}`);
13083
+ writeStderrLine(`qwen serve: /acp WebSocket transport enabled on ${path16}`);
13070
13084
  }
13071
13085
  __name(setupWebSocket, "setupWebSocket");
13072
13086
  return {
@@ -15105,7 +15119,7 @@ function createFifoTaskQueue(limit) {
15105
15119
  Promise.resolve().then(() => item.task(release)).then(item.resolve, item.reject).finally(release);
15106
15120
  }
15107
15121
  }, "pump");
15108
- const enqueue = /* @__PURE__ */ __name((task, options = {}) => new Promise((resolve5, reject) => {
15122
+ const enqueue = /* @__PURE__ */ __name((task, options = {}) => new Promise((resolve6, reject) => {
15109
15123
  if (options.signal?.aborted) {
15110
15124
  reject(abortReason(options.signal));
15111
15125
  return;
@@ -15114,7 +15128,7 @@ function createFifoTaskQueue(limit) {
15114
15128
  task,
15115
15129
  ...options.signal ? { signal: options.signal } : {},
15116
15130
  ...options.onStart ? { onStart: options.onStart } : {},
15117
- resolve: resolve5,
15131
+ resolve: resolve6,
15118
15132
  reject
15119
15133
  };
15120
15134
  if (options.signal) {
@@ -15156,6 +15170,14 @@ var redactExtensionDisplaySource = /* @__PURE__ */ __name((source) => {
15156
15170
  var EXTENSION_PREPARATION_CONCURRENCY = 2;
15157
15171
  var EXTENSION_REFRESH_TIMEOUT_MS = 3e4;
15158
15172
  var RECONCILE_SLOW_MS = 3e4;
15173
+ var resolveExtensionLocale = /* @__PURE__ */ __name((workspaceDir) => {
15174
+ const configuredLanguage = loadSettings(workspaceDir).merged.general?.language;
15175
+ const requestedLocale = resolveLanguageSetting(configuredLanguage);
15176
+ if (requestedLocale === "auto") {
15177
+ return detectSystemLanguage();
15178
+ }
15179
+ return resolveSupportedLanguage(requestedLocale) ?? requestedLocale;
15180
+ }, "resolveExtensionLocale");
15159
15181
  var EXTENSION_QUEUE_FULL_MESSAGE = "Extension operation queue is full";
15160
15182
  function createExtensionsController(deps) {
15161
15183
  const { boundWorkspace, bridge, workspace } = deps;
@@ -15183,6 +15205,7 @@ function createExtensionsController(deps) {
15183
15205
  }, "acquireOperationSlot");
15184
15206
  const createExtensionManager = /* @__PURE__ */ __name((workspaceDir = boundWorkspace, trustedOverride, interactions) => new ExtensionManager({
15185
15207
  workspaceDir,
15208
+ locale: resolveExtensionLocale(workspaceDir),
15186
15209
  isWorkspaceTrusted: trustedOverride ?? getWorkspaceTrustStatus(loadSettings(workspaceDir).merged, workspaceDir).effective.state === "trusted",
15187
15210
  requestConsent: /* @__PURE__ */ __name(() => Promise.resolve(), "requestConsent"),
15188
15211
  networkPolicy: "public",
@@ -15710,8 +15733,9 @@ function createExtensionsController(deps) {
15710
15733
  })();
15711
15734
  }, "runQueuedExtensionMutation");
15712
15735
  const buildLocalExtensionsStatus = /* @__PURE__ */ __name(async () => {
15736
+ const locale = resolveExtensionLocale(boundWorkspace);
15713
15737
  const now = Date.now();
15714
- if (extensionsStatusCache && extensionsStatusCache.expiresAt > now) {
15738
+ if (extensionsStatusCache?.locale === locale && extensionsStatusCache.expiresAt > now) {
15715
15739
  return extensionsStatusCache.value;
15716
15740
  }
15717
15741
  const extensionManager = createExtensionManager();
@@ -15767,6 +15791,7 @@ function createExtensionsController(deps) {
15767
15791
  extensions: entries
15768
15792
  };
15769
15793
  extensionsStatusCache = {
15794
+ locale,
15770
15795
  expiresAt: Date.now() + 2e3,
15771
15796
  value: status
15772
15797
  };
@@ -15935,7 +15960,7 @@ function registerWorkspaceExtensionRoutes(app, deps) {
15935
15960
  ...interaction,
15936
15961
  id: crypto2.randomUUID()
15937
15962
  };
15938
- return new Promise((resolve5, reject) => {
15963
+ return new Promise((resolve6, reject) => {
15939
15964
  const timeout = setTimeout(() => {
15940
15965
  pendingExtensionInteractions.delete(operationId);
15941
15966
  controller.updateOperation(operationId, {
@@ -15949,7 +15974,7 @@ function registerWorkspaceExtensionRoutes(app, deps) {
15949
15974
  timeout.unref?.();
15950
15975
  pendingExtensionInteractions.set(operationId, {
15951
15976
  interaction: pendingInteraction,
15952
- resolve: resolve5,
15977
+ resolve: resolve6,
15953
15978
  reject,
15954
15979
  timeout
15955
15980
  });
@@ -15994,8 +16019,8 @@ function registerWorkspaceExtensionRoutes(app, deps) {
15994
16019
  const reserveRuntimeReconciliation = /* @__PURE__ */ __name(() => {
15995
16020
  let provideTask;
15996
16021
  const task = new Promise(
15997
- (resolve5) => {
15998
- provideTask = resolve5;
16022
+ (resolve6) => {
16023
+ provideTask = resolve6;
15999
16024
  }
16000
16025
  );
16001
16026
  const queued = runtimeReconciliationQueue.run(async () => {
@@ -16096,9 +16121,9 @@ function registerWorkspaceExtensionRoutes(app, deps) {
16096
16121
  generationPoller.unref();
16097
16122
  app.locals.stopExtensionGenerationReconciler = () => clearInterval(generationPoller);
16098
16123
  }
16099
- const registerFor = /* @__PURE__ */ __name((base, resolve5) => {
16124
+ const registerFor = /* @__PURE__ */ __name((base, resolve6) => {
16100
16125
  app.get(base, async (req, res) => {
16101
- const ctrl = resolve5(req, res, false);
16126
+ const ctrl = resolve6(req, res, false);
16102
16127
  if (!ctrl) return;
16103
16128
  try {
16104
16129
  res.status(200).json(await ctrl.buildLocalExtensionsStatus());
@@ -16107,12 +16132,12 @@ function registerWorkspaceExtensionRoutes(app, deps) {
16107
16132
  }
16108
16133
  });
16109
16134
  app.get(`${base}/operations`, async (req, res) => {
16110
- const ctrl = resolve5(req, res, false);
16135
+ const ctrl = resolve6(req, res, false);
16111
16136
  if (!ctrl) return;
16112
16137
  res.status(200).json({ v: 1, operations: ctrl.getActiveOperations() });
16113
16138
  });
16114
16139
  app.get(`${base}/operations/:operationId`, async (req, res) => {
16115
- const ctrl = resolve5(req, res, false);
16140
+ const ctrl = resolve6(req, res, false);
16116
16141
  if (!ctrl) return;
16117
16142
  try {
16118
16143
  const operationId = req.params["operationId"];
@@ -16156,7 +16181,7 @@ function registerWorkspaceExtensionRoutes(app, deps) {
16156
16181
  `${base}/operations/:operationId/interactions/:interactionId`,
16157
16182
  mutate({ strict: true }),
16158
16183
  async (req, res) => {
16159
- const ctrl = resolve5(req, res, false);
16184
+ const ctrl = resolve6(req, res, false);
16160
16185
  if (!ctrl) return;
16161
16186
  try {
16162
16187
  if (!ctrl.validateExtensionMutationClient(req, res, {
@@ -16225,7 +16250,7 @@ function registerWorkspaceExtensionRoutes(app, deps) {
16225
16250
  }
16226
16251
  );
16227
16252
  app.post(`${base}/install`, mutate({ strict: true }), async (req, res) => {
16228
- const ctrl = resolve5(req, res, true);
16253
+ const ctrl = resolve6(req, res, true);
16229
16254
  if (!ctrl) return;
16230
16255
  try {
16231
16256
  if (!ctrl.validateExtensionMutationClient(req, res, {
@@ -16408,7 +16433,7 @@ function registerWorkspaceExtensionRoutes(app, deps) {
16408
16433
  `${base}/check-updates`,
16409
16434
  mutate({ strict: true }),
16410
16435
  async (req, res) => {
16411
- const ctrl = resolve5(req, res, true);
16436
+ const ctrl = resolve6(req, res, true);
16412
16437
  if (!ctrl) return;
16413
16438
  let timer;
16414
16439
  let releaseOperationSlot;
@@ -16472,7 +16497,7 @@ function registerWorkspaceExtensionRoutes(app, deps) {
16472
16497
  }
16473
16498
  );
16474
16499
  app.post(`${base}/refresh`, mutate({ strict: true }), async (req, res) => {
16475
- const ctrl = resolve5(req, res, true);
16500
+ const ctrl = resolve6(req, res, true);
16476
16501
  if (!ctrl) return;
16477
16502
  try {
16478
16503
  if (!ctrl.validateExtensionMutationClient(req, res, {
@@ -16496,7 +16521,7 @@ function registerWorkspaceExtensionRoutes(app, deps) {
16496
16521
  `${base}/:name/enable`,
16497
16522
  mutate({ strict: true }),
16498
16523
  async (req, res) => {
16499
- const ctrl = resolve5(req, res, true);
16524
+ const ctrl = resolve6(req, res, true);
16500
16525
  if (!ctrl) return;
16501
16526
  try {
16502
16527
  if (!ctrl.validateExtensionMutationClient(req, res, {
@@ -16543,7 +16568,7 @@ function registerWorkspaceExtensionRoutes(app, deps) {
16543
16568
  `${base}/:name/disable`,
16544
16569
  mutate({ strict: true }),
16545
16570
  async (req, res) => {
16546
- const ctrl = resolve5(req, res, true);
16571
+ const ctrl = resolve6(req, res, true);
16547
16572
  if (!ctrl) return;
16548
16573
  try {
16549
16574
  if (!ctrl.validateExtensionMutationClient(req, res, {
@@ -16590,7 +16615,7 @@ function registerWorkspaceExtensionRoutes(app, deps) {
16590
16615
  `${base}/:name/update`,
16591
16616
  mutate({ strict: true }),
16592
16617
  async (req, res) => {
16593
- const ctrl = resolve5(req, res, true);
16618
+ const ctrl = resolve6(req, res, true);
16594
16619
  if (!ctrl) return;
16595
16620
  try {
16596
16621
  if (!ctrl.validateExtensionMutationClient(req, res, {
@@ -16673,7 +16698,7 @@ function registerWorkspaceExtensionRoutes(app, deps) {
16673
16698
  }
16674
16699
  );
16675
16700
  app.delete(`${base}/:name`, mutate({ strict: true }), async (req, res) => {
16676
- const ctrl = resolve5(req, res, true);
16701
+ const ctrl = resolve6(req, res, true);
16677
16702
  if (!ctrl) return;
16678
16703
  try {
16679
16704
  if (!ctrl.validateExtensionMutationClient(req, res, {
@@ -17435,13 +17460,13 @@ async function handlePostFileWrite(req, res, deps) {
17435
17460
  req
17436
17461
  );
17437
17462
  if (originatorClientId === null) return;
17438
- const fs3 = factory.forRequest({
17463
+ const fs5 = factory.forRequest({
17439
17464
  originatorClientId,
17440
17465
  route: ROUTE2
17441
17466
  });
17442
17467
  try {
17443
- const resolved = await fs3.resolve(queryPath, "write");
17444
- const out = await fs3.writeTextAtomic(resolved, content, {
17468
+ const resolved = await fs5.resolve(queryPath, "write");
17469
+ const out = await fs5.writeTextAtomic(resolved, content, {
17445
17470
  mode,
17446
17471
  ...expectedHash ? { expectedHash } : {},
17447
17472
  ...bom !== void 0 ? { bom } : {},
@@ -17494,13 +17519,13 @@ async function handlePostFileEdit(req, res, deps) {
17494
17519
  req
17495
17520
  );
17496
17521
  if (originatorClientId === null) return;
17497
- const fs3 = factory.forRequest({
17522
+ const fs5 = factory.forRequest({
17498
17523
  originatorClientId,
17499
17524
  route: ROUTE2
17500
17525
  });
17501
17526
  try {
17502
- const resolved = await fs3.resolve(queryPath, "edit");
17503
- const out = await fs3.editAtomic(resolved, oldText, newText, {
17527
+ const resolved = await fs5.resolve(queryPath, "edit");
17528
+ const out = await fs5.editAtomic(resolved, oldText, newText, {
17504
17529
  expectedHash
17505
17530
  });
17506
17531
  applyReadHeaders(res);
@@ -17534,7 +17559,7 @@ function registerWorkspaceFileWriteRoutes(app, deps) {
17534
17559
  }
17535
17560
  __name(registerWorkspaceFileWriteRoutes, "registerWorkspaceFileWriteRoutes");
17536
17561
  function registerWorkspaceQualifiedFileWriteRoutes(app, deps) {
17537
- const resolve5 = /* @__PURE__ */ __name((req, res) => {
17562
+ const resolve6 = /* @__PURE__ */ __name((req, res) => {
17538
17563
  const runtime = resolveWorkspaceRuntimeFromParam(
17539
17564
  deps.workspaceRegistry,
17540
17565
  req,
@@ -17552,7 +17577,7 @@ function registerWorkspaceQualifiedFileWriteRoutes(app, deps) {
17552
17577
  "/workspaces/:workspace/file/write",
17553
17578
  deps.mutate({ strict: true }),
17554
17579
  (req, res) => {
17555
- if (!resolve5(req, res)) return;
17580
+ if (!resolve6(req, res)) return;
17556
17581
  void handlePostFileWrite(req, res, deps);
17557
17582
  }
17558
17583
  );
@@ -17560,7 +17585,7 @@ function registerWorkspaceQualifiedFileWriteRoutes(app, deps) {
17560
17585
  "/workspaces/:workspace/file/edit",
17561
17586
  deps.mutate({ strict: true }),
17562
17587
  (req, res) => {
17563
- if (!resolve5(req, res)) return;
17588
+ if (!resolve6(req, res)) return;
17564
17589
  void handlePostFileEdit(req, res, deps);
17565
17590
  }
17566
17591
  );
@@ -18043,8 +18068,8 @@ function decodePathSegment(value) {
18043
18068
  }
18044
18069
  __name(decodePathSegment, "decodePathSegment");
18045
18070
  function matchLegacySessionTelemetryRoute(method, requestPath) {
18046
- const path15 = requestPath.length > 1 && requestPath.endsWith("/") ? requestPath.slice(0, -1) : requestPath;
18047
- const requestSegments = path15.split("/").slice(1);
18071
+ const path16 = requestPath.length > 1 && requestPath.endsWith("/") ? requestPath.slice(0, -1) : requestPath;
18072
+ const requestSegments = path16.split("/").slice(1);
18048
18073
  const prefix = requestSegments[0]?.toLowerCase();
18049
18074
  if (prefix !== "session" && prefix !== "sessions" && prefix !== "permission") {
18050
18075
  return void 0;
@@ -18096,23 +18121,23 @@ __name(setDaemonTelemetryWorkspace, "setDaemonTelemetryWorkspace");
18096
18121
  function resolveDaemonTelemetryRoute(req) {
18097
18122
  const legacyRoute = matchLegacySessionTelemetryRoute(req.method, req.path);
18098
18123
  if (legacyRoute) return legacyRoute;
18099
- const path15 = req.path.replace(/\/$/, "") || "/";
18100
- if (req.method === "GET" && path15 === "/daemon/status") {
18124
+ const path16 = req.path.replace(/\/$/, "") || "/";
18125
+ if (req.method === "GET" && path16 === "/daemon/status") {
18101
18126
  return { route: "GET /daemon/status" };
18102
18127
  }
18103
- if (req.method === "GET" && /^\/workspace\/[^/]+\/sessions$/.test(path15)) {
18128
+ if (req.method === "GET" && /^\/workspace\/[^/]+\/sessions$/.test(path16)) {
18104
18129
  return { route: "GET /workspace/:id/sessions" };
18105
18130
  }
18106
- if (req.method === "GET" && /^\/workspaces\/[^/]+\/sessions$/.test(path15)) {
18131
+ if (req.method === "GET" && /^\/workspaces\/[^/]+\/sessions$/.test(path16)) {
18107
18132
  return { route: "GET /workspace/:id/sessions" };
18108
18133
  }
18109
- if (req.method === "GET" && /^\/workspace\/[^/]+\/session-info$/.test(path15)) {
18134
+ if (req.method === "GET" && /^\/workspace\/[^/]+\/session-info$/.test(path16)) {
18110
18135
  return { route: "GET /workspace/:id/session-info" };
18111
18136
  }
18112
- if (req.method === "GET" && /^\/workspaces\/[^/]+\/session-info$/.test(path15)) {
18137
+ if (req.method === "GET" && /^\/workspaces\/[^/]+\/session-info$/.test(path16)) {
18113
18138
  return { route: "GET /workspace/:id/session-info" };
18114
18139
  }
18115
- const workspaceTranscript = path15.match(
18140
+ const workspaceTranscript = path16.match(
18116
18141
  /^\/workspaces\/[^/]+\/session\/([^/]+)\/transcript$/
18117
18142
  );
18118
18143
  if (workspaceTranscript?.[1] && req.method === "GET") {
@@ -18121,7 +18146,7 @@ function resolveDaemonTelemetryRoute(req) {
18121
18146
  sessionId: decodePathSegment(workspaceTranscript[1])
18122
18147
  };
18123
18148
  }
18124
- const workspaceExport = path15.match(
18149
+ const workspaceExport = path16.match(
18125
18150
  /^\/workspaces\/[^/]+\/session\/([^/]+)\/export$/
18126
18151
  );
18127
18152
  if (workspaceExport?.[1] && req.method === "GET") {
@@ -18130,7 +18155,7 @@ function resolveDaemonTelemetryRoute(req) {
18130
18155
  sessionId: decodePathSegment(workspaceExport[1])
18131
18156
  };
18132
18157
  }
18133
- const workspaceArchivedExport = path15.match(
18158
+ const workspaceArchivedExport = path16.match(
18134
18159
  /^\/workspaces\/[^/]+\/session\/([^/]+)\/archive\/export$/
18135
18160
  );
18136
18161
  if (workspaceArchivedExport?.[1] && req.method === "GET") {
@@ -18140,8 +18165,8 @@ function resolveDaemonTelemetryRoute(req) {
18140
18165
  };
18141
18166
  }
18142
18167
  const pluralWorkspacePrefix = /^\/workspaces\/[^/]+/;
18143
- if (pluralWorkspacePrefix.test(path15)) {
18144
- const suffix = path15.replace(pluralWorkspacePrefix, "/workspace");
18168
+ if (pluralWorkspacePrefix.test(path16)) {
18169
+ const suffix = path16.replace(pluralWorkspacePrefix, "/workspace");
18145
18170
  if (req.method === "GET") {
18146
18171
  if (suffix === "/workspace/mcp" || suffix === "/workspace/skills" || suffix === "/workspace/tools" || suffix === "/workspace/providers" || suffix === "/workspace/env" || suffix === "/workspace/preflight" || suffix === "/workspace/hooks" || suffix === "/workspace/settings" || suffix === "/workspace/voice" || suffix === "/workspace/permissions" || suffix === "/workspace/trust" || suffix === "/workspace/memory" || suffix === "/workspace/agents") {
18147
18172
  return { route: `GET ${suffix}` };
@@ -18200,58 +18225,58 @@ function resolveDaemonTelemetryRoute(req) {
18200
18225
  return { route: "DELETE /workspace/session-groups/:groupId" };
18201
18226
  }
18202
18227
  }
18203
- if (req.method === "POST" && path15 === "/workspace/init") {
18228
+ if (req.method === "POST" && path16 === "/workspace/init") {
18204
18229
  return { route: "POST /workspace/init" };
18205
18230
  }
18206
- if (req.method === "POST" && path15 === "/workspace/setup-github") {
18231
+ if (req.method === "POST" && path16 === "/workspace/setup-github") {
18207
18232
  return { route: "POST /workspace/setup-github" };
18208
18233
  }
18209
- if (req.method === "POST" && path15 === "/workspace/reload") {
18234
+ if (req.method === "POST" && path16 === "/workspace/reload") {
18210
18235
  return { route: "POST /workspace/reload" };
18211
18236
  }
18212
- const mcpRestart = path15.match(/^\/workspace\/mcp\/([^/]+)\/restart$/);
18237
+ const mcpRestart = path16.match(/^\/workspace\/mcp\/([^/]+)\/restart$/);
18213
18238
  if (mcpRestart?.[1] && req.method === "POST") {
18214
18239
  return { route: "POST /workspace/mcp/:server/restart" };
18215
18240
  }
18216
- if (req.method === "POST" && path15 === "/workspace/mcp/servers") {
18241
+ if (req.method === "POST" && path16 === "/workspace/mcp/servers") {
18217
18242
  return { route: "POST /workspace/mcp/servers" };
18218
18243
  }
18219
- const mcpDelete = path15.match(/^\/workspace\/mcp\/servers\/([^/]+)$/);
18244
+ const mcpDelete = path16.match(/^\/workspace\/mcp\/servers\/([^/]+)$/);
18220
18245
  if (mcpDelete?.[1] && req.method === "DELETE") {
18221
18246
  return { route: "DELETE /workspace/mcp/servers/:name" };
18222
18247
  }
18223
- if (req.method === "POST" && path15 === "/workspace/auth/device-flow") {
18248
+ if (req.method === "POST" && path16 === "/workspace/auth/device-flow") {
18224
18249
  return { route: "POST /workspace/auth/device-flow" };
18225
18250
  }
18226
- const deviceFlowDelete = path15.match(
18251
+ const deviceFlowDelete = path16.match(
18227
18252
  /^\/workspace\/auth\/device-flow\/([^/]+)$/
18228
18253
  );
18229
18254
  if (deviceFlowDelete?.[1] && req.method === "DELETE") {
18230
18255
  return { route: "DELETE /workspace/auth/device-flow/:id" };
18231
18256
  }
18232
- const toolEnable = path15.match(/^\/workspace\/tools\/([^/]+)\/enable$/);
18257
+ const toolEnable = path16.match(/^\/workspace\/tools\/([^/]+)\/enable$/);
18233
18258
  if (toolEnable?.[1] && req.method === "POST") {
18234
18259
  return { route: "POST /workspace/tools/:name/enable" };
18235
18260
  }
18236
- if (path15 === "/workspace/settings") {
18261
+ if (path16 === "/workspace/settings") {
18237
18262
  if (req.method === "GET") return { route: "GET /workspace/settings" };
18238
18263
  if (req.method === "POST") return { route: "POST /workspace/settings" };
18239
18264
  }
18240
- if (path15 === "/workspace/permissions") {
18265
+ if (path16 === "/workspace/permissions") {
18241
18266
  if (req.method === "GET") return { route: "GET /workspace/permissions" };
18242
18267
  if (req.method === "POST") return { route: "POST /workspace/permissions" };
18243
18268
  }
18244
- if (path15 === "/workspace/trust") {
18269
+ if (path16 === "/workspace/trust") {
18245
18270
  if (req.method === "GET") return { route: "GET /workspace/trust" };
18246
18271
  }
18247
- if (req.method === "POST" && path15 === "/workspace/trust/request") {
18272
+ if (req.method === "POST" && path16 === "/workspace/trust/request") {
18248
18273
  return { route: "POST /workspace/trust/request" };
18249
18274
  }
18250
- if (path15 === "/workspace/voice") {
18275
+ if (path16 === "/workspace/voice") {
18251
18276
  if (req.method === "GET") return { route: "GET /workspace/voice" };
18252
18277
  if (req.method === "POST") return { route: "POST /workspace/voice" };
18253
18278
  }
18254
- if (req.method === "POST" && path15 === "/workspace/voice/transcribe") {
18279
+ if (req.method === "POST" && path16 === "/workspace/voice/transcribe") {
18255
18280
  return { route: "POST /workspace/voice/transcribe" };
18256
18281
  }
18257
18282
  return void 0;
@@ -18305,7 +18330,7 @@ function daemonTelemetryMiddleware(resolveWorkspaceCwd, recordRequest) {
18305
18330
  deferredRuntimePath: deferredRuntime.path
18306
18331
  } : {}
18307
18332
  },
18308
- async (span) => await new Promise((resolve5, reject) => {
18333
+ async (span) => await new Promise((resolve6, reject) => {
18309
18334
  let done = false;
18310
18335
  const finish = /* @__PURE__ */ __name(() => {
18311
18336
  if (done) return;
@@ -18335,7 +18360,7 @@ function daemonTelemetryMiddleware(resolveWorkspaceCwd, recordRequest) {
18335
18360
  if (!successfulSse && route.route !== "GET /daemon/status" && route.route !== "POST /session/:id/heartbeat") {
18336
18361
  recordRequest?.(durationMs, res.statusCode);
18337
18362
  }
18338
- resolve5();
18363
+ resolve6();
18339
18364
  }, "finish");
18340
18365
  res.once("finish", finish);
18341
18366
  res.once("close", finish);
@@ -18510,6 +18535,7 @@ __name(registerPermissionRoutes, "registerPermissionRoutes");
18510
18535
  // packages/cli/src/serve/routes/session.ts
18511
18536
  init_esbuild_shims();
18512
18537
  import * as crypto3 from "node:crypto";
18538
+ import * as fs3 from "node:fs";
18513
18539
  import * as path11 from "node:path";
18514
18540
 
18515
18541
  // packages/cli/src/serve/server/prompt-deadline.ts
@@ -18634,6 +18660,25 @@ function encodeMetadataSessionCursor(last, filter, archiveState) {
18634
18660
  ).toString("base64url");
18635
18661
  }
18636
18662
  __name(encodeMetadataSessionCursor, "encodeMetadataSessionCursor");
18663
+ async function enrichWorktreeSidecars(bySessionId, sessionService, archiveState = "active") {
18664
+ for (const [sessionId, summary] of bySessionId) {
18665
+ if (summary.worktree) continue;
18666
+ const sidecar = await readWorktreeSession(
18667
+ sessionService.getWorktreeSessionPathForArchiveState(
18668
+ sessionId,
18669
+ archiveState
18670
+ )
18671
+ ).catch(() => null);
18672
+ if (sidecar) {
18673
+ summary.worktree = {
18674
+ slug: sidecar.slug,
18675
+ path: sidecar.worktreePath,
18676
+ branch: sidecar.worktreeBranch
18677
+ };
18678
+ }
18679
+ }
18680
+ }
18681
+ __name(enrichWorktreeSidecars, "enrichWorktreeSidecars");
18637
18682
  function toSummary2(item) {
18638
18683
  return {
18639
18684
  sessionId: item.sessionId,
@@ -18779,6 +18824,7 @@ async function listOrganizedWorkspaceSessionsForResponse(bridge, workspaceCwd, o
18779
18824
  applyOrganization(session, snapshot.sessions.get(session.sessionId))
18780
18825
  );
18781
18826
  }
18827
+ await enrichWorktreeSidecars(bySessionId, sessionService, archiveState);
18782
18828
  if (readOptions.mergeLive !== false && archiveState !== "archived" && isFirstPage) {
18783
18829
  try {
18784
18830
  const liveSessions = bridge.listWorkspaceSessions(workspaceCwd);
@@ -18864,6 +18910,7 @@ async function listWorkspaceSessionsByMetadataForResponse(bridge, workspaceCwd,
18864
18910
  for (const session of persisted.sessions) {
18865
18911
  bySessionId.set(session.sessionId, session);
18866
18912
  }
18913
+ await enrichWorktreeSidecars(bySessionId, sessionService, archiveState);
18867
18914
  let liveMergeFailed = false;
18868
18915
  if (readOptions.mergeLive !== false && archiveState !== "archived") {
18869
18916
  try {
@@ -18966,6 +19013,7 @@ async function listWorkspaceSessionsForResponse(bridge, workspaceCwd, options, r
18966
19013
  for (const item of persisted.items) {
18967
19014
  bySessionId.set(item.sessionId, toSummary2(item));
18968
19015
  }
19016
+ await enrichWorktreeSidecars(bySessionId, sessionService, archiveState);
18969
19017
  if (archiveState === "archived" || readOptions.mergeLive === false) {
18970
19018
  const sessions2 = [...bySessionId.values()];
18971
19019
  const nextCursor2 = persisted.nextCursor != null ? String(persisted.nextCursor) : void 0;
@@ -19137,7 +19185,7 @@ function writeGenerationSseChunk(res, chunk) {
19137
19185
  if (writable) {
19138
19186
  return res.destroyed ? Promise.reject(new Error("Generation SSE connection destroyed")) : Promise.resolve();
19139
19187
  }
19140
- return new Promise((resolve5, reject) => {
19188
+ return new Promise((resolve6, reject) => {
19141
19189
  const cleanup = /* @__PURE__ */ __name(() => {
19142
19190
  res.off("drain", onDrain);
19143
19191
  res.off("close", onClose);
@@ -19145,7 +19193,7 @@ function writeGenerationSseChunk(res, chunk) {
19145
19193
  }, "cleanup");
19146
19194
  const onDrain = /* @__PURE__ */ __name(() => {
19147
19195
  cleanup();
19148
- resolve5();
19196
+ resolve6();
19149
19197
  }, "onDrain");
19150
19198
  const onClose = /* @__PURE__ */ __name(() => {
19151
19199
  cleanup();
@@ -19915,6 +19963,68 @@ function registerSessionRoutes(app, deps) {
19915
19963
  }
19916
19964
  const clientId = parseClientIdHeader(req, res);
19917
19965
  if (clientId === null) return;
19966
+ let worktreeMeta;
19967
+ const rawWorktree = body["worktree"];
19968
+ if (rawWorktree !== void 0 && rawWorktree !== null) {
19969
+ if (typeof rawWorktree !== "object" || Array.isArray(rawWorktree)) {
19970
+ res.status(400).json({
19971
+ error: '`worktree` must be an object (e.g. `{}` or `{"slug":"my-task"}`)',
19972
+ code: "invalid_worktree"
19973
+ });
19974
+ return;
19975
+ }
19976
+ const wtReq = rawWorktree;
19977
+ let wtService;
19978
+ try {
19979
+ wtService = new GitWorktreeService(workspaceCwd);
19980
+ } catch {
19981
+ res.status(500).json({
19982
+ error: "Failed to initialize worktree service",
19983
+ code: "worktree_init_failed"
19984
+ });
19985
+ return;
19986
+ }
19987
+ if (!await wtService.isGitRepository()) {
19988
+ res.status(400).json({
19989
+ error: "Worktree isolation requires a git repository",
19990
+ code: "worktree_not_git_repo"
19991
+ });
19992
+ return;
19993
+ }
19994
+ const rawSlug = wtReq["slug"];
19995
+ let slug;
19996
+ if (rawSlug === void 0 || rawSlug === null) {
19997
+ slug = GitWorktreeService.generateAutoSlug();
19998
+ } else if (typeof rawSlug !== "string" || rawSlug.length === 0) {
19999
+ res.status(400).json({
20000
+ error: "`worktree.slug` must be a non-empty string when provided",
20001
+ code: "worktree_invalid_slug"
20002
+ });
20003
+ return;
20004
+ } else {
20005
+ slug = rawSlug;
20006
+ }
20007
+ const slugError = GitWorktreeService.validateUserWorktreeSlug(slug);
20008
+ if (slugError) {
20009
+ res.status(400).json({ error: slugError, code: "worktree_invalid_slug" });
20010
+ return;
20011
+ }
20012
+ const baseBranch = await wtService.getCurrentBranch().catch(() => void 0);
20013
+ const wtResult = await wtService.createUserWorktree(slug, baseBranch);
20014
+ if (!wtResult.success || !wtResult.worktree) {
20015
+ res.status(500).json({
20016
+ error: wtResult.error ?? "Failed to create worktree",
20017
+ code: "worktree_create_failed"
20018
+ });
20019
+ return;
20020
+ }
20021
+ worktreeMeta = {
20022
+ slug,
20023
+ path: wtResult.worktree.path,
20024
+ branch: wtResult.worktree.branch
20025
+ };
20026
+ sessionScope = "thread";
20027
+ }
19918
20028
  try {
19919
20029
  const session = await runtime.bridge.spawnOrAttach({
19920
20030
  workspaceCwd,
@@ -19923,7 +20033,8 @@ function registerSessionRoutes(app, deps) {
19923
20033
  ...sessionScope !== void 0 ? { sessionScope } : {},
19924
20034
  ...approvalMode !== void 0 ? { approvalMode } : {},
19925
20035
  ...source.sourceType !== void 0 ? { sourceType: source.sourceType } : {},
19926
- ...source.sourceId !== void 0 ? { sourceId: source.sourceId } : {}
20036
+ ...source.sourceId !== void 0 ? { sourceId: source.sourceId } : {},
20037
+ ...worktreeMeta ? { worktree: worktreeMeta } : {}
19927
20038
  });
19928
20039
  if (daemonLog) {
19929
20040
  daemonLog.info(
@@ -19950,6 +20061,10 @@ function registerSessionRoutes(app, deps) {
19950
20061
  await new SessionService(runtime.workspaceCwd).removeSession(
19951
20062
  session.sessionId
19952
20063
  );
20064
+ if (worktreeMeta) {
20065
+ await new GitWorktreeService(workspaceCwd).removeUserWorktree(worktreeMeta.slug, { deleteBranch: true }).catch(() => {
20066
+ });
20067
+ }
19953
20068
  }
19954
20069
  } catch {
19955
20070
  }
@@ -19959,8 +20074,73 @@ function registerSessionRoutes(app, deps) {
19959
20074
  }
19960
20075
  return;
19961
20076
  }
20077
+ if (worktreeMeta) {
20078
+ try {
20079
+ const createAllowedRoots = [
20080
+ path11.join(workspaceCwd, ".qwen", "worktrees")
20081
+ ];
20082
+ let createRepoTop = null;
20083
+ try {
20084
+ createRepoTop = await new GitWorktreeService(
20085
+ workspaceCwd
20086
+ ).getRepoTopLevel();
20087
+ } catch {
20088
+ }
20089
+ if (createRepoTop && createRepoTop !== workspaceCwd) {
20090
+ createAllowedRoots.push(
20091
+ path11.join(createRepoTop, ".qwen", "worktrees")
20092
+ );
20093
+ }
20094
+ await runtime.bridge.changeSessionCwd(session.sessionId, {
20095
+ path: worktreeMeta.path,
20096
+ allowedRoots: createAllowedRoots
20097
+ });
20098
+ await writeWorktreeSessionMarker(
20099
+ worktreeMeta.path,
20100
+ session.sessionId
20101
+ ).catch(() => {
20102
+ });
20103
+ await writeWorktreeSession(
20104
+ new SessionService(workspaceCwd).getWorktreeSessionPath(
20105
+ session.sessionId
20106
+ ),
20107
+ {
20108
+ slug: worktreeMeta.slug,
20109
+ worktreePath: worktreeMeta.path,
20110
+ worktreeBranch: worktreeMeta.branch,
20111
+ originalCwd: workspaceCwd,
20112
+ originalBranch: "",
20113
+ originalHeadCommit: ""
20114
+ }
20115
+ ).catch(() => {
20116
+ });
20117
+ } catch (cdErr) {
20118
+ if (daemonLog) {
20119
+ daemonLog.warn("worktree cd failed, rolling back", {
20120
+ sessionId: session.sessionId,
20121
+ error: cdErr instanceof Error ? cdErr.message : String(cdErr)
20122
+ });
20123
+ }
20124
+ const killed = await runtime.bridge.killSession(session.sessionId, { requireZeroAttaches: true }).catch(() => false);
20125
+ if (killed) {
20126
+ await new SessionService(workspaceCwd).removeSession(session.sessionId).catch(() => {
20127
+ });
20128
+ }
20129
+ await new GitWorktreeService(workspaceCwd).removeUserWorktree(worktreeMeta.slug, { deleteBranch: true }).catch(() => {
20130
+ });
20131
+ res.status(500).json({
20132
+ error: "Failed to relocate session into worktree",
20133
+ code: "worktree_relocate_failed"
20134
+ });
20135
+ return;
20136
+ }
20137
+ }
19962
20138
  res.status(200).json(session);
19963
20139
  } catch (err) {
20140
+ if (worktreeMeta) {
20141
+ await new GitWorktreeService(workspaceCwd).removeUserWorktree(worktreeMeta.slug, { deleteBranch: true }).catch(() => {
20142
+ });
20143
+ }
19964
20144
  sendBridgeError2(res, err, { route: "POST /session" });
19965
20145
  }
19966
20146
  });
@@ -20046,6 +20226,70 @@ function registerSessionRoutes(app, deps) {
20046
20226
  }
20047
20227
  return;
20048
20228
  }
20229
+ if (!session.worktree) {
20230
+ const sidecar = await readWorktreeSession(
20231
+ new SessionService(workspaceCwd).getWorktreeSessionPath(sessionId)
20232
+ ).catch(() => null);
20233
+ if (sidecar) {
20234
+ let realTarget;
20235
+ const candidateRoots = [
20236
+ path11.join(workspaceCwd, ".qwen", "worktrees")
20237
+ ];
20238
+ try {
20239
+ realTarget = fs3.realpathSync(sidecar.worktreePath);
20240
+ let repoTop = null;
20241
+ try {
20242
+ repoTop = await new GitWorktreeService(
20243
+ workspaceCwd
20244
+ ).getRepoTopLevel();
20245
+ } catch {
20246
+ }
20247
+ if (repoTop && repoTop !== workspaceCwd) {
20248
+ candidateRoots.push(path11.join(repoTop, ".qwen", "worktrees"));
20249
+ }
20250
+ const contained = candidateRoots.some((root) => {
20251
+ try {
20252
+ const realRoot = fs3.realpathSync(root);
20253
+ const rel = path11.relative(realRoot, realTarget);
20254
+ return !rel.startsWith("..") && !path11.isAbsolute(rel);
20255
+ } catch {
20256
+ return false;
20257
+ }
20258
+ });
20259
+ if (!contained) {
20260
+ realTarget = void 0;
20261
+ }
20262
+ } catch {
20263
+ realTarget = void 0;
20264
+ }
20265
+ if (!realTarget) {
20266
+ daemonLog?.warn("worktree sidecar path failed containment", {
20267
+ sessionId,
20268
+ path: sidecar.worktreePath
20269
+ });
20270
+ } else {
20271
+ const wt = {
20272
+ slug: sidecar.slug,
20273
+ path: realTarget,
20274
+ branch: sidecar.worktreeBranch
20275
+ };
20276
+ try {
20277
+ await runtime.bridge.changeSessionCwd(sessionId, {
20278
+ path: wt.path,
20279
+ allowedRoots: candidateRoots
20280
+ });
20281
+ runtime.bridge.setSessionWorktree(sessionId, wt);
20282
+ session.worktree = wt;
20283
+ } catch (restoreErr) {
20284
+ daemonLog?.warn("worktree restore failed on load/resume", {
20285
+ sessionId,
20286
+ worktreePath: wt.path,
20287
+ error: restoreErr instanceof Error ? restoreErr.message : String(restoreErr)
20288
+ });
20289
+ }
20290
+ }
20291
+ }
20292
+ }
20049
20293
  res.status(200).json(session);
20050
20294
  } catch (err) {
20051
20295
  sendBridgeError2(res, err, {
@@ -22877,7 +23121,7 @@ async function rehydrateScheduledTaskSessions(deps) {
22877
23121
  }
22878
23122
  __name(rehydrateScheduledTaskSessions, "rehydrateScheduledTaskSessions");
22879
23123
  function withTimeout(p, ms, label) {
22880
- return new Promise((resolve5, reject) => {
23124
+ return new Promise((resolve6, reject) => {
22881
23125
  const timer = setTimeout(() => {
22882
23126
  reject(new Error(`${label} timed out after ${ms}ms`));
22883
23127
  }, ms);
@@ -22885,7 +23129,7 @@ function withTimeout(p, ms, label) {
22885
23129
  p.then(
22886
23130
  (v) => {
22887
23131
  clearTimeout(timer);
22888
- resolve5(v);
23132
+ resolve6(v);
22889
23133
  },
22890
23134
  (e) => {
22891
23135
  clearTimeout(timer);
@@ -22969,7 +23213,7 @@ function registerWorkspaceStatusRoutes(app, deps) {
22969
23213
  const ctx = buildWorkspaceCtx("POST /workspace/acp/preheat");
22970
23214
  const timeoutMsRaw = req.query["timeoutMs"];
22971
23215
  const timeoutMs = typeof timeoutMsRaw === "string" && timeoutMsRaw.trim() ? Number(timeoutMsRaw) : void 0;
22972
- if (timeoutMs !== void 0 && (!Number.isFinite(timeoutMs) || !Number.isInteger(timeoutMs) || timeoutMs <= 0 || timeoutMs > MAX_ACP_PREHEAT_TIMEOUT_MS)) {
23216
+ if (timeoutMsRaw !== void 0 && (timeoutMs === void 0 || !Number.isFinite(timeoutMs) || !Number.isInteger(timeoutMs) || timeoutMs <= 0 || timeoutMs > MAX_ACP_PREHEAT_TIMEOUT_MS)) {
22973
23217
  res.status(400).json({
22974
23218
  error: "`timeoutMs` must be a positive integer no greater than 60000",
22975
23219
  code: "invalid_timeout"
@@ -23303,6 +23547,7 @@ function registerCapabilitiesRoutes(app, deps) {
23303
23547
  workspaces: runtimes.map((runtime) => ({
23304
23548
  id: runtime.workspaceId,
23305
23549
  cwd: runtime.workspaceCwd,
23550
+ ...runtime.displayName !== void 0 ? { displayName: runtime.displayName } : {},
23306
23551
  primary: runtime.primary,
23307
23552
  trusted: runtime.trusted,
23308
23553
  ...runtimeRemoval ? { removable: runtime.removable === true } : {}
@@ -24615,9 +24860,9 @@ function registerSseEventsRoutes(app, deps) {
24615
24860
  let writeChain = Promise.resolve();
24616
24861
  const trackWriterIdle = writerIdleTimeoutMs !== void 0 && writerIdleTimeoutMs > 0;
24617
24862
  let lastWriteAt = trackWriterIdle ? Date.now() : 0;
24618
- const doWrite = /* @__PURE__ */ __name((chunk) => new Promise((resolve5, reject) => {
24863
+ const doWrite = /* @__PURE__ */ __name((chunk) => new Promise((resolve6, reject) => {
24619
24864
  if (res.writableEnded) {
24620
- resolve5();
24865
+ resolve6();
24621
24866
  return;
24622
24867
  }
24623
24868
  let ok;
@@ -24629,19 +24874,19 @@ function registerSseEventsRoutes(app, deps) {
24629
24874
  }
24630
24875
  if (ok) {
24631
24876
  if (trackWriterIdle) lastWriteAt = Date.now();
24632
- resolve5();
24877
+ resolve6();
24633
24878
  return;
24634
24879
  }
24635
24880
  const onDrain = /* @__PURE__ */ __name(() => {
24636
24881
  res.off("close", onClose);
24637
24882
  res.off("error", onError);
24638
24883
  if (trackWriterIdle) lastWriteAt = Date.now();
24639
- resolve5();
24884
+ resolve6();
24640
24885
  }, "onDrain");
24641
24886
  const onClose = /* @__PURE__ */ __name(() => {
24642
24887
  res.off("drain", onDrain);
24643
24888
  res.off("error", onError);
24644
- resolve5();
24889
+ resolve6();
24645
24890
  }, "onClose");
24646
24891
  const onError = /* @__PURE__ */ __name((err) => {
24647
24892
  res.off("drain", onDrain);
@@ -25234,47 +25479,6 @@ function dropNestedWorkspacesPreservingPrimary(workspaces) {
25234
25479
  }
25235
25480
  __name(dropNestedWorkspacesPreservingPrimary, "dropNestedWorkspacesPreservingPrimary");
25236
25481
 
25237
- // packages/cli/src/serve/server/access-log.ts
25238
- init_esbuild_shims();
25239
- var SESSION_ID_RE = /\/session\/([^/]+)/;
25240
- function installAccessLogMiddleware(app, daemonLog) {
25241
- if (!daemonLog) return;
25242
- app.use((req, res, next) => {
25243
- const { method, path: reqPath } = req;
25244
- if (method === "GET" && reqPath === "/health" || method === "POST" && reqPath.endsWith("/heartbeat")) {
25245
- return next();
25246
- }
25247
- const startMs = Date.now();
25248
- res.on("finish", () => {
25249
- try {
25250
- const status = res.statusCode;
25251
- if (method === "GET" && reqPath.endsWith("/events") && status === 200) {
25252
- return;
25253
- }
25254
- const durationMs = Date.now() - startMs;
25255
- const sessionMatch = reqPath.match(SESSION_ID_RE);
25256
- const sessionId = sessionMatch?.[1];
25257
- const clientId = req.headers["x-qwen-client-id"];
25258
- const ctx = {
25259
- route: `${method} ${reqPath}`,
25260
- ...sessionId ? { sessionId } : {},
25261
- ...clientId ? { clientId } : {},
25262
- status,
25263
- durationMs
25264
- };
25265
- if (status >= 400) {
25266
- daemonLog.warn("request completed", ctx);
25267
- } else {
25268
- daemonLog.info("request completed", ctx);
25269
- }
25270
- } catch {
25271
- }
25272
- });
25273
- next();
25274
- });
25275
- }
25276
- __name(installAccessLogMiddleware, "installAccessLogMiddleware");
25277
-
25278
25482
  // packages/cli/src/serve/server/device-flow-registry.ts
25279
25483
  init_esbuild_shims();
25280
25484
 
@@ -25576,10 +25780,10 @@ function installRateLimiter(app, opts, daemonLog, options = {}) {
25576
25780
  { tier, key: key.slice(0, 64) }
25577
25781
  );
25578
25782
  } : void 0,
25579
- onError: daemonLog ? (err, path15) => {
25783
+ onError: daemonLog ? (err, path16) => {
25580
25784
  daemonLog.warn(
25581
25785
  `rate limiter error (fail-open): ${err instanceof Error ? err.message : String(err)}`,
25582
- { path: path15 }
25786
+ { path: path16 }
25583
25787
  );
25584
25788
  } : void 0
25585
25789
  });
@@ -25758,8 +25962,8 @@ __name(registerWorkspaceQualifiedLifecycleRoutes, "registerWorkspaceQualifiedLif
25758
25962
  // packages/cli/src/serve/routes/workspace-management.ts
25759
25963
  init_esbuild_shims();
25760
25964
  import { readdir, stat } from "node:fs/promises";
25761
- import { realpathSync } from "node:fs";
25762
- import { basename as basename4, dirname as dirname4, isAbsolute as isAbsolute7, join as join7, resolve as resolve4, sep as sep3 } from "node:path";
25965
+ import { realpathSync as realpathSync2 } from "node:fs";
25966
+ import { basename as basename4, dirname as dirname4, isAbsolute as isAbsolute7, join as join8, resolve as resolve4, sep as sep3 } from "node:path";
25763
25967
  var MAX_PATH_SUGGESTIONS = 50;
25764
25968
  function registerWorkspaceManagementRoutes(app, deps) {
25765
25969
  const {
@@ -25790,6 +25994,31 @@ function registerWorkspaceManagementRoutes(app, deps) {
25790
25994
  code: "daemon_shutting_down"
25791
25995
  });
25792
25996
  }, "sendSealed");
25997
+ const attachRegistrationIds = /* @__PURE__ */ __name((runtime, registrationIds) => {
25998
+ runtime.registrationIds ??= [];
25999
+ for (const registrationId of registrationIds) {
26000
+ if (!runtime.registrationIds.includes(registrationId)) {
26001
+ runtime.registrationIds.push(registrationId);
26002
+ }
26003
+ }
26004
+ }, "attachRegistrationIds");
26005
+ const restorePersistedDisplayName = /* @__PURE__ */ __name(async (runtime, canonical) => {
26006
+ const snapshot = await workspaceRegistrationStore.read();
26007
+ const storedWorkspace = snapshot.workspaces.find(
26008
+ (stored) => process.platform === "win32" ? stored.toLowerCase() === canonical.toLowerCase() : stored === canonical
26009
+ );
26010
+ const storedDisplayName = storedWorkspace ? snapshot.displayNames?.[workspaceRegistrationId(storedWorkspace)] : void 0;
26011
+ if (storedWorkspace) {
26012
+ attachRegistrationIds(runtime, [
26013
+ workspaceRegistrationId(storedWorkspace)
26014
+ ]);
26015
+ }
26016
+ if (storedDisplayName === void 0) {
26017
+ delete runtime.displayName;
26018
+ } else {
26019
+ runtime.displayName = storedDisplayName;
26020
+ }
26021
+ }, "restorePersistedDisplayName");
25793
26022
  app.get(
25794
26023
  "/workspace-path-suggestions",
25795
26024
  async (req, res) => {
@@ -25817,7 +26046,7 @@ function registerWorkspaceManagementRoutes(app, deps) {
25817
26046
  return;
25818
26047
  }
25819
26048
  const endsWithSep = prefix.endsWith("/") || process.platform === "win32" && prefix.endsWith("\\");
25820
- const dir = endsWithSep ? join7(prefix, ".") : dirname4(prefix);
26049
+ const dir = endsWithSep ? join8(prefix, ".") : dirname4(prefix);
25821
26050
  const filter = endsWithSep ? "" : basename4(prefix);
25822
26051
  const filterLower = filter.toLowerCase();
25823
26052
  const suggestions = [];
@@ -25833,7 +26062,7 @@ function registerWorkspaceManagementRoutes(app, deps) {
25833
26062
  let isDir = entry.isDirectory();
25834
26063
  if (!isDir && entry.isSymbolicLink()) {
25835
26064
  try {
25836
- isDir = (await stat(join7(dir, entry.name))).isDirectory();
26065
+ isDir = (await stat(join8(dir, entry.name))).isDirectory();
25837
26066
  } catch {
25838
26067
  continue;
25839
26068
  }
@@ -25843,7 +26072,7 @@ function registerWorkspaceManagementRoutes(app, deps) {
25843
26072
  truncated = true;
25844
26073
  break;
25845
26074
  }
25846
- suggestions.push({ name: entry.name, path: join7(dir, entry.name) });
26075
+ suggestions.push({ name: entry.name, path: join8(dir, entry.name) });
25847
26076
  }
25848
26077
  } catch {
25849
26078
  }
@@ -25863,6 +26092,20 @@ function registerWorkspaceManagementRoutes(app, deps) {
25863
26092
  const body = safeBody2(req);
25864
26093
  const cwd = body["cwd"];
25865
26094
  const persist = body["persist"] ?? false;
26095
+ const hasDisplayName = Object.hasOwn(body, "displayName");
26096
+ let displayName;
26097
+ if (hasDisplayName) {
26098
+ try {
26099
+ displayName = normalizeWorkspaceDisplayName(body["displayName"]);
26100
+ } catch (err) {
26101
+ if (!(err instanceof WorkspaceDisplayNameValidationError)) throw err;
26102
+ res.status(400).json({
26103
+ error: err.message,
26104
+ code: "invalid_display_name"
26105
+ });
26106
+ return;
26107
+ }
26108
+ }
25866
26109
  if (typeof cwd !== "string" || cwd.trim().length === 0) {
25867
26110
  res.status(400).json({
25868
26111
  error: "`cwd` must be a non-empty string",
@@ -25907,7 +26150,7 @@ function registerWorkspaceManagementRoutes(app, deps) {
25907
26150
  }
25908
26151
  let canonical;
25909
26152
  try {
25910
- canonical = realpathSync.native(resolve4(cwd));
26153
+ canonical = realpathSync2.native(resolve4(cwd));
25911
26154
  } catch {
25912
26155
  res.status(400).json({
25913
26156
  error: "Path does not exist or is not accessible",
@@ -25982,11 +26225,12 @@ function registerWorkspaceManagementRoutes(app, deps) {
25982
26225
  operationStarted();
25983
26226
  try {
25984
26227
  const snapshot = await workspaceRegistrationStore.read();
25985
- const alreadyPersisted = snapshot.workspaces.some(
26228
+ const persistedWorkspaces = snapshot.workspaces.filter(
25986
26229
  (stored) => existingRuntime.registrationIds?.includes(
25987
26230
  workspaceRegistrationId(stored)
25988
26231
  ) === true || (process.platform === "win32" ? stored.toLowerCase() === canonical.toLowerCase() : stored === canonical)
25989
26232
  );
26233
+ const alreadyPersisted = persistedWorkspaces.length > 0;
25990
26234
  if (!alreadyPersisted && snapshot.workspaces.length >= MAX_REGISTERED_WORKSPACES - 1) {
25991
26235
  res.status(409).json({
25992
26236
  error: "Workspace registration limit reached",
@@ -25994,22 +26238,56 @@ function registerWorkspaceManagementRoutes(app, deps) {
25994
26238
  });
25995
26239
  return;
25996
26240
  }
25997
- if (!alreadyPersisted) {
26241
+ if (alreadyPersisted) {
26242
+ attachRegistrationIds(
26243
+ existingRuntime,
26244
+ persistedWorkspaces.map(workspaceRegistrationId)
26245
+ );
26246
+ const storedDisplayName = persistedWorkspaces.map(
26247
+ (stored) => snapshot.displayNames?.[workspaceRegistrationId(stored)]
26248
+ ).find((name) => name !== void 0);
26249
+ if (storedDisplayName === void 0) {
26250
+ delete existingRuntime.displayName;
26251
+ } else {
26252
+ existingRuntime.displayName = storedDisplayName;
26253
+ }
26254
+ } else {
26255
+ let added = false;
25998
26256
  try {
25999
- await workspaceRegistrationStore.add(canonical);
26257
+ const persistedDisplayName = hasDisplayName ? displayName : existingRuntime.displayName;
26258
+ added = persistedDisplayName === void 0 ? await workspaceRegistrationStore.add(canonical) : await workspaceRegistrationStore.add(
26259
+ canonical,
26260
+ persistedDisplayName
26261
+ );
26000
26262
  } catch (err) {
26001
26263
  if (!(err instanceof WorkspaceRegistrationStoreCommittedError)) {
26002
26264
  throw err;
26003
26265
  }
26266
+ added = true;
26004
26267
  try {
26005
26268
  writeStderrLine(`qwen serve: ${err.message}`);
26006
26269
  } catch {
26007
26270
  }
26008
26271
  }
26272
+ if (added) {
26273
+ attachRegistrationIds(existingRuntime, [
26274
+ workspaceRegistrationId(canonical)
26275
+ ]);
26276
+ }
26277
+ if (added && hasDisplayName) {
26278
+ if (displayName === void 0) {
26279
+ delete existingRuntime.displayName;
26280
+ } else {
26281
+ existingRuntime.displayName = displayName;
26282
+ }
26283
+ } else if (!added) {
26284
+ await restorePersistedDisplayName(existingRuntime, canonical);
26285
+ }
26009
26286
  }
26010
26287
  res.status(200).json({
26011
26288
  id: existingRuntime.workspaceId,
26012
26289
  cwd: existingRuntime.workspaceCwd,
26290
+ ...existingRuntime.displayName !== void 0 ? { displayName: existingRuntime.displayName } : {},
26013
26291
  primary: existingRuntime.primary,
26014
26292
  trusted: existingRuntime.trusted,
26015
26293
  persisted: true
@@ -26082,12 +26360,18 @@ function registerWorkspaceManagementRoutes(app, deps) {
26082
26360
  let persistenceFailed = false;
26083
26361
  try {
26084
26362
  const runtime = await createWorkspaceRuntime(canonical);
26363
+ if (!persist && displayName !== void 0) {
26364
+ runtime.displayName = displayName;
26365
+ }
26085
26366
  let persistedRecordAdded = false;
26086
26367
  try {
26087
26368
  if (persist) {
26088
26369
  try {
26089
26370
  try {
26090
- persistedRecordAdded = await workspaceRegistrationStore.add(canonical);
26371
+ persistedRecordAdded = displayName === void 0 ? await workspaceRegistrationStore.add(canonical) : await workspaceRegistrationStore.add(
26372
+ canonical,
26373
+ displayName
26374
+ );
26091
26375
  } catch (err) {
26092
26376
  if (!(err instanceof WorkspaceRegistrationStoreCommittedError)) {
26093
26377
  throw err;
@@ -26098,6 +26382,16 @@ function registerWorkspaceManagementRoutes(app, deps) {
26098
26382
  } catch {
26099
26383
  }
26100
26384
  }
26385
+ if (persistedRecordAdded) {
26386
+ attachRegistrationIds(runtime, [
26387
+ workspaceRegistrationId(canonical)
26388
+ ]);
26389
+ if (displayName !== void 0) {
26390
+ runtime.displayName = displayName;
26391
+ }
26392
+ } else {
26393
+ await restorePersistedDisplayName(runtime, canonical);
26394
+ }
26101
26395
  } catch (err) {
26102
26396
  persistenceFailed = true;
26103
26397
  throw err;
@@ -26141,6 +26435,7 @@ function registerWorkspaceManagementRoutes(app, deps) {
26141
26435
  res.status(201).json({
26142
26436
  id: runtime.workspaceId,
26143
26437
  cwd: runtime.workspaceCwd,
26438
+ ...runtime.displayName !== void 0 ? { displayName: runtime.displayName } : {},
26144
26439
  primary: runtime.primary,
26145
26440
  trusted: runtime.trusted,
26146
26441
  ...persist ? { persisted: true } : {}
@@ -26208,6 +26503,98 @@ function registerWorkspaceManagementRoutes(app, deps) {
26208
26503
  });
26209
26504
  return void 0;
26210
26505
  }, "resolveManagedRuntime");
26506
+ app.patch(
26507
+ "/workspaces/:workspace",
26508
+ mutate({ strict: true }),
26509
+ async (req, res) => {
26510
+ const body = safeBody2(req);
26511
+ const unsupportedField = Object.keys(body).find(
26512
+ (field) => field !== "displayName"
26513
+ );
26514
+ if (unsupportedField) {
26515
+ res.status(400).json({
26516
+ error: `\`${unsupportedField}\` is not an updatable workspace field`,
26517
+ code: "unsupported_field"
26518
+ });
26519
+ return;
26520
+ }
26521
+ if (!Object.hasOwn(body, "displayName")) {
26522
+ res.status(400).json({
26523
+ error: "No updatable fields provided",
26524
+ code: "empty_patch"
26525
+ });
26526
+ return;
26527
+ }
26528
+ let displayName;
26529
+ try {
26530
+ displayName = body["displayName"] === null ? void 0 : normalizeWorkspaceDisplayName(body["displayName"]);
26531
+ } catch (err) {
26532
+ if (!(err instanceof WorkspaceDisplayNameValidationError)) throw err;
26533
+ res.status(400).json({
26534
+ error: err.message,
26535
+ code: "invalid_display_name"
26536
+ });
26537
+ return;
26538
+ }
26539
+ if (sealed) {
26540
+ sendSealed(res);
26541
+ return;
26542
+ }
26543
+ const runtime = resolveManagedRuntime(req, res);
26544
+ if (!runtime) return;
26545
+ if (inFlight.has(runtime.workspaceCwd)) {
26546
+ res.status(409).json({
26547
+ error: "Workspace registration is in progress",
26548
+ code: "workspace_registration_in_progress"
26549
+ });
26550
+ return;
26551
+ }
26552
+ inFlight.set(runtime.workspaceCwd, "update");
26553
+ operationStarted();
26554
+ try {
26555
+ if (workspaceRegistrationStore && runtime.registrationIds !== void 0 && runtime.registrationIds.length > 0) {
26556
+ try {
26557
+ await workspaceRegistrationStore.setDisplayNameByIds(
26558
+ runtime.registrationIds,
26559
+ displayName
26560
+ );
26561
+ } catch (err) {
26562
+ if (!(err instanceof WorkspaceRegistrationStoreCommittedError)) {
26563
+ throw err;
26564
+ }
26565
+ try {
26566
+ writeStderrLine(`qwen serve: ${err.message}`);
26567
+ } catch {
26568
+ }
26569
+ }
26570
+ }
26571
+ if (displayName === void 0) {
26572
+ delete runtime.displayName;
26573
+ } else {
26574
+ runtime.displayName = displayName;
26575
+ }
26576
+ res.status(200).json({
26577
+ id: runtime.workspaceId,
26578
+ cwd: runtime.workspaceCwd,
26579
+ ...runtime.displayName !== void 0 ? { displayName: runtime.displayName } : {},
26580
+ primary: runtime.primary,
26581
+ trusted: runtime.trusted,
26582
+ ...runtimeRemoval ? { removable: runtime.removable === true } : {}
26583
+ });
26584
+ } catch (err) {
26585
+ writeStderrLine(
26586
+ `qwen serve: failed to persist workspace display name: ${err instanceof Error ? err.message : String(err)}`
26587
+ );
26588
+ res.status(500).json({
26589
+ error: "Failed to persist workspace display name",
26590
+ code: "workspace_registration_store_error"
26591
+ });
26592
+ } finally {
26593
+ inFlight.delete(runtime.workspaceCwd);
26594
+ operationFinished();
26595
+ }
26596
+ }
26597
+ );
26211
26598
  app.delete(
26212
26599
  "/workspaces/:workspace",
26213
26600
  mutate({ strict: true }),
@@ -26443,11 +26830,13 @@ function registerWorkspaceManagementRoutes(app, deps) {
26443
26830
  schemaVersion: snapshot.schemaVersion,
26444
26831
  primaryWorkspace: snapshot.primaryWorkspace,
26445
26832
  entries: snapshot.workspaces.map((cwd) => {
26833
+ const registrationId = workspaceRegistrationId(cwd);
26446
26834
  const runtime = workspaceRegistry.getByWorkspaceCwd(cwd);
26447
26835
  return {
26448
- id: workspaceRegistrationId(cwd),
26836
+ id: registrationId,
26449
26837
  cwd,
26450
- active: runtime !== void 0 || registrationIsActive(workspaceRegistrationId(cwd)),
26838
+ ...snapshot.displayNames?.[registrationId] !== void 0 ? { displayName: snapshot.displayNames[registrationId] } : {},
26839
+ active: runtime !== void 0 || registrationIsActive(registrationId),
26451
26840
  persisted: true
26452
26841
  };
26453
26842
  })
@@ -26505,7 +26894,7 @@ function registerWorkspaceManagementRoutes(app, deps) {
26505
26894
  }
26506
26895
  if (storedCwd) {
26507
26896
  try {
26508
- operationCwd = realpathSync.native(resolve4(storedCwd));
26897
+ operationCwd = realpathSync2.native(resolve4(storedCwd));
26509
26898
  } catch {
26510
26899
  operationCwd = resolve4(storedCwd);
26511
26900
  }
@@ -26545,6 +26934,11 @@ function registerWorkspaceManagementRoutes(app, deps) {
26545
26934
  });
26546
26935
  return;
26547
26936
  }
26937
+ if (runtime?.registrationIds) {
26938
+ runtime.registrationIds = runtime.registrationIds.filter(
26939
+ (id) => id !== registrationId
26940
+ );
26941
+ }
26548
26942
  res.json({
26549
26943
  removed: true,
26550
26944
  active,
@@ -26576,6 +26970,8 @@ __name(registerWorkspaceManagementRoutes, "registerWorkspaceManagementRoutes");
26576
26970
 
26577
26971
  // packages/cli/src/serve/routes/workspace-git.ts
26578
26972
  init_esbuild_shims();
26973
+ import * as fs4 from "node:fs";
26974
+ import * as path15 from "node:path";
26579
26975
  function registerWorkspaceGitRoutes(app, deps) {
26580
26976
  app.get("/workspace/git", async (_req, res) => {
26581
26977
  try {
@@ -26597,10 +26993,43 @@ function registerWorkspaceQualifiedGitRoutes(app, deps) {
26597
26993
  const runtime = resolveTrustedRuntime2(deps.workspaceRegistry, req, res);
26598
26994
  if (!runtime) return;
26599
26995
  const route = "GET /workspaces/:workspace/git";
26996
+ const rawCwd = req.query["cwd"];
26997
+ let gitCwd = runtime.workspaceCwd;
26998
+ if (typeof rawCwd === "string" && rawCwd.length > 0) {
26999
+ try {
27000
+ const resolved = fs4.realpathSync(path15.resolve(rawCwd));
27001
+ const root = fs4.realpathSync(runtime.workspaceCwd);
27002
+ const rel = path15.relative(root, resolved);
27003
+ if (!rel.startsWith("..") && !path15.isAbsolute(rel)) {
27004
+ gitCwd = resolved;
27005
+ }
27006
+ } catch {
27007
+ }
27008
+ }
26600
27009
  try {
26601
- res.status(200).json(
26602
- await deps.gitState.getStatus(runtime.workspaceCwd, runtime.bridge)
26603
- );
27010
+ if (gitCwd !== runtime.workspaceCwd) {
27011
+ const status = await getGitWorkingTreeStatus(gitCwd).catch(() => null);
27012
+ res.status(200).json(
27013
+ status ? {
27014
+ v: 2,
27015
+ workspaceCwd: gitCwd,
27016
+ branch: status.branch ?? null,
27017
+ detached: status.detached,
27018
+ staged: status.staged,
27019
+ unstaged: status.unstaged,
27020
+ untracked: status.untracked,
27021
+ conflicted: status.conflicted,
27022
+ hasUpstream: status.hasUpstream,
27023
+ ahead: status.ahead,
27024
+ behind: status.behind,
27025
+ stashCount: status.stashCount,
27026
+ ...status.operation ? { operation: status.operation } : {},
27027
+ computedAt: Date.now()
27028
+ } : { v: 2, workspaceCwd: gitCwd, branch: null }
27029
+ );
27030
+ } else {
27031
+ res.status(200).json(await deps.gitState.getStatus(gitCwd, runtime.bridge));
27032
+ }
26604
27033
  } catch (err) {
26605
27034
  deps.sendBridgeError(res, err, { route });
26606
27035
  }
@@ -26623,8 +27052,8 @@ function buildDiffList(workspaceCwd, result) {
26623
27052
  hiddenCount: 0
26624
27053
  };
26625
27054
  }
26626
- const files = [...result.perFileStats.entries()].map(([path15, s]) => ({
26627
- path: path15,
27055
+ const files = [...result.perFileStats.entries()].map(([path16, s]) => ({
27056
+ path: path16,
26628
27057
  oldPath: s.oldPath,
26629
27058
  added: s.added,
26630
27059
  removed: s.removed,
@@ -26753,6 +27182,163 @@ function registerWorkspaceQualifiedGitDiffRoutes(app, deps) {
26753
27182
  }
26754
27183
  __name(registerWorkspaceQualifiedGitDiffRoutes, "registerWorkspaceQualifiedGitDiffRoutes");
26755
27184
 
27185
+ // packages/cli/src/serve/routes/workspace-git-log.ts
27186
+ init_esbuild_shims();
27187
+ function buildLogList(workspaceCwd, result) {
27188
+ if (!result) {
27189
+ return {
27190
+ v: 1,
27191
+ workspaceCwd,
27192
+ available: false,
27193
+ entries: [],
27194
+ hasMore: false
27195
+ };
27196
+ }
27197
+ return {
27198
+ v: 1,
27199
+ workspaceCwd,
27200
+ available: true,
27201
+ entries: result.entries.map((e) => ({
27202
+ sha: e.sha,
27203
+ shortSha: e.shortSha,
27204
+ authorName: e.authorName,
27205
+ authorEmail: e.authorEmail,
27206
+ authorDate: e.authorDate,
27207
+ subject: e.subject,
27208
+ ...e.refs ? { refs: e.refs } : {},
27209
+ parents: e.parents
27210
+ })),
27211
+ hasMore: result.hasMore
27212
+ };
27213
+ }
27214
+ __name(buildLogList, "buildLogList");
27215
+ function buildCommitDetail(workspaceCwd, result) {
27216
+ if (!result) {
27217
+ return { v: 1, workspaceCwd, available: false };
27218
+ }
27219
+ return {
27220
+ v: 1,
27221
+ workspaceCwd,
27222
+ available: true,
27223
+ sha: result.sha,
27224
+ shortSha: result.shortSha,
27225
+ authorName: result.authorName,
27226
+ authorEmail: result.authorEmail,
27227
+ authorDate: result.authorDate,
27228
+ subject: result.subject,
27229
+ body: result.body,
27230
+ ...result.refs ? { refs: result.refs } : {},
27231
+ parents: result.parents,
27232
+ files: result.files.map((f) => ({
27233
+ path: f.path,
27234
+ added: f.added,
27235
+ removed: f.removed,
27236
+ isBinary: f.isBinary
27237
+ })),
27238
+ filesCount: result.filesCount,
27239
+ linesAdded: result.linesAdded,
27240
+ linesRemoved: result.linesRemoved,
27241
+ hiddenCount: result.hiddenCount
27242
+ };
27243
+ }
27244
+ __name(buildCommitDetail, "buildCommitDetail");
27245
+ function parsePagination(req) {
27246
+ const rawLimit = req.query["limit"];
27247
+ const rawSkip = req.query["skip"];
27248
+ const parsedLimit = typeof rawLimit === "string" ? parseInt(rawLimit, 10) : NaN;
27249
+ const parsedSkip = typeof rawSkip === "string" ? parseInt(rawSkip, 10) : NaN;
27250
+ const limit = Math.min(
27251
+ Math.max(Number.isNaN(parsedLimit) ? DEFAULT_LOG_LIMIT : parsedLimit, 1),
27252
+ MAX_LOG_LIMIT
27253
+ );
27254
+ const skip = Math.max(Number.isNaN(parsedSkip) ? 0 : parsedSkip, 0);
27255
+ return { limit, skip };
27256
+ }
27257
+ __name(parsePagination, "parsePagination");
27258
+ async function handleLogList(req, res, workspaceCwd, sendBridgeError2, route) {
27259
+ try {
27260
+ applyReadHeaders(res);
27261
+ const { limit, skip } = parsePagination(req);
27262
+ const result = await fetchGitLog(workspaceCwd, { limit, skip });
27263
+ res.status(200).json(buildLogList(workspaceCwd, result));
27264
+ } catch (err) {
27265
+ sendBridgeError2(res, err, { route });
27266
+ }
27267
+ }
27268
+ __name(handleLogList, "handleLogList");
27269
+ async function handleCommitDetail(req, res, workspaceCwd, sendBridgeError2, route) {
27270
+ const sha = req.query["sha"];
27271
+ if (typeof sha !== "string" || sha.length === 0 || !/^[0-9a-f]{7,40}$/i.test(sha)) {
27272
+ applyReadHeaders(res);
27273
+ res.status(400).json({
27274
+ errorKind: "parse_error",
27275
+ error: "sha query parameter is required",
27276
+ status: 400
27277
+ });
27278
+ return;
27279
+ }
27280
+ try {
27281
+ applyReadHeaders(res);
27282
+ const result = await fetchGitCommitDetail(workspaceCwd, sha);
27283
+ res.status(200).json(buildCommitDetail(workspaceCwd, result));
27284
+ } catch (err) {
27285
+ sendBridgeError2(res, err, { route });
27286
+ }
27287
+ }
27288
+ __name(handleCommitDetail, "handleCommitDetail");
27289
+ function registerWorkspaceGitLogRoutes(app, deps) {
27290
+ app.get("/workspace/git/log", (req, res) => {
27291
+ void handleLogList(
27292
+ req,
27293
+ res,
27294
+ deps.boundWorkspace,
27295
+ deps.sendBridgeError,
27296
+ "GET /workspace/git/log"
27297
+ );
27298
+ });
27299
+ app.get("/workspace/git/log/commit", (req, res) => {
27300
+ void handleCommitDetail(
27301
+ req,
27302
+ res,
27303
+ deps.boundWorkspace,
27304
+ deps.sendBridgeError,
27305
+ "GET /workspace/git/log/commit"
27306
+ );
27307
+ });
27308
+ }
27309
+ __name(registerWorkspaceGitLogRoutes, "registerWorkspaceGitLogRoutes");
27310
+ function resolveTrustedRuntime4(registry, req, res) {
27311
+ const runtime = resolveWorkspaceRuntimeFromParam(registry, req, res);
27312
+ if (!runtime) return null;
27313
+ return requireTrustedWorkspaceRuntime(runtime, res) ? runtime : null;
27314
+ }
27315
+ __name(resolveTrustedRuntime4, "resolveTrustedRuntime");
27316
+ function registerWorkspaceQualifiedGitLogRoutes(app, deps) {
27317
+ app.get("/workspaces/:workspace/git/log", (req, res) => {
27318
+ const runtime = resolveTrustedRuntime4(deps.workspaceRegistry, req, res);
27319
+ if (!runtime) return;
27320
+ void handleLogList(
27321
+ req,
27322
+ res,
27323
+ runtime.workspaceCwd,
27324
+ deps.sendBridgeError,
27325
+ "GET /workspaces/:workspace/git/log"
27326
+ );
27327
+ });
27328
+ app.get("/workspaces/:workspace/git/log/commit", (req, res) => {
27329
+ const runtime = resolveTrustedRuntime4(deps.workspaceRegistry, req, res);
27330
+ if (!runtime) return;
27331
+ void handleCommitDetail(
27332
+ req,
27333
+ res,
27334
+ runtime.workspaceCwd,
27335
+ deps.sendBridgeError,
27336
+ "GET /workspaces/:workspace/git/log/commit"
27337
+ );
27338
+ });
27339
+ }
27340
+ __name(registerWorkspaceQualifiedGitLogRoutes, "registerWorkspaceQualifiedGitLogRoutes");
27341
+
26756
27342
  // packages/cli/src/serve/workspace-git-state.ts
26757
27343
  init_esbuild_shims();
26758
27344
  var WorkspaceGitState = class {
@@ -28483,6 +29069,7 @@ function createServeApp(opts, getPort = () => opts.port, deps = {}) {
28483
29069
  maxPendingPromptsPerSession: opts.maxPendingPromptsPerSession,
28484
29070
  eventRingSize: opts.eventRingSize,
28485
29071
  compactedReplayMaxBytes: opts.compactedReplayMaxBytes,
29072
+ initializeTimeoutMs: opts.initializeTimeoutMs,
28486
29073
  permissionResponseTimeoutMs: opts.permissionResponseTimeoutMs,
28487
29074
  boundWorkspace,
28488
29075
  sessionShellCommandEnabled,
@@ -28759,6 +29346,14 @@ function createServeApp(opts, getPort = () => opts.port, deps = {}) {
28759
29346
  workspaceRegistry,
28760
29347
  sendBridgeError: sendBridgeError2
28761
29348
  });
29349
+ registerWorkspaceGitLogRoutes(app, {
29350
+ boundWorkspace: primaryBoundWorkspace,
29351
+ sendBridgeError: sendBridgeError2
29352
+ });
29353
+ registerWorkspaceQualifiedGitLogRoutes(app, {
29354
+ workspaceRegistry,
29355
+ sendBridgeError: sendBridgeError2
29356
+ });
28762
29357
  mountWorkspaceMemoryRoutes(app, {
28763
29358
  bridge: primaryBridge,
28764
29359
  boundWorkspace: primaryBoundWorkspace,