@qwen-code/qwen-code 0.19.9 → 0.19.10-nightly.20260716.506ce0a1a
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundled/qc-helper/docs/configuration/settings.md +14 -6
- package/bundled/qc-helper/docs/features/approval-mode.md +2 -2
- package/bundled/qc-helper/docs/features/channels/dingtalk.md +33 -0
- package/bundled/qc-helper/docs/features/channels/overview.md +64 -20
- package/bundled/qc-helper/docs/features/channels/wecom.md +8 -7
- package/bundled/qc-helper/docs/features/code-review.md +88 -44
- package/bundled/qc-helper/docs/features/commands.md +6 -6
- package/bundled/qc-helper/docs/features/hooks.md +29 -0
- package/bundled/qc-helper/docs/features/sandbox.md +2 -0
- package/bundled/qc-helper/docs/features/sub-agents.md +21 -0
- package/bundled/qc-helper/docs/qwen-serve.md +49 -20
- package/bundled/qc-helper/docs/reference/keyboard-shortcuts.md +1 -1
- package/bundled/review/DESIGN.md +219 -33
- package/bundled/review/SKILL.md +429 -382
- package/chunks/{MaxSizedBox-6HYJ3ZPJ.js → MaxSizedBox-WOC3YDWA.js} +31 -32
- package/chunks/{StandaloneSessionPicker-WS4GXYOG.js → StandaloneSessionPicker-H5HZCAFD.js} +49 -48
- package/chunks/{acpAgent-5FWSOZL5.js → acpAgent-55YDJDNM.js} +922 -550
- package/chunks/{agent-HOLHB3RT.js → agent-H6VE5W3L.js} +26 -27
- package/chunks/{agent-headless-SXL6H56A.js → agent-headless-T4XJOCRU.js} +26 -27
- package/chunks/{anthropicContentGenerator-L73TO3DB.js → anthropicContentGenerator-HBRXJSP4.js} +78 -16
- package/chunks/{artifact-tool-U7IRTLIV.js → artifact-tool-MIZLXBLF.js} +2 -2
- package/chunks/{askUserQuestion-2DLUUZZG.js → askUserQuestion-XMJVPNWM.js} +2 -2
- package/chunks/{bridge-BCJQ7BBB.js → bridge-FTB6ZP3R.js} +31 -34
- package/chunks/{ca-UJ6HC4H2.js → ca-CODEN7TD.js} +9 -1
- package/chunks/channel-worker-group-K7QKH6IG.js +13 -0
- package/chunks/channel-worker-manager-CUDPU4CN.js +418 -0
- package/chunks/channel-worker-supervisor-4XTO2ZD3.js +20 -0
- package/chunks/{chunk-LXNEJD34.js → chunk-2FO5GFKZ.js} +1 -1
- package/chunks/{chunk-VA4KQY6V.js → chunk-2JNR4VP2.js} +3 -3
- package/chunks/{chunk-L36P3NBD.js → chunk-2W3OOD4W.js} +2 -0
- package/chunks/{chunk-7R3CZA3Q.js → chunk-2Z5UX4KI.js} +1 -1
- package/chunks/{chunk-CUMMSHH6.js → chunk-3DWIFU7L.js} +1 -1
- package/chunks/chunk-3MX7D6QN.js +516 -0
- package/chunks/{chunk-SJHDYNHF.js → chunk-4BJVSIS3.js} +3 -3
- package/chunks/{chunk-TO6QE22P.js → chunk-5CNYZ7TN.js} +26 -22
- package/chunks/{chunk-N3EMS75V.js → chunk-5DEJ4T6C.js} +1333 -1232
- package/chunks/chunk-5HBA2Z7V.js +28 -0
- package/chunks/{chunk-ZJE7NSL3.js → chunk-5M6IDOMF.js} +34 -97
- package/chunks/{chunk-SCGXUJBT.js → chunk-6LI3L22E.js} +3 -3
- package/chunks/{chunk-K434OPES.js → chunk-6WPJRYLZ.js} +3 -3
- package/chunks/{chunk-YAUFFXDS.js → chunk-7GM2RWCR.js} +12 -11
- package/chunks/{chunk-OQ4DRIOA.js → chunk-7HWE2W74.js} +2 -2
- package/chunks/{chunk-J4TSQ5EQ.js → chunk-7NFB7LBQ.js} +8 -1
- package/chunks/{chunk-MC23XKFE.js → chunk-A2HWMJVO.js} +37 -3
- package/chunks/{chunk-3G7CIHVV.js → chunk-ABNYOMDG.js} +4 -4
- package/chunks/{chunk-3AHXV67U.js → chunk-AGZLXLBY.js} +1 -1
- package/chunks/{chunk-RDJSGHZE.js → chunk-ALGGS7UH.js} +1 -38
- package/chunks/{chunk-Q4YQW46J.js → chunk-AMRZVQUY.js} +43 -40
- package/chunks/{chunk-W3JHSWRP.js → chunk-AN6C2U46.js} +4 -4
- package/chunks/{chunk-GWHYEOV2.js → chunk-ARKANCNX.js} +2 -1
- package/chunks/{chunk-5SFOMFG4.js → chunk-AVEOWVOM.js} +36 -2
- package/chunks/{chunk-34MW4KTI.js → chunk-BA5JGE5F.js} +2 -2
- package/chunks/{chunk-5HOMWMCL.js → chunk-BSJAQUFD.js} +5492 -1336
- package/chunks/{chunk-L6P4KPHR.js → chunk-BWJKL5DB.js} +58 -38
- package/chunks/{chunk-PVZM22CK.js → chunk-C32JFRGV.js} +5 -5
- package/chunks/{chunk-AKIVHSJR.js → chunk-CZIHPO7L.js} +163 -782
- package/chunks/chunk-DL7RCO6V.js +493 -0
- package/chunks/{chunk-KKNMOEZH.js → chunk-E2UVIFI2.js} +185 -398
- package/chunks/{chunk-5VXNZWGF.js → chunk-ENUQSKEY.js} +1 -1
- package/chunks/{chunk-PDZ7MBDG.js → chunk-EWILX3BM.js} +27 -6
- package/chunks/{chunk-BMGVRZN4.js → chunk-EZWX232B.js} +1 -1
- package/chunks/{chunk-4GORAUCN.js → chunk-F333XEAU.js} +1 -1
- package/chunks/{chunk-YLV3XXFB.js → chunk-FBU7WRZI.js} +17 -1
- package/chunks/chunk-FEOZBUMT.js +77 -0
- package/chunks/{chunk-5U27BZ72.js → chunk-FKEGVMPX.js} +269 -83
- package/chunks/chunk-FNX3LGAK.js +34 -0
- package/chunks/{chunk-LK7KUE55.js → chunk-FSA7ERJ2.js} +1 -1
- package/chunks/{chunk-PODM4SZ4.js → chunk-G3BIBPI7.js} +5 -5
- package/chunks/{chunk-A3XKDTSH.js → chunk-GA65O2TB.js} +4 -4
- package/chunks/{chunk-3BTRNWWD.js → chunk-GOXKNSDZ.js} +1 -64
- package/chunks/{channel-worker-supervisor-WSOAAYUO.js → chunk-GXGIM7QP.js} +67 -35
- package/chunks/{chunk-6PESIEKJ.js → chunk-GXUWGPYX.js} +68 -6
- package/chunks/chunk-GYTKQYDB.js +23 -0
- package/chunks/{chunk-GZRTYZ2R.js → chunk-H3XMJV7T.js} +218 -1
- package/chunks/{chunk-WQUQVGTF.js → chunk-HGRXW4HQ.js} +467 -106
- package/chunks/{chunk-YVEDCAUE.js → chunk-HGT6JR3U.js} +19 -0
- package/chunks/{chunk-ECNYL4AA.js → chunk-HUEWOHKV.js} +1 -1
- package/chunks/chunk-IDS7MSUP.js +74 -0
- package/chunks/{chunk-KHUQZZJ6.js → chunk-IHDRJLLR.js} +382 -36
- package/chunks/{chunk-CLFKOZEK.js → chunk-J4SEAF4X.js} +114 -4
- package/chunks/{chunk-B5ORX3FG.js → chunk-JGUT3LWZ.js} +6 -1
- package/chunks/{chunk-P67PFTUT.js → chunk-KEYEYCHZ.js} +4 -4
- package/chunks/{chunk-ORBGV7NJ.js → chunk-KKRTYONM.js} +6 -4
- package/chunks/{chunk-7PU4FYLG.js → chunk-KOXFAG6P.js} +4 -18
- package/chunks/{chunk-EGYZ275M.js → chunk-KWLVWNF5.js} +55 -7
- package/chunks/{chunk-XLA62MYB.js → chunk-KXECVZPD.js} +2 -2
- package/chunks/{chunk-IAVB3HM3.js → chunk-L4Y55KIS.js} +33 -1
- package/chunks/{chunk-4QLQE5WJ.js → chunk-L5U3ELZX.js} +1 -1
- package/chunks/{chunk-4ZVWQHEQ.js → chunk-LQIDP6K5.js} +1 -1
- package/chunks/{chunk-DC5Z3DU6.js → chunk-LXLTBIDP.js} +43 -6
- package/chunks/chunk-LXXMOYPL.js +22 -0
- package/chunks/{chunk-Q6I5QHMH.js → chunk-MFNKBXYH.js} +1 -1
- package/chunks/chunk-MR3PXB6E.js +48 -0
- package/chunks/{chunk-JZETEN3Z.js → chunk-N45S36AH.js} +3 -3
- package/chunks/{chunk-GWLSNBG4.js → chunk-NA3IG6XG.js} +748 -27
- package/chunks/{chunk-D5SKC4YG.js → chunk-O3M25JXE.js} +213 -29
- package/chunks/{chunk-EAXLGSFP.js → chunk-O6XGHDS5.js} +11 -11
- package/chunks/{chunk-WL4L7EZH.js → chunk-OA4JVLSA.js} +27 -1
- package/chunks/{chunk-X4NKFGFJ.js → chunk-OJAMDVF5.js} +0 -15
- package/chunks/{chunk-BZIFY5TF.js → chunk-OKAIGAYW.js} +3 -3
- package/chunks/{chunk-CNEIYWSA.js → chunk-OVIV236K.js} +5 -5
- package/chunks/{chunk-3SJSQXNS.js → chunk-PEJWA3QQ.js} +12 -8
- package/chunks/{chunk-E2IY465S.js → chunk-PWNOAWXB.js} +59 -12
- package/chunks/{chunk-B4G2WOFA.js → chunk-Q5MKHNIR.js} +28 -5
- package/chunks/{chunk-MXL5UP4X.js → chunk-Q6TUALBE.js} +1 -1
- package/chunks/{chunk-QYMQSECS.js → chunk-QAW7PIHT.js} +2 -2
- package/chunks/{chunk-HKMAENAO.js → chunk-QDTGDM2T.js} +14 -9
- package/chunks/{chunk-LUODI7WD.js → chunk-RCEEXIOO.js} +6 -4
- package/chunks/{chunk-W2UIXQDL.js → chunk-RTV5TUYB.js} +12 -4
- package/chunks/chunk-RW7DUKFO.js +91 -0
- package/chunks/{chunk-NVYTCB5Z.js → chunk-SA6QVLWI.js} +17325 -16259
- package/chunks/chunk-SJSI7PXU.js +59 -0
- package/chunks/{chunk-HVY356M2.js → chunk-SMGBWLNU.js} +3 -3
- package/chunks/{chunk-CEA3E3JB.js → chunk-SPJQO2CE.js} +2 -2
- package/chunks/{chunk-CC2ITGCF.js → chunk-STZQCNN3.js} +49 -6
- package/chunks/{chunk-HPDUL5MF.js → chunk-T2ZDAER2.js} +1 -1
- package/chunks/{chunk-XUOOWUZS.js → chunk-T3TQ3ACP.js} +1 -1
- package/chunks/{chunk-4C5BQ2D2.js → chunk-TIKDHS6V.js} +100 -17
- package/chunks/chunk-TV6K2FB4.js +224 -0
- package/chunks/{chunk-5XUCZNSY.js → chunk-TYLOFD2U.js} +1 -1
- package/chunks/{chunk-D2GFWEXB.js → chunk-UCUUH2JV.js} +6 -6
- package/chunks/{chunk-BAPGSC7U.js → chunk-UZP7K33Y.js} +23 -9
- package/chunks/{chunk-77XJ3SWN.js → chunk-VDAR6UO2.js} +8 -6
- package/chunks/{chunk-XYQSMABS.js → chunk-VKLVGA2D.js} +4 -4
- package/chunks/{chunk-JSG7ZSBC.js → chunk-VRR65QYW.js} +251 -3
- package/chunks/{chunk-U2NNEY4R.js → chunk-VT5AWJN4.js} +1 -1
- package/chunks/{chunk-ZLXQN2QS.js → chunk-WIEO4CWB.js} +1 -1
- package/chunks/{chunk-X6TJ3YZV.js → chunk-WKEO3GLZ.js} +160 -60
- package/chunks/{chunk-J3JA76CF.js → chunk-WTNZ6DXB.js} +1 -1
- package/chunks/{chunk-VWPVHAMO.js → chunk-XIWQ5QST.js} +8 -1
- package/chunks/{chunk-TDEXZKMT.js → chunk-Y66VOBRP.js} +2 -2
- package/chunks/{chunk-3VAGG5T5.js → chunk-YYBZUIPL.js} +1015 -100
- package/chunks/{chunk-CCDMCZPP.js → chunk-YZ3SBNP7.js} +1 -1
- package/chunks/{chunk-ATAKVRIF.js → chunk-Z3XA2TNG.js} +7 -7
- package/chunks/{chunk-EMDMPBJ4.js → chunk-Z7SVC7PJ.js} +10 -3
- package/chunks/{chunk-AURZZYMD.js → chunk-ZIVSSTUG.js} +4 -4
- package/chunks/{chunk-UOZWKTQG.js → chunk-ZPAHLFZU.js} +2 -2
- package/chunks/{chunk-34Z3U5RQ.js → chunk-ZQIYGQCG.js} +765 -168
- package/chunks/{computer-use-HM37RX6A.js → computer-use-NADT7ULB.js} +26 -27
- package/chunks/{config-utils-NV2SVGPB.js → config-utils-IQQT3GCI.js} +3 -2
- package/chunks/{contextCommand-OF5SFGH2.js → contextCommand-U7NEJYJ7.js} +28 -29
- package/chunks/{create-sub-session-INX7TXJI.js → create-sub-session-EAB2U5XW.js} +2 -2
- package/chunks/{create-sub-session-KPRT7ECJ.js → create-sub-session-SUN33INC.js} +26 -27
- package/chunks/{cron-create-AMBKGZX6.js → cron-create-GMVKSXZT.js} +4 -4
- package/chunks/{cron-delete-LRU4OJYG.js → cron-delete-VDZKUAVK.js} +4 -4
- package/chunks/{cron-list-WVP2JXER.js → cron-list-UG7C7RAR.js} +4 -4
- package/chunks/{daemon-ARHTSTXP.js → daemon-SJXEKP3H.js} +773 -126
- package/chunks/daemon-status-provider-WIIYLGZJ.js +74 -0
- package/chunks/{de-EBJN3OVN.js → de-NOXPCSYN.js} +9 -1
- package/chunks/{dist-XKU3ABM5.js → dist-4WCQEZIN.js} +4 -51
- package/chunks/{dist-QYCAEZIT.js → dist-DOPL5LSQ.js} +5 -1
- package/chunks/{dist-WKPOYU7O.js → dist-GXJVCOS7.js} +1 -1
- package/chunks/{dist-R7LN5AZE.js → dist-PX2ERZ6I.js} +2 -2
- package/chunks/{dist-PNVLTKTL.js → dist-V2YVLYOW.js} +215 -33
- package/chunks/{dist-VHV4EVHG.js → dist-VYWUKURL.js} +1 -1
- package/chunks/{earlyInputCapture-3VTHRC4C.js → earlyInputCapture-6FRM6UMU.js} +27 -28
- package/chunks/{edit-VNI4NJ73.js → edit-7GOIQTCZ.js} +27 -28
- package/chunks/{en-5A6LA7RK.js → en-JFVULHTB.js} +11 -1
- package/chunks/{enter-worktree-IYYBKPZT.js → enter-worktree-476E6WIK.js} +26 -27
- package/chunks/{enterPlanMode-GMC5FD5A.js → enterPlanMode-IRJM6W3C.js} +42 -28
- package/chunks/{environment-5HSSRMJ7.js → environment-ROMULS2X.js} +30 -30
- package/chunks/{errors-HMFCJJ7P.js → errors-OUIWPUDY.js} +28 -29
- package/chunks/{exit-worktree-6BHCMP5G.js → exit-worktree-PPSFK753.js} +26 -27
- package/chunks/{exitPlanMode-CJW7G74W.js → exitPlanMode-YKQMD4D7.js} +26 -27
- package/chunks/{fast-path-FRDMDVHG.js → fast-path-CNK2HHKH.js} +3 -3
- package/chunks/{fast-path-settings-5QZE64HR.js → fast-path-settings-DAOVFADC.js} +6 -4
- package/chunks/{fr-YXRABLYZ.js → fr-HVFNU42H.js} +9 -1
- package/chunks/{gemini-QYSEGHAX.js → gemini-WQNFT6TR.js} +216 -90
- package/chunks/{geminiContentGenerator-J7YNZDYP.js → geminiContentGenerator-4QJH2JDP.js} +4 -4
- package/chunks/{glob-BRCSGFOT.js → glob-36TVLBWW.js} +28 -28
- package/chunks/{grep-EE2DUOSY.js → grep-QTYLNO2M.js} +26 -27
- package/chunks/{handleAutoUpdate-5NWTLR67.js → handleAutoUpdate-36FQFODK.js} +30 -31
- package/chunks/{i18n-BASPENNQ.js → i18n-JUGYPVSP.js} +27 -28
- package/chunks/initializer-OBBJUS25.js +72 -0
- package/chunks/{installationInfo-W6V4DT7W.js → installationInfo-MCKTPX64.js} +27 -28
- package/chunks/{ja-7VQOANVG.js → ja-PY5AF544.js} +10 -2
- package/chunks/{keychain-token-storage-VKUBNCP4.js → keychain-token-storage-AU22CQI6.js} +2 -2
- package/chunks/list-VW5QY4VJ.js +75 -0
- package/chunks/loadedSettingsAdapter-IELOOXG6.js +69 -0
- package/chunks/{loop-wakeup-WX7BLWWP.js → loop-wakeup-QXWZSCYM.js} +5 -5
- package/chunks/{ls-ZB2BDP6T.js → ls-2OUTG3IZ.js} +4 -4
- package/chunks/{lsp-V5DN4YUJ.js → lsp-4VMNXZW6.js} +2 -2
- package/chunks/mcp-Q3EC37ZS.js +69 -0
- package/chunks/{monitor-X5Z3H4FY.js → monitor-DCZ27AFR.js} +26 -27
- package/chunks/nonInteractiveCli-KXD7PFO4.js +128 -0
- package/chunks/{notebook-edit-TRM2QIJK.js → notebook-edit-YU4XF5LI.js} +27 -28
- package/chunks/{openaiContentGenerator-AAYONPMF.js → openaiContentGenerator-KL5WER2D.js} +13 -13
- package/chunks/{pidfile-D4I4FTVA.js → pidfile-WBOD7EJV.js} +27 -28
- package/chunks/processUtils-AOV4R34M.js +29 -0
- package/chunks/{pt-2C6YCSHL.js → pt-A3PRQXMU.js} +9 -1
- package/chunks/{qwenContentGenerator-K3HZ2H76.js → qwenContentGenerator-YIGBHYE3.js} +28 -29
- package/chunks/{qwenOAuth2-PJQ27GSO.js → qwenOAuth2-LEYOU7RU.js} +5 -5
- package/chunks/{read-file-7SZSIZOL.js → read-file-WVL4Y76X.js} +9 -9
- package/chunks/{read-mcp-resource-SM5DA4RG.js → read-mcp-resource-JUFHCKSC.js} +2 -2
- package/chunks/{record-artifact-4XKZX3UW.js → record-artifact-DWSMBXYY.js} +2 -2
- package/chunks/{ripGrep-YNPFVCZP.js → ripGrep-6GSWJERP.js} +26 -27
- package/chunks/{ru-6BBHVZZV.js → ru-IBCWUTOC.js} +9 -1
- package/chunks/{run-qwen-serve-DMWV5N6L.js → run-qwen-serve-QYUQMEDT.js} +1233 -371
- package/chunks/{runtime-57WWRVHN.js → runtime-K2YZCNB3.js} +42 -38
- package/chunks/{scheduler-YBLGWSIL.js → scheduler-EQCSN7QV.js} +26 -27
- package/chunks/{send-message-F36YD6KQ.js → send-message-JZ752NWD.js} +3 -3
- package/chunks/{serve-R63NK3CV.js → serve-DX5UGZD4.js} +36 -35
- package/chunks/{server-Z22GCAXP.js → server-T6HJH3DR.js} +5869 -1398
- package/chunks/{session-HKAAI7BN.js → session-SNU6ACY6.js} +299 -100
- package/chunks/{settings-3EYN66GK.js → settings-AKHZZNEL.js} +34 -33
- package/chunks/{shell-6YXINTWJ.js → shell-EY74IEZK.js} +28 -27
- package/chunks/{skill-OO57P4X6.js → skill-DPU62O3H.js} +11 -11
- package/chunks/{spawnChannel-JD7G4VU6.js → spawnChannel-RQZRWJ2V.js} +28 -30
- package/chunks/{src-G5UPLZSZ.js → src-7FITDSVC.js} +164 -52
- package/chunks/{standalone-update-OB7F4JPZ.js → standalone-update-XO3RK6DO.js} +28 -29
- package/chunks/{startInteractiveUI-73EGLIIH.js → startInteractiveUI-DVWZRHYQ.js} +728 -382
- package/chunks/{syntheticOutput-34H7LGA7.js → syntheticOutput-LELY6HAI.js} +3 -3
- package/chunks/{task-create-FRGOEIKY.js → task-create-QY3BIMNM.js} +8 -7
- package/chunks/{task-list-OW766BXZ.js → task-list-D2U47WBJ.js} +6 -5
- package/chunks/{task-stop-SIR5SNBN.js → task-stop-N6E5IYLH.js} +2 -2
- package/chunks/{task-update-YRA532MT.js → task-update-HJCQILLB.js} +8 -7
- package/chunks/{team-create-PECAAPXK.js → team-create-FOSRT62K.js} +26 -27
- package/chunks/{team-delete-6OSECUZC.js → team-delete-RCWYDRF4.js} +6 -5
- package/chunks/{team-plan-approval-L6F434RY.js → team-plan-approval-6VUDV27J.js} +26 -27
- package/chunks/{theme-manager-ZG4RY6GU.js → theme-manager-6UT6IO5T.js} +27 -28
- package/chunks/{todoWrite-YDMFEV4G.js → todoWrite-FKCGATPJ.js} +4 -4
- package/chunks/{tool-search-THVIWAPB.js → tool-search-ASSFMMN5.js} +10 -10
- package/chunks/{total-session-admission-JOKNRIIA.js → total-session-admission-YYWUO23H.js} +32 -35
- package/chunks/tree-sitter-YJVE2ZUK.js +2980 -0
- package/chunks/{trustedFolders-EOGT3UVS.js → trustedFolders-4BWV2IBK.js} +29 -29
- package/chunks/types-ML3TRJQ5.js +16 -0
- package/chunks/update-relaunch-74DLGH73.js +87 -0
- package/chunks/{updateCheck-2KYEYVSB.js → updateCheck-CRFCGFO5.js} +31 -30
- package/chunks/{validateNonInterActiveAuth-EN6ZQSR2.js → validateNonInterActiveAuth-BTTEPBGQ.js} +76 -73
- package/chunks/{version-3UEA6ZIR.js → version-Y5JE5Q63.js} +1 -1
- package/chunks/{web-fetch-PAAEQKBW.js → web-fetch-CFCWTCAP.js} +5 -6
- package/chunks/{workflow-QCCCMYP3.js → workflow-6WC7VPQN.js} +27 -28
- package/chunks/workspace-providers-status-RVG2C5ZS.js +72 -0
- package/chunks/workspace-registration-store-SLEU3D3X.js +27 -0
- package/chunks/{workspace-registry-24QFLQYH.js → workspace-registry-QMWGVOTF.js} +32 -35
- package/chunks/workspace-service-G572JSEU.js +84 -0
- package/chunks/workspace-skills-status-VSSMSMNK.js +71 -0
- package/chunks/{write-file-I3MUDRIE.js → write-file-5XVDRORP.js} +27 -28
- package/chunks/{zh-RQE7I22T.js → zh-PAUNIMHQ.js} +12 -2
- package/chunks/{zh-TW-TBPQGHKH.js → zh-TW-GNEUIUFF.js} +12 -2
- package/cli-entry.js +92 -8
- package/cli.js +11 -11
- package/locales/ca.js +16 -0
- package/locales/de.js +16 -0
- package/locales/en.js +19 -0
- package/locales/fr.js +16 -0
- package/locales/ja.js +17 -1
- package/locales/pt.js +16 -0
- package/locales/ru.js +16 -0
- package/locales/zh-TW.js +20 -1
- package/locales/zh.js +20 -1
- package/package.json +3 -3
- package/web-shell/assets/{arc-C15hqnJe.js → arc-vx1tRwnX.js} +1 -1
- package/web-shell/assets/{architectureDiagram-3BPJPVTR-B-At37J_.js → architectureDiagram-3BPJPVTR-DBi6iUA1.js} +1 -1
- package/web-shell/assets/{blockDiagram-GPEHLZMM-B51wjcU7.js → blockDiagram-GPEHLZMM-Ga9JJ4Ak.js} +1 -1
- package/web-shell/assets/{c4Diagram-AAUBKEIU-xBK7BAwN.js → c4Diagram-AAUBKEIU-D8Vi5FYw.js} +1 -1
- package/web-shell/assets/channel-B29zQDTL.js +1 -0
- package/web-shell/assets/{chunk-2J33WTMH-xKmLg7Yr.js → chunk-2J33WTMH-CSV6yQpU.js} +1 -1
- package/web-shell/assets/{chunk-4BX2VUAB-BfkdKZCM.js → chunk-4BX2VUAB-toYlppdI.js} +1 -1
- package/web-shell/assets/{chunk-55IACEB6-DT713sZf.js → chunk-55IACEB6-DbjzuyAr.js} +1 -1
- package/web-shell/assets/{chunk-727SXJPM-CYEeAamv.js → chunk-727SXJPM-IkkSjSkk.js} +1 -1
- package/web-shell/assets/{chunk-AQP2D5EJ-DBN-5CFd.js → chunk-AQP2D5EJ-D5wUL6Zm.js} +1 -1
- package/web-shell/assets/{chunk-FMBD7UC4-CGZKk4PH.js → chunk-FMBD7UC4-C3o2DXG0.js} +1 -1
- package/web-shell/assets/{chunk-ND2GUHAM-qQbC2O-y.js → chunk-ND2GUHAM-CutIi14T.js} +1 -1
- package/web-shell/assets/{chunk-QZHKN3VN-B3zeXwsX.js → chunk-QZHKN3VN-DZ0NRHH-.js} +1 -1
- package/web-shell/assets/classDiagram-4FO5ZUOK-BNGI2SvC.js +1 -0
- package/web-shell/assets/classDiagram-v2-Q7XG4LA2-BNGI2SvC.js +1 -0
- package/web-shell/assets/{cose-bilkent-S5V4N54A-BKsl1Wvy.js → cose-bilkent-S5V4N54A-B3Dl88UJ.js} +1 -1
- package/web-shell/assets/{dagre-BM42HDAG-CuuuLiBK.js → dagre-BM42HDAG-DfTxfF6-.js} +1 -1
- package/web-shell/assets/{diagram-2AECGRRQ-CG4_eKiV.js → diagram-2AECGRRQ-CJyH98yO.js} +1 -1
- package/web-shell/assets/{diagram-5GNKFQAL-DSFTmZB1.js → diagram-5GNKFQAL-EbOiJNmW.js} +1 -1
- package/web-shell/assets/{diagram-KO2AKTUF-BxwlEHn8.js → diagram-KO2AKTUF-AYNqpqqA.js} +1 -1
- package/web-shell/assets/{diagram-LMA3HP47-BUAg-jMG.js → diagram-LMA3HP47-BY5VPa4H.js} +1 -1
- package/web-shell/assets/{diagram-OG6HWLK6-BFM2jlO5.js → diagram-OG6HWLK6-BhMYAKlk.js} +1 -1
- package/web-shell/assets/{erDiagram-TEJ5UH35-CerbFPa2.js → erDiagram-TEJ5UH35-Bp8S_F9l.js} +1 -1
- package/web-shell/assets/{flowDiagram-I6XJVG4X-BNeZz5Zz.js → flowDiagram-I6XJVG4X-az3TE9PU.js} +1 -1
- package/web-shell/assets/{ganttDiagram-6RSMTGT7-CTOogLaM.js → ganttDiagram-6RSMTGT7-CfkAEpCe.js} +3 -3
- package/web-shell/assets/{gitGraphDiagram-PVQCEYII-yxSFkXPj.js → gitGraphDiagram-PVQCEYII-D1QmjMCy.js} +1 -1
- package/web-shell/assets/index-C8sDwQUv.js +1130 -0
- package/web-shell/assets/index-CaBoc5bb.js +3 -0
- package/web-shell/assets/index-Dpg5Wymg.css +5 -0
- package/web-shell/assets/{infoDiagram-5YYISTIA-DYdAUevm.js → infoDiagram-5YYISTIA-D3ompLrG.js} +1 -1
- package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-CNuijZ90.js → ishikawaDiagram-YF4QCWOH-D3MRWp9I.js} +1 -1
- package/web-shell/assets/{journeyDiagram-JHISSGLW-BTyiuonf.js → journeyDiagram-JHISSGLW-DVkKCa44.js} +1 -1
- package/web-shell/assets/{kanban-definition-UN3LZRKU-DPJo0Uow.js → kanban-definition-UN3LZRKU-BLif81wF.js} +1 -1
- package/web-shell/assets/{linear-C8wKCbIC.js → linear-BDU96EGS.js} +1 -1
- package/web-shell/assets/{mermaid.core-BV5o7nW5.js → mermaid.core-B-CwC26B.js} +5 -5
- package/web-shell/assets/{mindmap-definition-RKZ34NQL-BtLcBmSt.js → mindmap-definition-RKZ34NQL-CS1WOJ4G.js} +1 -1
- package/web-shell/assets/{pieDiagram-4H26LBE5-C22J7A9Q.js → pieDiagram-4H26LBE5-BzgtNXVP.js} +1 -1
- package/web-shell/assets/{quadrantDiagram-W4KKPZXB-DSL10wiL.js → quadrantDiagram-W4KKPZXB-BRfGC8MA.js} +1 -1
- package/web-shell/assets/{requirementDiagram-4Y6WPE33-feqh0UpX.js → requirementDiagram-4Y6WPE33-CPBZkC7g.js} +1 -1
- package/web-shell/assets/{sankeyDiagram-5OEKKPKP-Z4OVaWaZ.js → sankeyDiagram-5OEKKPKP-nqNvinIk.js} +1 -1
- package/web-shell/assets/{sequenceDiagram-3UESZ5HK-DIluIcb1.js → sequenceDiagram-3UESZ5HK-CM_Wdjh3.js} +1 -1
- package/web-shell/assets/{stateDiagram-AJRCARHV-hlhnuoYH.js → stateDiagram-AJRCARHV-L0y-48VE.js} +1 -1
- package/web-shell/assets/stateDiagram-v2-BHNVJYJU-BX1DdF8s.js +1 -0
- package/web-shell/assets/{timeline-definition-PNZ67QCA-Dqf_CqgL.js → timeline-definition-PNZ67QCA-B_n5rb3A.js} +1 -1
- package/web-shell/assets/{vennDiagram-CIIHVFJN-DD2QhaTX.js → vennDiagram-CIIHVFJN-C9NmLV5e.js} +1 -1
- package/web-shell/assets/{wardley-L42UT6IY-B2uI85U_.js → wardley-L42UT6IY-CrefK9gt.js} +1 -1
- package/web-shell/assets/{wardleyDiagram-YWT4CUSO-U1aJX71g.js → wardleyDiagram-YWT4CUSO-BUccf-bC.js} +1 -1
- package/web-shell/assets/{xychartDiagram-2RQKCTM6-C0ODHUee.js → xychartDiagram-2RQKCTM6-DM6ef92l.js} +1 -1
- package/web-shell/index.html +2 -2
- package/chunks/chunk-524RQP4Q.js +0 -305
- package/chunks/chunk-CARU2RR2.js +0 -24
- package/chunks/chunk-CU3L64TP.js +0 -93
- package/chunks/chunk-OCPBI7J5.js +0 -18
- package/chunks/chunk-TEGEBB2I.js +0 -122
- package/chunks/chunk-VTU57BWZ.js +0 -30
- package/chunks/daemon-status-provider-B2UTZUJ2.js +0 -76
- package/chunks/initializer-UTQ7FB7G.js +0 -71
- package/chunks/list-DEICDL65.js +0 -74
- package/chunks/loadedSettingsAdapter-NOWEGDYJ.js +0 -68
- package/chunks/mcp-L5JXEEIA.js +0 -68
- package/chunks/nonInteractiveCli-LS2K4X6A.js +0 -124
- package/chunks/types-JNKGKUJT.js +0 -12
- package/chunks/workspace-providers-status-4KMGETOJ.js +0 -71
- package/chunks/workspace-service-RVLBMSMZ.js +0 -80
- package/chunks/workspace-skills-status-DS4ZVFTO.js +0 -70
- package/web-shell/assets/channel-CLiQD50f.js +0 -1
- package/web-shell/assets/classDiagram-4FO5ZUOK-D3sYqow5.js +0 -1
- package/web-shell/assets/classDiagram-v2-Q7XG4LA2-D3sYqow5.js +0 -1
- package/web-shell/assets/index-D5IWFVk1.css +0 -5
- package/web-shell/assets/index-KFJRDhX7.js +0 -783
- package/web-shell/assets/stateDiagram-v2-BHNVJYJU-BhQMwgpl.js +0 -1
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// Force strict mode and setup for ESM
|
|
2
|
+
"use strict";
|
|
3
|
+
import {
|
|
4
|
+
runExitCleanup
|
|
5
|
+
} from "./chunk-HUEWOHKV.js";
|
|
6
|
+
import {
|
|
7
|
+
init_esbuild_shims
|
|
8
|
+
} from "./chunk-5O2XNYP6.js";
|
|
9
|
+
import {
|
|
10
|
+
__name
|
|
11
|
+
} from "./chunk-J2S4EL5Y.js";
|
|
12
|
+
|
|
13
|
+
// packages/cli/src/utils/processUtils.ts
|
|
14
|
+
init_esbuild_shims();
|
|
15
|
+
var RELAUNCH_EXIT_CODE = 42;
|
|
16
|
+
var UPDATE_RELAUNCH_EXIT_CODE = 43;
|
|
17
|
+
var UPDATE_COMPLETE_EXIT_CODE = 44;
|
|
18
|
+
var SKIP_UPDATE_CHECK_ENV_VAR = "QWEN_CODE_SKIP_UPDATE_CHECK_ONCE";
|
|
19
|
+
var CUSTOM_SANDBOX_IMAGE_ENV_VAR = "QWEN_CODE_CUSTOM_SANDBOX_IMAGE";
|
|
20
|
+
var HOST_UPDATE_RELAUNCH_ENV_VAR = "QWEN_CODE_HOST_UPDATE_RELAUNCH";
|
|
21
|
+
var UPDATE_ON_EXIT_MESSAGE = "qwen-code:update-on-exit";
|
|
22
|
+
async function relaunchApp() {
|
|
23
|
+
await runExitCleanup();
|
|
24
|
+
process.exit(RELAUNCH_EXIT_CODE);
|
|
25
|
+
}
|
|
26
|
+
__name(relaunchApp, "relaunchApp");
|
|
27
|
+
async function relaunchForUpdate() {
|
|
28
|
+
await runExitCleanup();
|
|
29
|
+
process.exit(UPDATE_RELAUNCH_EXIT_CODE);
|
|
30
|
+
}
|
|
31
|
+
__name(relaunchForUpdate, "relaunchForUpdate");
|
|
32
|
+
function requestUpdateOnExit() {
|
|
33
|
+
if (!process.send) return false;
|
|
34
|
+
try {
|
|
35
|
+
process.send({ type: UPDATE_ON_EXIT_MESSAGE });
|
|
36
|
+
return true;
|
|
37
|
+
} catch {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
__name(requestUpdateOnExit, "requestUpdateOnExit");
|
|
42
|
+
|
|
43
|
+
export {
|
|
44
|
+
RELAUNCH_EXIT_CODE,
|
|
45
|
+
UPDATE_RELAUNCH_EXIT_CODE,
|
|
46
|
+
UPDATE_COMPLETE_EXIT_CODE,
|
|
47
|
+
SKIP_UPDATE_CHECK_ENV_VAR,
|
|
48
|
+
CUSTOM_SANDBOX_IMAGE_ENV_VAR,
|
|
49
|
+
HOST_UPDATE_RELAUNCH_ENV_VAR,
|
|
50
|
+
UPDATE_ON_EXIT_MESSAGE,
|
|
51
|
+
relaunchApp,
|
|
52
|
+
relaunchForUpdate,
|
|
53
|
+
requestUpdateOnExit
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* @license
|
|
57
|
+
* Copyright 2025 Google LLC
|
|
58
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
59
|
+
*/
|
|
@@ -5,17 +5,17 @@ import {
|
|
|
5
5
|
Text,
|
|
6
6
|
require_jsx_runtime,
|
|
7
7
|
theme
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-OVIV236K.js";
|
|
9
9
|
import {
|
|
10
10
|
require_react
|
|
11
11
|
} from "./chunk-HTHUX2T5.js";
|
|
12
12
|
import {
|
|
13
13
|
stringWidth,
|
|
14
14
|
toCodePoints
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-MFNKBXYH.js";
|
|
16
16
|
import {
|
|
17
17
|
createDebugLogger
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-7NFB7LBQ.js";
|
|
19
19
|
import {
|
|
20
20
|
init_esbuild_shims
|
|
21
21
|
} from "./chunk-5O2XNYP6.js";
|
|
@@ -5,11 +5,11 @@ import {
|
|
|
5
5
|
} from "./chunk-VGC4I5JJ.js";
|
|
6
6
|
import {
|
|
7
7
|
atomicWriteJSON
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-WIEO4CWB.js";
|
|
9
9
|
import {
|
|
10
10
|
Storage,
|
|
11
11
|
getProjectHash
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-7NFB7LBQ.js";
|
|
13
13
|
import {
|
|
14
14
|
init_esbuild_shims
|
|
15
15
|
} from "./chunk-5O2XNYP6.js";
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"use strict";
|
|
3
3
|
import {
|
|
4
4
|
SessionNotFoundError
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-L4Y55KIS.js";
|
|
6
6
|
import {
|
|
7
7
|
init_esbuild_shims
|
|
8
8
|
} from "./chunk-5O2XNYP6.js";
|
|
@@ -38,6 +38,12 @@ function createWorkspaceSessionOwnerIndex() {
|
|
|
38
38
|
register,
|
|
39
39
|
remove,
|
|
40
40
|
getWorkspaceCwds: /* @__PURE__ */ __name((sessionId) => [...bySessionId.get(sessionId) ?? []], "getWorkspaceCwds"),
|
|
41
|
+
removeWorkspace: /* @__PURE__ */ __name((workspaceCwd) => {
|
|
42
|
+
for (const [sessionId, owners] of bySessionId) {
|
|
43
|
+
owners.delete(workspaceCwd);
|
|
44
|
+
if (owners.size === 0) bySessionId.delete(sessionId);
|
|
45
|
+
}
|
|
46
|
+
}, "removeWorkspace"),
|
|
41
47
|
handleBridgeSessionLifecycle: /* @__PURE__ */ __name((event) => {
|
|
42
48
|
if (event.type === "registered") {
|
|
43
49
|
register(event.sessionId, event.workspaceCwd);
|
|
@@ -81,11 +87,15 @@ function createWorkspaceRegistry(inputRuntimes, options = {}) {
|
|
|
81
87
|
byId.set(runtime.workspaceId, runtime);
|
|
82
88
|
}
|
|
83
89
|
const runtimes = [...inputRuntimes];
|
|
90
|
+
const states = new WeakMap(
|
|
91
|
+
inputRuntimes.map((runtime) => [runtime, "active"])
|
|
92
|
+
);
|
|
84
93
|
const primary = primaryRuntimes[0];
|
|
85
94
|
const sessionOwnerIndex = options.sessionOwnerIndex;
|
|
86
95
|
const scanLiveOwners = /* @__PURE__ */ __name((sessionId) => {
|
|
87
96
|
const matches = [];
|
|
88
97
|
for (const runtime of runtimes) {
|
|
98
|
+
if (states.get(runtime) !== "active") continue;
|
|
89
99
|
try {
|
|
90
100
|
runtime.bridge.getSessionSummary(sessionId);
|
|
91
101
|
matches.push(runtime);
|
|
@@ -107,10 +117,24 @@ function createWorkspaceRegistry(inputRuntimes, options = {}) {
|
|
|
107
117
|
primary,
|
|
108
118
|
// Return a frozen snapshot: `runtimes` is mutable internally (see `add`),
|
|
109
119
|
// but callers must not be able to push/splice into the registry's state.
|
|
110
|
-
list: /* @__PURE__ */ __name(() => Object.freeze(
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
120
|
+
list: /* @__PURE__ */ __name(() => Object.freeze(
|
|
121
|
+
runtimes.filter((runtime) => states.get(runtime) === "active")
|
|
122
|
+
), "list"),
|
|
123
|
+
listManaged: /* @__PURE__ */ __name(() => Object.freeze([...runtimes]), "listManaged"),
|
|
124
|
+
getByWorkspaceCwd: /* @__PURE__ */ __name((workspaceCwd) => {
|
|
125
|
+
const runtime = byCwd.get(workspaceCwd);
|
|
126
|
+
return runtime && states.get(runtime) === "active" ? runtime : void 0;
|
|
127
|
+
}, "getByWorkspaceCwd"),
|
|
128
|
+
getByWorkspaceId: /* @__PURE__ */ __name((workspaceId) => {
|
|
129
|
+
const runtime = byId.get(workspaceId);
|
|
130
|
+
return runtime && states.get(runtime) === "active" ? runtime : void 0;
|
|
131
|
+
}, "getByWorkspaceId"),
|
|
132
|
+
getManagedByWorkspaceCwd: /* @__PURE__ */ __name((workspaceCwd) => byCwd.get(workspaceCwd), "getManagedByWorkspaceCwd"),
|
|
133
|
+
getManagedByWorkspaceId: /* @__PURE__ */ __name((workspaceId) => byId.get(workspaceId), "getManagedByWorkspaceId"),
|
|
134
|
+
resolveWorkspaceCwd: /* @__PURE__ */ __name((workspaceCwd) => workspaceCwd === void 0 ? primary : (() => {
|
|
135
|
+
const runtime = byCwd.get(workspaceCwd);
|
|
136
|
+
return runtime && states.get(runtime) === "active" ? runtime : void 0;
|
|
137
|
+
})(), "resolveWorkspaceCwd"),
|
|
114
138
|
add: /* @__PURE__ */ __name((runtime) => {
|
|
115
139
|
if (byCwd.has(runtime.workspaceCwd)) {
|
|
116
140
|
throw new Error(
|
|
@@ -125,17 +149,36 @@ function createWorkspaceRegistry(inputRuntimes, options = {}) {
|
|
|
125
149
|
byCwd.set(runtime.workspaceCwd, runtime);
|
|
126
150
|
byId.set(runtime.workspaceId, runtime);
|
|
127
151
|
runtimes.push(runtime);
|
|
152
|
+
states.set(runtime, "active");
|
|
128
153
|
}, "add"),
|
|
154
|
+
beginDrain: /* @__PURE__ */ __name((runtime) => {
|
|
155
|
+
if (runtime.primary || states.get(runtime) !== "active") return false;
|
|
156
|
+
states.set(runtime, "draining");
|
|
157
|
+
return true;
|
|
158
|
+
}, "beginDrain"),
|
|
159
|
+
cancelDrain: /* @__PURE__ */ __name((runtime) => {
|
|
160
|
+
if (states.get(runtime) === "draining") states.set(runtime, "active");
|
|
161
|
+
}, "cancelDrain"),
|
|
162
|
+
completeDrain: /* @__PURE__ */ __name((runtime) => {
|
|
163
|
+
if (runtime.primary || states.get(runtime) !== "draining") return;
|
|
164
|
+
states.set(runtime, "removed");
|
|
165
|
+
byCwd.delete(runtime.workspaceCwd);
|
|
166
|
+
byId.delete(runtime.workspaceId);
|
|
167
|
+
const index = runtimes.indexOf(runtime);
|
|
168
|
+
if (index >= 0) runtimes.splice(index, 1);
|
|
169
|
+
sessionOwnerIndex?.removeWorkspace(runtime.workspaceCwd);
|
|
170
|
+
}, "completeDrain"),
|
|
129
171
|
resolveLiveSessionOwner: /* @__PURE__ */ __name((sessionId) => {
|
|
130
172
|
const indexedCwds = sessionOwnerIndex?.getWorkspaceCwds(sessionId) ?? [];
|
|
131
173
|
if (indexedCwds.length > 0) {
|
|
132
174
|
const matches = [];
|
|
133
175
|
for (const workspaceCwd of indexedCwds) {
|
|
134
176
|
const runtime = byCwd.get(workspaceCwd);
|
|
135
|
-
if (!runtime) {
|
|
177
|
+
if (!runtime || states.get(runtime) === "removed") {
|
|
136
178
|
sessionOwnerIndex?.remove(sessionId, workspaceCwd);
|
|
137
179
|
continue;
|
|
138
180
|
}
|
|
181
|
+
if (states.get(runtime) !== "active") continue;
|
|
139
182
|
try {
|
|
140
183
|
runtime.bridge.getSessionSummary(sessionId);
|
|
141
184
|
matches.push(runtime);
|
|
@@ -10,22 +10,24 @@ import {
|
|
|
10
10
|
getLanguageNameFromLocale,
|
|
11
11
|
getLanguageSettingsOptions,
|
|
12
12
|
t
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-7GM2RWCR.js";
|
|
14
14
|
import {
|
|
15
15
|
getHomeEnvFallbackVars,
|
|
16
16
|
loadEnvironment,
|
|
17
17
|
preResolveHomeEnvOverrides
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-6LI3L22E.js";
|
|
19
19
|
import {
|
|
20
20
|
CONSOLIDATED_DISABLE_KEYS,
|
|
21
21
|
V1_INDICATOR_KEYS,
|
|
22
22
|
V1_TO_V2_MIGRATION_MAP,
|
|
23
23
|
V1_TO_V2_PRESERVE_DISABLE_MAP,
|
|
24
24
|
V2_CONTAINER_KEYS,
|
|
25
|
-
getSystemDefaultsPath,
|
|
26
|
-
getSystemSettingsPath,
|
|
27
25
|
resolveEnvVarsInObject
|
|
28
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-GOXKNSDZ.js";
|
|
27
|
+
import {
|
|
28
|
+
getSystemDefaultsPath,
|
|
29
|
+
getSystemSettingsPath
|
|
30
|
+
} from "./chunk-IDS7MSUP.js";
|
|
29
31
|
import {
|
|
30
32
|
ENV_CORRUPTED_PATH,
|
|
31
33
|
ENV_WAS_RECOVERED
|
|
@@ -33,10 +35,10 @@ import {
|
|
|
33
35
|
import {
|
|
34
36
|
isWorkspaceTrusted,
|
|
35
37
|
updateSettingsFilePreservingFormat
|
|
36
|
-
} from "./chunk-
|
|
38
|
+
} from "./chunk-QDTGDM2T.js";
|
|
37
39
|
import {
|
|
38
40
|
require_strip_json_comments
|
|
39
|
-
} from "./chunk-
|
|
41
|
+
} from "./chunk-ALGGS7UH.js";
|
|
40
42
|
import {
|
|
41
43
|
DEFAULT_MAX_SUBAGENT_DEPTH,
|
|
42
44
|
DEFAULT_MAX_TOOL_CALLS_PER_TURN,
|
|
@@ -46,20 +48,20 @@ import {
|
|
|
46
48
|
DEFAULT_TRUNCATE_TOOL_OUTPUT_LINES,
|
|
47
49
|
DEFAULT_TRUNCATE_TOOL_OUTPUT_THRESHOLD,
|
|
48
50
|
stripRuntimeSnapshotPrefix
|
|
49
|
-
} from "./chunk-
|
|
51
|
+
} from "./chunk-SA6QVLWI.js";
|
|
50
52
|
import {
|
|
51
53
|
DEFAULT_QWEN_CUSTOM_IGNORE_FILE_NAMES
|
|
52
|
-
} from "./chunk-
|
|
54
|
+
} from "./chunk-L5U3ELZX.js";
|
|
53
55
|
import {
|
|
54
56
|
DEFAULT_SENSITIVE_SPAN_ATTRIBUTE_MAX_LENGTH,
|
|
55
57
|
SENSITIVE_SPAN_ATTRIBUTE_MAX_LENGTH_LIMIT
|
|
56
|
-
} from "./chunk-
|
|
58
|
+
} from "./chunk-YYBZUIPL.js";
|
|
57
59
|
import {
|
|
58
60
|
FatalConfigError,
|
|
59
61
|
Storage,
|
|
60
62
|
createDebugLogger,
|
|
61
63
|
getErrorMessage
|
|
62
|
-
} from "./chunk-
|
|
64
|
+
} from "./chunk-7NFB7LBQ.js";
|
|
63
65
|
import {
|
|
64
66
|
init_esbuild_shims
|
|
65
67
|
} from "./chunk-5O2XNYP6.js";
|
|
@@ -100,6 +102,18 @@ function getPersistScopeForModelSelection(settings) {
|
|
|
100
102
|
return getModelProvidersOwnerScope(settings) ?? "User" /* User */;
|
|
101
103
|
}
|
|
102
104
|
__name(getPersistScopeForModelSelection, "getPersistScopeForModelSelection");
|
|
105
|
+
function getWritableScopes(settings) {
|
|
106
|
+
return settings.isTrusted ? ["Workspace" /* Workspace */, "User" /* User */] : ["User" /* User */];
|
|
107
|
+
}
|
|
108
|
+
__name(getWritableScopes, "getWritableScopes");
|
|
109
|
+
function getOwnKeyScope(settings, key) {
|
|
110
|
+
for (const scope of getWritableScopes(settings)) {
|
|
111
|
+
const obj = settings.forScope(scope).settings;
|
|
112
|
+
if (Object.prototype.hasOwnProperty.call(obj, key)) return scope;
|
|
113
|
+
}
|
|
114
|
+
return void 0;
|
|
115
|
+
}
|
|
116
|
+
__name(getOwnKeyScope, "getOwnKeyScope");
|
|
103
117
|
|
|
104
118
|
// packages/cli/src/config/settingsSchema.ts
|
|
105
119
|
init_esbuild_shims();
|
|
@@ -486,6 +500,19 @@ var SETTINGS_SCHEMA = {
|
|
|
486
500
|
description: "Play terminal bell sound when response completes or needs approval.",
|
|
487
501
|
showInDialog: true
|
|
488
502
|
},
|
|
503
|
+
notificationMode: {
|
|
504
|
+
type: "enum",
|
|
505
|
+
label: "Notification Mode",
|
|
506
|
+
category: "General",
|
|
507
|
+
requiresRestart: false,
|
|
508
|
+
default: "all",
|
|
509
|
+
description: 'Which unfocused-terminal events fire a bell/OS notification. "all" fires on every tool approval prompt AND on task completion (current behavior). "task-complete" suppresses the per-approval notification and only fires when a long task returns to idle. Requires `terminalBell` to be enabled; otherwise no notifications fire regardless of mode.',
|
|
510
|
+
showInDialog: true,
|
|
511
|
+
options: [
|
|
512
|
+
{ value: "all", label: "All (approvals + task completion)" },
|
|
513
|
+
{ value: "task-complete", label: "Task completion only" }
|
|
514
|
+
]
|
|
515
|
+
},
|
|
489
516
|
preventSystemSleep: {
|
|
490
517
|
type: "boolean",
|
|
491
518
|
label: "Prevent System Sleep While Running",
|
|
@@ -1173,12 +1200,12 @@ var SETTINGS_SCHEMA = {
|
|
|
1173
1200
|
]
|
|
1174
1201
|
},
|
|
1175
1202
|
maxSessionTurns: {
|
|
1176
|
-
type: "
|
|
1203
|
+
type: "integer",
|
|
1177
1204
|
label: "Max Session Turns",
|
|
1178
1205
|
category: "Model",
|
|
1179
1206
|
requiresRestart: false,
|
|
1180
1207
|
default: -1,
|
|
1181
|
-
description: "Maximum number of user/model/tool turns to keep in a session. -1 means unlimited.",
|
|
1208
|
+
description: "Maximum number of user/model/tool turns to keep in a session. Must be an integer; -1 means unlimited.",
|
|
1182
1209
|
showInDialog: false
|
|
1183
1210
|
},
|
|
1184
1211
|
maxWallTimeSeconds: {
|
|
@@ -1254,7 +1281,7 @@ var SETTINGS_SCHEMA = {
|
|
|
1254
1281
|
showInDialog: false
|
|
1255
1282
|
},
|
|
1256
1283
|
maxToolCallsPerTurn: {
|
|
1257
|
-
type: "
|
|
1284
|
+
type: "integer",
|
|
1258
1285
|
label: "Max Tool Calls Per Turn",
|
|
1259
1286
|
category: "Model",
|
|
1260
1287
|
requiresRestart: false,
|
|
@@ -1603,7 +1630,7 @@ var SETTINGS_SCHEMA = {
|
|
|
1603
1630
|
label: "Enable Auto Skill",
|
|
1604
1631
|
category: "Memory",
|
|
1605
1632
|
requiresRestart: false,
|
|
1606
|
-
default:
|
|
1633
|
+
default: false,
|
|
1607
1634
|
description: "Enable background review for reusable project skills after tool-heavy sessions.",
|
|
1608
1635
|
showInDialog: false
|
|
1609
1636
|
},
|
|
@@ -1955,6 +1982,28 @@ var SETTINGS_SCHEMA = {
|
|
|
1955
1982
|
default: false,
|
|
1956
1983
|
description: "Show color in shell output.",
|
|
1957
1984
|
showInDialog: false
|
|
1985
|
+
},
|
|
1986
|
+
defaultTimeoutMs: {
|
|
1987
|
+
type: "integer",
|
|
1988
|
+
minimum: 0,
|
|
1989
|
+
maximum: 6e5,
|
|
1990
|
+
label: "Default Command Timeout (ms)",
|
|
1991
|
+
category: "Tools",
|
|
1992
|
+
requiresRestart: true,
|
|
1993
|
+
default: void 0,
|
|
1994
|
+
description: "Default timeout, in milliseconds, for foreground shell commands started by the agent. A per-call timeout on the shell tool overrides this. When unset, foreground commands time out after 120000 ms (2 minutes). Set to 0 to disable the timeout.",
|
|
1995
|
+
showInDialog: false
|
|
1996
|
+
},
|
|
1997
|
+
heartbeatIntervalMs: {
|
|
1998
|
+
type: "integer",
|
|
1999
|
+
minimum: 0,
|
|
2000
|
+
maximum: 6e5,
|
|
2001
|
+
label: "Silent Command Heartbeat Interval (ms)",
|
|
2002
|
+
category: "Tools",
|
|
2003
|
+
requiresRestart: true,
|
|
2004
|
+
default: void 0,
|
|
2005
|
+
description: "Interval, in milliseconds, between liveness heartbeats emitted while a foreground shell command produces no output. Heartbeats are forwarded to ACP clients and stream-json consumers so they can tell a silent command from a dead session. When unset, heartbeats fire every 10000 ms (10 seconds). Set to 0 to disable heartbeats.",
|
|
2006
|
+
showInDialog: false
|
|
1958
2007
|
}
|
|
1959
2008
|
}
|
|
1960
2009
|
},
|
|
@@ -2013,7 +2062,7 @@ var SETTINGS_SCHEMA = {
|
|
|
2013
2062
|
label: "Tool Approval Mode",
|
|
2014
2063
|
category: "Tools",
|
|
2015
2064
|
requiresRestart: false,
|
|
2016
|
-
default: "
|
|
2065
|
+
default: "auto" /* AUTO */,
|
|
2017
2066
|
description: "Approval mode for tool usage. Controls how tools are approved before execution.",
|
|
2018
2067
|
showInDialog: true,
|
|
2019
2068
|
options: [
|
|
@@ -2407,9 +2456,29 @@ var SETTINGS_SCHEMA = {
|
|
|
2407
2456
|
category: "Advanced",
|
|
2408
2457
|
requiresRestart: false,
|
|
2409
2458
|
default: {},
|
|
2410
|
-
description: "Settings for multi-agent collaboration features (Arena, Team, Swarm).",
|
|
2459
|
+
description: "Settings for built-in agents and multi-agent collaboration features (Arena, Team, Swarm).",
|
|
2411
2460
|
showInDialog: false,
|
|
2412
2461
|
properties: {
|
|
2462
|
+
builtin: {
|
|
2463
|
+
type: "object",
|
|
2464
|
+
label: "Built-in Agents",
|
|
2465
|
+
category: "Advanced",
|
|
2466
|
+
requiresRestart: true,
|
|
2467
|
+
default: {},
|
|
2468
|
+
description: "Settings for built-in subagents.",
|
|
2469
|
+
showInDialog: false,
|
|
2470
|
+
properties: {
|
|
2471
|
+
exploreModel: {
|
|
2472
|
+
type: "string",
|
|
2473
|
+
label: "Explore Model",
|
|
2474
|
+
category: "Model",
|
|
2475
|
+
requiresRestart: true,
|
|
2476
|
+
default: "inherit",
|
|
2477
|
+
description: 'Model selector for the built-in Explore subagent. Use "inherit" for the main session model, "fast" for fastModel, a model ID, or an authType:model-id selector. Custom same-name agents are unaffected.',
|
|
2478
|
+
showInDialog: false
|
|
2479
|
+
}
|
|
2480
|
+
}
|
|
2481
|
+
},
|
|
2413
2482
|
maxParallelAgents: {
|
|
2414
2483
|
type: "number",
|
|
2415
2484
|
label: "Max Parallel Agents",
|
|
@@ -2573,6 +2642,17 @@ var SETTINGS_SCHEMA = {
|
|
|
2573
2642
|
mergeStrategy: "concat" /* CONCAT */,
|
|
2574
2643
|
items: HOOK_DEFINITION_ITEMS
|
|
2575
2644
|
},
|
|
2645
|
+
MessageDisplay: {
|
|
2646
|
+
type: "array",
|
|
2647
|
+
label: "Message Display Hooks",
|
|
2648
|
+
category: "Advanced",
|
|
2649
|
+
requiresRestart: false,
|
|
2650
|
+
default: [],
|
|
2651
|
+
description: "Hooks that execute repeatedly as the assistant reply streams, before the After Agent (Stop) hooks fire.",
|
|
2652
|
+
showInDialog: false,
|
|
2653
|
+
mergeStrategy: "concat" /* CONCAT */,
|
|
2654
|
+
items: HOOK_DEFINITION_ITEMS
|
|
2655
|
+
},
|
|
2576
2656
|
Notification: {
|
|
2577
2657
|
type: "array",
|
|
2578
2658
|
label: "Notification Hooks",
|
|
@@ -4658,7 +4738,10 @@ function saveSettings(settingsFile, updates = settingsFile.originalSettings, rep
|
|
|
4658
4738
|
__name(saveSettings, "saveSettings");
|
|
4659
4739
|
|
|
4660
4740
|
export {
|
|
4741
|
+
getModelProvidersOwnerScope,
|
|
4661
4742
|
getPersistScopeForModelSelection,
|
|
4743
|
+
getWritableScopes,
|
|
4744
|
+
getOwnKeyScope,
|
|
4662
4745
|
TOGGLE_TYPES,
|
|
4663
4746
|
OUTPUT_LANGUAGE_AUTO,
|
|
4664
4747
|
isAutoLanguage,
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
// Force strict mode and setup for ESM
|
|
2
|
+
"use strict";
|
|
3
|
+
import {
|
|
4
|
+
INBOXES_DIR,
|
|
5
|
+
LEADER_NAME,
|
|
6
|
+
TASKS_DIR,
|
|
7
|
+
TEAMMATE_COLORS,
|
|
8
|
+
TEAMS_DIR,
|
|
9
|
+
TEAM_CONFIG_FILENAME
|
|
10
|
+
} from "./chunk-CPBF7KYF.js";
|
|
11
|
+
import {
|
|
12
|
+
atomicWriteJSON
|
|
13
|
+
} from "./chunk-WIEO4CWB.js";
|
|
14
|
+
import {
|
|
15
|
+
Storage,
|
|
16
|
+
isNodeError
|
|
17
|
+
} from "./chunk-7NFB7LBQ.js";
|
|
18
|
+
import {
|
|
19
|
+
init_esbuild_shims
|
|
20
|
+
} from "./chunk-5O2XNYP6.js";
|
|
21
|
+
import {
|
|
22
|
+
__name
|
|
23
|
+
} from "./chunk-J2S4EL5Y.js";
|
|
24
|
+
|
|
25
|
+
// packages/core/src/agents/team/teamHelpers.ts
|
|
26
|
+
init_esbuild_shims();
|
|
27
|
+
import * as fs from "node:fs/promises";
|
|
28
|
+
import * as path from "node:path";
|
|
29
|
+
function getTeamsRootDir() {
|
|
30
|
+
return path.join(Storage.getGlobalQwenDir(), TEAMS_DIR);
|
|
31
|
+
}
|
|
32
|
+
__name(getTeamsRootDir, "getTeamsRootDir");
|
|
33
|
+
function getTeamDir(teamName) {
|
|
34
|
+
return path.join(getTeamsRootDir(), teamName);
|
|
35
|
+
}
|
|
36
|
+
__name(getTeamDir, "getTeamDir");
|
|
37
|
+
function getTeamFilePath(teamName) {
|
|
38
|
+
return path.join(getTeamDir(teamName), TEAM_CONFIG_FILENAME);
|
|
39
|
+
}
|
|
40
|
+
__name(getTeamFilePath, "getTeamFilePath");
|
|
41
|
+
function getInboxesDir(teamName) {
|
|
42
|
+
return path.join(getTeamDir(teamName), INBOXES_DIR);
|
|
43
|
+
}
|
|
44
|
+
__name(getInboxesDir, "getInboxesDir");
|
|
45
|
+
function getTasksDir(teamName) {
|
|
46
|
+
return path.join(Storage.getGlobalQwenDir(), TASKS_DIR, teamName);
|
|
47
|
+
}
|
|
48
|
+
__name(getTasksDir, "getTasksDir");
|
|
49
|
+
function sanitizeName(name) {
|
|
50
|
+
return name.toLowerCase().replace(/[^a-z0-9-]/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "");
|
|
51
|
+
}
|
|
52
|
+
__name(sanitizeName, "sanitizeName");
|
|
53
|
+
function formatAgentId(name, teamName) {
|
|
54
|
+
return `${sanitizeName(name)}@${sanitizeName(teamName)}`;
|
|
55
|
+
}
|
|
56
|
+
__name(formatAgentId, "formatAgentId");
|
|
57
|
+
function generateUniqueTeammateName(baseName, existingMembers) {
|
|
58
|
+
const sanitized = sanitizeName(baseName);
|
|
59
|
+
if (!sanitized) {
|
|
60
|
+
throw new Error(
|
|
61
|
+
`Teammate name "${baseName}" sanitizes to an empty string. Choose a name with at least one alphanumeric character.`
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
if (sanitized === LEADER_NAME) {
|
|
65
|
+
throw new Error(
|
|
66
|
+
`"${LEADER_NAME}" is reserved for the team leader. Choose a different teammate name.`
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
const existingNames = new Set(existingMembers.map((m) => m.name));
|
|
70
|
+
if (existingNames.has(sanitized)) {
|
|
71
|
+
const existingList = [...existingNames].join(", ") || "<none>";
|
|
72
|
+
throw new Error(
|
|
73
|
+
`A teammate named "${sanitized}" already exists in this team (existing: ${existingList}). Choose a different name.`
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
return sanitized;
|
|
77
|
+
}
|
|
78
|
+
__name(generateUniqueTeammateName, "generateUniqueTeammateName");
|
|
79
|
+
function assignTeammateColor(existingMembers) {
|
|
80
|
+
const usedColors = new Set(
|
|
81
|
+
existingMembers.map((m) => m.color).filter((c) => c !== void 0)
|
|
82
|
+
);
|
|
83
|
+
for (const color of TEAMMATE_COLORS) {
|
|
84
|
+
if (!usedColors.has(color)) {
|
|
85
|
+
return color;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return TEAMMATE_COLORS[existingMembers.length % TEAMMATE_COLORS.length];
|
|
89
|
+
}
|
|
90
|
+
__name(assignTeammateColor, "assignTeammateColor");
|
|
91
|
+
function clearTeammateColors(members) {
|
|
92
|
+
return members.map((m) => {
|
|
93
|
+
const { color: _, ...rest } = m;
|
|
94
|
+
return rest;
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
__name(clearTeammateColors, "clearTeammateColors");
|
|
98
|
+
function setMemberActive(members, agentId, isActive) {
|
|
99
|
+
return members.map((m) => m.agentId === agentId ? { ...m, isActive } : m);
|
|
100
|
+
}
|
|
101
|
+
__name(setMemberActive, "setMemberActive");
|
|
102
|
+
function findMemberById(members, agentId) {
|
|
103
|
+
return members.find((m) => m.agentId === agentId);
|
|
104
|
+
}
|
|
105
|
+
__name(findMemberById, "findMemberById");
|
|
106
|
+
function findMemberByName(members, name) {
|
|
107
|
+
const sanitized = sanitizeName(name);
|
|
108
|
+
return members.find((m) => m.name === sanitized);
|
|
109
|
+
}
|
|
110
|
+
__name(findMemberByName, "findMemberByName");
|
|
111
|
+
function classifyShutdownResponse(message) {
|
|
112
|
+
const trimmed = message.trimStart();
|
|
113
|
+
if (/^shutdown_approved\b/i.test(trimmed)) return "shutdown_approved";
|
|
114
|
+
if (/^shutdown_rejected\b/i.test(trimmed)) return "shutdown_rejected";
|
|
115
|
+
return void 0;
|
|
116
|
+
}
|
|
117
|
+
__name(classifyShutdownResponse, "classifyShutdownResponse");
|
|
118
|
+
async function readTeamFile(teamName) {
|
|
119
|
+
const filePath = getTeamFilePath(teamName);
|
|
120
|
+
try {
|
|
121
|
+
const raw = await fs.readFile(filePath, "utf-8");
|
|
122
|
+
return JSON.parse(raw);
|
|
123
|
+
} catch (err) {
|
|
124
|
+
if (isNodeError(err) && err.code === "ENOENT") {
|
|
125
|
+
return void 0;
|
|
126
|
+
}
|
|
127
|
+
throw err;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
__name(readTeamFile, "readTeamFile");
|
|
131
|
+
async function writeTeamFile(teamName, teamFile) {
|
|
132
|
+
const filePath = getTeamFilePath(teamName);
|
|
133
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
134
|
+
await atomicWriteJSON(filePath, teamFile);
|
|
135
|
+
}
|
|
136
|
+
__name(writeTeamFile, "writeTeamFile");
|
|
137
|
+
async function createTeamFile(teamName, teamFile) {
|
|
138
|
+
const filePath = getTeamFilePath(teamName);
|
|
139
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
140
|
+
await fs.writeFile(filePath, JSON.stringify(teamFile, null, 2) + "\n", {
|
|
141
|
+
encoding: "utf-8",
|
|
142
|
+
flag: "wx"
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
__name(createTeamFile, "createTeamFile");
|
|
146
|
+
function isPidAlive(pid) {
|
|
147
|
+
try {
|
|
148
|
+
process.kill(pid, 0);
|
|
149
|
+
return true;
|
|
150
|
+
} catch (err) {
|
|
151
|
+
return isNodeError(err) && err.code === "EPERM";
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
__name(isPidAlive, "isPidAlive");
|
|
155
|
+
async function tryReclaimStaleTeam(teamName) {
|
|
156
|
+
let existing;
|
|
157
|
+
try {
|
|
158
|
+
existing = await readTeamFile(teamName);
|
|
159
|
+
} catch {
|
|
160
|
+
return false;
|
|
161
|
+
}
|
|
162
|
+
if (!existing) {
|
|
163
|
+
await deleteTeamDirs(teamName);
|
|
164
|
+
return true;
|
|
165
|
+
}
|
|
166
|
+
if (typeof existing.leadPid !== "number" || existing.leadPid <= 0) {
|
|
167
|
+
return false;
|
|
168
|
+
}
|
|
169
|
+
if (existing.leadPid !== process.pid && isPidAlive(existing.leadPid)) {
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
await deleteTeamDirs(teamName);
|
|
173
|
+
return true;
|
|
174
|
+
}
|
|
175
|
+
__name(tryReclaimStaleTeam, "tryReclaimStaleTeam");
|
|
176
|
+
async function deleteTeamDirs(teamName) {
|
|
177
|
+
const teamDir = getTeamDir(teamName);
|
|
178
|
+
const tasksDir = getTasksDir(teamName);
|
|
179
|
+
await Promise.allSettled([
|
|
180
|
+
fs.rm(teamDir, { recursive: true, force: true }),
|
|
181
|
+
fs.rm(tasksDir, { recursive: true, force: true })
|
|
182
|
+
]);
|
|
183
|
+
}
|
|
184
|
+
__name(deleteTeamDirs, "deleteTeamDirs");
|
|
185
|
+
async function listTeamNames() {
|
|
186
|
+
const teamsRoot = getTeamsRootDir();
|
|
187
|
+
try {
|
|
188
|
+
const entries = await fs.readdir(teamsRoot, {
|
|
189
|
+
withFileTypes: true
|
|
190
|
+
});
|
|
191
|
+
return entries.filter((e) => e.isDirectory()).map((e) => e.name);
|
|
192
|
+
} catch {
|
|
193
|
+
return [];
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
__name(listTeamNames, "listTeamNames");
|
|
197
|
+
|
|
198
|
+
export {
|
|
199
|
+
getTeamsRootDir,
|
|
200
|
+
getTeamDir,
|
|
201
|
+
getTeamFilePath,
|
|
202
|
+
getInboxesDir,
|
|
203
|
+
getTasksDir,
|
|
204
|
+
sanitizeName,
|
|
205
|
+
formatAgentId,
|
|
206
|
+
generateUniqueTeammateName,
|
|
207
|
+
assignTeammateColor,
|
|
208
|
+
clearTeammateColors,
|
|
209
|
+
setMemberActive,
|
|
210
|
+
findMemberById,
|
|
211
|
+
findMemberByName,
|
|
212
|
+
classifyShutdownResponse,
|
|
213
|
+
readTeamFile,
|
|
214
|
+
writeTeamFile,
|
|
215
|
+
createTeamFile,
|
|
216
|
+
tryReclaimStaleTeam,
|
|
217
|
+
deleteTeamDirs,
|
|
218
|
+
listTeamNames
|
|
219
|
+
};
|
|
220
|
+
/**
|
|
221
|
+
* @license
|
|
222
|
+
* Copyright 2025 Qwen
|
|
223
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
224
|
+
*/
|