@qwen-code/qwen-code 0.18.5-nightly.20260622.6bc3f853e → 0.18.5-preview.0

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 (165) hide show
  1. package/bundled/qc-helper/SKILL.md +13 -5
  2. package/bundled/qc-helper/docs/configuration/_meta.ts +1 -0
  3. package/bundled/qc-helper/docs/configuration/auth.md +68 -48
  4. package/bundled/qc-helper/docs/configuration/model-providers.md +217 -195
  5. package/bundled/qc-helper/docs/configuration/qwen-ignore.md +31 -15
  6. package/bundled/qc-helper/docs/configuration/settings.md +44 -27
  7. package/bundled/qc-helper/docs/configuration/themes.md +7 -4
  8. package/bundled/qc-helper/docs/extension/extension-releasing.md +1 -1
  9. package/bundled/qc-helper/docs/extension/introduction.md +27 -21
  10. package/bundled/qc-helper/docs/features/arena.md +3 -3
  11. package/bundled/qc-helper/docs/features/channels/overview.md +1 -1
  12. package/bundled/qc-helper/docs/features/channels/plugins.md +1 -1
  13. package/bundled/qc-helper/docs/features/commands.md +6 -1
  14. package/bundled/qc-helper/docs/features/headless.md +1 -1
  15. package/bundled/qc-helper/docs/features/mcp.md +33 -14
  16. package/bundled/qc-helper/docs/features/sandbox.md +2 -2
  17. package/bundled/qc-helper/docs/features/tool-use-summaries.md +1 -1
  18. package/bundled/qc-helper/docs/integration-github-action.md +2 -2
  19. package/bundled/qc-helper/docs/overview.md +1 -1
  20. package/bundled/qc-helper/docs/quickstart.md +9 -5
  21. package/bundled/qc-helper/docs/qwen-serve.md +14 -2
  22. package/bundled/qc-helper/docs/support/tos-privacy.md +1 -1
  23. package/chunks/{agent-WFLPE5MW.js → agent-P4KSTVXX.js} +24 -22
  24. package/chunks/{agent-headless-Q27MG73I.js → agent-headless-QUAPWF55.js} +24 -22
  25. package/chunks/{anthropicContentGenerator-5S4OMMNL.js → anthropicContentGenerator-7352A7I5.js} +12 -11
  26. package/chunks/artifact-tool-5J4HUZAV.js +675 -0
  27. package/chunks/{askUserQuestion-WHVYL2S2.js → askUserQuestion-HF7HCWDD.js} +20 -7
  28. package/chunks/chunk-22IFUCVR.js +291 -0
  29. package/chunks/{chunk-26ZYKTYZ.js → chunk-2BIF2NVV.js} +2 -2
  30. package/chunks/{chunk-VKILGMZQ.js → chunk-2QDQTWCI.js} +1 -1
  31. package/chunks/{chunk-XGU3ETVO.js → chunk-3BR4OIOE.js} +3 -3
  32. package/chunks/{chunk-LTN3VYMZ.js → chunk-3UALQ56H.js} +1 -1
  33. package/chunks/{chunk-QBUR6J4B.js → chunk-BC5POO46.js} +8 -7
  34. package/chunks/{chunk-MSJ2MXJ6.js → chunk-BGUDAULQ.js} +11 -290
  35. package/chunks/{chunk-FH4P6RQA.js → chunk-BNXANYLH.js} +1 -1
  36. package/chunks/{chunk-WE6TNQJU.js → chunk-C4K3FEQ2.js} +36 -0
  37. package/chunks/{chunk-G4BUMVEY.js → chunk-CGEGHF2C.js} +2 -217
  38. package/chunks/chunk-EEEZIVFJ.js +908 -0
  39. package/chunks/{chunk-7Z2O7IBO.js → chunk-EIJYMXXX.js} +619 -135
  40. package/chunks/chunk-EJYJYJZ2.js +3703 -0
  41. package/chunks/{chunk-ATLUHLZE.js → chunk-EW6C27XX.js} +1 -1
  42. package/chunks/{chunk-42HGOMED.js → chunk-F6XNTYNE.js} +216 -1
  43. package/chunks/{chunk-C6MI2ASN.js → chunk-GZCJS5WH.js} +2 -2
  44. package/chunks/{chunk-KGV3F6UF.js → chunk-HGNSRCRB.js} +1 -1
  45. package/chunks/{chunk-CX3SGIPK.js → chunk-KBXLIVWQ.js} +2 -2
  46. package/chunks/{chunk-GOMVJKBL.js → chunk-L7U2RI5O.js} +59 -57
  47. package/chunks/{chunk-GBN55AWZ.js → chunk-NKJ6LRCR.js} +2 -2
  48. package/chunks/{chunk-2O3NAOJG.js → chunk-NWLUISRA.js} +1 -1
  49. package/chunks/{chunk-ID533GA3.js → chunk-OTBK43JR.js} +1 -1
  50. package/chunks/{chunk-AE6RQU6F.js → chunk-PRYMDRBV.js} +1 -1
  51. package/chunks/{chunk-KQIKOTQJ.js → chunk-RYLJU2DY.js} +60 -5
  52. package/chunks/{chunk-CTHZVIMD.js → chunk-T2VDEFUU.js} +2 -2
  53. package/chunks/{chunk-SWGPABMH.js → chunk-T336V435.js} +80 -83
  54. package/chunks/{chunk-LF6BKGZT.js → chunk-TXVGVZYR.js} +3 -3
  55. package/chunks/{chunk-GM3LTU6K.js → chunk-UMRZ7XCR.js} +170 -5015
  56. package/chunks/{chunk-XU7BKR3B.js → chunk-XU5P23GN.js} +3 -3
  57. package/chunks/{chunk-EJ6NFQ2L.js → chunk-ZC675NGC.js} +5 -5
  58. package/chunks/{chunk-CXZV4Q4J.js → chunk-ZXNEOCW2.js} +7118 -5113
  59. package/chunks/{computer-use-F5O56FVW.js → computer-use-4TLHI3UR.js} +24 -22
  60. package/chunks/contextCommand-HFEITKSR.js +56 -0
  61. package/chunks/{cron-create-THNDTYXU.js → cron-create-A5637KCI.js} +12 -9
  62. package/chunks/{cron-delete-BS5H6TFJ.js → cron-delete-AADOSEOZ.js} +4 -4
  63. package/chunks/{cron-list-7OBVHT7K.js → cron-list-OFCPTT2Y.js} +4 -4
  64. package/chunks/{dist-GKRNVFBH.js → dist-ZBX7LPJZ.js} +2 -1
  65. package/chunks/{edit-UV7MBOJU.js → edit-B7H73V6O.js} +24 -22
  66. package/chunks/{en-S3OQBISC.js → en-7OGNWWME.js} +48 -0
  67. package/chunks/{enter-worktree-TSCHZMJ3.js → enter-worktree-GG7ZHYPS.js} +24 -22
  68. package/chunks/{enterPlanMode-LKS7VIUG.js → enterPlanMode-RHTAKG52.js} +27 -23
  69. package/chunks/{exit-worktree-Q6EWFLZU.js → exit-worktree-U7VQZRMG.js} +24 -22
  70. package/chunks/{exitPlanMode-HS6I4D2O.js → exitPlanMode-S35A36II.js} +36 -28
  71. package/chunks/{geminiContentGenerator-GEZ63VSW.js → geminiContentGenerator-W7KVATBA.js} +4 -4
  72. package/chunks/{glob-ZN5LKB7E.js → glob-WOFF7ECI.js} +26 -23
  73. package/chunks/{grep-NIKBBYBU.js → grep-MWNYWYWQ.js} +24 -22
  74. package/chunks/{keychain-token-storage-YHXIWXIB.js → keychain-token-storage-CSYMNRPP.js} +2 -2
  75. package/chunks/{loop-wakeup-SSBWZ64K.js → loop-wakeup-DGSMT4N6.js} +5 -5
  76. package/chunks/{ls-YPFUHZRQ.js → ls-UGRZ4ZOM.js} +6 -6
  77. package/chunks/{lsp-FD6DNVAF.js → lsp-72IJURW3.js} +2 -2
  78. package/chunks/{monitor-A25XKPU5.js → monitor-AYUINLYN.js} +24 -22
  79. package/chunks/{notebook-edit-E72AIOUS.js → notebook-edit-EP4D4WFD.js} +25 -23
  80. package/chunks/{openaiContentGenerator-ZDLZDXLU.js → openaiContentGenerator-SLYYF7AM.js} +12 -15
  81. package/chunks/{qwenContentGenerator-HVJPPMTT.js → qwenContentGenerator-VZ7JYU4A.js} +26 -24
  82. package/chunks/{qwenOAuth2-WZ54YZ4J.js → qwenOAuth2-K4AASPCV.js} +5 -4
  83. package/chunks/{read-file-L6FM3KUX.js → read-file-65EQ53KS.js} +9 -8
  84. package/chunks/{ripGrep-YRJCUISE.js → ripGrep-5XLHJDDM.js} +24 -22
  85. package/chunks/{scheduler-M3742P2I.js → scheduler-5GLJSA2H.js} +73 -27
  86. package/chunks/{send-message-FWFTX62Q.js → send-message-URUZ7PLA.js} +24 -4
  87. package/chunks/{serve-ZIP2GDFY.js → serve-MUROZGCG.js} +618 -92
  88. package/chunks/{shell-T5VSPJLU.js → shell-ET3BQWKB.js} +24 -22
  89. package/chunks/{skill-ETTFYDOV.js → skill-YEYABCAF.js} +11 -10
  90. package/chunks/{src-UKOPSYDK.js → src-POVOI65Y.js} +140 -67
  91. package/chunks/{syntheticOutput-JY5NEDTV.js → syntheticOutput-65FRJGWM.js} +3 -3
  92. package/chunks/{task-create-IGILDV25.js → task-create-IH45HOFT.js} +6 -6
  93. package/chunks/{task-list-KBEJVAAG.js → task-list-FUB6JWSX.js} +5 -5
  94. package/chunks/{task-stop-WFTMQ6AC.js → task-stop-P6IOHQM3.js} +2 -2
  95. package/chunks/{task-update-UIVX7ZEV.js → task-update-RTUT7LJV.js} +6 -6
  96. package/chunks/{team-create-DRKUVGBN.js → team-create-EFZFKQFP.js} +28 -26
  97. package/chunks/{team-delete-LPOXDPVB.js → team-delete-RXGYRMHC.js} +5 -5
  98. package/chunks/{todoWrite-R4RIJKOD.js → todoWrite-O6JK24G6.js} +4 -4
  99. package/chunks/{tool-search-EIIK27ON.js → tool-search-BRJC42TE.js} +9 -8
  100. package/chunks/{web-fetch-JU7SS6KE.js → web-fetch-KUMBROUI.js} +4 -4
  101. package/chunks/{workflow-4RGAYFSJ.js → workflow-UDRBNFTT.js} +557 -97
  102. package/chunks/{write-file-GLQYJFEZ.js → write-file-F7TAHAHF.js} +24 -22
  103. package/chunks/{zh-QXLZV2PX.js → zh-3RMSEO5M.js} +48 -0
  104. package/chunks/{zh-TW-3OKU7LDA.js → zh-TW-R7WRLTJS.js} +48 -0
  105. package/cli.js +8473 -5091
  106. package/locales/en.js +69 -0
  107. package/locales/zh-TW.js +66 -0
  108. package/locales/zh.js +66 -0
  109. package/package.json +3 -2
  110. package/web-shell/assets/{arc-CRFN10gD.js → arc-DHUeMnnj.js} +1 -1
  111. package/web-shell/assets/{architectureDiagram-3BPJPVTR-IRlu1CpH.js → architectureDiagram-3BPJPVTR-DlX12yyj.js} +1 -1
  112. package/web-shell/assets/{blockDiagram-GPEHLZMM-htIZ6iw8.js → blockDiagram-GPEHLZMM-DTFUXMUT.js} +1 -1
  113. package/web-shell/assets/{c4Diagram-AAUBKEIU-A2GoRq3O.js → c4Diagram-AAUBKEIU-CWdB54fk.js} +1 -1
  114. package/web-shell/assets/channel-C3WhMjjP.js +1 -0
  115. package/web-shell/assets/{chunk-2J33WTMH-CdP2AC6u.js → chunk-2J33WTMH-CF5C5jNR.js} +1 -1
  116. package/web-shell/assets/{chunk-4BX2VUAB-DrA07nW2.js → chunk-4BX2VUAB-Cw7Ydfji.js} +1 -1
  117. package/web-shell/assets/{chunk-55IACEB6-CFGnVU2f.js → chunk-55IACEB6-CnbI1ZCw.js} +1 -1
  118. package/web-shell/assets/{chunk-727SXJPM-BTMkq3Tk.js → chunk-727SXJPM-DmSy00Pe.js} +1 -1
  119. package/web-shell/assets/{chunk-AQP2D5EJ-C9sYg04Z.js → chunk-AQP2D5EJ-DgNgXqBu.js} +1 -1
  120. package/web-shell/assets/{chunk-FMBD7UC4-Cag-cj6I.js → chunk-FMBD7UC4-tz2IvOXv.js} +1 -1
  121. package/web-shell/assets/{chunk-ND2GUHAM-CDSTFoR7.js → chunk-ND2GUHAM-DaBLEBPa.js} +1 -1
  122. package/web-shell/assets/{chunk-QZHKN3VN-CN9Z6oOs.js → chunk-QZHKN3VN-DVCQST3O.js} +1 -1
  123. package/web-shell/assets/classDiagram-4FO5ZUOK-CQ6TXPif.js +1 -0
  124. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-CQ6TXPif.js +1 -0
  125. package/web-shell/assets/{cose-bilkent-S5V4N54A-DuN9j8Du.js → cose-bilkent-S5V4N54A-CAKTcdCQ.js} +1 -1
  126. package/web-shell/assets/{dagre-BM42HDAG-ByCWe45f.js → dagre-BM42HDAG-BdkBwlKg.js} +1 -1
  127. package/web-shell/assets/{diagram-2AECGRRQ-eWyU_pKZ.js → diagram-2AECGRRQ-DYt3G65F.js} +1 -1
  128. package/web-shell/assets/{diagram-5GNKFQAL-0Bfu3Fq5.js → diagram-5GNKFQAL-BWvROWjY.js} +1 -1
  129. package/web-shell/assets/{diagram-KO2AKTUF-B6KBKkQP.js → diagram-KO2AKTUF-BvvgwIaQ.js} +1 -1
  130. package/web-shell/assets/{diagram-LMA3HP47-TToDmeA_.js → diagram-LMA3HP47-E7NLSNKg.js} +1 -1
  131. package/web-shell/assets/{diagram-OG6HWLK6-CQCkC2Yx.js → diagram-OG6HWLK6-CYmUBgpE.js} +1 -1
  132. package/web-shell/assets/{erDiagram-TEJ5UH35-Cm9ls1iB.js → erDiagram-TEJ5UH35-BU5gY30h.js} +1 -1
  133. package/web-shell/assets/{flowDiagram-I6XJVG4X-Dyoz80Pv.js → flowDiagram-I6XJVG4X-V_ZssSZ9.js} +1 -1
  134. package/web-shell/assets/{ganttDiagram-6RSMTGT7-Cfut9yaU.js → ganttDiagram-6RSMTGT7-QIShlsdI.js} +1 -1
  135. package/web-shell/assets/{gitGraphDiagram-PVQCEYII-BCuJdlfD.js → gitGraphDiagram-PVQCEYII-DJxdu2YS.js} +1 -1
  136. package/web-shell/assets/index-BPnhI7gl.css +1 -0
  137. package/web-shell/assets/index-De4rqTsW.js +706 -0
  138. package/web-shell/assets/{infoDiagram-5YYISTIA-CXKxF2VL.js → infoDiagram-5YYISTIA-BqjdrFeO.js} +1 -1
  139. package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-DE7HWSU8.js → ishikawaDiagram-YF4QCWOH-BP_a2YZ2.js} +1 -1
  140. package/web-shell/assets/{journeyDiagram-JHISSGLW-D__YUfds.js → journeyDiagram-JHISSGLW-BXg-S3Lk.js} +1 -1
  141. package/web-shell/assets/{kanban-definition-UN3LZRKU-D82R169M.js → kanban-definition-UN3LZRKU-BksAkdEJ.js} +1 -1
  142. package/web-shell/assets/{linear-DpyMbKqT.js → linear-D2m9-ODE.js} +1 -1
  143. package/web-shell/assets/{mermaid.core-D1KEFDhn.js → mermaid.core-dTtkZp2F.js} +5 -5
  144. package/web-shell/assets/{mindmap-definition-RKZ34NQL-BwVUFGFE.js → mindmap-definition-RKZ34NQL-Bft9my8O.js} +1 -1
  145. package/web-shell/assets/{pieDiagram-4H26LBE5-BO_qoEGx.js → pieDiagram-4H26LBE5-Cw8S-alZ.js} +1 -1
  146. package/web-shell/assets/{quadrantDiagram-W4KKPZXB-Cx0ZaWPo.js → quadrantDiagram-W4KKPZXB-DaDoTMts.js} +1 -1
  147. package/web-shell/assets/{requirementDiagram-4Y6WPE33-BJPXejOA.js → requirementDiagram-4Y6WPE33-Cp5kSpwj.js} +1 -1
  148. package/web-shell/assets/{sankeyDiagram-5OEKKPKP-C1xeIL9i.js → sankeyDiagram-5OEKKPKP-CW8RsJJZ.js} +1 -1
  149. package/web-shell/assets/{sequenceDiagram-3UESZ5HK-CSYKQUjf.js → sequenceDiagram-3UESZ5HK-DTfpIiJK.js} +1 -1
  150. package/web-shell/assets/{stateDiagram-AJRCARHV-d9hiHlAW.js → stateDiagram-AJRCARHV-DixFVzEs.js} +1 -1
  151. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-DZgE04s3.js +1 -0
  152. package/web-shell/assets/{timeline-definition-PNZ67QCA-BhCBkq8k.js → timeline-definition-PNZ67QCA-DYsbXn5l.js} +1 -1
  153. package/web-shell/assets/{vennDiagram-CIIHVFJN-DPPFWp_y.js → vennDiagram-CIIHVFJN-HUpRpuUp.js} +1 -1
  154. package/web-shell/assets/{wardley-L42UT6IY-CcOUIgXY.js → wardley-L42UT6IY-cT3nQH_T.js} +1 -1
  155. package/web-shell/assets/{wardleyDiagram-YWT4CUSO-p7oR5X7r.js → wardleyDiagram-YWT4CUSO-Dmm7J6Qc.js} +1 -1
  156. package/web-shell/assets/{xychartDiagram-2RQKCTM6-Dfr7-SEy.js → xychartDiagram-2RQKCTM6-CX0L5p9C.js} +1 -1
  157. package/web-shell/index.html +3 -3
  158. package/chunks/chunk-77WXWU44.js +0 -26
  159. package/chunks/contextCommand-WBVNKL2C.js +0 -54
  160. package/web-shell/assets/channel-WwImfsc7.js +0 -1
  161. package/web-shell/assets/classDiagram-4FO5ZUOK-CJKQYFeJ.js +0 -1
  162. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-CJKQYFeJ.js +0 -1
  163. package/web-shell/assets/index-BDZiTAkl.css +0 -1
  164. package/web-shell/assets/index-DaebdpHq.js +0 -516
  165. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-DgReoybQ.js +0 -1
