@qwen-code/qwen-code 0.26.2-preview.0 → 0.26.2-preview.1
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/chunks/{MaxSizedBox-K6YUM3DX.js → MaxSizedBox-EGHZ2BPF.js} +1 -1
- package/chunks/{StandaloneSessionPicker-75IC33SN.js → StandaloneSessionPicker-UVCW6YW3.js} +1 -1
- package/chunks/{acp-subagent-executor-3NHBJRPL.js → acp-subagent-executor-AQ7AWSD4.js} +1 -1
- package/chunks/{acpAgent-JT6KQPTH.js → acpAgent-IV7JAGD7.js} +3 -3
- package/chunks/{advisor-TI2UVEZK.js → advisor-UZ4TF65D.js} +1 -1
- package/chunks/{agent-SWIZZZMY.js → agent-CNLVAWDD.js} +1 -1
- package/chunks/{agent-headless-USWEJ4GW.js → agent-headless-ZJUJLUJS.js} +1 -1
- package/chunks/{agent-host-client-ZFIMQX33.js → agent-host-client-SN5V2KBH.js} +1 -1
- package/chunks/{agent-host-connections-LOFD7O7Q.js → agent-host-connections-VKMAJIIU.js} +1 -1
- package/chunks/{anthropicContentGenerator-HMLEI4FI.js → anthropicContentGenerator-QTJVPAMI.js} +1 -1
- package/chunks/{autofix-pr-NKR2VSLB.js → autofix-pr-U7GNSH27.js} +1 -1
- package/chunks/{batch-JQZ3TOHA.js → batch-MBEWETXN.js} +1 -1
- package/chunks/{bridge-EIWWT4P6.js → bridge-TEJLNYV3.js} +1 -1
- package/chunks/{channel-settings-store-FLRLUA67.js → channel-settings-store-QNCKWWBL.js} +1 -1
- package/chunks/{chunk-244YTFYD.js → chunk-23KDY7UW.js} +1 -1
- package/chunks/{chunk-7TDMQJTD.js → chunk-2DWWSMTV.js} +1 -1
- package/chunks/{chunk-UU2LTNSF.js → chunk-3IZMVLVZ.js} +1 -1
- package/chunks/{chunk-B6T4ESBM.js → chunk-3JI7IKJL.js} +1 -1
- package/chunks/{chunk-Y5TT2G3N.js → chunk-427MARCP.js} +1 -1
- package/chunks/{chunk-KX7JS2P7.js → chunk-4NNNGSQY.js} +3 -3
- package/chunks/{chunk-6TQS2WQO.js → chunk-4RM7KY3Z.js} +2 -2
- package/chunks/{chunk-YL3N2UGG.js → chunk-5X7S4AE6.js} +5 -5
- package/chunks/{chunk-K2HAY5PY.js → chunk-5XAECBED.js} +1 -1
- package/chunks/{chunk-VCHFBETO.js → chunk-66KKSLUO.js} +1 -1
- package/chunks/{chunk-BSJR2KEF.js → chunk-6CIIDUZW.js} +1 -1
- package/chunks/{chunk-22CLK7PK.js → chunk-7EBRMQYW.js} +1 -1
- package/chunks/{chunk-J4TFGZ4A.js → chunk-7FSC2NKA.js} +1 -1
- package/chunks/{chunk-6JFC5M6B.js → chunk-A5TAAMML.js} +1 -1
- package/chunks/{chunk-DHHACQVN.js → chunk-AOYSX44A.js} +1 -1
- package/chunks/{chunk-VFVZ2DY7.js → chunk-AZCMQ3DD.js} +2 -2
- package/chunks/{chunk-BQJXWIMR.js → chunk-B6F7CVBP.js} +1 -1
- package/chunks/{chunk-OVPEAKOQ.js → chunk-BDQOLT37.js} +1 -1
- package/chunks/{chunk-5SYUBQNO.js → chunk-BIWEUAKG.js} +1 -1
- package/chunks/{chunk-BZM66PQO.js → chunk-BJ5R7LOM.js} +1 -1
- package/chunks/{chunk-4R2OHBH3.js → chunk-BKUFRNME.js} +1 -1
- package/chunks/{chunk-NIYWNFVF.js → chunk-BNZSPX2I.js} +1 -1
- package/chunks/{chunk-FJV2ECNY.js → chunk-D2URRVOK.js} +1 -1
- package/chunks/{chunk-GT6CHVAI.js → chunk-DANP7CMW.js} +1 -1
- package/chunks/{chunk-FHFLD4DR.js → chunk-DBHLRZGI.js} +1 -1
- package/chunks/{chunk-Y2UXZJLM.js → chunk-DL7TKH2E.js} +2 -2
- package/chunks/{chunk-MCQE2U7N.js → chunk-DOWKH5OZ.js} +6 -6
- package/chunks/{chunk-UHRLBY3C.js → chunk-DPHQJPCU.js} +1 -1
- package/chunks/{chunk-PV2VT25U.js → chunk-DPNGBOI7.js} +1 -1
- package/chunks/{chunk-NCDNF7UJ.js → chunk-DXRXF4QD.js} +1 -1
- package/chunks/{chunk-OCVRMNEQ.js → chunk-DZ3GV34J.js} +1 -1
- package/chunks/{chunk-3QIAXWWW.js → chunk-EU2MKUK4.js} +1 -1
- package/chunks/{chunk-KMAVI6FB.js → chunk-EVBUXPGM.js} +1 -1
- package/chunks/{chunk-BVSTV4JM.js → chunk-F3ZRU2SA.js} +1 -1
- package/chunks/{chunk-TBZY477Y.js → chunk-FCZYH27X.js} +1 -1
- package/chunks/{chunk-JCOK67LT.js → chunk-FNDMWG43.js} +1 -1
- package/chunks/{chunk-5SF32OGU.js → chunk-GDXLJJSW.js} +1 -1
- package/chunks/{chunk-SO6FCPRI.js → chunk-GZYIXB7Y.js} +1 -1
- package/chunks/{chunk-WZPTWC7X.js → chunk-HHNAH4IH.js} +1 -1
- package/chunks/{chunk-7KCAOXNL.js → chunk-HOKROBQZ.js} +1 -1
- package/chunks/{chunk-34ZBUQJV.js → chunk-IGPAATQW.js} +1 -1
- package/chunks/{chunk-2ZTRKK2O.js → chunk-INFBJDWM.js} +1 -1
- package/chunks/{chunk-IEJ2CGRN.js → chunk-J3R7ZNSA.js} +1 -1
- package/chunks/{chunk-KT5MPRYB.js → chunk-JCRS367I.js} +1 -1
- package/chunks/{chunk-7JWJTRP6.js → chunk-JFVXZFMV.js} +1 -1
- package/chunks/{chunk-47LP4MBD.js → chunk-JKMGS2VD.js} +1 -1
- package/chunks/{chunk-WRJ3PMDZ.js → chunk-JUQ7T2MV.js} +1 -1
- package/chunks/{chunk-NZX3UWNF.js → chunk-KQ4TDFNE.js} +1 -1
- package/chunks/{chunk-X7D4VKMX.js → chunk-L6BKKN42.js} +1 -1
- package/chunks/{chunk-YG5HVFMY.js → chunk-L7Y6MOHS.js} +1 -1
- package/chunks/{chunk-UFTIUKD4.js → chunk-LGYXZJI3.js} +1 -1
- package/chunks/{chunk-JQGGILML.js → chunk-LPOEVTKD.js} +1 -1
- package/chunks/{chunk-5KI55A6S.js → chunk-LRXS7ZI2.js} +1 -1
- package/chunks/{chunk-CKVHEYXW.js → chunk-LYYVSCNL.js} +1 -1
- package/chunks/{chunk-LIIMQ4DI.js → chunk-LZNBHBAJ.js} +6 -6
- package/chunks/{chunk-H4GDEXMF.js → chunk-M3C6RDGC.js} +1 -1
- package/chunks/{chunk-KKKUB3RQ.js → chunk-MNVMHVQJ.js} +1 -1
- package/chunks/{chunk-2B3W7IQY.js → chunk-MVGQFFIK.js} +1 -1
- package/chunks/{chunk-Q35A2RGO.js → chunk-NC7BCZPQ.js} +1 -1
- package/chunks/{chunk-2ZOTG3NW.js → chunk-NE627MUW.js} +1 -1
- package/chunks/{chunk-W4P2EN3V.js → chunk-NZNRCPGE.js} +1 -1
- package/chunks/{chunk-YPDQJQ3S.js → chunk-P3M4WWRA.js} +1 -1
- package/chunks/{chunk-DVB36ASH.js → chunk-P534ONQN.js} +1 -1
- package/chunks/{chunk-EL5J4ESB.js → chunk-QF44NNSC.js} +1 -1
- package/chunks/{chunk-IQPJOBPI.js → chunk-QHGCDHNW.js} +1 -1
- package/chunks/{chunk-EVZC4KEQ.js → chunk-QWJX7NIP.js} +1 -1
- package/chunks/{chunk-J2TJL2F4.js → chunk-S53G54DW.js} +2 -2
- package/chunks/{chunk-3A6LFJJV.js → chunk-SMNFL3AD.js} +1 -1
- package/chunks/{chunk-WDO3K3P2.js → chunk-TOBNWST4.js} +1 -1
- package/chunks/{chunk-AVGJ4HE3.js → chunk-TQSBUHAM.js} +1 -1
- package/chunks/{chunk-ABUS7DNN.js → chunk-TW5QEP2J.js} +1 -1
- package/chunks/{chunk-WYM4Z4D5.js → chunk-UEB2F43V.js} +1 -1
- package/chunks/{chunk-FUUPMVD2.js → chunk-UPPE4I6H.js} +1 -1
- package/chunks/{chunk-UHBJVFZA.js → chunk-US42COBM.js} +1 -1
- package/chunks/{chunk-RMQNBSMK.js → chunk-UUY6XSQI.js} +1 -1
- package/chunks/{chunk-UVQUQNCA.js → chunk-UZI3IA27.js} +1 -1
- package/chunks/{chunk-SXJ2E33J.js → chunk-V6VMUJ47.js} +1 -1
- package/chunks/{chunk-5UFCNJGN.js → chunk-VG2ZINTO.js} +1 -1
- package/chunks/{chunk-JPPPJ2GN.js → chunk-VJI6MHWX.js} +1 -1
- package/chunks/{chunk-AUI7WVSU.js → chunk-VOBNHBCJ.js} +1 -1
- package/chunks/{chunk-3BNJDZHU.js → chunk-VUEZWMI4.js} +1 -1
- package/chunks/{chunk-LMNKCL55.js → chunk-W7ZX6WB3.js} +2 -2
- package/chunks/{chunk-HVS6V2UZ.js → chunk-WA2LKUVP.js} +1 -1
- package/chunks/{chunk-7APLU2XE.js → chunk-WFFCJ5PF.js} +1 -1
- package/chunks/{chunk-3TD4WAG5.js → chunk-WQY5GE65.js} +1 -1
- package/chunks/{chunk-3YWRMF6C.js → chunk-WSESLSKK.js} +1 -1
- package/chunks/{chunk-NILCQMZ7.js → chunk-XFJV5NYT.js} +1 -1
- package/chunks/{chunk-LGBGUITT.js → chunk-XIYLRIW4.js} +1 -1
- package/chunks/{chunk-KS74L67R.js → chunk-XQ2NYKJH.js} +1 -1
- package/chunks/{chunk-JB2NOB6W.js → chunk-Y3VRWG52.js} +1 -1
- package/chunks/{chunk-GVZ6D2NL.js → chunk-YBISME5B.js} +1 -1
- package/chunks/{chunk-2C2253QI.js → chunk-YJNWPSB3.js} +1 -1
- package/chunks/{chunk-O2T3GQ6F.js → chunk-YWVV5STA.js} +1 -1
- package/chunks/{chunk-MAQZSOHI.js → chunk-ZH4J3FL6.js} +1 -1
- package/chunks/{chunk-THNEKTPK.js → chunk-ZSKCF6DI.js} +1 -1
- package/chunks/{chunk-Z7BAHKO5.js → chunk-ZW6456SD.js} +1 -1
- package/chunks/{chunk-DMSZ2TB3.js → chunk-ZWM3LLT7.js} +1 -1
- package/chunks/{codex-subagent-executor-DQ5LQQWO.js → codex-subagent-executor-DWWT7246.js} +1 -1
- package/chunks/{config-utils-CY6HLKZ5.js → config-utils-NGZB522W.js} +1 -1
- package/chunks/{contextCommand-SGBWI7O6.js → contextCommand-7QCW2YNX.js} +1 -1
- package/chunks/{core-runtime-4DP27LCC.js → core-runtime-PSVNDJPD.js} +1 -1
- package/chunks/{create-sub-session-ECPDZMBX.js → create-sub-session-JTSEMEJE.js} +1 -1
- package/chunks/{cron-create-OO4OG3EI.js → cron-create-VGIDTUMX.js} +1 -1
- package/chunks/{daemon-git-worktree-guard-OYDNHT7P.js → daemon-git-worktree-guard-IQRGS7IH.js} +1 -1
- package/chunks/{daemon-status-provider-JGDLXPC6.js → daemon-status-provider-R4MYCYPG.js} +1 -1
- package/chunks/{daemon-trust-policy-5HRARS54.js → daemon-trust-policy-VAUKFZ2N.js} +1 -1
- package/chunks/{daemon-trust-policy-monitor-RM7FVIIC.js → daemon-trust-policy-monitor-E5HIO6RP.js} +1 -1
- package/chunks/{deferred-core-runtime-3CXBZIOG.js → deferred-core-runtime-FLOFQJPU.js} +1 -1
- package/chunks/{edit-DJPESAAY.js → edit-OOVQUGKV.js} +1 -1
- package/chunks/{enterPlanMode-IHBLRIF3.js → enterPlanMode-AUWVTQLT.js} +1 -1
- package/chunks/{environment-JN5SD347.js → environment-RM5OXYP4.js} +1 -1
- package/chunks/{errors-NUJCME3Y.js → errors-CLDJGHVD.js} +1 -1
- package/chunks/{execution-tool-I3SWG6I3.js → execution-tool-JFBVOKPW.js} +1 -1
- package/chunks/{execution-worker-62UZMAMJ.js → execution-worker-MNJZD72W.js} +1 -1
- package/chunks/{exitPlanMode-JIC4V3FE.js → exitPlanMode-PC6XG4TW.js} +1 -1
- package/chunks/{fast-path-NIOIL5YI.js → fast-path-V4DN3CRZ.js} +1 -1
- package/chunks/{glob-EQ4QNAHF.js → glob-DTZROBDS.js} +1 -1
- package/chunks/{goal-tools-DYTTSBQG.js → goal-tools-FUVGTY33.js} +1 -1
- package/chunks/{handleAutoUpdate-44BTG5L5.js → handleAutoUpdate-U4LVTHGU.js} +1 -1
- package/chunks/{i18n-FTHZAHCT.js → i18n-XOKNDFYP.js} +1 -1
- package/chunks/{initializer-MSGKXC75.js → initializer-XBR5J4CY.js} +1 -1
- package/chunks/{installationInfo-4XJMJJYU.js → installationInfo-4AOEOUI6.js} +1 -1
- package/chunks/{interactive-mod-session-DFLRYO2Q.js → interactive-mod-session-YGZK2JK2.js} +1 -1
- package/chunks/{list-ODZ7Z6VI.js → list-TCGKVPH4.js} +1 -1
- package/chunks/{llm-O64DHKP7.js → llm-SKFTN5UN.js} +4 -4
- package/chunks/{llm-content-generator-SK24I6QS.js → llm-content-generator-GWHXT3WS.js} +1 -1
- package/chunks/{loadedSettingsAdapter-6PEBUZT5.js → loadedSettingsAdapter-ZALZGZE7.js} +1 -1
- package/chunks/{local-ED3UEKWP.js → local-RWTWYS5Z.js} +1 -1
- package/chunks/{local-execution-environment-PUKES5LO.js → local-execution-environment-R6JWLD65.js} +1 -1
- package/chunks/{loggingContentGenerator-UHOJVSRR.js → loggingContentGenerator-UJV6QFOY.js} +1 -1
- package/chunks/{loop-wakeup-NSJQETPZ.js → loop-wakeup-BU2RRYHA.js} +1 -1
- package/chunks/{manage-memory-5RRB6FLH.js → manage-memory-XI57JN4T.js} +1 -1
- package/chunks/{managed-execution-engine-MZAP7SK6.js → managed-execution-engine-BA5PABMP.js} +1 -1
- package/chunks/{managed-local-serve-XMES3HXL.js → managed-local-serve-MFKN22K6.js} +1 -1
- package/chunks/{managed-npm-update-R5KGY7G2.js → managed-npm-update-ZGN43NUA.js} +1 -1
- package/chunks/{managed-runtime-attestation-worker-O2KNHHV6.js → managed-runtime-attestation-worker-YN2VBGYN.js} +1 -1
- package/chunks/{managed-runtime-bootstrap-HOTLM6DE.js → managed-runtime-bootstrap-SGQVMUJE.js} +1 -1
- package/chunks/{managed-runtime-session-worker-QZX44ZTD.js → managed-runtime-session-worker-4UMF3VBY.js} +1 -1
- package/chunks/{managed-runtime-ssh-worker-U425WQ65.js → managed-runtime-ssh-worker-7XA6KRBN.js} +1 -1
- package/chunks/{managed-session-authority-THHDHCBP.js → managed-session-authority-IJGYAOEL.js} +1 -1
- package/chunks/{mcp-AR7EK4WY.js → mcp-V3L7B5YK.js} +1 -1
- package/chunks/{memory-C2TSF6BK.js → memory-3T6FPNAK.js} +1 -1
- package/chunks/{model-call-collection-25WR55OH.js → model-call-collection-WTTITWWM.js} +1 -1
- package/chunks/{model-configuration-KC7DQGKV.js → model-configuration-T6SSGI4J.js} +1 -1
- package/chunks/{modelConfigUtils-QEHMVLSQ.js → modelConfigUtils-TQA25QJC.js} +1 -1
- package/chunks/{monitor-PDQUZD23.js → monitor-5ZAOJSEE.js} +1 -1
- package/chunks/{nonInteractiveCli-WY2YFONU.js → nonInteractiveCli-YFINLVA7.js} +1 -1
- package/chunks/{nonInteractiveToolExecutor-7RJZYPHJ.js → nonInteractiveToolExecutor-DE3WACL5.js} +1 -1
- package/chunks/{notebook-edit-P4ITXF5H.js → notebook-edit-UK6HBRO3.js} +1 -1
- package/chunks/{omni-AYUPB2QM.js → omni-65LF5QK4.js} +1 -1
- package/chunks/{openaiContentGenerator-V5IK4ITO.js → openaiContentGenerator-HX7NCSV5.js} +1 -1
- package/chunks/{openaiResponsesContentGenerator-DYDH6KWT.js → openaiResponsesContentGenerator-CFA6U6Y5.js} +1 -1
- package/chunks/{pidfile-INPBL2DK.js → pidfile-ZVKJUNTZ.js} +1 -1
- package/chunks/{processUtils-J4UDEDS4.js → processUtils-VS6CJT7E.js} +1 -1
- package/chunks/{prompt-terminal-ledger-QLOQWHYE.js → prompt-terminal-ledger-UF5RDB57.js} +1 -1
- package/chunks/{qwenContentGenerator-RU43XKKB.js → qwenContentGenerator-GM3ZSI7E.js} +1 -1
- package/chunks/{reactive-degrade-2Q3Z3KAR.js → reactive-degrade-TSAQWZ5F.js} +1 -1
- package/chunks/{read-file-472BQ25I.js → read-file-J267NT45.js} +1 -1
- package/chunks/{resumeHistoryUtils-7SUFKZDC.js → resumeHistoryUtils-IM46VFDV.js} +1 -1
- package/chunks/{review-WX52IWJR.js → review-4B64XTCL.js} +1 -1
- package/chunks/{ripGrep-4GPGLKAM.js → ripGrep-YLOSXO7P.js} +1 -1
- package/chunks/{run-qwen-serve-MXK4RBKL.js → run-qwen-serve-SAHEC44O.js} +1 -1
- package/chunks/{runtime-WHU3AGFT.js → runtime-SJDZHV6J.js} +1 -1
- package/chunks/{sandboxConfig-7DBXEQJH.js → sandboxConfig-47EXXMUA.js} +1 -1
- package/chunks/{scheduled-tasks-O5RV6G6U.js → scheduled-tasks-E6RCTUUS.js} +1 -1
- package/chunks/{scheduler-HLMS5LR5.js → scheduler-SE3IWIWA.js} +1 -1
- package/chunks/{search-memory-PYND7ZX3.js → search-memory-2W7VJC4Q.js} +1 -1
- package/chunks/{send-message-TMLYTQOI.js → send-message-63YGQP6G.js} +1 -1
- package/chunks/{serve-EBNBRAME.js → serve-F4ML2WNL.js} +1 -1
- package/chunks/{server-63BRDBL5.js → server-S56IB4TT.js} +3 -3
- package/chunks/{session-XB6J4CZD.js → session-2CUVLZ4H.js} +1 -1
- package/chunks/{session-attachments-root-PFK475N2.js → session-attachments-root-FINBX7K5.js} +1 -1
- package/chunks/{session-execution-engine-selector-P6TJTCKR.js → session-execution-engine-selector-UGC7DGUN.js} +1 -1
- package/chunks/{session-pr-refresh-PM7VAQTV.js → session-pr-refresh-KQLQ4MZY.js} +1 -1
- package/chunks/{sessionService-PO3LLZIZ.js → sessionService-Q6N7LF7Z.js} +1 -1
- package/chunks/{settings-JDQSRXP3.js → settings-23I6H76E.js} +1 -1
- package/chunks/{shell-JCEX3HKM.js → shell-IUECEVVY.js} +1 -1
- package/chunks/{skill-JSZBONIZ.js → skill-YKUETMPC.js} +1 -1
- package/chunks/{skill-settings-YGFG6GPN.js → skill-settings-ODYXOPCA.js} +1 -1
- package/chunks/{spawnChannel-VIIWSWTL.js → spawnChannel-7XU2SRWZ.js} +1 -1
- package/chunks/{standalone-update-2UU6FQZL.js → standalone-update-SWI2RL3L.js} +1 -1
- package/chunks/{start-opentui-ui-OSZZNSLY.js → start-opentui-ui-T53QJGCH.js} +1 -1
- package/chunks/{startInteractiveUI-FFH66MYH.js → startInteractiveUI-USTZGQOE.js} +1 -1
- package/chunks/{team-create-TKGDJ3NU.js → team-create-4A2XUE3D.js} +1 -1
- package/chunks/{team-plan-approval-3VJF4G6Z.js → team-plan-approval-4TS5CYN6.js} +1 -1
- package/chunks/{terminal-image-renderer-T3VJRZGP.js → terminal-image-renderer-C7553YV6.js} +1 -1
- package/chunks/{theme-manager-ZGUFLFUI.js → theme-manager-GTW75GOO.js} +1 -1
- package/chunks/{tool-call-3EQS5KSE.js → tool-call-YTUMWL3A.js} +1 -1
- package/chunks/{tool-result-media-7LFNVQ6E.js → tool-result-media-JYOYBX4J.js} +1 -1
- package/chunks/{tool-search-UDZ4S7T5.js → tool-search-Y4XTT2WF.js} +1 -1
- package/chunks/{total-session-admission-U4MII4RA.js → total-session-admission-EMJ5NRGL.js} +1 -1
- package/chunks/{trustedFolders-2NQJCIN3.js → trustedFolders-YG6WAVRE.js} +1 -1
- package/chunks/{update-relaunch-YKLWSCLC.js → update-relaunch-4QYQRCP4.js} +1 -1
- package/chunks/{updateCheck-YDLTQQRU.js → updateCheck-VRFPSX4G.js} +1 -1
- package/chunks/{upload-config-5QQKWF4O.js → upload-config-UCKGUYYQ.js} +1 -1
- package/chunks/{useAutoAcceptIndicator-AJS4WTU2.js → useAutoAcceptIndicator-2VGLKD7B.js} +1 -1
- package/chunks/{validateNonInterActiveAuth-AETOT7ZW.js → validateNonInterActiveAuth-GGMQXKKU.js} +1 -1
- package/chunks/{version-IB6DLRAG.js → version-Y46PG7II.js} +1 -1
- package/chunks/{web-fetch-LS3QARNR.js → web-fetch-7MPU555L.js} +1 -1
- package/chunks/{web-search-FGHRIVEB.js → web-search-HU2CL2X2.js} +1 -1
- package/chunks/{workflow-FX6XNETQ.js → workflow-U3D34QQX.js} +1 -1
- package/chunks/{workflow-ancestor-trust-5XXBGN6F.js → workflow-ancestor-trust-OWC4YTMR.js} +1 -1
- package/chunks/{workspace-agents-UJKLYPUK.js → workspace-agents-KHLAWSAR.js} +1 -1
- package/chunks/{workspace-providers-status-4JOHMTAW.js → workspace-providers-status-T57SE3YX.js} +1 -1
- package/chunks/{workspace-recovery-worker-XFEYQ4TP.js → workspace-recovery-worker-VYQ723ZE.js} +1 -1
- package/chunks/{workspace-registration-store-LWAPVNYC.js → workspace-registration-store-I7PR3A2Y.js} +1 -1
- package/chunks/{workspace-registry-M7OC376O.js → workspace-registry-YYUBXCLH.js} +1 -1
- package/chunks/{workspace-runtime-coordinator-CYHIL47L.js → workspace-runtime-coordinator-5ICAQO7W.js} +1 -1
- package/chunks/{workspace-service-43VZZ56B.js → workspace-service-YROWXOLQ.js} +1 -1
- package/chunks/{workspace-skills-status-V2TT6UJQ.js → workspace-skills-status-DKKQDTZJ.js} +1 -1
- package/chunks/{workspace-trust-reconciler-YZ4AG5ZW.js → workspace-trust-reconciler-3FPMUZDO.js} +1 -1
- package/chunks/{write-file-TGEH5MEZ.js → write-file-7QQVYFDT.js} +1 -1
- package/chunks/{zoom-image-TT6R7H2H.js → zoom-image-WL5EB6Q7.js} +1 -1
- package/cli.js +2 -2
- package/execution-worker.js +1 -1
- package/export-transcript-document.js +1 -1
- package/package.json +3 -3
- package/web-shell/assets/{PierreFilePreview-OsApm5-S.js → PierreFilePreview-BZ17f56_.js} +1 -1
- package/web-shell/assets/{SpreadsheetPreview-I1v1EzV7.js → SpreadsheetPreview-Bvkvr_5u.js} +1 -1
- package/web-shell/assets/{WorkspaceFileBrowser-BO6aug7i.js → WorkspaceFileBrowser-BJ_I4Uoz.js} +1 -1
- package/web-shell/assets/{abnfDiagram-VCTEODGH-DxuLMyN0.js → abnfDiagram-VCTEODGH-iuaBM15V.js} +1 -1
- package/web-shell/assets/{agents-route-CSJf6QPO.js → agents-route-CycwfNSC.js} +1 -1
- package/web-shell/assets/{arc-3--LekYQ.js → arc-C0lt8n55.js} +1 -1
- package/web-shell/assets/{architectureDiagram-5GKGNRK7-Dihq4uto.js → architectureDiagram-5GKGNRK7-Bw326d-A.js} +1 -1
- package/web-shell/assets/{blockDiagram-NRAW4CY4-BnaRPM2o.js → blockDiagram-NRAW4CY4-CHtFgBjV.js} +1 -1
- package/web-shell/assets/{c4Diagram-UCG6FXSJ-BtC94eMa.js → c4Diagram-UCG6FXSJ-Bx66oJT9.js} +1 -1
- package/web-shell/assets/channel-CRJuO00u.js +1 -0
- package/web-shell/assets/{chunk-2Q5K7J3B-2ZTXWP6M.js → chunk-2Q5K7J3B-BIshvfa_.js} +1 -1
- package/web-shell/assets/{chunk-5VM5RSS4-DBh7DP1F.js → chunk-5VM5RSS4-BZeRS6uD.js} +1 -1
- package/web-shell/assets/{chunk-F27PBJKO-xzqbWXBw.js → chunk-F27PBJKO-El-CGY2R.js} +1 -1
- package/web-shell/assets/{chunk-G27WJ6UU-DxnCrpxK.js → chunk-G27WJ6UU-DO8ZfQL_.js} +1 -1
- package/web-shell/assets/{chunk-JWPE2WC7-BPjRsozm.js → chunk-JWPE2WC7-yYFrrKAj.js} +1 -1
- package/web-shell/assets/{chunk-LCL6LL3I-Q2HgB3lf.js → chunk-LCL6LL3I-BFGuOKN0.js} +1 -1
- package/web-shell/assets/{chunk-POPQ4Y6H-9tlPaKu-.js → chunk-POPQ4Y6H-GRHK6sdV.js} +1 -1
- package/web-shell/assets/{chunk-SVP7TREG-DkNdOHCU.js → chunk-SVP7TREG-DwDu6GqZ.js} +1 -1
- package/web-shell/assets/{chunk-XXDRQBXY-D0G-Dhfi.js → chunk-XXDRQBXY-RoNDjkIy.js} +1 -1
- package/web-shell/assets/classDiagram-DTDB5LWJ-pPPByLA7.js +1 -0
- package/web-shell/assets/classDiagram-v2-JRS7N3AN-pPPByLA7.js +1 -0
- package/web-shell/assets/{cose-bilkent-JH36ORCC-Ck0tHxul.js → cose-bilkent-JH36ORCC-CYNiiONE.js} +1 -1
- package/web-shell/assets/{cynefin-OW5HDTMX-a4-NTMHi.js → cynefin-OW5HDTMX-DC1_lDIG.js} +1 -1
- package/web-shell/assets/{cynefinDiagram-5FMLGOSQ-Pg41Zbf2.js → cynefinDiagram-5FMLGOSQ-D2VxKm2n.js} +1 -1
- package/web-shell/assets/{dagre-3AP2YEHR-DT_ZmqkF.js → dagre-3AP2YEHR-C4_BHzpM.js} +1 -1
- package/web-shell/assets/{diagram-S7CK7UJ4-hapdMOl1.js → diagram-S7CK7UJ4-BpAO4-Gv.js} +1 -1
- package/web-shell/assets/{diagram-UQ7AKVKN-YZ0nbk56.js → diagram-UQ7AKVKN-DqUsFdsX.js} +1 -1
- package/web-shell/assets/{diagram-VSXAHHWV-DA_yNbWy.js → diagram-VSXAHHWV-DcMXIYMy.js} +1 -1
- package/web-shell/assets/{diagram-VX7I27RA-DoULuCLT.js → diagram-VX7I27RA-I3nr09ex.js} +1 -1
- package/web-shell/assets/{diagram-Z3DM3KII-B5c9o9zL.js → diagram-Z3DM3KII-CN-gvsTo.js} +1 -1
- package/web-shell/assets/{docx-preview-BulxdBjs.js → docx-preview-31J6RsS0.js} +1 -1
- package/web-shell/assets/{ebnfDiagram-PWID7BFC-B5hgIg3m.js → ebnfDiagram-PWID7BFC-DOQvLWlM.js} +1 -1
- package/web-shell/assets/{erDiagram-SSCWMZ5O-BEfEPozi.js → erDiagram-SSCWMZ5O-Cb5ijFZh.js} +1 -1
- package/web-shell/assets/{flowDiagram-A5DVABFB-CQHNk92v.js → flowDiagram-A5DVABFB-BecqqjnZ.js} +1 -1
- package/web-shell/assets/{ganttDiagram-EL5Y4UJY-BabdVgIM.js → ganttDiagram-EL5Y4UJY-DWY5vzQl.js} +1 -1
- package/web-shell/assets/{gitGraphDiagram-WWUBYQGX-ujRZBFUo.js → gitGraphDiagram-WWUBYQGX-DqBnsZmZ.js} +1 -1
- package/web-shell/assets/{index-B9uXebIR.js → index-DDmiUW3b.js} +6 -6
- package/web-shell/assets/{index-DSZXdZnu.js → index-DabH7kHA.js} +1 -1
- package/web-shell/assets/{infoDiagram-RXCK75RN-CUHj9jJC.js → infoDiagram-RXCK75RN-MlotyOdT.js} +1 -1
- package/web-shell/assets/{ishikawaDiagram-5VMMS53U-CulW_q81.js → ishikawaDiagram-5VMMS53U-Daq_85C7.js} +1 -1
- package/web-shell/assets/{journeyDiagram-EYS64GPL-BR46CvRQ.js → journeyDiagram-EYS64GPL-OipivCxL.js} +1 -1
- package/web-shell/assets/{kanban-definition-3QL26DDD-HAoUqzFy.js → kanban-definition-3QL26DDD-zqaz7dLu.js} +1 -1
- package/web-shell/assets/{layout-DYLl7fyA.js → layout-Bi3msQMQ.js} +1 -1
- package/web-shell/assets/{linear-DPXABjDZ.js → linear-D4gPORvD.js} +1 -1
- package/web-shell/assets/{mermaid.core-Bi30Gi0n.js → mermaid.core-BUnytF7a.js} +6 -6
- package/web-shell/assets/{mindmap-definition-FBJOCRG2-B1_lUq4o.js → mindmap-definition-FBJOCRG2-B_X4iChu.js} +1 -1
- package/web-shell/assets/{pegDiagram-XKGWAZYB-Cy8tjJJC.js → pegDiagram-XKGWAZYB-z4wYBoBW.js} +1 -1
- package/web-shell/assets/{pieDiagram-E7YTZNPT-D6waLVVi.js → pieDiagram-E7YTZNPT-Dvyg6FYo.js} +1 -1
- package/web-shell/assets/{quadrantDiagram-AXDQQJYC--6ehi_FI.js → quadrantDiagram-AXDQQJYC-CJBWU2Dk.js} +1 -1
- package/web-shell/assets/{railroadDiagram-O6MQD6OU-BhLy40X4.js → railroadDiagram-O6MQD6OU-Dl_An1O0.js} +1 -1
- package/web-shell/assets/{requirementDiagram-EFPCY7ZU-BVNXTgNP.js → requirementDiagram-EFPCY7ZU-Tw8FwaYU.js} +1 -1
- package/web-shell/assets/{sankeyDiagram-P5KCCOFB-BHgTytxV.js → sankeyDiagram-P5KCCOFB-BCPCkbR0.js} +1 -1
- package/web-shell/assets/{sequenceDiagram-WJ2MYXX4-CgOsTvhu.js → sequenceDiagram-WJ2MYXX4-DDj7uFTG.js} +1 -1
- package/web-shell/assets/{sizeCapture-X5ZJPWSS-vCQBQ5FI.js → sizeCapture-X5ZJPWSS-B9eVSpKb.js} +1 -1
- package/web-shell/assets/{stateDiagram-HBIQ2CUA-DytMYRWJ.js → stateDiagram-HBIQ2CUA-Bf4BZP_V.js} +1 -1
- package/web-shell/assets/stateDiagram-v2-4QOOHH4V-BPJi6Gre.js +1 -0
- package/web-shell/assets/{swimlanes-XN3QIQJK-CTGnifOP.js → swimlanes-XN3QIQJK-dyTWsZFj.js} +1 -1
- package/web-shell/assets/swimlanesDiagram-VK2B7HYN-Bw4NRtJQ.js +8 -0
- package/web-shell/assets/{timeline-definition-24CTP7MA-DEJ1cbn2.js → timeline-definition-24CTP7MA-DVl1A4uL.js} +1 -1
- package/web-shell/assets/{vennDiagram-4TSXK5OY-K1e4SjS0.js → vennDiagram-4TSXK5OY-Boosxy9D.js} +1 -1
- package/web-shell/assets/{wardleyDiagram-VM6X3IG4-DEX-GkRp.js → wardleyDiagram-VM6X3IG4-C6wlY8jy.js} +1 -1
- package/web-shell/assets/{xychartDiagram-S5SC5T6Z-B6wYXreH.js → xychartDiagram-S5SC5T6Z-CkzZe3ro.js} +1 -1
- package/web-shell/index.html +1 -1
- package/web-shell/sw.js +1 -1
- package/web-shell/assets/channel-CLVrtVFX.js +0 -1
- package/web-shell/assets/classDiagram-DTDB5LWJ-Df2T70oB.js +0 -1
- package/web-shell/assets/classDiagram-v2-JRS7N3AN-Df2T70oB.js +0 -1
- package/web-shell/assets/stateDiagram-v2-4QOOHH4V-CcjUJGng.js +0 -1
- package/web-shell/assets/swimlanesDiagram-VK2B7HYN-Dt8NvQfX.js +0 -8
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Force strict mode and setup for ESM
|
|
2
2
|
"use strict";
|
|
3
|
-
import{flushOutput}from"./chunk-VURTGFJP.js";import{escapeAnsiCtrlCodes,sanitizeTerminalText as sanitizeTerminalText2,stringWidth,truncateToWidth}from"./chunk-64CA3W6G.js";import{CONTAINER_HOME,containerEnv,trustedProcessEnv}from"./chunk-R4VUFIDQ.js";import{memoryCommand}from"./chunk-UVQUQNCA.js";import{currentPidNamespace,isOwnInterfaceAddress,isProcessAlive,readDaemonDiscoveries,readDaemonToken,removeDaemonDiscovery,removeDaemonToken,removeStaleDaemonTokens,resolveDaemonDiscoveryDir,writeDaemonToken}from"./chunk-XIFNBULA.js";import{parseJoinLink,serveCommand}from"./chunk-J2TJL2F4.js";import{sessionSendMcpCommand}from"./chunk-OX4QMNUW.js";import{batchCommand,resolveProxy,resolveProxyUrl}from"./chunk-THNEKTPK.js";import{parseApprovalModeValue}from"./chunk-6BSQDDUG.js";import{readSshWorkspace}from"./chunk-R7TNFTT4.js";import{resolvePath}from"./chunk-G2SXDY2E.js";import{isLoopbackBind}from"./chunk-3SHHYK7S.js";import{AGENT_HOST_SESSION_SOURCE_TYPE,AGENT_SESSION_SOURCE_TYPE}from"./chunk-DHYCGKLG.js";import{normalizeSkillNames,resolveSkillSettings}from"./chunk-AVCBF5WL.js";import{isValidSessionId,normalizeSessionIdForLookup}from"./chunk-LGFF5PJA.js";import{DaemonClient,DaemonSessionClient,normalizeDaemonEvent,sanitizeTerminalText}from"./chunk-CCTQPUAG.js";import{canonicalizeWorkspace}from"./chunk-L5UULTGF.js";import{ChannelLoopMcpWorkerHost,MAX_CHANNEL_STARTUP_FAILURES,MAX_CHANNEL_STARTUP_FAILURE_CHANNEL_LENGTH,MAX_CHANNEL_STARTUP_FAILURE_CODE_LENGTH,MAX_CHANNEL_STARTUP_FAILURE_MESSAGE_LENGTH,isChannelStartupReportAckMessage,isChannelWebhookTaskMessage}from"./chunk-AVJJ62OC.js";import{CHANNEL_DAEMON_WORKER_SENTINEL,CHANNEL_WORKER_HEARTBEAT_INTERVAL_MS,MANAGED_RUNTIME_BROKER_TOKEN_ENV,QWEN_DAEMON_TOKEN_ENV,QWEN_DAEMON_URL_ENV,QWEN_DAEMON_WORKSPACE_ENV,QWEN_SERVER_TOKEN_ENV}from"./chunk-SPYNWVDZ.js";import{normalizeWorkerDiagnostic,sanitizeWorkerDiagnostic}from"./chunk-XSG7HKSN.js";import{normalizeServeChannelSelection}from"./chunk-KOJ7WZ63.js";import{ChannelDeliveryError,MAX_CHANNEL_DELIVERIES_IN_FLIGHT,isChannelDeliveryError,isChannelDeliveryMessage}from"./chunk-O6ZQAVRG.js";import{EXTERNAL_TOOL_GUARD_TOKEN_ENV}from"./chunk-NIEO2TBE.js";import{redactLogCredentials}from"./chunk-CFTFKWPW.js";import{CHANNEL_WORKER_KILL_GRACE_MS,CHANNEL_WORKER_STOP_GRACE_MS}from"./chunk-E4UMXDOZ.js";import{pidFilePath,readServiceInfo,removeServiceInfo,signalService,waitForExit,writeServiceInfo}from"./chunk-BZAH4DTS.js";import{channelLoopPath,createChannel,daemonChannelLoopPath,daemonChannelStateDir,daemonObservedContactsPath,daemonSessionRoutesPath,loadChannelsConfig,loadChannelsFromExtensions,parseConfiguredChannels,registerBackgroundResponseRelay,registerPermissionRelay,registerSessionCleanup,registerToolCallDispatch,resolveChannelLocale,selectFirstModel,sessionsPath}from"./chunk-BVSTV4JM.js";import{parseChannelConfig}from"./chunk-FJUXMWZW.js";import{findCliEntryPath}from"./chunk-W7V6J2VV.js";import{ManagedEmailAdapter,createManagedEmailDeps}from"./chunk-4BFQ7QQC.js";import{listCommand}from"./chunk-B6T4ESBM.js";import{getExtensionManager,requestChoicePluginNonInteractive,requestConsentNonInteractive,requestConsentOrFail,resolveExtensionCommandScope}from"./chunk-W4P2EN3V.js";import{CUSTOM_SANDBOX_IMAGE_ENV_VAR}from"./chunk-HVS6V2UZ.js";import{loadSandboxConfig}from"./chunk-BP62QEKY.js";import{createExecutionSandboxPolicy}from"./chunk-IHXJOVAH.js";import{DEFAULT_BASE_URL,buildHeaders,clearAccount,loadAccount,saveAccount}from"./chunk-XZZBAJQS.js";import{AcpBridge,ChannelLoopScheduler,ChannelLoopStore,DaemonChannelBridge,PairingStore,SessionRouter,isChannelProactiveDeliveryError,sanitizeLogText,sanitizePromptText}from"./chunk-44WSAMWG.js";import{assembleMcpServers,getPendingGatedMcpServers,mcpCommand}from"./chunk-WRJ3PMDZ.js";import{loadSettings}from"./chunk-2B3W7IQY.js";import{getSettingsSchema}from"./chunk-FUUPMVD2.js";import{detectSystemLanguage,getCurrentLanguage,initializeI18n,resolveLanguage,resolveLanguageSetting,t}from"./chunk-EZMTX4EU.js";import{isFileSourcedEnvKey}from"./chunk-ABUS7DNN.js";import{resolveAcpChannelFallback,scrubAndReportInheritedLoaderEnv}from"./chunk-HZ4Y7DH5.js";import{getAuthTypeFromEnv,resolveCliGenerationConfig}from"./chunk-AUI7WVSU.js";import{getErrorMessage as getErrorMessage2}from"./chunk-JQGGILML.js";import{isWorkspaceTrusted}from"./chunk-LGBGUITT.js";import{MAX_CONTROLLER_LABEL_CHARS,NativeLspClient,NativeLspService,PeerControllerError,addChannelMemoryEntries,addPeerController,clearChannelMemory,findOutputStyle,getChannelMemoryRevision,getPeerControllerRegistryPath,listChannelMemoryEntries,listPeerControllers,loadOutputStyleCatalog,readChannelMemory,removeChannelMemoryEntries,removePeerController,updateChannelMemoryEntry}from"./chunk-6JFC5M6B.js";import{hideBin,yargs_default}from"./chunk-SEQAVABL.js";import{getCliVersion}from"./chunk-J4TFGZ4A.js";import{getPackageJson}from"./chunk-O4EDHV64.js";import{BWRAP_MIGRATION_MESSAGE,require_strip_json_comments,stripUtf8Bom,validateExecutionSandboxSelection}from"./chunk-DOLUT3XC.js";import{isFullyQualifiedPath}from"./chunk-PTHIQ7ZN.js";import{Config,ExtensionManager,FileDiscoveryService,GOAL_MAX_ACTIVE_MINUTES_CAP,GOAL_MAX_TURNS_CAP,GOAL_TOKEN_BUDGET_CAP,MAX_SUBAGENT_DEPTH_LIMIT,SessionService,SshExecutionEnvironment,checkForExtensionUpdate,getScopedEnvContents,ideContextStore,isExtensionCommittedWithWarningsError,isGatedMcpScope,isLoopProtectionMode,isSafeModeEnv,isToolEnabled,loadServerHierarchicalMemory,nextFireTime,parseCron,parseInstallSource,promptForSetting,updateSetting}from"./chunk-LIIMQ4DI.js";import{external_exports}from"./chunk-TWP72VRH.js";import{describeSessionKind,listLiveSessions}from"./chunk-BYU42MLK.js";import{isSameProcess}from"./chunk-5LZ2DPLH.js";import{resolveExtensionTelemetryProxy,resolveTelemetrySettings,resolveUsageStatisticsEnabled}from"./chunk-CMLAE3UB.js";import{parsePositiveIntegerEnv}from"./chunk-BG67XABA.js";import{buildModelIdContext,resolveModelId}from"./chunk-BEKROCWN.js";import{isBareMode,isTruthy}from"./chunk-D7XCQWP2.js";import{BUILT_IN_OUTPUT_STYLES}from"./chunk-OV3EBH6J.js";import{findGitRoot}from"./chunk-EBMCWXGZ.js";import{require_proper_lockfile}from"./chunk-YIW3H46P.js";import{getJsInterpreterCommand}from"./chunk-WGNF7FPC.js";import{resolveBundleDir}from"./chunk-4NPYOXJO.js";import{isInternalSecretEnvVar}from"./chunk-GRW3GBXN.js";import{validateModelProvidersConfig}from"./chunk-OVPEAKOQ.js";import{addDaemonRequestAttribute}from"./chunk-VTDSLBET.js";import{Mutex}from"./chunk-HDGTWJ24.js";import{getAllMemoryFilenames,setMemoryFilename}from"./chunk-Y6HHV4LC.js";import{DEFAULT_QWEN_EMBEDDING_MODEL}from"./chunk-OCVRMNEQ.js";import{isTlsVerificationDisabled}from"./chunk-ZZZAYAJW.js";import{recordChannelMemoryRecallMetrics,redactUrlCredentials}from"./chunk-XHV5HLJS.js";import{atomicWriteFileSync,atomicWriteJSON}from"./chunk-BMHYEQTI.js";import{DEFAULT_COMMAND,DEFAULT_COMMAND_DESC,DEFAULT_COMMAND_OPTIONS,QUERY_POSITIONAL,TOP_LEVEL_DEPRECATED_OPTIONS,TOP_LEVEL_GLOBAL_OPTIONS,TOP_LEVEL_USAGE}from"./chunk-FUK4Y5AJ.js";import{ignoreBrokenPipe,writeStderrLine,writeStderrLineSafe,writeStdoutLine,writeStdoutLineSafe}from"./chunk-SLPJ4OII.js";import{stripAnsiAndControl}from"./chunk-4YLXNRRH.js";import{SchemaValidator}from"./chunk-SVAPAMMG.js";import{AGENT_HOST_TOOL_NAMES,ToolNames}from"./chunk-SBZFGYYS.js";import{createDebugLogger}from"./chunk-JAUJI56S.js";import{Storage}from"./chunk-EPODBRBP.js";import{getProjectHash}from"./chunk-OKN3Z5C5.js";import{FatalConfigError,getErrorMessage,isNodeError}from"./chunk-XYB7GC5U.js";import{init_esbuild_shims}from"./chunk-VKDAXTCZ.js";import{__name,__toESM}from"./chunk-KBWJGX7I.js";init_esbuild_shims();function isInteractiveInvocation(args,stdinIsTTY=process.stdin.isTTY??false){return Boolean(args.promptInteractive||!args.query&&!args.prompt&&stdinIsTTY)}__name(isInteractiveInvocation,"isInteractiveInvocation");init_esbuild_shims();function normalizeDisabledToolList(raw){if(!Array.isArray(raw))return[];const out=[];const seen=new Set;for(const entry of raw){if(typeof entry!=="string")continue;const trimmed=entry.trim();if(!trimmed||seen.has(trimmed))continue;seen.add(trimmed);out.push(trimmed)}return out}__name(normalizeDisabledToolList,"normalizeDisabledToolList");init_esbuild_shims();import{EventEmitter}from"node:events";var appEvents=new EventEmitter;init_esbuild_shims();var SECOND=1e3;var MAX_TIMEOUT_MS=2147483647;var MAX_WALL_TIME_SECONDS=Math.floor(MAX_TIMEOUT_MS/SECOND);var MIN_WALL_TIME_SECONDS=1;function parseDurationSeconds(input){const trimmed=input.trim().toLowerCase();if(trimmed.length===0){throw new Error("Invalid duration: empty string")}const match=/^(\d+(?:\.\d+)?)\s*(ms|s|m|h)?$/.exec(trimmed);if(!match){throw new Error(`Invalid duration "${input}". Use a positive number of seconds (e.g. 90) or a duration with unit (e.g. 30s, 5m, 1h, 500ms).`)}const value=Number.parseFloat(match[1]);const unit=match[2]??"s";let seconds;switch(unit){case"ms":seconds=value/1e3;break;case"s":seconds=value;break;case"m":seconds=value*60;break;case"h":seconds=value*3600;break;default:throw new Error(`Invalid duration unit "${unit}"`)}if(seconds<=0){throw new Error(`Invalid duration "${input}": must be greater than zero. Omit the flag entirely if you don't want a wall-clock budget.`)}if(seconds<MIN_WALL_TIME_SECONDS){const hint=/ms\b/i.test(trimmed)?` (probably a typo \u2014 did you mean ${input.replace(/ms\b/i,"s")}?)`:"";throw new Error(`Invalid duration "${input}": below the ${MIN_WALL_TIME_SECONDS}s minimum${hint}. Sub-second wall-clock budgets fire before any model round-trip can complete.`)}if(seconds>MAX_WALL_TIME_SECONDS){throw new Error(`Invalid duration "${input}": exceeds the maximum supported wall-clock budget (${MAX_WALL_TIME_SECONDS}s \u2248 24 days). Use a smaller value.`)}return seconds}__name(parseDurationSeconds,"parseDurationSeconds");function validateMaxWallTimeSetting(value){if(value===-1)return-1;if(!Number.isFinite(value)){throw new Error(`model.maxWallTimeSeconds must be a finite number; got ${value}.`)}if(value<=0){throw new Error(`model.maxWallTimeSeconds must be > 0 (or -1 for unlimited); got ${value}. Use -1 to disable, not 0.`)}if(value<MIN_WALL_TIME_SECONDS){throw new Error(`model.maxWallTimeSeconds ${value} is below the ${MIN_WALL_TIME_SECONDS}s minimum. Sub-second budgets fire before any model round-trip can complete.`)}if(value>MAX_WALL_TIME_SECONDS){throw new Error(`model.maxWallTimeSeconds ${value} exceeds the maximum supported wall-clock budget (${MAX_WALL_TIME_SECONDS}s \u2248 24 days).`)}return value}__name(validateMaxWallTimeSetting,"validateMaxWallTimeSetting");function validateGoalTokenBudget(value){if(value===-1)return-1;if(typeof value!=="number"||!Number.isFinite(value)){throw new Error(`model.goalTokenBudget must be a finite number; got ${String(value)}.`)}if(!Number.isInteger(value)){throw new Error(`model.goalTokenBudget must be an integer (or -1 for unlimited); got ${value}.`)}if(value<=0){throw new Error(`model.goalTokenBudget must be > 0 (or -1 for unlimited); got ${value}. Use -1 to disable, not 0.`)}if(value>GOAL_TOKEN_BUDGET_CAP){throw new Error(`model.goalTokenBudget ${value} exceeds the supported ceiling (${GOAL_TOKEN_BUDGET_CAP}). Use a smaller value or -1 for unlimited.`)}return value}__name(validateGoalTokenBudget,"validateGoalTokenBudget");function validateGoalCadenceSetting(key,unit,cap,value){if(value===-1)return-1;if(typeof value!=="number"||!Number.isFinite(value)){throw new Error(`${key} must be a finite number; got ${String(value)}.`)}if(!Number.isInteger(value)){throw new Error(`${key} must be an integer number of ${unit} (or -1 for no ceiling); got ${value}.`)}if(value<=0){throw new Error(`${key} must be > 0 (or -1 for no ceiling); got ${value}. Use -1 to disable, not 0.`)}if(value>cap){throw new Error(`${key} ${value} exceeds the supported ceiling (${cap} ${unit}). Use a smaller value or -1 for no ceiling.`)}return value}__name(validateGoalCadenceSetting,"validateGoalCadenceSetting");function validateGoalMaxTurns(value){return validateGoalCadenceSetting("model.goalMaxTurns","turns",GOAL_MAX_TURNS_CAP,value)}__name(validateGoalMaxTurns,"validateGoalMaxTurns");function validateGoalMaxActiveMinutes(value){return validateGoalCadenceSetting("model.goalMaxActiveMinutes","minutes",GOAL_MAX_ACTIVE_MINUTES_CAP,value)}__name(validateGoalMaxActiveMinutes,"validateGoalMaxActiveMinutes");var MAX_TOOL_CALLS=1e6;function validateMaxToolCalls(value){if(value===-1)return-1;if(!Number.isFinite(value)){throw new Error(`maxToolCalls must be a finite number; got ${value}.`)}if(!Number.isInteger(value)){throw new Error(`maxToolCalls must be an integer (or -1 for unlimited); got ${value}.`)}if(value<0){throw new Error(`maxToolCalls must be >= 0 (or -1 for unlimited); got ${value}. Use -1 to disable, not a negative number.`)}if(value>MAX_TOOL_CALLS){throw new Error(`maxToolCalls ${value} exceeds the supported ceiling (${MAX_TOOL_CALLS}). Likely a typo \u2014 use a smaller value or -1 for unlimited.`)}return value}__name(validateMaxToolCalls,"validateMaxToolCalls");var RunBudgetEnforcer=class{static{__name(this,"RunBudgetEnforcer")}maxWallTimeSeconds;maxToolCalls;abortController;wallTimer=null;toolCallCount=0;exceeded=null;constructor(opts,abortController){this.maxWallTimeSeconds=opts.maxWallTimeSeconds??-1;this.maxToolCalls=opts.maxToolCalls??-1;this.abortController=abortController}start(){if(this.wallTimer!==null)return;if(this.maxWallTimeSeconds<=0)return;this.wallTimer=setTimeout(()=>{this.markExceeded({kind:"wall-time",limit:this.maxWallTimeSeconds,observed:this.maxWallTimeSeconds,message:`Run aborted: wall-clock budget of ${this.maxWallTimeSeconds}s exceeded (--max-wall-time).`})},this.maxWallTimeSeconds*SECOND);this.wallTimer.unref?.()}tickToolCall(){this.toolCallCount+=1;if(this.maxToolCalls>=0&&this.toolCallCount>this.maxToolCalls){this.markExceeded({kind:"tool-calls",limit:this.maxToolCalls,observed:this.toolCallCount,message:`Run aborted: tool-call budget of ${this.maxToolCalls} exceeded (--max-tool-calls); observed ${this.toolCallCount}.`})}}getExceeded(){return this.exceeded}stop(){if(this.wallTimer!==null){clearTimeout(this.wallTimer);this.wallTimer=null}}markExceeded(record){if(this.exceeded!==null)return;if(this.abortController.signal.aborted)return;this.exceeded=record;this.stop();this.abortController.abort()}};init_esbuild_shims();init_esbuild_shims();init_esbuild_shims();function normalizeScope(scope){return scope==="project"||scope==="workspace"?"project":"user"}__name(normalizeScope,"normalizeScope");async function handleInstall(args){const scope=normalizeScope(args.scope);let extensionManager;try{const installMetadata=await parseInstallSource(args.source);if(installMetadata.type!=="git"&&installMetadata.type!=="github-release"&&installMetadata.type!=="npm"&&installMetadata.type!=="archive-url"){if(args.ref||args.autoUpdate){throw new Error(t("--ref and --auto-update are not applicable for marketplace extensions."))}}if((installMetadata.type==="npm"||installMetadata.type==="archive-url")&&args.ref){throw new Error(t(installMetadata.type==="npm"?"--ref is not applicable for npm extensions. Use @version suffix instead (e.g. @scope/package@1.2.0).":"--ref is not applicable for archive URL extensions."))}if(installMetadata.type!=="npm"&&args.registry){throw new Error(t("--registry is only applicable for npm extensions."))}if(installMetadata.type==="npm"&&args.registry){installMetadata.registryUrl=args.registry}const requestConsent=args.consent?()=>Promise.resolve():requestConsentOrFail.bind(null,requestConsentNonInteractive);const workspaceDir=process.cwd();const settings=loadSettings(workspaceDir).merged;extensionManager=new ExtensionManager({workspaceDir,locale:getCurrentLanguage(),isWorkspaceTrusted:isWorkspaceTrusted(settings).isTrusted??true,requestConsent,requestChoicePlugin:requestChoicePluginNonInteractive,usageStatisticsEnabled:resolveUsageStatisticsEnabled(settings.privacy?.usageStatisticsEnabled),proxy:resolveExtensionTelemetryProxy(settings.proxy)});await extensionManager.refreshCache();const extension=await extensionManager.installExtension({...installMetadata,ref:args.ref,autoUpdate:args.autoUpdate,allowPreRelease:args.allowPreRelease},requestConsent,void 0,workspaceDir,void 0,scope==="project"?{scope:"workspace",workspacePath:workspaceDir}:{scope:"user"});if(args.scope){try{extensionManager.setExtensionScope(extension.name,scope)}catch(scopeError){writeStderrLine(`Warning: Extension installed, but failed to save scope preference: ${getErrorMessage2(scopeError)}`)}}writeStdoutLine(scope==="project"?t('Extension "{{name}}" installed successfully and enabled for the current workspace.',{name:extension.name}):t('Extension "{{name}}" installed successfully and enabled.',{name:extension.name}))}catch(error){if(isExtensionCommittedWithWarningsError(error)){if(args.scope&&extensionManager){try{extensionManager.setExtensionScope(error.identity.name,scope)}catch(scopeError){writeStderrLine(`Warning: Extension installed, but failed to save scope preference: ${getErrorMessage2(scopeError)}`)}}writeStderrLine(`Warning: ${getErrorMessage2(error)}`);return}writeStderrLine(getErrorMessage2(error));process.exit(1)}}__name(handleInstall,"handleInstall");var installCommand={command:"install <source>",describe:t("Installs an extension from a git repository URL, local path or archive, archive URL, scoped npm package (@scope/name), or claude marketplace (marketplace-url:plugin-name)."),builder:__name(yargs=>yargs.positional("source",{describe:t("The github URL, local path or archive, archive URL, or marketplace source (marketplace-url:plugin-name) of the extension to install."),type:"string",demandOption:true}).option("ref",{describe:t("The git ref to install from."),type:"string"}).option("auto-update",{describe:t("Enable auto-update for this extension."),type:"boolean"}).option("pre-release",{describe:t("Enable pre-release versions for this extension."),type:"boolean"}).option("registry",{describe:t("Custom npm registry URL (only for npm extensions)."),type:"string"}).option("consent",{describe:t("Acknowledge the security risks of installing an extension and skip the confirmation prompt."),type:"boolean",default:false}).option("scope",{describe:t('The scope to install the extension in: "user" (global, default) or "project" (current workspace only).'),type:"string",choices:["user","project","workspace"]}).check(argv=>{if(!argv.source){throw new Error(t("The source argument must be provided."))}return true}),"builder"),handler:__name(async argv=>{await handleInstall({source:argv["source"],ref:argv["ref"],autoUpdate:argv["auto-update"],allowPreRelease:argv["pre-release"],consent:argv["consent"],registry:argv["registry"],scope:argv["scope"]})},"handler")};init_esbuild_shims();async function handleUninstall(args){try{const workspaceDir=process.cwd();const settings=loadSettings(workspaceDir).merged;const extensionManager=new ExtensionManager({workspaceDir,locale:getCurrentLanguage(),requestConsent:requestConsentOrFail.bind(null,requestConsentNonInteractive),isWorkspaceTrusted:isWorkspaceTrusted(settings).isTrusted??true,usageStatisticsEnabled:resolveUsageStatisticsEnabled(settings.privacy?.usageStatisticsEnabled),proxy:resolveExtensionTelemetryProxy(settings.proxy)});await extensionManager.refreshCache();const result=await extensionManager.uninstallExtension(args.name,false);writeStdoutLine(t('Extension "{{name}}" successfully uninstalled.',{name:args.name}));for(const warning of result.warnings??[]){writeStderrLine(`${warning.code}: ${warning.error}`)}}catch(error){writeStderrLine(getErrorMessage2(error));process.exit(1)}}__name(handleUninstall,"handleUninstall");var uninstallCommand={command:"uninstall <name>",describe:t("Uninstalls an extension."),builder:__name(yargs=>yargs.positional("name",{describe:t("The name or source path of the extension to uninstall."),type:"string"}).check(argv=>{if(!argv.name){throw new Error(t("Please include the name of the extension to uninstall as a positional argument."))}return true}),"builder"),handler:__name(async argv=>{await handleUninstall({name:argv["name"]})},"handler")};init_esbuild_shims();var updateOutput=__name(info=>t('Extension "{{name}}" successfully updated: {{oldVersion}} \u2192 {{newVersion}}.',{name:info.name,oldVersion:info.originalVersion,newVersion:info.updatedVersion}),"updateOutput");var updateWarningOutput=__name(info=>(info.warnings??[]).map(warning=>t('Extension "{{name}}" updated with warning {{code}}: {{error}}',{name:info.name,code:warning.code,error:warning.error})).join("\n"),"updateWarningOutput");async function handleUpdate(args){const extensionManager=await getExtensionManager();const extensions=extensionManager.getLoadedExtensions();if(args.name){try{const extension=extensions.find(extension2=>extension2.name===args.name);if(!extension){writeStdoutLine(t('Extension "{{name}}" not found.',{name:args.name}));return}if(!extension.installMetadata){writeStdoutLine(t('Unable to install extension "{{name}}" due to missing install metadata',{name:args.name}));return}const updateState=await checkForExtensionUpdate(extension,extensionManager);if(updateState!=="update available"){writeStdoutLine(t('Extension "{{name}}" is already up to date.',{name:args.name}));return}const updatedExtensionInfo=await extensionManager.updateExtension(extension,updateState,()=>{});if(updatedExtensionInfo.originalVersion!==updatedExtensionInfo.updatedVersion){writeStdoutLine(t('Extension "{{name}}" successfully updated: {{oldVersion}} \u2192 {{newVersion}}.',{name:args.name,oldVersion:updatedExtensionInfo.originalVersion,newVersion:updatedExtensionInfo.updatedVersion}))}else{writeStdoutLine(t('Extension "{{name}}" is already up to date.',{name:args.name}))}const warnings=updateWarningOutput(updatedExtensionInfo);if(warnings)writeStderrLine(warnings)}catch(error){writeStderrLine(getErrorMessage2(error))}}if(args.all){try{const extensionState=new Map;await extensionManager.checkForAllExtensionUpdates((extensionName,state)=>{extensionState.set(extensionName,{status:state,processed:true})});let updateInfos=await extensionManager.updateAllUpdatableExtensions(extensionState,()=>{});updateInfos=updateInfos.filter(info=>info.originalVersion!==info.updatedVersion);if(updateInfos.length===0){writeStdoutLine(t("No extensions to update."));return}writeStdoutLine(updateInfos.map(info=>updateOutput(info)).join("\n"));const warnings=updateInfos.map(info=>updateWarningOutput(info)).filter(Boolean).join("\n");if(warnings)writeStderrLine(warnings)}catch(error){writeStderrLine(getErrorMessage2(error))}}}__name(handleUpdate,"handleUpdate");var updateCommand={command:"update [<name>] [--all]",describe:t("Updates all extensions or a named extension to the latest version."),builder:__name(yargs=>yargs.positional("name",{describe:t("The name of the extension to update."),type:"string"}).option("all",{describe:t("Update all extensions."),type:"boolean"}).conflicts("name","all").check(argv=>{if(!argv.all&&!argv.name){throw new Error(t("Either an extension name or --all must be provided"))}return true}),"builder"),handler:__name(async argv=>{await handleUpdate({name:argv["name"],all:argv["all"]})},"handler")};init_esbuild_shims();async function handleDisable(args){const extensionManager=await getExtensionManager();try{const scope=resolveExtensionCommandScope(args.scope);const result=await extensionManager.disableExtension(args.name,scope);writeStdoutLine(t('Extension "{{name}}" successfully disabled for scope "{{scope}}".',{name:args.name,scope:args.scope||"User"}));for(const warning of result.warnings??[]){writeStderrLine(`${warning.code}: ${warning.error}`)}}catch(error){writeStderrLine(getErrorMessage2(error));process.exit(1)}}__name(handleDisable,"handleDisable");var disableCommand={command:"disable [--scope] <name>",describe:t("Disables an extension."),builder:__name(yargs=>yargs.positional("name",{describe:t("The name of the extension to disable."),type:"string"}).option("scope",{describe:t("The scope to disable the extension in."),type:"string",default:"User"}).check(argv=>{resolveExtensionCommandScope(argv.scope);return true}),"builder"),handler:__name(async argv=>{await handleDisable({name:argv["name"],scope:argv["scope"]})},"handler")};init_esbuild_shims();async function handleEnable(args){const extensionManager=await getExtensionManager();try{const scope=resolveExtensionCommandScope(args.scope);const result=await extensionManager.enableExtension(args.name,scope);if(args.scope){writeStdoutLine(t('Extension "{{name}}" successfully enabled for scope "{{scope}}".',{name:args.name,scope:args.scope}))}else{writeStdoutLine(t('Extension "{{name}}" successfully enabled in all scopes.',{name:args.name}))}for(const warning of result.warnings??[]){writeStderrLine(`${warning.code}: ${warning.error}`)}}catch(error){throw new FatalConfigError(getErrorMessage(error))}}__name(handleEnable,"handleEnable");var enableCommand={command:"enable [--scope] <name>",describe:t("Enables an extension."),builder:__name(yargs=>yargs.positional("name",{describe:t("The name of the extension to enable."),type:"string"}).option("scope",{describe:t("The scope to enable the extension in. If not set, will be enabled in all scopes."),type:"string"}).check(argv=>{resolveExtensionCommandScope(argv.scope);return true}),"builder"),handler:__name(async argv=>{await handleEnable({name:argv["name"],scope:argv["scope"]})},"handler")};init_esbuild_shims();async function handleLink(args){try{const installMetadata={source:args.path,type:"link"};const extensionManager=await getExtensionManager();const extension=await extensionManager.installExtension(installMetadata,requestConsentOrFail.bind(null,requestConsentNonInteractive));if(!extension){writeStdoutLine(t("Link extension failed to install."));return}writeStdoutLine(t('Extension "{{name}}" linked successfully and enabled.',{name:extension.name}))}catch(error){if(isExtensionCommittedWithWarningsError(error)){writeStderrLine(`Warning: ${getErrorMessage2(error)}`);return}writeStderrLine(getErrorMessage2(error));process.exit(1)}}__name(handleLink,"handleLink");var linkCommand={command:"link <path>",describe:t("Links an extension from a local path. Updates made to the local path will always be reflected."),builder:__name(yargs=>yargs.positional("path",{describe:t("The name of the extension to link."),type:"string"}).check(_=>true),"builder"),handler:__name(async argv=>{await handleLink({path:argv["path"]})},"handler")};init_esbuild_shims();import{access,cp,mkdir,readdir,writeFile}from"node:fs/promises";import{join,basename}from"node:path";var EXAMPLES_PATH=join(resolveBundleDir(import.meta.url),"examples");async function pathExists(path9){try{await access(path9);return true}catch(_e){return false}}__name(pathExists,"pathExists");async function createDirectory(path9){if(await pathExists(path9)){throw new Error(`Path already exists: ${path9}`)}await mkdir(path9,{recursive:true})}__name(createDirectory,"createDirectory");async function copyDirectory(template,path9){await createDirectory(path9);const examplePath=join(EXAMPLES_PATH,template);const entries=await readdir(examplePath,{withFileTypes:true});for(const entry of entries){const srcPath=join(examplePath,entry.name);const destPath=join(path9,entry.name);await cp(srcPath,destPath,{recursive:true})}}__name(copyDirectory,"copyDirectory");async function handleNew(args){try{if(args.template){await copyDirectory(args.template,args.path);writeStdoutLine(`Successfully created new extension from template "${args.template}" at ${args.path}.`)}else{await createDirectory(args.path);const extensionName=basename(args.path);const manifest={name:extensionName,version:"1.0.0"};await writeFile(join(args.path,"qwen-extension.json"),JSON.stringify(manifest,null,2));writeStdoutLine(`Successfully created new extension at ${args.path}.`)}writeStdoutLine(`You can install this using "qwen extensions link ${args.path}" to test it out.`)}catch(error){writeStderrLine(getErrorMessage2(error));throw error}}__name(handleNew,"handleNew");async function getBoilerplateChoices(){try{const entries=await readdir(EXAMPLES_PATH,{withFileTypes:true});return{choices:entries.filter(entry=>entry.isDirectory()).map(entry=>entry.name),readFailed:false}}catch(e){const isMissing=isNodeError(e)&&e.code==="ENOENT";if(!isMissing){writeStderrLine(`Warning: failed to read extension templates: ${getErrorMessage2(e)}`)}return{choices:[],readFailed:!isMissing}}}__name(getBoilerplateChoices,"getBoilerplateChoices");var newCommand={command:"new <path> [template]",describe:"Create a new extension from a boilerplate example.",builder:__name(async yargs=>{const{choices,readFailed}=await getBoilerplateChoices();return yargs.positional("path",{describe:"The path to create the extension in.",type:"string"}).positional("template",{describe:"The boilerplate template to use.",type:"string",choices:choices.length>0?choices:void 0}).check(argv=>{if(argv["template"]&&choices.length===0){throw new Error(readFailed?"Extension templates could not be read in this installation.":"No boilerplate templates are available in this installation.")}return true})},"builder"),handler:__name(async args=>{await handleNew({path:args["path"],template:args["template"]})},"handler")};init_esbuild_shims();var setCommand={command:"set [--scope] <name> <setting>",describe:t("Set a specific setting for an extension."),builder:__name(yargs=>yargs.positional("name",{describe:t("Name of the extension to configure."),type:"string",demandOption:true}).positional("setting",{describe:t("The setting to configure (name or env var)."),type:"string",demandOption:true}).option("scope",{describe:t("The scope to set the setting in."),type:"string",choices:["user","workspace"],default:"user"}),"builder"),handler:__name(async args=>{const{name,setting,scope}=args;const extensionManager=await getExtensionManager();if(!extensionManager)return;const extensions=extensionManager.getLoadedExtensions();if(!extensions||extensions.length===0)return;const extension=extensions.find(e=>e.name===name);if(!extension){writeStdoutLine(t('Extension "{{name}}" not found.',{name}));return}await updateSetting(extension.config,extension.id,setting,promptForSetting,scope)},"handler")};var listCommand2={command:"list <name>",describe:t("List all settings for an extension."),builder:__name(yargs=>yargs.positional("name",{describe:t("Name of the extension."),type:"string",demandOption:true}),"builder"),handler:__name(async args=>{const{name}=args;const extensionManager=await getExtensionManager();if(!extensionManager)return;const extensions=extensionManager.getLoadedExtensions();if(!extensions||extensions.length===0)return;const extension=extensions.find(e=>e.name===name);if(!extension){writeStdoutLine(t('Extension "{{name}}" not found.',{name}));return}if(!extension||!extension.settings||extension.settings.length===0){writeStdoutLine(t('Extension "{{name}}" has no settings to configure.',{name}));return}const userSettings=await getScopedEnvContents(extension.config,extension.id,"user");const workspaceSettings=await getScopedEnvContents(extension.config,extension.id,"workspace");const mergedSettings={...userSettings,...workspaceSettings};writeStdoutLine(t('Settings for "{{name}}":',{name}));for(const setting of extension.settings){const value=mergedSettings[setting.envVar];let displayValue;let scopeInfo="";if(workspaceSettings[setting.envVar]!==void 0){scopeInfo=" "+t("(workspace)")}else if(userSettings[setting.envVar]!==void 0){scopeInfo=" "+t("(user)")}if(value===void 0){displayValue=t("[not set]")}else if(setting.sensitive){displayValue=t("[value stored in keychain]")}else{displayValue=value}writeStdoutLine(`
|
|
3
|
+
import{flushOutput}from"./chunk-VURTGFJP.js";import{escapeAnsiCtrlCodes,sanitizeTerminalText as sanitizeTerminalText2,stringWidth,truncateToWidth}from"./chunk-64CA3W6G.js";import{CONTAINER_HOME,containerEnv,trustedProcessEnv}from"./chunk-R4VUFIDQ.js";import{memoryCommand}from"./chunk-UZI3IA27.js";import{currentPidNamespace,isOwnInterfaceAddress,isProcessAlive,readDaemonDiscoveries,readDaemonToken,removeDaemonDiscovery,removeDaemonToken,removeStaleDaemonTokens,resolveDaemonDiscoveryDir,writeDaemonToken}from"./chunk-XIFNBULA.js";import{parseJoinLink,serveCommand}from"./chunk-S53G54DW.js";import{sessionSendMcpCommand}from"./chunk-OX4QMNUW.js";import{batchCommand,resolveProxy,resolveProxyUrl}from"./chunk-ZSKCF6DI.js";import{parseApprovalModeValue}from"./chunk-6BSQDDUG.js";import{readSshWorkspace}from"./chunk-R7TNFTT4.js";import{resolvePath}from"./chunk-G2SXDY2E.js";import{isLoopbackBind}from"./chunk-3SHHYK7S.js";import{AGENT_HOST_SESSION_SOURCE_TYPE,AGENT_SESSION_SOURCE_TYPE}from"./chunk-DHYCGKLG.js";import{normalizeSkillNames,resolveSkillSettings}from"./chunk-AVCBF5WL.js";import{isValidSessionId,normalizeSessionIdForLookup}from"./chunk-LGFF5PJA.js";import{DaemonClient,DaemonSessionClient,normalizeDaemonEvent,sanitizeTerminalText}from"./chunk-CCTQPUAG.js";import{canonicalizeWorkspace}from"./chunk-L5UULTGF.js";import{ChannelLoopMcpWorkerHost,MAX_CHANNEL_STARTUP_FAILURES,MAX_CHANNEL_STARTUP_FAILURE_CHANNEL_LENGTH,MAX_CHANNEL_STARTUP_FAILURE_CODE_LENGTH,MAX_CHANNEL_STARTUP_FAILURE_MESSAGE_LENGTH,isChannelStartupReportAckMessage,isChannelWebhookTaskMessage}from"./chunk-AVJJ62OC.js";import{CHANNEL_DAEMON_WORKER_SENTINEL,CHANNEL_WORKER_HEARTBEAT_INTERVAL_MS,MANAGED_RUNTIME_BROKER_TOKEN_ENV,QWEN_DAEMON_TOKEN_ENV,QWEN_DAEMON_URL_ENV,QWEN_DAEMON_WORKSPACE_ENV,QWEN_SERVER_TOKEN_ENV}from"./chunk-SPYNWVDZ.js";import{normalizeWorkerDiagnostic,sanitizeWorkerDiagnostic}from"./chunk-XSG7HKSN.js";import{normalizeServeChannelSelection}from"./chunk-KOJ7WZ63.js";import{ChannelDeliveryError,MAX_CHANNEL_DELIVERIES_IN_FLIGHT,isChannelDeliveryError,isChannelDeliveryMessage}from"./chunk-O6ZQAVRG.js";import{EXTERNAL_TOOL_GUARD_TOKEN_ENV}from"./chunk-NIEO2TBE.js";import{redactLogCredentials}from"./chunk-CFTFKWPW.js";import{CHANNEL_WORKER_KILL_GRACE_MS,CHANNEL_WORKER_STOP_GRACE_MS}from"./chunk-E4UMXDOZ.js";import{pidFilePath,readServiceInfo,removeServiceInfo,signalService,waitForExit,writeServiceInfo}from"./chunk-BZAH4DTS.js";import{channelLoopPath,createChannel,daemonChannelLoopPath,daemonChannelStateDir,daemonObservedContactsPath,daemonSessionRoutesPath,loadChannelsConfig,loadChannelsFromExtensions,parseConfiguredChannels,registerBackgroundResponseRelay,registerPermissionRelay,registerSessionCleanup,registerToolCallDispatch,resolveChannelLocale,selectFirstModel,sessionsPath}from"./chunk-F3ZRU2SA.js";import{parseChannelConfig}from"./chunk-FJUXMWZW.js";import{findCliEntryPath}from"./chunk-W7V6J2VV.js";import{ManagedEmailAdapter,createManagedEmailDeps}from"./chunk-4BFQ7QQC.js";import{listCommand}from"./chunk-3JI7IKJL.js";import{getExtensionManager,requestChoicePluginNonInteractive,requestConsentNonInteractive,requestConsentOrFail,resolveExtensionCommandScope}from"./chunk-NZNRCPGE.js";import{CUSTOM_SANDBOX_IMAGE_ENV_VAR}from"./chunk-WA2LKUVP.js";import{loadSandboxConfig}from"./chunk-BP62QEKY.js";import{createExecutionSandboxPolicy}from"./chunk-IHXJOVAH.js";import{DEFAULT_BASE_URL,buildHeaders,clearAccount,loadAccount,saveAccount}from"./chunk-XZZBAJQS.js";import{AcpBridge,ChannelLoopScheduler,ChannelLoopStore,DaemonChannelBridge,PairingStore,SessionRouter,isChannelProactiveDeliveryError,sanitizeLogText,sanitizePromptText}from"./chunk-44WSAMWG.js";import{assembleMcpServers,getPendingGatedMcpServers,mcpCommand}from"./chunk-JUQ7T2MV.js";import{loadSettings}from"./chunk-MVGQFFIK.js";import{getSettingsSchema}from"./chunk-UPPE4I6H.js";import{detectSystemLanguage,getCurrentLanguage,initializeI18n,resolveLanguage,resolveLanguageSetting,t}from"./chunk-EZMTX4EU.js";import{isFileSourcedEnvKey}from"./chunk-TW5QEP2J.js";import{resolveAcpChannelFallback,scrubAndReportInheritedLoaderEnv}from"./chunk-HZ4Y7DH5.js";import{getAuthTypeFromEnv,resolveCliGenerationConfig}from"./chunk-VOBNHBCJ.js";import{getErrorMessage as getErrorMessage2}from"./chunk-LPOEVTKD.js";import{isWorkspaceTrusted}from"./chunk-XIYLRIW4.js";import{MAX_CONTROLLER_LABEL_CHARS,NativeLspClient,NativeLspService,PeerControllerError,addChannelMemoryEntries,addPeerController,clearChannelMemory,findOutputStyle,getChannelMemoryRevision,getPeerControllerRegistryPath,listChannelMemoryEntries,listPeerControllers,loadOutputStyleCatalog,readChannelMemory,removeChannelMemoryEntries,removePeerController,updateChannelMemoryEntry}from"./chunk-A5TAAMML.js";import{hideBin,yargs_default}from"./chunk-SEQAVABL.js";import{getCliVersion}from"./chunk-7FSC2NKA.js";import{getPackageJson}from"./chunk-O4EDHV64.js";import{BWRAP_MIGRATION_MESSAGE,require_strip_json_comments,stripUtf8Bom,validateExecutionSandboxSelection}from"./chunk-DOLUT3XC.js";import{isFullyQualifiedPath}from"./chunk-PTHIQ7ZN.js";import{Config,ExtensionManager,FileDiscoveryService,GOAL_MAX_ACTIVE_MINUTES_CAP,GOAL_MAX_TURNS_CAP,GOAL_TOKEN_BUDGET_CAP,MAX_SUBAGENT_DEPTH_LIMIT,SessionService,SshExecutionEnvironment,checkForExtensionUpdate,getScopedEnvContents,ideContextStore,isExtensionCommittedWithWarningsError,isGatedMcpScope,isLoopProtectionMode,isSafeModeEnv,isToolEnabled,loadServerHierarchicalMemory,nextFireTime,parseCron,parseInstallSource,promptForSetting,updateSetting}from"./chunk-LZNBHBAJ.js";import{external_exports}from"./chunk-TWP72VRH.js";import{describeSessionKind,listLiveSessions}from"./chunk-BYU42MLK.js";import{isSameProcess}from"./chunk-5LZ2DPLH.js";import{resolveExtensionTelemetryProxy,resolveTelemetrySettings,resolveUsageStatisticsEnabled}from"./chunk-CMLAE3UB.js";import{parsePositiveIntegerEnv}from"./chunk-BG67XABA.js";import{buildModelIdContext,resolveModelId}from"./chunk-BEKROCWN.js";import{isBareMode,isTruthy}from"./chunk-D7XCQWP2.js";import{BUILT_IN_OUTPUT_STYLES}from"./chunk-OV3EBH6J.js";import{findGitRoot}from"./chunk-EBMCWXGZ.js";import{require_proper_lockfile}from"./chunk-YIW3H46P.js";import{getJsInterpreterCommand}from"./chunk-WGNF7FPC.js";import{resolveBundleDir}from"./chunk-4NPYOXJO.js";import{isInternalSecretEnvVar}from"./chunk-GRW3GBXN.js";import{validateModelProvidersConfig}from"./chunk-BDQOLT37.js";import{addDaemonRequestAttribute}from"./chunk-VTDSLBET.js";import{Mutex}from"./chunk-HDGTWJ24.js";import{getAllMemoryFilenames,setMemoryFilename}from"./chunk-Y6HHV4LC.js";import{DEFAULT_QWEN_EMBEDDING_MODEL}from"./chunk-DZ3GV34J.js";import{isTlsVerificationDisabled}from"./chunk-ZZZAYAJW.js";import{recordChannelMemoryRecallMetrics,redactUrlCredentials}from"./chunk-XHV5HLJS.js";import{atomicWriteFileSync,atomicWriteJSON}from"./chunk-BMHYEQTI.js";import{DEFAULT_COMMAND,DEFAULT_COMMAND_DESC,DEFAULT_COMMAND_OPTIONS,QUERY_POSITIONAL,TOP_LEVEL_DEPRECATED_OPTIONS,TOP_LEVEL_GLOBAL_OPTIONS,TOP_LEVEL_USAGE}from"./chunk-FUK4Y5AJ.js";import{ignoreBrokenPipe,writeStderrLine,writeStderrLineSafe,writeStdoutLine,writeStdoutLineSafe}from"./chunk-SLPJ4OII.js";import{stripAnsiAndControl}from"./chunk-4YLXNRRH.js";import{SchemaValidator}from"./chunk-SVAPAMMG.js";import{AGENT_HOST_TOOL_NAMES,ToolNames}from"./chunk-SBZFGYYS.js";import{createDebugLogger}from"./chunk-JAUJI56S.js";import{Storage}from"./chunk-EPODBRBP.js";import{getProjectHash}from"./chunk-OKN3Z5C5.js";import{FatalConfigError,getErrorMessage,isNodeError}from"./chunk-XYB7GC5U.js";import{init_esbuild_shims}from"./chunk-VKDAXTCZ.js";import{__name,__toESM}from"./chunk-KBWJGX7I.js";init_esbuild_shims();function isInteractiveInvocation(args,stdinIsTTY=process.stdin.isTTY??false){return Boolean(args.promptInteractive||!args.query&&!args.prompt&&stdinIsTTY)}__name(isInteractiveInvocation,"isInteractiveInvocation");init_esbuild_shims();function normalizeDisabledToolList(raw){if(!Array.isArray(raw))return[];const out=[];const seen=new Set;for(const entry of raw){if(typeof entry!=="string")continue;const trimmed=entry.trim();if(!trimmed||seen.has(trimmed))continue;seen.add(trimmed);out.push(trimmed)}return out}__name(normalizeDisabledToolList,"normalizeDisabledToolList");init_esbuild_shims();import{EventEmitter}from"node:events";var appEvents=new EventEmitter;init_esbuild_shims();var SECOND=1e3;var MAX_TIMEOUT_MS=2147483647;var MAX_WALL_TIME_SECONDS=Math.floor(MAX_TIMEOUT_MS/SECOND);var MIN_WALL_TIME_SECONDS=1;function parseDurationSeconds(input){const trimmed=input.trim().toLowerCase();if(trimmed.length===0){throw new Error("Invalid duration: empty string")}const match=/^(\d+(?:\.\d+)?)\s*(ms|s|m|h)?$/.exec(trimmed);if(!match){throw new Error(`Invalid duration "${input}". Use a positive number of seconds (e.g. 90) or a duration with unit (e.g. 30s, 5m, 1h, 500ms).`)}const value=Number.parseFloat(match[1]);const unit=match[2]??"s";let seconds;switch(unit){case"ms":seconds=value/1e3;break;case"s":seconds=value;break;case"m":seconds=value*60;break;case"h":seconds=value*3600;break;default:throw new Error(`Invalid duration unit "${unit}"`)}if(seconds<=0){throw new Error(`Invalid duration "${input}": must be greater than zero. Omit the flag entirely if you don't want a wall-clock budget.`)}if(seconds<MIN_WALL_TIME_SECONDS){const hint=/ms\b/i.test(trimmed)?` (probably a typo \u2014 did you mean ${input.replace(/ms\b/i,"s")}?)`:"";throw new Error(`Invalid duration "${input}": below the ${MIN_WALL_TIME_SECONDS}s minimum${hint}. Sub-second wall-clock budgets fire before any model round-trip can complete.`)}if(seconds>MAX_WALL_TIME_SECONDS){throw new Error(`Invalid duration "${input}": exceeds the maximum supported wall-clock budget (${MAX_WALL_TIME_SECONDS}s \u2248 24 days). Use a smaller value.`)}return seconds}__name(parseDurationSeconds,"parseDurationSeconds");function validateMaxWallTimeSetting(value){if(value===-1)return-1;if(!Number.isFinite(value)){throw new Error(`model.maxWallTimeSeconds must be a finite number; got ${value}.`)}if(value<=0){throw new Error(`model.maxWallTimeSeconds must be > 0 (or -1 for unlimited); got ${value}. Use -1 to disable, not 0.`)}if(value<MIN_WALL_TIME_SECONDS){throw new Error(`model.maxWallTimeSeconds ${value} is below the ${MIN_WALL_TIME_SECONDS}s minimum. Sub-second budgets fire before any model round-trip can complete.`)}if(value>MAX_WALL_TIME_SECONDS){throw new Error(`model.maxWallTimeSeconds ${value} exceeds the maximum supported wall-clock budget (${MAX_WALL_TIME_SECONDS}s \u2248 24 days).`)}return value}__name(validateMaxWallTimeSetting,"validateMaxWallTimeSetting");function validateGoalTokenBudget(value){if(value===-1)return-1;if(typeof value!=="number"||!Number.isFinite(value)){throw new Error(`model.goalTokenBudget must be a finite number; got ${String(value)}.`)}if(!Number.isInteger(value)){throw new Error(`model.goalTokenBudget must be an integer (or -1 for unlimited); got ${value}.`)}if(value<=0){throw new Error(`model.goalTokenBudget must be > 0 (or -1 for unlimited); got ${value}. Use -1 to disable, not 0.`)}if(value>GOAL_TOKEN_BUDGET_CAP){throw new Error(`model.goalTokenBudget ${value} exceeds the supported ceiling (${GOAL_TOKEN_BUDGET_CAP}). Use a smaller value or -1 for unlimited.`)}return value}__name(validateGoalTokenBudget,"validateGoalTokenBudget");function validateGoalCadenceSetting(key,unit,cap,value){if(value===-1)return-1;if(typeof value!=="number"||!Number.isFinite(value)){throw new Error(`${key} must be a finite number; got ${String(value)}.`)}if(!Number.isInteger(value)){throw new Error(`${key} must be an integer number of ${unit} (or -1 for no ceiling); got ${value}.`)}if(value<=0){throw new Error(`${key} must be > 0 (or -1 for no ceiling); got ${value}. Use -1 to disable, not 0.`)}if(value>cap){throw new Error(`${key} ${value} exceeds the supported ceiling (${cap} ${unit}). Use a smaller value or -1 for no ceiling.`)}return value}__name(validateGoalCadenceSetting,"validateGoalCadenceSetting");function validateGoalMaxTurns(value){return validateGoalCadenceSetting("model.goalMaxTurns","turns",GOAL_MAX_TURNS_CAP,value)}__name(validateGoalMaxTurns,"validateGoalMaxTurns");function validateGoalMaxActiveMinutes(value){return validateGoalCadenceSetting("model.goalMaxActiveMinutes","minutes",GOAL_MAX_ACTIVE_MINUTES_CAP,value)}__name(validateGoalMaxActiveMinutes,"validateGoalMaxActiveMinutes");var MAX_TOOL_CALLS=1e6;function validateMaxToolCalls(value){if(value===-1)return-1;if(!Number.isFinite(value)){throw new Error(`maxToolCalls must be a finite number; got ${value}.`)}if(!Number.isInteger(value)){throw new Error(`maxToolCalls must be an integer (or -1 for unlimited); got ${value}.`)}if(value<0){throw new Error(`maxToolCalls must be >= 0 (or -1 for unlimited); got ${value}. Use -1 to disable, not a negative number.`)}if(value>MAX_TOOL_CALLS){throw new Error(`maxToolCalls ${value} exceeds the supported ceiling (${MAX_TOOL_CALLS}). Likely a typo \u2014 use a smaller value or -1 for unlimited.`)}return value}__name(validateMaxToolCalls,"validateMaxToolCalls");var RunBudgetEnforcer=class{static{__name(this,"RunBudgetEnforcer")}maxWallTimeSeconds;maxToolCalls;abortController;wallTimer=null;toolCallCount=0;exceeded=null;constructor(opts,abortController){this.maxWallTimeSeconds=opts.maxWallTimeSeconds??-1;this.maxToolCalls=opts.maxToolCalls??-1;this.abortController=abortController}start(){if(this.wallTimer!==null)return;if(this.maxWallTimeSeconds<=0)return;this.wallTimer=setTimeout(()=>{this.markExceeded({kind:"wall-time",limit:this.maxWallTimeSeconds,observed:this.maxWallTimeSeconds,message:`Run aborted: wall-clock budget of ${this.maxWallTimeSeconds}s exceeded (--max-wall-time).`})},this.maxWallTimeSeconds*SECOND);this.wallTimer.unref?.()}tickToolCall(){this.toolCallCount+=1;if(this.maxToolCalls>=0&&this.toolCallCount>this.maxToolCalls){this.markExceeded({kind:"tool-calls",limit:this.maxToolCalls,observed:this.toolCallCount,message:`Run aborted: tool-call budget of ${this.maxToolCalls} exceeded (--max-tool-calls); observed ${this.toolCallCount}.`})}}getExceeded(){return this.exceeded}stop(){if(this.wallTimer!==null){clearTimeout(this.wallTimer);this.wallTimer=null}}markExceeded(record){if(this.exceeded!==null)return;if(this.abortController.signal.aborted)return;this.exceeded=record;this.stop();this.abortController.abort()}};init_esbuild_shims();init_esbuild_shims();init_esbuild_shims();function normalizeScope(scope){return scope==="project"||scope==="workspace"?"project":"user"}__name(normalizeScope,"normalizeScope");async function handleInstall(args){const scope=normalizeScope(args.scope);let extensionManager;try{const installMetadata=await parseInstallSource(args.source);if(installMetadata.type!=="git"&&installMetadata.type!=="github-release"&&installMetadata.type!=="npm"&&installMetadata.type!=="archive-url"){if(args.ref||args.autoUpdate){throw new Error(t("--ref and --auto-update are not applicable for marketplace extensions."))}}if((installMetadata.type==="npm"||installMetadata.type==="archive-url")&&args.ref){throw new Error(t(installMetadata.type==="npm"?"--ref is not applicable for npm extensions. Use @version suffix instead (e.g. @scope/package@1.2.0).":"--ref is not applicable for archive URL extensions."))}if(installMetadata.type!=="npm"&&args.registry){throw new Error(t("--registry is only applicable for npm extensions."))}if(installMetadata.type==="npm"&&args.registry){installMetadata.registryUrl=args.registry}const requestConsent=args.consent?()=>Promise.resolve():requestConsentOrFail.bind(null,requestConsentNonInteractive);const workspaceDir=process.cwd();const settings=loadSettings(workspaceDir).merged;extensionManager=new ExtensionManager({workspaceDir,locale:getCurrentLanguage(),isWorkspaceTrusted:isWorkspaceTrusted(settings).isTrusted??true,requestConsent,requestChoicePlugin:requestChoicePluginNonInteractive,usageStatisticsEnabled:resolveUsageStatisticsEnabled(settings.privacy?.usageStatisticsEnabled),proxy:resolveExtensionTelemetryProxy(settings.proxy)});await extensionManager.refreshCache();const extension=await extensionManager.installExtension({...installMetadata,ref:args.ref,autoUpdate:args.autoUpdate,allowPreRelease:args.allowPreRelease},requestConsent,void 0,workspaceDir,void 0,scope==="project"?{scope:"workspace",workspacePath:workspaceDir}:{scope:"user"});if(args.scope){try{extensionManager.setExtensionScope(extension.name,scope)}catch(scopeError){writeStderrLine(`Warning: Extension installed, but failed to save scope preference: ${getErrorMessage2(scopeError)}`)}}writeStdoutLine(scope==="project"?t('Extension "{{name}}" installed successfully and enabled for the current workspace.',{name:extension.name}):t('Extension "{{name}}" installed successfully and enabled.',{name:extension.name}))}catch(error){if(isExtensionCommittedWithWarningsError(error)){if(args.scope&&extensionManager){try{extensionManager.setExtensionScope(error.identity.name,scope)}catch(scopeError){writeStderrLine(`Warning: Extension installed, but failed to save scope preference: ${getErrorMessage2(scopeError)}`)}}writeStderrLine(`Warning: ${getErrorMessage2(error)}`);return}writeStderrLine(getErrorMessage2(error));process.exit(1)}}__name(handleInstall,"handleInstall");var installCommand={command:"install <source>",describe:t("Installs an extension from a git repository URL, local path or archive, archive URL, scoped npm package (@scope/name), or claude marketplace (marketplace-url:plugin-name)."),builder:__name(yargs=>yargs.positional("source",{describe:t("The github URL, local path or archive, archive URL, or marketplace source (marketplace-url:plugin-name) of the extension to install."),type:"string",demandOption:true}).option("ref",{describe:t("The git ref to install from."),type:"string"}).option("auto-update",{describe:t("Enable auto-update for this extension."),type:"boolean"}).option("pre-release",{describe:t("Enable pre-release versions for this extension."),type:"boolean"}).option("registry",{describe:t("Custom npm registry URL (only for npm extensions)."),type:"string"}).option("consent",{describe:t("Acknowledge the security risks of installing an extension and skip the confirmation prompt."),type:"boolean",default:false}).option("scope",{describe:t('The scope to install the extension in: "user" (global, default) or "project" (current workspace only).'),type:"string",choices:["user","project","workspace"]}).check(argv=>{if(!argv.source){throw new Error(t("The source argument must be provided."))}return true}),"builder"),handler:__name(async argv=>{await handleInstall({source:argv["source"],ref:argv["ref"],autoUpdate:argv["auto-update"],allowPreRelease:argv["pre-release"],consent:argv["consent"],registry:argv["registry"],scope:argv["scope"]})},"handler")};init_esbuild_shims();async function handleUninstall(args){try{const workspaceDir=process.cwd();const settings=loadSettings(workspaceDir).merged;const extensionManager=new ExtensionManager({workspaceDir,locale:getCurrentLanguage(),requestConsent:requestConsentOrFail.bind(null,requestConsentNonInteractive),isWorkspaceTrusted:isWorkspaceTrusted(settings).isTrusted??true,usageStatisticsEnabled:resolveUsageStatisticsEnabled(settings.privacy?.usageStatisticsEnabled),proxy:resolveExtensionTelemetryProxy(settings.proxy)});await extensionManager.refreshCache();const result=await extensionManager.uninstallExtension(args.name,false);writeStdoutLine(t('Extension "{{name}}" successfully uninstalled.',{name:args.name}));for(const warning of result.warnings??[]){writeStderrLine(`${warning.code}: ${warning.error}`)}}catch(error){writeStderrLine(getErrorMessage2(error));process.exit(1)}}__name(handleUninstall,"handleUninstall");var uninstallCommand={command:"uninstall <name>",describe:t("Uninstalls an extension."),builder:__name(yargs=>yargs.positional("name",{describe:t("The name or source path of the extension to uninstall."),type:"string"}).check(argv=>{if(!argv.name){throw new Error(t("Please include the name of the extension to uninstall as a positional argument."))}return true}),"builder"),handler:__name(async argv=>{await handleUninstall({name:argv["name"]})},"handler")};init_esbuild_shims();var updateOutput=__name(info=>t('Extension "{{name}}" successfully updated: {{oldVersion}} \u2192 {{newVersion}}.',{name:info.name,oldVersion:info.originalVersion,newVersion:info.updatedVersion}),"updateOutput");var updateWarningOutput=__name(info=>(info.warnings??[]).map(warning=>t('Extension "{{name}}" updated with warning {{code}}: {{error}}',{name:info.name,code:warning.code,error:warning.error})).join("\n"),"updateWarningOutput");async function handleUpdate(args){const extensionManager=await getExtensionManager();const extensions=extensionManager.getLoadedExtensions();if(args.name){try{const extension=extensions.find(extension2=>extension2.name===args.name);if(!extension){writeStdoutLine(t('Extension "{{name}}" not found.',{name:args.name}));return}if(!extension.installMetadata){writeStdoutLine(t('Unable to install extension "{{name}}" due to missing install metadata',{name:args.name}));return}const updateState=await checkForExtensionUpdate(extension,extensionManager);if(updateState!=="update available"){writeStdoutLine(t('Extension "{{name}}" is already up to date.',{name:args.name}));return}const updatedExtensionInfo=await extensionManager.updateExtension(extension,updateState,()=>{});if(updatedExtensionInfo.originalVersion!==updatedExtensionInfo.updatedVersion){writeStdoutLine(t('Extension "{{name}}" successfully updated: {{oldVersion}} \u2192 {{newVersion}}.',{name:args.name,oldVersion:updatedExtensionInfo.originalVersion,newVersion:updatedExtensionInfo.updatedVersion}))}else{writeStdoutLine(t('Extension "{{name}}" is already up to date.',{name:args.name}))}const warnings=updateWarningOutput(updatedExtensionInfo);if(warnings)writeStderrLine(warnings)}catch(error){writeStderrLine(getErrorMessage2(error))}}if(args.all){try{const extensionState=new Map;await extensionManager.checkForAllExtensionUpdates((extensionName,state)=>{extensionState.set(extensionName,{status:state,processed:true})});let updateInfos=await extensionManager.updateAllUpdatableExtensions(extensionState,()=>{});updateInfos=updateInfos.filter(info=>info.originalVersion!==info.updatedVersion);if(updateInfos.length===0){writeStdoutLine(t("No extensions to update."));return}writeStdoutLine(updateInfos.map(info=>updateOutput(info)).join("\n"));const warnings=updateInfos.map(info=>updateWarningOutput(info)).filter(Boolean).join("\n");if(warnings)writeStderrLine(warnings)}catch(error){writeStderrLine(getErrorMessage2(error))}}}__name(handleUpdate,"handleUpdate");var updateCommand={command:"update [<name>] [--all]",describe:t("Updates all extensions or a named extension to the latest version."),builder:__name(yargs=>yargs.positional("name",{describe:t("The name of the extension to update."),type:"string"}).option("all",{describe:t("Update all extensions."),type:"boolean"}).conflicts("name","all").check(argv=>{if(!argv.all&&!argv.name){throw new Error(t("Either an extension name or --all must be provided"))}return true}),"builder"),handler:__name(async argv=>{await handleUpdate({name:argv["name"],all:argv["all"]})},"handler")};init_esbuild_shims();async function handleDisable(args){const extensionManager=await getExtensionManager();try{const scope=resolveExtensionCommandScope(args.scope);const result=await extensionManager.disableExtension(args.name,scope);writeStdoutLine(t('Extension "{{name}}" successfully disabled for scope "{{scope}}".',{name:args.name,scope:args.scope||"User"}));for(const warning of result.warnings??[]){writeStderrLine(`${warning.code}: ${warning.error}`)}}catch(error){writeStderrLine(getErrorMessage2(error));process.exit(1)}}__name(handleDisable,"handleDisable");var disableCommand={command:"disable [--scope] <name>",describe:t("Disables an extension."),builder:__name(yargs=>yargs.positional("name",{describe:t("The name of the extension to disable."),type:"string"}).option("scope",{describe:t("The scope to disable the extension in."),type:"string",default:"User"}).check(argv=>{resolveExtensionCommandScope(argv.scope);return true}),"builder"),handler:__name(async argv=>{await handleDisable({name:argv["name"],scope:argv["scope"]})},"handler")};init_esbuild_shims();async function handleEnable(args){const extensionManager=await getExtensionManager();try{const scope=resolveExtensionCommandScope(args.scope);const result=await extensionManager.enableExtension(args.name,scope);if(args.scope){writeStdoutLine(t('Extension "{{name}}" successfully enabled for scope "{{scope}}".',{name:args.name,scope:args.scope}))}else{writeStdoutLine(t('Extension "{{name}}" successfully enabled in all scopes.',{name:args.name}))}for(const warning of result.warnings??[]){writeStderrLine(`${warning.code}: ${warning.error}`)}}catch(error){throw new FatalConfigError(getErrorMessage(error))}}__name(handleEnable,"handleEnable");var enableCommand={command:"enable [--scope] <name>",describe:t("Enables an extension."),builder:__name(yargs=>yargs.positional("name",{describe:t("The name of the extension to enable."),type:"string"}).option("scope",{describe:t("The scope to enable the extension in. If not set, will be enabled in all scopes."),type:"string"}).check(argv=>{resolveExtensionCommandScope(argv.scope);return true}),"builder"),handler:__name(async argv=>{await handleEnable({name:argv["name"],scope:argv["scope"]})},"handler")};init_esbuild_shims();async function handleLink(args){try{const installMetadata={source:args.path,type:"link"};const extensionManager=await getExtensionManager();const extension=await extensionManager.installExtension(installMetadata,requestConsentOrFail.bind(null,requestConsentNonInteractive));if(!extension){writeStdoutLine(t("Link extension failed to install."));return}writeStdoutLine(t('Extension "{{name}}" linked successfully and enabled.',{name:extension.name}))}catch(error){if(isExtensionCommittedWithWarningsError(error)){writeStderrLine(`Warning: ${getErrorMessage2(error)}`);return}writeStderrLine(getErrorMessage2(error));process.exit(1)}}__name(handleLink,"handleLink");var linkCommand={command:"link <path>",describe:t("Links an extension from a local path. Updates made to the local path will always be reflected."),builder:__name(yargs=>yargs.positional("path",{describe:t("The name of the extension to link."),type:"string"}).check(_=>true),"builder"),handler:__name(async argv=>{await handleLink({path:argv["path"]})},"handler")};init_esbuild_shims();import{access,cp,mkdir,readdir,writeFile}from"node:fs/promises";import{join,basename}from"node:path";var EXAMPLES_PATH=join(resolveBundleDir(import.meta.url),"examples");async function pathExists(path9){try{await access(path9);return true}catch(_e){return false}}__name(pathExists,"pathExists");async function createDirectory(path9){if(await pathExists(path9)){throw new Error(`Path already exists: ${path9}`)}await mkdir(path9,{recursive:true})}__name(createDirectory,"createDirectory");async function copyDirectory(template,path9){await createDirectory(path9);const examplePath=join(EXAMPLES_PATH,template);const entries=await readdir(examplePath,{withFileTypes:true});for(const entry of entries){const srcPath=join(examplePath,entry.name);const destPath=join(path9,entry.name);await cp(srcPath,destPath,{recursive:true})}}__name(copyDirectory,"copyDirectory");async function handleNew(args){try{if(args.template){await copyDirectory(args.template,args.path);writeStdoutLine(`Successfully created new extension from template "${args.template}" at ${args.path}.`)}else{await createDirectory(args.path);const extensionName=basename(args.path);const manifest={name:extensionName,version:"1.0.0"};await writeFile(join(args.path,"qwen-extension.json"),JSON.stringify(manifest,null,2));writeStdoutLine(`Successfully created new extension at ${args.path}.`)}writeStdoutLine(`You can install this using "qwen extensions link ${args.path}" to test it out.`)}catch(error){writeStderrLine(getErrorMessage2(error));throw error}}__name(handleNew,"handleNew");async function getBoilerplateChoices(){try{const entries=await readdir(EXAMPLES_PATH,{withFileTypes:true});return{choices:entries.filter(entry=>entry.isDirectory()).map(entry=>entry.name),readFailed:false}}catch(e){const isMissing=isNodeError(e)&&e.code==="ENOENT";if(!isMissing){writeStderrLine(`Warning: failed to read extension templates: ${getErrorMessage2(e)}`)}return{choices:[],readFailed:!isMissing}}}__name(getBoilerplateChoices,"getBoilerplateChoices");var newCommand={command:"new <path> [template]",describe:"Create a new extension from a boilerplate example.",builder:__name(async yargs=>{const{choices,readFailed}=await getBoilerplateChoices();return yargs.positional("path",{describe:"The path to create the extension in.",type:"string"}).positional("template",{describe:"The boilerplate template to use.",type:"string",choices:choices.length>0?choices:void 0}).check(argv=>{if(argv["template"]&&choices.length===0){throw new Error(readFailed?"Extension templates could not be read in this installation.":"No boilerplate templates are available in this installation.")}return true})},"builder"),handler:__name(async args=>{await handleNew({path:args["path"],template:args["template"]})},"handler")};init_esbuild_shims();var setCommand={command:"set [--scope] <name> <setting>",describe:t("Set a specific setting for an extension."),builder:__name(yargs=>yargs.positional("name",{describe:t("Name of the extension to configure."),type:"string",demandOption:true}).positional("setting",{describe:t("The setting to configure (name or env var)."),type:"string",demandOption:true}).option("scope",{describe:t("The scope to set the setting in."),type:"string",choices:["user","workspace"],default:"user"}),"builder"),handler:__name(async args=>{const{name,setting,scope}=args;const extensionManager=await getExtensionManager();if(!extensionManager)return;const extensions=extensionManager.getLoadedExtensions();if(!extensions||extensions.length===0)return;const extension=extensions.find(e=>e.name===name);if(!extension){writeStdoutLine(t('Extension "{{name}}" not found.',{name}));return}await updateSetting(extension.config,extension.id,setting,promptForSetting,scope)},"handler")};var listCommand2={command:"list <name>",describe:t("List all settings for an extension."),builder:__name(yargs=>yargs.positional("name",{describe:t("Name of the extension."),type:"string",demandOption:true}),"builder"),handler:__name(async args=>{const{name}=args;const extensionManager=await getExtensionManager();if(!extensionManager)return;const extensions=extensionManager.getLoadedExtensions();if(!extensions||extensions.length===0)return;const extension=extensions.find(e=>e.name===name);if(!extension){writeStdoutLine(t('Extension "{{name}}" not found.',{name}));return}if(!extension||!extension.settings||extension.settings.length===0){writeStdoutLine(t('Extension "{{name}}" has no settings to configure.',{name}));return}const userSettings=await getScopedEnvContents(extension.config,extension.id,"user");const workspaceSettings=await getScopedEnvContents(extension.config,extension.id,"workspace");const mergedSettings={...userSettings,...workspaceSettings};writeStdoutLine(t('Settings for "{{name}}":',{name}));for(const setting of extension.settings){const value=mergedSettings[setting.envVar];let displayValue;let scopeInfo="";if(workspaceSettings[setting.envVar]!==void 0){scopeInfo=" "+t("(workspace)")}else if(userSettings[setting.envVar]!==void 0){scopeInfo=" "+t("(user)")}if(value===void 0){displayValue=t("[not set]")}else if(setting.sensitive){displayValue=t("[value stored in keychain]")}else{displayValue=value}writeStdoutLine(`
|
|
4
4
|
- ${setting.name} (${setting.envVar})`);writeStdoutLine(` ${t("Description:")} ${setting.description}`);writeStdoutLine(` ${t("Value:")} ${displayValue}${scopeInfo}`)}},"handler")};var settingsCommand={command:"settings <command>",describe:t("Manage extension settings."),builder:__name(yargs=>yargs.command(setCommand).command(listCommand2).demandCommand(1,t("You need to specify a command (set or list).")).version(false),"builder"),handler:__name(()=>{},"handler")};init_esbuild_shims();async function handleSourcesAdd(args){try{const extensionManager=await getExtensionManager();const entry=await extensionManager.addSource(args.source);writeStdoutLine(t('Added marketplace "{{name}}".',{name:entry.name}))}catch(error){writeStderrLine(getErrorMessage2(error));process.exit(1)}}__name(handleSourcesAdd,"handleSourcesAdd");async function handleSourcesRemove(args){try{const extensionManager=await getExtensionManager();if(!extensionManager.removeSource(args.name)){writeStderrLine(t('Marketplace "{{name}}" not found.',{name:args.name}));process.exit(1);return}writeStdoutLine(t('Removed marketplace "{{name}}".',{name:args.name}))}catch(error){writeStderrLine(getErrorMessage2(error));process.exit(1)}}__name(handleSourcesRemove,"handleSourcesRemove");async function handleSourcesList(){try{const extensionManager=await getExtensionManager();const sources=extensionManager.getSources();if(sources.length===0){writeStdoutLine(t("No marketplace sources added yet."));return}writeStdoutLine(sources.map(entry=>{let output=`${entry.name}`;output+=`
|
|
5
5
|
${t("Source:")} ${redactUrlCredentials(entry.source)} (${t("Type:")} ${entry.type})`;const updated=entry.lastUpdatedAt??entry.addedAt;if(updated){output+=`
|
|
6
6
|
${t("Last updated: {{date}}",{date:updated})}`}return output}).join("\n\n"))}catch(error){writeStderrLine(getErrorMessage2(error));process.exit(1)}}__name(handleSourcesList,"handleSourcesList");async function handleSourcesUpdate(args){try{const extensionManager=await getExtensionManager();const entry=extensionManager.getSources().find(source=>source.name===args.name);if(!entry){writeStderrLine(t('Marketplace "{{name}}" not found.',{name:args.name}));process.exit(1);return}const config=await extensionManager.loadSource(entry.source);if(!config){writeStderrLine(t("Could not load this marketplace."));process.exit(1);return}extensionManager.markSourceUpdated(entry.name);writeStdoutLine(t('Updated marketplace "{{name}}".',{name:entry.name}));writeStdoutLine(t("{{count}} available extensions",{count:String(config.plugins?.length??0)}))}catch(error){writeStderrLine(getErrorMessage2(error));process.exit(1)}}__name(handleSourcesUpdate,"handleSourcesUpdate");var addCommand={command:"add <source>",describe:t("Adds a marketplace source (Claude format)."),builder:__name(yargs=>yargs.positional("source",{describe:t("The marketplace source to add: owner/repo (GitHub), a git or https URL, or a local path."),type:"string",demandOption:true}),"builder"),handler:__name(async argv=>{await handleSourcesAdd({source:argv["source"]})},"handler")};var removeCommand={command:"remove <name>",describe:t("Removes a marketplace source."),builder:__name(yargs=>yargs.positional("name",{describe:t("The name of the marketplace to remove."),type:"string",demandOption:true}),"builder"),handler:__name(async argv=>{await handleSourcesRemove({name:argv["name"]})},"handler")};var listCommand3={command:"list",describe:t("Lists configured marketplace sources."),builder:__name(yargs=>yargs,"builder"),handler:__name(async()=>{await handleSourcesList()},"handler")};var updateCommand2={command:"update <name>",describe:t("Re-fetches a marketplace source and its plugin listing."),builder:__name(yargs=>yargs.positional("name",{describe:t("The name of the marketplace to update."),type:"string",demandOption:true}),"builder"),handler:__name(async argv=>{await handleSourcesUpdate({name:argv["name"]})},"handler")};var sourcesCommand={command:"sources <command>",describe:t("Manage marketplace sources for discovering extensions."),builder:__name(yargs=>yargs.command(addCommand).command(removeCommand).command(listCommand3).command(updateCommand2).demandCommand(1,t("You need at least one command before continuing.")).version(false),"builder"),handler:__name(()=>{},"handler")};var extensionsCommand={command:"extensions <command>",describe:"Manage Qwen Code extensions.",builder:__name(yargs=>yargs.command(installCommand).command(uninstallCommand).command(listCommand).command(updateCommand).command(disableCommand).command(enableCommand).command(linkCommand).command(newCommand).command(settingsCommand).command(sourcesCommand).demandCommand(1,"You need at least one command before continuing.").version(false),"builder"),handler:__name(()=>{},"handler")};init_esbuild_shims();import{join as join3}from"node:path";init_esbuild_shims();import{access as access2,lstat,readdir as readdir2,readlink,realpath}from"node:fs/promises";import{createRequire}from"node:module";import{basename as basename2,dirname,isAbsolute,join as join2,normalize,relative,resolve,sep}from"node:path";function contains(parent,child){const path9=relative(parent,child);return path9===""||!path9.startsWith(`..${sep}`)&&path9!==".."&&!isAbsolute(path9)}__name(contains,"contains");async function canonicalDirectory(path9){if(dirname(path9)===path9)return realpath(path9);const canonical=join2(await canonicalDirectory(dirname(path9)),basename2(path9));const entry=await lstat(canonical).catch(error=>{if(error.code!=="ENOENT")throw error;return void 0});if(entry?.isSymbolicLink()){throw new Error(`Container execution does not support symlinked installation or dependency search paths: ${canonical}. Use an independent CLI installation.`)}return entry?realpath(canonical):canonical}__name(canonicalDirectory,"canonicalDirectory");async function containerTrustedDirectories(bundleDirectory,signal){signal.throwIfAborted();const bundle=await canonicalDirectory(bundleDirectory);try{await access2(join2(bundle,"cli.js"));await access2(join2(bundle,"execution-worker.js"))}catch(cause){throw new Error("Container execution requires a complete bundled CLI installation; source and tsc launches are unsupported.",{cause})}const roots=[bundle];for(const root of roots){signal.throwIfAborted();const lookup=createRequire(join2(root,"cli.js")).resolve.paths("__qwen_container_boundary__");for(const path9 of lookup??[]){const canonical=await canonicalDirectory(path9);if(!roots.some(parent=>contains(parent,canonical)))roots.push(canonical)}}const scanRoots=roots.filter(root=>!roots.some(other=>other!==root&&contains(other,root)));const pending=[...scanRoots];while(pending.length){signal.throwIfAborted();const directory=pending.pop();const entries=await readdir2(directory,{withFileTypes:true}).catch(error=>{if(error.code!=="ENOENT"||!scanRoots.includes(directory))throw error;return[]});for(const entry of entries){signal.throwIfAborted();const path9=join2(directory,entry.name);if(entry.isDirectory())pending.push(path9);if(entry.isFile()&&(await lstat(path9)).nlink>1){throw new Error(`Container execution does not support hard-linked installation files: ${path9}. Use an independent CLI installation.`)}if(entry.isSymbolicLink()){const link=await readlink(path9);if(link!==normalize(link)){throw new Error(`Container execution requires normalized package links; non-normalized symlink target at ${path9}.`)}const directTarget=resolve(directory,link);const target=await realpath(path9);if(![directTarget,target].every(target2=>roots.some(root=>contains(root,target2)))){throw new Error(`Container execution requires an independent CLI installation without links outside its protected dependency directories: ${path9}.`)}}}}return roots}__name(containerTrustedDirectories,"containerTrustedDirectories");var AGENT_EXECUTION_BACKEND_ENV="QWEN_AGENT_EXECUTION_BACKEND";function agentExecutionRuntime(env,fileSourced){const runtime=env[AGENT_EXECUTION_BACKEND_ENV]?.trim().toLowerCase();if(!runtime)return void 0;if(fileSourced(AGENT_EXECUTION_BACKEND_ENV)){throw new Error(`${AGENT_EXECUTION_BACKEND_ENV} cannot be loaded from an environment file. Export it in the launch environment instead.`)}if(runtime!=="docker"&&runtime!=="podman"){throw new Error(`${AGENT_EXECUTION_BACKEND_ENV} must be docker or podman.`)}return runtime}__name(agentExecutionRuntime,"agentExecutionRuntime");function agentExecutionBackend(env=process.env,fileSourced=isFileSourcedEnvKey){return agentExecutionRuntime(env,fileSourced)?"container":void 0}__name(agentExecutionBackend,"agentExecutionBackend");function agentExecutionFactory(env=process.env,fileSourced=isFileSourcedEnvKey){if(process.platform==="win32"||env["SANDBOX"]||env["QWEN_CODE_SERVE"]==="1")return void 0;const runtime=agentExecutionRuntime(env,fileSourced);if(!runtime)return void 0;const clientEnv=trustedProcessEnv(env,fileSourced);const pick=__name(key=>fileSourced(key)?void 0:env[key]?.trim(),"pick");const imageOverride=pick(CUSTOM_SANDBOX_IMAGE_ENV_VAR)||pick("QWEN_SANDBOX_IMAGE");return async(config,signal)=>{const{ContainerExecutionEnvironment}=await import("./container-execution-environment-FXDUEYO4.js");const packageJson=await getPackageJson();const image=imageOverride||packageJson?.config?.sandboxImageUri;if(!image)throw new Error("No container execution image is configured.");const bundleDirectory=resolveBundleDir(import.meta.url);const trustedDirectories=await containerTrustedDirectories(bundleDirectory,signal);return ContainerExecutionEnvironment.create(config,{runtime,image,bundleDirectory,trustedDirectories,runtimeEnv:clientEnv,containerHome:CONTAINER_HOME,environment:containerEnv(join3(CONTAINER_HOME,".npm-cache"))},signal)}}__name(agentExecutionFactory,"agentExecutionFactory");init_esbuild_shims();var debugLogger=createDebugLogger("HOOKS_UI");var hooksCommand={command:"hooks",aliases:["hook"],describe:"Manage Qwen Code hooks (use /hooks in interactive mode).",builder:__name(yargs=>yargs.version(false).help(false),"builder"),handler:__name(()=>{debugLogger.debug("Use /hooks in interactive mode to manage hooks with the UI.");process.exit(0)},"handler")};init_esbuild_shims();init_esbuild_shims();import{existsSync,realpathSync}from"node:fs";import{homedir}from"node:os";import{dirname as dirname2,join as join4}from"node:path";var protocolIds=["mem0-v2","mem0-v3","mem0-oss-2026-08","aliyun-polardb-mysql-2026-08","mem0-platform-v3","mem0-oss-rest-2026-08"];var scopeValue=external_exports.string().trim().min(1).max(256);var credentialEnvName=external_exports.string().regex(/^[A-Za-z_][A-Za-z0-9_]*$/u,"Must be an environment variable name.");var mem0SettingsSchema=external_exports.object({baseUrl:external_exports.string().url(),protocol:external_exports.enum(protocolIds).default("mem0-v2"),envKey:credentialEnvName.optional(),credentialEnv:credentialEnvName.optional(),scope:external_exports.object({userId:scopeValue.optional(),agentId:scopeValue.optional(),appId:scopeValue.optional()}).strict().optional(),allowInsecureHttp:external_exports.boolean().default(false),enableWrites:external_exports.boolean().default(false),timeoutMs:external_exports.number().int().min(1).max(3e4).default(5e3)}).strict();function createBundledMem0Server(value,cwd,allowWrites=true){const parsed=mem0SettingsSchema.safeParse(value);if(!parsed.success){throw new Error("memory.mem0 is invalid: "+parsed.error.issues.map(issue=>`${issue.path.join(".")||"mem0"}: ${issue.message}`).join("; "))}const settings=parsed.data;if(settings.envKey!==void 0&&settings.credentialEnv!==void 0&&settings.envKey!==settings.credentialEnv){throw new Error("memory.mem0.envKey and credentialEnv must match when both are set.")}const envKey=settings.envKey??settings.credentialEnv??"MEM0_API_KEY";const enableWrites=settings.enableWrites&&allowWrites;if(envKey.toUpperCase()==="QWEN_BUNDLED_MEM0_CONFIG"||isInternalSecretEnvVar(envKey)){throw new Error("memory.mem0.envKey must refer to a Mem0 credential.")}if([...settings.baseUrl].some(char=>char.charCodeAt(0)<=32||char.charCodeAt(0)===127||char==="\\")){throw new Error("memory.mem0.baseUrl is invalid.")}const url=new URL(settings.baseUrl);const basePath=url.pathname==="/"?"":url.pathname.replace(/\/$/u,"");if(basePath.includes("%")||basePath.includes("//")){throw new Error("memory.mem0.baseUrl contains an unsupported proxy prefix.")}if(url.username||url.password||url.search||url.hash||url.protocol!=="https:"&&url.protocol!=="http:"){throw new Error("memory.mem0.baseUrl must be an HTTP(S) URL without credentials, query, or fragment.")}if(url.protocol==="http:"&&!["localhost","127.0.0.1","[::1]"].includes(url.hostname)&&!settings.allowInsecureHttp){throw new Error("memory.mem0.baseUrl requires HTTPS; set allowInsecureHttp for a trusted HTTP endpoint.")}const repositoryRoot=realpathSync(findGitRoot(cwd)??cwd);const scopeId="qwen-"+getProjectHash(homedir()+"\n"+repositoryRoot).slice(0,32);const platformV3=["mem0-v3","mem0-platform-v3"].includes(settings.protocol);const scope={...platformV3?{appId:scopeId}:{userId:scopeId},...settings.scope};if(platformV3&&(scope.userId!==void 0||scope.agentId!==void 0)||!platformV3&&scope.appId!==void 0){throw new Error("memory.mem0.scope does not match the selected protocol.")}const config={version:1,timeoutMs:settings.timeoutMs,provider:{type:"mem0",preset:settings.protocol,endpoint:{origin:url.origin,basePath,allowInsecureHttp:settings.allowInsecureHttp},credentialEnv:envKey,scope},...enableWrites?{write:{enabled:true}}:{}};return{command:getJsInterpreterCommand(import.meta.url).command,args:[mem0RuntimePath()],env:{QWEN_BUNDLED_MEM0_CONFIG:JSON.stringify(config)},includeTools:["context_search",...enableWrites?["context_remember"]:[]],timeout:settings.timeoutMs+5e3,trust:false}}__name(createBundledMem0Server,"createBundledMem0Server");function mem0RuntimePath(){let directory=resolveBundleDir(import.meta.url);const bundled=join4(directory,"mem0","main.js");if(existsSync(bundled))return bundled;while(dirname2(directory)!==directory){if(existsSync(join4(directory,"integrations","external-context","package.json"))){const runtime=join4(directory,"dist","mem0","main.js");if(existsSync(runtime))return runtime;break}directory=dirname2(directory)}throw new Error("Bundled Mem0 runtime is missing. Run npm run bundle for a source checkout.")}__name(mem0RuntimePath,"mem0RuntimePath");function bundledMem0Hooks(server){if(!server||server.scope!==void 0||!server.env?.["QWEN_BUNDLED_MEM0_CONFIG"]||!server.includeTools?.includes("context_remember")||server.scope!==void 0||server.extensionName!==void 0||server.command!==getJsInterpreterCommand(import.meta.url).command||server.args?.length!==1||server.args[0]!==mem0RuntimePath())return void 0;const hookPath=join4(dirname2(server.args[0]),"write-confirmation.js");const quote=__name(value=>"'"+value.replaceAll("'",process.platform==="win32"?"''":"'\\''")+"'","quote");return{PreToolUse:[{matcher:"mcp__external-context__context_remember",hooks:[{type:"command",command:(process.platform==="win32"?"& ":"exec ")+quote(server.command)+" "+quote(hookPath),...process.platform==="win32"?{shell:"powershell"}:{},timeout:8,name:"bundled-mem0-write-confirmation"}]}]}}__name(bundledMem0Hooks,"bundledMem0Hooks");function resolveHookSettingsForConfig(mergedHooks,separated,hooksDisabled,mem0Server){if(hooksDisabled){return{systemHooks:void 0,userHooks:void 0,projectHooks:void 0,hooks:void 0}}if(!separated){return{hooks:mergeMem0Hooks(mergedHooks,mem0Server)}}return{systemHooks:mergeMem0Hooks(separated.systemHooks,mem0Server),userHooks:separated.userHooks,projectHooks:separated.projectHooks,hooks:void 0}}__name(resolveHookSettingsForConfig,"resolveHookSettingsForConfig");function mergeMem0Hooks(hooks,mem0Server){const bundled=bundledMem0Hooks(mem0Server);if(!bundled)return hooks;return{...hooks,PreToolUse:[...Array.isArray(hooks?.["PreToolUse"])?hooks["PreToolUse"]:[],...bundled["PreToolUse"]]}}__name(mergeMem0Hooks,"mergeMem0Hooks");init_esbuild_shims();import{existsSync as existsSync2,statSync}from"node:fs";import{dirname as dirname3,join as join5}from"node:path";function prepareBundledGeneratedUi(value,supported){if(value!==true)return{enabled:false};if(!supported){return{enabled:true,unavailableReason:"unsupported-runtime"}}let directory=resolveBundleDir(import.meta.url);let assetsDir=join5(directory,"generated-ui");let entry="main.js";if(!existsSync2(assetsDir)){while(dirname3(directory)!==directory){if(existsSync2(join5(directory,"integrations","generated-ui","package.json"))&&existsSync2(join5(directory,"scripts","copy_bundle_assets.js"))){const productAssets=join5(directory,"dist","generated-ui");if(existsSync2(productAssets)){assetsDir=productAssets}else{assetsDir=join5(directory,"integrations","generated-ui","dist");entry="bundled-main.js"}break}directory=dirname3(directory)}}const required=[entry,"app.html",join5("skills","generated-ui","SKILL.md"),"THIRD_PARTY_NOTICES.txt"];if(!required.every(file=>{try{return statSync(join5(assetsDir,file)).isFile()}catch{return false}})){return{enabled:true,unavailableReason:"assets-missing"}}return{enabled:true,skillsDir:join5(assetsDir,"skills"),server:{command:process.execPath,args:[join5(assetsDir,entry)],includeTools:["generated_ui_show"],trust:false}}}__name(prepareBundledGeneratedUi,"prepareBundledGeneratedUi");init_esbuild_shims();var import_strip_json_comments=__toESM(require_strip_json_comments(),1);import*as fs6 from"node:fs";import*as path8 from"node:path";import{homedir as homedir2}from"node:os";import{randomUUID as randomUUID3}from"node:crypto";init_esbuild_shims();init_esbuild_shims();init_esbuild_shims();var MANIFEST_CODE_POINT_LIMIT=64e3;var MAX_PREVIEW_CODE_POINTS=160;var MAX_METADATA_CODE_POINTS=32;var CLASSIFIER_PROMPT=`Classify whether the user is trying to manage channel memory.
|
|
@@ -28,19 +28,19 @@ User message (untrusted data):
|
|
|
28
28
|
`)}}}};init_esbuild_shims();function createChannelLoopController(store){return{create:__name(input=>store.create(input),"create"),createForTarget:__name((input,maxEnabledLoops)=>store.createForTarget(input,maxEnabledLoops),"createForTarget"),listForTarget:__name((channelName,target)=>store.listForTarget(channelName,target),"listForTarget"),disable:__name(id=>store.disable(id),"disable"),validateCron:__name(cron=>{parseCron(cron);nextFireTime(cron,new Date)},"validateCron"),nextFireTime:__name(job=>nextFireTime(job.cron,new Date(job.lastFiredAt??job.createdAt)),"nextFireTime")}}__name(createChannelLoopController,"createChannelLoopController");function isChannelCronEnabled(settings){if(process.env["QWEN_CODE_DISABLE_CRON"]==="1")return false;return settings.merged.experimental?.cron!==false}__name(isChannelCronEnabled,"isChannelCronEnabled");init_esbuild_shims();async function disconnectChannels(channels,options={}){const drains=[];for(const channel of channels){try{channel.disconnect()}catch{}try{const drain=channel.waitForDisconnect?.();if(drain)drains.push(drain.catch(()=>void 0))}catch{}}const draining=Promise.all(drains).then(()=>void 0);const timeoutMs=options.timeoutMs;if(timeoutMs===void 0){await draining;return}let timer;try{await Promise.race([draining,new Promise(resolve6=>{timer=setTimeout(()=>{options.onTimeout?.();resolve6()},Math.max(0,timeoutMs));timer.unref()})])}finally{if(timer!==void 0)clearTimeout(timer)}}__name(disconnectChannels,"disconnectChannels");var MAX_CRASH_RESTARTS=3;var CRASH_WINDOW_MS=5*60*1e3;var RESTART_DELAY_MS=3e3;var CHANNEL_DISCONNECT_DRAIN_MS=4e3;var BRIDGE_SESSION_RESTORE_TIMEOUT_MS=60*1e3;function disconnectStartedChannels(channels){return disconnectChannels(channels,{timeoutMs:CHANNEL_DISCONNECT_DRAIN_MS,onTimeout:__name(()=>{writeStderrLine(`[Channel] disconnect drain exceeded ${CHANNEL_DISCONNECT_DRAIN_MS}ms; continuing shutdown.`)},"onTimeout")})}__name(disconnectStartedChannels,"disconnectStartedChannels");function isFileExistsError(err){return typeof err==="object"&&err!==null&&err.code==="EEXIST"}__name(isFileExistsError,"isFileExistsError");function channelMemoryOptions(getBridge,cwd){return{channelMemory:{readChannelMemory,getChannelMemoryRevision,listChannelMemoryEntries,addChannelMemoryEntries,updateChannelMemoryEntry,removeChannelMemoryEntries,clearChannelMemory},memoryIntentClassifier:new BridgeChannelMemoryIntentClassifier(getBridge,cwd),channelMemoryRecallObserver:recordChannelMemoryRecallMetrics}}__name(channelMemoryOptions,"channelMemoryOptions");function isUnverifiablePidfileError(err){return err instanceof Error&&err.code==="channel_service_conflict"}__name(isUnverifiablePidfileError,"isUnverifiablePidfileError");async function writeServiceInfoOrExit(channels,cleanup){try{writeServiceInfo(channels)}catch(err){await cleanup();if(isFileExistsError(err)){writeStderrLine('Error: Channel service was started concurrently. Use "qwen channel status" to inspect it.');process.exit(1)}if(isUnverifiablePidfileError(err)){writeStderrLine(`Error: ${err.message}`);process.exit(1)}throw err}}__name(writeServiceInfoOrExit,"writeServiceInfoOrExit");async function cleanupStartedChannels(channels,bridge,router){await disconnectStartedChannels(channels);try{bridge.stop()}catch{}try{router.clearAll()}catch{}}__name(cleanupStartedChannels,"cleanupStartedChannels");function createBridgeReadinessGate(){let pending;let releasePending;return{current:__name(()=>pending,"current"),block:__name(()=>{if(pending)return;pending=new Promise(resolve6=>{releasePending=resolve6})},"block"),release:__name(()=>{const release=releasePending;pending=void 0;releasePending=void 0;release?.()},"release")}}__name(createBridgeReadinessGate,"createBridgeReadinessGate");async function restoreBridgeSessions(router){let timeout;const expired=new Promise((_,reject)=>{timeout=setTimeout(()=>reject(new Error(`Session restore timed out after ${BRIDGE_SESSION_RESTORE_TIMEOUT_MS}ms`)),BRIDGE_SESSION_RESTORE_TIMEOUT_MS);timeout.unref?.()});try{return await Promise.race([router.restoreSessions(),expired])}finally{clearTimeout(timeout)}}__name(restoreBridgeSessions,"restoreBridgeSessions");function createBridgeRecovery(options){const{bridgeOpts,router,channels,scheduler,bridgeReadiness,isShuttingDown,beginShutdown,getBridge,setBridge}=options;const crashTimestamps=[];let recoveryTask;let recoveryRequested=false;let recoverySourceBridge;const attachDisconnectHandler=__name(failedBridge=>{failedBridge.on("disconnected",()=>{for(const channel of channels.values()){channel.onBridgeDisconnected()}if(isShuttingDown()||failedBridge!==getBridge())return;if(recoveryTask){if(failedBridge!==recoverySourceBridge)recoveryRequested=true;return}recoverBridge()})},"attachDisconnectHandler");const recoverBridge=__name(()=>{bridgeReadiness.block();scheduler?.markBridgeRecovery();const task=(async()=>{do{recoveryRequested=false;recoverySourceBridge=getBridge();const now=Date.now();crashTimestamps.push(now);while(now-crashTimestamps[0]>=CRASH_WINDOW_MS){crashTimestamps.shift()}const recentCrashCount=crashTimestamps.length;if(recentCrashCount>MAX_CRASH_RESTARTS){beginShutdown();writeStderrLine(`[Channel] Bridge crashed ${recentCrashCount} times in ${CRASH_WINDOW_MS/1e3}s. Giving up.`);scheduler?.stop();await cleanupStartedChannels(channels.values(),getBridge(),router);removeServiceInfo();process.exit(1)}writeStderrLine(`[Channel] Bridge crashed (${recentCrashCount}/${MAX_CRASH_RESTARTS} in window). Restarting in ${RESTART_DELAY_MS/1e3}s...`);await new Promise(resolve6=>setTimeout(resolve6,RESTART_DELAY_MS));if(isShuttingDown())return;const bridge=new AcpBridge(bridgeOpts);try{await bridge.start()}catch(error){bridge.stop();throw error}if(isShuttingDown()){bridge.stop();return}setBridge(bridge);attachDisconnectHandler(bridge);router.setBridge(bridge);for(const channel of channels.values()){channel.setBridge(bridge)}registerToolCallDispatch(bridge,router,channels);registerBackgroundResponseRelay(bridge,router,channels);registerPermissionRelay(bridge,router,channels);registerSessionCleanup(bridge,router,channels);const result=await restoreBridgeSessions(router);if(isShuttingDown()){bridge.stop();return}writeStdoutLine(`[Channel] Bridge restarted. Sessions restored: ${result.restored}, failed: ${result.failed}`)}while(recoveryRequested&&!isShuttingDown())})().catch(async err=>{if(isShuttingDown())return;beginShutdown();writeStderrLine(`[Channel] Failed to restart bridge: ${err instanceof Error?err.message:String(err)}`);scheduler?.stop();await cleanupStartedChannels(channels.values(),getBridge(),router);removeServiceInfo();process.exit(1)}).finally(()=>{if(recoveryTask===task){recoveryTask=void 0;recoverySourceBridge=void 0;bridgeReadiness.release()}});recoveryTask=task},"recoverBridge");return{attachDisconnectHandler}}__name(createBridgeRecovery,"createBridgeRecovery");function checkDuplicateInstance(){const existing=readServiceInfo();if(existing){if(existing.owner==="serve"){writeStderrLine(`Error: Channel service is managed by qwen serve (PID ${existing.pid}, started ${existing.startedAt}).`);writeStderrLine("Stop the qwen serve process to stop managed channels.");process.exit(1)}writeStderrLine(`Error: Channel service is already running (PID ${existing.pid}, started ${existing.startedAt}).`);writeStderrLine('Use "qwen channel stop" to stop it first.');process.exit(1)}}__name(checkDuplicateInstance,"checkDuplicateInstance");async function startSingle(name,proxy,cronEnabled,locale,displayLanguage){checkDuplicateInstance();const channelsConfig=loadChannelsConfig();await loadChannelsFromExtensions();if(!channelsConfig[name]){writeStderrLine(`Error: Channel "${name}" not found in settings. Add it to channels.${name} in settings.json.`);process.exit(1)}let config;try{config=await parseChannelConfig(name,channelsConfig[name],process.cwd(),{resolveEnvVars:"available"});if(config.multiSession){throw new Error("multiSession is available only for daemon-managed Channels started by qwen serve.")}}catch(err){writeStderrLine(`Error: ${err instanceof Error?err.message:String(err)}`);process.exit(1)}const cliEntryPath=findCliEntryPath();let shuttingDown=false;const bridgeReadiness=createBridgeReadinessGate();const bridgeOpts={cliEntryPath,cwd:config.cwd,model:config.model};let bridge=new AcpBridge(bridgeOpts);await bridge.start();const router=new SessionRouter(bridge,config.cwd,config.sessionScope,sessionsPath());router.setChannelApprovalMode(name,config.approvalMode);const loopStore=cronEnabled?new ChannelLoopStore({filePath:channelLoopPath()}):void 0;const loopController=loopStore?createChannelLoopController(loopStore):void 0;const channels=new Map;const channel=await createChannel(name,config,bridge,{locale,router,proxy,...displayLanguage?{displayLanguage}:{},...channelMemoryOptions(()=>bridge,config.cwd),...loopController?{loopController}:{},bridgeRecovery:bridgeReadiness.current});channels.set(name,channel);const scheduler=loopStore?new ChannelLoopScheduler({store:loopStore,channels,nextFireTime}):void 0;registerToolCallDispatch(bridge,router,channels);registerBackgroundResponseRelay(bridge,router,channels);registerPermissionRelay(bridge,router,channels);registerSessionCleanup(bridge,router,channels);let serviceInfoWritten=false;let shutdownTask;const shutdown=__name(()=>{const runningShutdown=shutdownTask;if(runningShutdown){process.exit(1);return runningShutdown}shuttingDown=true;shutdownTask=(async()=>{ignoreBrokenPipe();writeStdoutLineSafe("\n[Channel] Shutting down...");scheduler?.stop();await disconnectStartedChannels([channel]);bridge.stop();router.clearAll();if(serviceInfoWritten)removeServiceInfo();process.exit(0)})();return shutdownTask},"shutdown");const detachShutdownHandlers=__name(()=>{process.off("SIGINT",shutdown);process.off("SIGTERM",shutdown)},"detachShutdownHandlers");process.on("SIGINT",shutdown);process.on("SIGTERM",shutdown);try{await channel.connect()}catch(err){if(shuttingDown)return shutdownTask;detachShutdownHandlers();writeStderrLine(`Error: ${err instanceof Error?err.message:String(err)}`);await cleanupStartedChannels([channel],bridge,router);process.exit(1)}if(shuttingDown)return shutdownTask;try{await writeServiceInfoOrExit([name],()=>{detachShutdownHandlers();return cleanupStartedChannels([channel],bridge,router)});serviceInfoWritten=true}catch(error){detachShutdownHandlers();throw error}scheduler?.start();writeStdoutLine(`[Channel] "${name}" is running. Press Ctrl+C to stop.`);const{attachDisconnectHandler}=createBridgeRecovery({bridgeOpts,router,channels,scheduler,bridgeReadiness,isShuttingDown:__name(()=>shuttingDown,"isShuttingDown"),beginShutdown:__name(()=>{shuttingDown=true;detachShutdownHandlers();shutdownTask??=Promise.resolve()},"beginShutdown"),getBridge:__name(()=>bridge,"getBridge"),setBridge:__name(next=>{bridge=next},"setBridge")});attachDisconnectHandler(bridge);await new Promise(()=>{})}__name(startSingle,"startSingle");async function startAll(proxy,cronEnabled,locale,displayLanguage){checkDuplicateInstance();const channelsConfig=loadChannelsConfig();await loadChannelsFromExtensions();if(Object.keys(channelsConfig).length===0){writeStderrLine('Error: No channels configured in settings.json. Add entries under "channels".');process.exit(1)}let parsed;try{parsed=await parseConfiguredChannels(channelsConfig,Object.keys(channelsConfig));if(parsed.some(({config})=>config.multiSession)){throw new Error("multiSession is available only for daemon-managed Channels started by qwen serve.")}}catch(err){writeStderrLine(err instanceof Error?err.message:String(err));process.exit(1)}const cliEntryPath=findCliEntryPath();const defaultCwd=process.cwd();let shuttingDown=false;const bridgeReadiness=createBridgeReadinessGate();const bridgeOpts={cliEntryPath,cwd:defaultCwd,model:selectFirstModel(parsed,"Shared bridge")};let bridge=new AcpBridge(bridgeOpts);await bridge.start();const router=new SessionRouter(bridge,defaultCwd,"user",sessionsPath());const loopStore=cronEnabled?new ChannelLoopStore({filePath:channelLoopPath()}):void 0;const loopController=loopStore?createChannelLoopController(loopStore):void 0;for(const{name,config}of parsed){router.setChannelScope(name,config.sessionScope);router.setChannelApprovalMode(name,config.approvalMode)}const channels=new Map;writeStdoutLine(`[Channel] Starting ${parsed.length} channel(s): ${parsed.map(p=>p.name).join(", ")}`);for(const{name,config}of parsed){channels.set(name,await createChannel(name,config,bridge,{locale,router,proxy,...displayLanguage?{displayLanguage}:{},...channelMemoryOptions(()=>bridge,config.cwd),...loopController?{loopController}:{},bridgeRecovery:bridgeReadiness.current}))}registerToolCallDispatch(bridge,router,channels);registerBackgroundResponseRelay(bridge,router,channels);registerPermissionRelay(bridge,router,channels);registerSessionCleanup(bridge,router,channels);const connectedChannels=new Map;const scheduler=loopStore?new ChannelLoopScheduler({store:loopStore,channels:connectedChannels,nextFireTime}):void 0;let serviceInfoWritten=false;let shutdownTask;const shutdown=__name(()=>{const runningShutdown=shutdownTask;if(runningShutdown){process.exit(1);return runningShutdown}shuttingDown=true;shutdownTask=(async()=>{ignoreBrokenPipe();writeStdoutLineSafe("\n[Channel] Shutting down...");scheduler?.stop();await disconnectStartedChannels(channels.values());for(const name of channels.keys()){writeStdoutLineSafe(`[Channel] "${name}" disconnected.`)}bridge.stop();router.clearAll();if(serviceInfoWritten)removeServiceInfo();process.exit(0)})();return shutdownTask},"shutdown");const detachShutdownHandlers=__name(()=>{process.off("SIGINT",shutdown);process.off("SIGTERM",shutdown)},"detachShutdownHandlers");process.on("SIGINT",shutdown);process.on("SIGTERM",shutdown);let connectedCount=0;for(const[name,channel]of channels){if(shuttingDown)return shutdownTask;try{await channel.connect();if(shuttingDown)return shutdownTask;connectedChannels.set(name,channel);connectedCount++;writeStdoutLine(`[Channel] "${name}" connected.`)}catch(err){if(shuttingDown)return shutdownTask;writeStderrLine(`[Channel] Failed to connect "${name}": ${err instanceof Error?err.message:String(err)}`)}}if(connectedCount===0){detachShutdownHandlers();writeStderrLine("[Channel] No channels connected. Exiting.");await cleanupStartedChannels(channels.values(),bridge,router);process.exit(1)}try{await writeServiceInfoOrExit(parsed.map(p=>p.name),()=>{detachShutdownHandlers();return cleanupStartedChannels(channels.values(),bridge,router)});serviceInfoWritten=true}catch(error){detachShutdownHandlers();throw error}scheduler?.start();writeStdoutLine(`[Channel] Running ${connectedCount} channel(s). Press Ctrl+C to stop.`);const{attachDisconnectHandler}=createBridgeRecovery({bridgeOpts,router,channels,scheduler,bridgeReadiness,isShuttingDown:__name(()=>shuttingDown,"isShuttingDown"),beginShutdown:__name(()=>{shuttingDown=true;detachShutdownHandlers();shutdownTask??=Promise.resolve()},"beginShutdown"),getBridge:__name(()=>bridge,"getBridge"),setBridge:__name(next=>{bridge=next},"setBridge")});attachDisconnectHandler(bridge);await new Promise(()=>{})}__name(startAll,"startAll");var startCommand={command:"start [name]",describe:"Start channels (all if no name given, or a single named channel)",builder:__name(yargs=>yargs.positional("name",{type:"string",describe:"Channel name (omit to start all configured channels)"}),"builder"),handler:__name(async argv=>{const settings=loadSettings(process.cwd());const proxy=await resolveProxy(argv["proxy"],settings.merged.proxy);const cronEnabled=isChannelCronEnabled(settings);const locale=resolveChannelLocale(settings.merged.general?.language);const displayLanguage=resolveLanguage(resolveLanguageSetting(settings.merged.general?.language));if(argv.name){await startSingle(argv.name,proxy,cronEnabled,locale,displayLanguage)}else{await startAll(proxy,cronEnabled,locale,displayLanguage)}},"handler")};init_esbuild_shims();function reportUnstoppableService(info,outcome){const filePath=pidFilePath();if(outcome==="not-permitted"){writeStderrLine(`Permission denied signalling the service (PID ${info.pid}); it may be owned by another user sharing this home. Stop it as that user \u2014 once the process is gone, the record at ${filePath} is swept on the next read.`);return}if(info.procStart==null){writeStderrLine(`Could not stop PID ${info.pid}, and the record carries no process token, so this command cannot confirm it is the channel service. If no channel service is running, delete ${filePath} and start again.`);return}if(outcome==="sent"){writeStderrLine(`Service is still running after SIGKILL; its record at ${filePath} was left in place.`);return}writeStderrLine(`Failed to signal the service and could not re-verify its process token; its record at ${filePath} was left in place.`)}__name(reportUnstoppableService,"reportUnstoppableService");var stopCommand={command:"stop",describe:"Stop the running channel service",builder:__name(yargs=>yargs.option("daemon-url",{type:"string",description:"Stop channels managed by the daemon at this URL"}).option("token",{type:"string",description:"Daemon bearer token"}).option("timeout",{type:"number",description:"Request timeout in milliseconds"}),"builder"),handler:__name(async argv=>{if(argv["daemon-url"]){const token=argv.token??process.env[QWEN_SERVER_TOKEN_ENV]??process.env[QWEN_DAEMON_TOKEN_ENV];try{const sdk=await import("./daemon-L5HVRGXV.js");const client=new sdk.DaemonClient({baseUrl:argv["daemon-url"],...token?{token}:{}});const result=await client.stopChannelWorker(argv.timeout!==void 0?{timeoutMs:argv.timeout}:void 0);writeStdoutLine(result.changed?"Daemon-managed channels stopped.":"Daemon-managed channels are already stopped.");process.exit(0)}catch(error){writeStderrLine(`Failed to stop daemon-managed channels: ${error instanceof Error?error.message:String(error)}`);process.exit(1)}return}const info=readServiceInfo();if(!info){writeStdoutLine("No channel service is running.");process.exit(0)}if(info.owner==="serve"){writeStderrLine(`Channel service is managed by qwen serve (PID ${info.pid}). Stop qwen serve to stop channels.`);process.exit(1)}writeStdoutLine(`Stopping channel service (PID ${info.pid})...`);const outcome=signalService(info.pid,"SIGTERM",info.procStart);if(outcome!=="sent"){if(isSameProcess(info.pid,info.procStart)){reportUnstoppableService(info,outcome);process.exit(1)}writeStderrLine("Failed to send signal \u2014 process may have already exited.");removeServiceInfo(info);process.exit(0)}const exited=await waitForExit(info.pid,5e3,200,info.procStart);if(exited){removeServiceInfo(info);writeStdoutLine("Service stopped.")}else{writeStderrLine("Service did not exit within 5 seconds. Sending SIGKILL...");const killOutcome=signalService(info.pid,"SIGKILL",info.procStart);if(await waitForExit(info.pid,2e3,200,info.procStart)){removeServiceInfo(info);writeStdoutLine("Service killed.")}else{reportUnstoppableService(info,killOutcome);process.exit(1)}}process.exit(0)},"handler")};init_esbuild_shims();import{existsSync as existsSync3,readFileSync}from"node:fs";import*as path from"node:path";init_esbuild_shims();function sanitizeValue(value,maxLength){const normalized=normalizeWorkerDiagnostic(value);return sanitizeLogText(redactLogCredentials(normalized),maxLength)}__name(sanitizeValue,"sanitizeValue");function sanitizeChannelCommandValue(value,maxLength=512){return sanitizeValue(value,maxLength)}__name(sanitizeChannelCommandValue,"sanitizeChannelCommandValue");function safeChannelCommandErrorMessage(error){let value;try{const message=error&&(typeof error==="object"||typeof error==="function")?Reflect.get(error,"message"):void 0;value=typeof message==="string"&&message.length>0?message:String(error)}catch{value="Unknown error"}return sanitizeChannelCommandValue(value)||"Unknown error"}__name(safeChannelCommandErrorMessage,"safeChannelCommandErrorMessage");function channelStartupFailureBody(error){if(!error||typeof error!=="object"&&typeof error!=="function"){return void 0}try{const body=Reflect.get(error,"body");return body&&typeof body==="object"&&!Array.isArray(body)&&Reflect.get(body,"code")==="channel_worker_start_failed"?body:void 0}catch{return void 0}}__name(channelStartupFailureBody,"channelStartupFailureBody");function formatChannelStartupFailures(source,fallbackWorkspaceCwd){if(!source||typeof source!=="object"||Array.isArray(source))return[];let rawFailures;let rawTruncated;try{rawFailures=Reflect.get(source,"startupFailures");rawTruncated=Reflect.get(source,"startupFailuresTruncated")}catch{return[]}if(!Array.isArray(rawFailures))return[];let limitedFailures;let rawFailureCount;try{limitedFailures=rawFailures.slice(0,MAX_CHANNEL_STARTUP_FAILURES);rawFailureCount=rawFailures.length}catch{return[]}const lines=[];for(const raw of limitedFailures){try{if(!raw||typeof raw!=="object"||Array.isArray(raw))continue;const channel=Reflect.get(raw,"channel");const phase=Reflect.get(raw,"phase");const message=Reflect.get(raw,"message");const rawCode=Reflect.get(raw,"code");const rawWorkspace=Reflect.get(raw,"workspaceCwd");if(typeof channel!=="string"||channel.length===0||phase!=="connect"||typeof message!=="string"||message.length===0||rawCode!==void 0&&(typeof rawCode!=="string"||rawCode.length===0)||rawWorkspace!==void 0&&typeof rawWorkspace!=="string"){continue}const safeChannel=sanitizeValue(channel,MAX_CHANNEL_STARTUP_FAILURE_CHANNEL_LENGTH);const safeMessage=sanitizeValue(message,MAX_CHANNEL_STARTUP_FAILURE_MESSAGE_LENGTH);const workspace=sanitizeValue(typeof rawWorkspace==="string"?rawWorkspace:fallbackWorkspaceCwd??"",4096);const code=typeof rawCode==="string"?sanitizeValue(rawCode,MAX_CHANNEL_STARTUP_FAILURE_CODE_LENGTH):void 0;if(!safeChannel||!safeMessage)continue;const fields=[...workspace?[`workspace=${workspace}`]:[],`channel=${safeChannel}`,"phase=connect",...code?[`code=${code}`]:[]];lines.push(`[Channel] Startup failure (${fields.join(", ")}): ${safeMessage}`)}catch{}}if(rawTruncated===true||rawFailureCount>MAX_CHANNEL_STARTUP_FAILURES){lines.push("[Channel] Additional startup failures were truncated.")}return lines}__name(formatChannelStartupFailures,"formatChannelStartupFailures");function formatUptime(startedAt){const ms=Date.now()-new Date(startedAt).getTime();const seconds=Math.floor(ms/1e3);const minutes=Math.floor(seconds/60);const hours=Math.floor(minutes/60);const days=Math.floor(hours/24);if(days>0)return`${days}d ${hours%24}h ${minutes%60}m`;if(hours>0)return`${hours}h ${minutes%60}m`;if(minutes>0)return`${minutes}m ${seconds%60}s`;return`${seconds}s`}__name(formatUptime,"formatUptime");var statusCommand={command:"status",describe:"Show channel service status",builder:__name(yargs=>yargs.option("daemon-url",{type:"string",description:"Read channel state from the daemon at this URL"}).option("token",{type:"string",description:"Daemon bearer token"}).option("timeout",{type:"number",description:"Request timeout in milliseconds"}),"builder"),handler:__name(async argv=>{if(argv["daemon-url"]){const token=argv.token??process.env[QWEN_SERVER_TOKEN_ENV]??process.env[QWEN_DAEMON_TOKEN_ENV];try{const sdk=await import("./daemon-L5HVRGXV.js");const client=new sdk.DaemonClient({baseUrl:argv["daemon-url"],...token?{token}:{}});const state=await client.getChannelWorkerControl(argv.timeout!==void 0?{timeoutMs:argv.timeout}:void 0);writeStdoutLine(`Daemon channels: ${state.enabled?"enabled":"disabled"} (${state.transition})`);if(state.selection){writeStdoutLine(`Selection: ${state.selection.mode==="all"?"all":(state.selection.names??[]).join(", ")}`)}for(const worker of state.workers){writeStdoutLine(`${worker.workspaceCwd}: ${worker.state}; channels=${worker.channels.join(", ")||"none"}${worker.pid!==void 0?`; pid=${worker.pid}`:""}`);for(const line of formatChannelStartupFailures(worker,worker.workspaceCwd)){writeStdoutLine(line)}}process.exit(0)}catch(error){writeStderrLine(`Failed to read daemon channel status: ${safeChannelCommandErrorMessage(error)}`);process.exit(1)}return}const info=readServiceInfo();if(!info){writeStdoutLine("No channel service is running.");process.exit(0)}if(info.owner==="serve"){writeStdoutLine(`Channel service: managed by qwen serve (PID ${info.pid})`);if(info.workerPid!==void 0){writeStdoutLine(`Worker PID: ${info.workerPid}`)}}else{writeStdoutLine(`Channel service: running (PID ${info.pid})`)}writeStdoutLine(`Uptime: ${formatUptime(info.startedAt)}`);writeStdoutLine("");const sessionsPath2=path.join(Storage.getGlobalQwenDir(),"channels","sessions.json");const sessionCounts=new Map;if(existsSync3(sessionsPath2)){try{const entries=JSON.parse(readFileSync(sessionsPath2,"utf-8"));for(const entry of Object.values(entries)){const name=entry.target.channelName;sessionCounts.set(name,(sessionCounts.get(name)||0)+1)}}catch{}}const nameWidth=Math.max(15,...info.channels.map(c=>c.length+2));writeStdoutLine(`${"Channel".padEnd(nameWidth)}Sessions`);writeStdoutLine(`${"-".repeat(nameWidth)}--------`);for(const name of info.channels){const count=sessionCounts.get(name)||0;writeStdoutLine(`${name.padEnd(nameWidth)}${count}`)}process.exit(0)},"handler")};init_esbuild_shims();var DEFAULT_DAEMON_URL="http://127.0.0.1:4170";function resolveDaemonUrl(flag){return flag||process.env[QWEN_DAEMON_URL_ENV]||DEFAULT_DAEMON_URL}__name(resolveDaemonUrl,"resolveDaemonUrl");function resolveToken(flag){return flag??process.env[QWEN_SERVER_TOKEN_ENV]??process.env[QWEN_DAEMON_TOKEN_ENV]}__name(resolveToken,"resolveToken");var reloadCommand={command:"reload",describe:"Reload the daemon-managed channel worker so it re-reads settings.json",builder:__name(yargs=>yargs.option("daemon-url",{type:"string",description:`Daemon base URL (default: $${QWEN_DAEMON_URL_ENV} or ${DEFAULT_DAEMON_URL})`}).option("token",{type:"string",description:`Bearer token (default: $${QWEN_SERVER_TOKEN_ENV} or $${QWEN_DAEMON_TOKEN_ENV})`}).option("timeout",{type:"number",description:"Request timeout in milliseconds"}),"builder"),handler:__name(async argv=>{const baseUrl=resolveDaemonUrl(argv["daemon-url"]);const token=resolveToken(argv.token);let sdk;try{sdk=await import("./daemon-L5HVRGXV.js")}catch(err){writeStderrLine(`[Channel] Failed to load daemon SDK: ${safeChannelCommandErrorMessage(err)}`);process.exit(1)}const client=new sdk.DaemonClient({baseUrl,...token?{token}:{}});try{const result=await client.reloadChannelWorker(argv.timeout!==void 0?{timeoutMs:argv.timeout}:void 0);const worker=result.worker;const parts=[`state=${worker.state}`,`channels=${worker.channels.join(", ")||"none"}`,...worker.pid!==void 0?[`pid=${worker.pid}`]:[],...worker.restartCount!==void 0?[`restarts=${worker.restartCount}`]:[],...worker.error?[`error=${worker.error}`]:[]];writeStdoutLine(`[Channel] Reloaded (${parts.join(", ")}).`);for(const line of formatChannelStartupFailures(worker)){writeStdoutLine(line)}process.exit(0)}catch(err){const safeBaseUrl=sanitizeChannelCommandValue(baseUrl,2048);writeStderrLine(`[Channel] Reload failed (${safeBaseUrl}): ${safeChannelCommandErrorMessage(err)}`);for(const line of formatChannelStartupFailures(channelStartupFailureBody(err))){writeStderrLine(line)}process.exit(1)}},"handler")};init_esbuild_shims();var DEFAULT_DAEMON_URL2="http://127.0.0.1:4170";var setCommand2={command:"set <names..>",describe:"Set the channel selection for a running qwen serve daemon",builder:__name(yargs=>yargs.positional("names",{type:"string",array:true,demandOption:true,describe:'Channel names, or the single value "all"'}).option("daemon-url",{type:"string",description:`Daemon base URL (default: $${QWEN_DAEMON_URL_ENV} or ${DEFAULT_DAEMON_URL2})`}).option("token",{type:"string",description:`Bearer token (default: $${QWEN_SERVER_TOKEN_ENV} or $${QWEN_DAEMON_TOKEN_ENV})`}).option("timeout",{type:"number",description:"Request timeout in milliseconds"}),"builder"),handler:__name(async argv=>{const names=[...new Set((argv.names??[]).map(name=>name.trim()))].filter(Boolean);if(names.length===0||names.includes("all")&&names.length!==1){writeStderrLine('[Channel] Pass one or more channel names, or "all" by itself.');process.exit(1);return}const baseUrl=argv["daemon-url"]||process.env[QWEN_DAEMON_URL_ENV]||DEFAULT_DAEMON_URL2;const token=argv.token??process.env[QWEN_SERVER_TOKEN_ENV]??process.env[QWEN_DAEMON_TOKEN_ENV];const selection=names[0]==="all"?{mode:"all"}:{mode:"names",names};let sdk;try{sdk=await import("./daemon-L5HVRGXV.js")}catch(error){writeStderrLine(`[Channel] Failed to load daemon SDK: ${safeChannelCommandErrorMessage(error)}`);process.exit(1);return}try{const client=new sdk.DaemonClient({baseUrl,...token?{token}:{}});const result=await client.setChannelWorkerSelection(selection,argv.timeout!==void 0?{timeoutMs:argv.timeout}:void 0);const workers=result.state.workers.map(worker=>`${worker.workspaceCwd}:${worker.channels.join(",")||"none"}`).join("; ");writeStdoutLine(`[Channel] Selection ${result.changed?"applied":"unchanged"} (replaced=${result.replaced}, partial=${result.partial}, workers=${workers||"none"}).`);for(const worker of result.state.workers){for(const line of formatChannelStartupFailures(worker,worker.workspaceCwd)){writeStdoutLine(line)}}process.exit(0)}catch(error){const safeBaseUrl=sanitizeChannelCommandValue(baseUrl,2048);writeStderrLine(`[Channel] Set failed (${safeBaseUrl}): ${safeChannelCommandErrorMessage(error)}`);for(const line of formatChannelStartupFailures(channelStartupFailureBody(error))){writeStderrLine(line)}process.exit(1)}},"handler")};init_esbuild_shims();init_esbuild_shims();import{chmodSync,existsSync as existsSync4,mkdirSync,readFileSync as readFileSync2}from"node:fs";import{dirname as dirname4}from"node:path";var REGISTRY_VERSION=1;var MAX_OBSERVATIONS=500;var MAX_CHANNEL_NAME_LENGTH=256;var MAX_LABEL_LENGTH=256;var MAX_ID_LENGTH=4096;var OBSERVED_CONTACT_MAX_FRESH_WITHIN_SECONDS=365*24*60*60;var ObservedChannelContactStore=class{constructor(filePath,options={}){this.filePath=filePath;this.now=options.now??(()=>new Date);this.maxObservations=options.maxObservations??MAX_OBSERVATIONS}static{__name(this,"ObservedChannelContactStore")}now;maxObservations;observe(channelName,observation){this.validateObservation(channelName,observation);const observedAt=this.now();const next={channelName,user:this.normalizeIdentity(observation.user),...observation.group?{group:this.normalizeIdentity(observation.group)}:{},...observation.topic?{topic:this.normalizeIdentity(observation.topic)}:{},lastObservedAt:observedAt.toISOString()};const key=this.observationKey(next);const retentionCutoff=observedAt.getTime()-OBSERVED_CONTACT_MAX_FRESH_WITHIN_SECONDS*1e3;const observations=this.readObservations().filter(candidate=>Date.parse(candidate.lastObservedAt)>=retentionCutoff&&this.observationKey(candidate)!==key).concat(next).sort((a,b)=>b.lastObservedAt.localeCompare(a.lastObservedAt)).slice(0,this.maxObservations);this.persist(observations)}list(options){const{freshWithinSeconds}=options;if(!Number.isInteger(freshWithinSeconds)||freshWithinSeconds<1||freshWithinSeconds>OBSERVED_CONTACT_MAX_FRESH_WITHIN_SECONDS){throw new Error("Invalid observed contact freshness.")}const cutoff=this.now().getTime()-freshWithinSeconds*1e3;const observations=this.readObservations().filter(observation=>Date.parse(observation.lastObservedAt)>=cutoff).sort((a,b)=>b.lastObservedAt.localeCompare(a.lastObservedAt));const users=new Map;const groups=new Map;for(const observation of observations){if(!observation.group){const key=this.identityKey(observation.channelName,observation.user.id);if(!users.has(key)){users.set(key,{channelName:observation.channelName,...observation.user,lastObservedAt:observation.lastObservedAt})}continue}const groupKey=this.identityKey(observation.channelName,observation.group.id);let group=groups.get(groupKey);if(!group){group={channelName:observation.channelName,...observation.group,lastObservedAt:observation.lastObservedAt,users:[],topics:[],userMap:new Map,topicMap:new Map};groups.set(groupKey,group)}if(!group.userMap.has(observation.user.id)){group.userMap.set(observation.user.id,{...observation.user,lastObservedAt:observation.lastObservedAt})}if(observation.topic){let topic=group.topicMap.get(observation.topic.id);if(!topic){topic={...observation.topic,lastObservedAt:observation.lastObservedAt,users:[],userMap:new Map};group.topicMap.set(observation.topic.id,topic)}if(!topic.userMap.has(observation.user.id)){topic.userMap.set(observation.user.id,{...observation.user,lastObservedAt:observation.lastObservedAt})}}}return{users:[...users.values()],groups:[...groups.values()].map(group=>({channelName:group.channelName,id:group.id,label:group.label,lastObservedAt:group.lastObservedAt,users:[...group.userMap.values()],topics:[...group.topicMap.values()].map(topic=>({id:topic.id,label:topic.label,lastObservedAt:topic.lastObservedAt,users:[...topic.userMap.values()]}))}))}}readObservations(){if(!existsSync4(this.filePath))return[];let parsed;try{parsed=JSON.parse(readFileSync2(this.filePath,"utf-8"))}catch{throw new Error("Invalid observed contact registry.")}if(!parsed||typeof parsed!=="object"||Array.isArray(parsed)){throw new Error("Invalid observed contact registry.")}const record=parsed;if(record["version"]!==REGISTRY_VERSION){throw new Error("Unsupported observed contact registry version.")}if(!Array.isArray(record["observations"])||record["observations"].length>this.maxObservations){throw new Error("Invalid observed contact registry.")}const observations=record["observations"].map(raw=>this.parseObservation(raw));const keys=new Set(observations.map(item=>this.observationKey(item)));if(keys.size!==observations.length){throw new Error("Invalid observed contact registry.")}return observations}parseObservation(raw){if(!raw||typeof raw!=="object"||Array.isArray(raw)){throw new Error("Invalid observed contact registry.")}const record=raw;const channelName=record["channelName"];const lastObservedAt=record["lastObservedAt"];const user=this.parseIdentity(record["user"]);const group=record["group"]===void 0?void 0:this.parseIdentity(record["group"]);const topic=record["topic"]===void 0?void 0:this.parseIdentity(record["topic"]);if(!this.isBoundedString(channelName,MAX_CHANNEL_NAME_LENGTH)||typeof lastObservedAt!=="string"||!this.isCanonicalTimestamp(lastObservedAt)||topic!==void 0&&group===void 0){throw new Error("Invalid observed contact registry.")}return{channelName,user,...group?{group}:{},...topic?{topic}:{},lastObservedAt}}parseIdentity(raw){if(!raw||typeof raw!=="object"||Array.isArray(raw)){throw new Error("Invalid observed contact registry.")}const record=raw;const id=record["id"];const label=record["label"];if(!this.isBoundedString(id,MAX_ID_LENGTH)||!this.isBoundedString(label,MAX_LABEL_LENGTH)){throw new Error("Invalid observed contact registry.")}return{id,label}}validateObservation(channelName,observation){if(!this.isBoundedString(channelName,MAX_CHANNEL_NAME_LENGTH)||!this.isIdentity(observation.user)||observation.group!==void 0&&!this.isIdentity(observation.group)||observation.topic!==void 0&&!this.isIdentity(observation.topic)||observation.topic!==void 0&&observation.group===void 0){throw new Error("Invalid observed contact observation.")}}isIdentity(value){return this.isBoundedString(value.id,MAX_ID_LENGTH)&&this.isBoundedString(value.label,MAX_ID_LENGTH)}normalizeIdentity(value){return{id:value.id,label:this.truncateLabel(value.label)}}truncateLabel(value){let result="";for(const character of value){if(result.length+character.length>MAX_LABEL_LENGTH)break;result+=character}return result}observationKey(observation){return JSON.stringify([observation.channelName,observation.user.id,observation.group?.id??"",observation.topic?.id??""])}identityKey(channelName,id){return JSON.stringify([channelName,id])}persist(observations){const dir=dirname4(this.filePath);mkdirSync(dir,{recursive:true,mode:448});try{chmodSync(dir,448)}catch{}const data={version:REGISTRY_VERSION,observations};atomicWriteFileSync(this.filePath,JSON.stringify(data,null,2),{encoding:"utf-8",mode:384,forceMode:true,noFollow:true})}isBoundedString(value,maxLength){return typeof value==="string"&&value.length>0&&value.length<=maxLength}isCanonicalTimestamp(value){const timestamp=Date.parse(value);return Number.isFinite(timestamp)&&new Date(timestamp).toISOString()===value}};var SESSION_SHELL_COMMAND_FEATURE="session_shell_command";var SESSION_ATTACHMENTS_FEATURE="session_attachments";var SESSION_BTW_FEATURE="session_btw";var SESSION_PERMISSION_VOTE_FEATURE="session_permission_vote";var SESSION_WORKTREE_PERSISTENCE_FEATURE="session_worktree_persistence_v1";var SESSION_WORKTREE_RESET_FEATURE="session_worktree_reset_v1";var MAX_ACTIVE_WEBHOOK_TASKS=16;var WORKER_CHANNEL_DISCONNECT_DRAIN_MS=CHANNEL_WORKER_STOP_GRACE_MS-CHANNEL_WORKER_KILL_GRACE_MS;var WORKER_STARTUP_ROLLBACK_DRAIN_MS=1500;async function disconnectWorkerChannels(channels,timeoutMs=WORKER_CHANNEL_DISCONNECT_DRAIN_MS){await disconnectChannels(channels,{timeoutMs,onTimeout:__name(()=>{writeStderrLineSafe(`[Channel] disconnect drain exceeded ${timeoutMs}ms; continuing worker shutdown.`)},"onTimeout")})}__name(disconnectWorkerChannels,"disconnectWorkerChannels");function createDaemonSessionFactory({client,DaemonSessionClient:DaemonSessionClient2,clientId}){return async req=>{const daemonReq={workspaceCwd:req.workspaceCwd,...req.modelServiceId?{modelServiceId:req.modelServiceId}:{},...req.approvalMode?{approvalMode:req.approvalMode}:{},sessionScope:"thread",sourceType:"channel",...req.sourceId?{sourceId:req.sourceId}:{}};if(req.worktreeReset){return await DaemonSessionClient2.resetWorktree(client,req.worktreeReset.sessionId,daemonReq)}if(req.sessionId){return await DaemonSessionClient2.resume(client,req.sessionId,daemonReq,clientId)}return await DaemonSessionClient2.createOrAttach(client,{...daemonReq,...req.worktree?{worktree:req.worktree}:{}},clientId)}}__name(createDaemonSessionFactory,"createDaemonSessionFactory");function createDaemonChannelBridgeFacade(bridge,opts){const facade={get availableCommands(){return bridge.availableCommands},on:bridge.on.bind(bridge),off:bridge.off.bind(bridge),newSession:bridge.newSession.bind(bridge),loadSession:bridge.loadSession.bind(bridge),prompt:bridge.prompt.bind(bridge),cancelSession:bridge.cancelSession.bind(bridge)};if(opts.exposeBtw&&bridge.btw){facade.btw=bridge.btw.bind(bridge)}if(bridge.respondToPermission){facade.respondToPermission=bridge.respondToPermission.bind(bridge)}if(bridge.discardSession){facade.discardSession=bridge.discardSession.bind(bridge)}if(bridge.deleteSessionData){facade.deleteSessionData=bridge.deleteSessionData.bind(bridge)}if(bridge.getAvailableCommands){facade.getAvailableCommands=bridge.getAvailableCommands.bind(bridge)}if(opts.exposeShellCommand&&bridge.shellCommand){facade.shellCommand=bridge.shellCommand.bind(bridge)}if(bridge.listSessions){facade.listSessions=bridge.listSessions.bind(bridge)}if(bridge.resetWorktreeSession){facade.resetWorktreeSession=bridge.resetWorktreeSession.bind(bridge)}if(bridge.registerChannelLoopToolHandler){facade.registerChannelLoopToolHandler=bridge.registerChannelLoopToolHandler.bind(bridge)}return facade}__name(createDaemonChannelBridgeFacade,"createDaemonChannelBridgeFacade");async function loadDaemonSdk(){return await import("./daemon-L5HVRGXV.js")}__name(loadDaemonSdk,"loadDaemonSdk");function selectedChannelNames(channelsConfig,selection){const names=selection.mode==="all"?Object.keys(channelsConfig):selection.names;if(names.length===0){throw new Error("No channels configured in settings.json.")}for(const name of names){if(!channelsConfig[name]){throw new Error(`Channel "${name}" not found in settings.`)}}return names}__name(selectedChannelNames,"selectedChannelNames");function validateChannelWorkspaces(parsed,daemonWorkspace){for(const{name,config}of parsed){const channelWorkspace=canonicalizeWorkspace(config.cwd);if(channelWorkspace!==daemonWorkspace){throw new Error(`Channel "${name}" cwd "${channelWorkspace}" must use daemon workspace "${daemonWorkspace}".`)}}}__name(validateChannelWorkspaces,"validateChannelWorkspaces");function validateDaemonWorkerUrl(daemonUrl){let parsed;try{parsed=new URL(daemonUrl)}catch{throw new Error(`${QWEN_DAEMON_URL_ENV} must be a valid URL.`)}if(parsed.protocol!=="http:"&&parsed.protocol!=="https:"){throw new Error(`${QWEN_DAEMON_URL_ENV} must use an http(s) loopback URL or a literal address of one of this machine's interfaces.`)}if(isLoopbackBind(parsed.hostname))return;if(!isOwnInterfaceAddress(parsed.hostname)){throw new Error(`${QWEN_DAEMON_URL_ENV} must use an http(s) loopback URL or a literal address of one of this machine's interfaces.`)}}__name(validateDaemonWorkerUrl,"validateDaemonWorkerUrl");function startupAbortError(){return new Error("Daemon worker startup aborted.")}__name(startupAbortError,"startupAbortError");async function abortableStartup(value,signal){const promise=Promise.resolve(value);if(!signal)return await promise;if(signal.aborted)throw startupAbortError();return await new Promise((resolve6,reject)=>{const onAbort=__name(()=>{reject(startupAbortError())},"onAbort");signal.addEventListener("abort",onAbort,{once:true});promise.then(resolve6,reject).finally(()=>{signal.removeEventListener("abort",onAbort)})})}__name(abortableStartup,"abortableStartup");function throwIfStartupAborted(signal){if(signal?.aborted){throw startupAbortError()}}__name(throwIfStartupAborted,"throwIfStartupAborted");function readConnectErrorMessage(error){if(typeof error==="object"&&error!==null||typeof error==="function"){try{const message=Reflect.get(error,"message");if(typeof message==="string"&&message.length>0){return message}}catch{return"Channel connection failed."}}try{const message=String(error);return message.length>0?message:"Channel connection failed."}catch{return"Channel connection failed."}}__name(readConnectErrorMessage,"readConnectErrorMessage");function readConnectErrorCode(error){if(!(typeof error==="object"&&error!==null||typeof error==="function")){return void 0}try{const code=Reflect.get(error,"code");if(typeof code==="string"){return code.trim().length>0?code:void 0}return typeof code==="number"&&Number.isFinite(code)?String(code):void 0}catch{return void 0}}__name(readConnectErrorCode,"readConnectErrorCode");async function runChannelDaemonWorker(opts){validateDaemonWorkerUrl(opts.daemonUrl);const startupSignal=opts.startupSignal;const sdk=await abortableStartup((opts.loadDaemonSdk??loadDaemonSdk)(),startupSignal);const client=new sdk.DaemonClient({baseUrl:opts.daemonUrl,...opts.daemonToken?{token:opts.daemonToken}:{}});const capabilities=await abortableStartup(client.capabilities(),startupSignal);const requestedWorkspace=canonicalizeWorkspace(opts.workspace);let daemonWorkspace;if(capabilities.workspaces&&capabilities.workspaces.length>1){const match=capabilities.workspaces.find(workspace=>canonicalizeWorkspace(workspace.cwd)===requestedWorkspace);if(!match){throw new Error(`Worker workspace "${requestedWorkspace}" is not registered on the daemon.`)}if(!match.trusted){throw new Error(`Worker workspace "${requestedWorkspace}" is not trusted; channels cannot run there.`)}daemonWorkspace=requestedWorkspace}else{daemonWorkspace=canonicalizeWorkspace(capabilities.workspaceCwd??opts.workspace);if(requestedWorkspace!==daemonWorkspace){throw new Error(`Daemon workspace "${daemonWorkspace}" does not match worker workspace "${requestedWorkspace}".`)}}await abortableStartup(loadChannelsFromExtensions(),startupSignal);const settings=loadSettings(daemonWorkspace,{skipLoadEnvironment:true});throwIfStartupAborted(startupSignal);const proxy=resolveProxyUrl(void 0,settings.merged.proxy);const locale=resolveChannelLocale(settings.merged.general?.language);const displayLanguage=resolveLanguage(resolveLanguageSetting(settings.merged.general?.language));const channelsConfig=loadChannelsConfig(daemonWorkspace,settings);const names=selectedChannelNames(channelsConfig,opts.selection);const parsed=await abortableStartup(parseConfiguredChannels(channelsConfig,names,{defaultCwd:daemonWorkspace}),startupSignal);validateChannelWorkspaces(parsed,daemonWorkspace);const modelServiceId=selectFirstModel(parsed,"Daemon worker");const observedContacts=new ObservedChannelContactStore(daemonObservedContactsPath(daemonWorkspace));const loopStore=isChannelCronEnabled(settings)?new ChannelLoopStore({filePath:daemonChannelLoopPath(daemonWorkspace)}):void 0;const loopController=loopStore?createChannelLoopController(loopStore):void 0;if(loopStore){const multiSessionChannels=new Set(parsed.filter(({config})=>config.multiSession).map(({name})=>name));if(multiSessionChannels.size>0){const loops=await abortableStartup(loopStore.list(),startupSignal);const conflicting=loops.find(loop=>loop.enabled&&multiSessionChannels.has(loop.channelName));if(conflicting){throw new Error(`Channel "${conflicting.channelName}" cannot enable multiSession while it has an enabled Channel loop. Disable the loop first.`)}}}const bridge=new DaemonChannelBridge({cwd:daemonWorkspace,sessionFactory:createDaemonSessionFactory({client,DaemonSessionClient:sdk.DaemonSessionClient,clientId:`qwen-channel-worker:${process.pid}`}),sessionAttachments:capabilities.features.includes(SESSION_ATTACHMENTS_FEATURE),sessionPermissionVote:capabilities.features.includes(SESSION_PERMISSION_VOTE_FEATURE),sessionWorktreePersistence:capabilities.features.includes(SESSION_WORKTREE_PERSISTENCE_FEATURE),sessionWorktreeReset:capabilities.features.includes(SESSION_WORKTREE_RESET_FEATURE),...opts.promptAuthorization?{promptAuthorization:opts.promptAuthorization}:{},deleteSessionData:__name(async sessionId=>{const workspaceClient=client.workspaceByCwd?.(daemonWorkspace);if(!workspaceClient){throw new Error("Daemon SDK does not support session data deletion.")}const result=await workspaceClient.deleteSessionsData([sessionId]);if(!result.removed.includes(sessionId)&&!result.notFound.includes(sessionId)){const detail=result.errors.find(entry=>entry.sessionId===sessionId)?.error;throw new Error(detail??`Session ${sessionId} was not deleted.`)}},"deleteSessionData"),...modelServiceId?{modelServiceId}:{},...opts.channelLoopMcpHost?{channelLoopMcpHost:opts.channelLoopMcpHost}:{}});const channels=new Map;const connected=[];let scheduler;let connectFailureCount=0;const diagnosticRedaction={...opts.daemonToken?{daemonToken:opts.daemonToken}:{},workerEnv:process.env};let router;try{await abortableStartup(bridge.start(),startupSignal);const bridgeFacade=createDaemonChannelBridgeFacade(bridge,{exposeBtw:capabilities.features.includes(SESSION_BTW_FEATURE),exposeShellCommand:capabilities.features.includes(SESSION_SHELL_COMMAND_FEATURE)});const createdRouter=new SessionRouter(bridgeFacade,daemonWorkspace,"user",daemonSessionRoutesPath(daemonWorkspace),{recoveryMode:"lazy"});router=createdRouter;for(const{name,config}of parsed){createdRouter.setChannelScope(name,config.sessionScope);createdRouter.setChannelLoopsEnabled(name,!config.multiSession);if(config["webhooks"]){createdRouter.setChannelApprovalMode(name,config.approvalMode)}}const restoredRoutes=createdRouter.restoreRoutes();writeStdoutLine(`[Channel] Restored ${restoredRoutes.restored} dormant route(s)`+(restoredRoutes.dropped>0?`; dropped ${restoredRoutes.dropped} invalid route(s)`:""));for(const{name,config}of parsed){throwIfStartupAborted(startupSignal);channels.set(name,await abortableStartup(createChannel(name,config,bridgeFacade,{locale,...proxy?{proxy}:{},...displayLanguage?{displayLanguage}:{},router:createdRouter,stateDir:daemonChannelStateDir(daemonWorkspace,name),channelMemory:{readChannelMemory,getChannelMemoryRevision,listChannelMemoryEntries,addChannelMemoryEntries,updateChannelMemoryEntry,removeChannelMemoryEntries,clearChannelMemory},memoryIntentClassifier:new BridgeChannelMemoryIntentClassifier(bridgeFacade,config.cwd),channelMemoryRecallObserver:recordChannelMemoryRecallMetrics,observedContacts:{observe:__name((channelName,observation)=>{observedContacts.observe(channelName,observation)},"observe"),list:__name(()=>observedContacts.list({freshWithinSeconds:OBSERVED_CONTACT_MAX_FRESH_WITHIN_SECONDS}),"list")},...loopController&&!config.multiSession?{loopController}:{}}),startupSignal))}registerToolCallDispatch(bridgeFacade,createdRouter,channels);registerBackgroundResponseRelay(bridgeFacade,createdRouter,channels);registerPermissionRelay(bridgeFacade,createdRouter,channels);registerSessionCleanup(bridgeFacade,createdRouter,channels);for(const[name,channel]of channels){throwIfStartupAborted(startupSignal);const safeName=sanitizeLogText(name,128);writeStdoutLine(`[Channel] Connecting "${safeName}"...`);try{await abortableStartup(channel.connect(),startupSignal);connected.push(name);writeStdoutLine(`[Channel] "${safeName}" connected.`)}catch(err){if(startupSignal?.aborted){throw err}const message=readConnectErrorMessage(err);const code=readConnectErrorCode(err);const safeMessage=sanitizeLogText(message,512);writeStderrLine(`[Channel] Failed to connect "${safeName}": ${safeMessage}`);try{await channel.disconnect()}catch{}connectFailureCount+=1;if(connectFailureCount<=MAX_CHANNEL_STARTUP_FAILURES){const reportMessage=sanitizeWorkerDiagnostic(message,MAX_CHANNEL_STARTUP_FAILURE_MESSAGE_LENGTH,diagnosticRedaction)||"Channel connection failed.";const reportCode=code?sanitizeWorkerDiagnostic(code,MAX_CHANNEL_STARTUP_FAILURE_CODE_LENGTH,diagnosticRedaction):void 0;await abortableStartup(opts.reportStartup?.({type:"channel_startup_failure",failure:{channel:sanitizeWorkerDiagnostic(name,MAX_CHANNEL_STARTUP_FAILURE_CHANNEL_LENGTH,diagnosticRedaction)||"<unnamed>",phase:"connect",...reportCode?{code:reportCode}:{},message:reportMessage}}),startupSignal)}else if(connectFailureCount===MAX_CHANNEL_STARTUP_FAILURES+1){await abortableStartup(opts.reportStartup?.({type:"channel_startup_failures_truncated"}),startupSignal)}}}if(connected.length===0){throw new Error("No channels connected.")}if(loopStore){const schedulerChannels=new Map;for(const name of connected){const channel=channels.get(name);schedulerChannels.set(name,{runLoopPrompt:__name(async(job,options)=>{let jobWorkspace;try{jobWorkspace=canonicalizeWorkspace(job.cwd)}catch{jobWorkspace=void 0}if(jobWorkspace!==daemonWorkspace){await loopStore.disable(job.id).catch(()=>false);writeStderrLine(`[Channel] Disabled loop "${sanitizeLogText(job.id,128)}": its workspace does not match this daemon worker.`);throw new Error(`Loop ${sanitizeLogText(job.id,128)} is outside daemon workspace and was disabled.`)}return channel.runLoopPrompt(job,options)},"runLoopPrompt")})}scheduler=new ChannelLoopScheduler({store:loopStore,channels:schedulerChannels,nextFireTime});scheduler.start()}opts.sendReady?.({channels:connected,requestedChannels:parsed.map(p=>p.name),pid:process.pid});return{channels:connected,async deliverChannelMessage(request){const channel=channels.get(request.channelName);if(!channel||!connected.includes(request.channelName)){throw new ChannelDeliveryError("channel_worker_unavailable",`Channel "${request.channelName}" is not running.`)}await channel.deliverProactive({channelName:request.channelName,...request.target},request.text)},validateWebhookTask(task){const channel=channels.get(task.channelName);if(!channel||!connected.includes(task.channelName)){throw new Error(`Channel "${task.channelName}" is not running.`)}channel.validateWebhookTask(task)},async runWebhookTask(task,options){const channel=channels.get(task.channelName);if(!channel||!connected.includes(task.channelName)){throw new Error(`Channel "${task.channelName}" is not running.`)}if(options){await channel.runWebhookTask(task,options)}else{await channel.runWebhookTask(task)}},async close(disconnectDrainMs){scheduler?.stop();await disconnectWorkerChannels(channels.values(),disconnectDrainMs);try{bridge.stop()}finally{createdRouter.dispose()}}}}catch(err){scheduler?.stop();await disconnectWorkerChannels(channels.values(),WORKER_STARTUP_ROLLBACK_DRAIN_MS);try{bridge.stop()}catch{}finally{router?.dispose()}throw err}}__name(runChannelDaemonWorker,"runChannelDaemonWorker");function readRequiredEnv(name){const value=process.env[name];if(!value){throw new Error(`${name} is required.`)}return value}__name(readRequiredEnv,"readRequiredEnv");function scrubDaemonWorkerEnv(){delete process.env[CHANNEL_DAEMON_WORKER_SENTINEL];delete process.env[QWEN_DAEMON_TOKEN_ENV];delete process.env[QWEN_DAEMON_URL_ENV];delete process.env[QWEN_DAEMON_WORKSPACE_ENV];delete process.env[QWEN_SERVER_TOKEN_ENV];delete process.env[EXTERNAL_TOOL_GUARD_TOKEN_ENV];delete process.env[MANAGED_RUNTIME_BROKER_TOKEN_ENV]}__name(scrubDaemonWorkerEnv,"scrubDaemonWorkerEnv");function readDaemonWorkerEnv(){const daemonToken=process.env[QWEN_DAEMON_TOKEN_ENV];try{return{daemonToken,daemonUrl:readRequiredEnv(QWEN_DAEMON_URL_ENV),promptAuthorization:readRequiredEnv(CHANNEL_DAEMON_WORKER_SENTINEL),workspace:readRequiredEnv(QWEN_DAEMON_WORKSPACE_ENV)}}finally{scrubDaemonWorkerEnv()}}__name(readDaemonWorkerEnv,"readDaemonWorkerEnv");function assertInternalDaemonWorkerInvocation(){const sentinel=process.env[CHANNEL_DAEMON_WORKER_SENTINEL];if(!sentinel||sentinel==="1"||typeof process.send!=="function"){scrubDaemonWorkerEnv();throw new Error("daemon-worker is an internal qwen serve command.")}}__name(assertInternalDaemonWorkerInvocation,"assertInternalDaemonWorkerInvocation");function reportStartupToSupervisor(message,signal,subscribeMessage=listener=>{process.on("message",listener);return()=>process.removeListener("message",listener)}){if(signal.aborted){return Promise.reject(startupAbortError())}const send=process.send;if(!send){return Promise.reject(new Error("Channel worker IPC is unavailable."))}return new Promise((resolve6,reject)=>{let settled=false;let unsubscribeMessage=__name(()=>{},"unsubscribeMessage");const cleanup=__name(()=>{unsubscribeMessage();process.removeListener("disconnect",onDisconnect);signal.removeEventListener("abort",onAbort)},"cleanup");const finish=__name(error=>{if(settled)return;settled=true;cleanup();if(error)reject(error);else resolve6()},"finish");const onMessage=__name(value=>{if(isChannelStartupReportAckMessage(value)){finish()}},"onMessage");const onDisconnect=__name(()=>{finish(new Error("Channel worker IPC disconnected during startup."))},"onDisconnect");const onAbort=__name(()=>{finish(startupAbortError())},"onAbort");unsubscribeMessage=subscribeMessage(onMessage);process.once("disconnect",onDisconnect);signal.addEventListener("abort",onAbort,{once:true});try{send.call(process,message,error=>{if(error){finish(new Error("Channel worker startup report failed."))}})}catch{finish(new Error("Channel worker startup report failed."))}})}__name(reportStartupToSupervisor,"reportStartupToSupervisor");var daemonWorkerCommand={command:"daemon-worker",describe:false,builder:__name(yargs=>yargs.option("channel",{type:"string",array:true,description:"Internal daemon-managed channel selection."}),"builder"),handler:__name(async argv=>{const startupAbortController=new AbortController;let channelLoopMcpHost;const messageSubscribers=new Set;let onWorkerMessage;const subscribeMessage=__name(listener=>{messageSubscribers.add(listener);return()=>messageSubscribers.delete(listener)},"subscribeMessage");const disposeChannelLoopMcpHost=__name(()=>{if(onWorkerMessage){process.removeListener("message",onWorkerMessage);onWorkerMessage=void 0}messageSubscribers.clear();channelLoopMcpHost?.dispose();channelLoopMcpHost=void 0},"disposeChannelLoopMcpHost");let pendingShutdownReason;const onEarlyShutdown=__name(reason=>{if(pendingShutdownReason){process.exit(1);return}pendingShutdownReason=reason;startupAbortController.abort()},"onEarlyShutdown");const onEarlyDisconnect=__name(()=>{if(pendingShutdownReason){process.exit(1);return}pendingShutdownReason="disconnect";startupAbortController.abort()},"onEarlyDisconnect");process.on("SIGINT",onEarlyShutdown);process.on("SIGTERM",onEarlyShutdown);process.once("disconnect",onEarlyDisconnect);const removeEarlyShutdownHandlers=__name(()=>{process.removeListener("SIGINT",onEarlyShutdown);process.removeListener("SIGTERM",onEarlyShutdown);process.removeListener("disconnect",onEarlyDisconnect)},"removeEarlyShutdownHandlers");try{assertInternalDaemonWorkerInvocation();const{daemonToken,daemonUrl,promptAuthorization,workspace}=readDaemonWorkerEnv();scrubAndReportInheritedLoaderEnv(process.env,"qwen channel daemon-worker","channel daemon worker");const send=process.send;channelLoopMcpHost=new ChannelLoopMcpWorkerHost((message,callback)=>send.call(process,message,callback??(()=>{})));onWorkerMessage=__name(message=>{if(channelLoopMcpHost?.handleMessage(message))return;for(const subscriber of[...messageSubscribers]){subscriber(message)}},"onWorkerMessage");process.on("message",onWorkerMessage);const selection=normalizeServeChannelSelection(argv.channel);if(!selection){throw new Error("--channel is required.")}const handle=await runChannelDaemonWorker({daemonUrl,daemonToken,promptAuthorization,workspace,selection,startupSignal:startupAbortController.signal,reportStartup:__name(message=>reportStartupToSupervisor(message,startupAbortController.signal,subscribeMessage),"reportStartup"),channelLoopMcpHost,sendReady:__name(ready=>{process.send?.({type:"ready",...ready})},"sendReady")});removeEarlyShutdownHandlers();let heartbeatTimer;const sendWebhookTaskResult=__name((id,result)=>{try{process.send?.({type:"webhook_task_result",id,...result})}catch{}},"sendWebhookTaskResult");const sendChannelDeliveryResult=__name((id,result)=>{try{process.send?.({type:"channel_delivery_result",id,...result})}catch{}},"sendChannelDeliveryResult");const activeWebhookTasks=new Map;const activeChannelDeliveries=new Map;const onMessage=__name(message=>{if(isChannelDeliveryMessage(message)){if(message.expiresAt<=Date.now()){sendChannelDeliveryResult(message.id,{ok:false,code:"channel_delivery_timeout",error:"Channel delivery IPC timed out."});return}if(activeChannelDeliveries.size>=MAX_CHANNEL_DELIVERIES_IN_FLIGHT){sendChannelDeliveryResult(message.id,{ok:false,code:"channel_delivery_queue_full",error:"Channel delivery queue is full."});return}const deliveryId=message.id;const delivery=handle.deliverChannelMessage(message.request).then(()=>{sendChannelDeliveryResult(deliveryId,{ok:true})}).catch(error=>{sendChannelDeliveryResult(deliveryId,{ok:false,code:classifyChannelDeliveryError(error),error:sanitizeWorkerDiagnostic(error instanceof Error?error.message:String(error),512,{...daemonToken?{daemonToken}:{},workerEnv:process.env})})}).finally(()=>{activeChannelDeliveries.delete(deliveryId)});activeChannelDeliveries.set(deliveryId,delivery);return}if(!isChannelWebhookTaskMessage(message))return;if(message.expiresAt<=Date.now()){sendWebhookTaskResult(message.id,{ok:false,code:"channel_webhook_enqueue_timeout",error:"Channel webhook task IPC timed out."});return}try{handle.validateWebhookTask(message.task)}catch(err){sendWebhookTaskResult(message.id,{ok:false,code:classifyWebhookTaskValidationError(err),error:sanitizeLogText(err instanceof Error?err.message:String(err),512)});return}if(activeWebhookTasks.size>=MAX_ACTIVE_WEBHOOK_TASKS){sendWebhookTaskResult(message.id,{ok:false,code:"channel_webhook_queue_full",error:"Channel webhook task queue is full."});return}const taskId=message.id;const task=message.task;const safeId=sanitizeLogText(taskId,128);const safeChannel=sanitizeLogText(task.channelName,128);const safeSource=sanitizeLogText(task.source,128);sendWebhookTaskResult(message.id,{ok:true});const taskPromise=handle.runWebhookTask(task,{timeoutMs:5*6e4}).catch(err=>{const safeMessage=sanitizeLogText(err instanceof Error?err.message:String(err),512);writeStderrLine(`[Channel] webhook task failed (id=${safeId}, channel=${safeChannel}, source=${safeSource}): `+safeMessage)}).finally(()=>{activeWebhookTasks.delete(taskId)});activeWebhookTasks.set(taskId,taskPromise)},"onMessage");const clearHeartbeat=__name(()=>{if(!heartbeatTimer)return;clearInterval(heartbeatTimer);heartbeatTimer=void 0},"clearHeartbeat");heartbeatTimer=setInterval(()=>{try{process.send?.({type:"heartbeat",pid:process.pid,at:new Date().toISOString()})}catch{clearHeartbeat()}},CHANNEL_WORKER_HEARTBEAT_INTERVAL_MS);heartbeatTimer.unref();const unsubscribeMessage=subscribeMessage(onMessage);let shuttingDown=false;let exitCode=0;let finish;const finished=new Promise(resolve6=>{finish=resolve6});const shutdown=__name(async reason=>{if(shuttingDown){process.exit(1)}else{shuttingDown=true;const shutdownDeadline=Date.now()+WORKER_CHANNEL_DISCONNECT_DRAIN_MS;clearHeartbeat();unsubscribeMessage();try{const deliveryCount=activeChannelDeliveries.size;const webhookCount=activeWebhookTasks.size;if(deliveryCount>0){writeStderrLine(`[Channel] shutdown: draining ${deliveryCount} channel delivery task(s)...`)}if(webhookCount>0){writeStderrLine(`[Channel] shutdown: draining ${webhookCount} webhook task(s)...`)}if(deliveryCount>0||webhookCount>0){await Promise.race([Promise.allSettled([...activeChannelDeliveries.values(),...activeWebhookTasks.values()]),new Promise(resolve6=>{const timer=setTimeout(resolve6,Math.max(0,shutdownDeadline-Date.now()));timer.unref()})])}await handle.close(Math.max(0,shutdownDeadline-Date.now()))}catch(err){exitCode=1;const safeReason=sanitizeLogText(reason,128);const safeMessage=sanitizeLogText(err instanceof Error?err.message:String(err),512);writeStderrLine(`[Channel] daemon worker failed to shut down after ${safeReason}: ${safeMessage}`)}finally{clearHeartbeat();disposeChannelLoopMcpHost();finish()}}},"shutdown");const onDisconnect=__name(()=>{void shutdown("disconnect")},"onDisconnect");process.on("SIGINT",shutdown);process.on("SIGTERM",shutdown);process.once("disconnect",onDisconnect);if(pendingShutdownReason){void shutdown(pendingShutdownReason)}await finished;clearHeartbeat();unsubscribeMessage();process.removeListener("SIGINT",shutdown);process.removeListener("SIGTERM",shutdown);process.removeListener("disconnect",onDisconnect);process.exit(exitCode)}catch(err){removeEarlyShutdownHandlers();disposeChannelLoopMcpHost();const safeMessage=sanitizeLogText(err instanceof Error?err.message:String(err),512);writeStderrLine(`[Channel] daemon worker failed: ${safeMessage}`);process.exit(1)}},"handler")};function classifyWebhookTaskValidationError(error){const message=error instanceof Error?error.message:String(error);if(message==="Webhook tasks require unattended approval mode."||message==="Webhook tasks are not supported when sessionScope is single."||message==="Channel does not support proactive webhook messages."||message==="Channel does not support proactive webhook messages for this chat target."){return"channel_webhook_target_unavailable"}if(message.startsWith('Unknown webhook source "')||message.startsWith('Unknown webhook target "')||message.startsWith("Webhook task belongs to ")){return"channel_webhook_invalid_task"}if(/^Channel ".+" is not running\.$/u.test(message)){return"channel_worker_unavailable"}return"channel_webhook_enqueue_failed"}__name(classifyWebhookTaskValidationError,"classifyWebhookTaskValidationError");function classifyChannelDeliveryError(error){if(isChannelDeliveryError(error)){return error.code}if(isChannelProactiveDeliveryError(error)&&error.disposition==="permanent"){return"channel_delivery_rejected"}return"channel_delivery_failed"}__name(classifyChannelDeliveryError,"classifyChannelDeliveryError");init_esbuild_shims();init_esbuild_shims();var ManagedChannelClientError=class extends Error{constructor(status,code,message){super(message);this.status=status;this.code=code}static{__name(this,"ManagedChannelClientError")}};var HttpManagedChannelControlPlane=class{constructor(options){this.options=options;this.fetchImpl=options.fetch??fetch;this.root=`${options.baseUrl.replace(/\/+$/,"")}/internal/managed-channels/v1/channels/${encodeURIComponent(options.channelId)}`}static{__name(this,"HttpManagedChannelControlPlane")}fetchImpl;root;async register(request){await this.call("PUT","",{platform:request.platform,accountId:request.accountId,accountGeneration:request.accountGeneration,actorId:this.options.actorId,workspaceId:this.options.workspaceId,cwdRelative:this.options.cwdRelative,policy:request.policy})}async disconnect(){await this.call("POST","/disconnect",{})}async submitInbound(event){const answer=await this.call("POST","/inbound",{accountGeneration:event.accountGeneration,platformEventId:event.platformEventId,semanticRevision:event.semanticRevision,scope:event.scope,senderId:event.senderId,chatId:event.chatId,threadId:event.threadId,subject:event.subject,text:event.text,attachments:event.attachments,replyContext:event.replyContext});return{inputId:String(answer["inputId"]),sessionId:String(answer["sessionId"]),replayed:answer["replayed"]===true}}async claimDeliveries(limit){const answer=await this.call("POST","/deliveries:claim",{limit});const deliveries=Array.isArray(answer["deliveries"])?answer["deliveries"]:[];return deliveries.map(delivery=>({deliveryId:String(delivery["deliveryId"]),replyContext:delivery["replyContext"]??null,segments:(delivery["segments"]??[]).map(segment=>({ordinal:Number(segment["ordinal"]),segmentId:String(segment["segmentId"]),text:String(segment["text"]??"")}))}))}async receipt(deliveryId,receipt){await this.call("POST",`/deliveries/${encodeURIComponent(deliveryId)}:receipt`,receipt.outcome==="accepted"?{outcome:"accepted",ordinal:receipt.ordinal,providerMessageId:receipt.providerMessageId,acceptedAt:receipt.acceptedAt}:{outcome:receipt.outcome})}async call(method,path9,body){const response=await this.fetchImpl(`${this.root}${path9}`,{method,headers:{"content-type":"application/json","x-qwen-tenant-id":this.options.tenantId},body:JSON.stringify(body)});const text=await response.text();let parsed={};try{parsed=text.length>0?JSON.parse(text):{}}catch{parsed={}}const record=parsed!==null&&typeof parsed==="object"&&!Array.isArray(parsed)?parsed:{};if(!response.ok){const error=record["error"];const code=typeof error==="object"&&error!==null?String(error["code"]??"error"):String(record["code"]??"error");throw new ManagedChannelClientError(response.status,code,`Managed channel control plane answered ${response.status} ${code} for ${method} ${path9||"/"}.`)}return record}};var managedEmailCommand={command:"managed-email <name>",describe:false,builder:__name(yargs=>yargs.positional("name",{type:"string",demandOption:true,describe:"The configured email channel to run on the managed path"}).option("control-plane",{type:"string",demandOption:true,description:"Internal listener base URL of the managed control plane"}).option("tenant",{type:"string",demandOption:true,description:"Tenant the channel belongs to"}).option("actor",{type:"string",demandOption:true,description:"Actor that owns the Sessions the channel creates"}).option("workspace",{type:"string",demandOption:true,description:"Registered Workspace the channel Sessions bind to"}).option("channel-id",{type:"string",description:"Channel instance id (defaults to the channel name)"}).option("cwd-relative",{type:"string",default:".",description:"Relative directory inside the Workspace"}).option("cwd",{type:"string",default:process.cwd(),description:"Local workspace for channel config resolution; must be the directory the Legacy path (daemon worker) resolves for the same channel, so one state directory and one lock serve the mailbox"}),"builder"),handler:__name(async argv=>{const[channel]=await parseConfiguredChannels(loadChannelsConfig(argv.cwd),[argv.name],{defaultCwd:argv.cwd});if(channel?.config["type"]!=="email"){throw new Error(`Channel "${argv.name}" is not an email channel; the managed path serves email only.`)}const controlPlane=new HttpManagedChannelControlPlane({baseUrl:argv["control-plane"],tenantId:argv.tenant,channelId:argv["channel-id"]??argv.name,actorId:argv.actor,workspaceId:argv.workspace,cwdRelative:argv["cwd-relative"]});const adapter=new ManagedEmailAdapter({name:channel.name,cwd:channel.config.cwd,config:channel.config,controlPlane,deps:createManagedEmailDeps()});await adapter.connect();writeStderrLine(`Managed email channel "${channel.name}" is running (generation ${adapter.generation}).`);await new Promise(resolve6=>{const stop=__name(()=>{process.off("SIGINT",stop);process.off("SIGTERM",stop);resolve6()},"stop");process.on("SIGINT",stop);process.on("SIGTERM",stop)});await adapter.disconnect()},"handler")};init_esbuild_shims();var cwdOption={type:"string",describe:"Workspace directory the channel runs in (defaults to the current directory)",default:"."};var pairingListCommand={command:"list <name>",describe:"List pending pairing requests for a channel",builder:__name(yargs=>yargs.positional("name",{type:"string",describe:"Channel name",demandOption:true}).option("cwd",cwdOption),"builder"),handler:__name(argv=>{const store=new PairingStore(argv.name,argv.cwd);const pending=store.listPending();if(pending.length===0){writeStdoutLine("No pending pairing requests in this workspace (pass --cwd <dir> if the channel runs elsewhere).");return}writeStdoutLine(`Pending pairing requests for "${argv.name}":
|
|
29
29
|
`);for(const req of pending){const ago=Math.round((Date.now()-req.createdAt)/6e4);const subject=req.subject.type==="group"?`Group: ${req.subject.name} (${req.subject.id}) Requested by: ${req.senderName} (${req.senderId})`:`Sender: ${req.subject.name} (${req.subject.id})`;writeStdoutLine(` Code: ${req.code} ${subject} ${ago}m ago`)}},"handler")};var pairingApproveCommand={command:"approve <name> <code>",describe:"Approve a pending pairing request",builder:__name(yargs=>yargs.positional("name",{type:"string",describe:"Channel name",demandOption:true}).positional("code",{type:"string",describe:"Pairing code",demandOption:true}).option("cwd",cwdOption),"builder"),handler:__name(argv=>{const store=new PairingStore(argv.name,argv.cwd);const request=store.approve(argv.code);if(!request){writeStderrLine(`No pending request found for code "${argv.code.toUpperCase()}" in this workspace. It may have expired, or the channel may run in a different workspace (pass --cwd <dir>).`);process.exit(1);return}const approved=request.subject.type==="group"?`group ${request.subject.name} (${request.subject.id})`:`${request.subject.name} (${request.subject.id})`;writeStdoutLine(`Approved: ${approved} can now use channel "${argv.name}".`)},"handler")};init_esbuild_shims();init_esbuild_shims();async function startLogin(apiBaseUrl){const resp=await fetch(`${apiBaseUrl}/ilink/bot/get_bot_qrcode?bot_type=3`,{headers:buildHeaders()});if(!resp.ok){throw new Error(`Failed to get QR code: HTTP ${resp.status}`)}const data=await resp.json();if(!data.qrcode){throw new Error("No qrcode in response")}if(data.qrcode_img_content){process.stderr.write(`QR code URL: ${data.qrcode_img_content}
|
|
30
30
|
Scan this URL with WeChat.
|
|
31
|
-
`)}process.stderr.write("Scan the QR code with WeChat to connect.\n");return data.qrcode}__name(startLogin,"startLogin");async function waitForLogin(params){const{apiBaseUrl,timeoutMs=48e4}=params;let currentQrcodeId=params.qrcodeId;const deadline=Date.now()+timeoutMs;let retryCount=0;while(Date.now()<deadline){try{const controller=new AbortController;const timeout=setTimeout(()=>controller.abort(),6e4);const resp=await fetch(`${apiBaseUrl}/ilink/bot/get_qrcode_status?qrcode=${encodeURIComponent(currentQrcodeId)}`,{headers:buildHeaders(),signal:controller.signal});clearTimeout(timeout);if(!resp.ok)throw new Error(`HTTP ${resp.status}`);const data=await resp.json();switch(data.status){case"confirmed":return{connected:true,token:data.bot_token,baseUrl:data.baseurl,userId:data.ilink_user_id,message:"Connected to WeChat successfully!"};case"scaned":process.stderr.write("QR code scanned, waiting for confirmation...\n");break;case"expired":retryCount++;if(retryCount>=3){return{connected:false,message:"QR code expired after maximum retries."}}process.stderr.write("QR code expired, refreshing...\n");currentQrcodeId=await startLogin(apiBaseUrl);break;default:break}}catch(err){if(err instanceof Error&&err.name==="AbortError"){continue}throw err}await new Promise(r=>setTimeout(r,1e3))}return{connected:false,message:"Login timed out."}}__name(waitForLogin,"waitForLogin");var configureWeixinCommand={command:"configure-weixin [action]",describe:"Configure WeChat channel (login via QR code)",builder:__name(yargs=>yargs.positional("action",{type:"string",describe:'"clear" to remove stored credentials, omit to login'}),"builder"),handler:__name(async argv=>{const{action}=argv;if(action==="clear"){clearAccount();writeStdoutLine("WeChat credentials cleared.");return}if(action==="status"){const account=loadAccount();if(account){writeStdoutLine(`WeChat account configured (saved ${account.savedAt})`);writeStdoutLine(` Base URL: ${account.baseUrl}`);if(account.userId){writeStdoutLine(` User ID: ${account.userId}`)}}else{writeStdoutLine("WeChat account not configured.")}return}const existing=loadAccount();if(existing){writeStdoutLine(`Existing WeChat credentials found (saved ${existing.savedAt}).`);writeStdoutLine("Re-running login will overwrite them.\n")}const baseUrl=DEFAULT_BASE_URL;writeStdoutLine("Starting WeChat QR code login...\n");try{const qrcodeId=await startLogin(baseUrl);const result=await waitForLogin({qrcodeId,apiBaseUrl:baseUrl});if(result.connected&&result.token){saveAccount({token:result.token,baseUrl:result.baseUrl||baseUrl,userId:result.userId,savedAt:new Date().toISOString()});writeStdoutLine("\n"+result.message);writeStdoutLine("Credentials saved. You can now start a weixin channel with:");writeStdoutLine(" qwen channel start <name>")}else{writeStderrLine("\n"+result.message);process.exit(1)}}catch(err){writeStderrLine(`Login failed: ${err instanceof Error?err.message:String(err)}`);process.exit(1)}},"handler")};var pairingCommand={command:"pairing",describe:"Manage DM and group pairing requests",builder:__name(yargs=>yargs.command(pairingListCommand).command(pairingApproveCommand).demandCommand(1,"You need at least one command before continuing.").version(false),"builder"),handler:__name(()=>{},"handler")};var channelCommand={command:"channel",describe:"Manage messaging channels (Telegram, Discord, etc.)",builder:__name(yargs=>yargs.command(startCommand).command(daemonWorkerCommand).command(managedEmailCommand).command(stopCommand).command(statusCommand).command(reloadCommand).command(setCommand2).command(pairingCommand).command(configureWeixinCommand).demandCommand(1,"You need at least one command before continuing.").version(false),"builder"),handler:__name(()=>{},"handler")};init_esbuild_shims();var shouldUseColor=__name(()=>Boolean(process.stdout.isTTY&&!process.env["NO_COLOR"]),"shouldUseColor");var color=__name((value,code)=>shouldUseColor()?`\x1B[${code}m${value}\x1B[0m`:value,"color");var cyan=__name(value=>color(value,"36"),"cyan");var yellow=__name(value=>color(value,"33"),"yellow");var buildRemovalNotice=__name(()=>["",yellow(t("\u26A0 qwen auth has been removed.")),"",` ${cyan(t("Interactive"))} \u2192 ${t("run qwen and use /auth to configure providers")}`,` ${cyan(t("CI / Headless"))} \u2192 ${t("set provider environment variables, for example OPENAI_API_KEY + OPENAI_BASE_URL + OPENAI_MODEL")}`,` ${t("or pass --openai-api-key, --openai-base-url, --model")}`,` ${cyan(t("Coding Plan"))} \u2192 ${t("set BAILIAN_CODING_PLAN_API_KEY and use the Coding Plan base URL for your region")}`,` ${t("China: https://coding.dashscope.aliyuncs.com/v1")}`,` ${t("International: https://coding-intl.dashscope.aliyuncs.com/v1")}`,` ${cyan(t("Token Plan"))} \u2192 ${t("set BAILIAN_TOKEN_PLAN_API_KEY and use the Token Plan base URL for your region")}`,` ${t("China: https://token-plan.cn-beijing.maas.aliyuncs.com/compatible-mode/v1")}`,` ${t("International: https://token-plan.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1")}`,` ${cyan(t("OpenRouter"))} \u2192 ${t("set OPENROUTER_API_KEY and OPENAI_BASE_URL=https://openrouter.ai/api/v1")}`,` ${cyan(t("Requesty"))} \u2192 ${t("set REQUESTY_API_KEY and OPENAI_BASE_URL=https://router.requesty.ai/v1")}`,` ${cyan(t("Qwen OAuth"))} \u2192 ${t("run qwen interactively and use /auth; OAuth cannot be configured with env vars alone")}`,` ${cyan(t("Scripted"))} \u2192 ${t("edit ~/.qwen/settings.json, or run qwen interactively once")}`,"",` ${t("Check auth status")} \u2192 ${cyan("/doctor")}`,""].join("\n"),"buildRemovalNotice");var printRemovalNotice=__name(()=>{process.stdout.write(buildRemovalNotice(),()=>process.exit(0))},"printRemovalNotice");var legacySubcommands=["status","coding-plan","openrouter","requesty","api-key","qwen-oauth"];var authCommand={command:"auth",describe:t("Configure authentication (removed)"),builder:__name(yargs=>{let y=yargs.version(false).strict(false);for(const name of legacySubcommands){y=y.command({command:`${name} [legacyArgs..]`,describe:false,builder:__name(subYargs=>subYargs.strict(false),"builder"),handler:printRemovalNotice})}return y},"builder"),handler:printRemovalNotice};init_esbuild_shims();import{spawn,spawnSync}from"node:child_process";import*as fs from"node:fs";import*as fsp from"node:fs/promises";import*as path2 from"node:path";var HEALTH_TIMEOUT_MS=1e3;var DETAIL_TIMEOUT_MS=1500;var STOP_TIMEOUT_MS=1e4;var STOP_POLL_MS=100;var FOLLOW_POLL_MS=250;var PROCESS_START_TOLERANCE_MS=5e3;var PROCESS_START_LEAD_MS=10*6e4;var START_TIMEOUT_MS=3e4;var START_POLL_MS=100;var START_READY_TIMEOUT_MS=3e4;var START_READY_POLL_MS=250;function age(iso,now=Date.now()){const started=Date.parse(iso);return Number.isFinite(started)?Math.max(0,now-started):0}__name(age,"age");function processStartTime(pid){if(process.platform==="win32"){const result2=spawnSync("powershell.exe",["-NoProfile","-NonInteractive","-Command",`(Get-Process -Id ${pid} -ErrorAction Stop).StartTime.ToUniversalTime().ToString('o')`],{encoding:"utf8"});if(result2.status!==0||typeof result2.stdout!=="string"){return void 0}const parsed2=Date.parse(result2.stdout.trim());return Number.isFinite(parsed2)?parsed2:void 0}const result=spawnSync("ps",["-o","lstart=","-p",String(pid)],{encoding:"utf8",env:{...process.env,LC_ALL:"C",LANG:"C"}});if(result.status!==0||typeof result.stdout!=="string"){return void 0}const parsed=Date.parse(result.stdout.trim());return Number.isFinite(parsed)?parsed:void 0}__name(processStartTime,"processStartTime");function processStartMatchesRecord(recordStartedAt,processStartedAt){if(processStartedAt===void 0)return true;const recorded=Date.parse(recordStartedAt);if(!Number.isFinite(recorded))return true;return processStartedAt>=recorded-PROCESS_START_LEAD_MS&&processStartedAt<=recorded+PROCESS_START_TOLERANCE_MS}__name(processStartMatchesRecord,"processStartMatchesRecord");function processCommand(pid){if(process.platform==="win32"){const result2=spawnSync("powershell.exe",["-NoProfile","-NonInteractive","-Command",`(Get-CimInstance Win32_Process -Filter "ProcessId=${pid}").CommandLine`],{encoding:"utf8"});if(result2.status!==0||typeof result2.stdout!=="string"){return void 0}return result2.stdout.trim()||void 0}const result=spawnSync("ps",["-o","command=","-p",String(pid)],{encoding:"utf8",env:{...process.env,LC_ALL:"C",LANG:"C"}});if(result.status!==0||typeof result.stdout!=="string"){return void 0}return result.stdout.trim()||void 0}__name(processCommand,"processCommand");function processParentTable(){const result=process.platform==="win32"?spawnSync("powershell.exe",["-NoProfile","-NonInteractive","-Command",'Get-CimInstance Win32_Process | ForEach-Object { "$($_.ProcessId) $($_.ParentProcessId)" }'],{encoding:"utf8",maxBuffer:8*1024*1024}):spawnSync("ps",["-A","-o","pid=,ppid="],{encoding:"utf8",maxBuffer:8*1024*1024,env:{...process.env,LC_ALL:"C",LANG:"C"}});if(result.status!==0||typeof result.stdout!=="string"){return void 0}const parents=new Map;for(const line of result.stdout.split(/\r?\n/)){const[pid,parent]=line.trim().split(/\s+/).map(Number);if(Number.isInteger(pid)&&Number.isInteger(parent)){parents.set(pid,parent)}}return parents}__name(processParentTable,"processParentTable");function isProcessAncestor(ancestor,pid,parents){const seen=new Set;let current=parents.get(pid);while(current!==void 0&¤t>0&&!seen.has(current)){if(current===ancestor)return true;seen.add(current);current=parents.get(current)}return false}__name(isProcessAncestor,"isProcessAncestor");function terminateTree(pid,force){if(process.platform==="win32"){const taskkill=`${process.env["SystemRoot"]??"C:\\Windows"}\\System32\\taskkill.exe`;spawnSync(taskkill,["/pid",String(pid),"/T","/F"],{stdio:"ignore"});return}process.kill(pid,force?"SIGKILL":"SIGTERM")}__name(terminateTree,"terminateTree");function formatDaemonAge(ms){const seconds=Math.max(0,Math.floor(ms/1e3));if(seconds<60)return`${seconds}s`;const minutes=Math.floor(seconds/60);if(minutes<60)return`${minutes}m`;const hours=Math.floor(minutes/60);if(hours<24)return`${hours}h`;return`${Math.floor(hours/24)}d`}__name(formatDaemonAge,"formatDaemonAge");function sanitize(value){return sanitizeTerminalText2(value).replace(/[\t\n]/g,"")}__name(sanitize,"sanitize");function pidResolvableHere(record,currentNamespace){if(record.pidNamespace===void 0)return true;if(currentNamespace===void 0)return false;return record.pidNamespace===currentNamespace}__name(pidResolvableHere,"pidResolvableHere");function listenerIdentityVerified(record,currentNamespace=currentPidNamespace(),alive=isProcessAlive,startedAt=processStartTime){if(!pidResolvableHere(record,currentNamespace))return false;if(!alive(record.pid))return false;if(!Number.isFinite(Date.parse(record.startedAt)))return false;const started=startedAt(record.pid);if(started===void 0)return false;return processStartMatchesRecord(record.startedAt,started)}__name(listenerIdentityVerified,"listenerIdentityVerified");async function probeHealth(record){const pidResolvable=pidResolvableHere(record,currentPidNamespace());try{await fetch(new URL("/health",record.url),{signal:AbortSignal.timeout(HEALTH_TIMEOUT_MS),redirect:"manual"});return pidResolvable&&!isProcessAlive(record.pid)?"stale":"running"}catch{return pidResolvable&&!isProcessAlive(record.pid)?"stale":"unreachable"}}__name(probeHealth,"probeHealth");function summarizeDaemonStatus(value){if(value===null||typeof value!=="object")return void 0;const response=value;if(response["v"]!==1||typeof response["status"]!=="string"){return void 0}const daemon=response["daemon"]!==null&&typeof response["daemon"]==="object"?response["daemon"]:void 0;const runtime=response["runtime"]!==null&&typeof response["runtime"]==="object"?response["runtime"]:void 0;const rawSessions=runtime?.["sessions"];const sessions=rawSessions!==null&&typeof rawSessions==="object"?rawSessions:void 0;const issueRecords=Array.isArray(response["issues"])?response["issues"].filter(issue=>issue!==null&&typeof issue==="object"):[];const issues=issueRecords.map(issue=>issue["message"]).filter(message=>typeof message==="string");const starting=issueRecords.some(issue=>issue["code"]==="daemon_runtime_starting");const version=daemon?.["qwenCodeVersion"];const uptimeMs=daemon?.["uptimeMs"];const active=sessions?.["active"];const admissionInFlight=sessions?.["admissionInFlight"];return{status:response["status"],...typeof version==="string"?{version}:{},...typeof uptimeMs==="number"?{uptimeMs}:{},...typeof active==="number"?{sessions:{active,...typeof admissionInFlight==="number"?{admissionInFlight}:{}}}:{},issues,...starting?{starting:true}:{}}}__name(summarizeDaemonStatus,"summarizeDaemonStatus");function isDaemonReady(detail){return typeof detail!=="string"&&detail.status!=="error"&&detail.starting!==true}__name(isDaemonReady,"isDaemonReady");async function fetchDaemonDetail(record,allowToken,tokenOverride){const token=record.auth==="bearer"?tokenOverride?.trim()||process.env["QWEN_SERVER_TOKEN"]?.trim():void 0;if(token&&!allowToken){return"listener identity unverified; not sending QWEN_SERVER_TOKEN"}try{const response=await fetch(new URL("/daemon/status?detail=summary",record.url),{signal:AbortSignal.timeout(DETAIL_TIMEOUT_MS),redirect:"manual",...token?{headers:{Authorization:`Bearer ${token}`}}:{}});if(response.status===401||response.status===403){return"auth required; set QWEN_SERVER_TOKEN"}if(!response.ok){return`status endpoint returned HTTP ${response.status}`}const summary=summarizeDaemonStatus(await response.json());return summary??"invalid status response"}catch(error){return error instanceof Error?error.message:String(error)}}__name(fetchDaemonDetail,"fetchDaemonDetail");async function waitForDaemonReady(record,token,timeoutMs=START_READY_TIMEOUT_MS,pollMs=START_READY_POLL_MS,fetchDetail=(candidate,allowToken)=>fetchDaemonDetail(candidate,allowToken,token),identityVerified=()=>listenerIdentityVerified(record)){const deadline=Date.now()+timeoutMs;let result="daemon status unavailable";while(true){if(!identityVerified()){return"daemon process exited before readiness"}result=await fetchDetail(record,true);if(isDaemonReady(result)){return identityVerified()?result:"daemon process exited before readiness"}if(Date.now()>=deadline)return result;await new Promise(resolve6=>setTimeout(resolve6,pollMs))}}__name(waitForDaemonReady,"waitForDaemonReady");function formatDaemonDetail(record,detail){if(typeof detail==="string"){return`qwen daemon: port ${record.port}: detail unavailable: ${sanitize(detail)}`}const uptime=detail.uptimeMs===void 0?"unknown":formatDaemonAge(detail.uptimeMs);const sessions=detail.sessions===void 0?"":` sessions=${detail.sessions.active}`+(detail.sessions.admissionInFlight===void 0?"":`(+${detail.sessions.admissionInFlight} admitting)`);return`qwen daemon: port ${record.port}: status=${sanitize(detail.status)} version=${sanitize(detail.version??"unknown")} uptime=${uptime}${sessions} issues=${detail.issues.length}`}__name(formatDaemonDetail,"formatDaemonDetail");function selectDaemonEntries(entries,options){if(options.port!==void 0){return entries.filter(entry=>entry.record.port===options.port)}if(options.all===true){return[...entries]}if(entries.length===1){return[entries[0]]}return[]}__name(selectDaemonEntries,"selectDaemonEntries");function selectionError(entries,options){if(options.port!==void 0){return entries.some(entry=>entry.record.port===options.port)?void 0:`No daemon is registered on port ${options.port}.`}if(options.all===true)return void 0;if(entries.length>1){return`${entries.length} daemons are registered; pass --port <port> or --all to choose one.`}return void 0}__name(selectionError,"selectionError");function tailLines(text,count){const lines=text.split(/\r?\n/);if(lines.length>0&&lines[lines.length-1]==="")lines.pop();return lines.slice(-count)}__name(tailLines,"tailLines");function fallbackLogPath(){return path2.join(path2.dirname(resolveDaemonDiscoveryDir()),"debug","daemon","daemon.log")}__name(fallbackLogPath,"fallbackLogPath");function logPathFor(record){return record.logPath&&record.logPath.length>0?record.logPath:fallbackLogPath()}__name(logPathFor,"logPathFor");async function waitForExit2(pid,timeoutMs){const deadline=Date.now()+timeoutMs;while(Date.now()<deadline){if(!isProcessAlive(pid))return true;await new Promise(resolve6=>setTimeout(resolve6,STOP_POLL_MS))}return!isProcessAlive(pid)}__name(waitForExit2,"waitForExit");function resolveCliEntry(){const configured=process.env["QWEN_CLI_ENTRY"];if(configured)return path2.resolve(configured);const entry=process.argv[1];return entry?path2.resolve(entry):void 0}__name(resolveCliEntry,"resolveCliEntry");function isJavaScriptEntry(entry){return/\.(?:c|m)?js$|\.tsx?$/i.test(entry)}__name(isJavaScriptEntry,"isJavaScriptEntry");function buildDaemonStartArgs(options){const childArgs=["serve","--port",String(options.port),"--hostname",options.hostname,"--no-token-qr"];if(!options.web)childArgs.push("--no-web");if(options.requireAuth)childArgs.push("--require-auth");for(const workspace of options.workspaces){childArgs.push("--workspace",workspace)}return isJavaScriptEntry(options.entry)?{command:process.execPath,args:[...process.execArgv,options.entry,...childArgs]}:{command:options.entry,args:childArgs}}__name(buildDaemonStartArgs,"buildDaemonStartArgs");function formatDaemonStartSummary(record){return[`qwen daemon: started pid ${record.pid} on ${record.url}`,`qwen daemon: workspace ${record.primaryWorkspace}`,`qwen daemon: logs ${logPathFor(record)}`,`qwen daemon: stop with \`qwen daemon stop --port ${record.port}\``].join("\n")}__name(formatDaemonStartSummary,"formatDaemonStartSummary");var START_ENV_DROP=["QWEN_CODE_CLI","QWEN_CODE_NO_RELAUNCH","QWEN_CODE_SESSION_ID","QWEN_CODE_PROMPT_ID","QWEN_CODE_PROJECT_DIR","QWEN_CODE_SERVE","QWEN_CODE_AGENT_ID","QWEN_DAEMON_TOKEN","QWEN_CODE_MESSAGING_TOKEN","QWEN_CODE_MESSAGING_SOCKET"];var START_LOG_MAX_AGE_MS=24*60*6e4;function resolveStartEnvPath(value,cwd,pathApi=path2,fullyQualified=isFullyQualifiedPath){if(value===void 0)return void 0;if(value==="")return"";if(value==="~"||value.startsWith("~/")||value.startsWith("~\\")){return value}return fullyQualified(value)?value:pathApi.resolve(cwd,value)}__name(resolveStartEnvPath,"resolveStartEnvPath");function buildDaemonStartEnv(env,token,cwd=process.cwd()){const child={...env};for(const key of START_ENV_DROP){delete child[key]}for(const key of Object.keys(child)){if(key.startsWith("QWEN_CODE_PRIVATE_")){delete child[key]}}for(const key of["QWEN_RUNTIME_DIR","QWEN_HOME"]){const resolved=resolveStartEnvPath(child[key],cwd);if(resolved===void 0){delete child[key]}else{child[key]=resolved}}if(token)child["QWEN_SERVER_TOKEN"]=token;return child}__name(buildDaemonStartEnv,"buildDaemonStartEnv");function sweepStaleStartLogs(dir,now=Date.now()){try{for(const name of fs.readdirSync(dir)){if(!name.startsWith("start-")||!name.endsWith(".log"))continue;const file=path2.join(dir,name);try{if(now-fs.statSync(file).mtimeMs>START_LOG_MAX_AGE_MS){fs.rmSync(file,{force:true})}}catch{}}}catch{}}__name(sweepStaleStartLogs,"sweepStaleStartLogs");async function canonicalizeStartWorkspaces(rawWorkspaces){const{validateAndCanonicalizeWorkspaceInput}=await import("./run-qwen-serve-MXK4RBKL.js");return rawWorkspaces.map(workspace=>validateAndCanonicalizeWorkspaceInput(path2.resolve(workspace)))}__name(canonicalizeStartWorkspaces,"canonicalizeStartWorkspaces");async function printStartLogTail(file){try{const text=await fsp.readFile(file,"utf8");for(const line of tailLines(text,40)){writeStderrLine(line)}}catch{}}__name(printStartLogTail,"printStartLogTail");async function handleStart(argv){ignoreBrokenPipe();const entry=resolveCliEntry();if(!entry){writeStderrLine("qwen daemon: cannot determine the CLI entry; run `qwen serve` directly.");process.exitCode=1;return}const rawWorkspaces=Array.isArray(argv.workspace)?argv.workspace:argv.workspace?[argv.workspace]:[process.cwd()];let workspaces;try{workspaces=await canonicalizeStartWorkspaces(rawWorkspaces)}catch(error){writeStderrLine(`qwen daemon: ${error instanceof Error?error.message:String(error)}`);process.exitCode=1;return}const hostname=argv.hostname;const port=argv.port??4170;const token=argv.token?.trim()||process.env["QWEN_SERVER_TOKEN"]?.trim()||void 0;if(argv["require-auth"]&&!token){writeStderrLine("qwen daemon: --require-auth requires --token or QWEN_SERVER_TOKEN.");process.exitCode=1;return}if(argv["save-token"]&&!token){writeStderrLine("qwen daemon: --save-token requires --token or QWEN_SERVER_TOKEN.");process.exitCode=1;return}if(!isLoopbackBind(hostname)&&!token){writeStderrLine("qwen daemon: a non-loopback bind requires QWEN_SERVER_TOKEN; run `qwen serve` directly if you want an ephemeral token.");process.exitCode=1;return}if(argv.token){writeStderrLine("qwen daemon: --token is visible in this shell process list; prefer QWEN_SERVER_TOKEN.")}const primary=workspaces[0];const existing=readDaemonDiscoveries().entries.find(candidate=>candidate.record.primaryWorkspace===primary&&isProcessAlive(candidate.record.pid)&&processStartMatchesRecord(candidate.record.startedAt,processStartTime(candidate.record.pid)));if(existing&&argv.port===void 0){writeStderrLine(`qwen daemon: a daemon is already running for ${primary} on port ${existing.record.port}; pass --port to start another.`);process.exitCode=1;return}const logDir=resolveDaemonDiscoveryDir();fs.mkdirSync(logDir,{recursive:true,mode:448});sweepStaleStartLogs(logDir);const startLog=path2.join(logDir,`start-${process.pid}-${Date.now()}.log`);const logFd=fs.openSync(startLog,"a",384);const{command,args}=buildDaemonStartArgs({entry,port,hostname,workspaces,web:argv.web,requireAuth:argv["require-auth"]});const env=buildDaemonStartEnv(process.env,token);let child;try{child=spawn(command,args,{cwd:primary,env,detached:true,stdio:["ignore",logFd,logFd],windowsHide:true})}catch(error){fs.closeSync(logFd);writeStderrLine(`qwen daemon: could not spawn the daemon: ${error instanceof Error?error.message:String(error)}`);process.exitCode=1;return}fs.closeSync(logFd);if(child.pid===void 0){writeStderrLine("qwen daemon: the daemon process did not start.");process.exitCode=1;return}child.unref();let spawnError;child.once("error",error=>{spawnError=error});const deadline=Date.now()+START_TIMEOUT_MS;let record;while(Date.now()<deadline){if(spawnError)break;record=readDaemonDiscoveries().entries.find(candidate=>candidate.record.pid===child.pid)?.record;if(record)break;if(child.exitCode!==null||child.signalCode!==null)break;await new Promise(resolve6=>setTimeout(resolve6,START_POLL_MS))}if(record){removeStaleDaemonTokens(record.port,record.pid);if(argv["save-token"]){try{writeDaemonToken(record.port,record.pid,token)}catch(error){writeStderrLine(`qwen daemon: could not persist the token: ${error instanceof Error?error.message:String(error)}`);process.exitCode=1;return}}const ready=argv.wait===true?await waitForDaemonReady(record,token):void 0;const readyFailed=ready!==void 0&&!isDaemonReady(ready);if(argv.json===true){writeStdoutLine(JSON.stringify({pid:record.pid,port:record.port,url:record.url,workspaces:record.workspaces,primaryWorkspace:record.primaryWorkspace,logPath:logPathFor(record)}))}else{writeStdoutLine(formatDaemonStartSummary(record))}if(readyFailed){writeStderrLine(`qwen daemon: daemon pid ${record.pid} is running but did not report ready within ${START_READY_TIMEOUT_MS/1e3}s.`);if(typeof ready==="string"){writeStderrLine(`qwen daemon: ${ready}`)}writeStderrLine(`qwen daemon: startup log: ${startLog}`);process.exitCode=1;return}try{fs.rmSync(startLog,{force:true})}catch{}return}writeStderrLine(`qwen daemon: daemon pid ${child.pid} did not publish a discovery record within ${START_TIMEOUT_MS/1e3}s. The detached child may still start; run \`qwen daemon status\` to check.`);if(spawnError){writeStderrLine(`qwen daemon: spawn failed: ${spawnError.message}`)}writeStderrLine(`qwen daemon: startup log: ${startLog}`);await printStartLogTail(startLog);process.exitCode=1}__name(handleStart,"handleStart");async function handleStatus(argv){ignoreBrokenPipe();const{entries,invalid}=readDaemonDiscoveries();let rows=[];for(const entry of entries){rows.push({entry,health:await probeHealth(entry.record)})}if(argv.prune===true){const kept=[];for(const row of rows){if(row.health!=="stale"){kept.push(row);continue}if(!removeDaemonDiscovery(row.entry.record.port,{expectedPid:row.entry.record.pid})){kept.push(row)}else{removeDaemonToken(row.entry.record.port,row.entry.record.pid)}}rows=kept}for(const bad of invalid){writeStderrLine(`qwen daemon: ignoring ${sanitize(bad.path)}: ${sanitize(bad.reason)}`)}const details=new Map;if(argv.detail===true){await Promise.all(rows.filter(row=>row.health==="running").map(async row=>{const record=row.entry.record;const allowToken=record.auth==="bearer"&&listenerIdentityVerified(record);details.set(record.port,await fetchDaemonDetail(record,allowToken))}))}if(argv.json===true){for(const row of rows){writeStdoutLine(JSON.stringify({status:row.health,pid:row.entry.record.pid,port:row.entry.record.port,url:row.entry.record.url,workspaces:row.entry.record.workspaces,primaryWorkspace:row.entry.record.primaryWorkspace,auth:row.entry.record.auth,startedAt:row.entry.record.startedAt,ageMs:age(row.entry.record.startedAt),...argv.detail===true?{detail:details.get(row.entry.record.port)??null}:{},logPath:logPathFor(row.entry.record)}))}return}if(rows.length===0){writeStdoutLine("No local qwen serve daemon is registered. Start one with `qwen serve`.");return}writeStdoutLine("STATUS PID PORT AGE WORKSPACES / URL");for(const row of rows){const{record}=row.entry;const workspaces=record.workspaces.map(workspace=>sanitize(workspace)).join(", ");writeStdoutLine(`${row.health.padEnd(12)}${String(record.pid).padEnd(10)}${String(record.port).padEnd(7)}${formatDaemonAge(age(record.startedAt)).padEnd(6)}${workspaces} ${sanitize(record.url)}`)}if(argv.detail===true){for(const row of rows){const detail=details.get(row.entry.record.port);if(detail!==void 0){writeStdoutLine(formatDaemonDetail(row.entry.record,detail))}else{writeStdoutLine(`qwen daemon: port ${row.entry.record.port}: detail unavailable (${row.health})`)}}}writeStdoutLine("");writeStdoutLine("Use `qwen daemon logs --port <port> --follow` to tail one.")}__name(handleStatus,"handleStatus");async function printTail(file,count){let text;try{text=await fsp.readFile(file,"utf8")}catch(error){if(error.code==="ENOENT"){writeStderrLine(`qwen daemon: log file not found: ${file}`);return 0}throw error}for(const line of tailLines(text,count)){writeStdoutLine(line)}try{return fs.statSync(file).size}catch{return Buffer.byteLength(text,"utf8")}}__name(printTail,"printTail");async function followFile(file,startOffset){let offset=startOffset;let handle;let inode;const openCurrent=__name(async()=>{try{const next=await fsp.open(file,"r");const stat2=await next.stat();handle=next;inode=stat2.ino}catch{handle=void 0;inode=void 0}},"openCurrent");const drain=__name(async from=>{if(!handle)return from;const stat2=await handle.stat();if(stat2.size<=from)return stat2.size;const buffer=Buffer.alloc(stat2.size-from);await handle.read(buffer,0,buffer.length,from);for(const line of buffer.toString("utf8").split(/\r?\n/)){if(line.length>0)writeStdoutLine(line)}return stat2.size},"drain");await openCurrent();writeStderrLine(`qwen daemon: following ${file} (Ctrl+C to stop)`);let stopped=false;const stop=__name(()=>{stopped=true;process.off("SIGINT",stop);process.off("SIGTERM",stop)},"stop");process.on("SIGINT",stop);process.on("SIGTERM",stop);try{while(!stopped){try{const stat2=await fsp.stat(file);if(!handle){await openCurrent();offset=0}else if(inode!==void 0&&stat2.ino!==inode){offset=await drain(offset);await handle.close();handle=void 0;await openCurrent();offset=0}else{if(stat2.size<offset)offset=0;offset=await drain(offset)}}catch(error){if(error.code==="EPIPE")break}if(process.stdout.destroyed||!process.stdout.writable)break;await new Promise(resolve6=>setTimeout(resolve6,FOLLOW_POLL_MS))}}finally{if(handle)await handle.close()}}__name(followFile,"followFile");async function handleLogs(argv){ignoreBrokenPipe();const{entries}=readDaemonDiscoveries();const error=selectionError(entries,argv);if(error){writeStderrLine(`qwen daemon: ${error}`);process.exitCode=1;return}const selected=selectDaemonEntries(entries,argv);const entry=selected[0];if(!entry){writeStderrLine("qwen daemon: no daemon is registered. Start one with `qwen serve`.");process.exitCode=1;return}const file=logPathFor(entry.record);const count=argv.lines??50;if(!Number.isInteger(count)||count<=0){writeStderrLine("qwen daemon: --lines must be a positive integer.");process.exitCode=1;return}const offset=await printTail(file,count);if(argv.follow===true){await followFile(file,offset)}}__name(handleLogs,"handleLogs");async function handleStop(argv){ignoreBrokenPipe();const{entries}=readDaemonDiscoveries();const error=selectionError(entries,argv);if(error){writeStderrLine(`qwen daemon: ${error}`);process.exitCode=1;return}const selected=selectDaemonEntries(entries,argv);if(selected.length===0){writeStderrLine("qwen daemon: no daemon is registered. Start one with `qwen serve`.");process.exitCode=1;return}let failed=false;for(const entry of selected){const{record}=entry;const health=await probeHealth(record);if(health==="stale"){if(removeDaemonDiscovery(record.port,{expectedPid:record.pid})){removeDaemonToken(record.port,record.pid)}writeStdoutLine(`qwen daemon: removed stale record for port ${record.port} (pid ${record.pid} is gone).`);continue}if(record.pid===process.pid){writeStderrLine("qwen daemon: refusing to stop the current process.");failed=true;continue}if(!pidResolvableHere(record,currentPidNamespace())){writeStderrLine(`qwen daemon: refusing to signal pid ${record.pid}: the record was written in PID namespace ${record.pidNamespace}, which this process cannot address.`);failed=true;continue}const processStarted=processStartTime(record.pid);if(processStarted===void 0){writeStderrLine(`qwen daemon: refusing to signal pid ${record.pid}: its process start time could not be read.`);failed=true;continue}if(!processStartMatchesRecord(record.startedAt,processStarted)){writeStderrLine(`qwen daemon: refusing to signal pid ${record.pid}: its start time does not match the daemon recorded at ${record.startedAt}.`);failed=true;continue}const command=processCommand(record.pid);if(command===void 0||!command.includes("serve")||!/(qwen|cli\.js)/.test(command)){writeStderrLine(`qwen daemon: refusing to signal pid ${record.pid}: its command line is not the recorded daemon.`);failed=true;continue}if(process.platform==="win32"&&argv.force!==true){writeStderrLine("qwen daemon: Windows stop is a hard kill; pass --force to confirm (shutdown handlers do not run).");failed=true;continue}try{terminateTree(record.pid,false)}catch(killError){writeStderrLine(`qwen daemon: could not signal pid ${record.pid}: ${killError instanceof Error?killError.message:String(killError)}`);failed=true;continue}const exited=await waitForExit2(record.pid,STOP_TIMEOUT_MS);if(exited){if(removeDaemonDiscovery(record.port,{expectedPid:record.pid})){removeDaemonToken(record.port,record.pid)}writeStdoutLine(`qwen daemon: ${process.platform==="win32"?"hard-killed":"stopped"} port ${record.port} (pid ${record.pid}).`);continue}if(argv.force===true){try{terminateTree(record.pid,true)}catch{}const forced=await waitForExit2(record.pid,STOP_TIMEOUT_MS);if(forced){if(removeDaemonDiscovery(record.port,{expectedPid:record.pid})){removeDaemonToken(record.port,record.pid)}writeStdoutLine(`qwen daemon: force-stopped port ${record.port} (pid ${record.pid}).`);continue}}writeStderrLine(`qwen daemon: port ${record.port} (pid ${record.pid}) did not exit within ${STOP_TIMEOUT_MS/1e3}s; retry with --force if it is safe to SIGKILL it.`);failed=true}if(failed)process.exitCode=1}__name(handleStop,"handleStop");async function handleToken(argv){ignoreBrokenPipe();const{entries}=readDaemonDiscoveries();const error=selectionError(entries,{port:argv.port});if(error){writeStderrLine(`qwen daemon: ${error}`);process.exitCode=1;return}const selected=selectDaemonEntries(entries,{port:argv.port});if(selected.length!==1){writeStderrLine("qwen daemon: token needs exactly one registered daemon; pass --port.");process.exitCode=1;return}const record=selected[0].record;if(argv.remove===true){const removed=removeDaemonToken(record.port,record.pid);if(!removed){writeStderrLine(`qwen daemon: no persisted token for port ${record.port}.`);process.exitCode=1;return}writeStdoutLine(argv.json===true?JSON.stringify({port:record.port,removed:true}):`qwen daemon: removed persisted token for port ${record.port}.`);return}const token=readDaemonToken(record.port,record.pid);if(!token){writeStderrLine(`qwen daemon: no persisted token for port ${record.port}; start with --save-token or use QWEN_SERVER_TOKEN.`);process.exitCode=1;return}writeStdoutLine(argv.json===true?JSON.stringify({port:record.port,token}):`qwen daemon: token for port ${record.port}: ${token}`)}__name(handleToken,"handleToken");function buildDaemonRestartPlan(record,options,entry,execArgv=process.execArgv,baseEnv=process.env){let protocol="";try{protocol=new URL(record.url).protocol}catch{}if(protocol==="https:"){return{error:"restarting an HTTPS daemon is not supported; restart it with qwen serve and the original TLS settings."}}const workspaces=record.startupWorkspaces?.length?record.startupWorkspaces:record.workspaces.length<=1?[record.primaryWorkspace]:void 0;if(!workspaces){return{error:`the daemon on port ${record.port} was started by an older qwen that did not record its startup workspaces; stop it and start it again with \`qwen daemon start --port ${record.port} --workspace <path>\`.`}}const notices=[];const web=options.web??record.web;if(web===void 0){notices.push("the record does not say whether the Web Shell was enabled; restarting with it (pass --no-web for API-only).")}const requireAuth=options.requireAuth??record.requireAuth??record.auth==="bearer";if(options.requireAuth===void 0&&record.requireAuth===void 0&&record.auth==="bearer"){notices.push("the record does not say whether --require-auth was set; restarting with it (pass --no-require-auth to keep /health open on loopback).")}const explicitToken=options.token?.trim()||void 0;const token=explicitToken??(baseEnv["QWEN_SERVER_TOKEN"]?.trim()||void 0);const bearer=record.auth==="bearer"||requireAuth||explicitToken!==void 0;if(bearer&&!token){return{error:record.auth!=="bearer"?"--require-auth requires --token or QWEN_SERVER_TOKEN.":record.tokenGenerated===true?`the daemon on port ${record.port} uses a token generated at startup, which is not recorded; pass that token with --token or QWEN_SERVER_TOKEN, or stop the daemon and run \`qwen serve\` again.`:"restarting a bearer daemon requires --token or QWEN_SERVER_TOKEN; a token in a workspace .env or settings file is not read here."}}if(options.token){notices.push("--token is visible in this shell process list; prefer QWEN_SERVER_TOKEN.")}const javaScriptEntry=isJavaScriptEntry(entry);const command=javaScriptEntry?process.execPath:entry;const prefix=javaScriptEntry?[...execArgv,entry]:[];const env={...baseEnv};if(bearer){env["QWEN_SERVER_TOKEN"]=token}else{delete env["QWEN_SERVER_TOKEN"]}const stopArgs=[...prefix,"daemon","stop","--port",String(record.port)];if(options.force)stopArgs.push("--force");const startArgs=[...prefix,"daemon","start","--port",String(record.port),"--hostname",record.hostname,"--wait"];for(const workspace of workspaces){startArgs.push("--workspace",workspace)}if(web===false)startArgs.push("--no-web");if(requireAuth)startArgs.push("--require-auth");return{notices,command,stopArgs,startArgs,workspaces,env}}__name(buildDaemonRestartPlan,"buildDaemonRestartPlan");function selectRestartTarget(entries,port){if(port!==void 0){const entry=entries.find(candidate=>candidate.record.port===port);return entry?{entry}:{error:`No daemon is registered on port ${port}.`}}if(entries.length===0){return{error:"no daemon is registered. Start one with `qwen serve`."}}if(entries.length>1){return{error:`${entries.length} daemons are registered; pass --port <port> to choose one.`}}return{entry:entries[0]}}__name(selectRestartTarget,"selectRestartTarget");async function daemonRejectsToken(record,token,allowToken=listenerIdentityVerified(record)){if(!allowToken)return false;try{const response=await fetch(new URL("/daemon/status?detail=summary",record.url),{signal:AbortSignal.timeout(DETAIL_TIMEOUT_MS),redirect:"manual",headers:{Authorization:`Bearer ${token}`}});return response.status===401}catch{return false}}__name(daemonRejectsToken,"daemonRejectsToken");var defaultRestartDeps={run:__name((command,args,env)=>spawnSync(command,[...args],{stdio:"inherit",env}),"run"),entries:__name(()=>readDaemonDiscoveries().entries,"entries"),hostedBy:__name(pid=>{const parents=processParentTable();return parents!==void 0&&isProcessAncestor(pid,process.pid,parents)},"hostedBy"),validateWorkspaces:canonicalizeStartWorkspaces,rejectsToken:__name((record,token)=>daemonRejectsToken(record,token),"rejectsToken")};async function runDaemonRestart(record,plan,deps=defaultRestartDeps){if(plan.error){writeStderrLine(`qwen daemon: ${plan.error}`);return 1}for(const notice of plan.notices??[]){writeStderrLine(`qwen daemon: ${notice}`)}if(pidResolvableHere(record,currentPidNamespace())&&deps.hostedBy(record.pid)){writeStderrLine(`qwen daemon: refusing to restart port ${record.port} from a process that daemon hosts, such as its Web Shell terminal; stopping it would end this command before the new daemon starts. Run restart from a shell outside the daemon.`);return 1}try{await deps.validateWorkspaces(plan.workspaces)}catch(error){writeStderrLine(`qwen daemon: cannot restart: ${error instanceof Error?error.message:String(error)}`);return 1}const token=plan.env?.["QWEN_SERVER_TOKEN"];if(record.auth==="bearer"&&token&&await deps.rejectsToken(record,token)){writeStderrLine(`qwen daemon: the daemon on port ${record.port} rejected the supplied token. Restart keeps the daemon credential; pass its current token, or stop it and start it with the new one.`);return 1}const persistedToken=readDaemonToken(record.port,record.pid);const stopped=deps.run(plan.command,plan.stopArgs,plan.env);if(stopped.error){writeStderrLine(`qwen daemon: could not run daemon stop: ${stopped.error.message}`);return 1}if(stopped.status!==0){if(deps.entries().some(entry=>entry.record.port===record.port)){return 1}writeStdoutLine(`qwen daemon: the daemon on port ${record.port} already exited; starting it again.`)}const started=deps.run(plan.command,plan.startArgs,plan.env);if(started.error){writeStderrLine(`qwen daemon: could not run daemon start: ${started.error.message}`);writeStderrLine(`qwen daemon: the daemon on port ${record.port} is stopped.`);return 1}if(started.status!==0)return 1;const restarted=deps.entries().find(entry=>entry.record.port===record.port&&(entry.record.pid!==record.pid||entry.record.startedAt!==record.startedAt));if(!restarted){writeStderrLine(`qwen daemon: the restarted daemon is not on port ${record.port}; the port may be in use. Run \`qwen daemon status\` to find it.`);return 1}if(persistedToken!==void 0){const tokenToPersist=plan.env?.["QWEN_SERVER_TOKEN"]??persistedToken;try{writeDaemonToken(record.port,restarted.record.pid,tokenToPersist)}catch(error){writeStderrLine(`qwen daemon: could not persist the token for the restarted daemon: ${error instanceof Error?error.message:String(error)}`);return 1}}return 0}__name(runDaemonRestart,"runDaemonRestart");async function handleRestart(argv){ignoreBrokenPipe();const target=selectRestartTarget(readDaemonDiscoveries().entries,argv.port);if(!target.entry){writeStderrLine(`qwen daemon: ${target.error}`);process.exitCode=1;return}const entry=resolveCliEntry();if(!entry){writeStderrLine("qwen daemon: cannot determine the CLI entry; restart requires the qwen CLI.");process.exitCode=1;return}const{record}=target.entry;const plan=buildDaemonRestartPlan(record,{token:argv.token,web:argv.web,requireAuth:argv["require-auth"],force:argv.force},entry);if(await runDaemonRestart(record,plan)!==0)process.exitCode=1}__name(handleRestart,"handleRestart");var startCommand2={command:"start",describe:"Start a local qwen serve daemon in the background",builder:__name(yargs=>yargs.option("port",{type:"number",describe:"TCP port (default 4170; 0 picks an ephemeral port)"}).option("hostname",{type:"string",default:"127.0.0.1",describe:"Interface to bind"}).option("workspace",{type:"string",array:true,requiresArg:true,describe:"Workspace path; repeat for multiple; defaults to the current directory"}).option("web",{type:"boolean",default:true,describe:"Serve the Web Shell; use --no-web for API-only"}).option("require-auth",{type:"boolean",default:false,describe:"Require the bearer token even on loopback"}).option("token",{type:"string",describe:"Bearer token for the child; prefer QWEN_SERVER_TOKEN"}).option("save-token",{type:"boolean",default:false,describe:"Persist the bearer token in a 0600 sidecar for daemon token"}).option("wait",{type:"boolean",default:false,describe:"Wait until the daemon runtime is serving before returning"}).option("json",{type:"boolean",default:false,describe:"Output a JSON summary"}),"builder"),handler:__name(async argv=>{await handleStart(argv)},"handler")};var statusCommand2={command:"status",describe:"List local qwen serve daemons and their health",builder:__name(yargs=>yargs.option("json",{type:"boolean",default:false,describe:"Output one JSON object per daemon"}).option("prune",{type:"boolean",default:false,describe:"Remove records whose process is gone"}).option("detail",{type:"boolean",default:false,describe:"Fetch /daemon/status for version, uptime, active sessions, and issue count"}),"builder"),handler:__name(async argv=>{await handleStatus(argv)},"handler")};var logsCommand={command:"logs",describe:"Show or follow a local daemon log file",builder:__name(yargs=>yargs.option("port",{type:"number",describe:"Daemon port; required when more than one is registered"}).option("follow",{alias:"f",type:"boolean",default:false,describe:"Keep printing new lines"}).option("lines",{alias:"n",type:"number",default:50,describe:"Number of trailing lines to print first"}),"builder"),handler:__name(async argv=>{await handleLogs(argv)},"handler")};var stopCommand2={command:"stop",describe:"Stop a local qwen serve daemon",builder:__name(yargs=>yargs.option("port",{type:"number",describe:"Daemon port; required when more than one is registered"}).option("all",{type:"boolean",default:false,describe:"Stop every registered daemon"}).option("force",{type:"boolean",default:false,describe:"SIGKILL a daemon that does not exit after SIGTERM"}),"builder"),handler:__name(async argv=>{await handleStop(argv)},"handler")};var restartCommand={command:"restart",describe:"Restart a local qwen serve daemon on its recorded port and workspaces",builder:__name(yargs=>yargs.option("port",{type:"number",describe:"Daemon port; required when more than one is registered"}).option("token",{type:"string",describe:"Bearer token for the restarted daemon; a running bearer daemon must accept it. Prefer QWEN_SERVER_TOKEN"}).option("web",{type:"boolean",describe:"Serve the Web Shell; defaults to the recorded mode, use --no-web for API-only"}).option("require-auth",{type:"boolean",describe:"Require the bearer token even on loopback; defaults to the recorded setting"}).option("force",{type:"boolean",default:false,describe:"Pass --force to daemon stop: confirm the Windows hard kill, or SIGKILL a POSIX daemon that does not exit after SIGTERM"}),"builder"),handler:__name(async argv=>{await handleRestart(argv)},"handler")};var tokenCommand={command:"token",describe:"Show or remove a persisted daemon bearer token",builder:__name(yargs=>yargs.option("port",{type:"number",describe:"Daemon port; required when more than one is registered"}).option("json",{type:"boolean",default:false,describe:"Output a JSON object"}).option("remove",{type:"boolean",default:false,describe:"Remove the persisted token"}),"builder"),handler:__name(async argv=>{await handleToken(argv)},"handler")};var daemonCommand={command:"daemon",describe:"Inspect and control local qwen serve daemons",builder:__name(yargs=>yargs.command(startCommand2).command(statusCommand2).command(logsCommand).command(stopCommand2).command(restartCommand).command(tokenCommand).demandCommand(1,"You need at least one command before continuing.").version(false),"builder"),handler:__name(()=>{},"handler")};init_esbuild_shims();import{createInterface}from"node:readline/promises";import{resolve as resolve3}from"node:path";function formatAttachError(message){return sanitizeTerminalText(message).replace(/[\t\n]/g,"")}__name(formatAttachError,"formatAttachError");function defaultAttachRecordAlive(record){if(!pidResolvableHere(record,currentPidNamespace()))return true;return isProcessAlive(record.pid)&&processStartMatchesRecord(record.startedAt,processStartTime(record.pid))}__name(defaultAttachRecordAlive,"defaultAttachRecordAlive");function selectAttachRecord(entries,port,alive=defaultAttachRecordAlive){const candidates=entries.filter(entry=>alive(entry.record));if(port!==void 0){const entry=candidates.find(candidate=>candidate.record.port===port);return entry?{record:entry.record}:{error:`No daemon is registered on port ${port}.`}}if(candidates.length===0){return{error:"no daemon is registered. Start one with `qwen serve`."}}if(candidates.length>1){return{error:`${candidates.length} daemons are registered; pass --port <port> to choose one.`}}return{record:candidates[0].record}}__name(selectAttachRecord,"selectAttachRecord");function resolveAttachToken(record,explicit,identityVerified=listenerIdentityVerified){if(record.auth!=="bearer")return{};const explicitToken=explicit?.trim();if(explicitToken)return{token:explicitToken};if(!identityVerified(record)){return{error:"listener identity unverified; not sending an ambient bearer token. Pass --token to use an explicit token."}}let token;try{token=process.env["QWEN_SERVER_TOKEN"]?.trim()||readDaemonToken(record.port,record.pid)}catch(error){return{error:`could not read the daemon token: ${formatAttachError(error instanceof Error?error.message:String(error))}`}}return token?{token}:{error:"this daemon requires a bearer token; pass --token, set QWEN_SERVER_TOKEN, or start it with --save-token."}}__name(resolveAttachToken,"resolveAttachToken");function resolveAttachWorkspace(record,explicit){const requested=explicit?.trim();if(requested)return resolve3(requested);return record.workspaces.length===1?record.workspaces[0]:void 0}__name(resolveAttachWorkspace,"resolveAttachWorkspace");async function handleAttach(argv){ignoreBrokenPipe();let shuttingDown=false;const startupAbort=new AbortController;const earlyState={};const earlyShutdown=__name(()=>{shuttingDown=true;process.exitCode=130;const finish=__name(()=>process.exit(130),"finish");startupAbort.abort();if(earlyState.session){void earlyState.session.detach().catch(()=>{}).finally(finish)}setTimeout(finish,500).unref()},"earlyShutdown");process.once("SIGINT",earlyShutdown);process.once("SIGTERM",earlyShutdown);const{entries,invalid}=readDaemonDiscoveries();for(const item of invalid){writeStderrLine(`qwen attach: ignoring ${formatAttachError(`${item.path}: ${item.reason}`)}`)}const target=selectAttachRecord(entries,argv.port);if(!target.record){writeStderrLine(`qwen attach: ${formatAttachError(target.error??"")}`);process.exitCode=1;return}const resolved=resolveAttachToken(target.record,argv.token);if(resolved.error){writeStderrLine(`qwen attach: ${formatAttachError(resolved.error)}`);process.exitCode=1;return}const workspaceCwd=resolveAttachWorkspace(target.record,argv.workspace);const client=new DaemonClient({baseUrl:target.record.url,token:resolved.token??""});let session;try{session=await DaemonSessionClient.load(client,argv.session,{...workspaceCwd?{workspaceCwd}:{},signal:startupAbort.signal})}catch(error){if(shuttingDown)return;const workspaceHint=target.record.workspaces.length>1&&!workspaceCwd?" If the session belongs to another workspace, pass --workspace <path>.":"";writeStderrLine(`qwen attach: could not load session: ${formatAttachError(error instanceof Error?error.message:String(error))}${workspaceHint}`);process.exitCode=1;return}earlyState.session=session;if(shuttingDown){await session.detach().catch(()=>{});return}let atLineStart=true;let terminalClosed=false;let promptInFlight=0;let notifyTurnSettled=__name(()=>{},"notifyTurnSettled");const writeText=__name(text=>{const safe=sanitizeTerminalText(text);if(safe.length===0)return;process.stdout.write(safe);atLineStart=safe.endsWith("\n")},"writeText");const endLine=__name(()=>{if(atLineStart)return;process.stdout.write("\n");atLineStart=true},"endLine");const renderEvent=__name(event=>{const settled=event.type==="turn_complete"||event.type==="turn_error";if(settled)endLine();for(const item of normalizeDaemonEvent(event,{clientId:session.clientId,suppressOwnUserEcho:true})){if(item.type==="assistant.text.delta"||item.type==="thought.text.delta"){writeText(item.text)}else if(item.type==="prompt.cancelled"){endLine()}else if(item.type==="permission.request"){endLine();const title=sanitizeTerminalText(item.title);const options=item.options.map(option=>sanitizeTerminalText(option.label)).join(" / ");writeStderrLine(`qwen attach: approval required: ${title}. Approve in Web Shell.${options?` Options: ${options}`:""}`)}else if(item.type==="error"){endLine();writeStderrLine(`qwen attach: ${sanitizeTerminalText(item.text)}`)}else if(item.type==="session.state_resync_required"){endLine();const start=item.lastDeliveredId+1;const end=item.earliestAvailableId-1;writeStderrLine(`qwen attach: state resync required (${sanitizeTerminalText(item.reason)}); missed events ${start}..${end}; reattach to reload the session.`);process.exitCode=1}else{}}if(settled)notifyTurnSettled()},"renderEvent");const snapshot2=session.consumeReplaySnapshot();for(const event of[...snapshot2.compactedReplay,...snapshot2.liveJournal]){renderEvent(event)}endLine();if(shuttingDown){await session.detach().catch(()=>{});return}const subscriptionAbort=new AbortController;let shutdownStarted=false;const iterator=session.events({signal:subscriptionAbort.signal});const eventsDone=(async()=>{try{while(true){const next=await iterator.next();if(next.done)break;renderEvent(next.value)}if(!shuttingDown){endLine();writeStderrLine("qwen attach: stream ended");process.exitCode=1}}catch(error){if(!shuttingDown){endLine();writeStderrLine(`qwen attach: stream ended: ${formatAttachError(error instanceof Error?error.message:String(error))}`);process.exitCode=1}}})();const rl=createInterface({input:process.stdin,output:process.stdout,terminal:true});notifyTurnSettled=__name(()=>{if(!terminalClosed&&promptInFlight===0)rl.prompt()},"notifyTurnSettled");const shutdown=__name(()=>{if(shutdownStarted)return;shutdownStarted=true;shuttingDown=true;terminalClosed=true;subscriptionAbort.abort();rl.close();void iterator.return(void 0).catch(()=>{})},"shutdown");rl.on("SIGINT",shutdown);rl.on("close",shutdown);process.once("SIGINT",shutdown);process.once("SIGTERM",shutdown);process.removeListener("SIGINT",earlyShutdown);process.removeListener("SIGTERM",earlyShutdown);if(shuttingDown)shutdown();rl.on("line",line=>{atLineStart=true;const text=line.trim();if(text.length===0){rl.prompt();return}promptInFlight+=1;void session.prompt({prompt:[{type:"text",text}]}).catch(error=>{if(!terminalClosed){endLine();writeStderrLine(`qwen attach: prompt failed: ${formatAttachError(error instanceof Error?error.message:String(error))}`)}}).finally(()=>{promptInFlight-=1;if(!terminalClosed){endLine();rl.prompt()}})});rl.prompt();try{await eventsDone}finally{shutdownStarted=true;shuttingDown=true;terminalClosed=true;subscriptionAbort.abort();process.removeListener("SIGINT",earlyShutdown);process.removeListener("SIGTERM",earlyShutdown);process.removeListener("SIGINT",shutdown);process.removeListener("SIGTERM",shutdown);rl.close();void iterator.return(void 0).catch(()=>{});await session.detach().catch(()=>{})}}__name(handleAttach,"handleAttach");var attachCommand={command:"attach",describe:"Attach a terminal to a running daemon session",builder:__name(yargs=>yargs.option("port",{type:"number",describe:"Daemon port; required when more than one is registered"}).option("session",{type:"string",demandOption:true,describe:"Daemon session id to attach to"}).option("workspace",{type:"string",describe:"Workspace containing the session; required for a secondary workspace"}).option("token",{type:"string",describe:"Bearer token; prefer QWEN_SERVER_TOKEN"}),"builder"),handler:__name(async argv=>{await handleAttach(argv)},"handler")};init_esbuild_shims();init_esbuild_shims();var ID_COL=12;var LABEL_COL=MAX_CONTROLLER_LABEL_CHARS*2+2;function sanitize2(value){return sanitizeTerminalText2(value).replace(/[\t\n]/g,"")}__name(sanitize2,"sanitize");function padDisplay(str,width){const currentWidth=stringWidth(str);if(currentWidth>=width)return str;return str+" ".repeat(width-currentWidth)}__name(padDisplay,"padDisplay");function formatCreated(createdAt){const date=new Date(createdAt);return Number.isNaN(date.getTime())?"unknown":date.toISOString().replace("T"," ").slice(0,16)}__name(formatCreated,"formatCreated");function describeError(error){return error instanceof Error?error.message:String(error)}__name(describeError,"describeError");async function handleAdd(argv){let added;try{added=await addPeerController(argv.label??"")}catch(error){writeStderrLine(error instanceof PeerControllerError?`Error: ${error.message}`:`Error: could not write ${getPeerControllerRegistryPath()}: ${describeError(error)}`);process.exit(1);return}const{record,token}=added;if(argv.json){writeStdoutLine(JSON.stringify({id:record.id,label:record.label,token,createdAt:record.createdAt}));return}writeStdoutLine(`Controller "${sanitize2(record.label)}" added (${record.id}).`);writeStdoutLine("");writeStdoutLine("Token \u2014 shown once and never stored, so put it in the controller's own configuration now:");writeStdoutLine(` ${token}`);writeStdoutLine("");writeStdoutLine("The controller presents it on the first line of every connection to a session inbox:");writeStdoutLine(` {"msgV":1,"type":"auth","token":"${token}"}`);writeStdoutLine("The target session must not have agents.crossSessionMessaging turned off (it is on by default), and must be restarted after changing that setting.");writeStdoutLine('Messages it sends are delivered without per-message review, unless agents.crossSessionInbound is "hold" or "refuse".')}__name(handleAdd,"handleAdd");async function handleControllerList(argv){let records;try{records=await listPeerControllers()}catch(error){writeStderrLine(error instanceof PeerControllerError?`Error: ${error.message}`:`Error: could not read ${getPeerControllerRegistryPath()}: ${describeError(error)}`);process.exit(1);return}if(argv.json){for(const record of records){writeStdoutLine(JSON.stringify({id:record.id,label:record.label,createdAt:record.createdAt}))}return}if(records.length===0){writeStdoutLine("No trusted controllers. Add one with: qwen sessions controllers add --label <name>");return}writeStdoutLine(padDisplay("ID",ID_COL)+padDisplay("LABEL",LABEL_COL)+"CREATED");for(const record of records){writeStdoutLine(padDisplay(record.id,ID_COL)+padDisplay(truncateToWidth(sanitize2(record.label),LABEL_COL-2),LABEL_COL)+formatCreated(record.createdAt))}}__name(handleControllerList,"handleControllerList");async function handleRemove(argv){let removed;try{removed=await removePeerController(argv.id??"")}catch(error){writeStderrLine(error instanceof PeerControllerError?`Error: ${error.message}`:`Error: could not write ${getPeerControllerRegistryPath()}: ${describeError(error)}`);process.exit(1);return}if(!removed){writeStderrLine(`Error: no controller has the id "${sanitize2(argv.id??"")}". Run "qwen sessions controllers list" to see them.`);process.exit(1);return}writeStdoutLine(`Removed controller "${sanitize2(removed.label)}" (${removed.id}).`);writeStdoutLine("Running sessions stop accepting its token on the next connection.")}__name(handleRemove,"handleRemove");var controllersCommand={command:"controllers",describe:"Manage the controller tokens that may drive your sessions",builder:__name(yargs=>yargs.command({command:"add",describe:"Mint a controller token and print it once",builder:__name(add=>add.option("label",{type:"string",describe:"What to call this controller, for later revocation",demandOption:true}).option("json",{type:"boolean",describe:"Output as a single JSON object",default:false}),"builder"),handler:__name(async argv=>{await handleAdd(argv)},"handler")}).command({command:"list",describe:"List the controllers this Qwen home trusts",builder:__name(list=>list.option("json",{type:"boolean",describe:"Output as JSON Lines",default:false}),"builder"),handler:__name(async argv=>{await handleControllerList(argv)},"handler")}).command({command:"remove <id>",describe:"Revoke a controller by id",builder:__name(remove=>remove.positional("id",{type:"string",describe:'The id shown by "qwen sessions controllers list"'}),"builder"),handler:__name(async argv=>{await handleRemove(argv)},"handler")}).demandCommand(1,"You need at least one command before continuing.").version(false),"builder"),handler:__name(()=>{},"handler")};init_esbuild_shims();init_esbuild_shims();function initSessionService(){const settings=loadSettings();Storage.setRuntimeBaseDir(settings.merged.advanced?.runtimeOutputDir,process.cwd());return new SessionService(process.cwd())}__name(initSessionService,"initSessionService");var SESSION_COL=38;var TIME_COL=16;var TITLE_COL=24;var BRANCH_COL=12;function formatTime(iso){const d=new Date(iso);if(isNaN(d.getTime()))return iso;const pad=__name(n=>String(n).padStart(2,"0"),"pad");return`${d.getUTCFullYear()}-${pad(d.getUTCMonth()+1)}-${pad(d.getUTCDate())} ${pad(d.getUTCHours())}:${pad(d.getUTCMinutes())}`}__name(formatTime,"formatTime");function sanitize3(value){const stripped=value.replace(/[\r\n\t]/g,"");const escaped=escapeAnsiCtrlCodes(stripped);return escaped.replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f-\x9f]/g,"")}__name(sanitize3,"sanitize");function padDisplay2(str,width){const currentWidth=stringWidth(str);if(currentWidth>=width)return str;return str+" ".repeat(width-currentWidth)}__name(padDisplay2,"padDisplay");function truncate(str,maxLen){const width=stringWidth(str);if(width<=maxLen)return str;const suffix=maxLen>3?"...":"";const target=maxLen-stringWidth(suffix);let result="";let w=0;for(const char of str){w+=stringWidth(char);if(w>target)break;result+=char}return result+suffix}__name(truncate,"truncate");function outputHuman(items){if(items.length===0){writeStdoutLine("No sessions found.");return}const termWidth=process.stdout.columns??80;const PROMPT_COL=Math.max(20,termWidth-SESSION_COL-TIME_COL-TITLE_COL-BRANCH_COL-4);const header=padDisplay2("SESSION ID",SESSION_COL)+" "+padDisplay2("STARTED",TIME_COL)+" "+padDisplay2("TITLE",TITLE_COL)+" "+padDisplay2("BRANCH",BRANCH_COL)+" PROMPT";writeStdoutLine(header);for(const item of items){const sessionId=truncate(sanitize3(String(item.sessionId??"")),SESSION_COL);const time=truncate(sanitize3(formatTime(item.startTime)),TIME_COL);const sanitizedPrompt=sanitize3(item.prompt??"");const title=truncate(item.customTitle!=null?sanitize3(item.customTitle):sanitizedPrompt,TITLE_COL);const branch=truncate(item.gitBranch!=null?sanitize3(item.gitBranch):"-",BRANCH_COL);const prompt=truncate(sanitizedPrompt,PROMPT_COL);writeStdoutLine(`${padDisplay2(sessionId,SESSION_COL)} ${padDisplay2(time,TIME_COL)} ${padDisplay2(title,TITLE_COL)} ${padDisplay2(branch,BRANCH_COL)} ${prompt}`)}}__name(outputHuman,"outputHuman");function toJsonItem(item){return{sessionId:item.sessionId,startTime:item.startTime,mtime:item.mtime,prompt:item.prompt,gitBranch:item.gitBranch??null,customTitle:item.customTitle??null,titleSource:item.titleSource??null,filePath:item.filePath,cwd:item.cwd}}__name(toJsonItem,"toJsonItem");function formatError(err){return err instanceof Error?err.message:String(err)}__name(formatError,"formatError");async function handleList(argv){let svc;try{svc=initSessionService()}catch(err){writeStderrLine(`Error: failed to initialize session service: ${formatError(err)}`);process.exit(1);return}let result;try{result=await svc.listSessions({size:argv.limit??20,excludeSourceTypes:[AGENT_HOST_SESSION_SOURCE_TYPE,AGENT_SESSION_SOURCE_TYPE]})}catch(err){writeStderrLine(`Error: failed to list sessions: ${formatError(err)}`);process.exit(1);return}if(argv.json){for(const item of result.items){writeStdoutLine(JSON.stringify(toJsonItem(item)))}if(result.items.length>0&&result.hasMore){writeStderrLine(`Note: ${result.items.length} sessions shown, more available. Use --limit to show more.`)}}else{outputHuman(result.items);if(result.items.length>0&&result.hasMore){writeStdoutLine(`Showing ${result.items.length} sessions. Use --limit to show more.`)}}}__name(handleList,"handleList");var listCommand4={command:"list",describe:"List sessions",builder:__name(yargs=>yargs.option("json",{type:"boolean",describe:"Output as JSON Lines",default:false}).option("limit",{type:"number",describe:"Maximum number of sessions to show",default:20,coerce:__name(v=>Number.isInteger(v)&&v>0?v:20,"coerce")}),"builder"),handler:__name(async argv=>{await handleList(argv)},"handler")};init_esbuild_shims();init_esbuild_shims();import*as fs2 from"node:fs/promises";import*as path3 from"node:path";function getAgentViewStorePaths(options={}){const globalDir=options.globalDir??Storage.getGlobalQwenDir();const daemonDir=path3.join(globalDir,"daemon");return{globalDir,daemonDir,rosterPath:path3.join(daemonDir,"roster.json"),supervisorPath:path3.join(daemonDir,"supervisor.json"),daemonLogPath:path3.join(daemonDir,"daemon.log"),jobsDir:path3.join(globalDir,"jobs")}}__name(getAgentViewStorePaths,"getAgentViewStorePaths");function getAgentViewSessionPaths(sessionId,options={}){const safeId=sanitizeSessionId(sessionId);const sessionDir=path3.join(getAgentViewStorePaths(options).jobsDir,safeId);return{sessionDir,statePath:path3.join(sessionDir,"state.json"),launchPath:path3.join(sessionDir,"launch.json"),activityPath:path3.join(sessionDir,"activity.json"),workerPath:path3.join(sessionDir,"worker.json"),tmpDir:path3.join(sessionDir,"tmp")}}__name(getAgentViewSessionPaths,"getAgentViewSessionPaths");async function readAgentViewSessionState(sessionId,options={}){const paths=getAgentViewSessionPaths(sessionId,options);const raw=await readJsonRecord(paths.statePath);return normalizeSessionState(raw,path3.basename(paths.sessionDir))}__name(readAgentViewSessionState,"readAgentViewSessionState");async function listAgentViewSessionStates(options={}){const{jobsDir}=getAgentViewStorePaths(options);let entries;try{entries=await fs2.readdir(jobsDir)}catch(error){if(isNodeError2(error)&&error.code==="ENOENT"){return[]}throw error}const states=await Promise.all(entries.map(sessionId=>readAgentViewSessionState(sessionId,options)));return states.filter(state=>Boolean(state)).sort((left,right)=>right.updatedAt.localeCompare(left.updatedAt))}__name(listAgentViewSessionStates,"listAgentViewSessionStates");function sanitizeSessionId(sessionId){const safe=path3.basename(sessionId.replace(/\\/g,"/")).toLowerCase().replace(/^\.+/g,"_").replace(/[<>:"|?*\x00-\x1F]/g,"_");return safe||"_"}__name(sanitizeSessionId,"sanitizeSessionId");async function readJsonRecord(filePath){try{const text=await fs2.readFile(filePath,"utf8");const parsed=JSON.parse(text);return isRecord(parsed)?parsed:void 0}catch{return void 0}}__name(readJsonRecord,"readJsonRecord");function normalizeSessionState(raw,expectedSessionId){if(!raw)return void 0;const sessionId=expectedSessionId||stringValue(raw["sessionId"]);const projectCwd=stringValue(raw["projectCwd"]);const originalCwd=stringValue(raw["originalCwd"]);const activeCwd=stringValue(raw["activeCwd"]);const createdAt=stringValue(raw["createdAt"]);const updatedAt=stringValue(raw["updatedAt"]);if(!sessionId||!projectCwd||!originalCwd||!activeCwd||!createdAt||!updatedAt){return void 0}return{...raw,schemaVersion:1,sessionId,ownership:ownershipValue(raw["ownership"]),sessionState:sessionStateValue(raw["sessionState"]),processState:processStateValue(raw["processState"]),attachState:attachStateValue(raw["attachState"]),projectCwd:path3.resolve(projectCwd),originalCwd:path3.resolve(originalCwd),activeCwd:path3.resolve(activeCwd),createdAt,updatedAt,worktree:isRecord(raw["worktree"])?{...raw["worktree"],mode:worktreeModeValue(raw["worktree"]["mode"])}:{mode:"none"}}}__name(normalizeSessionState,"normalizeSessionState");function ownershipValue(value){return value==="unmanaged"||value==="adopting"||value==="managed"||value==="removing"?value:"managed"}__name(ownershipValue,"ownershipValue");function isAgentViewSessionState(value){return value==="starting"||value==="working"||value==="needs_input"||value==="idle"||value==="completed"||value==="stopped"||value==="failed"}__name(isAgentViewSessionState,"isAgentViewSessionState");function sessionStateValue(value){return isAgentViewSessionState(value)?value:"failed"}__name(sessionStateValue,"sessionStateValue");function processStateValue(value){return value==="starting"||value==="alive"||value==="hibernating"||value==="hibernated"||value==="restarting"||value==="exited"?value:"exited"}__name(processStateValue,"processStateValue");function attachStateValue(value){return value==="attaching"||value==="attached"?value:"detached"}__name(attachStateValue,"attachStateValue");function worktreeModeValue(value){return value==="worktree"||value==="shared-unisolated"?value:"none"}__name(worktreeModeValue,"worktreeModeValue");function stringValue(value){return typeof value==="string"&&value.length>0?value:void 0}__name(stringValue,"stringValue");function isRecord(value){return typeof value==="object"&&value!==null&&!Array.isArray(value)}__name(isRecord,"isRecord");function isNodeError2(error){return error instanceof Error&&"code"in error}__name(isNodeError2,"isNodeError");var NAME_COL=22;var KIND_COL=10;var PID_COL=9;var AGE_COL=10;function sanitize4(value){return sanitizeTerminalText2(value).replace(/[\t\n]/g,"")}__name(sanitize4,"sanitize");function padDisplay3(str,width){const currentWidth=stringWidth(str);if(currentWidth>=width)return str;return str+" ".repeat(width-currentWidth)}__name(padDisplay3,"padDisplay");function formatAge(ms){const seconds=Math.max(0,Math.floor(ms/1e3));if(seconds<60)return`${seconds}s`;const minutes=Math.floor(seconds/60);if(minutes<60)return`${minutes}m`;const hours=Math.floor(minutes/60);if(hours<24)return`${hours}h`;return`${Math.floor(hours/24)}d`}__name(formatAge,"formatAge");function outputHuman2(records,managed,now){writeStdoutLine(padDisplay3("NAME",NAME_COL)+padDisplay3("KIND",KIND_COL)+padDisplay3("PID",PID_COL)+padDisplay3("AGE",AGE_COL)+"DIRECTORY");for(const session of managed){writeStdoutLine(padDisplay3(truncateToWidth(sanitize4(session.sessionId),NAME_COL-2),NAME_COL)+padDisplay3("managed",KIND_COL)+padDisplay3("-",PID_COL)+padDisplay3("-",AGE_COL)+sanitize4(session.cwd))}for(const record of records){writeStdoutLine(padDisplay3(truncateToWidth(sanitize4(record.name),NAME_COL-2),NAME_COL)+padDisplay3(truncateToWidth(describeSessionKind(record.kind),KIND_COL-2),KIND_COL)+padDisplay3(String(record.pid),PID_COL)+padDisplay3(formatAge(now-record.startedAt),AGE_COL)+sanitize4(record.cwd))}}__name(outputHuman2,"outputHuman");async function readManagedSessions(){try{return(await listAgentViewSessionStates()).filter(state=>state.ownership==="managed").map(({sessionId,activeCwd})=>({sessionId,cwd:activeCwd}))}catch(error){const reason=error instanceof Error?error.message:String(error);writeStderrLine(`Managed sessions could not be listed: ${sanitize4(reason)}`);return[]}}__name(readManagedSessions,"readManagedSessions");async function handlePs(argv){ignoreBrokenPipe();const[records,managed]=await Promise.all([listLiveSessions(),readManagedSessions()]);if(argv.json){for(const session of managed){writeStdoutLine(JSON.stringify({...session,managed:true}))}for(const record of records){writeStdoutLine(JSON.stringify({...record,ipcToken:void 0}))}return}if(records.length===0&&managed.length===0){writeStdoutLine("No Qwen Code sessions are registered or managed right now.");return}outputHuman2(records,managed,Date.now())}__name(handlePs,"handlePs");var psCommand={command:"ps",describe:"List registered and managed Qwen Code sessions",builder:__name(yargs=>yargs.option("json",{type:"boolean",describe:"Output as JSON Lines",default:false}),"builder"),handler:__name(async argv=>{await handlePs(argv)},"handler")};var sessionsCommand={command:"sessions",describe:"Manage Qwen Code sessions",builder:__name(yargs=>yargs.command(listCommand4).command(psCommand).command(controllersCommand).demandCommand(1,"You need at least one command before continuing.").version(false),"builder"),handler:__name(()=>{},"handler")};init_esbuild_shims();init_esbuild_shims();var DEFAULT_DAEMON_URL3="http://127.0.0.1:4170";var ENROLLMENT_TOKEN_ENV="QWEN_AGENT_HOST_ENROLLMENT_TOKEN";function readHiddenLine(question,input,write){if(!input.isTTY||typeof input.setRawMode!=="function"){return Promise.resolve(void 0)}const wasRaw=input.isRaw===true;input.setRawMode(true);write(question);return new Promise(resolve6=>{let line="";let escape="none";const finish=__name(answer=>{input.off("data",onData);input.setRawMode?.(wasRaw);input.pause();write("\n");resolve6(answer)},"finish");const onData=__name(chunk=>{for(const char of chunk.toString("utf8")){if(escape==="esc"){escape=char==="["?"csi":char==="O"?"ss3":"none";continue}if(escape==="csi"){if(char>="@"&&char<="~")escape="none";continue}if(escape==="ss3"){escape="none";continue}switch(char){case"\x1B":escape="esc";break;case"\r":case"\n":case"":finish(line);return;case"":finish(void 0);return;case"\x7F":case"\b":line=[...line].slice(0,-1).join("");break;default:if(char>=" ")line+=char}}},"onData");input.on("data",onData);input.resume()})}__name(readHiddenLine,"readHiddenLine");async function promptTokenFromTty(){const answer=await readHiddenLine("Enrollment token (from the join dialog, not shown): ",process.stdin,text=>process.stderr.write(text));return answer?.trim()}__name(promptTokenFromTty,"promptTokenFromTty");async function runAgentsJoin(argv,deps){let target;try{target=parseJoinLink(argv.link)}catch{deps.err("qwen agents join expects the link shown by the coordinator, like https://host:4170/join/<workspace>.");return 1}const enrollmentToken=deps.env[ENROLLMENT_TOKEN_ENV]?.trim()||await deps.promptToken();if(!enrollmentToken){deps.err(`Set ${ENROLLMENT_TOKEN_ENV} to the enrollment token shown with the link.`);return 1}const baseUrl=(argv["daemon-url"]||deps.env[QWEN_DAEMON_URL_ENV]||DEFAULT_DAEMON_URL3).replace(/\/+$/,"");const daemonToken=argv.token??deps.env[QWEN_SERVER_TOKEN_ENV]??deps.env[QWEN_DAEMON_TOKEN_ENV];const workspace=argv.workspace||deps.cwd;const url=`${baseUrl}/workspaces/${encodeURIComponent(workspace)}/agent/hosts/connect`;let response;try{response=await deps.fetch(url,{method:"POST",headers:{"content-type":"application/json",...daemonToken?{authorization:`Bearer ${daemonToken}`}:{}},body:JSON.stringify({serverUrl:target.serverUrl,workspaceId:target.workspaceId,enrollmentToken,allowHttp:argv["allow-http"]===true}),redirect:"error",signal:AbortSignal.timeout(6e4)})}catch{deps.err(`No running qwen serve daemon answered at ${baseUrl}.`);deps.err(`Start one that joins directly instead:
|
|
31
|
+
`)}process.stderr.write("Scan the QR code with WeChat to connect.\n");return data.qrcode}__name(startLogin,"startLogin");async function waitForLogin(params){const{apiBaseUrl,timeoutMs=48e4}=params;let currentQrcodeId=params.qrcodeId;const deadline=Date.now()+timeoutMs;let retryCount=0;while(Date.now()<deadline){try{const controller=new AbortController;const timeout=setTimeout(()=>controller.abort(),6e4);const resp=await fetch(`${apiBaseUrl}/ilink/bot/get_qrcode_status?qrcode=${encodeURIComponent(currentQrcodeId)}`,{headers:buildHeaders(),signal:controller.signal});clearTimeout(timeout);if(!resp.ok)throw new Error(`HTTP ${resp.status}`);const data=await resp.json();switch(data.status){case"confirmed":return{connected:true,token:data.bot_token,baseUrl:data.baseurl,userId:data.ilink_user_id,message:"Connected to WeChat successfully!"};case"scaned":process.stderr.write("QR code scanned, waiting for confirmation...\n");break;case"expired":retryCount++;if(retryCount>=3){return{connected:false,message:"QR code expired after maximum retries."}}process.stderr.write("QR code expired, refreshing...\n");currentQrcodeId=await startLogin(apiBaseUrl);break;default:break}}catch(err){if(err instanceof Error&&err.name==="AbortError"){continue}throw err}await new Promise(r=>setTimeout(r,1e3))}return{connected:false,message:"Login timed out."}}__name(waitForLogin,"waitForLogin");var configureWeixinCommand={command:"configure-weixin [action]",describe:"Configure WeChat channel (login via QR code)",builder:__name(yargs=>yargs.positional("action",{type:"string",describe:'"clear" to remove stored credentials, omit to login'}),"builder"),handler:__name(async argv=>{const{action}=argv;if(action==="clear"){clearAccount();writeStdoutLine("WeChat credentials cleared.");return}if(action==="status"){const account=loadAccount();if(account){writeStdoutLine(`WeChat account configured (saved ${account.savedAt})`);writeStdoutLine(` Base URL: ${account.baseUrl}`);if(account.userId){writeStdoutLine(` User ID: ${account.userId}`)}}else{writeStdoutLine("WeChat account not configured.")}return}const existing=loadAccount();if(existing){writeStdoutLine(`Existing WeChat credentials found (saved ${existing.savedAt}).`);writeStdoutLine("Re-running login will overwrite them.\n")}const baseUrl=DEFAULT_BASE_URL;writeStdoutLine("Starting WeChat QR code login...\n");try{const qrcodeId=await startLogin(baseUrl);const result=await waitForLogin({qrcodeId,apiBaseUrl:baseUrl});if(result.connected&&result.token){saveAccount({token:result.token,baseUrl:result.baseUrl||baseUrl,userId:result.userId,savedAt:new Date().toISOString()});writeStdoutLine("\n"+result.message);writeStdoutLine("Credentials saved. You can now start a weixin channel with:");writeStdoutLine(" qwen channel start <name>")}else{writeStderrLine("\n"+result.message);process.exit(1)}}catch(err){writeStderrLine(`Login failed: ${err instanceof Error?err.message:String(err)}`);process.exit(1)}},"handler")};var pairingCommand={command:"pairing",describe:"Manage DM and group pairing requests",builder:__name(yargs=>yargs.command(pairingListCommand).command(pairingApproveCommand).demandCommand(1,"You need at least one command before continuing.").version(false),"builder"),handler:__name(()=>{},"handler")};var channelCommand={command:"channel",describe:"Manage messaging channels (Telegram, Discord, etc.)",builder:__name(yargs=>yargs.command(startCommand).command(daemonWorkerCommand).command(managedEmailCommand).command(stopCommand).command(statusCommand).command(reloadCommand).command(setCommand2).command(pairingCommand).command(configureWeixinCommand).demandCommand(1,"You need at least one command before continuing.").version(false),"builder"),handler:__name(()=>{},"handler")};init_esbuild_shims();var shouldUseColor=__name(()=>Boolean(process.stdout.isTTY&&!process.env["NO_COLOR"]),"shouldUseColor");var color=__name((value,code)=>shouldUseColor()?`\x1B[${code}m${value}\x1B[0m`:value,"color");var cyan=__name(value=>color(value,"36"),"cyan");var yellow=__name(value=>color(value,"33"),"yellow");var buildRemovalNotice=__name(()=>["",yellow(t("\u26A0 qwen auth has been removed.")),"",` ${cyan(t("Interactive"))} \u2192 ${t("run qwen and use /auth to configure providers")}`,` ${cyan(t("CI / Headless"))} \u2192 ${t("set provider environment variables, for example OPENAI_API_KEY + OPENAI_BASE_URL + OPENAI_MODEL")}`,` ${t("or pass --openai-api-key, --openai-base-url, --model")}`,` ${cyan(t("Coding Plan"))} \u2192 ${t("set BAILIAN_CODING_PLAN_API_KEY and use the Coding Plan base URL for your region")}`,` ${t("China: https://coding.dashscope.aliyuncs.com/v1")}`,` ${t("International: https://coding-intl.dashscope.aliyuncs.com/v1")}`,` ${cyan(t("Token Plan"))} \u2192 ${t("set BAILIAN_TOKEN_PLAN_API_KEY and use the Token Plan base URL for your region")}`,` ${t("China: https://token-plan.cn-beijing.maas.aliyuncs.com/compatible-mode/v1")}`,` ${t("International: https://token-plan.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1")}`,` ${cyan(t("OpenRouter"))} \u2192 ${t("set OPENROUTER_API_KEY and OPENAI_BASE_URL=https://openrouter.ai/api/v1")}`,` ${cyan(t("Requesty"))} \u2192 ${t("set REQUESTY_API_KEY and OPENAI_BASE_URL=https://router.requesty.ai/v1")}`,` ${cyan(t("Qwen OAuth"))} \u2192 ${t("run qwen interactively and use /auth; OAuth cannot be configured with env vars alone")}`,` ${cyan(t("Scripted"))} \u2192 ${t("edit ~/.qwen/settings.json, or run qwen interactively once")}`,"",` ${t("Check auth status")} \u2192 ${cyan("/doctor")}`,""].join("\n"),"buildRemovalNotice");var printRemovalNotice=__name(()=>{process.stdout.write(buildRemovalNotice(),()=>process.exit(0))},"printRemovalNotice");var legacySubcommands=["status","coding-plan","openrouter","requesty","api-key","qwen-oauth"];var authCommand={command:"auth",describe:t("Configure authentication (removed)"),builder:__name(yargs=>{let y=yargs.version(false).strict(false);for(const name of legacySubcommands){y=y.command({command:`${name} [legacyArgs..]`,describe:false,builder:__name(subYargs=>subYargs.strict(false),"builder"),handler:printRemovalNotice})}return y},"builder"),handler:printRemovalNotice};init_esbuild_shims();import{spawn,spawnSync}from"node:child_process";import*as fs from"node:fs";import*as fsp from"node:fs/promises";import*as path2 from"node:path";var HEALTH_TIMEOUT_MS=1e3;var DETAIL_TIMEOUT_MS=1500;var STOP_TIMEOUT_MS=1e4;var STOP_POLL_MS=100;var FOLLOW_POLL_MS=250;var PROCESS_START_TOLERANCE_MS=5e3;var PROCESS_START_LEAD_MS=10*6e4;var START_TIMEOUT_MS=3e4;var START_POLL_MS=100;var START_READY_TIMEOUT_MS=3e4;var START_READY_POLL_MS=250;function age(iso,now=Date.now()){const started=Date.parse(iso);return Number.isFinite(started)?Math.max(0,now-started):0}__name(age,"age");function processStartTime(pid){if(process.platform==="win32"){const result2=spawnSync("powershell.exe",["-NoProfile","-NonInteractive","-Command",`(Get-Process -Id ${pid} -ErrorAction Stop).StartTime.ToUniversalTime().ToString('o')`],{encoding:"utf8"});if(result2.status!==0||typeof result2.stdout!=="string"){return void 0}const parsed2=Date.parse(result2.stdout.trim());return Number.isFinite(parsed2)?parsed2:void 0}const result=spawnSync("ps",["-o","lstart=","-p",String(pid)],{encoding:"utf8",env:{...process.env,LC_ALL:"C",LANG:"C"}});if(result.status!==0||typeof result.stdout!=="string"){return void 0}const parsed=Date.parse(result.stdout.trim());return Number.isFinite(parsed)?parsed:void 0}__name(processStartTime,"processStartTime");function processStartMatchesRecord(recordStartedAt,processStartedAt){if(processStartedAt===void 0)return true;const recorded=Date.parse(recordStartedAt);if(!Number.isFinite(recorded))return true;return processStartedAt>=recorded-PROCESS_START_LEAD_MS&&processStartedAt<=recorded+PROCESS_START_TOLERANCE_MS}__name(processStartMatchesRecord,"processStartMatchesRecord");function processCommand(pid){if(process.platform==="win32"){const result2=spawnSync("powershell.exe",["-NoProfile","-NonInteractive","-Command",`(Get-CimInstance Win32_Process -Filter "ProcessId=${pid}").CommandLine`],{encoding:"utf8"});if(result2.status!==0||typeof result2.stdout!=="string"){return void 0}return result2.stdout.trim()||void 0}const result=spawnSync("ps",["-o","command=","-p",String(pid)],{encoding:"utf8",env:{...process.env,LC_ALL:"C",LANG:"C"}});if(result.status!==0||typeof result.stdout!=="string"){return void 0}return result.stdout.trim()||void 0}__name(processCommand,"processCommand");function processParentTable(){const result=process.platform==="win32"?spawnSync("powershell.exe",["-NoProfile","-NonInteractive","-Command",'Get-CimInstance Win32_Process | ForEach-Object { "$($_.ProcessId) $($_.ParentProcessId)" }'],{encoding:"utf8",maxBuffer:8*1024*1024}):spawnSync("ps",["-A","-o","pid=,ppid="],{encoding:"utf8",maxBuffer:8*1024*1024,env:{...process.env,LC_ALL:"C",LANG:"C"}});if(result.status!==0||typeof result.stdout!=="string"){return void 0}const parents=new Map;for(const line of result.stdout.split(/\r?\n/)){const[pid,parent]=line.trim().split(/\s+/).map(Number);if(Number.isInteger(pid)&&Number.isInteger(parent)){parents.set(pid,parent)}}return parents}__name(processParentTable,"processParentTable");function isProcessAncestor(ancestor,pid,parents){const seen=new Set;let current=parents.get(pid);while(current!==void 0&¤t>0&&!seen.has(current)){if(current===ancestor)return true;seen.add(current);current=parents.get(current)}return false}__name(isProcessAncestor,"isProcessAncestor");function terminateTree(pid,force){if(process.platform==="win32"){const taskkill=`${process.env["SystemRoot"]??"C:\\Windows"}\\System32\\taskkill.exe`;spawnSync(taskkill,["/pid",String(pid),"/T","/F"],{stdio:"ignore"});return}process.kill(pid,force?"SIGKILL":"SIGTERM")}__name(terminateTree,"terminateTree");function formatDaemonAge(ms){const seconds=Math.max(0,Math.floor(ms/1e3));if(seconds<60)return`${seconds}s`;const minutes=Math.floor(seconds/60);if(minutes<60)return`${minutes}m`;const hours=Math.floor(minutes/60);if(hours<24)return`${hours}h`;return`${Math.floor(hours/24)}d`}__name(formatDaemonAge,"formatDaemonAge");function sanitize(value){return sanitizeTerminalText2(value).replace(/[\t\n]/g,"")}__name(sanitize,"sanitize");function pidResolvableHere(record,currentNamespace){if(record.pidNamespace===void 0)return true;if(currentNamespace===void 0)return false;return record.pidNamespace===currentNamespace}__name(pidResolvableHere,"pidResolvableHere");function listenerIdentityVerified(record,currentNamespace=currentPidNamespace(),alive=isProcessAlive,startedAt=processStartTime){if(!pidResolvableHere(record,currentNamespace))return false;if(!alive(record.pid))return false;if(!Number.isFinite(Date.parse(record.startedAt)))return false;const started=startedAt(record.pid);if(started===void 0)return false;return processStartMatchesRecord(record.startedAt,started)}__name(listenerIdentityVerified,"listenerIdentityVerified");async function probeHealth(record){const pidResolvable=pidResolvableHere(record,currentPidNamespace());try{await fetch(new URL("/health",record.url),{signal:AbortSignal.timeout(HEALTH_TIMEOUT_MS),redirect:"manual"});return pidResolvable&&!isProcessAlive(record.pid)?"stale":"running"}catch{return pidResolvable&&!isProcessAlive(record.pid)?"stale":"unreachable"}}__name(probeHealth,"probeHealth");function summarizeDaemonStatus(value){if(value===null||typeof value!=="object")return void 0;const response=value;if(response["v"]!==1||typeof response["status"]!=="string"){return void 0}const daemon=response["daemon"]!==null&&typeof response["daemon"]==="object"?response["daemon"]:void 0;const runtime=response["runtime"]!==null&&typeof response["runtime"]==="object"?response["runtime"]:void 0;const rawSessions=runtime?.["sessions"];const sessions=rawSessions!==null&&typeof rawSessions==="object"?rawSessions:void 0;const issueRecords=Array.isArray(response["issues"])?response["issues"].filter(issue=>issue!==null&&typeof issue==="object"):[];const issues=issueRecords.map(issue=>issue["message"]).filter(message=>typeof message==="string");const starting=issueRecords.some(issue=>issue["code"]==="daemon_runtime_starting");const version=daemon?.["qwenCodeVersion"];const uptimeMs=daemon?.["uptimeMs"];const active=sessions?.["active"];const admissionInFlight=sessions?.["admissionInFlight"];return{status:response["status"],...typeof version==="string"?{version}:{},...typeof uptimeMs==="number"?{uptimeMs}:{},...typeof active==="number"?{sessions:{active,...typeof admissionInFlight==="number"?{admissionInFlight}:{}}}:{},issues,...starting?{starting:true}:{}}}__name(summarizeDaemonStatus,"summarizeDaemonStatus");function isDaemonReady(detail){return typeof detail!=="string"&&detail.status!=="error"&&detail.starting!==true}__name(isDaemonReady,"isDaemonReady");async function fetchDaemonDetail(record,allowToken,tokenOverride){const token=record.auth==="bearer"?tokenOverride?.trim()||process.env["QWEN_SERVER_TOKEN"]?.trim():void 0;if(token&&!allowToken){return"listener identity unverified; not sending QWEN_SERVER_TOKEN"}try{const response=await fetch(new URL("/daemon/status?detail=summary",record.url),{signal:AbortSignal.timeout(DETAIL_TIMEOUT_MS),redirect:"manual",...token?{headers:{Authorization:`Bearer ${token}`}}:{}});if(response.status===401||response.status===403){return"auth required; set QWEN_SERVER_TOKEN"}if(!response.ok){return`status endpoint returned HTTP ${response.status}`}const summary=summarizeDaemonStatus(await response.json());return summary??"invalid status response"}catch(error){return error instanceof Error?error.message:String(error)}}__name(fetchDaemonDetail,"fetchDaemonDetail");async function waitForDaemonReady(record,token,timeoutMs=START_READY_TIMEOUT_MS,pollMs=START_READY_POLL_MS,fetchDetail=(candidate,allowToken)=>fetchDaemonDetail(candidate,allowToken,token),identityVerified=()=>listenerIdentityVerified(record)){const deadline=Date.now()+timeoutMs;let result="daemon status unavailable";while(true){if(!identityVerified()){return"daemon process exited before readiness"}result=await fetchDetail(record,true);if(isDaemonReady(result)){return identityVerified()?result:"daemon process exited before readiness"}if(Date.now()>=deadline)return result;await new Promise(resolve6=>setTimeout(resolve6,pollMs))}}__name(waitForDaemonReady,"waitForDaemonReady");function formatDaemonDetail(record,detail){if(typeof detail==="string"){return`qwen daemon: port ${record.port}: detail unavailable: ${sanitize(detail)}`}const uptime=detail.uptimeMs===void 0?"unknown":formatDaemonAge(detail.uptimeMs);const sessions=detail.sessions===void 0?"":` sessions=${detail.sessions.active}`+(detail.sessions.admissionInFlight===void 0?"":`(+${detail.sessions.admissionInFlight} admitting)`);return`qwen daemon: port ${record.port}: status=${sanitize(detail.status)} version=${sanitize(detail.version??"unknown")} uptime=${uptime}${sessions} issues=${detail.issues.length}`}__name(formatDaemonDetail,"formatDaemonDetail");function selectDaemonEntries(entries,options){if(options.port!==void 0){return entries.filter(entry=>entry.record.port===options.port)}if(options.all===true){return[...entries]}if(entries.length===1){return[entries[0]]}return[]}__name(selectDaemonEntries,"selectDaemonEntries");function selectionError(entries,options){if(options.port!==void 0){return entries.some(entry=>entry.record.port===options.port)?void 0:`No daemon is registered on port ${options.port}.`}if(options.all===true)return void 0;if(entries.length>1){return`${entries.length} daemons are registered; pass --port <port> or --all to choose one.`}return void 0}__name(selectionError,"selectionError");function tailLines(text,count){const lines=text.split(/\r?\n/);if(lines.length>0&&lines[lines.length-1]==="")lines.pop();return lines.slice(-count)}__name(tailLines,"tailLines");function fallbackLogPath(){return path2.join(path2.dirname(resolveDaemonDiscoveryDir()),"debug","daemon","daemon.log")}__name(fallbackLogPath,"fallbackLogPath");function logPathFor(record){return record.logPath&&record.logPath.length>0?record.logPath:fallbackLogPath()}__name(logPathFor,"logPathFor");async function waitForExit2(pid,timeoutMs){const deadline=Date.now()+timeoutMs;while(Date.now()<deadline){if(!isProcessAlive(pid))return true;await new Promise(resolve6=>setTimeout(resolve6,STOP_POLL_MS))}return!isProcessAlive(pid)}__name(waitForExit2,"waitForExit");function resolveCliEntry(){const configured=process.env["QWEN_CLI_ENTRY"];if(configured)return path2.resolve(configured);const entry=process.argv[1];return entry?path2.resolve(entry):void 0}__name(resolveCliEntry,"resolveCliEntry");function isJavaScriptEntry(entry){return/\.(?:c|m)?js$|\.tsx?$/i.test(entry)}__name(isJavaScriptEntry,"isJavaScriptEntry");function buildDaemonStartArgs(options){const childArgs=["serve","--port",String(options.port),"--hostname",options.hostname,"--no-token-qr"];if(!options.web)childArgs.push("--no-web");if(options.requireAuth)childArgs.push("--require-auth");for(const workspace of options.workspaces){childArgs.push("--workspace",workspace)}return isJavaScriptEntry(options.entry)?{command:process.execPath,args:[...process.execArgv,options.entry,...childArgs]}:{command:options.entry,args:childArgs}}__name(buildDaemonStartArgs,"buildDaemonStartArgs");function formatDaemonStartSummary(record){return[`qwen daemon: started pid ${record.pid} on ${record.url}`,`qwen daemon: workspace ${record.primaryWorkspace}`,`qwen daemon: logs ${logPathFor(record)}`,`qwen daemon: stop with \`qwen daemon stop --port ${record.port}\``].join("\n")}__name(formatDaemonStartSummary,"formatDaemonStartSummary");var START_ENV_DROP=["QWEN_CODE_CLI","QWEN_CODE_NO_RELAUNCH","QWEN_CODE_SESSION_ID","QWEN_CODE_PROMPT_ID","QWEN_CODE_PROJECT_DIR","QWEN_CODE_SERVE","QWEN_CODE_AGENT_ID","QWEN_DAEMON_TOKEN","QWEN_CODE_MESSAGING_TOKEN","QWEN_CODE_MESSAGING_SOCKET"];var START_LOG_MAX_AGE_MS=24*60*6e4;function resolveStartEnvPath(value,cwd,pathApi=path2,fullyQualified=isFullyQualifiedPath){if(value===void 0)return void 0;if(value==="")return"";if(value==="~"||value.startsWith("~/")||value.startsWith("~\\")){return value}return fullyQualified(value)?value:pathApi.resolve(cwd,value)}__name(resolveStartEnvPath,"resolveStartEnvPath");function buildDaemonStartEnv(env,token,cwd=process.cwd()){const child={...env};for(const key of START_ENV_DROP){delete child[key]}for(const key of Object.keys(child)){if(key.startsWith("QWEN_CODE_PRIVATE_")){delete child[key]}}for(const key of["QWEN_RUNTIME_DIR","QWEN_HOME"]){const resolved=resolveStartEnvPath(child[key],cwd);if(resolved===void 0){delete child[key]}else{child[key]=resolved}}if(token)child["QWEN_SERVER_TOKEN"]=token;return child}__name(buildDaemonStartEnv,"buildDaemonStartEnv");function sweepStaleStartLogs(dir,now=Date.now()){try{for(const name of fs.readdirSync(dir)){if(!name.startsWith("start-")||!name.endsWith(".log"))continue;const file=path2.join(dir,name);try{if(now-fs.statSync(file).mtimeMs>START_LOG_MAX_AGE_MS){fs.rmSync(file,{force:true})}}catch{}}}catch{}}__name(sweepStaleStartLogs,"sweepStaleStartLogs");async function canonicalizeStartWorkspaces(rawWorkspaces){const{validateAndCanonicalizeWorkspaceInput}=await import("./run-qwen-serve-SAHEC44O.js");return rawWorkspaces.map(workspace=>validateAndCanonicalizeWorkspaceInput(path2.resolve(workspace)))}__name(canonicalizeStartWorkspaces,"canonicalizeStartWorkspaces");async function printStartLogTail(file){try{const text=await fsp.readFile(file,"utf8");for(const line of tailLines(text,40)){writeStderrLine(line)}}catch{}}__name(printStartLogTail,"printStartLogTail");async function handleStart(argv){ignoreBrokenPipe();const entry=resolveCliEntry();if(!entry){writeStderrLine("qwen daemon: cannot determine the CLI entry; run `qwen serve` directly.");process.exitCode=1;return}const rawWorkspaces=Array.isArray(argv.workspace)?argv.workspace:argv.workspace?[argv.workspace]:[process.cwd()];let workspaces;try{workspaces=await canonicalizeStartWorkspaces(rawWorkspaces)}catch(error){writeStderrLine(`qwen daemon: ${error instanceof Error?error.message:String(error)}`);process.exitCode=1;return}const hostname=argv.hostname;const port=argv.port??4170;const token=argv.token?.trim()||process.env["QWEN_SERVER_TOKEN"]?.trim()||void 0;if(argv["require-auth"]&&!token){writeStderrLine("qwen daemon: --require-auth requires --token or QWEN_SERVER_TOKEN.");process.exitCode=1;return}if(argv["save-token"]&&!token){writeStderrLine("qwen daemon: --save-token requires --token or QWEN_SERVER_TOKEN.");process.exitCode=1;return}if(!isLoopbackBind(hostname)&&!token){writeStderrLine("qwen daemon: a non-loopback bind requires QWEN_SERVER_TOKEN; run `qwen serve` directly if you want an ephemeral token.");process.exitCode=1;return}if(argv.token){writeStderrLine("qwen daemon: --token is visible in this shell process list; prefer QWEN_SERVER_TOKEN.")}const primary=workspaces[0];const existing=readDaemonDiscoveries().entries.find(candidate=>candidate.record.primaryWorkspace===primary&&isProcessAlive(candidate.record.pid)&&processStartMatchesRecord(candidate.record.startedAt,processStartTime(candidate.record.pid)));if(existing&&argv.port===void 0){writeStderrLine(`qwen daemon: a daemon is already running for ${primary} on port ${existing.record.port}; pass --port to start another.`);process.exitCode=1;return}const logDir=resolveDaemonDiscoveryDir();fs.mkdirSync(logDir,{recursive:true,mode:448});sweepStaleStartLogs(logDir);const startLog=path2.join(logDir,`start-${process.pid}-${Date.now()}.log`);const logFd=fs.openSync(startLog,"a",384);const{command,args}=buildDaemonStartArgs({entry,port,hostname,workspaces,web:argv.web,requireAuth:argv["require-auth"]});const env=buildDaemonStartEnv(process.env,token);let child;try{child=spawn(command,args,{cwd:primary,env,detached:true,stdio:["ignore",logFd,logFd],windowsHide:true})}catch(error){fs.closeSync(logFd);writeStderrLine(`qwen daemon: could not spawn the daemon: ${error instanceof Error?error.message:String(error)}`);process.exitCode=1;return}fs.closeSync(logFd);if(child.pid===void 0){writeStderrLine("qwen daemon: the daemon process did not start.");process.exitCode=1;return}child.unref();let spawnError;child.once("error",error=>{spawnError=error});const deadline=Date.now()+START_TIMEOUT_MS;let record;while(Date.now()<deadline){if(spawnError)break;record=readDaemonDiscoveries().entries.find(candidate=>candidate.record.pid===child.pid)?.record;if(record)break;if(child.exitCode!==null||child.signalCode!==null)break;await new Promise(resolve6=>setTimeout(resolve6,START_POLL_MS))}if(record){removeStaleDaemonTokens(record.port,record.pid);if(argv["save-token"]){try{writeDaemonToken(record.port,record.pid,token)}catch(error){writeStderrLine(`qwen daemon: could not persist the token: ${error instanceof Error?error.message:String(error)}`);process.exitCode=1;return}}const ready=argv.wait===true?await waitForDaemonReady(record,token):void 0;const readyFailed=ready!==void 0&&!isDaemonReady(ready);if(argv.json===true){writeStdoutLine(JSON.stringify({pid:record.pid,port:record.port,url:record.url,workspaces:record.workspaces,primaryWorkspace:record.primaryWorkspace,logPath:logPathFor(record)}))}else{writeStdoutLine(formatDaemonStartSummary(record))}if(readyFailed){writeStderrLine(`qwen daemon: daemon pid ${record.pid} is running but did not report ready within ${START_READY_TIMEOUT_MS/1e3}s.`);if(typeof ready==="string"){writeStderrLine(`qwen daemon: ${ready}`)}writeStderrLine(`qwen daemon: startup log: ${startLog}`);process.exitCode=1;return}try{fs.rmSync(startLog,{force:true})}catch{}return}writeStderrLine(`qwen daemon: daemon pid ${child.pid} did not publish a discovery record within ${START_TIMEOUT_MS/1e3}s. The detached child may still start; run \`qwen daemon status\` to check.`);if(spawnError){writeStderrLine(`qwen daemon: spawn failed: ${spawnError.message}`)}writeStderrLine(`qwen daemon: startup log: ${startLog}`);await printStartLogTail(startLog);process.exitCode=1}__name(handleStart,"handleStart");async function handleStatus(argv){ignoreBrokenPipe();const{entries,invalid}=readDaemonDiscoveries();let rows=[];for(const entry of entries){rows.push({entry,health:await probeHealth(entry.record)})}if(argv.prune===true){const kept=[];for(const row of rows){if(row.health!=="stale"){kept.push(row);continue}if(!removeDaemonDiscovery(row.entry.record.port,{expectedPid:row.entry.record.pid})){kept.push(row)}else{removeDaemonToken(row.entry.record.port,row.entry.record.pid)}}rows=kept}for(const bad of invalid){writeStderrLine(`qwen daemon: ignoring ${sanitize(bad.path)}: ${sanitize(bad.reason)}`)}const details=new Map;if(argv.detail===true){await Promise.all(rows.filter(row=>row.health==="running").map(async row=>{const record=row.entry.record;const allowToken=record.auth==="bearer"&&listenerIdentityVerified(record);details.set(record.port,await fetchDaemonDetail(record,allowToken))}))}if(argv.json===true){for(const row of rows){writeStdoutLine(JSON.stringify({status:row.health,pid:row.entry.record.pid,port:row.entry.record.port,url:row.entry.record.url,workspaces:row.entry.record.workspaces,primaryWorkspace:row.entry.record.primaryWorkspace,auth:row.entry.record.auth,startedAt:row.entry.record.startedAt,ageMs:age(row.entry.record.startedAt),...argv.detail===true?{detail:details.get(row.entry.record.port)??null}:{},logPath:logPathFor(row.entry.record)}))}return}if(rows.length===0){writeStdoutLine("No local qwen serve daemon is registered. Start one with `qwen serve`.");return}writeStdoutLine("STATUS PID PORT AGE WORKSPACES / URL");for(const row of rows){const{record}=row.entry;const workspaces=record.workspaces.map(workspace=>sanitize(workspace)).join(", ");writeStdoutLine(`${row.health.padEnd(12)}${String(record.pid).padEnd(10)}${String(record.port).padEnd(7)}${formatDaemonAge(age(record.startedAt)).padEnd(6)}${workspaces} ${sanitize(record.url)}`)}if(argv.detail===true){for(const row of rows){const detail=details.get(row.entry.record.port);if(detail!==void 0){writeStdoutLine(formatDaemonDetail(row.entry.record,detail))}else{writeStdoutLine(`qwen daemon: port ${row.entry.record.port}: detail unavailable (${row.health})`)}}}writeStdoutLine("");writeStdoutLine("Use `qwen daemon logs --port <port> --follow` to tail one.")}__name(handleStatus,"handleStatus");async function printTail(file,count){let text;try{text=await fsp.readFile(file,"utf8")}catch(error){if(error.code==="ENOENT"){writeStderrLine(`qwen daemon: log file not found: ${file}`);return 0}throw error}for(const line of tailLines(text,count)){writeStdoutLine(line)}try{return fs.statSync(file).size}catch{return Buffer.byteLength(text,"utf8")}}__name(printTail,"printTail");async function followFile(file,startOffset){let offset=startOffset;let handle;let inode;const openCurrent=__name(async()=>{try{const next=await fsp.open(file,"r");const stat2=await next.stat();handle=next;inode=stat2.ino}catch{handle=void 0;inode=void 0}},"openCurrent");const drain=__name(async from=>{if(!handle)return from;const stat2=await handle.stat();if(stat2.size<=from)return stat2.size;const buffer=Buffer.alloc(stat2.size-from);await handle.read(buffer,0,buffer.length,from);for(const line of buffer.toString("utf8").split(/\r?\n/)){if(line.length>0)writeStdoutLine(line)}return stat2.size},"drain");await openCurrent();writeStderrLine(`qwen daemon: following ${file} (Ctrl+C to stop)`);let stopped=false;const stop=__name(()=>{stopped=true;process.off("SIGINT",stop);process.off("SIGTERM",stop)},"stop");process.on("SIGINT",stop);process.on("SIGTERM",stop);try{while(!stopped){try{const stat2=await fsp.stat(file);if(!handle){await openCurrent();offset=0}else if(inode!==void 0&&stat2.ino!==inode){offset=await drain(offset);await handle.close();handle=void 0;await openCurrent();offset=0}else{if(stat2.size<offset)offset=0;offset=await drain(offset)}}catch(error){if(error.code==="EPIPE")break}if(process.stdout.destroyed||!process.stdout.writable)break;await new Promise(resolve6=>setTimeout(resolve6,FOLLOW_POLL_MS))}}finally{if(handle)await handle.close()}}__name(followFile,"followFile");async function handleLogs(argv){ignoreBrokenPipe();const{entries}=readDaemonDiscoveries();const error=selectionError(entries,argv);if(error){writeStderrLine(`qwen daemon: ${error}`);process.exitCode=1;return}const selected=selectDaemonEntries(entries,argv);const entry=selected[0];if(!entry){writeStderrLine("qwen daemon: no daemon is registered. Start one with `qwen serve`.");process.exitCode=1;return}const file=logPathFor(entry.record);const count=argv.lines??50;if(!Number.isInteger(count)||count<=0){writeStderrLine("qwen daemon: --lines must be a positive integer.");process.exitCode=1;return}const offset=await printTail(file,count);if(argv.follow===true){await followFile(file,offset)}}__name(handleLogs,"handleLogs");async function handleStop(argv){ignoreBrokenPipe();const{entries}=readDaemonDiscoveries();const error=selectionError(entries,argv);if(error){writeStderrLine(`qwen daemon: ${error}`);process.exitCode=1;return}const selected=selectDaemonEntries(entries,argv);if(selected.length===0){writeStderrLine("qwen daemon: no daemon is registered. Start one with `qwen serve`.");process.exitCode=1;return}let failed=false;for(const entry of selected){const{record}=entry;const health=await probeHealth(record);if(health==="stale"){if(removeDaemonDiscovery(record.port,{expectedPid:record.pid})){removeDaemonToken(record.port,record.pid)}writeStdoutLine(`qwen daemon: removed stale record for port ${record.port} (pid ${record.pid} is gone).`);continue}if(record.pid===process.pid){writeStderrLine("qwen daemon: refusing to stop the current process.");failed=true;continue}if(!pidResolvableHere(record,currentPidNamespace())){writeStderrLine(`qwen daemon: refusing to signal pid ${record.pid}: the record was written in PID namespace ${record.pidNamespace}, which this process cannot address.`);failed=true;continue}const processStarted=processStartTime(record.pid);if(processStarted===void 0){writeStderrLine(`qwen daemon: refusing to signal pid ${record.pid}: its process start time could not be read.`);failed=true;continue}if(!processStartMatchesRecord(record.startedAt,processStarted)){writeStderrLine(`qwen daemon: refusing to signal pid ${record.pid}: its start time does not match the daemon recorded at ${record.startedAt}.`);failed=true;continue}const command=processCommand(record.pid);if(command===void 0||!command.includes("serve")||!/(qwen|cli\.js)/.test(command)){writeStderrLine(`qwen daemon: refusing to signal pid ${record.pid}: its command line is not the recorded daemon.`);failed=true;continue}if(process.platform==="win32"&&argv.force!==true){writeStderrLine("qwen daemon: Windows stop is a hard kill; pass --force to confirm (shutdown handlers do not run).");failed=true;continue}try{terminateTree(record.pid,false)}catch(killError){writeStderrLine(`qwen daemon: could not signal pid ${record.pid}: ${killError instanceof Error?killError.message:String(killError)}`);failed=true;continue}const exited=await waitForExit2(record.pid,STOP_TIMEOUT_MS);if(exited){if(removeDaemonDiscovery(record.port,{expectedPid:record.pid})){removeDaemonToken(record.port,record.pid)}writeStdoutLine(`qwen daemon: ${process.platform==="win32"?"hard-killed":"stopped"} port ${record.port} (pid ${record.pid}).`);continue}if(argv.force===true){try{terminateTree(record.pid,true)}catch{}const forced=await waitForExit2(record.pid,STOP_TIMEOUT_MS);if(forced){if(removeDaemonDiscovery(record.port,{expectedPid:record.pid})){removeDaemonToken(record.port,record.pid)}writeStdoutLine(`qwen daemon: force-stopped port ${record.port} (pid ${record.pid}).`);continue}}writeStderrLine(`qwen daemon: port ${record.port} (pid ${record.pid}) did not exit within ${STOP_TIMEOUT_MS/1e3}s; retry with --force if it is safe to SIGKILL it.`);failed=true}if(failed)process.exitCode=1}__name(handleStop,"handleStop");async function handleToken(argv){ignoreBrokenPipe();const{entries}=readDaemonDiscoveries();const error=selectionError(entries,{port:argv.port});if(error){writeStderrLine(`qwen daemon: ${error}`);process.exitCode=1;return}const selected=selectDaemonEntries(entries,{port:argv.port});if(selected.length!==1){writeStderrLine("qwen daemon: token needs exactly one registered daemon; pass --port.");process.exitCode=1;return}const record=selected[0].record;if(argv.remove===true){const removed=removeDaemonToken(record.port,record.pid);if(!removed){writeStderrLine(`qwen daemon: no persisted token for port ${record.port}.`);process.exitCode=1;return}writeStdoutLine(argv.json===true?JSON.stringify({port:record.port,removed:true}):`qwen daemon: removed persisted token for port ${record.port}.`);return}const token=readDaemonToken(record.port,record.pid);if(!token){writeStderrLine(`qwen daemon: no persisted token for port ${record.port}; start with --save-token or use QWEN_SERVER_TOKEN.`);process.exitCode=1;return}writeStdoutLine(argv.json===true?JSON.stringify({port:record.port,token}):`qwen daemon: token for port ${record.port}: ${token}`)}__name(handleToken,"handleToken");function buildDaemonRestartPlan(record,options,entry,execArgv=process.execArgv,baseEnv=process.env){let protocol="";try{protocol=new URL(record.url).protocol}catch{}if(protocol==="https:"){return{error:"restarting an HTTPS daemon is not supported; restart it with qwen serve and the original TLS settings."}}const workspaces=record.startupWorkspaces?.length?record.startupWorkspaces:record.workspaces.length<=1?[record.primaryWorkspace]:void 0;if(!workspaces){return{error:`the daemon on port ${record.port} was started by an older qwen that did not record its startup workspaces; stop it and start it again with \`qwen daemon start --port ${record.port} --workspace <path>\`.`}}const notices=[];const web=options.web??record.web;if(web===void 0){notices.push("the record does not say whether the Web Shell was enabled; restarting with it (pass --no-web for API-only).")}const requireAuth=options.requireAuth??record.requireAuth??record.auth==="bearer";if(options.requireAuth===void 0&&record.requireAuth===void 0&&record.auth==="bearer"){notices.push("the record does not say whether --require-auth was set; restarting with it (pass --no-require-auth to keep /health open on loopback).")}const explicitToken=options.token?.trim()||void 0;const token=explicitToken??(baseEnv["QWEN_SERVER_TOKEN"]?.trim()||void 0);const bearer=record.auth==="bearer"||requireAuth||explicitToken!==void 0;if(bearer&&!token){return{error:record.auth!=="bearer"?"--require-auth requires --token or QWEN_SERVER_TOKEN.":record.tokenGenerated===true?`the daemon on port ${record.port} uses a token generated at startup, which is not recorded; pass that token with --token or QWEN_SERVER_TOKEN, or stop the daemon and run \`qwen serve\` again.`:"restarting a bearer daemon requires --token or QWEN_SERVER_TOKEN; a token in a workspace .env or settings file is not read here."}}if(options.token){notices.push("--token is visible in this shell process list; prefer QWEN_SERVER_TOKEN.")}const javaScriptEntry=isJavaScriptEntry(entry);const command=javaScriptEntry?process.execPath:entry;const prefix=javaScriptEntry?[...execArgv,entry]:[];const env={...baseEnv};if(bearer){env["QWEN_SERVER_TOKEN"]=token}else{delete env["QWEN_SERVER_TOKEN"]}const stopArgs=[...prefix,"daemon","stop","--port",String(record.port)];if(options.force)stopArgs.push("--force");const startArgs=[...prefix,"daemon","start","--port",String(record.port),"--hostname",record.hostname,"--wait"];for(const workspace of workspaces){startArgs.push("--workspace",workspace)}if(web===false)startArgs.push("--no-web");if(requireAuth)startArgs.push("--require-auth");return{notices,command,stopArgs,startArgs,workspaces,env}}__name(buildDaemonRestartPlan,"buildDaemonRestartPlan");function selectRestartTarget(entries,port){if(port!==void 0){const entry=entries.find(candidate=>candidate.record.port===port);return entry?{entry}:{error:`No daemon is registered on port ${port}.`}}if(entries.length===0){return{error:"no daemon is registered. Start one with `qwen serve`."}}if(entries.length>1){return{error:`${entries.length} daemons are registered; pass --port <port> to choose one.`}}return{entry:entries[0]}}__name(selectRestartTarget,"selectRestartTarget");async function daemonRejectsToken(record,token,allowToken=listenerIdentityVerified(record)){if(!allowToken)return false;try{const response=await fetch(new URL("/daemon/status?detail=summary",record.url),{signal:AbortSignal.timeout(DETAIL_TIMEOUT_MS),redirect:"manual",headers:{Authorization:`Bearer ${token}`}});return response.status===401}catch{return false}}__name(daemonRejectsToken,"daemonRejectsToken");var defaultRestartDeps={run:__name((command,args,env)=>spawnSync(command,[...args],{stdio:"inherit",env}),"run"),entries:__name(()=>readDaemonDiscoveries().entries,"entries"),hostedBy:__name(pid=>{const parents=processParentTable();return parents!==void 0&&isProcessAncestor(pid,process.pid,parents)},"hostedBy"),validateWorkspaces:canonicalizeStartWorkspaces,rejectsToken:__name((record,token)=>daemonRejectsToken(record,token),"rejectsToken")};async function runDaemonRestart(record,plan,deps=defaultRestartDeps){if(plan.error){writeStderrLine(`qwen daemon: ${plan.error}`);return 1}for(const notice of plan.notices??[]){writeStderrLine(`qwen daemon: ${notice}`)}if(pidResolvableHere(record,currentPidNamespace())&&deps.hostedBy(record.pid)){writeStderrLine(`qwen daemon: refusing to restart port ${record.port} from a process that daemon hosts, such as its Web Shell terminal; stopping it would end this command before the new daemon starts. Run restart from a shell outside the daemon.`);return 1}try{await deps.validateWorkspaces(plan.workspaces)}catch(error){writeStderrLine(`qwen daemon: cannot restart: ${error instanceof Error?error.message:String(error)}`);return 1}const token=plan.env?.["QWEN_SERVER_TOKEN"];if(record.auth==="bearer"&&token&&await deps.rejectsToken(record,token)){writeStderrLine(`qwen daemon: the daemon on port ${record.port} rejected the supplied token. Restart keeps the daemon credential; pass its current token, or stop it and start it with the new one.`);return 1}const persistedToken=readDaemonToken(record.port,record.pid);const stopped=deps.run(plan.command,plan.stopArgs,plan.env);if(stopped.error){writeStderrLine(`qwen daemon: could not run daemon stop: ${stopped.error.message}`);return 1}if(stopped.status!==0){if(deps.entries().some(entry=>entry.record.port===record.port)){return 1}writeStdoutLine(`qwen daemon: the daemon on port ${record.port} already exited; starting it again.`)}const started=deps.run(plan.command,plan.startArgs,plan.env);if(started.error){writeStderrLine(`qwen daemon: could not run daemon start: ${started.error.message}`);writeStderrLine(`qwen daemon: the daemon on port ${record.port} is stopped.`);return 1}if(started.status!==0)return 1;const restarted=deps.entries().find(entry=>entry.record.port===record.port&&(entry.record.pid!==record.pid||entry.record.startedAt!==record.startedAt));if(!restarted){writeStderrLine(`qwen daemon: the restarted daemon is not on port ${record.port}; the port may be in use. Run \`qwen daemon status\` to find it.`);return 1}if(persistedToken!==void 0){const tokenToPersist=plan.env?.["QWEN_SERVER_TOKEN"]??persistedToken;try{writeDaemonToken(record.port,restarted.record.pid,tokenToPersist)}catch(error){writeStderrLine(`qwen daemon: could not persist the token for the restarted daemon: ${error instanceof Error?error.message:String(error)}`);return 1}}return 0}__name(runDaemonRestart,"runDaemonRestart");async function handleRestart(argv){ignoreBrokenPipe();const target=selectRestartTarget(readDaemonDiscoveries().entries,argv.port);if(!target.entry){writeStderrLine(`qwen daemon: ${target.error}`);process.exitCode=1;return}const entry=resolveCliEntry();if(!entry){writeStderrLine("qwen daemon: cannot determine the CLI entry; restart requires the qwen CLI.");process.exitCode=1;return}const{record}=target.entry;const plan=buildDaemonRestartPlan(record,{token:argv.token,web:argv.web,requireAuth:argv["require-auth"],force:argv.force},entry);if(await runDaemonRestart(record,plan)!==0)process.exitCode=1}__name(handleRestart,"handleRestart");var startCommand2={command:"start",describe:"Start a local qwen serve daemon in the background",builder:__name(yargs=>yargs.option("port",{type:"number",describe:"TCP port (default 4170; 0 picks an ephemeral port)"}).option("hostname",{type:"string",default:"127.0.0.1",describe:"Interface to bind"}).option("workspace",{type:"string",array:true,requiresArg:true,describe:"Workspace path; repeat for multiple; defaults to the current directory"}).option("web",{type:"boolean",default:true,describe:"Serve the Web Shell; use --no-web for API-only"}).option("require-auth",{type:"boolean",default:false,describe:"Require the bearer token even on loopback"}).option("token",{type:"string",describe:"Bearer token for the child; prefer QWEN_SERVER_TOKEN"}).option("save-token",{type:"boolean",default:false,describe:"Persist the bearer token in a 0600 sidecar for daemon token"}).option("wait",{type:"boolean",default:false,describe:"Wait until the daemon runtime is serving before returning"}).option("json",{type:"boolean",default:false,describe:"Output a JSON summary"}),"builder"),handler:__name(async argv=>{await handleStart(argv)},"handler")};var statusCommand2={command:"status",describe:"List local qwen serve daemons and their health",builder:__name(yargs=>yargs.option("json",{type:"boolean",default:false,describe:"Output one JSON object per daemon"}).option("prune",{type:"boolean",default:false,describe:"Remove records whose process is gone"}).option("detail",{type:"boolean",default:false,describe:"Fetch /daemon/status for version, uptime, active sessions, and issue count"}),"builder"),handler:__name(async argv=>{await handleStatus(argv)},"handler")};var logsCommand={command:"logs",describe:"Show or follow a local daemon log file",builder:__name(yargs=>yargs.option("port",{type:"number",describe:"Daemon port; required when more than one is registered"}).option("follow",{alias:"f",type:"boolean",default:false,describe:"Keep printing new lines"}).option("lines",{alias:"n",type:"number",default:50,describe:"Number of trailing lines to print first"}),"builder"),handler:__name(async argv=>{await handleLogs(argv)},"handler")};var stopCommand2={command:"stop",describe:"Stop a local qwen serve daemon",builder:__name(yargs=>yargs.option("port",{type:"number",describe:"Daemon port; required when more than one is registered"}).option("all",{type:"boolean",default:false,describe:"Stop every registered daemon"}).option("force",{type:"boolean",default:false,describe:"SIGKILL a daemon that does not exit after SIGTERM"}),"builder"),handler:__name(async argv=>{await handleStop(argv)},"handler")};var restartCommand={command:"restart",describe:"Restart a local qwen serve daemon on its recorded port and workspaces",builder:__name(yargs=>yargs.option("port",{type:"number",describe:"Daemon port; required when more than one is registered"}).option("token",{type:"string",describe:"Bearer token for the restarted daemon; a running bearer daemon must accept it. Prefer QWEN_SERVER_TOKEN"}).option("web",{type:"boolean",describe:"Serve the Web Shell; defaults to the recorded mode, use --no-web for API-only"}).option("require-auth",{type:"boolean",describe:"Require the bearer token even on loopback; defaults to the recorded setting"}).option("force",{type:"boolean",default:false,describe:"Pass --force to daemon stop: confirm the Windows hard kill, or SIGKILL a POSIX daemon that does not exit after SIGTERM"}),"builder"),handler:__name(async argv=>{await handleRestart(argv)},"handler")};var tokenCommand={command:"token",describe:"Show or remove a persisted daemon bearer token",builder:__name(yargs=>yargs.option("port",{type:"number",describe:"Daemon port; required when more than one is registered"}).option("json",{type:"boolean",default:false,describe:"Output a JSON object"}).option("remove",{type:"boolean",default:false,describe:"Remove the persisted token"}),"builder"),handler:__name(async argv=>{await handleToken(argv)},"handler")};var daemonCommand={command:"daemon",describe:"Inspect and control local qwen serve daemons",builder:__name(yargs=>yargs.command(startCommand2).command(statusCommand2).command(logsCommand).command(stopCommand2).command(restartCommand).command(tokenCommand).demandCommand(1,"You need at least one command before continuing.").version(false),"builder"),handler:__name(()=>{},"handler")};init_esbuild_shims();import{createInterface}from"node:readline/promises";import{resolve as resolve3}from"node:path";function formatAttachError(message){return sanitizeTerminalText(message).replace(/[\t\n]/g,"")}__name(formatAttachError,"formatAttachError");function defaultAttachRecordAlive(record){if(!pidResolvableHere(record,currentPidNamespace()))return true;return isProcessAlive(record.pid)&&processStartMatchesRecord(record.startedAt,processStartTime(record.pid))}__name(defaultAttachRecordAlive,"defaultAttachRecordAlive");function selectAttachRecord(entries,port,alive=defaultAttachRecordAlive){const candidates=entries.filter(entry=>alive(entry.record));if(port!==void 0){const entry=candidates.find(candidate=>candidate.record.port===port);return entry?{record:entry.record}:{error:`No daemon is registered on port ${port}.`}}if(candidates.length===0){return{error:"no daemon is registered. Start one with `qwen serve`."}}if(candidates.length>1){return{error:`${candidates.length} daemons are registered; pass --port <port> to choose one.`}}return{record:candidates[0].record}}__name(selectAttachRecord,"selectAttachRecord");function resolveAttachToken(record,explicit,identityVerified=listenerIdentityVerified){if(record.auth!=="bearer")return{};const explicitToken=explicit?.trim();if(explicitToken)return{token:explicitToken};if(!identityVerified(record)){return{error:"listener identity unverified; not sending an ambient bearer token. Pass --token to use an explicit token."}}let token;try{token=process.env["QWEN_SERVER_TOKEN"]?.trim()||readDaemonToken(record.port,record.pid)}catch(error){return{error:`could not read the daemon token: ${formatAttachError(error instanceof Error?error.message:String(error))}`}}return token?{token}:{error:"this daemon requires a bearer token; pass --token, set QWEN_SERVER_TOKEN, or start it with --save-token."}}__name(resolveAttachToken,"resolveAttachToken");function resolveAttachWorkspace(record,explicit){const requested=explicit?.trim();if(requested)return resolve3(requested);return record.workspaces.length===1?record.workspaces[0]:void 0}__name(resolveAttachWorkspace,"resolveAttachWorkspace");async function handleAttach(argv){ignoreBrokenPipe();let shuttingDown=false;const startupAbort=new AbortController;const earlyState={};const earlyShutdown=__name(()=>{shuttingDown=true;process.exitCode=130;const finish=__name(()=>process.exit(130),"finish");startupAbort.abort();if(earlyState.session){void earlyState.session.detach().catch(()=>{}).finally(finish)}setTimeout(finish,500).unref()},"earlyShutdown");process.once("SIGINT",earlyShutdown);process.once("SIGTERM",earlyShutdown);const{entries,invalid}=readDaemonDiscoveries();for(const item of invalid){writeStderrLine(`qwen attach: ignoring ${formatAttachError(`${item.path}: ${item.reason}`)}`)}const target=selectAttachRecord(entries,argv.port);if(!target.record){writeStderrLine(`qwen attach: ${formatAttachError(target.error??"")}`);process.exitCode=1;return}const resolved=resolveAttachToken(target.record,argv.token);if(resolved.error){writeStderrLine(`qwen attach: ${formatAttachError(resolved.error)}`);process.exitCode=1;return}const workspaceCwd=resolveAttachWorkspace(target.record,argv.workspace);const client=new DaemonClient({baseUrl:target.record.url,token:resolved.token??""});let session;try{session=await DaemonSessionClient.load(client,argv.session,{...workspaceCwd?{workspaceCwd}:{},signal:startupAbort.signal})}catch(error){if(shuttingDown)return;const workspaceHint=target.record.workspaces.length>1&&!workspaceCwd?" If the session belongs to another workspace, pass --workspace <path>.":"";writeStderrLine(`qwen attach: could not load session: ${formatAttachError(error instanceof Error?error.message:String(error))}${workspaceHint}`);process.exitCode=1;return}earlyState.session=session;if(shuttingDown){await session.detach().catch(()=>{});return}let atLineStart=true;let terminalClosed=false;let promptInFlight=0;let notifyTurnSettled=__name(()=>{},"notifyTurnSettled");const writeText=__name(text=>{const safe=sanitizeTerminalText(text);if(safe.length===0)return;process.stdout.write(safe);atLineStart=safe.endsWith("\n")},"writeText");const endLine=__name(()=>{if(atLineStart)return;process.stdout.write("\n");atLineStart=true},"endLine");const renderEvent=__name(event=>{const settled=event.type==="turn_complete"||event.type==="turn_error";if(settled)endLine();for(const item of normalizeDaemonEvent(event,{clientId:session.clientId,suppressOwnUserEcho:true})){if(item.type==="assistant.text.delta"||item.type==="thought.text.delta"){writeText(item.text)}else if(item.type==="prompt.cancelled"){endLine()}else if(item.type==="permission.request"){endLine();const title=sanitizeTerminalText(item.title);const options=item.options.map(option=>sanitizeTerminalText(option.label)).join(" / ");writeStderrLine(`qwen attach: approval required: ${title}. Approve in Web Shell.${options?` Options: ${options}`:""}`)}else if(item.type==="error"){endLine();writeStderrLine(`qwen attach: ${sanitizeTerminalText(item.text)}`)}else if(item.type==="session.state_resync_required"){endLine();const start=item.lastDeliveredId+1;const end=item.earliestAvailableId-1;writeStderrLine(`qwen attach: state resync required (${sanitizeTerminalText(item.reason)}); missed events ${start}..${end}; reattach to reload the session.`);process.exitCode=1}else{}}if(settled)notifyTurnSettled()},"renderEvent");const snapshot2=session.consumeReplaySnapshot();for(const event of[...snapshot2.compactedReplay,...snapshot2.liveJournal]){renderEvent(event)}endLine();if(shuttingDown){await session.detach().catch(()=>{});return}const subscriptionAbort=new AbortController;let shutdownStarted=false;const iterator=session.events({signal:subscriptionAbort.signal});const eventsDone=(async()=>{try{while(true){const next=await iterator.next();if(next.done)break;renderEvent(next.value)}if(!shuttingDown){endLine();writeStderrLine("qwen attach: stream ended");process.exitCode=1}}catch(error){if(!shuttingDown){endLine();writeStderrLine(`qwen attach: stream ended: ${formatAttachError(error instanceof Error?error.message:String(error))}`);process.exitCode=1}}})();const rl=createInterface({input:process.stdin,output:process.stdout,terminal:true});notifyTurnSettled=__name(()=>{if(!terminalClosed&&promptInFlight===0)rl.prompt()},"notifyTurnSettled");const shutdown=__name(()=>{if(shutdownStarted)return;shutdownStarted=true;shuttingDown=true;terminalClosed=true;subscriptionAbort.abort();rl.close();void iterator.return(void 0).catch(()=>{})},"shutdown");rl.on("SIGINT",shutdown);rl.on("close",shutdown);process.once("SIGINT",shutdown);process.once("SIGTERM",shutdown);process.removeListener("SIGINT",earlyShutdown);process.removeListener("SIGTERM",earlyShutdown);if(shuttingDown)shutdown();rl.on("line",line=>{atLineStart=true;const text=line.trim();if(text.length===0){rl.prompt();return}promptInFlight+=1;void session.prompt({prompt:[{type:"text",text}]}).catch(error=>{if(!terminalClosed){endLine();writeStderrLine(`qwen attach: prompt failed: ${formatAttachError(error instanceof Error?error.message:String(error))}`)}}).finally(()=>{promptInFlight-=1;if(!terminalClosed){endLine();rl.prompt()}})});rl.prompt();try{await eventsDone}finally{shutdownStarted=true;shuttingDown=true;terminalClosed=true;subscriptionAbort.abort();process.removeListener("SIGINT",earlyShutdown);process.removeListener("SIGTERM",earlyShutdown);process.removeListener("SIGINT",shutdown);process.removeListener("SIGTERM",shutdown);rl.close();void iterator.return(void 0).catch(()=>{});await session.detach().catch(()=>{})}}__name(handleAttach,"handleAttach");var attachCommand={command:"attach",describe:"Attach a terminal to a running daemon session",builder:__name(yargs=>yargs.option("port",{type:"number",describe:"Daemon port; required when more than one is registered"}).option("session",{type:"string",demandOption:true,describe:"Daemon session id to attach to"}).option("workspace",{type:"string",describe:"Workspace containing the session; required for a secondary workspace"}).option("token",{type:"string",describe:"Bearer token; prefer QWEN_SERVER_TOKEN"}),"builder"),handler:__name(async argv=>{await handleAttach(argv)},"handler")};init_esbuild_shims();init_esbuild_shims();var ID_COL=12;var LABEL_COL=MAX_CONTROLLER_LABEL_CHARS*2+2;function sanitize2(value){return sanitizeTerminalText2(value).replace(/[\t\n]/g,"")}__name(sanitize2,"sanitize");function padDisplay(str,width){const currentWidth=stringWidth(str);if(currentWidth>=width)return str;return str+" ".repeat(width-currentWidth)}__name(padDisplay,"padDisplay");function formatCreated(createdAt){const date=new Date(createdAt);return Number.isNaN(date.getTime())?"unknown":date.toISOString().replace("T"," ").slice(0,16)}__name(formatCreated,"formatCreated");function describeError(error){return error instanceof Error?error.message:String(error)}__name(describeError,"describeError");async function handleAdd(argv){let added;try{added=await addPeerController(argv.label??"")}catch(error){writeStderrLine(error instanceof PeerControllerError?`Error: ${error.message}`:`Error: could not write ${getPeerControllerRegistryPath()}: ${describeError(error)}`);process.exit(1);return}const{record,token}=added;if(argv.json){writeStdoutLine(JSON.stringify({id:record.id,label:record.label,token,createdAt:record.createdAt}));return}writeStdoutLine(`Controller "${sanitize2(record.label)}" added (${record.id}).`);writeStdoutLine("");writeStdoutLine("Token \u2014 shown once and never stored, so put it in the controller's own configuration now:");writeStdoutLine(` ${token}`);writeStdoutLine("");writeStdoutLine("The controller presents it on the first line of every connection to a session inbox:");writeStdoutLine(` {"msgV":1,"type":"auth","token":"${token}"}`);writeStdoutLine("The target session must not have agents.crossSessionMessaging turned off (it is on by default), and must be restarted after changing that setting.");writeStdoutLine('Messages it sends are delivered without per-message review, unless agents.crossSessionInbound is "hold" or "refuse".')}__name(handleAdd,"handleAdd");async function handleControllerList(argv){let records;try{records=await listPeerControllers()}catch(error){writeStderrLine(error instanceof PeerControllerError?`Error: ${error.message}`:`Error: could not read ${getPeerControllerRegistryPath()}: ${describeError(error)}`);process.exit(1);return}if(argv.json){for(const record of records){writeStdoutLine(JSON.stringify({id:record.id,label:record.label,createdAt:record.createdAt}))}return}if(records.length===0){writeStdoutLine("No trusted controllers. Add one with: qwen sessions controllers add --label <name>");return}writeStdoutLine(padDisplay("ID",ID_COL)+padDisplay("LABEL",LABEL_COL)+"CREATED");for(const record of records){writeStdoutLine(padDisplay(record.id,ID_COL)+padDisplay(truncateToWidth(sanitize2(record.label),LABEL_COL-2),LABEL_COL)+formatCreated(record.createdAt))}}__name(handleControllerList,"handleControllerList");async function handleRemove(argv){let removed;try{removed=await removePeerController(argv.id??"")}catch(error){writeStderrLine(error instanceof PeerControllerError?`Error: ${error.message}`:`Error: could not write ${getPeerControllerRegistryPath()}: ${describeError(error)}`);process.exit(1);return}if(!removed){writeStderrLine(`Error: no controller has the id "${sanitize2(argv.id??"")}". Run "qwen sessions controllers list" to see them.`);process.exit(1);return}writeStdoutLine(`Removed controller "${sanitize2(removed.label)}" (${removed.id}).`);writeStdoutLine("Running sessions stop accepting its token on the next connection.")}__name(handleRemove,"handleRemove");var controllersCommand={command:"controllers",describe:"Manage the controller tokens that may drive your sessions",builder:__name(yargs=>yargs.command({command:"add",describe:"Mint a controller token and print it once",builder:__name(add=>add.option("label",{type:"string",describe:"What to call this controller, for later revocation",demandOption:true}).option("json",{type:"boolean",describe:"Output as a single JSON object",default:false}),"builder"),handler:__name(async argv=>{await handleAdd(argv)},"handler")}).command({command:"list",describe:"List the controllers this Qwen home trusts",builder:__name(list=>list.option("json",{type:"boolean",describe:"Output as JSON Lines",default:false}),"builder"),handler:__name(async argv=>{await handleControllerList(argv)},"handler")}).command({command:"remove <id>",describe:"Revoke a controller by id",builder:__name(remove=>remove.positional("id",{type:"string",describe:'The id shown by "qwen sessions controllers list"'}),"builder"),handler:__name(async argv=>{await handleRemove(argv)},"handler")}).demandCommand(1,"You need at least one command before continuing.").version(false),"builder"),handler:__name(()=>{},"handler")};init_esbuild_shims();init_esbuild_shims();function initSessionService(){const settings=loadSettings();Storage.setRuntimeBaseDir(settings.merged.advanced?.runtimeOutputDir,process.cwd());return new SessionService(process.cwd())}__name(initSessionService,"initSessionService");var SESSION_COL=38;var TIME_COL=16;var TITLE_COL=24;var BRANCH_COL=12;function formatTime(iso){const d=new Date(iso);if(isNaN(d.getTime()))return iso;const pad=__name(n=>String(n).padStart(2,"0"),"pad");return`${d.getUTCFullYear()}-${pad(d.getUTCMonth()+1)}-${pad(d.getUTCDate())} ${pad(d.getUTCHours())}:${pad(d.getUTCMinutes())}`}__name(formatTime,"formatTime");function sanitize3(value){const stripped=value.replace(/[\r\n\t]/g,"");const escaped=escapeAnsiCtrlCodes(stripped);return escaped.replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f-\x9f]/g,"")}__name(sanitize3,"sanitize");function padDisplay2(str,width){const currentWidth=stringWidth(str);if(currentWidth>=width)return str;return str+" ".repeat(width-currentWidth)}__name(padDisplay2,"padDisplay");function truncate(str,maxLen){const width=stringWidth(str);if(width<=maxLen)return str;const suffix=maxLen>3?"...":"";const target=maxLen-stringWidth(suffix);let result="";let w=0;for(const char of str){w+=stringWidth(char);if(w>target)break;result+=char}return result+suffix}__name(truncate,"truncate");function outputHuman(items){if(items.length===0){writeStdoutLine("No sessions found.");return}const termWidth=process.stdout.columns??80;const PROMPT_COL=Math.max(20,termWidth-SESSION_COL-TIME_COL-TITLE_COL-BRANCH_COL-4);const header=padDisplay2("SESSION ID",SESSION_COL)+" "+padDisplay2("STARTED",TIME_COL)+" "+padDisplay2("TITLE",TITLE_COL)+" "+padDisplay2("BRANCH",BRANCH_COL)+" PROMPT";writeStdoutLine(header);for(const item of items){const sessionId=truncate(sanitize3(String(item.sessionId??"")),SESSION_COL);const time=truncate(sanitize3(formatTime(item.startTime)),TIME_COL);const sanitizedPrompt=sanitize3(item.prompt??"");const title=truncate(item.customTitle!=null?sanitize3(item.customTitle):sanitizedPrompt,TITLE_COL);const branch=truncate(item.gitBranch!=null?sanitize3(item.gitBranch):"-",BRANCH_COL);const prompt=truncate(sanitizedPrompt,PROMPT_COL);writeStdoutLine(`${padDisplay2(sessionId,SESSION_COL)} ${padDisplay2(time,TIME_COL)} ${padDisplay2(title,TITLE_COL)} ${padDisplay2(branch,BRANCH_COL)} ${prompt}`)}}__name(outputHuman,"outputHuman");function toJsonItem(item){return{sessionId:item.sessionId,startTime:item.startTime,mtime:item.mtime,prompt:item.prompt,gitBranch:item.gitBranch??null,customTitle:item.customTitle??null,titleSource:item.titleSource??null,filePath:item.filePath,cwd:item.cwd}}__name(toJsonItem,"toJsonItem");function formatError(err){return err instanceof Error?err.message:String(err)}__name(formatError,"formatError");async function handleList(argv){let svc;try{svc=initSessionService()}catch(err){writeStderrLine(`Error: failed to initialize session service: ${formatError(err)}`);process.exit(1);return}let result;try{result=await svc.listSessions({size:argv.limit??20,excludeSourceTypes:[AGENT_HOST_SESSION_SOURCE_TYPE,AGENT_SESSION_SOURCE_TYPE]})}catch(err){writeStderrLine(`Error: failed to list sessions: ${formatError(err)}`);process.exit(1);return}if(argv.json){for(const item of result.items){writeStdoutLine(JSON.stringify(toJsonItem(item)))}if(result.items.length>0&&result.hasMore){writeStderrLine(`Note: ${result.items.length} sessions shown, more available. Use --limit to show more.`)}}else{outputHuman(result.items);if(result.items.length>0&&result.hasMore){writeStdoutLine(`Showing ${result.items.length} sessions. Use --limit to show more.`)}}}__name(handleList,"handleList");var listCommand4={command:"list",describe:"List sessions",builder:__name(yargs=>yargs.option("json",{type:"boolean",describe:"Output as JSON Lines",default:false}).option("limit",{type:"number",describe:"Maximum number of sessions to show",default:20,coerce:__name(v=>Number.isInteger(v)&&v>0?v:20,"coerce")}),"builder"),handler:__name(async argv=>{await handleList(argv)},"handler")};init_esbuild_shims();init_esbuild_shims();import*as fs2 from"node:fs/promises";import*as path3 from"node:path";function getAgentViewStorePaths(options={}){const globalDir=options.globalDir??Storage.getGlobalQwenDir();const daemonDir=path3.join(globalDir,"daemon");return{globalDir,daemonDir,rosterPath:path3.join(daemonDir,"roster.json"),supervisorPath:path3.join(daemonDir,"supervisor.json"),daemonLogPath:path3.join(daemonDir,"daemon.log"),jobsDir:path3.join(globalDir,"jobs")}}__name(getAgentViewStorePaths,"getAgentViewStorePaths");function getAgentViewSessionPaths(sessionId,options={}){const safeId=sanitizeSessionId(sessionId);const sessionDir=path3.join(getAgentViewStorePaths(options).jobsDir,safeId);return{sessionDir,statePath:path3.join(sessionDir,"state.json"),launchPath:path3.join(sessionDir,"launch.json"),activityPath:path3.join(sessionDir,"activity.json"),workerPath:path3.join(sessionDir,"worker.json"),tmpDir:path3.join(sessionDir,"tmp")}}__name(getAgentViewSessionPaths,"getAgentViewSessionPaths");async function readAgentViewSessionState(sessionId,options={}){const paths=getAgentViewSessionPaths(sessionId,options);const raw=await readJsonRecord(paths.statePath);return normalizeSessionState(raw,path3.basename(paths.sessionDir))}__name(readAgentViewSessionState,"readAgentViewSessionState");async function listAgentViewSessionStates(options={}){const{jobsDir}=getAgentViewStorePaths(options);let entries;try{entries=await fs2.readdir(jobsDir)}catch(error){if(isNodeError2(error)&&error.code==="ENOENT"){return[]}throw error}const states=await Promise.all(entries.map(sessionId=>readAgentViewSessionState(sessionId,options)));return states.filter(state=>Boolean(state)).sort((left,right)=>right.updatedAt.localeCompare(left.updatedAt))}__name(listAgentViewSessionStates,"listAgentViewSessionStates");function sanitizeSessionId(sessionId){const safe=path3.basename(sessionId.replace(/\\/g,"/")).toLowerCase().replace(/^\.+/g,"_").replace(/[<>:"|?*\x00-\x1F]/g,"_");return safe||"_"}__name(sanitizeSessionId,"sanitizeSessionId");async function readJsonRecord(filePath){try{const text=await fs2.readFile(filePath,"utf8");const parsed=JSON.parse(text);return isRecord(parsed)?parsed:void 0}catch{return void 0}}__name(readJsonRecord,"readJsonRecord");function normalizeSessionState(raw,expectedSessionId){if(!raw)return void 0;const sessionId=expectedSessionId||stringValue(raw["sessionId"]);const projectCwd=stringValue(raw["projectCwd"]);const originalCwd=stringValue(raw["originalCwd"]);const activeCwd=stringValue(raw["activeCwd"]);const createdAt=stringValue(raw["createdAt"]);const updatedAt=stringValue(raw["updatedAt"]);if(!sessionId||!projectCwd||!originalCwd||!activeCwd||!createdAt||!updatedAt){return void 0}return{...raw,schemaVersion:1,sessionId,ownership:ownershipValue(raw["ownership"]),sessionState:sessionStateValue(raw["sessionState"]),processState:processStateValue(raw["processState"]),attachState:attachStateValue(raw["attachState"]),projectCwd:path3.resolve(projectCwd),originalCwd:path3.resolve(originalCwd),activeCwd:path3.resolve(activeCwd),createdAt,updatedAt,worktree:isRecord(raw["worktree"])?{...raw["worktree"],mode:worktreeModeValue(raw["worktree"]["mode"])}:{mode:"none"}}}__name(normalizeSessionState,"normalizeSessionState");function ownershipValue(value){return value==="unmanaged"||value==="adopting"||value==="managed"||value==="removing"?value:"managed"}__name(ownershipValue,"ownershipValue");function isAgentViewSessionState(value){return value==="starting"||value==="working"||value==="needs_input"||value==="idle"||value==="completed"||value==="stopped"||value==="failed"}__name(isAgentViewSessionState,"isAgentViewSessionState");function sessionStateValue(value){return isAgentViewSessionState(value)?value:"failed"}__name(sessionStateValue,"sessionStateValue");function processStateValue(value){return value==="starting"||value==="alive"||value==="hibernating"||value==="hibernated"||value==="restarting"||value==="exited"?value:"exited"}__name(processStateValue,"processStateValue");function attachStateValue(value){return value==="attaching"||value==="attached"?value:"detached"}__name(attachStateValue,"attachStateValue");function worktreeModeValue(value){return value==="worktree"||value==="shared-unisolated"?value:"none"}__name(worktreeModeValue,"worktreeModeValue");function stringValue(value){return typeof value==="string"&&value.length>0?value:void 0}__name(stringValue,"stringValue");function isRecord(value){return typeof value==="object"&&value!==null&&!Array.isArray(value)}__name(isRecord,"isRecord");function isNodeError2(error){return error instanceof Error&&"code"in error}__name(isNodeError2,"isNodeError");var NAME_COL=22;var KIND_COL=10;var PID_COL=9;var AGE_COL=10;function sanitize4(value){return sanitizeTerminalText2(value).replace(/[\t\n]/g,"")}__name(sanitize4,"sanitize");function padDisplay3(str,width){const currentWidth=stringWidth(str);if(currentWidth>=width)return str;return str+" ".repeat(width-currentWidth)}__name(padDisplay3,"padDisplay");function formatAge(ms){const seconds=Math.max(0,Math.floor(ms/1e3));if(seconds<60)return`${seconds}s`;const minutes=Math.floor(seconds/60);if(minutes<60)return`${minutes}m`;const hours=Math.floor(minutes/60);if(hours<24)return`${hours}h`;return`${Math.floor(hours/24)}d`}__name(formatAge,"formatAge");function outputHuman2(records,managed,now){writeStdoutLine(padDisplay3("NAME",NAME_COL)+padDisplay3("KIND",KIND_COL)+padDisplay3("PID",PID_COL)+padDisplay3("AGE",AGE_COL)+"DIRECTORY");for(const session of managed){writeStdoutLine(padDisplay3(truncateToWidth(sanitize4(session.sessionId),NAME_COL-2),NAME_COL)+padDisplay3("managed",KIND_COL)+padDisplay3("-",PID_COL)+padDisplay3("-",AGE_COL)+sanitize4(session.cwd))}for(const record of records){writeStdoutLine(padDisplay3(truncateToWidth(sanitize4(record.name),NAME_COL-2),NAME_COL)+padDisplay3(truncateToWidth(describeSessionKind(record.kind),KIND_COL-2),KIND_COL)+padDisplay3(String(record.pid),PID_COL)+padDisplay3(formatAge(now-record.startedAt),AGE_COL)+sanitize4(record.cwd))}}__name(outputHuman2,"outputHuman");async function readManagedSessions(){try{return(await listAgentViewSessionStates()).filter(state=>state.ownership==="managed").map(({sessionId,activeCwd})=>({sessionId,cwd:activeCwd}))}catch(error){const reason=error instanceof Error?error.message:String(error);writeStderrLine(`Managed sessions could not be listed: ${sanitize4(reason)}`);return[]}}__name(readManagedSessions,"readManagedSessions");async function handlePs(argv){ignoreBrokenPipe();const[records,managed]=await Promise.all([listLiveSessions(),readManagedSessions()]);if(argv.json){for(const session of managed){writeStdoutLine(JSON.stringify({...session,managed:true}))}for(const record of records){writeStdoutLine(JSON.stringify({...record,ipcToken:void 0}))}return}if(records.length===0&&managed.length===0){writeStdoutLine("No Qwen Code sessions are registered or managed right now.");return}outputHuman2(records,managed,Date.now())}__name(handlePs,"handlePs");var psCommand={command:"ps",describe:"List registered and managed Qwen Code sessions",builder:__name(yargs=>yargs.option("json",{type:"boolean",describe:"Output as JSON Lines",default:false}),"builder"),handler:__name(async argv=>{await handlePs(argv)},"handler")};var sessionsCommand={command:"sessions",describe:"Manage Qwen Code sessions",builder:__name(yargs=>yargs.command(listCommand4).command(psCommand).command(controllersCommand).demandCommand(1,"You need at least one command before continuing.").version(false),"builder"),handler:__name(()=>{},"handler")};init_esbuild_shims();init_esbuild_shims();var DEFAULT_DAEMON_URL3="http://127.0.0.1:4170";var ENROLLMENT_TOKEN_ENV="QWEN_AGENT_HOST_ENROLLMENT_TOKEN";function readHiddenLine(question,input,write){if(!input.isTTY||typeof input.setRawMode!=="function"){return Promise.resolve(void 0)}const wasRaw=input.isRaw===true;input.setRawMode(true);write(question);return new Promise(resolve6=>{let line="";let escape="none";const finish=__name(answer=>{input.off("data",onData);input.setRawMode?.(wasRaw);input.pause();write("\n");resolve6(answer)},"finish");const onData=__name(chunk=>{for(const char of chunk.toString("utf8")){if(escape==="esc"){escape=char==="["?"csi":char==="O"?"ss3":"none";continue}if(escape==="csi"){if(char>="@"&&char<="~")escape="none";continue}if(escape==="ss3"){escape="none";continue}switch(char){case"\x1B":escape="esc";break;case"\r":case"\n":case"":finish(line);return;case"":finish(void 0);return;case"\x7F":case"\b":line=[...line].slice(0,-1).join("");break;default:if(char>=" ")line+=char}}},"onData");input.on("data",onData);input.resume()})}__name(readHiddenLine,"readHiddenLine");async function promptTokenFromTty(){const answer=await readHiddenLine("Enrollment token (from the join dialog, not shown): ",process.stdin,text=>process.stderr.write(text));return answer?.trim()}__name(promptTokenFromTty,"promptTokenFromTty");async function runAgentsJoin(argv,deps){let target;try{target=parseJoinLink(argv.link)}catch{deps.err("qwen agents join expects the link shown by the coordinator, like https://host:4170/join/<workspace>.");return 1}const enrollmentToken=deps.env[ENROLLMENT_TOKEN_ENV]?.trim()||await deps.promptToken();if(!enrollmentToken){deps.err(`Set ${ENROLLMENT_TOKEN_ENV} to the enrollment token shown with the link.`);return 1}const baseUrl=(argv["daemon-url"]||deps.env[QWEN_DAEMON_URL_ENV]||DEFAULT_DAEMON_URL3).replace(/\/+$/,"");const daemonToken=argv.token??deps.env[QWEN_SERVER_TOKEN_ENV]??deps.env[QWEN_DAEMON_TOKEN_ENV];const workspace=argv.workspace||deps.cwd;const url=`${baseUrl}/workspaces/${encodeURIComponent(workspace)}/agent/hosts/connect`;let response;try{response=await deps.fetch(url,{method:"POST",headers:{"content-type":"application/json",...daemonToken?{authorization:`Bearer ${daemonToken}`}:{}},body:JSON.stringify({serverUrl:target.serverUrl,workspaceId:target.workspaceId,enrollmentToken,allowHttp:argv["allow-http"]===true}),redirect:"error",signal:AbortSignal.timeout(6e4)})}catch{deps.err(`No running qwen serve daemon answered at ${baseUrl}.`);deps.err(`Start one that joins directly instead:
|
|
32
32
|
${ENROLLMENT_TOKEN_ENV}=<token> qwen serve --join ${argv.link}${argv["allow-http"]?" --agent-host-allow-http":""}`);return 1}const result=await response.json().catch(()=>({}));if(!response.ok||!result.connected){if(response.status===401||response.status===403){deps.err(`The daemon at ${baseUrl} refused the request; pass --token or set ${QWEN_SERVER_TOKEN_ENV}.`)}else if(response.status===404&&!result.error){deps.err(`The daemon at ${baseUrl} does not serve ${workspace} or is too old to join without a restart.`)}else{deps.err(`Join failed (${response.status}): ${result.error??"no detail"}`)}return 1}deps.out(`Joined ${target.serverUrl} as a runtime for workspace ${target.workspaceId}${result.providers?.length?` (programs: ${result.providers.join(", ")})`:""}. The daemon reconnects after restarts.`);return 0}__name(runAgentsJoin,"runAgentsJoin");var joinCommand={command:"join <link>",describe:"Join a coordinator as an Agent Host from the running local qwen serve (no restart)",builder:__name(yargs=>yargs.positional("link",{type:"string",demandOption:true,description:"The join link shown by the coordinator"}).option("daemon-url",{type:"string",description:`Local daemon base URL (default: $${QWEN_DAEMON_URL_ENV} or ${DEFAULT_DAEMON_URL3})`}).option("token",{type:"string",description:`Local daemon bearer token (default: $${QWEN_SERVER_TOKEN_ENV} or $${QWEN_DAEMON_TOKEN_ENV})`}).option("workspace",{type:"string",description:"Workspace on the local daemon that joins (default: current directory)"}).option("allow-http",{type:"boolean",description:"Allow a plain-HTTP coordinator outside loopback (trusted networks only)"}),"builder"),handler:__name(async argv=>{const code=await runAgentsJoin(argv,{fetch,env:process.env,cwd:process.cwd(),promptToken:promptTokenFromTty,out:writeStdoutLine,err:writeStderrLine});process.exitCode=code},"handler")};var agentsCommand={command:"agents",describe:"Session agents: join a coordinator as a runtime",builder:__name(yargs=>yargs.command(joinCommand).command(sessionSendMcpCommand).demandCommand(1,"You need at least one command before continuing.").version(false),"builder"),handler:__name(()=>{},"handler")};init_esbuild_shims();init_esbuild_shims();init_esbuild_shims();var import_proper_lockfile=__toESM(require_proper_lockfile(),1);import{randomUUID}from"node:crypto";import*as fsp2 from"node:fs/promises";import*as path4 from"node:path";var debug=createDebugLogger("BOARD_LOCK");var BOARDS_DIR="boards";function getBoardsRootDir(){return path4.join(Storage.getGlobalQwenDir(),BOARDS_DIR)}__name(getBoardsRootDir,"getBoardsRootDir");function boardDirName(board){return board.toLowerCase()}__name(boardDirName,"boardDirName");function getBoardDir(board){return path4.join(getBoardsRootDir(),boardDirName(board))}__name(getBoardDir,"getBoardDir");function getCollectionDir(board,collection){return path4.join(getBoardDir(board),collection)}__name(getCollectionDir,"getCollectionDir");var SAFE_NAME=/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/;var WINDOWS_DEVICE_NAME=/^(con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\.|$)/i;function assertSafeName(kind,name){if(!SAFE_NAME.test(name)||name==="."||name===".."||name.endsWith(".")||WINDOWS_DEVICE_NAME.test(name)){throw new Error(`Invalid ${kind} "${name}". Use 1-64 characters: letters, digits, dot, dash or underscore, starting with a letter or digit.`)}}__name(assertSafeName,"assertSafeName");var ITEM_ID=/^[at]-[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/;function assertItemId(kind,id,prefix){if(!ITEM_ID.test(id)||prefix&&!id.startsWith(`${prefix}-`)){throw new Error(`Invalid ${kind} "${id}".`)}}__name(assertItemId,"assertItemId");async function ensurePrivateDir(dir){await fsp2.mkdir(dir,{recursive:true,mode:448});await fsp2.chmod(dir,448)}__name(ensurePrivateDir,"ensurePrivateDir");async function createBoardRecord(board,collection,prefix,build){assertSafeName("board name",board);assertSafeName("collection name",collection);const root=getBoardsRootDir();const boardDir=getBoardDir(board);const collectionDir=getCollectionDir(board,collection);await ensurePrivateDir(root);await ensurePrivateDir(boardDir);await ensurePrivateDir(collectionDir);for(let attempt=0;attempt<3;attempt++){const id=`${prefix}-${randomUUID()}`;const record=build(id);try{await fsp2.writeFile(path4.join(collectionDir,`${id}.json`),JSON.stringify(record,null,2),{flag:"wx",mode:384,flush:true});return record}catch(err){if(isNodeError(err)&&err.code==="EEXIST")continue;throw err}}throw new Error(`Could not allocate a ${collection} id.`)}__name(createBoardRecord,"createBoardRecord");var lockOptions={retries:{retries:30,minTimeout:5,maxTimeout:100,factor:2,randomize:true},stale:5e3,onCompromised:__name(err=>debug.warn("board item lock compromised:",err),"onCompromised")};var fileLocks=new Map;function withItemLock(filePath,fn,onMissing){let lock=fileLocks.get(filePath);if(!lock){lock=new Mutex;fileLocks.set(filePath,lock)}return lock.runExclusive(async()=>{let release;try{release=await import_proper_lockfile.default.lock(filePath,lockOptions)}catch(err){if(isNodeError(err)&&err.code==="ENOENT"&&onMissing){return onMissing()}throw err}try{return await fn()}catch(err){if(isNodeError(err)&&err.code==="ENOENT"&&onMissing){return onMissing()}throw err}finally{try{await release?.()}catch(err){debug.warn("failed to release lock:",err)}}}).finally(()=>{const held=fileLocks.get(filePath);if(held&&!held.isLocked())fileLocks.delete(filePath)})}__name(withItemLock,"withItemLock");async function pruneCollection(board,collection,filenamePattern,settledAt,olderThanMs,now=Date.now()){assertSafeName("board name",board);assertSafeName("collection name",collection);if(!Number.isFinite(olderThanMs)||olderThanMs<0){throw new Error("olderThanMs must be a non-negative finite number.")}if(!Number.isFinite(now))throw new Error("now must be a finite number.");const dir=getCollectionDir(board,collection);let files;try{files=await fsp2.readdir(dir)}catch(err){if(isNodeError(err)&&err.code==="ENOENT")return[];throw err}const removed=[];for(const file of files){if(!filenamePattern.test(file))continue;const full=path4.join(dir,file);await withItemLock(full,async()=>{const raw=await fsp2.readFile(full,"utf8");let timestamp;try{timestamp=settledAt(JSON.parse(raw))}catch(err){debug.warn(`skipping invalid ${file}:`,err);return}if(timestamp===null||!Number.isFinite(timestamp)||now-timestamp<olderThanMs){return}await fsp2.unlink(full);removed.push(path4.basename(file,".json"))},()=>{})}return removed}__name(pruneCollection,"pruneCollection");init_esbuild_shims();import*as fs3 from"node:fs/promises";import*as path5 from"node:path";var debug2=createDebugLogger("BOARD_TASKS");var TASKS_COLLECTION="tasks";var MAX_TEXT_LENGTH=65536;var READ_BATCH_SIZE=32;var TASK_FILE=/^t-[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}\.json$/;function tasksDir(board){return getCollectionDir(board,TASKS_COLLECTION)}__name(tasksDir,"tasksDir");function taskPath(board,id){return path5.join(tasksDir(board),`${id}.json`)}__name(taskPath,"taskPath");function assertText(field,value){if(!value.trim())throw new Error(`${field} must not be empty.`);if(value.length>MAX_TEXT_LENGTH){throw new Error(`${field} exceeds ${MAX_TEXT_LENGTH} characters.`)}}__name(assertText,"assertText");function parseTask(value){if(!value||typeof value!=="object"||Array.isArray(value)){throw new Error("Task record must be an object.")}const task=value;if(task.schemaVersion!==1)throw new Error("Unsupported task schema.");if(typeof task.id!=="string")throw new Error("Task id must be text.");assertItemId("task id",task.id,"t");if(typeof task.subject!=="string"){throw new Error("Task subject must be text.")}assertText("subject",task.subject);if(typeof task.createdBy!=="string"){throw new Error("Task createdBy must be a name.")}assertSafeName("actor name",task.createdBy);if(task.owner!==null&&typeof task.owner!=="string"){throw new Error("Task owner must be a name or null.")}if(task.owner!==null)assertSafeName("actor name",task.owner);if(!["pending","in_progress","completed"].includes(task.status??"")){throw new Error("Invalid task status.")}if(!Number.isFinite(task.createdAt)||!Number.isFinite(task.updatedAt)){throw new Error("Task timestamps must be finite numbers.")}if((task.updatedAt??0)<(task.createdAt??0)){throw new Error("Task updatedAt precedes createdAt.")}if(!Array.isArray(task.notes)||!task.notes.every(n=>typeof n==="string")){throw new Error("Task notes must be strings.")}for(const note of task.notes)assertText("note",note);return task}__name(parseTask,"parseTask");async function createBoardTask(opts){assertSafeName("actor name",opts.createdBy);assertText("subject",opts.subject);if(opts.owner!==void 0)assertSafeName("actor name",opts.owner);const now=Date.now();return createBoardRecord(opts.board,TASKS_COLLECTION,"t",id=>({schemaVersion:1,id,subject:opts.subject,createdBy:opts.createdBy,owner:opts.owner??null,status:"pending",createdAt:now,updatedAt:now,notes:[]}))}__name(createBoardTask,"createBoardTask");async function getBoardTask(board,id){assertSafeName("board name",board);assertItemId("task id",id,"t");let raw;try{raw=await fs3.readFile(taskPath(board,id),"utf8")}catch(err){if(isNodeError(err)&&err.code==="ENOENT")return null;throw err}try{const task=parseTask(JSON.parse(raw));if(task.id!==id)throw new Error("Task id does not match its filename.");return task}catch(err){debug2.warn(`skipping invalid task ${id}:`,err);return null}}__name(getBoardTask,"getBoardTask");async function listBoardTasks(board){assertSafeName("board name",board);let files;try{files=await fs3.readdir(tasksDir(board))}catch(err){if(isNodeError(err)&&err.code==="ENOENT")return[];throw err}const ids=files.filter(file=>TASK_FILE.test(file)).map(file=>file.slice(0,-5));const tasks=[];for(let offset=0;offset<ids.length;offset+=READ_BATCH_SIZE){const batch=await Promise.all(ids.slice(offset,offset+READ_BATCH_SIZE).map(id=>getBoardTask(board,id)));for(const task of batch){if(task!==null)tasks.push(task)}}return tasks.sort((a,b)=>a.createdAt-b.createdAt)}__name(listBoardTasks,"listBoardTasks");async function mutate(board,id,apply){assertSafeName("board name",board);assertItemId("task id",id,"t");const target=taskPath(board,id);return withItemLock(target,async()=>{const current=parseTask(JSON.parse(await fs3.readFile(target,"utf8")));if(current.id!==id){throw new Error("Task id does not match its filename.")}const next=parseTask({...apply(current),updatedAt:Date.now()});await atomicWriteJSON(target,next,{mode:384,forceMode:true});return next},()=>{throw new Error(`Task "${id}" not found.`)})}__name(mutate,"mutate");function claimBoardTask(board,id,by){assertSafeName("actor name",by);return mutate(board,id,task=>{if(task.status==="completed"){throw new Error(`Task "${id}" is already completed.`)}if(task.status==="in_progress"&&task.owner!==by){throw new Error(`Task "${id}" is already claimed by "${task.owner}".`)}return{...task,owner:by,status:"in_progress"}})}__name(claimBoardTask,"claimBoardTask");function completeBoardTask(board,id,by,note){assertSafeName("actor name",by);if(note!==void 0)assertText("note",note);return mutate(board,id,task=>{if(task.owner!==by||task.status!=="in_progress"){throw new Error(`Task "${id}" is not in progress for "${by}".`)}return{...task,status:"completed",...note?{notes:[...task.notes,note]}:{}}})}__name(completeBoardTask,"completeBoardTask");function pruneBoardTasks(board,olderThanMs,now){return pruneCollection(board,TASKS_COLLECTION,TASK_FILE,value=>{const task=parseTask(value);return task.status==="completed"?task.updatedAt:null},olderThanMs,now)}__name(pruneBoardTasks,"pruneBoardTasks");init_esbuild_shims();import*as fs4 from"node:fs/promises";import*as path6 from"node:path";var debug3=createDebugLogger("BOARD_ASKS");var ASKS_COLLECTION="asks";var DEFAULT_ASK_TTL_MS=15*60*1e3;var MAX_TEXT_LENGTH2=65536;var READ_BATCH_SIZE2=32;var ASK_FILE=/^a-[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}\.json$/;function asksDir(board){return getCollectionDir(board,ASKS_COLLECTION)}__name(asksDir,"asksDir");function askPath(board,id){return path6.join(asksDir(board),`${id}.json`)}__name(askPath,"askPath");function assertText2(field,value){if(!value.trim())throw new Error(`${field} must not be empty.`);if(value.length>MAX_TEXT_LENGTH2){throw new Error(`${field} exceeds ${MAX_TEXT_LENGTH2} characters.`)}}__name(assertText2,"assertText");function parseAsk(value){if(!value||typeof value!=="object"||Array.isArray(value)){throw new Error("Ask record must be an object.")}const ask=value;if(ask.schemaVersion!==1)throw new Error("Unsupported ask schema.");if(typeof ask.id!=="string")throw new Error("Ask id must be text.");assertItemId("ask id",ask.id,"a");if(typeof ask.from!=="string"||typeof ask.to!=="string"){throw new Error("Ask actors must be names.")}assertSafeName("actor name",ask.from);assertSafeName("actor name",ask.to);if(typeof ask.question!=="string"){throw new Error("Ask question must be text.")}assertText2("question",ask.question);if(ask.aboutTask!==void 0){if(typeof ask.aboutTask!=="string"){throw new Error("Ask aboutTask must be a task id.")}assertItemId("task id",ask.aboutTask,"t")}if(!["open","answered","declined","timeout"].includes(ask.state??"")){throw new Error("Invalid ask state.")}if(!Number.isFinite(ask.createdAt)||!Number.isFinite(ask.expiresAt)){throw new Error("Ask timestamps must be finite numbers.")}if((ask.expiresAt??0)<=(ask.createdAt??0)){throw new Error("Ask expiresAt must follow createdAt.")}if(ask.answer!==null&&typeof ask.answer!=="string"){throw new Error("Ask answer must be text or null.")}if(ask.reason!==null&&typeof ask.reason!=="string"){throw new Error("Ask reason must be text or null.")}if(ask.settledAt!==null&&!Number.isFinite(ask.settledAt)){throw new Error("Ask settledAt must be a finite number or null.")}if(ask.settledAt!==null&&(ask.settledAt??0)<(ask.createdAt??0)){throw new Error("Ask settledAt precedes createdAt.")}if(ask.answer)assertText2("answer",ask.answer);if(ask.reason)assertText2("reason",ask.reason);if(ask.state==="open"){if(ask.answer!==null||ask.reason!==null||ask.settledAt!==null){throw new Error("An open ask cannot contain a result.")}}else if(ask.state==="answered"){if(!ask.answer||ask.reason!==null||ask.settledAt===null){throw new Error("An answered ask requires answer and settledAt.")}}else if(ask.state==="timeout"){if(ask.settledAt===null||ask.answer!==null||ask.reason!==null){throw new Error("A timed-out ask requires settledAt and no result.")}}else if(!ask.reason||ask.answer!==null||ask.settledAt===null){throw new Error("A declined ask requires reason and settledAt.")}return ask}__name(parseAsk,"parseAsk");function settleAsk(ask,now=Date.now()){if(ask.state!=="open"||now<ask.expiresAt)return ask;return{...ask,state:"timeout",settledAt:ask.expiresAt}}__name(settleAsk,"settleAsk");async function createAsk(opts){assertSafeName("actor name",opts.from);assertSafeName("actor name",opts.to);if(opts.from===opts.to)throw new Error("An ask must target another actor.");assertText2("question",opts.question);if(opts.aboutTask)assertItemId("task id",opts.aboutTask,"t");const ttl=opts.ttlMs??DEFAULT_ASK_TTL_MS;if(!Number.isFinite(ttl)||ttl<=0){throw new Error("ttlMs must be a positive finite number.")}const now=Date.now();if(!Number.isFinite(now+ttl))throw new Error("ttlMs is too large.");return createBoardRecord(opts.board,ASKS_COLLECTION,"a",id=>({schemaVersion:1,id,from:opts.from,to:opts.to,question:opts.question,...opts.aboutTask?{aboutTask:opts.aboutTask}:{},state:"open",createdAt:now,expiresAt:now+ttl,answer:null,reason:null,settledAt:null}))}__name(createAsk,"createAsk");async function getAsk(board,id){assertSafeName("board name",board);assertItemId("ask id",id,"a");let raw;try{raw=await fs4.readFile(askPath(board,id),"utf8")}catch(err){if(isNodeError(err)&&err.code==="ENOENT")return null;throw err}try{const ask=parseAsk(JSON.parse(raw));if(ask.id!==id)throw new Error("Ask id does not match its filename.");return settleAsk(ask)}catch(err){debug3.warn(`skipping invalid ask ${id}:`,err);return null}}__name(getAsk,"getAsk");async function listAsks(board){assertSafeName("board name",board);let files;try{files=await fs4.readdir(asksDir(board))}catch(err){if(isNodeError(err)&&err.code==="ENOENT")return[];throw err}const ids=files.filter(file=>ASK_FILE.test(file)).map(file=>file.slice(0,-5));const asks=[];for(let offset=0;offset<ids.length;offset+=READ_BATCH_SIZE2){const batch=await Promise.all(ids.slice(offset,offset+READ_BATCH_SIZE2).map(id=>getAsk(board,id)));for(const ask of batch){if(ask!==null)asks.push(ask)}}return asks.sort((a,b)=>a.createdAt-b.createdAt)}__name(listAsks,"listAsks");async function settleOnDisk(board,id,by,apply){assertSafeName("board name",board);assertItemId("ask id",id,"a");assertSafeName("actor name",by);const target=askPath(board,id);return withItemLock(target,async()=>{const current=settleAsk(parseAsk(JSON.parse(await fs4.readFile(target,"utf8"))));if(current.id!==id){throw new Error("Ask id does not match its filename.")}if(current.to!==by){throw new Error(`Ask "${id}" is addressed to "${current.to}".`)}if(current.state!=="open"){throw new Error(`Ask "${id}" is already ${current.state}.`)}const next=parseAsk(apply(current));await atomicWriteJSON(target,next,{mode:384,forceMode:true});return next},()=>{throw new Error(`Ask "${id}" not found.`)})}__name(settleOnDisk,"settleOnDisk");function answerAsk(board,id,by,answer){assertText2("answer",answer);return settleOnDisk(board,id,by,ask=>({...ask,state:"answered",answer,settledAt:Date.now()}))}__name(answerAsk,"answerAsk");function declineAsk(board,id,by,reason){assertText2("reason",reason);return settleOnDisk(board,id,by,ask=>({...ask,state:"declined",reason,settledAt:Date.now()}))}__name(declineAsk,"declineAsk");function pruneAsks(board,olderThanMs,now=Date.now()){return pruneCollection(board,ASKS_COLLECTION,ASK_FILE,value=>{const ask=parseAsk(value);if(ask.state==="open"){return ask.expiresAt<=now?ask.expiresAt:null}return ask.settledAt},olderThanMs,now)}__name(pruneAsks,"pruneAsks");init_esbuild_shims();function requireBoardName(value){if(typeof value!=="string"||!value){throw new Error("Pass --board <name>.")}assertSafeName("board name",value);return value}__name(requireBoardName,"requireBoardName");function requireActorName(value){if(typeof value!=="string"||!value){throw new Error("Pass --as <name>.")}assertSafeName("actor name",value);return value}__name(requireActorName,"requireActorName");init_esbuild_shims();function oneLine(value){return sanitizeTerminalText2(value).replace(/[\r\n\t]+/g," ")}__name(oneLine,"oneLine");function renderBoard(snapshot2){const lines=[`board: ${oneLine(snapshot2.board)}`];for(const ask of snapshot2.asks){lines.push(`? ${ask.id} [${ask.state}] ${oneLine(ask.from)} -> ${oneLine(ask.to)}: ${oneLine(ask.question)}`)}for(const task of snapshot2.tasks){lines.push(`- ${task.id} [${task.status}] ${oneLine(task.owner??"unowned")}: ${oneLine(task.subject)}`)}if(lines.length===1)lines.push("(empty)");return lines.join("\n")}__name(renderBoard,"renderBoard");async function emit(argv,value,human){const text=`${argv.json?JSON.stringify(value):sanitizeTerminalText2(human)}
|
|
33
33
|
`;if(process.stdout.listenerCount("error")===0){process.stdout.on("error",()=>{})}await new Promise((resolve6,reject)=>{process.stdout.write(text,err=>{if(err&&err.code!=="EPIPE")reject(err);else resolve6()})})}__name(emit,"emit");async function run(fn){try{await fn()}catch(err){process.stderr.write(`${oneLine(err instanceof Error?err.message:String(err))}
|
|
34
34
|
`);process.exitCode=1}}__name(run,"run");function finiteNumber(value,flag,minimum){if(typeof value!=="number"||!Number.isFinite(value)||value<minimum){throw new Error(`${flag} must be a finite number >= ${minimum}.`)}return value}__name(finiteNumber,"finiteNumber");async function snapshot(board,actor){const[tasks,asks]=await Promise.all([listBoardTasks(board),listAsks(board)]);return{board,tasks:actor?tasks.filter(task=>task.owner===actor):tasks,asks:actor?asks.filter(ask=>ask.from===actor||ask.to===actor):asks}}__name(snapshot,"snapshot");var boardCommand={command:"board",describe:"Share work with other agents through a board",builder:__name(yargs=>yargs.option("board",{type:"string",describe:"Board name"}).option("as",{type:"string",describe:"Declared actor name"}).option("json",{type:"boolean",describe:"Emit JSON"}).command({command:"show",describe:"Print the board once",handler:__name(argv=>run(async()=>{const a=argv;const board=requireBoardName(a.board);const actor=a.as===void 0?void 0:requireActorName(a.as);const state=await snapshot(board,actor);await emit(a,state,renderBoard(state))}),"handler")}).command({command:"task <subject>",describe:"Create a task",builder:__name(y=>y.positional("subject",{type:"string",demandOption:true}).option("owner",{type:"string"}),"builder"),handler:__name(argv=>run(async()=>{const a=argv;const task=await createBoardTask({board:requireBoardName(a.board),createdBy:requireActorName(a.as),subject:a.subject,owner:a.owner});await emit(a,task,`${task.id} ${task.subject}`)}),"handler")}).command({command:"claim <id>",describe:"Take ownership of a task",builder:__name(y=>y.positional("id",{type:"string",demandOption:true}),"builder"),handler:__name(argv=>run(async()=>{const a=argv;const task=await claimBoardTask(requireBoardName(a.board),a.id,requireActorName(a.as));await emit(a,task,`${task.id} claimed by ${task.owner}`)}),"handler")}).command({command:"done <id>",describe:"Complete a task you own",builder:__name(y=>y.positional("id",{type:"string",demandOption:true}).option("note",{type:"string"}),"builder"),handler:__name(argv=>run(async()=>{const a=argv;const task=await completeBoardTask(requireBoardName(a.board),a.id,requireActorName(a.as),a.note);await emit(a,task,`${task.id} completed`)}),"handler")}).command({command:"ask <to> <question>",describe:"Ask another actor a question",builder:__name(y=>y.positional("to",{type:"string",demandOption:true}).positional("question",{type:"string",demandOption:true}).option("about",{type:"string"}).option("wait",{type:"boolean"}).option("timeout",{type:"number",default:30}).option("ttl",{type:"number",default:900}),"builder"),handler:__name(argv=>run(async()=>{const a=argv;const board=requireBoardName(a.board);const waitMs=a.wait?finiteNumber(a.timeout*1e3,"--timeout",0):0;const ask=await createAsk({board,from:requireActorName(a.as),to:a.to,question:a.question,aboutTask:a.about,ttlMs:finiteNumber(a.ttl,"--ttl",.001)*1e3});if(!a.wait){await emit(a,ask,`${ask.id} -> ${ask.to}`);return}const deadline=Date.now()+waitMs;for(;;){const current=await getAsk(board,ask.id);if(!current)throw new Error(`Ask "${ask.id}" not found.`);if(current.state!=="open"){await emit(a,current,current.state==="answered"?current.answer??"":current.state);if(current.state==="declined")process.exitCode=2;if(current.state==="timeout")process.exitCode=3;return}if(Date.now()>=deadline){process.stderr.write(`${ask.id} is still open.
|
|
35
|
-
`);process.exitCode=4;return}await new Promise(resolve6=>setTimeout(resolve6,250))}}),"handler")}).command({command:"answer <id> <answer>",describe:"Answer an ask addressed to you",builder:__name(y=>y.positional("id",{type:"string",demandOption:true}).positional("answer",{type:"string",demandOption:true}),"builder"),handler:__name(argv=>run(async()=>{const a=argv;const ask=await answerAsk(requireBoardName(a.board),a.id,requireActorName(a.as),a.answer);await emit(a,ask,`${ask.id} answered`)}),"handler")}).command({command:"decline <id> <reason>",describe:"Decline an ask addressed to you",builder:__name(y=>y.positional("id",{type:"string",demandOption:true}).positional("reason",{type:"string",demandOption:true}),"builder"),handler:__name(argv=>run(async()=>{const a=argv;const ask=await declineAsk(requireBoardName(a.board),a.id,requireActorName(a.as),a.reason);await emit(a,ask,`${ask.id} declined`)}),"handler")}).command({command:"prune",describe:"Remove settled items older than a cutoff",builder:__name(y=>y.option("older-than",{type:"number",default:7}),"builder"),handler:__name(argv=>run(async()=>{const a=argv;requireActorName(a.as);const board=requireBoardName(a.board);const cutoff=finiteNumber(a.olderThan,"--older-than",0)*864e5;const[asks,tasks]=await Promise.all([pruneAsks(board,cutoff),pruneBoardTasks(board,cutoff)]);const removed={asks,tasks};const total=asks.length+tasks.length;await emit(a,removed,`Removed ${total} settled items.`)}),"handler")}).demandCommand(1,"You need at least one board command.").version(false),"builder"),handler:__name(()=>{},"handler")};init_esbuild_shims();var updateCommand3={command:"update",get describe(){return t("Check for Qwen Code updates and install if available")},handler:__name(async()=>{const[{loadSettings:loadSettings2},{checkForUpdatesDetailed,describeUpdateCheckFailure},installationInfoModule,standaloneUpdate,stdioHelpers,{updateEventEmitter}]=await Promise.all([import("./settings-JDQSRXP3.js"),import("./updateCheck-YDLTQQRU.js"),import("./installationInfo-4XJMJJYU.js"),import("./standalone-update-2UU6FQZL.js"),import("./stdioHelpers-MRNIWW2E.js"),import("./updateEventEmitter-HCGBOCP2.js")]);const{formatUpdateInstructions,getInstallationInfo}=installationInfoModule;const{performStandaloneUpdate}=standaloneUpdate;const{writeStdoutLine:writeStdoutLine2,writeStderrLine:writeStderrLine2}=stdioHelpers;const cwd=process.cwd();const settings=loadSettings2(cwd,false);await initializeI18n(resolveLanguageSetting(settings.merged.general?.language));const updateCheck=await checkForUpdatesDetailed();if(updateCheck.status==="up-to-date"){writeStdoutLine2(t("Qwen Code {{version}} is up to date!",{version:updateCheck.currentVersion}));return}if(updateCheck.status==="error"){writeStderrLine2(t("Failed to check for updates ({{reason}}). Please check your network or registry configuration.",{reason:describeUpdateCheckFailure(updateCheck.error)}));process.exitCode=1;return}if(updateCheck.status==="skipped"){writeStderrLine2(t("Unable to check for updates: {{reason}}",{reason:updateCheck.reason}));process.exitCode=1;return}const info=updateCheck.info;writeStdoutLine2(info.message);const installationInfo=getInstallationInfo(cwd,true);if(installationInfo.isStandalone&&installationInfo.standaloneDir){const handleUpdateInfo=__name(data=>{writeStdoutLine2(data.message)},"handleUpdateInfo");updateEventEmitter.on("update-info",handleUpdateInfo);try{writeStdoutLine2(t("Downloading update..."));const result=await performStandaloneUpdate(installationInfo.standaloneDir,info.update.latest);if(result==="done"){writeStdoutLine2(t("Update successful! The new version will be used on your next run."))}else{writeStdoutLine2(t("Update downloaded. It will be applied after you exit this session."))}}catch(err){writeStderrLine2(t("Update failed: {{error}}",{error:err instanceof Error?err.message:String(err)}));process.exitCode=1}finally{updateEventEmitter.off("update-info",handleUpdateInfo)}return}for(const line of formatUpdateInstructions(installationInfo,info.update.latest)){writeStdoutLine2(t(line))}},"handler")};init_esbuild_shims();import fs5 from"node:fs";import os from"node:os";import path7 from"node:path";import{randomUUID as randomUUID2}from"node:crypto";var sandboxCommand={command:"sandbox [cmd...]",describe:"Inspect tool confinement, verify it, or run one confined command",builder:__name(yargs=>yargs.parserConfiguration({"populate--":true,"parse-positional-numbers":false}).positional("cmd",{type:"string",array:true}).option("verify",{type:"boolean",default:false}).option("sandbox",DEFAULT_COMMAND_OPTIONS.sandbox).option("sandbox-image",DEFAULT_COMMAND_OPTIONS["sandbox-image"]).example("$0 sandbox","Report the effective execution policy").example("$0 sandbox --verify","Verify the kernel boundary").example("$0 sandbox -- sh -c 'ls /'","Run one command confined").strict(),"builder"),handler:__name(async argv=>{const{writeStdoutLine:writeStdoutLine2,writeStderrLine:writeStderrLine2}=await import("./stdioHelpers-MRNIWW2E.js");const args=argv;const command=[...args.cmd??[],...args["--"]??[]];const report=command.length?writeStderrLine2:writeStdoutLine2;const controller=new AbortController;let cancellationExitCode=130;const interrupt=__name(()=>controller.abort(),"interrupt");const terminate=__name(()=>{cancellationExitCode=143;controller.abort()},"terminate");process.once("SIGINT",interrupt);process.once("SIGTERM",terminate);try{const{loadSettings:loadSettings2,createMinimalSettings}=await import("./settings-JDQSRXP3.js");const{isBareMode:isBareMode2}=await import("./bareMode-GPCKTNSB.js");const{validateExecutionSandboxSelection:validateExecutionSandboxSelection2}=await import("./execution-sandbox-settings-TXCL7KCD.js");const settings=(isBareMode2(args.bare)?createMinimalSettings():loadSettings2()).merged;const selected=validateExecutionSandboxSelection2(settings,args);if(!selected){const{loadSandboxConfig:loadSandboxConfig2}=await import("./sandboxConfig-7DBXEQJH.js");const legacy=await loadSandboxConfig2(settings,args);const inherited=process.env["SANDBOX"]?.trim();report(`Tool execution sandbox: none${inherited?` (inherited whole-CLI marker: ${inherited})`:legacy?` (whole-CLI backend: ${legacy.command})`:""}`);report("Configure tools.executionSandbox in User or System settings.");if(command.length||args.verify)throw new Error("No confined command was run: tools.executionSandbox is not configured.");return}const{Storage:Storage2}=await import("./storage-YXE5RBJX.js");const{createExecutionSandboxPolicy:createExecutionSandboxPolicy2}=await import("./execution-sandbox-config-SVJFEG4D.js");const{admitShellSandbox,probeShellSandbox}=await import("./runtime-shell-policy-GX3MSE22.js");const{executeSandbox}=await import("./execute-sandbox-BV7ZQIZ2.js");const{sanitizeChildEnv}=await import("./sanitize-child-env-FSTGPGXY.js");Storage2.setRuntimeBaseDir(settings.advanced?.runtimeOutputDir,process.cwd());const candidate=createExecutionSandboxPolicy2(selected,process.cwd());const admitted=admitShellSandbox({model:"",debugMode:false,cwd:process.cwd(),targetDir:process.cwd(),shellExecutionSandbox:candidate},Storage2.getRuntimeBaseDir(),Storage2.getGlobalQwenDir());let fixture="";if(args.verify&&!command.length){try{fixture=fs5.mkdtempSync(path7.join(os.tmpdir(),"qwen-sandbox-verify-"))}catch(error){throw new Error(`Cannot create verification fixture in host temporary directory ${os.tmpdir()}: ${error instanceof Error?error.message:String(error)}. Check TMPDIR and its permissions; this failure does not test the sandbox boundary.`)}}try{const policy=await probeShellSandbox(admitted,controller.signal);report(`Boundary: tools; backend: ${policy.requestedBackend} \u2192 ${policy.effectiveBackend} (${policy.enforcement}${policy.landlockAbi?`, ABI ${policy.landlockAbi}`:""})`);report(`Filesystem: ${policy.filesystem}; workspace: ${policy.workspace}`);report(`Command network: ${policy.network}`);report("Model, authentication and session traffic stay on the host.");report("Host reads and pathname Unix sockets remain accessible.");report("Backend probe: passed (admission only; full-session viability is not tested).");const env=Object.fromEntries(Object.entries(sanitizeChildEnv(process.env)).filter(entry=>typeof entry[1]==="string"));if(command.length){let outputError;const outputControllers={stdout:new AbortController,stderr:new AbortController};const handleOutputError=__name(stream=>error=>{outputControllers[stream].abort();if(outputError)return;outputError=error;cancellationExitCode=error.code==="EPIPE"?141:1;controller.abort()},"handleOutputError");const stdoutError=handleOutputError("stdout");const stderrError=handleOutputError("stderr");process.stdout.on("error",stdoutError);process.stderr.on("error",stderrError);try{const handle2=await executeSandbox(policy,{executable:"/usr/bin/env",args:["--",...command],cwd:policy.workspace,env,inheritStdin:!process.stdin.isTTY},event=>{if(event.type==="raw_data"){const stream=event.stream==="stderr"?process.stderr:process.stdout;stream.write(event.chunk)}},controller.signal,false,{},{streamStdout:true,streamRawOutput:true});const result2=await handle2.result;const output=await Promise.allSettled([flushOutput(process.stdout,outputControllers.stdout.signal),flushOutput(process.stderr,outputControllers.stderr.signal)]);if(outputError&&outputError.code!=="EPIPE")throw outputError;for(const flushed of output)if(flushed.status==="rejected")throw flushed.reason;if(result2.error&&!result2.aborted)throw result2.error;process.exitCode=result2.aborted||controller.signal.aborted?cancellationExitCode:result2.exitCode??1;return}finally{process.stdout.removeListener("error",stdoutError);process.stderr.removeListener("error",stderrError)}}if(!args.verify)return;const outside=path7.join(fixture,"host-writable");const inside=path7.join(policy.workspace,`.qwen-sandbox-probe-${randomUUID2()}`);fs5.writeFileSync(outside,"unchanged",{flag:"wx"});const hostPid=fs5.readlinkSync("/proc/self/ns/pid");const hostNet=fs5.readlinkSync("/proc/self/ns/net");const program=`
|
|
35
|
+
`);process.exitCode=4;return}await new Promise(resolve6=>setTimeout(resolve6,250))}}),"handler")}).command({command:"answer <id> <answer>",describe:"Answer an ask addressed to you",builder:__name(y=>y.positional("id",{type:"string",demandOption:true}).positional("answer",{type:"string",demandOption:true}),"builder"),handler:__name(argv=>run(async()=>{const a=argv;const ask=await answerAsk(requireBoardName(a.board),a.id,requireActorName(a.as),a.answer);await emit(a,ask,`${ask.id} answered`)}),"handler")}).command({command:"decline <id> <reason>",describe:"Decline an ask addressed to you",builder:__name(y=>y.positional("id",{type:"string",demandOption:true}).positional("reason",{type:"string",demandOption:true}),"builder"),handler:__name(argv=>run(async()=>{const a=argv;const ask=await declineAsk(requireBoardName(a.board),a.id,requireActorName(a.as),a.reason);await emit(a,ask,`${ask.id} declined`)}),"handler")}).command({command:"prune",describe:"Remove settled items older than a cutoff",builder:__name(y=>y.option("older-than",{type:"number",default:7}),"builder"),handler:__name(argv=>run(async()=>{const a=argv;requireActorName(a.as);const board=requireBoardName(a.board);const cutoff=finiteNumber(a.olderThan,"--older-than",0)*864e5;const[asks,tasks]=await Promise.all([pruneAsks(board,cutoff),pruneBoardTasks(board,cutoff)]);const removed={asks,tasks};const total=asks.length+tasks.length;await emit(a,removed,`Removed ${total} settled items.`)}),"handler")}).demandCommand(1,"You need at least one board command.").version(false),"builder"),handler:__name(()=>{},"handler")};init_esbuild_shims();var updateCommand3={command:"update",get describe(){return t("Check for Qwen Code updates and install if available")},handler:__name(async()=>{const[{loadSettings:loadSettings2},{checkForUpdatesDetailed,describeUpdateCheckFailure},installationInfoModule,standaloneUpdate,stdioHelpers,{updateEventEmitter}]=await Promise.all([import("./settings-23I6H76E.js"),import("./updateCheck-VRFPSX4G.js"),import("./installationInfo-4AOEOUI6.js"),import("./standalone-update-SWI2RL3L.js"),import("./stdioHelpers-MRNIWW2E.js"),import("./updateEventEmitter-HCGBOCP2.js")]);const{formatUpdateInstructions,getInstallationInfo}=installationInfoModule;const{performStandaloneUpdate}=standaloneUpdate;const{writeStdoutLine:writeStdoutLine2,writeStderrLine:writeStderrLine2}=stdioHelpers;const cwd=process.cwd();const settings=loadSettings2(cwd,false);await initializeI18n(resolveLanguageSetting(settings.merged.general?.language));const updateCheck=await checkForUpdatesDetailed();if(updateCheck.status==="up-to-date"){writeStdoutLine2(t("Qwen Code {{version}} is up to date!",{version:updateCheck.currentVersion}));return}if(updateCheck.status==="error"){writeStderrLine2(t("Failed to check for updates ({{reason}}). Please check your network or registry configuration.",{reason:describeUpdateCheckFailure(updateCheck.error)}));process.exitCode=1;return}if(updateCheck.status==="skipped"){writeStderrLine2(t("Unable to check for updates: {{reason}}",{reason:updateCheck.reason}));process.exitCode=1;return}const info=updateCheck.info;writeStdoutLine2(info.message);const installationInfo=getInstallationInfo(cwd,true);if(installationInfo.isStandalone&&installationInfo.standaloneDir){const handleUpdateInfo=__name(data=>{writeStdoutLine2(data.message)},"handleUpdateInfo");updateEventEmitter.on("update-info",handleUpdateInfo);try{writeStdoutLine2(t("Downloading update..."));const result=await performStandaloneUpdate(installationInfo.standaloneDir,info.update.latest);if(result==="done"){writeStdoutLine2(t("Update successful! The new version will be used on your next run."))}else{writeStdoutLine2(t("Update downloaded. It will be applied after you exit this session."))}}catch(err){writeStderrLine2(t("Update failed: {{error}}",{error:err instanceof Error?err.message:String(err)}));process.exitCode=1}finally{updateEventEmitter.off("update-info",handleUpdateInfo)}return}for(const line of formatUpdateInstructions(installationInfo,info.update.latest)){writeStdoutLine2(t(line))}},"handler")};init_esbuild_shims();import fs5 from"node:fs";import os from"node:os";import path7 from"node:path";import{randomUUID as randomUUID2}from"node:crypto";var sandboxCommand={command:"sandbox [cmd...]",describe:"Inspect tool confinement, verify it, or run one confined command",builder:__name(yargs=>yargs.parserConfiguration({"populate--":true,"parse-positional-numbers":false}).positional("cmd",{type:"string",array:true}).option("verify",{type:"boolean",default:false}).option("sandbox",DEFAULT_COMMAND_OPTIONS.sandbox).option("sandbox-image",DEFAULT_COMMAND_OPTIONS["sandbox-image"]).example("$0 sandbox","Report the effective execution policy").example("$0 sandbox --verify","Verify the kernel boundary").example("$0 sandbox -- sh -c 'ls /'","Run one command confined").strict(),"builder"),handler:__name(async argv=>{const{writeStdoutLine:writeStdoutLine2,writeStderrLine:writeStderrLine2}=await import("./stdioHelpers-MRNIWW2E.js");const args=argv;const command=[...args.cmd??[],...args["--"]??[]];const report=command.length?writeStderrLine2:writeStdoutLine2;const controller=new AbortController;let cancellationExitCode=130;const interrupt=__name(()=>controller.abort(),"interrupt");const terminate=__name(()=>{cancellationExitCode=143;controller.abort()},"terminate");process.once("SIGINT",interrupt);process.once("SIGTERM",terminate);try{const{loadSettings:loadSettings2,createMinimalSettings}=await import("./settings-23I6H76E.js");const{isBareMode:isBareMode2}=await import("./bareMode-GPCKTNSB.js");const{validateExecutionSandboxSelection:validateExecutionSandboxSelection2}=await import("./execution-sandbox-settings-TXCL7KCD.js");const settings=(isBareMode2(args.bare)?createMinimalSettings():loadSettings2()).merged;const selected=validateExecutionSandboxSelection2(settings,args);if(!selected){const{loadSandboxConfig:loadSandboxConfig2}=await import("./sandboxConfig-47EXXMUA.js");const legacy=await loadSandboxConfig2(settings,args);const inherited=process.env["SANDBOX"]?.trim();report(`Tool execution sandbox: none${inherited?` (inherited whole-CLI marker: ${inherited})`:legacy?` (whole-CLI backend: ${legacy.command})`:""}`);report("Configure tools.executionSandbox in User or System settings.");if(command.length||args.verify)throw new Error("No confined command was run: tools.executionSandbox is not configured.");return}const{Storage:Storage2}=await import("./storage-YXE5RBJX.js");const{createExecutionSandboxPolicy:createExecutionSandboxPolicy2}=await import("./execution-sandbox-config-SVJFEG4D.js");const{admitShellSandbox,probeShellSandbox}=await import("./runtime-shell-policy-GX3MSE22.js");const{executeSandbox}=await import("./execute-sandbox-BV7ZQIZ2.js");const{sanitizeChildEnv}=await import("./sanitize-child-env-FSTGPGXY.js");Storage2.setRuntimeBaseDir(settings.advanced?.runtimeOutputDir,process.cwd());const candidate=createExecutionSandboxPolicy2(selected,process.cwd());const admitted=admitShellSandbox({model:"",debugMode:false,cwd:process.cwd(),targetDir:process.cwd(),shellExecutionSandbox:candidate},Storage2.getRuntimeBaseDir(),Storage2.getGlobalQwenDir());let fixture="";if(args.verify&&!command.length){try{fixture=fs5.mkdtempSync(path7.join(os.tmpdir(),"qwen-sandbox-verify-"))}catch(error){throw new Error(`Cannot create verification fixture in host temporary directory ${os.tmpdir()}: ${error instanceof Error?error.message:String(error)}. Check TMPDIR and its permissions; this failure does not test the sandbox boundary.`)}}try{const policy=await probeShellSandbox(admitted,controller.signal);report(`Boundary: tools; backend: ${policy.requestedBackend} \u2192 ${policy.effectiveBackend} (${policy.enforcement}${policy.landlockAbi?`, ABI ${policy.landlockAbi}`:""})`);report(`Filesystem: ${policy.filesystem}; workspace: ${policy.workspace}`);report(`Command network: ${policy.network}`);report("Model, authentication and session traffic stay on the host.");report("Host reads and pathname Unix sockets remain accessible.");report("Backend probe: passed (admission only; full-session viability is not tested).");const env=Object.fromEntries(Object.entries(sanitizeChildEnv(process.env)).filter(entry=>typeof entry[1]==="string"));if(command.length){let outputError;const outputControllers={stdout:new AbortController,stderr:new AbortController};const handleOutputError=__name(stream=>error=>{outputControllers[stream].abort();if(outputError)return;outputError=error;cancellationExitCode=error.code==="EPIPE"?141:1;controller.abort()},"handleOutputError");const stdoutError=handleOutputError("stdout");const stderrError=handleOutputError("stderr");process.stdout.on("error",stdoutError);process.stderr.on("error",stderrError);try{const handle2=await executeSandbox(policy,{executable:"/usr/bin/env",args:["--",...command],cwd:policy.workspace,env,inheritStdin:!process.stdin.isTTY},event=>{if(event.type==="raw_data"){const stream=event.stream==="stderr"?process.stderr:process.stdout;stream.write(event.chunk)}},controller.signal,false,{},{streamStdout:true,streamRawOutput:true});const result2=await handle2.result;const output=await Promise.allSettled([flushOutput(process.stdout,outputControllers.stdout.signal),flushOutput(process.stderr,outputControllers.stderr.signal)]);if(outputError&&outputError.code!=="EPIPE")throw outputError;for(const flushed of output)if(flushed.status==="rejected")throw flushed.reason;if(result2.error&&!result2.aborted)throw result2.error;process.exitCode=result2.aborted||controller.signal.aborted?cancellationExitCode:result2.exitCode??1;return}finally{process.stdout.removeListener("error",stdoutError);process.stderr.removeListener("error",stderrError)}}if(!args.verify)return;const outside=path7.join(fixture,"host-writable");const inside=path7.join(policy.workspace,`.qwen-sandbox-probe-${randomUUID2()}`);fs5.writeFileSync(outside,"unchanged",{flag:"wx"});const hostPid=fs5.readlinkSync("/proc/self/ns/pid");const hostNet=fs5.readlinkSync("/proc/self/ns/net");const program=`
|
|
36
36
|
const fs = require('node:fs');
|
|
37
37
|
const write = (p, flag) => { try { fs.writeFileSync(p, 'probe', {flag}); return 'allowed'; } catch(e) { return e.code; } };
|
|
38
38
|
const inside = write(process.argv[1], 'wx');
|
|
39
39
|
if (inside === 'allowed') fs.unlinkSync(process.argv[1]);
|
|
40
40
|
console.log(JSON.stringify({inside, outside:write(process.argv[2], 'w'), pid:fs.readlinkSync('/proc/self/ns/pid'), net:fs.readlinkSync('/proc/self/ns/net')}));
|
|
41
|
-
`;const handle=await executeSandbox(policy,{executable:fs5.realpathSync(getJsInterpreterCommand(import.meta.url).command),args:["-e",program,inside,outside],cwd:policy.workspace,env:{PATH:"/usr/bin:/bin"}},()=>{},AbortSignal.any([controller.signal,AbortSignal.timeout(1e4)]));const result=await handle.result;if(result.error||result.exitCode!==0)throw result.error??new Error(result.output||"Verification payload failed.");const observed=JSON.parse(result.output);const checks=[["workspace policy",observed["inside"]===(policy.filesystem==="workspace-write"?"allowed":policy.effectiveBackend==="landlock"?"EACCES":"EROFS")],["host-writable outside file denied",observed["outside"]===(policy.effectiveBackend==="landlock"?"EACCES":"EROFS")&&fs5.readFileSync(outside,"utf8")==="unchanged"],[policy.effectiveBackend==="landlock"?"shared PID namespace (Landlock boundary)":"private PID namespace",typeof observed["pid"]==="string"&&(policy.effectiveBackend==="landlock"?observed["pid"]===hostPid:observed["pid"]!==hostPid)],["command network namespace",typeof observed["net"]==="string"&&(policy.network==="closed"?observed["net"]!==hostNet:observed["net"]===hostNet)]];for(const[name,passed]of checks)report(`${passed?"PASS":"FAIL"} ${name}`);if(checks.some(([,passed])=>!passed))throw new Error("Confinement verification failed.");report(`Confinement verified (${checks.length} checks).`)}finally{if(fixture)fs5.rmSync(fixture,{recursive:true,force:true})}}catch(error){const{FatalError}=await import("./errors-UBMHQZVX.js");if(error instanceof FatalError){writeStderrLine2(error.message);process.exitCode=error.exitCode;return}writeStderrLine2(`Sandbox unavailable: ${error instanceof Error?error.message:String(error)}`);process.exitCode=controller.signal.aborted?cancellationExitCode:1}finally{process.removeListener("SIGINT",interrupt);process.removeListener("SIGTERM",terminate)}},"handler")};init_esbuild_shims();function resolvesToSameModel(modelName,selector,context){if(!modelName||!selector)return false;try{const resolved=resolveModelId(modelName.split("\0")[0],{...context,fastModel:void 0});return resolved?.modelId===selector.modelId&&resolved?.authType===selector.authType}catch{return false}}__name(resolvesToSameModel,"resolvesToSameModel");function allowsFastOnlyAdvisorModel(modelName,selector,context){return modelName==="fast"||resolvesToSameModel(context.fastModel,selector,context)}__name(allowsFastOnlyAdvisorModel,"allowsFastOnlyAdvisorModel");function isAdvisorModelEligible(model,allowFastOnly=false){return(allowFastOnly||!model.fastOnly)&&!model.voiceOnly&&!model.visionOnly&&!model.imageOnly}__name(isAdvisorModelEligible,"isAdvisorModelEligible");function checkAdvisorModelAvailability(config,modelName,fallbackContext={}){const runtimeContext=buildModelIdContext(config);const context={...runtimeContext,fastModel:runtimeContext.fastModel??fallbackContext.fastModel,currentModel:runtimeContext.currentModel??fallbackContext.currentModel,currentAuthType:runtimeContext.currentAuthType??fallbackContext.currentAuthType};const endpointIndex=modelName.indexOf("\0");const modelSelector=endpointIndex<0?modelName:modelName.slice(0,endpointIndex);const registryBaseUrl=endpointIndex<0?void 0:modelName.slice(endpointIndex+1)||null;let selector;try{if(modelSelector.trim()==="inherit"){throw new Error("Advisor cannot inherit the executor model.")}selector=resolveModelId(modelSelector,context)}catch{selector=void 0}const allowFastOnly=allowsFastOnlyAdvisorModel(modelSelector,selector,context);const configuredModels=config.getAllConfiguredModels(selector?.authType?[selector.authType]:void 0);const availableModels=configuredModels.filter(model=>isAdvisorModelEligible(model,allowFastOnly)&&(registryBaseUrl===void 0||!model.isRuntimeModel&&(model.registryBaseUrl??null)===registryBaseUrl));const uncapturedRuntimeModelId=registryBaseUrl===void 0&&selector!==void 0&&selector.modelId===context.currentModel&&selector.authType===context.currentAuthType&&!configuredModels.some(model=>model.id===selector.modelId&&model.authType===selector.authType)?selector.modelId:void 0;const availableModelIds=new Set(availableModels.map(model=>model.id));if(uncapturedRuntimeModelId){availableModelIds.add(uncapturedRuntimeModelId)}return{available:selector!==void 0&&(uncapturedRuntimeModelId!==void 0||availableModels.some(model=>model.id===selector.modelId)),availableModelIds:Array.from(availableModelIds)}}__name(checkAdvisorModelAvailability,"checkAdvisorModelAvailability");var debugLogger2=createDebugLogger("CONFIG");function resolveLocaleForExtensions(settings){const envLang=process.env["QWEN_CODE_LANG"];if(envLang)return envLang;const settingsLang=settings.general?.language;if(settingsLang&&settingsLang!=="auto")return settingsLang;return detectSystemLanguage()}__name(resolveLocaleForExtensions,"resolveLocaleForExtensions");var SKILL_LEVELS=["project","user","extension","bundled"];function isSkillLevel(value){return SKILL_LEVELS.includes(value)}__name(isSkillLevel,"isSkillLevel");function schemaRootAcceptsObject(schema,isRoot=true){if(isRoot&&typeof schema["$ref"]==="string"){return false}const rawType=schema["type"];const typeIncludesObject=rawType!==void 0&&(Array.isArray(rawType)?rawType:[rawType]).includes("object");if(rawType!==void 0&&!typeIncludesObject){return false}if("const"in schema){const constVal=schema["const"];if(typeof constVal!=="object"||constVal===null||Array.isArray(constVal)){return false}}const enumVal=schema["enum"];if(Array.isArray(enumVal)){const anyObjectMember=enumVal.some(v=>typeof v==="object"&&v!==null&&!Array.isArray(v));if(!anyObjectMember)return false}const variantAcceptsObject=__name(v=>{if(v===true)return true;if(v===false)return false;if(typeof v==="object"&&v!==null&&!Array.isArray(v)){return schemaRootAcceptsObject(v,false)}return false},"variantAcceptsObject");for(const key of["anyOf","oneOf"]){const variants=schema[key];if(Array.isArray(variants)){if(variants.length===0)return false;if(!variants.some(variantAcceptsObject))return false}}const allOf=schema["allOf"];if(Array.isArray(allOf)&&allOf.length>0){if(!allOf.every(variantAcceptsObject))return false}const notSchema=schema["not"];if(typeof notSchema==="object"&¬Schema!==null&&!Array.isArray(notSchema)){const notRecord=notSchema;const notType=notRecord["type"];if(notType!==void 0){const types=Array.isArray(notType)?notType:[notType];if(types.includes("object")&&Object.keys(notRecord).length===1){return false}}}if("if"in schema){const ifSchema=schema["if"];if(ifSchema===true){const thenSchema=schema["then"];if(thenSchema!==void 0&&!variantAcceptsObject(thenSchema)){return false}}else if(ifSchema===false){const elseSchema=schema["else"];if(elseSchema!==void 0&&!variantAcceptsObject(elseSchema)){return false}}}return true}__name(schemaRootAcceptsObject,"schemaRootAcceptsObject");var MAX_JSON_SCHEMA_FILE_BYTES=4*1024*1024;function resolveJsonSchemaArg(raw){if(raw===void 0){return void 0}const trimmed=raw.trim();if(trimmed.length===0){throw new FatalConfigError("--json-schema cannot be empty.")}let payload;let payloadSource="inline";let payloadSourcePath;if(trimmed.startsWith("@")){const resolvedPath=resolvePath(trimmed.slice(1));payloadSource="file";payloadSourcePath=resolvedPath;try{const stat2=fs6.statSync(resolvedPath);if(!stat2.isFile()){throw new FatalConfigError(`--json-schema "@${resolvedPath}" must be a regular file.`)}if(stat2.size>MAX_JSON_SCHEMA_FILE_BYTES){throw new FatalConfigError(`--json-schema file "${resolvedPath}" is ${stat2.size} bytes (>${MAX_JSON_SCHEMA_FILE_BYTES}). Refusing to read; this is almost certainly a wrong-path argument. Schemas should be small enough to fit in a few KiB; decompose with \`$ref\` if you need a large family of types.`)}payload=fs6.readFileSync(resolvedPath,"utf8")}catch(err){if(err instanceof FatalConfigError)throw err;throw new FatalConfigError(`--json-schema could not read "${resolvedPath}": ${err instanceof Error?err.message:String(err)}`)}}else{payload=trimmed}let parsed;try{parsed=JSON.parse(payload)}catch(err){if(payloadSource==="file"){throw new FatalConfigError(`--json-schema content of "${payloadSourcePath}" is not valid JSON.`)}throw new FatalConfigError(`--json-schema is not valid JSON: ${err instanceof Error?err.message:String(err)}`)}if(typeof parsed!=="object"||parsed===null||Array.isArray(parsed)){throw new FatalConfigError("--json-schema must be a JSON object describing a schema.")}if(!schemaRootAcceptsObject(parsed)){throw new FatalConfigError('--json-schema root must accept object-typed values (tool parameters are always JSON objects). At least one branch of a root anyOf/oneOf must be satisfiable by an object, and a root `type` (when present) must include "object".')}const compileError=SchemaValidator.compileStrict(parsed);if(compileError){throw new FatalConfigError(`--json-schema is not a valid JSON Schema: ${compileError}`)}return parsed}__name(resolveJsonSchemaArg,"resolveJsonSchemaArg");function normalizeOutputFormat(format){if(!format){return void 0}if(format==="stream-json"){return"stream-json"}if(format==="json"||format==="json"){return"json"}return"text"}__name(normalizeOutputFormat,"normalizeOutputFormat");async function parseArguments(){let rawArgv=hideBin(process.argv);if(rawArgv.length>0&&(rawArgv[0].endsWith("/dist/qwen-cli/cli.js")||rawArgv[0].endsWith("/dist/cli.js")||rawArgv[0].endsWith("/dist/cli/cli.js"))){rawArgv=rawArgv.slice(1)}const yargsInstance=yargs_default(rawArgv).locale("en").scriptName("qwen").usage(TOP_LEVEL_USAGE).option("telemetry",TOP_LEVEL_GLOBAL_OPTIONS.telemetry).option("telemetry-target",TOP_LEVEL_GLOBAL_OPTIONS["telemetry-target"]).option("telemetry-otlp-endpoint",TOP_LEVEL_GLOBAL_OPTIONS["telemetry-otlp-endpoint"]).option("telemetry-otlp-protocol",TOP_LEVEL_GLOBAL_OPTIONS["telemetry-otlp-protocol"]).option("telemetry-log-prompts",TOP_LEVEL_GLOBAL_OPTIONS["telemetry-log-prompts"]).option("telemetry-outfile",TOP_LEVEL_GLOBAL_OPTIONS["telemetry-outfile"]).option("debug",TOP_LEVEL_GLOBAL_OPTIONS.debug).option("bare",TOP_LEVEL_GLOBAL_OPTIONS.bare).option("safe-mode",TOP_LEVEL_GLOBAL_OPTIONS["safe-mode"]).option("proxy",TOP_LEVEL_GLOBAL_OPTIONS.proxy).option("insecure",TOP_LEVEL_GLOBAL_OPTIONS.insecure).option("chat-recording",TOP_LEVEL_GLOBAL_OPTIONS["chat-recording"]).command(DEFAULT_COMMAND,DEFAULT_COMMAND_DESC,yargsInstance2=>yargsInstance2.positional("query",QUERY_POSITIONAL).option("model",DEFAULT_COMMAND_OPTIONS.model).option("advisor",DEFAULT_COMMAND_OPTIONS.advisor).option("fallback-model",{...DEFAULT_COMMAND_OPTIONS["fallback-model"],string:true,coerce:__name(models=>models.flatMap(m=>m.split(",").map(s=>s.trim())).filter(Boolean),"coerce")}).option("prompt",DEFAULT_COMMAND_OPTIONS.prompt).option("prompt-interactive",DEFAULT_COMMAND_OPTIONS["prompt-interactive"]).option("system-prompt",DEFAULT_COMMAND_OPTIONS["system-prompt"]).option("append-system-prompt",DEFAULT_COMMAND_OPTIONS["append-system-prompt"]).option("output-style",DEFAULT_COMMAND_OPTIONS["output-style"]).option("sandbox",DEFAULT_COMMAND_OPTIONS.sandbox).middleware(argv=>{if(argv["sandbox"]==="bwrap")throw new FatalConfigError(BWRAP_MIGRATION_MESSAGE)},true).option("sandbox-image",DEFAULT_COMMAND_OPTIONS["sandbox-image"]).option("yolo",DEFAULT_COMMAND_OPTIONS.yolo).option("approval-mode",DEFAULT_COMMAND_OPTIONS["approval-mode"]).option("acp",DEFAULT_COMMAND_OPTIONS.acp).option("experimental-acp",{type:"boolean",description:"Starts the agent in ACP mode (deprecated, use --acp instead)",hidden:true}).option("acp-execution-engine",{type:"string",choices:["managed"],description:"Private to qwen serve: the execution engine this ACP host runs",hidden:true}).option("experimental-skills",{type:"boolean",description:"Deprecated: Skills are now enabled by default. This flag is ignored.",hidden:true}).option("experimental-lsp",DEFAULT_COMMAND_OPTIONS["experimental-lsp"]).option("restore-ask-user-question",DEFAULT_COMMAND_OPTIONS["restore-ask-user-question"]).option("channel",DEFAULT_COMMAND_OPTIONS.channel).option("allowed-mcp-server-names",{...DEFAULT_COMMAND_OPTIONS["allowed-mcp-server-names"],string:true,coerce:__name(mcpServerNames=>mcpServerNames.flatMap(mcpServerName=>mcpServerName.split(",").map(m=>m.trim())),"coerce")}).option("disable-mcp-server",{...DEFAULT_COMMAND_OPTIONS["disable-mcp-server"],string:true,coerce:__name(disabledServerNames=>disabledServerNames.flatMap(disabledServerName=>disabledServerName.split(",").map(m=>m.trim())),"coerce")}).option("mcp-config",DEFAULT_COMMAND_OPTIONS["mcp-config"]).option("allowed-tools",{...DEFAULT_COMMAND_OPTIONS["allowed-tools"],string:true,coerce:__name(tools=>tools.flatMap(tool=>tool.split(",").map(t2=>t2.trim())),"coerce")}).option("extensions",{...DEFAULT_COMMAND_OPTIONS.extensions,string:true,coerce:__name(extensions=>extensions.flatMap(extension=>extension.split(",").map(e=>e.trim())),"coerce")}).option("list-extensions",DEFAULT_COMMAND_OPTIONS["list-extensions"]).option("include-directories",{...DEFAULT_COMMAND_OPTIONS["include-directories"],string:true,coerce:__name(dirs=>dirs.flatMap(dir=>dir.split(",").map(d=>d.trim())),"coerce")}).option("openai-logging",DEFAULT_COMMAND_OPTIONS["openai-logging"]).option("openai-logging-dir",DEFAULT_COMMAND_OPTIONS["openai-logging-dir"]).option("openai-api-key",DEFAULT_COMMAND_OPTIONS["openai-api-key"]).option("openai-base-url",DEFAULT_COMMAND_OPTIONS["openai-base-url"]).option("screen-reader",DEFAULT_COMMAND_OPTIONS["screen-reader"]).option("input-format",DEFAULT_COMMAND_OPTIONS["input-format"]).option("output-format",DEFAULT_COMMAND_OPTIONS["output-format"]).option("include-partial-messages",DEFAULT_COMMAND_OPTIONS["include-partial-messages"]).option("json-fd",DEFAULT_COMMAND_OPTIONS["json-fd"]).option("json-file",DEFAULT_COMMAND_OPTIONS["json-file"]).option("json-schema",DEFAULT_COMMAND_OPTIONS["json-schema"]).option("input-file",DEFAULT_COMMAND_OPTIONS["input-file"]).option("continue",DEFAULT_COMMAND_OPTIONS.continue).option("resume",DEFAULT_COMMAND_OPTIONS.resume).option("session-id",DEFAULT_COMMAND_OPTIONS["session-id"]).option("fork-session",DEFAULT_COMMAND_OPTIONS["fork-session"]).option("sandbox-session-id",{type:"string",hidden:true}).option("worktree",DEFAULT_COMMAND_OPTIONS.worktree).option("max-session-turns",DEFAULT_COMMAND_OPTIONS["max-session-turns"]).option("max-wall-time",DEFAULT_COMMAND_OPTIONS["max-wall-time"]).option("max-tool-calls",DEFAULT_COMMAND_OPTIONS["max-tool-calls"]).option("max-subagent-depth",DEFAULT_COMMAND_OPTIONS["max-subagent-depth"]).option("core-tools",{...DEFAULT_COMMAND_OPTIONS["core-tools"],string:true,coerce:__name(tools=>tools.flatMap(tool=>tool.split(",").map(t2=>t2.trim())),"coerce")}).option("exclude-tools",{...DEFAULT_COMMAND_OPTIONS["exclude-tools"],string:true,coerce:__name(tools=>tools.flatMap(tool=>tool.split(",").map(t2=>t2.trim())),"coerce")}).option("disabled-slash-commands",{...DEFAULT_COMMAND_OPTIONS["disabled-slash-commands"],string:true,coerce:__name(names=>names.flatMap(n=>n.split(",").map(t2=>t2.trim())),"coerce")}).option("auth-type",DEFAULT_COMMAND_OPTIONS["auth-type"]).fail((msg,err,yargs)=>{if(err instanceof FatalConfigError)throw err;writeStderrLine(msg||err?.message||"Unknown error");yargs.showHelp();process.exit(1)}).check(argv=>{const query=argv["query"];const hasPositionalQuery=Array.isArray(query)?query.length>0:!!query;if(argv["prompt"]&&hasPositionalQuery){return"Cannot use both a positional prompt and the --prompt (-p) flag together"}if(argv["prompt"]&&argv["promptInteractive"]){return"Cannot use both --prompt (-p) and --prompt-interactive (-i) together"}if(argv["yolo"]&&argv["approvalMode"]){return"Cannot use both --yolo (-y) and --approval-mode together. Use --approval-mode=yolo instead."}if(argv["includePartialMessages"]&&argv["outputFormat"]!=="stream-json"){return"--include-partial-messages requires --output-format stream-json"}if(argv["inputFormat"]==="stream-json"&&argv["outputFormat"]!=="stream-json"){return"--input-format stream-json requires --output-format stream-json"}if(argv["continue"]&&argv["resume"]){return"Cannot use both --continue and --resume together. Use --continue to resume the latest session, or --resume <sessionId> to resume a specific session."}const hasResume=argv["resume"]!==void 0;if(argv["sessionId"]&&(argv["continue"]||hasResume)){return"Cannot use --session-id with --continue or --resume. Use --session-id to start a new session with a specific ID, or use --continue/--resume to resume an existing session."}if(argv["forkSession"]&&!(argv["continue"]||hasResume)){return"--fork-session must be used with --resume or --continue."}if(argv["sandboxSessionId"]&&(argv["sessionId"]||argv["continue"]||argv["resume"])){return"Cannot use internal --sandbox-session-id with --session-id, --continue, or --resume."}if(argv["sessionId"]&&!isValidSessionId(argv["sessionId"])){return`Invalid --session-id: "${argv["sessionId"]}". Must be a valid UUID (e.g., "123e4567-e89b-12d3-a456-426614174000").`}if(argv["sandboxSessionId"]&&!isValidSessionId(argv["sandboxSessionId"])){return`Invalid --sandbox-session-id: "${argv["sandboxSessionId"]}". Must be a valid UUID (e.g., "123e4567-e89b-12d3-a456-426614174000").`}if(argv["jsonFd"]!=null&&argv["jsonFile"]!=null){return"--json-fd and --json-file are mutually exclusive. Use one or the other."}if(argv["jsonSchema"]){if(argv["promptInteractive"]){return"--json-schema cannot be used with --prompt-interactive (-i); structured output only terminates the non-interactive flow."}if(argv["inputFormat"]==="stream-json"){return'--json-schema cannot be used with --input-format stream-json; the "first structured_output call ends the session" contract is incompatible with the long-lived stream-json input protocol.'}if(argv["acp"]||argv["experimentalAcp"]){return"--json-schema cannot be used with --acp; structured output is only honoured by the headless non-interactive flow."}const hasPrompt=!!argv["prompt"];const query2=argv["query"];const hasPositionalQuery2=Array.isArray(query2)?query2.length>0:!!query2;const stdinIsPiped=!process.stdin.isTTY;if(!hasPrompt&&!hasPositionalQuery2&&!stdinIsPiped){return"--json-schema only applies to non-interactive mode; pass a prompt via -p, as a positional argument, or piped via stdin."}}return true})).command(mcpCommand).command(memoryCommand).command(extensionsCommand).command(authCommand).command(hooksCommand).command(channelCommand).command(boardCommand).command(serveCommand).command(daemonCommand).command(attachCommand).command(sessionsCommand).command(agentsCommand).command(batchCommand).command(updateCommand3).command(sandboxCommand);if(rawArgv.includes("review")){const{reviewCommand}=await import("./review-WX52IWJR.js");yargsInstance.command(reviewCommand)}if(rawArgv.includes("autofix-pr")){const{autofixPrCommand}=await import("./autofix-pr-NKR2VSLB.js");yargsInstance.command(autofixPrCommand)}for(const[option,message]of Object.entries(TOP_LEVEL_DEPRECATED_OPTIONS)){yargsInstance.deprecateOption(option,message)}yargsInstance.version(await getCliVersion()).alias("v","version").help().alias("h","help").strict().demandCommand(0,0).fail((message,error,parser)=>{if(error instanceof FatalConfigError)throw error;writeStderrLine(message||error?.message||"Unknown argument error");parser.showHelp();process.exit(1)});yargsInstance.wrap(yargsInstance.terminalWidth());const result=await yargsInstance.parse();if(result._.length>0&&(result._[0]==="mcp"||result._[0]==="memory"||result._[0]==="extensions"||result._[0]==="auth"||result._[0]==="hooks"||result._[0]==="channel"||result._[0]==="review"||result._[0]==="autofix-pr"||result._[0]==="sessions"||result._[0]==="daemon"||result._[0]==="attach"||result._[0]==="agents"||result._[0]==="board"||result._[0]==="batch"||result._[0]==="update"||result._[0]==="sandbox")){process.exit(process.exitCode??0)}const queryArg=result.query;const q=Array.isArray(queryArg)?queryArg.join(" "):queryArg;if(q&&!result["prompt"]){const hasExplicitInteractive=result["promptInteractive"]===""||!!result["promptInteractive"];if(hasExplicitInteractive){result["promptInteractive"]=q}else{result["prompt"]=q}}result["query"]=q||void 0;if(result["experimentalAcp"]){writeStderrLine("\x1B[33m\u26A0 Warning: --experimental-acp is deprecated and will be removed in a future release. Please use --acp instead.\x1B[0m");if(!result["acp"]){result["acp"]=true}}if((result["acp"]||result["experimentalAcp"])&&!result["channel"]){result["channel"]=resolveAcpChannelFallback()}return result}__name(parseArguments,"parseArguments");async function loadHierarchicalMemory(currentWorkingDirectory,includeDirectoriesToReadMemory=[],fileService,extensionContextFilePaths=[],folderTrust,memoryImportFormat="tree",contextRuleExcludes=[],options={}){const realCwd=fs6.realpathSync(path8.resolve(currentWorkingDirectory));const realHome=fs6.realpathSync(path8.resolve(homedir2()));const isHomeDirectory=realCwd===realHome;const effectiveCwd=isHomeDirectory?"":currentWorkingDirectory;return loadServerHierarchicalMemory(effectiveCwd,includeDirectoriesToReadMemory,fileService,extensionContextFilePaths,folderTrust,memoryImportFormat,contextRuleExcludes,options)}__name(loadHierarchicalMemory,"loadHierarchicalMemory");function resolveModelFallbacks(cliValues,settingValue){if(cliValues&&cliValues.length>0){return cliValues}if(settingValue&&settingValue.trim().length>0){return settingValue.split(",").map(s=>s.trim()).filter(Boolean)}return void 0}__name(resolveModelFallbacks,"resolveModelFallbacks");function resolveWebSearchSettings(settings){const webSearch=settings.tools?.webSearch;const envEnabled=process.env["ENABLE_WEB_SEARCH"]?.trim()||void 0;const enabled=envEnabled!==void 0?isTruthy(envEnabled):webSearch?.enabled;const model=process.env["WEB_SEARCH_MODEL"]?.trim()||webSearch?.model;const envExtractor=process.env["WEB_SEARCH_EXTRACTOR"]?.trim()||void 0;const webExtractor=envExtractor!==void 0?isTruthy(envExtractor):webSearch?.webExtractor;const envTimeoutMs=parsePositiveIntegerEnv(process.env["WEB_SEARCH_TIMEOUT_MS"],0);const timeoutMs=envTimeoutMs>0?envTimeoutMs:webSearch?.timeoutMs;const envMaxPerSession=parsePositiveIntegerEnv(process.env["WEB_SEARCH_MAX_PER_SESSION"],0);const maxPerSession=envMaxPerSession>0?envMaxPerSession:webSearch?.maxPerSession;const envAllowedHosts=(process.env["WEB_SEARCH_ALLOWED_HOSTS"]??"").split(",").map(entry=>entry.trim()).filter(Boolean);const allowedHosts=envAllowedHosts.length>0?envAllowedHosts:webSearch?.allowedHosts;const baseUrl=process.env["WEB_SEARCH_BASE_URL"]?.trim()||void 0;const apiKeyEnv=baseUrl?process.env["WEB_SEARCH_API_KEY"]?.trim()?"WEB_SEARCH_API_KEY":"DASHSCOPE_API_KEY":void 0;if(enabled===void 0&&model===void 0&&webExtractor===void 0&&baseUrl===void 0&&timeoutMs===void 0&&maxPerSession===void 0&&allowedHosts===void 0){return void 0}return{enabled,model,webExtractor,baseUrl,allowedHosts,apiKeyEnv,timeoutMs,maxPerSession}}__name(resolveWebSearchSettings,"resolveWebSearchSettings");function resolveMaxWallTimeSeconds(argv,settings){if(argv.maxWallTime!==void 0&&argv.maxWallTime!==null){try{return parseDurationSeconds(String(argv.maxWallTime))}catch(err){throw new Error(`--max-wall-time: ${err.message}`)}}const fromSettings=settings.model?.maxWallTimeSeconds;if(typeof fromSettings==="number"){try{return validateMaxWallTimeSetting(fromSettings)}catch(err){throw new Error(`settings.json: ${err.message}`)}}return-1}__name(resolveMaxWallTimeSeconds,"resolveMaxWallTimeSeconds");function resolveGoalTokenBudget(settings){const fromSettings=settings.model?.goalTokenBudget;if(fromSettings===void 0)return void 0;try{return validateGoalTokenBudget(fromSettings)}catch(err){throw new Error(`settings.json: ${err.message}`)}}__name(resolveGoalTokenBudget,"resolveGoalTokenBudget");function resolveGoalMaxTurns(settings){const fromSettings=settings.model?.goalMaxTurns;if(fromSettings===void 0)return void 0;try{return validateGoalMaxTurns(fromSettings)}catch(err){throw new Error(`settings.json: ${err.message}`)}}__name(resolveGoalMaxTurns,"resolveGoalMaxTurns");function resolveGoalMaxActiveMinutes(settings){const fromSettings=settings.model?.goalMaxActiveMinutes;if(fromSettings===void 0)return void 0;try{return validateGoalMaxActiveMinutes(fromSettings)}catch(err){throw new Error(`settings.json: ${err.message}`)}}__name(resolveGoalMaxActiveMinutes,"resolveGoalMaxActiveMinutes");function resolveMaxToolCalls(argv,settings){if(argv.maxToolCalls!==void 0&&argv.maxToolCalls!==null){try{return validateMaxToolCalls(argv.maxToolCalls)}catch(err){throw new Error(`--max-tool-calls: ${err.message}`)}}const fromSettings=settings.model?.maxToolCalls;if(typeof fromSettings==="number"){try{return validateMaxToolCalls(fromSettings)}catch(err){throw new Error(`settings.json: ${err.message}`)}}return-1}__name(resolveMaxToolCalls,"resolveMaxToolCalls");function resolveMaxSubagentDepth(argv,settings){const value=argv.maxSubagentDepth;if(value!==void 0&&value!==null){if(!Number.isInteger(value)||value<1||value>MAX_SUBAGENT_DEPTH_LIMIT){throw new Error(`--max-subagent-depth must be an integer between 1 and ${MAX_SUBAGENT_DEPTH_LIMIT}; got ${value}.`)}return value}return settings.model?.maxSubagentDepth}__name(resolveMaxSubagentDepth,"resolveMaxSubagentDepth");function resolveAdvisorModel(argv,settings){const raw=argv.advisor!==void 0?argv.advisor:settings.advisorModel;const trimmed=typeof raw==="string"?raw.trim():void 0;if(!trimmed||trimmed.toLowerCase()==="off")return void 0;return trimmed}__name(resolveAdvisorModel,"resolveAdvisorModel");function formatUnavailableAdvisorModelMessage(modelName,availableModelIds){const availableModelsLine=availableModelIds.length===0?"No models are configured.":`Configured models: ${availableModelIds.join(", ")}.`;return`Advisor model '${modelName}' is not configured.
|
|
41
|
+
`;const handle=await executeSandbox(policy,{executable:fs5.realpathSync(getJsInterpreterCommand(import.meta.url).command),args:["-e",program,inside,outside],cwd:policy.workspace,env:{PATH:"/usr/bin:/bin"}},()=>{},AbortSignal.any([controller.signal,AbortSignal.timeout(1e4)]));const result=await handle.result;if(result.error||result.exitCode!==0)throw result.error??new Error(result.output||"Verification payload failed.");const observed=JSON.parse(result.output);const checks=[["workspace policy",observed["inside"]===(policy.filesystem==="workspace-write"?"allowed":policy.effectiveBackend==="landlock"?"EACCES":"EROFS")],["host-writable outside file denied",observed["outside"]===(policy.effectiveBackend==="landlock"?"EACCES":"EROFS")&&fs5.readFileSync(outside,"utf8")==="unchanged"],[policy.effectiveBackend==="landlock"?"shared PID namespace (Landlock boundary)":"private PID namespace",typeof observed["pid"]==="string"&&(policy.effectiveBackend==="landlock"?observed["pid"]===hostPid:observed["pid"]!==hostPid)],["command network namespace",typeof observed["net"]==="string"&&(policy.network==="closed"?observed["net"]!==hostNet:observed["net"]===hostNet)]];for(const[name,passed]of checks)report(`${passed?"PASS":"FAIL"} ${name}`);if(checks.some(([,passed])=>!passed))throw new Error("Confinement verification failed.");report(`Confinement verified (${checks.length} checks).`)}finally{if(fixture)fs5.rmSync(fixture,{recursive:true,force:true})}}catch(error){const{FatalError}=await import("./errors-UBMHQZVX.js");if(error instanceof FatalError){writeStderrLine2(error.message);process.exitCode=error.exitCode;return}writeStderrLine2(`Sandbox unavailable: ${error instanceof Error?error.message:String(error)}`);process.exitCode=controller.signal.aborted?cancellationExitCode:1}finally{process.removeListener("SIGINT",interrupt);process.removeListener("SIGTERM",terminate)}},"handler")};init_esbuild_shims();function resolvesToSameModel(modelName,selector,context){if(!modelName||!selector)return false;try{const resolved=resolveModelId(modelName.split("\0")[0],{...context,fastModel:void 0});return resolved?.modelId===selector.modelId&&resolved?.authType===selector.authType}catch{return false}}__name(resolvesToSameModel,"resolvesToSameModel");function allowsFastOnlyAdvisorModel(modelName,selector,context){return modelName==="fast"||resolvesToSameModel(context.fastModel,selector,context)}__name(allowsFastOnlyAdvisorModel,"allowsFastOnlyAdvisorModel");function isAdvisorModelEligible(model,allowFastOnly=false){return(allowFastOnly||!model.fastOnly)&&!model.voiceOnly&&!model.visionOnly&&!model.imageOnly}__name(isAdvisorModelEligible,"isAdvisorModelEligible");function checkAdvisorModelAvailability(config,modelName,fallbackContext={}){const runtimeContext=buildModelIdContext(config);const context={...runtimeContext,fastModel:runtimeContext.fastModel??fallbackContext.fastModel,currentModel:runtimeContext.currentModel??fallbackContext.currentModel,currentAuthType:runtimeContext.currentAuthType??fallbackContext.currentAuthType};const endpointIndex=modelName.indexOf("\0");const modelSelector=endpointIndex<0?modelName:modelName.slice(0,endpointIndex);const registryBaseUrl=endpointIndex<0?void 0:modelName.slice(endpointIndex+1)||null;let selector;try{if(modelSelector.trim()==="inherit"){throw new Error("Advisor cannot inherit the executor model.")}selector=resolveModelId(modelSelector,context)}catch{selector=void 0}const allowFastOnly=allowsFastOnlyAdvisorModel(modelSelector,selector,context);const configuredModels=config.getAllConfiguredModels(selector?.authType?[selector.authType]:void 0);const availableModels=configuredModels.filter(model=>isAdvisorModelEligible(model,allowFastOnly)&&(registryBaseUrl===void 0||!model.isRuntimeModel&&(model.registryBaseUrl??null)===registryBaseUrl));const uncapturedRuntimeModelId=registryBaseUrl===void 0&&selector!==void 0&&selector.modelId===context.currentModel&&selector.authType===context.currentAuthType&&!configuredModels.some(model=>model.id===selector.modelId&&model.authType===selector.authType)?selector.modelId:void 0;const availableModelIds=new Set(availableModels.map(model=>model.id));if(uncapturedRuntimeModelId){availableModelIds.add(uncapturedRuntimeModelId)}return{available:selector!==void 0&&(uncapturedRuntimeModelId!==void 0||availableModels.some(model=>model.id===selector.modelId)),availableModelIds:Array.from(availableModelIds)}}__name(checkAdvisorModelAvailability,"checkAdvisorModelAvailability");var debugLogger2=createDebugLogger("CONFIG");function resolveLocaleForExtensions(settings){const envLang=process.env["QWEN_CODE_LANG"];if(envLang)return envLang;const settingsLang=settings.general?.language;if(settingsLang&&settingsLang!=="auto")return settingsLang;return detectSystemLanguage()}__name(resolveLocaleForExtensions,"resolveLocaleForExtensions");var SKILL_LEVELS=["project","user","extension","bundled"];function isSkillLevel(value){return SKILL_LEVELS.includes(value)}__name(isSkillLevel,"isSkillLevel");function schemaRootAcceptsObject(schema,isRoot=true){if(isRoot&&typeof schema["$ref"]==="string"){return false}const rawType=schema["type"];const typeIncludesObject=rawType!==void 0&&(Array.isArray(rawType)?rawType:[rawType]).includes("object");if(rawType!==void 0&&!typeIncludesObject){return false}if("const"in schema){const constVal=schema["const"];if(typeof constVal!=="object"||constVal===null||Array.isArray(constVal)){return false}}const enumVal=schema["enum"];if(Array.isArray(enumVal)){const anyObjectMember=enumVal.some(v=>typeof v==="object"&&v!==null&&!Array.isArray(v));if(!anyObjectMember)return false}const variantAcceptsObject=__name(v=>{if(v===true)return true;if(v===false)return false;if(typeof v==="object"&&v!==null&&!Array.isArray(v)){return schemaRootAcceptsObject(v,false)}return false},"variantAcceptsObject");for(const key of["anyOf","oneOf"]){const variants=schema[key];if(Array.isArray(variants)){if(variants.length===0)return false;if(!variants.some(variantAcceptsObject))return false}}const allOf=schema["allOf"];if(Array.isArray(allOf)&&allOf.length>0){if(!allOf.every(variantAcceptsObject))return false}const notSchema=schema["not"];if(typeof notSchema==="object"&¬Schema!==null&&!Array.isArray(notSchema)){const notRecord=notSchema;const notType=notRecord["type"];if(notType!==void 0){const types=Array.isArray(notType)?notType:[notType];if(types.includes("object")&&Object.keys(notRecord).length===1){return false}}}if("if"in schema){const ifSchema=schema["if"];if(ifSchema===true){const thenSchema=schema["then"];if(thenSchema!==void 0&&!variantAcceptsObject(thenSchema)){return false}}else if(ifSchema===false){const elseSchema=schema["else"];if(elseSchema!==void 0&&!variantAcceptsObject(elseSchema)){return false}}}return true}__name(schemaRootAcceptsObject,"schemaRootAcceptsObject");var MAX_JSON_SCHEMA_FILE_BYTES=4*1024*1024;function resolveJsonSchemaArg(raw){if(raw===void 0){return void 0}const trimmed=raw.trim();if(trimmed.length===0){throw new FatalConfigError("--json-schema cannot be empty.")}let payload;let payloadSource="inline";let payloadSourcePath;if(trimmed.startsWith("@")){const resolvedPath=resolvePath(trimmed.slice(1));payloadSource="file";payloadSourcePath=resolvedPath;try{const stat2=fs6.statSync(resolvedPath);if(!stat2.isFile()){throw new FatalConfigError(`--json-schema "@${resolvedPath}" must be a regular file.`)}if(stat2.size>MAX_JSON_SCHEMA_FILE_BYTES){throw new FatalConfigError(`--json-schema file "${resolvedPath}" is ${stat2.size} bytes (>${MAX_JSON_SCHEMA_FILE_BYTES}). Refusing to read; this is almost certainly a wrong-path argument. Schemas should be small enough to fit in a few KiB; decompose with \`$ref\` if you need a large family of types.`)}payload=fs6.readFileSync(resolvedPath,"utf8")}catch(err){if(err instanceof FatalConfigError)throw err;throw new FatalConfigError(`--json-schema could not read "${resolvedPath}": ${err instanceof Error?err.message:String(err)}`)}}else{payload=trimmed}let parsed;try{parsed=JSON.parse(payload)}catch(err){if(payloadSource==="file"){throw new FatalConfigError(`--json-schema content of "${payloadSourcePath}" is not valid JSON.`)}throw new FatalConfigError(`--json-schema is not valid JSON: ${err instanceof Error?err.message:String(err)}`)}if(typeof parsed!=="object"||parsed===null||Array.isArray(parsed)){throw new FatalConfigError("--json-schema must be a JSON object describing a schema.")}if(!schemaRootAcceptsObject(parsed)){throw new FatalConfigError('--json-schema root must accept object-typed values (tool parameters are always JSON objects). At least one branch of a root anyOf/oneOf must be satisfiable by an object, and a root `type` (when present) must include "object".')}const compileError=SchemaValidator.compileStrict(parsed);if(compileError){throw new FatalConfigError(`--json-schema is not a valid JSON Schema: ${compileError}`)}return parsed}__name(resolveJsonSchemaArg,"resolveJsonSchemaArg");function normalizeOutputFormat(format){if(!format){return void 0}if(format==="stream-json"){return"stream-json"}if(format==="json"||format==="json"){return"json"}return"text"}__name(normalizeOutputFormat,"normalizeOutputFormat");async function parseArguments(){let rawArgv=hideBin(process.argv);if(rawArgv.length>0&&(rawArgv[0].endsWith("/dist/qwen-cli/cli.js")||rawArgv[0].endsWith("/dist/cli.js")||rawArgv[0].endsWith("/dist/cli/cli.js"))){rawArgv=rawArgv.slice(1)}const yargsInstance=yargs_default(rawArgv).locale("en").scriptName("qwen").usage(TOP_LEVEL_USAGE).option("telemetry",TOP_LEVEL_GLOBAL_OPTIONS.telemetry).option("telemetry-target",TOP_LEVEL_GLOBAL_OPTIONS["telemetry-target"]).option("telemetry-otlp-endpoint",TOP_LEVEL_GLOBAL_OPTIONS["telemetry-otlp-endpoint"]).option("telemetry-otlp-protocol",TOP_LEVEL_GLOBAL_OPTIONS["telemetry-otlp-protocol"]).option("telemetry-log-prompts",TOP_LEVEL_GLOBAL_OPTIONS["telemetry-log-prompts"]).option("telemetry-outfile",TOP_LEVEL_GLOBAL_OPTIONS["telemetry-outfile"]).option("debug",TOP_LEVEL_GLOBAL_OPTIONS.debug).option("bare",TOP_LEVEL_GLOBAL_OPTIONS.bare).option("safe-mode",TOP_LEVEL_GLOBAL_OPTIONS["safe-mode"]).option("proxy",TOP_LEVEL_GLOBAL_OPTIONS.proxy).option("insecure",TOP_LEVEL_GLOBAL_OPTIONS.insecure).option("chat-recording",TOP_LEVEL_GLOBAL_OPTIONS["chat-recording"]).command(DEFAULT_COMMAND,DEFAULT_COMMAND_DESC,yargsInstance2=>yargsInstance2.positional("query",QUERY_POSITIONAL).option("model",DEFAULT_COMMAND_OPTIONS.model).option("advisor",DEFAULT_COMMAND_OPTIONS.advisor).option("fallback-model",{...DEFAULT_COMMAND_OPTIONS["fallback-model"],string:true,coerce:__name(models=>models.flatMap(m=>m.split(",").map(s=>s.trim())).filter(Boolean),"coerce")}).option("prompt",DEFAULT_COMMAND_OPTIONS.prompt).option("prompt-interactive",DEFAULT_COMMAND_OPTIONS["prompt-interactive"]).option("system-prompt",DEFAULT_COMMAND_OPTIONS["system-prompt"]).option("append-system-prompt",DEFAULT_COMMAND_OPTIONS["append-system-prompt"]).option("output-style",DEFAULT_COMMAND_OPTIONS["output-style"]).option("sandbox",DEFAULT_COMMAND_OPTIONS.sandbox).middleware(argv=>{if(argv["sandbox"]==="bwrap")throw new FatalConfigError(BWRAP_MIGRATION_MESSAGE)},true).option("sandbox-image",DEFAULT_COMMAND_OPTIONS["sandbox-image"]).option("yolo",DEFAULT_COMMAND_OPTIONS.yolo).option("approval-mode",DEFAULT_COMMAND_OPTIONS["approval-mode"]).option("acp",DEFAULT_COMMAND_OPTIONS.acp).option("experimental-acp",{type:"boolean",description:"Starts the agent in ACP mode (deprecated, use --acp instead)",hidden:true}).option("acp-execution-engine",{type:"string",choices:["managed"],description:"Private to qwen serve: the execution engine this ACP host runs",hidden:true}).option("experimental-skills",{type:"boolean",description:"Deprecated: Skills are now enabled by default. This flag is ignored.",hidden:true}).option("experimental-lsp",DEFAULT_COMMAND_OPTIONS["experimental-lsp"]).option("restore-ask-user-question",DEFAULT_COMMAND_OPTIONS["restore-ask-user-question"]).option("channel",DEFAULT_COMMAND_OPTIONS.channel).option("allowed-mcp-server-names",{...DEFAULT_COMMAND_OPTIONS["allowed-mcp-server-names"],string:true,coerce:__name(mcpServerNames=>mcpServerNames.flatMap(mcpServerName=>mcpServerName.split(",").map(m=>m.trim())),"coerce")}).option("disable-mcp-server",{...DEFAULT_COMMAND_OPTIONS["disable-mcp-server"],string:true,coerce:__name(disabledServerNames=>disabledServerNames.flatMap(disabledServerName=>disabledServerName.split(",").map(m=>m.trim())),"coerce")}).option("mcp-config",DEFAULT_COMMAND_OPTIONS["mcp-config"]).option("allowed-tools",{...DEFAULT_COMMAND_OPTIONS["allowed-tools"],string:true,coerce:__name(tools=>tools.flatMap(tool=>tool.split(",").map(t2=>t2.trim())),"coerce")}).option("extensions",{...DEFAULT_COMMAND_OPTIONS.extensions,string:true,coerce:__name(extensions=>extensions.flatMap(extension=>extension.split(",").map(e=>e.trim())),"coerce")}).option("list-extensions",DEFAULT_COMMAND_OPTIONS["list-extensions"]).option("include-directories",{...DEFAULT_COMMAND_OPTIONS["include-directories"],string:true,coerce:__name(dirs=>dirs.flatMap(dir=>dir.split(",").map(d=>d.trim())),"coerce")}).option("openai-logging",DEFAULT_COMMAND_OPTIONS["openai-logging"]).option("openai-logging-dir",DEFAULT_COMMAND_OPTIONS["openai-logging-dir"]).option("openai-api-key",DEFAULT_COMMAND_OPTIONS["openai-api-key"]).option("openai-base-url",DEFAULT_COMMAND_OPTIONS["openai-base-url"]).option("screen-reader",DEFAULT_COMMAND_OPTIONS["screen-reader"]).option("input-format",DEFAULT_COMMAND_OPTIONS["input-format"]).option("output-format",DEFAULT_COMMAND_OPTIONS["output-format"]).option("include-partial-messages",DEFAULT_COMMAND_OPTIONS["include-partial-messages"]).option("json-fd",DEFAULT_COMMAND_OPTIONS["json-fd"]).option("json-file",DEFAULT_COMMAND_OPTIONS["json-file"]).option("json-schema",DEFAULT_COMMAND_OPTIONS["json-schema"]).option("input-file",DEFAULT_COMMAND_OPTIONS["input-file"]).option("continue",DEFAULT_COMMAND_OPTIONS.continue).option("resume",DEFAULT_COMMAND_OPTIONS.resume).option("session-id",DEFAULT_COMMAND_OPTIONS["session-id"]).option("fork-session",DEFAULT_COMMAND_OPTIONS["fork-session"]).option("sandbox-session-id",{type:"string",hidden:true}).option("worktree",DEFAULT_COMMAND_OPTIONS.worktree).option("max-session-turns",DEFAULT_COMMAND_OPTIONS["max-session-turns"]).option("max-wall-time",DEFAULT_COMMAND_OPTIONS["max-wall-time"]).option("max-tool-calls",DEFAULT_COMMAND_OPTIONS["max-tool-calls"]).option("max-subagent-depth",DEFAULT_COMMAND_OPTIONS["max-subagent-depth"]).option("core-tools",{...DEFAULT_COMMAND_OPTIONS["core-tools"],string:true,coerce:__name(tools=>tools.flatMap(tool=>tool.split(",").map(t2=>t2.trim())),"coerce")}).option("exclude-tools",{...DEFAULT_COMMAND_OPTIONS["exclude-tools"],string:true,coerce:__name(tools=>tools.flatMap(tool=>tool.split(",").map(t2=>t2.trim())),"coerce")}).option("disabled-slash-commands",{...DEFAULT_COMMAND_OPTIONS["disabled-slash-commands"],string:true,coerce:__name(names=>names.flatMap(n=>n.split(",").map(t2=>t2.trim())),"coerce")}).option("auth-type",DEFAULT_COMMAND_OPTIONS["auth-type"]).fail((msg,err,yargs)=>{if(err instanceof FatalConfigError)throw err;writeStderrLine(msg||err?.message||"Unknown error");yargs.showHelp();process.exit(1)}).check(argv=>{const query=argv["query"];const hasPositionalQuery=Array.isArray(query)?query.length>0:!!query;if(argv["prompt"]&&hasPositionalQuery){return"Cannot use both a positional prompt and the --prompt (-p) flag together"}if(argv["prompt"]&&argv["promptInteractive"]){return"Cannot use both --prompt (-p) and --prompt-interactive (-i) together"}if(argv["yolo"]&&argv["approvalMode"]){return"Cannot use both --yolo (-y) and --approval-mode together. Use --approval-mode=yolo instead."}if(argv["includePartialMessages"]&&argv["outputFormat"]!=="stream-json"){return"--include-partial-messages requires --output-format stream-json"}if(argv["inputFormat"]==="stream-json"&&argv["outputFormat"]!=="stream-json"){return"--input-format stream-json requires --output-format stream-json"}if(argv["continue"]&&argv["resume"]){return"Cannot use both --continue and --resume together. Use --continue to resume the latest session, or --resume <sessionId> to resume a specific session."}const hasResume=argv["resume"]!==void 0;if(argv["sessionId"]&&(argv["continue"]||hasResume)){return"Cannot use --session-id with --continue or --resume. Use --session-id to start a new session with a specific ID, or use --continue/--resume to resume an existing session."}if(argv["forkSession"]&&!(argv["continue"]||hasResume)){return"--fork-session must be used with --resume or --continue."}if(argv["sandboxSessionId"]&&(argv["sessionId"]||argv["continue"]||argv["resume"])){return"Cannot use internal --sandbox-session-id with --session-id, --continue, or --resume."}if(argv["sessionId"]&&!isValidSessionId(argv["sessionId"])){return`Invalid --session-id: "${argv["sessionId"]}". Must be a valid UUID (e.g., "123e4567-e89b-12d3-a456-426614174000").`}if(argv["sandboxSessionId"]&&!isValidSessionId(argv["sandboxSessionId"])){return`Invalid --sandbox-session-id: "${argv["sandboxSessionId"]}". Must be a valid UUID (e.g., "123e4567-e89b-12d3-a456-426614174000").`}if(argv["jsonFd"]!=null&&argv["jsonFile"]!=null){return"--json-fd and --json-file are mutually exclusive. Use one or the other."}if(argv["jsonSchema"]){if(argv["promptInteractive"]){return"--json-schema cannot be used with --prompt-interactive (-i); structured output only terminates the non-interactive flow."}if(argv["inputFormat"]==="stream-json"){return'--json-schema cannot be used with --input-format stream-json; the "first structured_output call ends the session" contract is incompatible with the long-lived stream-json input protocol.'}if(argv["acp"]||argv["experimentalAcp"]){return"--json-schema cannot be used with --acp; structured output is only honoured by the headless non-interactive flow."}const hasPrompt=!!argv["prompt"];const query2=argv["query"];const hasPositionalQuery2=Array.isArray(query2)?query2.length>0:!!query2;const stdinIsPiped=!process.stdin.isTTY;if(!hasPrompt&&!hasPositionalQuery2&&!stdinIsPiped){return"--json-schema only applies to non-interactive mode; pass a prompt via -p, as a positional argument, or piped via stdin."}}return true})).command(mcpCommand).command(memoryCommand).command(extensionsCommand).command(authCommand).command(hooksCommand).command(channelCommand).command(boardCommand).command(serveCommand).command(daemonCommand).command(attachCommand).command(sessionsCommand).command(agentsCommand).command(batchCommand).command(updateCommand3).command(sandboxCommand);if(rawArgv.includes("review")){const{reviewCommand}=await import("./review-4B64XTCL.js");yargsInstance.command(reviewCommand)}if(rawArgv.includes("autofix-pr")){const{autofixPrCommand}=await import("./autofix-pr-U7GNSH27.js");yargsInstance.command(autofixPrCommand)}for(const[option,message]of Object.entries(TOP_LEVEL_DEPRECATED_OPTIONS)){yargsInstance.deprecateOption(option,message)}yargsInstance.version(await getCliVersion()).alias("v","version").help().alias("h","help").strict().demandCommand(0,0).fail((message,error,parser)=>{if(error instanceof FatalConfigError)throw error;writeStderrLine(message||error?.message||"Unknown argument error");parser.showHelp();process.exit(1)});yargsInstance.wrap(yargsInstance.terminalWidth());const result=await yargsInstance.parse();if(result._.length>0&&(result._[0]==="mcp"||result._[0]==="memory"||result._[0]==="extensions"||result._[0]==="auth"||result._[0]==="hooks"||result._[0]==="channel"||result._[0]==="review"||result._[0]==="autofix-pr"||result._[0]==="sessions"||result._[0]==="daemon"||result._[0]==="attach"||result._[0]==="agents"||result._[0]==="board"||result._[0]==="batch"||result._[0]==="update"||result._[0]==="sandbox")){process.exit(process.exitCode??0)}const queryArg=result.query;const q=Array.isArray(queryArg)?queryArg.join(" "):queryArg;if(q&&!result["prompt"]){const hasExplicitInteractive=result["promptInteractive"]===""||!!result["promptInteractive"];if(hasExplicitInteractive){result["promptInteractive"]=q}else{result["prompt"]=q}}result["query"]=q||void 0;if(result["experimentalAcp"]){writeStderrLine("\x1B[33m\u26A0 Warning: --experimental-acp is deprecated and will be removed in a future release. Please use --acp instead.\x1B[0m");if(!result["acp"]){result["acp"]=true}}if((result["acp"]||result["experimentalAcp"])&&!result["channel"]){result["channel"]=resolveAcpChannelFallback()}return result}__name(parseArguments,"parseArguments");async function loadHierarchicalMemory(currentWorkingDirectory,includeDirectoriesToReadMemory=[],fileService,extensionContextFilePaths=[],folderTrust,memoryImportFormat="tree",contextRuleExcludes=[],options={}){const realCwd=fs6.realpathSync(path8.resolve(currentWorkingDirectory));const realHome=fs6.realpathSync(path8.resolve(homedir2()));const isHomeDirectory=realCwd===realHome;const effectiveCwd=isHomeDirectory?"":currentWorkingDirectory;return loadServerHierarchicalMemory(effectiveCwd,includeDirectoriesToReadMemory,fileService,extensionContextFilePaths,folderTrust,memoryImportFormat,contextRuleExcludes,options)}__name(loadHierarchicalMemory,"loadHierarchicalMemory");function resolveModelFallbacks(cliValues,settingValue){if(cliValues&&cliValues.length>0){return cliValues}if(settingValue&&settingValue.trim().length>0){return settingValue.split(",").map(s=>s.trim()).filter(Boolean)}return void 0}__name(resolveModelFallbacks,"resolveModelFallbacks");function resolveWebSearchSettings(settings){const webSearch=settings.tools?.webSearch;const envEnabled=process.env["ENABLE_WEB_SEARCH"]?.trim()||void 0;const enabled=envEnabled!==void 0?isTruthy(envEnabled):webSearch?.enabled;const model=process.env["WEB_SEARCH_MODEL"]?.trim()||webSearch?.model;const envExtractor=process.env["WEB_SEARCH_EXTRACTOR"]?.trim()||void 0;const webExtractor=envExtractor!==void 0?isTruthy(envExtractor):webSearch?.webExtractor;const envTimeoutMs=parsePositiveIntegerEnv(process.env["WEB_SEARCH_TIMEOUT_MS"],0);const timeoutMs=envTimeoutMs>0?envTimeoutMs:webSearch?.timeoutMs;const envMaxPerSession=parsePositiveIntegerEnv(process.env["WEB_SEARCH_MAX_PER_SESSION"],0);const maxPerSession=envMaxPerSession>0?envMaxPerSession:webSearch?.maxPerSession;const envAllowedHosts=(process.env["WEB_SEARCH_ALLOWED_HOSTS"]??"").split(",").map(entry=>entry.trim()).filter(Boolean);const allowedHosts=envAllowedHosts.length>0?envAllowedHosts:webSearch?.allowedHosts;const baseUrl=process.env["WEB_SEARCH_BASE_URL"]?.trim()||void 0;const apiKeyEnv=baseUrl?process.env["WEB_SEARCH_API_KEY"]?.trim()?"WEB_SEARCH_API_KEY":"DASHSCOPE_API_KEY":void 0;if(enabled===void 0&&model===void 0&&webExtractor===void 0&&baseUrl===void 0&&timeoutMs===void 0&&maxPerSession===void 0&&allowedHosts===void 0){return void 0}return{enabled,model,webExtractor,baseUrl,allowedHosts,apiKeyEnv,timeoutMs,maxPerSession}}__name(resolveWebSearchSettings,"resolveWebSearchSettings");function resolveMaxWallTimeSeconds(argv,settings){if(argv.maxWallTime!==void 0&&argv.maxWallTime!==null){try{return parseDurationSeconds(String(argv.maxWallTime))}catch(err){throw new Error(`--max-wall-time: ${err.message}`)}}const fromSettings=settings.model?.maxWallTimeSeconds;if(typeof fromSettings==="number"){try{return validateMaxWallTimeSetting(fromSettings)}catch(err){throw new Error(`settings.json: ${err.message}`)}}return-1}__name(resolveMaxWallTimeSeconds,"resolveMaxWallTimeSeconds");function resolveGoalTokenBudget(settings){const fromSettings=settings.model?.goalTokenBudget;if(fromSettings===void 0)return void 0;try{return validateGoalTokenBudget(fromSettings)}catch(err){throw new Error(`settings.json: ${err.message}`)}}__name(resolveGoalTokenBudget,"resolveGoalTokenBudget");function resolveGoalMaxTurns(settings){const fromSettings=settings.model?.goalMaxTurns;if(fromSettings===void 0)return void 0;try{return validateGoalMaxTurns(fromSettings)}catch(err){throw new Error(`settings.json: ${err.message}`)}}__name(resolveGoalMaxTurns,"resolveGoalMaxTurns");function resolveGoalMaxActiveMinutes(settings){const fromSettings=settings.model?.goalMaxActiveMinutes;if(fromSettings===void 0)return void 0;try{return validateGoalMaxActiveMinutes(fromSettings)}catch(err){throw new Error(`settings.json: ${err.message}`)}}__name(resolveGoalMaxActiveMinutes,"resolveGoalMaxActiveMinutes");function resolveMaxToolCalls(argv,settings){if(argv.maxToolCalls!==void 0&&argv.maxToolCalls!==null){try{return validateMaxToolCalls(argv.maxToolCalls)}catch(err){throw new Error(`--max-tool-calls: ${err.message}`)}}const fromSettings=settings.model?.maxToolCalls;if(typeof fromSettings==="number"){try{return validateMaxToolCalls(fromSettings)}catch(err){throw new Error(`settings.json: ${err.message}`)}}return-1}__name(resolveMaxToolCalls,"resolveMaxToolCalls");function resolveMaxSubagentDepth(argv,settings){const value=argv.maxSubagentDepth;if(value!==void 0&&value!==null){if(!Number.isInteger(value)||value<1||value>MAX_SUBAGENT_DEPTH_LIMIT){throw new Error(`--max-subagent-depth must be an integer between 1 and ${MAX_SUBAGENT_DEPTH_LIMIT}; got ${value}.`)}return value}return settings.model?.maxSubagentDepth}__name(resolveMaxSubagentDepth,"resolveMaxSubagentDepth");function resolveAdvisorModel(argv,settings){const raw=argv.advisor!==void 0?argv.advisor:settings.advisorModel;const trimmed=typeof raw==="string"?raw.trim():void 0;if(!trimmed||trimmed.toLowerCase()==="off")return void 0;return trimmed}__name(resolveAdvisorModel,"resolveAdvisorModel");function formatUnavailableAdvisorModelMessage(modelName,availableModelIds){const availableModelsLine=availableModelIds.length===0?"No models are configured.":`Configured models: ${availableModelIds.join(", ")}.`;return`Advisor model '${modelName}' is not configured.
|
|
42
42
|
${availableModelsLine}
|
|
43
|
-
Configure models in settings.modelProviders and ensure the required environment variables are set. In interactive mode, run /advisor without arguments to choose from configured models.`}__name(formatUnavailableAdvisorModelMessage,"formatUnavailableAdvisorModelMessage");function validateCliAdvisorModel(config,rawModel,startupContext){const modelName=rawModel.trim();if(!modelName||modelName.toLowerCase()==="off")return;const availability=checkAdvisorModelAvailability(config,modelName,startupContext);if(!availability.available){throw new FatalConfigError(formatUnavailableAdvisorModelMessage(modelName,availability.availableModelIds))}}__name(validateCliAdvisorModel,"validateCliAdvisorModel");function isDebugMode(argv){if(argv.debug)return true;const debugVal=process.env["DEBUG"];const debugModeVal=process.env["DEBUG_MODE"];return debugVal==="true"||debugVal==="1"||debugModeVal==="true"||debugModeVal==="1"}__name(isDebugMode,"isDebugMode");function validateMcpServerConfig(config){if(typeof config!=="object"||config===null||Array.isArray(config)){return false}return Object.values(config).every(server=>typeof server==="object"&&server!==null)}__name(validateMcpServerConfig,"validateMcpServerConfig");function parseMcpConfig(mcpConfigArg){if(!mcpConfigArg){return null}try{let parsed;if(fs6.existsSync(mcpConfigArg)){debugLogger2.debug(`Reading MCP config from file: ${mcpConfigArg}`);const content=fs6.readFileSync(mcpConfigArg,"utf-8");parsed=JSON.parse((0,import_strip_json_comments.default)(stripUtf8Bom(content)))}else{debugLogger2.debug("Parsing MCP config as JSON string");parsed=JSON.parse(mcpConfigArg)}let servers;if(typeof parsed==="object"&&parsed!==null&&"mcpServers"in parsed&&typeof parsed.mcpServers==="object"){servers=parsed.mcpServers}else{servers=parsed}if(!validateMcpServerConfig(servers)){throw new Error("Invalid MCP server configuration format. Expected an object with server names as keys.")}debugLogger2.debug(`Loaded ${Object.keys(servers).length} MCP server(s) from --mcp-config`);return servers}catch(error){const errorMessage=error instanceof Error?error.message:String(error);throw new FatalConfigError(`Invalid MCP configuration provided via --mcp-config: ${errorMessage}`)}}__name(parseMcpConfig,"parseMcpConfig");function buildDisabledSkillNamesProvider(loadedSettings){return()=>resolveSkillSettings(loadedSettings).disabledNames}__name(buildDisabledSkillNamesProvider,"buildDisabledSkillNamesProvider");function assertKnownOmniSettingKeys(settings){const omni=settings.omni;if(omni===void 0||omni===null||typeof omni!=="object")return;const schemaOmni=getSettingsSchema()["omni"];if(Object.keys(schemaOmni?.properties??{}).length===0)return;const walk=__name((value,schemaNode,label)=>{if(value===null||typeof value!=="object"||Array.isArray(value)){return}const props=schemaNode?.properties;if(!props||Object.keys(props).length===0)return;const allowed=new Set(Object.keys(props));const unknown=Object.keys(value).filter(key=>!allowed.has(key));if(unknown.length>0){throw new Error(`Invalid settings: unknown key(s) under "${label}": ${unknown.map(k=>`"${k}"`).join(", ")}. Allowed: ${[...allowed].sort().join(", ")}. An unrecognized ${label} entry would be silently ignored, leaving the session running with defaults instead of your configuration.`)}for(const[key,child]of Object.entries(value)){walk(child,props[key],`${label}.${key}`)}},"walk");walk(omni,schemaOmni,"omni")}__name(assertKnownOmniSettingKeys,"assertKnownOmniSettingKeys");function buildEnabledSkillNamesProvider(loadedSettings){return()=>resolveSkillSettings(loadedSettings).enabledNames}__name(buildEnabledSkillNamesProvider,"buildEnabledSkillNamesProvider");function buildSkillSettingsListsProvider(merged){return()=>({enabled:normalizeSkillNames(merged.skills?.enabled),defaultDisabled:normalizeSkillNames(merged.skills?.defaultDisabled),hardDisabled:normalizeSkillNames(merged.skills?.disabled)})}__name(buildSkillSettingsListsProvider,"buildSkillSettingsListsProvider");var SessionIdConflictError=class extends Error{static{__name(this,"SessionIdConflictError")}sessionId;constructor(sessionId,message){super(message);this.name="SessionIdConflictError";this.sessionId=sessionId}};function normalizeModelProposedGoals(value){return value==="alwaysAsk"||value==="disabled"?value:void 0}__name(normalizeModelProposedGoals,"normalizeModelProposedGoals");function resolveOutputStyle(argvStyle,settingsStyle,available=BUILT_IN_OUTPUT_STYLES){let flagValue=argvStyle;if(Array.isArray(argvStyle)&&argvStyle.length>0){flagValue=argvStyle[argvStyle.length-1];warnAboutOutputStyle(`--output-style was given ${argvStyle.length} times; using the last value.`)}const flagName=typeof flagValue==="string"?sanitizeOutputStyleName(flagValue):void 0;const flagGiven=flagValue!==void 0&&flagValue!==null&&flagName!=="";const raw=flagGiven?flagValue:settingsStyle;if(raw===void 0||raw===null){return void 0}const source=flagGiven?"--output-style":"general.outputStyle";if(typeof raw!=="string"){warnAboutOutputStyle(`Invalid output style value (from ${source}): expected a string, got ${Array.isArray(raw)?"an array":typeof raw}; using the default style.`);return void 0}const name=flagGiven&&flagName!==void 0?flagName:sanitizeOutputStyleName(raw);if(!name||name.toLowerCase()==="default"){return void 0}const style=findOutputStyle(available,name);if(style){return style}const known=available.map(s=>s.name).join(", ");warnAboutOutputStyle(`Unknown output style "${truncateForDisplay(name)}" (from ${source}); using the default style. Available styles: ${known}.`);return void 0}__name(resolveOutputStyle,"resolveOutputStyle");var OUTPUT_STYLE_NAME_ECHO_LIMIT=64;function sanitizeOutputStyleName(raw){return stripAnsiAndControl(raw).replace(new RegExp("\\p{Cf}","gu"),"").trim()}__name(sanitizeOutputStyleName,"sanitizeOutputStyleName");function truncateForDisplay(name){return name.length>OUTPUT_STYLE_NAME_ECHO_LIMIT?`${name.slice(0,OUTPUT_STYLE_NAME_ECHO_LIMIT)}\u2026`:name}__name(truncateForDisplay,"truncateForDisplay");var outputStyleWarningsShown=new Set;function warnAboutOutputStyle(warning){if(outputStyleWarningsShown.has(warning)){return}outputStyleWarningsShown.add(warning);debugLogger2.warn(warning);console.error(`WARNING: ${warning}`)}__name(warnAboutOutputStyle,"warnAboutOutputStyle");var loopProtectionWarningsShown=new Set;function resolveLoopProtection(value){if(value===void 0||isLoopProtectionMode(value))return value;const warning=`Invalid model.loopProtection value ${JSON.stringify(value)}: expected "warn", "stop" or "off"; using the default "warn".`;if(loopProtectionWarningsShown.has(warning))return void 0;loopProtectionWarningsShown.add(warning);debugLogger2.warn(warning);console.error(`WARNING: ${warning}`);return void 0}__name(resolveLoopProtection,"resolveLoopProtection");async function loadCliConfig(settings,argv,cwd=process.cwd(),overrideExtensions,hooksConfig,disabledSkillNamesProvider,sessionMcpServers,settingsWatcher,throwOnSessionIdConflict=false,hostPolicy,enabledSkillNamesProvider){assertKnownOmniSettingKeys(settings);const agentHostReadOnly=hostPolicy?.agentHostReadOnly===true;const sshWorkspace=agentHostReadOnly?void 0:readSshWorkspace(cwd);const provisionalWorkspace=hostPolicy?.provisionalWorkspace===true;const debugMode=isDebugMode(argv);if(debugMode&&process.env["QWEN_DEBUG_LOG_FILE"]===void 0){process.env["QWEN_DEBUG_LOG_FILE"]="1"}const bareMode=isBareMode(argv.bare);const executionSandboxSettings=agentHostReadOnly?void 0:validateExecutionSandboxSelection(settings,argv);const sandboxEnabled=Boolean(executionSandboxSettings||hostPolicy?.shellExecutionSandbox);if(executionSandboxSettings&&hostPolicy?.shellExecutionSandbox){throw new Error("Choose operator settings or a programmatic execution sandbox policy, not both.")}if(sandboxEnabled&&(argv.promptInteractive!==void 0||argv.inputFormat==="stream-json"||argv.acp||argv.experimentalAcp||argv.worktree!==void 0||argv.experimentalLsp||argv.mcpConfig||argv.extensions?.length||argv.includeDirectories?.length||overrideExtensions?.length||Object.keys(sessionMcpServers??{}).length||provisionalWorkspace)){throw new Error("tools.executionSandbox does not yet support ACP, worktree management, LSP, MCP, extensions or provisional workspaces.")}const safeMode=agentHostReadOnly||(argv.safeMode!==void 0?argv.safeMode:isSafeModeEnv());if(argv.insecure){process.env["QWEN_TLS_INSECURE"]="1"}if(isTlsVerificationDisabled()&&process.env["NODE_TLS_REJECT_UNAUTHORIZED"]!=="0"){process.env["NODE_TLS_REJECT_UNAUTHORIZED"]="0";const tlsWarning="TLS certificate verification is disabled (--insecure / QWEN_TLS_INSECURE). All HTTPS connections in this process (API calls, OAuth, MCP servers, child processes) are vulnerable to man-in-the-middle attacks.";debugLogger2.warn(tlsWarning);console.error(`WARNING: ${tlsWarning}`)}if(!Storage.hasRuntimeBaseDirContext()){Storage.setRuntimeBaseDir(settings.advanced?.runtimeOutputDir,cwd)}const requestedShellExecutionSandbox=hostPolicy?.shellExecutionSandbox??(executionSandboxSettings?createExecutionSandboxPolicy(executionSandboxSettings,cwd):void 0);const shellExecutionSandbox=requestedShellExecutionSandbox;const ideMode=!sandboxEnabled&&(settings.ide?.enabled??false);const folderTrust=settings.security?.folderTrust?.enabled??false;const trustedFolder=isWorkspaceTrusted(settings).isTrusted===true;const outputStyleCatalog=bareMode||safeMode?BUILT_IN_OUTPUT_STYLES:await loadOutputStyleCatalog({projectRoot:trustedFolder?cwd:void 0});if(settings.context?.fileName){setMemoryFilename(settings.context.fileName)}else{setMemoryFilename(getAllMemoryFilenames())}const projectStorage=new Storage(cwd);const projectOutputLanguagePath=path8.join(projectStorage.getQwenDir(),"output-language.md");const globalOutputLanguagePath=path8.join(Storage.getGlobalQwenDir(),"output-language.md");let outputLanguageFilePath;if(!bareMode&&!safeMode){if(!provisionalWorkspace&&fs6.existsSync(projectOutputLanguagePath)){outputLanguageFilePath=projectOutputLanguagePath}else if(fs6.existsSync(globalOutputLanguagePath)){outputLanguageFilePath=globalOutputLanguagePath}}const fileService=provisionalWorkspace?void 0:new FileDiscoveryService(cwd,settings.context?.fileFiltering?.customIgnoreFiles);const includeDirectories=provisionalWorkspace||agentHostReadOnly?[]:(bareMode||safeMode?[]:settings.context?.includeDirectories??[]).map(resolvePath).concat((argv.includeDirectories||[]).map(resolvePath));const lspEnabled=!agentHostReadOnly&&!sshWorkspace&&!provisionalWorkspace&&!bareMode&&argv.experimentalLsp===true;let lspClient;const question=argv.promptInteractive||argv.prompt||"";const inputFormat=argv.inputFormat??"text";const argvOutputFormat=normalizeOutputFormat(argv.outputFormat);const settingsOutputFormat=normalizeOutputFormat(settings.output?.format);const outputFormat=argvOutputFormat??settingsOutputFormat??"text";const outputSettingsFormat=outputFormat==="stream-json"?settingsOutputFormat&&settingsOutputFormat!=="stream-json"?settingsOutputFormat:"text":outputFormat;const includePartialMessages=Boolean(argv.includePartialMessages);let approvalMode;let approvalModeRequested=false;if(argv.approvalMode){approvalMode=parseApprovalModeValue(argv.approvalMode);approvalModeRequested=true}else if(argv.yolo){approvalMode="yolo";approvalModeRequested=true}else if(!bareMode&&!safeMode&&settings.tools?.approvalMode){approvalMode=parseApprovalModeValue(settings.tools.approvalMode);approvalModeRequested=true}else if(bareMode||safeMode){approvalMode="default"}else{approvalMode="auto"}if(!trustedFolder&&approvalMode!=="default"&&approvalMode!=="plan"){if(approvalModeRequested){writeStderrLine(`Approval mode overridden to "default" because the current folder is not trusted.`)}approvalMode="default"}let telemetrySettings;try{telemetrySettings=await resolveTelemetrySettings({argv,env:process.env,settings:settings.telemetry})}catch(err){if(err instanceof FatalConfigError){throw new FatalConfigError(`Invalid telemetry configuration: ${err.message}.`)}throw err}const interactive=isInteractiveInvocation(argv);if(safeMode&&argv.coreTools&&argv.coreTools.length>0){writeStderrLine("\u26A0 Safe mode: --core-tools flag is ignored (settings-sourced core tools are also disabled).\n")}const resolvedCoreTools=[...bareMode||safeMode?[]:argv.coreTools??[],...bareMode||safeMode?[]:settings.tools?.core??[]];const mergedAllow=[...bareMode||safeMode?[]:settings.permissions?.allow??[],...bareMode||safeMode?[]:settings.tools?.allowed??[]];const mergedAsk=[...bareMode||safeMode?[]:settings.permissions?.ask??[]];const mergedDeny=[...bareMode||safeMode?[]:settings.permissions?.deny??[],...bareMode||safeMode?[]:settings.tools?.exclude??[]];for(const t2 of argv.allowedTools??[]){if(t2&&!mergedAllow.includes(t2))mergedAllow.push(t2)}for(const t2 of argv.excludeTools??[]){if(t2&&!mergedDeny.includes(t2))mergedDeny.push(t2)}const disabledSlashCommands=[];const seenDisabled=new Set;const addDisabled=__name(value=>{if(!value)return;const trimmed=value.trim();if(!trimmed)return;const key=trimmed.toLowerCase();if(!seenDisabled.has(key)){seenDisabled.add(key);disabledSlashCommands.push(trimmed)}},"addDisabled");if(!bareMode&&!safeMode){for(const name of settings.slashCommands?.disabled??[])addDisabled(name)}for(const name of argv.disabledSlashCommands??[])addDisabled(name);for(const name of(process.env["QWEN_DISABLED_SLASH_COMMANDS"]??"").split(",")){addDisabled(name)}const disabledTools=bareMode||safeMode?[]:normalizeDisabledToolList(settings.tools?.disabled);const visibleTools=bareMode||safeMode?[]:normalizeDisabledToolList(settings.tools?.visible);const eagerTools=bareMode||safeMode||!Array.isArray(settings.tools?.eager)?void 0:normalizeDisabledToolList(settings.tools.eager);if(eagerTools!==void 0){const droppedEagerEntries=(settings.tools?.eager??[]).filter(entry=>typeof entry!=="string"||entry.trim()==="");if(droppedEagerEntries.length>0){console.warn(`tools.eager: ignoring ${droppedEagerEntries.length} unusable entr${droppedEagerEntries.length===1?"y":"ies"} (${droppedEagerEntries.map(entry=>JSON.stringify(entry)).join(", ")}). The allowlist stays active with ${eagerTools.length} entr${eagerTools.length===1?"y":"ies"}, so every other non-exempt tool is deferred to tool_search.`)}}const isExplicitlyAllowed=__name(toolName=>{if(mergedAllow.some(rule=>isToolEnabled(toolName,[rule],[]))){return true}if(resolvedCoreTools.length>0){return isToolEnabled(toolName,resolvedCoreTools,[])}return false},"isExplicitlyAllowed");const isAcpMode=argv.acp||argv.experimentalAcp;if(!bareMode&&!interactive&&!isAcpMode&&inputFormat!=="stream-json"){const denyUnlessAllowed=__name(toolName=>{if(!isExplicitlyAllowed(toolName)){const name=toolName;if(!mergedDeny.includes(name))mergedDeny.push(name)}},"denyUnlessAllowed");switch(approvalMode){case"plan":case"default":denyUnlessAllowed(ToolNames.SHELL);denyUnlessAllowed(ToolNames.MONITOR);denyUnlessAllowed(ToolNames.EDIT);denyUnlessAllowed(ToolNames.WRITE_FILE);break;case"auto":denyUnlessAllowed(ToolNames.SHELL);denyUnlessAllowed(ToolNames.MONITOR);denyUnlessAllowed(ToolNames.EDIT);denyUnlessAllowed(ToolNames.WRITE_FILE);break;case"auto-edit":denyUnlessAllowed(ToolNames.SHELL);denyUnlessAllowed(ToolNames.MONITOR);break;case"yolo":break;default:break}}let allowedMcpServers;let excludedMcpServers;if(argv.allowedMcpServerNames){allowedMcpServers=new Set(argv.allowedMcpServerNames.filter(Boolean));excludedMcpServers=void 0}else if(!bareMode&&!safeMode){allowedMcpServers=settings.mcp?.allowed?new Set(settings.mcp.allowed.filter(Boolean)):void 0;excludedMcpServers=settings.mcp?.excluded?new Set(settings.mcp.excluded.filter(Boolean)):void 0}if(argv.disableMcpServer){excludedMcpServers=new Set([...excludedMcpServers??[],...argv.disableMcpServer.filter(Boolean)])}const selectedAuthType=argv.authType||(bareMode?void 0:settings.security?.auth?.selectedType)||getAuthTypeFromEnv();try{validateModelProvidersConfig(settings.modelProviders,settings.providerProtocol)}catch(err){throw new FatalConfigError(err instanceof Error?err.message:String(err))}const resolvedCliConfig=resolveCliGenerationConfig({argv:{model:argv.model,openaiApiKey:argv.openaiApiKey,openaiBaseUrl:argv.openaiBaseUrl,openaiLogging:argv.openaiLogging,openaiLoggingDir:argv.openaiLoggingDir},settings,selectedAuthType,env:process.env});const{model:resolvedModel}=resolvedCliConfig;const shouldDisableToolSearch=settings.tools?.toolSearch?.enabled===false;if(shouldDisableToolSearch){if(!mergedDeny.includes("tool_search")){mergedDeny.push("tool_search")}if(!mergedDeny.includes("tool_call")){mergedDeny.push("tool_call")}}const sandboxConfig=agentHostReadOnly?void 0:await loadSandboxConfig(bareMode||safeMode?{}:settings,argv);if(shellExecutionSandbox&&sandboxConfig){throw new Error("Tool execution sandbox cannot be combined with a whole-CLI sandbox.")}const screenReader=argv.screenReader!==void 0?argv.screenReader:settings.ui?.accessibility?.screenReader??false;let sessionId;let sessionData;let sessionRestoreProjection;const sessionRestoreProjectionSource=hostPolicy?.sessionRestore?.projectionSource;let deferProjectionUntilWriterLease=false;if(argv.continue||argv.resume){const sessionService=new SessionService(cwd);if(argv.continue){sessionData=await sessionService.loadLastSession({excludeSourceTypes:[AGENT_HOST_SESSION_SOURCE_TYPE,AGENT_SESSION_SOURCE_TYPE]});if(sessionData){sessionId=sessionData.conversation.sessionId}else if(argv.forkSession){writeStderrLine("Cannot use --fork-session with --continue: no saved session found to fork.");process.exit(1)}}if(argv.resume){sessionId=argv.resume;deferProjectionUntilWriterLease=sessionRestoreProjectionSource!==void 0&&(argv.chatRecording??settings.general?.chatRecording??true)&&isAcpMode===true&&settings.experimental?.sessionWriterLease===true;if(sessionRestoreProjectionSource){if(!deferProjectionUntilWriterLease&&!argv.forkSession){addDaemonRequestAttribute("qwen-code.daemon.session_restore.projection_acquisition","preloaded");sessionRestoreProjection=await sessionRestoreProjectionSource(sessionId)}}else{sessionData=await sessionService.loadSession(argv.resume)}if(!sessionRestoreProjectionSource&&!sessionData){const message=`No saved session found with ID ${argv.resume}. Run \`qwen --resume\` without an ID to choose from existing sessions.`;writeStderrLine(message);process.exit(1)}}if(sessionId){if(hostPolicy?.executionEngine!=="managed"){sessionService.assertLegacySessionExecution(sessionId)}}if(argv.forkSession&&sessionId){const sourceSessionId=sessionId;const forkedSessionId=randomUUID3();try{await sessionService.forkSession(sourceSessionId,forkedSessionId)}catch(err){writeStderrLine(`Failed to fork session ${sourceSessionId}: ${err instanceof Error?err.message:String(err)}`);process.exit(1)}sessionId=forkedSessionId;if(sessionRestoreProjectionSource){sessionData=void 0;if(!deferProjectionUntilWriterLease){addDaemonRequestAttribute("qwen-code.daemon.session_restore.projection_acquisition","preloaded");sessionRestoreProjection=await sessionRestoreProjectionSource(forkedSessionId)}}else{sessionData=await sessionService.loadSession(forkedSessionId);if(!sessionData){writeStderrLine(`Failed to load forked session ${forkedSessionId}.`);process.exit(1)}}}}else if(argv.sandboxSessionId){if(!process.env["SANDBOX"]){writeStderrLine("--sandbox-session-id is for internal sandbox use only.");process.exit(1)}sessionId=argv.sandboxSessionId}else if(argv["sessionId"]){if(!argv.sessionIdGenerated){const sessionService=new SessionService(cwd);let occupied;try{occupied=await sessionService.findSessionIdIgnoringCase(argv["sessionId"])!==void 0}catch(error){debugLogger2.debug(`Session id occupancy check failed for ${argv["sessionId"]}: ${error}`);occupied=true}if(occupied){const message=`Error: Session Id ${argv["sessionId"]} already exists (active or archived). Delete or unarchive it first.`;if(throwOnSessionIdConflict){throw new SessionIdConflictError(argv["sessionId"],message)}writeStderrLine(message);process.exit(1)}}sessionId=normalizeSessionIdForLookup(argv["sessionId"])}const modelProvidersConfig=settings.modelProviders;const providerProtocolConfig=settings.providerProtocol;const restoreSessionId=sessionId;const boundSessionRestoreProjectionSource=sessionRestoreProjectionSource&&restoreSessionId?()=>sessionRestoreProjectionSource(restoreSessionId):void 0;const cliMcpServers=agentHostReadOnly?void 0:parseMcpConfig(argv.mcpConfig);const mem0Server=bareMode||safeMode||sshWorkspace||provisionalWorkspace||!trustedFolder||settings.memory?.mem0==null?void 0:createBundledMem0Server(settings.memory.mem0,cwd,interactive&&!isAcpMode&&!settings.disableAllHooks);const topTierMcpServers=!agentHostReadOnly&&(sessionMcpServers||cliMcpServers||mem0Server)?{...mem0Server?{"external-context":mem0Server}:{},...sessionMcpServers,...cliMcpServers??{}}:void 0;const settingsExternalContext=settings.mcpServers?.["external-context"];if(mem0Server&&(settingsExternalContext!==void 0&&!isGatedMcpScope(settingsExternalContext.scope)||sessionMcpServers?.["external-context"]||cliMcpServers?.["external-context"])){throw new Error("Configure memory.mem0 or an external-context MCP server, not both.")}const mcpServers=bareMode||safeMode?{...topTierMcpServers}:assembleMcpServers(settings.mcpServers,cwd,topTierMcpServers);const pendingMcpServers=bareMode||safeMode||approvalMode==="yolo"?void 0:getPendingGatedMcpServers(mcpServers,cwd);const advisorModel=bareMode||safeMode?void 0:resolveAdvisorModel(argv,settings);const isExplicitOneShotPrompt=!interactive&&Boolean(argv.prompt)&&!isAcpMode&&!(argv.inputFile??settings.dualOutput?.inputFile)&&inputFormat!=="stream-json";const configParams={sessionId,sessionData,sessionRestoreProjection,sessionRestoreProjectionSource:boundSessionRestoreProjectionSource,sessionExecutionEngine:hostPolicy?.executionEngine,managedRuntimeEnvironment:hostPolicy?.managedRuntimeEnvironment,onManagedEngineQuarantine:hostPolicy?.onManagedEngineQuarantine,embeddingModel:DEFAULT_QWEN_EMBEDDING_MODEL,sandbox:sandboxConfig,targetDir:cwd,provisionalWorkspace,workflowAncestorTrustProvider:bareMode||safeMode||sshWorkspace||agentHostReadOnly||provisionalWorkspace?void 0:hostPolicy?.workflowAncestorTrustProvider,includeDirectories,loadMemoryFromIncludeDirectories:provisionalWorkspace?false:bareMode||safeMode?includeDirectories.length>0:settings.context?.loadFromIncludeDirectories??false,importFormat:settings.context?.importFormat||"tree",debugMode,question,systemPrompt:argv.systemPrompt,appendSystemPrompt:argv.appendSystemPrompt,outputStyle:resolveOutputStyle(argv.outputStyle,bareMode||safeMode?void 0:settings.general?.outputStyle,outputStyleCatalog),coreTools:bareMode||safeMode?void 0:argv.coreTools||settings.tools?.core||void 0,allowedTools:bareMode||safeMode?argv.allowedTools||void 0:argv.allowedTools||settings.tools?.allowed||void 0,excludeTools:mergedDeny,disabledSlashCommands:disabledSlashCommands.length>0?disabledSlashCommands:void 0,disabledSkillNamesProvider:bareMode||safeMode?void 0:disabledSkillNamesProvider,enabledSkillNamesProvider:bareMode||safeMode?void 0:enabledSkillNamesProvider,skillSettingsListsProvider:bareMode||safeMode?void 0:buildSkillSettingsListsProvider(settings),terminalImageRenderSupportProvider:interactive?async()=>{const{getTerminalImageRenderSupport}=await import("./terminal-image-renderer-T3VJRZGP.js");return getTerminalImageRenderSupport()}:void 0,disabledSkillLevels:bareMode||safeMode||!Array.isArray(settings.skills?.disabledLevels)?void 0:settings.skills.disabledLevels.filter(isSkillLevel),customSkillDirs:bareMode||safeMode?void 0:(Array.isArray(settings.skills?.directories)?settings.skills.directories:[]).filter(d=>typeof d==="string"&&d.trim().length>0).map(d=>d.trim()),disabledTools:disabledTools.length>0?disabledTools:void 0,visibleTools:visibleTools.length>0?visibleTools:void 0,eagerTools,codeModeOnly:!bareMode&&!safeMode&&settings.tools?.codeModeOnly===true,freeform:settings.tools?.freeform===true,toolSearchThreshold:bareMode||safeMode?0:settings.tools?.toolSearch?.threshold,permissions:{allow:mergedAllow.length>0?mergedAllow:void 0,ask:mergedAsk.length>0?mergedAsk:void 0,deny:mergedDeny.length>0?mergedDeny:void 0,autoMode:bareMode||safeMode?void 0:settings.permissions?.autoMode},toolInvocationGuard:hostPolicy?.toolInvocationGuard,shellExecutionSandbox,onPersistPermissionRule:__name(async(scope,ruleType,rule)=>{const currentSettings=loadSettings(cwd);const settingScope=scope==="project"?"Workspace":"User";const key=`permissions.${ruleType}`;const currentRules=currentSettings.forScope(settingScope).settings.permissions?.[ruleType]??[];if(!currentRules.includes(rule)){currentSettings.setValue(settingScope,key,[...currentRules,rule])}},"onPersistPermissionRule"),toolDiscoveryCommand:bareMode||safeMode?void 0:settings.tools?.discoveryCommand,toolCallCommand:bareMode||safeMode?void 0:settings.tools?.callCommand,mcpServerCommand:bareMode||safeMode?void 0:settings.mcp?.serverCommand,mcpToolIdleTimeoutMs:settings.mcp?.toolIdleTimeoutMs,mcpServers,topTierMcpServers,bundledGeneratedUi:prepareBundledGeneratedUi(settings.experimental?.generatedUi,!bareMode&&!safeMode&&!sshWorkspace&&!agentHostReadOnly&&!provisionalWorkspace&&!sandboxEnabled&&!sandboxConfig&&hostPolicy?.executionEngine!=="managed"),pendingMcpServers,allowedMcpServers:allowedMcpServers?Array.from(allowedMcpServers):void 0,cliAllowedMcpServerNames:argv.allowedMcpServerNames?argv.allowedMcpServerNames.filter(Boolean):void 0,excludedMcpServers:excludedMcpServers?Array.from(excludedMcpServers):void 0,approvalMode,accessibility:{...settings.ui?.accessibility,screenReader},showResponseTokensPerSecond:settings.ui?.showResponseTokensPerSecond===true,telemetry:telemetrySettings,deferTelemetryInitialization:isAcpMode||interactive&&!question,outboundCorrelation:settings.outboundCorrelation,usageStatisticsEnabled:resolveUsageStatisticsEnabled(settings.privacy?.usageStatisticsEnabled),clearContextOnIdle:settings.context?.clearContextOnIdle,fileFiltering:settings.context?.fileFiltering,plansDirectory:settings.plansDirectory,proxy:argv.proxy||settings.proxy||process.env["HTTPS_PROXY"]||process.env["https_proxy"]||process.env["HTTP_PROXY"]||process.env["http_proxy"],cwd,fileDiscoveryService:fileService,bugCommand:settings.advanced?.bugCommand,model:resolvedModel,outputLanguageFilePath,sessionTokenLimit:settings.model?.sessionTokenLimit??-1,maxSessionTurns:argv.maxSessionTurns??settings.model?.maxSessionTurns??-1,goalTokenBudget:resolveGoalTokenBudget(settings),goalMaxTurns:resolveGoalMaxTurns(settings),goalMaxActiveMinutes:resolveGoalMaxActiveMinutes(settings),maxWallTimeSeconds:resolveMaxWallTimeSeconds(argv,settings),maxToolCalls:resolveMaxToolCalls(argv,settings),maxSubagentDepth:resolveMaxSubagentDepth(argv,settings),experimentalZedIntegration:argv.acp||argv.experimentalAcp||false,restoreAskUserQuestion:(argv.acp||argv.experimentalAcp||false)&&argv.restoreAskUserQuestion===true,sessionWriterLeaseEnabled:settings.experimental?.sessionWriterLease===true,cronEnabled:settings.experimental?.cron??true,cronRecurringMaxAgeDays:settings.experimental?.cronRecurringMaxAgeDays,sessionWorkflowEnabled:settings.experimental?.sessionWorkflow??false,lsToolEnabled:settings.tools?.listDirectory?.enabled===true,todoWriteEnabled:settings.tools?.todoWrite?.enabled===true,agentTeamEnabled:settings.experimental?.agentTeam??false,unifiedAgentLoopEnabled:settings.experimental?.unifiedAgentLoop??false,agentCollaborationEnabled:settings.experimental?.agentCollaboration??false,artifactEnabled:settings.experimental?.artifact??true,artifactAutoOpen:settings.artifact?.autoOpen??true,artifactPublisher:settings.artifact?.publisher??"local",artifactHost:settings.artifact?.host?{uploadCommand:settings.artifact?.host?.uploadCommand??"",urlTemplate:settings.artifact?.host?.urlTemplate??"",keyPrefix:settings.artifact?.host?.keyPrefix}:void 0,artifactOss:settings.artifact?.oss?{bucket:settings.artifact?.oss?.bucket??"",endpoint:settings.artifact?.oss?.endpoint??"",keyPrefix:settings.artifact?.oss?.keyPrefix,acl:settings.artifact?.oss?.acl,publicBaseUrl:settings.artifact?.oss?.publicBaseUrl}:void 0,omniEnabled:settings.omni?.enabled??false,omniMaxUploadFileBytes:settings.omni?.processing?.transportGuard?.maxUploadFileBytes,omniMaxEstimatedTokens:settings.omni?.processing?.transportGuard?.maxEstimatedTokens,omniMaxDurationSeconds:settings.omni?.processing?.transportGuard?.maxDurationSeconds,omniUrlDownloadMaxFileBytes:settings.omni?.ingestion?.localization?.url?.maxFileBytes,omniUploadUrlTtlHours:settings.omni?.delivery?.upload?.urlTtlHours,omniUploadBaseUrl:settings.omni?.delivery?.upload?.baseUrl,omniUploadApiKeyEnv:settings.omni?.delivery?.upload?.apiKeyEnv,omniUploadModel:settings.omni?.delivery?.upload?.model,omniPolicyTools:settings.omni?.processing?.policyTools,omniFixedPolicies:settings.omni?.processing?.fixedPolicies,omniTransportGuardPolicies:settings.omni?.processing?.transportGuard?.policies,omniProcessingLimits:settings.omni?.processing?.limits,omniQuarantineRetentionDays:settings.omni?.storage?.quarantine?.retentionDays,omniQuarantineMaxBytes:settings.omni?.storage?.quarantine?.maxBytes,omniStorageRetentionDays:settings.omni?.storage?.retentionDays,omniStorageMaxTotalBytes:settings.omni?.storage?.maxTotalBytes,omniMemory:settings.omni?.memory,emitToolUseSummaries:settings.experimental?.emitToolUseSummaries??true,listExtensions:argv.listExtensions||false,locale:resolveLocaleForExtensions(settings),overrideExtensions:overrideExtensions||argv.extensions,noBrowser:!!process.env["NO_BROWSER"],authType:resolvedCliConfig.authType,inputFormat,outputFormat,includePartialMessages,modelProvidersConfig,providerProtocolConfig,generationConfigSources:resolvedCliConfig.sources,generationConfig:resolvedCliConfig.generationConfig,initialModelRegistryBaseUrl:resolvedCliConfig.registryBaseUrl,warnings:resolvedCliConfig.warnings,bareMode,safeMode,allowedHttpHookUrls:bareMode||safeMode?[]:settings.security?.allowedHttpHookUrls??[],allowPrivateNetworkHooks:bareMode||safeMode?false:settings.security?.allowPrivateNetworkHooks??false,cliVersion:await getCliVersion(),ideMode,chatCompression:settings.model?.chatCompression,autoCompactThreshold:settings.context?.autoCompactThreshold,folderTrust,interactive,trustedFolder,useRipgrep:settings.tools?.useRipgrep,useBuiltinRipgrep:settings.tools?.useBuiltinRipgrep,workflowsEnabled:settings.tools?.workflowsEnabled,workflowKeywordTriggerEnabled:settings.ui?.disableWorkflowKeywordTrigger!==true,workflowSizeGuideline:settings.tools?.workflowSizeGuideline,workflowNameOnly:settings.tools?.workflowNameOnly,modelProposedGoals:normalizeModelProposedGoals(settings.goals?.modelProposed),shouldUseNodePtyShell:settings.tools?.shell?.enableInteractiveShell??(isExplicitOneShotPrompt?false:void 0),shellDefaultTimeoutMs:settings.tools?.shell?.defaultTimeoutMs,shellHeartbeatIntervalMs:settings.tools?.shell?.heartbeatIntervalMs,preventSystemSleep:settings.general?.preventSystemSleep??true,skipNextSpeakerCheck:settings.model?.skipNextSpeakerCheck,skipWorkflowUsageWarning:settings.model?.skipWorkflowUsageWarning??false,skipLoopDetection:settings.model?.skipLoopDetection??true,loopProtection:resolveLoopProtection(settings.model?.loopProtection),maxToolCallsPerTurn:settings.model?.maxToolCallsPerTurn,skipStartupContext:settings.model?.skipStartupContext??false,truncateToolOutputThreshold:settings.tools?.truncateToolOutputThreshold,truncateToolOutputLines:settings.tools?.truncateToolOutputLines,toolOutputBatchBudget:settings.tools?.toolOutputBatchBudget,eventEmitter:appEvents,gitCoAuthor:settings.general?.gitCoAuthor,output:{format:outputSettingsFormat},enableManagedAutoMemory:bareMode||safeMode?false:settings.memory?.enableManagedAutoMemory??true,enableManagedAutoDream:bareMode||safeMode?false:settings.memory?.enableManagedAutoDream??true,enableTeamMemory:bareMode||safeMode?false:settings.memory?.enableTeamMemory??false,enableTeamMemorySync:bareMode||safeMode?false:settings.memory?.enableTeamMemorySync??false,enableStructuredMemoryRecall:bareMode||safeMode?false:settings.memory?.enableStructuredRecall??false,enableAutoSkill:bareMode||safeMode?false:settings.memory?.enableAutoSkill??false,autoSkillConfirm:bareMode||safeMode?false:settings.memory?.autoSkillConfirm??true,memoryAgentTimeoutMinutes:settings.memory?.agentTimeoutMinutes,memoryAgentMaxTurns:settings.memory?.agentMaxTurns,fastModel:settings.fastModel||void 0,advisorModel,advisorMaxUses:settings.advisorMaxUses,webSearch:bareMode||safeMode?{enabled:false}:resolveWebSearchSettings(settings),visionModel:settings.visionModel||void 0,compactionModel:settings.compactionModel||void 0,imageModel:settings.imageModel||void 0,visionBridgeTimeoutMs:settings.visionBridgeTimeoutMs,modelFallbacks:resolveModelFallbacks(argv.fallbackModel,settings.modelFallbacks),...resolveHookSettingsForConfig(settings.hooks,hooksConfig,bareMode||safeMode,mem0Server),disableAllHooks:bareMode||safeMode?true:settings.disableAllHooks??false,stopHookBlockingCap:bareMode||safeMode?void 0:settings.stopHookBlockingCap,channel:argv.channel,jsonFd:argv.jsonFd,jsonFile:argv.jsonFile??settings.dualOutput?.jsonFile,jsonSchema:resolveJsonSchemaArg(argv.jsonSchema),inputFile:argv.inputFile??settings.dualOutput?.inputFile,chatRecording:argv.chatRecording??settings.general?.chatRecording??true,defaultFileEncoding:settings.general?.defaultFileEncoding,lsp:{enabled:lspEnabled},agents:settings.agents?{builtin:settings.agents.builtin?{exploreModel:settings.agents.builtin.exploreModel}:void 0,modelGrades:settings.agents.modelGrades,allowedGrades:settings.agents.allowedGrades,maxParallelAgents:settings.agents.maxParallelAgents,maxParallelAgentsByModel:settings.agents.maxParallelAgentsByModel,displayMode:settings.agents.displayMode,arena:settings.agents.arena?{worktreeBaseDir:settings.agents.arena.worktreeBaseDir,preserveArtifacts:settings.agents.arena.preserveArtifacts??false}:void 0}:void 0,worktree:settings.worktree?{symlinkDirectories:settings.worktree.symlinkDirectories}:void 0,settingsWatcher,agentExecutionBackend:agentExecutionBackend(),executionEnvironmentFactory:agentExecutionFactory()};if(agentHostReadOnly){configParams.coreTools=[...AGENT_HOST_TOOL_NAMES];configParams.disableAllHooks=true;configParams.mcpServers={};configParams.topTierMcpServers=void 0;configParams.pendingMcpServers=void 0;configParams.overrideExtensions=[];configParams.workflowsEnabled=false;configParams.sessionWorkflowEnabled=false;configParams.fileCheckpointingEnabled=false;configParams.cronEnabled=false;configParams.artifactEnabled=false;configParams.omniEnabled=false}if(sshWorkspace){configParams.executionEnvironment=new SshExecutionEnvironment(sshWorkspace,cwd,{outputThreshold:configParams.truncateToolOutputThreshold,shellDefaultTimeoutMs:configParams.shellDefaultTimeoutMs,customIgnoreFiles:configParams.fileFiltering?.customIgnoreFiles});configParams.codeModeOnly=false;configParams.disableAllHooks=true;configParams.mcpServers={};configParams.overrideExtensions=[];configParams.workflowsEnabled=false;configParams.enableManagedAutoMemory=false;configParams.enableManagedAutoDream=false;configParams.enableTeamMemory=false;configParams.enableTeamMemorySync=false;configParams.enableStructuredMemoryRecall=false;configParams.enableAutoSkill=false;configParams.fileCheckpointingEnabled=false;configParams.artifactEnabled=false;configParams.appendSystemPrompt=[argv.appendSystemPrompt,`This is an SSH workspace on ${sshWorkspace.host}. The project directory is ${sshWorkspace.directory}. All file, search and shell tools operate on that remote project. The local directory ${cwd} is only for session storage; it is not the project. Use remote absolute paths or paths relative to the remote project. Read QWEN.md and AGENTS.md at the remote project root before working if they exist. Remote hooks, skills, MCP, LSP, subagents, workflows and worktree management are unavailable in this session.`].filter(Boolean).join("\n\n")}const config=new Config(configParams);if(advisorModel){validateCliAdvisorModel(config,advisorModel,{fastModel:settings.fastModel,currentModel:resolvedModel,currentAuthType:selectedAuthType})}config.setExternalAgentExecutor({create:__name(params=>params.spec.kind==="codex"?import("./codex-subagent-executor-DQ5LQQWO.js").then(module=>module.codexExternalAgentExecutor.create(params)):import("./acp-subagent-executor-3NHBJRPL.js").then(module=>module.acpExternalAgentExecutor.create(params)),"create")});if(lspEnabled){try{const lspService=new NativeLspService(config,config.getWorkspaceContext(),appEvents,fileService,ideContextStore,{requireTrustedWorkspace:folderTrust});await lspService.discoverAndPrepare();if(config.getDebugMode()){debugLogger2.debug("Native LSP status after discovery:",lspService.getStatusSnapshot())}await lspService.start();if(config.getDebugMode()){debugLogger2.debug("Native LSP status after startup:",lspService.getStatusSnapshot())}lspClient=new NativeLspClient(lspService);config.setLspClient(lspClient);try{config.setLspInitializationError(void 0)}catch{debugLogger2.warn("Failed to clear LSP initialization error after initialization")}}catch(err){try{config.setLspInitializationError(err instanceof Error?err:String(err))}catch{debugLogger2.warn("LSP init error occurred after initialization:",err)}debugLogger2.warn("Failed to initialize native LSP service:",err)}}return config}__name(loadCliConfig,"loadCliConfig");export{isInteractiveInvocation,normalizeDisabledToolList,resolveHookSettingsForConfig,appEvents,OBSERVED_CONTACT_MAX_FRESH_WITHIN_SECONDS,ObservedChannelContactStore,RunBudgetEnforcer,allowsFastOnlyAdvisorModel,isAdvisorModelEligible,checkAdvisorModelAvailability,parseArguments,loadHierarchicalMemory,isDebugMode,buildDisabledSkillNamesProvider,buildEnabledSkillNamesProvider,SessionIdConflictError,loadCliConfig};
|
|
43
|
+
Configure models in settings.modelProviders and ensure the required environment variables are set. In interactive mode, run /advisor without arguments to choose from configured models.`}__name(formatUnavailableAdvisorModelMessage,"formatUnavailableAdvisorModelMessage");function validateCliAdvisorModel(config,rawModel,startupContext){const modelName=rawModel.trim();if(!modelName||modelName.toLowerCase()==="off")return;const availability=checkAdvisorModelAvailability(config,modelName,startupContext);if(!availability.available){throw new FatalConfigError(formatUnavailableAdvisorModelMessage(modelName,availability.availableModelIds))}}__name(validateCliAdvisorModel,"validateCliAdvisorModel");function isDebugMode(argv){if(argv.debug)return true;const debugVal=process.env["DEBUG"];const debugModeVal=process.env["DEBUG_MODE"];return debugVal==="true"||debugVal==="1"||debugModeVal==="true"||debugModeVal==="1"}__name(isDebugMode,"isDebugMode");function validateMcpServerConfig(config){if(typeof config!=="object"||config===null||Array.isArray(config)){return false}return Object.values(config).every(server=>typeof server==="object"&&server!==null)}__name(validateMcpServerConfig,"validateMcpServerConfig");function parseMcpConfig(mcpConfigArg){if(!mcpConfigArg){return null}try{let parsed;if(fs6.existsSync(mcpConfigArg)){debugLogger2.debug(`Reading MCP config from file: ${mcpConfigArg}`);const content=fs6.readFileSync(mcpConfigArg,"utf-8");parsed=JSON.parse((0,import_strip_json_comments.default)(stripUtf8Bom(content)))}else{debugLogger2.debug("Parsing MCP config as JSON string");parsed=JSON.parse(mcpConfigArg)}let servers;if(typeof parsed==="object"&&parsed!==null&&"mcpServers"in parsed&&typeof parsed.mcpServers==="object"){servers=parsed.mcpServers}else{servers=parsed}if(!validateMcpServerConfig(servers)){throw new Error("Invalid MCP server configuration format. Expected an object with server names as keys.")}debugLogger2.debug(`Loaded ${Object.keys(servers).length} MCP server(s) from --mcp-config`);return servers}catch(error){const errorMessage=error instanceof Error?error.message:String(error);throw new FatalConfigError(`Invalid MCP configuration provided via --mcp-config: ${errorMessage}`)}}__name(parseMcpConfig,"parseMcpConfig");function buildDisabledSkillNamesProvider(loadedSettings){return()=>resolveSkillSettings(loadedSettings).disabledNames}__name(buildDisabledSkillNamesProvider,"buildDisabledSkillNamesProvider");function assertKnownOmniSettingKeys(settings){const omni=settings.omni;if(omni===void 0||omni===null||typeof omni!=="object")return;const schemaOmni=getSettingsSchema()["omni"];if(Object.keys(schemaOmni?.properties??{}).length===0)return;const walk=__name((value,schemaNode,label)=>{if(value===null||typeof value!=="object"||Array.isArray(value)){return}const props=schemaNode?.properties;if(!props||Object.keys(props).length===0)return;const allowed=new Set(Object.keys(props));const unknown=Object.keys(value).filter(key=>!allowed.has(key));if(unknown.length>0){throw new Error(`Invalid settings: unknown key(s) under "${label}": ${unknown.map(k=>`"${k}"`).join(", ")}. Allowed: ${[...allowed].sort().join(", ")}. An unrecognized ${label} entry would be silently ignored, leaving the session running with defaults instead of your configuration.`)}for(const[key,child]of Object.entries(value)){walk(child,props[key],`${label}.${key}`)}},"walk");walk(omni,schemaOmni,"omni")}__name(assertKnownOmniSettingKeys,"assertKnownOmniSettingKeys");function buildEnabledSkillNamesProvider(loadedSettings){return()=>resolveSkillSettings(loadedSettings).enabledNames}__name(buildEnabledSkillNamesProvider,"buildEnabledSkillNamesProvider");function buildSkillSettingsListsProvider(merged){return()=>({enabled:normalizeSkillNames(merged.skills?.enabled),defaultDisabled:normalizeSkillNames(merged.skills?.defaultDisabled),hardDisabled:normalizeSkillNames(merged.skills?.disabled)})}__name(buildSkillSettingsListsProvider,"buildSkillSettingsListsProvider");var SessionIdConflictError=class extends Error{static{__name(this,"SessionIdConflictError")}sessionId;constructor(sessionId,message){super(message);this.name="SessionIdConflictError";this.sessionId=sessionId}};function normalizeModelProposedGoals(value){return value==="alwaysAsk"||value==="disabled"?value:void 0}__name(normalizeModelProposedGoals,"normalizeModelProposedGoals");function resolveOutputStyle(argvStyle,settingsStyle,available=BUILT_IN_OUTPUT_STYLES){let flagValue=argvStyle;if(Array.isArray(argvStyle)&&argvStyle.length>0){flagValue=argvStyle[argvStyle.length-1];warnAboutOutputStyle(`--output-style was given ${argvStyle.length} times; using the last value.`)}const flagName=typeof flagValue==="string"?sanitizeOutputStyleName(flagValue):void 0;const flagGiven=flagValue!==void 0&&flagValue!==null&&flagName!=="";const raw=flagGiven?flagValue:settingsStyle;if(raw===void 0||raw===null){return void 0}const source=flagGiven?"--output-style":"general.outputStyle";if(typeof raw!=="string"){warnAboutOutputStyle(`Invalid output style value (from ${source}): expected a string, got ${Array.isArray(raw)?"an array":typeof raw}; using the default style.`);return void 0}const name=flagGiven&&flagName!==void 0?flagName:sanitizeOutputStyleName(raw);if(!name||name.toLowerCase()==="default"){return void 0}const style=findOutputStyle(available,name);if(style){return style}const known=available.map(s=>s.name).join(", ");warnAboutOutputStyle(`Unknown output style "${truncateForDisplay(name)}" (from ${source}); using the default style. Available styles: ${known}.`);return void 0}__name(resolveOutputStyle,"resolveOutputStyle");var OUTPUT_STYLE_NAME_ECHO_LIMIT=64;function sanitizeOutputStyleName(raw){return stripAnsiAndControl(raw).replace(new RegExp("\\p{Cf}","gu"),"").trim()}__name(sanitizeOutputStyleName,"sanitizeOutputStyleName");function truncateForDisplay(name){return name.length>OUTPUT_STYLE_NAME_ECHO_LIMIT?`${name.slice(0,OUTPUT_STYLE_NAME_ECHO_LIMIT)}\u2026`:name}__name(truncateForDisplay,"truncateForDisplay");var outputStyleWarningsShown=new Set;function warnAboutOutputStyle(warning){if(outputStyleWarningsShown.has(warning)){return}outputStyleWarningsShown.add(warning);debugLogger2.warn(warning);console.error(`WARNING: ${warning}`)}__name(warnAboutOutputStyle,"warnAboutOutputStyle");var loopProtectionWarningsShown=new Set;function resolveLoopProtection(value){if(value===void 0||isLoopProtectionMode(value))return value;const warning=`Invalid model.loopProtection value ${JSON.stringify(value)}: expected "warn", "stop" or "off"; using the default "warn".`;if(loopProtectionWarningsShown.has(warning))return void 0;loopProtectionWarningsShown.add(warning);debugLogger2.warn(warning);console.error(`WARNING: ${warning}`);return void 0}__name(resolveLoopProtection,"resolveLoopProtection");async function loadCliConfig(settings,argv,cwd=process.cwd(),overrideExtensions,hooksConfig,disabledSkillNamesProvider,sessionMcpServers,settingsWatcher,throwOnSessionIdConflict=false,hostPolicy,enabledSkillNamesProvider){assertKnownOmniSettingKeys(settings);const agentHostReadOnly=hostPolicy?.agentHostReadOnly===true;const sshWorkspace=agentHostReadOnly?void 0:readSshWorkspace(cwd);const provisionalWorkspace=hostPolicy?.provisionalWorkspace===true;const debugMode=isDebugMode(argv);if(debugMode&&process.env["QWEN_DEBUG_LOG_FILE"]===void 0){process.env["QWEN_DEBUG_LOG_FILE"]="1"}const bareMode=isBareMode(argv.bare);const executionSandboxSettings=agentHostReadOnly?void 0:validateExecutionSandboxSelection(settings,argv);const sandboxEnabled=Boolean(executionSandboxSettings||hostPolicy?.shellExecutionSandbox);if(executionSandboxSettings&&hostPolicy?.shellExecutionSandbox){throw new Error("Choose operator settings or a programmatic execution sandbox policy, not both.")}if(sandboxEnabled&&(argv.promptInteractive!==void 0||argv.inputFormat==="stream-json"||argv.acp||argv.experimentalAcp||argv.worktree!==void 0||argv.experimentalLsp||argv.mcpConfig||argv.extensions?.length||argv.includeDirectories?.length||overrideExtensions?.length||Object.keys(sessionMcpServers??{}).length||provisionalWorkspace)){throw new Error("tools.executionSandbox does not yet support ACP, worktree management, LSP, MCP, extensions or provisional workspaces.")}const safeMode=agentHostReadOnly||(argv.safeMode!==void 0?argv.safeMode:isSafeModeEnv());if(argv.insecure){process.env["QWEN_TLS_INSECURE"]="1"}if(isTlsVerificationDisabled()&&process.env["NODE_TLS_REJECT_UNAUTHORIZED"]!=="0"){process.env["NODE_TLS_REJECT_UNAUTHORIZED"]="0";const tlsWarning="TLS certificate verification is disabled (--insecure / QWEN_TLS_INSECURE). All HTTPS connections in this process (API calls, OAuth, MCP servers, child processes) are vulnerable to man-in-the-middle attacks.";debugLogger2.warn(tlsWarning);console.error(`WARNING: ${tlsWarning}`)}if(!Storage.hasRuntimeBaseDirContext()){Storage.setRuntimeBaseDir(settings.advanced?.runtimeOutputDir,cwd)}const requestedShellExecutionSandbox=hostPolicy?.shellExecutionSandbox??(executionSandboxSettings?createExecutionSandboxPolicy(executionSandboxSettings,cwd):void 0);const shellExecutionSandbox=requestedShellExecutionSandbox;const ideMode=!sandboxEnabled&&(settings.ide?.enabled??false);const folderTrust=settings.security?.folderTrust?.enabled??false;const trustedFolder=isWorkspaceTrusted(settings).isTrusted===true;const outputStyleCatalog=bareMode||safeMode?BUILT_IN_OUTPUT_STYLES:await loadOutputStyleCatalog({projectRoot:trustedFolder?cwd:void 0});if(settings.context?.fileName){setMemoryFilename(settings.context.fileName)}else{setMemoryFilename(getAllMemoryFilenames())}const projectStorage=new Storage(cwd);const projectOutputLanguagePath=path8.join(projectStorage.getQwenDir(),"output-language.md");const globalOutputLanguagePath=path8.join(Storage.getGlobalQwenDir(),"output-language.md");let outputLanguageFilePath;if(!bareMode&&!safeMode){if(!provisionalWorkspace&&fs6.existsSync(projectOutputLanguagePath)){outputLanguageFilePath=projectOutputLanguagePath}else if(fs6.existsSync(globalOutputLanguagePath)){outputLanguageFilePath=globalOutputLanguagePath}}const fileService=provisionalWorkspace?void 0:new FileDiscoveryService(cwd,settings.context?.fileFiltering?.customIgnoreFiles);const includeDirectories=provisionalWorkspace||agentHostReadOnly?[]:(bareMode||safeMode?[]:settings.context?.includeDirectories??[]).map(resolvePath).concat((argv.includeDirectories||[]).map(resolvePath));const lspEnabled=!agentHostReadOnly&&!sshWorkspace&&!provisionalWorkspace&&!bareMode&&argv.experimentalLsp===true;let lspClient;const question=argv.promptInteractive||argv.prompt||"";const inputFormat=argv.inputFormat??"text";const argvOutputFormat=normalizeOutputFormat(argv.outputFormat);const settingsOutputFormat=normalizeOutputFormat(settings.output?.format);const outputFormat=argvOutputFormat??settingsOutputFormat??"text";const outputSettingsFormat=outputFormat==="stream-json"?settingsOutputFormat&&settingsOutputFormat!=="stream-json"?settingsOutputFormat:"text":outputFormat;const includePartialMessages=Boolean(argv.includePartialMessages);let approvalMode;let approvalModeRequested=false;if(argv.approvalMode){approvalMode=parseApprovalModeValue(argv.approvalMode);approvalModeRequested=true}else if(argv.yolo){approvalMode="yolo";approvalModeRequested=true}else if(!bareMode&&!safeMode&&settings.tools?.approvalMode){approvalMode=parseApprovalModeValue(settings.tools.approvalMode);approvalModeRequested=true}else if(bareMode||safeMode){approvalMode="default"}else{approvalMode="auto"}if(!trustedFolder&&approvalMode!=="default"&&approvalMode!=="plan"){if(approvalModeRequested){writeStderrLine(`Approval mode overridden to "default" because the current folder is not trusted.`)}approvalMode="default"}let telemetrySettings;try{telemetrySettings=await resolveTelemetrySettings({argv,env:process.env,settings:settings.telemetry})}catch(err){if(err instanceof FatalConfigError){throw new FatalConfigError(`Invalid telemetry configuration: ${err.message}.`)}throw err}const interactive=isInteractiveInvocation(argv);if(safeMode&&argv.coreTools&&argv.coreTools.length>0){writeStderrLine("\u26A0 Safe mode: --core-tools flag is ignored (settings-sourced core tools are also disabled).\n")}const resolvedCoreTools=[...bareMode||safeMode?[]:argv.coreTools??[],...bareMode||safeMode?[]:settings.tools?.core??[]];const mergedAllow=[...bareMode||safeMode?[]:settings.permissions?.allow??[],...bareMode||safeMode?[]:settings.tools?.allowed??[]];const mergedAsk=[...bareMode||safeMode?[]:settings.permissions?.ask??[]];const mergedDeny=[...bareMode||safeMode?[]:settings.permissions?.deny??[],...bareMode||safeMode?[]:settings.tools?.exclude??[]];for(const t2 of argv.allowedTools??[]){if(t2&&!mergedAllow.includes(t2))mergedAllow.push(t2)}for(const t2 of argv.excludeTools??[]){if(t2&&!mergedDeny.includes(t2))mergedDeny.push(t2)}const disabledSlashCommands=[];const seenDisabled=new Set;const addDisabled=__name(value=>{if(!value)return;const trimmed=value.trim();if(!trimmed)return;const key=trimmed.toLowerCase();if(!seenDisabled.has(key)){seenDisabled.add(key);disabledSlashCommands.push(trimmed)}},"addDisabled");if(!bareMode&&!safeMode){for(const name of settings.slashCommands?.disabled??[])addDisabled(name)}for(const name of argv.disabledSlashCommands??[])addDisabled(name);for(const name of(process.env["QWEN_DISABLED_SLASH_COMMANDS"]??"").split(",")){addDisabled(name)}const disabledTools=bareMode||safeMode?[]:normalizeDisabledToolList(settings.tools?.disabled);const visibleTools=bareMode||safeMode?[]:normalizeDisabledToolList(settings.tools?.visible);const eagerTools=bareMode||safeMode||!Array.isArray(settings.tools?.eager)?void 0:normalizeDisabledToolList(settings.tools.eager);if(eagerTools!==void 0){const droppedEagerEntries=(settings.tools?.eager??[]).filter(entry=>typeof entry!=="string"||entry.trim()==="");if(droppedEagerEntries.length>0){console.warn(`tools.eager: ignoring ${droppedEagerEntries.length} unusable entr${droppedEagerEntries.length===1?"y":"ies"} (${droppedEagerEntries.map(entry=>JSON.stringify(entry)).join(", ")}). The allowlist stays active with ${eagerTools.length} entr${eagerTools.length===1?"y":"ies"}, so every other non-exempt tool is deferred to tool_search.`)}}const isExplicitlyAllowed=__name(toolName=>{if(mergedAllow.some(rule=>isToolEnabled(toolName,[rule],[]))){return true}if(resolvedCoreTools.length>0){return isToolEnabled(toolName,resolvedCoreTools,[])}return false},"isExplicitlyAllowed");const isAcpMode=argv.acp||argv.experimentalAcp;if(!bareMode&&!interactive&&!isAcpMode&&inputFormat!=="stream-json"){const denyUnlessAllowed=__name(toolName=>{if(!isExplicitlyAllowed(toolName)){const name=toolName;if(!mergedDeny.includes(name))mergedDeny.push(name)}},"denyUnlessAllowed");switch(approvalMode){case"plan":case"default":denyUnlessAllowed(ToolNames.SHELL);denyUnlessAllowed(ToolNames.MONITOR);denyUnlessAllowed(ToolNames.EDIT);denyUnlessAllowed(ToolNames.WRITE_FILE);break;case"auto":denyUnlessAllowed(ToolNames.SHELL);denyUnlessAllowed(ToolNames.MONITOR);denyUnlessAllowed(ToolNames.EDIT);denyUnlessAllowed(ToolNames.WRITE_FILE);break;case"auto-edit":denyUnlessAllowed(ToolNames.SHELL);denyUnlessAllowed(ToolNames.MONITOR);break;case"yolo":break;default:break}}let allowedMcpServers;let excludedMcpServers;if(argv.allowedMcpServerNames){allowedMcpServers=new Set(argv.allowedMcpServerNames.filter(Boolean));excludedMcpServers=void 0}else if(!bareMode&&!safeMode){allowedMcpServers=settings.mcp?.allowed?new Set(settings.mcp.allowed.filter(Boolean)):void 0;excludedMcpServers=settings.mcp?.excluded?new Set(settings.mcp.excluded.filter(Boolean)):void 0}if(argv.disableMcpServer){excludedMcpServers=new Set([...excludedMcpServers??[],...argv.disableMcpServer.filter(Boolean)])}const selectedAuthType=argv.authType||(bareMode?void 0:settings.security?.auth?.selectedType)||getAuthTypeFromEnv();try{validateModelProvidersConfig(settings.modelProviders,settings.providerProtocol)}catch(err){throw new FatalConfigError(err instanceof Error?err.message:String(err))}const resolvedCliConfig=resolveCliGenerationConfig({argv:{model:argv.model,openaiApiKey:argv.openaiApiKey,openaiBaseUrl:argv.openaiBaseUrl,openaiLogging:argv.openaiLogging,openaiLoggingDir:argv.openaiLoggingDir},settings,selectedAuthType,env:process.env});const{model:resolvedModel}=resolvedCliConfig;const shouldDisableToolSearch=settings.tools?.toolSearch?.enabled===false;if(shouldDisableToolSearch){if(!mergedDeny.includes("tool_search")){mergedDeny.push("tool_search")}if(!mergedDeny.includes("tool_call")){mergedDeny.push("tool_call")}}const sandboxConfig=agentHostReadOnly?void 0:await loadSandboxConfig(bareMode||safeMode?{}:settings,argv);if(shellExecutionSandbox&&sandboxConfig){throw new Error("Tool execution sandbox cannot be combined with a whole-CLI sandbox.")}const screenReader=argv.screenReader!==void 0?argv.screenReader:settings.ui?.accessibility?.screenReader??false;let sessionId;let sessionData;let sessionRestoreProjection;const sessionRestoreProjectionSource=hostPolicy?.sessionRestore?.projectionSource;let deferProjectionUntilWriterLease=false;if(argv.continue||argv.resume){const sessionService=new SessionService(cwd);if(argv.continue){sessionData=await sessionService.loadLastSession({excludeSourceTypes:[AGENT_HOST_SESSION_SOURCE_TYPE,AGENT_SESSION_SOURCE_TYPE]});if(sessionData){sessionId=sessionData.conversation.sessionId}else if(argv.forkSession){writeStderrLine("Cannot use --fork-session with --continue: no saved session found to fork.");process.exit(1)}}if(argv.resume){sessionId=argv.resume;deferProjectionUntilWriterLease=sessionRestoreProjectionSource!==void 0&&(argv.chatRecording??settings.general?.chatRecording??true)&&isAcpMode===true&&settings.experimental?.sessionWriterLease===true;if(sessionRestoreProjectionSource){if(!deferProjectionUntilWriterLease&&!argv.forkSession){addDaemonRequestAttribute("qwen-code.daemon.session_restore.projection_acquisition","preloaded");sessionRestoreProjection=await sessionRestoreProjectionSource(sessionId)}}else{sessionData=await sessionService.loadSession(argv.resume)}if(!sessionRestoreProjectionSource&&!sessionData){const message=`No saved session found with ID ${argv.resume}. Run \`qwen --resume\` without an ID to choose from existing sessions.`;writeStderrLine(message);process.exit(1)}}if(sessionId){if(hostPolicy?.executionEngine!=="managed"){sessionService.assertLegacySessionExecution(sessionId)}}if(argv.forkSession&&sessionId){const sourceSessionId=sessionId;const forkedSessionId=randomUUID3();try{await sessionService.forkSession(sourceSessionId,forkedSessionId)}catch(err){writeStderrLine(`Failed to fork session ${sourceSessionId}: ${err instanceof Error?err.message:String(err)}`);process.exit(1)}sessionId=forkedSessionId;if(sessionRestoreProjectionSource){sessionData=void 0;if(!deferProjectionUntilWriterLease){addDaemonRequestAttribute("qwen-code.daemon.session_restore.projection_acquisition","preloaded");sessionRestoreProjection=await sessionRestoreProjectionSource(forkedSessionId)}}else{sessionData=await sessionService.loadSession(forkedSessionId);if(!sessionData){writeStderrLine(`Failed to load forked session ${forkedSessionId}.`);process.exit(1)}}}}else if(argv.sandboxSessionId){if(!process.env["SANDBOX"]){writeStderrLine("--sandbox-session-id is for internal sandbox use only.");process.exit(1)}sessionId=argv.sandboxSessionId}else if(argv["sessionId"]){if(!argv.sessionIdGenerated){const sessionService=new SessionService(cwd);let occupied;try{occupied=await sessionService.findSessionIdIgnoringCase(argv["sessionId"])!==void 0}catch(error){debugLogger2.debug(`Session id occupancy check failed for ${argv["sessionId"]}: ${error}`);occupied=true}if(occupied){const message=`Error: Session Id ${argv["sessionId"]} already exists (active or archived). Delete or unarchive it first.`;if(throwOnSessionIdConflict){throw new SessionIdConflictError(argv["sessionId"],message)}writeStderrLine(message);process.exit(1)}}sessionId=normalizeSessionIdForLookup(argv["sessionId"])}const modelProvidersConfig=settings.modelProviders;const providerProtocolConfig=settings.providerProtocol;const restoreSessionId=sessionId;const boundSessionRestoreProjectionSource=sessionRestoreProjectionSource&&restoreSessionId?()=>sessionRestoreProjectionSource(restoreSessionId):void 0;const cliMcpServers=agentHostReadOnly?void 0:parseMcpConfig(argv.mcpConfig);const mem0Server=bareMode||safeMode||sshWorkspace||provisionalWorkspace||!trustedFolder||settings.memory?.mem0==null?void 0:createBundledMem0Server(settings.memory.mem0,cwd,interactive&&!isAcpMode&&!settings.disableAllHooks);const topTierMcpServers=!agentHostReadOnly&&(sessionMcpServers||cliMcpServers||mem0Server)?{...mem0Server?{"external-context":mem0Server}:{},...sessionMcpServers,...cliMcpServers??{}}:void 0;const settingsExternalContext=settings.mcpServers?.["external-context"];if(mem0Server&&(settingsExternalContext!==void 0&&!isGatedMcpScope(settingsExternalContext.scope)||sessionMcpServers?.["external-context"]||cliMcpServers?.["external-context"])){throw new Error("Configure memory.mem0 or an external-context MCP server, not both.")}const mcpServers=bareMode||safeMode?{...topTierMcpServers}:assembleMcpServers(settings.mcpServers,cwd,topTierMcpServers);const pendingMcpServers=bareMode||safeMode||approvalMode==="yolo"?void 0:getPendingGatedMcpServers(mcpServers,cwd);const advisorModel=bareMode||safeMode?void 0:resolveAdvisorModel(argv,settings);const isExplicitOneShotPrompt=!interactive&&Boolean(argv.prompt)&&!isAcpMode&&!(argv.inputFile??settings.dualOutput?.inputFile)&&inputFormat!=="stream-json";const configParams={sessionId,sessionData,sessionRestoreProjection,sessionRestoreProjectionSource:boundSessionRestoreProjectionSource,sessionExecutionEngine:hostPolicy?.executionEngine,managedRuntimeEnvironment:hostPolicy?.managedRuntimeEnvironment,onManagedEngineQuarantine:hostPolicy?.onManagedEngineQuarantine,embeddingModel:DEFAULT_QWEN_EMBEDDING_MODEL,sandbox:sandboxConfig,targetDir:cwd,provisionalWorkspace,workflowAncestorTrustProvider:bareMode||safeMode||sshWorkspace||agentHostReadOnly||provisionalWorkspace?void 0:hostPolicy?.workflowAncestorTrustProvider,includeDirectories,loadMemoryFromIncludeDirectories:provisionalWorkspace?false:bareMode||safeMode?includeDirectories.length>0:settings.context?.loadFromIncludeDirectories??false,importFormat:settings.context?.importFormat||"tree",debugMode,question,systemPrompt:argv.systemPrompt,appendSystemPrompt:argv.appendSystemPrompt,outputStyle:resolveOutputStyle(argv.outputStyle,bareMode||safeMode?void 0:settings.general?.outputStyle,outputStyleCatalog),coreTools:bareMode||safeMode?void 0:argv.coreTools||settings.tools?.core||void 0,allowedTools:bareMode||safeMode?argv.allowedTools||void 0:argv.allowedTools||settings.tools?.allowed||void 0,excludeTools:mergedDeny,disabledSlashCommands:disabledSlashCommands.length>0?disabledSlashCommands:void 0,disabledSkillNamesProvider:bareMode||safeMode?void 0:disabledSkillNamesProvider,enabledSkillNamesProvider:bareMode||safeMode?void 0:enabledSkillNamesProvider,skillSettingsListsProvider:bareMode||safeMode?void 0:buildSkillSettingsListsProvider(settings),terminalImageRenderSupportProvider:interactive?async()=>{const{getTerminalImageRenderSupport}=await import("./terminal-image-renderer-C7553YV6.js");return getTerminalImageRenderSupport()}:void 0,disabledSkillLevels:bareMode||safeMode||!Array.isArray(settings.skills?.disabledLevels)?void 0:settings.skills.disabledLevels.filter(isSkillLevel),customSkillDirs:bareMode||safeMode?void 0:(Array.isArray(settings.skills?.directories)?settings.skills.directories:[]).filter(d=>typeof d==="string"&&d.trim().length>0).map(d=>d.trim()),disabledTools:disabledTools.length>0?disabledTools:void 0,visibleTools:visibleTools.length>0?visibleTools:void 0,eagerTools,codeModeOnly:!bareMode&&!safeMode&&settings.tools?.codeModeOnly===true,freeform:settings.tools?.freeform===true,toolSearchThreshold:bareMode||safeMode?0:settings.tools?.toolSearch?.threshold,permissions:{allow:mergedAllow.length>0?mergedAllow:void 0,ask:mergedAsk.length>0?mergedAsk:void 0,deny:mergedDeny.length>0?mergedDeny:void 0,autoMode:bareMode||safeMode?void 0:settings.permissions?.autoMode},toolInvocationGuard:hostPolicy?.toolInvocationGuard,shellExecutionSandbox,onPersistPermissionRule:__name(async(scope,ruleType,rule)=>{const currentSettings=loadSettings(cwd);const settingScope=scope==="project"?"Workspace":"User";const key=`permissions.${ruleType}`;const currentRules=currentSettings.forScope(settingScope).settings.permissions?.[ruleType]??[];if(!currentRules.includes(rule)){currentSettings.setValue(settingScope,key,[...currentRules,rule])}},"onPersistPermissionRule"),toolDiscoveryCommand:bareMode||safeMode?void 0:settings.tools?.discoveryCommand,toolCallCommand:bareMode||safeMode?void 0:settings.tools?.callCommand,mcpServerCommand:bareMode||safeMode?void 0:settings.mcp?.serverCommand,mcpToolIdleTimeoutMs:settings.mcp?.toolIdleTimeoutMs,mcpServers,topTierMcpServers,bundledGeneratedUi:prepareBundledGeneratedUi(settings.experimental?.generatedUi,!bareMode&&!safeMode&&!sshWorkspace&&!agentHostReadOnly&&!provisionalWorkspace&&!sandboxEnabled&&!sandboxConfig&&hostPolicy?.executionEngine!=="managed"),pendingMcpServers,allowedMcpServers:allowedMcpServers?Array.from(allowedMcpServers):void 0,cliAllowedMcpServerNames:argv.allowedMcpServerNames?argv.allowedMcpServerNames.filter(Boolean):void 0,excludedMcpServers:excludedMcpServers?Array.from(excludedMcpServers):void 0,approvalMode,accessibility:{...settings.ui?.accessibility,screenReader},showResponseTokensPerSecond:settings.ui?.showResponseTokensPerSecond===true,telemetry:telemetrySettings,deferTelemetryInitialization:isAcpMode||interactive&&!question,outboundCorrelation:settings.outboundCorrelation,usageStatisticsEnabled:resolveUsageStatisticsEnabled(settings.privacy?.usageStatisticsEnabled),clearContextOnIdle:settings.context?.clearContextOnIdle,fileFiltering:settings.context?.fileFiltering,plansDirectory:settings.plansDirectory,proxy:argv.proxy||settings.proxy||process.env["HTTPS_PROXY"]||process.env["https_proxy"]||process.env["HTTP_PROXY"]||process.env["http_proxy"],cwd,fileDiscoveryService:fileService,bugCommand:settings.advanced?.bugCommand,model:resolvedModel,outputLanguageFilePath,sessionTokenLimit:settings.model?.sessionTokenLimit??-1,maxSessionTurns:argv.maxSessionTurns??settings.model?.maxSessionTurns??-1,goalTokenBudget:resolveGoalTokenBudget(settings),goalMaxTurns:resolveGoalMaxTurns(settings),goalMaxActiveMinutes:resolveGoalMaxActiveMinutes(settings),maxWallTimeSeconds:resolveMaxWallTimeSeconds(argv,settings),maxToolCalls:resolveMaxToolCalls(argv,settings),maxSubagentDepth:resolveMaxSubagentDepth(argv,settings),experimentalZedIntegration:argv.acp||argv.experimentalAcp||false,restoreAskUserQuestion:(argv.acp||argv.experimentalAcp||false)&&argv.restoreAskUserQuestion===true,sessionWriterLeaseEnabled:settings.experimental?.sessionWriterLease===true,cronEnabled:settings.experimental?.cron??true,cronRecurringMaxAgeDays:settings.experimental?.cronRecurringMaxAgeDays,sessionWorkflowEnabled:settings.experimental?.sessionWorkflow??false,lsToolEnabled:settings.tools?.listDirectory?.enabled===true,todoWriteEnabled:settings.tools?.todoWrite?.enabled===true,agentTeamEnabled:settings.experimental?.agentTeam??false,unifiedAgentLoopEnabled:settings.experimental?.unifiedAgentLoop??false,agentCollaborationEnabled:settings.experimental?.agentCollaboration??false,artifactEnabled:settings.experimental?.artifact??true,artifactAutoOpen:settings.artifact?.autoOpen??true,artifactPublisher:settings.artifact?.publisher??"local",artifactHost:settings.artifact?.host?{uploadCommand:settings.artifact?.host?.uploadCommand??"",urlTemplate:settings.artifact?.host?.urlTemplate??"",keyPrefix:settings.artifact?.host?.keyPrefix}:void 0,artifactOss:settings.artifact?.oss?{bucket:settings.artifact?.oss?.bucket??"",endpoint:settings.artifact?.oss?.endpoint??"",keyPrefix:settings.artifact?.oss?.keyPrefix,acl:settings.artifact?.oss?.acl,publicBaseUrl:settings.artifact?.oss?.publicBaseUrl}:void 0,omniEnabled:settings.omni?.enabled??false,omniMaxUploadFileBytes:settings.omni?.processing?.transportGuard?.maxUploadFileBytes,omniMaxEstimatedTokens:settings.omni?.processing?.transportGuard?.maxEstimatedTokens,omniMaxDurationSeconds:settings.omni?.processing?.transportGuard?.maxDurationSeconds,omniUrlDownloadMaxFileBytes:settings.omni?.ingestion?.localization?.url?.maxFileBytes,omniUploadUrlTtlHours:settings.omni?.delivery?.upload?.urlTtlHours,omniUploadBaseUrl:settings.omni?.delivery?.upload?.baseUrl,omniUploadApiKeyEnv:settings.omni?.delivery?.upload?.apiKeyEnv,omniUploadModel:settings.omni?.delivery?.upload?.model,omniPolicyTools:settings.omni?.processing?.policyTools,omniFixedPolicies:settings.omni?.processing?.fixedPolicies,omniTransportGuardPolicies:settings.omni?.processing?.transportGuard?.policies,omniProcessingLimits:settings.omni?.processing?.limits,omniQuarantineRetentionDays:settings.omni?.storage?.quarantine?.retentionDays,omniQuarantineMaxBytes:settings.omni?.storage?.quarantine?.maxBytes,omniStorageRetentionDays:settings.omni?.storage?.retentionDays,omniStorageMaxTotalBytes:settings.omni?.storage?.maxTotalBytes,omniMemory:settings.omni?.memory,emitToolUseSummaries:settings.experimental?.emitToolUseSummaries??true,listExtensions:argv.listExtensions||false,locale:resolveLocaleForExtensions(settings),overrideExtensions:overrideExtensions||argv.extensions,noBrowser:!!process.env["NO_BROWSER"],authType:resolvedCliConfig.authType,inputFormat,outputFormat,includePartialMessages,modelProvidersConfig,providerProtocolConfig,generationConfigSources:resolvedCliConfig.sources,generationConfig:resolvedCliConfig.generationConfig,initialModelRegistryBaseUrl:resolvedCliConfig.registryBaseUrl,warnings:resolvedCliConfig.warnings,bareMode,safeMode,allowedHttpHookUrls:bareMode||safeMode?[]:settings.security?.allowedHttpHookUrls??[],allowPrivateNetworkHooks:bareMode||safeMode?false:settings.security?.allowPrivateNetworkHooks??false,cliVersion:await getCliVersion(),ideMode,chatCompression:settings.model?.chatCompression,autoCompactThreshold:settings.context?.autoCompactThreshold,folderTrust,interactive,trustedFolder,useRipgrep:settings.tools?.useRipgrep,useBuiltinRipgrep:settings.tools?.useBuiltinRipgrep,workflowsEnabled:settings.tools?.workflowsEnabled,workflowKeywordTriggerEnabled:settings.ui?.disableWorkflowKeywordTrigger!==true,workflowSizeGuideline:settings.tools?.workflowSizeGuideline,workflowNameOnly:settings.tools?.workflowNameOnly,modelProposedGoals:normalizeModelProposedGoals(settings.goals?.modelProposed),shouldUseNodePtyShell:settings.tools?.shell?.enableInteractiveShell??(isExplicitOneShotPrompt?false:void 0),shellDefaultTimeoutMs:settings.tools?.shell?.defaultTimeoutMs,shellHeartbeatIntervalMs:settings.tools?.shell?.heartbeatIntervalMs,preventSystemSleep:settings.general?.preventSystemSleep??true,skipNextSpeakerCheck:settings.model?.skipNextSpeakerCheck,skipWorkflowUsageWarning:settings.model?.skipWorkflowUsageWarning??false,skipLoopDetection:settings.model?.skipLoopDetection??true,loopProtection:resolveLoopProtection(settings.model?.loopProtection),maxToolCallsPerTurn:settings.model?.maxToolCallsPerTurn,skipStartupContext:settings.model?.skipStartupContext??false,truncateToolOutputThreshold:settings.tools?.truncateToolOutputThreshold,truncateToolOutputLines:settings.tools?.truncateToolOutputLines,toolOutputBatchBudget:settings.tools?.toolOutputBatchBudget,eventEmitter:appEvents,gitCoAuthor:settings.general?.gitCoAuthor,output:{format:outputSettingsFormat},enableManagedAutoMemory:bareMode||safeMode?false:settings.memory?.enableManagedAutoMemory??true,enableManagedAutoDream:bareMode||safeMode?false:settings.memory?.enableManagedAutoDream??true,enableTeamMemory:bareMode||safeMode?false:settings.memory?.enableTeamMemory??false,enableTeamMemorySync:bareMode||safeMode?false:settings.memory?.enableTeamMemorySync??false,enableStructuredMemoryRecall:bareMode||safeMode?false:settings.memory?.enableStructuredRecall??false,enableAutoSkill:bareMode||safeMode?false:settings.memory?.enableAutoSkill??false,autoSkillConfirm:bareMode||safeMode?false:settings.memory?.autoSkillConfirm??true,memoryAgentTimeoutMinutes:settings.memory?.agentTimeoutMinutes,memoryAgentMaxTurns:settings.memory?.agentMaxTurns,fastModel:settings.fastModel||void 0,advisorModel,advisorMaxUses:settings.advisorMaxUses,webSearch:bareMode||safeMode?{enabled:false}:resolveWebSearchSettings(settings),visionModel:settings.visionModel||void 0,compactionModel:settings.compactionModel||void 0,imageModel:settings.imageModel||void 0,visionBridgeTimeoutMs:settings.visionBridgeTimeoutMs,modelFallbacks:resolveModelFallbacks(argv.fallbackModel,settings.modelFallbacks),...resolveHookSettingsForConfig(settings.hooks,hooksConfig,bareMode||safeMode,mem0Server),disableAllHooks:bareMode||safeMode?true:settings.disableAllHooks??false,stopHookBlockingCap:bareMode||safeMode?void 0:settings.stopHookBlockingCap,channel:argv.channel,jsonFd:argv.jsonFd,jsonFile:argv.jsonFile??settings.dualOutput?.jsonFile,jsonSchema:resolveJsonSchemaArg(argv.jsonSchema),inputFile:argv.inputFile??settings.dualOutput?.inputFile,chatRecording:argv.chatRecording??settings.general?.chatRecording??true,defaultFileEncoding:settings.general?.defaultFileEncoding,lsp:{enabled:lspEnabled},agents:settings.agents?{builtin:settings.agents.builtin?{exploreModel:settings.agents.builtin.exploreModel}:void 0,modelGrades:settings.agents.modelGrades,allowedGrades:settings.agents.allowedGrades,maxParallelAgents:settings.agents.maxParallelAgents,maxParallelAgentsByModel:settings.agents.maxParallelAgentsByModel,displayMode:settings.agents.displayMode,arena:settings.agents.arena?{worktreeBaseDir:settings.agents.arena.worktreeBaseDir,preserveArtifacts:settings.agents.arena.preserveArtifacts??false}:void 0}:void 0,worktree:settings.worktree?{symlinkDirectories:settings.worktree.symlinkDirectories}:void 0,settingsWatcher,agentExecutionBackend:agentExecutionBackend(),executionEnvironmentFactory:agentExecutionFactory()};if(agentHostReadOnly){configParams.coreTools=[...AGENT_HOST_TOOL_NAMES];configParams.disableAllHooks=true;configParams.mcpServers={};configParams.topTierMcpServers=void 0;configParams.pendingMcpServers=void 0;configParams.overrideExtensions=[];configParams.workflowsEnabled=false;configParams.sessionWorkflowEnabled=false;configParams.fileCheckpointingEnabled=false;configParams.cronEnabled=false;configParams.artifactEnabled=false;configParams.omniEnabled=false}if(sshWorkspace){configParams.executionEnvironment=new SshExecutionEnvironment(sshWorkspace,cwd,{outputThreshold:configParams.truncateToolOutputThreshold,shellDefaultTimeoutMs:configParams.shellDefaultTimeoutMs,customIgnoreFiles:configParams.fileFiltering?.customIgnoreFiles});configParams.codeModeOnly=false;configParams.disableAllHooks=true;configParams.mcpServers={};configParams.overrideExtensions=[];configParams.workflowsEnabled=false;configParams.enableManagedAutoMemory=false;configParams.enableManagedAutoDream=false;configParams.enableTeamMemory=false;configParams.enableTeamMemorySync=false;configParams.enableStructuredMemoryRecall=false;configParams.enableAutoSkill=false;configParams.fileCheckpointingEnabled=false;configParams.artifactEnabled=false;configParams.appendSystemPrompt=[argv.appendSystemPrompt,`This is an SSH workspace on ${sshWorkspace.host}. The project directory is ${sshWorkspace.directory}. All file, search and shell tools operate on that remote project. The local directory ${cwd} is only for session storage; it is not the project. Use remote absolute paths or paths relative to the remote project. Read QWEN.md and AGENTS.md at the remote project root before working if they exist. Remote hooks, skills, MCP, LSP, subagents, workflows and worktree management are unavailable in this session.`].filter(Boolean).join("\n\n")}const config=new Config(configParams);if(advisorModel){validateCliAdvisorModel(config,advisorModel,{fastModel:settings.fastModel,currentModel:resolvedModel,currentAuthType:selectedAuthType})}config.setExternalAgentExecutor({create:__name(params=>params.spec.kind==="codex"?import("./codex-subagent-executor-DWWT7246.js").then(module=>module.codexExternalAgentExecutor.create(params)):import("./acp-subagent-executor-AQ7AWSD4.js").then(module=>module.acpExternalAgentExecutor.create(params)),"create")});if(lspEnabled){try{const lspService=new NativeLspService(config,config.getWorkspaceContext(),appEvents,fileService,ideContextStore,{requireTrustedWorkspace:folderTrust});await lspService.discoverAndPrepare();if(config.getDebugMode()){debugLogger2.debug("Native LSP status after discovery:",lspService.getStatusSnapshot())}await lspService.start();if(config.getDebugMode()){debugLogger2.debug("Native LSP status after startup:",lspService.getStatusSnapshot())}lspClient=new NativeLspClient(lspService);config.setLspClient(lspClient);try{config.setLspInitializationError(void 0)}catch{debugLogger2.warn("Failed to clear LSP initialization error after initialization")}}catch(err){try{config.setLspInitializationError(err instanceof Error?err:String(err))}catch{debugLogger2.warn("LSP init error occurred after initialization:",err)}debugLogger2.warn("Failed to initialize native LSP service:",err)}}return config}__name(loadCliConfig,"loadCliConfig");export{isInteractiveInvocation,normalizeDisabledToolList,resolveHookSettingsForConfig,appEvents,OBSERVED_CONTACT_MAX_FRESH_WITHIN_SECONDS,ObservedChannelContactStore,RunBudgetEnforcer,allowsFastOnlyAdvisorModel,isAdvisorModelEligible,checkAdvisorModelAvailability,parseArguments,loadHierarchicalMemory,isDebugMode,buildDisabledSkillNamesProvider,buildEnabledSkillNamesProvider,SessionIdConflictError,loadCliConfig};
|
|
44
44
|
/**
|
|
45
45
|
* @license
|
|
46
46
|
* Copyright 2026 Qwen Team
|