@qwen-code/qwen-code 0.19.3 → 0.19.4-nightly.20260702.46814e4f1
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/loop/SKILL.md +22 -3
- package/bundled/loop/SKILL.test.ts +20 -0
- package/bundled/loop/autonomous-loop.test.ts +59 -0
- package/bundled/loop/autonomous-loop.ts +102 -0
- package/bundled/loop/loop-task-file.test.ts +1064 -0
- package/bundled/loop/loop-task-file.ts +404 -0
- package/bundled/loop/loop-tick-resolver.test.ts +906 -0
- package/bundled/loop/loop-tick-resolver.ts +416 -0
- package/bundled/qc-helper/SKILL.md +12 -5
- package/bundled/qc-helper/docs/configuration/auth.md +1 -1
- package/bundled/qc-helper/docs/configuration/settings.md +62 -32
- package/bundled/qc-helper/docs/features/approval-mode.md +3 -0
- package/bundled/qc-helper/docs/features/auto-mode.md +40 -0
- package/bundled/qc-helper/docs/features/channels/overview.md +81 -18
- package/bundled/qc-helper/docs/features/channels/plugins.md +1 -1
- package/bundled/qc-helper/docs/features/code-review.md +17 -61
- package/bundled/qc-helper/docs/features/commands.md +42 -40
- package/bundled/qc-helper/docs/features/headless.md +19 -18
- package/bundled/qc-helper/docs/features/hooks.md +6 -1
- package/bundled/qc-helper/docs/features/mcp.md +3 -1
- package/bundled/qc-helper/docs/features/memory.md +1 -1
- package/bundled/qc-helper/docs/features/scheduled-tasks.md +10 -0
- package/bundled/qc-helper/docs/features/status-line.md +3 -3
- package/bundled/qc-helper/docs/ide-integration/ide-integration.md +4 -4
- package/bundled/qc-helper/docs/qwen-serve.md +53 -0
- package/bundled/qc-helper/docs/support/troubleshooting.md +11 -0
- package/bundled/review/DESIGN.md +21 -26
- package/bundled/review/SKILL.md +45 -129
- package/chunks/MaxSizedBox-GHGRQ2OS.js +69 -0
- package/chunks/{StandaloneSessionPicker-Z52JTYST.js → StandaloneSessionPicker-G7YTTM27.js} +49 -42
- package/chunks/{acpAgent-7RZUOWOM.js → acpAgent-SDOILBSU.js} +1325 -365
- package/chunks/{agent-4FG7WTHJ.js → agent-NTSXGV4L.js} +31 -25
- package/chunks/agent-headless-WYURMSAB.js +62 -0
- package/chunks/{anthropicContentGenerator-PFITVL7Y.js → anthropicContentGenerator-WL3LJOUB.js} +110 -31
- package/chunks/{artifact-tool-D2X7G3C3.js → artifact-tool-W76WC2JX.js} +3 -3
- package/chunks/{askUserQuestion-UGETICJQ.js → askUserQuestion-J3P6TH3V.js} +2 -2
- package/chunks/bridge-AMOL4W4P.js +73 -0
- package/chunks/{ca-IUFWESZL.js → ca-HCMB2I54.js} +10 -9
- package/chunks/channel-worker-supervisor-C3IB63V7.js +659 -0
- package/chunks/{chunk-STUWFKGD.js → chunk-26JIREA5.js} +466 -543
- package/chunks/{chunk-SLNKLLEO.js → chunk-2MRV62AU.js} +37 -8
- package/chunks/{chunk-ODLIHNOY.js → chunk-2U4HUMOL.js} +1 -1
- package/chunks/{chunk-CKQA6AWF.js → chunk-4D73HUOP.js} +1 -1
- package/chunks/{chunk-M2U5NM24.js → chunk-54YZOP7P.js} +309 -72
- package/chunks/{chunk-J7FA27RO.js → chunk-5LKL3PAU.js} +3 -3
- package/chunks/chunk-5P5XGNYH.js +93 -0
- package/chunks/{chunk-UFLGERMB.js → chunk-6JE32BRB.js} +178 -124
- package/chunks/{chunk-FKAVULLM.js → chunk-75AVTQJ2.js} +74 -10
- package/chunks/{chunk-I2LYBGNI.js → chunk-7IOMIYOE.js} +1 -1
- package/chunks/{chunk-4LUZAKMK.js → chunk-7KXAGQJ2.js} +1 -1
- package/chunks/{chunk-BXSHL2SF.js → chunk-7LUOQJ3D.js} +1 -1
- package/chunks/{chunk-YAINVQ3Q.js → chunk-A5OPLHFM.js} +18693 -17055
- package/chunks/chunk-AHNXYU4O.js +24 -0
- package/chunks/{chunk-UX4SGCGN.js → chunk-AVQDCKNF.js} +96 -22
- package/chunks/{chunk-HYCC3XM3.js → chunk-B236XPGF.js} +1 -1
- package/chunks/chunk-B6SZLQAZ.js +3523 -0
- package/chunks/{chunk-5DWXLGOM.js → chunk-BJBWRCSK.js} +1 -1
- package/chunks/chunk-BPFJQGY7.js +193 -0
- package/chunks/{chunk-SKQZZVAV.js → chunk-BZHLWC6T.js} +2 -2
- package/chunks/{chunk-U3KSMM7G.js → chunk-D5KISTLW.js} +339 -383
- package/chunks/{chunk-GT2FGICD.js → chunk-DE7YXUR7.js} +1 -1
- package/chunks/{chunk-BUUQ5HPX.js → chunk-DG573EOO.js} +1 -1
- package/chunks/{chunk-VVLOGDB6.js → chunk-DX3TKXNT.js} +2 -2
- package/chunks/chunk-E5A7LHNN.js +51 -0
- package/chunks/{chunk-3PJXIDKI.js → chunk-E6US47KI.js} +3 -27
- package/chunks/{chunk-QBZ22PQX.js → chunk-EWALXUAD.js} +3 -1
- package/chunks/{chunk-PDE7CSDS.js → chunk-FXKI7OW6.js} +2 -2
- package/chunks/{chunk-F3ZYSEY6.js → chunk-FY4TT4L4.js} +3 -3
- package/chunks/{chunk-QLDPRILK.js → chunk-G7OQ3RFJ.js} +3 -3
- package/chunks/{chunk-R2BXK7SX.js → chunk-GHOTR7HL.js} +6 -1
- package/chunks/{chunk-KMGMKW5Q.js → chunk-GLPV75ES.js} +9 -3
- package/chunks/{chunk-LD2XBG6Z.js → chunk-GO6LNQXT.js} +1 -39
- package/chunks/{chunk-CNLEDYE3.js → chunk-H6TNLOLM.js} +5 -5
- package/chunks/{chunk-JVHEVCAU.js → chunk-HLW4EGKR.js} +31 -6
- package/chunks/{chunk-I4H7PRWQ.js → chunk-HTWHAN44.js} +1 -1
- package/chunks/{chunk-QE6KJYLT.js → chunk-IPYE5BIS.js} +123 -25
- package/chunks/{chunk-EJYJYJZ2.js → chunk-IRJWHZWU.js} +3 -70
- package/chunks/{chunk-EDMZZFDU.js → chunk-J3YPTTNL.js} +930 -798
- package/chunks/{chunk-GGBIN5K7.js → chunk-JGAJMIJZ.js} +1 -1
- package/chunks/{chunk-N4EJFBN5.js → chunk-JVLP5US5.js} +427 -263
- package/chunks/{chunk-R5OP2ATH.js → chunk-JZG7VB6C.js} +11 -11
- package/chunks/{chunk-QI7GOGJR.js → chunk-KKQWC6WS.js} +1 -1
- package/chunks/{chunk-ADCIHOQZ.js → chunk-KX5QZRW2.js} +142 -30
- package/chunks/{chunk-SBBN4BWR.js → chunk-L7OJ3ZO3.js} +1 -1
- package/chunks/{chunk-NDOC6M5S.js → chunk-L7QPM2YD.js} +2 -2
- package/chunks/{chunk-BVSVIN45.js → chunk-LKWAVAB5.js} +3 -3
- package/chunks/{chunk-T4T2FNV4.js → chunk-LOW52WYZ.js} +2 -2
- package/chunks/{chunk-4QK3O43S.js → chunk-LU7BIVWC.js} +4 -4
- package/chunks/{chunk-ZP6UKOPB.js → chunk-LWGLBVWA.js} +1 -1
- package/chunks/{chunk-L7OKCI7T.js → chunk-M7BLWURA.js} +15 -1
- package/chunks/{chunk-PR32FRT6.js → chunk-MIM62IXS.js} +3 -3
- package/chunks/{chunk-RD6YJJJ6.js → chunk-MOUXUCXQ.js} +1 -1
- package/chunks/{chunk-VBZ452JT.js → chunk-MSNGFH6L.js} +494 -114
- package/chunks/{chunk-BX5YO7UW.js → chunk-MTNTVOJR.js} +542 -370
- package/chunks/chunk-MX2YXRER.js +44 -0
- package/chunks/chunk-NIOPRZNN.js +27 -0
- package/chunks/{chunk-SMYQZVZ3.js → chunk-NOGSPTLJ.js} +1 -1
- package/chunks/{chunk-DDMOU62Q.js → chunk-NPQWQYU6.js} +1 -1
- package/chunks/{chunk-MNF6S5PR.js → chunk-P5THQV6A.js} +4 -4
- package/chunks/{chunk-6V4NZFUS.js → chunk-PCYOT4PK.js} +5 -5
- package/chunks/{chunk-CF6BB3LT.js → chunk-PPFWEV7G.js} +10 -1
- package/chunks/{chunk-FXKVLFFY.js → chunk-PSFDB5FZ.js} +3 -3
- package/chunks/{chunk-XJYUPHRC.js → chunk-QOMAHFYI.js} +3 -3
- package/chunks/{chunk-J37FGIOA.js → chunk-QXPI7FEC.js} +38 -4
- package/chunks/{chunk-RRFZXMYP.js → chunk-QZDBHNMV.js} +691 -164
- package/chunks/{chunk-S7AKE7HL.js → chunk-R6RI2HIC.js} +63 -9
- package/chunks/{chunk-HZT4UCFB.js → chunk-RB7S52NJ.js} +4 -4
- package/chunks/{chunk-J33ZR6OJ.js → chunk-RK22ACPP.js} +16 -16
- package/chunks/chunk-RM3PGSGL.js +66 -0
- package/chunks/chunk-RNBYOUGV.js +42 -0
- package/chunks/chunk-S6RLAIUR.js +23 -0
- package/chunks/{chunk-3TV3HUWZ.js → chunk-SCYK2YLI.js} +81 -30
- package/chunks/{chunk-HPZTOP4I.js → chunk-SEKRT4SD.js} +133 -23
- package/chunks/chunk-SEZC2725.js +36 -0
- package/chunks/chunk-SIUQ3YYX.js +78 -0
- package/chunks/{chunk-O2VBQ3Y2.js → chunk-SJBIFVD2.js} +2 -2
- package/chunks/chunk-SYCJMSIJ.js +82 -0
- package/chunks/{chunk-JE5FVRPC.js → chunk-T22H4V4R.js} +48 -23
- package/chunks/{chunk-3227DZO4.js → chunk-T42ACHFI.js} +1 -1
- package/chunks/{chunk-UO5GVXQE.js → chunk-TENOUWY2.js} +3 -3
- package/chunks/{chunk-JOLIREYR.js → chunk-TOAUDIS7.js} +1 -1
- package/chunks/{chunk-QNKBEJO2.js → chunk-UA6XBZT7.js} +2776 -1289
- package/chunks/{chunk-O75BHFQW.js → chunk-UQTYK5SS.js} +2 -2
- package/chunks/{chunk-Y6YMRS3U.js → chunk-UY2TCIZS.js} +17 -3
- package/chunks/{chunk-FNJ7BDPH.js → chunk-UY7ZAYTY.js} +10 -7
- package/chunks/{chunk-UYT3MWEB.js → chunk-UYHWM24C.js} +30 -2
- package/chunks/{chunk-SMXULRAN.js → chunk-VXGPYF7U.js} +1 -1
- package/chunks/{chunk-BTLJ2MF5.js → chunk-W7CG5HPC.js} +3 -3
- package/chunks/{chunk-JJXWTVSK.js → chunk-XHZKDN7M.js} +34 -1
- package/chunks/{chunk-K5XU6E4T.js → chunk-XKSCTXPK.js} +2 -2
- package/chunks/chunk-Y4LITCRB.js +367 -0
- package/chunks/chunk-YHTNWGRR.js +239 -0
- package/chunks/{chunk-BKXBARJZ.js → chunk-YPCPZSZB.js} +1 -1
- package/chunks/{chunk-QWFNTRH4.js → chunk-YSM24SCE.js} +1 -1
- package/chunks/chunk-YTFBURQD.js +313 -0
- package/chunks/{chunk-NL4C3H6C.js → chunk-YXK4GPYO.js} +1 -1
- package/chunks/{chunk-RYLJU2DY.js → chunk-ZN5T4BHI.js} +1 -1
- package/chunks/{computer-use-JGB36FDW.js → computer-use-MTSVPLPY.js} +34 -28
- package/chunks/contextCommand-VGJ3BPTK.js +67 -0
- package/chunks/{cron-create-SKEY55RG.js → cron-create-6YTCOX6P.js} +4 -4
- package/chunks/{cron-delete-I3NAT32Z.js → cron-delete-E3NIFSUK.js} +4 -4
- package/chunks/{cron-list-6XRRL6TH.js → cron-list-Q64MNQNE.js} +4 -4
- package/chunks/daemon-EEB2RYOL.js +8453 -0
- package/chunks/daemon-status-provider-H5SNMK42.js +71 -0
- package/chunks/{de-EOW5PVHF.js → de-PLLFDERI.js} +10 -9
- package/chunks/{dist-NHEYYB2B.js → dist-ADMIQGHI.js} +2 -2
- package/chunks/{dist-J37VXPLD.js → dist-BCQ7INM7.js} +40 -15
- package/chunks/{dist-663NZ6MI.js → dist-KNZFCY5F.js} +116 -11
- package/chunks/{dist-LB6OGPVM.js → dist-LHUWC3K6.js} +26 -5
- package/chunks/{dist-PQPZ5Q4N.js → dist-WBBZ76JZ.js} +20 -9
- package/chunks/{earlyInputCapture-44RISVVJ.js → earlyInputCapture-U4ZIQSQU.js} +32 -26
- package/chunks/{edit-NN6GM5DT.js → edit-SYIQ2KBI.js} +41 -38
- package/chunks/{en-HPWEJBTR.js → en-M4EBUBNU.js} +32 -10
- package/chunks/{enter-worktree-PB3O2C7D.js → enter-worktree-HPPOO244.js} +31 -25
- package/chunks/{enterPlanMode-YQFNNSUA.js → enterPlanMode-56YYO52U.js} +41 -25
- package/chunks/{errors-LS7XU5DZ.js → errors-EO4SXCFP.js} +33 -27
- package/chunks/{exit-worktree-E2FTNSBK.js → exit-worktree-UDM7E6XH.js} +31 -25
- package/chunks/{exitPlanMode-GLYK2BUB.js → exitPlanMode-M6P3AWLJ.js} +149 -33
- package/chunks/{fast-path-WQ6M7LI7.js → fast-path-42P4QYWI.js} +33 -14
- package/chunks/{fast-path-settings-OAGU3X5H.js → fast-path-settings-UQLRFDQP.js} +2 -2
- package/chunks/{fr-BN5NKSAC.js → fr-MBMNQSQ6.js} +10 -9
- package/chunks/{gemini-2YFLVA2M.js → gemini-NRLXS5J7.js} +84 -70
- package/chunks/{geminiContentGenerator-XV6SV6CD.js → geminiContentGenerator-DLJPYYPA.js} +41 -5
- package/chunks/{glob-2H6CDDMK.js → glob-JPY3F74Y.js} +31 -25
- package/chunks/{grep-VXIUXM3C.js → grep-HW23YES5.js} +31 -25
- package/chunks/initializer-HWOZTC4A.js +67 -0
- package/chunks/{ja-7DEUB2TS.js → ja-HFV5QCHR.js} +10 -9
- package/chunks/{keychain-token-storage-YLMDLKXT.js → keychain-token-storage-GPAKRDKQ.js} +2 -2
- package/chunks/list-OZGAGRDG.js +71 -0
- package/chunks/loadedSettingsAdapter-RUTZVVIA.js +66 -0
- package/chunks/{loop-wakeup-CITGGQHA.js → loop-wakeup-G2EHBRGR.js} +5 -5
- package/chunks/{ls-R5WP4BGZ.js → ls-IDHUVSAG.js} +4 -4
- package/chunks/{lsp-GSICJMMW.js → lsp-FSRYXGFT.js} +2 -2
- package/chunks/{monitor-HKLRS2HQ.js → monitor-QVWEIXU3.js} +33 -26
- package/chunks/nonInteractiveCli-RV2WYPML.js +109 -0
- package/chunks/{notebook-edit-Y6SKSGTT.js → notebook-edit-B26W3FFH.js} +37 -34
- package/chunks/{openaiContentGenerator-J7G2FYJT.js → openaiContentGenerator-6TH7AZGQ.js} +15 -13
- package/chunks/pidfile-KW2QQJZI.js +73 -0
- package/chunks/{pt-TNZRNLQB.js → pt-2THT3YHA.js} +10 -9
- package/chunks/{qwenContentGenerator-5XIEM5GV.js → qwenContentGenerator-5IQAC7RN.js} +33 -27
- package/chunks/{qwenOAuth2-AG3PFFLZ.js → qwenOAuth2-LWLA6MQG.js} +5 -4
- package/chunks/{read-file-J7D552ZJ.js → read-file-CWFAHOI2.js} +11 -10
- package/chunks/{read-mcp-resource-DQQW7H7T.js → read-mcp-resource-PIJF24RO.js} +2 -2
- package/chunks/ripGrep-FTZGDKY4.js +60 -0
- package/chunks/{ru-NIAUBKCN.js → ru-Z67YJHBG.js} +10 -9
- package/chunks/{run-qwen-serve-SGEEVMXD.js → run-qwen-serve-FN2SW5ZI.js} +545 -97
- package/chunks/{scheduler-7CQI3S4Q.js → scheduler-BMS23O3I.js} +31 -25
- package/chunks/{send-message-EE4TWKVU.js → send-message-33PYFMCT.js} +20 -4
- package/chunks/serve-PXFYKL65.js +71 -0
- package/chunks/{server-4QMUWXPW.js → server-BRKALJ4F.js} +4132 -1175
- package/chunks/{session-NRO7UFOY.js → session-AQMISBP4.js} +205 -64
- package/chunks/{settings-SGWRDQSC.js → settings-JCPVUZMB.js} +35 -29
- package/chunks/{shell-62ANGIHL.js → shell-POHCRVN2.js} +31 -25
- package/chunks/{skill-VWAQAWW6.js → skill-QPEVHS6H.js} +13 -12
- package/chunks/spawnChannel-V3QT62TE.js +69 -0
- package/chunks/{src-KUV5J5Q2.js → src-IZSP7L6Y.js} +127 -32
- package/chunks/{startInteractiveUI-6EYJN3JV.js → startInteractiveUI-63KATISO.js} +16762 -16075
- package/chunks/{syntheticOutput-T5YHQ6S2.js → syntheticOutput-YOSWIHDJ.js} +3 -3
- package/chunks/{task-create-BLY7RHXX.js → task-create-NHS2NGB3.js} +9 -7
- package/chunks/{task-list-3QUYNVYR.js → task-list-5UIB564R.js} +7 -6
- package/chunks/{task-stop-U4RATK2V.js → task-stop-HGXZ2VZ3.js} +2 -2
- package/chunks/{task-update-U54O7KJX.js → task-update-IYYWUILG.js} +40 -7
- package/chunks/{team-create-LPOGCPM7.js → team-create-E5O2F3CA.js} +31 -25
- package/chunks/{team-delete-LKBYPASD.js → team-delete-FEKJCU4P.js} +7 -6
- package/chunks/team-plan-approval-2TU4YROB.js +202 -0
- package/chunks/theme-manager-37KOGPJL.js +64 -0
- package/chunks/{todoWrite-OYXKTVYN.js → todoWrite-TKMVZ2HT.js} +4 -4
- package/chunks/{tool-search-YPUFJ3ZQ.js → tool-search-4ZTGNSFI.js} +38 -11
- package/chunks/{trustedFolders-5B24TMEA.js → trustedFolders-RJ5WXJ6L.js} +32 -26
- package/chunks/{validateNonInterActiveAuth-BTDTYOVT.js → validateNonInterActiveAuth-ZWMHZAOK.js} +66 -55
- package/chunks/{web-fetch-EEB5LZYU.js → web-fetch-J4PIW36Q.js} +5 -4
- package/chunks/{workflow-LAWIW5LI.js → workflow-6PG2PC5M.js} +68 -39
- package/chunks/workspace-providers-status-4QIZN2W4.js +68 -0
- package/chunks/workspace-service-CYMCOEIO.js +78 -0
- package/chunks/{write-file-PCV226DJ.js → write-file-R354LGQF.js} +41 -40
- package/chunks/{zh-5EUYXASN.js → zh-SLZNSSZB.js} +32 -10
- package/chunks/{zh-TW-TR3XYGE5.js → zh-TW-P53C2SL5.js} +32 -10
- package/cli.js +6 -6
- package/locales/ca.js +15 -13
- package/locales/de.js +15 -13
- package/locales/en.js +52 -15
- package/locales/fr.js +15 -14
- package/locales/ja.js +15 -14
- package/locales/pt.js +15 -13
- package/locales/ru.js +15 -13
- package/locales/zh-TW.js +50 -14
- package/locales/zh.js +50 -14
- package/node_modules/@qwen-code/audio-capture/package.json +1 -1
- package/node_modules/@qwen-code/audio-capture/prebuilds/darwin-arm64/@qwen-code+audio-capture.node +0 -0
- package/node_modules/@qwen-code/audio-capture/prebuilds/darwin-x64/@qwen-code+audio-capture.node +0 -0
- package/node_modules/@qwen-code/audio-capture/prebuilds/win32-x64/@qwen-code+audio-capture.node +0 -0
- package/package.json +15 -6
- package/patches/chrome-devtools-mcp+1.4.0.patch +31 -0
- package/postinstall.js +50 -0
- package/web-shell/assets/{arc-DA7r8Ueo.js → arc-Bd3048nX.js} +1 -1
- package/web-shell/assets/{architectureDiagram-3BPJPVTR-ZDUxPtZ2.js → architectureDiagram-3BPJPVTR-DyzbzABx.js} +1 -1
- package/web-shell/assets/{blockDiagram-GPEHLZMM-vrtOf1kJ.js → blockDiagram-GPEHLZMM-CTjxm9Sy.js} +1 -1
- package/web-shell/assets/{c4Diagram-AAUBKEIU-BHFjzIi4.js → c4Diagram-AAUBKEIU-DSOFWNU6.js} +1 -1
- package/web-shell/assets/channel-oVoup_Ci.js +1 -0
- package/web-shell/assets/{chunk-2J33WTMH-mdeQVz59.js → chunk-2J33WTMH-D_PFdjo2.js} +1 -1
- package/web-shell/assets/{chunk-4BX2VUAB-BkKMlwBX.js → chunk-4BX2VUAB-52eG6wOT.js} +1 -1
- package/web-shell/assets/{chunk-55IACEB6-B7bnXNfu.js → chunk-55IACEB6-CGTZfKkC.js} +1 -1
- package/web-shell/assets/{chunk-727SXJPM-DGz8Mm6i.js → chunk-727SXJPM-CZ-qfRUm.js} +1 -1
- package/web-shell/assets/{chunk-AQP2D5EJ-BQAydUNk.js → chunk-AQP2D5EJ-B2dSDcqM.js} +1 -1
- package/web-shell/assets/{chunk-FMBD7UC4-GHr2LN_p.js → chunk-FMBD7UC4-Cfy3tyA0.js} +1 -1
- package/web-shell/assets/{chunk-ND2GUHAM-7R91lnUx.js → chunk-ND2GUHAM-CApNUpUq.js} +1 -1
- package/web-shell/assets/{chunk-QZHKN3VN-aTJD3lSQ.js → chunk-QZHKN3VN-CVBG8kgg.js} +1 -1
- package/web-shell/assets/classDiagram-4FO5ZUOK-B8WsaT2G.js +1 -0
- package/web-shell/assets/classDiagram-v2-Q7XG4LA2-B8WsaT2G.js +1 -0
- package/web-shell/assets/{cose-bilkent-S5V4N54A-BTf8t1RL.js → cose-bilkent-S5V4N54A-URd77-_-.js} +1 -1
- package/web-shell/assets/{dagre-BM42HDAG-_sgp3WuA.js → dagre-BM42HDAG-C07H4G9-.js} +1 -1
- package/web-shell/assets/{diagram-2AECGRRQ-CROtRy1w.js → diagram-2AECGRRQ-CYbpXrSn.js} +1 -1
- package/web-shell/assets/{diagram-5GNKFQAL-BqGRzwSc.js → diagram-5GNKFQAL-SI8s6fjX.js} +1 -1
- package/web-shell/assets/{diagram-KO2AKTUF-CMrcEtA7.js → diagram-KO2AKTUF-mBkC4RTW.js} +1 -1
- package/web-shell/assets/{diagram-LMA3HP47-BRydGNW5.js → diagram-LMA3HP47-CyBPDzWJ.js} +1 -1
- package/web-shell/assets/{diagram-OG6HWLK6-D0ilgNjV.js → diagram-OG6HWLK6-DwK7kBCu.js} +1 -1
- package/web-shell/assets/{erDiagram-TEJ5UH35-2lnQeJUM.js → erDiagram-TEJ5UH35-Ds1StEUd.js} +1 -1
- package/web-shell/assets/{flowDiagram-I6XJVG4X-C_ZMdQiC.js → flowDiagram-I6XJVG4X-BDC4-jHO.js} +1 -1
- package/web-shell/assets/{ganttDiagram-6RSMTGT7-Dw9V_Ny0.js → ganttDiagram-6RSMTGT7-CV2aHQqf.js} +1 -1
- package/web-shell/assets/{gitGraphDiagram-PVQCEYII-HDXI-F1B.js → gitGraphDiagram-PVQCEYII-B8RcuV_L.js} +1 -1
- package/web-shell/assets/index-B5WZ0qP1.js +717 -0
- package/web-shell/assets/index-CYE1IMd1.css +5 -0
- package/web-shell/assets/{infoDiagram-5YYISTIA-CuB8Ebua.js → infoDiagram-5YYISTIA-DUPoTf50.js} +1 -1
- package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-D_tyhVwh.js → ishikawaDiagram-YF4QCWOH-FDYOx9rf.js} +1 -1
- package/web-shell/assets/{journeyDiagram-JHISSGLW-CgCwJQNU.js → journeyDiagram-JHISSGLW-C5_ohMRp.js} +1 -1
- package/web-shell/assets/{kanban-definition-UN3LZRKU-PZUtcbPx.js → kanban-definition-UN3LZRKU-Bn4UnOMG.js} +1 -1
- package/web-shell/assets/{linear-CZqRdJIU.js → linear-Bl0pKQtY.js} +1 -1
- package/web-shell/assets/{mermaid.core-CPW_4UEF.js → mermaid.core-sevQFoji.js} +72 -72
- package/web-shell/assets/{mindmap-definition-RKZ34NQL-D_Y75ID7.js → mindmap-definition-RKZ34NQL-DSH4JZF9.js} +1 -1
- package/web-shell/assets/{pieDiagram-4H26LBE5-Q4dTyLeF.js → pieDiagram-4H26LBE5-acWvdQTD.js} +1 -1
- package/web-shell/assets/{quadrantDiagram-W4KKPZXB-ckw329Ft.js → quadrantDiagram-W4KKPZXB-DlggX4Sm.js} +1 -1
- package/web-shell/assets/{requirementDiagram-4Y6WPE33-DbVDm4It.js → requirementDiagram-4Y6WPE33--mMqwmV8.js} +1 -1
- package/web-shell/assets/{sankeyDiagram-5OEKKPKP-CHuZ_ecH.js → sankeyDiagram-5OEKKPKP-BtV9tZ77.js} +1 -1
- package/web-shell/assets/{sequenceDiagram-3UESZ5HK-DU2YSpq-.js → sequenceDiagram-3UESZ5HK-iDQzPFlj.js} +1 -1
- package/web-shell/assets/{stateDiagram-AJRCARHV-CA9PEBUo.js → stateDiagram-AJRCARHV-CsCyQLZ3.js} +1 -1
- package/web-shell/assets/stateDiagram-v2-BHNVJYJU-CPapECG9.js +1 -0
- package/web-shell/assets/{timeline-definition-PNZ67QCA-Bhlo4WVc.js → timeline-definition-PNZ67QCA-Dl0rnKvr.js} +1 -1
- package/web-shell/assets/{vennDiagram-CIIHVFJN-6xtPLsyl.js → vennDiagram-CIIHVFJN-qF7nTZzA.js} +1 -1
- package/web-shell/assets/{wardley-L42UT6IY-3eozmXPf.js → wardley-L42UT6IY-fWoK9i7F.js} +1 -1
- package/web-shell/assets/{wardleyDiagram-YWT4CUSO-BOn6hKss.js → wardleyDiagram-YWT4CUSO-pHGfkMnc.js} +1 -1
- package/web-shell/assets/{xychartDiagram-2RQKCTM6-BsP4-I_y.js → xychartDiagram-2RQKCTM6-3Doc4Trz.js} +1 -1
- package/web-shell/index.html +18 -2
- package/chunks/MaxSizedBox-QNF3EIGU.js +0 -63
- package/chunks/agent-headless-RQ5BTX3G.js +0 -56
- package/chunks/bridge-JL2PMCIW.js +0 -66
- package/chunks/chunk-5GOVVXEV.js +0 -73
- package/chunks/chunk-BC3C4F3Q.js +0 -40
- package/chunks/chunk-BW4KCQFD.js +0 -1103
- package/chunks/chunk-RKIZXJMB.js +0 -13
- package/chunks/contextCommand-WYU6OQ2F.js +0 -61
- package/chunks/daemon-status-provider-HH2EC5FI.js +0 -65
- package/chunks/headlessSafetyWarnings-TBE35GJ4.js +0 -55
- package/chunks/initializer-2Y7SLOKV.js +0 -61
- package/chunks/list-ZAFHZ7OS.js +0 -65
- package/chunks/loadedSettingsAdapter-6KJXD6M3.js +0 -60
- package/chunks/nonInteractiveCli-5W4GIZQM.js +0 -96
- package/chunks/ripGrep-IEIFIWP4.js +0 -54
- package/chunks/serve-V6GVZR6U.js +0 -65
- package/chunks/spawnChannel-3VHW5EPY.js +0 -63
- package/chunks/theme-manager-LYLGAERF.js +0 -58
- package/chunks/workspace-providers-status-PIAFVYHA.js +0 -62
- package/chunks/workspace-service-YAIOD4HG.js +0 -71
- package/web-shell/assets/channel-iRo68q4Q.js +0 -1
- package/web-shell/assets/classDiagram-4FO5ZUOK-iHF24a8X.js +0 -1
- package/web-shell/assets/classDiagram-v2-Q7XG4LA2-iHF24a8X.js +0 -1
- package/web-shell/assets/index-CHmzAWys.css +0 -5
- package/web-shell/assets/index-w6GTOHh1.js +0 -713
- package/web-shell/assets/stateDiagram-v2-BHNVJYJU-t1LRI0oY.js +0 -1
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
// Force strict mode and setup for ESM
|
|
2
|
+
"use strict";
|
|
3
|
+
import {
|
|
4
|
+
createDaemonStatusProvider
|
|
5
|
+
} from "./chunk-RB7S52NJ.js";
|
|
6
|
+
import "./chunk-P5THQV6A.js";
|
|
7
|
+
import "./chunk-KHDZHZMH.js";
|
|
8
|
+
import "./chunk-DE7YXUR7.js";
|
|
9
|
+
import "./chunk-MSNGFH6L.js";
|
|
10
|
+
import "./chunk-EWALXUAD.js";
|
|
11
|
+
import "./chunk-ALX6BUYW.js";
|
|
12
|
+
import "./chunk-PSFDB5FZ.js";
|
|
13
|
+
import "./chunk-P7M4GA57.js";
|
|
14
|
+
import "./chunk-T22H4V4R.js";
|
|
15
|
+
import "./chunk-SEZC2725.js";
|
|
16
|
+
import "./chunk-M7BLWURA.js";
|
|
17
|
+
import "./chunk-UFC57OYT.js";
|
|
18
|
+
import "./chunk-A5OPLHFM.js";
|
|
19
|
+
import "./chunk-5P5XGNYH.js";
|
|
20
|
+
import "./chunk-K5PGHDBN.js";
|
|
21
|
+
import "./chunk-SKAZWEV5.js";
|
|
22
|
+
import "./chunk-QOMAHFYI.js";
|
|
23
|
+
import "./chunk-G7OQ3RFJ.js";
|
|
24
|
+
import "./chunk-LKWAVAB5.js";
|
|
25
|
+
import "./chunk-L7OJ3ZO3.js";
|
|
26
|
+
import "./chunk-R6RI2HIC.js";
|
|
27
|
+
import "./chunk-2MPVVENX.js";
|
|
28
|
+
import "./chunk-ZTQ26VBE.js";
|
|
29
|
+
import "./chunk-SJBIFVD2.js";
|
|
30
|
+
import "./chunk-MLZQVCF3.js";
|
|
31
|
+
import "./chunk-LQ7TMOCE.js";
|
|
32
|
+
import "./chunk-E5A7LHNN.js";
|
|
33
|
+
import "./chunk-BPFJQGY7.js";
|
|
34
|
+
import "./chunk-GO6LNQXT.js";
|
|
35
|
+
import "./chunk-B236XPGF.js";
|
|
36
|
+
import "./chunk-YXK4GPYO.js";
|
|
37
|
+
import "./chunk-TOAUDIS7.js";
|
|
38
|
+
import "./chunk-NPQWQYU6.js";
|
|
39
|
+
import "./chunk-UA6XBZT7.js";
|
|
40
|
+
import "./chunk-E6US47KI.js";
|
|
41
|
+
import "./chunk-UWCTAVOD.js";
|
|
42
|
+
import "./chunk-OFEVLU4C.js";
|
|
43
|
+
import "./chunk-OMX7CUOE.js";
|
|
44
|
+
import "./chunk-MOUXUCXQ.js";
|
|
45
|
+
import "./chunk-BZHLWC6T.js";
|
|
46
|
+
import "./chunk-DG573EOO.js";
|
|
47
|
+
import "./chunk-MTNTVOJR.js";
|
|
48
|
+
import "./chunk-TENOUWY2.js";
|
|
49
|
+
import "./chunk-GLPV75ES.js";
|
|
50
|
+
import "./chunk-22IFUCVR.js";
|
|
51
|
+
import "./chunk-T42ACHFI.js";
|
|
52
|
+
import "./chunk-SIUQ3YYX.js";
|
|
53
|
+
import "./chunk-YTFBURQD.js";
|
|
54
|
+
import "./chunk-YPCPZSZB.js";
|
|
55
|
+
import "./chunk-IRJWHZWU.js";
|
|
56
|
+
import "./chunk-SYCJMSIJ.js";
|
|
57
|
+
import "./chunk-55ZMG67I.js";
|
|
58
|
+
import "./chunk-H6BD2ELD.js";
|
|
59
|
+
import "./chunk-5IFG2VC4.js";
|
|
60
|
+
import "./chunk-64WXLC72.js";
|
|
61
|
+
import "./chunk-D5KISTLW.js";
|
|
62
|
+
import "./chunk-AVQDCKNF.js";
|
|
63
|
+
import "./chunk-ZERZSAZL.js";
|
|
64
|
+
import "./chunk-QN5NZ3UQ.js";
|
|
65
|
+
import "./chunk-BR4QREVK.js";
|
|
66
|
+
import "./chunk-Z2Z3GUXZ.js";
|
|
67
|
+
import "./chunk-A4BMJM77.js";
|
|
68
|
+
import "./chunk-J2S4EL5Y.js";
|
|
69
|
+
export {
|
|
70
|
+
createDaemonStatusProvider
|
|
71
|
+
};
|
|
@@ -196,18 +196,18 @@ var de_default = {
|
|
|
196
196
|
"Open in editor": "Im Editor \xF6ffnen",
|
|
197
197
|
"Edit tools": "Werkzeuge bearbeiten",
|
|
198
198
|
"Edit color": "Farbe bearbeiten",
|
|
199
|
-
"\
|
|
199
|
+
"\u2717 Error:": "\u2717 Fehler:",
|
|
200
200
|
'Are you sure you want to delete agent "{{name}}"?': 'Sind Sie sicher, dass Sie den Agenten "{{name}}" l\xF6schen m\xF6chten?',
|
|
201
201
|
// ============================================================================
|
|
202
202
|
// Agents - Creation Wizard
|
|
203
203
|
// ============================================================================
|
|
204
204
|
"Project Level (.qwen/agents/)": "Projektebene (.qwen/agents/)",
|
|
205
205
|
"User Level (~/.qwen/agents/)": "Benutzerebene (~/.qwen/agents/)",
|
|
206
|
-
"\
|
|
206
|
+
"\u2713 Subagent Created Successfully!": "\u2713 Unteragent erfolgreich erstellt!",
|
|
207
207
|
'Subagent "{{name}}" has been saved to {{level}} level.': 'Unteragent "{{name}}" wurde auf {{level}}-Ebene gespeichert.',
|
|
208
208
|
"Name: ": "Name: ",
|
|
209
209
|
"Location: ": "Speicherort: ",
|
|
210
|
-
"\
|
|
210
|
+
"\u2717 Error saving subagent:": "\u2717 Fehler beim Speichern des Unteragenten:",
|
|
211
211
|
"Warnings:": "Warnungen:",
|
|
212
212
|
'Name "{{name}}" already exists at {{level}} level - will overwrite existing subagent': 'Name "{{name}}" existiert bereits auf {{level}}-Ebene - bestehender Unteragent wird \xFCberschrieben',
|
|
213
213
|
'Name "{{name}}" exists at user level - project level will take precedence': 'Name "{{name}}" existiert auf Benutzerebene - Projektebene hat Vorrang',
|
|
@@ -846,8 +846,8 @@ var de_default = {
|
|
|
846
846
|
"Choose how to proceed with your session:": "W\xE4hlen Sie, wie Sie mit Ihrer Sitzung fortfahren m\xF6chten:",
|
|
847
847
|
"Start new chat session": "Neue Chat-Sitzung starten",
|
|
848
848
|
"Continue previous conversation": "Vorheriges Gespr\xE4ch fortsetzen",
|
|
849
|
-
"
|
|
850
|
-
"
|
|
849
|
+
"Welcome back! (Last updated: {{timeAgo}})": "Willkommen zur\xFCck! (Zuletzt aktualisiert: {{timeAgo}})",
|
|
850
|
+
"Overall Goal:": "Gesamtziel:",
|
|
851
851
|
"Connect a Provider": "Anbieter verbinden",
|
|
852
852
|
"You must connect a provider to proceed. Press Ctrl+C again to exit.": "Sie m\xFCssen einen Anbieter verbinden, um fortzufahren. Dr\xFCcken Sie erneut Ctrl+C zum Beenden.",
|
|
853
853
|
"Terms of Services and Privacy Notice": "Nutzungsbedingungen und Datenschutzhinweis",
|
|
@@ -974,7 +974,7 @@ var de_default = {
|
|
|
974
974
|
// MCP Status
|
|
975
975
|
// ============================================================================
|
|
976
976
|
"No MCP servers configured.": "Keine MCP servers konfiguriert.",
|
|
977
|
-
"\
|
|
977
|
+
"\u25CC MCP servers are starting up ({{count}} initializing)...": "\u25CC MCP servers werden gestartet ({{count}} werden initialisiert)...",
|
|
978
978
|
"Note: First startup may take longer. Tool availability will update automatically.": "Hinweis: Der erste Start kann l\xE4nger dauern. Werkzeugverf\xFCgbarkeit wird automatisch aktualisiert.",
|
|
979
979
|
"Configured MCP servers:": "Konfigurierte MCP servers:",
|
|
980
980
|
Ready: "Bereit",
|
|
@@ -993,7 +993,7 @@ var de_default = {
|
|
|
993
993
|
"Tools:": "Werkzeuge:",
|
|
994
994
|
"Parameters:": "Parameter:",
|
|
995
995
|
Blocked: "Blockiert",
|
|
996
|
-
"\
|
|
996
|
+
"\u2605 Tips:": "\u2605 Tipps:",
|
|
997
997
|
Use: "Verwenden",
|
|
998
998
|
"to show server and tool descriptions": "um Server- und Werkzeugbeschreibungen anzuzeigen",
|
|
999
999
|
"to show tool parameter schemas": "um tool parameter schemas anzuzeigen",
|
|
@@ -1363,7 +1363,7 @@ var de_default = {
|
|
|
1363
1363
|
"Enter your Coding Plan API key: ": "Geben Sie Ihren Coding Plan API Key ein: ",
|
|
1364
1364
|
"Select authentication method:": "Authentifizierungsmethode ausw\xE4hlen:",
|
|
1365
1365
|
"\n=== Authentication Status ===\n": "\n=== Authentifizierungsstatus ===\n",
|
|
1366
|
-
"\u26A0
|
|
1366
|
+
"\u26A0 No authentication method configured.\n": "\u26A0 Keine Authentifizierungsmethode konfiguriert.\n",
|
|
1367
1367
|
"Run one of the following commands to get started:\n": "F\xFChren Sie einen der folgenden Befehle aus, um zu beginnen:\n",
|
|
1368
1368
|
" qwen auth qwen-oauth - Authenticate with Qwen OAuth (discontinued)": " qwen auth qwen-oauth - Mit Qwen OAuth authentifizieren (eingestellt)",
|
|
1369
1369
|
"Or simply run:": "Oder einfach ausf\xFChren:",
|
|
@@ -1378,7 +1378,7 @@ var de_default = {
|
|
|
1378
1378
|
" Current Model: {{model}}": " Aktuelles Modell: {{model}}",
|
|
1379
1379
|
" Config Version: {{version}}": " Konfigurationsversion: {{version}}",
|
|
1380
1380
|
" Status: API key configured\n": " Status: API Key konfiguriert\n",
|
|
1381
|
-
"\u26A0
|
|
1381
|
+
"\u26A0 Authentication Method: Alibaba Cloud Coding Plan (Incomplete)": "\u26A0 Authentifizierungsmethode: Alibaba Cloud Coding Plan (Unvollst\xE4ndig)",
|
|
1382
1382
|
" Issue: API key not found in environment or settings\n": " Problem: API Key nicht in Umgebung oder Einstellungen gefunden\n",
|
|
1383
1383
|
" Run `qwen auth coding-plan` to re-configure.\n": " F\xFChren Sie `qwen auth coding-plan` aus, um neu zu konfigurieren.\n",
|
|
1384
1384
|
"\u2713 Authentication Method: {{type}}": "\u2713 Authentifizierungsmethode: {{type}}",
|
|
@@ -1391,6 +1391,7 @@ var de_default = {
|
|
|
1391
1391
|
"Hide tool output and thinking for a cleaner view (toggle with Ctrl+O).": "Tool-Ausgabe und Denkprozess ausblenden f\xFCr eine \xFCbersichtlichere Ansicht (mit Ctrl+O umschalten).",
|
|
1392
1392
|
"Press Ctrl+O to show full tool output": "Ctrl+O f\xFCr vollst\xE4ndige Tool-Ausgabe dr\xFCcken",
|
|
1393
1393
|
"Switch to plan mode or exit plan mode": "In den Plan-Modus wechseln oder den Plan-Modus verlassen",
|
|
1394
|
+
"Set how hard reasoning-capable models think ({{tiers}}); mapped and clamped per provider.": "Legt fest, wie intensiv schlussfolgerungsf\xE4hige Modelle denken ({{tiers}}); je nach Anbieter zugeordnet und begrenzt.",
|
|
1394
1395
|
"Exited plan mode. Previous approval mode restored.": "Plan-Modus verlassen. Vorheriger Genehmigungsmodus wiederhergestellt.",
|
|
1395
1396
|
"Enabled plan mode. The agent will analyze and plan without executing tools.": "Plan-Modus aktiviert. Der Agent analysiert und plant, ohne Werkzeuge auszuf\xFChren.",
|
|
1396
1397
|
'Already in plan mode. Use "/plan exit" to exit plan mode.': 'Bereits im Plan-Modus. Verwenden Sie "/plan exit", um den Plan-Modus zu verlassen.',
|
|
@@ -11,10 +11,10 @@ import {
|
|
|
11
11
|
sendMessage,
|
|
12
12
|
sendTyping,
|
|
13
13
|
uploadToCdn
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-4D73HUOP.js";
|
|
15
15
|
import {
|
|
16
16
|
ChannelBase
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-B6SZLQAZ.js";
|
|
18
18
|
import "./chunk-UFC57OYT.js";
|
|
19
19
|
import "./chunk-K5PGHDBN.js";
|
|
20
20
|
import {
|
|
@@ -2,14 +2,15 @@
|
|
|
2
2
|
"use strict";
|
|
3
3
|
import {
|
|
4
4
|
ChannelBase
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-B6SZLQAZ.js";
|
|
6
6
|
import "./chunk-UFC57OYT.js";
|
|
7
7
|
import "./chunk-K5PGHDBN.js";
|
|
8
8
|
import {
|
|
9
9
|
require_abort_controller,
|
|
10
10
|
require_lib
|
|
11
|
-
} from "./chunk-
|
|
12
|
-
import "./chunk-
|
|
11
|
+
} from "./chunk-ZN5T4BHI.js";
|
|
12
|
+
import "./chunk-IRJWHZWU.js";
|
|
13
|
+
import "./chunk-SYCJMSIJ.js";
|
|
13
14
|
import {
|
|
14
15
|
require_dist
|
|
15
16
|
} from "./chunk-ZERZSAZL.js";
|
|
@@ -9679,24 +9680,39 @@ var TelegramChannel = class extends ChannelBase {
|
|
|
9679
9680
|
bot;
|
|
9680
9681
|
botId = 0;
|
|
9681
9682
|
botUsername = "";
|
|
9683
|
+
hasConnectedOnce = false;
|
|
9684
|
+
signalHandlersRegistered = false;
|
|
9682
9685
|
constructor(name, config, bridge, options) {
|
|
9683
9686
|
super(name, config, bridge, options);
|
|
9684
|
-
|
|
9685
|
-
client: {
|
|
9686
|
-
baseFetchConfig: { agent: new import_https_proxy_agent.HttpsProxyAgent(this.proxy) }
|
|
9687
|
-
}
|
|
9688
|
-
} : void 0;
|
|
9689
|
-
this.bot = new import_grammy.Bot(config.token, botConfig);
|
|
9687
|
+
this.bot = this.createBot();
|
|
9690
9688
|
this.registerCommand("start", async (envelope) => {
|
|
9691
9689
|
await this.sendMessage(envelope.chatId, TELEGRAM_START_MESSAGE);
|
|
9692
9690
|
return true;
|
|
9693
9691
|
});
|
|
9694
9692
|
this.registerCancelCommand();
|
|
9695
9693
|
}
|
|
9694
|
+
supportsProactiveSend() {
|
|
9695
|
+
return true;
|
|
9696
|
+
}
|
|
9697
|
+
supportsProactiveTarget(target) {
|
|
9698
|
+
return target.threadId === void 0 || /^\d+$/u.test(target.threadId);
|
|
9699
|
+
}
|
|
9700
|
+
createBot() {
|
|
9701
|
+
const botConfig = this.proxy ? {
|
|
9702
|
+
client: {
|
|
9703
|
+
baseFetchConfig: { agent: new import_https_proxy_agent.HttpsProxyAgent(this.proxy) }
|
|
9704
|
+
}
|
|
9705
|
+
} : void 0;
|
|
9706
|
+
return new import_grammy.Bot(this.config.token, botConfig);
|
|
9707
|
+
}
|
|
9696
9708
|
getFileUrl(filePath) {
|
|
9697
9709
|
return `https://api.telegram.org/file/bot${this.bot.token}/${filePath}`;
|
|
9698
9710
|
}
|
|
9699
9711
|
async connect() {
|
|
9712
|
+
if (this.hasConnectedOnce) {
|
|
9713
|
+
this.bot = this.createBot();
|
|
9714
|
+
}
|
|
9715
|
+
this.hasConnectedOnce = true;
|
|
9700
9716
|
const botInfo = await this.bot.api.getMe();
|
|
9701
9717
|
this.botId = botInfo.id;
|
|
9702
9718
|
this.botUsername = botInfo.username ?? "";
|
|
@@ -9820,8 +9836,11 @@ var TelegramChannel = class extends ChannelBase {
|
|
|
9820
9836
|
process.stderr.write(`[Telegram:${this.name}] Bot launch error: ${err}
|
|
9821
9837
|
`);
|
|
9822
9838
|
});
|
|
9823
|
-
|
|
9824
|
-
|
|
9839
|
+
if (!this.signalHandlersRegistered) {
|
|
9840
|
+
process.once("SIGINT", () => this.bot.stop());
|
|
9841
|
+
process.once("SIGTERM", () => this.bot.stop());
|
|
9842
|
+
this.signalHandlersRegistered = true;
|
|
9843
|
+
}
|
|
9825
9844
|
}
|
|
9826
9845
|
async registerBotCommands() {
|
|
9827
9846
|
try {
|
|
@@ -9850,15 +9869,20 @@ var TelegramChannel = class extends ChannelBase {
|
|
|
9850
9869
|
}
|
|
9851
9870
|
}
|
|
9852
9871
|
async sendMessage(chatId, text) {
|
|
9872
|
+
await this.sendTelegramMessage(chatId, text);
|
|
9873
|
+
}
|
|
9874
|
+
async pushProactive(target, text) {
|
|
9875
|
+
await this.sendTelegramMessage(target.chatId, text, target.threadId);
|
|
9876
|
+
}
|
|
9877
|
+
async sendTelegramMessage(chatId, text, threadId) {
|
|
9853
9878
|
const html = telegramFormat(text);
|
|
9854
9879
|
const chunks = splitHtmlForTelegram(html);
|
|
9880
|
+
const options = threadId === void 0 ? { parse_mode: "HTML" } : { parse_mode: "HTML", message_thread_id: Number(threadId) };
|
|
9855
9881
|
for (const chunk of chunks) {
|
|
9856
9882
|
try {
|
|
9857
|
-
await this.bot.api.sendMessage(chatId, chunk,
|
|
9858
|
-
parse_mode: "HTML"
|
|
9859
|
-
});
|
|
9883
|
+
await this.bot.api.sendMessage(chatId, chunk, options);
|
|
9860
9884
|
} catch {
|
|
9861
|
-
await this.bot.api.sendMessage(chatId, chunk.replace(/<[^>]*>/g, ""));
|
|
9885
|
+
await this.bot.api.sendMessage(chatId, chunk.replace(/<[^>]*>/g, ""), threadId === void 0 ? void 0 : { message_thread_id: Number(threadId) });
|
|
9862
9886
|
}
|
|
9863
9887
|
}
|
|
9864
9888
|
}
|
|
@@ -9896,6 +9920,7 @@ var TelegramChannel = class extends ChannelBase {
|
|
|
9896
9920
|
senderId: String(msg.from.id),
|
|
9897
9921
|
senderName: msg.from.first_name + (msg.from.last_name ? ` ${msg.from.last_name}` : ""),
|
|
9898
9922
|
chatId: String(msg.chat.id),
|
|
9923
|
+
threadId: typeof msg.message_thread_id === "number" ? String(msg.message_thread_id) : void 0,
|
|
9899
9924
|
text: cleanText,
|
|
9900
9925
|
isGroup,
|
|
9901
9926
|
isMentioned,
|
|
@@ -4,11 +4,13 @@ import {
|
|
|
4
4
|
require_follow_redirects,
|
|
5
5
|
require_form_data,
|
|
6
6
|
require_proxy_from_env
|
|
7
|
-
} from "./chunk-
|
|
8
|
-
import {
|
|
9
|
-
ChannelBase
|
|
10
|
-
} from "./chunk-BW4KCQFD.js";
|
|
7
|
+
} from "./chunk-QXPI7FEC.js";
|
|
11
8
|
import "./chunk-7RYW5LQV.js";
|
|
9
|
+
import {
|
|
10
|
+
ChannelBase,
|
|
11
|
+
sanitizeLogText,
|
|
12
|
+
sanitizeSenderName
|
|
13
|
+
} from "./chunk-B6SZLQAZ.js";
|
|
12
14
|
import "./chunk-UFC57OYT.js";
|
|
13
15
|
import "./chunk-K5PGHDBN.js";
|
|
14
16
|
import "./chunk-UWCTAVOD.js";
|
|
@@ -36,6 +38,7 @@ import { mkdirSync, writeFileSync } from "node:fs";
|
|
|
36
38
|
import { randomUUID } from "node:crypto";
|
|
37
39
|
import { basename, join } from "node:path";
|
|
38
40
|
import { tmpdir } from "node:os";
|
|
41
|
+
import { Buffer as Buffer2 } from "node:buffer";
|
|
39
42
|
|
|
40
43
|
// node_modules/dingtalk-stream-sdk-nodejs/dist/index.mjs
|
|
41
44
|
init_esbuild_shims();
|
|
@@ -4485,7 +4488,7 @@ var ACK_REACTION_NAME = "\u{1F440}";
|
|
|
4485
4488
|
var ACK_EMOTION_ID = "2659900";
|
|
4486
4489
|
var ACK_EMOTION_BG_ID = "im_bg_1";
|
|
4487
4490
|
var EMOTION_API = "https://api.dingtalk.com/v1.0/robot/emotion";
|
|
4488
|
-
var DingtalkChannel = class extends ChannelBase {
|
|
4491
|
+
var DingtalkChannel = class _DingtalkChannel extends ChannelBase {
|
|
4489
4492
|
static {
|
|
4490
4493
|
__name(this, "DingtalkChannel");
|
|
4491
4494
|
}
|
|
@@ -4503,6 +4506,86 @@ var DingtalkChannel = class extends ChannelBase {
|
|
|
4503
4506
|
clientId: config.clientId,
|
|
4504
4507
|
clientSecret: config.clientSecret
|
|
4505
4508
|
});
|
|
4509
|
+
this.installStructuredDownstreamHandler();
|
|
4510
|
+
}
|
|
4511
|
+
installStructuredDownstreamHandler() {
|
|
4512
|
+
const client = this.client;
|
|
4513
|
+
client.debug = false;
|
|
4514
|
+
client.onDownStream = (raw) => {
|
|
4515
|
+
this.onDownStream(raw, client);
|
|
4516
|
+
};
|
|
4517
|
+
}
|
|
4518
|
+
onDownStream(raw, client) {
|
|
4519
|
+
const decoded = this.decodeDownStream(raw);
|
|
4520
|
+
let msg;
|
|
4521
|
+
try {
|
|
4522
|
+
const parsed = JSON.parse(decoded.text);
|
|
4523
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
4524
|
+
process.stderr.write(`[DingTalk:${this.name}] downstream parsed to non-object, ignoring.
|
|
4525
|
+
`);
|
|
4526
|
+
return;
|
|
4527
|
+
}
|
|
4528
|
+
msg = parsed;
|
|
4529
|
+
} catch (err) {
|
|
4530
|
+
process.stderr.write(`[DingTalk:${this.name}] Failed to parse downstream: ${sanitizeLogText(String(err), 200)}
|
|
4531
|
+
`);
|
|
4532
|
+
return;
|
|
4533
|
+
}
|
|
4534
|
+
const headers = msg.headers && typeof msg.headers === "object" ? msg.headers : {};
|
|
4535
|
+
const type = typeof msg.type === "string" ? msg.type : "";
|
|
4536
|
+
const topic = typeof headers["topic"] === "string" ? headers["topic"] : "";
|
|
4537
|
+
const messageId = typeof headers["messageId"] === "string" ? headers["messageId"] : "";
|
|
4538
|
+
process.stderr.write(`[DingTalk:${this.name}] downstream type=${sanitizeLogText(type, 40)} topic=${sanitizeLogText(topic, 80)} messageId=${sanitizeLogText(messageId, 80)} bytes=${decoded.bytes}
|
|
4539
|
+
`);
|
|
4540
|
+
if ((type === "CALLBACK" || type === "EVENT") && (!topic || !messageId)) {
|
|
4541
|
+
process.stderr.write(`[DingTalk:${this.name}] Ignoring downstream with invalid routing headers.
|
|
4542
|
+
`);
|
|
4543
|
+
return;
|
|
4544
|
+
}
|
|
4545
|
+
const normalizedMsg = {
|
|
4546
|
+
...msg,
|
|
4547
|
+
headers: { ...headers, topic, messageId }
|
|
4548
|
+
};
|
|
4549
|
+
switch (type) {
|
|
4550
|
+
case "SYSTEM":
|
|
4551
|
+
this.callDownStreamHandler(client, "onSystem", normalizedMsg);
|
|
4552
|
+
break;
|
|
4553
|
+
case "EVENT":
|
|
4554
|
+
this.callDownStreamHandler(client, "onEvent", normalizedMsg);
|
|
4555
|
+
break;
|
|
4556
|
+
case "CALLBACK":
|
|
4557
|
+
this.callDownStreamHandler(client, "onCallback", normalizedMsg);
|
|
4558
|
+
break;
|
|
4559
|
+
default:
|
|
4560
|
+
process.stderr.write(`[DingTalk:${this.name}] Ignoring downstream type ${sanitizeLogText(type || "unknown", 40)}.
|
|
4561
|
+
`);
|
|
4562
|
+
}
|
|
4563
|
+
}
|
|
4564
|
+
callDownStreamHandler(client, method, msg) {
|
|
4565
|
+
try {
|
|
4566
|
+
client[method](msg);
|
|
4567
|
+
} catch (err) {
|
|
4568
|
+
process.stderr.write(`[DingTalk:${this.name}] ${method} failed: ${sanitizeLogText(String(err), 200)}
|
|
4569
|
+
`);
|
|
4570
|
+
}
|
|
4571
|
+
}
|
|
4572
|
+
decodeDownStream(raw) {
|
|
4573
|
+
if (typeof raw === "string") {
|
|
4574
|
+
return { text: raw, bytes: Buffer2.byteLength(raw) };
|
|
4575
|
+
}
|
|
4576
|
+
if (Buffer2.isBuffer(raw)) {
|
|
4577
|
+
return { text: raw.toString("utf8"), bytes: raw.length };
|
|
4578
|
+
}
|
|
4579
|
+
if (raw instanceof Uint8Array) {
|
|
4580
|
+
return { text: Buffer2.from(raw).toString("utf8"), bytes: raw.byteLength };
|
|
4581
|
+
}
|
|
4582
|
+
if (raw instanceof ArrayBuffer) {
|
|
4583
|
+
return {
|
|
4584
|
+
text: Buffer2.from(raw).toString("utf8"),
|
|
4585
|
+
bytes: raw.byteLength
|
|
4586
|
+
};
|
|
4587
|
+
}
|
|
4588
|
+
return { text: String(raw), bytes: Buffer2.byteLength(String(raw)) };
|
|
4506
4589
|
}
|
|
4507
4590
|
async connect() {
|
|
4508
4591
|
this.client.registerCallbackListener(TOPIC_ROBOT, (msg) => {
|
|
@@ -4524,6 +4607,14 @@ var DingtalkChannel = class extends ChannelBase {
|
|
|
4524
4607
|
process.stderr.write(`[DingTalk:${this.name}] Connected via stream.
|
|
4525
4608
|
`);
|
|
4526
4609
|
}
|
|
4610
|
+
/**
|
|
4611
|
+
* A group message with no conversationId can't be routed to a stable shared
|
|
4612
|
+
* session (chatId would fall back to the expiring sessionWebhook), so it is
|
|
4613
|
+
* dropped on ingestion. Exposed for testing the drop rule.
|
|
4614
|
+
*/
|
|
4615
|
+
static isUnroutableGroupMessage(isGroup, conversationId) {
|
|
4616
|
+
return isGroup && !conversationId;
|
|
4617
|
+
}
|
|
4527
4618
|
async sendMessage(chatId, text) {
|
|
4528
4619
|
const webhook = this.webhooks.get(chatId);
|
|
4529
4620
|
if (!webhook) {
|
|
@@ -4798,7 +4889,9 @@ var DingtalkChannel = class extends ChannelBase {
|
|
|
4798
4889
|
onMessage(downstream) {
|
|
4799
4890
|
try {
|
|
4800
4891
|
const data = typeof downstream.data === "string" ? JSON.parse(downstream.data) : downstream.data;
|
|
4801
|
-
const
|
|
4892
|
+
const dataMsgId = typeof data.msgId === "string" ? data.msgId : void 0;
|
|
4893
|
+
const headerMsgId = typeof downstream.headers.messageId === "string" ? downstream.headers.messageId : void 0;
|
|
4894
|
+
const msgId = dataMsgId || headerMsgId;
|
|
4802
4895
|
if (msgId && this.seenMessages.has(msgId)) {
|
|
4803
4896
|
return;
|
|
4804
4897
|
}
|
|
@@ -4806,17 +4899,27 @@ var DingtalkChannel = class extends ChannelBase {
|
|
|
4806
4899
|
this.seenMessages.set(msgId, Date.now());
|
|
4807
4900
|
}
|
|
4808
4901
|
const isGroup = data.conversationType === "2";
|
|
4809
|
-
const sessionWebhook = data.sessionWebhook;
|
|
4810
|
-
const conversationId = data.conversationId;
|
|
4902
|
+
const sessionWebhook = typeof data.sessionWebhook === "string" ? data.sessionWebhook : void 0;
|
|
4903
|
+
const conversationId = typeof data.conversationId === "string" ? data.conversationId : void 0;
|
|
4904
|
+
const isMentioned = Boolean(data.isInAtList);
|
|
4905
|
+
const senderNick = typeof data.senderNick === "string" ? data.senderNick : void 0;
|
|
4906
|
+
const senderStaffId = typeof data.senderStaffId === "string" ? data.senderStaffId : void 0;
|
|
4907
|
+
const senderIdValue = typeof data.senderId === "string" ? data.senderId : void 0;
|
|
4811
4908
|
if (!sessionWebhook) {
|
|
4812
4909
|
process.stderr.write(`[DingTalk:${this.name}] No sessionWebhook in message, skipping.
|
|
4910
|
+
`);
|
|
4911
|
+
return;
|
|
4912
|
+
}
|
|
4913
|
+
if (_DingtalkChannel.isUnroutableGroupMessage(isGroup, conversationId)) {
|
|
4914
|
+
process.stderr.write(`[DingTalk:${this.name}] Group message has no conversationId, skipping (msgId=${msgId || "unknown"}, sender=${sanitizeSenderName(senderNick || senderStaffId || "unknown")})
|
|
4813
4915
|
`);
|
|
4814
4916
|
return;
|
|
4815
4917
|
}
|
|
4816
4918
|
if (conversationId) {
|
|
4817
4919
|
this.webhooks.set(conversationId, sessionWebhook);
|
|
4818
4920
|
}
|
|
4819
|
-
|
|
4921
|
+
process.stderr.write(`[DingTalk:${this.name}] message msgId=${sanitizeLogText(msgId || "unknown", 80)} conversationId=${sanitizeLogText(conversationId || "", 120)} isGroup=${isGroup} isMentioned=${isMentioned} senderNick=${sanitizeLogText(senderNick || "", 80)} senderStaffId=${sanitizeLogText(senderStaffId || "", 80)} senderId=${sanitizeLogText(senderIdValue || "", 80)}
|
|
4922
|
+
`);
|
|
4820
4923
|
const content = this.extractContent(data);
|
|
4821
4924
|
let cleanText = content.text;
|
|
4822
4925
|
if (isMentioned) {
|
|
@@ -4825,10 +4928,12 @@ var DingtalkChannel = class extends ChannelBase {
|
|
|
4825
4928
|
const quoted = this.extractQuotedContext(data);
|
|
4826
4929
|
const chatId = conversationId || sessionWebhook;
|
|
4827
4930
|
const envelopeText = isMentioned ? cleanText : cleanText || content.text;
|
|
4931
|
+
const senderId = senderStaffId || senderIdValue || "";
|
|
4932
|
+
const senderName = senderNick || senderId || "Unknown";
|
|
4828
4933
|
const envelope = {
|
|
4829
4934
|
channelName: this.name,
|
|
4830
|
-
senderId
|
|
4831
|
-
senderName
|
|
4935
|
+
senderId,
|
|
4936
|
+
senderName,
|
|
4832
4937
|
chatId,
|
|
4833
4938
|
text: envelopeText,
|
|
4834
4939
|
isGroup,
|
|
@@ -4,19 +4,19 @@ import {
|
|
|
4
4
|
require_follow_redirects,
|
|
5
5
|
require_form_data,
|
|
6
6
|
require_proxy_from_env
|
|
7
|
-
} from "./chunk-
|
|
8
|
-
import {
|
|
9
|
-
ChannelBase
|
|
10
|
-
} from "./chunk-BW4KCQFD.js";
|
|
7
|
+
} from "./chunk-QXPI7FEC.js";
|
|
11
8
|
import {
|
|
12
9
|
require_lib
|
|
13
10
|
} from "./chunk-3HX5LZ6R.js";
|
|
14
11
|
import "./chunk-7RYW5LQV.js";
|
|
12
|
+
import {
|
|
13
|
+
ChannelBase
|
|
14
|
+
} from "./chunk-B6SZLQAZ.js";
|
|
15
15
|
import "./chunk-UFC57OYT.js";
|
|
16
16
|
import "./chunk-K5PGHDBN.js";
|
|
17
17
|
import {
|
|
18
18
|
require_minimal2 as require_minimal
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-E6US47KI.js";
|
|
20
20
|
import "./chunk-UWCTAVOD.js";
|
|
21
21
|
import {
|
|
22
22
|
require_extension,
|
|
@@ -92802,6 +92802,9 @@ var FeishuChannel = class extends ChannelBase {
|
|
|
92802
92802
|
this.collapsible = feishuCfg["collapsible"] || false;
|
|
92803
92803
|
this.collapsibleThreshold = feishuCfg["collapsibleThreshold"] || 500;
|
|
92804
92804
|
}
|
|
92805
|
+
supportsProactiveSend() {
|
|
92806
|
+
return true;
|
|
92807
|
+
}
|
|
92805
92808
|
/** Build the event handler map shared between WebSocket and webhook modes. */
|
|
92806
92809
|
buildHandlerMap() {
|
|
92807
92810
|
return {
|
|
@@ -93165,10 +93168,19 @@ var FeishuChannel = class extends ChannelBase {
|
|
|
93165
93168
|
}
|
|
93166
93169
|
}
|
|
93167
93170
|
async sendMessage(chatId, text) {
|
|
93171
|
+
await this.sendMessageInternal(chatId, text, false);
|
|
93172
|
+
}
|
|
93173
|
+
async pushProactive(target, text) {
|
|
93174
|
+
await this.sendMessageInternal(target.chatId, text, true);
|
|
93175
|
+
}
|
|
93176
|
+
async sendMessageInternal(chatId, text, throwOnFailure) {
|
|
93168
93177
|
const token = await this.getTenantAccessToken();
|
|
93169
93178
|
if (!token) {
|
|
93170
93179
|
process.stderr.write(`[Feishu:${this.name}] Cannot send: no access token.
|
|
93171
93180
|
`);
|
|
93181
|
+
if (throwOnFailure) {
|
|
93182
|
+
throw new Error("Feishu sendMessage failed: no access token");
|
|
93183
|
+
}
|
|
93172
93184
|
return;
|
|
93173
93185
|
}
|
|
93174
93186
|
const chunks = splitChunks(text);
|
|
@@ -93201,10 +93213,19 @@ var FeishuChannel = class extends ChannelBase {
|
|
|
93201
93213
|
const detail = await resp.text().catch(() => "");
|
|
93202
93214
|
process.stderr.write(`[Feishu:${this.name}] sendMessage failed: HTTP ${resp.status} ${detail}
|
|
93203
93215
|
`);
|
|
93216
|
+
if (throwOnFailure) {
|
|
93217
|
+
throw new Error(`Feishu sendMessage failed: HTTP ${resp.status}`);
|
|
93218
|
+
}
|
|
93204
93219
|
}
|
|
93205
93220
|
} catch (err) {
|
|
93221
|
+
if (throwOnFailure && err instanceof Error && err.message.startsWith("Feishu sendMessage failed:")) {
|
|
93222
|
+
throw err;
|
|
93223
|
+
}
|
|
93206
93224
|
process.stderr.write(`[Feishu:${this.name}] sendMessage error: ${err}
|
|
93207
93225
|
`);
|
|
93226
|
+
if (throwOnFailure) {
|
|
93227
|
+
throw err;
|
|
93228
|
+
}
|
|
93208
93229
|
}
|
|
93209
93230
|
}
|
|
93210
93231
|
}
|
|
@@ -3,8 +3,11 @@
|
|
|
3
3
|
import {
|
|
4
4
|
ChannelBase,
|
|
5
5
|
SessionRouter,
|
|
6
|
-
getGlobalQwenDir
|
|
7
|
-
|
|
6
|
+
getGlobalQwenDir,
|
|
7
|
+
sanitizeLogText,
|
|
8
|
+
sanitizePromptText,
|
|
9
|
+
sanitizeSenderName
|
|
10
|
+
} from "./chunk-B6SZLQAZ.js";
|
|
8
11
|
import "./chunk-UFC57OYT.js";
|
|
9
12
|
import "./chunk-K5PGHDBN.js";
|
|
10
13
|
import {
|
|
@@ -1483,7 +1486,11 @@ var QQChannel = class extends ChannelBase {
|
|
|
1483
1486
|
const sessionsPath = join2(stateDir, `${safeName}-sessions.json`);
|
|
1484
1487
|
const hasExternalRouter = Boolean(options?.router);
|
|
1485
1488
|
const router = options?.router ?? new SessionRouter(bridge, config.cwd, config.sessionScope, sessionsPath);
|
|
1486
|
-
super(name, config, bridge, {
|
|
1489
|
+
super(name, config, bridge, {
|
|
1490
|
+
...options,
|
|
1491
|
+
router,
|
|
1492
|
+
registerBridgeEvents: options?.registerBridgeEvents ?? !hasExternalRouter
|
|
1493
|
+
});
|
|
1487
1494
|
this.qqConfig = config;
|
|
1488
1495
|
this.qqStatePath = join2(stateDir, `${safeName}-state.json`);
|
|
1489
1496
|
this.globalSessionsPath = hasExternalRouter ? join2(stateDir, "sessions.json") : sessionsPath;
|
|
@@ -1696,15 +1703,16 @@ var QQChannel = class extends ChannelBase {
|
|
|
1696
1703
|
}
|
|
1697
1704
|
}
|
|
1698
1705
|
/**
|
|
1699
|
-
*
|
|
1700
|
-
*
|
|
1706
|
+
* Compatibility repair for legacy restored session state where older router
|
|
1707
|
+
* code could keep an empty session id after bridge.loadSession() failed to
|
|
1708
|
+
* return a session_id.
|
|
1701
1709
|
*
|
|
1702
1710
|
* **Fragile**: accesses SessionRouter's private `toSession`/`toTarget`/`toCwd`
|
|
1703
1711
|
* maps via type coercion. If SessionRouter internals change, this breaks
|
|
1704
1712
|
* silently. The only signal will be cross-server conversations failing to
|
|
1705
1713
|
* restore after daemon restart — no crash, no log.
|
|
1706
1714
|
*
|
|
1707
|
-
*
|
|
1715
|
+
* Keep this while old persisted files may still exist.
|
|
1708
1716
|
*/
|
|
1709
1717
|
fixRestoredSessions() {
|
|
1710
1718
|
try {
|
|
@@ -2095,11 +2103,13 @@ var QQChannel = class extends ChannelBase {
|
|
|
2095
2103
|
if (!cleanText)
|
|
2096
2104
|
return;
|
|
2097
2105
|
const isSlash = cleanText.startsWith("/");
|
|
2106
|
+
const safeName = sanitizeSenderName(senderName);
|
|
2098
2107
|
if (isSlash) {
|
|
2099
|
-
|
|
2108
|
+
const loggedCmd = sanitizeLogText(cleanText, 80);
|
|
2109
|
+
process.stderr.write(`[QQ:${this.name}] Slash cmd from ${safeName} (${chatId}): ${loggedCmd}
|
|
2100
2110
|
`);
|
|
2101
2111
|
}
|
|
2102
|
-
const text = isSlash ? cleanText : `[${
|
|
2112
|
+
const text = isSlash ? cleanText : `[${safeName}]: ${sanitizePromptText(cleanText)}`;
|
|
2103
2113
|
this.handleInbound({
|
|
2104
2114
|
channelName: this.name,
|
|
2105
2115
|
senderId: event.author.user_openid || event.author.id,
|
|
@@ -2111,7 +2121,8 @@ var QQChannel = class extends ChannelBase {
|
|
|
2111
2121
|
isMentioned: true,
|
|
2112
2122
|
// QQ Bot only receives group messages when explicitly @mentioned, so
|
|
2113
2123
|
// every group message is semantically a reply to the bot.
|
|
2114
|
-
isReplyToBot: true
|
|
2124
|
+
isReplyToBot: true,
|
|
2125
|
+
...isSlash ? {} : { alreadyPrefixed: true }
|
|
2115
2126
|
}).catch((e) => process.stderr.write(`[QQ:${this.name}] Group handler error: ${e}
|
|
2116
2127
|
`));
|
|
2117
2128
|
}
|