@qwen-code/qwen-code 0.18.5 → 0.19.1

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 (145) hide show
  1. package/bundled/qc-helper/docs/configuration/qwen-ignore.md +31 -15
  2. package/bundled/qc-helper/docs/configuration/settings.md +15 -14
  3. package/bundled/qc-helper/docs/extension/introduction.md +24 -6
  4. package/bundled/qc-helper/docs/features/mcp.md +15 -8
  5. package/chunks/{agent-2TEY55UD.js → agent-7CZOLKXM.js} +24 -22
  6. package/chunks/{agent-headless-SCUAXEEE.js → agent-headless-K37PBQK5.js} +24 -22
  7. package/chunks/{anthropicContentGenerator-5S4OMMNL.js → anthropicContentGenerator-6MCH4X6S.js} +12 -11
  8. package/chunks/artifact-tool-PBX64YTT.js +675 -0
  9. package/chunks/{askUserQuestion-WHVYL2S2.js → askUserQuestion-5ZQOWSRT.js} +20 -7
  10. package/chunks/chunk-22IFUCVR.js +291 -0
  11. package/chunks/{chunk-XGU3ETVO.js → chunk-255L5QYW.js} +3 -3
  12. package/chunks/{chunk-26ZYKTYZ.js → chunk-2BIF2NVV.js} +2 -2
  13. package/chunks/{chunk-VECKCOH6.js → chunk-2X2WXY6L.js} +6104 -4673
  14. package/chunks/{chunk-LTN3VYMZ.js → chunk-3UALQ56H.js} +1 -1
  15. package/chunks/{chunk-2O3NAOJG.js → chunk-57XRIZVC.js} +1 -1
  16. package/chunks/{chunk-MSJ2MXJ6.js → chunk-BGUDAULQ.js} +11 -290
  17. package/chunks/{chunk-FH4P6RQA.js → chunk-BNXANYLH.js} +1 -1
  18. package/chunks/{chunk-WE6TNQJU.js → chunk-C4K3FEQ2.js} +36 -0
  19. package/chunks/{chunk-G4BUMVEY.js → chunk-CGEGHF2C.js} +2 -217
  20. package/chunks/chunk-EEEZIVFJ.js +908 -0
  21. package/chunks/chunk-EJYJYJZ2.js +3703 -0
  22. package/chunks/{chunk-ATLUHLZE.js → chunk-EW6C27XX.js} +1 -1
  23. package/chunks/{chunk-SIJKWK35.js → chunk-FXT37TZS.js} +6 -6
  24. package/chunks/{chunk-C6MI2ASN.js → chunk-GZCJS5WH.js} +2 -2
  25. package/chunks/{chunk-KGV3F6UF.js → chunk-HGNSRCRB.js} +1 -1
  26. package/chunks/{chunk-42HGOMED.js → chunk-JDV3VBPY.js} +216 -1
  27. package/chunks/{chunk-CX3SGIPK.js → chunk-JRVB4QUY.js} +2 -2
  28. package/chunks/{chunk-C7JA3XCX.js → chunk-NQDRRVJD.js} +5 -5
  29. package/chunks/{chunk-F5E6IKYN.js → chunk-OJMCOR55.js} +560 -18
  30. package/chunks/{chunk-ID533GA3.js → chunk-OTBK43JR.js} +1 -1
  31. package/chunks/{chunk-GOMVJKBL.js → chunk-PLY4F7QW.js} +5 -3
  32. package/chunks/{chunk-KZGQ3G3Q.js → chunk-PNT7QCLK.js} +80 -83
  33. package/chunks/{chunk-VKILGMZQ.js → chunk-PO5LVPK3.js} +1 -1
  34. package/chunks/{chunk-AE6RQU6F.js → chunk-PRYMDRBV.js} +1 -1
  35. package/chunks/{chunk-GBN55AWZ.js → chunk-QKUAGMGE.js} +2 -2
  36. package/chunks/{chunk-KQIKOTQJ.js → chunk-RYLJU2DY.js} +60 -5
  37. package/chunks/{chunk-CTHZVIMD.js → chunk-T2VDEFUU.js} +2 -2
  38. package/chunks/{chunk-LF6BKGZT.js → chunk-TXVGVZYR.js} +3 -3
  39. package/chunks/{chunk-XU7BKR3B.js → chunk-XU5P23GN.js} +3 -3
  40. package/chunks/{chunk-2CNO5W47.js → chunk-YMBWB67C.js} +146 -5005
  41. package/chunks/{computer-use-OB3C5QG2.js → computer-use-AY6HODX4.js} +24 -22
  42. package/chunks/contextCommand-KVKJ63NZ.js +56 -0
  43. package/chunks/{cron-create-THNDTYXU.js → cron-create-NHRAAWT5.js} +12 -9
  44. package/chunks/{cron-delete-BS5H6TFJ.js → cron-delete-WGO4PZTF.js} +4 -4
  45. package/chunks/{cron-list-7OBVHT7K.js → cron-list-EY7D3ZUC.js} +4 -4
  46. package/chunks/{dist-GKRNVFBH.js → dist-ZBX7LPJZ.js} +2 -1
  47. package/chunks/{edit-GNCLIF67.js → edit-OXD4P5YK.js} +24 -22
  48. package/chunks/{en-S3OQBISC.js → en-7OGNWWME.js} +48 -0
  49. package/chunks/{enter-worktree-E7BNZOGT.js → enter-worktree-NKNFTLNO.js} +24 -22
  50. package/chunks/{enterPlanMode-IA42A5EU.js → enterPlanMode-7W2FCILY.js} +27 -23
  51. package/chunks/{exit-worktree-QJ2K74UT.js → exit-worktree-NCRZ52XD.js} +24 -22
  52. package/chunks/{exitPlanMode-UKKHBUYJ.js → exitPlanMode-AZIUQQHA.js} +36 -28
  53. package/chunks/{geminiContentGenerator-ICSDM37U.js → geminiContentGenerator-5HKVP4JF.js} +4 -4
  54. package/chunks/{glob-IGD7LWYX.js → glob-VCPO3AQO.js} +26 -23
  55. package/chunks/{grep-IZM3IVND.js → grep-R3W7SG6T.js} +24 -22
  56. package/chunks/{keychain-token-storage-YHXIWXIB.js → keychain-token-storage-CSYMNRPP.js} +2 -2
  57. package/chunks/{loop-wakeup-SSBWZ64K.js → loop-wakeup-XVSDE7QR.js} +5 -5
  58. package/chunks/{ls-YPFUHZRQ.js → ls-LPY3ATQQ.js} +6 -6
  59. package/chunks/{lsp-FD6DNVAF.js → lsp-ZT3AAXIF.js} +2 -2
  60. package/chunks/{monitor-ALJNE3R4.js → monitor-TQCZALTB.js} +24 -22
  61. package/chunks/{notebook-edit-7XRZX55T.js → notebook-edit-RYYGIJTA.js} +25 -23
  62. package/chunks/{openaiContentGenerator-FWKITDFJ.js → openaiContentGenerator-2AUZ47JU.js} +12 -15
  63. package/chunks/{qwenContentGenerator-5RPGQZ63.js → qwenContentGenerator-QM6ENWSO.js} +26 -24
  64. package/chunks/{qwenOAuth2-WZ54YZ4J.js → qwenOAuth2-K4AASPCV.js} +5 -4
  65. package/chunks/{read-file-4WN2DT5N.js → read-file-ZSIMNYPB.js} +9 -8
  66. package/chunks/{ripGrep-4ZKT6KBQ.js → ripGrep-LONCTNP3.js} +24 -22
  67. package/chunks/{scheduler-O2E65VDK.js → scheduler-FMNCHQQH.js} +73 -27
  68. package/chunks/{send-message-FWFTX62Q.js → send-message-447W6NH6.js} +24 -4
  69. package/chunks/{serve-3DM6CRGD.js → serve-XLPTFQOQ.js} +458 -77
  70. package/chunks/{shell-ARVZK6RF.js → shell-G2CEO7D7.js} +24 -22
  71. package/chunks/{skill-BFUBGA4I.js → skill-E5YLTHY3.js} +11 -10
  72. package/chunks/{src-5YMCDSII.js → src-GCZS2DES.js} +112 -67
  73. package/chunks/{syntheticOutput-JY5NEDTV.js → syntheticOutput-GQRDRLGR.js} +3 -3
  74. package/chunks/{task-create-IGILDV25.js → task-create-66DDSTVI.js} +6 -6
  75. package/chunks/{task-list-KBEJVAAG.js → task-list-GOPXRSHG.js} +5 -5
  76. package/chunks/{task-stop-WFTMQ6AC.js → task-stop-M7NKGFX2.js} +2 -2
  77. package/chunks/{task-update-UIVX7ZEV.js → task-update-M5TBHLZV.js} +6 -6
  78. package/chunks/{team-create-HRBV5ATK.js → team-create-RQCITTFK.js} +28 -26
  79. package/chunks/{team-delete-LPOXDPVB.js → team-delete-DKKDS65W.js} +5 -5
  80. package/chunks/{todoWrite-R4RIJKOD.js → todoWrite-4VX7X44D.js} +4 -4
  81. package/chunks/{tool-search-67HI54YA.js → tool-search-2COFGD5N.js} +9 -8
  82. package/chunks/{web-fetch-JU7SS6KE.js → web-fetch-YPP3V4FJ.js} +4 -4
  83. package/chunks/{workflow-W4SCLWLU.js → workflow-A5VAXYUS.js} +557 -97
  84. package/chunks/{write-file-TLNXC2NR.js → write-file-P2RNFLJR.js} +24 -22
  85. package/chunks/{zh-QXLZV2PX.js → zh-3RMSEO5M.js} +48 -0
  86. package/chunks/{zh-TW-3OKU7LDA.js → zh-TW-R7WRLTJS.js} +48 -0
  87. package/cli.js +8200 -4981
  88. package/locales/en.js +69 -0
  89. package/locales/zh-TW.js +66 -0
  90. package/locales/zh.js +66 -0
  91. package/package.json +3 -2
  92. package/web-shell/assets/{arc-CRFN10gD.js → arc-pxOt9B72.js} +1 -1
  93. package/web-shell/assets/{architectureDiagram-3BPJPVTR-IRlu1CpH.js → architectureDiagram-3BPJPVTR-B9XuYYOT.js} +1 -1
  94. package/web-shell/assets/{blockDiagram-GPEHLZMM-htIZ6iw8.js → blockDiagram-GPEHLZMM-5yK68iu4.js} +1 -1
  95. package/web-shell/assets/{c4Diagram-AAUBKEIU-A2GoRq3O.js → c4Diagram-AAUBKEIU-B1LY-qNI.js} +1 -1
  96. package/web-shell/assets/channel-Cx7egbSX.js +1 -0
  97. package/web-shell/assets/{chunk-2J33WTMH-CdP2AC6u.js → chunk-2J33WTMH-DkgXg7cM.js} +1 -1
  98. package/web-shell/assets/{chunk-4BX2VUAB-DrA07nW2.js → chunk-4BX2VUAB-DdM45KFM.js} +1 -1
  99. package/web-shell/assets/{chunk-55IACEB6-CFGnVU2f.js → chunk-55IACEB6-CmdsDjD4.js} +1 -1
  100. package/web-shell/assets/{chunk-727SXJPM-BTMkq3Tk.js → chunk-727SXJPM-CQ4pJ5GH.js} +1 -1
  101. package/web-shell/assets/{chunk-AQP2D5EJ-C9sYg04Z.js → chunk-AQP2D5EJ-Dy6UWz37.js} +1 -1
  102. package/web-shell/assets/{chunk-FMBD7UC4-Cag-cj6I.js → chunk-FMBD7UC4-CC8nFqap.js} +1 -1
  103. package/web-shell/assets/{chunk-ND2GUHAM-CDSTFoR7.js → chunk-ND2GUHAM-CkmS7lx7.js} +1 -1
  104. package/web-shell/assets/{chunk-QZHKN3VN-CN9Z6oOs.js → chunk-QZHKN3VN-DynyqleZ.js} +1 -1
  105. package/web-shell/assets/classDiagram-4FO5ZUOK-CwH_F8cH.js +1 -0
  106. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-CwH_F8cH.js +1 -0
  107. package/web-shell/assets/{cose-bilkent-S5V4N54A-DuN9j8Du.js → cose-bilkent-S5V4N54A-DA0fzCsY.js} +1 -1
  108. package/web-shell/assets/{dagre-BM42HDAG-ByCWe45f.js → dagre-BM42HDAG-DHYXRqCo.js} +1 -1
  109. package/web-shell/assets/{diagram-2AECGRRQ-eWyU_pKZ.js → diagram-2AECGRRQ-DWD6BcPs.js} +1 -1
  110. package/web-shell/assets/{diagram-5GNKFQAL-0Bfu3Fq5.js → diagram-5GNKFQAL-CX9wnqVc.js} +1 -1
  111. package/web-shell/assets/{diagram-KO2AKTUF-B6KBKkQP.js → diagram-KO2AKTUF-BpE8Kbt8.js} +1 -1
  112. package/web-shell/assets/{diagram-LMA3HP47-TToDmeA_.js → diagram-LMA3HP47-DLPcrP0C.js} +1 -1
  113. package/web-shell/assets/{diagram-OG6HWLK6-CQCkC2Yx.js → diagram-OG6HWLK6-CSUCBsCe.js} +1 -1
  114. package/web-shell/assets/{erDiagram-TEJ5UH35-Cm9ls1iB.js → erDiagram-TEJ5UH35-d3Z0uMXS.js} +1 -1
  115. package/web-shell/assets/{flowDiagram-I6XJVG4X-Dyoz80Pv.js → flowDiagram-I6XJVG4X-C7vj5FX3.js} +1 -1
  116. package/web-shell/assets/{ganttDiagram-6RSMTGT7-Cfut9yaU.js → ganttDiagram-6RSMTGT7-BV9UvDV_.js} +1 -1
  117. package/web-shell/assets/{gitGraphDiagram-PVQCEYII-BCuJdlfD.js → gitGraphDiagram-PVQCEYII-CoWp0mW4.js} +1 -1
  118. package/web-shell/assets/index-CjTH6cLP.js +516 -0
  119. package/web-shell/assets/{infoDiagram-5YYISTIA-CXKxF2VL.js → infoDiagram-5YYISTIA-DUswfJHA.js} +1 -1
  120. package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-DE7HWSU8.js → ishikawaDiagram-YF4QCWOH-WidEKukx.js} +1 -1
  121. package/web-shell/assets/{journeyDiagram-JHISSGLW-D__YUfds.js → journeyDiagram-JHISSGLW-D7IRK3VN.js} +1 -1
  122. package/web-shell/assets/{kanban-definition-UN3LZRKU-D82R169M.js → kanban-definition-UN3LZRKU-CwFJ6Cja.js} +1 -1
  123. package/web-shell/assets/{linear-DpyMbKqT.js → linear-BQ8GvDRY.js} +1 -1
  124. package/web-shell/assets/{mermaid.core-D1KEFDhn.js → mermaid.core-CwF8A_xO.js} +5 -5
  125. package/web-shell/assets/{mindmap-definition-RKZ34NQL-BwVUFGFE.js → mindmap-definition-RKZ34NQL-TR1s0iZi.js} +1 -1
  126. package/web-shell/assets/{pieDiagram-4H26LBE5-BO_qoEGx.js → pieDiagram-4H26LBE5-Cd91pMl9.js} +1 -1
  127. package/web-shell/assets/{quadrantDiagram-W4KKPZXB-Cx0ZaWPo.js → quadrantDiagram-W4KKPZXB-BGxGDNMl.js} +1 -1
  128. package/web-shell/assets/{requirementDiagram-4Y6WPE33-BJPXejOA.js → requirementDiagram-4Y6WPE33-Cq3fWmYz.js} +1 -1
  129. package/web-shell/assets/{sankeyDiagram-5OEKKPKP-C1xeIL9i.js → sankeyDiagram-5OEKKPKP-ChLyGdq0.js} +1 -1
  130. package/web-shell/assets/{sequenceDiagram-3UESZ5HK-CSYKQUjf.js → sequenceDiagram-3UESZ5HK-tazy79aB.js} +1 -1
  131. package/web-shell/assets/{stateDiagram-AJRCARHV-d9hiHlAW.js → stateDiagram-AJRCARHV-dIYLUNSf.js} +1 -1
  132. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-luL7KTiX.js +1 -0
  133. package/web-shell/assets/{timeline-definition-PNZ67QCA-BhCBkq8k.js → timeline-definition-PNZ67QCA-BuENhrC2.js} +1 -1
  134. package/web-shell/assets/{vennDiagram-CIIHVFJN-DPPFWp_y.js → vennDiagram-CIIHVFJN-DLtum9dF.js} +1 -1
  135. package/web-shell/assets/{wardley-L42UT6IY-CcOUIgXY.js → wardley-L42UT6IY-Bf7OSF3y.js} +1 -1
  136. package/web-shell/assets/{wardleyDiagram-YWT4CUSO-p7oR5X7r.js → wardleyDiagram-YWT4CUSO-slMw3OB3.js} +1 -1
  137. package/web-shell/assets/{xychartDiagram-2RQKCTM6-Dfr7-SEy.js → xychartDiagram-2RQKCTM6-CdxOm8oC.js} +1 -1
  138. package/web-shell/index.html +1 -1
  139. package/chunks/chunk-77WXWU44.js +0 -26
  140. package/chunks/contextCommand-3327KUC4.js +0 -54
  141. package/web-shell/assets/channel-WwImfsc7.js +0 -1
  142. package/web-shell/assets/classDiagram-4FO5ZUOK-CJKQYFeJ.js +0 -1
  143. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-CJKQYFeJ.js +0 -1
  144. package/web-shell/assets/index-DaebdpHq.js +0 -516
  145. 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-F5E6IKYN.js";