@@ -55,7 +55,9 @@ import {
55
55
  createIdleWorkspaceProvidersStatus,
56
56
  createIdleWorkspaceSkillsStatus,
57
57
  createLoadedSettingsAdapter,
58
+ formatAcpModelId,
58
59
  formatMemoryUsage,
60
+ getAuthTypeFromEnv,
59
61
  getCliVersion,
60
62
  getDialogSettingKeys,
61
63
  getGitVersion,
@@ -66,19 +68,22 @@ import {
66
68
  isWorkspaceTrusted,
67
69
  loadSettings,
68
70
  mapDomainErrorToErrorKind,
69
- reloadEnvironment
70
- } from "./chunk-7Z2O7IBO.js";
71
+ parseAcpBaseModelId,
72
+ reloadEnvironment,
73
+ resolveCliGenerationConfig,
74
+ sanitizeProviderBaseUrl
75
+ } from "./chunk-EIJYMXXX.js";
76
+ import {
77
+ SUPPORTED_LANGUAGES,
78
+ writeStderrLine,
79
+ writeStdoutLine
80
+ } from "./chunk-ZC675NGC.js";
71
81
  import {
72
82
  ClientSideConnection,
73
83
  PROTOCOL_VERSION,
74
84
  RequestError,
75
85
  ndJsonStream
76
86
  } from "./chunk-UFC57OYT.js";
