@qwen-code/qwen-code 0.19.12 → 0.20.0-nightly.20260721.cda0e0348
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/docs/configuration/settings.md +1 -1
- package/bundled/qc-helper/docs/features/commands.md +54 -0
- package/bundled/qc-helper/docs/integration-github-action.md +1 -1
- package/bundled/qc-helper/docs/qwen-serve.md +44 -6
- package/bundled/review/DESIGN.md +2 -2
- package/bundled/review/SKILL.md +13 -9
- package/chunks/{MaxSizedBox-QOXLJGAF.js → MaxSizedBox-EE76OHAP.js} +30 -27
- package/chunks/{StandaloneSessionPicker-FLV6CGYJ.js → StandaloneSessionPicker-WZH4PC3K.js} +50 -45
- package/chunks/{acpAgent-OB2CTF3P.js → acpAgent-2ATF4LMP.js} +437 -156
- package/chunks/{agent-CKSI7BTR.js → agent-KTOOFWMV.js} +22 -22
- package/chunks/{agent-headless-U36LIYTU.js → agent-headless-WVJCQ27D.js} +22 -22
- package/chunks/{anthropicContentGenerator-ZZRGFEES.js → anthropicContentGenerator-W4JLNYWQ.js} +6 -5
- package/chunks/{artifact-tool-PHO5XEGZ.js → artifact-tool-WBCAMD3O.js} +2 -2
- package/chunks/{askUserQuestion-CEPBT47X.js → askUserQuestion-6DZC4UV5.js} +2 -2
- package/chunks/{bridge-AIKTINJG.js → bridge-T4TLAZSJ.js} +25 -25
- package/chunks/build-SSCNEHZZ.js +62 -0
- package/chunks/{ca-2SL2BXTK.js → ca-ISKASTR5.js} +606 -200
- package/chunks/{channel-worker-group-NEUVTPB2.js → channel-worker-group-QZV2SP5U.js} +4 -4
- package/chunks/{channel-worker-manager-7CQVOVWV.js → channel-worker-manager-3GMAU45H.js} +4 -4
- package/chunks/{channel-worker-supervisor-3BU2KNCZ.js → channel-worker-supervisor-QCXSXCRY.js} +3 -3
- package/chunks/{chunk-6ETOSWAO.js → chunk-246TW4IX.js} +3 -3
- package/chunks/{chunk-2CCDMJM7.js → chunk-25Y6JSH2.js} +3 -3
- package/chunks/{chunk-XSEWNUMZ.js → chunk-2CWOJ2FA.js} +8 -8
- package/chunks/{chunk-UZC5VPOJ.js → chunk-2GFRA3MN.js} +3 -3
- package/chunks/chunk-2GOPPEHK.js +442 -0
- package/chunks/{chunk-MRE77ST5.js → chunk-2ITGJJE2.js} +69 -2216
- package/chunks/{chunk-BABX5XRO.js → chunk-2LI23QA6.js} +1 -1
- package/chunks/{chunk-EFAXBOQO.js → chunk-32F7BZSK.js} +7 -7
- package/chunks/chunk-43T5WDQ7.js +127 -0
- package/chunks/{chunk-DJ4VHAFJ.js → chunk-4CWPMWCD.js} +7 -3
- package/chunks/{chunk-GMUPIMHF.js → chunk-4RA7PWIY.js} +3 -3
- package/chunks/{chunk-6IITZE7O.js → chunk-5JX5EWR5.js} +7 -7
- package/chunks/{chunk-OBSLEYCD.js → chunk-5PZ6R37W.js} +29 -2
- package/chunks/{chunk-HTHUX2T5.js → chunk-5QWWOFGG.js} +0 -1
- package/chunks/{chunk-3DJY4IFO.js → chunk-5SCI6E3E.js} +1 -1
- package/chunks/{chunk-GSPWDTYY.js → chunk-5WG2K5RH.js} +53 -16
- package/chunks/{chunk-NPMVLWYL.js → chunk-5YVZ2XLV.js} +6 -6
- package/chunks/{chunk-TKASNYDS.js → chunk-6DHWO5ZF.js} +3 -3
- package/chunks/{chunk-4CHDYDG3.js → chunk-6EFTQYW7.js} +1 -1
- package/chunks/{chunk-RKUMFUFM.js → chunk-6MC5ASQK.js} +4 -4
- package/chunks/{chunk-HZ4M2UQD.js → chunk-6RVJRVQR.js} +1 -1
- package/chunks/{chunk-W6CQPLWM.js → chunk-6ZBPS62S.js} +1 -1
- package/chunks/chunk-7KGXAXF7.js +114 -0
- package/chunks/{chunk-PK7COE5O.js → chunk-ABIL4ZQU.js} +1 -1
- package/chunks/{chunk-OEHCAWUA.js → chunk-ACW3VNUE.js} +2 -2
- package/chunks/{chunk-APOFULHK.js → chunk-AWVS63WA.js} +7 -6
- package/chunks/{chunk-KGWA7XYL.js → chunk-AY3CSB6F.js} +6 -226
- package/chunks/{chunk-XAAEDML2.js → chunk-AYCDXHZB.js} +1 -1
- package/chunks/{chunk-42VIHAYT.js → chunk-B452RETY.js} +1 -1
- package/chunks/{chunk-VAJS2E2D.js → chunk-BDBMYST4.js} +1 -1
- package/chunks/{chunk-5N7M4XYN.js → chunk-BUKOHGBE.js} +5 -5
- package/chunks/{chunk-F2RR4HO2.js → chunk-BVLROR2T.js} +1 -1
- package/chunks/{chunk-WIYV7CSF.js → chunk-BWK3FX3K.js} +3 -3
- package/chunks/{chunk-UE5TZ55T.js → chunk-C27BYUX6.js} +29 -2
- package/chunks/{chunk-KRMARA3A.js → chunk-CG2HPAVD.js} +29 -13
- package/chunks/{chunk-UOA2IHRI.js → chunk-CPCVCKKF.js} +1 -1
- package/chunks/{chunk-HD6EGS5K.js → chunk-CUJX3F4X.js} +31 -6
- package/chunks/{chunk-4RPARQ5D.js → chunk-D2VIDMVM.js} +2 -2
- package/chunks/{chunk-PUKUUASO.js → chunk-DMRO4GU2.js} +1 -1
- package/chunks/{chunk-64GC5EMF.js → chunk-DZZIOIVF.js} +1 -1
- package/chunks/{chunk-FUSMC3SZ.js → chunk-E5QFCC4X.js} +13 -8
- package/chunks/{chunk-LKR7QQ63.js → chunk-EAUYY7SS.js} +3 -3
- package/chunks/{chunk-NE6HHLL3.js → chunk-EDMGFJ3E.js} +2 -2
- package/chunks/{chunk-J2MKYJKZ.js → chunk-EIAK6Q2B.js} +2 -2
- package/chunks/{chunk-WEPXQKGP.js → chunk-EZVDJFZ7.js} +1 -1
- package/chunks/{chunk-NALRQ3SG.js → chunk-FCUUJKZF.js} +394 -128
- package/chunks/{chunk-4XCVGEEX.js → chunk-FSL5W5TI.js} +3 -3
- package/chunks/{chunk-CHPQFLW6.js → chunk-FYA3Y5JR.js} +5 -5
- package/chunks/{chunk-V4PCIS25.js → chunk-FZVSFBNW.js} +69 -7
- package/chunks/{chunk-4MPYGENG.js → chunk-G45NOBV7.js} +6 -6
- package/chunks/{chunk-OSSDHJDU.js → chunk-G45X5TRN.js} +1 -1
- package/chunks/{chunk-3B6PSWHE.js → chunk-GH7OEOYU.js} +4 -4
- package/chunks/{chunk-KANTXY7B.js → chunk-GKY2OJ7R.js} +2 -2
- package/chunks/chunk-GMGDLUC7.js +37 -0
- package/chunks/{chunk-2476XGOU.js → chunk-GPILFVPY.js} +1 -1
- package/chunks/{chunk-EISVEV45.js → chunk-H24SOJIQ.js} +2 -2
- package/chunks/{chunk-J6NT5YTN.js → chunk-H2XVO6NE.js} +1 -289
- package/chunks/{chunk-QIFTJDBY.js → chunk-IM2A6YO3.js} +1 -1
- package/chunks/{chunk-R3EDIMYZ.js → chunk-IYZENXFW.js} +1 -1
- package/chunks/{chunk-LPHGXXZX.js → chunk-JD3MKVKL.js} +1 -1
- package/chunks/{chunk-NUHSLBJZ.js → chunk-JNWZQ27S.js} +15 -9
- package/chunks/{chunk-ETN2G32U.js → chunk-JPRLCXAO.js} +4 -4
- package/chunks/{chunk-WHQNBBWW.js → chunk-JQMBPGOU.js} +2 -2
- package/chunks/{chunk-5QSVANRT.js → chunk-JR6UJ24K.js} +2 -2
- package/chunks/{chunk-VLHQMOZK.js → chunk-JRW46GQX.js} +3 -3
- package/chunks/{chunk-DUR7BZYK.js → chunk-KRI4VCHX.js} +53 -28
- package/chunks/{chunk-PR5XQ73G.js → chunk-KTNIZG2C.js} +2 -2
- package/chunks/{chunk-QSG4ZFG4.js → chunk-KTUQMDEP.js} +1 -1
- package/chunks/{chunk-HVGJWOR6.js → chunk-L4YSPHR4.js} +2 -2
- package/chunks/{chunk-BEZPRKD3.js → chunk-LC5CAVMS.js} +160 -2
- package/chunks/{chunk-67Q33DQY.js → chunk-LLDGOZMJ.js} +4 -4
- package/chunks/{chunk-UCTCDLDS.js → chunk-LWQ4IAOJ.js} +136 -4
- package/chunks/{chunk-GEHSF7MS.js → chunk-NEEB7UEN.js} +2545 -1974
- package/chunks/{chunk-GCY7QTCE.js → chunk-NO6XTCYT.js} +1822 -424
- package/chunks/{chunk-JCJPZMJV.js → chunk-OOCI5VVU.js} +1 -1
- package/chunks/{chunk-XSPFQQRE.js → chunk-OONJNQ42.js} +3 -3
- package/chunks/{chunk-ANRANWVE.js → chunk-OP4MOGXF.js} +1 -1
- package/chunks/{chunk-GW7BONBU.js → chunk-OV2KB55J.js} +5 -5
- package/chunks/{chunk-CPU6I5YV.js → chunk-P64HXIC5.js} +115 -32
- package/chunks/{chunk-SGPFJMRP.js → chunk-PBATSWUQ.js} +1 -1
- package/chunks/{chunk-GXFYV7MP.js → chunk-PFKNXN67.js} +1106 -592
- package/chunks/{chunk-KNGZ5EYL.js → chunk-PYNCSQSI.js} +198 -120
- package/chunks/{chunk-I7RRHHYG.js → chunk-QKTHJXCS.js} +1 -1
- package/chunks/chunk-QKYTTBYW.js +624 -0
- package/chunks/{chunk-76BFY7AF.js → chunk-QTERJVPZ.js} +1 -6
- package/chunks/{chunk-W4UN42YP.js → chunk-R3VZNHRX.js} +85 -21
- package/chunks/chunk-R5N7NF5D.js +1187 -0
- package/chunks/{chunk-ZSDFNE6Y.js → chunk-RF34V75B.js} +3 -3
- package/chunks/{chunk-HCCR43AY.js → chunk-RFIAR4YL.js} +1 -1
- package/chunks/chunk-RS7MT2QG.js +305 -0
- package/chunks/{chunk-BKNPMEN6.js → chunk-RVLZCXEE.js} +162 -17
- package/chunks/chunk-SV5PQVQE.js +71 -0
- package/chunks/{chunk-3ESL7JXA.js → chunk-U4VGYZN7.js} +3 -3
- package/chunks/{chunk-4CA4WUMS.js → chunk-UEY4AYUL.js} +2 -2
- package/chunks/{chunk-ZGT623SG.js → chunk-USTF7LPI.js} +12 -12
- package/chunks/chunk-V7RNNPGC.js +44 -0
- package/chunks/{chunk-VEFR4XJQ.js → chunk-W3BKN3LO.js} +1 -1
- package/chunks/{chunk-4SJJT466.js → chunk-WQQDJE2P.js} +94 -177
- package/chunks/{chunk-KMJOMWHE.js → chunk-WRRF6TEQ.js} +1 -1
- package/chunks/{chunk-GLH2NTPB.js → chunk-XCHUDLER.js} +1 -1
- package/chunks/{chunk-7SX6WZNO.js → chunk-XVVH63JG.js} +3 -3
- package/chunks/{chunk-N47VAEAJ.js → chunk-XZOBDSDG.js} +2379 -1291
- package/chunks/chunk-YGIUIIIF.js +125 -0
- package/chunks/{chunk-335ECZTA.js → chunk-ZEOZL37W.js} +1 -1
- package/chunks/{computer-use-4PUGCUQK.js → computer-use-M6MGRJF2.js} +22 -22
- package/chunks/{config-utils-6PJUXHLI.js → config-utils-MOGE4EVB.js} +3 -3
- package/chunks/{contextCommand-C57KTWFV.js → contextCommand-HTRJJYNE.js} +25 -26
- package/chunks/{create-sub-session-5Q42XR6I.js → create-sub-session-MB35IHCR.js} +22 -22
- package/chunks/{create-sub-session-DIJOV6HV.js → create-sub-session-P26FE5GG.js} +2 -2
- package/chunks/{cron-create-X462ERYA.js → cron-create-JWFHBDRQ.js} +4 -4
- package/chunks/{cron-delete-SL5UJUM3.js → cron-delete-GDX4E26G.js} +4 -4
- package/chunks/{cron-list-3MD6SVXI.js → cron-list-USMAIWPT.js} +4 -4
- package/chunks/{daemon-ZW6LHOXT.js → daemon-KLPTQIE4.js} +287 -143
- package/chunks/{daemon-status-provider-YPV3UXHT.js → daemon-status-provider-67EKK6S3.js} +29 -29
- package/chunks/{dist-NUXRQHC5.js → dist-OAV7LJGJ.js} +1 -1
- package/chunks/{dist-XLE6ODMB.js → dist-OMW6WDEO.js} +1 -1
- package/chunks/{dist-J2H4KTLB.js → dist-PJLG2XYX.js} +1 -1
- package/chunks/{dist-IEQSDXS7.js → dist-UIFWIFRO.js} +2 -2
- package/chunks/{dist-IGZMVS5R.js → dist-VGJTZL4E.js} +33 -22
- package/chunks/{dist-3DQNQJ6H.js → dist-XBJVSWS2.js} +1 -1
- package/chunks/{earlyInputCapture-5VDWSYAM.js → earlyInputCapture-7QJX25AC.js} +23 -23
- package/chunks/{edit-GORZTX2U.js → edit-BTPQWGAA.js} +23 -23
- package/chunks/{enter-worktree-LJB2AW4L.js → enter-worktree-N3SEYKOO.js} +22 -22
- package/chunks/{enterPlanMode-LIIPP37T.js → enterPlanMode-TN2JV5MY.js} +28 -23
- package/chunks/{environment-HQ2UHJ35.js → environment-HP6RK262.js} +24 -24
- package/chunks/{errors-6JD5VMVQ.js → errors-VHGRDDOQ.js} +24 -24
- package/chunks/{exit-worktree-IEP2WHOV.js → exit-worktree-FI3SQY3U.js} +22 -22
- package/chunks/{exitPlanMode-U5Z6XBLO.js → exitPlanMode-NZWRVIIY.js} +22 -22
- package/chunks/{fast-path-HFKNMP23.js → fast-path-EGP7AXNR.js} +3 -2
- package/chunks/{gemini-C2SCJH3N.js → gemini-AN5YMD5O.js} +70 -68
- package/chunks/{geminiContentGenerator-ADZTXEKV.js → geminiContentGenerator-ABTMU4FE.js} +4 -4
- package/chunks/{glob-GOAPGD6G.js → glob-5YABOPJB.js} +22 -22
- package/chunks/{grep-HZLSTX7D.js → grep-U67FKUJT.js} +22 -22
- package/chunks/{handleAutoUpdate-UF74WGFE.js → handleAutoUpdate-OOKBP5VD.js} +27 -28
- package/chunks/{i18n-FMXIYUOC.js → i18n-GMQV324P.js} +23 -23
- package/chunks/{initializer-ERDBM3DU.js → initializer-NWALZGQ5.js} +28 -28
- package/chunks/{installationInfo-LROMXYLX.js → installationInfo-Y3M433E7.js} +25 -23
- package/chunks/{keychain-token-storage-K23CFKGN.js → keychain-token-storage-DWRJMNH3.js} +2 -2
- package/chunks/{list-6JPJROU5.js → list-CQDDWHTS.js} +30 -30
- package/chunks/{loadedSettingsAdapter-QCWYUBBF.js → loadedSettingsAdapter-I5KG37EI.js} +27 -27
- package/chunks/{loop-wakeup-6H7OENTB.js → loop-wakeup-5GLTUBHA.js} +5 -5
- package/chunks/{ls-APTSOOS5.js → ls-FHBY3Y7I.js} +4 -4
- package/chunks/{lsp-HPACPJAN.js → lsp-B6VMEW6Y.js} +2 -2
- package/chunks/{mcp-3P3KWYWO.js → mcp-24HHCBSP.js} +27 -27
- package/chunks/{monitor-LMYKCF6R.js → monitor-Z7NZNNRC.js} +22 -22
- package/chunks/nonInteractiveCli-GVF2XDJT.js +126 -0
- package/chunks/{notebook-edit-IBEOVZ6A.js → notebook-edit-GFOYAQAZ.js} +23 -23
- package/chunks/{openaiContentGenerator-42PZKET5.js → openaiContentGenerator-XAAYV6WR.js} +11 -11
- package/chunks/{pidfile-VTBDIGOH.js → pidfile-ILI37KRQ.js} +23 -23
- package/chunks/{processUtils-L7ZKOGDG.js → processUtils-LIPJMLVZ.js} +2 -2
- package/chunks/{qwenContentGenerator-VR2CNFGI.js → qwenContentGenerator-DLJ3KKGZ.js} +24 -24
- package/chunks/{qwenOAuth2-6LS2T3Q6.js → qwenOAuth2-J47FU5PW.js} +11 -11
- package/chunks/react-SG7JAQSZ.js +8 -0
- package/chunks/{read-file-VSKOE22I.js → read-file-LCQ2KNNP.js} +8 -8
- package/chunks/{read-mcp-resource-C6NT52T6.js → read-mcp-resource-AKCL7I43.js} +2 -2
- package/chunks/{record-artifact-ENCU7QCL.js → record-artifact-PEUB7727.js} +2 -2
- package/chunks/resumeHistoryUtils-PSCSAKA6.js +78 -0
- package/chunks/{ripGrep-5V5FLW2A.js → ripGrep-Y2XW4EFC.js} +22 -22
- package/chunks/{run-qwen-serve-LSOPP4R2.js → run-qwen-serve-DQ5ZIR36.js} +1459 -148
- package/chunks/{runtime-LT7R4CS5.js → runtime-6MQFF2A6.js} +33 -31
- package/chunks/{scheduler-YOWQ7KZP.js → scheduler-K4S7NY3G.js} +22 -22
- package/chunks/{send-message-5GZ4FX2V.js → send-message-3RHE7HSM.js} +3 -3
- package/chunks/{serve-VWLBXKGK.js → serve-JFAAPC5J.js} +27 -27
- package/chunks/{server-3RW3FYOH.js → server-QB6CHRZN.js} +866 -271
- package/chunks/{session-ZONXFOBQ.js → session-FKPVXAAB.js} +79 -163
- package/chunks/{settings-JC3VC53L.js → settings-CADELKSU.js} +26 -26
- package/chunks/{shell-2NGEMAVM.js → shell-EON6WVVH.js} +22 -22
- package/chunks/{skill-3U2T6H3E.js → skill-FKSYXJ5U.js} +10 -10
- package/chunks/{spawnChannel-QEAUPARQ.js → spawnChannel-VM5IHLJO.js} +24 -24
- package/chunks/{src-75ZPXO7B.js → src-Q4XB6SVD.js} +66 -22
- package/chunks/{standalone-update-UUJWJWYY.js → standalone-update-KGZHPBMA.js} +24 -24
- package/chunks/{startInteractiveUI-V7XISPQ6.js → startInteractiveUI-EYDJIIIZ.js} +5484 -2045
- package/chunks/{syntheticOutput-ULOVVLY4.js → syntheticOutput-FG5PQKIR.js} +3 -3
- package/chunks/{task-create-DUE2PMNI.js → task-create-HX32YXO7.js} +7 -7
- package/chunks/{task-list-WVPNX7BZ.js → task-list-QWSY4ZIU.js} +5 -5
- package/chunks/{task-stop-CPEQWOT6.js → task-stop-GWC6UWAL.js} +2 -2
- package/chunks/{task-update-HY2LNFFB.js → task-update-NCTAB73Q.js} +7 -7
- package/chunks/{team-create-R6AXDYPG.js → team-create-CYP3YKYT.js} +22 -22
- package/chunks/{team-delete-JJV6IUOA.js → team-delete-KK37HTOG.js} +5 -5
- package/chunks/{team-plan-approval-O2ZPPT64.js → team-plan-approval-5LXIFKNV.js} +22 -22
- package/chunks/{theme-manager-YIX2IC2D.js → theme-manager-QOUMDWMP.js} +23 -23
- package/chunks/{todoWrite-JHHIDOIV.js → todoWrite-ERCAMLFS.js} +4 -4
- package/chunks/{tool-search-5IE2VO7X.js → tool-search-Q27QHQU3.js} +9 -9
- package/chunks/{total-session-admission-K6APQYEF.js → total-session-admission-HWVCZ2WR.js} +25 -25
- package/chunks/{trustedFolders-GPSSPVBF.js → trustedFolders-C6664IQC.js} +23 -23
- package/chunks/{update-relaunch-4BVAPX6Y.js → update-relaunch-QC3E4FZW.js} +9 -9
- package/chunks/{updateCheck-AHTHWLAM.js → updateCheck-MVUKJMBX.js} +33 -26
- package/chunks/useAutoAcceptIndicator-J234IFIS.js +80 -0
- package/chunks/{validateNonInterActiveAuth-UKAPCWDM.js → validateNonInterActiveAuth-YPPEKX4N.js} +61 -63
- package/chunks/{version-EXGWKKQE.js → version-5IXFQ4PT.js} +1 -1
- package/chunks/{web-fetch-ZDNE6FF2.js → web-fetch-L62NQVKN.js} +10 -10
- package/chunks/{workflow-G7U6OQWS.js → workflow-6MHBBFQU.js} +23 -23
- package/chunks/{workspace-providers-status-W6CEA6YM.js → workspace-providers-status-ZTW2B5QU.js} +30 -30
- package/chunks/{workspace-registration-store-OGBMWCLC.js → workspace-registration-store-P6QHCSMU.js} +7 -1
- package/chunks/{workspace-registry-ZUWQM44P.js → workspace-registry-R54M5O3W.js} +25 -25
- package/chunks/{workspace-service-UXX5P7GU.js → workspace-service-WYLRGM4A.js} +32 -32
- package/chunks/{workspace-skills-status-635B5R7N.js → workspace-skills-status-NN5QFU3A.js} +28 -28
- package/chunks/{write-file-DR3HN7IH.js → write-file-EAT3CHUK.js} +23 -23
- package/cli.js +11 -11
- package/locales/ca.js +763 -201
- package/package.json +3 -3
- package/web-shell/assets/{arc-_dVIKMdB.js → arc-B0iTWRo2.js} +1 -1
- package/web-shell/assets/{architectureDiagram-3BPJPVTR-MuN3nKpL.js → architectureDiagram-3BPJPVTR-DSQP4-9D.js} +1 -1
- package/web-shell/assets/{blockDiagram-GPEHLZMM-BtmvJjzx.js → blockDiagram-GPEHLZMM-BNPVXVT3.js} +1 -1
- package/web-shell/assets/{c4Diagram-AAUBKEIU-Dvi58_BU.js → c4Diagram-AAUBKEIU-DEHfJFiD.js} +1 -1
- package/web-shell/assets/channel-tVz-qNSq.js +1 -0
- package/web-shell/assets/{chunk-2J33WTMH-YqxOVhS1.js → chunk-2J33WTMH-VZ0uL1p9.js} +1 -1
- package/web-shell/assets/{chunk-4BX2VUAB-DoBgbC9z.js → chunk-4BX2VUAB-D5TKmvwG.js} +1 -1
- package/web-shell/assets/{chunk-55IACEB6-3NEQrBAr.js → chunk-55IACEB6-BDW1Lcq-.js} +1 -1
- package/web-shell/assets/{chunk-727SXJPM-DrCZQxp0.js → chunk-727SXJPM-Cj4h85iM.js} +1 -1
- package/web-shell/assets/{chunk-AQP2D5EJ-m_g3zjgv.js → chunk-AQP2D5EJ-5LeqiOhZ.js} +1 -1
- package/web-shell/assets/{chunk-FMBD7UC4-D1_crABJ.js → chunk-FMBD7UC4-BaTgsco7.js} +1 -1
- package/web-shell/assets/{chunk-ND2GUHAM-BdhgVtBx.js → chunk-ND2GUHAM-t3uGlIUk.js} +1 -1
- package/web-shell/assets/{chunk-QZHKN3VN-BlmThhm-.js → chunk-QZHKN3VN-rOnNXL2Q.js} +1 -1
- package/web-shell/assets/classDiagram-4FO5ZUOK-CWuaBxYV.js +1 -0
- package/web-shell/assets/classDiagram-v2-Q7XG4LA2-CWuaBxYV.js +1 -0
- package/web-shell/assets/{cose-bilkent-S5V4N54A-Cbjm_00Z.js → cose-bilkent-S5V4N54A-CcqXykgA.js} +1 -1
- package/web-shell/assets/{dagre-BM42HDAG-C39QNVgC.js → dagre-BM42HDAG-Dkjrchoy.js} +1 -1
- package/web-shell/assets/{diagram-2AECGRRQ-DNXSAixC.js → diagram-2AECGRRQ-B6lcra9M.js} +1 -1
- package/web-shell/assets/{diagram-5GNKFQAL-BCbGUPEA.js → diagram-5GNKFQAL-bAIzq3PT.js} +1 -1
- package/web-shell/assets/{diagram-KO2AKTUF-1eujKSDC.js → diagram-KO2AKTUF-G9MAZDNW.js} +1 -1
- package/web-shell/assets/{diagram-LMA3HP47-DUMKXgql.js → diagram-LMA3HP47-DVLF1uWZ.js} +1 -1
- package/web-shell/assets/{diagram-OG6HWLK6-BFktU3_u.js → diagram-OG6HWLK6-Cf7y20Tc.js} +1 -1
- package/web-shell/assets/{erDiagram-TEJ5UH35-BvJC7DLk.js → erDiagram-TEJ5UH35-C7ETZB3o.js} +1 -1
- package/web-shell/assets/{flowDiagram-I6XJVG4X-Cgu3PlOt.js → flowDiagram-I6XJVG4X-Cl2xgL6J.js} +1 -1
- package/web-shell/assets/{ganttDiagram-6RSMTGT7-DLNXN5Xh.js → ganttDiagram-6RSMTGT7-BgjbMs3q.js} +1 -1
- package/web-shell/assets/{gitGraphDiagram-PVQCEYII-BQFRDv6R.js → gitGraphDiagram-PVQCEYII-JVX34Omm.js} +1 -1
- package/web-shell/assets/index-48bIcdqF.js +1197 -0
- package/web-shell/assets/{index-CdC3pjP3.js → index-BG7Zc4f_.js} +1 -1
- package/web-shell/assets/index-BI-JAO07.css +5 -0
- package/web-shell/assets/{infoDiagram-5YYISTIA-DT2mOSvp.js → infoDiagram-5YYISTIA-3NYyMeZU.js} +1 -1
- package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-9fy_K4bd.js → ishikawaDiagram-YF4QCWOH-C03VCu-U.js} +1 -1
- package/web-shell/assets/{journeyDiagram-JHISSGLW-CoGSEuhE.js → journeyDiagram-JHISSGLW-C9PuBRZW.js} +1 -1
- package/web-shell/assets/{kanban-definition-UN3LZRKU-BP9hHYIj.js → kanban-definition-UN3LZRKU-C3LvioWR.js} +1 -1
- package/web-shell/assets/{linear-uIroDsmp.js → linear-Du6Yw8N_.js} +1 -1
- package/web-shell/assets/{mermaid.core-BUwoStsA.js → mermaid.core-BXY5D2-X.js} +5 -5
- package/web-shell/assets/{mindmap-definition-RKZ34NQL-DZB-FWim.js → mindmap-definition-RKZ34NQL-2UrHLaDp.js} +1 -1
- package/web-shell/assets/{pieDiagram-4H26LBE5-YPptloKl.js → pieDiagram-4H26LBE5-dC03ml45.js} +1 -1
- package/web-shell/assets/{quadrantDiagram-W4KKPZXB-dgk3DSzm.js → quadrantDiagram-W4KKPZXB-CD6jARrp.js} +1 -1
- package/web-shell/assets/{requirementDiagram-4Y6WPE33-BH2En2i9.js → requirementDiagram-4Y6WPE33-BrK8aXfv.js} +1 -1
- package/web-shell/assets/{sankeyDiagram-5OEKKPKP-BB98feeI.js → sankeyDiagram-5OEKKPKP-B5Vitki_.js} +1 -1
- package/web-shell/assets/{sequenceDiagram-3UESZ5HK-CunAIGh8.js → sequenceDiagram-3UESZ5HK-CBy2t6Bo.js} +1 -1
- package/web-shell/assets/{stateDiagram-AJRCARHV-DTJs_-I2.js → stateDiagram-AJRCARHV-Enrka6T2.js} +1 -1
- package/web-shell/assets/stateDiagram-v2-BHNVJYJU-DUtYfXpW.js +1 -0
- package/web-shell/assets/{timeline-definition-PNZ67QCA-Cd4AN7O0.js → timeline-definition-PNZ67QCA-CwFq78ss.js} +1 -1
- package/web-shell/assets/{vennDiagram-CIIHVFJN-xIG-rUU9.js → vennDiagram-CIIHVFJN-BkOidM0g.js} +1 -1
- package/web-shell/assets/{wardley-L42UT6IY-D1UyjIcG.js → wardley-L42UT6IY-D_j13hQW.js} +1 -1
- package/web-shell/assets/{wardleyDiagram-YWT4CUSO-BVM0Mb99.js → wardleyDiagram-YWT4CUSO-7EveB1w6.js} +1 -1
- package/web-shell/assets/{xychartDiagram-2RQKCTM6-BX31JDSz.js → xychartDiagram-2RQKCTM6-DRkBhMXr.js} +1 -1
- package/web-shell/index.html +2 -2
- package/chunks/chunk-EDFD7VOX.js +0 -368
- package/chunks/chunk-GFYFLDEG.js +0 -709
- package/chunks/chunk-LUJQUNKY.js +0 -3288
- package/chunks/nonInteractiveCli-YURFHZV5.js +0 -129
- package/web-shell/assets/channel-Bi5TehaT.js +0 -1
- package/web-shell/assets/classDiagram-4FO5ZUOK-BKhhRdd1.js +0 -1
- package/web-shell/assets/classDiagram-v2-Q7XG4LA2-BKhhRdd1.js +0 -1
- package/web-shell/assets/index-C_ouplMQ.js +0 -1187
- package/web-shell/assets/index-XGDFJE-X.css +0 -5
- package/web-shell/assets/stateDiagram-v2-BHNVJYJU-DrfFMYta.js +0 -1
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
// Force strict mode and setup for ESM
|
|
2
2
|
"use strict";
|
|
3
|
+
import {
|
|
4
|
+
openQwenAsrRealtimeStream,
|
|
5
|
+
openVoiceStream,
|
|
6
|
+
openVoiceStreamWithRetry
|
|
7
|
+
} from "./chunk-GKY2OJ7R.js";
|
|
3
8
|
import {
|
|
4
9
|
GENERATION_MAX_PROMPT_BYTES,
|
|
5
10
|
MAX_REMEMBER_CONTENT_BYTES,
|
|
@@ -14,12 +19,7 @@ import {
|
|
|
14
19
|
shouldSuppressRememberErrorDetails,
|
|
15
20
|
workspaceMemoryFailureCode,
|
|
16
21
|
workspaceMemoryFailureDiagnostics
|
|
17
|
-
} from "./chunk-
|
|
18
|
-
import {
|
|
19
|
-
openQwenAsrRealtimeStream,
|
|
20
|
-
openVoiceStream,
|
|
21
|
-
openVoiceStreamWithRetry
|
|
22
|
-
} from "./chunk-KANTXY7B.js";
|
|
22
|
+
} from "./chunk-CG2HPAVD.js";
|
|
23
23
|
import {
|
|
24
24
|
SetupGithubError,
|
|
25
25
|
collectSessionData,
|
|
@@ -30,16 +30,16 @@ import {
|
|
|
30
30
|
toJson,
|
|
31
31
|
toJsonl,
|
|
32
32
|
toMarkdown
|
|
33
|
-
} from "./chunk-
|
|
33
|
+
} from "./chunk-PFKNXN67.js";
|
|
34
34
|
import {
|
|
35
35
|
OBSERVED_CONTACT_MAX_FRESH_WITHIN_SECONDS,
|
|
36
36
|
ObservedChannelContactStore
|
|
37
|
-
} from "./chunk-
|
|
38
|
-
import "./chunk-
|
|
39
|
-
import "./chunk-
|
|
37
|
+
} from "./chunk-KTUQMDEP.js";
|
|
38
|
+
import "./chunk-6RVJRVQR.js";
|
|
39
|
+
import "./chunk-RS7MT2QG.js";
|
|
40
|
+
import "./chunk-H2XVO6NE.js";
|
|
40
41
|
import "./chunk-QHTIBUWB.js";
|
|
41
|
-
import "./chunk-
|
|
42
|
-
import "./chunk-HTHUX2T5.js";
|
|
42
|
+
import "./chunk-QTERJVPZ.js";
|
|
43
43
|
import "./chunk-L573Z2QZ.js";
|
|
44
44
|
import {
|
|
45
45
|
createSingleWorkspaceRegistry,
|
|
@@ -77,6 +77,7 @@ import {
|
|
|
77
77
|
getDeferredRuntimeRequestTiming,
|
|
78
78
|
getServeProtocolVersions,
|
|
79
79
|
hostAllowlist,
|
|
80
|
+
installAccessLogMiddleware,
|
|
80
81
|
isBrowserAutomationMcpAvailable,
|
|
81
82
|
isDeepHealthQuery,
|
|
82
83
|
parseAllowOriginPatterns,
|
|
@@ -99,29 +100,29 @@ import {
|
|
|
99
100
|
setRateLimiter,
|
|
100
101
|
unsafeRevealSecret,
|
|
101
102
|
validateMcpRuntimeServerName
|
|
102
|
-
} from "./chunk-
|
|
103
|
+
} from "./chunk-LC5CAVMS.js";
|
|
103
104
|
import {
|
|
104
105
|
isLoopbackBind
|
|
105
106
|
} from "./chunk-RXFQM6FQ.js";
|
|
106
107
|
import {
|
|
107
108
|
createDaemonStatusProvider
|
|
108
|
-
} from "./chunk-
|
|
109
|
+
} from "./chunk-LLDGOZMJ.js";
|
|
109
110
|
import "./chunk-LXXMOYPL.js";
|
|
110
|
-
import "./chunk-
|
|
111
|
+
import "./chunk-GH7OEOYU.js";
|
|
111
112
|
import "./chunk-E5Z2AVNV.js";
|
|
112
113
|
import {
|
|
113
114
|
createWorkspaceProvidersStatusProvider
|
|
114
|
-
} from "./chunk-
|
|
115
|
+
} from "./chunk-2CWOJ2FA.js";
|
|
115
116
|
import {
|
|
116
117
|
getAuthTypeFromEnv,
|
|
117
118
|
resolveCliGenerationConfig
|
|
118
|
-
} from "./chunk-
|
|
119
|
+
} from "./chunk-L4YSPHR4.js";
|
|
119
120
|
import {
|
|
120
121
|
snapshotProcessEnv
|
|
121
|
-
} from "./chunk-
|
|
122
|
+
} from "./chunk-JR6UJ24K.js";
|
|
122
123
|
import {
|
|
123
124
|
createWorkspaceSkillsStatusProvider
|
|
124
|
-
} from "./chunk-
|
|
125
|
+
} from "./chunk-JRW46GQX.js";
|
|
125
126
|
import "./chunk-2W3OOD4W.js";
|
|
126
127
|
import {
|
|
127
128
|
EMPTY_WORKSPACE_VOICE_UPDATE_ERROR,
|
|
@@ -136,14 +137,14 @@ import {
|
|
|
136
137
|
validateWorkspaceSkillName,
|
|
137
138
|
validateWorkspaceVoiceState,
|
|
138
139
|
voiceSettingsScopeToWire
|
|
139
|
-
} from "./chunk-
|
|
140
|
+
} from "./chunk-KRI4VCHX.js";
|
|
140
141
|
import {
|
|
141
142
|
PermissionRulesValidationError,
|
|
142
143
|
buildPermissionSettings,
|
|
143
144
|
isPermissionRuleType,
|
|
144
145
|
normalizePermissionRules,
|
|
145
146
|
readPermissionRuleSet
|
|
146
|
-
} from "./chunk-
|
|
147
|
+
} from "./chunk-IM2A6YO3.js";
|
|
147
148
|
import {
|
|
148
149
|
assertVoiceBaseUrlNetworkAllowed,
|
|
149
150
|
isStreamingVoiceModel,
|
|
@@ -151,13 +152,13 @@ import {
|
|
|
151
152
|
resolveVoiceTranscriptionConfig,
|
|
152
153
|
sanitizeVoiceErrorMessage,
|
|
153
154
|
transcribeVoiceAudio
|
|
154
|
-
} from "./chunk-
|
|
155
|
+
} from "./chunk-U4VGYZN7.js";
|
|
155
156
|
import {
|
|
156
157
|
isVoiceEnabled,
|
|
157
158
|
isVoiceMode,
|
|
158
159
|
readVoiceModel
|
|
159
|
-
} from "./chunk-
|
|
160
|
-
import "./chunk-
|
|
160
|
+
} from "./chunk-GPILFVPY.js";
|
|
161
|
+
import "./chunk-BVLROR2T.js";
|
|
161
162
|
import {
|
|
162
163
|
WorkspacePermissionRulesSessionRequiredError,
|
|
163
164
|
WorkspaceSettingsPartialPersistError,
|
|
@@ -173,14 +174,14 @@ import {
|
|
|
173
174
|
SessionArtifactValidationError,
|
|
174
175
|
createAcpSessionBridge,
|
|
175
176
|
parseSessionSource
|
|
176
|
-
} from "./chunk-
|
|
177
|
+
} from "./chunk-R3VZNHRX.js";
|
|
177
178
|
import {
|
|
178
179
|
EVENT_SCHEMA_VERSION,
|
|
179
180
|
SubscriberLimitExceededError
|
|
180
181
|
} from "./chunk-6RLROE6G.js";
|
|
181
182
|
import "./chunk-COH43MRJ.js";
|
|
182
183
|
import "./chunk-QR6U5QPP.js";
|
|
183
|
-
import "./chunk-
|
|
184
|
+
import "./chunk-DMRO4GU2.js";
|
|
184
185
|
import {
|
|
185
186
|
BranchWhilePromptActiveError,
|
|
186
187
|
CancelSentinelCollisionError,
|
|
@@ -217,25 +218,27 @@ import {
|
|
|
217
218
|
STATUS_SCHEMA_VERSION,
|
|
218
219
|
createIdleWorkspaceMemoryStatus,
|
|
219
220
|
mapDomainErrorToErrorKind
|
|
220
|
-
} from "./chunk-
|
|
221
|
+
} from "./chunk-DZZIOIVF.js";
|
|
221
222
|
import "./chunk-WBL3FJEU.js";
|
|
222
223
|
import {
|
|
223
224
|
daemonObservedContactsPath,
|
|
224
225
|
loadChannelsConfig
|
|
225
|
-
} from "./chunk-
|
|
226
|
-
import "./chunk-
|
|
226
|
+
} from "./chunk-CUJX3F4X.js";
|
|
227
|
+
import "./chunk-6MC5ASQK.js";
|
|
227
228
|
import "./chunk-57OAHC2Y.js";
|
|
228
229
|
import {
|
|
229
230
|
parseChannelWebhookConfigLenient
|
|
230
|
-
} from "./chunk-
|
|
231
|
-
import "./chunk-
|
|
231
|
+
} from "./chunk-32F7BZSK.js";
|
|
232
|
+
import "./chunk-6ZBPS62S.js";
|
|
232
233
|
import "./chunk-V6WHFGST.js";
|
|
233
234
|
import {
|
|
234
235
|
MAX_REGISTERED_WORKSPACES,
|
|
236
|
+
WorkspaceDisplayNameValidationError,
|
|
235
237
|
WorkspaceRegistrationStoreCommittedError,
|
|
236
238
|
WorkspaceRegistrationStoreLimitError,
|
|
239
|
+
normalizeWorkspaceDisplayName,
|
|
237
240
|
workspaceRegistrationId
|
|
238
|
-
} from "./chunk-
|
|
241
|
+
} from "./chunk-LWQ4IAOJ.js";
|
|
239
242
|
import {
|
|
240
243
|
MAX_WORKSPACE_PATH_LENGTH,
|
|
241
244
|
canonicalizeWorkspace,
|
|
@@ -249,7 +252,7 @@ import {
|
|
|
249
252
|
QWEN_SERVER_TOKEN_ENV,
|
|
250
253
|
isChannelWebhookEnqueueError,
|
|
251
254
|
normalizeWorkerDiagnostic
|
|
252
|
-
} from "./chunk-
|
|
255
|
+
} from "./chunk-QKTHJXCS.js";
|
|
253
256
|
import {
|
|
254
257
|
normalizeServeChannelSelection
|
|
255
258
|
} from "./chunk-TJTKSVIV.js";
|
|
@@ -260,7 +263,7 @@ import "./chunk-5HBA2Z7V.js";
|
|
|
260
263
|
import "./chunk-T2NCM2ET.js";
|
|
261
264
|
import {
|
|
262
265
|
sanitizeLogText
|
|
263
|
-
} from "./chunk-
|
|
266
|
+
} from "./chunk-RVLZCXEE.js";
|
|
264
267
|
import "./chunk-UDXSXLER.js";
|
|
265
268
|
import {
|
|
266
269
|
getDialogSettingKeys,
|
|
@@ -271,20 +274,23 @@ import {
|
|
|
271
274
|
getWritableScopes,
|
|
272
275
|
loadSettings,
|
|
273
276
|
validateSettingValue
|
|
274
|
-
} from "./chunk-
|
|
277
|
+
} from "./chunk-5JX5EWR5.js";
|
|
275
278
|
import "./chunk-RKUWKYED.js";
|
|
276
279
|
import "./chunk-GOXKNSDZ.js";
|
|
277
280
|
import "./chunk-IDS7MSUP.js";
|
|
278
281
|
import {
|
|
279
|
-
SUPPORTED_LANGUAGES
|
|
280
|
-
|
|
281
|
-
|
|
282
|
+
SUPPORTED_LANGUAGES,
|
|
283
|
+
detectSystemLanguage,
|
|
284
|
+
resolveLanguageSetting,
|
|
285
|
+
resolveSupportedLanguage
|
|
286
|
+
} from "./chunk-6DHWO5ZF.js";
|
|
287
|
+
import "./chunk-KTNIZG2C.js";
|
|
282
288
|
import "./chunk-QRUIS3DN.js";
|
|
283
|
-
import "./chunk-
|
|
289
|
+
import "./chunk-XCHUDLER.js";
|
|
284
290
|
import "./chunk-VJNBRRZG.js";
|
|
285
291
|
import {
|
|
286
292
|
getWorkspaceTrustStatus
|
|
287
|
-
} from "./chunk-
|
|
293
|
+
} from "./chunk-4RA7PWIY.js";
|
|
288
294
|
import "./chunk-ALGGS7UH.js";
|
|
289
295
|
import {
|
|
290
296
|
isWithinRoot as isWithinRoot2
|
|
@@ -298,10 +304,13 @@ import {
|
|
|
298
304
|
BuiltinAgentRegistry,
|
|
299
305
|
Client,
|
|
300
306
|
ClientMcpRegistrar,
|
|
307
|
+
DEFAULT_LOG_LIMIT,
|
|
301
308
|
ExtensionManager,
|
|
302
309
|
GROUP_COLOR_OPTIONS,
|
|
310
|
+
GitWorktreeService,
|
|
303
311
|
IMAGE_CAPABILITY,
|
|
304
312
|
InvalidSessionTranscriptCursorError,
|
|
313
|
+
MAX_LOG_LIMIT,
|
|
305
314
|
ModelsConfig,
|
|
306
315
|
RUNTIME_MCP_IF_ABSENT_CONFIG_FLAG,
|
|
307
316
|
SESSION_TRANSCRIPT_MAX_INDEX_BYTES,
|
|
@@ -325,13 +334,16 @@ import {
|
|
|
325
334
|
buildUsageDashboard,
|
|
326
335
|
detectLineEnding,
|
|
327
336
|
encodeTextFileContent,
|
|
337
|
+
fetchGitCommitDetail,
|
|
328
338
|
fetchGitDiff,
|
|
329
339
|
fetchGitDiffHunksForFile,
|
|
340
|
+
fetchGitLog,
|
|
330
341
|
getGitWorkingTreeStatus,
|
|
331
342
|
glob,
|
|
332
343
|
loadIgnoreRules,
|
|
333
344
|
loadUsageHistoryWithLive,
|
|
334
345
|
parseInstallSource,
|
|
346
|
+
readWorktreeSession,
|
|
335
347
|
redactUrlCredentials,
|
|
336
348
|
resolveBranchName,
|
|
337
349
|
resolveProviderProtocol,
|
|
@@ -339,18 +351,20 @@ import {
|
|
|
339
351
|
stripAnsiAndControl,
|
|
340
352
|
stripTerminalControlSequences,
|
|
341
353
|
watchRepoBranch,
|
|
342
|
-
writeWorkspaceContextFile
|
|
343
|
-
|
|
354
|
+
writeWorkspaceContextFile,
|
|
355
|
+
writeWorktreeSession,
|
|
356
|
+
writeWorktreeSessionMarker
|
|
357
|
+
} from "./chunk-NO6XTCYT.js";
|
|
344
358
|
import "./chunk-5M6IDOMF.js";
|
|
345
359
|
import "./chunk-T4TZQJ7W.js";
|
|
346
360
|
import "./chunk-H6XPXXMH.js";
|
|
347
361
|
import {
|
|
348
362
|
MAX_JOBS,
|
|
349
363
|
nextDurableFireMs
|
|
350
|
-
} from "./chunk-
|
|
351
|
-
import "./chunk-
|
|
352
|
-
import "./chunk-
|
|
353
|
-
import "./chunk-
|
|
364
|
+
} from "./chunk-EAUYY7SS.js";
|
|
365
|
+
import "./chunk-FSL5W5TI.js";
|
|
366
|
+
import "./chunk-OONJNQ42.js";
|
|
367
|
+
import "./chunk-D2VIDMVM.js";
|
|
354
368
|
import "./chunk-E2UVIFI2.js";
|
|
355
369
|
import {
|
|
356
370
|
nextFireTime,
|
|
@@ -364,7 +378,7 @@ import {
|
|
|
364
378
|
readCronTasks,
|
|
365
379
|
taskHasLegacyCondition,
|
|
366
380
|
updateCronTasks
|
|
367
|
-
} from "./chunk-
|
|
381
|
+
} from "./chunk-EIAK6Q2B.js";
|
|
368
382
|
import "./chunk-SZRN75WQ.js";
|
|
369
383
|
import "./chunk-HTO4JFDZ.js";
|
|
370
384
|
import "./chunk-CPBF7KYF.js";
|
|
@@ -372,12 +386,12 @@ import {
|
|
|
372
386
|
APPROVAL_MODES,
|
|
373
387
|
SubagentError,
|
|
374
388
|
SubagentErrorCode
|
|
375
|
-
} from "./chunk-
|
|
389
|
+
} from "./chunk-CPCVCKKF.js";
|
|
376
390
|
import "./chunk-6AM5D4ME.js";
|
|
377
|
-
import "./chunk-
|
|
378
|
-
import "./chunk-
|
|
379
|
-
import "./chunk-
|
|
380
|
-
import "./chunk-
|
|
391
|
+
import "./chunk-G45X5TRN.js";
|
|
392
|
+
import "./chunk-PBATSWUQ.js";
|
|
393
|
+
import "./chunk-ZEOZL37W.js";
|
|
394
|
+
import "./chunk-OOCI5VVU.js";
|
|
381
395
|
import {
|
|
382
396
|
QwenOAuth2Client,
|
|
383
397
|
QwenOAuthPollError,
|
|
@@ -386,8 +400,8 @@ import {
|
|
|
386
400
|
isDeviceAuthorizationSuccess,
|
|
387
401
|
isDeviceTokenPending,
|
|
388
402
|
isDeviceTokenSuccess
|
|
389
|
-
} from "./chunk-
|
|
390
|
-
import "./chunk-
|
|
403
|
+
} from "./chunk-25Y6JSH2.js";
|
|
404
|
+
import "./chunk-246TW4IX.js";
|
|
391
405
|
import "./chunk-JESCGQM3.js";
|
|
392
406
|
import {
|
|
393
407
|
addDaemonRequestAttribute,
|
|
@@ -402,20 +416,20 @@ import {
|
|
|
402
416
|
recordDaemonHttpRequest,
|
|
403
417
|
recordDaemonHttpResponse,
|
|
404
418
|
withDaemonRequestSpan
|
|
405
|
-
} from "./chunk-
|
|
419
|
+
} from "./chunk-P64HXIC5.js";
|
|
406
420
|
import "./chunk-4WKAA4KS.js";
|
|
407
421
|
import "./chunk-CR3C7WXL.js";
|
|
408
422
|
import "./chunk-VGC4I5JJ.js";
|
|
409
|
-
import "./chunk-
|
|
410
|
-
import "./chunk-
|
|
411
|
-
import "./chunk-
|
|
412
|
-
import "./chunk-
|
|
413
|
-
import "./chunk-
|
|
423
|
+
import "./chunk-JD3MKVKL.js";
|
|
424
|
+
import "./chunk-UEY4AYUL.js";
|
|
425
|
+
import "./chunk-BDBMYST4.js";
|
|
426
|
+
import "./chunk-EZVDJFZ7.js";
|
|
427
|
+
import "./chunk-OP4MOGXF.js";
|
|
414
428
|
import "./chunk-XVNQMZ2I.js";
|
|
415
429
|
import "./chunk-FEOZBUMT.js";
|
|
416
430
|
import "./chunk-DJ2GSRLV.js";
|
|
417
|
-
import "./chunk-
|
|
418
|
-
import "./chunk-
|
|
431
|
+
import "./chunk-6EFTQYW7.js";
|
|
432
|
+
import "./chunk-FZVSFBNW.js";
|
|
419
433
|
import "./chunk-A4UCTEB5.js";
|
|
420
434
|
import "./chunk-XWRJCPHC.js";
|
|
421
435
|
import "./chunk-TYQMGACW.js";
|
|
@@ -428,7 +442,7 @@ import {
|
|
|
428
442
|
Storage,
|
|
429
443
|
createDebugLogger,
|
|
430
444
|
runWithoutDebugLogSession
|
|
431
|
-
} from "./chunk-
|
|
445
|
+
} from "./chunk-C27BYUX6.js";
|
|
432
446
|
import "./chunk-75DOP5OR.js";
|
|
433
447
|
import "./chunk-DMTGGOSA.js";
|
|
434
448
|
import "./chunk-YQ3U5MUC.js";
|
|
@@ -1742,17 +1756,17 @@ var WorkspaceFileSystemImpl = class {
|
|
|
1742
1756
|
* for their `sendFsError` serializer.
|
|
1743
1757
|
*/
|
|
1744
1758
|
recordAndWrap(err, intent, input) {
|
|
1745
|
-
const
|
|
1759
|
+
const fs5 = wrapAsFsError(err);
|
|
1746
1760
|
this.deps.audit.recordDenied(this.deps.ctx, {
|
|
1747
1761
|
intent,
|
|
1748
1762
|
input,
|
|
1749
|
-
errorKind:
|
|
1750
|
-
hint:
|
|
1763
|
+
errorKind: fs5.kind,
|
|
1764
|
+
hint: fs5.hint,
|
|
1751
1765
|
// Quote the underlying OS / FsError message so audit
|
|
1752
1766
|
// consumers debugging a production incident can see the
|
|
1753
1767
|
// actual cause (errno text, byte counts, glob pattern,
|
|
1754
1768
|
// etc.) rather than just `errorKind` + `hint`.
|
|
1755
|
-
message:
|
|
1769
|
+
message: fs5.message,
|
|
1756
1770
|
// For glob denials (parse_error pattern rejection,
|
|
1757
1771
|
// catastrophic walk failures) the input IS the pattern
|
|
1758
1772
|
// already; surfacing it on the dedicated `pattern` field
|
|
@@ -1761,7 +1775,7 @@ var WorkspaceFileSystemImpl = class {
|
|
|
1761
1775
|
// branching on intent.
|
|
1762
1776
|
pattern: intent === "glob" ? input : void 0
|
|
1763
1777
|
});
|
|
1764
|
-
return
|
|
1778
|
+
return fs5;
|
|
1765
1779
|
}
|
|
1766
1780
|
};
|
|
1767
1781
|
var CONTENT_HASH_RE = /^sha256:[0-9a-f]{64}$/;
|
|
@@ -2243,7 +2257,7 @@ async function renameWithRetryLocal(src, dest, retries, delayMs) {
|
|
|
2243
2257
|
const retryable = code === "EPERM" || code === "EACCES";
|
|
2244
2258
|
if (!retryable || attempt === retries) throw err;
|
|
2245
2259
|
await new Promise(
|
|
2246
|
-
(
|
|
2260
|
+
(resolve6) => setTimeout(resolve6, delayMs * 2 ** attempt)
|
|
2247
2261
|
);
|
|
2248
2262
|
}
|
|
2249
2263
|
}
|
|
@@ -2498,12 +2512,12 @@ __name(applyReadHeaders, "applyReadHeaders");
|
|
|
2498
2512
|
function sendFsError(res, err, route) {
|
|
2499
2513
|
applyReadHeaders(res);
|
|
2500
2514
|
if (isFsError(err)) {
|
|
2501
|
-
const
|
|
2502
|
-
res.status(
|
|
2503
|
-
errorKind:
|
|
2504
|
-
error:
|
|
2505
|
-
hint:
|
|
2506
|
-
status:
|
|
2515
|
+
const fs5 = err;
|
|
2516
|
+
res.status(fs5.status).json({
|
|
2517
|
+
errorKind: fs5.kind,
|
|
2518
|
+
error: fs5.message,
|
|
2519
|
+
hint: fs5.hint,
|
|
2520
|
+
status: fs5.status
|
|
2507
2521
|
});
|
|
2508
2522
|
return;
|
|
2509
2523
|
}
|
|
@@ -2605,13 +2619,13 @@ async function handleGetFile(req, res, deps) {
|
|
|
2605
2619
|
});
|
|
2606
2620
|
return;
|
|
2607
2621
|
}
|
|
2608
|
-
const
|
|
2622
|
+
const fs5 = factory.forRequest({
|
|
2609
2623
|
originatorClientId: clientId ?? void 0,
|
|
2610
2624
|
route: ROUTE2
|
|
2611
2625
|
});
|
|
2612
2626
|
try {
|
|
2613
|
-
const resolved = await
|
|
2614
|
-
const out = await
|
|
2627
|
+
const resolved = await fs5.resolve(queryPath, "read");
|
|
2628
|
+
const out = await fs5.readText(resolved, { maxBytes, line, limit });
|
|
2615
2629
|
const returnedBytes = Buffer.byteLength(out.content, "utf-8");
|
|
2616
2630
|
applyReadHeaders(res);
|
|
2617
2631
|
res.status(200).json({
|
|
@@ -2665,13 +2679,13 @@ async function handleGetFileBytes(req, res, deps) {
|
|
|
2665
2679
|
});
|
|
2666
2680
|
return;
|
|
2667
2681
|
}
|
|
2668
|
-
const
|
|
2682
|
+
const fs5 = factory.forRequest({
|
|
2669
2683
|
originatorClientId: clientId ?? void 0,
|
|
2670
2684
|
route: ROUTE2
|
|
2671
2685
|
});
|
|
2672
2686
|
try {
|
|
2673
|
-
const resolved = await
|
|
2674
|
-
const out = await
|
|
2687
|
+
const resolved = await fs5.resolve(queryPath, "read");
|
|
2688
|
+
const out = await fs5.readBytesWindow(resolved, {
|
|
2675
2689
|
offset: offset ?? 0,
|
|
2676
2690
|
maxBytes: maxBytes ?? DEFAULT_FILE_BYTES_MAX_BYTES
|
|
2677
2691
|
});
|
|
@@ -2699,13 +2713,13 @@ async function handleGetStat(req, res, deps) {
|
|
|
2699
2713
|
if (clientId === null) return;
|
|
2700
2714
|
const queryPath = requireStringQuery(res, req.query["path"], "path", ROUTE2);
|
|
2701
2715
|
if (queryPath === null) return;
|
|
2702
|
-
const
|
|
2716
|
+
const fs5 = factory.forRequest({
|
|
2703
2717
|
originatorClientId: clientId ?? void 0,
|
|
2704
2718
|
route: ROUTE2
|
|
2705
2719
|
});
|
|
2706
2720
|
try {
|
|
2707
|
-
const resolved = await
|
|
2708
|
-
const st = await
|
|
2721
|
+
const resolved = await fs5.resolve(queryPath, "stat");
|
|
2722
|
+
const st = await fs5.stat(resolved);
|
|
2709
2723
|
applyReadHeaders(res);
|
|
2710
2724
|
res.status(200).json({
|
|
2711
2725
|
kind: "stat",
|
|
@@ -2728,13 +2742,13 @@ async function handleGetList(req, res, deps) {
|
|
|
2728
2742
|
const queryPath = requireStringQuery(res, req.query["path"], "path", ROUTE2);
|
|
2729
2743
|
if (queryPath === null) return;
|
|
2730
2744
|
const includeIgnored = parseBoolFlag(req.query["includeIgnored"]);
|
|
2731
|
-
const
|
|
2745
|
+
const fs5 = factory.forRequest({
|
|
2732
2746
|
originatorClientId: clientId ?? void 0,
|
|
2733
2747
|
route: ROUTE2
|
|
2734
2748
|
});
|
|
2735
2749
|
try {
|
|
2736
|
-
const resolved = await
|
|
2737
|
-
const entries = await
|
|
2750
|
+
const resolved = await fs5.resolve(queryPath, "list");
|
|
2751
|
+
const entries = await fs5.list(resolved, {
|
|
2738
2752
|
includeIgnored,
|
|
2739
2753
|
maxEntries: MAX_LIST_ENTRIES + 1
|
|
2740
2754
|
});
|
|
@@ -2787,15 +2801,15 @@ async function handleGetGlob(req, res, deps) {
|
|
|
2787
2801
|
}
|
|
2788
2802
|
const cwdRaw = req.query["cwd"];
|
|
2789
2803
|
const cwdString = typeof cwdRaw === "string" && cwdRaw.length > 0 ? cwdRaw : void 0;
|
|
2790
|
-
const
|
|
2804
|
+
const fs5 = factory.forRequest({
|
|
2791
2805
|
originatorClientId: clientId ?? void 0,
|
|
2792
2806
|
route: ROUTE2
|
|
2793
2807
|
});
|
|
2794
2808
|
const start = performance.now();
|
|
2795
2809
|
try {
|
|
2796
|
-
const cwdResolved = cwdString ? await
|
|
2810
|
+
const cwdResolved = cwdString ? await fs5.resolve(cwdString, "list") : void 0;
|
|
2797
2811
|
const cap = maxResults ?? DEFAULT_GLOB_MAX_RESULTS;
|
|
2798
|
-
const probe = await
|
|
2812
|
+
const probe = await fs5.glob(pattern, {
|
|
2799
2813
|
cwd: cwdResolved,
|
|
2800
2814
|
includeIgnored,
|
|
2801
2815
|
maxResults: cap + 1
|
|
@@ -2857,7 +2871,7 @@ function registerWorkspaceFileReadRoutes(app, deps) {
|
|
|
2857
2871
|
}
|
|
2858
2872
|
__name(registerWorkspaceFileReadRoutes, "registerWorkspaceFileReadRoutes");
|
|
2859
2873
|
function registerWorkspaceQualifiedFileReadRoutes(app, deps) {
|
|
2860
|
-
const
|
|
2874
|
+
const resolve6 = /* @__PURE__ */ __name((req, res) => {
|
|
2861
2875
|
const runtime = resolveWorkspaceRuntimeFromParam(
|
|
2862
2876
|
deps.workspaceRegistry,
|
|
2863
2877
|
req,
|
|
@@ -2871,23 +2885,23 @@ function registerWorkspaceQualifiedFileReadRoutes(app, deps) {
|
|
|
2871
2885
|
return true;
|
|
2872
2886
|
}, "resolve");
|
|
2873
2887
|
app.get("/workspaces/:workspace/file", (req, res) => {
|
|
2874
|
-
if (!
|
|
2888
|
+
if (!resolve6(req, res)) return;
|
|
2875
2889
|
void handleGetFile(req, res, deps);
|
|
2876
2890
|
});
|
|
2877
2891
|
app.get("/workspaces/:workspace/file/bytes", (req, res) => {
|
|
2878
|
-
if (!
|
|
2892
|
+
if (!resolve6(req, res)) return;
|
|
2879
2893
|
void handleGetFileBytes(req, res, deps);
|
|
2880
2894
|
});
|
|
2881
2895
|
app.get("/workspaces/:workspace/stat", (req, res) => {
|
|
2882
|
-
if (!
|
|
2896
|
+
if (!resolve6(req, res)) return;
|
|
2883
2897
|
void handleGetStat(req, res, deps);
|
|
2884
2898
|
});
|
|
2885
2899
|
app.get("/workspaces/:workspace/list", (req, res) => {
|
|
2886
|
-
if (!
|
|
2900
|
+
if (!resolve6(req, res)) return;
|
|
2887
2901
|
void handleGetList(req, res, deps);
|
|
2888
2902
|
});
|
|
2889
2903
|
app.get("/workspaces/:workspace/glob", (req, res) => {
|
|
2890
|
-
if (!
|
|
2904
|
+
if (!resolve6(req, res)) return;
|
|
2891
2905
|
void handleGetGlob(req, res, deps);
|
|
2892
2906
|
});
|
|
2893
2907
|
}
|
|
@@ -2969,7 +2983,7 @@ function validateClientId(clientId, deps, res) {
|
|
|
2969
2983
|
}
|
|
2970
2984
|
__name(validateClientId, "validateClientId");
|
|
2971
2985
|
function createSetupGithubFileOps(factory, route, originatorClientId) {
|
|
2972
|
-
const
|
|
2986
|
+
const fs5 = factory.forRequest({
|
|
2973
2987
|
route,
|
|
2974
2988
|
...originatorClientId ? { originatorClientId } : {}
|
|
2975
2989
|
});
|
|
@@ -2992,14 +3006,14 @@ function createSetupGithubFileOps(factory, route, originatorClientId) {
|
|
|
2992
3006
|
]);
|
|
2993
3007
|
},
|
|
2994
3008
|
async writeTextFile(_gitRepoRoot, relativePath, content) {
|
|
2995
|
-
const resolved = await
|
|
2996
|
-
const out = await
|
|
3009
|
+
const resolved = await fs5.resolve(relativePath, "write");
|
|
3010
|
+
const out = await fs5.writeTextOverwrite(resolved, content);
|
|
2997
3011
|
return { sizeBytes: out.sizeBytes };
|
|
2998
3012
|
},
|
|
2999
3013
|
async readTextFile(_gitRepoRoot, relativePath) {
|
|
3000
3014
|
try {
|
|
3001
|
-
const resolved = await
|
|
3002
|
-
const out = await
|
|
3015
|
+
const resolved = await fs5.resolve(relativePath, "read");
|
|
3016
|
+
const out = await fs5.readText(resolved);
|
|
3003
3017
|
return out.content;
|
|
3004
3018
|
} catch (error2) {
|
|
3005
3019
|
if (isFsError(error2) && error2.kind === "path_not_found") {
|
|
@@ -8973,7 +8987,7 @@ var AcpDispatcher = class {
|
|
|
8973
8987
|
);
|
|
8974
8988
|
return;
|
|
8975
8989
|
}
|
|
8976
|
-
const
|
|
8990
|
+
const fs5 = this.fsFactory.forRequest({
|
|
8977
8991
|
originatorClientId: conn.clientId,
|
|
8978
8992
|
route: `ACP ${method}`
|
|
8979
8993
|
});
|
|
@@ -9025,8 +9039,8 @@ var AcpDispatcher = class {
|
|
|
9025
9039
|
);
|
|
9026
9040
|
return;
|
|
9027
9041
|
}
|
|
9028
|
-
const resolved = await
|
|
9029
|
-
const out = await
|
|
9042
|
+
const resolved = await fs5.resolve(p, "read");
|
|
9043
|
+
const out = await fs5.readText(resolved, { maxBytes, line, limit });
|
|
9030
9044
|
this.replyConn(conn, id, {
|
|
9031
9045
|
path: p,
|
|
9032
9046
|
content: out.content,
|
|
@@ -9048,7 +9062,7 @@ var AcpDispatcher = class {
|
|
|
9048
9062
|
conn.sendConn(error(id, RPC.INVALID_PARAMS, "`path` required"));
|
|
9049
9063
|
return;
|
|
9050
9064
|
}
|
|
9051
|
-
const
|
|
9065
|
+
const fs5 = this.fsFactory.forRequest({
|
|
9052
9066
|
originatorClientId: conn.clientId,
|
|
9053
9067
|
route: `ACP ${method}`
|
|
9054
9068
|
});
|
|
@@ -9084,8 +9098,8 @@ var AcpDispatcher = class {
|
|
|
9084
9098
|
);
|
|
9085
9099
|
return;
|
|
9086
9100
|
}
|
|
9087
|
-
const resolved = await
|
|
9088
|
-
const buf = await
|
|
9101
|
+
const resolved = await fs5.resolve(p, "read");
|
|
9102
|
+
const buf = await fs5.readBytesWindow(resolved, { offset, maxBytes });
|
|
9089
9103
|
this.replyConn(conn, id, { path: p, ...buf });
|
|
9090
9104
|
return;
|
|
9091
9105
|
}
|
|
@@ -9103,12 +9117,12 @@ var AcpDispatcher = class {
|
|
|
9103
9117
|
conn.sendConn(error(id, RPC.INVALID_PARAMS, "`path` required"));
|
|
9104
9118
|
return;
|
|
9105
9119
|
}
|
|
9106
|
-
const
|
|
9120
|
+
const fs5 = this.fsFactory.forRequest({
|
|
9107
9121
|
originatorClientId: conn.clientId,
|
|
9108
9122
|
route: `ACP ${method}`
|
|
9109
9123
|
});
|
|
9110
|
-
const resolved = await
|
|
9111
|
-
const result = await
|
|
9124
|
+
const resolved = await fs5.resolve(p, "read");
|
|
9125
|
+
const result = await fs5.stat(resolved);
|
|
9112
9126
|
this.replyConn(conn, id, { path: p, ...result });
|
|
9113
9127
|
return;
|
|
9114
9128
|
}
|
|
@@ -9126,13 +9140,13 @@ var AcpDispatcher = class {
|
|
|
9126
9140
|
conn.sendConn(error(id, RPC.INVALID_PARAMS, "`path` required"));
|
|
9127
9141
|
return;
|
|
9128
9142
|
}
|
|
9129
|
-
const
|
|
9143
|
+
const fs5 = this.fsFactory.forRequest({
|
|
9130
9144
|
originatorClientId: conn.clientId,
|
|
9131
9145
|
route: `ACP ${method}`
|
|
9132
9146
|
});
|
|
9133
|
-
const resolved = await
|
|
9147
|
+
const resolved = await fs5.resolve(p, "read");
|
|
9134
9148
|
const MAX_LIST = 2e3;
|
|
9135
|
-
const entries = await
|
|
9149
|
+
const entries = await fs5.list(resolved, { maxEntries: MAX_LIST + 1 });
|
|
9136
9150
|
const truncated = entries.length > MAX_LIST;
|
|
9137
9151
|
this.replyConn(conn, id, {
|
|
9138
9152
|
path: p,
|
|
@@ -9157,7 +9171,7 @@ var AcpDispatcher = class {
|
|
|
9157
9171
|
);
|
|
9158
9172
|
return;
|
|
9159
9173
|
}
|
|
9160
|
-
const
|
|
9174
|
+
const fs5 = this.fsFactory.forRequest({
|
|
9161
9175
|
originatorClientId: conn.clientId,
|
|
9162
9176
|
route: `ACP ${method}`
|
|
9163
9177
|
});
|
|
@@ -9177,7 +9191,7 @@ var AcpDispatcher = class {
|
|
|
9177
9191
|
);
|
|
9178
9192
|
return;
|
|
9179
9193
|
}
|
|
9180
|
-
const matches = await
|
|
9194
|
+
const matches = await fs5.glob(pattern, {
|
|
9181
9195
|
maxResults: maxResults + 1
|
|
9182
9196
|
});
|
|
9183
9197
|
const truncated = matches.length > maxResults;
|
|
@@ -9209,11 +9223,11 @@ var AcpDispatcher = class {
|
|
|
9209
9223
|
);
|
|
9210
9224
|
return;
|
|
9211
9225
|
}
|
|
9212
|
-
const
|
|
9226
|
+
const fs5 = this.fsFactory.forRequest({
|
|
9213
9227
|
originatorClientId: conn.clientId,
|
|
9214
9228
|
route: `ACP ${method}`
|
|
9215
9229
|
});
|
|
9216
|
-
const resolved = await
|
|
9230
|
+
const resolved = await fs5.resolve(p, "write");
|
|
9217
9231
|
if (Buffer.byteLength(params["content"], "utf8") > 10 * 1024 * 1024) {
|
|
9218
9232
|
if (id !== void 0)
|
|
9219
9233
|
conn.sendConn(
|
|
@@ -9221,7 +9235,7 @@ var AcpDispatcher = class {
|
|
|
9221
9235
|
);
|
|
9222
9236
|
return;
|
|
9223
9237
|
}
|
|
9224
|
-
await
|
|
9238
|
+
await fs5.writeTextOverwrite(resolved, params["content"]);
|
|
9225
9239
|
this.replyConn(conn, id, { ok: true, path: p });
|
|
9226
9240
|
return;
|
|
9227
9241
|
}
|
|
@@ -9250,12 +9264,12 @@ var AcpDispatcher = class {
|
|
|
9250
9264
|
);
|
|
9251
9265
|
return;
|
|
9252
9266
|
}
|
|
9253
|
-
const
|
|
9267
|
+
const fs5 = this.fsFactory.forRequest({
|
|
9254
9268
|
originatorClientId: conn.clientId,
|
|
9255
9269
|
route: `ACP ${method}`
|
|
9256
9270
|
});
|
|
9257
|
-
const resolved = await
|
|
9258
|
-
const result = await
|
|
9271
|
+
const resolved = await fs5.resolve(p, "write");
|
|
9272
|
+
const result = await fs5.edit(
|
|
9259
9273
|
resolved,
|
|
9260
9274
|
params["oldText"],
|
|
9261
9275
|
params["newText"]
|
|
@@ -10798,9 +10812,9 @@ var SseStream = class {
|
|
|
10798
10812
|
return next;
|
|
10799
10813
|
}
|
|
10800
10814
|
doWrite(chunk) {
|
|
10801
|
-
return new Promise((
|
|
10815
|
+
return new Promise((resolve6, reject) => {
|
|
10802
10816
|
if (this.closed || this.res.writableEnded) {
|
|
10803
|
-
|
|
10817
|
+
resolve6();
|
|
10804
10818
|
return;
|
|
10805
10819
|
}
|
|
10806
10820
|
let ok;
|
|
@@ -10811,7 +10825,7 @@ var SseStream = class {
|
|
|
10811
10825
|
return;
|
|
10812
10826
|
}
|
|
10813
10827
|
if (ok) {
|
|
10814
|
-
|
|
10828
|
+
resolve6();
|
|
10815
10829
|
return;
|
|
10816
10830
|
}
|
|
10817
10831
|
const cleanup = /* @__PURE__ */ __name(() => {
|
|
@@ -10821,11 +10835,11 @@ var SseStream = class {
|
|
|
10821
10835
|
}, "cleanup");
|
|
10822
10836
|
const onDrain = /* @__PURE__ */ __name(() => {
|
|
10823
10837
|
cleanup();
|
|
10824
|
-
|
|
10838
|
+
resolve6();
|
|
10825
10839
|
}, "onDrain");
|
|
10826
10840
|
const onCloseEv = /* @__PURE__ */ __name(() => {
|
|
10827
10841
|
cleanup();
|
|
10828
|
-
|
|
10842
|
+
resolve6();
|
|
10829
10843
|
}, "onCloseEv");
|
|
10830
10844
|
const onErrorEv = /* @__PURE__ */ __name((err) => {
|
|
10831
10845
|
cleanup();
|
|
@@ -10887,14 +10901,14 @@ var WsStream = class {
|
|
|
10887
10901
|
send(message, _id) {
|
|
10888
10902
|
const data = JSON.stringify(message);
|
|
10889
10903
|
const next = this.writeChain.then(
|
|
10890
|
-
() => new Promise((
|
|
10904
|
+
() => new Promise((resolve6, reject) => {
|
|
10891
10905
|
if (this._closed) {
|
|
10892
|
-
|
|
10906
|
+
resolve6();
|
|
10893
10907
|
return;
|
|
10894
10908
|
}
|
|
10895
10909
|
this.ws.send(data, (err) => {
|
|
10896
10910
|
if (err) reject(err);
|
|
10897
|
-
else
|
|
10911
|
+
else resolve6();
|
|
10898
10912
|
});
|
|
10899
10913
|
})
|
|
10900
10914
|
);
|
|
@@ -11199,7 +11213,7 @@ var CdpReverseLink = class {
|
|
|
11199
11213
|
throw { code: -32e3, message: "CDP tunnel closed" };
|
|
11200
11214
|
}
|
|
11201
11215
|
await this.attach();
|
|
11202
|
-
return new Promise((
|
|
11216
|
+
return new Promise((resolve6, reject) => {
|
|
11203
11217
|
if (this.disposed) {
|
|
11204
11218
|
reject({ code: -32e3, message: "CDP tunnel closed" });
|
|
11205
11219
|
return;
|
|
@@ -11210,7 +11224,7 @@ var CdpReverseLink = class {
|
|
|
11210
11224
|
`CDP command id=${id} method=${method} timed out after ${this.commandTimeoutMs}ms`
|
|
11211
11225
|
);
|
|
11212
11226
|
const progressTimer = this.armProgressLog(id, method);
|
|
11213
|
-
this.pending.set(id, { resolve:
|
|
11227
|
+
this.pending.set(id, { resolve: resolve6, reject, timer, progressTimer });
|
|
11214
11228
|
try {
|
|
11215
11229
|
this.log?.(
|
|
11216
11230
|
`qwen serve: /cdp forwarded command id=${id} method=${method} to extension`
|
|
@@ -11237,7 +11251,7 @@ var CdpReverseLink = class {
|
|
|
11237
11251
|
if (this.attached) return Promise.resolve({});
|
|
11238
11252
|
if (this.attachPromise) return this.attachPromise;
|
|
11239
11253
|
this.attachPromise = new Promise(
|
|
11240
|
-
(
|
|
11254
|
+
(resolve6, reject) => {
|
|
11241
11255
|
if (this.disposed) {
|
|
11242
11256
|
reject({ code: -32e3, message: "CDP tunnel closed" });
|
|
11243
11257
|
return;
|
|
@@ -11247,7 +11261,7 @@ var CdpReverseLink = class {
|
|
|
11247
11261
|
this.pendingAttach = {
|
|
11248
11262
|
id,
|
|
11249
11263
|
pending: {
|
|
11250
|
-
resolve: /* @__PURE__ */ __name((result) =>
|
|
11264
|
+
resolve: /* @__PURE__ */ __name((result) => resolve6(result ?? {}), "resolve"),
|
|
11251
11265
|
reject,
|
|
11252
11266
|
timer
|
|
11253
11267
|
}
|
|
@@ -11815,7 +11829,7 @@ function isAcpChannelUnavailable(err) {
|
|
|
11815
11829
|
}
|
|
11816
11830
|
__name(isAcpChannelUnavailable, "isAcpChannelUnavailable");
|
|
11817
11831
|
function delay(ms) {
|
|
11818
|
-
return new Promise((
|
|
11832
|
+
return new Promise((resolve6) => setTimeout(resolve6, ms));
|
|
11819
11833
|
}
|
|
11820
11834
|
__name(delay, "delay");
|
|
11821
11835
|
function buildChromeDevToolsMcpRuntimeConfig(localPort, hostname, env) {
|
|
@@ -11940,7 +11954,7 @@ function mountAcpHttp(app, bridge, opts) {
|
|
|
11940
11954
|
if (!enabled) return void 0;
|
|
11941
11955
|
const daemonEnv = opts.daemonEnv ?? process.env;
|
|
11942
11956
|
const primaryEnv = opts.workspaceRegistry ? runtimeEffectiveEnv(opts.workspaceRegistry.primary, daemonEnv) : daemonEnv;
|
|
11943
|
-
const
|
|
11957
|
+
const path16 = opts.path ?? "/acp";
|
|
11944
11958
|
const dispatcherRef = {};
|
|
11945
11959
|
let disposed = false;
|
|
11946
11960
|
const rejectIfDisposed = /* @__PURE__ */ __name((res) => {
|
|
@@ -12102,7 +12116,7 @@ function mountAcpHttp(app, bridge, opts) {
|
|
|
12102
12116
|
const primaryMount = {
|
|
12103
12117
|
primary: true,
|
|
12104
12118
|
workspaceCwd: opts.boundWorkspace,
|
|
12105
|
-
routeLabel: logSafe(
|
|
12119
|
+
routeLabel: logSafe(path16),
|
|
12106
12120
|
rateLimitScope: opts.workspaceRegistry?.primary.workspaceId ?? "primary",
|
|
12107
12121
|
registry,
|
|
12108
12122
|
dispatcher,
|
|
@@ -12256,7 +12270,7 @@ function mountAcpHttp(app, bridge, opts) {
|
|
|
12256
12270
|
});
|
|
12257
12271
|
}, "handleAcpPost");
|
|
12258
12272
|
app.post(
|
|
12259
|
-
|
|
12273
|
+
path16,
|
|
12260
12274
|
(req, res) => handleAcpPost(primaryMount, req, res)
|
|
12261
12275
|
);
|
|
12262
12276
|
const handleAcpGet = /* @__PURE__ */ __name((mount, req, res) => {
|
|
@@ -12346,10 +12360,10 @@ function mountAcpHttp(app, bridge, opts) {
|
|
|
12346
12360
|
onPumpSettled();
|
|
12347
12361
|
});
|
|
12348
12362
|
}, "handleAcpGet");
|
|
12349
|
-
app.get(
|
|
12363
|
+
app.get(path16, (req, res) => {
|
|
12350
12364
|
handleAcpGet(primaryMount, req, res);
|
|
12351
12365
|
});
|
|
12352
|
-
app.delete(
|
|
12366
|
+
app.delete(path16, (req, res) => {
|
|
12353
12367
|
handleAcpDelete(primaryMount, req, res);
|
|
12354
12368
|
});
|
|
12355
12369
|
const createSecondaryAcpMount = /* @__PURE__ */ __name((rt) => {
|
|
@@ -12541,7 +12555,7 @@ function mountAcpHttp(app, bridge, opts) {
|
|
|
12541
12555
|
const isPluralAcpShape = pluralRawSelector !== null;
|
|
12542
12556
|
const pluralVoiceRawSelector = opts.workspaceVoiceConnection ? pluralWorkspaceRawSelector(rawPath, PLURAL_VOICE_WS_SUFFIX) : null;
|
|
12543
12557
|
const isPluralVoiceShape = pluralVoiceRawSelector !== null;
|
|
12544
|
-
if (rawPath !==
|
|
12558
|
+
if (rawPath !== path16 && !isCdpPath && !extraRoute && !isPluralAcpShape && !isPluralVoiceShape) {
|
|
12545
12559
|
logReject(`unknown-path ${logSafe(rawPath)}`);
|
|
12546
12560
|
socket.destroy();
|
|
12547
12561
|
return;
|
|
@@ -13066,7 +13080,7 @@ function mountAcpHttp(app, bridge, opts) {
|
|
|
13066
13080
|
});
|
|
13067
13081
|
}, "upgradeListener");
|
|
13068
13082
|
httpServer.on("upgrade", upgradeListener);
|
|
13069
|
-
writeStderrLine(`qwen serve: /acp WebSocket transport enabled on ${
|
|
13083
|
+
writeStderrLine(`qwen serve: /acp WebSocket transport enabled on ${path16}`);
|
|
13070
13084
|
}
|
|
13071
13085
|
__name(setupWebSocket, "setupWebSocket");
|
|
13072
13086
|
return {
|
|
@@ -15105,7 +15119,7 @@ function createFifoTaskQueue(limit) {
|
|
|
15105
15119
|
Promise.resolve().then(() => item.task(release)).then(item.resolve, item.reject).finally(release);
|
|
15106
15120
|
}
|
|
15107
15121
|
}, "pump");
|
|
15108
|
-
const enqueue = /* @__PURE__ */ __name((task, options = {}) => new Promise((
|
|
15122
|
+
const enqueue = /* @__PURE__ */ __name((task, options = {}) => new Promise((resolve6, reject) => {
|
|
15109
15123
|
if (options.signal?.aborted) {
|
|
15110
15124
|
reject(abortReason(options.signal));
|
|
15111
15125
|
return;
|
|
@@ -15114,7 +15128,7 @@ function createFifoTaskQueue(limit) {
|
|
|
15114
15128
|
task,
|
|
15115
15129
|
...options.signal ? { signal: options.signal } : {},
|
|
15116
15130
|
...options.onStart ? { onStart: options.onStart } : {},
|
|
15117
|
-
resolve:
|
|
15131
|
+
resolve: resolve6,
|
|
15118
15132
|
reject
|
|
15119
15133
|
};
|
|
15120
15134
|
if (options.signal) {
|
|
@@ -15156,6 +15170,14 @@ var redactExtensionDisplaySource = /* @__PURE__ */ __name((source) => {
|
|
|
15156
15170
|
var EXTENSION_PREPARATION_CONCURRENCY = 2;
|
|
15157
15171
|
var EXTENSION_REFRESH_TIMEOUT_MS = 3e4;
|
|
15158
15172
|
var RECONCILE_SLOW_MS = 3e4;
|
|
15173
|
+
var resolveExtensionLocale = /* @__PURE__ */ __name((workspaceDir) => {
|
|
15174
|
+
const configuredLanguage = loadSettings(workspaceDir).merged.general?.language;
|
|
15175
|
+
const requestedLocale = resolveLanguageSetting(configuredLanguage);
|
|
15176
|
+
if (requestedLocale === "auto") {
|
|
15177
|
+
return detectSystemLanguage();
|
|
15178
|
+
}
|
|
15179
|
+
return resolveSupportedLanguage(requestedLocale) ?? requestedLocale;
|
|
15180
|
+
}, "resolveExtensionLocale");
|
|
15159
15181
|
var EXTENSION_QUEUE_FULL_MESSAGE = "Extension operation queue is full";
|
|
15160
15182
|
function createExtensionsController(deps) {
|
|
15161
15183
|
const { boundWorkspace, bridge, workspace } = deps;
|
|
@@ -15183,6 +15205,7 @@ function createExtensionsController(deps) {
|
|
|
15183
15205
|
}, "acquireOperationSlot");
|
|
15184
15206
|
const createExtensionManager = /* @__PURE__ */ __name((workspaceDir = boundWorkspace, trustedOverride, interactions) => new ExtensionManager({
|
|
15185
15207
|
workspaceDir,
|
|
15208
|
+
locale: resolveExtensionLocale(workspaceDir),
|
|
15186
15209
|
isWorkspaceTrusted: trustedOverride ?? getWorkspaceTrustStatus(loadSettings(workspaceDir).merged, workspaceDir).effective.state === "trusted",
|
|
15187
15210
|
requestConsent: /* @__PURE__ */ __name(() => Promise.resolve(), "requestConsent"),
|
|
15188
15211
|
networkPolicy: "public",
|
|
@@ -15710,8 +15733,9 @@ function createExtensionsController(deps) {
|
|
|
15710
15733
|
})();
|
|
15711
15734
|
}, "runQueuedExtensionMutation");
|
|
15712
15735
|
const buildLocalExtensionsStatus = /* @__PURE__ */ __name(async () => {
|
|
15736
|
+
const locale = resolveExtensionLocale(boundWorkspace);
|
|
15713
15737
|
const now = Date.now();
|
|
15714
|
-
if (extensionsStatusCache && extensionsStatusCache.expiresAt > now) {
|
|
15738
|
+
if (extensionsStatusCache?.locale === locale && extensionsStatusCache.expiresAt > now) {
|
|
15715
15739
|
return extensionsStatusCache.value;
|
|
15716
15740
|
}
|
|
15717
15741
|
const extensionManager = createExtensionManager();
|
|
@@ -15767,6 +15791,7 @@ function createExtensionsController(deps) {
|
|
|
15767
15791
|
extensions: entries
|
|
15768
15792
|
};
|
|
15769
15793
|
extensionsStatusCache = {
|
|
15794
|
+
locale,
|
|
15770
15795
|
expiresAt: Date.now() + 2e3,
|
|
15771
15796
|
value: status
|
|
15772
15797
|
};
|
|
@@ -15935,7 +15960,7 @@ function registerWorkspaceExtensionRoutes(app, deps) {
|
|
|
15935
15960
|
...interaction,
|
|
15936
15961
|
id: crypto2.randomUUID()
|
|
15937
15962
|
};
|
|
15938
|
-
return new Promise((
|
|
15963
|
+
return new Promise((resolve6, reject) => {
|
|
15939
15964
|
const timeout = setTimeout(() => {
|
|
15940
15965
|
pendingExtensionInteractions.delete(operationId);
|
|
15941
15966
|
controller.updateOperation(operationId, {
|
|
@@ -15949,7 +15974,7 @@ function registerWorkspaceExtensionRoutes(app, deps) {
|
|
|
15949
15974
|
timeout.unref?.();
|
|
15950
15975
|
pendingExtensionInteractions.set(operationId, {
|
|
15951
15976
|
interaction: pendingInteraction,
|
|
15952
|
-
resolve:
|
|
15977
|
+
resolve: resolve6,
|
|
15953
15978
|
reject,
|
|
15954
15979
|
timeout
|
|
15955
15980
|
});
|
|
@@ -15994,8 +16019,8 @@ function registerWorkspaceExtensionRoutes(app, deps) {
|
|
|
15994
16019
|
const reserveRuntimeReconciliation = /* @__PURE__ */ __name(() => {
|
|
15995
16020
|
let provideTask;
|
|
15996
16021
|
const task = new Promise(
|
|
15997
|
-
(
|
|
15998
|
-
provideTask =
|
|
16022
|
+
(resolve6) => {
|
|
16023
|
+
provideTask = resolve6;
|
|
15999
16024
|
}
|
|
16000
16025
|
);
|
|
16001
16026
|
const queued = runtimeReconciliationQueue.run(async () => {
|
|
@@ -16096,9 +16121,9 @@ function registerWorkspaceExtensionRoutes(app, deps) {
|
|
|
16096
16121
|
generationPoller.unref();
|
|
16097
16122
|
app.locals.stopExtensionGenerationReconciler = () => clearInterval(generationPoller);
|
|
16098
16123
|
}
|
|
16099
|
-
const registerFor = /* @__PURE__ */ __name((base,
|
|
16124
|
+
const registerFor = /* @__PURE__ */ __name((base, resolve6) => {
|
|
16100
16125
|
app.get(base, async (req, res) => {
|
|
16101
|
-
const ctrl =
|
|
16126
|
+
const ctrl = resolve6(req, res, false);
|
|
16102
16127
|
if (!ctrl) return;
|
|
16103
16128
|
try {
|
|
16104
16129
|
res.status(200).json(await ctrl.buildLocalExtensionsStatus());
|
|
@@ -16107,12 +16132,12 @@ function registerWorkspaceExtensionRoutes(app, deps) {
|
|
|
16107
16132
|
}
|
|
16108
16133
|
});
|
|
16109
16134
|
app.get(`${base}/operations`, async (req, res) => {
|
|
16110
|
-
const ctrl =
|
|
16135
|
+
const ctrl = resolve6(req, res, false);
|
|
16111
16136
|
if (!ctrl) return;
|
|
16112
16137
|
res.status(200).json({ v: 1, operations: ctrl.getActiveOperations() });
|
|
16113
16138
|
});
|
|
16114
16139
|
app.get(`${base}/operations/:operationId`, async (req, res) => {
|
|
16115
|
-
const ctrl =
|
|
16140
|
+
const ctrl = resolve6(req, res, false);
|
|
16116
16141
|
if (!ctrl) return;
|
|
16117
16142
|
try {
|
|
16118
16143
|
const operationId = req.params["operationId"];
|
|
@@ -16156,7 +16181,7 @@ function registerWorkspaceExtensionRoutes(app, deps) {
|
|
|
16156
16181
|
`${base}/operations/:operationId/interactions/:interactionId`,
|
|
16157
16182
|
mutate({ strict: true }),
|
|
16158
16183
|
async (req, res) => {
|
|
16159
|
-
const ctrl =
|
|
16184
|
+
const ctrl = resolve6(req, res, false);
|
|
16160
16185
|
if (!ctrl) return;
|
|
16161
16186
|
try {
|
|
16162
16187
|
if (!ctrl.validateExtensionMutationClient(req, res, {
|
|
@@ -16225,7 +16250,7 @@ function registerWorkspaceExtensionRoutes(app, deps) {
|
|
|
16225
16250
|
}
|
|
16226
16251
|
);
|
|
16227
16252
|
app.post(`${base}/install`, mutate({ strict: true }), async (req, res) => {
|
|
16228
|
-
const ctrl =
|
|
16253
|
+
const ctrl = resolve6(req, res, true);
|
|
16229
16254
|
if (!ctrl) return;
|
|
16230
16255
|
try {
|
|
16231
16256
|
if (!ctrl.validateExtensionMutationClient(req, res, {
|
|
@@ -16408,7 +16433,7 @@ function registerWorkspaceExtensionRoutes(app, deps) {
|
|
|
16408
16433
|
`${base}/check-updates`,
|
|
16409
16434
|
mutate({ strict: true }),
|
|
16410
16435
|
async (req, res) => {
|
|
16411
|
-
const ctrl =
|
|
16436
|
+
const ctrl = resolve6(req, res, true);
|
|
16412
16437
|
if (!ctrl) return;
|
|
16413
16438
|
let timer;
|
|
16414
16439
|
let releaseOperationSlot;
|
|
@@ -16472,7 +16497,7 @@ function registerWorkspaceExtensionRoutes(app, deps) {
|
|
|
16472
16497
|
}
|
|
16473
16498
|
);
|
|
16474
16499
|
app.post(`${base}/refresh`, mutate({ strict: true }), async (req, res) => {
|
|
16475
|
-
const ctrl =
|
|
16500
|
+
const ctrl = resolve6(req, res, true);
|
|
16476
16501
|
if (!ctrl) return;
|
|
16477
16502
|
try {
|
|
16478
16503
|
if (!ctrl.validateExtensionMutationClient(req, res, {
|
|
@@ -16496,7 +16521,7 @@ function registerWorkspaceExtensionRoutes(app, deps) {
|
|
|
16496
16521
|
`${base}/:name/enable`,
|
|
16497
16522
|
mutate({ strict: true }),
|
|
16498
16523
|
async (req, res) => {
|
|
16499
|
-
const ctrl =
|
|
16524
|
+
const ctrl = resolve6(req, res, true);
|
|
16500
16525
|
if (!ctrl) return;
|
|
16501
16526
|
try {
|
|
16502
16527
|
if (!ctrl.validateExtensionMutationClient(req, res, {
|
|
@@ -16543,7 +16568,7 @@ function registerWorkspaceExtensionRoutes(app, deps) {
|
|
|
16543
16568
|
`${base}/:name/disable`,
|
|
16544
16569
|
mutate({ strict: true }),
|
|
16545
16570
|
async (req, res) => {
|
|
16546
|
-
const ctrl =
|
|
16571
|
+
const ctrl = resolve6(req, res, true);
|
|
16547
16572
|
if (!ctrl) return;
|
|
16548
16573
|
try {
|
|
16549
16574
|
if (!ctrl.validateExtensionMutationClient(req, res, {
|
|
@@ -16590,7 +16615,7 @@ function registerWorkspaceExtensionRoutes(app, deps) {
|
|
|
16590
16615
|
`${base}/:name/update`,
|
|
16591
16616
|
mutate({ strict: true }),
|
|
16592
16617
|
async (req, res) => {
|
|
16593
|
-
const ctrl =
|
|
16618
|
+
const ctrl = resolve6(req, res, true);
|
|
16594
16619
|
if (!ctrl) return;
|
|
16595
16620
|
try {
|
|
16596
16621
|
if (!ctrl.validateExtensionMutationClient(req, res, {
|
|
@@ -16673,7 +16698,7 @@ function registerWorkspaceExtensionRoutes(app, deps) {
|
|
|
16673
16698
|
}
|
|
16674
16699
|
);
|
|
16675
16700
|
app.delete(`${base}/:name`, mutate({ strict: true }), async (req, res) => {
|
|
16676
|
-
const ctrl =
|
|
16701
|
+
const ctrl = resolve6(req, res, true);
|
|
16677
16702
|
if (!ctrl) return;
|
|
16678
16703
|
try {
|
|
16679
16704
|
if (!ctrl.validateExtensionMutationClient(req, res, {
|
|
@@ -17435,13 +17460,13 @@ async function handlePostFileWrite(req, res, deps) {
|
|
|
17435
17460
|
req
|
|
17436
17461
|
);
|
|
17437
17462
|
if (originatorClientId === null) return;
|
|
17438
|
-
const
|
|
17463
|
+
const fs5 = factory.forRequest({
|
|
17439
17464
|
originatorClientId,
|
|
17440
17465
|
route: ROUTE2
|
|
17441
17466
|
});
|
|
17442
17467
|
try {
|
|
17443
|
-
const resolved = await
|
|
17444
|
-
const out = await
|
|
17468
|
+
const resolved = await fs5.resolve(queryPath, "write");
|
|
17469
|
+
const out = await fs5.writeTextAtomic(resolved, content, {
|
|
17445
17470
|
mode,
|
|
17446
17471
|
...expectedHash ? { expectedHash } : {},
|
|
17447
17472
|
...bom !== void 0 ? { bom } : {},
|
|
@@ -17494,13 +17519,13 @@ async function handlePostFileEdit(req, res, deps) {
|
|
|
17494
17519
|
req
|
|
17495
17520
|
);
|
|
17496
17521
|
if (originatorClientId === null) return;
|
|
17497
|
-
const
|
|
17522
|
+
const fs5 = factory.forRequest({
|
|
17498
17523
|
originatorClientId,
|
|
17499
17524
|
route: ROUTE2
|
|
17500
17525
|
});
|
|
17501
17526
|
try {
|
|
17502
|
-
const resolved = await
|
|
17503
|
-
const out = await
|
|
17527
|
+
const resolved = await fs5.resolve(queryPath, "edit");
|
|
17528
|
+
const out = await fs5.editAtomic(resolved, oldText, newText, {
|
|
17504
17529
|
expectedHash
|
|
17505
17530
|
});
|
|
17506
17531
|
applyReadHeaders(res);
|
|
@@ -17534,7 +17559,7 @@ function registerWorkspaceFileWriteRoutes(app, deps) {
|
|
|
17534
17559
|
}
|
|
17535
17560
|
__name(registerWorkspaceFileWriteRoutes, "registerWorkspaceFileWriteRoutes");
|
|
17536
17561
|
function registerWorkspaceQualifiedFileWriteRoutes(app, deps) {
|
|
17537
|
-
const
|
|
17562
|
+
const resolve6 = /* @__PURE__ */ __name((req, res) => {
|
|
17538
17563
|
const runtime = resolveWorkspaceRuntimeFromParam(
|
|
17539
17564
|
deps.workspaceRegistry,
|
|
17540
17565
|
req,
|
|
@@ -17552,7 +17577,7 @@ function registerWorkspaceQualifiedFileWriteRoutes(app, deps) {
|
|
|
17552
17577
|
"/workspaces/:workspace/file/write",
|
|
17553
17578
|
deps.mutate({ strict: true }),
|
|
17554
17579
|
(req, res) => {
|
|
17555
|
-
if (!
|
|
17580
|
+
if (!resolve6(req, res)) return;
|
|
17556
17581
|
void handlePostFileWrite(req, res, deps);
|
|
17557
17582
|
}
|
|
17558
17583
|
);
|
|
@@ -17560,7 +17585,7 @@ function registerWorkspaceQualifiedFileWriteRoutes(app, deps) {
|
|
|
17560
17585
|
"/workspaces/:workspace/file/edit",
|
|
17561
17586
|
deps.mutate({ strict: true }),
|
|
17562
17587
|
(req, res) => {
|
|
17563
|
-
if (!
|
|
17588
|
+
if (!resolve6(req, res)) return;
|
|
17564
17589
|
void handlePostFileEdit(req, res, deps);
|
|
17565
17590
|
}
|
|
17566
17591
|
);
|
|
@@ -18043,8 +18068,8 @@ function decodePathSegment(value) {
|
|
|
18043
18068
|
}
|
|
18044
18069
|
__name(decodePathSegment, "decodePathSegment");
|
|
18045
18070
|
function matchLegacySessionTelemetryRoute(method, requestPath) {
|
|
18046
|
-
const
|
|
18047
|
-
const requestSegments =
|
|
18071
|
+
const path16 = requestPath.length > 1 && requestPath.endsWith("/") ? requestPath.slice(0, -1) : requestPath;
|
|
18072
|
+
const requestSegments = path16.split("/").slice(1);
|
|
18048
18073
|
const prefix = requestSegments[0]?.toLowerCase();
|
|
18049
18074
|
if (prefix !== "session" && prefix !== "sessions" && prefix !== "permission") {
|
|
18050
18075
|
return void 0;
|
|
@@ -18096,23 +18121,23 @@ __name(setDaemonTelemetryWorkspace, "setDaemonTelemetryWorkspace");
|
|
|
18096
18121
|
function resolveDaemonTelemetryRoute(req) {
|
|
18097
18122
|
const legacyRoute = matchLegacySessionTelemetryRoute(req.method, req.path);
|
|
18098
18123
|
if (legacyRoute) return legacyRoute;
|
|
18099
|
-
const
|
|
18100
|
-
if (req.method === "GET" &&
|
|
18124
|
+
const path16 = req.path.replace(/\/$/, "") || "/";
|
|
18125
|
+
if (req.method === "GET" && path16 === "/daemon/status") {
|
|
18101
18126
|
return { route: "GET /daemon/status" };
|
|
18102
18127
|
}
|
|
18103
|
-
if (req.method === "GET" && /^\/workspace\/[^/]+\/sessions$/.test(
|
|
18128
|
+
if (req.method === "GET" && /^\/workspace\/[^/]+\/sessions$/.test(path16)) {
|
|
18104
18129
|
return { route: "GET /workspace/:id/sessions" };
|
|
18105
18130
|
}
|
|
18106
|
-
if (req.method === "GET" && /^\/workspaces\/[^/]+\/sessions$/.test(
|
|
18131
|
+
if (req.method === "GET" && /^\/workspaces\/[^/]+\/sessions$/.test(path16)) {
|
|
18107
18132
|
return { route: "GET /workspace/:id/sessions" };
|
|
18108
18133
|
}
|
|
18109
|
-
if (req.method === "GET" && /^\/workspace\/[^/]+\/session-info$/.test(
|
|
18134
|
+
if (req.method === "GET" && /^\/workspace\/[^/]+\/session-info$/.test(path16)) {
|
|
18110
18135
|
return { route: "GET /workspace/:id/session-info" };
|
|
18111
18136
|
}
|
|
18112
|
-
if (req.method === "GET" && /^\/workspaces\/[^/]+\/session-info$/.test(
|
|
18137
|
+
if (req.method === "GET" && /^\/workspaces\/[^/]+\/session-info$/.test(path16)) {
|
|
18113
18138
|
return { route: "GET /workspace/:id/session-info" };
|
|
18114
18139
|
}
|
|
18115
|
-
const workspaceTranscript =
|
|
18140
|
+
const workspaceTranscript = path16.match(
|
|
18116
18141
|
/^\/workspaces\/[^/]+\/session\/([^/]+)\/transcript$/
|
|
18117
18142
|
);
|
|
18118
18143
|
if (workspaceTranscript?.[1] && req.method === "GET") {
|
|
@@ -18121,7 +18146,7 @@ function resolveDaemonTelemetryRoute(req) {
|
|
|
18121
18146
|
sessionId: decodePathSegment(workspaceTranscript[1])
|
|
18122
18147
|
};
|
|
18123
18148
|
}
|
|
18124
|
-
const workspaceExport =
|
|
18149
|
+
const workspaceExport = path16.match(
|
|
18125
18150
|
/^\/workspaces\/[^/]+\/session\/([^/]+)\/export$/
|
|
18126
18151
|
);
|
|
18127
18152
|
if (workspaceExport?.[1] && req.method === "GET") {
|
|
@@ -18130,7 +18155,7 @@ function resolveDaemonTelemetryRoute(req) {
|
|
|
18130
18155
|
sessionId: decodePathSegment(workspaceExport[1])
|
|
18131
18156
|
};
|
|
18132
18157
|
}
|
|
18133
|
-
const workspaceArchivedExport =
|
|
18158
|
+
const workspaceArchivedExport = path16.match(
|
|
18134
18159
|
/^\/workspaces\/[^/]+\/session\/([^/]+)\/archive\/export$/
|
|
18135
18160
|
);
|
|
18136
18161
|
if (workspaceArchivedExport?.[1] && req.method === "GET") {
|
|
@@ -18140,8 +18165,8 @@ function resolveDaemonTelemetryRoute(req) {
|
|
|
18140
18165
|
};
|
|
18141
18166
|
}
|
|
18142
18167
|
const pluralWorkspacePrefix = /^\/workspaces\/[^/]+/;
|
|
18143
|
-
if (pluralWorkspacePrefix.test(
|
|
18144
|
-
const suffix =
|
|
18168
|
+
if (pluralWorkspacePrefix.test(path16)) {
|
|
18169
|
+
const suffix = path16.replace(pluralWorkspacePrefix, "/workspace");
|
|
18145
18170
|
if (req.method === "GET") {
|
|
18146
18171
|
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") {
|
|
18147
18172
|
return { route: `GET ${suffix}` };
|
|
@@ -18200,58 +18225,58 @@ function resolveDaemonTelemetryRoute(req) {
|
|
|
18200
18225
|
return { route: "DELETE /workspace/session-groups/:groupId" };
|
|
18201
18226
|
}
|
|
18202
18227
|
}
|
|
18203
|
-
if (req.method === "POST" &&
|
|
18228
|
+
if (req.method === "POST" && path16 === "/workspace/init") {
|
|
18204
18229
|
return { route: "POST /workspace/init" };
|
|
18205
18230
|
}
|
|
18206
|
-
if (req.method === "POST" &&
|
|
18231
|
+
if (req.method === "POST" && path16 === "/workspace/setup-github") {
|
|
18207
18232
|
return { route: "POST /workspace/setup-github" };
|
|
18208
18233
|
}
|
|
18209
|
-
if (req.method === "POST" &&
|
|
18234
|
+
if (req.method === "POST" && path16 === "/workspace/reload") {
|
|
18210
18235
|
return { route: "POST /workspace/reload" };
|
|
18211
18236
|
}
|
|
18212
|
-
const mcpRestart =
|
|
18237
|
+
const mcpRestart = path16.match(/^\/workspace\/mcp\/([^/]+)\/restart$/);
|
|
18213
18238
|
if (mcpRestart?.[1] && req.method === "POST") {
|
|
18214
18239
|
return { route: "POST /workspace/mcp/:server/restart" };
|
|
18215
18240
|
}
|
|
18216
|
-
if (req.method === "POST" &&
|
|
18241
|
+
if (req.method === "POST" && path16 === "/workspace/mcp/servers") {
|
|
18217
18242
|
return { route: "POST /workspace/mcp/servers" };
|
|
18218
18243
|
}
|
|
18219
|
-
const mcpDelete =
|
|
18244
|
+
const mcpDelete = path16.match(/^\/workspace\/mcp\/servers\/([^/]+)$/);
|
|
18220
18245
|
if (mcpDelete?.[1] && req.method === "DELETE") {
|
|
18221
18246
|
return { route: "DELETE /workspace/mcp/servers/:name" };
|
|
18222
18247
|
}
|
|
18223
|
-
if (req.method === "POST" &&
|
|
18248
|
+
if (req.method === "POST" && path16 === "/workspace/auth/device-flow") {
|
|
18224
18249
|
return { route: "POST /workspace/auth/device-flow" };
|
|
18225
18250
|
}
|
|
18226
|
-
const deviceFlowDelete =
|
|
18251
|
+
const deviceFlowDelete = path16.match(
|
|
18227
18252
|
/^\/workspace\/auth\/device-flow\/([^/]+)$/
|
|
18228
18253
|
);
|
|
18229
18254
|
if (deviceFlowDelete?.[1] && req.method === "DELETE") {
|
|
18230
18255
|
return { route: "DELETE /workspace/auth/device-flow/:id" };
|
|
18231
18256
|
}
|
|
18232
|
-
const toolEnable =
|
|
18257
|
+
const toolEnable = path16.match(/^\/workspace\/tools\/([^/]+)\/enable$/);
|
|
18233
18258
|
if (toolEnable?.[1] && req.method === "POST") {
|
|
18234
18259
|
return { route: "POST /workspace/tools/:name/enable" };
|
|
18235
18260
|
}
|
|
18236
|
-
if (
|
|
18261
|
+
if (path16 === "/workspace/settings") {
|
|
18237
18262
|
if (req.method === "GET") return { route: "GET /workspace/settings" };
|
|
18238
18263
|
if (req.method === "POST") return { route: "POST /workspace/settings" };
|
|
18239
18264
|
}
|
|
18240
|
-
if (
|
|
18265
|
+
if (path16 === "/workspace/permissions") {
|
|
18241
18266
|
if (req.method === "GET") return { route: "GET /workspace/permissions" };
|
|
18242
18267
|
if (req.method === "POST") return { route: "POST /workspace/permissions" };
|
|
18243
18268
|
}
|
|
18244
|
-
if (
|
|
18269
|
+
if (path16 === "/workspace/trust") {
|
|
18245
18270
|
if (req.method === "GET") return { route: "GET /workspace/trust" };
|
|
18246
18271
|
}
|
|
18247
|
-
if (req.method === "POST" &&
|
|
18272
|
+
if (req.method === "POST" && path16 === "/workspace/trust/request") {
|
|
18248
18273
|
return { route: "POST /workspace/trust/request" };
|
|
18249
18274
|
}
|
|
18250
|
-
if (
|
|
18275
|
+
if (path16 === "/workspace/voice") {
|
|
18251
18276
|
if (req.method === "GET") return { route: "GET /workspace/voice" };
|
|
18252
18277
|
if (req.method === "POST") return { route: "POST /workspace/voice" };
|
|
18253
18278
|
}
|
|
18254
|
-
if (req.method === "POST" &&
|
|
18279
|
+
if (req.method === "POST" && path16 === "/workspace/voice/transcribe") {
|
|
18255
18280
|
return { route: "POST /workspace/voice/transcribe" };
|
|
18256
18281
|
}
|
|
18257
18282
|
return void 0;
|
|
@@ -18305,7 +18330,7 @@ function daemonTelemetryMiddleware(resolveWorkspaceCwd, recordRequest) {
|
|
|
18305
18330
|
deferredRuntimePath: deferredRuntime.path
|
|
18306
18331
|
} : {}
|
|
18307
18332
|
},
|
|
18308
|
-
async (span) => await new Promise((
|
|
18333
|
+
async (span) => await new Promise((resolve6, reject) => {
|
|
18309
18334
|
let done = false;
|
|
18310
18335
|
const finish = /* @__PURE__ */ __name(() => {
|
|
18311
18336
|
if (done) return;
|
|
@@ -18335,7 +18360,7 @@ function daemonTelemetryMiddleware(resolveWorkspaceCwd, recordRequest) {
|
|
|
18335
18360
|
if (!successfulSse && route.route !== "GET /daemon/status" && route.route !== "POST /session/:id/heartbeat") {
|
|
18336
18361
|
recordRequest?.(durationMs, res.statusCode);
|
|
18337
18362
|
}
|
|
18338
|
-
|
|
18363
|
+
resolve6();
|
|
18339
18364
|
}, "finish");
|
|
18340
18365
|
res.once("finish", finish);
|
|
18341
18366
|
res.once("close", finish);
|
|
@@ -18510,6 +18535,7 @@ __name(registerPermissionRoutes, "registerPermissionRoutes");
|
|
|
18510
18535
|
// packages/cli/src/serve/routes/session.ts
|
|
18511
18536
|
init_esbuild_shims();
|
|
18512
18537
|
import * as crypto3 from "node:crypto";
|
|
18538
|
+
import * as fs3 from "node:fs";
|
|
18513
18539
|
import * as path11 from "node:path";
|
|
18514
18540
|
|
|
18515
18541
|
// packages/cli/src/serve/server/prompt-deadline.ts
|
|
@@ -18634,6 +18660,25 @@ function encodeMetadataSessionCursor(last, filter, archiveState) {
|
|
|
18634
18660
|
).toString("base64url");
|
|
18635
18661
|
}
|
|
18636
18662
|
__name(encodeMetadataSessionCursor, "encodeMetadataSessionCursor");
|
|
18663
|
+
async function enrichWorktreeSidecars(bySessionId, sessionService, archiveState = "active") {
|
|
18664
|
+
for (const [sessionId, summary] of bySessionId) {
|
|
18665
|
+
if (summary.worktree) continue;
|
|
18666
|
+
const sidecar = await readWorktreeSession(
|
|
18667
|
+
sessionService.getWorktreeSessionPathForArchiveState(
|
|
18668
|
+
sessionId,
|
|
18669
|
+
archiveState
|
|
18670
|
+
)
|
|
18671
|
+
).catch(() => null);
|
|
18672
|
+
if (sidecar) {
|
|
18673
|
+
summary.worktree = {
|
|
18674
|
+
slug: sidecar.slug,
|
|
18675
|
+
path: sidecar.worktreePath,
|
|
18676
|
+
branch: sidecar.worktreeBranch
|
|
18677
|
+
};
|
|
18678
|
+
}
|
|
18679
|
+
}
|
|
18680
|
+
}
|
|
18681
|
+
__name(enrichWorktreeSidecars, "enrichWorktreeSidecars");
|
|
18637
18682
|
function toSummary2(item) {
|
|
18638
18683
|
return {
|
|
18639
18684
|
sessionId: item.sessionId,
|
|
@@ -18779,6 +18824,7 @@ async function listOrganizedWorkspaceSessionsForResponse(bridge, workspaceCwd, o
|
|
|
18779
18824
|
applyOrganization(session, snapshot.sessions.get(session.sessionId))
|
|
18780
18825
|
);
|
|
18781
18826
|
}
|
|
18827
|
+
await enrichWorktreeSidecars(bySessionId, sessionService, archiveState);
|
|
18782
18828
|
if (readOptions.mergeLive !== false && archiveState !== "archived" && isFirstPage) {
|
|
18783
18829
|
try {
|
|
18784
18830
|
const liveSessions = bridge.listWorkspaceSessions(workspaceCwd);
|
|
@@ -18864,6 +18910,7 @@ async function listWorkspaceSessionsByMetadataForResponse(bridge, workspaceCwd,
|
|
|
18864
18910
|
for (const session of persisted.sessions) {
|
|
18865
18911
|
bySessionId.set(session.sessionId, session);
|
|
18866
18912
|
}
|
|
18913
|
+
await enrichWorktreeSidecars(bySessionId, sessionService, archiveState);
|
|
18867
18914
|
let liveMergeFailed = false;
|
|
18868
18915
|
if (readOptions.mergeLive !== false && archiveState !== "archived") {
|
|
18869
18916
|
try {
|
|
@@ -18966,6 +19013,7 @@ async function listWorkspaceSessionsForResponse(bridge, workspaceCwd, options, r
|
|
|
18966
19013
|
for (const item of persisted.items) {
|
|
18967
19014
|
bySessionId.set(item.sessionId, toSummary2(item));
|
|
18968
19015
|
}
|
|
19016
|
+
await enrichWorktreeSidecars(bySessionId, sessionService, archiveState);
|
|
18969
19017
|
if (archiveState === "archived" || readOptions.mergeLive === false) {
|
|
18970
19018
|
const sessions2 = [...bySessionId.values()];
|
|
18971
19019
|
const nextCursor2 = persisted.nextCursor != null ? String(persisted.nextCursor) : void 0;
|
|
@@ -19137,7 +19185,7 @@ function writeGenerationSseChunk(res, chunk) {
|
|
|
19137
19185
|
if (writable) {
|
|
19138
19186
|
return res.destroyed ? Promise.reject(new Error("Generation SSE connection destroyed")) : Promise.resolve();
|
|
19139
19187
|
}
|
|
19140
|
-
return new Promise((
|
|
19188
|
+
return new Promise((resolve6, reject) => {
|
|
19141
19189
|
const cleanup = /* @__PURE__ */ __name(() => {
|
|
19142
19190
|
res.off("drain", onDrain);
|
|
19143
19191
|
res.off("close", onClose);
|
|
@@ -19145,7 +19193,7 @@ function writeGenerationSseChunk(res, chunk) {
|
|
|
19145
19193
|
}, "cleanup");
|
|
19146
19194
|
const onDrain = /* @__PURE__ */ __name(() => {
|
|
19147
19195
|
cleanup();
|
|
19148
|
-
|
|
19196
|
+
resolve6();
|
|
19149
19197
|
}, "onDrain");
|
|
19150
19198
|
const onClose = /* @__PURE__ */ __name(() => {
|
|
19151
19199
|
cleanup();
|
|
@@ -19915,6 +19963,68 @@ function registerSessionRoutes(app, deps) {
|
|
|
19915
19963
|
}
|
|
19916
19964
|
const clientId = parseClientIdHeader(req, res);
|
|
19917
19965
|
if (clientId === null) return;
|
|
19966
|
+
let worktreeMeta;
|
|
19967
|
+
const rawWorktree = body["worktree"];
|
|
19968
|
+
if (rawWorktree !== void 0 && rawWorktree !== null) {
|
|
19969
|
+
if (typeof rawWorktree !== "object" || Array.isArray(rawWorktree)) {
|
|
19970
|
+
res.status(400).json({
|
|
19971
|
+
error: '`worktree` must be an object (e.g. `{}` or `{"slug":"my-task"}`)',
|
|
19972
|
+
code: "invalid_worktree"
|
|
19973
|
+
});
|
|
19974
|
+
return;
|
|
19975
|
+
}
|
|
19976
|
+
const wtReq = rawWorktree;
|
|
19977
|
+
let wtService;
|
|
19978
|
+
try {
|
|
19979
|
+
wtService = new GitWorktreeService(workspaceCwd);
|
|
19980
|
+
} catch {
|
|
19981
|
+
res.status(500).json({
|
|
19982
|
+
error: "Failed to initialize worktree service",
|
|
19983
|
+
code: "worktree_init_failed"
|
|
19984
|
+
});
|
|
19985
|
+
return;
|
|
19986
|
+
}
|
|
19987
|
+
if (!await wtService.isGitRepository()) {
|
|
19988
|
+
res.status(400).json({
|
|
19989
|
+
error: "Worktree isolation requires a git repository",
|
|
19990
|
+
code: "worktree_not_git_repo"
|
|
19991
|
+
});
|
|
19992
|
+
return;
|
|
19993
|
+
}
|
|
19994
|
+
const rawSlug = wtReq["slug"];
|
|
19995
|
+
let slug;
|
|
19996
|
+
if (rawSlug === void 0 || rawSlug === null) {
|
|
19997
|
+
slug = GitWorktreeService.generateAutoSlug();
|
|
19998
|
+
} else if (typeof rawSlug !== "string" || rawSlug.length === 0) {
|
|
19999
|
+
res.status(400).json({
|
|
20000
|
+
error: "`worktree.slug` must be a non-empty string when provided",
|
|
20001
|
+
code: "worktree_invalid_slug"
|
|
20002
|
+
});
|
|
20003
|
+
return;
|
|
20004
|
+
} else {
|
|
20005
|
+
slug = rawSlug;
|
|
20006
|
+
}
|
|
20007
|
+
const slugError = GitWorktreeService.validateUserWorktreeSlug(slug);
|
|
20008
|
+
if (slugError) {
|
|
20009
|
+
res.status(400).json({ error: slugError, code: "worktree_invalid_slug" });
|
|
20010
|
+
return;
|
|
20011
|
+
}
|
|
20012
|
+
const baseBranch = await wtService.getCurrentBranch().catch(() => void 0);
|
|
20013
|
+
const wtResult = await wtService.createUserWorktree(slug, baseBranch);
|
|
20014
|
+
if (!wtResult.success || !wtResult.worktree) {
|
|
20015
|
+
res.status(500).json({
|
|
20016
|
+
error: wtResult.error ?? "Failed to create worktree",
|
|
20017
|
+
code: "worktree_create_failed"
|
|
20018
|
+
});
|
|
20019
|
+
return;
|
|
20020
|
+
}
|
|
20021
|
+
worktreeMeta = {
|
|
20022
|
+
slug,
|
|
20023
|
+
path: wtResult.worktree.path,
|
|
20024
|
+
branch: wtResult.worktree.branch
|
|
20025
|
+
};
|
|
20026
|
+
sessionScope = "thread";
|
|
20027
|
+
}
|
|
19918
20028
|
try {
|
|
19919
20029
|
const session = await runtime.bridge.spawnOrAttach({
|
|
19920
20030
|
workspaceCwd,
|
|
@@ -19923,7 +20033,8 @@ function registerSessionRoutes(app, deps) {
|
|
|
19923
20033
|
...sessionScope !== void 0 ? { sessionScope } : {},
|
|
19924
20034
|
...approvalMode !== void 0 ? { approvalMode } : {},
|
|
19925
20035
|
...source.sourceType !== void 0 ? { sourceType: source.sourceType } : {},
|
|
19926
|
-
...source.sourceId !== void 0 ? { sourceId: source.sourceId } : {}
|
|
20036
|
+
...source.sourceId !== void 0 ? { sourceId: source.sourceId } : {},
|
|
20037
|
+
...worktreeMeta ? { worktree: worktreeMeta } : {}
|
|
19927
20038
|
});
|
|
19928
20039
|
if (daemonLog) {
|
|
19929
20040
|
daemonLog.info(
|
|
@@ -19950,6 +20061,10 @@ function registerSessionRoutes(app, deps) {
|
|
|
19950
20061
|
await new SessionService(runtime.workspaceCwd).removeSession(
|
|
19951
20062
|
session.sessionId
|
|
19952
20063
|
);
|
|
20064
|
+
if (worktreeMeta) {
|
|
20065
|
+
await new GitWorktreeService(workspaceCwd).removeUserWorktree(worktreeMeta.slug, { deleteBranch: true }).catch(() => {
|
|
20066
|
+
});
|
|
20067
|
+
}
|
|
19953
20068
|
}
|
|
19954
20069
|
} catch {
|
|
19955
20070
|
}
|
|
@@ -19959,8 +20074,73 @@ function registerSessionRoutes(app, deps) {
|
|
|
19959
20074
|
}
|
|
19960
20075
|
return;
|
|
19961
20076
|
}
|
|
20077
|
+
if (worktreeMeta) {
|
|
20078
|
+
try {
|
|
20079
|
+
const createAllowedRoots = [
|
|
20080
|
+
path11.join(workspaceCwd, ".qwen", "worktrees")
|
|
20081
|
+
];
|
|
20082
|
+
let createRepoTop = null;
|
|
20083
|
+
try {
|
|
20084
|
+
createRepoTop = await new GitWorktreeService(
|
|
20085
|
+
workspaceCwd
|
|
20086
|
+
).getRepoTopLevel();
|
|
20087
|
+
} catch {
|
|
20088
|
+
}
|
|
20089
|
+
if (createRepoTop && createRepoTop !== workspaceCwd) {
|
|
20090
|
+
createAllowedRoots.push(
|
|
20091
|
+
path11.join(createRepoTop, ".qwen", "worktrees")
|
|
20092
|
+
);
|
|
20093
|
+
}
|
|
20094
|
+
await runtime.bridge.changeSessionCwd(session.sessionId, {
|
|
20095
|
+
path: worktreeMeta.path,
|
|
20096
|
+
allowedRoots: createAllowedRoots
|
|
20097
|
+
});
|
|
20098
|
+
await writeWorktreeSessionMarker(
|
|
20099
|
+
worktreeMeta.path,
|
|
20100
|
+
session.sessionId
|
|
20101
|
+
).catch(() => {
|
|
20102
|
+
});
|
|
20103
|
+
await writeWorktreeSession(
|
|
20104
|
+
new SessionService(workspaceCwd).getWorktreeSessionPath(
|
|
20105
|
+
session.sessionId
|
|
20106
|
+
),
|
|
20107
|
+
{
|
|
20108
|
+
slug: worktreeMeta.slug,
|
|
20109
|
+
worktreePath: worktreeMeta.path,
|
|
20110
|
+
worktreeBranch: worktreeMeta.branch,
|
|
20111
|
+
originalCwd: workspaceCwd,
|
|
20112
|
+
originalBranch: "",
|
|
20113
|
+
originalHeadCommit: ""
|
|
20114
|
+
}
|
|
20115
|
+
).catch(() => {
|
|
20116
|
+
});
|
|
20117
|
+
} catch (cdErr) {
|
|
20118
|
+
if (daemonLog) {
|
|
20119
|
+
daemonLog.warn("worktree cd failed, rolling back", {
|
|
20120
|
+
sessionId: session.sessionId,
|
|
20121
|
+
error: cdErr instanceof Error ? cdErr.message : String(cdErr)
|
|
20122
|
+
});
|
|
20123
|
+
}
|
|
20124
|
+
const killed = await runtime.bridge.killSession(session.sessionId, { requireZeroAttaches: true }).catch(() => false);
|
|
20125
|
+
if (killed) {
|
|
20126
|
+
await new SessionService(workspaceCwd).removeSession(session.sessionId).catch(() => {
|
|
20127
|
+
});
|
|
20128
|
+
}
|
|
20129
|
+
await new GitWorktreeService(workspaceCwd).removeUserWorktree(worktreeMeta.slug, { deleteBranch: true }).catch(() => {
|
|
20130
|
+
});
|
|
20131
|
+
res.status(500).json({
|
|
20132
|
+
error: "Failed to relocate session into worktree",
|
|
20133
|
+
code: "worktree_relocate_failed"
|
|
20134
|
+
});
|
|
20135
|
+
return;
|
|
20136
|
+
}
|
|
20137
|
+
}
|
|
19962
20138
|
res.status(200).json(session);
|
|
19963
20139
|
} catch (err) {
|
|
20140
|
+
if (worktreeMeta) {
|
|
20141
|
+
await new GitWorktreeService(workspaceCwd).removeUserWorktree(worktreeMeta.slug, { deleteBranch: true }).catch(() => {
|
|
20142
|
+
});
|
|
20143
|
+
}
|
|
19964
20144
|
sendBridgeError2(res, err, { route: "POST /session" });
|
|
19965
20145
|
}
|
|
19966
20146
|
});
|
|
@@ -20046,6 +20226,70 @@ function registerSessionRoutes(app, deps) {
|
|
|
20046
20226
|
}
|
|
20047
20227
|
return;
|
|
20048
20228
|
}
|
|
20229
|
+
if (!session.worktree) {
|
|
20230
|
+
const sidecar = await readWorktreeSession(
|
|
20231
|
+
new SessionService(workspaceCwd).getWorktreeSessionPath(sessionId)
|
|
20232
|
+
).catch(() => null);
|
|
20233
|
+
if (sidecar) {
|
|
20234
|
+
let realTarget;
|
|
20235
|
+
const candidateRoots = [
|
|
20236
|
+
path11.join(workspaceCwd, ".qwen", "worktrees")
|
|
20237
|
+
];
|
|
20238
|
+
try {
|
|
20239
|
+
realTarget = fs3.realpathSync(sidecar.worktreePath);
|
|
20240
|
+
let repoTop = null;
|
|
20241
|
+
try {
|
|
20242
|
+
repoTop = await new GitWorktreeService(
|
|
20243
|
+
workspaceCwd
|
|
20244
|
+
).getRepoTopLevel();
|
|
20245
|
+
} catch {
|
|
20246
|
+
}
|
|
20247
|
+
if (repoTop && repoTop !== workspaceCwd) {
|
|
20248
|
+
candidateRoots.push(path11.join(repoTop, ".qwen", "worktrees"));
|
|
20249
|
+
}
|
|
20250
|
+
const contained = candidateRoots.some((root) => {
|
|
20251
|
+
try {
|
|
20252
|
+
const realRoot = fs3.realpathSync(root);
|
|
20253
|
+
const rel = path11.relative(realRoot, realTarget);
|
|
20254
|
+
return !rel.startsWith("..") && !path11.isAbsolute(rel);
|
|
20255
|
+
} catch {
|
|
20256
|
+
return false;
|
|
20257
|
+
}
|
|
20258
|
+
});
|
|
20259
|
+
if (!contained) {
|
|
20260
|
+
realTarget = void 0;
|
|
20261
|
+
}
|
|
20262
|
+
} catch {
|
|
20263
|
+
realTarget = void 0;
|
|
20264
|
+
}
|
|
20265
|
+
if (!realTarget) {
|
|
20266
|
+
daemonLog?.warn("worktree sidecar path failed containment", {
|
|
20267
|
+
sessionId,
|
|
20268
|
+
path: sidecar.worktreePath
|
|
20269
|
+
});
|
|
20270
|
+
} else {
|
|
20271
|
+
const wt = {
|
|
20272
|
+
slug: sidecar.slug,
|
|
20273
|
+
path: realTarget,
|
|
20274
|
+
branch: sidecar.worktreeBranch
|
|
20275
|
+
};
|
|
20276
|
+
try {
|
|
20277
|
+
await runtime.bridge.changeSessionCwd(sessionId, {
|
|
20278
|
+
path: wt.path,
|
|
20279
|
+
allowedRoots: candidateRoots
|
|
20280
|
+
});
|
|
20281
|
+
runtime.bridge.setSessionWorktree(sessionId, wt);
|
|
20282
|
+
session.worktree = wt;
|
|
20283
|
+
} catch (restoreErr) {
|
|
20284
|
+
daemonLog?.warn("worktree restore failed on load/resume", {
|
|
20285
|
+
sessionId,
|
|
20286
|
+
worktreePath: wt.path,
|
|
20287
|
+
error: restoreErr instanceof Error ? restoreErr.message : String(restoreErr)
|
|
20288
|
+
});
|
|
20289
|
+
}
|
|
20290
|
+
}
|
|
20291
|
+
}
|
|
20292
|
+
}
|
|
20049
20293
|
res.status(200).json(session);
|
|
20050
20294
|
} catch (err) {
|
|
20051
20295
|
sendBridgeError2(res, err, {
|
|
@@ -22877,7 +23121,7 @@ async function rehydrateScheduledTaskSessions(deps) {
|
|
|
22877
23121
|
}
|
|
22878
23122
|
__name(rehydrateScheduledTaskSessions, "rehydrateScheduledTaskSessions");
|
|
22879
23123
|
function withTimeout(p, ms, label) {
|
|
22880
|
-
return new Promise((
|
|
23124
|
+
return new Promise((resolve6, reject) => {
|
|
22881
23125
|
const timer = setTimeout(() => {
|
|
22882
23126
|
reject(new Error(`${label} timed out after ${ms}ms`));
|
|
22883
23127
|
}, ms);
|
|
@@ -22885,7 +23129,7 @@ function withTimeout(p, ms, label) {
|
|
|
22885
23129
|
p.then(
|
|
22886
23130
|
(v) => {
|
|
22887
23131
|
clearTimeout(timer);
|
|
22888
|
-
|
|
23132
|
+
resolve6(v);
|
|
22889
23133
|
},
|
|
22890
23134
|
(e) => {
|
|
22891
23135
|
clearTimeout(timer);
|
|
@@ -22969,7 +23213,7 @@ function registerWorkspaceStatusRoutes(app, deps) {
|
|
|
22969
23213
|
const ctx = buildWorkspaceCtx("POST /workspace/acp/preheat");
|
|
22970
23214
|
const timeoutMsRaw = req.query["timeoutMs"];
|
|
22971
23215
|
const timeoutMs = typeof timeoutMsRaw === "string" && timeoutMsRaw.trim() ? Number(timeoutMsRaw) : void 0;
|
|
22972
|
-
if (
|
|
23216
|
+
if (timeoutMsRaw !== void 0 && (timeoutMs === void 0 || !Number.isFinite(timeoutMs) || !Number.isInteger(timeoutMs) || timeoutMs <= 0 || timeoutMs > MAX_ACP_PREHEAT_TIMEOUT_MS)) {
|
|
22973
23217
|
res.status(400).json({
|
|
22974
23218
|
error: "`timeoutMs` must be a positive integer no greater than 60000",
|
|
22975
23219
|
code: "invalid_timeout"
|
|
@@ -23303,6 +23547,7 @@ function registerCapabilitiesRoutes(app, deps) {
|
|
|
23303
23547
|
workspaces: runtimes.map((runtime) => ({
|
|
23304
23548
|
id: runtime.workspaceId,
|
|
23305
23549
|
cwd: runtime.workspaceCwd,
|
|
23550
|
+
...runtime.displayName !== void 0 ? { displayName: runtime.displayName } : {},
|
|
23306
23551
|
primary: runtime.primary,
|
|
23307
23552
|
trusted: runtime.trusted,
|
|
23308
23553
|
...runtimeRemoval ? { removable: runtime.removable === true } : {}
|
|
@@ -24615,9 +24860,9 @@ function registerSseEventsRoutes(app, deps) {
|
|
|
24615
24860
|
let writeChain = Promise.resolve();
|
|
24616
24861
|
const trackWriterIdle = writerIdleTimeoutMs !== void 0 && writerIdleTimeoutMs > 0;
|
|
24617
24862
|
let lastWriteAt = trackWriterIdle ? Date.now() : 0;
|
|
24618
|
-
const doWrite = /* @__PURE__ */ __name((chunk) => new Promise((
|
|
24863
|
+
const doWrite = /* @__PURE__ */ __name((chunk) => new Promise((resolve6, reject) => {
|
|
24619
24864
|
if (res.writableEnded) {
|
|
24620
|
-
|
|
24865
|
+
resolve6();
|
|
24621
24866
|
return;
|
|
24622
24867
|
}
|
|
24623
24868
|
let ok;
|
|
@@ -24629,19 +24874,19 @@ function registerSseEventsRoutes(app, deps) {
|
|
|
24629
24874
|
}
|
|
24630
24875
|
if (ok) {
|
|
24631
24876
|
if (trackWriterIdle) lastWriteAt = Date.now();
|
|
24632
|
-
|
|
24877
|
+
resolve6();
|
|
24633
24878
|
return;
|
|
24634
24879
|
}
|
|
24635
24880
|
const onDrain = /* @__PURE__ */ __name(() => {
|
|
24636
24881
|
res.off("close", onClose);
|
|
24637
24882
|
res.off("error", onError);
|
|
24638
24883
|
if (trackWriterIdle) lastWriteAt = Date.now();
|
|
24639
|
-
|
|
24884
|
+
resolve6();
|
|
24640
24885
|
}, "onDrain");
|
|
24641
24886
|
const onClose = /* @__PURE__ */ __name(() => {
|
|
24642
24887
|
res.off("drain", onDrain);
|
|
24643
24888
|
res.off("error", onError);
|
|
24644
|
-
|
|
24889
|
+
resolve6();
|
|
24645
24890
|
}, "onClose");
|
|
24646
24891
|
const onError = /* @__PURE__ */ __name((err) => {
|
|
24647
24892
|
res.off("drain", onDrain);
|
|
@@ -25234,47 +25479,6 @@ function dropNestedWorkspacesPreservingPrimary(workspaces) {
|
|
|
25234
25479
|
}
|
|
25235
25480
|
__name(dropNestedWorkspacesPreservingPrimary, "dropNestedWorkspacesPreservingPrimary");
|
|
25236
25481
|
|
|
25237
|
-
// packages/cli/src/serve/server/access-log.ts
|
|
25238
|
-
init_esbuild_shims();
|
|
25239
|
-
var SESSION_ID_RE = /\/session\/([^/]+)/;
|
|
25240
|
-
function installAccessLogMiddleware(app, daemonLog) {
|
|
25241
|
-
if (!daemonLog) return;
|
|
25242
|
-
app.use((req, res, next) => {
|
|
25243
|
-
const { method, path: reqPath } = req;
|
|
25244
|
-
if (method === "GET" && reqPath === "/health" || method === "POST" && reqPath.endsWith("/heartbeat")) {
|
|
25245
|
-
return next();
|
|
25246
|
-
}
|
|
25247
|
-
const startMs = Date.now();
|
|
25248
|
-
res.on("finish", () => {
|
|
25249
|
-
try {
|
|
25250
|
-
const status = res.statusCode;
|
|
25251
|
-
if (method === "GET" && reqPath.endsWith("/events") && status === 200) {
|
|
25252
|
-
return;
|
|
25253
|
-
}
|
|
25254
|
-
const durationMs = Date.now() - startMs;
|
|
25255
|
-
const sessionMatch = reqPath.match(SESSION_ID_RE);
|
|
25256
|
-
const sessionId = sessionMatch?.[1];
|
|
25257
|
-
const clientId = req.headers["x-qwen-client-id"];
|
|
25258
|
-
const ctx = {
|
|
25259
|
-
route: `${method} ${reqPath}`,
|
|
25260
|
-
...sessionId ? { sessionId } : {},
|
|
25261
|
-
...clientId ? { clientId } : {},
|
|
25262
|
-
status,
|
|
25263
|
-
durationMs
|
|
25264
|
-
};
|
|
25265
|
-
if (status >= 400) {
|
|
25266
|
-
daemonLog.warn("request completed", ctx);
|
|
25267
|
-
} else {
|
|
25268
|
-
daemonLog.info("request completed", ctx);
|
|
25269
|
-
}
|
|
25270
|
-
} catch {
|
|
25271
|
-
}
|
|
25272
|
-
});
|
|
25273
|
-
next();
|
|
25274
|
-
});
|
|
25275
|
-
}
|
|
25276
|
-
__name(installAccessLogMiddleware, "installAccessLogMiddleware");
|
|
25277
|
-
|
|
25278
25482
|
// packages/cli/src/serve/server/device-flow-registry.ts
|
|
25279
25483
|
init_esbuild_shims();
|
|
25280
25484
|
|
|
@@ -25576,10 +25780,10 @@ function installRateLimiter(app, opts, daemonLog, options = {}) {
|
|
|
25576
25780
|
{ tier, key: key.slice(0, 64) }
|
|
25577
25781
|
);
|
|
25578
25782
|
} : void 0,
|
|
25579
|
-
onError: daemonLog ? (err,
|
|
25783
|
+
onError: daemonLog ? (err, path16) => {
|
|
25580
25784
|
daemonLog.warn(
|
|
25581
25785
|
`rate limiter error (fail-open): ${err instanceof Error ? err.message : String(err)}`,
|
|
25582
|
-
{ path:
|
|
25786
|
+
{ path: path16 }
|
|
25583
25787
|
);
|
|
25584
25788
|
} : void 0
|
|
25585
25789
|
});
|
|
@@ -25758,8 +25962,8 @@ __name(registerWorkspaceQualifiedLifecycleRoutes, "registerWorkspaceQualifiedLif
|
|
|
25758
25962
|
// packages/cli/src/serve/routes/workspace-management.ts
|
|
25759
25963
|
init_esbuild_shims();
|
|
25760
25964
|
import { readdir, stat } from "node:fs/promises";
|
|
25761
|
-
import { realpathSync } from "node:fs";
|
|
25762
|
-
import { basename as basename4, dirname as dirname4, isAbsolute as isAbsolute7, join as
|
|
25965
|
+
import { realpathSync as realpathSync2 } from "node:fs";
|
|
25966
|
+
import { basename as basename4, dirname as dirname4, isAbsolute as isAbsolute7, join as join8, resolve as resolve4, sep as sep3 } from "node:path";
|
|
25763
25967
|
var MAX_PATH_SUGGESTIONS = 50;
|
|
25764
25968
|
function registerWorkspaceManagementRoutes(app, deps) {
|
|
25765
25969
|
const {
|
|
@@ -25790,6 +25994,31 @@ function registerWorkspaceManagementRoutes(app, deps) {
|
|
|
25790
25994
|
code: "daemon_shutting_down"
|
|
25791
25995
|
});
|
|
25792
25996
|
}, "sendSealed");
|
|
25997
|
+
const attachRegistrationIds = /* @__PURE__ */ __name((runtime, registrationIds) => {
|
|
25998
|
+
runtime.registrationIds ??= [];
|
|
25999
|
+
for (const registrationId of registrationIds) {
|
|
26000
|
+
if (!runtime.registrationIds.includes(registrationId)) {
|
|
26001
|
+
runtime.registrationIds.push(registrationId);
|
|
26002
|
+
}
|
|
26003
|
+
}
|
|
26004
|
+
}, "attachRegistrationIds");
|
|
26005
|
+
const restorePersistedDisplayName = /* @__PURE__ */ __name(async (runtime, canonical) => {
|
|
26006
|
+
const snapshot = await workspaceRegistrationStore.read();
|
|
26007
|
+
const storedWorkspace = snapshot.workspaces.find(
|
|
26008
|
+
(stored) => process.platform === "win32" ? stored.toLowerCase() === canonical.toLowerCase() : stored === canonical
|
|
26009
|
+
);
|
|
26010
|
+
const storedDisplayName = storedWorkspace ? snapshot.displayNames?.[workspaceRegistrationId(storedWorkspace)] : void 0;
|
|
26011
|
+
if (storedWorkspace) {
|
|
26012
|
+
attachRegistrationIds(runtime, [
|
|
26013
|
+
workspaceRegistrationId(storedWorkspace)
|
|
26014
|
+
]);
|
|
26015
|
+
}
|
|
26016
|
+
if (storedDisplayName === void 0) {
|
|
26017
|
+
delete runtime.displayName;
|
|
26018
|
+
} else {
|
|
26019
|
+
runtime.displayName = storedDisplayName;
|
|
26020
|
+
}
|
|
26021
|
+
}, "restorePersistedDisplayName");
|
|
25793
26022
|
app.get(
|
|
25794
26023
|
"/workspace-path-suggestions",
|
|
25795
26024
|
async (req, res) => {
|
|
@@ -25817,7 +26046,7 @@ function registerWorkspaceManagementRoutes(app, deps) {
|
|
|
25817
26046
|
return;
|
|
25818
26047
|
}
|
|
25819
26048
|
const endsWithSep = prefix.endsWith("/") || process.platform === "win32" && prefix.endsWith("\\");
|
|
25820
|
-
const dir = endsWithSep ?
|
|
26049
|
+
const dir = endsWithSep ? join8(prefix, ".") : dirname4(prefix);
|
|
25821
26050
|
const filter = endsWithSep ? "" : basename4(prefix);
|
|
25822
26051
|
const filterLower = filter.toLowerCase();
|
|
25823
26052
|
const suggestions = [];
|
|
@@ -25833,7 +26062,7 @@ function registerWorkspaceManagementRoutes(app, deps) {
|
|
|
25833
26062
|
let isDir = entry.isDirectory();
|
|
25834
26063
|
if (!isDir && entry.isSymbolicLink()) {
|
|
25835
26064
|
try {
|
|
25836
|
-
isDir = (await stat(
|
|
26065
|
+
isDir = (await stat(join8(dir, entry.name))).isDirectory();
|
|
25837
26066
|
} catch {
|
|
25838
26067
|
continue;
|
|
25839
26068
|
}
|
|
@@ -25843,7 +26072,7 @@ function registerWorkspaceManagementRoutes(app, deps) {
|
|
|
25843
26072
|
truncated = true;
|
|
25844
26073
|
break;
|
|
25845
26074
|
}
|
|
25846
|
-
suggestions.push({ name: entry.name, path:
|
|
26075
|
+
suggestions.push({ name: entry.name, path: join8(dir, entry.name) });
|
|
25847
26076
|
}
|
|
25848
26077
|
} catch {
|
|
25849
26078
|
}
|
|
@@ -25863,6 +26092,20 @@ function registerWorkspaceManagementRoutes(app, deps) {
|
|
|
25863
26092
|
const body = safeBody2(req);
|
|
25864
26093
|
const cwd = body["cwd"];
|
|
25865
26094
|
const persist = body["persist"] ?? false;
|
|
26095
|
+
const hasDisplayName = Object.hasOwn(body, "displayName");
|
|
26096
|
+
let displayName;
|
|
26097
|
+
if (hasDisplayName) {
|
|
26098
|
+
try {
|
|
26099
|
+
displayName = normalizeWorkspaceDisplayName(body["displayName"]);
|
|
26100
|
+
} catch (err) {
|
|
26101
|
+
if (!(err instanceof WorkspaceDisplayNameValidationError)) throw err;
|
|
26102
|
+
res.status(400).json({
|
|
26103
|
+
error: err.message,
|
|
26104
|
+
code: "invalid_display_name"
|
|
26105
|
+
});
|
|
26106
|
+
return;
|
|
26107
|
+
}
|
|
26108
|
+
}
|
|
25866
26109
|
if (typeof cwd !== "string" || cwd.trim().length === 0) {
|
|
25867
26110
|
res.status(400).json({
|
|
25868
26111
|
error: "`cwd` must be a non-empty string",
|
|
@@ -25907,7 +26150,7 @@ function registerWorkspaceManagementRoutes(app, deps) {
|
|
|
25907
26150
|
}
|
|
25908
26151
|
let canonical;
|
|
25909
26152
|
try {
|
|
25910
|
-
canonical =
|
|
26153
|
+
canonical = realpathSync2.native(resolve4(cwd));
|
|
25911
26154
|
} catch {
|
|
25912
26155
|
res.status(400).json({
|
|
25913
26156
|
error: "Path does not exist or is not accessible",
|
|
@@ -25982,11 +26225,12 @@ function registerWorkspaceManagementRoutes(app, deps) {
|
|
|
25982
26225
|
operationStarted();
|
|
25983
26226
|
try {
|
|
25984
26227
|
const snapshot = await workspaceRegistrationStore.read();
|
|
25985
|
-
const
|
|
26228
|
+
const persistedWorkspaces = snapshot.workspaces.filter(
|
|
25986
26229
|
(stored) => existingRuntime.registrationIds?.includes(
|
|
25987
26230
|
workspaceRegistrationId(stored)
|
|
25988
26231
|
) === true || (process.platform === "win32" ? stored.toLowerCase() === canonical.toLowerCase() : stored === canonical)
|
|
25989
26232
|
);
|
|
26233
|
+
const alreadyPersisted = persistedWorkspaces.length > 0;
|
|
25990
26234
|
if (!alreadyPersisted && snapshot.workspaces.length >= MAX_REGISTERED_WORKSPACES - 1) {
|
|
25991
26235
|
res.status(409).json({
|
|
25992
26236
|
error: "Workspace registration limit reached",
|
|
@@ -25994,22 +26238,56 @@ function registerWorkspaceManagementRoutes(app, deps) {
|
|
|
25994
26238
|
});
|
|
25995
26239
|
return;
|
|
25996
26240
|
}
|
|
25997
|
-
if (
|
|
26241
|
+
if (alreadyPersisted) {
|
|
26242
|
+
attachRegistrationIds(
|
|
26243
|
+
existingRuntime,
|
|
26244
|
+
persistedWorkspaces.map(workspaceRegistrationId)
|
|
26245
|
+
);
|
|
26246
|
+
const storedDisplayName = persistedWorkspaces.map(
|
|
26247
|
+
(stored) => snapshot.displayNames?.[workspaceRegistrationId(stored)]
|
|
26248
|
+
).find((name) => name !== void 0);
|
|
26249
|
+
if (storedDisplayName === void 0) {
|
|
26250
|
+
delete existingRuntime.displayName;
|
|
26251
|
+
} else {
|
|
26252
|
+
existingRuntime.displayName = storedDisplayName;
|
|
26253
|
+
}
|
|
26254
|
+
} else {
|
|
26255
|
+
let added = false;
|
|
25998
26256
|
try {
|
|
25999
|
-
|
|
26257
|
+
const persistedDisplayName = hasDisplayName ? displayName : existingRuntime.displayName;
|
|
26258
|
+
added = persistedDisplayName === void 0 ? await workspaceRegistrationStore.add(canonical) : await workspaceRegistrationStore.add(
|
|
26259
|
+
canonical,
|
|
26260
|
+
persistedDisplayName
|
|
26261
|
+
);
|
|
26000
26262
|
} catch (err) {
|
|
26001
26263
|
if (!(err instanceof WorkspaceRegistrationStoreCommittedError)) {
|
|
26002
26264
|
throw err;
|
|
26003
26265
|
}
|
|
26266
|
+
added = true;
|
|
26004
26267
|
try {
|
|
26005
26268
|
writeStderrLine(`qwen serve: ${err.message}`);
|
|
26006
26269
|
} catch {
|
|
26007
26270
|
}
|
|
26008
26271
|
}
|
|
26272
|
+
if (added) {
|
|
26273
|
+
attachRegistrationIds(existingRuntime, [
|
|
26274
|
+
workspaceRegistrationId(canonical)
|
|
26275
|
+
]);
|
|
26276
|
+
}
|
|
26277
|
+
if (added && hasDisplayName) {
|
|
26278
|
+
if (displayName === void 0) {
|
|
26279
|
+
delete existingRuntime.displayName;
|
|
26280
|
+
} else {
|
|
26281
|
+
existingRuntime.displayName = displayName;
|
|
26282
|
+
}
|
|
26283
|
+
} else if (!added) {
|
|
26284
|
+
await restorePersistedDisplayName(existingRuntime, canonical);
|
|
26285
|
+
}
|
|
26009
26286
|
}
|
|
26010
26287
|
res.status(200).json({
|
|
26011
26288
|
id: existingRuntime.workspaceId,
|
|
26012
26289
|
cwd: existingRuntime.workspaceCwd,
|
|
26290
|
+
...existingRuntime.displayName !== void 0 ? { displayName: existingRuntime.displayName } : {},
|
|
26013
26291
|
primary: existingRuntime.primary,
|
|
26014
26292
|
trusted: existingRuntime.trusted,
|
|
26015
26293
|
persisted: true
|
|
@@ -26082,12 +26360,18 @@ function registerWorkspaceManagementRoutes(app, deps) {
|
|
|
26082
26360
|
let persistenceFailed = false;
|
|
26083
26361
|
try {
|
|
26084
26362
|
const runtime = await createWorkspaceRuntime(canonical);
|
|
26363
|
+
if (!persist && displayName !== void 0) {
|
|
26364
|
+
runtime.displayName = displayName;
|
|
26365
|
+
}
|
|
26085
26366
|
let persistedRecordAdded = false;
|
|
26086
26367
|
try {
|
|
26087
26368
|
if (persist) {
|
|
26088
26369
|
try {
|
|
26089
26370
|
try {
|
|
26090
|
-
persistedRecordAdded = await workspaceRegistrationStore.add(canonical)
|
|
26371
|
+
persistedRecordAdded = displayName === void 0 ? await workspaceRegistrationStore.add(canonical) : await workspaceRegistrationStore.add(
|
|
26372
|
+
canonical,
|
|
26373
|
+
displayName
|
|
26374
|
+
);
|
|
26091
26375
|
} catch (err) {
|
|
26092
26376
|
if (!(err instanceof WorkspaceRegistrationStoreCommittedError)) {
|
|
26093
26377
|
throw err;
|
|
@@ -26098,6 +26382,16 @@ function registerWorkspaceManagementRoutes(app, deps) {
|
|
|
26098
26382
|
} catch {
|
|
26099
26383
|
}
|
|
26100
26384
|
}
|
|
26385
|
+
if (persistedRecordAdded) {
|
|
26386
|
+
attachRegistrationIds(runtime, [
|
|
26387
|
+
workspaceRegistrationId(canonical)
|
|
26388
|
+
]);
|
|
26389
|
+
if (displayName !== void 0) {
|
|
26390
|
+
runtime.displayName = displayName;
|
|
26391
|
+
}
|
|
26392
|
+
} else {
|
|
26393
|
+
await restorePersistedDisplayName(runtime, canonical);
|
|
26394
|
+
}
|
|
26101
26395
|
} catch (err) {
|
|
26102
26396
|
persistenceFailed = true;
|
|
26103
26397
|
throw err;
|
|
@@ -26141,6 +26435,7 @@ function registerWorkspaceManagementRoutes(app, deps) {
|
|
|
26141
26435
|
res.status(201).json({
|
|
26142
26436
|
id: runtime.workspaceId,
|
|
26143
26437
|
cwd: runtime.workspaceCwd,
|
|
26438
|
+
...runtime.displayName !== void 0 ? { displayName: runtime.displayName } : {},
|
|
26144
26439
|
primary: runtime.primary,
|
|
26145
26440
|
trusted: runtime.trusted,
|
|
26146
26441
|
...persist ? { persisted: true } : {}
|
|
@@ -26208,6 +26503,98 @@ function registerWorkspaceManagementRoutes(app, deps) {
|
|
|
26208
26503
|
});
|
|
26209
26504
|
return void 0;
|
|
26210
26505
|
}, "resolveManagedRuntime");
|
|
26506
|
+
app.patch(
|
|
26507
|
+
"/workspaces/:workspace",
|
|
26508
|
+
mutate({ strict: true }),
|
|
26509
|
+
async (req, res) => {
|
|
26510
|
+
const body = safeBody2(req);
|
|
26511
|
+
const unsupportedField = Object.keys(body).find(
|
|
26512
|
+
(field) => field !== "displayName"
|
|
26513
|
+
);
|
|
26514
|
+
if (unsupportedField) {
|
|
26515
|
+
res.status(400).json({
|
|
26516
|
+
error: `\`${unsupportedField}\` is not an updatable workspace field`,
|
|
26517
|
+
code: "unsupported_field"
|
|
26518
|
+
});
|
|
26519
|
+
return;
|
|
26520
|
+
}
|
|
26521
|
+
if (!Object.hasOwn(body, "displayName")) {
|
|
26522
|
+
res.status(400).json({
|
|
26523
|
+
error: "No updatable fields provided",
|
|
26524
|
+
code: "empty_patch"
|
|
26525
|
+
});
|
|
26526
|
+
return;
|
|
26527
|
+
}
|
|
26528
|
+
let displayName;
|
|
26529
|
+
try {
|
|
26530
|
+
displayName = body["displayName"] === null ? void 0 : normalizeWorkspaceDisplayName(body["displayName"]);
|
|
26531
|
+
} catch (err) {
|
|
26532
|
+
if (!(err instanceof WorkspaceDisplayNameValidationError)) throw err;
|
|
26533
|
+
res.status(400).json({
|
|
26534
|
+
error: err.message,
|
|
26535
|
+
code: "invalid_display_name"
|
|
26536
|
+
});
|
|
26537
|
+
return;
|
|
26538
|
+
}
|
|
26539
|
+
if (sealed) {
|
|
26540
|
+
sendSealed(res);
|
|
26541
|
+
return;
|
|
26542
|
+
}
|
|
26543
|
+
const runtime = resolveManagedRuntime(req, res);
|
|
26544
|
+
if (!runtime) return;
|
|
26545
|
+
if (inFlight.has(runtime.workspaceCwd)) {
|
|
26546
|
+
res.status(409).json({
|
|
26547
|
+
error: "Workspace registration is in progress",
|
|
26548
|
+
code: "workspace_registration_in_progress"
|
|
26549
|
+
});
|
|
26550
|
+
return;
|
|
26551
|
+
}
|
|
26552
|
+
inFlight.set(runtime.workspaceCwd, "update");
|
|
26553
|
+
operationStarted();
|
|
26554
|
+
try {
|
|
26555
|
+
if (workspaceRegistrationStore && runtime.registrationIds !== void 0 && runtime.registrationIds.length > 0) {
|
|
26556
|
+
try {
|
|
26557
|
+
await workspaceRegistrationStore.setDisplayNameByIds(
|
|
26558
|
+
runtime.registrationIds,
|
|
26559
|
+
displayName
|
|
26560
|
+
);
|
|
26561
|
+
} catch (err) {
|
|
26562
|
+
if (!(err instanceof WorkspaceRegistrationStoreCommittedError)) {
|
|
26563
|
+
throw err;
|
|
26564
|
+
}
|
|
26565
|
+
try {
|
|
26566
|
+
writeStderrLine(`qwen serve: ${err.message}`);
|
|
26567
|
+
} catch {
|
|
26568
|
+
}
|
|
26569
|
+
}
|
|
26570
|
+
}
|
|
26571
|
+
if (displayName === void 0) {
|
|
26572
|
+
delete runtime.displayName;
|
|
26573
|
+
} else {
|
|
26574
|
+
runtime.displayName = displayName;
|
|
26575
|
+
}
|
|
26576
|
+
res.status(200).json({
|
|
26577
|
+
id: runtime.workspaceId,
|
|
26578
|
+
cwd: runtime.workspaceCwd,
|
|
26579
|
+
...runtime.displayName !== void 0 ? { displayName: runtime.displayName } : {},
|
|
26580
|
+
primary: runtime.primary,
|
|
26581
|
+
trusted: runtime.trusted,
|
|
26582
|
+
...runtimeRemoval ? { removable: runtime.removable === true } : {}
|
|
26583
|
+
});
|
|
26584
|
+
} catch (err) {
|
|
26585
|
+
writeStderrLine(
|
|
26586
|
+
`qwen serve: failed to persist workspace display name: ${err instanceof Error ? err.message : String(err)}`
|
|
26587
|
+
);
|
|
26588
|
+
res.status(500).json({
|
|
26589
|
+
error: "Failed to persist workspace display name",
|
|
26590
|
+
code: "workspace_registration_store_error"
|
|
26591
|
+
});
|
|
26592
|
+
} finally {
|
|
26593
|
+
inFlight.delete(runtime.workspaceCwd);
|
|
26594
|
+
operationFinished();
|
|
26595
|
+
}
|
|
26596
|
+
}
|
|
26597
|
+
);
|
|
26211
26598
|
app.delete(
|
|
26212
26599
|
"/workspaces/:workspace",
|
|
26213
26600
|
mutate({ strict: true }),
|
|
@@ -26443,11 +26830,13 @@ function registerWorkspaceManagementRoutes(app, deps) {
|
|
|
26443
26830
|
schemaVersion: snapshot.schemaVersion,
|
|
26444
26831
|
primaryWorkspace: snapshot.primaryWorkspace,
|
|
26445
26832
|
entries: snapshot.workspaces.map((cwd) => {
|
|
26833
|
+
const registrationId = workspaceRegistrationId(cwd);
|
|
26446
26834
|
const runtime = workspaceRegistry.getByWorkspaceCwd(cwd);
|
|
26447
26835
|
return {
|
|
26448
|
-
id:
|
|
26836
|
+
id: registrationId,
|
|
26449
26837
|
cwd,
|
|
26450
|
-
|
|
26838
|
+
...snapshot.displayNames?.[registrationId] !== void 0 ? { displayName: snapshot.displayNames[registrationId] } : {},
|
|
26839
|
+
active: runtime !== void 0 || registrationIsActive(registrationId),
|
|
26451
26840
|
persisted: true
|
|
26452
26841
|
};
|
|
26453
26842
|
})
|
|
@@ -26505,7 +26894,7 @@ function registerWorkspaceManagementRoutes(app, deps) {
|
|
|
26505
26894
|
}
|
|
26506
26895
|
if (storedCwd) {
|
|
26507
26896
|
try {
|
|
26508
|
-
operationCwd =
|
|
26897
|
+
operationCwd = realpathSync2.native(resolve4(storedCwd));
|
|
26509
26898
|
} catch {
|
|
26510
26899
|
operationCwd = resolve4(storedCwd);
|
|
26511
26900
|
}
|
|
@@ -26545,6 +26934,11 @@ function registerWorkspaceManagementRoutes(app, deps) {
|
|
|
26545
26934
|
});
|
|
26546
26935
|
return;
|
|
26547
26936
|
}
|
|
26937
|
+
if (runtime?.registrationIds) {
|
|
26938
|
+
runtime.registrationIds = runtime.registrationIds.filter(
|
|
26939
|
+
(id) => id !== registrationId
|
|
26940
|
+
);
|
|
26941
|
+
}
|
|
26548
26942
|
res.json({
|
|
26549
26943
|
removed: true,
|
|
26550
26944
|
active,
|
|
@@ -26576,6 +26970,8 @@ __name(registerWorkspaceManagementRoutes, "registerWorkspaceManagementRoutes");
|
|
|
26576
26970
|
|
|
26577
26971
|
// packages/cli/src/serve/routes/workspace-git.ts
|
|
26578
26972
|
init_esbuild_shims();
|
|
26973
|
+
import * as fs4 from "node:fs";
|
|
26974
|
+
import * as path15 from "node:path";
|
|
26579
26975
|
function registerWorkspaceGitRoutes(app, deps) {
|
|
26580
26976
|
app.get("/workspace/git", async (_req, res) => {
|
|
26581
26977
|
try {
|
|
@@ -26597,10 +26993,43 @@ function registerWorkspaceQualifiedGitRoutes(app, deps) {
|
|
|
26597
26993
|
const runtime = resolveTrustedRuntime2(deps.workspaceRegistry, req, res);
|
|
26598
26994
|
if (!runtime) return;
|
|
26599
26995
|
const route = "GET /workspaces/:workspace/git";
|
|
26996
|
+
const rawCwd = req.query["cwd"];
|
|
26997
|
+
let gitCwd = runtime.workspaceCwd;
|
|
26998
|
+
if (typeof rawCwd === "string" && rawCwd.length > 0) {
|
|
26999
|
+
try {
|
|
27000
|
+
const resolved = fs4.realpathSync(path15.resolve(rawCwd));
|
|
27001
|
+
const root = fs4.realpathSync(runtime.workspaceCwd);
|
|
27002
|
+
const rel = path15.relative(root, resolved);
|
|
27003
|
+
if (!rel.startsWith("..") && !path15.isAbsolute(rel)) {
|
|
27004
|
+
gitCwd = resolved;
|
|
27005
|
+
}
|
|
27006
|
+
} catch {
|
|
27007
|
+
}
|
|
27008
|
+
}
|
|
26600
27009
|
try {
|
|
26601
|
-
|
|
26602
|
-
await
|
|
26603
|
-
|
|
27010
|
+
if (gitCwd !== runtime.workspaceCwd) {
|
|
27011
|
+
const status = await getGitWorkingTreeStatus(gitCwd).catch(() => null);
|
|
27012
|
+
res.status(200).json(
|
|
27013
|
+
status ? {
|
|
27014
|
+
v: 2,
|
|
27015
|
+
workspaceCwd: gitCwd,
|
|
27016
|
+
branch: status.branch ?? null,
|
|
27017
|
+
detached: status.detached,
|
|
27018
|
+
staged: status.staged,
|
|
27019
|
+
unstaged: status.unstaged,
|
|
27020
|
+
untracked: status.untracked,
|
|
27021
|
+
conflicted: status.conflicted,
|
|
27022
|
+
hasUpstream: status.hasUpstream,
|
|
27023
|
+
ahead: status.ahead,
|
|
27024
|
+
behind: status.behind,
|
|
27025
|
+
stashCount: status.stashCount,
|
|
27026
|
+
...status.operation ? { operation: status.operation } : {},
|
|
27027
|
+
computedAt: Date.now()
|
|
27028
|
+
} : { v: 2, workspaceCwd: gitCwd, branch: null }
|
|
27029
|
+
);
|
|
27030
|
+
} else {
|
|
27031
|
+
res.status(200).json(await deps.gitState.getStatus(gitCwd, runtime.bridge));
|
|
27032
|
+
}
|
|
26604
27033
|
} catch (err) {
|
|
26605
27034
|
deps.sendBridgeError(res, err, { route });
|
|
26606
27035
|
}
|
|
@@ -26623,8 +27052,8 @@ function buildDiffList(workspaceCwd, result) {
|
|
|
26623
27052
|
hiddenCount: 0
|
|
26624
27053
|
};
|
|
26625
27054
|
}
|
|
26626
|
-
const files = [...result.perFileStats.entries()].map(([
|
|
26627
|
-
path:
|
|
27055
|
+
const files = [...result.perFileStats.entries()].map(([path16, s]) => ({
|
|
27056
|
+
path: path16,
|
|
26628
27057
|
oldPath: s.oldPath,
|
|
26629
27058
|
added: s.added,
|
|
26630
27059
|
removed: s.removed,
|
|
@@ -26753,6 +27182,163 @@ function registerWorkspaceQualifiedGitDiffRoutes(app, deps) {
|
|
|
26753
27182
|
}
|
|
26754
27183
|
__name(registerWorkspaceQualifiedGitDiffRoutes, "registerWorkspaceQualifiedGitDiffRoutes");
|
|
26755
27184
|
|
|
27185
|
+
// packages/cli/src/serve/routes/workspace-git-log.ts
|
|
27186
|
+
init_esbuild_shims();
|
|
27187
|
+
function buildLogList(workspaceCwd, result) {
|
|
27188
|
+
if (!result) {
|
|
27189
|
+
return {
|
|
27190
|
+
v: 1,
|
|
27191
|
+
workspaceCwd,
|
|
27192
|
+
available: false,
|
|
27193
|
+
entries: [],
|
|
27194
|
+
hasMore: false
|
|
27195
|
+
};
|
|
27196
|
+
}
|
|
27197
|
+
return {
|
|
27198
|
+
v: 1,
|
|
27199
|
+
workspaceCwd,
|
|
27200
|
+
available: true,
|
|
27201
|
+
entries: result.entries.map((e) => ({
|
|
27202
|
+
sha: e.sha,
|
|
27203
|
+
shortSha: e.shortSha,
|
|
27204
|
+
authorName: e.authorName,
|
|
27205
|
+
authorEmail: e.authorEmail,
|
|
27206
|
+
authorDate: e.authorDate,
|
|
27207
|
+
subject: e.subject,
|
|
27208
|
+
...e.refs ? { refs: e.refs } : {},
|
|
27209
|
+
parents: e.parents
|
|
27210
|
+
})),
|
|
27211
|
+
hasMore: result.hasMore
|
|
27212
|
+
};
|
|
27213
|
+
}
|
|
27214
|
+
__name(buildLogList, "buildLogList");
|
|
27215
|
+
function buildCommitDetail(workspaceCwd, result) {
|
|
27216
|
+
if (!result) {
|
|
27217
|
+
return { v: 1, workspaceCwd, available: false };
|
|
27218
|
+
}
|
|
27219
|
+
return {
|
|
27220
|
+
v: 1,
|
|
27221
|
+
workspaceCwd,
|
|
27222
|
+
available: true,
|
|
27223
|
+
sha: result.sha,
|
|
27224
|
+
shortSha: result.shortSha,
|
|
27225
|
+
authorName: result.authorName,
|
|
27226
|
+
authorEmail: result.authorEmail,
|
|
27227
|
+
authorDate: result.authorDate,
|
|
27228
|
+
subject: result.subject,
|
|
27229
|
+
body: result.body,
|
|
27230
|
+
...result.refs ? { refs: result.refs } : {},
|
|
27231
|
+
parents: result.parents,
|
|
27232
|
+
files: result.files.map((f) => ({
|
|
27233
|
+
path: f.path,
|
|
27234
|
+
added: f.added,
|
|
27235
|
+
removed: f.removed,
|
|
27236
|
+
isBinary: f.isBinary
|
|
27237
|
+
})),
|
|
27238
|
+
filesCount: result.filesCount,
|
|
27239
|
+
linesAdded: result.linesAdded,
|
|
27240
|
+
linesRemoved: result.linesRemoved,
|
|
27241
|
+
hiddenCount: result.hiddenCount
|
|
27242
|
+
};
|
|
27243
|
+
}
|
|
27244
|
+
__name(buildCommitDetail, "buildCommitDetail");
|
|
27245
|
+
function parsePagination(req) {
|
|
27246
|
+
const rawLimit = req.query["limit"];
|
|
27247
|
+
const rawSkip = req.query["skip"];
|
|
27248
|
+
const parsedLimit = typeof rawLimit === "string" ? parseInt(rawLimit, 10) : NaN;
|
|
27249
|
+
const parsedSkip = typeof rawSkip === "string" ? parseInt(rawSkip, 10) : NaN;
|
|
27250
|
+
const limit = Math.min(
|
|
27251
|
+
Math.max(Number.isNaN(parsedLimit) ? DEFAULT_LOG_LIMIT : parsedLimit, 1),
|
|
27252
|
+
MAX_LOG_LIMIT
|
|
27253
|
+
);
|
|
27254
|
+
const skip = Math.max(Number.isNaN(parsedSkip) ? 0 : parsedSkip, 0);
|
|
27255
|
+
return { limit, skip };
|
|
27256
|
+
}
|
|
27257
|
+
__name(parsePagination, "parsePagination");
|
|
27258
|
+
async function handleLogList(req, res, workspaceCwd, sendBridgeError2, route) {
|
|
27259
|
+
try {
|
|
27260
|
+
applyReadHeaders(res);
|
|
27261
|
+
const { limit, skip } = parsePagination(req);
|
|
27262
|
+
const result = await fetchGitLog(workspaceCwd, { limit, skip });
|
|
27263
|
+
res.status(200).json(buildLogList(workspaceCwd, result));
|
|
27264
|
+
} catch (err) {
|
|
27265
|
+
sendBridgeError2(res, err, { route });
|
|
27266
|
+
}
|
|
27267
|
+
}
|
|
27268
|
+
__name(handleLogList, "handleLogList");
|
|
27269
|
+
async function handleCommitDetail(req, res, workspaceCwd, sendBridgeError2, route) {
|
|
27270
|
+
const sha = req.query["sha"];
|
|
27271
|
+
if (typeof sha !== "string" || sha.length === 0 || !/^[0-9a-f]{7,40}$/i.test(sha)) {
|
|
27272
|
+
applyReadHeaders(res);
|
|
27273
|
+
res.status(400).json({
|
|
27274
|
+
errorKind: "parse_error",
|
|
27275
|
+
error: "sha query parameter is required",
|
|
27276
|
+
status: 400
|
|
27277
|
+
});
|
|
27278
|
+
return;
|
|
27279
|
+
}
|
|
27280
|
+
try {
|
|
27281
|
+
applyReadHeaders(res);
|
|
27282
|
+
const result = await fetchGitCommitDetail(workspaceCwd, sha);
|
|
27283
|
+
res.status(200).json(buildCommitDetail(workspaceCwd, result));
|
|
27284
|
+
} catch (err) {
|
|
27285
|
+
sendBridgeError2(res, err, { route });
|
|
27286
|
+
}
|
|
27287
|
+
}
|
|
27288
|
+
__name(handleCommitDetail, "handleCommitDetail");
|
|
27289
|
+
function registerWorkspaceGitLogRoutes(app, deps) {
|
|
27290
|
+
app.get("/workspace/git/log", (req, res) => {
|
|
27291
|
+
void handleLogList(
|
|
27292
|
+
req,
|
|
27293
|
+
res,
|
|
27294
|
+
deps.boundWorkspace,
|
|
27295
|
+
deps.sendBridgeError,
|
|
27296
|
+
"GET /workspace/git/log"
|
|
27297
|
+
);
|
|
27298
|
+
});
|
|
27299
|
+
app.get("/workspace/git/log/commit", (req, res) => {
|
|
27300
|
+
void handleCommitDetail(
|
|
27301
|
+
req,
|
|
27302
|
+
res,
|
|
27303
|
+
deps.boundWorkspace,
|
|
27304
|
+
deps.sendBridgeError,
|
|
27305
|
+
"GET /workspace/git/log/commit"
|
|
27306
|
+
);
|
|
27307
|
+
});
|
|
27308
|
+
}
|
|
27309
|
+
__name(registerWorkspaceGitLogRoutes, "registerWorkspaceGitLogRoutes");
|
|
27310
|
+
function resolveTrustedRuntime4(registry, req, res) {
|
|
27311
|
+
const runtime = resolveWorkspaceRuntimeFromParam(registry, req, res);
|
|
27312
|
+
if (!runtime) return null;
|
|
27313
|
+
return requireTrustedWorkspaceRuntime(runtime, res) ? runtime : null;
|
|
27314
|
+
}
|
|
27315
|
+
__name(resolveTrustedRuntime4, "resolveTrustedRuntime");
|
|
27316
|
+
function registerWorkspaceQualifiedGitLogRoutes(app, deps) {
|
|
27317
|
+
app.get("/workspaces/:workspace/git/log", (req, res) => {
|
|
27318
|
+
const runtime = resolveTrustedRuntime4(deps.workspaceRegistry, req, res);
|
|
27319
|
+
if (!runtime) return;
|
|
27320
|
+
void handleLogList(
|
|
27321
|
+
req,
|
|
27322
|
+
res,
|
|
27323
|
+
runtime.workspaceCwd,
|
|
27324
|
+
deps.sendBridgeError,
|
|
27325
|
+
"GET /workspaces/:workspace/git/log"
|
|
27326
|
+
);
|
|
27327
|
+
});
|
|
27328
|
+
app.get("/workspaces/:workspace/git/log/commit", (req, res) => {
|
|
27329
|
+
const runtime = resolveTrustedRuntime4(deps.workspaceRegistry, req, res);
|
|
27330
|
+
if (!runtime) return;
|
|
27331
|
+
void handleCommitDetail(
|
|
27332
|
+
req,
|
|
27333
|
+
res,
|
|
27334
|
+
runtime.workspaceCwd,
|
|
27335
|
+
deps.sendBridgeError,
|
|
27336
|
+
"GET /workspaces/:workspace/git/log/commit"
|
|
27337
|
+
);
|
|
27338
|
+
});
|
|
27339
|
+
}
|
|
27340
|
+
__name(registerWorkspaceQualifiedGitLogRoutes, "registerWorkspaceQualifiedGitLogRoutes");
|
|
27341
|
+
|
|
26756
27342
|
// packages/cli/src/serve/workspace-git-state.ts
|
|
26757
27343
|
init_esbuild_shims();
|
|
26758
27344
|
var WorkspaceGitState = class {
|
|
@@ -28483,6 +29069,7 @@ function createServeApp(opts, getPort = () => opts.port, deps = {}) {
|
|
|
28483
29069
|
maxPendingPromptsPerSession: opts.maxPendingPromptsPerSession,
|
|
28484
29070
|
eventRingSize: opts.eventRingSize,
|
|
28485
29071
|
compactedReplayMaxBytes: opts.compactedReplayMaxBytes,
|
|
29072
|
+
initializeTimeoutMs: opts.initializeTimeoutMs,
|
|
28486
29073
|
permissionResponseTimeoutMs: opts.permissionResponseTimeoutMs,
|
|
28487
29074
|
boundWorkspace,
|
|
28488
29075
|
sessionShellCommandEnabled,
|
|
@@ -28759,6 +29346,14 @@ function createServeApp(opts, getPort = () => opts.port, deps = {}) {
|
|
|
28759
29346
|
workspaceRegistry,
|
|
28760
29347
|
sendBridgeError: sendBridgeError2
|
|
28761
29348
|
});
|
|
29349
|
+
registerWorkspaceGitLogRoutes(app, {
|
|
29350
|
+
boundWorkspace: primaryBoundWorkspace,
|
|
29351
|
+
sendBridgeError: sendBridgeError2
|
|
29352
|
+
});
|
|
29353
|
+
registerWorkspaceQualifiedGitLogRoutes(app, {
|
|
29354
|
+
workspaceRegistry,
|
|
29355
|
+
sendBridgeError: sendBridgeError2
|
|
29356
|
+
});
|
|
28762
29357
|
mountWorkspaceMemoryRoutes(app, {
|
|
28763
29358
|
bridge: primaryBridge,
|
|
28764
29359
|
boundWorkspace: primaryBoundWorkspace,
|