71
+ parseAcpBaseModelId,
72
+ reloadEnvironment,
73
+ resolveCliGenerationConfig,
74
+ sanitizeProviderBaseUrl
75
+ } from "./chunk-OJMCOR55.js";
76
+ import {
77
+ SUPPORTED_LANGUAGES,
78
+ writeStderrLine,
79
+ writeStdoutLine
80
+ } from "./chunk-NQDRRVJD.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-C7JA3XCX.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-VECKCOH6.js";
123
+ } from "./chunk-2X2WXY6L.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-57XRIZVC.js";
129
+ import "./chunk-255L5QYW.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-2CNO5W47.js";
168
+ } from "./chunk-YMBWB67C.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-PO5LVPK3.js";
176
+ import "./chunk-PLY4F7QW.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-JDV3VBPY.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(
@@ -19083,6 +19093,14 @@ function createAcpSessionBridge(opts) {
19083
19093
  transportClosed
19084
19094
  ]);
19085
19095
  publishModelSwitched(entry, modelId, originatorClientId);
19096
+ broadcastWorkspaceEvent({
19097
+ type: "settings_changed",
19098
+ data: {
19099
+ key: "model.name",
19100
+ value: modelId
19101
+ },
19102
+ ...originatorClientId ? { originatorClientId } : {}
19103
+ });
19086
19104
  succeeded = true;