77
- import {
78
- SUPPORTED_LANGUAGES,
79
- writeStderrLine,
80
- writeStdoutLine
81
- } from "./chunk-EJ6NFQ2L.js";
82
87
  import {
83
88
  ALL_PROVIDERS,
84
89
  APPROVAL_MODES,
@@ -86,6 +91,7 @@ import {
86
91
  BuiltinAgentRegistry,
87
92
  Client,
88
93
  ExtensionManager,
94
+ ModelsConfig,
89
95
  SessionService,
90
96
  ShellExecutionService,
91
97
  StandardFileSystemService,
@@ -114,22 +120,22 @@ import {
114
120
  resolveBundleDir,
115
121
  shouldShowStep,
116
122
  writeWorkspaceContextFile
117
- } from "./chunk-CXZV4Q4J.js";
123
+ } from "./chunk-ZXNEOCW2.js";
118
124
  import "./chunk-K5PGHDBN.js";
119
- import "./chunk-XU7BKR3B.js";
120
- import "./chunk-2O3NAOJG.js";
121
- import "./chunk-XGU3ETVO.js";
125
+ import "./chunk-TXVGVZYR.js";
126
+ import "./chunk-XU5P23GN.js";
127
+ import "./chunk-2BIF2NVV.js";
128
+ import "./chunk-NWLUISRA.js";
129
+ import "./chunk-3BR4OIOE.js";
122
130
  import "./chunk-2MPVVENX.js";
123
131
  import "./chunk-ZTQ26VBE.js";
124
- import "./chunk-C6MI2ASN.js";
125
- import "./chunk-LF6BKGZT.js";
126
- import "./chunk-26ZYKTYZ.js";
132
+ import "./chunk-GZCJS5WH.js";
127
133
  import "./chunk-MLZQVCF3.js";
128
134
  import "./chunk-LD2XBG6Z.js";
129
- import "./chunk-ID533GA3.js";
130
- import "./chunk-KGV3F6UF.js";
131
- import "./chunk-77WXWU44.js";
132
- import "./chunk-AE6RQU6F.js";
135
+ import "./chunk-OTBK43JR.js";
136
+ import "./chunk-HGNSRCRB.js";
137
+ import "./chunk-EEEZIVFJ.js";
138
+ import "./chunk-PRYMDRBV.js";
133
139
  import {
134
140
  DAEMON_TRACEPARENT_META_KEY,
135
141
  DAEMON_TRACESTATE_META_KEY,
@@ -156,19 +162,18 @@ import {
156
162
  recordDaemonPromptQueueWait,
157
163
  recordDaemonSessionLifecycle,
158
164
  registerDaemonGaugeCallbacks,
159
- require_safer,
160
165
  resolveTelemetrySettings,
161
166
  shutdownTelemetry,
162
167
  withDaemonRequestSpan
163
- } from "./chunk-GM3LTU6K.js";
168
+ } from "./chunk-UMRZ7XCR.js";
164
169
  import "./chunk-3PJXIDKI.js";
165
170
  import "./chunk-UWCTAVOD.js";
166
171
  import "./chunk-OFEVLU4C.js";
167
172
  import "./chunk-OMX7CUOE.js";
168
- import "./chunk-FH4P6RQA.js";
169
- import "./chunk-CTHZVIMD.js";
170
- import "./chunk-VKILGMZQ.js";
171
- import "./chunk-GOMVJKBL.js";
173
+ import "./chunk-BNXANYLH.js";
174
+ import "./chunk-T2VDEFUU.js";
175
+ import "./chunk-2QDQTWCI.js";
176
+ import "./chunk-L7U2RI5O.js";
172
177
  import {
173
178
  QwenOAuth2Client,
174
179
  QwenOAuthPollError,
@@ -177,15 +182,20 @@ import {
177
182
  isDeviceAuthorizationSuccess,
178
183
  isDeviceTokenPending,
179
184
  isDeviceTokenSuccess
180
- } from "./chunk-MSJ2MXJ6.js";
181
- import "./chunk-ATLUHLZE.js";
185
+ } from "./chunk-BGUDAULQ.js";
186
+ import "./chunk-EW6C27XX.js";
187
+ import "./chunk-22IFUCVR.js";
182
188
  import "./chunk-64WXLC72.js";
183
- import "./chunk-LTN3VYMZ.js";
189
+ import "./chunk-3UALQ56H.js";
184
190
  import {
185
191
  detectRuntime,
186
- redactProxyCredentials
187
- } from "./chunk-42HGOMED.js";
188
- import "./chunk-G4BUMVEY.js";
192
+ redactProxyCredentials,
193
+ tokenLimit
194
+ } from "./chunk-F6XNTYNE.js";
195
+ import "./chunk-CGEGHF2C.js";
196
+ import {
197
+ require_safer
198
+ } from "./chunk-EJYJYJZ2.js";
189
199
  import "./chunk-55ZMG67I.js";
190
200
  import {
191
201
  import_websocket_server
@@ -194,7 +204,7 @@ import "./chunk-5IFG2VC4.js";
194
204
  import {
195
205
  Storage,
196
206
  updateSymlink
197
- } from "./chunk-WE6TNQJU.js";
207
+ } from "./chunk-C4K3FEQ2.js";
198
208
  import "./chunk-ZERZSAZL.js";
