@qwen-code/qwen-code 0.21.7-nightly.20260808.4ec0371e6 → 0.21.8
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/README.md +2 -0
- package/bundled/qc-helper/docs/configuration/settings.md +12 -8
- package/bundled/qc-helper/docs/features/commands.md +1 -1
- package/bundled/qc-helper/docs/features/hooks.md +50 -0
- package/bundled/qc-helper/docs/integration-jetbrains.md +1 -0
- package/bundled/qc-helper/docs/qwen-serve.md +1 -1
- package/bundled/qc-helper/docs/reference/keyboard-shortcuts.md +50 -36
- package/bundled/review/SKILL.md +24 -5
- package/chunks/{MaxSizedBox-COZBVNCI.js → MaxSizedBox-7PM6BGJ5.js} +13 -10
- package/chunks/{StandaloneSessionPicker-3OF2FS6S.js → StandaloneSessionPicker-3UQHM7GV.js} +29 -26
- package/chunks/{acp-startup-profiler-ORIQ2CCQ.js → acp-startup-profiler-B5BYAMYQ.js} +2 -2
- package/chunks/{acpAgent-3JCJ6KWG.js → acpAgent-5UWLFV6V.js} +369 -148
- package/chunks/{agent-DBSC47CD.js → agent-624T2BLO.js} +13 -10
- package/chunks/{agent-headless-ZJHZ7I3S.js → agent-headless-2EE5J2KX.js} +13 -10
- package/chunks/{bridge-NFBYT4ZI.js → bridge-JENKGFFP.js} +15 -12
- package/chunks/{ca-NYKNH222.js → ca-ZLKAB4K3.js} +6 -0
- package/chunks/{channel-management-service-LXSJXQGM.js → channel-management-service-DDWUPHMU.js} +1 -1
- package/chunks/{channel-settings-store-LABKDKSI.js → channel-settings-store-SA6JZSPH.js} +21 -18
- package/chunks/{channel-worker-group-MTW2AGT3.js → channel-worker-group-E67EN3RV.js} +2 -2
- package/chunks/{channel-worker-manager-UU6PTQSI.js → channel-worker-manager-SW4C45CF.js} +2 -2
- package/chunks/{chunk-CJXIIILK.js → chunk-2FRY5CRX.js} +1 -1
- package/chunks/{chunk-HKCYGZZ4.js → chunk-2ILAOM2I.js} +30 -13
- package/chunks/{chunk-LDY4J4G6.js → chunk-2M4K4KYS.js} +176 -119
- package/chunks/{chunk-22NBYCPD.js → chunk-3P2LV43B.js} +1 -1
- package/chunks/{chunk-XCG76UE6.js → chunk-3PY4LPJF.js} +17 -129
- package/chunks/{chunk-26ISE5EG.js → chunk-3SE7J4DR.js} +3 -3
- package/chunks/{chunk-APMRLB2H.js → chunk-3WNQOYHQ.js} +12 -12
- package/chunks/{chunk-O7VQ3F22.js → chunk-4ALIARFY.js} +1 -1
- package/chunks/{chunk-FJ6YHWHZ.js → chunk-4DU3NCHG.js} +47 -54
- package/chunks/{chunk-BGG4MBYD.js → chunk-4PYCZH2V.js} +4 -187
- package/chunks/{chunk-3HS6Y4UA.js → chunk-4WU6NY7F.js} +2 -2
- package/chunks/{chunk-JRIJOZXO.js → chunk-5ZGR6RKJ.js} +3 -3
- package/chunks/{chunk-3K7FH2KQ.js → chunk-67N6HB5H.js} +1310 -171
- package/chunks/{chunk-ZQGHESAS.js → chunk-6TR7CFXH.js} +1 -1
- package/chunks/{chunk-EZ53KMUN.js → chunk-757GB46F.js} +1 -1
- package/chunks/{chunk-5YT3Y33M.js → chunk-77QVBFCU.js} +3 -3
- package/chunks/{chunk-5PGKKSO6.js → chunk-7DVT4LVV.js} +35 -28
- package/chunks/{chunk-IMK3SJ43.js → chunk-7VUERJHS.js} +1066 -597
- package/chunks/{chunk-KPMB4JEZ.js → chunk-B52AWKBB.js} +64 -20
- package/chunks/{chunk-R2KZWK5Z.js → chunk-BF224XHL.js} +2 -2
- package/chunks/{chunk-TSYIQDG7.js → chunk-BF52U4XJ.js} +1 -1
- package/chunks/{chunk-LDUGDB5H.js → chunk-C5VWPTGT.js} +1 -1
- package/chunks/{chunk-W7U4ESW2.js → chunk-CG3WBKJK.js} +1 -1
- package/chunks/chunk-COBO5EBO.js +135 -0
- package/chunks/{chunk-ACHMWGC5.js → chunk-DQSDACD2.js} +1 -1
- package/chunks/{chunk-VT3VNFVW.js → chunk-DX5W5AON.js} +2 -2
- package/chunks/{chunk-JACAHYEN.js → chunk-E4ZBKMSF.js} +4 -4
- package/chunks/{chunk-MV7VUCIG.js → chunk-EIVICVHM.js} +4 -4
- package/chunks/{chunk-YHEEE624.js → chunk-EN2TKTFH.js} +1 -1
- package/chunks/chunk-F6WFNA7U.js +22 -0
- package/chunks/{chunk-Z6W3XDLN.js → chunk-FN6YXJOP.js} +1 -1
- package/chunks/{chunk-BJKFFPX2.js → chunk-FWBXMANW.js} +3 -3
- package/chunks/{chunk-764F335K.js → chunk-FYAXKJK7.js} +314 -63
- package/chunks/{chunk-XIDHBXUI.js → chunk-GBDINRIL.js} +3 -3
- package/chunks/{chunk-Z5ZAWED3.js → chunk-GOEVOFQI.js} +3 -3
- package/chunks/{chunk-ZKUJ4AO7.js → chunk-GQCEQPYQ.js} +3 -3
- package/chunks/{chunk-BFSQBXHV.js → chunk-GXSNGY5M.js} +399 -534
- package/chunks/{chunk-3ARO4N5G.js → chunk-HA3SAB64.js} +22 -69
- package/chunks/{chunk-3ULCB3NE.js → chunk-HV76SFIA.js} +1 -1
- package/chunks/{chunk-LMEIS6WW.js → chunk-HWX5HPUG.js} +3 -3
- package/chunks/{chunk-VLFX3L3X.js → chunk-IBYULW65.js} +6 -6
- package/chunks/{chunk-SDUDZNF4.js → chunk-IUQ52YJK.js} +1 -1
- package/chunks/{chunk-H2352CX2.js → chunk-IYES5WOT.js} +2 -2
- package/chunks/{chunk-CE5UCTKO.js → chunk-KAQCJO6Y.js} +1 -1
- package/chunks/{chunk-DPH3MUAP.js → chunk-KKDVZLGL.js} +1 -1
- package/chunks/{chunk-R574ATRM.js → chunk-M2PNLYGY.js} +41 -0
- package/chunks/{chunk-P7HUJDBZ.js → chunk-M3STHEMM.js} +11 -16
- package/chunks/{chunk-VDS2WYM5.js → chunk-NGYI5EF5.js} +2 -2
- package/chunks/{chunk-ALGGS7UH.js → chunk-NPQ5ZKRP.js} +82 -1
- package/chunks/{chunk-GUFY6D3E.js → chunk-NPUXXRJI.js} +1 -1
- package/chunks/{chunk-4Q6N3SNL.js → chunk-NVRDQFCX.js} +1 -1
- package/chunks/{chunk-77WOUGCA.js → chunk-OHKJVAKG.js} +7 -7
- package/chunks/{chunk-TAOSTUHI.js → chunk-PG62DFWD.js} +10 -10
- package/chunks/{chunk-REHWPCG2.js → chunk-PLFATELK.js} +1 -1
- package/chunks/{chunk-APNNM3JC.js → chunk-QGHSP65Z.js} +2 -2
- package/chunks/{chunk-HY2INPTA.js → chunk-QQWD7LZV.js} +4 -4
- package/chunks/{chunk-P74TZRXD.js → chunk-QXVSWG66.js} +1 -1
- package/chunks/{chunk-TX3KSSDN.js → chunk-S3Y3GBFD.js} +1 -1
- package/chunks/{chunk-B23P3YWE.js → chunk-SNRT2TJJ.js} +6 -23
- package/chunks/chunk-SR7RZ4MS.js +202 -0
- package/chunks/{chunk-F3LPXDJP.js → chunk-TE3ZAJE7.js} +13 -3
- package/chunks/{chunk-AB4A73VL.js → chunk-TKSZJ5BV.js} +1 -1
- package/chunks/{chunk-RZMGG3HP.js → chunk-U5SLIG7E.js} +1 -1
- package/chunks/chunk-UA5H3DS2.js +203 -0
- package/chunks/{chunk-JSJTZ6GO.js → chunk-VWMUDKLC.js} +3 -3
- package/chunks/{chunk-RGTB44BO.js → chunk-VXZ5HAOV.js} +1 -1
- package/chunks/{chunk-BCMJPTXV.js → chunk-WG6542MA.js} +1 -1
- package/chunks/{chunk-AG3P2RES.js → chunk-WV5J6Q6N.js} +1 -1
- package/chunks/{chunk-MIA37QO3.js → chunk-XHD7CRP2.js} +2 -2
- package/chunks/{chunk-KKRGVSHC.js → chunk-XZKQT2B2.js} +4 -4
- package/chunks/{chunk-4QJJHIZ5.js → chunk-Y4TETC74.js} +5 -5
- package/chunks/{chunk-QKJT5K4Q.js → chunk-YEF7XEO2.js} +3 -3
- package/chunks/{chunk-UKAYEQDU.js → chunk-YHJFF7KH.js} +131 -38
- package/chunks/{chunk-64YLXLMY.js → chunk-YOM7DEGB.js} +2 -2
- package/chunks/{chunk-BN3OROB3.js → chunk-ZCLLJARV.js} +9 -9
- package/chunks/{chunk-RFA6VDCR.js → chunk-ZHA242R4.js} +2 -2
- package/chunks/{chunk-L4OW63GW.js → chunk-ZPLALRXZ.js} +17 -9
- package/chunks/{computer-use-QLJ27OCZ.js → computer-use-ESQYJ3JY.js} +13 -10
- package/chunks/{config-utils-KIEXWA4F.js → config-utils-XQHBJP7G.js} +2 -2
- package/chunks/{contextCommand-JDTOJRBO.js → contextCommand-CX3YF4ZE.js} +15 -12
- package/chunks/{core-runtime-MZIAVYQC.js → core-runtime-DIAU7JMG.js} +13 -10
- package/chunks/{create-sub-session-YBBCNSHE.js → create-sub-session-HDPD6HOA.js} +13 -10
- package/chunks/{daemon-SCTQMM7Z.js → daemon-VZBGJUNL.js} +30 -0
- package/chunks/{daemon-status-provider-BZ7RD4ZJ.js → daemon-status-provider-H6O4UQ4F.js} +19 -16
- package/chunks/{daemon-trust-policy-2E4C3M7S.js → daemon-trust-policy-BNUXG6MT.js} +20 -17
- package/chunks/{daemon-trust-policy-monitor-UYLFH6RW.js → daemon-trust-policy-monitor-E4EQ7GF4.js} +20 -17
- package/chunks/{de-VL76CPLV.js → de-LIW4XVLN.js} +5 -0
- package/chunks/{deferred-core-runtime-6XZYMJZB.js → deferred-core-runtime-CBMSHPAU.js} +13 -10
- package/chunks/{dist-BATY7GI4.js → dist-EEEQGCZA.js} +731 -136
- package/chunks/{dist-26RK5XZO.js → dist-MKX5OSFF.js} +4 -3
- package/chunks/{earlyInputCapture-LATQCGDC.js → earlyInputCapture-UIOP7OIN.js} +13 -10
- package/chunks/{edit-72DP57CD.js → edit-ITMZYFKA.js} +13 -10
- package/chunks/{en-IRJ2WN5T.js → en-SY5GTIGX.js} +6 -0
- package/chunks/{enter-worktree-B4FY2ZPP.js → enter-worktree-S4PL5UV6.js} +13 -10
- package/chunks/{enterPlanMode-TQBWGCPL.js → enterPlanMode-YV52NNJT.js} +13 -10
- package/chunks/{environment-MOGZGZDS.js → environment-NGOWPRZV.js} +17 -14
- package/chunks/{errors-PGON5GH7.js → errors-BU26DTDX.js} +15 -12
- package/chunks/{exit-worktree-EYUD4YP2.js → exit-worktree-XRM6LH5F.js} +13 -10
- package/chunks/{exitPlanMode-4Q7BSQXR.js → exitPlanMode-ZLI5F7KR.js} +13 -10
- package/chunks/{fast-path-WI7D5MER.js → fast-path-UJWORIED.js} +3 -3
- package/chunks/{fast-path-settings-YBRL24DB.js → fast-path-settings-37WQD5B2.js} +6 -3
- package/chunks/{fr-GK3HQYVB.js → fr-RQFO7U4P.js} +5 -0
- package/chunks/{gemini-ZXURGM6Y.js → gemini-ZSKNDUMU.js} +55 -48
- package/chunks/{geminiContentGenerator-EOODO75Y.js → geminiContentGenerator-YGEXOEKD.js} +1 -1
- package/chunks/{glob-QNRIUOS6.js → glob-7KZG44BR.js} +13 -10
- package/chunks/{goal-tools-QSYW65HV.js → goal-tools-PXWN5VK3.js} +3 -1
- package/chunks/{grep-56MTW67B.js → grep-6ZFC7RJ5.js} +13 -10
- package/chunks/{handleAutoUpdate-XGFIPVT4.js → handleAutoUpdate-KSEL3TQS.js} +17 -14
- package/chunks/{i18n-RZB35L4B.js → i18n-ZIUXBW5V.js} +14 -11
- package/chunks/{image-gen-OE2EEKN3.js → image-gen-AUIZJJNK.js} +6 -4
- package/chunks/{initializer-YPVMTMKD.js → initializer-7AHY3N6Q.js} +20 -17
- package/chunks/{installationInfo-ZTMTMYNW.js → installationInfo-VGBXMYLY.js} +14 -11
- package/chunks/{ja-3FA46IKD.js → ja-KOZKHJHZ.js} +5 -0
- package/chunks/{list-NIW3WID5.js → list-PSFKQHLB.js} +23 -20
- package/chunks/{loadedSettingsAdapter-VSLILTOZ.js → loadedSettingsAdapter-FTMRCTOF.js} +20 -17
- package/chunks/{loggingContentGenerator-KFZYVAGV.js → loggingContentGenerator-MZAN52UV.js} +5 -3
- package/chunks/{managed-npm-update-WHTA2K5V.js → managed-npm-update-O4NHK45X.js} +14 -11
- package/chunks/{mcp-7KGK3CS3.js → mcp-6CFP2AYQ.js} +20 -17
- package/chunks/{monitor-FDWEJQWP.js → monitor-DAKD6OU4.js} +13 -10
- package/chunks/{nonInteractiveCli-2MVJ6TCS.js → nonInteractiveCli-RC7VIUZL.js} +49 -44
- package/chunks/{notebook-edit-ZUVK2XWE.js → notebook-edit-474DPMRL.js} +13 -10
- package/chunks/{openaiContentGenerator-TNLWOPH5.js → openaiContentGenerator-2NFY2MWO.js} +6 -3
- package/chunks/{pidfile-BB6SKPH2.js → pidfile-KBFVDNQP.js} +13 -10
- package/chunks/{processUtils-WKHJOPDH.js → processUtils-6GRYH4Y3.js} +2 -2
- package/chunks/{pt-3AOBKPIJ.js → pt-U6AOCTMF.js} +5 -0
- package/chunks/{qwenContentGenerator-FZS2DYF7.js → qwenContentGenerator-KAHU6IZY.js} +14 -11
- package/chunks/{qwenOAuth2-UYMYRXBB.js → qwenOAuth2-RRQTCP4W.js} +6 -4
- package/chunks/{read-file-FMTE6LPA.js → read-file-3M6WXDXP.js} +4 -2
- package/chunks/{resumeHistoryUtils-Z34RCZFF.js → resumeHistoryUtils-D6TAY3HX.js} +16 -13
- package/chunks/{ripGrep-DUIYUZGM.js → ripGrep-PLPENT3E.js} +13 -10
- package/chunks/{ru-VJRAMC4W.js → ru-CMX4UMYP.js} +5 -0
- package/chunks/{run-qwen-serve-KOHHR3F4.js → run-qwen-serve-ZAFIJKJC.js} +93 -40
- package/chunks/{runtime-K4NTZSAU.js → runtime-ZED7CYOZ.js} +23 -20
- package/chunks/{scheduler-6G6AMURS.js → scheduler-MD3AL2W5.js} +13 -10
- package/chunks/{serve-NMG2TM5K.js → serve-E3VUDRZN.js} +20 -17
- package/chunks/{server-FS7KDELS.js → server-OWMEMAKR.js} +381 -192
- package/chunks/{session-XZADUVKJ.js → session-HZ57QK7K.js} +141 -81
- package/chunks/{settings-G75R6FOA.js → settings-V7BR3RKP.js} +19 -16
- package/chunks/{shell-3D3PMQHE.js → shell-23OMNMW6.js} +13 -10
- package/chunks/{skill-TSEYMVQ2.js → skill-6HBDYZRS.js} +4 -2
- package/chunks/{skill-settings-HJC2CPBJ.js → skill-settings-HWJLTU7M.js} +19 -16
- package/chunks/{spawnChannel-YWCN74G5.js → spawnChannel-N6KKUW5B.js} +13 -10
- package/chunks/{standalone-update-HLYOLX6V.js → standalone-update-QGIKHATD.js} +15 -12
- package/chunks/{startInteractiveUI-ROUIQ5KU.js → startInteractiveUI-GX2CRL42.js} +269 -118
- package/chunks/{team-create-OTP5SSB2.js → team-create-CFFKU7KL.js} +13 -10
- package/chunks/{team-plan-approval-TQX5TMXU.js → team-plan-approval-6EFOKR6A.js} +13 -10
- package/chunks/{terminal-image-renderer-KF3GKNWW.js → terminal-image-renderer-TLDNACQY.js} +13 -10
- package/chunks/{theme-manager-XVWAAGAM.js → theme-manager-5LJ3H7VO.js} +13 -10
- package/chunks/{tool-search-7N4D4O56.js → tool-search-UJV3A24H.js} +4 -2
- package/chunks/{total-session-admission-ZQ4VKIRW.js → total-session-admission-D63QYXGO.js} +15 -12
- package/chunks/{trustedFolders-4XYFPWVV.js → trustedFolders-KZCOB53W.js} +17 -12
- package/chunks/{update-relaunch-L4GSBLUU.js → update-relaunch-IFILM3SA.js} +5 -5
- package/chunks/{updateCheck-PCUTVRFE.js → updateCheck-YZ2CRCFC.js} +16 -13
- package/chunks/{useAutoAcceptIndicator-WMXY7MND.js → useAutoAcceptIndicator-AXEVNA3Q.js} +22 -19
- package/chunks/{validateNonInterActiveAuth-5S3U2D56.js → validateNonInterActiveAuth-3WTOJFWA.js} +44 -41
- package/chunks/{version-P57IQU2T.js → version-GXK7OHZY.js} +1 -1
- package/chunks/{web-fetch-5ZLLLCDD.js → web-fetch-ILB4GAVR.js} +10 -6
- package/chunks/{web-search-NELKANTW.js → web-search-HKRPGPZZ.js} +5 -3
- package/chunks/{workflow-RXKBF3LO.js → workflow-FXIPRQQA.js} +735 -134
- package/chunks/{workspace-providers-status-HAEMNAWC.js → workspace-providers-status-NYHC7HSR.js} +22 -19
- package/chunks/{workspace-registration-store-U3U3YM6V.js → workspace-registration-store-AKEB7OMW.js} +1 -1
- package/chunks/{workspace-registry-ZFP33GVB.js → workspace-registry-CDAS5TVZ.js} +15 -12
- package/chunks/{workspace-service-QMISJBMA.js → workspace-service-PAMUKMAV.js} +23 -20
- package/chunks/{workspace-skills-status-K7EOUGXL.js → workspace-skills-status-YQSHCCMS.js} +20 -17
- package/chunks/{workspace-trust-reconciler-BFPKULDZ.js → workspace-trust-reconciler-RPTXOIY2.js} +22 -19
- package/chunks/{write-file-2F76RRFE.js → write-file-CGS57TS4.js} +13 -10
- package/chunks/{zh-ARWDLDLR.js → zh-AGL2FVBI.js} +6 -0
- package/chunks/{zh-TW-Y4RGI3P7.js → zh-TW-KI66MHQY.js} +6 -0
- package/chunks/{zoom-image-DPR22XWY.js → zoom-image-E7D72GYV.js} +4 -2
- package/cli.js +13 -13
- package/locales/ca.js +10 -0
- package/locales/de.js +9 -0
- package/locales/en.js +10 -0
- package/locales/fr.js +9 -0
- package/locales/ja.js +9 -0
- package/locales/pt.js +9 -0
- package/locales/ru.js +9 -0
- package/locales/zh-TW.js +10 -0
- package/locales/zh.js +10 -0
- package/package.json +3 -3
- package/web-shell/assets/{arc-CunFPPcQ.js → arc-DybZaz32.js} +1 -1
- package/web-shell/assets/{architectureDiagram-3BPJPVTR-D3SqCgeM.js → architectureDiagram-3BPJPVTR-jN3qBd19.js} +1 -1
- package/web-shell/assets/{blockDiagram-GPEHLZMM-CPRx90S_.js → blockDiagram-GPEHLZMM-Ct5DZPrj.js} +1 -1
- package/web-shell/assets/{c4Diagram-AAUBKEIU-CahP9Ue4.js → c4Diagram-AAUBKEIU-CUAFMlUG.js} +1 -1
- package/web-shell/assets/channel-BMwLrwLW.js +1 -0
- package/web-shell/assets/{chunk-2J33WTMH-DckIWZ12.js → chunk-2J33WTMH-CuV8n90B.js} +1 -1
- package/web-shell/assets/{chunk-4BX2VUAB-D2Kfctyn.js → chunk-4BX2VUAB-BUzl_kls.js} +1 -1
- package/web-shell/assets/{chunk-55IACEB6-DkI11FTX.js → chunk-55IACEB6-BnDBLX6A.js} +1 -1
- package/web-shell/assets/{chunk-727SXJPM-rR-TSCIi.js → chunk-727SXJPM-B83uTOjm.js} +1 -1
- package/web-shell/assets/{chunk-AQP2D5EJ-DFGKcGRO.js → chunk-AQP2D5EJ-DM3HLgpT.js} +1 -1
- package/web-shell/assets/{chunk-FMBD7UC4-CjWqcTPE.js → chunk-FMBD7UC4-CSQ5hgyb.js} +1 -1
- package/web-shell/assets/{chunk-ND2GUHAM-RXe-87UV.js → chunk-ND2GUHAM-BWOF4SxX.js} +1 -1
- package/web-shell/assets/{chunk-QZHKN3VN-Dz0c_Yrn.js → chunk-QZHKN3VN-BsOH9LMi.js} +1 -1
- package/web-shell/assets/classDiagram-4FO5ZUOK-BGDv98jY.js +1 -0
- package/web-shell/assets/classDiagram-v2-Q7XG4LA2-BGDv98jY.js +1 -0
- package/web-shell/assets/{cose-bilkent-S5V4N54A-ZHF0-jvV.js → cose-bilkent-S5V4N54A-IENqH2iJ.js} +1 -1
- package/web-shell/assets/{dagre-BM42HDAG-7Umz_ygJ.js → dagre-BM42HDAG--dyzDTGo.js} +1 -1
- package/web-shell/assets/{diagram-2AECGRRQ-DomN8nxq.js → diagram-2AECGRRQ-BE7Dcqof.js} +1 -1
- package/web-shell/assets/{diagram-5GNKFQAL-eebvj2OL.js → diagram-5GNKFQAL-Cr8-5OTj.js} +1 -1
- package/web-shell/assets/{diagram-KO2AKTUF-IR1mmn9d.js → diagram-KO2AKTUF-Bzey3uAY.js} +1 -1
- package/web-shell/assets/{diagram-LMA3HP47-CKysx5KF.js → diagram-LMA3HP47-sErl28Xb.js} +1 -1
- package/web-shell/assets/{diagram-OG6HWLK6-cBy5puHn.js → diagram-OG6HWLK6-Dq30ATIo.js} +1 -1
- package/web-shell/assets/{erDiagram-TEJ5UH35-B5RJagPG.js → erDiagram-TEJ5UH35-BkCoEfVW.js} +1 -1
- package/web-shell/assets/{flowDiagram-I6XJVG4X-CfHgDmPg.js → flowDiagram-I6XJVG4X-DHwO0rrI.js} +1 -1
- package/web-shell/assets/{ganttDiagram-6RSMTGT7-DUfFF5nb.js → ganttDiagram-6RSMTGT7-s7vAPxWq.js} +1 -1
- package/web-shell/assets/{gitGraphDiagram-PVQCEYII-M9dt57k5.js → gitGraphDiagram-PVQCEYII-CQxhwPOU.js} +1 -1
- package/web-shell/assets/{index-B8e-CkuC.css → index-Bckpjr-I.css} +1 -1
- package/web-shell/assets/{index-CKjO4myk.js → index-CF4wApWp.js} +1 -1
- package/web-shell/assets/{index-Dc-fTO0V.js → index-DwEr9HEW.js} +316 -316
- package/web-shell/assets/{infoDiagram-5YYISTIA-CTKMmIro.js → infoDiagram-5YYISTIA-BnFrD0bq.js} +1 -1
- package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-DJIJDP4s.js → ishikawaDiagram-YF4QCWOH-Bf9zK5NK.js} +1 -1
- package/web-shell/assets/{journeyDiagram-JHISSGLW-DgRnvn6S.js → journeyDiagram-JHISSGLW-CyGAhsxi.js} +1 -1
- package/web-shell/assets/{kanban-definition-UN3LZRKU-VUwO8yrg.js → kanban-definition-UN3LZRKU-CbsK5akB.js} +1 -1
- package/web-shell/assets/{linear-BCvgV5I_.js → linear-cQsF4P8D.js} +1 -1
- package/web-shell/assets/{mermaid.core-mv_kVV6q.js → mermaid.core-Z4HVqrKY.js} +5 -5
- package/web-shell/assets/{mindmap-definition-RKZ34NQL-sfnjMlOd.js → mindmap-definition-RKZ34NQL-CYnrBo_f.js} +1 -1
- package/web-shell/assets/{pieDiagram-4H26LBE5-BlhICse4.js → pieDiagram-4H26LBE5-CBzOfhrs.js} +1 -1
- package/web-shell/assets/{quadrantDiagram-W4KKPZXB-BgTQzwen.js → quadrantDiagram-W4KKPZXB-D4LK1Ebn.js} +1 -1
- package/web-shell/assets/{requirementDiagram-4Y6WPE33-CZ-FTrrN.js → requirementDiagram-4Y6WPE33-Bzti2Lcj.js} +1 -1
- package/web-shell/assets/{sankeyDiagram-5OEKKPKP-G5Wp_jn3.js → sankeyDiagram-5OEKKPKP-yTBw5Z2s.js} +1 -1
- package/web-shell/assets/{sequenceDiagram-3UESZ5HK-C8MKZ3i1.js → sequenceDiagram-3UESZ5HK-D07UVRiZ.js} +1 -1
- package/web-shell/assets/{stateDiagram-AJRCARHV-Bo0ZDm7y.js → stateDiagram-AJRCARHV-UE_lHsTn.js} +1 -1
- package/web-shell/assets/stateDiagram-v2-BHNVJYJU-DC6xgXjX.js +1 -0
- package/web-shell/assets/{timeline-definition-PNZ67QCA-M3L9E01f.js → timeline-definition-PNZ67QCA-DRvYdiTs.js} +1 -1
- package/web-shell/assets/{vennDiagram-CIIHVFJN-DD4eHCrm.js → vennDiagram-CIIHVFJN-CQLIXs0u.js} +1 -1
- package/web-shell/assets/{wardley-L42UT6IY-DNEL_3g4.js → wardley-L42UT6IY-JZz_Xqse.js} +1 -1
- package/web-shell/assets/{wardleyDiagram-YWT4CUSO-q484OoqI.js → wardleyDiagram-YWT4CUSO--i7BiJwB.js} +1 -1
- package/web-shell/assets/{xychartDiagram-2RQKCTM6-4mcNt1Yg.js → xychartDiagram-2RQKCTM6-Bkc-bW0S.js} +1 -1
- package/web-shell/index.html +2 -2
- package/chunks/chunk-ALFTV7GA.js +0 -92
- package/web-shell/assets/channel-zbv7GWAw.js +0 -1
- package/web-shell/assets/classDiagram-4FO5ZUOK-DSjLkJJZ.js +0 -1
- package/web-shell/assets/classDiagram-v2-Q7XG4LA2-DSjLkJJZ.js +0 -1
- package/web-shell/assets/stateDiagram-v2-BHNVJYJU-31TSCPcH.js +0 -1
|
@@ -21,7 +21,7 @@ import {
|
|
|
21
21
|
shouldSuppressRememberErrorDetails,
|
|
22
22
|
workspaceMemoryFailureCode,
|
|
23
23
|
workspaceMemoryFailureDiagnostics
|
|
24
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-ZPLALRXZ.js";
|
|
25
25
|
import {
|
|
26
26
|
deriveWebSocketBase,
|
|
27
27
|
openQwenAsrRealtimeStream,
|
|
@@ -39,12 +39,12 @@ import {
|
|
|
39
39
|
toJson,
|
|
40
40
|
toJsonl,
|
|
41
41
|
toMarkdown
|
|
42
|
-
} from "./chunk-
|
|
42
|
+
} from "./chunk-2M4K4KYS.js";
|
|
43
43
|
import {
|
|
44
44
|
OBSERVED_CONTACT_MAX_FRESH_WITHIN_SECONDS,
|
|
45
45
|
ObservedChannelContactStore
|
|
46
46
|
} from "./chunk-OWMAZHIX.js";
|
|
47
|
-
import "./chunk-
|
|
47
|
+
import "./chunk-4ALIARFY.js";
|
|
48
48
|
import {
|
|
49
49
|
escapeAnsiCtrlCodes
|
|
50
50
|
} from "./chunk-4NFY2S7N.js";
|
|
@@ -108,7 +108,7 @@ import {
|
|
|
108
108
|
setRateLimiter,
|
|
109
109
|
unsafeRevealSecret,
|
|
110
110
|
validateMcpRuntimeServerName
|
|
111
|
-
} from "./chunk-
|
|
111
|
+
} from "./chunk-KAQCJO6Y.js";
|
|
112
112
|
import {
|
|
113
113
|
isLoopbackBind
|
|
114
114
|
} from "./chunk-RXFQM6FQ.js";
|
|
@@ -124,17 +124,17 @@ import {
|
|
|
124
124
|
import "./chunk-GRC5HGPI.js";
|
|
125
125
|
import {
|
|
126
126
|
assertValidChannelSecretUpdates
|
|
127
|
-
} from "./chunk-
|
|
127
|
+
} from "./chunk-4WU6NY7F.js";
|
|
128
128
|
import {
|
|
129
129
|
createWorkspaceProvidersStatusProvider
|
|
130
|
-
} from "./chunk-
|
|
130
|
+
} from "./chunk-XZKQT2B2.js";
|
|
131
131
|
import {
|
|
132
132
|
getAuthTypeFromEnv,
|
|
133
133
|
resolveCliGenerationConfig
|
|
134
|
-
} from "./chunk-
|
|
134
|
+
} from "./chunk-GBDINRIL.js";
|
|
135
135
|
import {
|
|
136
136
|
createWorkspaceSkillsStatusProvider
|
|
137
|
-
} from "./chunk-
|
|
137
|
+
} from "./chunk-DX5W5AON.js";
|
|
138
138
|
import "./chunk-BGXZBI5B.js";
|
|
139
139
|
import {
|
|
140
140
|
isServeDebugMode,
|
|
@@ -147,7 +147,7 @@ import {
|
|
|
147
147
|
import {
|
|
148
148
|
evaluateDaemonWorkspaceTrust,
|
|
149
149
|
readDaemonTrustPolicySnapshot
|
|
150
|
-
} from "./chunk-
|
|
150
|
+
} from "./chunk-SNRT2TJJ.js";
|
|
151
151
|
import {
|
|
152
152
|
EMPTY_WORKSPACE_VOICE_UPDATE_ERROR,
|
|
153
153
|
MAX_WORKSPACE_SKILL_NAME_LENGTH,
|
|
@@ -161,14 +161,14 @@ import {
|
|
|
161
161
|
validateWorkspaceSkillName,
|
|
162
162
|
validateWorkspaceVoiceState,
|
|
163
163
|
voiceSettingsScopeToWire
|
|
164
|
-
} from "./chunk-
|
|
164
|
+
} from "./chunk-IBYULW65.js";
|
|
165
165
|
import {
|
|
166
166
|
PermissionRulesValidationError,
|
|
167
167
|
buildPermissionSettings,
|
|
168
168
|
isPermissionRuleType,
|
|
169
169
|
normalizePermissionRules,
|
|
170
170
|
readPermissionRuleSet
|
|
171
|
-
} from "./chunk-
|
|
171
|
+
} from "./chunk-KKDVZLGL.js";
|
|
172
172
|
import {
|
|
173
173
|
assertVoiceBaseUrlNetworkAllowed,
|
|
174
174
|
isStreamingVoiceModel,
|
|
@@ -176,12 +176,12 @@ import {
|
|
|
176
176
|
resolveVoiceTranscriptionConfig,
|
|
177
177
|
sanitizeVoiceErrorMessage,
|
|
178
178
|
transcribeVoiceAudio
|
|
179
|
-
} from "./chunk-
|
|
179
|
+
} from "./chunk-DQSDACD2.js";
|
|
180
180
|
import {
|
|
181
181
|
isVoiceEnabled,
|
|
182
182
|
isVoiceMode,
|
|
183
183
|
readVoiceModel
|
|
184
|
-
} from "./chunk-
|
|
184
|
+
} from "./chunk-C5VWPTGT.js";
|
|
185
185
|
import "./chunk-AOHJKPKL.js";
|
|
186
186
|
import "./chunk-Z4X5MTRT.js";
|
|
187
187
|
import {
|
|
@@ -193,8 +193,8 @@ import {
|
|
|
193
193
|
import {
|
|
194
194
|
daemonObservedContactsPath,
|
|
195
195
|
loadChannelsConfig
|
|
196
|
-
} from "./chunk-
|
|
197
|
-
import "./chunk-
|
|
196
|
+
} from "./chunk-E4ZBKMSF.js";
|
|
197
|
+
import "./chunk-QQWD7LZV.js";
|
|
198
198
|
import "./chunk-57OAHC2Y.js";
|
|
199
199
|
import {
|
|
200
200
|
LIVE_HOST_BUNDLE_ID,
|
|
@@ -203,19 +203,19 @@ import {
|
|
|
203
203
|
} from "./chunk-NKLP3DCK.js";
|
|
204
204
|
import {
|
|
205
205
|
createDaemonStatusProvider
|
|
206
|
-
} from "./chunk-
|
|
206
|
+
} from "./chunk-VWMUDKLC.js";
|
|
207
207
|
import "./chunk-VXZBKKQR.js";
|
|
208
|
-
import "./chunk-
|
|
208
|
+
import "./chunk-3SE7J4DR.js";
|
|
209
209
|
import "./chunk-3SH53ANB.js";
|
|
210
210
|
import {
|
|
211
211
|
snapshotProcessEnv
|
|
212
|
-
} from "./chunk-
|
|
212
|
+
} from "./chunk-S3Y3GBFD.js";
|
|
213
213
|
import {
|
|
214
214
|
SessionArtifactAuthorizationError,
|
|
215
215
|
SessionArtifactValidationError,
|
|
216
216
|
createAcpSessionBridge,
|
|
217
217
|
parseSessionSource
|
|
218
|
-
} from "./chunk-
|
|
218
|
+
} from "./chunk-FYAXKJK7.js";
|
|
219
219
|
import {
|
|
220
220
|
EVENT_SCHEMA_VERSION,
|
|
221
221
|
EventBus,
|
|
@@ -234,11 +234,11 @@ import "./chunk-FC4KQFCS.js";
|
|
|
234
234
|
import "./chunk-T3CHYWJZ.js";
|
|
235
235
|
import {
|
|
236
236
|
parseChannelWebhookConfigLenient
|
|
237
|
-
} from "./chunk-
|
|
237
|
+
} from "./chunk-QXVSWG66.js";
|
|
238
238
|
import "./chunk-KJZ26VBX.js";
|
|
239
239
|
import {
|
|
240
240
|
supportedChannelCatalog
|
|
241
|
-
} from "./chunk-
|
|
241
|
+
} from "./chunk-NGYI5EF5.js";
|
|
242
242
|
import "./chunk-V6WHFGST.js";
|
|
243
243
|
import {
|
|
244
244
|
MAX_REGISTERED_WORKSPACES,
|
|
@@ -247,8 +247,10 @@ import {
|
|
|
247
247
|
WorkspaceRegistrationStoreLimitError,
|
|
248
248
|
normalizeWorkspaceDisplayName,
|
|
249
249
|
workspaceRegistrationId
|
|
250
|
-
} from "./chunk-
|
|
251
|
-
import
|
|
250
|
+
} from "./chunk-757GB46F.js";
|
|
251
|
+
import {
|
|
252
|
+
gradeActiveWorkCoverage
|
|
253
|
+
} from "./chunk-M2PNLYGY.js";
|
|
252
254
|
import {
|
|
253
255
|
BranchWhilePromptActiveError,
|
|
254
256
|
CancelSentinelCollisionError,
|
|
@@ -323,7 +325,7 @@ import {
|
|
|
323
325
|
getWritableScopes,
|
|
324
326
|
loadSettings,
|
|
325
327
|
validateSettingValue
|
|
326
|
-
} from "./chunk-
|
|
328
|
+
} from "./chunk-OHKJVAKG.js";
|
|
327
329
|
import "./chunk-RKUWKYED.js";
|
|
328
330
|
import "./chunk-GOXKNSDZ.js";
|
|
329
331
|
import "./chunk-IDS7MSUP.js";
|
|
@@ -332,15 +334,15 @@ import {
|
|
|
332
334
|
detectSystemLanguage,
|
|
333
335
|
resolveLanguageSetting,
|
|
334
336
|
resolveSupportedLanguage
|
|
335
|
-
} from "./chunk-
|
|
336
|
-
import "./chunk-
|
|
337
|
-
import "./chunk-
|
|
338
|
-
import "./chunk-
|
|
337
|
+
} from "./chunk-PG62DFWD.js";
|
|
338
|
+
import "./chunk-B52AWKBB.js";
|
|
339
|
+
import "./chunk-UA5H3DS2.js";
|
|
340
|
+
import "./chunk-FN6YXJOP.js";
|
|
339
341
|
import "./chunk-VJNBRRZG.js";
|
|
340
342
|
import {
|
|
341
343
|
getWorkspaceTrustStatus
|
|
342
|
-
} from "./chunk-
|
|
343
|
-
import "./chunk-
|
|
344
|
+
} from "./chunk-HA3SAB64.js";
|
|
345
|
+
import "./chunk-NPQ5ZKRP.js";
|
|
344
346
|
import {
|
|
345
347
|
isWithinRoot as isWithinRoot2
|
|
346
348
|
} from "./chunk-MR3PXB6E.js";
|
|
@@ -419,7 +421,7 @@ import {
|
|
|
419
421
|
writeWorkspaceContextFile,
|
|
420
422
|
writeWorktreeSession,
|
|
421
423
|
writeWorktreeSessionMarker
|
|
422
|
-
} from "./chunk-
|
|
424
|
+
} from "./chunk-GXSNGY5M.js";
|
|
423
425
|
import "./chunk-GOFAQQZA.js";
|
|
424
426
|
import "./chunk-5M6IDOMF.js";
|
|
425
427
|
import "./chunk-TWPJO254.js";
|
|
@@ -432,7 +434,7 @@ import "./chunk-MVUQRLOH.js";
|
|
|
432
434
|
import "./chunk-XCWO3SMQ.js";
|
|
433
435
|
import "./chunk-7MH4J33A.js";
|
|
434
436
|
import "./chunk-6PVPNMXU.js";
|
|
435
|
-
import "./chunk-
|
|
437
|
+
import "./chunk-VXZ5HAOV.js";
|
|
436
438
|
import {
|
|
437
439
|
nextFireTime,
|
|
438
440
|
parseCron
|
|
@@ -455,12 +457,12 @@ import "./chunk-J6SZID63.js";
|
|
|
455
457
|
import "./chunk-KRXPRVGL.js";
|
|
456
458
|
import "./chunk-GM463R2B.js";
|
|
457
459
|
import "./chunk-SEZ556DZ.js";
|
|
458
|
-
import "./chunk-
|
|
459
|
-
import "./chunk-
|
|
460
|
+
import "./chunk-2FRY5CRX.js";
|
|
461
|
+
import "./chunk-67N6HB5H.js";
|
|
460
462
|
import {
|
|
461
463
|
APPROVAL_MODES
|
|
462
464
|
} from "./chunk-WAUGQKUU.js";
|
|
463
|
-
import "./chunk-
|
|
465
|
+
import "./chunk-PLFATELK.js";
|
|
464
466
|
import {
|
|
465
467
|
addDaemonRequestAttribute,
|
|
466
468
|
captureDaemonTelemetryContext,
|
|
@@ -494,11 +496,12 @@ import {
|
|
|
494
496
|
isDeviceAuthorizationSuccess,
|
|
495
497
|
isDeviceTokenPending,
|
|
496
498
|
isDeviceTokenSuccess
|
|
497
|
-
} from "./chunk-
|
|
499
|
+
} from "./chunk-3P2LV43B.js";
|
|
498
500
|
import "./chunk-NAVJD2PQ.js";
|
|
499
|
-
import "./chunk-
|
|
500
|
-
import "./chunk-
|
|
501
|
+
import "./chunk-HV76SFIA.js";
|
|
502
|
+
import "./chunk-4PYCZH2V.js";
|
|
501
503
|
import "./chunk-P3QQPMQA.js";
|
|
504
|
+
import "./chunk-SR7RZ4MS.js";
|
|
502
505
|
import "./chunk-M6HMMKVG.js";
|
|
503
506
|
import "./chunk-DGEIYUC3.js";
|
|
504
507
|
import "./chunk-MPHPFVKK.js";
|
|
@@ -518,13 +521,15 @@ import {
|
|
|
518
521
|
isWithinRoot,
|
|
519
522
|
parseLineTolerant,
|
|
520
523
|
read
|
|
521
|
-
} from "./chunk-
|
|
524
|
+
} from "./chunk-3PY4LPJF.js";
|
|
522
525
|
import "./chunk-WOJZWRAZ.js";
|
|
523
526
|
import "./chunk-VGC4I5JJ.js";
|
|
524
527
|
import "./chunk-FVKHVJZQ.js";
|
|
528
|
+
import "./chunk-COBO5EBO.js";
|
|
525
529
|
import "./chunk-6ZRFAKXK.js";
|
|
526
530
|
import "./chunk-PYQADEFD.js";
|
|
527
|
-
import "./chunk-
|
|
531
|
+
import "./chunk-M3STHEMM.js";
|
|
532
|
+
import "./chunk-F6WFNA7U.js";
|
|
528
533
|
import "./chunk-46UV252V.js";
|
|
529
534
|
import "./chunk-ZBVS26BY.js";
|
|
530
535
|
import "./chunk-KKBPOU75.js";
|
|
@@ -537,6 +542,7 @@ import {
|
|
|
537
542
|
FatalConfigError,
|
|
538
543
|
Storage,
|
|
539
544
|
createDebugLogger,
|
|
545
|
+
getErrorMessage,
|
|
540
546
|
runWithoutDebugLogSession
|
|
541
547
|
} from "./chunk-OIVKILPI.js";
|
|
542
548
|
import "./chunk-VOQXFAY5.js";
|
|
@@ -565,7 +571,7 @@ import {
|
|
|
565
571
|
|
|
566
572
|
// packages/cli/src/serve/server.ts
|
|
567
573
|
init_esbuild_shims();
|
|
568
|
-
var
|
|
574
|
+
var import_express5 = __toESM(require_express(), 1);
|
|
569
575
|
|
|
570
576
|
// packages/cli/src/serve/acp-http/index.ts
|
|
571
577
|
init_esbuild_shims();
|
|
@@ -1182,11 +1188,11 @@ function decodeTextCursor(cursor) {
|
|
|
1182
1188
|
return { off, size, dev, ino };
|
|
1183
1189
|
}
|
|
1184
1190
|
__name(decodeTextCursor, "decodeTextCursor");
|
|
1185
|
-
function assertCursorMatchesFile(cursor, stats,
|
|
1191
|
+
function assertCursorMatchesFile(cursor, stats, path15) {
|
|
1186
1192
|
if (String(stats.dev) !== cursor.dev || String(stats.ino) !== cursor.ino || stats.size < cursor.size) {
|
|
1187
1193
|
throw new FsError(
|
|
1188
1194
|
"hash_mismatch",
|
|
1189
|
-
`cursor no longer matches the file it was issued for: ${
|
|
1195
|
+
`cursor no longer matches the file it was issued for: ${path15}`,
|
|
1190
1196
|
{ hint: "re-read the file from the beginning to get a fresh cursor" }
|
|
1191
1197
|
);
|
|
1192
1198
|
}
|
|
@@ -1948,17 +1954,17 @@ var WorkspaceFileSystemImpl = class {
|
|
|
1948
1954
|
if (err instanceof Error && "code" in err && err.code === "workspace_generation_closed") {
|
|
1949
1955
|
return err;
|
|
1950
1956
|
}
|
|
1951
|
-
const
|
|
1957
|
+
const fs8 = wrapAsFsError(err);
|
|
1952
1958
|
this.deps.audit.recordDenied(this.deps.ctx, {
|
|
1953
1959
|
intent,
|
|
1954
1960
|
input,
|
|
1955
|
-
errorKind:
|
|
1956
|
-
hint:
|
|
1961
|
+
errorKind: fs8.kind,
|
|
1962
|
+
hint: fs8.hint,
|
|
1957
1963
|
// Quote the underlying OS / FsError message so audit
|
|
1958
1964
|
// consumers debugging a production incident can see the
|
|
1959
1965
|
// actual cause (errno text, byte counts, glob pattern,
|
|
1960
1966
|
// etc.) rather than just `errorKind` + `hint`.
|
|
1961
|
-
message:
|
|
1967
|
+
message: fs8.message,
|
|
1962
1968
|
// For glob denials (parse_error pattern rejection,
|
|
1963
1969
|
// catastrophic walk failures) the input IS the pattern
|
|
1964
1970
|
// already; surfacing it on the dedicated `pattern` field
|
|
@@ -1967,7 +1973,7 @@ var WorkspaceFileSystemImpl = class {
|
|
|
1967
1973
|
// branching on intent.
|
|
1968
1974
|
pattern: intent === "glob" ? input : void 0
|
|
1969
1975
|
});
|
|
1970
|
-
return
|
|
1976
|
+
return fs8;
|
|
1971
1977
|
}
|
|
1972
1978
|
};
|
|
1973
1979
|
var CONTENT_HASH_RE = /^sha256:[0-9a-f]{64}$/;
|
|
@@ -3043,12 +3049,12 @@ function sendFsError(res, err, route) {
|
|
|
3043
3049
|
applyReadHeaders(res);
|
|
3044
3050
|
if (sendGenerationClosedError(res, err)) return;
|
|
3045
3051
|
if (isFsError(err)) {
|
|
3046
|
-
const
|
|
3047
|
-
res.status(
|
|
3048
|
-
errorKind:
|
|
3049
|
-
error:
|
|
3050
|
-
hint:
|
|
3051
|
-
status:
|
|
3052
|
+
const fs8 = err;
|
|
3053
|
+
res.status(fs8.status).json({
|
|
3054
|
+
errorKind: fs8.kind,
|
|
3055
|
+
error: fs8.message,
|
|
3056
|
+
hint: fs8.hint,
|
|
3057
|
+
status: fs8.status
|
|
3052
3058
|
});
|
|
3053
3059
|
return;
|
|
3054
3060
|
}
|
|
@@ -3161,13 +3167,13 @@ async function handleGetFile(req, res, deps) {
|
|
|
3161
3167
|
return;
|
|
3162
3168
|
}
|
|
3163
3169
|
const cursor = rawCursor;
|
|
3164
|
-
const
|
|
3170
|
+
const fs8 = factory.forRequest({
|
|
3165
3171
|
originatorClientId: clientId ?? void 0,
|
|
3166
3172
|
route: ROUTE2
|
|
3167
3173
|
});
|
|
3168
3174
|
try {
|
|
3169
|
-
const resolved = await
|
|
3170
|
-
const out = await
|
|
3175
|
+
const resolved = await fs8.resolve(queryPath, "read");
|
|
3176
|
+
const out = await fs8.readText(resolved, {
|
|
3171
3177
|
maxBytes,
|
|
3172
3178
|
line,
|
|
3173
3179
|
limit,
|
|
@@ -3228,13 +3234,13 @@ async function handleGetFileBytes(req, res, deps) {
|
|
|
3228
3234
|
});
|
|
3229
3235
|
return;
|
|
3230
3236
|
}
|
|
3231
|
-
const
|
|
3237
|
+
const fs8 = factory.forRequest({
|
|
3232
3238
|
originatorClientId: clientId ?? void 0,
|
|
3233
3239
|
route: ROUTE2
|
|
3234
3240
|
});
|
|
3235
3241
|
try {
|
|
3236
|
-
const resolved = await
|
|
3237
|
-
const out = await
|
|
3242
|
+
const resolved = await fs8.resolve(queryPath, "read");
|
|
3243
|
+
const out = await fs8.readBytesWindow(resolved, {
|
|
3238
3244
|
offset: offset ?? 0,
|
|
3239
3245
|
maxBytes: maxBytes ?? DEFAULT_FILE_BYTES_MAX_BYTES
|
|
3240
3246
|
});
|
|
@@ -3262,13 +3268,13 @@ async function handleGetStat(req, res, deps) {
|
|
|
3262
3268
|
if (clientId === null) return;
|
|
3263
3269
|
const queryPath = requireStringQuery(res, req.query["path"], "path", ROUTE2);
|
|
3264
3270
|
if (queryPath === null) return;
|
|
3265
|
-
const
|
|
3271
|
+
const fs8 = factory.forRequest({
|
|
3266
3272
|
originatorClientId: clientId ?? void 0,
|
|
3267
3273
|
route: ROUTE2
|
|
3268
3274
|
});
|
|
3269
3275
|
try {
|
|
3270
|
-
const resolved = await
|
|
3271
|
-
const st = await
|
|
3276
|
+
const resolved = await fs8.resolve(queryPath, "stat");
|
|
3277
|
+
const st = await fs8.stat(resolved);
|
|
3272
3278
|
applyReadHeaders(res);
|
|
3273
3279
|
res.status(200).json({
|
|
3274
3280
|
kind: "stat",
|
|
@@ -3291,13 +3297,13 @@ async function handleGetList(req, res, deps) {
|
|
|
3291
3297
|
const queryPath = requireStringQuery(res, req.query["path"], "path", ROUTE2);
|
|
3292
3298
|
if (queryPath === null) return;
|
|
3293
3299
|
const includeIgnored = parseBoolFlag(req.query["includeIgnored"]);
|
|
3294
|
-
const
|
|
3300
|
+
const fs8 = factory.forRequest({
|
|
3295
3301
|
originatorClientId: clientId ?? void 0,
|
|
3296
3302
|
route: ROUTE2
|
|
3297
3303
|
});
|
|
3298
3304
|
try {
|
|
3299
|
-
const resolved = await
|
|
3300
|
-
const entries = await
|
|
3305
|
+
const resolved = await fs8.resolve(queryPath, "list");
|
|
3306
|
+
const entries = await fs8.list(resolved, {
|
|
3301
3307
|
includeIgnored,
|
|
3302
3308
|
maxEntries: MAX_LIST_ENTRIES + 1
|
|
3303
3309
|
});
|
|
@@ -3350,15 +3356,15 @@ async function handleGetGlob(req, res, deps) {
|
|
|
3350
3356
|
}
|
|
3351
3357
|
const cwdRaw = req.query["cwd"];
|
|
3352
3358
|
const cwdString = typeof cwdRaw === "string" && cwdRaw.length > 0 ? cwdRaw : void 0;
|
|
3353
|
-
const
|
|
3359
|
+
const fs8 = factory.forRequest({
|
|
3354
3360
|
originatorClientId: clientId ?? void 0,
|
|
3355
3361
|
route: ROUTE2
|
|
3356
3362
|
});
|
|
3357
3363
|
const start = performance.now();
|
|
3358
3364
|
try {
|
|
3359
|
-
const cwdResolved = cwdString ? await
|
|
3365
|
+
const cwdResolved = cwdString ? await fs8.resolve(cwdString, "list") : void 0;
|
|
3360
3366
|
const cap = maxResults ?? DEFAULT_GLOB_MAX_RESULTS;
|
|
3361
|
-
const probe = await
|
|
3367
|
+
const probe = await fs8.glob(pattern, {
|
|
3362
3368
|
cwd: cwdResolved,
|
|
3363
3369
|
includeIgnored,
|
|
3364
3370
|
maxResults: cap + 1
|
|
@@ -3546,7 +3552,7 @@ function validateClientId(clientId, deps, res) {
|
|
|
3546
3552
|
}
|
|
3547
3553
|
__name(validateClientId, "validateClientId");
|
|
3548
3554
|
function createSetupGithubFileOps(factory, route, originatorClientId, assertGenerationOpen) {
|
|
3549
|
-
const
|
|
3555
|
+
const fs8 = factory.forRequest({
|
|
3550
3556
|
route,
|
|
3551
3557
|
...originatorClientId ? { originatorClientId } : {}
|
|
3552
3558
|
});
|
|
@@ -3574,14 +3580,14 @@ function createSetupGithubFileOps(factory, route, originatorClientId, assertGene
|
|
|
3574
3580
|
);
|
|
3575
3581
|
},
|
|
3576
3582
|
async writeTextFile(_gitRepoRoot, relativePath, content) {
|
|
3577
|
-
const resolved = await
|
|
3578
|
-
const out = await
|
|
3583
|
+
const resolved = await fs8.resolve(relativePath, "write");
|
|
3584
|
+
const out = await fs8.writeTextOverwrite(resolved, content);
|
|
3579
3585
|
return { sizeBytes: out.sizeBytes };
|
|
3580
3586
|
},
|
|
3581
3587
|
async readTextFile(_gitRepoRoot, relativePath) {
|
|
3582
3588
|
try {
|
|
3583
|
-
const resolved = await
|
|
3584
|
-
const out = await
|
|
3589
|
+
const resolved = await fs8.resolve(relativePath, "read");
|
|
3590
|
+
const out = await fs8.readText(resolved);
|
|
3585
3591
|
return out.content;
|
|
3586
3592
|
} catch (error2) {
|
|
3587
3593
|
if (isFsError(error2) && error2.kind === "path_not_found") {
|
|
@@ -10793,7 +10799,7 @@ var AcpDispatcher = class {
|
|
|
10793
10799
|
);
|
|
10794
10800
|
return;
|
|
10795
10801
|
}
|
|
10796
|
-
const
|
|
10802
|
+
const fs8 = this.fsFactory.forRequest({
|
|
10797
10803
|
originatorClientId: conn.clientId,
|
|
10798
10804
|
route: `ACP ${method}`
|
|
10799
10805
|
});
|
|
@@ -10858,8 +10864,8 @@ var AcpDispatcher = class {
|
|
|
10858
10864
|
return;
|
|
10859
10865
|
}
|
|
10860
10866
|
const cursor = rawCursor;
|
|
10861
|
-
const resolved = await
|
|
10862
|
-
const out = await
|
|
10867
|
+
const resolved = await fs8.resolve(p, "read");
|
|
10868
|
+
const out = await fs8.readText(resolved, {
|
|
10863
10869
|
maxBytes,
|
|
10864
10870
|
line,
|
|
10865
10871
|
limit,
|
|
@@ -10886,7 +10892,7 @@ var AcpDispatcher = class {
|
|
|
10886
10892
|
conn.sendConn(error(id, RPC.INVALID_PARAMS, "`path` required"));
|
|
10887
10893
|
return;
|
|
10888
10894
|
}
|
|
10889
|
-
const
|
|
10895
|
+
const fs8 = this.fsFactory.forRequest({
|
|
10890
10896
|
originatorClientId: conn.clientId,
|
|
10891
10897
|
route: `ACP ${method}`
|
|
10892
10898
|
});
|
|
@@ -10922,8 +10928,8 @@ var AcpDispatcher = class {
|
|
|
10922
10928
|
);
|
|
10923
10929
|
return;
|
|
10924
10930
|
}
|
|
10925
|
-
const resolved = await
|
|
10926
|
-
const buf = await
|
|
10931
|
+
const resolved = await fs8.resolve(p, "read");
|
|
10932
|
+
const buf = await fs8.readBytesWindow(resolved, { offset, maxBytes });
|
|
10927
10933
|
this.replyConn(conn, id, { path: p, ...buf });
|
|
10928
10934
|
return;
|
|
10929
10935
|
}
|
|
@@ -10941,12 +10947,12 @@ var AcpDispatcher = class {
|
|
|
10941
10947
|
conn.sendConn(error(id, RPC.INVALID_PARAMS, "`path` required"));
|
|
10942
10948
|
return;
|
|
10943
10949
|
}
|
|
10944
|
-
const
|
|
10950
|
+
const fs8 = this.fsFactory.forRequest({
|
|
10945
10951
|
originatorClientId: conn.clientId,
|
|
10946
10952
|
route: `ACP ${method}`
|
|
10947
10953
|
});
|
|
10948
|
-
const resolved = await
|
|
10949
|
-
const result = await
|
|
10954
|
+
const resolved = await fs8.resolve(p, "read");
|
|
10955
|
+
const result = await fs8.stat(resolved);
|
|
10950
10956
|
this.replyConn(conn, id, { path: p, ...result });
|
|
10951
10957
|
return;
|
|
10952
10958
|
}
|
|
@@ -10964,13 +10970,13 @@ var AcpDispatcher = class {
|
|
|
10964
10970
|
conn.sendConn(error(id, RPC.INVALID_PARAMS, "`path` required"));
|
|
10965
10971
|
return;
|
|
10966
10972
|
}
|
|
10967
|
-
const
|
|
10973
|
+
const fs8 = this.fsFactory.forRequest({
|
|
10968
10974
|
originatorClientId: conn.clientId,
|
|
10969
10975
|
route: `ACP ${method}`
|
|
10970
10976
|
});
|
|
10971
|
-
const resolved = await
|
|
10977
|
+
const resolved = await fs8.resolve(p, "read");
|
|
10972
10978
|
const MAX_LIST = 2e3;
|
|
10973
|
-
const entries = await
|
|
10979
|
+
const entries = await fs8.list(resolved, { maxEntries: MAX_LIST + 1 });
|
|
10974
10980
|
const truncated = entries.length > MAX_LIST;
|
|
10975
10981
|
this.replyConn(conn, id, {
|
|
10976
10982
|
path: p,
|
|
@@ -10995,7 +11001,7 @@ var AcpDispatcher = class {
|
|
|
10995
11001
|
);
|
|
10996
11002
|
return;
|
|
10997
11003
|
}
|
|
10998
|
-
const
|
|
11004
|
+
const fs8 = this.fsFactory.forRequest({
|
|
10999
11005
|
originatorClientId: conn.clientId,
|
|
11000
11006
|
route: `ACP ${method}`
|
|
11001
11007
|
});
|
|
@@ -11015,7 +11021,7 @@ var AcpDispatcher = class {
|
|
|
11015
11021
|
);
|
|
11016
11022
|
return;
|
|
11017
11023
|
}
|
|
11018
|
-
const matches = await
|
|
11024
|
+
const matches = await fs8.glob(pattern, {
|
|
11019
11025
|
maxResults: maxResults + 1
|
|
11020
11026
|
});
|
|
11021
11027
|
const truncated = matches.length > maxResults;
|
|
@@ -11047,11 +11053,11 @@ var AcpDispatcher = class {
|
|
|
11047
11053
|
);
|
|
11048
11054
|
return;
|
|
11049
11055
|
}
|
|
11050
|
-
const
|
|
11056
|
+
const fs8 = this.fsFactory.forRequest({
|
|
11051
11057
|
originatorClientId: conn.clientId,
|
|
11052
11058
|
route: `ACP ${method}`
|
|
11053
11059
|
});
|
|
11054
|
-
const resolved = await
|
|
11060
|
+
const resolved = await fs8.resolve(p, "write");
|
|
11055
11061
|
if (Buffer.byteLength(params["content"], "utf8") > 10 * 1024 * 1024) {
|
|
11056
11062
|
if (id !== void 0)
|
|
11057
11063
|
conn.sendConn(
|
|
@@ -11059,7 +11065,7 @@ var AcpDispatcher = class {
|
|
|
11059
11065
|
);
|
|
11060
11066
|
return;
|
|
11061
11067
|
}
|
|
11062
|
-
await
|
|
11068
|
+
await fs8.writeTextOverwrite(resolved, params["content"]);
|
|
11063
11069
|
assertGenerationOpen?.();
|
|
11064
11070
|
this.replyConn(conn, id, { ok: true, path: p });
|
|
11065
11071
|
return;
|
|
@@ -11089,12 +11095,12 @@ var AcpDispatcher = class {
|
|
|
11089
11095
|
);
|
|
11090
11096
|
return;
|
|
11091
11097
|
}
|
|
11092
|
-
const
|
|
11098
|
+
const fs8 = this.fsFactory.forRequest({
|
|
11093
11099
|
originatorClientId: conn.clientId,
|
|
11094
11100
|
route: `ACP ${method}`
|
|
11095
11101
|
});
|
|
11096
|
-
const resolved = await
|
|
11097
|
-
const result = await
|
|
11102
|
+
const resolved = await fs8.resolve(p, "write");
|
|
11103
|
+
const result = await fs8.edit(
|
|
11098
11104
|
resolved,
|
|
11099
11105
|
params["oldText"],
|
|
11100
11106
|
params["newText"]
|
|
@@ -13937,7 +13943,7 @@ function mountAcpHttp(app, bridge, opts) {
|
|
|
13937
13943
|
if (!enabled) return void 0;
|
|
13938
13944
|
const daemonEnv = opts.daemonEnv ?? process.env;
|
|
13939
13945
|
const getPrimaryEnv = /* @__PURE__ */ __name(() => opts.workspaceRegistry ? runtimeEffectiveEnv(opts.workspaceRegistry.primary, daemonEnv) : daemonEnv, "getPrimaryEnv");
|
|
13940
|
-
const
|
|
13946
|
+
const path15 = opts.path ?? "/acp";
|
|
13941
13947
|
const dispatcherRef = {};
|
|
13942
13948
|
let disposed = false;
|
|
13943
13949
|
const rejectIfDisposed = /* @__PURE__ */ __name((res) => {
|
|
@@ -14109,7 +14115,7 @@ function mountAcpHttp(app, bridge, opts) {
|
|
|
14109
14115
|
const primaryMount = {
|
|
14110
14116
|
primary: true,
|
|
14111
14117
|
workspaceCwd: opts.boundWorkspace,
|
|
14112
|
-
routeLabel: logSafe(
|
|
14118
|
+
routeLabel: logSafe(path15),
|
|
14113
14119
|
rateLimitScope: opts.workspaceRegistry?.primary.workspaceId ?? "primary",
|
|
14114
14120
|
registry,
|
|
14115
14121
|
dispatcher,
|
|
@@ -14263,7 +14269,7 @@ function mountAcpHttp(app, bridge, opts) {
|
|
|
14263
14269
|
});
|
|
14264
14270
|
}, "handleAcpPost");
|
|
14265
14271
|
app.post(
|
|
14266
|
-
|
|
14272
|
+
path15,
|
|
14267
14273
|
(req, res) => handleAcpPost(primaryMount, req, res)
|
|
14268
14274
|
);
|
|
14269
14275
|
const handleAcpGet = /* @__PURE__ */ __name((mount, req, res) => {
|
|
@@ -14361,10 +14367,10 @@ function mountAcpHttp(app, bridge, opts) {
|
|
|
14361
14367
|
onPumpSettled();
|
|
14362
14368
|
});
|
|
14363
14369
|
}, "handleAcpGet");
|
|
14364
|
-
app.get(
|
|
14370
|
+
app.get(path15, (req, res) => {
|
|
14365
14371
|
handleAcpGet(primaryMount, req, res);
|
|
14366
14372
|
});
|
|
14367
|
-
app.delete(
|
|
14373
|
+
app.delete(path15, (req, res) => {
|
|
14368
14374
|
handleAcpDelete(primaryMount, req, res);
|
|
14369
14375
|
});
|
|
14370
14376
|
const createSecondaryAcpMount = /* @__PURE__ */ __name((rt) => {
|
|
@@ -14566,7 +14572,7 @@ function mountAcpHttp(app, bridge, opts) {
|
|
|
14566
14572
|
const isPluralAcpShape = pluralRawSelector !== null;
|
|
14567
14573
|
const pluralVoiceRawSelector = opts.workspaceVoiceConnection ? pluralWorkspaceRawSelector(rawPath, PLURAL_VOICE_WS_SUFFIX) : null;
|
|
14568
14574
|
const isPluralVoiceShape = pluralVoiceRawSelector !== null;
|
|
14569
|
-
if (rawPath !==
|
|
14575
|
+
if (rawPath !== path15 && !isCdpPath && !extraRoute && !isPluralAcpShape && !isPluralVoiceShape) {
|
|
14570
14576
|
logReject(`unknown-path ${logSafe(rawPath)}`);
|
|
14571
14577
|
socket.destroy();
|
|
14572
14578
|
return;
|
|
@@ -15103,7 +15109,7 @@ function mountAcpHttp(app, bridge, opts) {
|
|
|
15103
15109
|
});
|
|
15104
15110
|
}, "upgradeListener");
|
|
15105
15111
|
httpServer.on("upgrade", upgradeListener);
|
|
15106
|
-
writeStderrLine(`qwen serve: /acp WebSocket transport enabled on ${
|
|
15112
|
+
writeStderrLine(`qwen serve: /acp WebSocket transport enabled on ${path15}`);
|
|
15107
15113
|
}
|
|
15108
15114
|
__name(setupWebSocket, "setupWebSocket");
|
|
15109
15115
|
return {
|
|
@@ -16628,19 +16634,32 @@ function createHealthDemoRoutes(deps) {
|
|
|
16628
16634
|
let sessions = 0;
|
|
16629
16635
|
let pendingPermissions = 0;
|
|
16630
16636
|
let activePrompts = 0;
|
|
16637
|
+
let activeWork = false;
|
|
16631
16638
|
let channelAlive = false;
|
|
16632
16639
|
let lastActivity = null;
|
|
16640
|
+
let coveredSessions = 0;
|
|
16641
|
+
let sessionsOnNegotiatedChannel = 0;
|
|
16642
|
+
let oldestReportAt = null;
|
|
16633
16643
|
for (const runtime of runtimes) {
|
|
16634
16644
|
failedWorkspaceId = runtime.workspaceId;
|
|
16635
16645
|
const bridge = runtime.bridge;
|
|
16636
16646
|
const runtimeSessions = bridge.sessionCount;
|
|
16637
16647
|
const runtimePendingPermissions = bridge.pendingPermissionCount;
|
|
16638
16648
|
const runtimeActivePrompts = bridge.activePromptCount;
|
|
16649
|
+
const runtimeActiveWork = bridge.activeWork;
|
|
16650
|
+
const runtimeCoverage = bridge.activeWorkCoverage;
|
|
16651
|
+
const runtimeOldestReportAt = runtimeCoverage.oldestCoveredReportAt;
|
|
16639
16652
|
const runtimeChannelAlive = bridge.isChannelLive();
|
|
16640
16653
|
const runtimeLastActivity = bridge.lastActivityAt;
|
|
16641
16654
|
sessions += runtimeSessions;
|
|
16642
16655
|
pendingPermissions += runtimePendingPermissions;
|
|
16643
16656
|
activePrompts += runtimeActivePrompts;
|
|
16657
|
+
activeWork = activeWork || runtimeActiveWork;
|
|
16658
|
+
coveredSessions += runtimeCoverage.covered;
|
|
16659
|
+
sessionsOnNegotiatedChannel += runtimeCoverage.onNegotiatedChannel;
|
|
16660
|
+
if (runtimeOldestReportAt !== null && (oldestReportAt === null || runtimeOldestReportAt < oldestReportAt)) {
|
|
16661
|
+
oldestReportAt = runtimeOldestReportAt;
|
|
16662
|
+
}
|
|
16644
16663
|
channelAlive = channelAlive || runtimeChannelAlive;
|
|
16645
16664
|
if (runtimeLastActivity !== null && (lastActivity === null || runtimeLastActivity > lastActivity)) {
|
|
16646
16665
|
lastActivity = runtimeLastActivity;
|
|
@@ -16655,6 +16674,17 @@ function createHealthDemoRoutes(deps) {
|
|
|
16655
16674
|
sessions,
|
|
16656
16675
|
pendingPermissions,
|
|
16657
16676
|
activePrompts,
|
|
16677
|
+
activeWork,
|
|
16678
|
+
activeWorkReporting: gradeActiveWorkCoverage({
|
|
16679
|
+
total: sessions,
|
|
16680
|
+
covered: coveredSessions,
|
|
16681
|
+
onNegotiatedChannel: sessionsOnNegotiatedChannel
|
|
16682
|
+
}),
|
|
16683
|
+
// 0 rather than null when nothing is covered: an idle daemon with no
|
|
16684
|
+
// sessions must not read as infinitely stale to a controller applying
|
|
16685
|
+
// its own freshness floor. `oldestReportAt` is the oldest *covered*
|
|
16686
|
+
// report, so this never disagrees with the grade above.
|
|
16687
|
+
activeWorkStaleMs: oldestReportAt === null ? 0 : now - oldestReportAt,
|
|
16658
16688
|
connectedClients: getActiveSseCount2(),
|
|
16659
16689
|
channelAlive,
|
|
16660
16690
|
lastActivityAt: lastActivity !== null ? new Date(lastActivity).toISOString() : null,
|
|
@@ -17180,6 +17210,10 @@ __name(registerWorkspaceAuthRoutes, "registerWorkspaceAuthRoutes");
|
|
|
17180
17210
|
// packages/cli/src/serve/routes/workspace-extensions.ts
|
|
17181
17211
|
init_esbuild_shims();
|
|
17182
17212
|
import * as crypto2 from "node:crypto";
|
|
17213
|
+
import * as fs4 from "node:fs/promises";
|
|
17214
|
+
import * as os from "node:os";
|
|
17215
|
+
import * as path9 from "node:path";
|
|
17216
|
+
var import_express2 = __toESM(require_express(), 1);
|
|
17183
17217
|
|
|
17184
17218
|
// packages/cli/src/serve/extension-operation-scheduler.ts
|
|
17185
17219
|
init_esbuild_shims();
|
|
@@ -17261,6 +17295,7 @@ var MAX_UNFINISHED_EXTENSION_OPERATIONS = 10;
|
|
|
17261
17295
|
var sanitizeDaemonMessage = /* @__PURE__ */ __name((message) => redactUrlCredentials(stripAnsiAndControl(message)), "sanitizeDaemonMessage");
|
|
17262
17296
|
var redactExtensionDisplaySource = /* @__PURE__ */ __name((source) => {
|
|
17263
17297
|
const redacted = redactUrlCredentials(source);
|
|
17298
|
+
if (redacted.startsWith("upload:")) return redacted;
|
|
17264
17299
|
if (/^[A-Za-z]:[\\/]/.test(redacted)) return redacted;
|
|
17265
17300
|
try {
|
|
17266
17301
|
const url = new URL(redacted);
|
|
@@ -17950,6 +17985,39 @@ var EXTENSION_PREPARE_DEADLINE_MS = 10 * 6e4;
|
|
|
17950
17985
|
var EXTENSION_INTERACTION_DEADLINE_MS = 10 * 6e4;
|
|
17951
17986
|
var EXTENSION_INTERACTIVE_PREPARE_DEADLINE_MS = EXTENSION_PREPARE_DEADLINE_MS + EXTENSION_INTERACTION_DEADLINE_MS;
|
|
17952
17987
|
var EXTENSION_UPDATE_CHECK_DEADLINE_MS = 2 * 6e4;
|
|
17988
|
+
var EXTENSION_ARCHIVE_UPLOAD_LIMIT = "10mb";
|
|
17989
|
+
var extensionArchiveBodyParser = import_express2.default.raw({
|
|
17990
|
+
type: "application/octet-stream",
|
|
17991
|
+
limit: EXTENSION_ARCHIVE_UPLOAD_LIMIT
|
|
17992
|
+
});
|
|
17993
|
+
var parseExtensionArchiveFilename = /* @__PURE__ */ __name((value) => {
|
|
17994
|
+
const invalidCharacter = typeof value === "string" && Array.from(value).some((character) => {
|
|
17995
|
+
const code = character.charCodeAt(0);
|
|
17996
|
+
return character === "/" || character === "\\" || code < 32 || code === 127;
|
|
17997
|
+
});
|
|
17998
|
+
if (typeof value !== "string" || value.length === 0 || Buffer.byteLength(value, "utf8") > 255 || invalidCharacter) {
|
|
17999
|
+
return null;
|
|
18000
|
+
}
|
|
18001
|
+
const lower = value.toLowerCase();
|
|
18002
|
+
if (lower.endsWith(".tar.gz")) return { filename: value, suffix: ".tar.gz" };
|
|
18003
|
+
if (lower.endsWith(".zip")) return { filename: value, suffix: ".zip" };
|
|
18004
|
+
return null;
|
|
18005
|
+
}, "parseExtensionArchiveFilename");
|
|
18006
|
+
var extensionArchiveUploadMetadata = /* @__PURE__ */ __name((req, res, next) => {
|
|
18007
|
+
if (req.query["consent"] !== "true") {
|
|
18008
|
+
res.status(400).json({
|
|
18009
|
+
error: "Extension installation requires explicit consent"
|
|
18010
|
+
});
|
|
18011
|
+
return;
|
|
18012
|
+
}
|
|
18013
|
+
if (!parseExtensionArchiveFilename(req.query["filename"])) {
|
|
18014
|
+
res.status(400).json({
|
|
18015
|
+
error: "`filename` must name a .zip or .tar.gz archive"
|
|
18016
|
+
});
|
|
18017
|
+
return;
|
|
18018
|
+
}
|
|
18019
|
+
next();
|
|
18020
|
+
}, "extensionArchiveUploadMetadata");
|
|
17953
18021
|
var parseExtensionScope = /* @__PURE__ */ __name((body, res) => {
|
|
17954
18022
|
const scope = body["scope"];
|
|
17955
18023
|
if (scope !== "user" && scope !== "workspace") {
|
|
@@ -18391,6 +18459,127 @@ function registerWorkspaceExtensionRoutes(app, deps) {
|
|
|
18391
18459
|
}
|
|
18392
18460
|
}
|
|
18393
18461
|
);
|
|
18462
|
+
app.post(
|
|
18463
|
+
`${base}/install-archive`,
|
|
18464
|
+
mutate({ strict: true }),
|
|
18465
|
+
extensionArchiveUploadMetadata,
|
|
18466
|
+
extensionArchiveBodyParser,
|
|
18467
|
+
async (req, res) => {
|
|
18468
|
+
const ctrl = resolve5(req, res, true);
|
|
18469
|
+
if (!ctrl) return;
|
|
18470
|
+
try {
|
|
18471
|
+
if (!ctrl.validateExtensionMutationClient(req, res, {
|
|
18472
|
+
requireClientId: false
|
|
18473
|
+
})) {
|
|
18474
|
+
return;
|
|
18475
|
+
}
|
|
18476
|
+
const archiveName = parseExtensionArchiveFilename(
|
|
18477
|
+
req.query["filename"]
|
|
18478
|
+
);
|
|
18479
|
+
if (!req.is("application/octet-stream")) {
|
|
18480
|
+
res.status(415).json({
|
|
18481
|
+
error: "Extension archive uploads require application/octet-stream"
|
|
18482
|
+
});
|
|
18483
|
+
return;
|
|
18484
|
+
}
|
|
18485
|
+
if (!Buffer.isBuffer(req.body) || req.body.length === 0) {
|
|
18486
|
+
res.status(400).json({ error: "Extension archive is empty" });
|
|
18487
|
+
return;
|
|
18488
|
+
}
|
|
18489
|
+
let archive = req.body;
|
|
18490
|
+
const source = `upload:v1:${crypto2.randomUUID()}:${archiveName.filename}`;
|
|
18491
|
+
ctrl.runQueuedExtensionMutation(
|
|
18492
|
+
"install",
|
|
18493
|
+
{ source },
|
|
18494
|
+
res,
|
|
18495
|
+
async (extensionManager, _signal, context, operationId) => {
|
|
18496
|
+
let uploadDir;
|
|
18497
|
+
const sanitizeUploadError = /* @__PURE__ */ __name((error2) => {
|
|
18498
|
+
const sanitized = new Error(
|
|
18499
|
+
uploadDir ? getErrorMessage(error2).replaceAll(
|
|
18500
|
+
uploadDir,
|
|
18501
|
+
"<extension-upload-dir>"
|
|
18502
|
+
) : "Could not create the temporary extension upload directory"
|
|
18503
|
+
);
|
|
18504
|
+
const code = typeof error2 === "object" && error2 !== null && "code" in error2 && typeof error2.code === "string" ? error2.code : void 0;
|
|
18505
|
+
if (code) Object.assign(sanitized, { code });
|
|
18506
|
+
return sanitized;
|
|
18507
|
+
}, "sanitizeUploadError");
|
|
18508
|
+
let result;
|
|
18509
|
+
let failure;
|
|
18510
|
+
try {
|
|
18511
|
+
uploadDir = await fs4.mkdtemp(
|
|
18512
|
+
path9.join(os.tmpdir(), "qwen-extension-upload-")
|
|
18513
|
+
);
|
|
18514
|
+
const archivePath = path9.join(
|
|
18515
|
+
uploadDir,
|
|
18516
|
+
`extension${archiveName.suffix}`
|
|
18517
|
+
);
|
|
18518
|
+
await fs4.writeFile(archivePath, archive);
|
|
18519
|
+
archive = void 0;
|
|
18520
|
+
const prepared = await context.prepare(async (signal) => {
|
|
18521
|
+
supersedeActiveInstallOperations(ctrl, operationId);
|
|
18522
|
+
return await extensionManager.prepareExtensionInstall({
|
|
18523
|
+
installMetadata: { type: "local", source },
|
|
18524
|
+
localSourcePath: archivePath,
|
|
18525
|
+
initialActivation: { scope: "user" },
|
|
18526
|
+
requestConsent: /* @__PURE__ */ __name(() => Promise.resolve(), "requestConsent"),
|
|
18527
|
+
signal
|
|
18528
|
+
});
|
|
18529
|
+
});
|
|
18530
|
+
try {
|
|
18531
|
+
const committed = await context.commit(
|
|
18532
|
+
async (onCommitted) => await extensionManager.commitPreparedExtension(
|
|
18533
|
+
prepared,
|
|
18534
|
+
onCommitted
|
|
18535
|
+
)
|
|
18536
|
+
);
|
|
18537
|
+
result = {
|
|
18538
|
+
status: "installed",
|
|
18539
|
+
source,
|
|
18540
|
+
name: committed.identity.name,
|
|
18541
|
+
version: committed.version
|
|
18542
|
+
};
|
|
18543
|
+
} finally {
|
|
18544
|
+
await extensionManager.disposePreparedExtension(prepared);
|
|
18545
|
+
}
|
|
18546
|
+
} catch (error2) {
|
|
18547
|
+
failure = sanitizeUploadError(error2);
|
|
18548
|
+
}
|
|
18549
|
+
if (uploadDir) {
|
|
18550
|
+
try {
|
|
18551
|
+
await fs4.rm(uploadDir, { recursive: true, force: true });
|
|
18552
|
+
} catch (error2) {
|
|
18553
|
+
failure ??= sanitizeUploadError(error2);
|
|
18554
|
+
}
|
|
18555
|
+
}
|
|
18556
|
+
if (failure) throw failure;
|
|
18557
|
+
return result;
|
|
18558
|
+
},
|
|
18559
|
+
{
|
|
18560
|
+
createManager: /* @__PURE__ */ __name((operationId) => ctrl.createExtensionManager(
|
|
18561
|
+
void 0,
|
|
18562
|
+
void 0,
|
|
18563
|
+
extensionInteractionHandlers(ctrl, operationId)
|
|
18564
|
+
), "createManager"),
|
|
18565
|
+
onSettled: /* @__PURE__ */ __name((operationId) => {
|
|
18566
|
+
supersededInstallOperations.delete(operationId);
|
|
18567
|
+
cancelPendingExtensionInteraction(
|
|
18568
|
+
operationId,
|
|
18569
|
+
"Extension operation ended"
|
|
18570
|
+
);
|
|
18571
|
+
}, "onSettled"),
|
|
18572
|
+
deadlineMs: EXTENSION_INTERACTIVE_PREPARE_DEADLINE_MS,
|
|
18573
|
+
...globalReconciliationOptions()
|
|
18574
|
+
}
|
|
18575
|
+
);
|
|
18576
|
+
} catch (err) {
|
|
18577
|
+
sendBridgeError2(res, err, {
|
|
18578
|
+
route: `POST ${base}/install-archive`
|
|
18579
|
+
});
|
|
18580
|
+
}
|
|
18581
|
+
}
|
|
18582
|
+
);
|
|
18394
18583
|
app.post(`${base}/install`, mutate({ strict: true }), async (req, res) => {
|
|
18395
18584
|
const ctrl = resolve5(req, res, true);
|
|
18396
18585
|
if (!ctrl) return;
|
|
@@ -19624,13 +19813,13 @@ async function handlePostFileWrite(req, res, deps) {
|
|
|
19624
19813
|
req
|
|
19625
19814
|
);
|
|
19626
19815
|
if (originatorClientId === null) return;
|
|
19627
|
-
const
|
|
19816
|
+
const fs8 = factory.forRequest({
|
|
19628
19817
|
originatorClientId,
|
|
19629
19818
|
route: ROUTE2
|
|
19630
19819
|
});
|
|
19631
19820
|
try {
|
|
19632
|
-
const resolved = await
|
|
19633
|
-
const out = await
|
|
19821
|
+
const resolved = await fs8.resolve(queryPath, "write");
|
|
19822
|
+
const out = await fs8.writeTextAtomic(resolved, content, {
|
|
19634
19823
|
mode,
|
|
19635
19824
|
...expectedHash ? { expectedHash } : {},
|
|
19636
19825
|
...bom !== void 0 ? { bom } : {},
|
|
@@ -19683,13 +19872,13 @@ async function handlePostFileEdit(req, res, deps) {
|
|
|
19683
19872
|
req
|
|
19684
19873
|
);
|
|
19685
19874
|
if (originatorClientId === null) return;
|
|
19686
|
-
const
|
|
19875
|
+
const fs8 = factory.forRequest({
|
|
19687
19876
|
originatorClientId,
|
|
19688
19877
|
route: ROUTE2
|
|
19689
19878
|
});
|
|
19690
19879
|
try {
|
|
19691
|
-
const resolved = await
|
|
19692
|
-
const out = await
|
|
19880
|
+
const resolved = await fs8.resolve(queryPath, "edit");
|
|
19881
|
+
const out = await fs8.editAtomic(resolved, oldText, newText, {
|
|
19693
19882
|
expectedHash
|
|
19694
19883
|
});
|
|
19695
19884
|
applyReadHeaders(res);
|
|
@@ -20340,8 +20529,8 @@ function decodePathSegment(value) {
|
|
|
20340
20529
|
}
|
|
20341
20530
|
__name(decodePathSegment, "decodePathSegment");
|
|
20342
20531
|
function matchLegacySessionTelemetryRoute(method, requestPath) {
|
|
20343
|
-
const
|
|
20344
|
-
const requestSegments =
|
|
20532
|
+
const path15 = requestPath.length > 1 && requestPath.endsWith("/") ? requestPath.slice(0, -1) : requestPath;
|
|
20533
|
+
const requestSegments = path15.split("/").slice(1);
|
|
20345
20534
|
const prefix = requestSegments[0]?.toLowerCase();
|
|
20346
20535
|
if (prefix !== "session" && prefix !== "sessions" && prefix !== "permission") {
|
|
20347
20536
|
return void 0;
|
|
@@ -20393,23 +20582,23 @@ __name(setDaemonTelemetryWorkspace, "setDaemonTelemetryWorkspace");
|
|
|
20393
20582
|
function resolveDaemonTelemetryRoute(req) {
|
|
20394
20583
|
const legacyRoute = matchLegacySessionTelemetryRoute(req.method, req.path);
|
|
20395
20584
|
if (legacyRoute) return legacyRoute;
|
|
20396
|
-
const
|
|
20397
|
-
if (req.method === "GET" &&
|
|
20585
|
+
const path15 = req.path.replace(/\/$/, "") || "/";
|
|
20586
|
+
if (req.method === "GET" && path15 === "/daemon/status") {
|
|
20398
20587
|
return { route: "GET /daemon/status" };
|
|
20399
20588
|
}
|
|
20400
|
-
if (req.method === "GET" && /^\/workspace\/[^/]+\/sessions$/.test(
|
|
20589
|
+
if (req.method === "GET" && /^\/workspace\/[^/]+\/sessions$/.test(path15)) {
|
|
20401
20590
|
return { route: "GET /workspace/:id/sessions" };
|
|
20402
20591
|
}
|
|
20403
|
-
if (req.method === "GET" && /^\/workspaces\/[^/]+\/sessions$/.test(
|
|
20592
|
+
if (req.method === "GET" && /^\/workspaces\/[^/]+\/sessions$/.test(path15)) {
|
|
20404
20593
|
return { route: "GET /workspace/:id/sessions" };
|
|
20405
20594
|
}
|
|
20406
|
-
if (req.method === "GET" && /^\/workspace\/[^/]+\/session-info$/.test(
|
|
20595
|
+
if (req.method === "GET" && /^\/workspace\/[^/]+\/session-info$/.test(path15)) {
|
|
20407
20596
|
return { route: "GET /workspace/:id/session-info" };
|
|
20408
20597
|
}
|
|
20409
|
-
if (req.method === "GET" && /^\/workspaces\/[^/]+\/session-info$/.test(
|
|
20598
|
+
if (req.method === "GET" && /^\/workspaces\/[^/]+\/session-info$/.test(path15)) {
|
|
20410
20599
|
return { route: "GET /workspace/:id/session-info" };
|
|
20411
20600
|
}
|
|
20412
|
-
const workspaceTranscript =
|
|
20601
|
+
const workspaceTranscript = path15.match(
|
|
20413
20602
|
/^\/workspaces\/[^/]+\/session\/([^/]+)\/transcript$/
|
|
20414
20603
|
);
|
|
20415
20604
|
if (workspaceTranscript?.[1] && req.method === "GET") {
|
|
@@ -20418,7 +20607,7 @@ function resolveDaemonTelemetryRoute(req) {
|
|
|
20418
20607
|
sessionId: decodePathSegment(workspaceTranscript[1])
|
|
20419
20608
|
};
|
|
20420
20609
|
}
|
|
20421
|
-
const workspaceExport =
|
|
20610
|
+
const workspaceExport = path15.match(
|
|
20422
20611
|
/^\/workspaces\/[^/]+\/session\/([^/]+)\/export$/
|
|
20423
20612
|
);
|
|
20424
20613
|
if (workspaceExport?.[1] && req.method === "GET") {
|
|
@@ -20427,7 +20616,7 @@ function resolveDaemonTelemetryRoute(req) {
|
|
|
20427
20616
|
sessionId: decodePathSegment(workspaceExport[1])
|
|
20428
20617
|
};
|
|
20429
20618
|
}
|
|
20430
|
-
const workspaceArchivedExport =
|
|
20619
|
+
const workspaceArchivedExport = path15.match(
|
|
20431
20620
|
/^\/workspaces\/[^/]+\/session\/([^/]+)\/archive\/export$/
|
|
20432
20621
|
);
|
|
20433
20622
|
if (workspaceArchivedExport?.[1] && req.method === "GET") {
|
|
@@ -20437,8 +20626,8 @@ function resolveDaemonTelemetryRoute(req) {
|
|
|
20437
20626
|
};
|
|
20438
20627
|
}
|
|
20439
20628
|
const pluralWorkspacePrefix = /^\/workspaces\/[^/]+/;
|
|
20440
|
-
if (pluralWorkspacePrefix.test(
|
|
20441
|
-
const suffix =
|
|
20629
|
+
if (pluralWorkspacePrefix.test(path15)) {
|
|
20630
|
+
const suffix = path15.replace(pluralWorkspacePrefix, "/workspace");
|
|
20442
20631
|
if (req.method === "GET") {
|
|
20443
20632
|
if (suffix === "/workspace/mcp" || suffix === "/workspace/skills" || suffix === "/workspace/tools" || suffix === "/workspace/providers" || suffix === "/workspace/env" || suffix === "/workspace/preflight" || suffix === "/workspace/hooks" || suffix === "/workspace/settings" || suffix === "/workspace/voice" || suffix === "/workspace/permissions" || suffix === "/workspace/trust" || suffix === "/workspace/memory" || suffix === "/workspace/agents") {
|
|
20444
20633
|
return { route: `GET ${suffix}` };
|
|
@@ -20497,58 +20686,58 @@ function resolveDaemonTelemetryRoute(req) {
|
|
|
20497
20686
|
return { route: "DELETE /workspace/session-groups/:groupId" };
|
|
20498
20687
|
}
|
|
20499
20688
|
}
|
|
20500
|
-
if (req.method === "POST" &&
|
|
20689
|
+
if (req.method === "POST" && path15 === "/workspace/init") {
|
|
20501
20690
|
return { route: "POST /workspace/init" };
|
|
20502
20691
|
}
|
|
20503
|
-
if (req.method === "POST" &&
|
|
20692
|
+
if (req.method === "POST" && path15 === "/workspace/setup-github") {
|
|
20504
20693
|
return { route: "POST /workspace/setup-github" };
|
|
20505
20694
|
}
|
|
20506
|
-
if (req.method === "POST" &&
|
|
20695
|
+
if (req.method === "POST" && path15 === "/workspace/reload") {
|
|
20507
20696
|
return { route: "POST /workspace/reload" };
|
|
20508
20697
|
}
|
|
20509
|
-
const mcpRestart =
|
|
20698
|
+
const mcpRestart = path15.match(/^\/workspace\/mcp\/([^/]+)\/restart$/);
|
|
20510
20699
|
if (mcpRestart?.[1] && req.method === "POST") {
|
|
20511
20700
|
return { route: "POST /workspace/mcp/:server/restart" };
|
|
20512
20701
|
}
|
|
20513
|
-
if (req.method === "POST" &&
|
|
20702
|
+
if (req.method === "POST" && path15 === "/workspace/mcp/servers") {
|
|
20514
20703
|
return { route: "POST /workspace/mcp/servers" };
|
|
20515
20704
|
}
|
|
20516
|
-
const mcpDelete =
|
|
20705
|
+
const mcpDelete = path15.match(/^\/workspace\/mcp\/servers\/([^/]+)$/);
|
|
20517
20706
|
if (mcpDelete?.[1] && req.method === "DELETE") {
|
|
20518
20707
|
return { route: "DELETE /workspace/mcp/servers/:name" };
|
|
20519
20708
|
}
|
|
20520
|
-
if (req.method === "POST" &&
|
|
20709
|
+
if (req.method === "POST" && path15 === "/workspace/auth/device-flow") {
|
|
20521
20710
|
return { route: "POST /workspace/auth/device-flow" };
|
|
20522
20711
|
}
|
|
20523
|
-
const deviceFlowDelete =
|
|
20712
|
+
const deviceFlowDelete = path15.match(
|
|
20524
20713
|
/^\/workspace\/auth\/device-flow\/([^/]+)$/
|
|
20525
20714
|
);
|
|
20526
20715
|
if (deviceFlowDelete?.[1] && req.method === "DELETE") {
|
|
20527
20716
|
return { route: "DELETE /workspace/auth/device-flow/:id" };
|
|
20528
20717
|
}
|
|
20529
|
-
const toolEnable =
|
|
20718
|
+
const toolEnable = path15.match(/^\/workspace\/tools\/([^/]+)\/enable$/);
|
|
20530
20719
|
if (toolEnable?.[1] && req.method === "POST") {
|
|
20531
20720
|
return { route: "POST /workspace/tools/:name/enable" };
|
|
20532
20721
|
}
|
|
20533
|
-
if (
|
|
20722
|
+
if (path15 === "/workspace/settings") {
|
|
20534
20723
|
if (req.method === "GET") return { route: "GET /workspace/settings" };
|
|
20535
20724
|
if (req.method === "POST") return { route: "POST /workspace/settings" };
|
|
20536
20725
|
}
|
|
20537
|
-
if (
|
|
20726
|
+
if (path15 === "/workspace/permissions") {
|
|
20538
20727
|
if (req.method === "GET") return { route: "GET /workspace/permissions" };
|
|
20539
20728
|
if (req.method === "POST") return { route: "POST /workspace/permissions" };
|
|
20540
20729
|
}
|
|
20541
|
-
if (
|
|
20730
|
+
if (path15 === "/workspace/trust") {
|
|
20542
20731
|
if (req.method === "GET") return { route: "GET /workspace/trust" };
|
|
20543
20732
|
}
|
|
20544
|
-
if (req.method === "POST" &&
|
|
20733
|
+
if (req.method === "POST" && path15 === "/workspace/trust/request") {
|
|
20545
20734
|
return { route: "POST /workspace/trust/request" };
|
|
20546
20735
|
}
|
|
20547
|
-
if (
|
|
20736
|
+
if (path15 === "/workspace/voice") {
|
|
20548
20737
|
if (req.method === "GET") return { route: "GET /workspace/voice" };
|
|
20549
20738
|
if (req.method === "POST") return { route: "POST /workspace/voice" };
|
|
20550
20739
|
}
|
|
20551
|
-
if (req.method === "POST" &&
|
|
20740
|
+
if (req.method === "POST" && path15 === "/workspace/voice/transcribe") {
|
|
20552
20741
|
return { route: "POST /workspace/voice/transcribe" };
|
|
20553
20742
|
}
|
|
20554
20743
|
return void 0;
|
|
@@ -20816,8 +21005,8 @@ __name(registerPermissionRoutes, "registerPermissionRoutes");
|
|
|
20816
21005
|
// packages/cli/src/serve/routes/session.ts
|
|
20817
21006
|
init_esbuild_shims();
|
|
20818
21007
|
import * as crypto3 from "node:crypto";
|
|
20819
|
-
import * as
|
|
20820
|
-
import * as
|
|
21008
|
+
import * as fs6 from "node:fs";
|
|
21009
|
+
import * as path10 from "node:path";
|
|
20821
21010
|
|
|
20822
21011
|
// packages/cli/src/serve/server/prompt-deadline.ts
|
|
20823
21012
|
init_esbuild_shims();
|
|
@@ -21508,7 +21697,7 @@ __name(deleteBranch, "deleteBranch");
|
|
|
21508
21697
|
|
|
21509
21698
|
// packages/cli/src/serve/virtual-subagent-sessions.ts
|
|
21510
21699
|
init_esbuild_shims();
|
|
21511
|
-
import * as
|
|
21700
|
+
import * as fs5 from "node:fs/promises";
|
|
21512
21701
|
import { createReadStream } from "node:fs";
|
|
21513
21702
|
import readline from "node:readline";
|
|
21514
21703
|
var PREFIX = "subagent.";
|
|
@@ -21702,7 +21891,7 @@ var VirtualSubagentTarget = class _VirtualSubagentTarget {
|
|
|
21702
21891
|
async readNewRecords(endOffset) {
|
|
21703
21892
|
let handle;
|
|
21704
21893
|
try {
|
|
21705
|
-
handle = await
|
|
21894
|
+
handle = await fs5.open(this.task.outputFile, "r");
|
|
21706
21895
|
const stat3 = await handle.stat();
|
|
21707
21896
|
const identity = `${stat3.dev}:${stat3.ino}`;
|
|
21708
21897
|
if (this.transcriptIdentity !== void 0 && this.transcriptIdentity !== identity || stat3.size < this.offset) {
|
|
@@ -21746,7 +21935,7 @@ var VirtualSubagentTarget = class _VirtualSubagentTarget {
|
|
|
21746
21935
|
const filePath = `${this.task.outputFile}.stream`;
|
|
21747
21936
|
let handle;
|
|
21748
21937
|
try {
|
|
21749
|
-
handle = await
|
|
21938
|
+
handle = await fs5.open(filePath, "r");
|
|
21750
21939
|
const stat3 = await handle.stat();
|
|
21751
21940
|
const identity = `${stat3.dev}:${stat3.ino}`;
|
|
21752
21941
|
if (this.streamIdentity !== void 0 && this.streamIdentity !== identity) {
|
|
@@ -21911,7 +22100,7 @@ var VirtualSubagentTarget = class _VirtualSubagentTarget {
|
|
|
21911
22100
|
async captureReadBounds() {
|
|
21912
22101
|
const size = /* @__PURE__ */ __name(async (filePath) => {
|
|
21913
22102
|
try {
|
|
21914
|
-
return (await
|
|
22103
|
+
return (await fs5.stat(filePath)).size;
|
|
21915
22104
|
} catch (error2) {
|
|
21916
22105
|
if (error2.code === "ENOENT") return 0;
|
|
21917
22106
|
throw error2;
|
|
@@ -22040,7 +22229,7 @@ var VirtualSubagentSessions = class {
|
|
|
22040
22229
|
const sessionDir = getSubagentSessionDir(projectDir, parentSessionId);
|
|
22041
22230
|
let names;
|
|
22042
22231
|
try {
|
|
22043
|
-
names = await
|
|
22232
|
+
names = await fs5.readdir(sessionDir);
|
|
22044
22233
|
} catch (error2) {
|
|
22045
22234
|
if (error2.code === "ENOENT") return void 0;
|
|
22046
22235
|
throw error2;
|
|
@@ -22096,7 +22285,7 @@ var VirtualSubagentSessions = class {
|
|
|
22096
22285
|
const sessionDir = getSubagentSessionDir(projectDir, parentSessionId);
|
|
22097
22286
|
let names;
|
|
22098
22287
|
try {
|
|
22099
|
-
names = await
|
|
22288
|
+
names = await fs5.readdir(sessionDir);
|
|
22100
22289
|
} catch (error2) {
|
|
22101
22290
|
if (error2.code === "ENOENT") return void 0;
|
|
22102
22291
|
throw error2;
|
|
@@ -22585,7 +22774,7 @@ function registerSessionRoutes(app, deps) {
|
|
|
22585
22774
|
const workspaceParam = req.params[paramName] ?? "";
|
|
22586
22775
|
const byId = workspaceRegistry.getByWorkspaceId(workspaceParam);
|
|
22587
22776
|
if (byId) return byId;
|
|
22588
|
-
if (!
|
|
22777
|
+
if (!path10.isAbsolute(workspaceParam)) {
|
|
22589
22778
|
res.status(400).json({
|
|
22590
22779
|
error: `\`:${paramName}\` must decode to a workspace id or absolute path`
|
|
22591
22780
|
});
|
|
@@ -23476,7 +23665,7 @@ function registerSessionRoutes(app, deps) {
|
|
|
23476
23665
|
if (worktreeMeta) {
|
|
23477
23666
|
try {
|
|
23478
23667
|
const createAllowedRoots = [
|
|
23479
|
-
|
|
23668
|
+
path10.join(workspaceCwd, ".qwen", "worktrees")
|
|
23480
23669
|
];
|
|
23481
23670
|
let createRepoTop = null;
|
|
23482
23671
|
try {
|
|
@@ -23487,7 +23676,7 @@ function registerSessionRoutes(app, deps) {
|
|
|
23487
23676
|
}
|
|
23488
23677
|
if (createRepoTop && createRepoTop !== workspaceCwd) {
|
|
23489
23678
|
createAllowedRoots.push(
|
|
23490
|
-
|
|
23679
|
+
path10.join(createRepoTop, ".qwen", "worktrees")
|
|
23491
23680
|
);
|
|
23492
23681
|
}
|
|
23493
23682
|
await runtime.bridge.changeSessionCwd(session.sessionId, {
|
|
@@ -23786,10 +23975,10 @@ function registerSessionRoutes(app, deps) {
|
|
|
23786
23975
|
if (sidecar) {
|
|
23787
23976
|
let realTarget;
|
|
23788
23977
|
const candidateRoots = [
|
|
23789
|
-
|
|
23978
|
+
path10.join(workspaceCwd, ".qwen", "worktrees")
|
|
23790
23979
|
];
|
|
23791
23980
|
try {
|
|
23792
|
-
realTarget =
|
|
23981
|
+
realTarget = fs6.realpathSync(sidecar.worktreePath);
|
|
23793
23982
|
let repoTop = null;
|
|
23794
23983
|
try {
|
|
23795
23984
|
repoTop = await new GitWorktreeService(
|
|
@@ -23798,13 +23987,13 @@ function registerSessionRoutes(app, deps) {
|
|
|
23798
23987
|
} catch {
|
|
23799
23988
|
}
|
|
23800
23989
|
if (repoTop && repoTop !== workspaceCwd) {
|
|
23801
|
-
candidateRoots.push(
|
|
23990
|
+
candidateRoots.push(path10.join(repoTop, ".qwen", "worktrees"));
|
|
23802
23991
|
}
|
|
23803
23992
|
const contained = candidateRoots.some((root) => {
|
|
23804
23993
|
try {
|
|
23805
|
-
const realRoot =
|
|
23806
|
-
const rel =
|
|
23807
|
-
return !rel.startsWith("..") && !
|
|
23994
|
+
const realRoot = fs6.realpathSync(root);
|
|
23995
|
+
const rel = path10.relative(realRoot, realTarget);
|
|
23996
|
+
return !rel.startsWith("..") && !path10.isAbsolute(rel);
|
|
23808
23997
|
} catch {
|
|
23809
23998
|
return false;
|
|
23810
23999
|
}
|
|
@@ -24120,7 +24309,7 @@ function registerSessionRoutes(app, deps) {
|
|
|
24120
24309
|
async (req, res, sessionId, runtime) => {
|
|
24121
24310
|
const body = safeBody(req);
|
|
24122
24311
|
const targetPath = body["path"];
|
|
24123
|
-
if (typeof targetPath !== "string" || targetPath.length === 0 || !
|
|
24312
|
+
if (typeof targetPath !== "string" || targetPath.length === 0 || !path10.isAbsolute(targetPath)) {
|
|
24124
24313
|
res.status(400).json({
|
|
24125
24314
|
error: "`path` is required and must be an absolute path",
|
|
24126
24315
|
code: "invalid_path"
|
|
@@ -27154,7 +27343,7 @@ __name(registerUsageStatsRoutes, "registerUsageStatsRoutes");
|
|
|
27154
27343
|
// packages/cli/src/serve/scheduled-task-keepalive.ts
|
|
27155
27344
|
init_esbuild_shims();
|
|
27156
27345
|
import * as fsSync from "node:fs";
|
|
27157
|
-
import * as
|
|
27346
|
+
import * as path11 from "node:path";
|
|
27158
27347
|
var log = createDebugLogger("SCHED_KEEPALIVE");
|
|
27159
27348
|
function collectBoundSessionIds(tasks) {
|
|
27160
27349
|
const seen = /* @__PURE__ */ new Set();
|
|
@@ -27380,8 +27569,8 @@ function startScheduledTaskKeepalive(opts) {
|
|
|
27380
27569
|
opts.runtimeBaseDir,
|
|
27381
27570
|
() => getCronFilePath(boundWorkspace)
|
|
27382
27571
|
);
|
|
27383
|
-
const cronDir =
|
|
27384
|
-
const cronFileName =
|
|
27572
|
+
const cronDir = path11.dirname(cronFilePath);
|
|
27573
|
+
const cronFileName = path11.basename(cronFilePath);
|
|
27385
27574
|
let fileWatcher;
|
|
27386
27575
|
try {
|
|
27387
27576
|
fsSync.mkdirSync(cronDir, { recursive: true });
|
|
@@ -30326,7 +30515,7 @@ __name(registerWorkspaceModelsRoutes, "registerWorkspaceModelsRoutes");
|
|
|
30326
30515
|
// packages/cli/src/serve/routes/a2ui-action.ts
|
|
30327
30516
|
init_esbuild_shims();
|
|
30328
30517
|
import * as fsp4 from "node:fs/promises";
|
|
30329
|
-
import * as
|
|
30518
|
+
import * as path12 from "node:path";
|
|
30330
30519
|
var A2UI_MIME = "application/a2ui+json";
|
|
30331
30520
|
var ACTION_TOOL = "action";
|
|
30332
30521
|
var CALL_TIMEOUT_MS = 15e3;
|
|
@@ -30349,7 +30538,7 @@ __name(usableServerConfig, "usableServerConfig");
|
|
|
30349
30538
|
async function findFromSettingsFile(workspaceCwd) {
|
|
30350
30539
|
try {
|
|
30351
30540
|
const raw = await fsp4.readFile(
|
|
30352
|
-
|
|
30541
|
+
path12.join(workspaceCwd, ".qwen", "settings.json"),
|
|
30353
30542
|
"utf8"
|
|
30354
30543
|
);
|
|
30355
30544
|
const settings = JSON.parse(raw);
|
|
@@ -30510,7 +30699,7 @@ __name(registerA2uiActionRoutes, "registerA2uiActionRoutes");
|
|
|
30510
30699
|
|
|
30511
30700
|
// packages/cli/src/serve/server/fs-factory.ts
|
|
30512
30701
|
init_esbuild_shims();
|
|
30513
|
-
import * as
|
|
30702
|
+
import * as path13 from "node:path";
|
|
30514
30703
|
var IDE_WORKSPACE_PATH_ENV_VAR = "QWEN_CODE_IDE_WORKSPACE_PATH";
|
|
30515
30704
|
function createDefaultFsAuditEmit() {
|
|
30516
30705
|
const WARN_EVERY = 100;
|
|
@@ -30585,14 +30774,14 @@ function parseIdeWorkspacePathEnv(value) {
|
|
|
30585
30774
|
const parsed = JSON.parse(value);
|
|
30586
30775
|
if (Array.isArray(parsed) && parsed.every((item) => typeof item === "string")) {
|
|
30587
30776
|
return parsed.filter(
|
|
30588
|
-
(workspace) => workspace.length > 0 &&
|
|
30777
|
+
(workspace) => workspace.length > 0 && path13.isAbsolute(workspace)
|
|
30589
30778
|
);
|
|
30590
30779
|
}
|
|
30591
30780
|
throw new Error("IDE workspace path JSON must be a string array");
|
|
30592
30781
|
} catch {
|
|
30593
30782
|
}
|
|
30594
30783
|
}
|
|
30595
|
-
return value.split(
|
|
30784
|
+
return value.split(path13.delimiter).filter((workspace) => workspace.length > 0 && path13.isAbsolute(workspace));
|
|
30596
30785
|
}
|
|
30597
30786
|
__name(parseIdeWorkspacePathEnv, "parseIdeWorkspacePathEnv");
|
|
30598
30787
|
function dropNestedWorkspacesPreservingPrimary(workspaces) {
|
|
@@ -30861,9 +31050,9 @@ __name(setupDeviceFlowRegistry, "setupDeviceFlowRegistry");
|
|
|
30861
31050
|
|
|
30862
31051
|
// packages/cli/src/serve/server/error-handlers.ts
|
|
30863
31052
|
init_esbuild_shims();
|
|
30864
|
-
var
|
|
31053
|
+
var import_express3 = __toESM(require_express(), 1);
|
|
30865
31054
|
function installJsonBodyParser(app) {
|
|
30866
|
-
app.use(
|
|
31055
|
+
app.use(import_express3.default.json({ limit: "10mb" }));
|
|
30867
31056
|
app.use((err, _req, res, next) => {
|
|
30868
31057
|
if (sendJsonBodyParserError(res, err)) return;
|
|
30869
31058
|
next(err);
|
|
@@ -30917,10 +31106,10 @@ function installRateLimiter(app, opts, daemonLog, options = {}) {
|
|
|
30917
31106
|
{ tier, key: key.slice(0, 64) }
|
|
30918
31107
|
);
|
|
30919
31108
|
} : void 0,
|
|
30920
|
-
onError: daemonLog ? (err,
|
|
31109
|
+
onError: daemonLog ? (err, path15) => {
|
|
30921
31110
|
daemonLog.warn(
|
|
30922
31111
|
`rate limiter error (fail-open): ${err instanceof Error ? err.message : String(err)}`,
|
|
30923
|
-
{ path:
|
|
31112
|
+
{ path: path15 }
|
|
30924
31113
|
);
|
|
30925
31114
|
} : void 0
|
|
30926
31115
|
});
|
|
@@ -31116,7 +31305,7 @@ __name(registerWorkspaceQualifiedLifecycleRoutes, "registerWorkspaceQualifiedLif
|
|
|
31116
31305
|
init_esbuild_shims();
|
|
31117
31306
|
import { readdir as readdir2, stat as stat2 } from "node:fs/promises";
|
|
31118
31307
|
import { realpathSync as realpathSync3 } from "node:fs";
|
|
31119
|
-
import { basename as basename4, dirname as dirname4, isAbsolute as isAbsolute7, join as
|
|
31308
|
+
import { basename as basename4, dirname as dirname4, isAbsolute as isAbsolute7, join as join8, resolve as resolve4, sep as sep3 } from "node:path";
|
|
31120
31309
|
|
|
31121
31310
|
// packages/cli/src/serve/native-directory-picker.ts
|
|
31122
31311
|
init_esbuild_shims();
|
|
@@ -31502,7 +31691,7 @@ function registerWorkspaceManagementRoutes(app, deps) {
|
|
|
31502
31691
|
return;
|
|
31503
31692
|
}
|
|
31504
31693
|
const endsWithSep = prefix.endsWith("/") || process.platform === "win32" && prefix.endsWith("\\");
|
|
31505
|
-
const dir = endsWithSep ?
|
|
31694
|
+
const dir = endsWithSep ? join8(prefix, ".") : dirname4(prefix);
|
|
31506
31695
|
const filter = endsWithSep ? "" : basename4(prefix);
|
|
31507
31696
|
const filterLower = filter.toLowerCase();
|
|
31508
31697
|
const suggestions = [];
|
|
@@ -31518,7 +31707,7 @@ function registerWorkspaceManagementRoutes(app, deps) {
|
|
|
31518
31707
|
let isDir = entry.isDirectory();
|
|
31519
31708
|
if (!isDir && entry.isSymbolicLink()) {
|
|
31520
31709
|
try {
|
|
31521
|
-
isDir = (await stat2(
|
|
31710
|
+
isDir = (await stat2(join8(dir, entry.name))).isDirectory();
|
|
31522
31711
|
} catch {
|
|
31523
31712
|
continue;
|
|
31524
31713
|
}
|
|
@@ -31528,7 +31717,7 @@ function registerWorkspaceManagementRoutes(app, deps) {
|
|
|
31528
31717
|
truncated = true;
|
|
31529
31718
|
break;
|
|
31530
31719
|
}
|
|
31531
|
-
suggestions.push({ name: entry.name, path:
|
|
31720
|
+
suggestions.push({ name: entry.name, path: join8(dir, entry.name) });
|
|
31532
31721
|
}
|
|
31533
31722
|
} catch {
|
|
31534
31723
|
}
|
|
@@ -31548,11 +31737,11 @@ function registerWorkspaceManagementRoutes(app, deps) {
|
|
|
31548
31737
|
const controller = new AbortController();
|
|
31549
31738
|
res.on("close", () => controller.abort());
|
|
31550
31739
|
try {
|
|
31551
|
-
const
|
|
31740
|
+
const path15 = await pickWorkspaceDirectory(controller.signal);
|
|
31552
31741
|
res.status(200).json({
|
|
31553
31742
|
kind: "workspace-directory-picker",
|
|
31554
|
-
selected:
|
|
31555
|
-
...
|
|
31743
|
+
selected: path15 !== void 0,
|
|
31744
|
+
...path15 === void 0 ? {} : { path: path15 }
|
|
31556
31745
|
});
|
|
31557
31746
|
} catch (error2) {
|
|
31558
31747
|
const detail = error2 instanceof Error ? error2.message : String(error2);
|
|
@@ -32609,8 +32798,8 @@ function buildDiffList(workspaceCwd, result) {
|
|
|
32609
32798
|
hiddenCount: 0
|
|
32610
32799
|
};
|
|
32611
32800
|
}
|
|
32612
|
-
const files = [...result.perFileStats.entries()].map(([
|
|
32613
|
-
path:
|
|
32801
|
+
const files = [...result.perFileStats.entries()].map(([path15, s]) => ({
|
|
32802
|
+
path: path15,
|
|
32614
32803
|
oldPath: s.oldPath,
|
|
32615
32804
|
added: s.added,
|
|
32616
32805
|
removed: s.removed,
|
|
@@ -35517,7 +35706,7 @@ __name(registerWorkspaceQualifiedSkillsRoutes, "registerWorkspaceQualifiedSkills
|
|
|
35517
35706
|
|
|
35518
35707
|
// packages/cli/src/serve/routes/channel-webhooks.ts
|
|
35519
35708
|
init_esbuild_shims();
|
|
35520
|
-
var
|
|
35709
|
+
var import_express4 = __toESM(require_express(), 1);
|
|
35521
35710
|
import { createHash as createHash4, timingSafeEqual as timingSafeEqual2 } from "node:crypto";
|
|
35522
35711
|
var PROTOTYPE_POLLUTION_KEYS = /* @__PURE__ */ new Set([
|
|
35523
35712
|
"__proto__",
|
|
@@ -35566,7 +35755,7 @@ function registerChannelWebhookRoutes(app, deps) {
|
|
|
35566
35755
|
locals.channelWebhook = { channelName, source, sourceConfig };
|
|
35567
35756
|
next();
|
|
35568
35757
|
},
|
|
35569
|
-
|
|
35758
|
+
import_express4.default.json({ limit: "1mb" }),
|
|
35570
35759
|
async (req, res) => {
|
|
35571
35760
|
const locals = res.locals;
|
|
35572
35761
|
const webhook = locals.channelWebhook;
|
|
@@ -39065,10 +39254,10 @@ __name(registerLiveSetupRoutes, "registerLiveSetupRoutes");
|
|
|
39065
39254
|
init_esbuild_shims();
|
|
39066
39255
|
import { execFile as execFile3 } from "node:child_process";
|
|
39067
39256
|
import { createHash as createHash5, randomUUID as randomUUID11 } from "node:crypto";
|
|
39068
|
-
import * as
|
|
39257
|
+
import * as fs7 from "node:fs";
|
|
39069
39258
|
import * as fsp5 from "node:fs/promises";
|
|
39070
|
-
import * as
|
|
39071
|
-
import * as
|
|
39259
|
+
import * as os2 from "node:os";
|
|
39260
|
+
import * as path14 from "node:path";
|
|
39072
39261
|
import { Readable, Transform } from "node:stream";
|
|
39073
39262
|
import { pipeline } from "node:stream/promises";
|
|
39074
39263
|
import { promisify as promisify3 } from "node:util";
|
|
@@ -39146,7 +39335,7 @@ async function readBundleValue(appPath, key) {
|
|
|
39146
39335
|
"raw",
|
|
39147
39336
|
"-o",
|
|
39148
39337
|
"-",
|
|
39149
|
-
|
|
39338
|
+
path14.join(appPath, "Contents", "Info.plist")
|
|
39150
39339
|
]);
|
|
39151
39340
|
}
|
|
39152
39341
|
__name(readBundleValue, "readBundleValue");
|
|
@@ -39241,7 +39430,7 @@ async function downloadAsset(asset, destination, onProgress) {
|
|
|
39241
39430
|
await pipeline(
|
|
39242
39431
|
Readable.fromWeb(response.body),
|
|
39243
39432
|
guard,
|
|
39244
|
-
|
|
39433
|
+
fs7.createWriteStream(destination, { flags: "wx", mode: 384 })
|
|
39245
39434
|
);
|
|
39246
39435
|
if (received !== asset.size || hash.digest("hex") !== asset.sha256) {
|
|
39247
39436
|
throw new Error("Live Host checksum verification failed.");
|
|
@@ -39252,11 +39441,11 @@ async function installLatestHost(currentArchitecture, onStatus) {
|
|
|
39252
39441
|
const manifest = await fetchManifest();
|
|
39253
39442
|
const asset = manifest.assets[currentArchitecture];
|
|
39254
39443
|
const temporaryDirectory = await fsp5.mkdtemp(
|
|
39255
|
-
|
|
39444
|
+
path14.join(os2.tmpdir(), "qwen-live-host-")
|
|
39256
39445
|
);
|
|
39257
|
-
const archivePath =
|
|
39258
|
-
const extractedPath =
|
|
39259
|
-
const candidatePath =
|
|
39446
|
+
const archivePath = path14.join(temporaryDirectory, asset.name);
|
|
39447
|
+
const extractedPath = path14.join(temporaryDirectory, "extracted");
|
|
39448
|
+
const candidatePath = path14.join(extractedPath, LIVE_HOST_APP_NAME);
|
|
39260
39449
|
const stagingPath = `/Applications/.Qwen Live Host.install-${randomUUID11()}.app`;
|
|
39261
39450
|
const backupPath = `/Applications/.Qwen Live Host.backup-${randomUUID11()}.app`;
|
|
39262
39451
|
let movedExisting = false;
|
|
@@ -39404,13 +39593,13 @@ var LiveHostInstaller = class {
|
|
|
39404
39593
|
init_esbuild_shims();
|
|
39405
39594
|
import { createHash as createHash6, randomUUID as randomUUID12 } from "node:crypto";
|
|
39406
39595
|
import { createWriteStream as createWriteStream2, mkdirSync as mkdirSync2 } from "node:fs";
|
|
39407
|
-
import { join as
|
|
39596
|
+
import { join as join11 } from "node:path";
|
|
39408
39597
|
|
|
39409
39598
|
// packages/cli/src/serve/live/realtime-startup-context.ts
|
|
39410
39599
|
init_esbuild_shims();
|
|
39411
39600
|
import { readdirSync } from "node:fs";
|
|
39412
39601
|
import { homedir } from "node:os";
|
|
39413
|
-
import { basename as basename5, join as
|
|
39602
|
+
import { basename as basename5, join as join10 } from "node:path";
|
|
39414
39603
|
var STARTUP_CONTEXT_HEADER = "Startup context from Qwen Code.\nThis is background context about recent work and machine/workspace layout. It may be incomplete or stale. Use it to inform responses, and do not repeat it back unless relevant.";
|
|
39415
39604
|
var CURRENT_THREAD_SECTION_TOKEN_BUDGET = 1200;
|
|
39416
39605
|
var RECENT_WORK_SECTION_TOKEN_BUDGET = 2200;
|
|
@@ -39652,7 +39841,7 @@ function collectTreeLines(directory, depth, lines) {
|
|
|
39652
39841
|
const indent = " ".repeat(depth);
|
|
39653
39842
|
lines.push(`${indent}- ${entry.name}${entry.isDirectory() ? "/" : ""}`);
|
|
39654
39843
|
if (entry.isDirectory()) {
|
|
39655
|
-
collectTreeLines(
|
|
39844
|
+
collectTreeLines(join10(directory, entry.name), depth + 1, lines);
|
|
39656
39845
|
}
|
|
39657
39846
|
}
|
|
39658
39847
|
if (entries.length > DIR_ENTRY_LIMIT) {
|
|
@@ -39771,13 +39960,13 @@ function openLiveAudioCapture(source, identifier) {
|
|
|
39771
39960
|
try {
|
|
39772
39961
|
mkdirSync2(directory, { recursive: true, mode: 448 });
|
|
39773
39962
|
const safeIdentifier = identifier.replace(/[^A-Za-z0-9_-]/g, "_");
|
|
39774
|
-
const
|
|
39963
|
+
const path15 = join11(
|
|
39775
39964
|
directory,
|
|
39776
39965
|
`${source}-${Date.now()}-${safeIdentifier}.pcm`
|
|
39777
39966
|
);
|
|
39778
|
-
const stream = createWriteStream2(
|
|
39967
|
+
const stream = createWriteStream2(path15, { flags: "wx", mode: 384 });
|
|
39779
39968
|
stream.on("error", () => void 0);
|
|
39780
|
-
return { source, path:
|
|
39969
|
+
return { source, path: path15, stream, hash: createHash6("sha256"), bytes: 0 };
|
|
39781
39970
|
} catch {
|
|
39782
39971
|
return void 0;
|
|
39783
39972
|
}
|
|
@@ -42143,7 +42332,7 @@ function createServeApp(opts, getPort = () => opts.port, deps = {}) {
|
|
|
42143
42332
|
"createServeApp: deps.workspaceRuntimeRemoval requires the matching deps.voiceCoordinator."
|
|
42144
42333
|
);
|
|
42145
42334
|
}
|
|
42146
|
-
const app = (0,
|
|
42335
|
+
const app = (0, import_express5.default)();
|
|
42147
42336
|
const injectedWorkspaceRegistry = deps.workspaceRegistry;
|
|
42148
42337
|
const boundWorkspace = injectedWorkspaceRegistry?.primary.workspaceCwd ?? deps.boundWorkspace ?? canonicalizeWorkspace(opts.workspace ?? process.cwd());
|
|
42149
42338
|
if (injectedWorkspaceRegistry) {
|