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