@qwen-code/qwen-code 0.18.5 → 0.19.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 (146) 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 +9 -6
  5. package/bundled/qc-helper/docs/qwen-serve.md +1 -1
  6. package/chunks/{agent-2TEY55UD.js → agent-IPSDEZNB.js} +24 -22
  7. package/chunks/{agent-headless-SCUAXEEE.js → agent-headless-ZMTUWMZJ.js} +24 -22
  8. package/chunks/{anthropicContentGenerator-5S4OMMNL.js → anthropicContentGenerator-6MCH4X6S.js} +12 -11
  9. package/chunks/artifact-tool-PBX64YTT.js +675 -0
  10. package/chunks/{askUserQuestion-WHVYL2S2.js → askUserQuestion-5ZQOWSRT.js} +20 -7
  11. package/chunks/chunk-22IFUCVR.js +291 -0
  12. package/chunks/{chunk-XGU3ETVO.js → chunk-255L5QYW.js} +3 -3
  13. package/chunks/{chunk-26ZYKTYZ.js → chunk-2BIF2NVV.js} +2 -2
  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-2CNO5W47.js → chunk-CICUTYTF.js} +174 -5026
  21. package/chunks/chunk-EEEZIVFJ.js +908 -0
  22. package/chunks/chunk-EJYJYJZ2.js +3703 -0
  23. package/chunks/{chunk-ATLUHLZE.js → chunk-EW6C27XX.js} +1 -1
  24. package/chunks/{chunk-SIJKWK35.js → chunk-GAAALA2X.js} +6 -6
  25. package/chunks/{chunk-C6MI2ASN.js → chunk-GZCJS5WH.js} +2 -2
  26. package/chunks/{chunk-KGV3F6UF.js → chunk-HGNSRCRB.js} +1 -1
  27. package/chunks/{chunk-42HGOMED.js → chunk-JDV3VBPY.js} +216 -1
  28. package/chunks/{chunk-CX3SGIPK.js → chunk-JRVB4QUY.js} +2 -2
  29. package/chunks/{chunk-F5E6IKYN.js → chunk-KFR4QTV3.js} +557 -22
  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-VKILGMZQ.js → chunk-PO5LVPK3.js} +1 -1
  33. package/chunks/{chunk-AE6RQU6F.js → chunk-PRYMDRBV.js} +1 -1
  34. package/chunks/{chunk-GBN55AWZ.js → chunk-QKUAGMGE.js} +2 -2
  35. package/chunks/{chunk-KQIKOTQJ.js → chunk-RYLJU2DY.js} +60 -5
  36. package/chunks/{chunk-KZGQ3G3Q.js → chunk-S7ILEIB4.js} +82 -84
  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-C7JA3XCX.js → chunk-VRIVIYRL.js} +5 -5
  40. package/chunks/{chunk-XU7BKR3B.js → chunk-XU5P23GN.js} +3 -3
  41. package/chunks/{chunk-VECKCOH6.js → chunk-YF3ORUIU.js} +6362 -4888
  42. package/chunks/{computer-use-OB3C5QG2.js → computer-use-YYK42DD5.js} +24 -22
  43. package/chunks/contextCommand-BO45MUAA.js +56 -0
  44. package/chunks/{cron-create-THNDTYXU.js → cron-create-DXKAP5KN.js} +4 -4
  45. package/chunks/{cron-delete-BS5H6TFJ.js → cron-delete-WGO4PZTF.js} +4 -4
  46. package/chunks/{cron-list-7OBVHT7K.js → cron-list-EY7D3ZUC.js} +4 -4
  47. package/chunks/{dist-GKRNVFBH.js → dist-ZBX7LPJZ.js} +2 -1
  48. package/chunks/{edit-GNCLIF67.js → edit-QERNJN7K.js} +24 -22
  49. package/chunks/{en-S3OQBISC.js → en-UTXMGXIR.js} +47 -0
  50. package/chunks/{enter-worktree-E7BNZOGT.js → enter-worktree-6ZKH5IL3.js} +24 -22
  51. package/chunks/{enterPlanMode-IA42A5EU.js → enterPlanMode-B2PBF4MA.js} +27 -23
  52. package/chunks/{exit-worktree-QJ2K74UT.js → exit-worktree-EOCMQO4I.js} +24 -22
  53. package/chunks/{exitPlanMode-UKKHBUYJ.js → exitPlanMode-WSRXCBRZ.js} +36 -28
  54. package/chunks/{geminiContentGenerator-ICSDM37U.js → geminiContentGenerator-NTR4LTKS.js} +4 -4
  55. package/chunks/{glob-IGD7LWYX.js → glob-IWDJQI2V.js} +26 -23
  56. package/chunks/{grep-IZM3IVND.js → grep-2DV5BXMH.js} +24 -22
  57. package/chunks/{keychain-token-storage-YHXIWXIB.js → keychain-token-storage-CSYMNRPP.js} +2 -2
  58. package/chunks/{loop-wakeup-SSBWZ64K.js → loop-wakeup-XVSDE7QR.js} +5 -5
  59. package/chunks/{ls-YPFUHZRQ.js → ls-LPY3ATQQ.js} +6 -6
  60. package/chunks/{lsp-FD6DNVAF.js → lsp-ZT3AAXIF.js} +2 -2
  61. package/chunks/{monitor-ALJNE3R4.js → monitor-6HBDS2RS.js} +24 -22
  62. package/chunks/{notebook-edit-7XRZX55T.js → notebook-edit-J5AY5BRY.js} +25 -23
  63. package/chunks/{openaiContentGenerator-FWKITDFJ.js → openaiContentGenerator-ENABCJDM.js} +12 -15
  64. package/chunks/{qwenContentGenerator-5RPGQZ63.js → qwenContentGenerator-ISW42U7C.js} +26 -24
  65. package/chunks/{qwenOAuth2-WZ54YZ4J.js → qwenOAuth2-K4AASPCV.js} +5 -4
  66. package/chunks/{read-file-4WN2DT5N.js → read-file-NRX2FSSQ.js} +9 -8
  67. package/chunks/{ripGrep-4ZKT6KBQ.js → ripGrep-WF5CKHR5.js} +24 -22
  68. package/chunks/{scheduler-O2E65VDK.js → scheduler-PNPG5WJ3.js} +73 -27
  69. package/chunks/{send-message-FWFTX62Q.js → send-message-447W6NH6.js} +24 -4
  70. package/chunks/{serve-3DM6CRGD.js → serve-ZBRCIIHW.js} +430 -70
  71. package/chunks/{shell-ARVZK6RF.js → shell-DLIL6MLU.js} +24 -22
  72. package/chunks/{skill-BFUBGA4I.js → skill-32TXHY4A.js} +11 -10
  73. package/chunks/{src-5YMCDSII.js → src-PDDLF5BB.js} +114 -67
  74. package/chunks/{syntheticOutput-JY5NEDTV.js → syntheticOutput-GQRDRLGR.js} +3 -3
  75. package/chunks/{task-create-IGILDV25.js → task-create-66DDSTVI.js} +6 -6
  76. package/chunks/{task-list-KBEJVAAG.js → task-list-GOPXRSHG.js} +5 -5
  77. package/chunks/{task-stop-WFTMQ6AC.js → task-stop-M7NKGFX2.js} +2 -2
  78. package/chunks/{task-update-UIVX7ZEV.js → task-update-M5TBHLZV.js} +6 -6
  79. package/chunks/{team-create-HRBV5ATK.js → team-create-EHLDSJGI.js} +28 -26
  80. package/chunks/{team-delete-LPOXDPVB.js → team-delete-DKKDS65W.js} +5 -5
  81. package/chunks/{todoWrite-R4RIJKOD.js → todoWrite-4VX7X44D.js} +4 -4
  82. package/chunks/{tool-search-67HI54YA.js → tool-search-FU7IZAOO.js} +9 -8
  83. package/chunks/{web-fetch-JU7SS6KE.js → web-fetch-YPP3V4FJ.js} +4 -4
  84. package/chunks/{workflow-W4SCLWLU.js → workflow-WUDNBCGX.js} +544 -92
  85. package/chunks/{write-file-TLNXC2NR.js → write-file-NVFPX6CH.js} +24 -22
  86. package/chunks/{zh-TW-3OKU7LDA.js → zh-TW-J2TTW67R.js} +47 -0
  87. package/chunks/{zh-QXLZV2PX.js → zh-YOXVTJU5.js} +47 -0
  88. package/cli.js +8018 -4955
  89. package/locales/en.js +68 -0
  90. package/locales/zh-TW.js +65 -0
  91. package/locales/zh.js +65 -0
  92. package/package.json +3 -2
  93. package/web-shell/assets/{arc-CRFN10gD.js → arc-pxOt9B72.js} +1 -1
  94. package/web-shell/assets/{architectureDiagram-3BPJPVTR-IRlu1CpH.js → architectureDiagram-3BPJPVTR-B9XuYYOT.js} +1 -1
  95. package/web-shell/assets/{blockDiagram-GPEHLZMM-htIZ6iw8.js → blockDiagram-GPEHLZMM-5yK68iu4.js} +1 -1
  96. package/web-shell/assets/{c4Diagram-AAUBKEIU-A2GoRq3O.js → c4Diagram-AAUBKEIU-B1LY-qNI.js} +1 -1
  97. package/web-shell/assets/channel-Cx7egbSX.js +1 -0
  98. package/web-shell/assets/{chunk-2J33WTMH-CdP2AC6u.js → chunk-2J33WTMH-DkgXg7cM.js} +1 -1
  99. package/web-shell/assets/{chunk-4BX2VUAB-DrA07nW2.js → chunk-4BX2VUAB-DdM45KFM.js} +1 -1
  100. package/web-shell/assets/{chunk-55IACEB6-CFGnVU2f.js → chunk-55IACEB6-CmdsDjD4.js} +1 -1
  101. package/web-shell/assets/{chunk-727SXJPM-BTMkq3Tk.js → chunk-727SXJPM-CQ4pJ5GH.js} +1 -1
  102. package/web-shell/assets/{chunk-AQP2D5EJ-C9sYg04Z.js → chunk-AQP2D5EJ-Dy6UWz37.js} +1 -1
  103. package/web-shell/assets/{chunk-FMBD7UC4-Cag-cj6I.js → chunk-FMBD7UC4-CC8nFqap.js} +1 -1
  104. package/web-shell/assets/{chunk-ND2GUHAM-CDSTFoR7.js → chunk-ND2GUHAM-CkmS7lx7.js} +1 -1
  105. package/web-shell/assets/{chunk-QZHKN3VN-CN9Z6oOs.js → chunk-QZHKN3VN-DynyqleZ.js} +1 -1
  106. package/web-shell/assets/classDiagram-4FO5ZUOK-CwH_F8cH.js +1 -0
  107. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-CwH_F8cH.js +1 -0
  108. package/web-shell/assets/{cose-bilkent-S5V4N54A-DuN9j8Du.js → cose-bilkent-S5V4N54A-DA0fzCsY.js} +1 -1
  109. package/web-shell/assets/{dagre-BM42HDAG-ByCWe45f.js → dagre-BM42HDAG-DHYXRqCo.js} +1 -1
  110. package/web-shell/assets/{diagram-2AECGRRQ-eWyU_pKZ.js → diagram-2AECGRRQ-DWD6BcPs.js} +1 -1
  111. package/web-shell/assets/{diagram-5GNKFQAL-0Bfu3Fq5.js → diagram-5GNKFQAL-CX9wnqVc.js} +1 -1
  112. package/web-shell/assets/{diagram-KO2AKTUF-B6KBKkQP.js → diagram-KO2AKTUF-BpE8Kbt8.js} +1 -1
  113. package/web-shell/assets/{diagram-LMA3HP47-TToDmeA_.js → diagram-LMA3HP47-DLPcrP0C.js} +1 -1
  114. package/web-shell/assets/{diagram-OG6HWLK6-CQCkC2Yx.js → diagram-OG6HWLK6-CSUCBsCe.js} +1 -1
  115. package/web-shell/assets/{erDiagram-TEJ5UH35-Cm9ls1iB.js → erDiagram-TEJ5UH35-d3Z0uMXS.js} +1 -1
  116. package/web-shell/assets/{flowDiagram-I6XJVG4X-Dyoz80Pv.js → flowDiagram-I6XJVG4X-C7vj5FX3.js} +1 -1
  117. package/web-shell/assets/{ganttDiagram-6RSMTGT7-Cfut9yaU.js → ganttDiagram-6RSMTGT7-BV9UvDV_.js} +1 -1
  118. package/web-shell/assets/{gitGraphDiagram-PVQCEYII-BCuJdlfD.js → gitGraphDiagram-PVQCEYII-CoWp0mW4.js} +1 -1
  119. package/web-shell/assets/index-CjTH6cLP.js +516 -0
  120. package/web-shell/assets/{infoDiagram-5YYISTIA-CXKxF2VL.js → infoDiagram-5YYISTIA-DUswfJHA.js} +1 -1
  121. package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-DE7HWSU8.js → ishikawaDiagram-YF4QCWOH-WidEKukx.js} +1 -1
  122. package/web-shell/assets/{journeyDiagram-JHISSGLW-D__YUfds.js → journeyDiagram-JHISSGLW-D7IRK3VN.js} +1 -1
  123. package/web-shell/assets/{kanban-definition-UN3LZRKU-D82R169M.js → kanban-definition-UN3LZRKU-CwFJ6Cja.js} +1 -1
  124. package/web-shell/assets/{linear-DpyMbKqT.js → linear-BQ8GvDRY.js} +1 -1
  125. package/web-shell/assets/{mermaid.core-D1KEFDhn.js → mermaid.core-CwF8A_xO.js} +5 -5
  126. package/web-shell/assets/{mindmap-definition-RKZ34NQL-BwVUFGFE.js → mindmap-definition-RKZ34NQL-TR1s0iZi.js} +1 -1
  127. package/web-shell/assets/{pieDiagram-4H26LBE5-BO_qoEGx.js → pieDiagram-4H26LBE5-Cd91pMl9.js} +1 -1
  128. package/web-shell/assets/{quadrantDiagram-W4KKPZXB-Cx0ZaWPo.js → quadrantDiagram-W4KKPZXB-BGxGDNMl.js} +1 -1
  129. package/web-shell/assets/{requirementDiagram-4Y6WPE33-BJPXejOA.js → requirementDiagram-4Y6WPE33-Cq3fWmYz.js} +1 -1
  130. package/web-shell/assets/{sankeyDiagram-5OEKKPKP-C1xeIL9i.js → sankeyDiagram-5OEKKPKP-ChLyGdq0.js} +1 -1
  131. package/web-shell/assets/{sequenceDiagram-3UESZ5HK-CSYKQUjf.js → sequenceDiagram-3UESZ5HK-tazy79aB.js} +1 -1
  132. package/web-shell/assets/{stateDiagram-AJRCARHV-d9hiHlAW.js → stateDiagram-AJRCARHV-dIYLUNSf.js} +1 -1
  133. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-luL7KTiX.js +1 -0
  134. package/web-shell/assets/{timeline-definition-PNZ67QCA-BhCBkq8k.js → timeline-definition-PNZ67QCA-BuENhrC2.js} +1 -1
  135. package/web-shell/assets/{vennDiagram-CIIHVFJN-DPPFWp_y.js → vennDiagram-CIIHVFJN-DLtum9dF.js} +1 -1
  136. package/web-shell/assets/{wardley-L42UT6IY-CcOUIgXY.js → wardley-L42UT6IY-Bf7OSF3y.js} +1 -1
  137. package/web-shell/assets/{wardleyDiagram-YWT4CUSO-p7oR5X7r.js → wardleyDiagram-YWT4CUSO-slMw3OB3.js} +1 -1
  138. package/web-shell/assets/{xychartDiagram-2RQKCTM6-Dfr7-SEy.js → xychartDiagram-2RQKCTM6-CdxOm8oC.js} +1 -1
  139. package/web-shell/index.html +1 -1
  140. package/chunks/chunk-77WXWU44.js +0 -26
  141. package/chunks/contextCommand-3327KUC4.js +0 -54
  142. package/web-shell/assets/channel-WwImfsc7.js +0 -1
  143. package/web-shell/assets/classDiagram-4FO5ZUOK-CJKQYFeJ.js +0 -1
  144. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-CJKQYFeJ.js +0 -1
  145. package/web-shell/assets/index-DaebdpHq.js +0 -516
  146. 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-KFR4QTV3.js";
