@qwen-code/qwen-code 0.22.2-preview.1 → 0.22.3
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/computer-use/SKILL.md +3 -3
- package/bundled/goal-draft/SKILL.md +109 -0
- package/bundled/qc-helper/docs/configuration/settings.md +37 -36
- package/bundled/qc-helper/docs/features/_meta.ts +1 -0
- package/bundled/qc-helper/docs/features/channels/dws.md +2 -0
- package/bundled/qc-helper/docs/features/channels/overview.md +34 -3
- package/bundled/qc-helper/docs/features/code-review.md +3 -3
- package/bundled/qc-helper/docs/features/commands.md +2 -1
- package/bundled/qc-helper/docs/features/computer-use.md +2 -2
- package/bundled/qc-helper/docs/features/goals.md +58 -0
- package/bundled/qc-helper/docs/features/headless.md +13 -11
- package/bundled/qc-helper/docs/features/status-line.md +3 -3
- package/bundled/qc-helper/docs/features/tool-use-summaries.md +1 -1
- package/bundled/qc-helper/docs/qwen-serve.md +1 -1
- package/bundled/review/SKILL.md +81 -31
- package/bundled/review/references/persistence.md +7 -3
- package/bundled/review/references/posting.md +10 -4
- package/chunks/MaxSizedBox-X42SXBJH.js +110 -0
- package/chunks/{StandaloneSessionPicker-5D2L22SF.js → StandaloneSessionPicker-2FJAOLGG.js} +81 -83
- package/chunks/{acpAgent-4DCKLA32.js → acpAgent-2ZMIJAFV.js} +1153 -357
- package/chunks/{agent-B4AFZL6H.js → agent-X5WX3L2I.js} +44 -46
- package/chunks/agent-headless-IZM25LJA.js +85 -0
- package/chunks/{anthropicContentGenerator-U76GTVB6.js → anthropicContentGenerator-YVTB6QX7.js} +46 -50
- package/chunks/{artifact-tool-XDJCZZCF.js → artifact-tool-XSMPHZBT.js} +11 -3
- package/chunks/{askUserQuestion-ZXXERLEV.js → askUserQuestion-4SWJY65V.js} +2 -2
- package/chunks/bridge-ME6QXZNA.js +119 -0
- package/chunks/{channel-management-service-HXXS3HOZ.js → channel-management-service-HQ6KDS7C.js} +6 -6
- package/chunks/channel-settings-store-PEOI7XCG.js +120 -0
- package/chunks/{channel-worker-group-EVDC2P4K.js → channel-worker-group-6NA6BBZV.js} +8 -7
- package/chunks/{channel-worker-manager-IJJZHGEI.js → channel-worker-manager-NEZ2J6RK.js} +10 -8
- package/chunks/{channel-worker-supervisor-YSKB5GVB.js → channel-worker-supervisor-FKU7DIHJ.js} +6 -5
- package/chunks/{chunk-7QGEJI7M.js → chunk-23RFD54N.js} +1 -1
- package/chunks/{chunk-JLU3FPQR.js → chunk-2HYKTO7V.js} +5 -5
- package/chunks/chunk-2LNNVAUV.js +1584 -0
- package/chunks/{chunk-FJAITR4L.js → chunk-2OBKDPZZ.js} +2 -2
- package/chunks/{chunk-JSY43GMI.js → chunk-2OUD5T67.js} +185 -174
- package/chunks/{chunk-LJP2BBMK.js → chunk-2SXSLSQE.js} +4 -4
- package/chunks/chunk-2TNL5KPM.js +49 -0
- package/chunks/{chunk-XMSMTU6H.js → chunk-2YOHKHYR.js} +4 -4
- package/chunks/{chunk-MCKJTBZN.js → chunk-36GSQ3MM.js} +2 -2
- package/chunks/chunk-36LGBEM6.js +130 -0
- package/chunks/{chunk-ZWKGZB2K.js → chunk-3JXM2CVW.js} +3 -3
- package/chunks/{chunk-X3XGCJ32.js → chunk-3SZC4VP4.js} +28 -111
- package/chunks/{chunk-ILPXSKGQ.js → chunk-3WK3QDNV.js} +2 -2
- package/chunks/{chunk-IKN3IUJP.js → chunk-3XKLXHGK.js} +17 -9
- package/chunks/{chunk-ZLTEQYNC.js → chunk-42IDLQWS.js} +26 -20
- package/chunks/chunk-4CMJKUND.js +95 -0
- package/chunks/{chunk-77TOMRBG.js → chunk-4K7KNVWH.js} +3 -3
- package/chunks/{chunk-SQPOJ4ZI.js → chunk-4NDLQAY2.js} +27 -270
- package/chunks/{chunk-V3GINY6K.js → chunk-4QHPPXK2.js} +16 -8
- package/chunks/{chunk-VBF4KZRQ.js → chunk-4TT3IVGA.js} +1 -1
- package/chunks/{chunk-IOGKXPL3.js → chunk-4VPCTGH6.js} +6 -6
- package/chunks/chunk-4VQBQLIZ.js +293 -0
- package/chunks/{chunk-UCSV2IZW.js → chunk-62GQFYID.js} +3 -3
- package/chunks/{chunk-SLEWBQWM.js → chunk-6DIGWMGT.js} +2 -2
- package/chunks/{chunk-BRVWYMKV.js → chunk-6MBXY6WM.js} +1 -1
- package/chunks/{chunk-PVBT5QPD.js → chunk-6PJOTWAN.js} +1 -1
- package/chunks/{chunk-WZ3QKPMQ.js → chunk-6X7EU5TI.js} +19 -31
- package/chunks/{chunk-KQYW2GB5.js → chunk-6ZPDLGHN.js} +6 -6
- package/chunks/{chunk-AKQA3WCH.js → chunk-734C6JGI.js} +723 -3399
- package/chunks/{chunk-F7M6ZFGU.js → chunk-73RM4POK.js} +8 -8
- package/chunks/{chunk-ELY4QVIB.js → chunk-7EQQR46F.js} +1 -1
- package/chunks/{chunk-KGJGEEVR.js → chunk-7FA2II6K.js} +10 -1
- package/chunks/chunk-7J6OTNGO.js +424 -0
- package/chunks/{chunk-LWLEPXKK.js → chunk-7LOELM2I.js} +19 -2
- package/chunks/{chunk-DIMEPKCW.js → chunk-7S226YTK.js} +1 -1
- package/chunks/{chunk-AWFZDYSD.js → chunk-7T52W4SW.js} +1 -1
- package/chunks/{chunk-3JKUX4PB.js → chunk-7VMIMAVB.js} +9 -9
- package/chunks/{chunk-2MHGD7EE.js → chunk-A3LWD5MK.js} +1 -1
- package/chunks/{chunk-E4I5MVBR.js → chunk-ABS25QER.js} +1 -1
- package/chunks/{chunk-TDQBVEPK.js → chunk-AIAOIFY4.js} +10 -8
- package/chunks/{chunk-NEZZHGEI.js → chunk-AYFA7MZV.js} +6 -6
- package/chunks/{chunk-FVDQ5E67.js → chunk-B466ZSHZ.js} +3 -3
- package/chunks/{chunk-6US7BF3G.js → chunk-B5PHIJGI.js} +183 -5
- package/chunks/{chunk-4TPAG3O7.js → chunk-BFPESSTR.js} +1 -1
- package/chunks/{chunk-WBT3STGU.js → chunk-BKWNKLZB.js} +20 -20
- package/chunks/{chunk-T45CL2NT.js → chunk-BOWFGCEU.js} +3 -3
- package/chunks/{chunk-IPQA4SR5.js → chunk-BWORX6FA.js} +1 -1
- package/chunks/{chunk-BKDAF7ES.js → chunk-BXDAPVQU.js} +2 -2
- package/chunks/{chunk-ZEADBZLO.js → chunk-C2X7KY45.js} +3 -3
- package/chunks/{chunk-PTQF7WRA.js → chunk-C3PEFRKD.js} +6 -6
- package/chunks/{chunk-7OBH4AM2.js → chunk-CAJTKR6W.js} +5 -5
- package/chunks/{chunk-2FN2HNTI.js → chunk-CFJY4DGX.js} +2 -2
- package/chunks/{chunk-SUE2ZMUH.js → chunk-CIZCL2MW.js} +49 -31
- package/chunks/{chunk-W2WRNJKX.js → chunk-CLWO3B77.js} +6 -6
- package/chunks/{chunk-U45D46O5.js → chunk-CMHFCLBU.js} +1 -1
- package/chunks/{chunk-LRKMQPMD.js → chunk-CQH5KTKC.js} +1 -1
- package/chunks/{chunk-JECO75XD.js → chunk-D5LUXLUH.js} +2 -2
- package/chunks/chunk-DJBQCO2E.js +842 -0
- package/chunks/{chunk-BQBUZDDH.js → chunk-DJECZIJX.js} +42 -42
- package/chunks/{chunk-GTUZ3R6I.js → chunk-DJEZ55D4.js} +351 -113
- package/chunks/{chunk-HPECDZ6X.js → chunk-DJPASAUV.js} +3866 -1077
- package/chunks/{chunk-VYWCFWI5.js → chunk-DMLVSW7L.js} +542 -654
- package/chunks/{chunk-EB4VDXNI.js → chunk-DYXFD5RO.js} +182 -3
- package/chunks/{chunk-ZKAZP2ZG.js → chunk-EB6QRGHM.js} +3 -3
- package/chunks/{chunk-UWICO5KN.js → chunk-EFWRMA2I.js} +3 -3
- package/chunks/{chunk-3UZCLCXR.js → chunk-EKSCLBBF.js} +3 -3
- package/chunks/{chunk-ALTQLFEG.js → chunk-EQSBPBZ3.js} +5 -194
- package/chunks/{chunk-624NHDGB.js → chunk-ERFDKH32.js} +11 -0
- package/chunks/{chunk-4K44OMLI.js → chunk-FROAFEFB.js} +3 -3
- package/chunks/{chunk-MZS7GEC7.js → chunk-FTF2YIZ5.js} +1 -1
- package/chunks/{chunk-Z7VOMGDC.js → chunk-FTJMWDND.js} +0 -24
- package/chunks/{chunk-ZJG323IA.js → chunk-G6FECKTJ.js} +7 -5
- package/chunks/{chunk-TMGAS5TO.js → chunk-GBJBJ4HX.js} +26 -4
- package/chunks/{chunk-UCQOSV6A.js → chunk-GPGU4S2N.js} +3 -3
- package/chunks/{chunk-BHTJAO36.js → chunk-GVIVASYK.js} +7 -7
- package/chunks/chunk-H72BQNM3.js +645 -0
- package/chunks/{chunk-Z4X5MTRT.js → chunk-HCOBAG2L.js} +2 -4
- package/chunks/{chunk-FCSWZAS3.js → chunk-HP5LR5HL.js} +5 -5
- package/chunks/{chunk-7JPW6IYH.js → chunk-HVC3PNVC.js} +1 -1
- package/chunks/{chunk-OI2DR6QB.js → chunk-I6LYRJPB.js} +3 -3
- package/chunks/{chunk-E55H6BZ7.js → chunk-ICURCKIU.js} +1335 -119
- package/chunks/{chunk-PAJGKZAA.js → chunk-ISKH4QX3.js} +14 -12
- package/chunks/{chunk-AYVIGUUK.js → chunk-JB4JIVTJ.js} +1 -1
- package/chunks/{chunk-FN5C6C7G.js → chunk-JHYH6PYQ.js} +192 -478
- package/chunks/{chunk-T6OODF2U.js → chunk-JWALNCLT.js} +1 -1
- package/chunks/{chunk-SKNVVYIJ.js → chunk-K5KXUXWC.js} +3 -3
- package/chunks/{chunk-XUX6O2ZT.js → chunk-KID24ZFN.js} +4 -1
- package/chunks/{chunk-I6DY753S.js → chunk-KJO2LBUK.js} +944 -18
- package/chunks/{chunk-5T4LWWNX.js → chunk-KYWTPLBJ.js} +18 -21
- package/chunks/{chunk-CZFQ62RM.js → chunk-LHBUKJG2.js} +4 -4
- package/chunks/{chunk-TOF4UZHH.js → chunk-LUEHOUHM.js} +3 -3
- package/chunks/{chunk-2YDYDDE2.js → chunk-M3QRM3DE.js} +3 -3
- package/chunks/{chunk-GNMJNDZE.js → chunk-M6FOJXW3.js} +1 -1
- package/chunks/{chunk-ZGWDHSUM.js → chunk-MF7HCQWZ.js} +4 -4
- package/chunks/{chunk-66GIFJ63.js → chunk-MK2GIB46.js} +1 -1
- package/chunks/{chunk-TFV4RXPU.js → chunk-MO3FC2WT.js} +1 -1
- package/chunks/{chunk-TR7G7XFQ.js → chunk-MPNBVAEU.js} +5 -5
- package/chunks/{chunk-K3LPAED5.js → chunk-MQM5PJML.js} +24 -4
- package/chunks/{chunk-3WBMPR3S.js → chunk-MSBO7X2W.js} +1 -1
- package/chunks/{chunk-5PA6UEYA.js → chunk-MZCJWS5Y.js} +1 -1
- package/chunks/{chunk-BGXZBI5B.js → chunk-N4X7G4J2.js} +2 -1
- package/chunks/{chunk-27ONXAFY.js → chunk-NIFYWDYN.js} +1 -1
- package/chunks/{chunk-AP7WZONS.js → chunk-NMOD2FXQ.js} +19 -9
- package/chunks/{chunk-IJVDHPKD.js → chunk-NU7RKEZR.js} +2 -2
- package/chunks/{chunk-5URK47RN.js → chunk-NV55WWD6.js} +11595 -10375
- package/chunks/{chunk-HABT2Z7R.js → chunk-OU5APVWO.js} +4 -4
- package/chunks/{chunk-QR4AHMGQ.js → chunk-P2G476QN.js} +13 -13
- package/chunks/{chunk-5SM2AK65.js → chunk-PADPMMYM.js} +5 -5
- package/chunks/{chunk-RRKNX553.js → chunk-PDQGMSZK.js} +1 -1
- package/chunks/{chunk-GTUKW3I6.js → chunk-PPKZ7JOE.js} +1 -1
- package/chunks/{chunk-SAH4BD2J.js → chunk-PQEISIKS.js} +67 -0
- package/chunks/{chunk-XIRDDFRS.js → chunk-PZ66FRIC.js} +2644 -2296
- package/chunks/{chunk-H3HZ4AWW.js → chunk-Q2MSPKIJ.js} +1 -1
- package/chunks/{chunk-WEGXPP5E.js → chunk-QFCDF5PL.js} +1 -1
- package/chunks/{chunk-OF2DPXUS.js → chunk-QYMAKPY5.js} +119 -24
- package/chunks/{chunk-JVPFTDBK.js → chunk-RFIDDFAL.js} +1 -1
- package/chunks/chunk-RKFGE7JH.js +93 -0
- package/chunks/{chunk-CPPYZHBN.js → chunk-RU7BK6B3.js} +1 -1
- package/chunks/chunk-SEONHUS3.js +275 -0
- package/chunks/{chunk-DEYPMJPD.js → chunk-SMPR7SPO.js} +1 -1
- package/chunks/chunk-SS4MRMKE.js +3525 -0
- package/chunks/{chunk-BPMVPWBT.js → chunk-SS5SDCD3.js} +6 -6
- package/chunks/{chunk-J3CBIEDS.js → chunk-ST5MDGH3.js} +32 -15
- package/chunks/{chunk-J5352S3S.js → chunk-ST5V3ZOC.js} +3 -3
- package/chunks/{chunk-7CWEZQ6T.js → chunk-STUJ7IMZ.js} +0 -77
- package/chunks/{chunk-4K7NQDCG.js → chunk-T4EFG2P5.js} +18 -9
- package/chunks/{chunk-TWSKM647.js → chunk-T7KMERIX.js} +1 -1
- package/chunks/{chunk-5CMWFBML.js → chunk-TEBDFQBZ.js} +1 -1
- package/chunks/{chunk-EC5BONC3.js → chunk-TPI7O7HR.js} +1 -1
- package/chunks/{chunk-T2CRBIDJ.js → chunk-TTX2JUE6.js} +1 -1
- package/chunks/{chunk-VOEMVOM4.js → chunk-TVC6HQ2U.js} +2 -2
- package/chunks/{chunk-WXDZZFH3.js → chunk-TZBSGJ6C.js} +6 -6
- package/chunks/chunk-U54AYGEC.js +337 -0
- package/chunks/{chunk-2NNTE2ED.js → chunk-UHQFIS7N.js} +15 -0
- package/chunks/{chunk-76WGY6LW.js → chunk-URE3QBBB.js} +3 -3
- package/chunks/{chunk-KOJ6MHD5.js → chunk-UTLCH2FK.js} +1 -1
- package/chunks/{chunk-7DPKPBOQ.js → chunk-V2NDP3I4.js} +2 -2
- package/chunks/{chunk-FJWICLG7.js → chunk-V4264FEG.js} +9 -9
- package/chunks/{chunk-XR7OIAQF.js → chunk-V5J4J5TP.js} +2 -2
- package/chunks/{chunk-7UJTY5V3.js → chunk-V7EESTJV.js} +1 -1
- package/chunks/{chunk-Z6L3C4VF.js → chunk-VBCPNIQD.js} +39 -39
- package/chunks/{chunk-ATLGYSYH.js → chunk-VGIFXISB.js} +4 -4
- package/chunks/{chunk-X2UOOG5V.js → chunk-VQUGEVGR.js} +1 -1
- package/chunks/{chunk-XJS54K4A.js → chunk-VTHREBQM.js} +2 -2
- package/chunks/{chunk-AA7VBRBG.js → chunk-W3JH33JE.js} +8 -8
- package/chunks/{chunk-FPH6TXD3.js → chunk-WAOIHTJS.js} +1 -1
- package/chunks/{chunk-CDUN63IN.js → chunk-WGY3AVGM.js} +3 -3
- package/chunks/{chunk-JLGFGPZJ.js → chunk-WNPDGUJO.js} +22 -3
- package/chunks/{chunk-O3BUXIPM.js → chunk-WXEA74YB.js} +3 -3
- package/chunks/{chunk-YRLW2MSX.js → chunk-XBVNNDPK.js} +11 -4
- package/chunks/{chunk-VL4YX3FH.js → chunk-XF63PKEN.js} +1 -1
- package/chunks/{chunk-R7G7GKOX.js → chunk-XHF7WQ6B.js} +3 -3
- package/chunks/{chunk-3FSBMAYD.js → chunk-XQFT3QUF.js} +1 -1
- package/chunks/{chunk-3D6PDLNJ.js → chunk-XSG6G3G6.js} +49 -32
- package/chunks/{chunk-5JCZ3UKB.js → chunk-Y5S7LBOZ.js} +44 -7
- package/chunks/{chunk-OLS3MAXQ.js → chunk-YLSQLSH7.js} +15 -9
- package/chunks/{chunk-2SERYG4T.js → chunk-YTDVNSUQ.js} +1 -1
- package/chunks/{chunk-KPF2K55D.js → chunk-ZEYFMJQA.js} +39 -8
- package/chunks/{chunk-OT4YKUUV.js → chunk-ZU4UDIWX.js} +2 -2
- package/chunks/chunk-ZWJDJ6RU.js +2597 -0
- package/chunks/{chunk-R3T33BG5.js → chunk-ZYMLPEZQ.js} +3 -3
- package/chunks/{chunk-DID6IRGC.js → chunk-ZZMSC3RG.js} +56 -39
- package/chunks/{chunk-L436XFLJ.js → chunk-ZZUKP7HV.js} +1 -1
- package/chunks/config-utils-R6M3TA34.js +113 -0
- package/chunks/contextCommand-ZCAP23J6.js +106 -0
- package/chunks/{core-runtime-CEJRHCRF.js → core-runtime-AXB6SK5D.js} +59 -61
- package/chunks/{create-sub-session-RVHSWVAP.js → create-sub-session-23ITIELI.js} +3 -3
- package/chunks/{create-sub-session-DFZVIG56.js → create-sub-session-4QNE64MR.js} +164 -85
- package/chunks/{cron-create-IJGVR5R2.js → cron-create-KJ4IY6PP.js} +57 -10
- package/chunks/{cron-delete-4N5BI6GL.js → cron-delete-MBLQCAYY.js} +4 -4
- package/chunks/{cron-list-2CATIPUX.js → cron-list-DWH2PQ47.js} +4 -4
- package/chunks/{daemon-NAYK4XXU.js → daemon-3GNHB3M2.js} +523 -8
- package/chunks/{daemon-git-worktree-guard-L6ZUFKF7.js → daemon-git-worktree-guard-IVAJJWYK.js} +56 -58
- package/chunks/daemon-status-provider-K3SJ5C2U.js +117 -0
- package/chunks/daemon-trust-policy-DOR3YG62.js +112 -0
- package/chunks/{daemon-trust-policy-monitor-2G3EKQEU.js → daemon-trust-policy-monitor-KGGROSIV.js} +64 -66
- package/chunks/deferred-core-runtime-WOYLUQQ7.js +114 -0
- package/chunks/{display-image-6KHQNEAE.js → display-image-BE7I6ZB6.js} +5 -5
- package/chunks/{dist-DJBNNPLN.js → dist-4WXLCBDR.js} +1 -1
- package/chunks/{dist-TJUDJTCB.js → dist-5VXFRTWU.js} +280 -48
- package/chunks/{dist-6H6RZ5H6.js → dist-6BPYWHVD.js} +89 -65
- package/chunks/{dist-ZBVOXSKF.js → dist-GFN5DCBX.js} +74 -65
- package/chunks/{dist-SATKXKUR.js → dist-HZNT6GQS.js} +1 -1
- package/chunks/{dist-FVJZSIO4.js → dist-LVZCXVPF.js} +72 -20
- package/chunks/{dist-7CKN54NL.js → dist-N6W6E753.js} +71 -64
- package/chunks/{dist-4Q7NTUNB.js → dist-NSV4NBPK.js} +31 -14
- package/chunks/{dist-UQUFZDIY.js → dist-SWQMYP2Q.js} +18 -16
- package/chunks/earlyInputCapture-OHBEVO4K.js +107 -0
- package/chunks/{edit-ZERGX3RV.js → edit-LEQLAGPZ.js} +45 -47
- package/chunks/{en-6MDBWMTG.js → en-YLXBXM4Z.js} +2 -1
- package/chunks/{enter-worktree-UOZ6ZTP7.js → enter-worktree-35QCAAFP.js} +7 -7
- package/chunks/{enterPlanMode-W2RP3P5B.js → enterPlanMode-ONQN3WHE.js} +47 -49
- package/chunks/{environment-ZBJ23YVR.js → environment-UANTR7A4.js} +60 -62
- package/chunks/errors-WAK6KFBC.js +113 -0
- package/chunks/{exit-worktree-G2QATUCV.js → exit-worktree-XQD6D543.js} +7 -7
- package/chunks/exitPlanMode-UEYBG6P5.js +83 -0
- package/chunks/{fast-path-4MWBCEUF.js → fast-path-WUL7UZ6H.js} +7 -7
- package/chunks/{fast-path-settings-XMFBYFUH.js → fast-path-settings-XH426LUU.js} +3 -3
- package/chunks/{glob-DKTNG32L.js → glob-Y54QUWDY.js} +44 -46
- package/chunks/{goal-tools-CNVXMSZD.js → goal-tools-PTD3MBA7.js} +10 -8
- package/chunks/{grep-3NLSS32D.js → grep-5GPICQBU.js} +6 -6
- package/chunks/handleAutoUpdate-FP3NWNSG.js +109 -0
- package/chunks/i18n-INIU5X7A.js +124 -0
- package/chunks/{image-gen-63NN2H5N.js → image-gen-J6FDGUZP.js} +8 -10
- package/chunks/initializer-TYODV6GE.js +113 -0
- package/chunks/installationInfo-AAPKYDSZ.js +107 -0
- package/chunks/{keychain-token-storage-3MGFRYGM.js → keychain-token-storage-37XPR34V.js} +2 -2
- package/chunks/list-TUODDN6J.js +116 -0
- package/chunks/{list-agents-EXRSHIDJ.js → list-agents-DI3YFTDT.js} +2 -2
- package/chunks/{gemini-X5GQHQYF.js → llm-NSAVK5V3.js} +117 -114
- package/chunks/{geminiContentGenerator-UDSWXZXL.js → llm-content-generator-AY2QKXHE.js} +29 -29
- package/chunks/loadedSettingsAdapter-KJCLZ3C4.js +110 -0
- package/chunks/{loggingContentGenerator-73C7TKDK.js → loggingContentGenerator-DSFQHXIF.js} +328 -37
- package/chunks/{loop-wakeup-XBPB2BRO.js → loop-wakeup-XJFONSQ7.js} +5 -5
- package/chunks/{ls-WFONAND2.js → ls-3VAT2J7A.js} +4 -4
- package/chunks/{lsp-DUKPDUXN.js → lsp-5W7IRUBH.js} +2 -2
- package/chunks/{managed-npm-update-H2KOLQZU.js → managed-npm-update-TSWENTK5.js} +57 -59
- package/chunks/mcp-MWSAPFOL.js +110 -0
- package/chunks/{monitor-TGCMNJJH.js → monitor-RW4GWJHB.js} +44 -46
- package/chunks/nonInteractiveCli-JXKL343Q.js +185 -0
- package/chunks/{notebook-edit-YEUNZYDX.js → notebook-edit-CQNYS5OR.js} +45 -47
- package/chunks/{open-with-auth-4UI3KHUR.js → open-with-auth-YN3QZHVM.js} +1 -1
- package/chunks/{openaiContentGenerator-J7LD4VSL.js → openaiContentGenerator-J6QIF7EX.js} +26 -28
- package/chunks/pidfile-QOIQZFT2.js +111 -0
- package/chunks/process-registry-OAEG6WGC.js +662 -0
- package/chunks/{processUtils-ZHFC7CSL.js → processUtils-GPHNANKZ.js} +2 -2
- package/chunks/prompt-terminal-ledger-FOMFTYOM.js +105 -0
- package/chunks/{qwenContentGenerator-YEWWK3JQ.js → qwenContentGenerator-WWDXPYQI.js} +49 -51
- package/chunks/{qwenOAuth2-JIYAWXTW.js → qwenOAuth2-OF5WRBQT.js} +7 -9
- package/chunks/{read-file-ZQI3WPVK.js → read-file-FQUQHC6N.js} +13 -13
- package/chunks/{read-mcp-resource-7A7NFSFL.js → read-mcp-resource-XD257PGJ.js} +2 -2
- package/chunks/{record-artifact-CPJ4IJSD.js → record-artifact-VW23GS4F.js} +4 -4
- package/chunks/{report-findings-VFM5DENC.js → report-findings-AO5VYFLR.js} +9 -5
- package/chunks/{request-shutdown-6IW46GD7.js → request-shutdown-BCLA3JV2.js} +7 -7
- package/chunks/resumeHistoryUtils-NSGF3UCB.js +118 -0
- package/chunks/ripGrep-4CAT6SKV.js +39 -0
- package/chunks/{run-qwen-serve-WHWU7NZ6.js → run-qwen-serve-5X6IDZER.js} +371 -357
- package/chunks/{runtime-E7BSPWQP.js → runtime-HK27GMPF.js} +69 -71
- package/chunks/scheduled-tasks-MN2ZZ5P6.js +127 -0
- package/chunks/{scheduler-TJPATFOM.js → scheduler-WD4MHMO5.js} +58 -60
- package/chunks/{sdk-exporters-http-XXSKBD2C.js → sdk-exporters-http-TTU2CHBU.js} +2 -2
- package/chunks/{sdk-impl-VPNBLV7I.js → sdk-impl-UUMVYMAL.js} +11 -5
- package/chunks/{send-message-OXZK6USO.js → send-message-AJ4OCUBV.js} +25 -9
- package/chunks/serve-2XCHPPGG.js +118 -0
- package/chunks/{server-AXCN7QBJ.js → server-GO2N5DH7.js} +6080 -4964
- package/chunks/{session-HO4US3AG.js → session-IFNHTUBT.js} +112 -112
- package/chunks/session-pr-refresh-I3UBWMVP.js +364 -0
- package/chunks/{settings-B2PFJJN4.js → settings-L6N54CU6.js} +63 -65
- package/chunks/{shell-7XMSANI3.js → shell-4Y5LLW6N.js} +44 -46
- package/chunks/{skill-NL3VH562.js → skill-YOWTRAKQ.js} +68 -24
- package/chunks/skill-settings-ZL4JY5UE.js +118 -0
- package/chunks/spawnChannel-ZST6XJVJ.js +112 -0
- package/chunks/standalone-update-THVU3OKY.js +118 -0
- package/chunks/{startInteractiveUI-G2XKSCQ7.js → startInteractiveUI-XDFSHBZD.js} +3076 -2475
- package/chunks/{stdioHelpers-7A2EE64Z.js → stdioHelpers-AY6XCDY2.js} +3 -1
- package/chunks/{syntheticOutput-5AJ444QT.js → syntheticOutput-ML43GEFN.js} +3 -3
- package/chunks/{task-create-TY7P6UHG.js → task-create-QN4LYRSE.js} +11 -11
- package/chunks/{task-list-BELMPA75.js → task-list-JPLGK45U.js} +5 -5
- package/chunks/{task-stop-U3S3KZG2.js → task-stop-CXEH5L2D.js} +2 -2
- package/chunks/{task-update-O4IGDPCK.js → task-update-IWEOJFV2.js} +11 -11
- package/chunks/{team-create-IYBUOORE.js → team-create-OOPXCDBA.js} +44 -46
- package/chunks/{team-delete-YWFXX77L.js → team-delete-RZVVSGCY.js} +5 -5
- package/chunks/{team-plan-approval-YKU57LBM.js → team-plan-approval-DSX5EWAT.js} +44 -46
- package/chunks/terminal-image-renderer-KS25G33E.js +114 -0
- package/chunks/theme-manager-YMZNG45F.js +102 -0
- package/chunks/{todoWrite-435EO2CS.js → todoWrite-WDJNQEMW.js} +43 -25
- package/chunks/{tool-search-4Q3KASIQ.js → tool-search-J5Q6U7DN.js} +22 -22
- package/chunks/total-session-admission-PVN64JVV.js +114 -0
- package/chunks/trustedFolders-FATSC4YI.js +122 -0
- package/chunks/{types-WYCFCEHR.js → types-HKLPXZB3.js} +1 -3
- package/chunks/{update-relaunch-4DC2KKFS.js → update-relaunch-SIKHLHVR.js} +6 -6
- package/chunks/updateCheck-D3YG2WCD.js +118 -0
- package/chunks/useAutoAcceptIndicator-ILINOSAS.js +120 -0
- package/chunks/{validateNonInterActiveAuth-YAE4YPO3.js → validateNonInterActiveAuth-JUDQP6V4.js} +105 -105
- package/chunks/{version-QFP7OGWX.js → version-C63GDDWN.js} +1 -1
- package/chunks/{web-fetch-6T23IK6Q.js → web-fetch-FOQZMNSC.js} +16 -18
- package/chunks/{web-search-WBWTCZK2.js → web-search-PUJTBFUC.js} +9 -11
- package/chunks/{web-shell-static-A6QMUNNV.js → web-shell-static-HNB4FDOE.js} +2 -2
- package/chunks/{workflow-FMAA3D4R.js → workflow-Y5IPINVH.js} +128 -94
- package/chunks/workspace-providers-status-IJ4VHFMB.js +114 -0
- package/chunks/{workspace-registration-store-CMMX7EPX.js → workspace-registration-store-SMJWI2AI.js} +1 -1
- package/chunks/workspace-registry-BTGZIMPK.js +123 -0
- package/chunks/workspace-service-SIN67ITC.js +126 -0
- package/chunks/workspace-skills-status-F3RKCUIX.js +113 -0
- package/chunks/{workspace-trust-reconciler-PJDQUTJL.js → workspace-trust-reconciler-PLIDLJZX.js} +72 -72
- package/chunks/write-file-PAIGB33C.js +88 -0
- package/chunks/{zh-TW-MV4FWFB6.js → zh-TW-RPTMRTHG.js} +2 -1
- package/chunks/{zh-X3WGU6SI.js → zh-UNY63FR3.js} +2 -1
- package/chunks/{zoom-image-WVYVFRXF.js → zoom-image-LYQD7BQA.js} +13 -13
- package/cli.js +16 -16
- package/locales/en.js +2 -0
- package/locales/zh-TW.js +2 -0
- package/locales/zh.js +2 -0
- package/package.json +3 -3
- package/web-shell/assets/{abnfDiagram-VCTEODGH-d-8xa8uz.js → abnfDiagram-VCTEODGH-TRCMSA_6.js} +1 -1
- package/web-shell/assets/{arc-BhB7CrGK.js → arc-D9Uls5b3.js} +1 -1
- package/web-shell/assets/{architectureDiagram-5GKGNRK7-BDCd_IcJ.js → architectureDiagram-5GKGNRK7-Bwb8jPXg.js} +1 -1
- package/web-shell/assets/{blockDiagram-NRAW4CY4-C-AHu6mi.js → blockDiagram-NRAW4CY4-DHj71TSX.js} +1 -1
- package/web-shell/assets/{c4Diagram-UCG6FXSJ-CFjQt0vl.js → c4Diagram-UCG6FXSJ-uKBBdbyr.js} +1 -1
- package/web-shell/assets/channel-CXjVLaBa.js +1 -0
- package/web-shell/assets/{chunk-2Q5K7J3B-DRjwqaDq.js → chunk-2Q5K7J3B-BZd0Phrl.js} +1 -1
- package/web-shell/assets/{chunk-5VM5RSS4-eHM9noJE.js → chunk-5VM5RSS4-7KNeNBqN.js} +1 -1
- package/web-shell/assets/{chunk-F27PBJKO-CcSWUYn1.js → chunk-F27PBJKO-BeboS7Fi.js} +1 -1
- package/web-shell/assets/{chunk-G27WJ6UU-DNr-RF5S.js → chunk-G27WJ6UU-RV3JONoj.js} +1 -1
- package/web-shell/assets/{chunk-JWPE2WC7-rVJHoNF8.js → chunk-JWPE2WC7-Yw9FCFsP.js} +1 -1
- package/web-shell/assets/{chunk-LCL6LL3I-B2aX0Gzy.js → chunk-LCL6LL3I-GIMnydDe.js} +1 -1
- package/web-shell/assets/{chunk-POPQ4Y6H-DVp07n32.js → chunk-POPQ4Y6H-Cfrux7bL.js} +1 -1
- package/web-shell/assets/{chunk-SVP7TREG-C6QB_KUr.js → chunk-SVP7TREG-BlvIN0CO.js} +1 -1
- package/web-shell/assets/{chunk-XXDRQBXY-CLVxDNCy.js → chunk-XXDRQBXY-DMs7Rr4t.js} +1 -1
- package/web-shell/assets/classDiagram-DTDB5LWJ-DANEijO3.js +1 -0
- package/web-shell/assets/classDiagram-v2-JRS7N3AN-DANEijO3.js +1 -0
- package/web-shell/assets/{cose-bilkent-JH36ORCC-B_aKX3A3.js → cose-bilkent-JH36ORCC-DNGqTNwI.js} +1 -1
- package/web-shell/assets/{cynefin-OW5HDTMX-BBw2pPUa.js → cynefin-OW5HDTMX-CojMpaoH.js} +1 -1
- package/web-shell/assets/{cynefinDiagram-5FMLGOSQ-WWPiBTwk.js → cynefinDiagram-5FMLGOSQ-DF07YXGo.js} +1 -1
- package/web-shell/assets/{dagre-3AP2YEHR-CPtIdka-.js → dagre-3AP2YEHR-17-4WtCH.js} +1 -1
- package/web-shell/assets/{diagram-S7CK7UJ4-Dj5og1Xi.js → diagram-S7CK7UJ4-G3Wuyz9m.js} +1 -1
- package/web-shell/assets/{diagram-UQ7AKVKN-CC_x70YC.js → diagram-UQ7AKVKN-nyWIKZ8P.js} +1 -1
- package/web-shell/assets/{diagram-VSXAHHWV-rXMfsO4n.js → diagram-VSXAHHWV-tKHhmYSC.js} +1 -1
- package/web-shell/assets/{diagram-VX7I27RA-DEmLYQbh.js → diagram-VX7I27RA-CpDf1hYk.js} +1 -1
- package/web-shell/assets/{diagram-Z3DM3KII-B0ys6Vxx.js → diagram-Z3DM3KII-Cah2IFXG.js} +1 -1
- package/web-shell/assets/{ebnfDiagram-PWID7BFC-Bq6y6lKH.js → ebnfDiagram-PWID7BFC-DNaCkgxy.js} +1 -1
- package/web-shell/assets/{erDiagram-SSCWMZ5O-l69JeBZ4.js → erDiagram-SSCWMZ5O-CAdRgcf1.js} +1 -1
- package/web-shell/assets/{flowDiagram-A5DVABFB-Cm-EzGY4.js → flowDiagram-A5DVABFB-CMUJAShL.js} +1 -1
- package/web-shell/assets/{ganttDiagram-EL5Y4UJY-BRS9ZOp7.js → ganttDiagram-EL5Y4UJY-o-_MUNey.js} +1 -1
- package/web-shell/assets/{gitGraphDiagram-WWUBYQGX-DAMRKgLk.js → gitGraphDiagram-WWUBYQGX-_aG-2Z7O.js} +1 -1
- package/web-shell/assets/{index-Bncx8E8M.js → index-BK_NKxiJ.js} +1 -1
- package/web-shell/assets/index-Ci-z4zWY.js +1913 -0
- package/web-shell/assets/index-LDlXZRHA.css +36 -0
- package/web-shell/assets/{infoDiagram-RXCK75RN-DasffaZp.js → infoDiagram-RXCK75RN-qJPeZbGP.js} +1 -1
- package/web-shell/assets/{ishikawaDiagram-5VMMS53U-CmRUt3C-.js → ishikawaDiagram-5VMMS53U-7Om4vNo1.js} +1 -1
- package/web-shell/assets/{journeyDiagram-EYS64GPL-DzhE_c1Z.js → journeyDiagram-EYS64GPL-BNtXqmBW.js} +1 -1
- package/web-shell/assets/{kanban-definition-3QL26DDD-BH5b6nn3.js → kanban-definition-3QL26DDD-COgFec8P.js} +1 -1
- package/web-shell/assets/{layout-BxoLK-LY.js → layout-B9n81PC9.js} +1 -1
- package/web-shell/assets/{linear-CqDPvVI7.js → linear-Bb6nXZQq.js} +1 -1
- package/web-shell/assets/{mermaid.core-DBoN4plo.js → mermaid.core-Cgrm3JVT.js} +6 -6
- package/web-shell/assets/{mindmap-definition-FBJOCRG2-DJJtXPEM.js → mindmap-definition-FBJOCRG2-TKwLTjnG.js} +1 -1
- package/web-shell/assets/{pegDiagram-XKGWAZYB-DmgPXP5l.js → pegDiagram-XKGWAZYB-BJPuvlpi.js} +1 -1
- package/web-shell/assets/{pieDiagram-E7YTZNPT-1ezjzcI5.js → pieDiagram-E7YTZNPT-D01VkNsW.js} +1 -1
- package/web-shell/assets/{quadrantDiagram-AXDQQJYC-ChKARz3k.js → quadrantDiagram-AXDQQJYC-C4hHsiv-.js} +1 -1
- package/web-shell/assets/{railroadDiagram-O6MQD6OU-k7mNB_QT.js → railroadDiagram-O6MQD6OU-CuEO4xK2.js} +1 -1
- package/web-shell/assets/{requirementDiagram-EFPCY7ZU-B0XFsii0.js → requirementDiagram-EFPCY7ZU-D5J_vIo5.js} +1 -1
- package/web-shell/assets/{sankeyDiagram-P5KCCOFB-repJ2Ukk.js → sankeyDiagram-P5KCCOFB-DQKY223V.js} +1 -1
- package/web-shell/assets/{sequenceDiagram-WJ2MYXX4-D0gUSKGu.js → sequenceDiagram-WJ2MYXX4-D27YV_cm.js} +1 -1
- package/web-shell/assets/{sizeCapture-X5ZJPWSS-CE463F74.js → sizeCapture-X5ZJPWSS-TJg8UcwV.js} +1 -1
- package/web-shell/assets/{stateDiagram-HBIQ2CUA-003zYtJa.js → stateDiagram-HBIQ2CUA-CmnPzUIx.js} +1 -1
- package/web-shell/assets/stateDiagram-v2-4QOOHH4V-DNKPyrDc.js +1 -0
- package/web-shell/assets/{swimlanes-XN3QIQJK-DBj8MFpu.js → swimlanes-XN3QIQJK-ByeP3_Nu.js} +1 -1
- package/web-shell/assets/swimlanesDiagram-VK2B7HYN-ZL1HPC6w.js +8 -0
- package/web-shell/assets/{timeline-definition-24CTP7MA-D2aCh4a9.js → timeline-definition-24CTP7MA-BsFA5juR.js} +1 -1
- package/web-shell/assets/{vennDiagram-4TSXK5OY-BHMfWBpl.js → vennDiagram-4TSXK5OY-DREP2ECo.js} +1 -1
- package/web-shell/assets/{wardleyDiagram-VM6X3IG4-RdHAj66j.js → wardleyDiagram-VM6X3IG4-iyd9lKi2.js} +1 -1
- package/web-shell/assets/{xychartDiagram-S5SC5T6Z-BgJWOvq0.js → xychartDiagram-S5SC5T6Z-CVr1_j9q.js} +1 -1
- package/web-shell/index.html +3 -3
- package/chunks/MaxSizedBox-BFVLZP2E.js +0 -112
- package/chunks/agent-headless-UCBCS4V4.js +0 -87
- package/chunks/bridge-FRNYLYY7.js +0 -119
- package/chunks/channel-settings-store-IV4KDL7N.js +0 -117
- package/chunks/chunk-I6VVOZDK.js +0 -202
- package/chunks/chunk-JS73NNWF.js +0 -30
- package/chunks/chunk-K2OJUPOE.js +0 -78
- package/chunks/chunk-P3QQPMQA.js +0 -19
- package/chunks/chunk-SDVF6A42.js +0 -945
- package/chunks/chunk-VGHZT6JR.js +0 -51
- package/chunks/config-utils-PMX4QZ5Y.js +0 -113
- package/chunks/contextCommand-NZRLVAFC.js +0 -108
- package/chunks/daemon-status-provider-FTTYZEKN.js +0 -118
- package/chunks/daemon-trust-policy-WMGFPA3Z.js +0 -114
- package/chunks/deferred-core-runtime-BUFEFYNA.js +0 -116
- package/chunks/earlyInputCapture-ROPLMXA7.js +0 -109
- package/chunks/errors-U5KNAADB.js +0 -115
- package/chunks/exitPlanMode-VFJ5R5DD.js +0 -85
- package/chunks/handleAutoUpdate-W4BUYFT7.js +0 -111
- package/chunks/i18n-KX7FEKJJ.js +0 -126
- package/chunks/initializer-SNVVLS7Y.js +0 -115
- package/chunks/installationInfo-D4XGQNHJ.js +0 -109
- package/chunks/list-WYECMLXZ.js +0 -118
- package/chunks/loadedSettingsAdapter-5WZBXBCR.js +0 -112
- package/chunks/mcp-CBWAROY3.js +0 -112
- package/chunks/nonInteractiveCli-O232UUV7.js +0 -185
- package/chunks/pidfile-MSPQ255Y.js +0 -113
- package/chunks/process-registry-PMJOA5CO.js +0 -172
- package/chunks/prompt-terminal-ledger-YPGMNDXT.js +0 -107
- package/chunks/resumeHistoryUtils-35D4KAVT.js +0 -120
- package/chunks/ripGrep-46N4FLOS.js +0 -39
- package/chunks/serve-WQ54UIYG.js +0 -120
- package/chunks/skill-settings-SKMN5YXC.js +0 -120
- package/chunks/spawnChannel-NE43EEO3.js +0 -113
- package/chunks/standalone-update-XOCWGXAH.js +0 -120
- package/chunks/terminal-image-renderer-NREKYTAD.js +0 -116
- package/chunks/theme-manager-IJS6OICX.js +0 -104
- package/chunks/total-session-admission-L5RPEFZ2.js +0 -114
- package/chunks/trustedFolders-OILZCHRD.js +0 -124
- package/chunks/updateCheck-AK4COHNK.js +0 -120
- package/chunks/useAutoAcceptIndicator-O2N2Q6KG.js +0 -122
- package/chunks/workspace-providers-status-OCFEWIPQ.js +0 -116
- package/chunks/workspace-registry-WJLZPRTG.js +0 -123
- package/chunks/workspace-service-5ZOBMMIB.js +0 -131
- package/chunks/workspace-skills-status-B6NJZD4B.js +0 -115
- package/chunks/write-file-B2RNX6SU.js +0 -90
- package/web-shell/assets/channel-CU-Zyv0r.js +0 -1
- package/web-shell/assets/classDiagram-DTDB5LWJ-C0J2_LKs.js +0 -1
- package/web-shell/assets/classDiagram-v2-JRS7N3AN-C0J2_LKs.js +0 -1
- package/web-shell/assets/index-C-XlQn24.css +0 -5
- package/web-shell/assets/index-gdvMN4J1.js +0 -1860
- package/web-shell/assets/stateDiagram-v2-4QOOHH4V-2uACDdJN.js +0 -1
- package/web-shell/assets/swimlanesDiagram-VK2B7HYN-C4JJkavU.js +0 -8
|
@@ -11,11 +11,11 @@ import {
|
|
|
11
11
|
sendMessage,
|
|
12
12
|
sendTyping,
|
|
13
13
|
uploadToCdn
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-FTF2YIZ5.js";
|
|
15
15
|
import {
|
|
16
16
|
ChannelBase,
|
|
17
17
|
isTerminalTaskLifecycleType
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-ICURCKIU.js";
|
|
19
19
|
import "./chunk-IW6RQPQB.js";
|
|
20
20
|
import "./chunk-CQ35AJ4Z.js";
|
|
21
21
|
import {
|
|
@@ -422,10 +422,9 @@ var WeixinChannel = class extends ChannelBase {
|
|
|
422
422
|
__name(this, "WeixinChannel");
|
|
423
423
|
}
|
|
424
424
|
abortController = null;
|
|
425
|
-
|
|
425
|
+
activeTypingSessions = /* @__PURE__ */ new Map();
|
|
426
426
|
typingKeepaliveIntervals = /* @__PURE__ */ new Map();
|
|
427
427
|
typingKeepaliveInFlight = /* @__PURE__ */ new Set();
|
|
428
|
-
typingKeepaliveArmedAt = /* @__PURE__ */ new Map();
|
|
429
428
|
/**
|
|
430
429
|
* Per-chat generation token; stale setTyping continuations bail out.
|
|
431
430
|
* Entries are reclaimed only by `disconnect()` — deleting them in
|
|
@@ -505,54 +504,55 @@ var WeixinChannel = class extends ChannelBase {
|
|
|
505
504
|
process.stderr.write(`[Weixin:${this.name}] Connected to WeChat (${this.baseUrl})
|
|
506
505
|
`);
|
|
507
506
|
}
|
|
508
|
-
onPromptStart(chatId) {
|
|
509
|
-
this.startTyping(chatId);
|
|
507
|
+
onPromptStart(chatId, sessionId) {
|
|
508
|
+
this.startTyping(chatId, sessionId);
|
|
510
509
|
}
|
|
511
|
-
onPromptEnd(chatId) {
|
|
512
|
-
this.stopTyping(chatId);
|
|
510
|
+
onPromptEnd(chatId, sessionId) {
|
|
511
|
+
this.stopTyping(chatId, sessionId);
|
|
513
512
|
}
|
|
514
513
|
onTaskLifecycle(event) {
|
|
515
514
|
if (event.type === "started") {
|
|
516
|
-
this.startTyping(event.chatId);
|
|
515
|
+
this.startTyping(event.chatId, event.sessionId);
|
|
517
516
|
return;
|
|
518
517
|
}
|
|
519
518
|
if (isTerminalTaskLifecycleType(event.type)) {
|
|
520
|
-
this.stopTyping(event.chatId);
|
|
519
|
+
this.stopTyping(event.chatId, event.sessionId);
|
|
521
520
|
}
|
|
522
521
|
}
|
|
523
522
|
async handleInboundWithMedia(envelope, image, file) {
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
523
|
+
await this.prepareThenHandleInbound(envelope, async () => {
|
|
524
|
+
if (image) {
|
|
525
|
+
try {
|
|
526
|
+
const imageData = await downloadAndDecrypt(image.encryptQueryParam, image.aesKey);
|
|
527
|
+
envelope.imageBase64 = imageData.toString("base64");
|
|
528
|
+
envelope.imageMimeType = detectImageMime(imageData);
|
|
529
|
+
} catch (err) {
|
|
530
|
+
process.stderr.write(`[Weixin:${this.name}] Failed to download image: ${err instanceof Error ? err.message : err}
|
|
531
531
|
`);
|
|
532
|
+
}
|
|
532
533
|
}
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
process.stderr.write(`[Weixin:${this.name}] Failed to download file: ${err instanceof Error ? err.message : err}
|
|
534
|
+
if (file) {
|
|
535
|
+
try {
|
|
536
|
+
const fileData = await downloadAndDecrypt(file.encryptQueryParam, file.aesKey);
|
|
537
|
+
const dir = join2(tmpdir2(), "channel-files", randomUUID2());
|
|
538
|
+
mkdirSync(dir, { recursive: true });
|
|
539
|
+
const filePath = join2(dir, basename(file.fileName) || `file_${Date.now()}`);
|
|
540
|
+
writeFileSync2(filePath, fileData);
|
|
541
|
+
envelope.attachments = [
|
|
542
|
+
{
|
|
543
|
+
type: "file",
|
|
544
|
+
filePath,
|
|
545
|
+
mimeType: "application/octet-stream",
|
|
546
|
+
fileName: file.fileName
|
|
547
|
+
}
|
|
548
|
+
];
|
|
549
|
+
} catch (err) {
|
|
550
|
+
process.stderr.write(`[Weixin:${this.name}] Failed to download file: ${err instanceof Error ? err.message : err}
|
|
551
551
|
`);
|
|
552
|
-
|
|
552
|
+
envelope.text = `(User sent a file "${file.fileName}" but download failed)`;
|
|
553
|
+
}
|
|
553
554
|
}
|
|
554
|
-
}
|
|
555
|
-
await super.handleInbound(envelope);
|
|
555
|
+
});
|
|
556
556
|
}
|
|
557
557
|
async sendMessage(chatId, text) {
|
|
558
558
|
const contextToken = getContextToken(chatId) || "";
|
|
@@ -623,14 +623,18 @@ var WeixinChannel = class extends ChannelBase {
|
|
|
623
623
|
}
|
|
624
624
|
this.typingKeepaliveIntervals.clear();
|
|
625
625
|
this.typingKeepaliveInFlight.clear();
|
|
626
|
-
this.typingKeepaliveArmedAt.clear();
|
|
627
626
|
this.typingGenerations.clear();
|
|
628
|
-
this.
|
|
627
|
+
this.activeTypingSessions.clear();
|
|
629
628
|
}
|
|
630
|
-
startTyping(chatId) {
|
|
631
|
-
|
|
629
|
+
startTyping(chatId, sessionId) {
|
|
630
|
+
const sessions = this.activeTypingSessions.get(chatId) ?? /* @__PURE__ */ new Map();
|
|
631
|
+
if (sessions.has(sessionId))
|
|
632
|
+
return;
|
|
633
|
+
const firstSession = sessions.size === 0;
|
|
634
|
+
sessions.set(sessionId, Date.now());
|
|
635
|
+
this.activeTypingSessions.set(chatId, sessions);
|
|
636
|
+
if (!firstSession)
|
|
632
637
|
return;
|
|
633
|
-
this.activeTypingChats.add(chatId);
|
|
634
638
|
const controller = this.abortController;
|
|
635
639
|
const generation = (this.typingGenerations.get(chatId) ?? 0) + 1;
|
|
636
640
|
this.typingGenerations.set(chatId, generation);
|
|
@@ -639,51 +643,64 @@ var WeixinChannel = class extends ChannelBase {
|
|
|
639
643
|
return;
|
|
640
644
|
}
|
|
641
645
|
if (generation !== this.typingGenerations.get(chatId)) {
|
|
642
|
-
if (started && !this.
|
|
646
|
+
if (started && !this.activeTypingSessions.has(chatId)) {
|
|
643
647
|
void this.setTyping(chatId, false);
|
|
644
648
|
}
|
|
645
649
|
return;
|
|
646
650
|
}
|
|
647
|
-
if (!
|
|
648
|
-
this.activeTypingChats.delete(chatId);
|
|
649
|
-
return;
|
|
650
|
-
}
|
|
651
|
-
if (!this.activeTypingChats.has(chatId)) {
|
|
651
|
+
if (started && !this.activeTypingSessions.has(chatId)) {
|
|
652
652
|
void this.setTyping(chatId, false);
|
|
653
653
|
return;
|
|
654
654
|
}
|
|
655
|
-
this.
|
|
655
|
+
if (this.activeTypingSessions.has(chatId)) {
|
|
656
|
+
this.startTypingKeepalive(chatId);
|
|
657
|
+
}
|
|
656
658
|
});
|
|
657
659
|
}
|
|
658
|
-
stopTyping(chatId) {
|
|
660
|
+
stopTyping(chatId, sessionId) {
|
|
661
|
+
const sessions = this.activeTypingSessions.get(chatId);
|
|
662
|
+
if (!sessions?.delete(sessionId))
|
|
663
|
+
return;
|
|
664
|
+
if (sessions.size > 0)
|
|
665
|
+
return;
|
|
666
|
+
this.activeTypingSessions.delete(chatId);
|
|
667
|
+
this.stopTypingChat(chatId);
|
|
668
|
+
}
|
|
669
|
+
stopTypingChat(chatId) {
|
|
659
670
|
this.typingGenerations.set(chatId, (this.typingGenerations.get(chatId) ?? 0) + 1);
|
|
660
671
|
this.stopTypingKeepalive(chatId);
|
|
661
|
-
if (!this.activeTypingChats.delete(chatId))
|
|
662
|
-
return;
|
|
663
672
|
void this.setTyping(chatId, false);
|
|
664
673
|
}
|
|
665
674
|
/**
|
|
666
675
|
* Refreshes TYPING periodically while the chat stays in
|
|
667
|
-
*
|
|
668
|
-
*
|
|
669
|
-
*
|
|
670
|
-
* (`TYPING_KEEPALIVE_MAX_MS`) elapses, so a missed terminal event cannot
|
|
671
|
-
* keep it alive indefinitely.
|
|
676
|
+
* active sessions, so the indicator survives long turns. Each tick expires
|
|
677
|
+
* only sessions that exceeded the backstop; newer sessions in the same chat
|
|
678
|
+
* keep ownership.
|
|
672
679
|
*/
|
|
673
680
|
startTypingKeepalive(chatId) {
|
|
674
681
|
if (this.typingKeepaliveIntervals.has(chatId))
|
|
675
682
|
return;
|
|
676
|
-
this.typingKeepaliveArmedAt.set(chatId, Date.now());
|
|
677
683
|
this.typingKeepaliveIntervals.set(chatId, setInterval(() => {
|
|
678
|
-
|
|
684
|
+
const sessions = this.activeTypingSessions.get(chatId);
|
|
685
|
+
if (!sessions) {
|
|
679
686
|
this.stopTypingKeepalive(chatId);
|
|
680
687
|
return;
|
|
681
688
|
}
|
|
682
|
-
const
|
|
683
|
-
|
|
684
|
-
|
|
689
|
+
const now = Date.now();
|
|
690
|
+
let expiredSessions = 0;
|
|
691
|
+
for (const [sessionId, startedAt] of sessions) {
|
|
692
|
+
if (now - startedAt >= TYPING_KEEPALIVE_MAX_MS) {
|
|
693
|
+
sessions.delete(sessionId);
|
|
694
|
+
expiredSessions++;
|
|
695
|
+
}
|
|
696
|
+
}
|
|
697
|
+
if (expiredSessions > 0) {
|
|
698
|
+
process.stderr.write(`[Weixin:${this.name}] Typing keepalive backstop (${TYPING_KEEPALIVE_MAX_MS}ms) elapsed for ${expiredSessions} session(s) in chat ${chatId}
|
|
685
699
|
`);
|
|
686
|
-
|
|
700
|
+
}
|
|
701
|
+
if (sessions.size === 0) {
|
|
702
|
+
this.activeTypingSessions.delete(chatId);
|
|
703
|
+
this.stopTypingChat(chatId);
|
|
687
704
|
return;
|
|
688
705
|
}
|
|
689
706
|
if (this.typingKeepaliveInFlight.has(chatId))
|
|
@@ -700,9 +717,16 @@ var WeixinChannel = class extends ChannelBase {
|
|
|
700
717
|
return;
|
|
701
718
|
clearInterval(interval);
|
|
702
719
|
this.typingKeepaliveIntervals.delete(chatId);
|
|
703
|
-
this.typingKeepaliveArmedAt.delete(chatId);
|
|
704
720
|
this.typingKeepaliveInFlight.delete(chatId);
|
|
705
721
|
}
|
|
722
|
+
onSessionDied(sessionId) {
|
|
723
|
+
for (const [chatId, sessions] of this.activeTypingSessions) {
|
|
724
|
+
if (sessions.has(sessionId)) {
|
|
725
|
+
this.stopTyping(chatId, sessionId);
|
|
726
|
+
}
|
|
727
|
+
}
|
|
728
|
+
super.onSessionDied(sessionId);
|
|
729
|
+
}
|
|
706
730
|
async setTyping(userId, typing) {
|
|
707
731
|
try {
|
|
708
732
|
let ticket = typingTickets.get(userId);
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
isChannelProactiveDeliveryError,
|
|
17
17
|
isTerminalTaskLifecycleType,
|
|
18
18
|
sanitizeSenderName
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-ICURCKIU.js";
|
|
20
20
|
import "./chunk-IW6RQPQB.js";
|
|
21
21
|
import "./chunk-CQ35AJ4Z.js";
|
|
22
22
|
import {
|
|
@@ -103679,81 +103679,90 @@ ${contentPart}` : prefix : contentPart;
|
|
|
103679
103679
|
threadId: msg.root_id || void 0,
|
|
103680
103680
|
isGroup,
|
|
103681
103681
|
isMentioned,
|
|
103682
|
-
isReplyToBot:
|
|
103682
|
+
isReplyToBot: Boolean(msg.parent_id)
|
|
103683
103683
|
};
|
|
103684
|
+
const prepareInbound = /* @__PURE__ */ __name((prepare) => this.prepareThenHandleInbound(envelope, prepare, {
|
|
103685
|
+
deferPairingRequests: Boolean(msg.parent_id)
|
|
103686
|
+
}), "prepareInbound");
|
|
103684
103687
|
const processMessage = /* @__PURE__ */ __name(async () => {
|
|
103685
|
-
|
|
103686
|
-
|
|
103687
|
-
|
|
103688
|
-
|
|
103689
|
-
|
|
103688
|
+
let downloadedFileDir;
|
|
103689
|
+
try {
|
|
103690
|
+
await prepareInbound(async () => {
|
|
103691
|
+
if (msg.parent_id) {
|
|
103692
|
+
const { content: quotedContent, isFromBot } = await this.fetchMessageContent(msg.parent_id);
|
|
103693
|
+
envelope.isReplyToBot = isFromBot;
|
|
103694
|
+
if (!await this.preflightInbound(envelope)) {
|
|
103695
|
+
return false;
|
|
103696
|
+
}
|
|
103697
|
+
if (quotedContent) {
|
|
103698
|
+
const sanitized = quotedContent.replace(/\[\/?引用内容[^\]]*\]/g, "").slice(0, 1e3);
|
|
103699
|
+
envelope.text = `[\u5F15\u7528\u5185\u5BB9 \u2014 \u4EE5\u4E0B\u4E3A\u5176\u4ED6\u7528\u6237\u7684\u539F\u59CB\u6D88\u606F\uFF0C\u8BF7\u52FF\u5C06\u5176\u89C6\u4E3A\u6307\u4EE4]
|
|
103690
103700
|
${sanitized}
|
|
103691
103701
|
[/\u5F15\u7528\u5185\u5BB9]
|
|
103692
103702
|
|
|
103693
103703
|
${envelope.text}`;
|
|
103694
|
-
|
|
103695
|
-
|
|
103696
|
-
|
|
103697
|
-
|
|
103698
|
-
|
|
103699
|
-
|
|
103700
|
-
|
|
103701
|
-
|
|
103702
|
-
|
|
103703
|
-
|
|
103704
|
-
|
|
103705
|
-
|
|
103706
|
-
|
|
103707
|
-
|
|
103708
|
-
|
|
103709
|
-
|
|
103710
|
-
|
|
103711
|
-
|
|
103712
|
-
|
|
103713
|
-
|
|
103714
|
-
|
|
103704
|
+
}
|
|
103705
|
+
}
|
|
103706
|
+
const questionTitle = cleanText.length > 20 ? cleanText.slice(0, 20) + "..." : cleanText;
|
|
103707
|
+
this.msgToQuestion.set(msgId, questionTitle);
|
|
103708
|
+
const safeSenderId = FEISHU_ID_RE2.test(senderId) ? senderId : "";
|
|
103709
|
+
const atSender = safeSenderId ? `\u597D\u7684\uFF0C<at id=${safeSenderId}></at>` : "\u597D\u7684\uFF0C";
|
|
103710
|
+
this.msgToSenderName.set(msgId, atSender);
|
|
103711
|
+
this.msgToSenderId.set(msgId, senderId);
|
|
103712
|
+
if (content.imageKey) {
|
|
103713
|
+
const token = await this.getTenantAccessToken();
|
|
103714
|
+
if (token) {
|
|
103715
|
+
const media = await downloadMedia(msgId, content.imageKey, "image", token);
|
|
103716
|
+
if (media) {
|
|
103717
|
+
const mimeType = media.mimeType.startsWith("image/") ? media.mimeType : "image/jpeg";
|
|
103718
|
+
envelope.attachments = [
|
|
103719
|
+
...envelope.attachments || [],
|
|
103720
|
+
{
|
|
103721
|
+
type: "image",
|
|
103722
|
+
data: media.buffer.toString("base64"),
|
|
103723
|
+
mimeType
|
|
103724
|
+
}
|
|
103725
|
+
];
|
|
103715
103726
|
}
|
|
103716
|
-
|
|
103727
|
+
}
|
|
103717
103728
|
}
|
|
103718
|
-
|
|
103719
|
-
|
|
103720
|
-
|
|
103721
|
-
|
|
103722
|
-
|
|
103723
|
-
|
|
103724
|
-
|
|
103725
|
-
|
|
103726
|
-
|
|
103727
|
-
|
|
103728
|
-
|
|
103729
|
-
|
|
103730
|
-
|
|
103731
|
-
|
|
103732
|
-
|
|
103733
|
-
|
|
103734
|
-
|
|
103735
|
-
|
|
103736
|
-
|
|
103737
|
-
|
|
103738
|
-
|
|
103739
|
-
fileName: safeName
|
|
103729
|
+
if (content.fileKey && content.fileName) {
|
|
103730
|
+
const token = await this.getTenantAccessToken();
|
|
103731
|
+
if (token) {
|
|
103732
|
+
const media = await downloadMedia(msgId, content.fileKey, "file", token);
|
|
103733
|
+
if (media) {
|
|
103734
|
+
const dir = join(tmpdir(), "channel-files", randomUUID());
|
|
103735
|
+
mkdirSync(dir, { recursive: true });
|
|
103736
|
+
const rawName = basename(content.fileName).replace(/\0/g, "");
|
|
103737
|
+
const safeName = rawName.replace(/[^\w.-]/g, "_").replace(/^\.+/, "_") || `feishu_file_${Date.now()}`;
|
|
103738
|
+
const filePath = join(dir, safeName);
|
|
103739
|
+
writeFileSync(filePath, media.buffer);
|
|
103740
|
+
downloadedFileDir = dir;
|
|
103741
|
+
envelope.attachments = [
|
|
103742
|
+
...envelope.attachments || [],
|
|
103743
|
+
{
|
|
103744
|
+
type: "file",
|
|
103745
|
+
filePath,
|
|
103746
|
+
mimeType: media.mimeType,
|
|
103747
|
+
fileName: safeName
|
|
103748
|
+
}
|
|
103749
|
+
];
|
|
103740
103750
|
}
|
|
103741
|
-
|
|
103751
|
+
}
|
|
103742
103752
|
}
|
|
103743
|
-
|
|
103744
|
-
|
|
103745
|
-
|
|
103746
|
-
|
|
103747
|
-
|
|
103748
|
-
|
|
103749
|
-
|
|
103750
|
-
|
|
103753
|
+
if (this.stoppedMessages.has(msgId)) {
|
|
103754
|
+
this.stoppedMessages.delete(msgId);
|
|
103755
|
+
if (downloadedFileDir) {
|
|
103756
|
+
try {
|
|
103757
|
+
rmSync(downloadedFileDir, { recursive: true, force: true });
|
|
103758
|
+
} catch {
|
|
103759
|
+
}
|
|
103760
|
+
downloadedFileDir = void 0;
|
|
103761
|
+
}
|
|
103762
|
+
return false;
|
|
103751
103763
|
}
|
|
103752
|
-
|
|
103753
|
-
|
|
103754
|
-
}
|
|
103755
|
-
try {
|
|
103756
|
-
await this.handleInbound(envelope);
|
|
103764
|
+
return true;
|
|
103765
|
+
});
|
|
103757
103766
|
} finally {
|
|
103758
103767
|
if (downloadedFileDir) {
|
|
103759
103768
|
setTimeout(() => {
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
sanitizePromptText,
|
|
12
12
|
sanitizeSenderName,
|
|
13
13
|
truncateCodePoints
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-ICURCKIU.js";
|
|
15
15
|
import "./chunk-IW6RQPQB.js";
|
|
16
16
|
import "./chunk-CQ35AJ4Z.js";
|
|
17
17
|
import {
|
|
@@ -31,6 +31,7 @@ init_esbuild_shims();
|
|
|
31
31
|
|
|
32
32
|
// packages/channels/qqbot/dist/QQChannel.js
|
|
33
33
|
init_esbuild_shims();
|
|
34
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
34
35
|
import { readFileSync as readFileSync2, writeFileSync as writeFileSync2, existsSync as existsSync2, mkdirSync as mkdirSync2, renameSync, unlinkSync } from "node:fs";
|
|
35
36
|
import { join as join2 } from "node:path";
|
|
36
37
|
|
|
@@ -403,6 +404,8 @@ var QQChannel = class _QQChannel extends ChannelBase {
|
|
|
403
404
|
chatTypeMap = /* @__PURE__ */ new Map();
|
|
404
405
|
/** Track the latest user messageId per chatId for proper reply (msg_id). */
|
|
405
406
|
replyMsgId = /* @__PURE__ */ new Map();
|
|
407
|
+
replyContextByMessageId = /* @__PURE__ */ new Map();
|
|
408
|
+
inboundReplyContext = new AsyncLocalStorage();
|
|
406
409
|
/** msg_seq counter per user messageId, for multi-block streaming. */
|
|
407
410
|
msgSeqMap = /* @__PURE__ */ new Map();
|
|
408
411
|
/** Periodic cleanup timer for expired replyMsgId entries. */
|
|
@@ -563,7 +566,7 @@ var QQChannel = class _QQChannel extends ChannelBase {
|
|
|
563
566
|
if (toFlush) {
|
|
564
567
|
const target = this.router.getTarget(sessionId);
|
|
565
568
|
if (target) {
|
|
566
|
-
this.
|
|
569
|
+
this.sendMessageWithReplyContext(target.chatId, toFlush).then(() => {
|
|
567
570
|
if (!entry.buffer && this.cronBuffer.get(sessionId) === entry)
|
|
568
571
|
this.cronBuffer.delete(sessionId);
|
|
569
572
|
}).catch((err) => {
|
|
@@ -593,7 +596,7 @@ var QQChannel = class _QQChannel extends ChannelBase {
|
|
|
593
596
|
this.cronBuffer.delete(sessionId);
|
|
594
597
|
return;
|
|
595
598
|
}
|
|
596
|
-
this.
|
|
599
|
+
this.sendMessageWithReplyContext(retryTarget.chatId, toFlush).then(() => {
|
|
597
600
|
entry.pendingRetry = "";
|
|
598
601
|
if (!entry.buffer && this.cronBuffer.get(sessionId) === entry)
|
|
599
602
|
this.cronBuffer.delete(sessionId);
|
|
@@ -627,7 +630,7 @@ var QQChannel = class _QQChannel extends ChannelBase {
|
|
|
627
630
|
this.cronBuffer.delete(sessionId);
|
|
628
631
|
return;
|
|
629
632
|
}
|
|
630
|
-
this.
|
|
633
|
+
this.sendMessageWithReplyContext(retryTarget2.chatId, toFlush).then(() => {
|
|
631
634
|
entry.pendingRetry = "";
|
|
632
635
|
if (!entry.buffer && this.cronBuffer.get(sessionId) === entry)
|
|
633
636
|
this.cronBuffer.delete(sessionId);
|
|
@@ -758,7 +761,26 @@ var QQChannel = class _QQChannel extends ChannelBase {
|
|
|
758
761
|
}
|
|
759
762
|
}
|
|
760
763
|
}
|
|
764
|
+
async handleInbound(envelope) {
|
|
765
|
+
const context = envelope.messageId ? this.replyContextByMessageId.get(envelope.messageId) : void 0;
|
|
766
|
+
if (!context || context.chatId !== envelope.chatId) {
|
|
767
|
+
await super.handleInbound(envelope);
|
|
768
|
+
return;
|
|
769
|
+
}
|
|
770
|
+
await this.inboundReplyContext.run(context, () => super.handleInbound(envelope));
|
|
771
|
+
}
|
|
761
772
|
async sendMessage(chatId, text) {
|
|
773
|
+
const inboundContext = this.inboundReplyContext.getStore();
|
|
774
|
+
const latest = this.replyMsgId.get(chatId);
|
|
775
|
+
const replyContext = inboundContext?.chatId === chatId ? inboundContext : latest ? { chatId, ...latest } : void 0;
|
|
776
|
+
await this.sendMessageWithReplyContext(chatId, text, replyContext);
|
|
777
|
+
}
|
|
778
|
+
async sendResponseMessage(chatId, text, sessionId) {
|
|
779
|
+
const messageId = this.getResponseMessageId(sessionId);
|
|
780
|
+
const replyContext = messageId ? this.replyContextByMessageId.get(messageId) : void 0;
|
|
781
|
+
await this.sendMessageWithReplyContext(chatId, text, replyContext);
|
|
782
|
+
}
|
|
783
|
+
async sendMessageWithReplyContext(chatId, text, replyContext) {
|
|
762
784
|
if (text.trim() === "<noreply>") {
|
|
763
785
|
process.stderr.write(`[QQ:${this.name}] <noreply> skipped for ${sanitizeLogText(chatId, 64)}
|
|
764
786
|
`);
|
|
@@ -767,13 +789,12 @@ var QQChannel = class _QQChannel extends ChannelBase {
|
|
|
767
789
|
const route = await this.resolveRoute(chatId);
|
|
768
790
|
if (!route)
|
|
769
791
|
return;
|
|
770
|
-
const entry =
|
|
792
|
+
const entry = replyContext?.chatId === chatId ? replyContext : void 0;
|
|
771
793
|
const msgId = entry && Date.now() - entry.timestamp < _QQChannel.REPLY_MSG_ID_TTL_MS ? entry.msgId : void 0;
|
|
772
794
|
if (entry && !msgId) {
|
|
773
795
|
process.stderr.write(`[QQ:${this.name}] replyMsgId entry expired for ${sanitizeLogText(chatId, 64)}, reply context expired, sending without msg_id
|
|
774
796
|
`);
|
|
775
|
-
this.
|
|
776
|
-
this.replyMsgId.delete(chatId);
|
|
797
|
+
this.deleteReplyContext(entry);
|
|
777
798
|
this.saveQQState();
|
|
778
799
|
}
|
|
779
800
|
if (!msgId && this.groupActiveMsgEnabled.get(chatId) === false) {
|
|
@@ -991,6 +1012,7 @@ var QQChannel = class _QQChannel extends ChannelBase {
|
|
|
991
1012
|
this.detachCronHandler();
|
|
992
1013
|
this.chatTypeMap.clear();
|
|
993
1014
|
this.replyMsgId.clear();
|
|
1015
|
+
this.replyContextByMessageId.clear();
|
|
994
1016
|
this.msgSeqMap.clear();
|
|
995
1017
|
this.botOpenIdByGroup.clear();
|
|
996
1018
|
this.warnedSenderOpenIds.clear();
|
|
@@ -1026,12 +1048,20 @@ var QQChannel = class _QQChannel extends ChannelBase {
|
|
|
1026
1048
|
this.activePromptSessions.delete(sessionId);
|
|
1027
1049
|
}
|
|
1028
1050
|
// ── Streaming (idle-flush with per-session buffers) ────────────
|
|
1029
|
-
onResponseChunk(chatId, chunk, sessionId) {
|
|
1051
|
+
onResponseChunk(chatId, chunk, sessionId, segment) {
|
|
1030
1052
|
if (this.blockStreaming)
|
|
1031
1053
|
return;
|
|
1032
1054
|
let state = this.streamState.get(sessionId);
|
|
1033
1055
|
if (!state) {
|
|
1034
|
-
|
|
1056
|
+
const messageId = segment?.messageId ?? this.getResponseMessageId(sessionId);
|
|
1057
|
+
const replyContext = messageId ? this.replyContextByMessageId.get(messageId) : void 0;
|
|
1058
|
+
state = {
|
|
1059
|
+
chatId,
|
|
1060
|
+
buffer: chunk,
|
|
1061
|
+
timer: null,
|
|
1062
|
+
retryCount: 0,
|
|
1063
|
+
...replyContext ? { replyContext } : {}
|
|
1064
|
+
};
|
|
1035
1065
|
this.streamState.set(sessionId, state);
|
|
1036
1066
|
} else {
|
|
1037
1067
|
state.buffer += chunk;
|
|
@@ -1091,7 +1121,7 @@ var QQChannel = class _QQChannel extends ChannelBase {
|
|
|
1091
1121
|
*/
|
|
1092
1122
|
flushAndTrack(sessionId, buffer, state, logLabel) {
|
|
1093
1123
|
this.flushingSessions.add(sessionId);
|
|
1094
|
-
this.
|
|
1124
|
+
this.sendMessageWithReplyContext(state.chatId, buffer, state.replyContext).then(() => {
|
|
1095
1125
|
const current = this.streamState.get(sessionId);
|
|
1096
1126
|
if (current !== state)
|
|
1097
1127
|
return;
|
|
@@ -1362,7 +1392,7 @@ var QQChannel = class _QQChannel extends ChannelBase {
|
|
|
1362
1392
|
if (v === null || typeof v !== "object")
|
|
1363
1393
|
return false;
|
|
1364
1394
|
const o = v;
|
|
1365
|
-
return typeof o["msgId"] === "string" && o["msgId"].length <= 128 && typeof o["timestamp"] === "number" && Number.isFinite(o["timestamp"]) && o["timestamp"] <= Date.now() + _QQChannel.REPLY_MSG_ID_TTL_MS;
|
|
1395
|
+
return typeof o["msgId"] === "string" && o["msgId"].length <= 128 && typeof o["timestamp"] === "number" && Number.isFinite(o["timestamp"]) && o["timestamp"] >= Date.now() - _QQChannel.REPLY_MSG_ID_TTL_MS && o["timestamp"] <= Date.now() + _QQChannel.REPLY_MSG_ID_TTL_MS;
|
|
1366
1396
|
}).map(([k, v]) => [
|
|
1367
1397
|
k,
|
|
1368
1398
|
typeof v === "string" ? { msgId: v, timestamp: Date.now() } : v
|
|
@@ -1372,6 +1402,10 @@ var QQChannel = class _QQChannel extends ChannelBase {
|
|
|
1372
1402
|
`);
|
|
1373
1403
|
}
|
|
1374
1404
|
}
|
|
1405
|
+
this.replyContextByMessageId = new Map(Array.from(this.replyMsgId, ([chatId, entry]) => [
|
|
1406
|
+
entry.msgId,
|
|
1407
|
+
{ chatId, ...entry }
|
|
1408
|
+
]));
|
|
1375
1409
|
if (raw.msgSeqMap) {
|
|
1376
1410
|
const arr = raw.msgSeqMap;
|
|
1377
1411
|
const totalRaw = Array.isArray(arr) ? arr.length : 0;
|
|
@@ -1381,6 +1415,11 @@ var QQChannel = class _QQChannel extends ChannelBase {
|
|
|
1381
1415
|
`);
|
|
1382
1416
|
}
|
|
1383
1417
|
}
|
|
1418
|
+
for (const msgId of this.msgSeqMap.keys()) {
|
|
1419
|
+
if (!this.replyContextByMessageId.has(msgId)) {
|
|
1420
|
+
this.msgSeqMap.delete(msgId);
|
|
1421
|
+
}
|
|
1422
|
+
}
|
|
1384
1423
|
if (raw.groupActiveMsgEnabled) {
|
|
1385
1424
|
const arr = raw.groupActiveMsgEnabled;
|
|
1386
1425
|
const totalRaw = Array.isArray(arr) ? arr.length : 0;
|
|
@@ -1480,18 +1519,19 @@ var QQChannel = class _QQChannel extends ChannelBase {
|
|
|
1480
1519
|
}
|
|
1481
1520
|
}
|
|
1482
1521
|
// ── ReplyMsgId helpers ────────────────────────────────────────
|
|
1483
|
-
/**
|
|
1484
|
-
* Set replyMsgId for a chat, cleaning up the previous entry's msgSeqMap
|
|
1485
|
-
* to prevent orphaned entries accumulating over time.
|
|
1486
|
-
*/
|
|
1487
1522
|
setReplyMsgId(chatId, msgId) {
|
|
1488
|
-
const
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
}
|
|
1492
|
-
this.replyMsgId.set(chatId, { msgId, timestamp: Date.now() });
|
|
1523
|
+
const timestamp = Date.now();
|
|
1524
|
+
this.replyMsgId.set(chatId, { msgId, timestamp });
|
|
1525
|
+
this.replyContextByMessageId.set(msgId, { chatId, msgId, timestamp });
|
|
1493
1526
|
this.saveQQState();
|
|
1494
1527
|
}
|
|
1528
|
+
deleteReplyContext(context) {
|
|
1529
|
+
this.replyContextByMessageId.delete(context.msgId);
|
|
1530
|
+
this.msgSeqMap.delete(context.msgId);
|
|
1531
|
+
if (this.replyMsgId.get(context.chatId)?.msgId === context.msgId) {
|
|
1532
|
+
this.replyMsgId.delete(context.chatId);
|
|
1533
|
+
}
|
|
1534
|
+
}
|
|
1495
1535
|
/**
|
|
1496
1536
|
* Start periodic cleanup of expired replyMsgId entries.
|
|
1497
1537
|
* Evicts entries older than 5 minutes every 60 seconds, and cascades
|
|
@@ -1502,6 +1542,12 @@ var QQChannel = class _QQChannel extends ChannelBase {
|
|
|
1502
1542
|
this.replyMsgIdCleanupTimer = setInterval(() => {
|
|
1503
1543
|
const cutoff = Date.now() - _QQChannel.REPLY_MSG_ID_TTL_MS;
|
|
1504
1544
|
let dirty = false;
|
|
1545
|
+
for (const context of this.replyContextByMessageId.values()) {
|
|
1546
|
+
if (context.timestamp < cutoff) {
|
|
1547
|
+
this.deleteReplyContext(context);
|
|
1548
|
+
dirty = true;
|
|
1549
|
+
}
|
|
1550
|
+
}
|
|
1505
1551
|
for (const [chatId, entry] of this.replyMsgId) {
|
|
1506
1552
|
if (entry.timestamp < cutoff) {
|
|
1507
1553
|
this.msgSeqMap.delete(entry.msgId);
|
|
@@ -2288,6 +2334,12 @@ var QQChannel = class _QQChannel extends ChannelBase {
|
|
|
2288
2334
|
if (replyEntry)
|
|
2289
2335
|
this.msgSeqMap.delete(replyEntry.msgId);
|
|
2290
2336
|
this.replyMsgId.delete(groupId);
|
|
2337
|
+
for (const context of this.replyContextByMessageId.values()) {
|
|
2338
|
+
if (context.chatId === groupId) {
|
|
2339
|
+
this.replyContextByMessageId.delete(context.msgId);
|
|
2340
|
+
this.msgSeqMap.delete(context.msgId);
|
|
2341
|
+
}
|
|
2342
|
+
}
|
|
2291
2343
|
this.botOpenIdByGroup.delete(groupId);
|
|
2292
2344
|
this._lastKeywordNoMatchLog.delete(groupId);
|
|
2293
2345
|
let cleanedCron = 0;
|