gerege-cli 0.26.7 → 0.26.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundled/gerege-video/SKILL.md +22 -0
- package/bundled/gerege-video/scripts/video.js +137 -0
- package/chunks/{MaxSizedBox-LSNOJEKM.js → MaxSizedBox-LUINLOQW.js} +1 -1
- package/chunks/{StandaloneSessionPicker-KSYGPMEV.js → StandaloneSessionPicker-B7N4QO5D.js} +1 -1
- package/chunks/{acp-subagent-executor-NSW2MFUI.js → acp-subagent-executor-J6H6FKUT.js} +1 -1
- package/chunks/{acpAgent-3DTOHTDM.js → acpAgent-XG6SM2VU.js} +3 -3
- package/chunks/{advisor-7JGQPS7X.js → advisor-SZVPQNPA.js} +1 -1
- package/chunks/{agent-PNKQJGDO.js → agent-N7QF7BJS.js} +1 -1
- package/chunks/{agent-headless-7D33X7QQ.js → agent-headless-GLP5GUEX.js} +1 -1
- package/chunks/{agent-host-client-3R2MAUVE.js → agent-host-client-H4VOB3M6.js} +1 -1
- package/chunks/{agent-host-connections-2D7DECAE.js → agent-host-connections-E4C3OC4M.js} +1 -1
- package/chunks/{anthropicContentGenerator-MGTJJGEQ.js → anthropicContentGenerator-5VTWQLT5.js} +1 -1
- package/chunks/{autofix-pr-OIHHZSPQ.js → autofix-pr-HDYQDJS4.js} +1 -1
- package/chunks/{batch-6UDAMPAA.js → batch-3CRVN5VJ.js} +1 -1
- package/chunks/{bridge-QXVXPNJ6.js → bridge-NZ6WVBLQ.js} +1 -1
- package/chunks/{channel-settings-store-P4W4R5SJ.js → channel-settings-store-Z7I2JI6M.js} +1 -1
- package/chunks/{chunk-HVP4UF2Q.js → chunk-236DHGNH.js} +1 -1
- package/chunks/{chunk-GA35LMSX.js → chunk-2M3ND5WN.js} +1 -1
- package/chunks/{chunk-IZXHCHJD.js → chunk-36A6EXHB.js} +1 -1
- package/chunks/{chunk-QHYSRPQR.js → chunk-3ANIQTDT.js} +1 -1
- package/chunks/{chunk-WK666FGZ.js → chunk-3QTR2HAE.js} +3 -3
- package/chunks/{chunk-3EZ5GCUT.js → chunk-3TTHYXT3.js} +1 -1
- package/chunks/{chunk-YWK3E4WJ.js → chunk-4CE4GMDL.js} +1 -1
- package/chunks/{chunk-VUNHJ74J.js → chunk-4FVT657Y.js} +1 -1
- package/chunks/{chunk-BY46PCWY.js → chunk-4HSISRRA.js} +1 -1
- package/chunks/{chunk-2LMSDH6P.js → chunk-4SZUJ5RT.js} +1 -1
- package/chunks/{chunk-53IB4U4E.js → chunk-57D2OB3I.js} +1 -1
- package/chunks/{chunk-QTKPC24L.js → chunk-5FGBLIXB.js} +1 -1
- package/chunks/{chunk-5TWAP4OG.js → chunk-5HX2QGVR.js} +1 -1
- package/chunks/{chunk-K7GN4CMV.js → chunk-5ZNXAWOG.js} +6 -6
- package/chunks/{chunk-QTVSPQZQ.js → chunk-6CKX56LJ.js} +1 -1
- package/chunks/{chunk-4W27Z3OL.js → chunk-6NIQFWXP.js} +1 -1
- package/chunks/{chunk-6YFNUVJR.js → chunk-6PC6MZHL.js} +1 -1
- package/chunks/{chunk-DQQN2HOP.js → chunk-6VQKGKMJ.js} +1 -1
- package/chunks/{chunk-MXZXQUVP.js → chunk-6ZEMLEK2.js} +1 -1
- package/chunks/{chunk-RT6J7PV4.js → chunk-72VY2PJA.js} +1 -1
- package/chunks/{chunk-EEPNACXJ.js → chunk-75I3NYBD.js} +1 -1
- package/chunks/{chunk-ATTJQLQV.js → chunk-76L7ZDEK.js} +1 -1
- package/chunks/{chunk-T3CQ72HC.js → chunk-7XQ5D34E.js} +6 -6
- package/chunks/{chunk-4AKTP4MM.js → chunk-AYX75VXG.js} +1 -1
- package/chunks/{chunk-MDCA4I63.js → chunk-BBDFEMCF.js} +1 -1
- package/chunks/{chunk-N4ZQC5HB.js → chunk-BOTX7S66.js} +1 -1
- package/chunks/{chunk-UVMLWDRU.js → chunk-CY2QKKZA.js} +1 -1
- package/chunks/{chunk-W2CV36HT.js → chunk-D5JWQUID.js} +1 -1
- package/chunks/{chunk-WEPC42YR.js → chunk-DMIPB7RZ.js} +1 -1
- package/chunks/{chunk-BVV7UXES.js → chunk-DSKA3P2C.js} +1 -1
- package/chunks/{chunk-SAVYMUU3.js → chunk-DVC65H4X.js} +1 -1
- package/chunks/{chunk-MS2XCBPP.js → chunk-DVJSDCMX.js} +1 -1
- package/chunks/{chunk-4QOVM2LL.js → chunk-E6CPFQX2.js} +1 -1
- package/chunks/{chunk-LYFRGP42.js → chunk-EIFBGEXJ.js} +1 -1
- package/chunks/{chunk-3ICJI5KW.js → chunk-EQOHDAYU.js} +1 -1
- package/chunks/{chunk-Q5RRVBTY.js → chunk-EZPM4DLR.js} +1 -1
- package/chunks/{chunk-ISQMHOCC.js → chunk-F6U6T7QD.js} +1 -1
- package/chunks/{chunk-WCI33URB.js → chunk-FCGFBUHS.js} +1 -1
- package/chunks/{chunk-CK3OKTTL.js → chunk-G2LTZU67.js} +1 -1
- package/chunks/{chunk-WSI4G7XC.js → chunk-GMJSEK4V.js} +1 -1
- package/chunks/{chunk-QONPET6Y.js → chunk-HJMUBVXZ.js} +2 -2
- package/chunks/{chunk-H5EXNXGW.js → chunk-HQZTAA2U.js} +1 -1
- package/chunks/{chunk-5R2JIZID.js → chunk-I63TIQOI.js} +1 -1
- package/chunks/{chunk-IY7M5HKF.js → chunk-I65LBJN7.js} +1 -1
- package/chunks/{chunk-H34KVVI4.js → chunk-IBDOC27R.js} +1 -1
- package/chunks/{chunk-N6EFYQ7M.js → chunk-IKF2HWEV.js} +1 -1
- package/chunks/{chunk-CDKBM72V.js → chunk-K6NS2HXT.js} +1 -1
- package/chunks/{chunk-BIPPD7W6.js → chunk-KTRNYPQP.js} +1 -1
- package/chunks/{chunk-DTX2OVQW.js → chunk-L3ANU5JZ.js} +1 -1
- package/chunks/{chunk-WXK7Z45R.js → chunk-LKPMADUO.js} +1 -1
- package/chunks/{chunk-4VR4DUUD.js → chunk-M56Y2B6N.js} +1 -1
- package/chunks/{chunk-YY4GWNTU.js → chunk-N5KRBAK5.js} +2 -2
- package/chunks/{chunk-DVUKYOCJ.js → chunk-NA2WJPOU.js} +1 -1
- package/chunks/{chunk-O3TUZQP4.js → chunk-NGOWLXYK.js} +1 -1
- package/chunks/{chunk-F7622ZRQ.js → chunk-NL7P73ZP.js} +1 -1
- package/chunks/{chunk-U5YOAOU3.js → chunk-NS3QR7D3.js} +1 -1
- package/chunks/{chunk-FTF2NFLB.js → chunk-O5JCCBMQ.js} +1 -1
- package/chunks/{chunk-DEJ47KJE.js → chunk-OOKFFZHF.js} +1 -1
- package/chunks/{chunk-4A663FE6.js → chunk-OTYPLLMT.js} +5 -5
- package/chunks/{chunk-NPAENNRO.js → chunk-P7NHWX27.js} +1 -1
- package/chunks/{chunk-HXTYFGSQ.js → chunk-PC5QZUKR.js} +1 -1
- package/chunks/{chunk-RULGA7WE.js → chunk-PS7MQL57.js} +2 -2
- package/chunks/{chunk-FKUDVIME.js → chunk-PXWHOFAA.js} +1 -1
- package/chunks/{chunk-6WV5RKYB.js → chunk-Q65LVCDR.js} +1 -1
- package/chunks/{chunk-ULLW2AYD.js → chunk-QDUDLELH.js} +1 -1
- package/chunks/{chunk-PMBI46K4.js → chunk-QF22ILPV.js} +1 -1
- package/chunks/{chunk-LY4XTBL4.js → chunk-QW7MAG2E.js} +1 -1
- package/chunks/{chunk-IIHUDJX7.js → chunk-RXK6XD6F.js} +1 -1
- package/chunks/{chunk-QSPXKBUX.js → chunk-SVDFCWS7.js} +1 -1
- package/chunks/{chunk-NHPKD7LY.js → chunk-TKP3GAUI.js} +1 -1
- package/chunks/{chunk-WF7Q3ZSQ.js → chunk-TUS74LFI.js} +1 -1
- package/chunks/{chunk-OZFZBGZG.js → chunk-U7YGHPSL.js} +1 -1
- package/chunks/{chunk-G4MWPXNY.js → chunk-UB37RBSK.js} +1 -1
- package/chunks/{chunk-4LC4INFI.js → chunk-UK5SIRH4.js} +1 -1
- package/chunks/{chunk-7HFFTOAD.js → chunk-UTTSBCFR.js} +1 -1
- package/chunks/{chunk-IQMKQKKD.js → chunk-UYV4ZVXY.js} +2 -2
- package/chunks/{chunk-E3KWSRJN.js → chunk-VC3JJL7E.js} +1 -1
- package/chunks/{chunk-FRVXSKL4.js → chunk-VKWVIWLK.js} +1 -1
- package/chunks/{chunk-L7LO3YRT.js → chunk-VUI6STKU.js} +1 -1
- package/chunks/{chunk-VK7LOUOJ.js → chunk-W3YXE55M.js} +1 -1
- package/chunks/{chunk-JHC22BZH.js → chunk-WAIPC47V.js} +1 -1
- package/chunks/{chunk-P2MZZMCS.js → chunk-WMJ6UHDP.js} +1 -1
- package/chunks/{chunk-6JAXAFX7.js → chunk-WZU2ECUD.js} +1 -1
- package/chunks/{chunk-HJLRKM3W.js → chunk-XAGIZY2Y.js} +1 -1
- package/chunks/{chunk-2J2BQ3PL.js → chunk-XGZYVULJ.js} +2 -2
- package/chunks/{chunk-QVHDM6N7.js → chunk-XJIHDVPX.js} +1 -1
- package/chunks/{chunk-ZFOEVHWG.js → chunk-XVDIHFRH.js} +1 -1
- package/chunks/{chunk-F5SLLEJY.js → chunk-YMEW4TTT.js} +1 -1
- package/chunks/{chunk-NYBYDW6R.js → chunk-Z32URWBG.js} +1 -1
- package/chunks/{chunk-WMLYHZZX.js → chunk-Z6HRXHJP.js} +1 -1
- package/chunks/{chunk-UM5KBBYP.js → chunk-ZO4F6ZWR.js} +1 -1
- package/chunks/{codex-subagent-executor-GPTKVP7H.js → codex-subagent-executor-DDKYNU42.js} +1 -1
- package/chunks/{config-utils-6B5FHBSF.js → config-utils-S7Z2ZZ2E.js} +1 -1
- package/chunks/{contextCommand-FGRDE3GA.js → contextCommand-7F4PGV2A.js} +1 -1
- package/chunks/{core-runtime-OFEHSKDB.js → core-runtime-LBH3U7ZF.js} +1 -1
- package/chunks/{create-sub-session-D2KEWVHQ.js → create-sub-session-56DS2T6L.js} +1 -1
- package/chunks/{cron-create-RFGGKTL7.js → cron-create-PBP3C46Q.js} +1 -1
- package/chunks/{daemon-git-worktree-guard-AV752IOZ.js → daemon-git-worktree-guard-WJS6FBDA.js} +1 -1
- package/chunks/{daemon-status-provider-GHQBRDMC.js → daemon-status-provider-UPPAEHJ6.js} +1 -1
- package/chunks/{daemon-trust-policy-24ENJNTQ.js → daemon-trust-policy-4Z5HSNUX.js} +1 -1
- package/chunks/{daemon-trust-policy-monitor-NMSQAGWV.js → daemon-trust-policy-monitor-WFWDOYX3.js} +1 -1
- package/chunks/{deferred-core-runtime-5BAMFFOI.js → deferred-core-runtime-MJYNEA4N.js} +1 -1
- package/chunks/{edit-XCECLEH3.js → edit-U7TGKKK3.js} +1 -1
- package/chunks/{enterPlanMode-SEN2PMRM.js → enterPlanMode-27HC5AXN.js} +1 -1
- package/chunks/{environment-CCPQJYKS.js → environment-PHWY6C4P.js} +1 -1
- package/chunks/{errors-Y6HHUTGK.js → errors-F2EYYFI3.js} +1 -1
- package/chunks/{execution-tool-HADWGMIG.js → execution-tool-O4KJ5SMM.js} +1 -1
- package/chunks/{execution-worker-GZS7WOQL.js → execution-worker-AMFXZ7JD.js} +1 -1
- package/chunks/{exitPlanMode-76B5HDLT.js → exitPlanMode-LDYL43PB.js} +1 -1
- package/chunks/{fast-path-OEV7LQYV.js → fast-path-HTODEVOR.js} +1 -1
- package/chunks/{glob-NLWCQRMS.js → glob-NKQJJZND.js} +1 -1
- package/chunks/{goal-tools-43XV33BT.js → goal-tools-47I455VV.js} +1 -1
- package/chunks/{handleAutoUpdate-JDQWGSSP.js → handleAutoUpdate-MJKTDJUO.js} +1 -1
- package/chunks/{i18n-JW6BVEGF.js → i18n-TCOB4TC5.js} +1 -1
- package/chunks/{initializer-UT6JLZ3O.js → initializer-NLYOGZZS.js} +1 -1
- package/chunks/{installationInfo-LKWDV3S2.js → installationInfo-TF2RSJOG.js} +1 -1
- package/chunks/{interactive-mod-session-2KWKYVPC.js → interactive-mod-session-5F7R3KSA.js} +1 -1
- package/chunks/{list-BKINK3S2.js → list-U2AEVLFP.js} +1 -1
- package/chunks/{llm-3RWXAVM2.js → llm-EV2QTQBU.js} +4 -4
- package/chunks/{llm-content-generator-MDRBSH73.js → llm-content-generator-ZXUSPPG2.js} +1 -1
- package/chunks/{loadedSettingsAdapter-WWJUKWUN.js → loadedSettingsAdapter-TLRI22X7.js} +1 -1
- package/chunks/{local-TT4FLCTR.js → local-ZTSBSKWV.js} +1 -1
- package/chunks/{local-execution-environment-OBA6VWYL.js → local-execution-environment-F263PSIM.js} +1 -1
- package/chunks/{loggingContentGenerator-CK7IKYQH.js → loggingContentGenerator-2XHSIJQD.js} +1 -1
- package/chunks/{loop-wakeup-4MSRX3DY.js → loop-wakeup-5ET3JHUT.js} +1 -1
- package/chunks/{manage-memory-PX5PZJKZ.js → manage-memory-MJEQ47H2.js} +1 -1
- package/chunks/{managed-execution-engine-WMAUR3ZK.js → managed-execution-engine-ODPR5OEH.js} +1 -1
- package/chunks/{managed-local-serve-X7REHGB4.js → managed-local-serve-S5R4Z5OL.js} +1 -1
- package/chunks/managed-npm-update-BUI5APGY.js +8 -0
- package/chunks/{managed-runtime-attestation-worker-F4AT53M5.js → managed-runtime-attestation-worker-BQP4E7LQ.js} +1 -1
- package/chunks/{managed-runtime-bootstrap-3BP5JRJX.js → managed-runtime-bootstrap-SRBDFSKK.js} +1 -1
- package/chunks/{managed-runtime-session-worker-2PO7J5UK.js → managed-runtime-session-worker-UI23BTYJ.js} +1 -1
- package/chunks/{managed-runtime-ssh-worker-4N7EMRSV.js → managed-runtime-ssh-worker-HU4CIJRK.js} +1 -1
- package/chunks/{managed-session-authority-MYOYTUM2.js → managed-session-authority-XSSTLAEY.js} +1 -1
- package/chunks/{mcp-5OTEMZ7P.js → mcp-WLHDOKP7.js} +1 -1
- package/chunks/{memory-TNW7RSAV.js → memory-OUUHPSDD.js} +1 -1
- package/chunks/{model-call-collection-KNTWFZQS.js → model-call-collection-4A2EB76B.js} +1 -1
- package/chunks/{model-configuration-U5C5P5UQ.js → model-configuration-4CGUFKEP.js} +1 -1
- package/chunks/{modelConfigUtils-R4KFI2WK.js → modelConfigUtils-HUEERWBA.js} +1 -1
- package/chunks/{monitor-RD2PFK42.js → monitor-FXL5UNMP.js} +1 -1
- package/chunks/{nonInteractiveCli-QQ72HZSH.js → nonInteractiveCli-W7M2O43W.js} +1 -1
- package/chunks/{nonInteractiveToolExecutor-QPQYR6IS.js → nonInteractiveToolExecutor-EMLI363Q.js} +1 -1
- package/chunks/{notebook-edit-YLRN3UZT.js → notebook-edit-R5RSLSSH.js} +1 -1
- package/chunks/{omni-CUJ52EW5.js → omni-DNZGITTE.js} +1 -1
- package/chunks/{openaiContentGenerator-6B5MAU54.js → openaiContentGenerator-PKOPYMHR.js} +1 -1
- package/chunks/{openaiResponsesContentGenerator-I245I3R7.js → openaiResponsesContentGenerator-MHH2MF3V.js} +1 -1
- package/chunks/{pidfile-P2HIGAUA.js → pidfile-5ZNJWMKG.js} +1 -1
- package/chunks/{processUtils-JSKN5UGS.js → processUtils-JIHQDASW.js} +1 -1
- package/chunks/{prompt-terminal-ledger-F5TSXVGU.js → prompt-terminal-ledger-L3LZ5SLR.js} +1 -1
- package/chunks/{qwenContentGenerator-IEDZONWG.js → qwenContentGenerator-QCZL7HJJ.js} +1 -1
- package/chunks/{reactive-degrade-FYZBJCF6.js → reactive-degrade-YUXOUQG4.js} +1 -1
- package/chunks/{read-file-VNZNSD6X.js → read-file-FBNU3AVX.js} +1 -1
- package/chunks/{resumeHistoryUtils-IDPE6N2N.js → resumeHistoryUtils-5FPRTI4A.js} +1 -1
- package/chunks/{review-TBJRZWTD.js → review-NLFYSNM3.js} +1 -1
- package/chunks/{ripGrep-4W5B5FOE.js → ripGrep-JUAPC5LD.js} +1 -1
- package/chunks/{run-qwen-serve-44X262G5.js → run-qwen-serve-JP64UQ3Y.js} +1 -1
- package/chunks/{runtime-6H6LKD73.js → runtime-D2QUYM6U.js} +1 -1
- package/chunks/{sandboxConfig-SQXDRGVN.js → sandboxConfig-7VZJQV6H.js} +1 -1
- package/chunks/{scheduled-tasks-62IZKHJG.js → scheduled-tasks-PC6EH75E.js} +1 -1
- package/chunks/{scheduler-QUCXJYRL.js → scheduler-RUV2FNDR.js} +1 -1
- package/chunks/{search-memory-TC2Z34QN.js → search-memory-YJTJ7BRU.js} +1 -1
- package/chunks/{send-message-TFZX7KI7.js → send-message-EEEFFTHX.js} +1 -1
- package/chunks/{serve-WSICDFGG.js → serve-KMIZDYON.js} +1 -1
- package/chunks/{server-GYYVTNGY.js → server-DUPK3V7B.js} +3 -3
- package/chunks/{session-KF3O23ZJ.js → session-CW5YMFMP.js} +1 -1
- package/chunks/{session-attachments-root-7HFUSONH.js → session-attachments-root-5H5GFHLI.js} +1 -1
- package/chunks/{session-execution-engine-selector-NVILT6BR.js → session-execution-engine-selector-MVXM2HZW.js} +1 -1
- package/chunks/{session-pr-refresh-3KDFTDEV.js → session-pr-refresh-4UPONX4L.js} +1 -1
- package/chunks/{sessionService-XRTFLPDW.js → sessionService-GGCYISSL.js} +1 -1
- package/chunks/{settings-QPPK6WXE.js → settings-AASJCESS.js} +1 -1
- package/chunks/{shell-WYQDZWL7.js → shell-V4WWLW3Q.js} +1 -1
- package/chunks/{skill-FYPT6AU7.js → skill-NDEBB7VX.js} +1 -1
- package/chunks/{skill-settings-OGFI5KZF.js → skill-settings-YAI3GYU5.js} +1 -1
- package/chunks/{spawnChannel-ANOOVPG7.js → spawnChannel-6JKVJAXZ.js} +1 -1
- package/chunks/{standalone-update-45WTDY4E.js → standalone-update-NJP5OCKJ.js} +1 -1
- package/chunks/{start-opentui-ui-TL5WK33V.js → start-opentui-ui-M4B4SXRM.js} +1 -1
- package/chunks/{startInteractiveUI-N2IREVBM.js → startInteractiveUI-O4JUDEAU.js} +1 -1
- package/chunks/{team-create-R77PRZ5U.js → team-create-NLJ7QBLD.js} +1 -1
- package/chunks/{team-plan-approval-6DCRKB5I.js → team-plan-approval-XKYPVWNG.js} +1 -1
- package/chunks/{terminal-image-renderer-TB7EX2WW.js → terminal-image-renderer-47TD747D.js} +1 -1
- package/chunks/{theme-manager-RQDXJGVR.js → theme-manager-AANEBPLJ.js} +1 -1
- package/chunks/{tool-call-LVB4NCDT.js → tool-call-ETH3LS7Y.js} +1 -1
- package/chunks/{tool-result-media-LRBB2KS6.js → tool-result-media-EFOEPAF2.js} +1 -1
- package/chunks/{tool-search-OG73QAQZ.js → tool-search-J3CF5PRN.js} +1 -1
- package/chunks/{total-session-admission-A4CUF6AD.js → total-session-admission-3DC52PLQ.js} +1 -1
- package/chunks/{trustedFolders-LSGOYTU2.js → trustedFolders-4KPWZZKB.js} +1 -1
- package/chunks/{update-relaunch-OGC6BZO7.js → update-relaunch-A67BS7QS.js} +1 -1
- package/chunks/{updateCheck-7J3GXTER.js → updateCheck-X623JRSY.js} +1 -1
- package/chunks/{upload-config-ML5XEJIF.js → upload-config-X2CR3F26.js} +1 -1
- package/chunks/{useAutoAcceptIndicator-6DH6GQ2X.js → useAutoAcceptIndicator-INIOQGJH.js} +1 -1
- package/chunks/{validateNonInterActiveAuth-KJDAGZCM.js → validateNonInterActiveAuth-XJ2U5CLB.js} +1 -1
- package/chunks/{version-7JN2YXL2.js → version-MFHRMM7W.js} +1 -1
- package/chunks/{web-fetch-42ZR4FEZ.js → web-fetch-3GEJ62DH.js} +1 -1
- package/chunks/{web-search-74NLPMZJ.js → web-search-WJZO3Q3A.js} +1 -1
- package/chunks/{workflow-WNPHX42I.js → workflow-ML7ITCMH.js} +1 -1
- package/chunks/{workflow-ancestor-trust-HGF6G7LQ.js → workflow-ancestor-trust-M3VFMS73.js} +1 -1
- package/chunks/{workspace-agents-3YFBFAK3.js → workspace-agents-YFZMV7EF.js} +1 -1
- package/chunks/{workspace-providers-status-EPJI6KRV.js → workspace-providers-status-3COKLBCI.js} +1 -1
- package/chunks/{workspace-recovery-worker-T3FK5YOD.js → workspace-recovery-worker-QURA3WFZ.js} +1 -1
- package/chunks/{workspace-registration-store-VEXYBDMA.js → workspace-registration-store-F3AGIOBW.js} +1 -1
- package/chunks/{workspace-registry-NRZYTP2X.js → workspace-registry-QUBL3RW6.js} +1 -1
- package/chunks/{workspace-runtime-coordinator-USNSTP2V.js → workspace-runtime-coordinator-22TSDHXX.js} +1 -1
- package/chunks/{workspace-service-USATWO56.js → workspace-service-UUENTHNO.js} +1 -1
- package/chunks/{workspace-skills-status-M5JTSFDL.js → workspace-skills-status-NNQQBBCJ.js} +1 -1
- package/chunks/{workspace-trust-reconciler-ZUZ2O5WC.js → workspace-trust-reconciler-3CMMNCGG.js} +1 -1
- package/chunks/{write-file-UMJVKE4S.js → write-file-DEAFIK4C.js} +1 -1
- package/chunks/{zoom-image-76XYHQ3Z.js → zoom-image-YYO22PQG.js} +1 -1
- package/cli-entry.js +2 -3
- package/cli.js +2 -2
- package/execution-worker.js +1 -1
- package/export-transcript-document.js +1 -1
- package/package.json +2 -12
- package/chunks/managed-npm-update-6HUVAJH7.js +0 -8
- package/opentui-assets/@opentui/core/assets/javascript/highlights.scm +0 -205
- package/opentui-assets/@opentui/core/assets/javascript/tree-sitter-javascript.wasm +0 -0
- package/opentui-assets/@opentui/core/assets/markdown/highlights.scm +0 -150
- package/opentui-assets/@opentui/core/assets/markdown/injections.scm +0 -27
- package/opentui-assets/@opentui/core/assets/markdown/tree-sitter-markdown.wasm +0 -0
- package/opentui-assets/@opentui/core/assets/markdown_inline/highlights.scm +0 -115
- package/opentui-assets/@opentui/core/assets/markdown_inline/tree-sitter-markdown_inline.wasm +0 -0
- package/opentui-assets/@opentui/core/assets/typescript/highlights.scm +0 -604
- package/opentui-assets/@opentui/core/assets/typescript/tree-sitter-typescript.wasm +0 -0
- package/opentui-assets/@opentui/core/assets/zig/highlights.scm +0 -284
- package/opentui-assets/@opentui/core/assets/zig/tree-sitter-zig.wasm +0 -0
- package/opentui-assets/@opentui/core/parser.worker.js +0 -4566
- package/opentui-assets/@opentui/core-darwin-arm64/libopentui.dylib +0 -0
- package/opentui-assets/@opentui/core-darwin-x64/libopentui.dylib +0 -0
- package/opentui-assets/@opentui/core-linux-arm64/libopentui.so +0 -0
- package/opentui-assets/@opentui/core-linux-x64/libopentui.so +0 -0
- package/opentui-assets/web-tree-sitter/tree-sitter.wasm +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Force strict mode and setup for ESM
|
|
2
2
|
"use strict";
|
|
3
|
-
import{buildPermissionSettings}from"./chunk-5JZNZNAX.js";import{resolveVoiceStreamConfig,resolveVoiceTranscriptionConfig,transcribeVoiceAudio}from"./chunk-4ME3BUJK.js";import{getVoiceSettingsScope,isSelectableVoiceModel,isVoiceEnabled,readVoiceLanguage,readVoiceMode,readVoiceModel,resolveVoiceTransport}from"./chunk-EKRUF347.js";import{evaluateDaemonWorkspaceTrust,readDaemonTrustPolicySnapshot}from"./chunk-FTF2NFLB.js";import{WorkspacePermissionRulesSessionRequiredError,WorkspaceSettingsPartialPersistError,WorkspaceSkillNotFoundError,WorkspaceTrustGrantIneffectiveError}from"./chunk-PM5O2I2V.js";import{MCP_RESTART_SERVER_DEADLINE_MS}from"./chunk-IFPLGH5C.js";import{BridgeChannelClosedError,SERVE_CONTROL_EXT_METHODS,SERVE_STATUS_EXT_METHODS,STATUS_SCHEMA_VERSION,createIdleAcpPreflightCells,createIdleEnvStatus,createIdleWorkspaceExtensionsStatus,createIdleWorkspaceHooksStatus,createIdleWorkspaceMcpStatus,createIdleWorkspaceProvidersStatus,createIdleWorkspaceSkillsStatus,mapDomainErrorToErrorKind}from"./chunk-LUDNUVSA.js";import{McpServerNotFoundError,McpServerRestartFailedError,SessionNotFoundError,WorkspaceChangePartiallyAppliedError,WorkspaceInitConflictError,WorkspaceInitPathEscapeError,WorkspaceInitRaceError,WorkspaceInitSymlinkError}from"./chunk-VTZZXEWA.js";import{publicProviderBaseUrl}from"./chunk-GT4TCQ3R.js";import{getPersistScopeForModelSelection,loadSettings}from"./chunk-Q5RRVBTY.js";import{getWorkspaceTrustStatus,loadTrustedFolders}from"./chunk-YWK3E4WJ.js";import{SkillManager,require_buffer_crc32,require_fd_slicer}from"./chunk-T3CQ72HC.js";import{sanitizeChildEnv}from"./chunk-LMJPU2JM.js";import{ModelsConfig}from"./chunk-ET2Z7ZGF.js";import{writeStderrLine,writeStderrLineSafe}from"./chunk-M4ECEHLX.js";import{createDebugLogger}from"./chunk-JAUJI56S.js";import{Storage}from"./chunk-EPODBRBP.js";import{init_esbuild_shims}from"./chunk-VKDAXTCZ.js";import{__commonJS,__name,__require,__toESM}from"./chunk-KBWJGX7I.js";var require_yauzl=__commonJS({"packages/cli/node_modules/yauzl/index.js"(exports){init_esbuild_shims();var fs3=__require("fs");var zlib=__require("zlib");var fd_slicer=require_fd_slicer();var crc32=require_buffer_crc32();var util=__require("util");var EventEmitter=__require("events").EventEmitter;var Transform2=__require("stream").Transform;var PassThrough2=__require("stream").PassThrough;var Writable=__require("stream").Writable;exports.open=open;exports.fromFd=fromFd;exports.fromBuffer=fromBuffer2;exports.fromRandomAccessReader=fromRandomAccessReader;exports.dosDateTimeToDate=dosDateTimeToDate;exports.validateFileName=validateFileName;exports.ZipFile=ZipFile;exports.Entry=Entry;exports.RandomAccessReader=RandomAccessReader;function open(path3,options,callback){if(typeof options==="function"){callback=options;options=null}if(options==null)options={};if(options.autoClose==null)options.autoClose=true;if(options.lazyEntries==null)options.lazyEntries=false;if(options.decodeStrings==null)options.decodeStrings=true;if(options.validateEntrySizes==null)options.validateEntrySizes=true;if(options.strictFileNames==null)options.strictFileNames=false;if(callback==null)callback=defaultCallback;fs3.open(path3,"r",function(err,fd){if(err)return callback(err);fromFd(fd,options,function(err2,zipfile){if(err2)fs3.close(fd,defaultCallback);callback(err2,zipfile)})})}__name(open,"open");function fromFd(fd,options,callback){if(typeof options==="function"){callback=options;options=null}if(options==null)options={};if(options.autoClose==null)options.autoClose=false;if(options.lazyEntries==null)options.lazyEntries=false;if(options.decodeStrings==null)options.decodeStrings=true;if(options.validateEntrySizes==null)options.validateEntrySizes=true;if(options.strictFileNames==null)options.strictFileNames=false;if(callback==null)callback=defaultCallback;fs3.fstat(fd,function(err,stats){if(err)return callback(err);var reader=fd_slicer.createFromFd(fd,{autoClose:true});fromRandomAccessReader(reader,stats.size,options,callback)})}__name(fromFd,"fromFd");function fromBuffer2(buffer,options,callback){if(typeof options==="function"){callback=options;options=null}if(options==null)options={};options.autoClose=false;if(options.lazyEntries==null)options.lazyEntries=false;if(options.decodeStrings==null)options.decodeStrings=true;if(options.validateEntrySizes==null)options.validateEntrySizes=true;if(options.strictFileNames==null)options.strictFileNames=false;var reader=fd_slicer.createFromBuffer(buffer,{maxChunkSize:65536});fromRandomAccessReader(reader,buffer.length,options,callback)}__name(fromBuffer2,"fromBuffer");function fromRandomAccessReader(reader,totalSize,options,callback){if(typeof options==="function"){callback=options;options=null}if(options==null)options={};if(options.autoClose==null)options.autoClose=true;if(options.lazyEntries==null)options.lazyEntries=false;if(options.decodeStrings==null)options.decodeStrings=true;var decodeStrings=!!options.decodeStrings;if(options.validateEntrySizes==null)options.validateEntrySizes=true;if(options.strictFileNames==null)options.strictFileNames=false;if(callback==null)callback=defaultCallback;if(typeof totalSize!=="number")throw new Error("expected totalSize parameter to be a number");if(totalSize>Number.MAX_SAFE_INTEGER){throw new Error("zip file too large. only file sizes up to 2^52 are supported due to JavaScript's Number type being an IEEE 754 double.")}reader.ref();var eocdrWithoutCommentSize=22;var maxCommentSize=65535;var bufferSize=Math.min(eocdrWithoutCommentSize+maxCommentSize,totalSize);var buffer=newBuffer(bufferSize);var bufferReadStart=totalSize-buffer.length;readAndAssertNoEof(reader,buffer,0,bufferSize,bufferReadStart,function(err){if(err)return callback(err);for(var i=bufferSize-eocdrWithoutCommentSize;i>=0;i-=1){if(buffer.readUInt32LE(i)!==101010256)continue;var eocdrBuffer=buffer.slice(i);var diskNumber=eocdrBuffer.readUInt16LE(4);if(diskNumber!==0){return callback(new Error("multi-disk zip files are not supported: found disk number: "+diskNumber))}var entryCount=eocdrBuffer.readUInt16LE(10);var centralDirectoryOffset=eocdrBuffer.readUInt32LE(16);var commentLength=eocdrBuffer.readUInt16LE(20);var expectedCommentLength=eocdrBuffer.length-eocdrWithoutCommentSize;if(commentLength!==expectedCommentLength){return callback(new Error("invalid comment length. expected: "+expectedCommentLength+". found: "+commentLength))}var comment=decodeStrings?decodeBuffer(eocdrBuffer,22,eocdrBuffer.length,false):eocdrBuffer.slice(22);if(!(entryCount===65535||centralDirectoryOffset===4294967295)){return callback(null,new ZipFile(reader,centralDirectoryOffset,totalSize,entryCount,comment,options.autoClose,options.lazyEntries,decodeStrings,options.validateEntrySizes,options.strictFileNames))}var zip64EocdlBuffer=newBuffer(20);var zip64EocdlOffset=bufferReadStart+i-zip64EocdlBuffer.length;readAndAssertNoEof(reader,zip64EocdlBuffer,0,zip64EocdlBuffer.length,zip64EocdlOffset,function(err2){if(err2)return callback(err2);if(zip64EocdlBuffer.readUInt32LE(0)!==117853008){return callback(new Error("invalid zip64 end of central directory locator signature"))}var zip64EocdrOffset=readUInt64LE(zip64EocdlBuffer,8);var zip64EocdrBuffer=newBuffer(56);readAndAssertNoEof(reader,zip64EocdrBuffer,0,zip64EocdrBuffer.length,zip64EocdrOffset,function(err3){if(err3)return callback(err3);if(zip64EocdrBuffer.readUInt32LE(0)!==101075792){return callback(new Error("invalid zip64 end of central directory record signature"))}entryCount=readUInt64LE(zip64EocdrBuffer,32);centralDirectoryOffset=readUInt64LE(zip64EocdrBuffer,48);return callback(null,new ZipFile(reader,centralDirectoryOffset,totalSize,entryCount,comment,options.autoClose,options.lazyEntries,decodeStrings,options.validateEntrySizes,options.strictFileNames))})});return}callback(new Error("end of central directory record signature not found"))})}__name(fromRandomAccessReader,"fromRandomAccessReader");util.inherits(ZipFile,EventEmitter);function ZipFile(reader,centralDirectoryOffset,fileSize,entryCount,comment,autoClose,lazyEntries,decodeStrings,validateEntrySizes,strictFileNames){var self=this;EventEmitter.call(self);self.reader=reader;self.reader.on("error",function(err){emitError(self,err)});self.reader.once("close",function(){self.emit("close")});self.readEntryCursor=centralDirectoryOffset;self.fileSize=fileSize;self.entryCount=entryCount;self.comment=comment;self.entriesRead=0;self.autoClose=!!autoClose;self.lazyEntries=!!lazyEntries;self.decodeStrings=!!decodeStrings;self.validateEntrySizes=!!validateEntrySizes;self.strictFileNames=!!strictFileNames;self.isOpen=true;self.emittedError=false;if(!self.lazyEntries)self._readEntry()}__name(ZipFile,"ZipFile");ZipFile.prototype.close=function(){if(!this.isOpen)return;this.isOpen=false;this.reader.unref()};function emitErrorAndAutoClose(self,err){if(self.autoClose)self.close();emitError(self,err)}__name(emitErrorAndAutoClose,"emitErrorAndAutoClose");function emitError(self,err){if(self.emittedError)return;self.emittedError=true;self.emit("error",err)}__name(emitError,"emitError");ZipFile.prototype.readEntry=function(){if(!this.lazyEntries)throw new Error("readEntry() called without lazyEntries:true");this._readEntry()};ZipFile.prototype._readEntry=function(){var self=this;if(self.entryCount===self.entriesRead){setImmediate(function(){if(self.autoClose)self.close();if(self.emittedError)return;self.emit("end")});return}if(self.emittedError)return;var buffer=newBuffer(46);readAndAssertNoEof(self.reader,buffer,0,buffer.length,self.readEntryCursor,function(err){if(err)return emitErrorAndAutoClose(self,err);if(self.emittedError)return;var entry=new Entry;var signature=buffer.readUInt32LE(0);if(signature!==33639248)return emitErrorAndAutoClose(self,new Error("invalid central directory file header signature: 0x"+signature.toString(16)));entry.versionMadeBy=buffer.readUInt16LE(4);entry.versionNeededToExtract=buffer.readUInt16LE(6);entry.generalPurposeBitFlag=buffer.readUInt16LE(8);entry.compressionMethod=buffer.readUInt16LE(10);entry.lastModFileTime=buffer.readUInt16LE(12);entry.lastModFileDate=buffer.readUInt16LE(14);entry.crc32=buffer.readUInt32LE(16);entry.compressedSize=buffer.readUInt32LE(20);entry.uncompressedSize=buffer.readUInt32LE(24);entry.fileNameLength=buffer.readUInt16LE(28);entry.extraFieldLength=buffer.readUInt16LE(30);entry.fileCommentLength=buffer.readUInt16LE(32);entry.internalFileAttributes=buffer.readUInt16LE(36);entry.externalFileAttributes=buffer.readUInt32LE(38);entry.relativeOffsetOfLocalHeader=buffer.readUInt32LE(42);if(entry.generalPurposeBitFlag&64)return emitErrorAndAutoClose(self,new Error("strong encryption is not supported"));self.readEntryCursor+=46;buffer=newBuffer(entry.fileNameLength+entry.extraFieldLength+entry.fileCommentLength);readAndAssertNoEof(self.reader,buffer,0,buffer.length,self.readEntryCursor,function(err2){if(err2)return emitErrorAndAutoClose(self,err2);if(self.emittedError)return;var isUtf8=(entry.generalPurposeBitFlag&2048)!==0;entry.fileName=self.decodeStrings?decodeBuffer(buffer,0,entry.fileNameLength,isUtf8):buffer.slice(0,entry.fileNameLength);var fileCommentStart=entry.fileNameLength+entry.extraFieldLength;var extraFieldBuffer=buffer.slice(entry.fileNameLength,fileCommentStart);entry.extraFields=[];var i=0;while(i<extraFieldBuffer.length-3){var headerId=extraFieldBuffer.readUInt16LE(i+0);var dataSize=extraFieldBuffer.readUInt16LE(i+2);var dataStart=i+4;var dataEnd=dataStart+dataSize;if(dataEnd>extraFieldBuffer.length)return emitErrorAndAutoClose(self,new Error("extra field length exceeds extra field buffer size"));var dataBuffer=newBuffer(dataSize);extraFieldBuffer.copy(dataBuffer,0,dataStart,dataEnd);entry.extraFields.push({id:headerId,data:dataBuffer});i=dataEnd}entry.fileComment=self.decodeStrings?decodeBuffer(buffer,fileCommentStart,fileCommentStart+entry.fileCommentLength,isUtf8):buffer.slice(fileCommentStart,fileCommentStart+entry.fileCommentLength);entry.comment=entry.fileComment;self.readEntryCursor+=buffer.length;self.entriesRead+=1;if(entry.uncompressedSize===4294967295||entry.compressedSize===4294967295||entry.relativeOffsetOfLocalHeader===4294967295){var zip64EiefBuffer=null;for(var i=0;i<entry.extraFields.length;i++){var extraField=entry.extraFields[i];if(extraField.id===1){zip64EiefBuffer=extraField.data;break}}if(zip64EiefBuffer==null){return emitErrorAndAutoClose(self,new Error("expected zip64 extended information extra field"))}var index=0;if(entry.uncompressedSize===4294967295){if(index+8>zip64EiefBuffer.length){return emitErrorAndAutoClose(self,new Error("zip64 extended information extra field does not include uncompressed size"))}entry.uncompressedSize=readUInt64LE(zip64EiefBuffer,index);index+=8}if(entry.compressedSize===4294967295){if(index+8>zip64EiefBuffer.length){return emitErrorAndAutoClose(self,new Error("zip64 extended information extra field does not include compressed size"))}entry.compressedSize=readUInt64LE(zip64EiefBuffer,index);index+=8}if(entry.relativeOffsetOfLocalHeader===4294967295){if(index+8>zip64EiefBuffer.length){return emitErrorAndAutoClose(self,new Error("zip64 extended information extra field does not include relative header offset"))}entry.relativeOffsetOfLocalHeader=readUInt64LE(zip64EiefBuffer,index);index+=8}}if(self.decodeStrings){for(var i=0;i<entry.extraFields.length;i++){var extraField=entry.extraFields[i];if(extraField.id===28789){if(extraField.data.length<6){continue}if(extraField.data.readUInt8(0)!==1){continue}var oldNameCrc32=extraField.data.readUInt32LE(1);if(crc32.unsigned(buffer.slice(0,entry.fileNameLength))!==oldNameCrc32){continue}entry.fileName=decodeBuffer(extraField.data,5,extraField.data.length,true);break}}}if(self.validateEntrySizes&&entry.compressionMethod===0){var expectedCompressedSize=entry.uncompressedSize;if(entry.isEncrypted()){expectedCompressedSize+=12}if(entry.compressedSize!==expectedCompressedSize){var msg="compressed/uncompressed size mismatch for stored file: "+entry.compressedSize+" != "+entry.uncompressedSize;return emitErrorAndAutoClose(self,new Error(msg))}}if(self.decodeStrings){if(!self.strictFileNames){entry.fileName=entry.fileName.replace(/\\/g,"/")}var errorMessage=validateFileName(entry.fileName,self.validateFileNameOptions);if(errorMessage!=null)return emitErrorAndAutoClose(self,new Error(errorMessage))}self.emit("entry",entry);if(!self.lazyEntries)self._readEntry()})})};ZipFile.prototype.openReadStream=function(entry,options,callback){var self=this;var relativeStart=0;var relativeEnd=entry.compressedSize;if(callback==null){callback=options;options={}}else{if(options.decrypt!=null){if(!entry.isEncrypted()){throw new Error("options.decrypt can only be specified for encrypted entries")}if(options.decrypt!==false)throw new Error("invalid options.decrypt value: "+options.decrypt);if(entry.isCompressed()){if(options.decompress!==false)throw new Error("entry is encrypted and compressed, and options.decompress !== false")}}if(options.decompress!=null){if(!entry.isCompressed()){throw new Error("options.decompress can only be specified for compressed entries")}if(!(options.decompress===false||options.decompress===true)){throw new Error("invalid options.decompress value: "+options.decompress)}}if(options.start!=null||options.end!=null){if(entry.isCompressed()&&options.decompress!==false){throw new Error("start/end range not allowed for compressed entry without options.decompress === false")}if(entry.isEncrypted()&&options.decrypt!==false){throw new Error("start/end range not allowed for encrypted entry without options.decrypt === false")}}if(options.start!=null){relativeStart=options.start;if(relativeStart<0)throw new Error("options.start < 0");if(relativeStart>entry.compressedSize)throw new Error("options.start > entry.compressedSize")}if(options.end!=null){relativeEnd=options.end;if(relativeEnd<0)throw new Error("options.end < 0");if(relativeEnd>entry.compressedSize)throw new Error("options.end > entry.compressedSize");if(relativeEnd<relativeStart)throw new Error("options.end < options.start")}}if(!self.isOpen)return callback(new Error("closed"));if(entry.isEncrypted()){if(options.decrypt!==false)return callback(new Error("entry is encrypted, and options.decrypt !== false"))}self.reader.ref();var buffer=newBuffer(30);readAndAssertNoEof(self.reader,buffer,0,buffer.length,entry.relativeOffsetOfLocalHeader,function(err){try{if(err)return callback(err);var signature=buffer.readUInt32LE(0);if(signature!==67324752){return callback(new Error("invalid local file header signature: 0x"+signature.toString(16)))}var fileNameLength=buffer.readUInt16LE(26);var extraFieldLength=buffer.readUInt16LE(28);var localFileHeaderEnd=entry.relativeOffsetOfLocalHeader+buffer.length+fileNameLength+extraFieldLength;var decompress;if(entry.compressionMethod===0){decompress=false}else if(entry.compressionMethod===8){decompress=options.decompress!=null?options.decompress:true}else{return callback(new Error("unsupported compression method: "+entry.compressionMethod))}var fileDataStart=localFileHeaderEnd;var fileDataEnd=fileDataStart+entry.compressedSize;if(entry.compressedSize!==0){if(fileDataEnd>self.fileSize){return callback(new Error("file data overflows file bounds: "+fileDataStart+" + "+entry.compressedSize+" > "+self.fileSize))}}var readStream=self.reader.createReadStream({start:fileDataStart+relativeStart,end:fileDataStart+relativeEnd});var endpointStream=readStream;if(decompress){var destroyed=false;var inflateFilter=zlib.createInflateRaw();readStream.on("error",function(err2){setImmediate(function(){if(!destroyed)inflateFilter.emit("error",err2)})});readStream.pipe(inflateFilter);if(self.validateEntrySizes){endpointStream=new AssertByteCountStream(entry.uncompressedSize);inflateFilter.on("error",function(err2){setImmediate(function(){if(!destroyed)endpointStream.emit("error",err2)})});inflateFilter.pipe(endpointStream)}else{endpointStream=inflateFilter}endpointStream.destroy=function(){destroyed=true;if(inflateFilter!==endpointStream)inflateFilter.unpipe(endpointStream);readStream.unpipe(inflateFilter);readStream.destroy()}}callback(null,endpointStream)}finally{self.reader.unref()}})};function Entry(){}__name(Entry,"Entry");Entry.prototype.getLastModDate=function(){return dosDateTimeToDate(this.lastModFileDate,this.lastModFileTime)};Entry.prototype.isEncrypted=function(){return(this.generalPurposeBitFlag&1)!==0};Entry.prototype.isCompressed=function(){return this.compressionMethod===8};function dosDateTimeToDate(date,time){var day=date&31;var month=(date>>5&15)-1;var year=(date>>9&127)+1980;var millisecond=0;var second=(time&31)*2;var minute=time>>5&63;var hour=time>>11&31;return new Date(year,month,day,hour,minute,second,millisecond)}__name(dosDateTimeToDate,"dosDateTimeToDate");function validateFileName(fileName){if(fileName.indexOf("\\")!==-1){return"invalid characters in fileName: "+fileName}if(/^[a-zA-Z]:/.test(fileName)||/^\//.test(fileName)){return"absolute path: "+fileName}if(fileName.split("/").indexOf("..")!==-1){return"invalid relative path: "+fileName}return null}__name(validateFileName,"validateFileName");function readAndAssertNoEof(reader,buffer,offset,length,position,callback){if(length===0){return setImmediate(function(){callback(null,newBuffer(0))})}reader.read(buffer,offset,length,position,function(err,bytesRead){if(err)return callback(err);if(bytesRead<length){return callback(new Error("unexpected EOF"))}callback()})}__name(readAndAssertNoEof,"readAndAssertNoEof");util.inherits(AssertByteCountStream,Transform2);function AssertByteCountStream(byteCount){Transform2.call(this);this.actualByteCount=0;this.expectedByteCount=byteCount}__name(AssertByteCountStream,"AssertByteCountStream");AssertByteCountStream.prototype._transform=function(chunk,encoding,cb){this.actualByteCount+=chunk.length;if(this.actualByteCount>this.expectedByteCount){var msg="too many bytes in the stream. expected "+this.expectedByteCount+". got at least "+this.actualByteCount;return cb(new Error(msg))}cb(null,chunk)};AssertByteCountStream.prototype._flush=function(cb){if(this.actualByteCount<this.expectedByteCount){var msg="not enough bytes in the stream. expected "+this.expectedByteCount+". got only "+this.actualByteCount;return cb(new Error(msg))}cb()};util.inherits(RandomAccessReader,EventEmitter);function RandomAccessReader(){EventEmitter.call(this);this.refCount=0}__name(RandomAccessReader,"RandomAccessReader");RandomAccessReader.prototype.ref=function(){this.refCount+=1};RandomAccessReader.prototype.unref=function(){var self=this;self.refCount-=1;if(self.refCount>0)return;if(self.refCount<0)throw new Error("invalid unref");self.close(onCloseDone);function onCloseDone(err){if(err)return self.emit("error",err);self.emit("close")}__name(onCloseDone,"onCloseDone")};RandomAccessReader.prototype.createReadStream=function(options){var start=options.start;var end=options.end;if(start===end){var emptyStream=new PassThrough2;setImmediate(function(){emptyStream.end()});return emptyStream}var stream=this._readStreamForRange(start,end);var destroyed=false;var refUnrefFilter=new RefUnrefFilter(this);stream.on("error",function(err){setImmediate(function(){if(!destroyed)refUnrefFilter.emit("error",err)})});refUnrefFilter.destroy=function(){stream.unpipe(refUnrefFilter);refUnrefFilter.unref();stream.destroy()};var byteCounter=new AssertByteCountStream(end-start);refUnrefFilter.on("error",function(err){setImmediate(function(){if(!destroyed)byteCounter.emit("error",err)})});byteCounter.destroy=function(){destroyed=true;refUnrefFilter.unpipe(byteCounter);refUnrefFilter.destroy()};return stream.pipe(refUnrefFilter).pipe(byteCounter)};RandomAccessReader.prototype._readStreamForRange=function(start,end){throw new Error("not implemented")};RandomAccessReader.prototype.read=function(buffer,offset,length,position,callback){var readStream=this.createReadStream({start:position,end:position+length});var writeStream=new Writable;var written=0;writeStream._write=function(chunk,encoding,cb){chunk.copy(buffer,offset+written,0,chunk.length);written+=chunk.length;cb()};writeStream.on("finish",callback);readStream.on("error",function(error){callback(error)});readStream.pipe(writeStream)};RandomAccessReader.prototype.close=function(callback){setImmediate(callback)};util.inherits(RefUnrefFilter,PassThrough2);function RefUnrefFilter(context){PassThrough2.call(this);this.context=context;this.context.ref();this.unreffedYet=false}__name(RefUnrefFilter,"RefUnrefFilter");RefUnrefFilter.prototype._flush=function(cb){this.unref();cb()};RefUnrefFilter.prototype.unref=function(cb){if(this.unreffedYet)return;this.unreffedYet=true;this.context.unref()};var cp437="\0\u263A\u263B\u2665\u2666\u2663\u2660\u2022\u25D8\u25CB\u25D9\u2642\u2640\u266A\u266B\u263C\u25BA\u25C4\u2195\u203C\xB6\xA7\u25AC\u21A8\u2191\u2193\u2192\u2190\u221F\u2194\u25B2\u25BC !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\u2302\xC7\xFC\xE9\xE2\xE4\xE0\xE5\xE7\xEA\xEB\xE8\xEF\xEE\xEC\xC4\xC5\xC9\xE6\xC6\xF4\xF6\xF2\xFB\xF9\xFF\xD6\xDC\xA2\xA3\xA5\u20A7\u0192\xE1\xED\xF3\xFA\xF1\xD1\xAA\xBA\xBF\u2310\xAC\xBD\xBC\xA1\xAB\xBB\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255D\u255C\u255B\u2510\u2514\u2534\u252C\u251C\u2500\u253C\u255E\u255F\u255A\u2554\u2569\u2566\u2560\u2550\u256C\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256B\u256A\u2518\u250C\u2588\u2584\u258C\u2590\u2580\u03B1\xDF\u0393\u03C0\u03A3\u03C3\xB5\u03C4\u03A6\u0398\u03A9\u03B4\u221E\u03C6\u03B5\u2229\u2261\xB1\u2265\u2264\u2320\u2321\xF7\u2248\xB0\u2219\xB7\u221A\u207F\xB2\u25A0\xA0";function decodeBuffer(buffer,start,end,isUtf8){if(isUtf8){return buffer.toString("utf8",start,end)}else{var result="";for(var i=start;i<end;i++){result+=cp437[buffer[i]]}return result}}__name(decodeBuffer,"decodeBuffer");function readUInt64LE(buffer,offset){var lower32=buffer.readUInt32LE(offset);var upper32=buffer.readUInt32LE(offset+4);return upper32*4294967296+lower32}__name(readUInt64LE,"readUInt64LE");var newBuffer;if(typeof Buffer.allocUnsafe==="function"){newBuffer=__name(function(len){return Buffer.allocUnsafe(len)},"newBuffer")}else{newBuffer=__name(function(len){return new Buffer(len)},"newBuffer")}function defaultCallback(err){if(err)throw err}__name(defaultCallback,"defaultCallback")}});init_esbuild_shims();import{randomUUID as randomUUID2}from"node:crypto";import{promises as fs2,constants as fsConstants}from"node:fs";import*as path2 from"node:path";init_esbuild_shims();var debugLogger=createDebugLogger("VOICE_SERVICE");var EMPTY_WORKSPACE_VOICE_UPDATE_ERROR="At least one of `enabled`, `mode`, `language`, or `voiceModel` must be provided";var WorkspaceVoiceError=class extends Error{static{__name(this,"WorkspaceVoiceError")}status;code;constructor(status,code,message){super(message);this.name="WorkspaceVoiceError";this.status=status;this.code=code}};function voiceSettingsScopeToWire(scope){return scope==="Workspace"?"workspace":"user"}__name(voiceSettingsScopeToWire,"voiceSettingsScopeToWire");function buildWorkspaceVoiceSettingsWrites(settings,update,opts={}){const voiceSettingsScope=opts.scopeOverride??getVoiceSettingsScope(settings,opts.workspaceTrusted);const writes=[];if(update.voiceModel!==void 0){writes.push({scope:opts.scopeOverride??getPersistScopeForModelSelection(settings),key:"voiceModel",value:update.voiceModel})}if(update.mode!==void 0){writes.push({scope:voiceSettingsScope,key:"general.voice.mode",value:update.mode})}if(update.language!==void 0){writes.push({scope:voiceSettingsScope,key:"general.voice.language",value:update.language})}if(update.enabled!==void 0){writes.push({scope:voiceSettingsScope,key:"general.voice.enabled",value:update.enabled})}return writes}__name(buildWorkspaceVoiceSettingsWrites,"buildWorkspaceVoiceSettingsWrites");function createVoiceModelSource(settings){return new ModelsConfig({modelProvidersConfig:settings.merged.modelProviders,providerProtocolConfig:settings.merged.providerProtocol})}__name(createVoiceModelSource,"createVoiceModelSource");function listAvailableVoiceModels(settings){const models=createVoiceModelSource(settings).getAllConfiguredModels();const idCounts=new Map;for(const model of models){idCounts.set(model.id,(idCounts.get(model.id)??0)+1)}const duplicateIds=[...idCounts.entries()].filter(([,count])=>count>1).map(([id])=>id);if(duplicateIds.length>0){debugLogger.debug(`Skipping duplicate voice model ids: ${duplicateIds.join(", ")}`)}return models.filter(model=>(idCounts.get(model.id)??0)===1).filter(isSelectableVoiceModel).map(model=>({id:model.id,...model.label?{name:model.label}:{},...model.baseUrl?{baseUrl:publicProviderBaseUrl(model.baseUrl)}:{},...model.contextWindowSize?{contextWindow:model.contextWindowSize}:{},transport:resolveVoiceTransport(model.id)})).filter(model=>model.transport!=="unsupported")}__name(listAvailableVoiceModels,"listAvailableVoiceModels");function hasConfiguredBatchVoiceTranscriptionModel(settings,opts={}){for(const model of listAvailableVoiceModels(settings)){if(model.transport!=="qwen-asr-chat"){continue}try{validateWorkspaceVoiceConfig(settings,model.id,opts);return true}catch(err){debugLogger.debug(`Skipping unavailable batch voice model '${model.id}': ${err instanceof Error?err.message:String(err)}`)}}return false}__name(hasConfiguredBatchVoiceTranscriptionModel,"hasConfiguredBatchVoiceTranscriptionModel");function buildWorkspaceVoiceStatus(workspaceCwd,settings){return{v:1,workspaceCwd,enabled:isVoiceEnabled(settings),mode:readVoiceMode(settings),language:readVoiceLanguage(settings),voiceModel:readVoiceModel(settings)??null,availableVoiceModels:listAvailableVoiceModels(settings)}}__name(buildWorkspaceVoiceStatus,"buildWorkspaceVoiceStatus");function validateWorkspaceVoiceModel(settings,voiceModel){const models=createVoiceModelSource(settings).getAllConfiguredModels();const matches=models.filter(model2=>model2.id===voiceModel);if(matches.length===0){throw new WorkspaceVoiceError(400,"unknown_voice_model",`Voice model '${voiceModel}' is not configured.`)}if(matches.length>1){throw new WorkspaceVoiceError(400,"ambiguous_voice_model",`Voice model '${voiceModel}' is ambiguous.`)}const[model]=matches;if(!model||!isSelectableVoiceModel(model)){throw new WorkspaceVoiceError(400,"unsupported_voice_model",`Voice model '${voiceModel}' cannot be used for transcription.`)}const transport=resolveVoiceTransport(model.id);if(transport==="unsupported"){throw new WorkspaceVoiceError(400,"unsupported_voice_model",`Voice model '${voiceModel}' cannot be used for transcription.`)}return{id:model.id,transport}}__name(validateWorkspaceVoiceModel,"validateWorkspaceVoiceModel");function validateWorkspaceVoiceConfig(settings,voiceModel,opts={}){const descriptor=validateWorkspaceVoiceModel(settings,voiceModel);try{const config=createVoiceModelSource(settings);if(descriptor.transport==="qwen-asr-chat"){resolveVoiceTranscriptionConfig({config,settings,voiceModel,env:opts.env})}else{resolveVoiceStreamConfig({config,settings,voiceModel,env:opts.env})}}catch(err){throw new WorkspaceVoiceError(400,"invalid_voice_model",err instanceof Error?err.message:`Voice model '${voiceModel}' is not configured for transcription.`)}return descriptor}__name(validateWorkspaceVoiceConfig,"validateWorkspaceVoiceConfig");function validateWorkspaceVoiceState(settings,update,opts={}){if(update.enabled===void 0&&update.mode===void 0&&update.language===void 0&&update.voiceModel===void 0){throw new WorkspaceVoiceError(400,"invalid_voice_update",EMPTY_WORKSPACE_VOICE_UPDATE_ERROR)}const nextEnabled=update.enabled??isVoiceEnabled(settings);const nextVoiceModel=update.voiceModel??readVoiceModel(settings);if(update.voiceModel){validateWorkspaceVoiceModel(settings,update.voiceModel)}if(!nextEnabled){return}if(!nextVoiceModel){throw new WorkspaceVoiceError(400,"voice_model_required","A valid voiceModel is required before enabling voice.")}validateWorkspaceVoiceConfig(settings,nextVoiceModel,opts)}__name(validateWorkspaceVoiceState,"validateWorkspaceVoiceState");async function transcribeWorkspaceVoiceAudio(input){const descriptor=validateWorkspaceVoiceModel(input.settings,input.voiceModel);if(descriptor.transport!=="qwen-asr-chat"){throw new WorkspaceVoiceError(400,"unsupported_voice_model",`Voice model '${input.voiceModel}' requires realtime transcription, which is not supported by this daemon endpoint.`)}const text=await transcribeVoiceAudio({data:input.data,mimeType:input.mimeType},{config:createVoiceModelSource(input.settings),settings:input.settings,voiceModel:input.voiceModel,env:input.env,abortSignal:input.abortSignal});return{text,model:input.voiceModel,transport:descriptor.transport}}__name(transcribeWorkspaceVoiceAudio,"transcribeWorkspaceVoiceAudio");init_esbuild_shims();import{execFile}from"node:child_process";import{randomUUID}from"node:crypto";import{createWriteStream,promises as fs}from"node:fs";import*as os from"node:os";import*as path from"node:path";import{PassThrough,Transform}from"node:stream";import{pipeline}from"node:stream/promises";import{promisify}from"node:util";var import_yauzl=__toESM(require_yauzl(),1);var MAX_ZIP_ARCHIVE_BYTES=7864071;var MAX_FILE_BYTES=32*1024*1024;var MAX_PACKAGE_BYTES=64*1024*1024;var MAX_FILES=2e3;var MAX_PATH_LENGTH=512;var MAX_PATH_DEPTH=16;var GITHUB_CONTENTS_PAGE_LIMIT=1e3;var PACKAGE_TOO_MANY="Skill package has too many files (max 2000)";var ZIP_TOO_MANY="Skill ZIP contains too many files (max 2000)";var MAX_WORKSPACE_SKILL_NAME_LENGTH=256;var execFileAsync=promisify(execFile);var liveInstallArtifacts=new Set;function artifactToken(){return`${process.pid}-${randomUUID().replaceAll("-","").slice(0,8)}`}__name(artifactToken,"artifactToken");function artifactOwnerIsLive(suffix){const match=/^(\d+)-/.exec(suffix);if(!match)return false;const pid=Number(match[1]);if(pid<=0||pid===process.pid)return false;try{process.kill(pid,0);return true}catch(error){return error.code!=="ESRCH"}}__name(artifactOwnerIsLive,"artifactOwnerIsLive");var WorkspaceSkillManagementError=class extends Error{constructor(code,message,statusCode=400){super(message);this.code=code;this.statusCode=statusCode;this.name="WorkspaceSkillManagementError"}static{__name(this,"WorkspaceSkillManagementError")}};function skillError(code,message,statusCode=400){throw new WorkspaceSkillManagementError(code,message,statusCode)}__name(skillError,"skillError");function validateWorkspaceSkillName(name){const normalized=name.trim();if(!normalized||normalized==="."||normalized===".."||normalized.length>MAX_WORKSPACE_SKILL_NAME_LENGTH||!/^[A-Za-z0-9._-]+$/.test(normalized)){skillError("invalid_skill_name","Invalid skill name")}return normalized}__name(validateWorkspaceSkillName,"validateWorkspaceSkillName");function rejectInstallArtifactSkillName(name){if(/^\..*\.(backup|installing)-[A-Za-z0-9-]+$/.test(name)||/\.(backup|installing)-\d+-\d+$/.test(name)){skillError("invalid_skill_name","Skill name ends with a reserved install-artifact suffix")}}__name(rejectInstallArtifactSkillName,"rejectInstallArtifactSkillName");function assertBase64Shape(value){if(!value||!/^[A-Za-z0-9+/]*={0,2}$/.test(value)){skillError("invalid_skill_source","Invalid base64 skill content")}}__name(assertBase64Shape,"assertBase64Shape");function decodeBase64(value){assertBase64Shape(value);const content=Buffer.from(value,"base64");if(content.length>MAX_ZIP_ARCHIVE_BYTES){skillError("skill_package_too_large","Skill ZIP exceeds the allowed archive size",413)}return content}__name(decodeBase64,"decodeBase64");var STAGING_DISK_ERRNOS=new Set(["ENOSPC","EDQUOT","EROFS","EIO","EMFILE","ENFILE","EBUSY","EACCES","EPERM"]);var COPY_STAGING_ERRNOS=new Set(["ENOSPC","EDQUOT","EROFS"]);var COPY_AMBIGUOUS_ERRNOS=new Set(["EACCES","EPERM"]);function stagingWriteError(error){if(!(error instanceof Error))return void 0;if(error instanceof WorkspaceSkillManagementError)return void 0;if(error.name==="WorkspaceGenerationClosedError")return void 0;const{code}=error;if(!code||!STAGING_DISK_ERRNOS.has(code))return void 0;return new WorkspaceSkillManagementError("skill_staging_failed",error.message,500)}__name(stagingWriteError,"stagingWriteError");async function stageWrite(write){try{return await write()}catch(error){throw stagingWriteError(error)??error}}__name(stageWrite,"stageWrite");async function copyIntoStaging(source,target){try{await fs.copyFile(source,target)}catch(error){const code=error.code;if(!code)throw error;if(COPY_STAGING_ERRNOS.has(code)){throw stagingWriteError(error)??error}if(COPY_AMBIGUOUS_ERRNOS.has(code)){const sourceReadable=await fs.access(source,fs.constants.R_OK).then(()=>true,()=>false);if(sourceReadable)throw stagingWriteError(error)??error}throw error}}__name(copyIntoStaging,"copyIntoStaging");function normalizeRelativePath(value){const normalized=value.replaceAll("\\","/").replace(/^\.\//,"");const segments=normalized.split("/");if(!normalized||normalized.length>MAX_PATH_LENGTH||normalized.startsWith("/")||segments.length>MAX_PATH_DEPTH||segments.some(segment=>!segment||segment==="."||segment==="..")){skillError("invalid_skill_package",`Invalid skill file path: ${value}`)}return segments.join("/")}__name(normalizeRelativePath,"normalizeRelativePath");function isPlatformMetadataPath(value){return value.replaceAll("\\","/").split("/").some(segment=>segment==="__MACOSX"||segment===".DS_Store"||segment.startsWith("._"))}__name(isPlatformMetadataPath,"isPlatformMetadataPath");function pathIsTakenAsFileOrDirectory(normalized,paths){const segments=normalized.split("/");for(let i=1;i<segments.length;i+=1){if(paths.has(segments.slice(0,i).join("/")))return true}return[...paths].some(existing=>existing.startsWith(`${normalized}/`))}__name(pathIsTakenAsFileOrDirectory,"pathIsTakenAsFileOrDirectory");function beginStagedFile(staging,relativePath,state,tooManyMessage){if(isPlatformMetadataPath(relativePath))return void 0;const normalized=normalizeRelativePath(relativePath);if(state.paths.has(normalized)){skillError("invalid_skill_package",`Duplicate skill file path: ${normalized}`)}if(pathIsTakenAsFileOrDirectory(normalized,state.paths)){skillError("invalid_skill_package",`Skill package has conflicting file and directory entries: ${normalized}`)}if(state.count>=MAX_FILES){skillError("skill_too_many_files",tooManyMessage)}return{normalized,target:path.join(staging,...normalized.split("/"))}}__name(beginStagedFile,"beginStagedFile");function commitStagedFile(normalized,bytes,state){state.paths.add(normalized);state.count+=1;state.totalBytes+=bytes}__name(commitStagedFile,"commitStagedFile");async function prepareTarget(target,assertGenerationOpen){assertGenerationOpen?.();await stageWrite(()=>fs.mkdir(path.dirname(target),{recursive:true}));assertGenerationOpen?.()}__name(prepareTarget,"prepareTarget");function githubRequestError(code,status,resource){const message=status===404?`GitHub ${resource} was not found; check the repository URL, branch, and path`:status===401?"GitHub authentication failed; check GH_TOKEN or GITHUB_TOKEN":status===403?"GitHub access was denied; the repository may be private or API rate-limited":status===429?"GitHub API rate limit exceeded; try again later or configure GH_TOKEN":`GitHub request failed (HTTP ${status})`;return new WorkspaceSkillManagementError(code,message,status===404?404:502)}__name(githubRequestError,"githubRequestError");function githubHeaders(githubToken){return{Accept:"application/vnd.github+json","User-Agent":"qwen-code",...githubToken?{Authorization:`Bearer ${githubToken}`}:{}}}__name(githubHeaders,"githubHeaders");async function writeGitHubFile(url,staged,state,githubToken,assertGenerationOpen){const response=await fetch(url,{headers:githubHeaders(githubToken)});if(!response.ok){throw githubRequestError("github_skill_download_failed",response.status,"Skill file")}const declared=Number(response.headers.get("content-length"));if(Number.isFinite(declared)&&declared>MAX_FILE_BYTES){await response.body?.cancel().catch(()=>void 0);skillError("skill_package_too_large","Skill file is too large",413)}if(Number.isFinite(declared)&&state.totalBytes+declared>MAX_PACKAGE_BYTES){await response.body?.cancel().catch(()=>void 0);skillError("skill_package_too_large","Skill package exceeds the allowed size",413)}if(!response.body){await prepareTarget(staged.target,assertGenerationOpen);await stageWrite(()=>fs.writeFile(staged.target,""));commitStagedFile(staged.normalized,0,state);return}let handle;try{await prepareTarget(staged.target,assertGenerationOpen);handle=await stageWrite(()=>fs.open(staged.target,"w"))}catch(error){await response.body.cancel().catch(()=>void 0);throw error}const reader=response.body.getReader();let size=0;try{while(true){const{done,value}=await reader.read();if(done)break;size+=value.byteLength;if(size>MAX_FILE_BYTES||state.totalBytes+size>MAX_PACKAGE_BYTES){await reader.cancel().catch(()=>void 0);skillError("skill_package_too_large",size>MAX_FILE_BYTES?"Skill file is too large":"Skill package exceeds the allowed size",413)}let offset=0;while(offset<value.byteLength){const result=await stageWrite(()=>handle.write(value.subarray(offset)));if(result.bytesWritten<=0){throw new Error("Failed to write Skill file")}offset+=result.bytesWritten}}}finally{await reader.cancel().catch(()=>void 0);reader.releaseLock();await stageWrite(()=>handle.close())}commitStagedFile(staged.normalized,size,state)}__name(writeGitHubFile,"writeGitHubFile");async function downloadGitHubDirectory(owner,repo,ref,directory,staging,state,githubToken,assertGenerationOpen,relativeRoot="",depth=0){if(depth>MAX_PATH_DEPTH)skillError("invalid_skill_package","GitHub Skill is nested too deeply");const encodedDirectory=directory.split("/").filter(Boolean).map(encodeURIComponent).join("/");const apiUrl=`https://api.github.com/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/contents${encodedDirectory?`/${encodedDirectory}`:""}?ref=${encodeURIComponent(ref)}`;const response=await fetch(apiUrl,{headers:githubHeaders(githubToken)});if(!response.ok){throw githubRequestError("github_api_failed",response.status,"Skill path")}const items=await response.json();if(!Array.isArray(items))skillError("invalid_skill_source","GitHub URL must point to SKILL.md");if(items.length>=GITHUB_CONTENTS_PAGE_LIMIT){throw new WorkspaceSkillManagementError("github_api_failed","GitHub directory listing reached the API page limit; retrying with git",502)}for(const item of items){if(!item||typeof item!=="object")continue;const record=item;const itemName=typeof record["name"]==="string"?record["name"]:"";const itemPath=typeof record["path"]==="string"?record["path"]:"";const itemType=typeof record["type"]==="string"?record["type"]:"";const relativePath=relativeRoot?`${relativeRoot}/${itemName}`:itemName;if(isPlatformMetadataPath(relativePath))continue;if(itemType==="dir"){await downloadGitHubDirectory(owner,repo,ref,itemPath,staging,state,githubToken,assertGenerationOpen,relativePath,depth+1)}else if(itemType==="file"){const downloadUrl=record["download_url"];if(typeof downloadUrl!=="string")continue;const parsedDownloadUrl=new URL(downloadUrl);if(parsedDownloadUrl.protocol!=="https:"||parsedDownloadUrl.hostname!=="raw.githubusercontent.com"){skillError("github_skill_download_failed","GitHub returned an invalid Skill file URL",502)}const staged=beginStagedFile(staging,relativePath,state,PACKAGE_TOO_MANY);if(!staged)continue;await writeGitHubFile(downloadUrl,staged,state,githubToken,assertGenerationOpen)}}}__name(downloadGitHubDirectory,"downloadGitHubDirectory");async function downloadGitHubDirectoryWithGit(owner,repo,ref,directory,staging,state,assertGenerationOpen){assertGenerationOpen?.();const checkout=await fs.mkdtemp(path.join(os.tmpdir(),"qwen-skill-git-"));try{await execFileAsync("git",["clone","--depth","1","--filter=blob:none","--sparse","--branch",ref,`https://github.com/${owner}/${repo}.git`,checkout],{timeout:6e4,maxBuffer:1024*1024,env:{...sanitizeChildEnv(),GIT_TERMINAL_PROMPT:"0"}});if(directory){await execFileAsync("git",["-C",checkout,"sparse-checkout","set","--cone",directory],{timeout:3e4,maxBuffer:1024*1024,env:{...sanitizeChildEnv(),GIT_TERMINAL_PROMPT:"0"}})}else{await execFileAsync("git",["-C",checkout,"sparse-checkout","disable"],{timeout:3e4,maxBuffer:1024*1024,env:{...sanitizeChildEnv(),GIT_TERMINAL_PROMPT:"0"}})}assertGenerationOpen?.();await copyFolder(path.join(checkout,directory),staging,state,assertGenerationOpen)}catch(error){if(error instanceof WorkspaceSkillManagementError)throw error;if(error instanceof Error&&error.name==="WorkspaceGenerationClosedError"){throw error}throw new WorkspaceSkillManagementError("github_skill_download_failed",`Failed to download GitHub Skill: ${error instanceof Error?error.message:String(error)}`,502)}finally{await fs.rm(checkout,{recursive:true,force:true})}}__name(downloadGitHubDirectoryWithGit,"downloadGitHubDirectoryWithGit");function resolveGitHubSkill(sourceUrl){let url;try{url=new URL(sourceUrl)}catch{skillError("invalid_skill_source","Invalid GitHub Skill URL")}if(url.protocol!=="https:")skillError("invalid_skill_source","GitHub URL must use HTTPS");if(url.hostname==="raw.githubusercontent.com"){if(!url.pathname.endsWith("/SKILL.md")){skillError("invalid_skill_source","GitHub URL must point to SKILL.md")}return{kind:"raw",url:url.toString()}}if(url.hostname!=="github.com"){skillError("invalid_skill_source","Only GitHub Skill URLs are supported")}let segments;try{segments=url.pathname.split("/").filter(Boolean).map(decodeURIComponent)}catch{skillError("invalid_skill_source","Invalid GitHub Skill URL")}if(segments.length<5||segments[2]!=="blob"||segments.at(-1)!=="SKILL.md"){skillError("invalid_skill_source","GitHub URL must point to a repository SKILL.md file")}const[owner,repo,,ref,...filePath]=segments;if(!owner||!repo||!ref||ref.startsWith("-")||!/^[A-Za-z0-9._/+-]+$/.test(ref)||!/^[A-Za-z0-9._-]+$/.test(owner)||!/^[A-Za-z0-9._-]+$/.test(repo)){skillError("invalid_skill_source","Invalid GitHub Skill URL")}const directory=filePath.slice(0,-1).join("/");const directorySegments=directory.split("/");if(directory&&(directory.length>MAX_PATH_LENGTH||directory.includes("\\")||directory.startsWith("/")||directorySegments.length>MAX_PATH_DEPTH||directorySegments.some(segment=>!segment||segment==="."||segment===".."))){skillError("invalid_skill_source","Invalid GitHub Skill URL path")}return{kind:"tree",owner,repo,ref,directory}}__name(resolveGitHubSkill,"resolveGitHubSkill");async function downloadGitHubSkill(sourceUrl,staging,state,githubToken,assertGenerationOpen){const plan=resolveGitHubSkill(sourceUrl);if(plan.kind==="raw"){const staged=beginStagedFile(staging,"SKILL.md",state,PACKAGE_TOO_MANY);if(!staged){skillError("invalid_skill_package","Skill package has an invalid file count")}await writeGitHubFile(plan.url,staged,state,githubToken,assertGenerationOpen);return}try{await downloadGitHubDirectory(plan.owner,plan.repo,plan.ref,plan.directory,staging,state,githubToken,assertGenerationOpen)}catch(error){if(!(error instanceof WorkspaceSkillManagementError)||error.code!=="github_api_failed"||error.statusCode===404){throw error}for(const entry of await fs.readdir(staging)){assertGenerationOpen?.();await fs.rm(path.join(staging,entry),{recursive:true,force:true})}state.count=0;state.totalBytes=0;state.paths.clear();await downloadGitHubDirectoryWithGit(plan.owner,plan.repo,plan.ref,plan.directory,staging,state,assertGenerationOpen)}}__name(downloadGitHubSkill,"downloadGitHubSkill");function openZip(content){return new Promise((resolve3,reject)=>{(0,import_yauzl.fromBuffer)(content,{lazyEntries:true},(error,zipFile)=>{if(error)reject(error);else resolve3(zipFile)})})}__name(openZip,"openZip");function openZipStream(zipFile,entry){return new Promise((resolve3,reject)=>{zipFile.openReadStream(entry,(error,stream)=>{if(error)reject(error);else resolve3(stream)})})}__name(openZipStream,"openZipStream");async function writeZipEntry(zipFile,entry,target,totalBytes){const stream=await openZipStream(zipFile,entry);const source=new PassThrough;stream.on("error",error=>source.destroy(error));stream.pipe(source);let size=0;const guard=new Transform({transform(chunk,_encoding,callback){size+=chunk.length;if(size>MAX_FILE_BYTES){callback(new WorkspaceSkillManagementError("skill_package_too_large",`Skill ZIP entry is too large: ${entry.fileName}`,413));return}if(totalBytes+size>MAX_PACKAGE_BYTES){callback(new WorkspaceSkillManagementError("skill_package_too_large","Skill ZIP expands beyond the allowed size",413));return}callback(null,chunk)}});try{await stageWrite(()=>pipeline(source,guard,createWriteStream(target)))}finally{stream.destroy();source.destroy()}return size}__name(writeZipEntry,"writeZipEntry");async function filesFromZip(content,staging,state,assertGenerationOpen){const zipFile=await openZip(content);await new Promise((resolve3,reject)=>{let settled=false;const finish=__name(error=>{if(settled)return;settled=true;zipFile.close();if(error)reject(error);else resolve3()},"finish");const writeEntry=__name(async entry=>{const mode=entry.externalFileAttributes>>>16&65535;const fileType=mode&61440;if(fileType===40960){throw new Error("Skill ZIP contains a symbolic link")}if(entry.generalPurposeBitFlag&1){throw new Error("Encrypted Skill ZIP entries are not supported")}if(entry.fileName.endsWith("/")||fileType===16384)return;const staged=beginStagedFile(staging,entry.fileName,state,ZIP_TOO_MANY);if(!staged)return;if(entry.uncompressedSize>MAX_FILE_BYTES){skillError("skill_package_too_large","Skill ZIP entry exceeds the allowed size",413)}if(state.totalBytes+entry.uncompressedSize>MAX_PACKAGE_BYTES){skillError("skill_package_too_large","Skill ZIP expands beyond the allowed size",413)}await prepareTarget(staged.target,assertGenerationOpen);const written=await writeZipEntry(zipFile,entry,staged.target,state.totalBytes);commitStagedFile(staged.normalized,written,state)},"writeEntry");zipFile.on("error",finish);zipFile.on("entry",entry=>{void writeEntry(entry).then(()=>{if(!settled)zipFile.readEntry()},finish)});zipFile.on("end",()=>finish());zipFile.readEntry()})}__name(filesFromZip,"filesFromZip");async function validatedFolderRoot(folderPath){if(!path.isAbsolute(folderPath)){skillError("invalid_skill_folder","Skill folder path must be absolute")}if((await fs.lstat(folderPath)).isSymbolicLink()){skillError("invalid_skill_folder","Skill folder path must not be a symbolic link")}const root=await fs.realpath(folderPath);if(!(await fs.stat(root)).isDirectory()){skillError("invalid_skill_folder","Skill folder path must point to a directory")}return root}__name(validatedFolderRoot,"validatedFolderRoot");async function copyFolder(folderPath,staging,state,assertGenerationOpen){const root=await validatedFolderRoot(folderPath);const stagingReal=await fs.realpath(staging);const visit=__name(async(directory,relativeRoot="",depth=0)=>{if(depth>MAX_PATH_DEPTH)skillError("invalid_skill_package","Skill folder is nested too deeply");for(const entry of await fs.readdir(directory,{withFileTypes:true})){if(depth===0&&entry.name===".git")continue;const absolutePath=path.join(directory,entry.name);if(path.resolve(absolutePath)===stagingReal)continue;const relativePath=relativeRoot?`${relativeRoot}/${entry.name}`:entry.name;if(entry.isSymbolicLink()){skillError("unsafe_skill_path","Skill folder contains a symbolic link")}if(entry.isDirectory()){if(isPlatformMetadataPath(relativePath))continue;await visit(absolutePath,relativePath,depth+1);continue}if(!entry.isFile())skillError("unsafe_skill_path","Skill folder contains a special file");if(isPlatformMetadataPath(relativePath))continue;const staged=beginStagedFile(staging,relativePath,state,PACKAGE_TOO_MANY);if(!staged)continue;const stats=await fs.lstat(absolutePath);if(stats.isSymbolicLink()||!stats.isFile()){skillError("unsafe_skill_path","Skill folder contains an unsafe file")}if(stats.size>MAX_FILE_BYTES){skillError("skill_package_too_large",`Skill file is too large: ${staged.normalized}`,413)}if(state.totalBytes+stats.size>MAX_PACKAGE_BYTES){skillError("skill_package_too_large","Skill package exceeds the allowed size",413)}await prepareTarget(staged.target,assertGenerationOpen);await copyIntoStaging(absolutePath,staged.target);const copied=await fs.lstat(staged.target);if(copied.size!==stats.size){skillError("invalid_skill_package",`Skill file changed while reading: ${staged.normalized}`)}commitStagedFile(staged.normalized,copied.size,state)}},"visit");await visit(root)}__name(copyFolder,"copyFolder");async function assertStagedFilesPresent(staging,state){for(const filePath of state.paths){const stats=await fs.lstat(path.join(staging,...filePath.split("/"))).catch(()=>void 0);if(!stats?.isFile()){skillError("skill_staging_failed","Skill staging directory was modified during install",500)}}}__name(assertStagedFilesPresent,"assertStagedFilesPresent");async function finalizeStagedPackage(staging,state,assertGenerationOpen){if(state.paths.size===0){skillError("invalid_skill_package","Skill package has an invalid file count")}await assertStagedFilesPresent(staging,state);if(state.paths.has("SKILL.md"))return;const roots=new Set([...state.paths].map(filePath=>filePath.split("/")[0]));if(roots.size!==1){skillError("skill_manifest_missing","Skill package must contain a root SKILL.md")}const[root]=roots;if(!root){skillError("skill_manifest_missing","Skill package must contain a root SKILL.md")}const rootPath=path.join(staging,root);const rootStats=await fs.lstat(rootPath);if(!rootStats.isDirectory()){skillError("skill_manifest_missing","Skill package must contain a root SKILL.md")}const stripped=new Set;for(const filePath of state.paths){stripped.add(normalizeRelativePath(filePath.slice(root.length+1)))}const children=await fs.readdir(rootPath);let holdingName=".qwen-skill-strip";while(children.includes(holdingName))holdingName=`${holdingName}-x`;const holding=path.join(staging,holdingName);assertGenerationOpen?.();await fs.rename(rootPath,holding);for(const child of children){assertGenerationOpen?.();await fs.rename(path.join(holding,child),path.join(staging,child))}await fs.rmdir(holding);state.paths.clear();for(const filePath of stripped)state.paths.add(filePath);if(!state.paths.has("SKILL.md")){skillError("skill_manifest_missing","Skill package must contain a root SKILL.md")}}__name(finalizeStagedPackage,"finalizeStagedPackage");async function stageSkillSource(source,staging,githubToken,assertGenerationOpen){const state={count:0,totalBytes:0,paths:new Set};try{if(source.type==="github"){await downloadGitHubSkill(source.url,staging,state,githubToken,assertGenerationOpen)}else if(source.type==="folder"){await copyFolder(source.path,staging,state,assertGenerationOpen)}else{await filesFromZip(decodeBase64(source.contentBase64),staging,state,assertGenerationOpen)}await finalizeStagedPackage(staging,state,assertGenerationOpen)}catch(error){if(error instanceof WorkspaceSkillManagementError)throw error;if(error instanceof Error&&error.name==="WorkspaceGenerationClosedError"){throw error}const code=source.type==="github"?"github_skill_download_failed":source.type==="folder"?"invalid_skill_folder":"invalid_skill_package";throw new WorkspaceSkillManagementError(code,error instanceof Error?error.message:String(error),source.type==="github"?502:400)}}__name(stageSkillSource,"stageSkillSource");function workspaceSkillBaseDir(workspace,scope){return scope==="workspace"?path.join(workspace,".qwen","skills"):path.join(Storage.getGlobalQwenDir(),"skills")}__name(workspaceSkillBaseDir,"workspaceSkillBaseDir");async function removeInstallArtifacts(baseDir,skillName,assertGenerationOpen){const workDir=path.dirname(baseDir);const workPrefix=`.${path.basename(baseDir)}-${skillName}`;const locations=[{directory:baseDir,prefixes:[`.${skillName}.installing-`,`.${skillName}.backup-`]},{directory:workDir,prefixes:[`${workPrefix}.installing-`,`${workPrefix}.backup-`]}];for(const{directory,prefixes}of locations){const entries=await fs.readdir(directory,{withFileTypes:true});await Promise.all(entries.filter(entry=>{if(liveInstallArtifacts.has(path.join(directory,entry.name))){return false}return prefixes.some(prefix=>{if(!entry.name.startsWith(prefix))return false;const suffix=entry.name.slice(prefix.length);return/^[A-Za-z0-9-]+$/.test(suffix)&&!artifactOwnerIsLive(suffix)})}).map(async entry=>{assertGenerationOpen?.();await fs.rm(path.join(directory,entry.name),{recursive:true,force:true})}))}}__name(removeInstallArtifacts,"removeInstallArtifacts");async function ensureDirectoryWithoutSymlinks(directory,assertGenerationOpen){const missing=[];let current=directory;while(true){try{const stats=await fs.lstat(current);if(stats.isSymbolicLink()||!stats.isDirectory()){skillError("unsafe_skill_path",`Unsafe Skill directory: ${current}`)}break}catch(error){if(error.code!=="ENOENT")throw error;missing.push(current);const parent=path.dirname(current);if(parent===current)throw error;current=parent}}for(const entry of missing.reverse()){assertGenerationOpen?.();await fs.mkdir(entry)}}__name(ensureDirectoryWithoutSymlinks,"ensureDirectoryWithoutSymlinks");async function installWorkspaceSkill(workspace,request,githubToken,assertGenerationOpen){assertGenerationOpen?.();const skillName=validateWorkspaceSkillName(request.name);rejectInstallArtifactSkillName(skillName);if(request.source.type==="folder"&&!path.isAbsolute(request.source.path)){skillError("invalid_skill_folder","Skill folder path must be absolute")}if(request.source.type==="github")resolveGitHubSkill(request.source.url);if(request.source.type==="zip"){assertBase64Shape(request.source.contentBase64)}const baseDir=workspaceSkillBaseDir(workspace,request.scope);assertGenerationOpen?.();await ensureDirectoryWithoutSymlinks(baseDir,assertGenerationOpen);assertGenerationOpen?.();await removeInstallArtifacts(baseDir,skillName,assertGenerationOpen);const destination=path.join(baseDir,skillName);const existing=await fs.lstat(destination).catch(()=>void 0);if(existing?.isSymbolicLink()||existing&&!existing.isDirectory()){skillError("unsafe_skill_path","Refusing to replace an unsafe Skill path")}const workDir=path.dirname(baseDir);const workPrefix=`.${path.basename(baseDir)}-${skillName}`;assertGenerationOpen?.();const staging=path.join(workDir,`${workPrefix}.installing-${artifactToken()}`);liveInstallArtifacts.add(staging);try{await fs.mkdir(staging,{mode:448})}catch(error){liveInstallArtifacts.delete(staging);throw error}const backup=path.join(workDir,`${workPrefix}.backup-${artifactToken()}`);let movedExisting=false;let committedStaging=false;try{await stageSkillSource(request.source,staging,githubToken,assertGenerationOpen);const skillFile=path.join(staging,"SKILL.md");let parsed;try{parsed=new SkillManager({}).parseSkillContent(await fs.readFile(skillFile,"utf8"),skillFile,request.scope==="workspace"?"project":"user")}catch(error){throw new WorkspaceSkillManagementError("invalid_skill_manifest",error instanceof Error?error.message:String(error))}if(parsed.name!==skillName){skillError("skill_name_mismatch",`Skill name "${parsed.name}" does not match requested name "${skillName}"`)}if(existing){assertGenerationOpen?.();liveInstallArtifacts.add(backup);await fs.rename(destination,backup);movedExisting=true}assertGenerationOpen?.();await fs.rename(staging,destination);committedStaging=true;assertGenerationOpen?.()}catch(error){await fs.rm(committedStaging?destination:staging,{recursive:true,force:true}).catch(()=>void 0);if(movedExisting){await fs.rename(backup,destination).catch(()=>void 0)}throw error}finally{liveInstallArtifacts.delete(staging);liveInstallArtifacts.delete(backup)}if(movedExisting){await fs.rm(backup,{recursive:true,force:true}).catch(()=>void 0)}return{skillName,scope:request.scope,installedPath:path.join(destination,"SKILL.md")}}__name(installWorkspaceSkill,"installWorkspaceSkill");async function deleteWorkspaceSkill(workspace,scope,skillNameInput,installedPath,assertGenerationOpen){assertGenerationOpen?.();const skillName=validateWorkspaceSkillName(skillNameInput);const skillDir=path.resolve(path.dirname(installedPath));const skillFile=path.resolve(installedPath);const allowedBaseDirs=new SkillManager({getProjectRoot:__name(()=>workspace,"getProjectRoot")}).getSkillsBaseDirs(scope==="workspace"?"project":"user").map(directory=>path.resolve(directory));const baseDir=path.dirname(skillDir);if(skillFile!==path.join(skillDir,"SKILL.md")||!allowedBaseDirs.includes(baseDir)||path.basename(skillDir)!==skillName){skillError("skill_not_managed","Skill is not managed in the requested scope",409)}const baseRealPath=await fs.realpath(baseDir);const skillDirStats=await fs.lstat(skillDir);const skillFileStats=await fs.lstat(skillFile);if(skillDirStats.isSymbolicLink()||!skillDirStats.isDirectory()||skillFileStats.isSymbolicLink()||!skillFileStats.isFile()){skillError("unsafe_skill_path","Refusing to delete an unsafe Skill path")}const skillDirRealPath=await fs.realpath(skillDir);if(path.dirname(skillDirRealPath)!==baseRealPath){skillError("unsafe_skill_path","Refusing to delete an unsafe Skill path")}const parsed=new SkillManager({}).parseSkillContent(await fs.readFile(skillFile,"utf8"),skillFile,scope==="workspace"?"project":"user");if(parsed.name!==skillName){skillError("skill_name_mismatch","Skill name does not match its installed directory")}assertGenerationOpen?.();await fs.rm(skillDir,{recursive:true,force:true});return{skillName,scope,deleted:true}}__name(deleteWorkspaceSkill,"deleteWorkspaceSkill");var WORKSPACE_SKILLS_REVALIDATE_INTERVAL_MS=1e3;var WORKSPACE_SKILLS_STALE_AFTER_MS=1e3;var WORKSPACE_SKILLS_REVALIDATE_TIMEOUT_MS=5e3;function createSkillToggleMutation(input){return{id:randomUUID2(),kind:"skill_toggle",skills:input.skills.map(skill=>({name:skill.name,enabled:skill.enabled})),activation:input.activation,sessionsRefreshed:input.sessionsRefreshed,sessionsFailed:input.sessionsFailed}}__name(createSkillToggleMutation,"createSkillToggleMutation");async function canonicalizeExistingAncestor(inputPath){let current=inputPath;while(true){try{return await fs2.realpath(current)}catch(err){const code=err?.code;if(code!=="ENOENT"&&code!=="ENOTDIR"&&code!=="ELOOP"){throw err}const parent=path2.dirname(current);if(parent===current)throw err;current=parent}}}__name(canonicalizeExistingAncestor,"canonicalizeExistingAncestor");async function verifyParentPostOpen(target,wsCanonical,_fh){const parentCanonical=await canonicalizeExistingAncestor(path2.dirname(target));const within=parentCanonical===wsCanonical||parentCanonical.startsWith(wsCanonical+path2.sep);if(within)return;throw new WorkspaceInitSymlinkError(target,"parent",`Workspace context file ${JSON.stringify(target)}'s parent moved outside the workspace between the pre-open canonicalize and the post-open verify (parent canonicalizes to ${JSON.stringify(parentCanonical)}, workspace canonicalizes to ${JSON.stringify(wsCanonical)}). Refusing to write \u2014 investigate the concurrent writer or the parent-directory permissions.`)}__name(verifyParentPostOpen,"verifyParentPostOpen");var TimeoutError=class extends Error{static{__name(this,"TimeoutError")}};async function withTimeout(promise,timeoutMs,label){return await new Promise((resolve3,reject)=>{const timeout=setTimeout(()=>{reject(new TimeoutError(`${label} timed out after ${timeoutMs}ms`))},timeoutMs);promise.then(value=>{clearTimeout(timeout);resolve3(value)},err=>{clearTimeout(timeout);reject(err)})})}__name(withTimeout,"withTimeout");function createDaemonWorkspaceService(deps){const{boundWorkspace,isWorkspaceTrusted,assertGenerationOpen,contextFilename,statusProvider,workspaceProvidersStatusProvider,workspaceSkillsStatusProvider,isChannelLive,persistDisabledTools,persistDisabledSkills,persistDisabledSkillsBatch,persistSetting,persistSettings,skillInstallEnv,voiceEnv,voiceSettingsScope,preheatAcpChild:preheatAcpChildOnBridge,queryWorkspaceStatus,invokeWorkspaceCommand,refreshExtensionsForAllSessions:refreshExtensionsForAllSessionsOnBridge,publishWorkspaceEvent}=deps;const loadBoundSettings=__name((skipLoadEnvironment=false)=>{const workspaceTrusted=isWorkspaceTrusted();return loadSettings(boundWorkspace,{skipLoadEnvironment:skipLoadEnvironment||!workspaceTrusted,skipWorkspaceSettings:!workspaceTrusted,workspaceTrusted})},"loadBoundSettings");const assertActiveGeneration=__name(()=>assertGenerationOpen?.(),"assertActiveGeneration");const loggedPreheatFailures=new WeakSet;const logPreheatFailure=__name(err=>{if(typeof err==="object"&&err!==null){if(loggedPreheatFailures.has(err))return;loggedPreheatFailures.add(err)}writeStderrLineSafe(`qwen serve: ACP preheat failed: ${err instanceof Error?err.message:String(err)}`)},"logPreheatFailure");let lastWorkspaceSkillsStatus;let lastWorkspaceSkillsStatusAt=0;let lastWorkspaceSkillsReadStartedAt;let workspaceSkillsGeneration=0;let workspaceSkillsReadSequence=0;let publishedWorkspaceSkillsReadSequence=0;let inFlightWorkspaceSkillsStatus;const invalidateWorkspaceSkillsSnapshot=__name(()=>{workspaceSkillsGeneration+=1;lastWorkspaceSkillsStatus=void 0;lastWorkspaceSkillsStatusAt=0;lastWorkspaceSkillsReadStartedAt=void 0;inFlightWorkspaceSkillsStatus=void 0},"invalidateWorkspaceSkillsSnapshot");const invalidateWorkspaceSkillsInventory=__name(()=>{invalidateWorkspaceSkillsSnapshot();workspaceSkillsStatusProvider?.invalidate?.(boundWorkspace)},"invalidateWorkspaceSkillsInventory");const getWorkspaceSkillsConfigStatus=__name(async()=>{if(workspaceSkillsStatusProvider){try{return await workspaceSkillsStatusProvider(boundWorkspace)}catch(err){writeStderrLine(`qwen serve: getWorkspaceSkillsConfigStatus local provider failed: ${err instanceof Error?err.message:String(err)}`)}}return createIdleWorkspaceSkillsStatus(boundWorkspace)},"getWorkspaceSkillsConfigStatus");const unavailableWorkspaceSkillsStatus=__name(()=>({...createIdleWorkspaceSkillsStatus(boundWorkspace),errors:[{kind:"skills",status:"error",error:"Skills catalog is unavailable; retry the request"}]}),"unavailableWorkspaceSkillsStatus");const skillsSnapshot=__name(()=>{if(!lastWorkspaceSkillsStatus)return void 0;const ageMs=Math.max(0,Date.now()-lastWorkspaceSkillsStatusAt);return{...lastWorkspaceSkillsStatus,snapshot:{observedAt:lastWorkspaceSkillsStatusAt,ageMs,stale:ageMs>=WORKSPACE_SKILLS_STALE_AFTER_MS,refreshing:inFlightWorkspaceSkillsStatus!==void 0}}},"skillsSnapshot");const readWorkspaceSkillsStatus=__name(async(allowRetainedSnapshot=true,requireEnumerated=false)=>{let status;try{status=await queryWorkspaceStatus(SERVE_STATUS_EXT_METHODS.workspaceSkills,()=>createIdleWorkspaceSkillsStatus(boundWorkspace))}catch(err){writeStderrLine(`qwen serve: getWorkspaceSkillsStatus query failed: ${err instanceof Error?err.message:String(err)}`);status=createIdleWorkspaceSkillsStatus(boundWorkspace)}if(status.initialized&&!status.errors?.length||allowRetainedSnapshot&&lastWorkspaceSkillsStatus){if(status.errors?.length){writeStderrLine(`qwen serve: workspace skills observation reported errors, keeping the retained catalog: ${status.errors.map(cell=>cell.error).join("; ")}`)}return status}if(status.errors?.length){writeStderrLine(`qwen serve: workspace skills observation reported errors, falling back to daemon-local enumeration: ${status.errors.map(cell=>cell.error).join("; ")}`)}if(workspaceSkillsStatusProvider){try{if(!allowRetainedSnapshot){workspaceSkillsStatusProvider.invalidate?.(boundWorkspace)}status=await workspaceSkillsStatusProvider(boundWorkspace)}catch(err){writeStderrLine(`qwen serve: getWorkspaceSkillsStatus local provider failed: ${err instanceof Error?err.message:String(err)}`)}}if(!status.initialized||status.errors?.length){const unavailable=status.errors?.length?{...status,initialized:false}:unavailableWorkspaceSkillsStatus();return requireEnumerated?unavailable:skillsSnapshot()??unavailable}return status},"readWorkspaceSkillsStatus");const revalidateWorkspaceSkillsStatus=__name(()=>{const generation=workspaceSkillsGeneration;if(inFlightWorkspaceSkillsStatus?.generation===generation){return inFlightWorkspaceSkillsStatus.promise}const startedAt=Date.now();const sequence=++workspaceSkillsReadSequence;lastWorkspaceSkillsReadStartedAt=startedAt;const background=lastWorkspaceSkillsStatus!==void 0;const observation=Promise.resolve().then(()=>readWorkspaceSkillsStatus()).then(status=>{assertActiveGeneration();if(generation===workspaceSkillsGeneration&&sequence>publishedWorkspaceSkillsReadSequence&&status.initialized&&!status.errors?.length){lastWorkspaceSkillsStatus=status;lastWorkspaceSkillsStatusAt=startedAt;publishedWorkspaceSkillsReadSequence=sequence}return status});const read={generation,promise:(background?withTimeout(observation,WORKSPACE_SKILLS_REVALIDATE_TIMEOUT_MS,"workspace skills revalidation"):observation).catch(error=>{assertActiveGeneration();writeStderrLineSafe(`qwen serve: workspace skills revalidation failed: ${error instanceof Error?error.message:String(error)}`);return unavailableWorkspaceSkillsStatus()}).finally(()=>{if(inFlightWorkspaceSkillsStatus===read){inFlightWorkspaceSkillsStatus=void 0}})};inFlightWorkspaceSkillsStatus=read;return read.promise},"revalidateWorkspaceSkillsStatus");const getWorkspaceSkillsStatus=__name(()=>{assertActiveGeneration();const elapsed=lastWorkspaceSkillsReadStartedAt===void 0?Infinity:Date.now()-lastWorkspaceSkillsReadStartedAt;const canStart=elapsed<0||elapsed>=WORKSPACE_SKILLS_REVALIDATE_INTERVAL_MS;if(!lastWorkspaceSkillsStatus){if(!inFlightWorkspaceSkillsStatus&&!canStart){return Promise.resolve(unavailableWorkspaceSkillsStatus())}return revalidateWorkspaceSkillsStatus().then(status=>skillsSnapshot()??status)}if(!inFlightWorkspaceSkillsStatus&&canStart){void revalidateWorkspaceSkillsStatus().catch(error=>{writeStderrLineSafe(`qwen serve: workspace skills revalidation failed: ${error instanceof Error?error.message:String(error)}`)})}return Promise.resolve(skillsSnapshot())},"getWorkspaceSkillsStatus");const refreshWorkspaceSkillsAfterMutation=__name(async()=>{invalidateWorkspaceSkillsInventory();if(!(isChannelLive?.()??false))return;try{const refreshed=await invokeWorkspaceCommand(SERVE_CONTROL_EXT_METHODS.workspaceSkillsRefresh,{cwd:boundWorkspace,reason:"content"});if((refreshed.configsFailed??0)>0){writeStderrLine(`qwen serve: ${refreshed.configsFailed} skill cache refresh(es) failed after mutation`)}}catch(err){if(!(err instanceof SessionNotFoundError)&&!(err instanceof BridgeChannelClosedError)){writeStderrLine(`qwen serve: workspace skill refresh after mutation failed: ${err instanceof Error?err.message:String(err)}`)}}finally{invalidateWorkspaceSkillsInventory()}},"refreshWorkspaceSkillsAfterMutation");return{async getWorkspaceMcpStatus(_ctx){return queryWorkspaceStatus(SERVE_STATUS_EXT_METHODS.workspaceMcp,()=>createIdleWorkspaceMcpStatus(boundWorkspace))},async getWorkspaceSkillsStatus(_ctx,opts){if(opts?.requireFresh){assertActiveGeneration();const status=await readWorkspaceSkillsStatus(false);assertActiveGeneration();return status}return getWorkspaceSkillsStatus()},async getWorkspaceSkillsRuntimeStatus(_ctx){return queryWorkspaceStatus(SERVE_STATUS_EXT_METHODS.workspaceSkills,()=>createIdleWorkspaceSkillsStatus(boundWorkspace))},async getWorkspaceSkillsConfigStatus(_ctx){return getWorkspaceSkillsConfigStatus()},async getWorkspaceProvidersStatus(_ctx){if(workspaceProvidersStatusProvider){return workspaceProvidersStatusProvider(boundWorkspace,isChannelLive?.()??false)}return queryWorkspaceStatus(SERVE_STATUS_EXT_METHODS.workspaceProviders,()=>createIdleWorkspaceProvidersStatus(boundWorkspace))},async preheatAcpChild(_ctx,opts){assertActiveGeneration();const startedAt=performance.now();const channelLive=__name(()=>isChannelLive?.()??false,"channelLive");const finish=__name((result,invalidateInventory=true)=>{if(result.ready&&invalidateInventory){assertActiveGeneration();invalidateWorkspaceSkillsSnapshot()}return{...result,durationMs:Math.max(0,Math.round(performance.now()-startedAt))}},"finish");if(!preheatAcpChildOnBridge){if(channelLive()){return finish({ready:true,channelLive:true})}return finish({ready:false,channelLive:false,reason:"error",error:"ACP preheat is unavailable"})}const preheat=Promise.resolve().then(()=>preheatAcpChildOnBridge());void preheat.catch(logPreheatFailure);try{await withTimeout(preheat,opts?.timeoutMs??5e3,"ACP preheat")}catch(err){if(err instanceof TimeoutError){writeStderrLineSafe(`qwen serve: ACP preheat timed out after ${opts?.timeoutMs??5e3}ms`)}const live2=channelLive();if(live2){return finish({ready:true,channelLive:true},false)}return finish({ready:false,channelLive:false,reason:err instanceof TimeoutError?"timeout":"error",error:err instanceof TimeoutError?"ACP preheat did not complete before the timeout":"ACP preheat failed"})}const live=channelLive();if(!live){writeStderrLineSafe("qwen serve: ACP preheat resolved without a live channel")}return live?finish({ready:true,channelLive:true}):finish({ready:false,channelLive:false,reason:"error",error:"ACP preheat did not produce a live channel"})},async getWorkspaceAcpStatus(_ctx){return{channelLive:isChannelLive?.()??false}},async getWorkspaceEnvStatus(_ctx){const acpChannelLive=isChannelLive?.()??false;if(!statusProvider){return createIdleEnvStatus(boundWorkspace,acpChannelLive)}try{return await statusProvider.getEnvStatus(boundWorkspace,acpChannelLive)}catch(err){writeStderrLine(`qwen serve: getEnvStatus failed: ${err instanceof Error?err.message:String(err)}`);return createIdleEnvStatus(boundWorkspace,acpChannelLive)}},async getWorkspacePreflightStatus(_ctx){const acpChannelLive=isChannelLive?.()??false;const idleCells=createIdleAcpPreflightCells();let daemonCells=[];if(statusProvider){try{daemonCells=await statusProvider.getDaemonPreflightCells(boundWorkspace)}catch(err){writeStderrLine(`qwen serve: getDaemonPreflightCells failed: ${err instanceof Error?err.message:String(err)}`)}}let acpCells=idleCells;let errors;if(acpChannelLive){try{const acpResult=await queryWorkspaceStatus(SERVE_STATUS_EXT_METHODS.workspacePreflight,()=>({cells:idleCells}));if(acpResult&&"cells"in acpResult){const result=acpResult;acpCells=result.cells.filter(c=>c.locality!=="daemon");errors=result.errors}}catch(err){acpCells=idleCells;const errorKind=mapDomainErrorToErrorKind(err);errors=[{kind:"preflight",status:"error",error:err instanceof Error?err.message:String(err),...errorKind?{errorKind}:{}}]}}return{v:STATUS_SCHEMA_VERSION,workspaceCwd:boundWorkspace,initialized:true,acpChannelLive,cells:[...daemonCells,...acpCells],...errors&&errors.length>0?{errors}:{}}},async getWorkspaceHooksStatus(_ctx){return queryWorkspaceStatus(SERVE_STATUS_EXT_METHODS.workspaceHooks,()=>createIdleWorkspaceHooksStatus(boundWorkspace))},async getWorkspaceExtensionsStatus(_ctx){return queryWorkspaceStatus(SERVE_STATUS_EXT_METHODS.workspaceExtensions,()=>createIdleWorkspaceExtensionsStatus(boundWorkspace))},async getWorkspaceTrustStatus(_ctx){return getWorkspaceTrustStatus(loadBoundSettings(true).merged,boundWorkspace)},async getWorkspacePermissionsStatus(_ctx){return buildPermissionSettings(loadBoundSettings())},async getWorkspaceVoiceStatus(_ctx){return buildWorkspaceVoiceStatus(boundWorkspace,loadBoundSettings(Boolean(voiceEnv)))},async requestWorkspaceTrustChange(ctx,request){assertActiveGeneration();publishWorkspaceEvent({type:"trust_change_requested",data:{workspaceCwd:boundWorkspace,desiredState:request.desiredState,...request.reason!==void 0?{reason:request.reason}:{}},originatorClientId:ctx.originatorClientId});return{accepted:false,desiredState:request.desiredState,requiresOperatorAction:true}},async grantWorkspaceTrust(_ctx){assertActiveGeneration();loadTrustedFolders().setValue(boundWorkspace,"TRUST_FOLDER",true);const snapshot=await readDaemonTrustPolicySnapshot();const decision=evaluateDaemonWorkspaceTrust(snapshot,boundWorkspace);if(!decision.targetTrusted){throw new WorkspaceTrustGrantIneffectiveError(decision.state,decision.source)}const status=getWorkspaceTrustStatus(loadBoundSettings(true).merged,boundWorkspace);if(status.effective.state!=="trusted"){throw new WorkspaceTrustGrantIneffectiveError(status.effective.state,status.effective.source)}return status},async setWorkspacePermissionRules(ctx,request){assertActiveGeneration();const key=`permissions.${request.ruleType}`;try{const result=await invokeWorkspaceCommand("qwen/permissions/setRules",{cwd:boundWorkspace,scope:request.scope,ruleType:request.ruleType,rules:request.rules});assertActiveGeneration();publishWorkspaceEvent({type:"settings_changed",data:{key,value:request.rules,scope:request.scope},originatorClientId:ctx.originatorClientId});return result}catch(err){if(err instanceof WorkspaceChangePartiallyAppliedError&&err.result!==void 0){assertActiveGeneration();publishWorkspaceEvent({type:"settings_changed",data:{key,value:request.rules,scope:request.scope},originatorClientId:ctx.originatorClientId});throw err}if(!(err instanceof SessionNotFoundError)){throw err}throw new WorkspacePermissionRulesSessionRequiredError}},async setWorkspaceVoiceSettings(ctx,request){assertActiveGeneration();if(!persistSettings&&!persistSetting){throw new WorkspaceVoiceError(501,"not_implemented","Workspace voice settings persistence is not available")}const settings=loadBoundSettings(Boolean(voiceEnv));validateWorkspaceVoiceState(settings,request,{env:voiceEnv});const writes=buildWorkspaceVoiceSettingsWrites(settings,request,{workspaceTrusted:isWorkspaceTrusted(),...voiceSettingsScope?{scopeOverride:voiceSettingsScope}:{}});const publishWrite=__name(write=>{publishWorkspaceEvent({type:"settings_changed",data:{key:write.key,value:write.value,scope:voiceSettingsScopeToWire(write.scope)},originatorClientId:ctx.originatorClientId})},"publishWrite");if(persistSettings){try{await persistSettings(boundWorkspace,writes,assertGenerationOpen)}catch(err){if(err instanceof WorkspaceSettingsPartialPersistError){assertActiveGeneration();for(const write of err.committedWrites){publishWrite(write)}}throw err}assertActiveGeneration();for(const write of writes){publishWrite(write)}}else{const committed=[];for(const write of writes){try{await persistSetting(boundWorkspace,write.scope,write.key,write.value,assertGenerationOpen)}catch(err){assertActiveGeneration();writeStderrLine(`qwen serve: workspace voice partial persist error (workspace=${boundWorkspace}, committed=${committed.length}/${writes.length}, failedKey=${write.key}, failedScope=${voiceSettingsScopeToWire(write.scope)}): ${err instanceof Error?err.message:String(err)}`);for(const committedWrite of committed){publishWrite(committedWrite)}throw new WorkspaceSettingsPartialPersistError(`Voice settings partial persist failed: committed=${committed.length}/${writes.length}`,committed,err)}assertActiveGeneration();committed.push(write)}assertActiveGeneration();for(const write of committed){publishWrite(write)}}return buildWorkspaceVoiceStatus(boundWorkspace,loadBoundSettings(Boolean(voiceEnv)))},async setWorkspaceToolEnabled(ctx,toolName,enabled){assertActiveGeneration();await persistDisabledTools(boundWorkspace,toolName,enabled,assertGenerationOpen);assertActiveGeneration();publishWorkspaceEvent({type:"tool_toggled",data:{toolName,enabled},originatorClientId:ctx.originatorClientId});return{toolName,enabled}},async setWorkspaceSkillEnabled(ctx,requestedSkillName,enabled,opts){assertActiveGeneration();const skillName=requestedSkillName.trim();const persisted=await persistDisabledSkills(boundWorkspace,skillName,enabled,assertGenerationOpen);assertActiveGeneration();const channelLive=isChannelLive?.()??false;const refreshRuntime=opts?.refreshRuntime!==false;let activation=channelLive?persisted.changed&&!refreshRuntime?"reconciling":"applied":"deferred";let sessionsRefreshed=0;let sessionsFailed=0;if(persisted.changed){invalidateWorkspaceSkillsInventory();if(channelLive&&refreshRuntime){try{const refreshed=await invokeWorkspaceCommand(SERVE_CONTROL_EXT_METHODS.workspaceSkillsRefresh,{cwd:boundWorkspace,reason:"settings"});assertActiveGeneration();sessionsRefreshed=refreshed.sessionsRefreshed;sessionsFailed=refreshed.sessionsFailed;if(sessionsFailed>0)activation="partial"}catch(err){if(err instanceof SessionNotFoundError||err instanceof BridgeChannelClosedError){activation="deferred"}else{activation="partial";sessionsFailed=1;writeStderrLine(`qwen serve: workspace skill refresh failed: ${err instanceof Error?err.message:String(err)}`)}}invalidateWorkspaceSkillsInventory()}assertActiveGeneration();const settingsChanges=persisted.settingsChanges??[{key:"skills.disabled",value:persisted.disabled.length>0?persisted.disabled:void 0}];const mutation=createSkillToggleMutation({skills:[{name:skillName,enabled}],activation,sessionsRefreshed,sessionsFailed});for(const change of settingsChanges){publishWorkspaceEvent({type:"settings_changed",data:{key:change.key,value:change.value,scope:"workspace",mutation},originatorClientId:ctx.originatorClientId})}}return{skillName,enabled,changed:persisted.changed,...persisted.block?{block:persisted.block}:{},activation,sessionsRefreshed,sessionsFailed}},async setWorkspaceSkillsEnabled(ctx,requestedSkillNames,enabled){assertActiveGeneration();const skillNames=requestedSkillNames.map(name=>name.trim());const persisted=skillNames.length>0?await persistDisabledSkillsBatch(boundWorkspace,skillNames,enabled,assertGenerationOpen):{outcomes:[],settingsChanges:[]};assertActiveGeneration();const persistedByName=new Map(persisted.outcomes.map(outcome=>[outcome.skillName.trim().toLowerCase(),outcome]));const results=[];for(const skillName of skillNames){const outcome=persistedByName.get(skillName.toLowerCase());if(!outcome){throw new Error(`Missing persisted Skill batch outcome: ${skillName}`)}results.push({skillName:outcome.skillName,enabled,changed:outcome.changed})}const changed=results.some(result=>result.changed);const channelLive=isChannelLive?.()??false;let activation=channelLive?"applied":"deferred";let sessionsRefreshed=0;let sessionsFailed=0;if(changed){invalidateWorkspaceSkillsInventory();if(channelLive){try{const refreshed=await invokeWorkspaceCommand(SERVE_CONTROL_EXT_METHODS.workspaceSkillsRefresh,{cwd:boundWorkspace,reason:"settings"});assertActiveGeneration();sessionsRefreshed=refreshed.sessionsRefreshed;sessionsFailed=refreshed.sessionsFailed;if(sessionsFailed>0)activation="partial"}catch(err){if(err instanceof SessionNotFoundError||err instanceof BridgeChannelClosedError){activation="deferred"}else{activation="partial";sessionsFailed=1;writeStderrLine(`qwen serve: workspace skill refresh failed: ${err instanceof Error?err.message:String(err)}`)}}invalidateWorkspaceSkillsInventory()}assertActiveGeneration();const mutation=createSkillToggleMutation({skills:results.filter(result=>result.changed).map(result=>({name:result.skillName,enabled:result.enabled})),activation,sessionsRefreshed,sessionsFailed});for(const change of persisted.settingsChanges){publishWorkspaceEvent({type:"settings_changed",data:{...change,scope:"workspace",mutation},originatorClientId:ctx.originatorClientId})}}return{enabled,activation,sessionsRefreshed,sessionsFailed,results,errors:[]}},async installWorkspaceSkill(_ctx,request,opts){assertActiveGeneration();const result=await installWorkspaceSkill(boundWorkspace,request,skillInstallEnv?.["GH_TOKEN"]??skillInstallEnv?.["GITHUB_TOKEN"],assertGenerationOpen);assertActiveGeneration();if(opts?.refreshRuntime===false)invalidateWorkspaceSkillsInventory();else await refreshWorkspaceSkillsAfterMutation();assertActiveGeneration();return result},async deleteWorkspaceSkill(_ctx,requestedSkillName,scope,opts){assertActiveGeneration();const normalizedName=requestedSkillName.trim().toLowerCase();const exactName=requestedSkillName.trim();if(opts?.refreshRuntime===false)invalidateWorkspaceSkillsInventory();const status=opts?.refreshRuntime===false?await getWorkspaceSkillsConfigStatus():await readWorkspaceSkillsStatus(false,true);assertActiveGeneration();if(!status.initialized||status.errors?.length){throw new WorkspaceSkillManagementError("skills_config_unavailable","Skills configuration could not be enumerated",503)}const expectedLevel=scope==="workspace"?"project":"user";const matches=status.skills.filter(candidate=>candidate.name.trim().toLowerCase()===normalizedName);const scopedMatches=matches.filter(candidate=>candidate.level===expectedLevel);const skill=scopedMatches.find(candidate=>candidate.name===exactName)??(scopedMatches.length===1?scopedMatches[0]:void 0);if(!skill&&matches.length===0){throw new WorkspaceSkillNotFoundError(requestedSkillName)}if(!skill?.installedPath){throw new WorkspaceSkillManagementError("skill_not_managed","Skill is not managed in the requested scope",409)}let result;try{result=await deleteWorkspaceSkill(boundWorkspace,scope,skill.name,skill.installedPath,assertGenerationOpen)}catch(error){if(error.code==="ENOENT"){throw new WorkspaceSkillNotFoundError(requestedSkillName)}throw error}assertActiveGeneration();if(opts?.refreshRuntime===false)invalidateWorkspaceSkillsInventory();else await refreshWorkspaceSkillsAfterMutation();assertActiveGeneration();return result},async initWorkspace(ctx,opts){assertActiveGeneration();const filename=contextFilename;const target=path2.resolve(boundWorkspace,filename);const withinWorkspace=target===boundWorkspace||target.startsWith(boundWorkspace+path2.sep);if(!withinWorkspace){throw new WorkspaceInitPathEscapeError(filename,boundWorkspace)}const wsCanonical=await fs2.realpath(boundWorkspace);const parentCanonical=await canonicalizeExistingAncestor(path2.dirname(target));const parentWithinWorkspace=parentCanonical===wsCanonical||parentCanonical.startsWith(wsCanonical+path2.sep);if(!parentWithinWorkspace){throw new WorkspaceInitSymlinkError(target,"parent",`Configured workspace context filename ${JSON.stringify(filename)} has a parent path that resolves outside the bound workspace (parent canonicalizes to ${JSON.stringify(parentCanonical)}, workspace canonicalizes to ${JSON.stringify(wsCanonical)}). Refusing to write \u2014 replace any symlinked parent directory with a real directory before re-running init.`)}try{const lst=await fs2.lstat(target);if(lst.isSymbolicLink()){throw new WorkspaceInitSymlinkError(target,"target",`Workspace context file ${JSON.stringify(target)} is a symlink. Refusing to follow it for write \u2014 replace the symlink with a regular file (or remove it) before re-running init.`)}if(!lst.isFile()){throw new WorkspaceInitSymlinkError(target,"target",`Workspace context file ${JSON.stringify(target)} is not a regular file (mode=${lst.mode.toString(8)}). Refusing to proceed \u2014 FIFOs, sockets, and device nodes can block or misbehave on read/write.`)}}catch(err){if(err instanceof WorkspaceInitSymlinkError)throw err;const code=err?.code;if(code!=="ENOENT")throw err}let action="created";try{const existing=await fs2.readFile(target,"utf8");if(existing.trim().length>0){const existingSize=Buffer.byteLength(existing,"utf8");if(opts.force!==true){throw new WorkspaceInitConflictError(target,existingSize)}action="overwrote"}else{action="noop"}}catch(err){if(err instanceof WorkspaceInitConflictError)throw err;const code=err?.code;if(code!=="ENOENT")throw err}if(action==="created"){let fh;try{assertActiveGeneration();fh=await fs2.open(target,"wx")}catch(err){const code=err?.code;if(code==="EEXIST"){throw new WorkspaceInitRaceError(target,"eexist",`Workspace context file ${JSON.stringify(target)} appeared between our absence check and the create \u2014 refusing to proceed (a regular file or symlink was just placed at the target path, and following it could escape the workspace).`)}throw err}try{await verifyParentPostOpen(target,wsCanonical,fh);assertActiveGeneration();await fh.writeFile("","utf8")}finally{await fh.close()}}else if(action==="overwrote"){let overwriteFh;try{assertActiveGeneration();overwriteFh=await fs2.open(target,fsConstants.O_WRONLY|(fsConstants.O_NOFOLLOW??0))}catch(err){const code=err?.code;if(code==="ELOOP"){throw new WorkspaceInitSymlinkError(target,"target",`Workspace context file ${JSON.stringify(target)} could not be opened with O_NOFOLLOW (ELOOP); the path may have been swapped to a symlink between the content check and the overwrite. Refusing to follow it.`)}if(code==="ENOENT"){throw new WorkspaceInitRaceError(target,"enoent",`Workspace context file ${JSON.stringify(target)} was deleted between the content check and the overwrite (likely a concurrent writer). Refusing to recreate blindly; rerun init.`)}throw err}try{await verifyParentPostOpen(target,wsCanonical,overwriteFh);assertActiveGeneration();await overwriteFh.truncate(0)}finally{await overwriteFh.close()}}assertActiveGeneration();publishWorkspaceEvent({type:"workspace_initialized",data:{path:target,action},originatorClientId:ctx.originatorClientId});return{path:target,action}},async restartMcpServer(ctx,serverName,opts){assertActiveGeneration();const params={serverName};if(opts?.entryIndex!==void 0){params["entryIndex"]=opts.entryIndex}let result;try{result=await invokeWorkspaceCommand(SERVE_CONTROL_EXT_METHODS.workspaceMcpRestart,params,{timeoutMs:MCP_RESTART_SERVER_DEADLINE_MS})}catch(err){const data=err?.data;if(data&&typeof data==="object"){const kind=data.errorKind;const sn=data.serverName;if(kind==="mcp_server_not_found"&&typeof sn==="string"){throw new McpServerNotFoundError(sn)}if(kind==="mcp_restart_failed"&&typeof sn==="string"){const status=data.mcpStatus;throw new McpServerRestartFailedError(sn,typeof status==="string"?status:"unknown")}}throw err}assertActiveGeneration();if("entries"in result){const entries=Array.isArray(result.entries)?result.entries:[];if(!Array.isArray(result.entries)){writeStderrLine(`qwen serve: pool restart response carried 'entries' field but it is not an array (server=${serverName}); treating as empty.`)}for(const entry of entries){if(typeof entry!=="object"||entry===null||typeof entry.entryIndex!=="number"){writeStderrLine(`qwen serve: skipping malformed pool restart entry (server=${serverName}): ${JSON.stringify(entry)}`);continue}if(entry.restarted){publishWorkspaceEvent({type:"mcp_server_restarted",data:{serverName:result.serverName,durationMs:entry.durationMs??0,entryIndex:entry.entryIndex},originatorClientId:ctx.originatorClientId})}else{publishWorkspaceEvent({type:"mcp_server_restart_refused",data:{serverName:result.serverName,reason:"restart_failed",entryIndex:entry.entryIndex,...entry.reason?{details:entry.reason}:{}},originatorClientId:ctx.originatorClientId})}}}else if(result.restarted===true){publishWorkspaceEvent({type:"mcp_server_restarted",data:{serverName:result.serverName,durationMs:result.durationMs},originatorClientId:ctx.originatorClientId})}else{publishWorkspaceEvent({type:"mcp_server_restart_refused",data:{serverName:result.serverName,reason:result.reason},originatorClientId:ctx.originatorClientId})}return result},async reload(ctx){assertActiveGeneration();let runtimeEnvironmentApplied;if(deps.reloadDaemonEnv){try{const result=await deps.reloadDaemonEnv(boundWorkspace,assertGenerationOpen);runtimeEnvironmentApplied=result.runtimeEnvironmentApplied}catch(err){runtimeEnvironmentApplied=false;writeStderrLine(`qwen serve: daemon reload failed: ${err instanceof Error?err.message:String(err)}`)}}assertActiveGeneration();let childReloaded=false;let env={updatedKeys:[],removedKeys:[]};let changedKeys=[];let sessionsRefreshed;let sessionsSkipped;let childError;const applyChildResult=__name(childResult=>{childReloaded=true;env=childResult.env;changedKeys=childResult.changedKeys;sessionsRefreshed=childResult.sessionsRefreshed;sessionsSkipped=childResult.sessionsSkipped},"applyChildResult");try{applyChildResult(await invokeWorkspaceCommand(SERVE_CONTROL_EXT_METHODS.workspaceReload,{cwd:boundWorkspace},{timeoutMs:3e4}))}catch(err){if(err instanceof WorkspaceChangePartiallyAppliedError&&err.result!==void 0){applyChildResult(err.result)}if(err instanceof SessionNotFoundError){childError="ACP child not running"}else{childError=err instanceof Error?err.message:String(err);writeStderrLine(`qwen serve: reload failed: ${childError}`)}}assertActiveGeneration();publishWorkspaceEvent({type:"settings_reloaded",data:{env,changedKeys,childReloaded,sessionsRefreshed,sessionsSkipped,childError,...runtimeEnvironmentApplied===void 0?{}:{runtimeEnvironmentApplied}},originatorClientId:ctx.originatorClientId});return{env,changedKeys,childReloaded,sessionsRefreshed,sessionsSkipped,childError,...runtimeEnvironmentApplied===void 0?{}:{runtimeEnvironmentApplied}}},async reloadModelProviders(_ctx){assertActiveGeneration();let failed=false;const reloadModelProvidersDaemonEnv=deps.reloadModelProvidersDaemonEnv??deps.reloadDaemonEnv;if(reloadModelProvidersDaemonEnv){try{const result=await reloadModelProvidersDaemonEnv(boundWorkspace,assertGenerationOpen);failed=result.runtimeEnvironmentApplied===false}catch{assertActiveGeneration();failed=true;writeStderrLine("qwen serve: model-provider parent environment sync failed")}}assertActiveGeneration();try{const child=await invokeWorkspaceCommand(SERVE_CONTROL_EXT_METHODS.workspaceModelProvidersReload,{cwd:boundWorkspace},{timeoutMs:3e4});if((child.configsFailed??0)>0)failed=true;return{status:failed?"failed":"applied"}}catch(err){assertActiveGeneration();if(err instanceof SessionNotFoundError||err instanceof BridgeChannelClosedError){return{status:failed?"failed":"deferred"}}writeStderrLine("qwen serve: model-provider ACP child sync failed");return{status:"failed"}}},invalidateWorkspaceSkillsStatus(){invalidateWorkspaceSkillsInventory()},async refreshWorkspaceSkills(_ctx,sessionIds){assertActiveGeneration();try{const result=await invokeWorkspaceCommand(SERVE_CONTROL_EXT_METHODS.workspaceSkillsRefresh,{cwd:boundWorkspace,reason:"all",...sessionIds!==void 0?{sessionIds}:{}});assertActiveGeneration();return result}finally{invalidateWorkspaceSkillsInventory()}},async refreshExtensionsForAllSessions(sessionIds){assertActiveGeneration();try{if(!refreshExtensionsForAllSessionsOnBridge){throw new Error("refreshExtensionsForAllSessions is not wired")}return await refreshExtensionsForAllSessionsOnBridge(sessionIds)}catch(err){if(err instanceof SessionNotFoundError)throw err;writeStderrLine(`qwen serve: refreshExtensionsForAllSessions failed: ${err instanceof Error?err.message:String(err)}`);return{refreshed:0,failed:1}}finally{invalidateWorkspaceSkillsInventory()}}}}__name(createDaemonWorkspaceService,"createDaemonWorkspaceService");export{MAX_WORKSPACE_SKILL_NAME_LENGTH,WorkspaceSkillManagementError,validateWorkspaceSkillName,workspaceSkillBaseDir,installWorkspaceSkill,deleteWorkspaceSkill,EMPTY_WORKSPACE_VOICE_UPDATE_ERROR,WorkspaceVoiceError,voiceSettingsScopeToWire,buildWorkspaceVoiceSettingsWrites,hasConfiguredBatchVoiceTranscriptionModel,buildWorkspaceVoiceStatus,validateWorkspaceVoiceState,transcribeWorkspaceVoiceAudio,createDaemonWorkspaceService};
|
|
3
|
+
import{buildPermissionSettings}from"./chunk-5JZNZNAX.js";import{resolveVoiceStreamConfig,resolveVoiceTranscriptionConfig,transcribeVoiceAudio}from"./chunk-4ME3BUJK.js";import{getVoiceSettingsScope,isSelectableVoiceModel,isVoiceEnabled,readVoiceLanguage,readVoiceMode,readVoiceModel,resolveVoiceTransport}from"./chunk-EKRUF347.js";import{evaluateDaemonWorkspaceTrust,readDaemonTrustPolicySnapshot}from"./chunk-O5JCCBMQ.js";import{WorkspacePermissionRulesSessionRequiredError,WorkspaceSettingsPartialPersistError,WorkspaceSkillNotFoundError,WorkspaceTrustGrantIneffectiveError}from"./chunk-PM5O2I2V.js";import{MCP_RESTART_SERVER_DEADLINE_MS}from"./chunk-IFPLGH5C.js";import{BridgeChannelClosedError,SERVE_CONTROL_EXT_METHODS,SERVE_STATUS_EXT_METHODS,STATUS_SCHEMA_VERSION,createIdleAcpPreflightCells,createIdleEnvStatus,createIdleWorkspaceExtensionsStatus,createIdleWorkspaceHooksStatus,createIdleWorkspaceMcpStatus,createIdleWorkspaceProvidersStatus,createIdleWorkspaceSkillsStatus,mapDomainErrorToErrorKind}from"./chunk-LUDNUVSA.js";import{McpServerNotFoundError,McpServerRestartFailedError,SessionNotFoundError,WorkspaceChangePartiallyAppliedError,WorkspaceInitConflictError,WorkspaceInitPathEscapeError,WorkspaceInitRaceError,WorkspaceInitSymlinkError}from"./chunk-VTZZXEWA.js";import{publicProviderBaseUrl}from"./chunk-GT4TCQ3R.js";import{getPersistScopeForModelSelection,loadSettings}from"./chunk-EZPM4DLR.js";import{getWorkspaceTrustStatus,loadTrustedFolders}from"./chunk-4CE4GMDL.js";import{SkillManager,require_buffer_crc32,require_fd_slicer}from"./chunk-7XQ5D34E.js";import{sanitizeChildEnv}from"./chunk-LMJPU2JM.js";import{ModelsConfig}from"./chunk-ET2Z7ZGF.js";import{writeStderrLine,writeStderrLineSafe}from"./chunk-M4ECEHLX.js";import{createDebugLogger}from"./chunk-JAUJI56S.js";import{Storage}from"./chunk-EPODBRBP.js";import{init_esbuild_shims}from"./chunk-VKDAXTCZ.js";import{__commonJS,__name,__require,__toESM}from"./chunk-KBWJGX7I.js";var require_yauzl=__commonJS({"packages/cli/node_modules/yauzl/index.js"(exports){init_esbuild_shims();var fs3=__require("fs");var zlib=__require("zlib");var fd_slicer=require_fd_slicer();var crc32=require_buffer_crc32();var util=__require("util");var EventEmitter=__require("events").EventEmitter;var Transform2=__require("stream").Transform;var PassThrough2=__require("stream").PassThrough;var Writable=__require("stream").Writable;exports.open=open;exports.fromFd=fromFd;exports.fromBuffer=fromBuffer2;exports.fromRandomAccessReader=fromRandomAccessReader;exports.dosDateTimeToDate=dosDateTimeToDate;exports.validateFileName=validateFileName;exports.ZipFile=ZipFile;exports.Entry=Entry;exports.RandomAccessReader=RandomAccessReader;function open(path3,options,callback){if(typeof options==="function"){callback=options;options=null}if(options==null)options={};if(options.autoClose==null)options.autoClose=true;if(options.lazyEntries==null)options.lazyEntries=false;if(options.decodeStrings==null)options.decodeStrings=true;if(options.validateEntrySizes==null)options.validateEntrySizes=true;if(options.strictFileNames==null)options.strictFileNames=false;if(callback==null)callback=defaultCallback;fs3.open(path3,"r",function(err,fd){if(err)return callback(err);fromFd(fd,options,function(err2,zipfile){if(err2)fs3.close(fd,defaultCallback);callback(err2,zipfile)})})}__name(open,"open");function fromFd(fd,options,callback){if(typeof options==="function"){callback=options;options=null}if(options==null)options={};if(options.autoClose==null)options.autoClose=false;if(options.lazyEntries==null)options.lazyEntries=false;if(options.decodeStrings==null)options.decodeStrings=true;if(options.validateEntrySizes==null)options.validateEntrySizes=true;if(options.strictFileNames==null)options.strictFileNames=false;if(callback==null)callback=defaultCallback;fs3.fstat(fd,function(err,stats){if(err)return callback(err);var reader=fd_slicer.createFromFd(fd,{autoClose:true});fromRandomAccessReader(reader,stats.size,options,callback)})}__name(fromFd,"fromFd");function fromBuffer2(buffer,options,callback){if(typeof options==="function"){callback=options;options=null}if(options==null)options={};options.autoClose=false;if(options.lazyEntries==null)options.lazyEntries=false;if(options.decodeStrings==null)options.decodeStrings=true;if(options.validateEntrySizes==null)options.validateEntrySizes=true;if(options.strictFileNames==null)options.strictFileNames=false;var reader=fd_slicer.createFromBuffer(buffer,{maxChunkSize:65536});fromRandomAccessReader(reader,buffer.length,options,callback)}__name(fromBuffer2,"fromBuffer");function fromRandomAccessReader(reader,totalSize,options,callback){if(typeof options==="function"){callback=options;options=null}if(options==null)options={};if(options.autoClose==null)options.autoClose=true;if(options.lazyEntries==null)options.lazyEntries=false;if(options.decodeStrings==null)options.decodeStrings=true;var decodeStrings=!!options.decodeStrings;if(options.validateEntrySizes==null)options.validateEntrySizes=true;if(options.strictFileNames==null)options.strictFileNames=false;if(callback==null)callback=defaultCallback;if(typeof totalSize!=="number")throw new Error("expected totalSize parameter to be a number");if(totalSize>Number.MAX_SAFE_INTEGER){throw new Error("zip file too large. only file sizes up to 2^52 are supported due to JavaScript's Number type being an IEEE 754 double.")}reader.ref();var eocdrWithoutCommentSize=22;var maxCommentSize=65535;var bufferSize=Math.min(eocdrWithoutCommentSize+maxCommentSize,totalSize);var buffer=newBuffer(bufferSize);var bufferReadStart=totalSize-buffer.length;readAndAssertNoEof(reader,buffer,0,bufferSize,bufferReadStart,function(err){if(err)return callback(err);for(var i=bufferSize-eocdrWithoutCommentSize;i>=0;i-=1){if(buffer.readUInt32LE(i)!==101010256)continue;var eocdrBuffer=buffer.slice(i);var diskNumber=eocdrBuffer.readUInt16LE(4);if(diskNumber!==0){return callback(new Error("multi-disk zip files are not supported: found disk number: "+diskNumber))}var entryCount=eocdrBuffer.readUInt16LE(10);var centralDirectoryOffset=eocdrBuffer.readUInt32LE(16);var commentLength=eocdrBuffer.readUInt16LE(20);var expectedCommentLength=eocdrBuffer.length-eocdrWithoutCommentSize;if(commentLength!==expectedCommentLength){return callback(new Error("invalid comment length. expected: "+expectedCommentLength+". found: "+commentLength))}var comment=decodeStrings?decodeBuffer(eocdrBuffer,22,eocdrBuffer.length,false):eocdrBuffer.slice(22);if(!(entryCount===65535||centralDirectoryOffset===4294967295)){return callback(null,new ZipFile(reader,centralDirectoryOffset,totalSize,entryCount,comment,options.autoClose,options.lazyEntries,decodeStrings,options.validateEntrySizes,options.strictFileNames))}var zip64EocdlBuffer=newBuffer(20);var zip64EocdlOffset=bufferReadStart+i-zip64EocdlBuffer.length;readAndAssertNoEof(reader,zip64EocdlBuffer,0,zip64EocdlBuffer.length,zip64EocdlOffset,function(err2){if(err2)return callback(err2);if(zip64EocdlBuffer.readUInt32LE(0)!==117853008){return callback(new Error("invalid zip64 end of central directory locator signature"))}var zip64EocdrOffset=readUInt64LE(zip64EocdlBuffer,8);var zip64EocdrBuffer=newBuffer(56);readAndAssertNoEof(reader,zip64EocdrBuffer,0,zip64EocdrBuffer.length,zip64EocdrOffset,function(err3){if(err3)return callback(err3);if(zip64EocdrBuffer.readUInt32LE(0)!==101075792){return callback(new Error("invalid zip64 end of central directory record signature"))}entryCount=readUInt64LE(zip64EocdrBuffer,32);centralDirectoryOffset=readUInt64LE(zip64EocdrBuffer,48);return callback(null,new ZipFile(reader,centralDirectoryOffset,totalSize,entryCount,comment,options.autoClose,options.lazyEntries,decodeStrings,options.validateEntrySizes,options.strictFileNames))})});return}callback(new Error("end of central directory record signature not found"))})}__name(fromRandomAccessReader,"fromRandomAccessReader");util.inherits(ZipFile,EventEmitter);function ZipFile(reader,centralDirectoryOffset,fileSize,entryCount,comment,autoClose,lazyEntries,decodeStrings,validateEntrySizes,strictFileNames){var self=this;EventEmitter.call(self);self.reader=reader;self.reader.on("error",function(err){emitError(self,err)});self.reader.once("close",function(){self.emit("close")});self.readEntryCursor=centralDirectoryOffset;self.fileSize=fileSize;self.entryCount=entryCount;self.comment=comment;self.entriesRead=0;self.autoClose=!!autoClose;self.lazyEntries=!!lazyEntries;self.decodeStrings=!!decodeStrings;self.validateEntrySizes=!!validateEntrySizes;self.strictFileNames=!!strictFileNames;self.isOpen=true;self.emittedError=false;if(!self.lazyEntries)self._readEntry()}__name(ZipFile,"ZipFile");ZipFile.prototype.close=function(){if(!this.isOpen)return;this.isOpen=false;this.reader.unref()};function emitErrorAndAutoClose(self,err){if(self.autoClose)self.close();emitError(self,err)}__name(emitErrorAndAutoClose,"emitErrorAndAutoClose");function emitError(self,err){if(self.emittedError)return;self.emittedError=true;self.emit("error",err)}__name(emitError,"emitError");ZipFile.prototype.readEntry=function(){if(!this.lazyEntries)throw new Error("readEntry() called without lazyEntries:true");this._readEntry()};ZipFile.prototype._readEntry=function(){var self=this;if(self.entryCount===self.entriesRead){setImmediate(function(){if(self.autoClose)self.close();if(self.emittedError)return;self.emit("end")});return}if(self.emittedError)return;var buffer=newBuffer(46);readAndAssertNoEof(self.reader,buffer,0,buffer.length,self.readEntryCursor,function(err){if(err)return emitErrorAndAutoClose(self,err);if(self.emittedError)return;var entry=new Entry;var signature=buffer.readUInt32LE(0);if(signature!==33639248)return emitErrorAndAutoClose(self,new Error("invalid central directory file header signature: 0x"+signature.toString(16)));entry.versionMadeBy=buffer.readUInt16LE(4);entry.versionNeededToExtract=buffer.readUInt16LE(6);entry.generalPurposeBitFlag=buffer.readUInt16LE(8);entry.compressionMethod=buffer.readUInt16LE(10);entry.lastModFileTime=buffer.readUInt16LE(12);entry.lastModFileDate=buffer.readUInt16LE(14);entry.crc32=buffer.readUInt32LE(16);entry.compressedSize=buffer.readUInt32LE(20);entry.uncompressedSize=buffer.readUInt32LE(24);entry.fileNameLength=buffer.readUInt16LE(28);entry.extraFieldLength=buffer.readUInt16LE(30);entry.fileCommentLength=buffer.readUInt16LE(32);entry.internalFileAttributes=buffer.readUInt16LE(36);entry.externalFileAttributes=buffer.readUInt32LE(38);entry.relativeOffsetOfLocalHeader=buffer.readUInt32LE(42);if(entry.generalPurposeBitFlag&64)return emitErrorAndAutoClose(self,new Error("strong encryption is not supported"));self.readEntryCursor+=46;buffer=newBuffer(entry.fileNameLength+entry.extraFieldLength+entry.fileCommentLength);readAndAssertNoEof(self.reader,buffer,0,buffer.length,self.readEntryCursor,function(err2){if(err2)return emitErrorAndAutoClose(self,err2);if(self.emittedError)return;var isUtf8=(entry.generalPurposeBitFlag&2048)!==0;entry.fileName=self.decodeStrings?decodeBuffer(buffer,0,entry.fileNameLength,isUtf8):buffer.slice(0,entry.fileNameLength);var fileCommentStart=entry.fileNameLength+entry.extraFieldLength;var extraFieldBuffer=buffer.slice(entry.fileNameLength,fileCommentStart);entry.extraFields=[];var i=0;while(i<extraFieldBuffer.length-3){var headerId=extraFieldBuffer.readUInt16LE(i+0);var dataSize=extraFieldBuffer.readUInt16LE(i+2);var dataStart=i+4;var dataEnd=dataStart+dataSize;if(dataEnd>extraFieldBuffer.length)return emitErrorAndAutoClose(self,new Error("extra field length exceeds extra field buffer size"));var dataBuffer=newBuffer(dataSize);extraFieldBuffer.copy(dataBuffer,0,dataStart,dataEnd);entry.extraFields.push({id:headerId,data:dataBuffer});i=dataEnd}entry.fileComment=self.decodeStrings?decodeBuffer(buffer,fileCommentStart,fileCommentStart+entry.fileCommentLength,isUtf8):buffer.slice(fileCommentStart,fileCommentStart+entry.fileCommentLength);entry.comment=entry.fileComment;self.readEntryCursor+=buffer.length;self.entriesRead+=1;if(entry.uncompressedSize===4294967295||entry.compressedSize===4294967295||entry.relativeOffsetOfLocalHeader===4294967295){var zip64EiefBuffer=null;for(var i=0;i<entry.extraFields.length;i++){var extraField=entry.extraFields[i];if(extraField.id===1){zip64EiefBuffer=extraField.data;break}}if(zip64EiefBuffer==null){return emitErrorAndAutoClose(self,new Error("expected zip64 extended information extra field"))}var index=0;if(entry.uncompressedSize===4294967295){if(index+8>zip64EiefBuffer.length){return emitErrorAndAutoClose(self,new Error("zip64 extended information extra field does not include uncompressed size"))}entry.uncompressedSize=readUInt64LE(zip64EiefBuffer,index);index+=8}if(entry.compressedSize===4294967295){if(index+8>zip64EiefBuffer.length){return emitErrorAndAutoClose(self,new Error("zip64 extended information extra field does not include compressed size"))}entry.compressedSize=readUInt64LE(zip64EiefBuffer,index);index+=8}if(entry.relativeOffsetOfLocalHeader===4294967295){if(index+8>zip64EiefBuffer.length){return emitErrorAndAutoClose(self,new Error("zip64 extended information extra field does not include relative header offset"))}entry.relativeOffsetOfLocalHeader=readUInt64LE(zip64EiefBuffer,index);index+=8}}if(self.decodeStrings){for(var i=0;i<entry.extraFields.length;i++){var extraField=entry.extraFields[i];if(extraField.id===28789){if(extraField.data.length<6){continue}if(extraField.data.readUInt8(0)!==1){continue}var oldNameCrc32=extraField.data.readUInt32LE(1);if(crc32.unsigned(buffer.slice(0,entry.fileNameLength))!==oldNameCrc32){continue}entry.fileName=decodeBuffer(extraField.data,5,extraField.data.length,true);break}}}if(self.validateEntrySizes&&entry.compressionMethod===0){var expectedCompressedSize=entry.uncompressedSize;if(entry.isEncrypted()){expectedCompressedSize+=12}if(entry.compressedSize!==expectedCompressedSize){var msg="compressed/uncompressed size mismatch for stored file: "+entry.compressedSize+" != "+entry.uncompressedSize;return emitErrorAndAutoClose(self,new Error(msg))}}if(self.decodeStrings){if(!self.strictFileNames){entry.fileName=entry.fileName.replace(/\\/g,"/")}var errorMessage=validateFileName(entry.fileName,self.validateFileNameOptions);if(errorMessage!=null)return emitErrorAndAutoClose(self,new Error(errorMessage))}self.emit("entry",entry);if(!self.lazyEntries)self._readEntry()})})};ZipFile.prototype.openReadStream=function(entry,options,callback){var self=this;var relativeStart=0;var relativeEnd=entry.compressedSize;if(callback==null){callback=options;options={}}else{if(options.decrypt!=null){if(!entry.isEncrypted()){throw new Error("options.decrypt can only be specified for encrypted entries")}if(options.decrypt!==false)throw new Error("invalid options.decrypt value: "+options.decrypt);if(entry.isCompressed()){if(options.decompress!==false)throw new Error("entry is encrypted and compressed, and options.decompress !== false")}}if(options.decompress!=null){if(!entry.isCompressed()){throw new Error("options.decompress can only be specified for compressed entries")}if(!(options.decompress===false||options.decompress===true)){throw new Error("invalid options.decompress value: "+options.decompress)}}if(options.start!=null||options.end!=null){if(entry.isCompressed()&&options.decompress!==false){throw new Error("start/end range not allowed for compressed entry without options.decompress === false")}if(entry.isEncrypted()&&options.decrypt!==false){throw new Error("start/end range not allowed for encrypted entry without options.decrypt === false")}}if(options.start!=null){relativeStart=options.start;if(relativeStart<0)throw new Error("options.start < 0");if(relativeStart>entry.compressedSize)throw new Error("options.start > entry.compressedSize")}if(options.end!=null){relativeEnd=options.end;if(relativeEnd<0)throw new Error("options.end < 0");if(relativeEnd>entry.compressedSize)throw new Error("options.end > entry.compressedSize");if(relativeEnd<relativeStart)throw new Error("options.end < options.start")}}if(!self.isOpen)return callback(new Error("closed"));if(entry.isEncrypted()){if(options.decrypt!==false)return callback(new Error("entry is encrypted, and options.decrypt !== false"))}self.reader.ref();var buffer=newBuffer(30);readAndAssertNoEof(self.reader,buffer,0,buffer.length,entry.relativeOffsetOfLocalHeader,function(err){try{if(err)return callback(err);var signature=buffer.readUInt32LE(0);if(signature!==67324752){return callback(new Error("invalid local file header signature: 0x"+signature.toString(16)))}var fileNameLength=buffer.readUInt16LE(26);var extraFieldLength=buffer.readUInt16LE(28);var localFileHeaderEnd=entry.relativeOffsetOfLocalHeader+buffer.length+fileNameLength+extraFieldLength;var decompress;if(entry.compressionMethod===0){decompress=false}else if(entry.compressionMethod===8){decompress=options.decompress!=null?options.decompress:true}else{return callback(new Error("unsupported compression method: "+entry.compressionMethod))}var fileDataStart=localFileHeaderEnd;var fileDataEnd=fileDataStart+entry.compressedSize;if(entry.compressedSize!==0){if(fileDataEnd>self.fileSize){return callback(new Error("file data overflows file bounds: "+fileDataStart+" + "+entry.compressedSize+" > "+self.fileSize))}}var readStream=self.reader.createReadStream({start:fileDataStart+relativeStart,end:fileDataStart+relativeEnd});var endpointStream=readStream;if(decompress){var destroyed=false;var inflateFilter=zlib.createInflateRaw();readStream.on("error",function(err2){setImmediate(function(){if(!destroyed)inflateFilter.emit("error",err2)})});readStream.pipe(inflateFilter);if(self.validateEntrySizes){endpointStream=new AssertByteCountStream(entry.uncompressedSize);inflateFilter.on("error",function(err2){setImmediate(function(){if(!destroyed)endpointStream.emit("error",err2)})});inflateFilter.pipe(endpointStream)}else{endpointStream=inflateFilter}endpointStream.destroy=function(){destroyed=true;if(inflateFilter!==endpointStream)inflateFilter.unpipe(endpointStream);readStream.unpipe(inflateFilter);readStream.destroy()}}callback(null,endpointStream)}finally{self.reader.unref()}})};function Entry(){}__name(Entry,"Entry");Entry.prototype.getLastModDate=function(){return dosDateTimeToDate(this.lastModFileDate,this.lastModFileTime)};Entry.prototype.isEncrypted=function(){return(this.generalPurposeBitFlag&1)!==0};Entry.prototype.isCompressed=function(){return this.compressionMethod===8};function dosDateTimeToDate(date,time){var day=date&31;var month=(date>>5&15)-1;var year=(date>>9&127)+1980;var millisecond=0;var second=(time&31)*2;var minute=time>>5&63;var hour=time>>11&31;return new Date(year,month,day,hour,minute,second,millisecond)}__name(dosDateTimeToDate,"dosDateTimeToDate");function validateFileName(fileName){if(fileName.indexOf("\\")!==-1){return"invalid characters in fileName: "+fileName}if(/^[a-zA-Z]:/.test(fileName)||/^\//.test(fileName)){return"absolute path: "+fileName}if(fileName.split("/").indexOf("..")!==-1){return"invalid relative path: "+fileName}return null}__name(validateFileName,"validateFileName");function readAndAssertNoEof(reader,buffer,offset,length,position,callback){if(length===0){return setImmediate(function(){callback(null,newBuffer(0))})}reader.read(buffer,offset,length,position,function(err,bytesRead){if(err)return callback(err);if(bytesRead<length){return callback(new Error("unexpected EOF"))}callback()})}__name(readAndAssertNoEof,"readAndAssertNoEof");util.inherits(AssertByteCountStream,Transform2);function AssertByteCountStream(byteCount){Transform2.call(this);this.actualByteCount=0;this.expectedByteCount=byteCount}__name(AssertByteCountStream,"AssertByteCountStream");AssertByteCountStream.prototype._transform=function(chunk,encoding,cb){this.actualByteCount+=chunk.length;if(this.actualByteCount>this.expectedByteCount){var msg="too many bytes in the stream. expected "+this.expectedByteCount+". got at least "+this.actualByteCount;return cb(new Error(msg))}cb(null,chunk)};AssertByteCountStream.prototype._flush=function(cb){if(this.actualByteCount<this.expectedByteCount){var msg="not enough bytes in the stream. expected "+this.expectedByteCount+". got only "+this.actualByteCount;return cb(new Error(msg))}cb()};util.inherits(RandomAccessReader,EventEmitter);function RandomAccessReader(){EventEmitter.call(this);this.refCount=0}__name(RandomAccessReader,"RandomAccessReader");RandomAccessReader.prototype.ref=function(){this.refCount+=1};RandomAccessReader.prototype.unref=function(){var self=this;self.refCount-=1;if(self.refCount>0)return;if(self.refCount<0)throw new Error("invalid unref");self.close(onCloseDone);function onCloseDone(err){if(err)return self.emit("error",err);self.emit("close")}__name(onCloseDone,"onCloseDone")};RandomAccessReader.prototype.createReadStream=function(options){var start=options.start;var end=options.end;if(start===end){var emptyStream=new PassThrough2;setImmediate(function(){emptyStream.end()});return emptyStream}var stream=this._readStreamForRange(start,end);var destroyed=false;var refUnrefFilter=new RefUnrefFilter(this);stream.on("error",function(err){setImmediate(function(){if(!destroyed)refUnrefFilter.emit("error",err)})});refUnrefFilter.destroy=function(){stream.unpipe(refUnrefFilter);refUnrefFilter.unref();stream.destroy()};var byteCounter=new AssertByteCountStream(end-start);refUnrefFilter.on("error",function(err){setImmediate(function(){if(!destroyed)byteCounter.emit("error",err)})});byteCounter.destroy=function(){destroyed=true;refUnrefFilter.unpipe(byteCounter);refUnrefFilter.destroy()};return stream.pipe(refUnrefFilter).pipe(byteCounter)};RandomAccessReader.prototype._readStreamForRange=function(start,end){throw new Error("not implemented")};RandomAccessReader.prototype.read=function(buffer,offset,length,position,callback){var readStream=this.createReadStream({start:position,end:position+length});var writeStream=new Writable;var written=0;writeStream._write=function(chunk,encoding,cb){chunk.copy(buffer,offset+written,0,chunk.length);written+=chunk.length;cb()};writeStream.on("finish",callback);readStream.on("error",function(error){callback(error)});readStream.pipe(writeStream)};RandomAccessReader.prototype.close=function(callback){setImmediate(callback)};util.inherits(RefUnrefFilter,PassThrough2);function RefUnrefFilter(context){PassThrough2.call(this);this.context=context;this.context.ref();this.unreffedYet=false}__name(RefUnrefFilter,"RefUnrefFilter");RefUnrefFilter.prototype._flush=function(cb){this.unref();cb()};RefUnrefFilter.prototype.unref=function(cb){if(this.unreffedYet)return;this.unreffedYet=true;this.context.unref()};var cp437="\0\u263A\u263B\u2665\u2666\u2663\u2660\u2022\u25D8\u25CB\u25D9\u2642\u2640\u266A\u266B\u263C\u25BA\u25C4\u2195\u203C\xB6\xA7\u25AC\u21A8\u2191\u2193\u2192\u2190\u221F\u2194\u25B2\u25BC !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\u2302\xC7\xFC\xE9\xE2\xE4\xE0\xE5\xE7\xEA\xEB\xE8\xEF\xEE\xEC\xC4\xC5\xC9\xE6\xC6\xF4\xF6\xF2\xFB\xF9\xFF\xD6\xDC\xA2\xA3\xA5\u20A7\u0192\xE1\xED\xF3\xFA\xF1\xD1\xAA\xBA\xBF\u2310\xAC\xBD\xBC\xA1\xAB\xBB\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255D\u255C\u255B\u2510\u2514\u2534\u252C\u251C\u2500\u253C\u255E\u255F\u255A\u2554\u2569\u2566\u2560\u2550\u256C\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256B\u256A\u2518\u250C\u2588\u2584\u258C\u2590\u2580\u03B1\xDF\u0393\u03C0\u03A3\u03C3\xB5\u03C4\u03A6\u0398\u03A9\u03B4\u221E\u03C6\u03B5\u2229\u2261\xB1\u2265\u2264\u2320\u2321\xF7\u2248\xB0\u2219\xB7\u221A\u207F\xB2\u25A0\xA0";function decodeBuffer(buffer,start,end,isUtf8){if(isUtf8){return buffer.toString("utf8",start,end)}else{var result="";for(var i=start;i<end;i++){result+=cp437[buffer[i]]}return result}}__name(decodeBuffer,"decodeBuffer");function readUInt64LE(buffer,offset){var lower32=buffer.readUInt32LE(offset);var upper32=buffer.readUInt32LE(offset+4);return upper32*4294967296+lower32}__name(readUInt64LE,"readUInt64LE");var newBuffer;if(typeof Buffer.allocUnsafe==="function"){newBuffer=__name(function(len){return Buffer.allocUnsafe(len)},"newBuffer")}else{newBuffer=__name(function(len){return new Buffer(len)},"newBuffer")}function defaultCallback(err){if(err)throw err}__name(defaultCallback,"defaultCallback")}});init_esbuild_shims();import{randomUUID as randomUUID2}from"node:crypto";import{promises as fs2,constants as fsConstants}from"node:fs";import*as path2 from"node:path";init_esbuild_shims();var debugLogger=createDebugLogger("VOICE_SERVICE");var EMPTY_WORKSPACE_VOICE_UPDATE_ERROR="At least one of `enabled`, `mode`, `language`, or `voiceModel` must be provided";var WorkspaceVoiceError=class extends Error{static{__name(this,"WorkspaceVoiceError")}status;code;constructor(status,code,message){super(message);this.name="WorkspaceVoiceError";this.status=status;this.code=code}};function voiceSettingsScopeToWire(scope){return scope==="Workspace"?"workspace":"user"}__name(voiceSettingsScopeToWire,"voiceSettingsScopeToWire");function buildWorkspaceVoiceSettingsWrites(settings,update,opts={}){const voiceSettingsScope=opts.scopeOverride??getVoiceSettingsScope(settings,opts.workspaceTrusted);const writes=[];if(update.voiceModel!==void 0){writes.push({scope:opts.scopeOverride??getPersistScopeForModelSelection(settings),key:"voiceModel",value:update.voiceModel})}if(update.mode!==void 0){writes.push({scope:voiceSettingsScope,key:"general.voice.mode",value:update.mode})}if(update.language!==void 0){writes.push({scope:voiceSettingsScope,key:"general.voice.language",value:update.language})}if(update.enabled!==void 0){writes.push({scope:voiceSettingsScope,key:"general.voice.enabled",value:update.enabled})}return writes}__name(buildWorkspaceVoiceSettingsWrites,"buildWorkspaceVoiceSettingsWrites");function createVoiceModelSource(settings){return new ModelsConfig({modelProvidersConfig:settings.merged.modelProviders,providerProtocolConfig:settings.merged.providerProtocol})}__name(createVoiceModelSource,"createVoiceModelSource");function listAvailableVoiceModels(settings){const models=createVoiceModelSource(settings).getAllConfiguredModels();const idCounts=new Map;for(const model of models){idCounts.set(model.id,(idCounts.get(model.id)??0)+1)}const duplicateIds=[...idCounts.entries()].filter(([,count])=>count>1).map(([id])=>id);if(duplicateIds.length>0){debugLogger.debug(`Skipping duplicate voice model ids: ${duplicateIds.join(", ")}`)}return models.filter(model=>(idCounts.get(model.id)??0)===1).filter(isSelectableVoiceModel).map(model=>({id:model.id,...model.label?{name:model.label}:{},...model.baseUrl?{baseUrl:publicProviderBaseUrl(model.baseUrl)}:{},...model.contextWindowSize?{contextWindow:model.contextWindowSize}:{},transport:resolveVoiceTransport(model.id)})).filter(model=>model.transport!=="unsupported")}__name(listAvailableVoiceModels,"listAvailableVoiceModels");function hasConfiguredBatchVoiceTranscriptionModel(settings,opts={}){for(const model of listAvailableVoiceModels(settings)){if(model.transport!=="qwen-asr-chat"){continue}try{validateWorkspaceVoiceConfig(settings,model.id,opts);return true}catch(err){debugLogger.debug(`Skipping unavailable batch voice model '${model.id}': ${err instanceof Error?err.message:String(err)}`)}}return false}__name(hasConfiguredBatchVoiceTranscriptionModel,"hasConfiguredBatchVoiceTranscriptionModel");function buildWorkspaceVoiceStatus(workspaceCwd,settings){return{v:1,workspaceCwd,enabled:isVoiceEnabled(settings),mode:readVoiceMode(settings),language:readVoiceLanguage(settings),voiceModel:readVoiceModel(settings)??null,availableVoiceModels:listAvailableVoiceModels(settings)}}__name(buildWorkspaceVoiceStatus,"buildWorkspaceVoiceStatus");function validateWorkspaceVoiceModel(settings,voiceModel){const models=createVoiceModelSource(settings).getAllConfiguredModels();const matches=models.filter(model2=>model2.id===voiceModel);if(matches.length===0){throw new WorkspaceVoiceError(400,"unknown_voice_model",`Voice model '${voiceModel}' is not configured.`)}if(matches.length>1){throw new WorkspaceVoiceError(400,"ambiguous_voice_model",`Voice model '${voiceModel}' is ambiguous.`)}const[model]=matches;if(!model||!isSelectableVoiceModel(model)){throw new WorkspaceVoiceError(400,"unsupported_voice_model",`Voice model '${voiceModel}' cannot be used for transcription.`)}const transport=resolveVoiceTransport(model.id);if(transport==="unsupported"){throw new WorkspaceVoiceError(400,"unsupported_voice_model",`Voice model '${voiceModel}' cannot be used for transcription.`)}return{id:model.id,transport}}__name(validateWorkspaceVoiceModel,"validateWorkspaceVoiceModel");function validateWorkspaceVoiceConfig(settings,voiceModel,opts={}){const descriptor=validateWorkspaceVoiceModel(settings,voiceModel);try{const config=createVoiceModelSource(settings);if(descriptor.transport==="qwen-asr-chat"){resolveVoiceTranscriptionConfig({config,settings,voiceModel,env:opts.env})}else{resolveVoiceStreamConfig({config,settings,voiceModel,env:opts.env})}}catch(err){throw new WorkspaceVoiceError(400,"invalid_voice_model",err instanceof Error?err.message:`Voice model '${voiceModel}' is not configured for transcription.`)}return descriptor}__name(validateWorkspaceVoiceConfig,"validateWorkspaceVoiceConfig");function validateWorkspaceVoiceState(settings,update,opts={}){if(update.enabled===void 0&&update.mode===void 0&&update.language===void 0&&update.voiceModel===void 0){throw new WorkspaceVoiceError(400,"invalid_voice_update",EMPTY_WORKSPACE_VOICE_UPDATE_ERROR)}const nextEnabled=update.enabled??isVoiceEnabled(settings);const nextVoiceModel=update.voiceModel??readVoiceModel(settings);if(update.voiceModel){validateWorkspaceVoiceModel(settings,update.voiceModel)}if(!nextEnabled){return}if(!nextVoiceModel){throw new WorkspaceVoiceError(400,"voice_model_required","A valid voiceModel is required before enabling voice.")}validateWorkspaceVoiceConfig(settings,nextVoiceModel,opts)}__name(validateWorkspaceVoiceState,"validateWorkspaceVoiceState");async function transcribeWorkspaceVoiceAudio(input){const descriptor=validateWorkspaceVoiceModel(input.settings,input.voiceModel);if(descriptor.transport!=="qwen-asr-chat"){throw new WorkspaceVoiceError(400,"unsupported_voice_model",`Voice model '${input.voiceModel}' requires realtime transcription, which is not supported by this daemon endpoint.`)}const text=await transcribeVoiceAudio({data:input.data,mimeType:input.mimeType},{config:createVoiceModelSource(input.settings),settings:input.settings,voiceModel:input.voiceModel,env:input.env,abortSignal:input.abortSignal});return{text,model:input.voiceModel,transport:descriptor.transport}}__name(transcribeWorkspaceVoiceAudio,"transcribeWorkspaceVoiceAudio");init_esbuild_shims();import{execFile}from"node:child_process";import{randomUUID}from"node:crypto";import{createWriteStream,promises as fs}from"node:fs";import*as os from"node:os";import*as path from"node:path";import{PassThrough,Transform}from"node:stream";import{pipeline}from"node:stream/promises";import{promisify}from"node:util";var import_yauzl=__toESM(require_yauzl(),1);var MAX_ZIP_ARCHIVE_BYTES=7864071;var MAX_FILE_BYTES=32*1024*1024;var MAX_PACKAGE_BYTES=64*1024*1024;var MAX_FILES=2e3;var MAX_PATH_LENGTH=512;var MAX_PATH_DEPTH=16;var GITHUB_CONTENTS_PAGE_LIMIT=1e3;var PACKAGE_TOO_MANY="Skill package has too many files (max 2000)";var ZIP_TOO_MANY="Skill ZIP contains too many files (max 2000)";var MAX_WORKSPACE_SKILL_NAME_LENGTH=256;var execFileAsync=promisify(execFile);var liveInstallArtifacts=new Set;function artifactToken(){return`${process.pid}-${randomUUID().replaceAll("-","").slice(0,8)}`}__name(artifactToken,"artifactToken");function artifactOwnerIsLive(suffix){const match=/^(\d+)-/.exec(suffix);if(!match)return false;const pid=Number(match[1]);if(pid<=0||pid===process.pid)return false;try{process.kill(pid,0);return true}catch(error){return error.code!=="ESRCH"}}__name(artifactOwnerIsLive,"artifactOwnerIsLive");var WorkspaceSkillManagementError=class extends Error{constructor(code,message,statusCode=400){super(message);this.code=code;this.statusCode=statusCode;this.name="WorkspaceSkillManagementError"}static{__name(this,"WorkspaceSkillManagementError")}};function skillError(code,message,statusCode=400){throw new WorkspaceSkillManagementError(code,message,statusCode)}__name(skillError,"skillError");function validateWorkspaceSkillName(name){const normalized=name.trim();if(!normalized||normalized==="."||normalized===".."||normalized.length>MAX_WORKSPACE_SKILL_NAME_LENGTH||!/^[A-Za-z0-9._-]+$/.test(normalized)){skillError("invalid_skill_name","Invalid skill name")}return normalized}__name(validateWorkspaceSkillName,"validateWorkspaceSkillName");function rejectInstallArtifactSkillName(name){if(/^\..*\.(backup|installing)-[A-Za-z0-9-]+$/.test(name)||/\.(backup|installing)-\d+-\d+$/.test(name)){skillError("invalid_skill_name","Skill name ends with a reserved install-artifact suffix")}}__name(rejectInstallArtifactSkillName,"rejectInstallArtifactSkillName");function assertBase64Shape(value){if(!value||!/^[A-Za-z0-9+/]*={0,2}$/.test(value)){skillError("invalid_skill_source","Invalid base64 skill content")}}__name(assertBase64Shape,"assertBase64Shape");function decodeBase64(value){assertBase64Shape(value);const content=Buffer.from(value,"base64");if(content.length>MAX_ZIP_ARCHIVE_BYTES){skillError("skill_package_too_large","Skill ZIP exceeds the allowed archive size",413)}return content}__name(decodeBase64,"decodeBase64");var STAGING_DISK_ERRNOS=new Set(["ENOSPC","EDQUOT","EROFS","EIO","EMFILE","ENFILE","EBUSY","EACCES","EPERM"]);var COPY_STAGING_ERRNOS=new Set(["ENOSPC","EDQUOT","EROFS"]);var COPY_AMBIGUOUS_ERRNOS=new Set(["EACCES","EPERM"]);function stagingWriteError(error){if(!(error instanceof Error))return void 0;if(error instanceof WorkspaceSkillManagementError)return void 0;if(error.name==="WorkspaceGenerationClosedError")return void 0;const{code}=error;if(!code||!STAGING_DISK_ERRNOS.has(code))return void 0;return new WorkspaceSkillManagementError("skill_staging_failed",error.message,500)}__name(stagingWriteError,"stagingWriteError");async function stageWrite(write){try{return await write()}catch(error){throw stagingWriteError(error)??error}}__name(stageWrite,"stageWrite");async function copyIntoStaging(source,target){try{await fs.copyFile(source,target)}catch(error){const code=error.code;if(!code)throw error;if(COPY_STAGING_ERRNOS.has(code)){throw stagingWriteError(error)??error}if(COPY_AMBIGUOUS_ERRNOS.has(code)){const sourceReadable=await fs.access(source,fs.constants.R_OK).then(()=>true,()=>false);if(sourceReadable)throw stagingWriteError(error)??error}throw error}}__name(copyIntoStaging,"copyIntoStaging");function normalizeRelativePath(value){const normalized=value.replaceAll("\\","/").replace(/^\.\//,"");const segments=normalized.split("/");if(!normalized||normalized.length>MAX_PATH_LENGTH||normalized.startsWith("/")||segments.length>MAX_PATH_DEPTH||segments.some(segment=>!segment||segment==="."||segment==="..")){skillError("invalid_skill_package",`Invalid skill file path: ${value}`)}return segments.join("/")}__name(normalizeRelativePath,"normalizeRelativePath");function isPlatformMetadataPath(value){return value.replaceAll("\\","/").split("/").some(segment=>segment==="__MACOSX"||segment===".DS_Store"||segment.startsWith("._"))}__name(isPlatformMetadataPath,"isPlatformMetadataPath");function pathIsTakenAsFileOrDirectory(normalized,paths){const segments=normalized.split("/");for(let i=1;i<segments.length;i+=1){if(paths.has(segments.slice(0,i).join("/")))return true}return[...paths].some(existing=>existing.startsWith(`${normalized}/`))}__name(pathIsTakenAsFileOrDirectory,"pathIsTakenAsFileOrDirectory");function beginStagedFile(staging,relativePath,state,tooManyMessage){if(isPlatformMetadataPath(relativePath))return void 0;const normalized=normalizeRelativePath(relativePath);if(state.paths.has(normalized)){skillError("invalid_skill_package",`Duplicate skill file path: ${normalized}`)}if(pathIsTakenAsFileOrDirectory(normalized,state.paths)){skillError("invalid_skill_package",`Skill package has conflicting file and directory entries: ${normalized}`)}if(state.count>=MAX_FILES){skillError("skill_too_many_files",tooManyMessage)}return{normalized,target:path.join(staging,...normalized.split("/"))}}__name(beginStagedFile,"beginStagedFile");function commitStagedFile(normalized,bytes,state){state.paths.add(normalized);state.count+=1;state.totalBytes+=bytes}__name(commitStagedFile,"commitStagedFile");async function prepareTarget(target,assertGenerationOpen){assertGenerationOpen?.();await stageWrite(()=>fs.mkdir(path.dirname(target),{recursive:true}));assertGenerationOpen?.()}__name(prepareTarget,"prepareTarget");function githubRequestError(code,status,resource){const message=status===404?`GitHub ${resource} was not found; check the repository URL, branch, and path`:status===401?"GitHub authentication failed; check GH_TOKEN or GITHUB_TOKEN":status===403?"GitHub access was denied; the repository may be private or API rate-limited":status===429?"GitHub API rate limit exceeded; try again later or configure GH_TOKEN":`GitHub request failed (HTTP ${status})`;return new WorkspaceSkillManagementError(code,message,status===404?404:502)}__name(githubRequestError,"githubRequestError");function githubHeaders(githubToken){return{Accept:"application/vnd.github+json","User-Agent":"qwen-code",...githubToken?{Authorization:`Bearer ${githubToken}`}:{}}}__name(githubHeaders,"githubHeaders");async function writeGitHubFile(url,staged,state,githubToken,assertGenerationOpen){const response=await fetch(url,{headers:githubHeaders(githubToken)});if(!response.ok){throw githubRequestError("github_skill_download_failed",response.status,"Skill file")}const declared=Number(response.headers.get("content-length"));if(Number.isFinite(declared)&&declared>MAX_FILE_BYTES){await response.body?.cancel().catch(()=>void 0);skillError("skill_package_too_large","Skill file is too large",413)}if(Number.isFinite(declared)&&state.totalBytes+declared>MAX_PACKAGE_BYTES){await response.body?.cancel().catch(()=>void 0);skillError("skill_package_too_large","Skill package exceeds the allowed size",413)}if(!response.body){await prepareTarget(staged.target,assertGenerationOpen);await stageWrite(()=>fs.writeFile(staged.target,""));commitStagedFile(staged.normalized,0,state);return}let handle;try{await prepareTarget(staged.target,assertGenerationOpen);handle=await stageWrite(()=>fs.open(staged.target,"w"))}catch(error){await response.body.cancel().catch(()=>void 0);throw error}const reader=response.body.getReader();let size=0;try{while(true){const{done,value}=await reader.read();if(done)break;size+=value.byteLength;if(size>MAX_FILE_BYTES||state.totalBytes+size>MAX_PACKAGE_BYTES){await reader.cancel().catch(()=>void 0);skillError("skill_package_too_large",size>MAX_FILE_BYTES?"Skill file is too large":"Skill package exceeds the allowed size",413)}let offset=0;while(offset<value.byteLength){const result=await stageWrite(()=>handle.write(value.subarray(offset)));if(result.bytesWritten<=0){throw new Error("Failed to write Skill file")}offset+=result.bytesWritten}}}finally{await reader.cancel().catch(()=>void 0);reader.releaseLock();await stageWrite(()=>handle.close())}commitStagedFile(staged.normalized,size,state)}__name(writeGitHubFile,"writeGitHubFile");async function downloadGitHubDirectory(owner,repo,ref,directory,staging,state,githubToken,assertGenerationOpen,relativeRoot="",depth=0){if(depth>MAX_PATH_DEPTH)skillError("invalid_skill_package","GitHub Skill is nested too deeply");const encodedDirectory=directory.split("/").filter(Boolean).map(encodeURIComponent).join("/");const apiUrl=`https://api.github.com/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/contents${encodedDirectory?`/${encodedDirectory}`:""}?ref=${encodeURIComponent(ref)}`;const response=await fetch(apiUrl,{headers:githubHeaders(githubToken)});if(!response.ok){throw githubRequestError("github_api_failed",response.status,"Skill path")}const items=await response.json();if(!Array.isArray(items))skillError("invalid_skill_source","GitHub URL must point to SKILL.md");if(items.length>=GITHUB_CONTENTS_PAGE_LIMIT){throw new WorkspaceSkillManagementError("github_api_failed","GitHub directory listing reached the API page limit; retrying with git",502)}for(const item of items){if(!item||typeof item!=="object")continue;const record=item;const itemName=typeof record["name"]==="string"?record["name"]:"";const itemPath=typeof record["path"]==="string"?record["path"]:"";const itemType=typeof record["type"]==="string"?record["type"]:"";const relativePath=relativeRoot?`${relativeRoot}/${itemName}`:itemName;if(isPlatformMetadataPath(relativePath))continue;if(itemType==="dir"){await downloadGitHubDirectory(owner,repo,ref,itemPath,staging,state,githubToken,assertGenerationOpen,relativePath,depth+1)}else if(itemType==="file"){const downloadUrl=record["download_url"];if(typeof downloadUrl!=="string")continue;const parsedDownloadUrl=new URL(downloadUrl);if(parsedDownloadUrl.protocol!=="https:"||parsedDownloadUrl.hostname!=="raw.githubusercontent.com"){skillError("github_skill_download_failed","GitHub returned an invalid Skill file URL",502)}const staged=beginStagedFile(staging,relativePath,state,PACKAGE_TOO_MANY);if(!staged)continue;await writeGitHubFile(downloadUrl,staged,state,githubToken,assertGenerationOpen)}}}__name(downloadGitHubDirectory,"downloadGitHubDirectory");async function downloadGitHubDirectoryWithGit(owner,repo,ref,directory,staging,state,assertGenerationOpen){assertGenerationOpen?.();const checkout=await fs.mkdtemp(path.join(os.tmpdir(),"qwen-skill-git-"));try{await execFileAsync("git",["clone","--depth","1","--filter=blob:none","--sparse","--branch",ref,`https://github.com/${owner}/${repo}.git`,checkout],{timeout:6e4,maxBuffer:1024*1024,env:{...sanitizeChildEnv(),GIT_TERMINAL_PROMPT:"0"}});if(directory){await execFileAsync("git",["-C",checkout,"sparse-checkout","set","--cone",directory],{timeout:3e4,maxBuffer:1024*1024,env:{...sanitizeChildEnv(),GIT_TERMINAL_PROMPT:"0"}})}else{await execFileAsync("git",["-C",checkout,"sparse-checkout","disable"],{timeout:3e4,maxBuffer:1024*1024,env:{...sanitizeChildEnv(),GIT_TERMINAL_PROMPT:"0"}})}assertGenerationOpen?.();await copyFolder(path.join(checkout,directory),staging,state,assertGenerationOpen)}catch(error){if(error instanceof WorkspaceSkillManagementError)throw error;if(error instanceof Error&&error.name==="WorkspaceGenerationClosedError"){throw error}throw new WorkspaceSkillManagementError("github_skill_download_failed",`Failed to download GitHub Skill: ${error instanceof Error?error.message:String(error)}`,502)}finally{await fs.rm(checkout,{recursive:true,force:true})}}__name(downloadGitHubDirectoryWithGit,"downloadGitHubDirectoryWithGit");function resolveGitHubSkill(sourceUrl){let url;try{url=new URL(sourceUrl)}catch{skillError("invalid_skill_source","Invalid GitHub Skill URL")}if(url.protocol!=="https:")skillError("invalid_skill_source","GitHub URL must use HTTPS");if(url.hostname==="raw.githubusercontent.com"){if(!url.pathname.endsWith("/SKILL.md")){skillError("invalid_skill_source","GitHub URL must point to SKILL.md")}return{kind:"raw",url:url.toString()}}if(url.hostname!=="github.com"){skillError("invalid_skill_source","Only GitHub Skill URLs are supported")}let segments;try{segments=url.pathname.split("/").filter(Boolean).map(decodeURIComponent)}catch{skillError("invalid_skill_source","Invalid GitHub Skill URL")}if(segments.length<5||segments[2]!=="blob"||segments.at(-1)!=="SKILL.md"){skillError("invalid_skill_source","GitHub URL must point to a repository SKILL.md file")}const[owner,repo,,ref,...filePath]=segments;if(!owner||!repo||!ref||ref.startsWith("-")||!/^[A-Za-z0-9._/+-]+$/.test(ref)||!/^[A-Za-z0-9._-]+$/.test(owner)||!/^[A-Za-z0-9._-]+$/.test(repo)){skillError("invalid_skill_source","Invalid GitHub Skill URL")}const directory=filePath.slice(0,-1).join("/");const directorySegments=directory.split("/");if(directory&&(directory.length>MAX_PATH_LENGTH||directory.includes("\\")||directory.startsWith("/")||directorySegments.length>MAX_PATH_DEPTH||directorySegments.some(segment=>!segment||segment==="."||segment===".."))){skillError("invalid_skill_source","Invalid GitHub Skill URL path")}return{kind:"tree",owner,repo,ref,directory}}__name(resolveGitHubSkill,"resolveGitHubSkill");async function downloadGitHubSkill(sourceUrl,staging,state,githubToken,assertGenerationOpen){const plan=resolveGitHubSkill(sourceUrl);if(plan.kind==="raw"){const staged=beginStagedFile(staging,"SKILL.md",state,PACKAGE_TOO_MANY);if(!staged){skillError("invalid_skill_package","Skill package has an invalid file count")}await writeGitHubFile(plan.url,staged,state,githubToken,assertGenerationOpen);return}try{await downloadGitHubDirectory(plan.owner,plan.repo,plan.ref,plan.directory,staging,state,githubToken,assertGenerationOpen)}catch(error){if(!(error instanceof WorkspaceSkillManagementError)||error.code!=="github_api_failed"||error.statusCode===404){throw error}for(const entry of await fs.readdir(staging)){assertGenerationOpen?.();await fs.rm(path.join(staging,entry),{recursive:true,force:true})}state.count=0;state.totalBytes=0;state.paths.clear();await downloadGitHubDirectoryWithGit(plan.owner,plan.repo,plan.ref,plan.directory,staging,state,assertGenerationOpen)}}__name(downloadGitHubSkill,"downloadGitHubSkill");function openZip(content){return new Promise((resolve3,reject)=>{(0,import_yauzl.fromBuffer)(content,{lazyEntries:true},(error,zipFile)=>{if(error)reject(error);else resolve3(zipFile)})})}__name(openZip,"openZip");function openZipStream(zipFile,entry){return new Promise((resolve3,reject)=>{zipFile.openReadStream(entry,(error,stream)=>{if(error)reject(error);else resolve3(stream)})})}__name(openZipStream,"openZipStream");async function writeZipEntry(zipFile,entry,target,totalBytes){const stream=await openZipStream(zipFile,entry);const source=new PassThrough;stream.on("error",error=>source.destroy(error));stream.pipe(source);let size=0;const guard=new Transform({transform(chunk,_encoding,callback){size+=chunk.length;if(size>MAX_FILE_BYTES){callback(new WorkspaceSkillManagementError("skill_package_too_large",`Skill ZIP entry is too large: ${entry.fileName}`,413));return}if(totalBytes+size>MAX_PACKAGE_BYTES){callback(new WorkspaceSkillManagementError("skill_package_too_large","Skill ZIP expands beyond the allowed size",413));return}callback(null,chunk)}});try{await stageWrite(()=>pipeline(source,guard,createWriteStream(target)))}finally{stream.destroy();source.destroy()}return size}__name(writeZipEntry,"writeZipEntry");async function filesFromZip(content,staging,state,assertGenerationOpen){const zipFile=await openZip(content);await new Promise((resolve3,reject)=>{let settled=false;const finish=__name(error=>{if(settled)return;settled=true;zipFile.close();if(error)reject(error);else resolve3()},"finish");const writeEntry=__name(async entry=>{const mode=entry.externalFileAttributes>>>16&65535;const fileType=mode&61440;if(fileType===40960){throw new Error("Skill ZIP contains a symbolic link")}if(entry.generalPurposeBitFlag&1){throw new Error("Encrypted Skill ZIP entries are not supported")}if(entry.fileName.endsWith("/")||fileType===16384)return;const staged=beginStagedFile(staging,entry.fileName,state,ZIP_TOO_MANY);if(!staged)return;if(entry.uncompressedSize>MAX_FILE_BYTES){skillError("skill_package_too_large","Skill ZIP entry exceeds the allowed size",413)}if(state.totalBytes+entry.uncompressedSize>MAX_PACKAGE_BYTES){skillError("skill_package_too_large","Skill ZIP expands beyond the allowed size",413)}await prepareTarget(staged.target,assertGenerationOpen);const written=await writeZipEntry(zipFile,entry,staged.target,state.totalBytes);commitStagedFile(staged.normalized,written,state)},"writeEntry");zipFile.on("error",finish);zipFile.on("entry",entry=>{void writeEntry(entry).then(()=>{if(!settled)zipFile.readEntry()},finish)});zipFile.on("end",()=>finish());zipFile.readEntry()})}__name(filesFromZip,"filesFromZip");async function validatedFolderRoot(folderPath){if(!path.isAbsolute(folderPath)){skillError("invalid_skill_folder","Skill folder path must be absolute")}if((await fs.lstat(folderPath)).isSymbolicLink()){skillError("invalid_skill_folder","Skill folder path must not be a symbolic link")}const root=await fs.realpath(folderPath);if(!(await fs.stat(root)).isDirectory()){skillError("invalid_skill_folder","Skill folder path must point to a directory")}return root}__name(validatedFolderRoot,"validatedFolderRoot");async function copyFolder(folderPath,staging,state,assertGenerationOpen){const root=await validatedFolderRoot(folderPath);const stagingReal=await fs.realpath(staging);const visit=__name(async(directory,relativeRoot="",depth=0)=>{if(depth>MAX_PATH_DEPTH)skillError("invalid_skill_package","Skill folder is nested too deeply");for(const entry of await fs.readdir(directory,{withFileTypes:true})){if(depth===0&&entry.name===".git")continue;const absolutePath=path.join(directory,entry.name);if(path.resolve(absolutePath)===stagingReal)continue;const relativePath=relativeRoot?`${relativeRoot}/${entry.name}`:entry.name;if(entry.isSymbolicLink()){skillError("unsafe_skill_path","Skill folder contains a symbolic link")}if(entry.isDirectory()){if(isPlatformMetadataPath(relativePath))continue;await visit(absolutePath,relativePath,depth+1);continue}if(!entry.isFile())skillError("unsafe_skill_path","Skill folder contains a special file");if(isPlatformMetadataPath(relativePath))continue;const staged=beginStagedFile(staging,relativePath,state,PACKAGE_TOO_MANY);if(!staged)continue;const stats=await fs.lstat(absolutePath);if(stats.isSymbolicLink()||!stats.isFile()){skillError("unsafe_skill_path","Skill folder contains an unsafe file")}if(stats.size>MAX_FILE_BYTES){skillError("skill_package_too_large",`Skill file is too large: ${staged.normalized}`,413)}if(state.totalBytes+stats.size>MAX_PACKAGE_BYTES){skillError("skill_package_too_large","Skill package exceeds the allowed size",413)}await prepareTarget(staged.target,assertGenerationOpen);await copyIntoStaging(absolutePath,staged.target);const copied=await fs.lstat(staged.target);if(copied.size!==stats.size){skillError("invalid_skill_package",`Skill file changed while reading: ${staged.normalized}`)}commitStagedFile(staged.normalized,copied.size,state)}},"visit");await visit(root)}__name(copyFolder,"copyFolder");async function assertStagedFilesPresent(staging,state){for(const filePath of state.paths){const stats=await fs.lstat(path.join(staging,...filePath.split("/"))).catch(()=>void 0);if(!stats?.isFile()){skillError("skill_staging_failed","Skill staging directory was modified during install",500)}}}__name(assertStagedFilesPresent,"assertStagedFilesPresent");async function finalizeStagedPackage(staging,state,assertGenerationOpen){if(state.paths.size===0){skillError("invalid_skill_package","Skill package has an invalid file count")}await assertStagedFilesPresent(staging,state);if(state.paths.has("SKILL.md"))return;const roots=new Set([...state.paths].map(filePath=>filePath.split("/")[0]));if(roots.size!==1){skillError("skill_manifest_missing","Skill package must contain a root SKILL.md")}const[root]=roots;if(!root){skillError("skill_manifest_missing","Skill package must contain a root SKILL.md")}const rootPath=path.join(staging,root);const rootStats=await fs.lstat(rootPath);if(!rootStats.isDirectory()){skillError("skill_manifest_missing","Skill package must contain a root SKILL.md")}const stripped=new Set;for(const filePath of state.paths){stripped.add(normalizeRelativePath(filePath.slice(root.length+1)))}const children=await fs.readdir(rootPath);let holdingName=".qwen-skill-strip";while(children.includes(holdingName))holdingName=`${holdingName}-x`;const holding=path.join(staging,holdingName);assertGenerationOpen?.();await fs.rename(rootPath,holding);for(const child of children){assertGenerationOpen?.();await fs.rename(path.join(holding,child),path.join(staging,child))}await fs.rmdir(holding);state.paths.clear();for(const filePath of stripped)state.paths.add(filePath);if(!state.paths.has("SKILL.md")){skillError("skill_manifest_missing","Skill package must contain a root SKILL.md")}}__name(finalizeStagedPackage,"finalizeStagedPackage");async function stageSkillSource(source,staging,githubToken,assertGenerationOpen){const state={count:0,totalBytes:0,paths:new Set};try{if(source.type==="github"){await downloadGitHubSkill(source.url,staging,state,githubToken,assertGenerationOpen)}else if(source.type==="folder"){await copyFolder(source.path,staging,state,assertGenerationOpen)}else{await filesFromZip(decodeBase64(source.contentBase64),staging,state,assertGenerationOpen)}await finalizeStagedPackage(staging,state,assertGenerationOpen)}catch(error){if(error instanceof WorkspaceSkillManagementError)throw error;if(error instanceof Error&&error.name==="WorkspaceGenerationClosedError"){throw error}const code=source.type==="github"?"github_skill_download_failed":source.type==="folder"?"invalid_skill_folder":"invalid_skill_package";throw new WorkspaceSkillManagementError(code,error instanceof Error?error.message:String(error),source.type==="github"?502:400)}}__name(stageSkillSource,"stageSkillSource");function workspaceSkillBaseDir(workspace,scope){return scope==="workspace"?path.join(workspace,".qwen","skills"):path.join(Storage.getGlobalQwenDir(),"skills")}__name(workspaceSkillBaseDir,"workspaceSkillBaseDir");async function removeInstallArtifacts(baseDir,skillName,assertGenerationOpen){const workDir=path.dirname(baseDir);const workPrefix=`.${path.basename(baseDir)}-${skillName}`;const locations=[{directory:baseDir,prefixes:[`.${skillName}.installing-`,`.${skillName}.backup-`]},{directory:workDir,prefixes:[`${workPrefix}.installing-`,`${workPrefix}.backup-`]}];for(const{directory,prefixes}of locations){const entries=await fs.readdir(directory,{withFileTypes:true});await Promise.all(entries.filter(entry=>{if(liveInstallArtifacts.has(path.join(directory,entry.name))){return false}return prefixes.some(prefix=>{if(!entry.name.startsWith(prefix))return false;const suffix=entry.name.slice(prefix.length);return/^[A-Za-z0-9-]+$/.test(suffix)&&!artifactOwnerIsLive(suffix)})}).map(async entry=>{assertGenerationOpen?.();await fs.rm(path.join(directory,entry.name),{recursive:true,force:true})}))}}__name(removeInstallArtifacts,"removeInstallArtifacts");async function ensureDirectoryWithoutSymlinks(directory,assertGenerationOpen){const missing=[];let current=directory;while(true){try{const stats=await fs.lstat(current);if(stats.isSymbolicLink()||!stats.isDirectory()){skillError("unsafe_skill_path",`Unsafe Skill directory: ${current}`)}break}catch(error){if(error.code!=="ENOENT")throw error;missing.push(current);const parent=path.dirname(current);if(parent===current)throw error;current=parent}}for(const entry of missing.reverse()){assertGenerationOpen?.();await fs.mkdir(entry)}}__name(ensureDirectoryWithoutSymlinks,"ensureDirectoryWithoutSymlinks");async function installWorkspaceSkill(workspace,request,githubToken,assertGenerationOpen){assertGenerationOpen?.();const skillName=validateWorkspaceSkillName(request.name);rejectInstallArtifactSkillName(skillName);if(request.source.type==="folder"&&!path.isAbsolute(request.source.path)){skillError("invalid_skill_folder","Skill folder path must be absolute")}if(request.source.type==="github")resolveGitHubSkill(request.source.url);if(request.source.type==="zip"){assertBase64Shape(request.source.contentBase64)}const baseDir=workspaceSkillBaseDir(workspace,request.scope);assertGenerationOpen?.();await ensureDirectoryWithoutSymlinks(baseDir,assertGenerationOpen);assertGenerationOpen?.();await removeInstallArtifacts(baseDir,skillName,assertGenerationOpen);const destination=path.join(baseDir,skillName);const existing=await fs.lstat(destination).catch(()=>void 0);if(existing?.isSymbolicLink()||existing&&!existing.isDirectory()){skillError("unsafe_skill_path","Refusing to replace an unsafe Skill path")}const workDir=path.dirname(baseDir);const workPrefix=`.${path.basename(baseDir)}-${skillName}`;assertGenerationOpen?.();const staging=path.join(workDir,`${workPrefix}.installing-${artifactToken()}`);liveInstallArtifacts.add(staging);try{await fs.mkdir(staging,{mode:448})}catch(error){liveInstallArtifacts.delete(staging);throw error}const backup=path.join(workDir,`${workPrefix}.backup-${artifactToken()}`);let movedExisting=false;let committedStaging=false;try{await stageSkillSource(request.source,staging,githubToken,assertGenerationOpen);const skillFile=path.join(staging,"SKILL.md");let parsed;try{parsed=new SkillManager({}).parseSkillContent(await fs.readFile(skillFile,"utf8"),skillFile,request.scope==="workspace"?"project":"user")}catch(error){throw new WorkspaceSkillManagementError("invalid_skill_manifest",error instanceof Error?error.message:String(error))}if(parsed.name!==skillName){skillError("skill_name_mismatch",`Skill name "${parsed.name}" does not match requested name "${skillName}"`)}if(existing){assertGenerationOpen?.();liveInstallArtifacts.add(backup);await fs.rename(destination,backup);movedExisting=true}assertGenerationOpen?.();await fs.rename(staging,destination);committedStaging=true;assertGenerationOpen?.()}catch(error){await fs.rm(committedStaging?destination:staging,{recursive:true,force:true}).catch(()=>void 0);if(movedExisting){await fs.rename(backup,destination).catch(()=>void 0)}throw error}finally{liveInstallArtifacts.delete(staging);liveInstallArtifacts.delete(backup)}if(movedExisting){await fs.rm(backup,{recursive:true,force:true}).catch(()=>void 0)}return{skillName,scope:request.scope,installedPath:path.join(destination,"SKILL.md")}}__name(installWorkspaceSkill,"installWorkspaceSkill");async function deleteWorkspaceSkill(workspace,scope,skillNameInput,installedPath,assertGenerationOpen){assertGenerationOpen?.();const skillName=validateWorkspaceSkillName(skillNameInput);const skillDir=path.resolve(path.dirname(installedPath));const skillFile=path.resolve(installedPath);const allowedBaseDirs=new SkillManager({getProjectRoot:__name(()=>workspace,"getProjectRoot")}).getSkillsBaseDirs(scope==="workspace"?"project":"user").map(directory=>path.resolve(directory));const baseDir=path.dirname(skillDir);if(skillFile!==path.join(skillDir,"SKILL.md")||!allowedBaseDirs.includes(baseDir)||path.basename(skillDir)!==skillName){skillError("skill_not_managed","Skill is not managed in the requested scope",409)}const baseRealPath=await fs.realpath(baseDir);const skillDirStats=await fs.lstat(skillDir);const skillFileStats=await fs.lstat(skillFile);if(skillDirStats.isSymbolicLink()||!skillDirStats.isDirectory()||skillFileStats.isSymbolicLink()||!skillFileStats.isFile()){skillError("unsafe_skill_path","Refusing to delete an unsafe Skill path")}const skillDirRealPath=await fs.realpath(skillDir);if(path.dirname(skillDirRealPath)!==baseRealPath){skillError("unsafe_skill_path","Refusing to delete an unsafe Skill path")}const parsed=new SkillManager({}).parseSkillContent(await fs.readFile(skillFile,"utf8"),skillFile,scope==="workspace"?"project":"user");if(parsed.name!==skillName){skillError("skill_name_mismatch","Skill name does not match its installed directory")}assertGenerationOpen?.();await fs.rm(skillDir,{recursive:true,force:true});return{skillName,scope,deleted:true}}__name(deleteWorkspaceSkill,"deleteWorkspaceSkill");var WORKSPACE_SKILLS_REVALIDATE_INTERVAL_MS=1e3;var WORKSPACE_SKILLS_STALE_AFTER_MS=1e3;var WORKSPACE_SKILLS_REVALIDATE_TIMEOUT_MS=5e3;function createSkillToggleMutation(input){return{id:randomUUID2(),kind:"skill_toggle",skills:input.skills.map(skill=>({name:skill.name,enabled:skill.enabled})),activation:input.activation,sessionsRefreshed:input.sessionsRefreshed,sessionsFailed:input.sessionsFailed}}__name(createSkillToggleMutation,"createSkillToggleMutation");async function canonicalizeExistingAncestor(inputPath){let current=inputPath;while(true){try{return await fs2.realpath(current)}catch(err){const code=err?.code;if(code!=="ENOENT"&&code!=="ENOTDIR"&&code!=="ELOOP"){throw err}const parent=path2.dirname(current);if(parent===current)throw err;current=parent}}}__name(canonicalizeExistingAncestor,"canonicalizeExistingAncestor");async function verifyParentPostOpen(target,wsCanonical,_fh){const parentCanonical=await canonicalizeExistingAncestor(path2.dirname(target));const within=parentCanonical===wsCanonical||parentCanonical.startsWith(wsCanonical+path2.sep);if(within)return;throw new WorkspaceInitSymlinkError(target,"parent",`Workspace context file ${JSON.stringify(target)}'s parent moved outside the workspace between the pre-open canonicalize and the post-open verify (parent canonicalizes to ${JSON.stringify(parentCanonical)}, workspace canonicalizes to ${JSON.stringify(wsCanonical)}). Refusing to write \u2014 investigate the concurrent writer or the parent-directory permissions.`)}__name(verifyParentPostOpen,"verifyParentPostOpen");var TimeoutError=class extends Error{static{__name(this,"TimeoutError")}};async function withTimeout(promise,timeoutMs,label){return await new Promise((resolve3,reject)=>{const timeout=setTimeout(()=>{reject(new TimeoutError(`${label} timed out after ${timeoutMs}ms`))},timeoutMs);promise.then(value=>{clearTimeout(timeout);resolve3(value)},err=>{clearTimeout(timeout);reject(err)})})}__name(withTimeout,"withTimeout");function createDaemonWorkspaceService(deps){const{boundWorkspace,isWorkspaceTrusted,assertGenerationOpen,contextFilename,statusProvider,workspaceProvidersStatusProvider,workspaceSkillsStatusProvider,isChannelLive,persistDisabledTools,persistDisabledSkills,persistDisabledSkillsBatch,persistSetting,persistSettings,skillInstallEnv,voiceEnv,voiceSettingsScope,preheatAcpChild:preheatAcpChildOnBridge,queryWorkspaceStatus,invokeWorkspaceCommand,refreshExtensionsForAllSessions:refreshExtensionsForAllSessionsOnBridge,publishWorkspaceEvent}=deps;const loadBoundSettings=__name((skipLoadEnvironment=false)=>{const workspaceTrusted=isWorkspaceTrusted();return loadSettings(boundWorkspace,{skipLoadEnvironment:skipLoadEnvironment||!workspaceTrusted,skipWorkspaceSettings:!workspaceTrusted,workspaceTrusted})},"loadBoundSettings");const assertActiveGeneration=__name(()=>assertGenerationOpen?.(),"assertActiveGeneration");const loggedPreheatFailures=new WeakSet;const logPreheatFailure=__name(err=>{if(typeof err==="object"&&err!==null){if(loggedPreheatFailures.has(err))return;loggedPreheatFailures.add(err)}writeStderrLineSafe(`qwen serve: ACP preheat failed: ${err instanceof Error?err.message:String(err)}`)},"logPreheatFailure");let lastWorkspaceSkillsStatus;let lastWorkspaceSkillsStatusAt=0;let lastWorkspaceSkillsReadStartedAt;let workspaceSkillsGeneration=0;let workspaceSkillsReadSequence=0;let publishedWorkspaceSkillsReadSequence=0;let inFlightWorkspaceSkillsStatus;const invalidateWorkspaceSkillsSnapshot=__name(()=>{workspaceSkillsGeneration+=1;lastWorkspaceSkillsStatus=void 0;lastWorkspaceSkillsStatusAt=0;lastWorkspaceSkillsReadStartedAt=void 0;inFlightWorkspaceSkillsStatus=void 0},"invalidateWorkspaceSkillsSnapshot");const invalidateWorkspaceSkillsInventory=__name(()=>{invalidateWorkspaceSkillsSnapshot();workspaceSkillsStatusProvider?.invalidate?.(boundWorkspace)},"invalidateWorkspaceSkillsInventory");const getWorkspaceSkillsConfigStatus=__name(async()=>{if(workspaceSkillsStatusProvider){try{return await workspaceSkillsStatusProvider(boundWorkspace)}catch(err){writeStderrLine(`qwen serve: getWorkspaceSkillsConfigStatus local provider failed: ${err instanceof Error?err.message:String(err)}`)}}return createIdleWorkspaceSkillsStatus(boundWorkspace)},"getWorkspaceSkillsConfigStatus");const unavailableWorkspaceSkillsStatus=__name(()=>({...createIdleWorkspaceSkillsStatus(boundWorkspace),errors:[{kind:"skills",status:"error",error:"Skills catalog is unavailable; retry the request"}]}),"unavailableWorkspaceSkillsStatus");const skillsSnapshot=__name(()=>{if(!lastWorkspaceSkillsStatus)return void 0;const ageMs=Math.max(0,Date.now()-lastWorkspaceSkillsStatusAt);return{...lastWorkspaceSkillsStatus,snapshot:{observedAt:lastWorkspaceSkillsStatusAt,ageMs,stale:ageMs>=WORKSPACE_SKILLS_STALE_AFTER_MS,refreshing:inFlightWorkspaceSkillsStatus!==void 0}}},"skillsSnapshot");const readWorkspaceSkillsStatus=__name(async(allowRetainedSnapshot=true,requireEnumerated=false)=>{let status;try{status=await queryWorkspaceStatus(SERVE_STATUS_EXT_METHODS.workspaceSkills,()=>createIdleWorkspaceSkillsStatus(boundWorkspace))}catch(err){writeStderrLine(`qwen serve: getWorkspaceSkillsStatus query failed: ${err instanceof Error?err.message:String(err)}`);status=createIdleWorkspaceSkillsStatus(boundWorkspace)}if(status.initialized&&!status.errors?.length||allowRetainedSnapshot&&lastWorkspaceSkillsStatus){if(status.errors?.length){writeStderrLine(`qwen serve: workspace skills observation reported errors, keeping the retained catalog: ${status.errors.map(cell=>cell.error).join("; ")}`)}return status}if(status.errors?.length){writeStderrLine(`qwen serve: workspace skills observation reported errors, falling back to daemon-local enumeration: ${status.errors.map(cell=>cell.error).join("; ")}`)}if(workspaceSkillsStatusProvider){try{if(!allowRetainedSnapshot){workspaceSkillsStatusProvider.invalidate?.(boundWorkspace)}status=await workspaceSkillsStatusProvider(boundWorkspace)}catch(err){writeStderrLine(`qwen serve: getWorkspaceSkillsStatus local provider failed: ${err instanceof Error?err.message:String(err)}`)}}if(!status.initialized||status.errors?.length){const unavailable=status.errors?.length?{...status,initialized:false}:unavailableWorkspaceSkillsStatus();return requireEnumerated?unavailable:skillsSnapshot()??unavailable}return status},"readWorkspaceSkillsStatus");const revalidateWorkspaceSkillsStatus=__name(()=>{const generation=workspaceSkillsGeneration;if(inFlightWorkspaceSkillsStatus?.generation===generation){return inFlightWorkspaceSkillsStatus.promise}const startedAt=Date.now();const sequence=++workspaceSkillsReadSequence;lastWorkspaceSkillsReadStartedAt=startedAt;const background=lastWorkspaceSkillsStatus!==void 0;const observation=Promise.resolve().then(()=>readWorkspaceSkillsStatus()).then(status=>{assertActiveGeneration();if(generation===workspaceSkillsGeneration&&sequence>publishedWorkspaceSkillsReadSequence&&status.initialized&&!status.errors?.length){lastWorkspaceSkillsStatus=status;lastWorkspaceSkillsStatusAt=startedAt;publishedWorkspaceSkillsReadSequence=sequence}return status});const read={generation,promise:(background?withTimeout(observation,WORKSPACE_SKILLS_REVALIDATE_TIMEOUT_MS,"workspace skills revalidation"):observation).catch(error=>{assertActiveGeneration();writeStderrLineSafe(`qwen serve: workspace skills revalidation failed: ${error instanceof Error?error.message:String(error)}`);return unavailableWorkspaceSkillsStatus()}).finally(()=>{if(inFlightWorkspaceSkillsStatus===read){inFlightWorkspaceSkillsStatus=void 0}})};inFlightWorkspaceSkillsStatus=read;return read.promise},"revalidateWorkspaceSkillsStatus");const getWorkspaceSkillsStatus=__name(()=>{assertActiveGeneration();const elapsed=lastWorkspaceSkillsReadStartedAt===void 0?Infinity:Date.now()-lastWorkspaceSkillsReadStartedAt;const canStart=elapsed<0||elapsed>=WORKSPACE_SKILLS_REVALIDATE_INTERVAL_MS;if(!lastWorkspaceSkillsStatus){if(!inFlightWorkspaceSkillsStatus&&!canStart){return Promise.resolve(unavailableWorkspaceSkillsStatus())}return revalidateWorkspaceSkillsStatus().then(status=>skillsSnapshot()??status)}if(!inFlightWorkspaceSkillsStatus&&canStart){void revalidateWorkspaceSkillsStatus().catch(error=>{writeStderrLineSafe(`qwen serve: workspace skills revalidation failed: ${error instanceof Error?error.message:String(error)}`)})}return Promise.resolve(skillsSnapshot())},"getWorkspaceSkillsStatus");const refreshWorkspaceSkillsAfterMutation=__name(async()=>{invalidateWorkspaceSkillsInventory();if(!(isChannelLive?.()??false))return;try{const refreshed=await invokeWorkspaceCommand(SERVE_CONTROL_EXT_METHODS.workspaceSkillsRefresh,{cwd:boundWorkspace,reason:"content"});if((refreshed.configsFailed??0)>0){writeStderrLine(`qwen serve: ${refreshed.configsFailed} skill cache refresh(es) failed after mutation`)}}catch(err){if(!(err instanceof SessionNotFoundError)&&!(err instanceof BridgeChannelClosedError)){writeStderrLine(`qwen serve: workspace skill refresh after mutation failed: ${err instanceof Error?err.message:String(err)}`)}}finally{invalidateWorkspaceSkillsInventory()}},"refreshWorkspaceSkillsAfterMutation");return{async getWorkspaceMcpStatus(_ctx){return queryWorkspaceStatus(SERVE_STATUS_EXT_METHODS.workspaceMcp,()=>createIdleWorkspaceMcpStatus(boundWorkspace))},async getWorkspaceSkillsStatus(_ctx,opts){if(opts?.requireFresh){assertActiveGeneration();const status=await readWorkspaceSkillsStatus(false);assertActiveGeneration();return status}return getWorkspaceSkillsStatus()},async getWorkspaceSkillsRuntimeStatus(_ctx){return queryWorkspaceStatus(SERVE_STATUS_EXT_METHODS.workspaceSkills,()=>createIdleWorkspaceSkillsStatus(boundWorkspace))},async getWorkspaceSkillsConfigStatus(_ctx){return getWorkspaceSkillsConfigStatus()},async getWorkspaceProvidersStatus(_ctx){if(workspaceProvidersStatusProvider){return workspaceProvidersStatusProvider(boundWorkspace,isChannelLive?.()??false)}return queryWorkspaceStatus(SERVE_STATUS_EXT_METHODS.workspaceProviders,()=>createIdleWorkspaceProvidersStatus(boundWorkspace))},async preheatAcpChild(_ctx,opts){assertActiveGeneration();const startedAt=performance.now();const channelLive=__name(()=>isChannelLive?.()??false,"channelLive");const finish=__name((result,invalidateInventory=true)=>{if(result.ready&&invalidateInventory){assertActiveGeneration();invalidateWorkspaceSkillsSnapshot()}return{...result,durationMs:Math.max(0,Math.round(performance.now()-startedAt))}},"finish");if(!preheatAcpChildOnBridge){if(channelLive()){return finish({ready:true,channelLive:true})}return finish({ready:false,channelLive:false,reason:"error",error:"ACP preheat is unavailable"})}const preheat=Promise.resolve().then(()=>preheatAcpChildOnBridge());void preheat.catch(logPreheatFailure);try{await withTimeout(preheat,opts?.timeoutMs??5e3,"ACP preheat")}catch(err){if(err instanceof TimeoutError){writeStderrLineSafe(`qwen serve: ACP preheat timed out after ${opts?.timeoutMs??5e3}ms`)}const live2=channelLive();if(live2){return finish({ready:true,channelLive:true},false)}return finish({ready:false,channelLive:false,reason:err instanceof TimeoutError?"timeout":"error",error:err instanceof TimeoutError?"ACP preheat did not complete before the timeout":"ACP preheat failed"})}const live=channelLive();if(!live){writeStderrLineSafe("qwen serve: ACP preheat resolved without a live channel")}return live?finish({ready:true,channelLive:true}):finish({ready:false,channelLive:false,reason:"error",error:"ACP preheat did not produce a live channel"})},async getWorkspaceAcpStatus(_ctx){return{channelLive:isChannelLive?.()??false}},async getWorkspaceEnvStatus(_ctx){const acpChannelLive=isChannelLive?.()??false;if(!statusProvider){return createIdleEnvStatus(boundWorkspace,acpChannelLive)}try{return await statusProvider.getEnvStatus(boundWorkspace,acpChannelLive)}catch(err){writeStderrLine(`qwen serve: getEnvStatus failed: ${err instanceof Error?err.message:String(err)}`);return createIdleEnvStatus(boundWorkspace,acpChannelLive)}},async getWorkspacePreflightStatus(_ctx){const acpChannelLive=isChannelLive?.()??false;const idleCells=createIdleAcpPreflightCells();let daemonCells=[];if(statusProvider){try{daemonCells=await statusProvider.getDaemonPreflightCells(boundWorkspace)}catch(err){writeStderrLine(`qwen serve: getDaemonPreflightCells failed: ${err instanceof Error?err.message:String(err)}`)}}let acpCells=idleCells;let errors;if(acpChannelLive){try{const acpResult=await queryWorkspaceStatus(SERVE_STATUS_EXT_METHODS.workspacePreflight,()=>({cells:idleCells}));if(acpResult&&"cells"in acpResult){const result=acpResult;acpCells=result.cells.filter(c=>c.locality!=="daemon");errors=result.errors}}catch(err){acpCells=idleCells;const errorKind=mapDomainErrorToErrorKind(err);errors=[{kind:"preflight",status:"error",error:err instanceof Error?err.message:String(err),...errorKind?{errorKind}:{}}]}}return{v:STATUS_SCHEMA_VERSION,workspaceCwd:boundWorkspace,initialized:true,acpChannelLive,cells:[...daemonCells,...acpCells],...errors&&errors.length>0?{errors}:{}}},async getWorkspaceHooksStatus(_ctx){return queryWorkspaceStatus(SERVE_STATUS_EXT_METHODS.workspaceHooks,()=>createIdleWorkspaceHooksStatus(boundWorkspace))},async getWorkspaceExtensionsStatus(_ctx){return queryWorkspaceStatus(SERVE_STATUS_EXT_METHODS.workspaceExtensions,()=>createIdleWorkspaceExtensionsStatus(boundWorkspace))},async getWorkspaceTrustStatus(_ctx){return getWorkspaceTrustStatus(loadBoundSettings(true).merged,boundWorkspace)},async getWorkspacePermissionsStatus(_ctx){return buildPermissionSettings(loadBoundSettings())},async getWorkspaceVoiceStatus(_ctx){return buildWorkspaceVoiceStatus(boundWorkspace,loadBoundSettings(Boolean(voiceEnv)))},async requestWorkspaceTrustChange(ctx,request){assertActiveGeneration();publishWorkspaceEvent({type:"trust_change_requested",data:{workspaceCwd:boundWorkspace,desiredState:request.desiredState,...request.reason!==void 0?{reason:request.reason}:{}},originatorClientId:ctx.originatorClientId});return{accepted:false,desiredState:request.desiredState,requiresOperatorAction:true}},async grantWorkspaceTrust(_ctx){assertActiveGeneration();loadTrustedFolders().setValue(boundWorkspace,"TRUST_FOLDER",true);const snapshot=await readDaemonTrustPolicySnapshot();const decision=evaluateDaemonWorkspaceTrust(snapshot,boundWorkspace);if(!decision.targetTrusted){throw new WorkspaceTrustGrantIneffectiveError(decision.state,decision.source)}const status=getWorkspaceTrustStatus(loadBoundSettings(true).merged,boundWorkspace);if(status.effective.state!=="trusted"){throw new WorkspaceTrustGrantIneffectiveError(status.effective.state,status.effective.source)}return status},async setWorkspacePermissionRules(ctx,request){assertActiveGeneration();const key=`permissions.${request.ruleType}`;try{const result=await invokeWorkspaceCommand("qwen/permissions/setRules",{cwd:boundWorkspace,scope:request.scope,ruleType:request.ruleType,rules:request.rules});assertActiveGeneration();publishWorkspaceEvent({type:"settings_changed",data:{key,value:request.rules,scope:request.scope},originatorClientId:ctx.originatorClientId});return result}catch(err){if(err instanceof WorkspaceChangePartiallyAppliedError&&err.result!==void 0){assertActiveGeneration();publishWorkspaceEvent({type:"settings_changed",data:{key,value:request.rules,scope:request.scope},originatorClientId:ctx.originatorClientId});throw err}if(!(err instanceof SessionNotFoundError)){throw err}throw new WorkspacePermissionRulesSessionRequiredError}},async setWorkspaceVoiceSettings(ctx,request){assertActiveGeneration();if(!persistSettings&&!persistSetting){throw new WorkspaceVoiceError(501,"not_implemented","Workspace voice settings persistence is not available")}const settings=loadBoundSettings(Boolean(voiceEnv));validateWorkspaceVoiceState(settings,request,{env:voiceEnv});const writes=buildWorkspaceVoiceSettingsWrites(settings,request,{workspaceTrusted:isWorkspaceTrusted(),...voiceSettingsScope?{scopeOverride:voiceSettingsScope}:{}});const publishWrite=__name(write=>{publishWorkspaceEvent({type:"settings_changed",data:{key:write.key,value:write.value,scope:voiceSettingsScopeToWire(write.scope)},originatorClientId:ctx.originatorClientId})},"publishWrite");if(persistSettings){try{await persistSettings(boundWorkspace,writes,assertGenerationOpen)}catch(err){if(err instanceof WorkspaceSettingsPartialPersistError){assertActiveGeneration();for(const write of err.committedWrites){publishWrite(write)}}throw err}assertActiveGeneration();for(const write of writes){publishWrite(write)}}else{const committed=[];for(const write of writes){try{await persistSetting(boundWorkspace,write.scope,write.key,write.value,assertGenerationOpen)}catch(err){assertActiveGeneration();writeStderrLine(`qwen serve: workspace voice partial persist error (workspace=${boundWorkspace}, committed=${committed.length}/${writes.length}, failedKey=${write.key}, failedScope=${voiceSettingsScopeToWire(write.scope)}): ${err instanceof Error?err.message:String(err)}`);for(const committedWrite of committed){publishWrite(committedWrite)}throw new WorkspaceSettingsPartialPersistError(`Voice settings partial persist failed: committed=${committed.length}/${writes.length}`,committed,err)}assertActiveGeneration();committed.push(write)}assertActiveGeneration();for(const write of committed){publishWrite(write)}}return buildWorkspaceVoiceStatus(boundWorkspace,loadBoundSettings(Boolean(voiceEnv)))},async setWorkspaceToolEnabled(ctx,toolName,enabled){assertActiveGeneration();await persistDisabledTools(boundWorkspace,toolName,enabled,assertGenerationOpen);assertActiveGeneration();publishWorkspaceEvent({type:"tool_toggled",data:{toolName,enabled},originatorClientId:ctx.originatorClientId});return{toolName,enabled}},async setWorkspaceSkillEnabled(ctx,requestedSkillName,enabled,opts){assertActiveGeneration();const skillName=requestedSkillName.trim();const persisted=await persistDisabledSkills(boundWorkspace,skillName,enabled,assertGenerationOpen);assertActiveGeneration();const channelLive=isChannelLive?.()??false;const refreshRuntime=opts?.refreshRuntime!==false;let activation=channelLive?persisted.changed&&!refreshRuntime?"reconciling":"applied":"deferred";let sessionsRefreshed=0;let sessionsFailed=0;if(persisted.changed){invalidateWorkspaceSkillsInventory();if(channelLive&&refreshRuntime){try{const refreshed=await invokeWorkspaceCommand(SERVE_CONTROL_EXT_METHODS.workspaceSkillsRefresh,{cwd:boundWorkspace,reason:"settings"});assertActiveGeneration();sessionsRefreshed=refreshed.sessionsRefreshed;sessionsFailed=refreshed.sessionsFailed;if(sessionsFailed>0)activation="partial"}catch(err){if(err instanceof SessionNotFoundError||err instanceof BridgeChannelClosedError){activation="deferred"}else{activation="partial";sessionsFailed=1;writeStderrLine(`qwen serve: workspace skill refresh failed: ${err instanceof Error?err.message:String(err)}`)}}invalidateWorkspaceSkillsInventory()}assertActiveGeneration();const settingsChanges=persisted.settingsChanges??[{key:"skills.disabled",value:persisted.disabled.length>0?persisted.disabled:void 0}];const mutation=createSkillToggleMutation({skills:[{name:skillName,enabled}],activation,sessionsRefreshed,sessionsFailed});for(const change of settingsChanges){publishWorkspaceEvent({type:"settings_changed",data:{key:change.key,value:change.value,scope:"workspace",mutation},originatorClientId:ctx.originatorClientId})}}return{skillName,enabled,changed:persisted.changed,...persisted.block?{block:persisted.block}:{},activation,sessionsRefreshed,sessionsFailed}},async setWorkspaceSkillsEnabled(ctx,requestedSkillNames,enabled){assertActiveGeneration();const skillNames=requestedSkillNames.map(name=>name.trim());const persisted=skillNames.length>0?await persistDisabledSkillsBatch(boundWorkspace,skillNames,enabled,assertGenerationOpen):{outcomes:[],settingsChanges:[]};assertActiveGeneration();const persistedByName=new Map(persisted.outcomes.map(outcome=>[outcome.skillName.trim().toLowerCase(),outcome]));const results=[];for(const skillName of skillNames){const outcome=persistedByName.get(skillName.toLowerCase());if(!outcome){throw new Error(`Missing persisted Skill batch outcome: ${skillName}`)}results.push({skillName:outcome.skillName,enabled,changed:outcome.changed})}const changed=results.some(result=>result.changed);const channelLive=isChannelLive?.()??false;let activation=channelLive?"applied":"deferred";let sessionsRefreshed=0;let sessionsFailed=0;if(changed){invalidateWorkspaceSkillsInventory();if(channelLive){try{const refreshed=await invokeWorkspaceCommand(SERVE_CONTROL_EXT_METHODS.workspaceSkillsRefresh,{cwd:boundWorkspace,reason:"settings"});assertActiveGeneration();sessionsRefreshed=refreshed.sessionsRefreshed;sessionsFailed=refreshed.sessionsFailed;if(sessionsFailed>0)activation="partial"}catch(err){if(err instanceof SessionNotFoundError||err instanceof BridgeChannelClosedError){activation="deferred"}else{activation="partial";sessionsFailed=1;writeStderrLine(`qwen serve: workspace skill refresh failed: ${err instanceof Error?err.message:String(err)}`)}}invalidateWorkspaceSkillsInventory()}assertActiveGeneration();const mutation=createSkillToggleMutation({skills:results.filter(result=>result.changed).map(result=>({name:result.skillName,enabled:result.enabled})),activation,sessionsRefreshed,sessionsFailed});for(const change of persisted.settingsChanges){publishWorkspaceEvent({type:"settings_changed",data:{...change,scope:"workspace",mutation},originatorClientId:ctx.originatorClientId})}}return{enabled,activation,sessionsRefreshed,sessionsFailed,results,errors:[]}},async installWorkspaceSkill(_ctx,request,opts){assertActiveGeneration();const result=await installWorkspaceSkill(boundWorkspace,request,skillInstallEnv?.["GH_TOKEN"]??skillInstallEnv?.["GITHUB_TOKEN"],assertGenerationOpen);assertActiveGeneration();if(opts?.refreshRuntime===false)invalidateWorkspaceSkillsInventory();else await refreshWorkspaceSkillsAfterMutation();assertActiveGeneration();return result},async deleteWorkspaceSkill(_ctx,requestedSkillName,scope,opts){assertActiveGeneration();const normalizedName=requestedSkillName.trim().toLowerCase();const exactName=requestedSkillName.trim();if(opts?.refreshRuntime===false)invalidateWorkspaceSkillsInventory();const status=opts?.refreshRuntime===false?await getWorkspaceSkillsConfigStatus():await readWorkspaceSkillsStatus(false,true);assertActiveGeneration();if(!status.initialized||status.errors?.length){throw new WorkspaceSkillManagementError("skills_config_unavailable","Skills configuration could not be enumerated",503)}const expectedLevel=scope==="workspace"?"project":"user";const matches=status.skills.filter(candidate=>candidate.name.trim().toLowerCase()===normalizedName);const scopedMatches=matches.filter(candidate=>candidate.level===expectedLevel);const skill=scopedMatches.find(candidate=>candidate.name===exactName)??(scopedMatches.length===1?scopedMatches[0]:void 0);if(!skill&&matches.length===0){throw new WorkspaceSkillNotFoundError(requestedSkillName)}if(!skill?.installedPath){throw new WorkspaceSkillManagementError("skill_not_managed","Skill is not managed in the requested scope",409)}let result;try{result=await deleteWorkspaceSkill(boundWorkspace,scope,skill.name,skill.installedPath,assertGenerationOpen)}catch(error){if(error.code==="ENOENT"){throw new WorkspaceSkillNotFoundError(requestedSkillName)}throw error}assertActiveGeneration();if(opts?.refreshRuntime===false)invalidateWorkspaceSkillsInventory();else await refreshWorkspaceSkillsAfterMutation();assertActiveGeneration();return result},async initWorkspace(ctx,opts){assertActiveGeneration();const filename=contextFilename;const target=path2.resolve(boundWorkspace,filename);const withinWorkspace=target===boundWorkspace||target.startsWith(boundWorkspace+path2.sep);if(!withinWorkspace){throw new WorkspaceInitPathEscapeError(filename,boundWorkspace)}const wsCanonical=await fs2.realpath(boundWorkspace);const parentCanonical=await canonicalizeExistingAncestor(path2.dirname(target));const parentWithinWorkspace=parentCanonical===wsCanonical||parentCanonical.startsWith(wsCanonical+path2.sep);if(!parentWithinWorkspace){throw new WorkspaceInitSymlinkError(target,"parent",`Configured workspace context filename ${JSON.stringify(filename)} has a parent path that resolves outside the bound workspace (parent canonicalizes to ${JSON.stringify(parentCanonical)}, workspace canonicalizes to ${JSON.stringify(wsCanonical)}). Refusing to write \u2014 replace any symlinked parent directory with a real directory before re-running init.`)}try{const lst=await fs2.lstat(target);if(lst.isSymbolicLink()){throw new WorkspaceInitSymlinkError(target,"target",`Workspace context file ${JSON.stringify(target)} is a symlink. Refusing to follow it for write \u2014 replace the symlink with a regular file (or remove it) before re-running init.`)}if(!lst.isFile()){throw new WorkspaceInitSymlinkError(target,"target",`Workspace context file ${JSON.stringify(target)} is not a regular file (mode=${lst.mode.toString(8)}). Refusing to proceed \u2014 FIFOs, sockets, and device nodes can block or misbehave on read/write.`)}}catch(err){if(err instanceof WorkspaceInitSymlinkError)throw err;const code=err?.code;if(code!=="ENOENT")throw err}let action="created";try{const existing=await fs2.readFile(target,"utf8");if(existing.trim().length>0){const existingSize=Buffer.byteLength(existing,"utf8");if(opts.force!==true){throw new WorkspaceInitConflictError(target,existingSize)}action="overwrote"}else{action="noop"}}catch(err){if(err instanceof WorkspaceInitConflictError)throw err;const code=err?.code;if(code!=="ENOENT")throw err}if(action==="created"){let fh;try{assertActiveGeneration();fh=await fs2.open(target,"wx")}catch(err){const code=err?.code;if(code==="EEXIST"){throw new WorkspaceInitRaceError(target,"eexist",`Workspace context file ${JSON.stringify(target)} appeared between our absence check and the create \u2014 refusing to proceed (a regular file or symlink was just placed at the target path, and following it could escape the workspace).`)}throw err}try{await verifyParentPostOpen(target,wsCanonical,fh);assertActiveGeneration();await fh.writeFile("","utf8")}finally{await fh.close()}}else if(action==="overwrote"){let overwriteFh;try{assertActiveGeneration();overwriteFh=await fs2.open(target,fsConstants.O_WRONLY|(fsConstants.O_NOFOLLOW??0))}catch(err){const code=err?.code;if(code==="ELOOP"){throw new WorkspaceInitSymlinkError(target,"target",`Workspace context file ${JSON.stringify(target)} could not be opened with O_NOFOLLOW (ELOOP); the path may have been swapped to a symlink between the content check and the overwrite. Refusing to follow it.`)}if(code==="ENOENT"){throw new WorkspaceInitRaceError(target,"enoent",`Workspace context file ${JSON.stringify(target)} was deleted between the content check and the overwrite (likely a concurrent writer). Refusing to recreate blindly; rerun init.`)}throw err}try{await verifyParentPostOpen(target,wsCanonical,overwriteFh);assertActiveGeneration();await overwriteFh.truncate(0)}finally{await overwriteFh.close()}}assertActiveGeneration();publishWorkspaceEvent({type:"workspace_initialized",data:{path:target,action},originatorClientId:ctx.originatorClientId});return{path:target,action}},async restartMcpServer(ctx,serverName,opts){assertActiveGeneration();const params={serverName};if(opts?.entryIndex!==void 0){params["entryIndex"]=opts.entryIndex}let result;try{result=await invokeWorkspaceCommand(SERVE_CONTROL_EXT_METHODS.workspaceMcpRestart,params,{timeoutMs:MCP_RESTART_SERVER_DEADLINE_MS})}catch(err){const data=err?.data;if(data&&typeof data==="object"){const kind=data.errorKind;const sn=data.serverName;if(kind==="mcp_server_not_found"&&typeof sn==="string"){throw new McpServerNotFoundError(sn)}if(kind==="mcp_restart_failed"&&typeof sn==="string"){const status=data.mcpStatus;throw new McpServerRestartFailedError(sn,typeof status==="string"?status:"unknown")}}throw err}assertActiveGeneration();if("entries"in result){const entries=Array.isArray(result.entries)?result.entries:[];if(!Array.isArray(result.entries)){writeStderrLine(`qwen serve: pool restart response carried 'entries' field but it is not an array (server=${serverName}); treating as empty.`)}for(const entry of entries){if(typeof entry!=="object"||entry===null||typeof entry.entryIndex!=="number"){writeStderrLine(`qwen serve: skipping malformed pool restart entry (server=${serverName}): ${JSON.stringify(entry)}`);continue}if(entry.restarted){publishWorkspaceEvent({type:"mcp_server_restarted",data:{serverName:result.serverName,durationMs:entry.durationMs??0,entryIndex:entry.entryIndex},originatorClientId:ctx.originatorClientId})}else{publishWorkspaceEvent({type:"mcp_server_restart_refused",data:{serverName:result.serverName,reason:"restart_failed",entryIndex:entry.entryIndex,...entry.reason?{details:entry.reason}:{}},originatorClientId:ctx.originatorClientId})}}}else if(result.restarted===true){publishWorkspaceEvent({type:"mcp_server_restarted",data:{serverName:result.serverName,durationMs:result.durationMs},originatorClientId:ctx.originatorClientId})}else{publishWorkspaceEvent({type:"mcp_server_restart_refused",data:{serverName:result.serverName,reason:result.reason},originatorClientId:ctx.originatorClientId})}return result},async reload(ctx){assertActiveGeneration();let runtimeEnvironmentApplied;if(deps.reloadDaemonEnv){try{const result=await deps.reloadDaemonEnv(boundWorkspace,assertGenerationOpen);runtimeEnvironmentApplied=result.runtimeEnvironmentApplied}catch(err){runtimeEnvironmentApplied=false;writeStderrLine(`qwen serve: daemon reload failed: ${err instanceof Error?err.message:String(err)}`)}}assertActiveGeneration();let childReloaded=false;let env={updatedKeys:[],removedKeys:[]};let changedKeys=[];let sessionsRefreshed;let sessionsSkipped;let childError;const applyChildResult=__name(childResult=>{childReloaded=true;env=childResult.env;changedKeys=childResult.changedKeys;sessionsRefreshed=childResult.sessionsRefreshed;sessionsSkipped=childResult.sessionsSkipped},"applyChildResult");try{applyChildResult(await invokeWorkspaceCommand(SERVE_CONTROL_EXT_METHODS.workspaceReload,{cwd:boundWorkspace},{timeoutMs:3e4}))}catch(err){if(err instanceof WorkspaceChangePartiallyAppliedError&&err.result!==void 0){applyChildResult(err.result)}if(err instanceof SessionNotFoundError){childError="ACP child not running"}else{childError=err instanceof Error?err.message:String(err);writeStderrLine(`qwen serve: reload failed: ${childError}`)}}assertActiveGeneration();publishWorkspaceEvent({type:"settings_reloaded",data:{env,changedKeys,childReloaded,sessionsRefreshed,sessionsSkipped,childError,...runtimeEnvironmentApplied===void 0?{}:{runtimeEnvironmentApplied}},originatorClientId:ctx.originatorClientId});return{env,changedKeys,childReloaded,sessionsRefreshed,sessionsSkipped,childError,...runtimeEnvironmentApplied===void 0?{}:{runtimeEnvironmentApplied}}},async reloadModelProviders(_ctx){assertActiveGeneration();let failed=false;const reloadModelProvidersDaemonEnv=deps.reloadModelProvidersDaemonEnv??deps.reloadDaemonEnv;if(reloadModelProvidersDaemonEnv){try{const result=await reloadModelProvidersDaemonEnv(boundWorkspace,assertGenerationOpen);failed=result.runtimeEnvironmentApplied===false}catch{assertActiveGeneration();failed=true;writeStderrLine("qwen serve: model-provider parent environment sync failed")}}assertActiveGeneration();try{const child=await invokeWorkspaceCommand(SERVE_CONTROL_EXT_METHODS.workspaceModelProvidersReload,{cwd:boundWorkspace},{timeoutMs:3e4});if((child.configsFailed??0)>0)failed=true;return{status:failed?"failed":"applied"}}catch(err){assertActiveGeneration();if(err instanceof SessionNotFoundError||err instanceof BridgeChannelClosedError){return{status:failed?"failed":"deferred"}}writeStderrLine("qwen serve: model-provider ACP child sync failed");return{status:"failed"}}},invalidateWorkspaceSkillsStatus(){invalidateWorkspaceSkillsInventory()},async refreshWorkspaceSkills(_ctx,sessionIds){assertActiveGeneration();try{const result=await invokeWorkspaceCommand(SERVE_CONTROL_EXT_METHODS.workspaceSkillsRefresh,{cwd:boundWorkspace,reason:"all",...sessionIds!==void 0?{sessionIds}:{}});assertActiveGeneration();return result}finally{invalidateWorkspaceSkillsInventory()}},async refreshExtensionsForAllSessions(sessionIds){assertActiveGeneration();try{if(!refreshExtensionsForAllSessionsOnBridge){throw new Error("refreshExtensionsForAllSessions is not wired")}return await refreshExtensionsForAllSessionsOnBridge(sessionIds)}catch(err){if(err instanceof SessionNotFoundError)throw err;writeStderrLine(`qwen serve: refreshExtensionsForAllSessions failed: ${err instanceof Error?err.message:String(err)}`);return{refreshed:0,failed:1}}finally{invalidateWorkspaceSkillsInventory()}}}}__name(createDaemonWorkspaceService,"createDaemonWorkspaceService");export{MAX_WORKSPACE_SKILL_NAME_LENGTH,WorkspaceSkillManagementError,validateWorkspaceSkillName,workspaceSkillBaseDir,installWorkspaceSkill,deleteWorkspaceSkill,EMPTY_WORKSPACE_VOICE_UPDATE_ERROR,WorkspaceVoiceError,voiceSettingsScopeToWire,buildWorkspaceVoiceSettingsWrites,hasConfiguredBatchVoiceTranscriptionModel,buildWorkspaceVoiceStatus,validateWorkspaceVoiceState,transcribeWorkspaceVoiceAudio,createDaemonWorkspaceService};
|
|
4
4
|
/**
|
|
5
5
|
* @license
|
|
6
6
|
* Copyright 2025 Qwen
|