76
+ import {
77
+ SUPPORTED_LANGUAGES,
78
+ writeStderrLine,
79
+ writeStdoutLine
80
+ } from "./chunk-VRIVIYRL.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-YF3ORUIU.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-CICUTYTF.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,
@@ -23541,7 +23860,7 @@ function buildWriteMeta(opts) {
23541
23860
  }
23542
23861
  __name(buildWriteMeta, "buildWriteMeta");
23543
23862
 
23544
- // packages/cli/src/serve/workspaceMemory.ts
23863
+ // packages/cli/src/serve/workspace-memory.ts
23545
23864
  init_esbuild_shims();
23546
23865
  import { promises as fs3 } from "node:fs";
23547
23866
  import * as path7 from "node:path";
@@ -23783,14 +24102,14 @@ function isEnoent(err) {
23783
24102
  }
23784
24103
  __name(isEnoent, "isEnoent");
23785
24104
 
23786
- // packages/cli/src/serve/workspaceAgents.ts
24105
+ // packages/cli/src/serve/workspace-agents.ts
23787
24106
  init_esbuild_shims();
23788
24107
  import { promises as fs4 } from "node:fs";
23789
24108
 
23790
- // packages/cli/src/serve/acpSessionBridge.ts
24109
+ // packages/cli/src/serve/acp-session-bridge.ts
23791
24110
  init_esbuild_shims();