19087
19105
  } catch (err) {
19088
19106
  entry.events.publish({
@@ -20160,14 +20178,14 @@ function createAcpSessionBridge(opts) {
20160
20178
  const branchDisplayName = typeof rawBranchName === "string" ? rawBranchName : result.newSessionId.slice(0, 8);
20161
20179
  let restored;
20162
20180
  try {
20163
- restored = await restoreSession("resume", {
20181
+ restored = await restoreSession("load", {
20164
20182
  sessionId: result.newSessionId,
20165
20183
  workspaceCwd: boundWorkspace,
20166
20184
  clientId: context?.clientId
20167
20185
  });
20168
20186
  } catch (restoreErr) {
20169
20187
  writeStderrLine2(
20170
- `qwen serve: branchSession resume failed for ${result.newSessionId}, attempting cleanup...`
20188
+ `qwen serve: branchSession load failed for ${result.newSessionId}, attempting cleanup...`
20171
20189
  );
20172
20190
  try {
20173
20191
  await ci.connection.extMethod(
@@ -20193,8 +20211,7 @@ function createAcpSessionBridge(opts) {
20193
20211
  data: eventData,
20194
20212
  ...originatorClientId ? { originatorClientId } : {}
20195
20213
  };
20196
- entry.events.publish(branchEnvelope);
20197
- broadcastWorkspaceEvent(branchEnvelope, sessionId);
20214
+ newEntry?.events.publish(branchEnvelope);
20198
20215
  return {
20199
20216
  ...restored,
20200
20217
  displayName: branchDisplayName,
@@ -20536,6 +20553,14 @@ function createAcpSessionBridge(opts) {
20536
20553
  transportClosed
20537
20554
  ]);
20538
20555
  publishModelSwitched(entry, req.modelId, originatorClientId);
20556
+ broadcastWorkspaceEvent({
20557
+ type: "settings_changed",
20558
+ data: {
20559
+ key: "model.name",
20560
+ value: req.modelId
20561
+ },
20562
+ ...originatorClientId ? { originatorClientId } : {}
20563
+ });
20539
20564
  succeeded = true;
20540
20565
  return result;
20541
20566
  } finally {
@@ -20818,6 +20843,68 @@ function createAcpSessionBridge(opts) {
20818
20843
  answer: response.answer ?? null
20819
20844
  };
20820
20845
  },
20846
+ async launchSessionForkAgent(sessionId, directive, context) {
20847
+ const entry = byId.get(sessionId);
20848
+ if (!entry) throw new SessionNotFoundError(sessionId);
20849
+ const info = channelInfoForEntry(entry);
20850
+ if (!info || info.isDying) throw new SessionNotFoundError(sessionId);
20851
+ resolveTrustedClientId(entry, context?.clientId);
20852
+ const trimmed = directive.trim();
20853
+ if (!trimmed) {
20854
+ throw new Error("Fork directive is required");
20855
+ }
20856
+ if (entry.pendingPromptCount > 0 || entry.promptActive) {
20857
+ throw new SessionBusyError(
20858
+ sessionId,
20859
+ "Cannot fork while a response or tool call is in progress"
20860
+ );
20861
+ }
20862
+ return entry.promptQueue.then(async () => {
20863
+ if (entry.pendingPromptCount > 0 || entry.promptActive) {
20864
+ throw new SessionBusyError(
20865
+ sessionId,
20866
+ "Cannot fork while a response or tool call is in progress"
20867
+ );
20868
+ }
20869
+ opts.onDiagnosticLine?.(
20870
+ `qwen serve: launchSessionForkAgent requested for session=${sessionId}`,
20871
+ "info"
20872
+ );
20873
+ let response;
20874
+ try {
20875
+ response = await Promise.race([
20876
+ withTimeout(
20877
+ entry.connection.extMethod(
20878
+ SERVE_CONTROL_EXT_METHODS.sessionForkAgent,
20879
+ {
20880
+ sessionId,
20881
+ directive: trimmed
20882
+ }
20883
+ ),
20884
+ initTimeoutMs,
20885
+ SERVE_CONTROL_EXT_METHODS.sessionForkAgent
20886
+ ),
20887
+ getTransportClosedReject(entry)
20888
+ ]);
20889
+ } catch (error2) {
20890
+ opts.onDiagnosticLine?.(
20891
+ `qwen serve: launchSessionForkAgent failed for session=${sessionId}: ${error2 instanceof Error ? error2.message : String(error2)}`,
20892
+ "warn"
20893
+ );
20894
+ throw error2;
20895
+ }
20896
+ const result = {
20897
+ sessionId: entry.sessionId,
20898
+ description: response.description ?? trimmed.slice(0, 60),
20899
+ launched: response.launched === true
20900
+ };
20901
+ opts.onDiagnosticLine?.(
20902
+ `qwen serve: launchSessionForkAgent completed for session=${sessionId} launched=${result.launched}`,
20903
+ "info"
20904
+ );
20905
+ return result;
20906
+ });
20907
+ },
20821
20908
  async executeShellCommand(sessionId, command, signal, context) {
20822
20909
  opts.onDiagnosticLine?.(
20823
20910
  `qwen serve: bridge executeShellCommand for session=${sessionId}`,
@@ -21261,7 +21348,7 @@ var createHttpAcpBridge = createAcpSessionBridge;
21261
21348
  // packages/acp-bridge/src/bridgeFileSystem.ts
21262
21349
  init_esbuild_shims();
21263
21350
 
21264
- // packages/cli/src/serve/auth/qwenDeviceFlowProvider.ts
21351
+ // packages/cli/src/serve/auth/qwen-device-flow-provider.ts
21265
21352
  init_esbuild_shims();
21266
21353
  var QWEN_OAUTH_SCOPE = "openid profile email model.completion";
21267
21354
  var STDERR_DETAIL_MAX = 2048;
@@ -21430,7 +21517,7 @@ function mapRfc8628OAuthCode(code) {
21430
21517
  }
21431
21518
  __name(mapRfc8628OAuthCode, "mapRfc8628OAuthCode");
21432
21519
 
21433
- // packages/cli/src/serve/bridgeFileSystemAdapter.ts
21520
+ // packages/cli/src/serve/bridge-file-system-adapter.ts
21434
21521
  init_esbuild_shims();
21435
21522
  var ACP_WRITE_ROUTE = "ACP writeTextFile";
21436
21523
  var ACP_READ_ROUTE = "ACP readTextFile";
@@ -21468,11 +21555,11 @@ function createBridgeFileSystemAdapter(factory) {
21468
21555
  }
21469
21556
  __name(createBridgeFileSystemAdapter, "createBridgeFileSystemAdapter");
21470
21557
 
21471
- // packages/cli/src/serve/daemonStatusProvider.ts
21558
+ // packages/cli/src/serve/daemon-status-provider.ts
21472
21559
  init_esbuild_shims();
21473
21560
  import { promises as fs2 } from "node:fs";
21474
21561
 
21475
- // packages/cli/src/serve/envSnapshot.ts
21562
+ // packages/cli/src/serve/env-snapshot.ts
21476
21563
  init_esbuild_shims();
21477
21564
  import os2 from "node:os";
21478
21565
  var SECRET_ENV_VARS = [
@@ -21603,7 +21690,7 @@ var ENV_SECRET_VARS = SECRET_ENV_VARS;
21603
21690
  var ENV_NONSECRET_VARS = NONSECRET_ENV_VARS;
21604
21691
  var ENV_PROXY_VARS = PROXY_VARS;
21605
21692
 
21606
- // packages/cli/src/serve/daemonStatusProvider.ts
21693
+ // packages/cli/src/serve/daemon-status-provider.ts
21607
21694
  var REQUIRED_NODE_MAJOR = 22;
21608
21695
  function createDaemonStatusProvider() {
21609
21696
  return {
@@ -21772,7 +21859,232 @@ async function safeCheck(kind, body) {
21772
21859
  }
21773
21860
  __name(safeCheck, "safeCheck");
21774
21861
 
21775
- // packages/cli/src/serve/debugMode.ts
21862
+ // packages/cli/src/serve/workspace-providers-status.ts
21863
+ init_esbuild_shims();
21864
+ function createWorkspaceProvidersStatusProvider(options = {}) {
21865
+ return async (workspaceCwd, acpChannelLive) => buildWorkspaceProvidersStatus(workspaceCwd, acpChannelLive, options);
21866
+ }
21867
+ __name(createWorkspaceProvidersStatusProvider, "createWorkspaceProvidersStatusProvider");
21868
+ function buildWorkspaceProvidersStatus(workspaceCwd, acpChannelLive, options) {
21869
+ try {
21870
+ const loaded = loadSettings(workspaceCwd);
21871
+ const settings = loaded.merged;
21872
+ const env = options.env ?? process.env;
21873
+ const selectedAuthType = settings.security?.auth?.selectedType ?? getAuthTypeFromEnv();
21874
+ const argv = {
21875
+ model: options.argv?.model,
21876
+ openaiApiKey: options.argv?.openaiApiKey,
21877
+ openaiBaseUrl: options.argv?.openaiBaseUrl,
21878
+ openaiLogging: options.argv?.openaiLogging,
21879
+ openaiLoggingDir: options.argv?.openaiLoggingDir
21880
+ };
21881
+ const resolvedCliConfig = resolveCliGenerationConfig({
21882
+ argv,
21883
+ settings,
21884
+ selectedAuthType,
21885
+ env
21886
+ });
21887
+ const modelsConfig = new ModelsConfig({
21888
+ initialAuthType: selectedAuthType,
21889
+ modelProvidersConfig: settings.modelProviders,
21890
+ generationConfig: resolvedCliConfig.generationConfig,
21891
+ generationConfigSources: resolvedCliConfig.sources
21892
+ });
21893
+ const currentAuth = selectedAuthType;
21894
+ const currentModelId = (resolvedCliConfig.model || modelsConfig.getModel() || "").trim();
21895
+ const hasCurrentModel = currentModelId.length > 0;
21896
+ const currentAcpModelId = hasCurrentModel && currentAuth ? formatAcpModelId(currentModelId, currentAuth) : currentModelId || void 0;
21897
+ const currentBaseUrl = resolvedCliConfig.sources["baseUrl"] ? resolvedCliConfig.baseUrl || void 0 : void 0;
21898
+ const fastModelId = typeof settings.fastModel === "string" && settings.fastModel.length > 0 ? settings.fastModel : void 0;
21899
+ const providers = /* @__PURE__ */ new Map();
21900
+ const explicitModelBaseUrls = buildExplicitModelBaseUrls(
21901
+ settings.modelProviders
21902
+ );
21903
+ for (const model of modelsConfig.getAllConfiguredModels()) {
21904
+ if (model.isRuntimeModel) continue;
21905
+ const authType = String(model.authType);
21906
+ let provider = providers.get(authType);
21907
+ if (!provider) {
21908
+ provider = {
21909
+ kind: "model_provider",
21910
+ status: "ok",
21911
+ authType,
21912
+ current: false,
21913
+ models: []
21914
+ };
21915
+ providers.set(authType, provider);
21916
+ }
21917
+ const effectiveModelId = model.id;
21918
+ const modelId = formatAcpModelId(effectiveModelId, model.authType);
21919
+ const isCurrent = currentAuth === model.authType && hasCurrentModel && matchesCurrentModel(currentModelId, effectiveModelId, modelId) && matchesCurrentBaseUrl(
21920
+ currentBaseUrl,
21921
+ model.baseUrl,
21922
+ model.baseUrl !== void 0 && explicitModelBaseUrls.has(
21923
+ modelBaseUrlKey(authType, effectiveModelId, model.baseUrl)
21924
+ )
21925
+ );
21926
+ const providerModel = {
21927
+ modelId,
21928
+ baseModelId: parseAcpBaseModelId(effectiveModelId),
21929
+ name: model.label,
21930
+ ...model.description !== void 0 ? { description: model.description } : {},
21931
+ contextLimit: model.contextWindowSize ?? tokenLimit(effectiveModelId),
21932
+ ...model.modalities !== void 0 ? { modalities: model.modalities } : {},
21933
+ ...model.baseUrl !== void 0 ? { baseUrl: sanitizeProviderBaseUrl(model.baseUrl) } : {},
21934
+ ...model.envKey !== void 0 ? { envKey: model.envKey } : {},
21935
+ isCurrent,
21936
+ isRuntime: false
21937
+ };
21938
+ provider.models.push(providerModel);
21939
+ if (isCurrent) provider.current = true;
21940
+ }
21941
+ const current = buildCurrent(
21942
+ currentAuth,
21943
+ currentAcpModelId,
21944
+ currentBaseUrl,
21945
+ fastModelId
21946
+ );
21947
+ return {
21948
+ v: STATUS_SCHEMA_VERSION,
21949
+ workspaceCwd,
21950
+ initialized: true,
21951
+ acpChannelLive,
21952
+ ...current ? { current } : {},
21953
+ providers: [...providers.values()],
21954
+ ...resolvedCliConfig.warnings.length > 0 ? {
21955
+ errors: resolvedCliConfig.warnings.map((warning) => ({
21956
+ kind: "providers",
21957
+ status: "warning",
21958
+ error: sanitizeProviderWarning(warning)
21959
+ }))
21960
+ } : {}
21961
+ };
21962
+ } catch (error2) {
21963
+ return {
21964
+ v: STATUS_SCHEMA_VERSION,
21965
+ workspaceCwd,
21966
+ initialized: false,
21967
+ acpChannelLive,
21968
+ providers: [],
21969
+ errors: [
21970
+ {
21971
+ kind: "providers",
21972
+ status: "error",
21973
+ error: sanitizeProviderWarning(
21974
+ error2 instanceof Error ? error2.message : String(error2)
21975
+ )
21976
+ }
21977
+ ]
21978
+ };
21979
+ }
21980
+ }
21981
+ __name(buildWorkspaceProvidersStatus, "buildWorkspaceProvidersStatus");
21982
+ function matchesCurrentModel(currentModelId, baseModelId, acpModelId) {
21983
+ return currentModelId === baseModelId || currentModelId === acpModelId;
21984
+ }
21985
+ __name(matchesCurrentModel, "matchesCurrentModel");
21986
+ function matchesCurrentBaseUrl(currentBaseUrl, modelBaseUrl, modelHasExplicitBaseUrl) {
21987
+ if (!currentBaseUrl) return !modelHasExplicitBaseUrl;
21988
+ return currentBaseUrl === modelBaseUrl;
21989
+ }
21990
+ __name(matchesCurrentBaseUrl, "matchesCurrentBaseUrl");
21991
+ function buildExplicitModelBaseUrls(modelProviders) {
21992
+ const baseUrls = /* @__PURE__ */ new Set();
21993
+ if (!modelProviders) return baseUrls;
21994
+ for (const [authType, providerConfig] of Object.entries(modelProviders)) {
21995
+ const models = readProviderModels(providerConfig);
21996
+ for (const model of models) {
21997
+ if (typeof model.id === "string" && typeof model.baseUrl === "string" && model.baseUrl.length > 0) {
21998
+ baseUrls.add(modelBaseUrlKey(authType, model.id, model.baseUrl));
21999
+ }
22000
+ }
22001
+ }
22002
+ return baseUrls;
22003
+ }
22004
+ __name(buildExplicitModelBaseUrls, "buildExplicitModelBaseUrls");
22005
+ function readProviderModels(providerConfig) {
22006
+ if (Array.isArray(providerConfig)) {
22007
+ return providerConfig.filter(isProviderModelBaseUrlConfig);
22008
+ }
22009
+ if (typeof providerConfig !== "object" || providerConfig === null) {
22010
+ return [];
22011
+ }
22012
+ const { models } = providerConfig;
22013
+ return Array.isArray(models) ? models.filter(isProviderModelBaseUrlConfig) : [];
22014
+ }
22015
+ __name(readProviderModels, "readProviderModels");
22016
+ function isProviderModelBaseUrlConfig(value) {
22017
+ return typeof value === "object" && value !== null;
22018
+ }
22019
+ __name(isProviderModelBaseUrlConfig, "isProviderModelBaseUrlConfig");
22020
+ function modelBaseUrlKey(authType, modelId, baseUrl) {
22021
+ return `${authType}\0${modelId}\0${baseUrl}`;
22022
+ }
22023
+ __name(modelBaseUrlKey, "modelBaseUrlKey");
22024
+ var URL_LIKE_PATTERN = /\b[A-Za-z][A-Za-z\d+.-]*:\/\/[^\s'"`<>]+/g;
22025
+ var URL_START_PATTERN = /\b[A-Za-z][A-Za-z\d+.-]*:\/\//g;
22026
+ function sanitizeProviderWarning(warning) {
22027
+ let result = "";
22028
+ let index = 0;
22029
+ let next = findNextUrlStart(warning, index);
22030
+ while (next) {
22031
+ result += warning.slice(index, next.index);
22032
+ const segmentEnd = findUrlSegmentEnd(warning, next.index, next.marker);
22033
+ const segment = warning.slice(next.index, segmentEnd);
22034
+ result += sanitizeProviderWarningSegment(segment, next.marker.length);
22035
+ index = segmentEnd;
22036
+ next = findNextUrlStart(warning, index);
22037
+ }
22038
+ return result + warning.slice(index);
22039
+ }
22040
+ __name(sanitizeProviderWarning, "sanitizeProviderWarning");
22041
+ function findNextUrlStart(value, from) {
22042
+ URL_START_PATTERN.lastIndex = from;
22043
+ const match = URL_START_PATTERN.exec(value);
22044
+ return match ? { index: match.index, marker: match[0] } : void 0;
22045
+ }
22046
+ __name(findNextUrlStart, "findNextUrlStart");
22047
+ function findUrlSegmentEnd(value, start, marker) {
22048
+ const afterMarker = start + marker.length;
22049
+ const carriageReturn = value.indexOf("\r", afterMarker);
22050
+ const lineFeed = value.indexOf("\n", afterMarker);
22051
+ let lineEnd = value.length;
22052
+ if (carriageReturn !== -1) lineEnd = Math.min(lineEnd, carriageReturn);
22053
+ if (lineFeed !== -1) lineEnd = Math.min(lineEnd, lineFeed);
22054
+ const nextUrl = findNextUrlStart(value, afterMarker);
22055
+ return Math.min(lineEnd, nextUrl?.index ?? value.length);
22056
+ }
22057
+ __name(findUrlSegmentEnd, "findUrlSegmentEnd");
22058
+ function sanitizeProviderWarningSegment(segment, markerLength) {
22059
+ const at = segment.indexOf("@", markerLength);
22060
+ if (at !== -1 && hasCredentialPrefix(segment, markerLength, at) && segment[at + 1] !== void 0 && /[A-Za-z0-9.[\]-]/.test(segment[at + 1])) {
22061
+ return `${segment.slice(0, markerLength)}${segment.slice(at + 1)}`;
22062
+ }
22063
+ return segment.replace(
22064
+ URL_LIKE_PATTERN,
22065
+ (url) => sanitizeProviderBaseUrl(url)
22066
+ );
22067
+ }
22068
+ __name(sanitizeProviderWarningSegment, "sanitizeProviderWarningSegment");
22069
+ function hasCredentialPrefix(segment, markerLength, at) {
22070
+ const colon = segment.indexOf(":", markerLength);
22071
+ if (colon === -1 || colon > at) return false;
22072
+ const username = segment.slice(markerLength, colon);
22073
+ return !/[/?#\s'"`<>]/.test(username);
22074
+ }
22075
+ __name(hasCredentialPrefix, "hasCredentialPrefix");
22076
+ function buildCurrent(authType, modelId, baseUrl, fastModelId) {
22077
+ if (!authType && !modelId && !baseUrl && !fastModelId) return void 0;
22078
+ return {
22079
+ ...authType ? { authType: String(authType) } : {},
22080
+ ...modelId ? { modelId } : {},
22081
+ ...baseUrl ? { baseUrl: sanitizeProviderBaseUrl(baseUrl) } : {},
22082
+ ...fastModelId ? { fastModelId } : {}
22083
+ };
22084
+ }
22085
+ __name(buildCurrent, "buildCurrent");
22086
+
22087
+ // packages/cli/src/serve/debug-mode.ts
21776
22088
  init_esbuild_shims();
21777
22089
  function isServeDebugMode() {
21778
22090
  const value = process.env["QWEN_SERVE_DEBUG"];
@@ -21781,11 +22093,11 @@ function isServeDebugMode() {
21781
22093
  }
21782
22094
  __name(isServeDebugMode, "isServeDebugMode");
21783
22095
 
21784
- // packages/cli/src/serve/acpHttp/index.ts
22096
+ // packages/cli/src/serve/acp-http/index.ts
21785
22097
  init_esbuild_shims();
21786
22098
  import { createHash as createHash4, timingSafeEqual as timingSafeEqual2 } from "node:crypto";
21787
22099
 
21788
- // packages/cli/src/serve/acpHttp/dispatch.ts
22100
+ // packages/cli/src/serve/acp-http/dispatch.ts
21789
22101
  init_esbuild_shims();
21790
22102
  import path8 from "node:path";
21791
22103
 
@@ -22270,7 +22582,7 @@ function createAuditPublisher(deps) {
22270
22582
  }
22271
22583
  __name(createAuditPublisher, "createAuditPublisher");
22272
22584
 
22273
- // packages/cli/src/serve/fs/workspaceFileSystem.ts
22585
+ // packages/cli/src/serve/fs/workspace-file-system.ts
22274
22586
  init_esbuild_shims();
22275
22587
  import { createHash as createHash3, randomBytes } from "node:crypto";
22276
22588
  import { promises as fsp2 } from "node:fs";
@@ -22281,6 +22593,7 @@ function createWorkspaceFileSystemFactory(deps) {
22281
22593
  projectRoot: boundWorkspace,
22282
22594
  useGitignore: true,
22283
22595
  useQwenignore: true,
22596
+ ...deps.customIgnoreFiles !== void 0 ? { customIgnoreFiles: deps.customIgnoreFiles } : {},
22284
22597
  ignoreDirs: []
22285
22598
  });
22286
22599
  Object.freeze(ignore);
@@ -22355,6 +22668,12 @@ var WorkspaceFileSystemImpl = class {
22355
22668
  `line must be a positive integer, got ${opts.line}`
22356
22669
  );
22357
22670
  }
22671
+ if (opts.limit !== void 0 && (!Number.isSafeInteger(opts.limit) || opts.limit < 1)) {
22672
+ throw new FsError(
22673
+ "parse_error",
22674
+ `limit must be a positive integer, got ${opts.limit}`
22675
+ );
22676
+ }
22358
22677
  const snapshot = await readTextSnapshotFromResolvedFile(p, opts);
22359
22678
  const ignoreVerdict = shouldIgnore(
22360
22679
  p,
@@ -22452,6 +22771,12 @@ var WorkspaceFileSystemImpl = class {
22452
22771
  const start = performance.now();
22453
22772
  try {
22454
22773
  assertTrustedForIntent(this.deps.trusted, "list");
22774
+ if (opts.maxEntries !== void 0 && (!Number.isSafeInteger(opts.maxEntries) || opts.maxEntries < 1)) {
22775
+ throw new FsError(
22776
+ "parse_error",
22777
+ `maxEntries must be a positive integer, got ${opts.maxEntries}`
22778
+ );
22779
+ }
22455
22780
  const entries = [];
22456
22781
  const dir = await fsp2.opendir(p);
22457
22782
  for await (const d of dir) {
@@ -23541,7 +23866,7 @@ function buildWriteMeta(opts) {
23541
23866
  }
23542
23867
  __name(buildWriteMeta, "buildWriteMeta");
23543
23868
 
23544
- // packages/cli/src/serve/workspaceMemory.ts
23869
+ // packages/cli/src/serve/workspace-memory.ts
23545
23870
  init_esbuild_shims();
23546
23871
  import { promises as fs3 } from "node:fs";
23547
23872
  import * as path7 from "node:path";
@@ -23783,14 +24108,14 @@ function isEnoent(err) {
23783
24108
  }
23784
24109
  __name(isEnoent, "isEnoent");
23785
24110
 
23786
- // packages/cli/src/serve/workspaceAgents.ts
24111
+ // packages/cli/src/serve/workspace-agents.ts
23787
24112
  init_esbuild_shims();
23788
24113
  import { promises as fs4 } from "node:fs";
23789
24114
 
23790
- // packages/cli/src/serve/acpSessionBridge.ts
24115
+ // packages/cli/src/serve/acp-session-bridge.ts
23791
24116
  init_esbuild_shims();
23792
24117
 
23793
- // packages/cli/src/serve/workspaceAgents.ts
24118
+ // packages/cli/src/serve/workspace-agents.ts
23794
24119
  var AGENT_TYPE_PATTERN = /^[\p{L}\p{N}_-]+$/u;
23795
24120
  var AGENT_TYPE_MAX_LENGTH = 64;
23796
24121
  var AGENT_TYPE_MIN_LENGTH = 2;
@@ -24655,7 +24980,7 @@ function createDaemonSubagentManager(boundWorkspace) {
24655
24980
  }
24656
24981
  __name(createDaemonSubagentManager, "createDaemonSubagentManager");
24657
24982
 
24658
- // packages/cli/src/serve/acpHttp/jsonRpc.ts
24983
+ // packages/cli/src/serve/acp-http/json-rpc.ts
24659
24984
  init_esbuild_shims();
24660
24985
  var QWEN_METHOD_NS = "_qwen/";
24661
24986
  var QWEN_META_KEY = "qwen";
@@ -24735,7 +25060,7 @@ function parseInbound(raw) {
24735
25060
  }
24736
25061
  __name(parseInbound, "parseInbound");
24737
25062
 
24738
- // packages/cli/src/serve/acpHttp/dispatch.ts
25063
+ // packages/cli/src/serve/acp-http/dispatch.ts
24739
25064
  function errMsg(err) {
24740
25065
  return err instanceof Error ? err.message : String(err);
24741
25066
  }
@@ -26904,7 +27229,7 @@ var AcpDispatcher = class {
26904
27229
  }
26905
27230
  };
26906
27231
 
26907
- // packages/cli/src/serve/acpHttp/connectionRegistry.ts
27232
+ // packages/cli/src/serve/acp-http/connection-registry.ts
26908
27233
  init_esbuild_shims();
26909
27234
  import { randomUUID as randomUUID4 } from "node:crypto";
26910
27235
  var MAX_BUFFERED_FRAMES = 256;
@@ -27253,7 +27578,7 @@ function sumBy(values, select) {
27253
27578
  }
27254
27579
  __name(sumBy, "sumBy");
27255
27580
 
27256
- // packages/cli/src/serve/acpHttp/sseStream.ts
27581
+ // packages/cli/src/serve/acp-http/sse-stream.ts
27257
27582
  init_esbuild_shims();
27258
27583
  var SseStream = class {
27259
27584
  constructor(res, onClose, onHeartbeat) {
@@ -27372,7 +27697,7 @@ var SseStream = class {
27372
27697
  }
27373
27698
  };
27374
27699
 
27375
- // packages/cli/src/serve/acpHttp/wsStream.ts
27700
+ // packages/cli/src/serve/acp-http/ws-stream.ts
27376
27701
  init_esbuild_shims();
27377
27702
  var WsStream = class {
27378
27703
  constructor(ws, onClose, onHeartbeat) {
@@ -27460,7 +27785,7 @@ var WsStream = class {
27460
27785
  }
27461
27786
  };
27462
27787
 
27463
- // packages/cli/src/serve/acpHttp/index.ts
27788
+ // packages/cli/src/serve/acp-http/index.ts
27464
27789
  var ACP_CONNECTION_HEADER = "acp-connection-id";
27465
27790
  var ACP_SESSION_HEADER = "acp-session-id";
27466
27791
  var CONN_GRACE_MS = 1e4;
@@ -28006,7 +28331,7 @@ function isLoopbackReq(req) {
28006
28331
  }
28007
28332
  __name(isLoopbackReq, "isLoopbackReq");
28008
28333
 
28009
- // packages/cli/src/serve/daemonStatus.ts
28334
+ // packages/cli/src/serve/daemon-status.ts
28010
28335
  init_esbuild_shims();
28011
28336
  var DEFAULT_LISTENER_MAX_CONNECTIONS = 256;
28012
28337
  var SECTION_TIMEOUT_MS = 1e3;
@@ -29345,7 +29670,7 @@ function getDemoHtml(_port) {
29345
29670
  }
29346
29671
  __name(getDemoHtml, "getDemoHtml");
29347
29672
 
29348
- // packages/cli/src/serve/webShellStatic.ts
29673
+ // packages/cli/src/serve/web-shell-static.ts
29349
29674
  init_esbuild_shims();
29350
29675
  var import_express = __toESM(require_express2(), 1);
29351
29676
  import { existsSync } from "node:fs";
@@ -29449,7 +29774,7 @@ function mountWebShellSpaFallback(app, webShellDir) {
29449
29774
  }
29450
29775
  __name(mountWebShellSpaFallback, "mountWebShellSpaFallback");
29451
29776
 
29452
- // packages/cli/src/serve/routes/workspaceFileRead.ts
29777
+ // packages/cli/src/serve/routes/workspace-file-read.ts
29453
29778
  init_esbuild_shims();
29454
29779
  import * as path10 from "node:path";
29455
29780
  var MAX_LIST_ENTRIES = 2e3;
@@ -29796,7 +30121,7 @@ function registerWorkspaceFileReadRoutes(app, deps) {
29796
30121
  }
29797
30122
  __name(registerWorkspaceFileReadRoutes, "registerWorkspaceFileReadRoutes");
29798
30123
 
29799
- // packages/cli/src/serve/routes/workspaceFileWrite.ts
30124
+ // packages/cli/src/serve/routes/workspace-file-write.ts
29800
30125
  init_esbuild_shims();
29801
30126
  function getFsFactory2(req, res) {
29802
30127
  const factory = req.app.locals.fsFactory;
@@ -30059,6 +30384,7 @@ function createDaemonWorkspaceService(deps) {
30059
30384
  boundWorkspace,
30060
30385
  contextFilename,
30061
30386
  statusProvider,
30387
+ workspaceProvidersStatusProvider,
30062
30388
  isChannelLive,
30063
30389
  persistDisabledTools,
30064
30390
  queryWorkspaceStatus,
@@ -30081,6 +30407,12 @@ function createDaemonWorkspaceService(deps) {
30081
30407
  );
30082
30408
  },
30083
30409
  async getWorkspaceProvidersStatus(_ctx) {
30410
+ if (workspaceProvidersStatusProvider) {
30411
+ return workspaceProvidersStatusProvider(
30412
+ boundWorkspace,
30413
+ isChannelLive?.() ?? false
30414
+ );
30415
+ }
30084
30416
  return queryWorkspaceStatus(
30085
30417
  SERVE_STATUS_EXT_METHODS.workspaceProviders,
30086
30418
  () => createIdleWorkspaceProvidersStatus(boundWorkspace)
@@ -30454,7 +30786,7 @@ function createDaemonWorkspaceService(deps) {
30454
30786
  }
30455
30787
  __name(createDaemonWorkspaceService, "createDaemonWorkspaceService");
30456
30788
 
30457
- // packages/cli/src/serve/routes/workspaceSettings.ts
30789
+ // packages/cli/src/serve/routes/workspace-settings.ts
30458
30790
  init_esbuild_shims();
30459
30791
  var TUI_ONLY_SETTINGS = /* @__PURE__ */ new Set([
30460
30792
  "general.vimMode",
@@ -30679,7 +31011,7 @@ function registerWorkspaceSettingsRoutes(app, deps) {
30679
31011
  }
30680
31012
  __name(registerWorkspaceSettingsRoutes, "registerWorkspaceSettingsRoutes");
30681
31013
 
30682
- // packages/cli/src/serve/routes/a2uiAction.ts
31014
+ // packages/cli/src/serve/routes/a2ui-action.ts
30683
31015
  init_esbuild_shims();
30684
31016
  import * as fsp3 from "node:fs/promises";
30685
31017
  import * as path12 from "node:path";
@@ -30687,7 +31019,16 @@ var A2UI_MIME = "application/a2ui+json";
30687
31019
  var ACTION_TOOL = "action";
30688
31020
  var CALL_TIMEOUT_MS = 15e3;
30689
31021
  function usableServerConfig(cfg) {
30690
- return !!cfg && (typeof cfg.command === "string" || typeof cfg.httpUrl === "string");
31022
+ if (!cfg) return false;
31023
+ if (typeof cfg.httpUrl === "string") {
31024
+ try {
31025
+ const parsed = new URL(cfg.httpUrl);
31026
+ return parsed.protocol === "http:" || parsed.protocol === "https:";
31027
+ } catch {
31028
+ return false;
31029
+ }
31030
+ }
31031
+ return typeof cfg.command === "string" && cfg.command.trim().length > 0;
30691
31032
  }
30692
31033
  __name(usableServerConfig, "usableServerConfig");
30693
31034
  async function findFromSettingsFile(workspaceCwd) {
@@ -30816,7 +31157,7 @@ function registerA2uiActionRoutes(app, opts) {
30816
31157
  }
30817
31158
  __name(registerA2uiActionRoutes, "registerA2uiActionRoutes");
30818
31159
 
30819
- // packages/cli/src/serve/rateLimit.ts
31160
+ // packages/cli/src/serve/rate-limit.ts
30820
31161
  init_esbuild_shims();
30821
31162
  var MAX_BUCKETS = 1e4;
30822
31163
  var GC_REQUEST_INTERVAL = 1e3;
@@ -31073,7 +31414,8 @@ function resolveBridgeFsFactory(input) {
31073
31414
  return createWorkspaceFileSystemFactory({
31074
31415
  boundWorkspace: input.boundWorkspace,
31075
31416
  trusted: input.trusted,
31076
- emit: input.emit ?? createDefaultFsAuditEmit()
31417
+ emit: input.emit ?? createDefaultFsAuditEmit(),
31418
+ ...input.customIgnoreFiles !== void 0 ? { customIgnoreFiles: input.customIgnoreFiles } : {}
31077
31419
  });
31078
31420
  }
31079
31421
  __name(resolveBridgeFsFactory, "resolveBridgeFsFactory");
@@ -31088,17 +31430,23 @@ var InvalidCursorError = class extends Error {
31088
31430
  this.name = "InvalidCursorError";
31089
31431
  }
31090
31432
  };
31433
+ function parseSessionCursor(cursor) {
31434
+ if (cursor === "") return void 0;
31435
+ const trimmed = cursor.trim();
31436
+ const parsed = Number(trimmed);
31437
+ if (trimmed === "" || !Number.isFinite(parsed) || parsed < 0 || parsed > Number.MAX_SAFE_INTEGER) {
31438
+ throw new InvalidCursorError(cursor);
31439
+ }
31440
+ return parsed;
31441
+ }
31442
+ __name(parseSessionCursor, "parseSessionCursor");
31091
31443
  async function listWorkspaceSessionsForResponse(bridge, workspaceCwd, options) {
31092
31444
  const rawSize = options?.size;
31093
31445
  const requestedSize = typeof rawSize === "number" && Number.isSafeInteger(rawSize) ? rawSize : DEFAULT_SESSION_PAGE_SIZE;
31094
31446
  const pageSize = Math.min(Math.max(requestedSize, 1), MAX_SESSION_PAGE_SIZE);
31095
31447
  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;
31448
+ if (options?.cursor != null) {
31449
+ numericCursor = parseSessionCursor(options.cursor);
31102
31450
  }
31103
31451
  const isFirstPage = numericCursor === void 0;
31104
31452
  const sessionService = new SessionService(workspaceCwd);
@@ -31673,6 +32021,7 @@ function createServeApp(opts, getPort = () => opts.port, deps = {}) {
31673
32021
  boundWorkspace,
31674
32022
  contextFilename: deps.contextFilename ?? "QWEN.md",
31675
32023
  statusProvider: createDaemonStatusProvider(),
32024
+ workspaceProvidersStatusProvider: createWorkspaceProvidersStatusProvider(),
31676
32025
  isChannelLive: /* @__PURE__ */ __name(() => bridge.isChannelLive(), "isChannelLive"),
31677
32026
  persistDisabledTools: deps.persistDisabledTools ?? (async () => {
31678
32027
  throw new Error(
@@ -33022,6 +33371,34 @@ function createServeApp(opts, getPort = () => opts.port, deps = {}) {
33022
33371
  });
33023
33372
  }
33024
33373
  });
33374
+ app.post("/session/:id/fork", mutate(), async (req, res) => {
33375
+ const sessionId = requireSessionId(req, res);
33376
+ if (sessionId === null) return;
33377
+ const body = safeBody(req);
33378
+ const directive = body["directive"];
33379
+ if (typeof directive !== "string" || directive.trim().length === 0) {
33380
+ res.status(400).json({
33381
+ error: "`directive` is required and must be a non-empty string",
33382
+ code: "missing_directive"
33383
+ });
33384
+ return;
33385
+ }
33386
+ const clientId = parseClientIdHeader(req, res);
33387
+ if (clientId === null) return;
33388
+ try {
33389
+ const result = await bridge.launchSessionForkAgent(
33390
+ sessionId,
33391
+ directive,
33392
+ clientId !== void 0 ? { clientId } : void 0
33393
+ );
33394
+ res.status(202).json(result);
33395
+ } catch (err) {
33396
+ sendBridgeError(res, err, {
33397
+ route: "POST /session/:id/fork",
33398
+ sessionId
33399
+ });
33400
+ }
33401
+ });
33025
33402
  app.get("/session/:id/context", async (req, res) => {
33026
33403
  const sessionId = requireSessionId(req, res);
33027
33404
  if (sessionId === null) return;
@@ -34966,12 +35343,12 @@ function errorPayload(err) {
34966
35343
  }
34967
35344
  __name(errorPayload, "errorPayload");
34968
35345
 
34969
- // packages/cli/src/serve/runQwenServe.ts
35346
+ // packages/cli/src/serve/run-qwen-serve.ts
34970
35347
  init_esbuild_shims();
34971
35348
  import * as fs6 from "node:fs";
34972
35349
  import * as path14 from "node:path";
34973
35350
 
34974
- // packages/cli/src/serve/permissionAudit.ts
35351
+ // packages/cli/src/serve/permission-audit.ts
34975
35352
  init_esbuild_shims();
34976
35353
  var DEFAULT_PERMISSION_AUDIT_RING_SIZE = 512;
34977
35354
  function takeLast(arr, limit, methodName) {
@@ -35088,7 +35465,7 @@ function createPermissionAuditPublisher(deps) {
35088
35465
  }
35089
35466
  __name(createPermissionAuditPublisher, "createPermissionAuditPublisher");
35090
35467
 
35091
- // packages/cli/src/serve/daemonLogger.ts
35468
+ // packages/cli/src/serve/daemon-logger.ts
35092
35469
  init_esbuild_shims();
35093
35470
  import * as nodeFs from "node:fs";
35094
35471
  import * as nodePath from "node:path";
@@ -35228,7 +35605,7 @@ function initDaemonLogger(opts) {
35228
35605
  }
35229
35606
  __name(initDaemonLogger, "initDaemonLogger");
35230
35607
 
35231
- // packages/cli/src/serve/runQwenServe.ts
35608
+ // packages/cli/src/serve/run-qwen-serve.ts
35232
35609
  var QWEN_SERVER_TOKEN_ENV = "QWEN_SERVER_TOKEN";
35233
35610
  var QWEN_SERVE_PROMPT_DEADLINE_MS_ENV = "QWEN_SERVE_PROMPT_DEADLINE_MS";
35234
35611
  var QWEN_SERVE_WRITER_IDLE_TIMEOUT_MS_ENV = "QWEN_SERVE_WRITER_IDLE_TIMEOUT_MS";
@@ -35612,11 +35989,13 @@ async function runQwenServe(optsIn, deps = {}) {
35612
35989
  ring: permissionAuditRing
35613
35990
  });
35614
35991
  const trustedWorkspace = deps.trustedWorkspace ?? true;
35992
+ const customIgnoreFiles = bootSettings?.merged.context?.fileFiltering?.customIgnoreFiles;
35615
35993
  const fsFactory = resolveBridgeFsFactory({
35616
35994
  boundWorkspace,
35617
35995
  injected: deps.fsFactory,
35618
35996
  trusted: trustedWorkspace,
35619
- emit: deps.fsAuditEmit
35997
+ emit: deps.fsAuditEmit,
35998
+ ...customIgnoreFiles !== void 0 ? { customIgnoreFiles } : {}
35620
35999
  });
35621
36000
  const diagnosticSink = /* @__PURE__ */ __name((line, level) => daemonLog.raw(line, level), "diagnosticSink");
35622
36001
  const channelFactory = createSpawnChannelFactory({
@@ -35637,6 +36016,7 @@ async function runQwenServe(optsIn, deps = {}) {
35637
36016
  );
35638
36017
  }), "persistDisabledToolsFn");
35639
36018
  const statusProvider = createDaemonStatusProvider();
36019
+ const workspaceProvidersStatusProvider = createWorkspaceProvidersStatusProvider();
35640
36020
  const bridge = deps.bridge ?? createAcpSessionBridge({
35641
36021
  maxSessions: opts.maxSessions,
35642
36022
  ...opts.maxPendingPromptsPerSession !== void 0 ? { maxPendingPromptsPerSession: opts.maxPendingPromptsPerSession } : {},
@@ -35695,6 +36075,7 @@ async function runQwenServe(optsIn, deps = {}) {
35695
36075
  contextFilename: contextFilenameForInit ?? "QWEN.md",
35696
36076
  // Daemon-host status provider for env + preflight cells.
35697
36077
  statusProvider,
36078
+ workspaceProvidersStatusProvider,
35698
36079
  // Channel liveness check — proxied through the bridge's live-channel
35699
36080
  // probe (not session count: a channel can be live with zero attached
35700
36081
  // sessions during the cold-spawn window).
@@ -35961,7 +36342,7 @@ async function runQwenServe(optsIn, deps = {}) {
35961
36342
  }
35962
36343
  __name(runQwenServe, "runQwenServe");
35963
36344
 
35964
- // packages/cli/src/serve/inMemoryChannel.ts
36345
+ // packages/cli/src/serve/in-memory-channel.ts
35965
36346
  init_esbuild_shims();
35966
36347
  export {
35967
36348
  ACP_PREFLIGHT_KINDS,