199
209
  import {
200
210
  require_src
@@ -15458,7 +15468,7 @@ import * as path13 from "node:path";
15458
15468
  init_esbuild_shims();
15459
15469
  import { createHash, timingSafeEqual } from "node:crypto";
15460
15470
 
15461
- // packages/cli/src/serve/loopbackBinds.ts
15471
+ // packages/cli/src/serve/loopback-binds.ts
15462
15472
  init_esbuild_shims();
15463
15473
  var LOOPBACK_BINDS = /* @__PURE__ */ new Set([
15464
15474
  "127.0.0.1",
@@ -15642,7 +15652,7 @@ function createMutationGate(deps) {
15642
15652
  }
15643
15653
  __name(createMutationGate, "createMutationGate");
15644
15654
 
15645
- // packages/cli/src/serve/auth/deviceFlow.ts
15655
+ // packages/cli/src/serve/auth/device-flow.ts
15646
15656
  init_esbuild_shims();
15647
15657
  import { randomUUID } from "node:crypto";
15648
15658
  var SANITIZE_FOR_STDERR_RE = new RegExp(
@@ -17214,7 +17224,13 @@ function createSpawnChannelFactory(options = {}) {
17214
17224
  );
17215
17225
  const child = spawn(
17216
17226
  process.execPath,
17217
- [...execArgs, ...memoryArgs, cliEntry, "--acp"],
17227
+ [
17228
+ ...execArgs,
17229
+ ...memoryArgs,
17230
+ cliEntry,
17231
+ "--acp",
17232
+ ...options.extraArgs ?? []
17233
+ ],
17218
17234
  {
17219
17235
  cwd: workspaceCwd,
17220
17236
  stdio: ["pipe", "pipe", "pipe"],
@@ -19083,6 +19099,14 @@ function createAcpSessionBridge(opts) {
19083
19099
  transportClosed
19084
19100
  ]);
19085
19101
  publishModelSwitched(entry, modelId, originatorClientId);
19102
+ broadcastWorkspaceEvent({
19103
+ type: "settings_changed",
19104
+ data: {
19105
+ key: "model.name",
19106
+ value: modelId
19107
+ },
19108
+ ...originatorClientId ? { originatorClientId } : {}
19109
+ });
19086
19110
  succeeded = true;
19087
19111
  } catch (err) {
19088
19112
  entry.events.publish({
@@ -20160,14 +20184,14 @@ function createAcpSessionBridge(opts) {
20160
20184
  const branchDisplayName = typeof rawBranchName === "string" ? rawBranchName : result.newSessionId.slice(0, 8);
20161
20185
  let restored;
20162
20186
  try {
20163
- restored = await restoreSession("resume", {
20187
+ restored = await restoreSession("load", {
20164
20188
  sessionId: result.newSessionId,
20165
20189
  workspaceCwd: boundWorkspace,
20166
20190
  clientId: context?.clientId
20167
20191
  });
20168
20192
  } catch (restoreErr) {
20169
20193
  writeStderrLine2(
20170
- `qwen serve: branchSession resume failed for ${result.newSessionId}, attempting cleanup...`
20194
+ `qwen serve: branchSession load failed for ${result.newSessionId}, attempting cleanup...`
20171
20195
  );
20172
20196
  try {
20173
20197
  await ci.connection.extMethod(
@@ -20193,8 +20217,7 @@ function createAcpSessionBridge(opts) {
20193
20217
  data: eventData,
20194
20218
  ...originatorClientId ? { originatorClientId } : {}
20195
20219
  };
20196
- entry.events.publish(branchEnvelope);
20197
- broadcastWorkspaceEvent(branchEnvelope, sessionId);
20220
+ newEntry?.events.publish(branchEnvelope);
20198
20221
  return {
20199
20222
  ...restored,
20200
20223
  displayName: branchDisplayName,
@@ -20428,6 +20451,12 @@ function createAcpSessionBridge(opts) {
20428
20451
  SERVE_STATUS_EXT_METHODS.sessionTasks
20429
20452
  );
20430
20453
  },
20454
+ async getSessionLspStatus(sessionId) {
20455
+ return requestSessionStatus(
20456
+ sessionId,
20457
+ SERVE_STATUS_EXT_METHODS.sessionLspStatus
20458
+ );
20459
+ },
20431
20460
  async cancelSessionTask(sessionId, taskId, taskKind) {
20432
20461
  return requestSessionStatus(
20433
20462
  sessionId,
@@ -20536,6 +20565,14 @@ function createAcpSessionBridge(opts) {
20536
20565
  transportClosed
20537
20566
  ]);
20538
20567
  publishModelSwitched(entry, req.modelId, originatorClientId);
20568
+ broadcastWorkspaceEvent({
20569
+ type: "settings_changed",
20570
+ data: {
20571
+ key: "model.name",
20572
+ value: req.modelId
20573
+ },
20574
+ ...originatorClientId ? { originatorClientId } : {}
20575
+ });
20539
20576
  succeeded = true;
20540
20577
  return result;
20541
20578
  } finally {
@@ -20818,6 +20855,68 @@ function createAcpSessionBridge(opts) {
20818
20855
  answer: response.answer ?? null
20819
20856
  };
20820
20857
  },
20858
+ async launchSessionForkAgent(sessionId, directive, context) {
20859
+ const entry = byId.get(sessionId);
20860
+ if (!entry) throw new SessionNotFoundError(sessionId);
20861
+ const info = channelInfoForEntry(entry);
20862
+ if (!info || info.isDying) throw new SessionNotFoundError(sessionId);
20863
+ resolveTrustedClientId(entry, context?.clientId);
20864
+ const trimmed = directive.trim();
20865
+ if (!trimmed) {
20866
+ throw new Error("Fork directive is required");
20867
+ }
20868
+ if (entry.pendingPromptCount > 0 || entry.promptActive) {
20869
+ throw new SessionBusyError(
20870
+ sessionId,
20871
+ "Cannot fork while a response or tool call is in progress"
20872
+ );
20873
+ }
20874
+ return entry.promptQueue.then(async () => {
20875
+ if (entry.pendingPromptCount > 0 || entry.promptActive) {
20876
+ throw new SessionBusyError(
20877
+ sessionId,
20878
+ "Cannot fork while a response or tool call is in progress"
20879
+ );
20880
+ }
20881
+ opts.onDiagnosticLine?.(
20882
+ `qwen serve: launchSessionForkAgent requested for session=${sessionId}`,
20883
+ "info"
20884
+ );
20885
+ let response;
20886
+ try {
20887
+ response = await Promise.race([
20888
+ withTimeout(
20889
+ entry.connection.extMethod(
20890
+ SERVE_CONTROL_EXT_METHODS.sessionForkAgent,
20891
+ {
20892
+ sessionId,
20893
+ directive: trimmed
20894
+ }
20895
+ ),
20896
+ initTimeoutMs,
20897
+ SERVE_CONTROL_EXT_METHODS.sessionForkAgent
20898
+ ),
20899
+ getTransportClosedReject(entry)
20900
+ ]);
20901
+ } catch (error2) {
20902
+ opts.onDiagnosticLine?.(
20903
+ `qwen serve: launchSessionForkAgent failed for session=${sessionId}: ${error2 instanceof Error ? error2.message : String(error2)}`,
20904
+ "warn"
20905
+ );
20906
+ throw error2;
20907
+ }
20908
+ const result = {
20909
+ sessionId: entry.sessionId,
20910
+ description: response.description ?? trimmed.slice(0, 60),
20911
+ launched: response.launched === true
20912
+ };
20913
+ opts.onDiagnosticLine?.(
20914
+ `qwen serve: launchSessionForkAgent completed for session=${sessionId} launched=${result.launched}`,
20915
+ "info"
20916
+ );
20917
+ return result;
20918
+ });
20919
+ },
20821
20920
  async executeShellCommand(sessionId, command, signal, context) {
20822
20921
  opts.onDiagnosticLine?.(
20823
20922
  `qwen serve: bridge executeShellCommand for session=${sessionId}`,
@@ -20952,7 +21051,11 @@ function createAcpSessionBridge(opts) {
20952
21051
  withTimeout(
20953
21052
  entry.connection.extMethod(
20954
21053
  SERVE_CONTROL_EXT_METHODS.sessionRewind,
20955
- { sessionId, promptId: req.promptId, rewindFiles: true }
21054
+ {
21055
+ sessionId,
21056
+ promptId: req.promptId,
21057
+ rewindFiles: req.rewindFiles !== false
21058
+ }
20956
21059
  ),
20957
21060
  initTimeoutMs,
20958
21061
  SERVE_CONTROL_EXT_METHODS.sessionRewind
@@ -21261,7 +21364,7 @@ var createHttpAcpBridge = createAcpSessionBridge;
21261
21364
  // packages/acp-bridge/src/bridgeFileSystem.ts
21262
21365
  init_esbuild_shims();
21263
21366
 
21264
- // packages/cli/src/serve/auth/qwenDeviceFlowProvider.ts
21367
+ // packages/cli/src/serve/auth/qwen-device-flow-provider.ts
21265
21368
  init_esbuild_shims();
21266
21369
  var QWEN_OAUTH_SCOPE = "openid profile email model.completion";
21267
21370
  var STDERR_DETAIL_MAX = 2048;
@@ -21430,7 +21533,7 @@ function mapRfc8628OAuthCode(code) {
21430
21533
  }
21431
21534
  __name(mapRfc8628OAuthCode, "mapRfc8628OAuthCode");
21432
21535
 
21433
- // packages/cli/src/serve/bridgeFileSystemAdapter.ts
21536
+ // packages/cli/src/serve/bridge-file-system-adapter.ts
21434
21537
  init_esbuild_shims();
21435
21538
  var ACP_WRITE_ROUTE = "ACP writeTextFile";
21436
21539
  var ACP_READ_ROUTE = "ACP readTextFile";
@@ -21468,11 +21571,11 @@ function createBridgeFileSystemAdapter(factory) {
21468
21571
  }
21469
21572
  __name(createBridgeFileSystemAdapter, "createBridgeFileSystemAdapter");
21470
21573
 
21471
- // packages/cli/src/serve/daemonStatusProvider.ts
21574
+ // packages/cli/src/serve/daemon-status-provider.ts
21472
21575
  init_esbuild_shims();
21473
21576
  import { promises as fs2 } from "node:fs";
21474
21577
 
21475
- // packages/cli/src/serve/envSnapshot.ts
21578
+ // packages/cli/src/serve/env-snapshot.ts
21476
21579
  init_esbuild_shims();
21477
21580
  import os2 from "node:os";
21478
21581
  var SECRET_ENV_VARS = [
@@ -21603,7 +21706,7 @@ var ENV_SECRET_VARS = SECRET_ENV_VARS;
21603
21706
  var ENV_NONSECRET_VARS = NONSECRET_ENV_VARS;
21604
21707
  var ENV_PROXY_VARS = PROXY_VARS;
21605
21708
 
21606
- // packages/cli/src/serve/daemonStatusProvider.ts
21709
+ // packages/cli/src/serve/daemon-status-provider.ts
21607
21710
  var REQUIRED_NODE_MAJOR = 22;
21608
21711
  function createDaemonStatusProvider() {
21609
21712
  return {
@@ -21772,7 +21875,232 @@ async function safeCheck(kind, body) {
21772
21875
  }
21773
21876
  __name(safeCheck, "safeCheck");
21774
21877
 
21775
- // packages/cli/src/serve/debugMode.ts
21878
+ // packages/cli/src/serve/workspace-providers-status.ts
21879
+ init_esbuild_shims();
21880
+ function createWorkspaceProvidersStatusProvider(options = {}) {
21881
+ return async (workspaceCwd, acpChannelLive) => buildWorkspaceProvidersStatus(workspaceCwd, acpChannelLive, options);
21882
+ }
21883
+ __name(createWorkspaceProvidersStatusProvider, "createWorkspaceProvidersStatusProvider");
21884
+ function buildWorkspaceProvidersStatus(workspaceCwd, acpChannelLive, options) {
21885
+ try {
21886
+ const loaded = loadSettings(workspaceCwd);
21887
+ const settings = loaded.merged;
21888
+ const env = options.env ?? process.env;
21889
+ const selectedAuthType = settings.security?.auth?.selectedType ?? getAuthTypeFromEnv();
21890
+ const argv = {
21891
+ model: options.argv?.model,
21892
+ openaiApiKey: options.argv?.openaiApiKey,
21893
+ openaiBaseUrl: options.argv?.openaiBaseUrl,
21894
+ openaiLogging: options.argv?.openaiLogging,
21895
+ openaiLoggingDir: options.argv?.openaiLoggingDir
21896
+ };
21897
+ const resolvedCliConfig = resolveCliGenerationConfig({
21898
+ argv,
21899
+ settings,
21900
+ selectedAuthType,
21901
+ env
21902
+ });
21903
+ const modelsConfig = new ModelsConfig({
21904
+ initialAuthType: selectedAuthType,
21905
+ modelProvidersConfig: settings.modelProviders,
21906
+ generationConfig: resolvedCliConfig.generationConfig,
21907
+ generationConfigSources: resolvedCliConfig.sources
21908
+ });
21909
+ const currentAuth = selectedAuthType;
21910
+ const currentModelId = (resolvedCliConfig.model || modelsConfig.getModel() || "").trim();
21911
+ const hasCurrentModel = currentModelId.length > 0;
21912
+ const currentAcpModelId = hasCurrentModel && currentAuth ? formatAcpModelId(currentModelId, currentAuth) : currentModelId || void 0;
21913
+ const currentBaseUrl = resolvedCliConfig.sources["baseUrl"] ? resolvedCliConfig.baseUrl || void 0 : void 0;
21914
+ const fastModelId = typeof settings.fastModel === "string" && settings.fastModel.length > 0 ? settings.fastModel : void 0;
21915
+ const providers = /* @__PURE__ */ new Map();
21916
+ const explicitModelBaseUrls = buildExplicitModelBaseUrls(
21917
+ settings.modelProviders
21918
+ );
21919
+ for (const model of modelsConfig.getAllConfiguredModels()) {
21920
+ if (model.isRuntimeModel) continue;
21921
+ const authType = String(model.authType);
21922
+ let provider = providers.get(authType);
21923
+ if (!provider) {
21924
+ provider = {
21925
+ kind: "model_provider",
21926
+ status: "ok",
21927
+ authType,
21928
+ current: false,
21929
+ models: []
21930
+ };
21931
+ providers.set(authType, provider);
21932
+ }
21933
+ const effectiveModelId = model.id;
21934
+ const modelId = formatAcpModelId(effectiveModelId, model.authType);
21935
+ const isCurrent = currentAuth === model.authType && hasCurrentModel && matchesCurrentModel(currentModelId, effectiveModelId, modelId) && matchesCurrentBaseUrl(
21936
+ currentBaseUrl,
21937
+ model.baseUrl,
21938
+ model.baseUrl !== void 0 && explicitModelBaseUrls.has(
21939
+ modelBaseUrlKey(authType, effectiveModelId, model.baseUrl)
21940
+ )
21941
+ );
21942
+ const providerModel = {
21943
+ modelId,
21944
+ baseModelId: parseAcpBaseModelId(effectiveModelId),
21945
+ name: model.label,
21946
+ ...model.description !== void 0 ? { description: model.description } : {},
21947
+ contextLimit: model.contextWindowSize ?? tokenLimit(effectiveModelId),
21948
+ ...model.modalities !== void 0 ? { modalities: model.modalities } : {},
21949
+ ...model.baseUrl !== void 0 ? { baseUrl: sanitizeProviderBaseUrl(model.baseUrl) } : {},
21950
+ ...model.envKey !== void 0 ? { envKey: model.envKey } : {},
21951
+ isCurrent,
21952
+ isRuntime: false
21953
+ };
21954
+ provider.models.push(providerModel);
21955
+ if (isCurrent) provider.current = true;
21956
+ }
21957
+ const current = buildCurrent(
21958
+ currentAuth,
21959
+ currentAcpModelId,
21960
+ currentBaseUrl,
21961
+ fastModelId
21962
+ );
21963
+ return {
21964
+ v: STATUS_SCHEMA_VERSION,
21965
+ workspaceCwd,
21966
+ initialized: true,
21967
+ acpChannelLive,
21968
+ ...current ? { current } : {},
21969
+ providers: [...providers.values()],
21970
+ ...resolvedCliConfig.warnings.length > 0 ? {
21971
+ errors: resolvedCliConfig.warnings.map((warning) => ({
21972
+ kind: "providers",
21973
+ status: "warning",
21974
+ error: sanitizeProviderWarning(warning)
21975
+ }))
21976
+ } : {}
21977
+ };
21978
+ } catch (error2) {
21979
+ return {
21980
+ v: STATUS_SCHEMA_VERSION,
21981
+ workspaceCwd,
21982
+ initialized: false,
21983
+ acpChannelLive,
21984
+ providers: [],
21985
+ errors: [
21986
+ {
21987
+ kind: "providers",
21988
+ status: "error",
21989
+ error: sanitizeProviderWarning(
21990
+ error2 instanceof Error ? error2.message : String(error2)
21991
+ )
21992
+ }
21993
+ ]
21994
+ };
21995
+ }
21996
+ }
21997
+ __name(buildWorkspaceProvidersStatus, "buildWorkspaceProvidersStatus");
21998
+ function matchesCurrentModel(currentModelId, baseModelId, acpModelId) {
21999
+ return currentModelId === baseModelId || currentModelId === acpModelId;
22000
+ }
22001
+ __name(matchesCurrentModel, "matchesCurrentModel");
22002
+ function matchesCurrentBaseUrl(currentBaseUrl, modelBaseUrl, modelHasExplicitBaseUrl) {
22003
+ if (!currentBaseUrl) return !modelHasExplicitBaseUrl;
22004
+ return currentBaseUrl === modelBaseUrl;
22005
+ }
22006
+ __name(matchesCurrentBaseUrl, "matchesCurrentBaseUrl");
22007
+ function buildExplicitModelBaseUrls(modelProviders) {
22008
+ const baseUrls = /* @__PURE__ */ new Set();
22009
+ if (!modelProviders) return baseUrls;
22010
+ for (const [authType, providerConfig] of Object.entries(modelProviders)) {
22011
+ const models = readProviderModels(providerConfig);
22012
+ for (const model of models) {
22013
+ if (typeof model.id === "string" && typeof model.baseUrl === "string" && model.baseUrl.length > 0) {
22014
+ baseUrls.add(modelBaseUrlKey(authType, model.id, model.baseUrl));
22015
+ }
22016
+ }
22017
+ }
22018
+ return baseUrls;
22019
+ }
22020
+ __name(buildExplicitModelBaseUrls, "buildExplicitModelBaseUrls");
22021
+ function readProviderModels(providerConfig) {
22022
+ if (Array.isArray(providerConfig)) {
22023
+ return providerConfig.filter(isProviderModelBaseUrlConfig);
22024
+ }
22025
+ if (typeof providerConfig !== "object" || providerConfig === null) {
22026
+ return [];
22027
+ }
22028
+ const { models } = providerConfig;
22029
+ return Array.isArray(models) ? models.filter(isProviderModelBaseUrlConfig) : [];
22030
+ }
22031
+ __name(readProviderModels, "readProviderModels");
22032
+ function isProviderModelBaseUrlConfig(value) {
22033
+ return typeof value === "object" && value !== null;
22034
+ }
22035
+ __name(isProviderModelBaseUrlConfig, "isProviderModelBaseUrlConfig");
22036
+ function modelBaseUrlKey(authType, modelId, baseUrl) {
22037
+ return `${authType}\0${modelId}\0${baseUrl}`;
22038
+ }
22039
+ __name(modelBaseUrlKey, "modelBaseUrlKey");
22040
+ var URL_LIKE_PATTERN = /\b[A-Za-z][A-Za-z\d+.-]*:\/\/[^\s'"`<>]+/g;
22041
+ var URL_START_PATTERN = /\b[A-Za-z][A-Za-z\d+.-]*:\/\//g;
22042
+ function sanitizeProviderWarning(warning) {
22043
+ let result = "";
22044
+ let index = 0;
22045
+ let next = findNextUrlStart(warning, index);
22046
+ while (next) {
22047
+ result += warning.slice(index, next.index);
22048
+ const segmentEnd = findUrlSegmentEnd(warning, next.index, next.marker);
22049
+ const segment = warning.slice(next.index, segmentEnd);
22050
+ result += sanitizeProviderWarningSegment(segment, next.marker.length);
22051
+ index = segmentEnd;
22052
+ next = findNextUrlStart(warning, index);
22053
+ }
22054
+ return result + warning.slice(index);
22055
+ }
22056
+ __name(sanitizeProviderWarning, "sanitizeProviderWarning");
22057
+ function findNextUrlStart(value, from) {
22058
+ URL_START_PATTERN.lastIndex = from;
22059
+ const match = URL_START_PATTERN.exec(value);
22060
+ return match ? { index: match.index, marker: match[0] } : void 0;
22061
+ }
22062
+ __name(findNextUrlStart, "findNextUrlStart");
22063
+ function findUrlSegmentEnd(value, start, marker) {
22064
+ const afterMarker = start + marker.length;
22065
+ const carriageReturn = value.indexOf("\r", afterMarker);
22066
+ const lineFeed = value.indexOf("\n", afterMarker);
22067
+ let lineEnd = value.length;
22068
+ if (carriageReturn !== -1) lineEnd = Math.min(lineEnd, carriageReturn);
22069
+ if (lineFeed !== -1) lineEnd = Math.min(lineEnd, lineFeed);
22070
+ const nextUrl = findNextUrlStart(value, afterMarker);
22071
+ return Math.min(lineEnd, nextUrl?.index ?? value.length);
22072
+ }
22073
+ __name(findUrlSegmentEnd, "findUrlSegmentEnd");
22074
+ function sanitizeProviderWarningSegment(segment, markerLength) {
22075
+ const at = segment.indexOf("@", markerLength);
22076
+ if (at !== -1 && hasCredentialPrefix(segment, markerLength, at) && segment[at + 1] !== void 0 && /[A-Za-z0-9.[\]-]/.test(segment[at + 1])) {
22077
+ return `${segment.slice(0, markerLength)}${segment.slice(at + 1)}`;
22078
+ }
22079
+ return segment.replace(
22080
+ URL_LIKE_PATTERN,
22081
+ (url) => sanitizeProviderBaseUrl(url)
22082
+ );
22083
+ }
22084
+ __name(sanitizeProviderWarningSegment, "sanitizeProviderWarningSegment");
22085
+ function hasCredentialPrefix(segment, markerLength, at) {
22086
+ const colon = segment.indexOf(":", markerLength);
22087
+ if (colon === -1 || colon > at) return false;
22088
+ const username = segment.slice(markerLength, colon);
22089
+ return !/[/?#\s'"`<>]/.test(username);
22090
+ }
22091
+ __name(hasCredentialPrefix, "hasCredentialPrefix");
22092
+ function buildCurrent(authType, modelId, baseUrl, fastModelId) {
22093
+ if (!authType && !modelId && !baseUrl && !fastModelId) return void 0;
22094
+ return {
22095
+ ...authType ? { authType: String(authType) } : {},
22096
+ ...modelId ? { modelId } : {},
22097
+ ...baseUrl ? { baseUrl: sanitizeProviderBaseUrl(baseUrl) } : {},
22098
+ ...fastModelId ? { fastModelId } : {}
22099
+ };
22100
+ }
22101
+ __name(buildCurrent, "buildCurrent");
22102
+
22103
+ // packages/cli/src/serve/debug-mode.ts
21776
22104
  init_esbuild_shims();
21777
22105
  function isServeDebugMode() {
21778
22106
  const value = process.env["QWEN_SERVE_DEBUG"];
@@ -21781,11 +22109,11 @@ function isServeDebugMode() {
21781
22109
  }
21782
22110
  __name(isServeDebugMode, "isServeDebugMode");
21783
22111
 
21784
- // packages/cli/src/serve/acpHttp/index.ts
22112
+ // packages/cli/src/serve/acp-http/index.ts
21785
22113
  init_esbuild_shims();
21786
22114
  import { createHash as createHash4, timingSafeEqual as timingSafeEqual2 } from "node:crypto";
21787
22115
 
21788
- // packages/cli/src/serve/acpHttp/dispatch.ts
22116
+ // packages/cli/src/serve/acp-http/dispatch.ts
21789
22117
  init_esbuild_shims();
21790
22118
  import path8 from "node:path";
21791
22119
 
@@ -22270,7 +22598,7 @@ function createAuditPublisher(deps) {
22270
22598
  }
22271
22599
  __name(createAuditPublisher, "createAuditPublisher");
22272
22600
 
22273
- // packages/cli/src/serve/fs/workspaceFileSystem.ts
22601
+ // packages/cli/src/serve/fs/workspace-file-system.ts
22274
22602
  init_esbuild_shims();
22275
22603
  import { createHash as createHash3, randomBytes } from "node:crypto";
22276
22604
  import { promises as fsp2 } from "node:fs";
@@ -22281,6 +22609,7 @@ function createWorkspaceFileSystemFactory(deps) {
22281
22609
  projectRoot: boundWorkspace,
22282
22610
  useGitignore: true,
22283
22611
  useQwenignore: true,
22612
+ ...deps.customIgnoreFiles !== void 0 ? { customIgnoreFiles: deps.customIgnoreFiles } : {},
22284
22613
  ignoreDirs: []
22285
22614
  });
22286
22615
  Object.freeze(ignore);
@@ -22355,6 +22684,12 @@ var WorkspaceFileSystemImpl = class {
22355
22684
  `line must be a positive integer, got ${opts.line}`
22356
22685
  );
22357
22686
  }
22687
+ if (opts.limit !== void 0 && (!Number.isSafeInteger(opts.limit) || opts.limit < 1)) {
22688
+ throw new FsError(
22689
+ "parse_error",
22690
+ `limit must be a positive integer, got ${opts.limit}`
22691
+ );
22692
+ }
22358
22693
  const snapshot = await readTextSnapshotFromResolvedFile(p, opts);
22359
22694
  const ignoreVerdict = shouldIgnore(
22360
22695
  p,
@@ -22452,6 +22787,12 @@ var WorkspaceFileSystemImpl = class {
22452
22787
  const start = performance.now();
22453
22788
  try {
22454
22789
  assertTrustedForIntent(this.deps.trusted, "list");
22790
+ if (opts.maxEntries !== void 0 && (!Number.isSafeInteger(opts.maxEntries) || opts.maxEntries < 1)) {
22791
+ throw new FsError(
22792
+ "parse_error",
22793
+ `maxEntries must be a positive integer, got ${opts.maxEntries}`
22794
+ );
22795
+ }
22455
22796
  const entries = [];
22456
22797
  const dir = await fsp2.opendir(p);
22457
22798
  for await (const d of dir) {
@@ -23541,7 +23882,7 @@ function buildWriteMeta(opts) {
23541
23882
  }
23542
23883
  __name(buildWriteMeta, "buildWriteMeta");
23543
23884
 
23544
- // packages/cli/src/serve/workspaceMemory.ts
23885
+ // packages/cli/src/serve/workspace-memory.ts
23545
23886
  init_esbuild_shims();
23546
23887
  import { promises as fs3 } from "node:fs";
23547
23888
  import * as path7 from "node:path";
@@ -23783,14 +24124,14 @@ function isEnoent(err) {
23783
24124
  }
23784
24125
  __name(isEnoent, "isEnoent");
23785
24126
 
23786
- // packages/cli/src/serve/workspaceAgents.ts
24127
+ // packages/cli/src/serve/workspace-agents.ts
23787
24128
  init_esbuild_shims();
23788
24129
  import { promises as fs4 } from "node:fs";
23789
24130
 
23790
- // packages/cli/src/serve/acpSessionBridge.ts
24131
+ // packages/cli/src/serve/acp-session-bridge.ts
23791
24132
  init_esbuild_shims();
23792
24133
 
23793
- // packages/cli/src/serve/workspaceAgents.ts
24134
+ // packages/cli/src/serve/workspace-agents.ts
23794
24135
  var AGENT_TYPE_PATTERN = /^[\p{L}\p{N}_-]+$/u;
23795
24136
  var AGENT_TYPE_MAX_LENGTH = 64;
23796
24137
  var AGENT_TYPE_MIN_LENGTH = 2;
@@ -24655,7 +24996,7 @@ function createDaemonSubagentManager(boundWorkspace) {
24655
24996
  }
24656
24997
  __name(createDaemonSubagentManager, "createDaemonSubagentManager");
24657
24998
 
24658
- // packages/cli/src/serve/acpHttp/jsonRpc.ts
24999
+ // packages/cli/src/serve/acp-http/json-rpc.ts
24659
25000
  init_esbuild_shims();
24660
25001
  var QWEN_METHOD_NS = "_qwen/";
24661
25002
  var QWEN_META_KEY = "qwen";
@@ -24735,7 +25076,7 @@ function parseInbound(raw) {
24735
25076
  }
24736
25077
  __name(parseInbound, "parseInbound");
24737
25078
 
24738
- // packages/cli/src/serve/acpHttp/dispatch.ts
25079
+ // packages/cli/src/serve/acp-http/dispatch.ts
24739
25080
  function errMsg(err) {
24740
25081
  return err instanceof Error ? err.message : String(err);
24741
25082
  }
@@ -24761,6 +25102,7 @@ var ALL_QWEN_VENDOR_METHODS = [
24761
25102
  `${QWEN_METHOD_NS}session/detach`,
24762
25103
  `${QWEN_METHOD_NS}session/context_usage`,
24763
25104
  `${QWEN_METHOD_NS}session/tasks`,
25105
+ `${QWEN_METHOD_NS}session/lsp`,
24764
25106
  // Wave 1: memory
24765
25107
  `${QWEN_METHOD_NS}workspace/memory`,
24766
25108
  `${QWEN_METHOD_NS}workspace/memory/write`,
@@ -25816,6 +26158,13 @@ var AcpDispatcher = class {
25816
26158
  this.replyConn(conn, id, result);
25817
26159
  return;
25818
26160
  }
26161
+ case `${QWEN_METHOD_NS}session/lsp`: {
26162
+ const sessionId = String(params["sessionId"] ?? "");
26163
+ if (!this.requireOwned(conn, sessionId, id)) return;
26164
+ const result = await this.bridge.getSessionLspStatus(sessionId);
26165
+ this.replyConn(conn, id, result);
26166
+ return;
26167
+ }
25819
26168
  case `${QWEN_METHOD_NS}workspace/memory`: {
25820
26169
  const result = await collectWorkspaceMemoryStatus(
25821
26170
  this.boundWorkspace
@@ -26904,7 +27253,7 @@ var AcpDispatcher = class {
26904
27253
  }
26905
27254
  };
26906
27255
 
26907
- // packages/cli/src/serve/acpHttp/connectionRegistry.ts
27256
+ // packages/cli/src/serve/acp-http/connection-registry.ts
26908
27257
  init_esbuild_shims();
26909
27258
  import { randomUUID as randomUUID4 } from "node:crypto";
26910
27259
  var MAX_BUFFERED_FRAMES = 256;
@@ -27253,7 +27602,7 @@ function sumBy(values, select) {
27253
27602
  }
27254
27603
  __name(sumBy, "sumBy");
27255
27604
 
27256
- // packages/cli/src/serve/acpHttp/sseStream.ts
27605
+ // packages/cli/src/serve/acp-http/sse-stream.ts
27257
27606
  init_esbuild_shims();
27258
27607
  var SseStream = class {
27259
27608
  constructor(res, onClose, onHeartbeat) {
@@ -27372,7 +27721,7 @@ var SseStream = class {
27372
27721
  }
27373
27722
  };
27374
27723
 
27375
- // packages/cli/src/serve/acpHttp/wsStream.ts
27724
+ // packages/cli/src/serve/acp-http/ws-stream.ts
27376
27725
  init_esbuild_shims();
27377
27726
  var WsStream = class {
27378
27727
  constructor(ws, onClose, onHeartbeat) {
@@ -27460,7 +27809,7 @@ var WsStream = class {
27460
27809
  }
27461
27810
  };
27462
27811
 
27463
- // packages/cli/src/serve/acpHttp/index.ts
27812
+ // packages/cli/src/serve/acp-http/index.ts
27464
27813
  var ACP_CONNECTION_HEADER = "acp-connection-id";
27465
27814
  var ACP_SESSION_HEADER = "acp-session-id";
27466
27815
  var CONN_GRACE_MS = 1e4;
@@ -27474,6 +27823,7 @@ var WS_READ_METHODS = /* @__PURE__ */ new Set([
27474
27823
  "_qwen/session/supported_commands",
27475
27824
  "_qwen/session/context_usage",
27476
27825
  "_qwen/session/tasks",
27826
+ "_qwen/session/lsp",
27477
27827
  "_qwen/workspace/mcp",
27478
27828
  "_qwen/workspace/skills",
27479
27829
  "_qwen/workspace/providers",
@@ -28006,7 +28356,7 @@ function isLoopbackReq(req) {
28006
28356
  }
28007
28357
  __name(isLoopbackReq, "isLoopbackReq");
28008
28358
 
28009
- // packages/cli/src/serve/daemonStatus.ts
28359
+ // packages/cli/src/serve/daemon-status.ts
28010
28360
  init_esbuild_shims();
28011
28361
  var DEFAULT_LISTENER_MAX_CONNECTIONS = 256;
28012
28362
  var SECTION_TIMEOUT_MS = 1e3;
@@ -28497,6 +28847,7 @@ var SERVE_CAPABILITY_REGISTRY = {
28497
28847
  session_supported_commands: { since: "v1" },
28498
28848
  session_tasks: { since: "v1" },
28499
28849
  session_stats: { since: "v1" },
28850
+ session_lsp: { since: "v1" },
28500
28851
  session_close: { since: "v1" },
28501
28852
  session_metadata: { since: "v1" },
28502
28853
  // Daemon supports the MCP client guardrail surface: an in-process
@@ -29345,7 +29696,7 @@ function getDemoHtml(_port) {
29345
29696
  }
29346
29697
  __name(getDemoHtml, "getDemoHtml");
29347
29698
 
29348
- // packages/cli/src/serve/webShellStatic.ts
29699
+ // packages/cli/src/serve/web-shell-static.ts
29349
29700
  init_esbuild_shims();
29350
29701
  var import_express = __toESM(require_express2(), 1);
29351
29702
  import { existsSync } from "node:fs";
@@ -29449,7 +29800,7 @@ function mountWebShellSpaFallback(app, webShellDir) {
29449
29800
  }
29450
29801
  __name(mountWebShellSpaFallback, "mountWebShellSpaFallback");
29451
29802
 
29452
- // packages/cli/src/serve/routes/workspaceFileRead.ts
29803
+ // packages/cli/src/serve/routes/workspace-file-read.ts
29453
29804
  init_esbuild_shims();
29454
29805
  import * as path10 from "node:path";
29455
29806
  var MAX_LIST_ENTRIES = 2e3;
@@ -29796,7 +30147,7 @@ function registerWorkspaceFileReadRoutes(app, deps) {
29796
30147
  }
29797
30148
  __name(registerWorkspaceFileReadRoutes, "registerWorkspaceFileReadRoutes");
29798
30149
 
29799
- // packages/cli/src/serve/routes/workspaceFileWrite.ts
30150
+ // packages/cli/src/serve/routes/workspace-file-write.ts
29800
30151
  init_esbuild_shims();
29801
30152
  function getFsFactory2(req, res) {
29802
30153
  const factory = req.app.locals.fsFactory;
@@ -30059,6 +30410,7 @@ function createDaemonWorkspaceService(deps) {
30059
30410
  boundWorkspace,
30060
30411
  contextFilename,
30061
30412
  statusProvider,
30413
+ workspaceProvidersStatusProvider,
30062
30414
  isChannelLive,
30063
30415
  persistDisabledTools,
30064
30416
  queryWorkspaceStatus,
@@ -30081,6 +30433,12 @@ function createDaemonWorkspaceService(deps) {
30081
30433
  );
30082
30434
  },
30083
30435
  async getWorkspaceProvidersStatus(_ctx) {
30436
+ if (workspaceProvidersStatusProvider) {
30437
+ return workspaceProvidersStatusProvider(
30438
+ boundWorkspace,
30439
+ isChannelLive?.() ?? false
30440
+ );
30441
+ }
30084
30442
  return queryWorkspaceStatus(
30085
30443
  SERVE_STATUS_EXT_METHODS.workspaceProviders,
30086
30444
  () => createIdleWorkspaceProvidersStatus(boundWorkspace)
@@ -30454,7 +30812,7 @@ function createDaemonWorkspaceService(deps) {
30454
30812
  }
30455
30813
  __name(createDaemonWorkspaceService, "createDaemonWorkspaceService");
30456
30814
 
30457
- // packages/cli/src/serve/routes/workspaceSettings.ts
30815
+ // packages/cli/src/serve/routes/workspace-settings.ts
30458
30816
  init_esbuild_shims();
30459
30817
  var TUI_ONLY_SETTINGS = /* @__PURE__ */ new Set([
30460
30818
  "general.vimMode",
@@ -30679,7 +31037,7 @@ function registerWorkspaceSettingsRoutes(app, deps) {
30679
31037
  }
30680
31038
  __name(registerWorkspaceSettingsRoutes, "registerWorkspaceSettingsRoutes");
30681
31039
 
30682
- // packages/cli/src/serve/routes/a2uiAction.ts
31040
+ // packages/cli/src/serve/routes/a2ui-action.ts
30683
31041
  init_esbuild_shims();
30684
31042
  import * as fsp3 from "node:fs/promises";
30685
31043
  import * as path12 from "node:path";
@@ -30687,7 +31045,16 @@ var A2UI_MIME = "application/a2ui+json";
30687
31045
  var ACTION_TOOL = "action";
30688
31046
  var CALL_TIMEOUT_MS = 15e3;
30689
31047
  function usableServerConfig(cfg) {
30690
- return !!cfg && (typeof cfg.command === "string" || typeof cfg.httpUrl === "string");
31048
+ if (!cfg) return false;
31049
+ if (typeof cfg.httpUrl === "string") {
31050
+ try {
31051
+ const parsed = new URL(cfg.httpUrl);
31052
+ return parsed.protocol === "http:" || parsed.protocol === "https:";
31053
+ } catch {
31054
+ return false;
31055
+ }
31056
+ }
31057
+ return typeof cfg.command === "string" && cfg.command.trim().length > 0;
30691
31058
  }
30692
31059
  __name(usableServerConfig, "usableServerConfig");
30693
31060
  async function findFromSettingsFile(workspaceCwd) {
@@ -30816,7 +31183,7 @@ function registerA2uiActionRoutes(app, opts) {
30816
31183
  }
30817
31184
  __name(registerA2uiActionRoutes, "registerA2uiActionRoutes");
30818
31185
 
30819
- // packages/cli/src/serve/rateLimit.ts
31186
+ // packages/cli/src/serve/rate-limit.ts
30820
31187
  init_esbuild_shims();
30821
31188
  var MAX_BUCKETS = 1e4;
30822
31189
  var GC_REQUEST_INTERVAL = 1e3;
@@ -31073,7 +31440,8 @@ function resolveBridgeFsFactory(input) {
31073
31440
  return createWorkspaceFileSystemFactory({
31074
31441
  boundWorkspace: input.boundWorkspace,
31075
31442
  trusted: input.trusted,
31076
- emit: input.emit ?? createDefaultFsAuditEmit()
31443
+ emit: input.emit ?? createDefaultFsAuditEmit(),
31444
+ ...input.customIgnoreFiles !== void 0 ? { customIgnoreFiles: input.customIgnoreFiles } : {}
31077
31445
  });
31078
31446
  }
31079
31447
  __name(resolveBridgeFsFactory, "resolveBridgeFsFactory");
@@ -31088,17 +31456,23 @@ var InvalidCursorError = class extends Error {
31088
31456
  this.name = "InvalidCursorError";
31089
31457
  }
31090
31458
  };
31459
+ function parseSessionCursor(cursor) {
31460
+ if (cursor === "") return void 0;
31461
+ const trimmed = cursor.trim();
31462
+ const parsed = Number(trimmed);
31463
+ if (trimmed === "" || !Number.isFinite(parsed) || parsed < 0 || parsed > Number.MAX_SAFE_INTEGER) {
31464
+ throw new InvalidCursorError(cursor);
31465
+ }
31466
+ return parsed;
31467
+ }
31468
+ __name(parseSessionCursor, "parseSessionCursor");
31091
31469
  async function listWorkspaceSessionsForResponse(bridge, workspaceCwd, options) {
31092
31470
  const rawSize = options?.size;
31093
31471
  const requestedSize = typeof rawSize === "number" && Number.isSafeInteger(rawSize) ? rawSize : DEFAULT_SESSION_PAGE_SIZE;
31094
31472
  const pageSize = Math.min(Math.max(requestedSize, 1), MAX_SESSION_PAGE_SIZE);
31095
31473
  let numericCursor;
31096
- if (options?.cursor) {
31097
- const parsed = Number(options.cursor);
31098
- if (!Number.isFinite(parsed)) {
31099
- throw new InvalidCursorError(options.cursor);
31100
- }
31101
- numericCursor = parsed;
31474
+ if (options?.cursor != null) {
31475
+ numericCursor = parseSessionCursor(options.cursor);
31102
31476
  }
31103
31477
  const isFirstPage = numericCursor === void 0;
31104
31478
  const sessionService = new SessionService(workspaceCwd);
@@ -31673,6 +32047,7 @@ function createServeApp(opts, getPort = () => opts.port, deps = {}) {
31673
32047
  boundWorkspace,
31674
32048
  contextFilename: deps.contextFilename ?? "QWEN.md",
31675
32049
  statusProvider: createDaemonStatusProvider(),
32050
+ workspaceProvidersStatusProvider: createWorkspaceProvidersStatusProvider(),
31676
32051
  isChannelLive: /* @__PURE__ */ __name(() => bridge.isChannelLive(), "isChannelLive"),
31677
32052
  persistDisabledTools: deps.persistDisabledTools ?? (async () => {
31678
32053
  throw new Error(
@@ -31698,7 +32073,7 @@ function createServeApp(opts, getPort = () => opts.port, deps = {}) {
31698
32073
  extensionInstallQueue = next.catch(() => void 0);
31699
32074
  return next;
31700
32075
  }, "enqueueExtensionInstall");
31701
- const EXTENSION_MUTATION_TIMEOUT_MS = 12e4;
32076
+ const EXTENSION_MUTATION_TIMEOUT_MS = 10 * 6e4;
31702
32077
  const EXTENSION_REFRESH_TIMEOUT_MS = 3e4;
31703
32078
  const isExtensionQueueFullError = /* @__PURE__ */ __name((err) => err instanceof Error && err.message === "Extension operation queue is full", "isExtensionQueueFullError");
31704
32079
  const sendExtensionQueueFull = /* @__PURE__ */ __name((res) => {
@@ -31832,14 +32207,56 @@ function createServeApp(opts, getPort = () => opts.port, deps = {}) {
31832
32207
  (extension) => extension.installMetadata?.source?.toLowerCase() === requested
31833
32208
  );
31834
32209
  }, "findLoadedExtension");
32210
+ const extensionOperations = /* @__PURE__ */ new Map();
32211
+ const MAX_EXTENSION_OPERATION_HISTORY = 100;
32212
+ const isTerminalExtensionOperation = /* @__PURE__ */ __name((operation) => operation.status !== "queued" && operation.status !== "running", "isTerminalExtensionOperation");
32213
+ const redactExtensionOperationResult = /* @__PURE__ */ __name((event) => ({
32214
+ ...event,
32215
+ ...event.source ? { source: redactUrlCredentials(event.source) } : {}
32216
+ }), "redactExtensionOperationResult");
32217
+ const rememberExtensionOperation = /* @__PURE__ */ __name((operation) => {
32218
+ extensionOperations.set(operation.operationId, operation);
32219
+ while (extensionOperations.size > MAX_EXTENSION_OPERATION_HISTORY) {
32220
+ let evicted = false;
32221
+ for (const [id, storedOperation] of extensionOperations) {
32222
+ if (!isTerminalExtensionOperation(storedOperation)) continue;
32223
+ extensionOperations.delete(id);
32224
+ evicted = true;
32225
+ break;
32226
+ }
32227
+ if (!evicted) break;
32228
+ }
32229
+ }, "rememberExtensionOperation");
32230
+ const updateExtensionOperation = /* @__PURE__ */ __name((operationId, patch) => {
32231
+ const current = extensionOperations.get(operationId);
32232
+ if (!current) return;
32233
+ extensionOperations.set(operationId, {
32234
+ ...current,
32235
+ ...patch,
32236
+ updatedAt: Date.now()
32237
+ });
32238
+ }, "updateExtensionOperation");
31835
32239
  const runQueuedExtensionMutation = /* @__PURE__ */ __name((operation, failureContext, res, run) => {
31836
32240
  if (extensionInstallQueueDepth >= MAX_EXTENSION_INSTALL_QUEUE_DEPTH) {
31837
32241
  sendExtensionQueueFull(res);
31838
32242
  return;
31839
32243
  }
31840
- res.status(202).json({ accepted: true });
32244
+ const operationId = crypto.randomUUID();
32245
+ const now = Date.now();
32246
+ rememberExtensionOperation({
32247
+ v: 1,
32248
+ operationId,
32249
+ operation,
32250
+ status: "queued",
32251
+ createdAt: now,
32252
+ updatedAt: now,
32253
+ ...failureContext.source ? { source: redactUrlCredentials(failureContext.source) } : {},
32254
+ ...failureContext.name ? { name: failureContext.name } : {}
32255
+ });
32256
+ res.status(202).json({ accepted: true, operationId });
31841
32257
  void enqueueExtensionInstall(async () => {
31842
32258
  try {
32259
+ updateExtensionOperation(operationId, { status: "running" });
31843
32260
  const extensionManager = createExtensionManager();
31844
32261
  await extensionManager.refreshCache();
31845
32262
  const event = await withExtensionTimeout(
@@ -31850,6 +32267,14 @@ function createServeApp(opts, getPort = () => opts.port, deps = {}) {
31850
32267
  extensionsStatusCache = void 0;
31851
32268
  try {
31852
32269
  const result = await bridge.refreshExtensionsForAllSessions(event);
32270
+ updateExtensionOperation(operationId, {
32271
+ status: "succeeded",
32272
+ result: {
32273
+ ...redactExtensionOperationResult(event),
32274
+ refreshed: result.refreshed,
32275
+ failed: result.failed
32276
+ }
32277
+ });
31853
32278
  writeStderrLine(
31854
32279
  `qwen serve: extensions ${operation}: refreshed ${result.refreshed} session(s), ${result.failed} failed`
31855
32280
  );
@@ -31857,6 +32282,15 @@ function createServeApp(opts, getPort = () => opts.port, deps = {}) {
31857
32282
  const message = redactUrlCredentials(
31858
32283
  refreshErr instanceof Error ? refreshErr.message : String(refreshErr)
31859
32284
  );
32285
+ updateExtensionOperation(operationId, {
32286
+ status: "succeeded_with_refresh_error",
32287
+ result: {
32288
+ ...redactExtensionOperationResult(event),
32289
+ refreshed: 0,
32290
+ failed: 1,
32291
+ error: message.slice(0, 500)
32292
+ }
32293
+ });
31860
32294
  try {
31861
32295
  bridge.broadcastExtensionsChanged({
31862
32296
  ...event,
@@ -31877,6 +32311,10 @@ function createServeApp(opts, getPort = () => opts.port, deps = {}) {
31877
32311
  const message = redactUrlCredentials(
31878
32312
  err instanceof Error ? err.message : String(err)
31879
32313
  );
32314
+ updateExtensionOperation(operationId, {
32315
+ status: "failed",
32316
+ error: message.slice(0, 500)
32317
+ });
31880
32318
  try {
31881
32319
  bridge.broadcastExtensionsChanged({
31882
32320
  status: "failed",
@@ -31899,9 +32337,16 @@ function createServeApp(opts, getPort = () => opts.port, deps = {}) {
31899
32337
  }
31900
32338
  }
31901
32339
  }).catch((err) => {
32340
+ const message = redactUrlCredentials(
32341
+ err instanceof Error ? err.message : String(err)
32342
+ );
32343
+ updateExtensionOperation(operationId, {
32344
+ status: "failed",
32345
+ error: message.slice(0, 500)
32346
+ });
31902
32347
  try {
31903
32348
  writeStderrLine(
31904
- `qwen serve: extensions ${operation}: queued task failed: ${err instanceof Error ? err.message : String(err)}`
32349
+ `qwen serve: extensions ${operation}: queued task failed: ${message}`
31905
32350
  );
31906
32351
  } catch {
31907
32352
  }
@@ -32295,6 +32740,32 @@ function createServeApp(opts, getPort = () => opts.port, deps = {}) {
32295
32740
  sendBridgeError(res, err, { route: "GET /workspace/extensions" });
32296
32741
  }
32297
32742
  });
32743
+ app.get("/workspace/extensions/operations/:operationId", async (req, res) => {
32744
+ try {
32745
+ buildWorkspaceCtx(
32746
+ req,
32747
+ "GET /workspace/extensions/operations/:operationId"
32748
+ );
32749
+ const operationId = req.params["operationId"];
32750
+ if (!operationId) {
32751
+ res.status(400).json({ error: "Missing extension operation id" });
32752
+ return;
32753
+ }
32754
+ const operation = extensionOperations.get(operationId);
32755
+ if (!operation) {
32756
+ res.status(404).json({
32757
+ error: `Extension operation "${operationId}" not found`,
32758
+ code: "extension_operation_not_found"
32759
+ });
32760
+ return;
32761
+ }
32762
+ res.status(200).json(operation);
32763
+ } catch (err) {
32764
+ sendBridgeError(res, err, {
32765
+ route: "GET /workspace/extensions/operations/:operationId"
32766
+ });
32767
+ }
32768
+ });
32298
32769
  app.post(
32299
32770
  "/workspace/extensions/install",
32300
32771
  mutate({ strict: true }),
@@ -32338,7 +32809,12 @@ function createServeApp(opts, getPort = () => opts.port, deps = {}) {
32338
32809
  res.status(400).json({ error: "`registry` must be a string" });
32339
32810
  return;
32340
32811
  }
32341
- const registryUrl = registry !== void 0 ? parseExtensionRegistryUrl(registry, res) : void 0;
32812
+ const sourceValue = source;
32813
+ const refValue = typeof ref === "string" ? ref : void 0;
32814
+ const autoUpdateValue = typeof autoUpdate === "boolean" ? autoUpdate : void 0;
32815
+ const allowPreReleaseValue = typeof allowPreRelease === "boolean" ? allowPreRelease : void 0;
32816
+ const registryValue = typeof registry === "string" ? registry : void 0;
32817
+ const registryUrl = registryValue !== void 0 ? parseExtensionRegistryUrl(registryValue, res) : void 0;
32342
32818
  if (registryUrl === null) return;
32343
32819
  if (consent !== true) {
32344
32820
  res.status(400).json({
@@ -32346,24 +32822,24 @@ function createServeApp(opts, getPort = () => opts.port, deps = {}) {
32346
32822
  });
32347
32823
  return;
32348
32824
  }
32349
- if (!validateExtensionSourceHost(source, res)) {
32825
+ if (!validateExtensionSourceHost(sourceValue, res)) {
32350
32826
  return;
32351
32827
  }
32352
32828
  runQueuedExtensionMutation(
32353
32829
  "install",
32354
- { source },
32830
+ { source: sourceValue },
32355
32831
  res,
32356
32832
  async (extensionManager) => {
32357
- const installMetadata = await parseInstallSource(source);
32833
+ const installMetadata = await parseInstallSource(sourceValue);
32358
32834
  if (installMetadata.type !== "git" && installMetadata.type !== "github-release" && installMetadata.type !== "npm") {
32359
32835
  throw new Error(
32360
32836
  "Only GitHub, Git, and npm extension installs are supported over the daemon endpoint."
32361
32837
  );
32362
32838
  }
32363
- if (installMetadata.type === "npm" && ref) {
32839
+ if (installMetadata.type === "npm" && refValue) {
32364
32840
  throw new Error("--ref is not applicable for npm extensions.");
32365
32841
  }
32366
- if (installMetadata.type !== "npm" && registry) {
32842
+ if (installMetadata.type !== "npm" && registryValue) {
32367
32843
  throw new Error(
32368
32844
  "--registry is only applicable for npm extensions."
32369
32845
  );
@@ -32375,12 +32851,17 @@ function createServeApp(opts, getPort = () => opts.port, deps = {}) {
32375
32851
  installMetadata.registryUrl = registryUrl;
32376
32852
  }
32377
32853
  const extension = await extensionManager.installExtension(
32378
- { ...installMetadata, ref, autoUpdate, allowPreRelease },
32854
+ {
32855
+ ...installMetadata,
32856
+ ref: refValue,
32857
+ autoUpdate: autoUpdateValue,
32858
+ allowPreRelease: allowPreReleaseValue
32859
+ },
32379
32860
  () => Promise.resolve()
32380
32861
  );
32381
32862
  return {
32382
32863
  status: "installed",
32383
- source,
32864
+ source: sourceValue,
32384
32865
  name: extension.name,
32385
32866
  version: extension.config.version
32386
32867
  };
@@ -33022,6 +33503,34 @@ function createServeApp(opts, getPort = () => opts.port, deps = {}) {
33022
33503
  });
33023
33504
  }
33024
33505
  });
33506
+ app.post("/session/:id/fork", mutate(), async (req, res) => {
33507
+ const sessionId = requireSessionId(req, res);
33508
+ if (sessionId === null) return;
33509
+ const body = safeBody(req);
33510
+ const directive = body["directive"];
33511
+ if (typeof directive !== "string" || directive.trim().length === 0) {
33512
+ res.status(400).json({
33513
+ error: "`directive` is required and must be a non-empty string",
33514
+ code: "missing_directive"
33515
+ });
33516
+ return;
33517
+ }
33518
+ const clientId = parseClientIdHeader(req, res);
33519
+ if (clientId === null) return;
33520
+ try {
33521
+ const result = await bridge.launchSessionForkAgent(
33522
+ sessionId,
33523
+ directive,
33524
+ clientId !== void 0 ? { clientId } : void 0
33525
+ );
33526
+ res.status(202).json(result);
33527
+ } catch (err) {
33528
+ sendBridgeError(res, err, {
33529
+ route: "POST /session/:id/fork",
33530
+ sessionId
33531
+ });
33532
+ }
33533
+ });
33025
33534
  app.get("/session/:id/context", async (req, res) => {
33026
33535
  const sessionId = requireSessionId(req, res);
33027
33536
  if (sessionId === null) return;
@@ -33086,6 +33595,18 @@ function createServeApp(opts, getPort = () => opts.port, deps = {}) {
33086
33595
  });
33087
33596
  }
33088
33597
  });
33598
+ app.get("/session/:id/lsp", async (req, res) => {
33599
+ const sessionId = requireSessionId(req, res);
33600
+ if (sessionId === null) return;
33601
+ try {
33602
+ res.status(200).json(await bridge.getSessionLspStatus(sessionId));
33603
+ } catch (err) {
33604
+ sendBridgeError(res, err, {
33605
+ route: "GET /session/:id/lsp",
33606
+ sessionId
33607
+ });
33608
+ }
33609
+ });
33089
33610
  app.get("/session/:id/hooks", async (req, res) => {
33090
33611
  const sessionId = requireSessionId(req, res);
33091
33612
  if (sessionId === null) return;
@@ -33708,7 +34229,7 @@ function createServeApp(opts, getPort = () => opts.port, deps = {}) {
33708
34229
  try {
33709
34230
  const response = await bridge.rewindSession(
33710
34231
  sessionId,
33711
- { promptId },
34232
+ { promptId, rewindFiles: body["rewindFiles"] !== false },
33712
34233
  clientId !== void 0 ? { clientId } : void 0
33713
34234
  );
33714
34235
  res.status(200).json(response);
@@ -34966,12 +35487,12 @@ function errorPayload(err) {
34966
35487
  }
34967
35488
  __name(errorPayload, "errorPayload");
34968
35489
 
34969
- // packages/cli/src/serve/runQwenServe.ts
35490
+ // packages/cli/src/serve/run-qwen-serve.ts
34970
35491
  init_esbuild_shims();
34971
35492
  import * as fs6 from "node:fs";
34972
35493
  import * as path14 from "node:path";
34973
35494
 
34974
- // packages/cli/src/serve/permissionAudit.ts
35495
+ // packages/cli/src/serve/permission-audit.ts
34975
35496
  init_esbuild_shims();
34976
35497
  var DEFAULT_PERMISSION_AUDIT_RING_SIZE = 512;
34977
35498
  function takeLast(arr, limit, methodName) {
@@ -35088,7 +35609,7 @@ function createPermissionAuditPublisher(deps) {
35088
35609
  }
35089
35610
  __name(createPermissionAuditPublisher, "createPermissionAuditPublisher");
35090
35611
 
35091
- // packages/cli/src/serve/daemonLogger.ts
35612
+ // packages/cli/src/serve/daemon-logger.ts
35092
35613
  init_esbuild_shims();
35093
35614
  import * as nodeFs from "node:fs";
35094
35615
  import * as nodePath from "node:path";
@@ -35228,7 +35749,7 @@ function initDaemonLogger(opts) {
35228
35749
  }
35229
35750
  __name(initDaemonLogger, "initDaemonLogger");
35230
35751
 
35231
- // packages/cli/src/serve/runQwenServe.ts
35752
+ // packages/cli/src/serve/run-qwen-serve.ts
35232
35753
  var QWEN_SERVER_TOKEN_ENV = "QWEN_SERVER_TOKEN";
35233
35754
  var QWEN_SERVE_PROMPT_DEADLINE_MS_ENV = "QWEN_SERVE_PROMPT_DEADLINE_MS";
35234
35755
  var QWEN_SERVE_WRITER_IDLE_TIMEOUT_MS_ENV = "QWEN_SERVE_WRITER_IDLE_TIMEOUT_MS";
@@ -35612,15 +36133,18 @@ async function runQwenServe(optsIn, deps = {}) {
35612
36133
  ring: permissionAuditRing
35613
36134
  });
35614
36135
  const trustedWorkspace = deps.trustedWorkspace ?? true;
36136
+ const customIgnoreFiles = bootSettings?.merged.context?.fileFiltering?.customIgnoreFiles;
35615
36137
  const fsFactory = resolveBridgeFsFactory({
35616
36138
  boundWorkspace,
35617
36139
  injected: deps.fsFactory,
35618
36140
  trusted: trustedWorkspace,
35619
- emit: deps.fsAuditEmit
36141
+ emit: deps.fsAuditEmit,
36142
+ ...customIgnoreFiles !== void 0 ? { customIgnoreFiles } : {}
35620
36143
  });
35621
36144
  const diagnosticSink = /* @__PURE__ */ __name((line, level) => daemonLog.raw(line, level), "diagnosticSink");
35622
36145
  const channelFactory = createSpawnChannelFactory({
35623
- onDiagnosticLine: diagnosticSink
36146
+ onDiagnosticLine: diagnosticSink,
36147
+ ...opts.experimentalLsp === true ? { extraArgs: ["--experimental-lsp"] } : {}
35624
36148
  });
35625
36149
  const persistDisabledToolsFn = /* @__PURE__ */ __name((workspace, toolName, enabled) => withSettingsLock(workspace, async () => {
35626
36150
  const fresh = loadSettings(workspace);
@@ -35637,6 +36161,7 @@ async function runQwenServe(optsIn, deps = {}) {
35637
36161
  );
35638
36162
  }), "persistDisabledToolsFn");
35639
36163
  const statusProvider = createDaemonStatusProvider();
36164
+ const workspaceProvidersStatusProvider = createWorkspaceProvidersStatusProvider();
35640
36165
  const bridge = deps.bridge ?? createAcpSessionBridge({
35641
36166
  maxSessions: opts.maxSessions,
35642
36167
  ...opts.maxPendingPromptsPerSession !== void 0 ? { maxPendingPromptsPerSession: opts.maxPendingPromptsPerSession } : {},
@@ -35695,6 +36220,7 @@ async function runQwenServe(optsIn, deps = {}) {
35695
36220
  contextFilename: contextFilenameForInit ?? "QWEN.md",
35696
36221
  // Daemon-host status provider for env + preflight cells.
35697
36222
  statusProvider,
36223
+ workspaceProvidersStatusProvider,
35698
36224
  // Channel liveness check — proxied through the bridge's live-channel
35699
36225
  // probe (not session count: a channel can be live with zero attached
35700
36226
  // sessions during the cold-spawn window).
@@ -35961,7 +36487,7 @@ async function runQwenServe(optsIn, deps = {}) {
35961
36487
  }
35962
36488
  __name(runQwenServe, "runQwenServe");
35963
36489
 
35964
- // packages/cli/src/serve/inMemoryChannel.ts
36490
+ // packages/cli/src/serve/in-memory-channel.ts
35965
36491
  init_esbuild_shims();
35966
36492
  export {
35967
36493
  ACP_PREFLIGHT_KINDS,