23792
24111
 
23793
- // packages/cli/src/serve/workspaceAgents.ts
24112
+ // packages/cli/src/serve/workspace-agents.ts
23794
24113
  var AGENT_TYPE_PATTERN = /^[\p{L}\p{N}_-]+$/u;
23795
24114
  var AGENT_TYPE_MAX_LENGTH = 64;
23796
24115
  var AGENT_TYPE_MIN_LENGTH = 2;
@@ -24655,7 +24974,7 @@ function createDaemonSubagentManager(boundWorkspace) {
24655
24974
  }
24656
24975
  __name(createDaemonSubagentManager, "createDaemonSubagentManager");
24657
24976
 
24658
- // packages/cli/src/serve/acpHttp/jsonRpc.ts
24977
+ // packages/cli/src/serve/acp-http/json-rpc.ts
24659
24978
  init_esbuild_shims();
24660
24979
  var QWEN_METHOD_NS = "_qwen/";
24661
24980
  var QWEN_META_KEY = "qwen";
@@ -24735,7 +25054,7 @@ function parseInbound(raw) {
24735
25054
  }
24736
25055
  __name(parseInbound, "parseInbound");
24737
25056
 
24738
- // packages/cli/src/serve/acpHttp/dispatch.ts
25057
+ // packages/cli/src/serve/acp-http/dispatch.ts
24739
25058
  function errMsg(err) {
24740
25059
  return err instanceof Error ? err.message : String(err);
24741
25060
  }
@@ -26904,7 +27223,7 @@ var AcpDispatcher = class {
26904
27223
  }
26905
27224
  };
26906
27225
 
26907
- // packages/cli/src/serve/acpHttp/connectionRegistry.ts
27226
+ // packages/cli/src/serve/acp-http/connection-registry.ts
26908
27227
  init_esbuild_shims();
26909
27228
  import { randomUUID as randomUUID4 } from "node:crypto";
26910
27229
  var MAX_BUFFERED_FRAMES = 256;
@@ -27253,7 +27572,7 @@ function sumBy(values, select) {
27253
27572
  }
27254
27573
  __name(sumBy, "sumBy");
27255
27574
 
27256
- // packages/cli/src/serve/acpHttp/sseStream.ts
27575
+ // packages/cli/src/serve/acp-http/sse-stream.ts
27257
27576
  init_esbuild_shims();
27258
27577
  var SseStream = class {
27259
27578
  constructor(res, onClose, onHeartbeat) {
@@ -27372,7 +27691,7 @@ var SseStream = class {
27372
27691
  }
27373
27692
  };
27374
27693
 
27375
- // packages/cli/src/serve/acpHttp/wsStream.ts
27694
+ // packages/cli/src/serve/acp-http/ws-stream.ts
27376
27695
  init_esbuild_shims();
27377
27696
  var WsStream = class {
27378
27697
  constructor(ws, onClose, onHeartbeat) {
@@ -27460,7 +27779,7 @@ var WsStream = class {
27460
27779
  }
27461
27780
  };
27462
27781
 
27463
- // packages/cli/src/serve/acpHttp/index.ts
27782
+ // packages/cli/src/serve/acp-http/index.ts
27464
27783
  var ACP_CONNECTION_HEADER = "acp-connection-id";
27465
27784
  var ACP_SESSION_HEADER = "acp-session-id";
27466
27785
  var CONN_GRACE_MS = 1e4;
@@ -28006,7 +28325,7 @@ function isLoopbackReq(req) {
28006
28325
  }
28007
28326
  __name(isLoopbackReq, "isLoopbackReq");
28008
28327
 
28009
- // packages/cli/src/serve/daemonStatus.ts
28328
+ // packages/cli/src/serve/daemon-status.ts
28010
28329
  init_esbuild_shims();
28011
28330
  var DEFAULT_LISTENER_MAX_CONNECTIONS = 256;
28012
28331
  var SECTION_TIMEOUT_MS = 1e3;
@@ -29345,7 +29664,7 @@ function getDemoHtml(_port) {
29345
29664
  }
29346
29665
  __name(getDemoHtml, "getDemoHtml");
29347
29666
 
29348
- // packages/cli/src/serve/webShellStatic.ts
29667
+ // packages/cli/src/serve/web-shell-static.ts
29349
29668
  init_esbuild_shims();
29350
29669
  var import_express = __toESM(require_express2(), 1);
29351
29670
  import { existsSync } from "node:fs";
@@ -29449,7 +29768,7 @@ function mountWebShellSpaFallback(app, webShellDir) {
29449
29768
  }
29450
29769
  __name(mountWebShellSpaFallback, "mountWebShellSpaFallback");
29451
29770
 
29452
- // packages/cli/src/serve/routes/workspaceFileRead.ts
29771
+ // packages/cli/src/serve/routes/workspace-file-read.ts
29453
29772
  init_esbuild_shims();
29454
29773
  import * as path10 from "node:path";
29455
29774
  var MAX_LIST_ENTRIES = 2e3;
@@ -29796,7 +30115,7 @@ function registerWorkspaceFileReadRoutes(app, deps) {
29796
30115
  }
29797
30116
  __name(registerWorkspaceFileReadRoutes, "registerWorkspaceFileReadRoutes");
29798
30117
 
29799
- // packages/cli/src/serve/routes/workspaceFileWrite.ts
30118
+ // packages/cli/src/serve/routes/workspace-file-write.ts
29800
30119
  init_esbuild_shims();
29801
30120
  function getFsFactory2(req, res) {
29802
30121
  const factory = req.app.locals.fsFactory;
@@ -30059,6 +30378,7 @@ function createDaemonWorkspaceService(deps) {
30059
30378
  boundWorkspace,
30060
30379
  contextFilename,
30061
30380
  statusProvider,
30381
+ workspaceProvidersStatusProvider,
30062
30382
  isChannelLive,
30063
30383
  persistDisabledTools,
30064
30384
  queryWorkspaceStatus,
@@ -30081,6 +30401,12 @@ function createDaemonWorkspaceService(deps) {
30081
30401
  );
30082
30402
  },
30083
30403
  async getWorkspaceProvidersStatus(_ctx) {
30404
+ if (workspaceProvidersStatusProvider) {
30405
+ return workspaceProvidersStatusProvider(
30406
+ boundWorkspace,
30407
+ isChannelLive?.() ?? false
30408
+ );
30409
+ }
30084
30410
  return queryWorkspaceStatus(
30085
30411
  SERVE_STATUS_EXT_METHODS.workspaceProviders,
30086
30412
  () => createIdleWorkspaceProvidersStatus(boundWorkspace)
@@ -30454,7 +30780,7 @@ function createDaemonWorkspaceService(deps) {
30454
30780
  }
30455
30781
  __name(createDaemonWorkspaceService, "createDaemonWorkspaceService");
30456
30782
 
30457
- // packages/cli/src/serve/routes/workspaceSettings.ts
30783
+ // packages/cli/src/serve/routes/workspace-settings.ts
30458
30784
  init_esbuild_shims();
30459
30785
  var TUI_ONLY_SETTINGS = /* @__PURE__ */ new Set([
30460
30786
  "general.vimMode",
@@ -30679,7 +31005,7 @@ function registerWorkspaceSettingsRoutes(app, deps) {
30679
31005
  }
30680
31006
  __name(registerWorkspaceSettingsRoutes, "registerWorkspaceSettingsRoutes");
30681
31007
 
30682
- // packages/cli/src/serve/routes/a2uiAction.ts
31008
+ // packages/cli/src/serve/routes/a2ui-action.ts
30683
31009
  init_esbuild_shims();
30684
31010
  import * as fsp3 from "node:fs/promises";
30685
31011
  import * as path12 from "node:path";
@@ -30816,7 +31142,7 @@ function registerA2uiActionRoutes(app, opts) {
30816
31142
  }
30817
31143
  __name(registerA2uiActionRoutes, "registerA2uiActionRoutes");
30818
31144
 
30819
- // packages/cli/src/serve/rateLimit.ts
31145
+ // packages/cli/src/serve/rate-limit.ts
30820
31146
  init_esbuild_shims();
30821
31147
  var MAX_BUCKETS = 1e4;
30822
31148
  var GC_REQUEST_INTERVAL = 1e3;
@@ -31073,7 +31399,8 @@ function resolveBridgeFsFactory(input) {
31073
31399
  return createWorkspaceFileSystemFactory({
31074
31400
  boundWorkspace: input.boundWorkspace,
31075
31401
  trusted: input.trusted,
31076
- emit: input.emit ?? createDefaultFsAuditEmit()
31402
+ emit: input.emit ?? createDefaultFsAuditEmit(),
31403
+ ...input.customIgnoreFiles !== void 0 ? { customIgnoreFiles: input.customIgnoreFiles } : {}
31077
31404
  });
31078
31405
  }
31079
31406
  __name(resolveBridgeFsFactory, "resolveBridgeFsFactory");
@@ -31673,6 +32000,7 @@ function createServeApp(opts, getPort = () => opts.port, deps = {}) {
31673
32000
  boundWorkspace,
31674
32001
  contextFilename: deps.contextFilename ?? "QWEN.md",
31675
32002
  statusProvider: createDaemonStatusProvider(),
32003
+ workspaceProvidersStatusProvider: createWorkspaceProvidersStatusProvider(),
31676
32004
  isChannelLive: /* @__PURE__ */ __name(() => bridge.isChannelLive(), "isChannelLive"),
31677
32005
  persistDisabledTools: deps.persistDisabledTools ?? (async () => {
31678
32006
  throw new Error(
@@ -33022,6 +33350,34 @@ function createServeApp(opts, getPort = () => opts.port, deps = {}) {
33022
33350
  });
33023
33351
  }
33024
33352
  });
33353
+ app.post("/session/:id/fork", mutate(), async (req, res) => {
33354
+ const sessionId = requireSessionId(req, res);
33355
+ if (sessionId === null) return;
33356
+ const body = safeBody(req);
33357
+ const directive = body["directive"];
33358
+ if (typeof directive !== "string" || directive.trim().length === 0) {
33359
+ res.status(400).json({
33360
+ error: "`directive` is required and must be a non-empty string",
33361
+ code: "missing_directive"
33362
+ });
33363
+ return;
33364
+ }
33365
+ const clientId = parseClientIdHeader(req, res);
33366
+ if (clientId === null) return;
33367
+ try {
33368
+ const result = await bridge.launchSessionForkAgent(
33369
+ sessionId,
33370
+ directive,
33371
+ clientId !== void 0 ? { clientId } : void 0
33372
+ );
33373
+ res.status(202).json(result);
33374
+ } catch (err) {
33375
+ sendBridgeError(res, err, {
33376
+ route: "POST /session/:id/fork",
33377
+ sessionId
33378
+ });
33379
+ }
33380
+ });
33025
33381
  app.get("/session/:id/context", async (req, res) => {
33026
33382
  const sessionId = requireSessionId(req, res);
33027
33383
  if (sessionId === null) return;
@@ -34966,12 +35322,12 @@ function errorPayload(err) {
34966
35322
  }
34967
35323
  __name(errorPayload, "errorPayload");
34968
35324
 
34969
- // packages/cli/src/serve/runQwenServe.ts
35325
+ // packages/cli/src/serve/run-qwen-serve.ts
34970
35326
  init_esbuild_shims();
34971
35327
  import * as fs6 from "node:fs";
34972
35328
  import * as path14 from "node:path";
34973
35329
 
34974
- // packages/cli/src/serve/permissionAudit.ts
35330
+ // packages/cli/src/serve/permission-audit.ts
34975
35331
  init_esbuild_shims();
34976
35332
  var DEFAULT_PERMISSION_AUDIT_RING_SIZE = 512;
34977
35333
  function takeLast(arr, limit, methodName) {
@@ -35088,7 +35444,7 @@ function createPermissionAuditPublisher(deps) {
35088
35444
  }
35089
35445
  __name(createPermissionAuditPublisher, "createPermissionAuditPublisher");
35090
35446
 
35091
- // packages/cli/src/serve/daemonLogger.ts
35447
+ // packages/cli/src/serve/daemon-logger.ts
35092
35448
  init_esbuild_shims();
35093
35449
  import * as nodeFs from "node:fs";
35094
35450
  import * as nodePath from "node:path";
@@ -35228,7 +35584,7 @@ function initDaemonLogger(opts) {
35228
35584
  }
35229
35585
  __name(initDaemonLogger, "initDaemonLogger");
35230
35586
 
35231
- // packages/cli/src/serve/runQwenServe.ts
35587
+ // packages/cli/src/serve/run-qwen-serve.ts
35232
35588
  var QWEN_SERVER_TOKEN_ENV = "QWEN_SERVER_TOKEN";
35233
35589
  var QWEN_SERVE_PROMPT_DEADLINE_MS_ENV = "QWEN_SERVE_PROMPT_DEADLINE_MS";
35234
35590
  var QWEN_SERVE_WRITER_IDLE_TIMEOUT_MS_ENV = "QWEN_SERVE_WRITER_IDLE_TIMEOUT_MS";
@@ -35612,11 +35968,13 @@ async function runQwenServe(optsIn, deps = {}) {
35612
35968
  ring: permissionAuditRing
35613
35969
  });
35614
35970
  const trustedWorkspace = deps.trustedWorkspace ?? true;
35971
+ const customIgnoreFiles = bootSettings?.merged.context?.fileFiltering?.customIgnoreFiles;
35615
35972
  const fsFactory = resolveBridgeFsFactory({
35616
35973
  boundWorkspace,
35617
35974
  injected: deps.fsFactory,
35618
35975
  trusted: trustedWorkspace,
35619
- emit: deps.fsAuditEmit
35976
+ emit: deps.fsAuditEmit,
35977
+ ...customIgnoreFiles !== void 0 ? { customIgnoreFiles } : {}
35620
35978
  });
35621
35979
  const diagnosticSink = /* @__PURE__ */ __name((line, level) => daemonLog.raw(line, level), "diagnosticSink");
35622
35980
  const channelFactory = createSpawnChannelFactory({
@@ -35637,6 +35995,7 @@ async function runQwenServe(optsIn, deps = {}) {
35637
35995
  );
35638
35996
  }), "persistDisabledToolsFn");
35639
35997
  const statusProvider = createDaemonStatusProvider();
35998
+ const workspaceProvidersStatusProvider = createWorkspaceProvidersStatusProvider();
35640
35999
  const bridge = deps.bridge ?? createAcpSessionBridge({
35641
36000
  maxSessions: opts.maxSessions,
35642
36001
  ...opts.maxPendingPromptsPerSession !== void 0 ? { maxPendingPromptsPerSession: opts.maxPendingPromptsPerSession } : {},
@@ -35695,6 +36054,7 @@ async function runQwenServe(optsIn, deps = {}) {
35695
36054
  contextFilename: contextFilenameForInit ?? "QWEN.md",
35696
36055
  // Daemon-host status provider for env + preflight cells.
35697
36056
  statusProvider,
36057
+ workspaceProvidersStatusProvider,
35698
36058
  // Channel liveness check — proxied through the bridge's live-channel
35699
36059
  // probe (not session count: a channel can be live with zero attached
35700
36060
  // sessions during the cold-spawn window).
@@ -35961,7 +36321,7 @@ async function runQwenServe(optsIn, deps = {}) {
35961
36321
  }
35962
36322
  __name(runQwenServe, "runQwenServe");
35963
36323
 
35964
- // packages/cli/src/serve/inMemoryChannel.ts
36324
+ // packages/cli/src/serve/in-memory-channel.ts
35965
36325
  init_esbuild_shims();
35966
36326
  export {
35967
36327
  ACP_PREFLIGHT_KINDS,