@qwen-code/qwen-code 0.21.7 → 0.21.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/bundled/qc-helper/docs/configuration/settings.md +43 -30
- package/bundled/qc-helper/docs/features/channels/dingtalk.md +40 -2
- package/bundled/qc-helper/docs/features/channels/feishu.md +13 -2
- package/bundled/qc-helper/docs/features/channels/github.md +13 -11
- package/bundled/qc-helper/docs/features/channels/gitlab.md +13 -11
- package/bundled/qc-helper/docs/features/channels/overview.md +49 -31
- package/bundled/qc-helper/docs/features/channels/plugins.md +2 -2
- package/bundled/qc-helper/docs/features/channels/qqbot.md +4 -2
- package/bundled/qc-helper/docs/features/channels/telegram.md +4 -2
- package/bundled/qc-helper/docs/features/channels/wecom.md +1 -1
- package/bundled/qc-helper/docs/features/code-review.md +4 -0
- package/bundled/qc-helper/docs/features/commands.md +1 -1
- package/bundled/qc-helper/docs/features/hooks.md +52 -0
- package/bundled/qc-helper/docs/integration-jetbrains.md +1 -0
- package/bundled/qc-helper/docs/qwen-serve.md +4 -1
- package/bundled/qc-helper/docs/reference/keyboard-shortcuts.md +50 -36
- package/bundled/review/SKILL.md +28 -5
- package/chunks/{MaxSizedBox-ANWZBPTS.js → MaxSizedBox-7PM6BGJ5.js} +26 -22
- package/chunks/{StandaloneSessionPicker-XKS3VU3A.js → StandaloneSessionPicker-3UQHM7GV.js} +44 -40
- package/chunks/{acp-startup-profiler-ORIQ2CCQ.js → acp-startup-profiler-B5BYAMYQ.js} +2 -2
- package/chunks/{acpAgent-KUAZ3GCZ.js → acpAgent-5UWLFV6V.js} +534 -262
- package/chunks/{agent-T6PTGX5R.js → agent-624T2BLO.js} +26 -22
- package/chunks/{agent-headless-PR7YCB7S.js → agent-headless-2EE5J2KX.js} +26 -22
- package/chunks/{artifact-tool-U4VOZIK5.js → artifact-tool-N652YE4L.js} +1 -1
- package/chunks/{askUserQuestion-XOBQLPFA.js → askUserQuestion-ONW74PKJ.js} +1 -1
- package/chunks/{bridge-NU6YEEHK.js → bridge-JENKGFFP.js} +29 -25
- package/chunks/{ca-NYKNH222.js → ca-ZLKAB4K3.js} +6 -0
- package/chunks/{channel-management-service-FSQ7SHYI.js → channel-management-service-DDWUPHMU.js} +19 -10
- package/chunks/{channel-settings-store-35VQVUVV.js → channel-settings-store-SA6JZSPH.js} +34 -30
- package/chunks/{channel-worker-group-JWQK224X.js → channel-worker-group-E67EN3RV.js} +5 -5
- package/chunks/{channel-worker-manager-77E3OXRQ.js → channel-worker-manager-SW4C45CF.js} +5 -5
- package/chunks/{channel-worker-supervisor-62YWUGP2.js → channel-worker-supervisor-5SRD24FG.js} +3 -3
- package/chunks/{chunk-CJXIIILK.js → chunk-2FRY5CRX.js} +1 -1
- package/chunks/{chunk-ZJ3VGYHK.js → chunk-2ILAOM2I.js} +34 -17
- package/chunks/{chunk-6XJMFJ4D.js → chunk-2M4K4KYS.js} +177 -120
- package/chunks/{chunk-CNIID3TV.js → chunk-2UUMVNYT.js} +1 -1
- package/chunks/{chunk-22NBYCPD.js → chunk-3P2LV43B.js} +1 -1
- package/chunks/{chunk-2U3WZGZG.js → chunk-3PY4LPJF.js} +19 -131
- package/chunks/{chunk-SPMY6CX6.js → chunk-3SE7J4DR.js} +3 -3
- package/chunks/{chunk-6UWFTUQL.js → chunk-3WNQOYHQ.js} +66 -22
- package/chunks/{chunk-KXSDEOFU.js → chunk-4ALIARFY.js} +1 -1
- package/chunks/{chunk-D3UEZIQH.js → chunk-4DU3NCHG.js} +48 -55
- package/chunks/{chunk-BGG4MBYD.js → chunk-4PYCZH2V.js} +4 -187
- package/chunks/{chunk-H2UQ2M5Z.js → chunk-4WU6NY7F.js} +96 -22
- package/chunks/{chunk-TLV2IMHR.js → chunk-5ZGR6RKJ.js} +3 -3
- package/chunks/{chunk-3K7FH2KQ.js → chunk-67N6HB5H.js} +1310 -171
- package/chunks/{chunk-EORNAQDT.js → chunk-6TR7CFXH.js} +1 -1
- package/chunks/{chunk-NG2R4N5O.js → chunk-6ZRFAKXK.js} +1 -1
- package/chunks/{chunk-P2AJ7FTI.js → chunk-757GB46F.js} +1 -1
- package/chunks/{chunk-72LNFGUY.js → chunk-77QVBFCU.js} +3 -3
- package/chunks/{chunk-OH2VKQXH.js → chunk-7DVT4LVV.js} +37 -30
- package/chunks/{chunk-KKJJB5X6.js → chunk-7VUERJHS.js} +1503 -815
- package/chunks/{chunk-VOARQPTA.js → chunk-B52AWKBB.js} +65 -21
- package/chunks/{chunk-Y4EWSQF7.js → chunk-BF224XHL.js} +2 -2
- package/chunks/{chunk-PJOBIWUG.js → chunk-BF52U4XJ.js} +1 -1
- package/chunks/{chunk-55LYDVPU.js → chunk-C5VWPTGT.js} +1 -1
- package/chunks/{chunk-W7U4ESW2.js → chunk-CG3WBKJK.js} +1 -1
- package/chunks/chunk-COBO5EBO.js +135 -0
- package/chunks/chunk-CPG6P4GG.js +82 -0
- package/chunks/{chunk-DIEFUBV6.js → chunk-DIWZNWZT.js} +205 -35
- package/chunks/{chunk-AE77C5ZU.js → chunk-DQSDACD2.js} +1 -1
- package/chunks/{chunk-P3LEG54R.js → chunk-DX5W5AON.js} +2 -2
- package/chunks/{chunk-EUQTXRKZ.js → chunk-E4ZBKMSF.js} +5 -5
- package/chunks/{chunk-FPM27XN4.js → chunk-EIVICVHM.js} +4 -4
- package/chunks/{chunk-YHEEE624.js → chunk-EN2TKTFH.js} +1 -1
- package/chunks/chunk-F6WFNA7U.js +22 -0
- package/chunks/{chunk-FZBZSYKU.js → chunk-FN6YXJOP.js} +1 -1
- package/chunks/{chunk-KR4ZSC7K.js → chunk-FWBXMANW.js} +3 -3
- package/chunks/{chunk-LA7YLSR6.js → chunk-FYAXKJK7.js} +327 -67
- package/chunks/{chunk-CSZEXZBE.js → chunk-GBDINRIL.js} +3 -3
- package/chunks/{chunk-SCI7K3GM.js → chunk-GOEVOFQI.js} +19 -10
- package/chunks/{chunk-LEMXGVEP.js → chunk-GQCEQPYQ.js} +3 -3
- package/chunks/{chunk-Y7E5LNLO.js → chunk-GXSNGY5M.js} +1027 -876
- package/chunks/{chunk-6XU3PH66.js → chunk-HA3SAB64.js} +22 -69
- package/chunks/{chunk-Y4NGLFGJ.js → chunk-HUWENAHO.js} +1 -1
- package/chunks/{chunk-3ULCB3NE.js → chunk-HV76SFIA.js} +1 -1
- package/chunks/{chunk-CB2464BK.js → chunk-HWX5HPUG.js} +14 -4
- package/chunks/{chunk-LZC3B5N2.js → chunk-IA7TGCN2.js} +2 -2
- package/chunks/{chunk-RERATVSK.js → chunk-IBYULW65.js} +6 -6
- package/chunks/{chunk-HYRDKNUY.js → chunk-IUQ52YJK.js} +1 -1
- package/chunks/{chunk-TDXGKHDN.js → chunk-IYES5WOT.js} +2 -2
- package/chunks/{chunk-RGSBTHSU.js → chunk-KAQCJO6Y.js} +131 -4
- package/chunks/{chunk-VWOVHOTT.js → chunk-KJZ26VBX.js} +1 -1
- package/chunks/{chunk-6GONZVLS.js → chunk-KKDVZLGL.js} +1 -1
- package/chunks/{chunk-MKVZE4ZJ.js → chunk-KTJFU7RT.js} +3 -2
- package/chunks/{chunk-R574ATRM.js → chunk-M2PNLYGY.js} +41 -0
- package/chunks/{chunk-6EOI4HOK.js → chunk-M3STHEMM.js} +12 -17
- package/chunks/chunk-NGYI5EF5.js +244 -0
- package/chunks/{chunk-ALGGS7UH.js → chunk-NPQ5ZKRP.js} +82 -1
- package/chunks/{chunk-HQB2KUAN.js → chunk-NPUXXRJI.js} +1 -1
- package/chunks/{chunk-QETYKPMG.js → chunk-NVRDQFCX.js} +1 -1
- package/chunks/{chunk-PQBHU2IA.js → chunk-OHKJVAKG.js} +10 -10
- package/chunks/{chunk-CYR3HI5X.js → chunk-OQTXYMKW.js} +2 -2
- package/chunks/{chunk-DBOFL3LQ.js → chunk-PG62DFWD.js} +10 -10
- package/chunks/{chunk-2VSTGY6M.js → chunk-PJRW65JO.js} +1 -1
- package/chunks/{chunk-33ACCIIY.js → chunk-PLFATELK.js} +1 -1
- package/chunks/{chunk-IC4Z6LX6.js → chunk-PYQADEFD.js} +5 -0
- package/chunks/{chunk-MAJS7AT4.js → chunk-QGHSP65Z.js} +2 -2
- package/chunks/{chunk-OHJLEW5J.js → chunk-QQWD7LZV.js} +4 -4
- package/chunks/{chunk-ZXU5UHMI.js → chunk-QXVSWG66.js} +2 -2
- package/chunks/{chunk-E33LOKRA.js → chunk-RPWVIXDB.js} +18 -1
- package/chunks/{chunk-TYKC75AX.js → chunk-S3Y3GBFD.js} +1 -1
- package/chunks/{chunk-7UFKAV7Y.js → chunk-S6HYI3MF.js} +2 -2
- package/chunks/chunk-SAH4BD2J.js +92 -0
- package/chunks/{chunk-OMKQH5C5.js → chunk-SNRT2TJJ.js} +6 -23
- package/chunks/chunk-SR7RZ4MS.js +202 -0
- package/chunks/{chunk-CXE7E23H.js → chunk-TE3ZAJE7.js} +45 -17
- package/chunks/{chunk-S7CV4KO6.js → chunk-TKSZJ5BV.js} +3 -3
- package/chunks/{chunk-3NB7TSE2.js → chunk-U5SLIG7E.js} +1 -1
- package/chunks/chunk-UA5H3DS2.js +203 -0
- package/chunks/{chunk-24ER7UV4.js → chunk-UFALT4LK.js} +1 -1
- package/chunks/{chunk-YJQCUTT2.js → chunk-VWMUDKLC.js} +3 -3
- package/chunks/{chunk-RMH5OWLD.js → chunk-VXZ5HAOV.js} +1 -1
- package/chunks/{chunk-BVWVWGLE.js → chunk-WAUGQKUU.js} +4 -64
- package/chunks/{chunk-SHZYHGQH.js → chunk-WG6542MA.js} +1 -1
- package/chunks/{chunk-5KH532V7.js → chunk-WV5J6Q6N.js} +1 -1
- package/chunks/{chunk-RNVQB725.js → chunk-XHD7CRP2.js} +2 -2
- package/chunks/{chunk-W4B7UBUS.js → chunk-XZKQT2B2.js} +5 -5
- package/chunks/{chunk-6HVUFDS2.js → chunk-Y4TETC74.js} +22 -13
- package/chunks/{chunk-RZHU3ILK.js → chunk-YEF7XEO2.js} +4 -4
- package/chunks/{chunk-RUL4S3K3.js → chunk-YHJFF7KH.js} +146 -45
- package/chunks/{chunk-23RZCH76.js → chunk-YOM7DEGB.js} +3 -3
- package/chunks/{chunk-OFI7IGST.js → chunk-ZCLLJARV.js} +9 -9
- package/chunks/{chunk-GSS34377.js → chunk-ZHA242R4.js} +2 -2
- package/chunks/{chunk-TRLYP7OF.js → chunk-ZPLALRXZ.js} +17 -9
- package/chunks/{chunk-WUC6ZFXO.js → chunk-ZWBUH5UP.js} +1 -1
- package/chunks/{computer-use-KEAPATUY.js → computer-use-ESQYJ3JY.js} +26 -22
- package/chunks/{config-utils-K7SCOWHD.js → config-utils-XQHBJP7G.js} +4 -4
- package/chunks/{contextCommand-ZJA6A5K5.js → contextCommand-CX3YF4ZE.js} +28 -24
- package/chunks/{core-runtime-QMJPWHCI.js → core-runtime-DIAU7JMG.js} +30 -26
- package/chunks/{create-sub-session-DJE6XICH.js → create-sub-session-HDPD6HOA.js} +26 -22
- package/chunks/{create-sub-session-E4PBYXV5.js → create-sub-session-QIDZUOPU.js} +1 -1
- package/chunks/{cron-create-GRBWYMIJ.js → cron-create-VONA5JYY.js} +1 -1
- package/chunks/{cron-delete-4CMKBR2M.js → cron-delete-5JXSP2MI.js} +1 -1
- package/chunks/{cron-list-W7K4ASOA.js → cron-list-KE4F2CIR.js} +1 -1
- package/chunks/{daemon-SCTQMM7Z.js → daemon-VZBGJUNL.js} +30 -0
- package/chunks/{daemon-status-provider-FSWDPE2G.js → daemon-status-provider-H6O4UQ4F.js} +33 -29
- package/chunks/{daemon-trust-policy-P5L5VFAY.js → daemon-trust-policy-BNUXG6MT.js} +33 -29
- package/chunks/{daemon-trust-policy-monitor-73JYN6ET.js → daemon-trust-policy-monitor-E4EQ7GF4.js} +33 -29
- package/chunks/{de-VL76CPLV.js → de-LIW4XVLN.js} +5 -0
- package/chunks/{deferred-core-runtime-BWRCCFTE.js → deferred-core-runtime-CBMSHPAU.js} +26 -22
- package/chunks/{display-image-O2XFPQTC.js → display-image-NQRSIBXM.js} +2 -2
- package/chunks/{dist-DPPHJAVL.js → dist-EEEQGCZA.js} +918 -142
- package/chunks/{dist-K4WWQBHS.js → dist-HIACTZEK.js} +55 -15
- package/chunks/{dist-3BMEUGTG.js → dist-IRL7WA5Z.js} +1 -1
- package/chunks/{dist-HVBMEYWK.js → dist-KVISB2O2.js} +1 -1
- package/chunks/{dist-KS4O2NKE.js → dist-MBF3I5MX.js} +14 -8
- package/chunks/{dist-SFQ34F4M.js → dist-MKX5OSFF.js} +5 -4
- package/chunks/{dist-7JGAAQSC.js → dist-RCH3I7SS.js} +2 -2
- package/chunks/{dist-C5U4LJKW.js → dist-TUSWNE2I.js} +5 -4
- package/chunks/{earlyInputCapture-L5ST23A6.js → earlyInputCapture-UIOP7OIN.js} +26 -22
- package/chunks/{edit-LHHRFNFK.js → edit-ITMZYFKA.js} +26 -22
- package/chunks/{en-IRJ2WN5T.js → en-SY5GTIGX.js} +6 -0
- package/chunks/{enter-worktree-6NXCRZPF.js → enter-worktree-S4PL5UV6.js} +26 -22
- package/chunks/{enterPlanMode-ZVQT4U7D.js → enterPlanMode-YV52NNJT.js} +26 -22
- package/chunks/{environment-GJ2HWJOS.js → environment-NGOWPRZV.js} +30 -26
- package/chunks/{errors-6RLH3XXC.js → errors-BU26DTDX.js} +28 -24
- package/chunks/{exit-worktree-I2YLUHHY.js → exit-worktree-XRM6LH5F.js} +26 -22
- package/chunks/{exitPlanMode-7CCWKO7I.js → exitPlanMode-ZLI5F7KR.js} +26 -22
- package/chunks/{fast-path-DVFD4HQD.js → fast-path-UJWORIED.js} +23 -3
- package/chunks/{fast-path-settings-WQJU2LAT.js → fast-path-settings-37WQD5B2.js} +6 -3
- package/chunks/{fr-GK3HQYVB.js → fr-RQFO7U4P.js} +5 -0
- package/chunks/{gemini-7FWGOYD4.js → gemini-ZSKNDUMU.js} +77 -65
- package/chunks/{geminiContentGenerator-V2WVLIXU.js → geminiContentGenerator-YGEXOEKD.js} +1 -1
- package/chunks/{glob-3N6GGI75.js → glob-7KZG44BR.js} +26 -22
- package/chunks/{goal-tools-APOW6UXL.js → goal-tools-PXWN5VK3.js} +4 -2
- package/chunks/{grep-V43ILZVX.js → grep-6ZFC7RJ5.js} +26 -22
- package/chunks/{handleAutoUpdate-A5WFVWIA.js → handleAutoUpdate-KSEL3TQS.js} +30 -26
- package/chunks/{i18n-PLVQ4FBZ.js → i18n-ZIUXBW5V.js} +27 -23
- package/chunks/{image-gen-7C6IK6DC.js → image-gen-AUIZJJNK.js} +7 -5
- package/chunks/{initializer-CVAIKZYL.js → initializer-7AHY3N6Q.js} +33 -29
- package/chunks/{installationInfo-J6QDHNTK.js → installationInfo-VGBXMYLY.js} +27 -23
- package/chunks/{ja-3FA46IKD.js → ja-KOZKHJHZ.js} +5 -0
- package/chunks/{list-ZZ4OUUWV.js → list-PSFKQHLB.js} +36 -32
- package/chunks/{list-agents-KFFIIS2G.js → list-agents-Z4WABFDZ.js} +1 -1
- package/chunks/{loadedSettingsAdapter-QRYRJSWL.js → loadedSettingsAdapter-FTMRCTOF.js} +33 -29
- package/chunks/{loggingContentGenerator-OJCO75HM.js → loggingContentGenerator-MZAN52UV.js} +7 -5
- package/chunks/{loop-wakeup-TLMJPMMP.js → loop-wakeup-UZ5RL5Y2.js} +2 -2
- package/chunks/{ls-UVVE2XGE.js → ls-TVHDGIES.js} +1 -1
- package/chunks/{lsp-QMEA2VLB.js → lsp-CVN6OQPI.js} +1 -1
- package/chunks/{managed-npm-update-PCOSCP2N.js → managed-npm-update-O4NHK45X.js} +27 -23
- package/chunks/{mcp-M3WKKWKY.js → mcp-6CFP2AYQ.js} +33 -29
- package/chunks/{monitor-GN24FH6C.js → monitor-DAKD6OU4.js} +26 -22
- package/chunks/{nonInteractiveCli-KPTU3VSQ.js → nonInteractiveCli-RC7VIUZL.js} +66 -60
- package/chunks/{notebook-edit-4YM65BBO.js → notebook-edit-474DPMRL.js} +34 -22
- package/chunks/{openaiContentGenerator-EDQT6GTV.js → openaiContentGenerator-2NFY2MWO.js} +19 -9
- package/chunks/{pidfile-JOIIRN2C.js → pidfile-KBFVDNQP.js} +26 -22
- package/chunks/{process-registry-2CHQBXH5.js → process-registry-PMJOA5CO.js} +15 -0
- package/chunks/{processUtils-5SV4MX3Q.js → processUtils-6GRYH4Y3.js} +2 -2
- package/chunks/{pt-3AOBKPIJ.js → pt-U6AOCTMF.js} +5 -0
- package/chunks/{qwenContentGenerator-ODRJSUGR.js → qwenContentGenerator-KAHU6IZY.js} +33 -28
- package/chunks/{qwenOAuth2-NESCMZ47.js → qwenOAuth2-RRQTCP4W.js} +7 -5
- package/chunks/{read-file-HPSODLPK.js → read-file-3M6WXDXP.js} +6 -4
- package/chunks/{read-mcp-resource-2TNSJTC3.js → read-mcp-resource-PZ4ZF6YL.js} +1 -1
- package/chunks/{record-artifact-RAON52FC.js → record-artifact-P4HFMS7X.js} +2 -2
- package/chunks/{resumeHistoryUtils-TXCOFFMQ.js → resumeHistoryUtils-D6TAY3HX.js} +30 -26
- package/chunks/{ripGrep-ZKQGTQAO.js → ripGrep-PLPENT3E.js} +26 -22
- package/chunks/{ru-VJRAMC4W.js → ru-CMX4UMYP.js} +5 -0
- package/chunks/{run-qwen-serve-ZPKPKECF.js → run-qwen-serve-ZAFIJKJC.js} +168 -54
- package/chunks/{runtime-2FLNNM36.js → runtime-ZED7CYOZ.js} +38 -34
- package/chunks/{scheduler-365PJHNR.js → scheduler-MD3AL2W5.js} +26 -22
- package/chunks/{send-message-ZM7MRUGP.js → send-message-CAMSLG2L.js} +4 -3
- package/chunks/{serve-QD2RNLKJ.js → serve-E3VUDRZN.js} +33 -29
- package/chunks/{server-XLJVLTYM.js → server-OWMEMAKR.js} +450 -231
- package/chunks/{session-3VTUHH4Q.js → session-HZ57QK7K.js} +158 -97
- package/chunks/{settings-KULVPCQC.js → settings-V7BR3RKP.js} +32 -28
- package/chunks/{shell-3SWW22MH.js → shell-23OMNMW6.js} +26 -22
- package/chunks/{skill-KDHWYS7W.js → skill-6HBDYZRS.js} +7 -5
- package/chunks/{skill-settings-NMY4JEJC.js → skill-settings-HWJLTU7M.js} +32 -28
- package/chunks/{spawnChannel-ZKS4Q5OU.js → spawnChannel-N6KKUW5B.js} +27 -23
- package/chunks/{standalone-update-7CXPGAQ4.js → standalone-update-QGIKHATD.js} +28 -24
- package/chunks/{startInteractiveUI-2QQLEKM6.js → startInteractiveUI-GX2CRL42.js} +365 -155
- package/chunks/{syntheticOutput-ZLCUTKO2.js → syntheticOutput-PEBJQYJV.js} +2 -2
- package/chunks/{task-create-CQP5UEA3.js → task-create-5NWCQSJF.js} +5 -4
- package/chunks/{task-list-XLEZOJXP.js → task-list-53265TRZ.js} +1 -1
- package/chunks/{task-stop-7ZQM5CFF.js → task-stop-FPCOIRYX.js} +1 -1
- package/chunks/{task-update-JA75U2SN.js → task-update-5HN577LS.js} +5 -4
- package/chunks/{team-create-2WTNGAOX.js → team-create-CFFKU7KL.js} +26 -22
- package/chunks/{team-delete-MHY3UZGY.js → team-delete-MMQB4OSC.js} +1 -1
- package/chunks/{team-plan-approval-LZTYLEG4.js → team-plan-approval-6EFOKR6A.js} +26 -22
- package/chunks/{terminal-image-renderer-R5HHAFJN.js → terminal-image-renderer-TLDNACQY.js} +28 -24
- package/chunks/{theme-manager-PAUCSJFF.js → theme-manager-5LJ3H7VO.js} +26 -22
- package/chunks/{todoWrite-UPVOHYGD.js → todoWrite-JGV6VLOX.js} +1 -1
- package/chunks/{tool-search-2BFCGLI6.js → tool-search-UJV3A24H.js} +9 -6
- package/chunks/{total-session-admission-MK4SINFK.js → total-session-admission-D63QYXGO.js} +29 -25
- package/chunks/{trustedFolders-TJ5S26N7.js → trustedFolders-KZCOB53W.js} +30 -24
- package/chunks/{update-relaunch-N7AYLARF.js → update-relaunch-IFILM3SA.js} +5 -5
- package/chunks/{updateCheck-QRZ3DVT5.js → updateCheck-YZ2CRCFC.js} +29 -25
- package/chunks/{useAutoAcceptIndicator-DBJ7Y5AF.js → useAutoAcceptIndicator-AXEVNA3Q.js} +35 -31
- package/chunks/{validateNonInterActiveAuth-6ZQWUDS3.js → validateNonInterActiveAuth-3WTOJFWA.js} +61 -57
- package/chunks/{version-AJQGQWXC.js → version-GXK7OHZY.js} +1 -1
- package/chunks/{web-fetch-QWJYRXFL.js → web-fetch-ILB4GAVR.js} +12 -8
- package/chunks/{web-search-2AOXJGHU.js → web-search-HKRPGPZZ.js} +8 -6
- package/chunks/{workflow-ERH3SJG2.js → workflow-FXIPRQQA.js} +750 -147
- package/chunks/{workspace-providers-status-HZ474RA4.js → workspace-providers-status-NYHC7HSR.js} +35 -31
- package/chunks/{workspace-registration-store-6EUP4JXG.js → workspace-registration-store-AKEB7OMW.js} +1 -1
- package/chunks/{workspace-registry-R4APRRNC.js → workspace-registry-CDAS5TVZ.js} +29 -25
- package/chunks/{workspace-service-HFIFDMU7.js → workspace-service-PAMUKMAV.js} +36 -32
- package/chunks/{workspace-skills-status-HAHEIHGK.js → workspace-skills-status-YQSHCCMS.js} +33 -29
- package/chunks/{workspace-trust-reconciler-65GTAGDK.js → workspace-trust-reconciler-RPTXOIY2.js} +36 -32
- package/chunks/{write-file-B34CDELV.js → write-file-CGS57TS4.js} +26 -22
- package/chunks/{zh-ARWDLDLR.js → zh-AGL2FVBI.js} +6 -0
- package/chunks/{zh-TW-Y4RGI3P7.js → zh-TW-KI66MHQY.js} +6 -0
- package/chunks/{zoom-image-HPRBZHSS.js → zoom-image-E7D72GYV.js} +6 -4
- package/cli.js +13 -13
- package/locales/ca.js +10 -0
- package/locales/de.js +9 -0
- package/locales/en.js +10 -0
- package/locales/fr.js +9 -0
- package/locales/ja.js +9 -0
- package/locales/pt.js +9 -0
- package/locales/ru.js +9 -0
- package/locales/zh-TW.js +10 -0
- package/locales/zh.js +10 -0
- package/package.json +3 -3
- package/web-shell/assets/{arc-Ip-FFDJ0.js → arc-DybZaz32.js} +1 -1
- package/web-shell/assets/{architectureDiagram-3BPJPVTR-CChqgwIb.js → architectureDiagram-3BPJPVTR-jN3qBd19.js} +1 -1
- package/web-shell/assets/{blockDiagram-GPEHLZMM-BHN-Tfss.js → blockDiagram-GPEHLZMM-Ct5DZPrj.js} +1 -1
- package/web-shell/assets/{c4Diagram-AAUBKEIU-BhyjzDjN.js → c4Diagram-AAUBKEIU-CUAFMlUG.js} +1 -1
- package/web-shell/assets/channel-BMwLrwLW.js +1 -0
- package/web-shell/assets/{chunk-2J33WTMH-BB9eyHrx.js → chunk-2J33WTMH-CuV8n90B.js} +1 -1
- package/web-shell/assets/{chunk-4BX2VUAB-BeV7ce_J.js → chunk-4BX2VUAB-BUzl_kls.js} +1 -1
- package/web-shell/assets/{chunk-55IACEB6-DO7kXDiV.js → chunk-55IACEB6-BnDBLX6A.js} +1 -1
- package/web-shell/assets/{chunk-727SXJPM-B27MPznD.js → chunk-727SXJPM-B83uTOjm.js} +1 -1
- package/web-shell/assets/{chunk-AQP2D5EJ-DHIjqjD_.js → chunk-AQP2D5EJ-DM3HLgpT.js} +1 -1
- package/web-shell/assets/{chunk-FMBD7UC4-DabMqyN2.js → chunk-FMBD7UC4-CSQ5hgyb.js} +1 -1
- package/web-shell/assets/{chunk-ND2GUHAM-Dw7Nnnxc.js → chunk-ND2GUHAM-BWOF4SxX.js} +1 -1
- package/web-shell/assets/{chunk-QZHKN3VN-DdaZew1Q.js → chunk-QZHKN3VN-BsOH9LMi.js} +1 -1
- package/web-shell/assets/classDiagram-4FO5ZUOK-BGDv98jY.js +1 -0
- package/web-shell/assets/classDiagram-v2-Q7XG4LA2-BGDv98jY.js +1 -0
- package/web-shell/assets/{cose-bilkent-S5V4N54A-CgBpCYH5.js → cose-bilkent-S5V4N54A-IENqH2iJ.js} +1 -1
- package/web-shell/assets/{dagre-BM42HDAG-BB4IU8G0.js → dagre-BM42HDAG--dyzDTGo.js} +1 -1
- package/web-shell/assets/{diagram-2AECGRRQ-BcUTHU37.js → diagram-2AECGRRQ-BE7Dcqof.js} +1 -1
- package/web-shell/assets/{diagram-5GNKFQAL-B6Lyihyv.js → diagram-5GNKFQAL-Cr8-5OTj.js} +1 -1
- package/web-shell/assets/{diagram-KO2AKTUF-CRIJOjpG.js → diagram-KO2AKTUF-Bzey3uAY.js} +1 -1
- package/web-shell/assets/{diagram-LMA3HP47-DdNiwWWT.js → diagram-LMA3HP47-sErl28Xb.js} +1 -1
- package/web-shell/assets/{diagram-OG6HWLK6-Dz4b32Do.js → diagram-OG6HWLK6-Dq30ATIo.js} +1 -1
- package/web-shell/assets/{erDiagram-TEJ5UH35-D-8NGw77.js → erDiagram-TEJ5UH35-BkCoEfVW.js} +1 -1
- package/web-shell/assets/{flowDiagram-I6XJVG4X-Dun26LyM.js → flowDiagram-I6XJVG4X-DHwO0rrI.js} +1 -1
- package/web-shell/assets/{ganttDiagram-6RSMTGT7-F10Hu1Gc.js → ganttDiagram-6RSMTGT7-s7vAPxWq.js} +1 -1
- package/web-shell/assets/{gitGraphDiagram-PVQCEYII-Bf8Ez6-D.js → gitGraphDiagram-PVQCEYII-CQxhwPOU.js} +1 -1
- package/web-shell/assets/index-Bckpjr-I.css +5 -0
- package/web-shell/assets/{index-BXqw-nGq.js → index-CF4wApWp.js} +1 -1
- package/web-shell/assets/index-DwEr9HEW.js +1768 -0
- package/web-shell/assets/{infoDiagram-5YYISTIA-DVgTMLvj.js → infoDiagram-5YYISTIA-BnFrD0bq.js} +1 -1
- package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-uT-KepvK.js → ishikawaDiagram-YF4QCWOH-Bf9zK5NK.js} +1 -1
- package/web-shell/assets/{journeyDiagram-JHISSGLW-Vg_XadQf.js → journeyDiagram-JHISSGLW-CyGAhsxi.js} +1 -1
- package/web-shell/assets/{kanban-definition-UN3LZRKU-Dyv1ESBE.js → kanban-definition-UN3LZRKU-CbsK5akB.js} +1 -1
- package/web-shell/assets/{linear-BMIepYX3.js → linear-cQsF4P8D.js} +1 -1
- package/web-shell/assets/{mermaid.core-zA8pJ9ag.js → mermaid.core-Z4HVqrKY.js} +5 -5
- package/web-shell/assets/{mindmap-definition-RKZ34NQL-BCW_BZ_5.js → mindmap-definition-RKZ34NQL-CYnrBo_f.js} +1 -1
- package/web-shell/assets/{pieDiagram-4H26LBE5-DseNEGp2.js → pieDiagram-4H26LBE5-CBzOfhrs.js} +1 -1
- package/web-shell/assets/{quadrantDiagram-W4KKPZXB-6Z7wr1Fi.js → quadrantDiagram-W4KKPZXB-D4LK1Ebn.js} +1 -1
- package/web-shell/assets/{requirementDiagram-4Y6WPE33-CVOlCRPf.js → requirementDiagram-4Y6WPE33-Bzti2Lcj.js} +1 -1
- package/web-shell/assets/{sankeyDiagram-5OEKKPKP-CGhgrUJZ.js → sankeyDiagram-5OEKKPKP-yTBw5Z2s.js} +1 -1
- package/web-shell/assets/{sequenceDiagram-3UESZ5HK-dlqmpLuQ.js → sequenceDiagram-3UESZ5HK-D07UVRiZ.js} +1 -1
- package/web-shell/assets/{stateDiagram-AJRCARHV-B9EW10Xb.js → stateDiagram-AJRCARHV-UE_lHsTn.js} +1 -1
- package/web-shell/assets/stateDiagram-v2-BHNVJYJU-DC6xgXjX.js +1 -0
- package/web-shell/assets/{timeline-definition-PNZ67QCA-BBRh0mgZ.js → timeline-definition-PNZ67QCA-DRvYdiTs.js} +1 -1
- package/web-shell/assets/{vennDiagram-CIIHVFJN-B8Gs-REP.js → vennDiagram-CIIHVFJN-CQLIXs0u.js} +1 -1
- package/web-shell/assets/{wardley-L42UT6IY-D_y80Ur7.js → wardley-L42UT6IY-JZz_Xqse.js} +1 -1
- package/web-shell/assets/{wardleyDiagram-YWT4CUSO-D-CNfHJ-.js → wardleyDiagram-YWT4CUSO--i7BiJwB.js} +1 -1
- package/web-shell/assets/{xychartDiagram-2RQKCTM6-DQ5CvELo.js → xychartDiagram-2RQKCTM6-Bkc-bW0S.js} +1 -1
- package/web-shell/index.html +2 -2
- package/chunks/chunk-6PEXNQTX.js +0 -68
- package/chunks/chunk-IUFV6FYU.js +0 -81
- package/web-shell/assets/channel-Cu8qd6OB.js +0 -1
- package/web-shell/assets/classDiagram-4FO5ZUOK-BI3KrXhq.js +0 -1
- package/web-shell/assets/classDiagram-v2-Q7XG4LA2-BI3KrXhq.js +0 -1
- package/web-shell/assets/index-QQlUCJGg.css +0 -5
- package/web-shell/assets/index-hcgjV7vS.js +0 -1768
- package/web-shell/assets/stateDiagram-v2-BHNVJYJU-CJTZJJ5X.js +0 -1
- package/chunks/{anthropicContentGenerator-DTMVEL5M.js → anthropicContentGenerator-SSFE2753.js} +9 -9
|
@@ -71,6 +71,7 @@ var PairingStore = class {
|
|
|
71
71
|
dir;
|
|
72
72
|
pendingPath;
|
|
73
73
|
allowlistPath;
|
|
74
|
+
groupAllowlistPath;
|
|
74
75
|
migratedSentinelPath;
|
|
75
76
|
/**
|
|
76
77
|
* @param channelName Channel name the state is keyed by.
|
|
@@ -88,6 +89,7 @@ var PairingStore = class {
|
|
|
88
89
|
const safeChannelName = encodeURIComponent(channelName);
|
|
89
90
|
this.pendingPath = path2.join(this.dir, `${safeChannelName}-pairing.json`);
|
|
90
91
|
this.allowlistPath = path2.join(this.dir, `${safeChannelName}-allowlist.json`);
|
|
92
|
+
this.groupAllowlistPath = path2.join(this.dir, `${safeChannelName}-groups.json`);
|
|
91
93
|
this.migratedSentinelPath = path2.join(this.dir, `${safeChannelName}.migrated`);
|
|
92
94
|
if (workspaceCwd) {
|
|
93
95
|
this.migrateLegacyState(channelsRoot, channelName);
|
|
@@ -131,6 +133,10 @@ var PairingStore = class {
|
|
|
131
133
|
[
|
|
132
134
|
path2.join(channelsRoot, `${channelName}-allowlist.json`),
|
|
133
135
|
this.allowlistPath
|
|
136
|
+
],
|
|
137
|
+
[
|
|
138
|
+
path2.join(channelsRoot, `${channelName}-groups.json`),
|
|
139
|
+
this.groupAllowlistPath
|
|
134
140
|
]
|
|
135
141
|
];
|
|
136
142
|
this.ensureDir();
|
|
@@ -164,30 +170,44 @@ var PairingStore = class {
|
|
|
164
170
|
const list = this.readAllowlist();
|
|
165
171
|
return list.includes(senderId);
|
|
166
172
|
}
|
|
173
|
+
isGroupApproved(groupId) {
|
|
174
|
+
return this.readGroupAllowlist().includes(groupId);
|
|
175
|
+
}
|
|
167
176
|
/**
|
|
168
177
|
* Create a pairing request for an unknown sender.
|
|
169
|
-
* Returns the code if created
|
|
170
|
-
*
|
|
178
|
+
* Returns the code if created; if the subject already has a non-expired
|
|
179
|
+
* pending request, returns that code. Rejects with `sender_pending` when
|
|
180
|
+
* the sender already holds a request for another subject, or
|
|
181
|
+
* `cap_reached` when the pending cap is reached.
|
|
171
182
|
*/
|
|
172
183
|
createRequest(senderId, senderName) {
|
|
184
|
+
return this.createSubjectRequest({ type: "user", id: senderId, name: senderName }, senderId, senderName);
|
|
185
|
+
}
|
|
186
|
+
createGroupRequest(groupId, groupName, senderId, senderName) {
|
|
187
|
+
return this.createSubjectRequest({ type: "group", id: groupId, name: groupName }, senderId, senderName);
|
|
188
|
+
}
|
|
189
|
+
createSubjectRequest(subject, senderId, senderName) {
|
|
173
190
|
const pending = this.readPending();
|
|
174
191
|
const now = Date.now();
|
|
175
192
|
const active = pending.filter((r) => now - r.createdAt < EXPIRY_MS);
|
|
176
|
-
const existing = active.find((
|
|
193
|
+
const existing = active.find((request) => request.subject.type === subject.type && request.subject.id === subject.id);
|
|
177
194
|
if (existing) {
|
|
178
|
-
return existing.code;
|
|
195
|
+
return { code: existing.code };
|
|
196
|
+
}
|
|
197
|
+
if (active.some((request) => request.senderId === senderId)) {
|
|
198
|
+
return { rejected: "sender_pending" };
|
|
179
199
|
}
|
|
180
200
|
if (active.length >= MAX_PENDING) {
|
|
181
|
-
return
|
|
201
|
+
return { rejected: "cap_reached" };
|
|
182
202
|
}
|
|
183
203
|
const code = generateCode();
|
|
184
|
-
active.push({ senderId, senderName, code, createdAt: now });
|
|
204
|
+
active.push({ senderId, senderName, subject, code, createdAt: now });
|
|
185
205
|
this.writePending(active);
|
|
186
|
-
return code;
|
|
206
|
+
return { code };
|
|
187
207
|
}
|
|
188
208
|
/**
|
|
189
209
|
* Approve a pairing request by code.
|
|
190
|
-
* Returns the
|
|
210
|
+
* Returns the request if found, or null if not found / expired.
|
|
191
211
|
*/
|
|
192
212
|
approve(code) {
|
|
193
213
|
const pending = this.readPending();
|
|
@@ -196,13 +216,21 @@ var PairingStore = class {
|
|
|
196
216
|
if (idx === -1)
|
|
197
217
|
return null;
|
|
198
218
|
const request = pending[idx];
|
|
219
|
+
if (request.subject.type === "group") {
|
|
220
|
+
const groups = this.readGroupAllowlist(true);
|
|
221
|
+
if (!groups.includes(request.subject.id)) {
|
|
222
|
+
groups.push(request.subject.id);
|
|
223
|
+
this.writeGroupAllowlist(groups);
|
|
224
|
+
}
|
|
225
|
+
} else {
|
|
226
|
+
const users = this.readAllowlist();
|
|
227
|
+
if (!users.includes(request.subject.id)) {
|
|
228
|
+
users.push(request.subject.id);
|
|
229
|
+
this.writeAllowlist(users);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
199
232
|
pending.splice(idx, 1);
|
|
200
233
|
this.writePending(pending);
|
|
201
|
-
const list = this.readAllowlist();
|
|
202
|
-
if (!list.includes(request.senderId)) {
|
|
203
|
-
list.push(request.senderId);
|
|
204
|
-
this.writeAllowlist(list);
|
|
205
|
-
}
|
|
206
234
|
return request;
|
|
207
235
|
}
|
|
208
236
|
listPending() {
|
|
@@ -213,6 +241,9 @@ var PairingStore = class {
|
|
|
213
241
|
getAllowlist() {
|
|
214
242
|
return this.readAllowlist();
|
|
215
243
|
}
|
|
244
|
+
getGroupAllowlist() {
|
|
245
|
+
return this.readGroupAllowlist();
|
|
246
|
+
}
|
|
216
247
|
revoke(senderId) {
|
|
217
248
|
const list = this.readAllowlist();
|
|
218
249
|
const next = list.filter((id) => id !== senderId);
|
|
@@ -222,6 +253,15 @@ var PairingStore = class {
|
|
|
222
253
|
this.writeAllowlist(next);
|
|
223
254
|
return true;
|
|
224
255
|
}
|
|
256
|
+
revokeGroup(groupId) {
|
|
257
|
+
const list = this.readGroupAllowlist();
|
|
258
|
+
const next = list.filter((id) => id !== groupId);
|
|
259
|
+
if (next.length === list.length) {
|
|
260
|
+
return false;
|
|
261
|
+
}
|
|
262
|
+
this.writeGroupAllowlist(next);
|
|
263
|
+
return true;
|
|
264
|
+
}
|
|
225
265
|
ensureDir() {
|
|
226
266
|
if (!fs2.existsSync(this.dir)) {
|
|
227
267
|
fs2.mkdirSync(this.dir, { recursive: true });
|
|
@@ -230,7 +270,15 @@ var PairingStore = class {
|
|
|
230
270
|
readPending() {
|
|
231
271
|
try {
|
|
232
272
|
const data = fs2.readFileSync(this.pendingPath, "utf-8");
|
|
233
|
-
|
|
273
|
+
const requests = JSON.parse(data);
|
|
274
|
+
return requests.map((request) => ({
|
|
275
|
+
...request,
|
|
276
|
+
subject: request.subject ?? {
|
|
277
|
+
type: "user",
|
|
278
|
+
id: request.senderId,
|
|
279
|
+
name: request.senderName
|
|
280
|
+
}
|
|
281
|
+
}));
|
|
234
282
|
} catch {
|
|
235
283
|
return [];
|
|
236
284
|
}
|
|
@@ -251,6 +299,28 @@ var PairingStore = class {
|
|
|
251
299
|
this.ensureDir();
|
|
252
300
|
fs2.writeFileSync(this.allowlistPath, JSON.stringify(list, null, 2));
|
|
253
301
|
}
|
|
302
|
+
readGroupAllowlist(strict = false) {
|
|
303
|
+
try {
|
|
304
|
+
const data = fs2.readFileSync(this.groupAllowlistPath, "utf-8");
|
|
305
|
+
return JSON.parse(data);
|
|
306
|
+
} catch (err) {
|
|
307
|
+
const exists = fs2.existsSync(this.groupAllowlistPath);
|
|
308
|
+
if (strict && exists) {
|
|
309
|
+
throw new Error(`refusing to rewrite unreadable group allowlist "${path2.basename(this.groupAllowlistPath)}": ${err?.message}`);
|
|
310
|
+
}
|
|
311
|
+
if (exists) {
|
|
312
|
+
process.stderr.write(`[PairingStore] group allowlist "${path2.basename(this.groupAllowlistPath)}" is unreadable (${err?.message}); treating as empty \u2014 stored group approvals are not in effect and will be lost on the next approve
|
|
313
|
+
`);
|
|
314
|
+
}
|
|
315
|
+
return [];
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
writeGroupAllowlist(list) {
|
|
319
|
+
this.ensureDir();
|
|
320
|
+
const tmpPath = `${this.groupAllowlistPath}.${process.pid}.tmp`;
|
|
321
|
+
fs2.writeFileSync(tmpPath, JSON.stringify(list, null, 2));
|
|
322
|
+
fs2.renameSync(tmpPath, this.groupAllowlistPath);
|
|
323
|
+
}
|
|
254
324
|
};
|
|
255
325
|
function generateCode() {
|
|
256
326
|
let code = "";
|
|
@@ -1066,21 +1136,28 @@ var GroupGate = class {
|
|
|
1066
1136
|
}
|
|
1067
1137
|
policy;
|
|
1068
1138
|
groups;
|
|
1069
|
-
|
|
1139
|
+
pairingStore;
|
|
1140
|
+
constructor(policy = "disabled", groups = {}, pairingStore) {
|
|
1070
1141
|
this.policy = policy;
|
|
1071
1142
|
this.groups = groups;
|
|
1143
|
+
this.pairingStore = pairingStore ?? null;
|
|
1072
1144
|
}
|
|
1073
1145
|
/**
|
|
1074
|
-
* Full group check: policy + allowlist + mention gating.
|
|
1146
|
+
* Full group check: policy + allowlist + pairing + mention gating.
|
|
1075
1147
|
* Evaluation order:
|
|
1076
1148
|
* 1. groupPolicy (disabled → drop)
|
|
1077
1149
|
* 2. group allowlist (allowlist mode, no match → drop)
|
|
1078
|
-
* 3.
|
|
1150
|
+
* 3. group pairing (pairing mode, group not approved → drop; an explicit
|
|
1151
|
+
* mention or reply creates or returns a pending pairing request unless
|
|
1152
|
+
* `options.createPairingRequest` is false)
|
|
1153
|
+
* 4. mention gating (requireMention + not mentioned → drop silently)
|
|
1079
1154
|
*
|
|
1080
|
-
*
|
|
1081
|
-
*
|
|
1155
|
+
* Under the pairing policy the pairing step itself drops ambient
|
|
1156
|
+
* (unmentioned, non-reply) messages before any request is created. Mention
|
|
1157
|
+
* gating then runs before the sender gate so unmentioned messages in
|
|
1158
|
+
* approved groups don't trigger sender pairing flows.
|
|
1082
1159
|
*/
|
|
1083
|
-
check(envelope) {
|
|
1160
|
+
check(envelope, options = {}) {
|
|
1084
1161
|
if (!envelope.isGroup) {
|
|
1085
1162
|
return { allowed: true };
|
|
1086
1163
|
}
|
|
@@ -1092,6 +1169,17 @@ var GroupGate = class {
|
|
|
1092
1169
|
return { allowed: false, reason: "not_allowlisted" };
|
|
1093
1170
|
}
|
|
1094
1171
|
}
|
|
1172
|
+
if (this.policy === "pairing" && !this.pairingStore?.isGroupApproved(envelope.chatId)) {
|
|
1173
|
+
if (options.createPairingRequest === false || !envelope.isMentioned && !envelope.isReplyToBot) {
|
|
1174
|
+
return { allowed: false, reason: "pairing_trigger_required" };
|
|
1175
|
+
}
|
|
1176
|
+
const result = this.pairingStore?.createGroupRequest(envelope.chatId, envelope.chatName || envelope.chatId, envelope.senderId, envelope.senderName);
|
|
1177
|
+
return {
|
|
1178
|
+
allowed: false,
|
|
1179
|
+
reason: "pairing_required",
|
|
1180
|
+
pairing: result ?? { rejected: "cap_reached" }
|
|
1181
|
+
};
|
|
1182
|
+
}
|
|
1095
1183
|
const groupConfig = this.groups[envelope.chatId] || this.groups["*"] || {};
|
|
1096
1184
|
const requireMention = groupConfig.requireMention ?? true;
|
|
1097
1185
|
if (requireMention && !envelope.isMentioned && !envelope.isReplyToBot) {
|
|
@@ -1099,6 +1187,9 @@ var GroupGate = class {
|
|
|
1099
1187
|
}
|
|
1100
1188
|
return { allowed: true };
|
|
1101
1189
|
}
|
|
1190
|
+
isGroupApproved(groupId) {
|
|
1191
|
+
return this.pairingStore?.isGroupApproved(groupId) ?? false;
|
|
1192
|
+
}
|
|
1102
1193
|
};
|
|
1103
1194
|
|
|
1104
1195
|
// packages/channels/base/dist/DmGate.js
|
|
@@ -1410,8 +1501,11 @@ var SenderGate = class {
|
|
|
1410
1501
|
if (this.pairingStore?.isApproved(senderId)) {
|
|
1411
1502
|
return { allowed: true };
|
|
1412
1503
|
}
|
|
1413
|
-
const
|
|
1414
|
-
return {
|
|
1504
|
+
const result = this.pairingStore?.createRequest(senderId, senderName || senderId);
|
|
1505
|
+
return {
|
|
1506
|
+
allowed: false,
|
|
1507
|
+
pairing: result ?? { rejected: "cap_reached" }
|
|
1508
|
+
};
|
|
1415
1509
|
}
|
|
1416
1510
|
default:
|
|
1417
1511
|
throw new Error(`Unknown sender policy: ${this.policy}`);
|
|
@@ -2766,6 +2860,11 @@ var ChannelBase = class {
|
|
|
2766
2860
|
memoryIntentClassifier;
|
|
2767
2861
|
channelMemoryRecallObserver;
|
|
2768
2862
|
groupHistory;
|
|
2863
|
+
// Tracks the pairing code already announced per group so repeated triggers
|
|
2864
|
+
// of the same pending request (extra mentions, parallel notification lanes)
|
|
2865
|
+
// post the public notification once. In-memory by design: a restart can
|
|
2866
|
+
// re-post once per still-pending request, but never per trigger.
|
|
2867
|
+
groupPairingNotified = /* @__PURE__ */ new Map();
|
|
2769
2868
|
loopController;
|
|
2770
2869
|
observedContacts;
|
|
2771
2870
|
observedContactEnvelopes = /* @__PURE__ */ new WeakSet();
|
|
@@ -3068,9 +3167,9 @@ var ChannelBase = class {
|
|
|
3068
3167
|
this.loopController = options?.loopController;
|
|
3069
3168
|
this.observedContacts = options?.observedContacts;
|
|
3070
3169
|
this.bridgeRecovery = options?.bridgeRecovery;
|
|
3071
|
-
|
|
3170
|
+
const pairingStore = config.senderPolicy === "pairing" || config.groupPolicy === "pairing" ? new PairingStore(name, config.cwd) : void 0;
|
|
3171
|
+
this.groupGate = new GroupGate(config.groupPolicy, config.groups, pairingStore);
|
|
3072
3172
|
this.dmGate = new DmGate(config.dmPolicy);
|
|
3073
|
-
const pairingStore = config.senderPolicy === "pairing" ? new PairingStore(name, config.cwd) : void 0;
|
|
3074
3173
|
this.gate = new SenderGate(config.senderPolicy, config.allowedUsers, pairingStore);
|
|
3075
3174
|
this.router = options?.router || new SessionRouter(bridge, config.cwd, config.sessionScope);
|
|
3076
3175
|
this.registerSharedCommands();
|
|
@@ -3457,6 +3556,7 @@ var ChannelBase = class {
|
|
|
3457
3556
|
text: coalesced,
|
|
3458
3557
|
alreadyPrefixed: true,
|
|
3459
3558
|
referencedText: void 0,
|
|
3559
|
+
mentionedMemberIds: void 0,
|
|
3460
3560
|
attachments: void 0,
|
|
3461
3561
|
metadata: void 0,
|
|
3462
3562
|
imageBase64: void 0,
|
|
@@ -4841,7 +4941,7 @@ ${requestList}`);
|
|
|
4841
4941
|
isMentioned: true,
|
|
4842
4942
|
isReplyToBot: true
|
|
4843
4943
|
};
|
|
4844
|
-
return this.groupGate.check(envelope).allowed && this.dmGate.check(envelope).allowed && this.gate.isAllowed(normalizedTarget.senderId) && this.isAuthorizedForSharedSession(envelope);
|
|
4944
|
+
return this.groupGate.check(envelope, { createPairingRequest: false }).allowed && this.dmGate.check(envelope).allowed && (normalizedTarget.isGroup && this.config.groupPolicy === "pairing" ? true : this.gate.isAllowed(normalizedTarget.senderId)) && this.isAuthorizedForSharedSession(envelope);
|
|
4845
4945
|
}
|
|
4846
4946
|
/** Check if a message text matches a registered local command. */
|
|
4847
4947
|
isLocalCommand(text) {
|
|
@@ -5511,7 +5611,7 @@ ${sanitizePromptText(entry.text).trim()}` : `No channel memory entry ${intent.id
|
|
|
5511
5611
|
return;
|
|
5512
5612
|
}
|
|
5513
5613
|
const senderId = truncateGroupHistoryField(envelope.senderId);
|
|
5514
|
-
if (!this.gate.isAllowed(senderId)) {
|
|
5614
|
+
if (this.config.groupPolicy !== "pairing" && !this.gate.isAllowed(senderId)) {
|
|
5515
5615
|
return;
|
|
5516
5616
|
}
|
|
5517
5617
|
const entry = {
|
|
@@ -5534,7 +5634,11 @@ ${sanitizePromptText(entry.text).trim()}` : `No channel memory entry ${intent.id
|
|
|
5534
5634
|
return [];
|
|
5535
5635
|
}
|
|
5536
5636
|
try {
|
|
5537
|
-
|
|
5637
|
+
const entries = this.groupHistory.drain(this.groupHistoryKey(envelope), limit);
|
|
5638
|
+
if (this.config.groupPolicy === "pairing" && !this.groupGate.isGroupApproved(envelope.chatId)) {
|
|
5639
|
+
return [];
|
|
5640
|
+
}
|
|
5641
|
+
return entries;
|
|
5538
5642
|
} catch (err) {
|
|
5539
5643
|
process.stderr.write(`[${this.name}] failed to drain group history for chat ${sanitizeLogText(envelope.chatId, 64)}: ${err instanceof Error ? err.message : err}
|
|
5540
5644
|
`);
|
|
@@ -5560,7 +5664,7 @@ ${sanitizePromptText(entry.text).trim()}` : `No channel memory entry ${intent.id
|
|
|
5560
5664
|
if (entries.length === 0) {
|
|
5561
5665
|
return promptText;
|
|
5562
5666
|
}
|
|
5563
|
-
const lines = entries.filter((entry) => this.gate.isAllowed(entry.senderId));
|
|
5667
|
+
const lines = this.config.groupPolicy === "pairing" ? entries : entries.filter((entry) => this.gate.isAllowed(entry.senderId));
|
|
5564
5668
|
if (lines.length === 0) {
|
|
5565
5669
|
return promptText;
|
|
5566
5670
|
}
|
|
@@ -5578,8 +5682,18 @@ ${promptText}`;
|
|
|
5578
5682
|
preflightInbound(envelope) {
|
|
5579
5683
|
const groupResult = this.groupGate.check(envelope);
|
|
5580
5684
|
if (!groupResult.allowed) {
|
|
5685
|
+
if (groupResult.pairing !== void 0) {
|
|
5686
|
+
this.logPreflightRejected("group_pairing_required");
|
|
5687
|
+
return this.onGroupPairingRequired(envelope.chatId, groupResult.pairing, envelope.threadId).then(() => false).catch((err) => {
|
|
5688
|
+
process.stderr.write(`[Channel:${this.name}] group pairing notification failed: ${sanitizeLogText(err instanceof Error ? err.message : String(err), 200)}
|
|
5689
|
+
`);
|
|
5690
|
+
return false;
|
|
5691
|
+
});
|
|
5692
|
+
}
|
|
5581
5693
|
if (groupResult.reason === "mention_required") {
|
|
5582
5694
|
this.recordPendingGroupHistory(envelope);
|
|
5695
|
+
} else if (groupResult.reason === "pairing_trigger_required") {
|
|
5696
|
+
return false;
|
|
5583
5697
|
} else {
|
|
5584
5698
|
this.logPreflightRejected(`group_${groupResult.reason ?? "denied"}`);
|
|
5585
5699
|
}
|
|
@@ -5590,11 +5704,15 @@ ${promptText}`;
|
|
|
5590
5704
|
this.logPreflightRejected(`dm_${dmResult.reason ?? "denied"}`);
|
|
5591
5705
|
return false;
|
|
5592
5706
|
}
|
|
5707
|
+
if (envelope.isGroup && this.config.groupPolicy === "pairing") {
|
|
5708
|
+
this.markPreflighted(envelope);
|
|
5709
|
+
return true;
|
|
5710
|
+
}
|
|
5593
5711
|
const result = this.gate.check(envelope.senderId, envelope.senderName);
|
|
5594
5712
|
if (!result.allowed) {
|
|
5595
|
-
if (result.
|
|
5713
|
+
if (result.pairing !== void 0) {
|
|
5596
5714
|
this.logPreflightRejected("sender_pairing_required");
|
|
5597
|
-
return this.onPairingRequired(envelope.chatId, result.
|
|
5715
|
+
return this.onPairingRequired(envelope.chatId, result.pairing, envelope.threadId).then(() => false).catch((err) => {
|
|
5598
5716
|
process.stderr.write(`[Channel:${this.name}] pairing notification failed: ${sanitizeLogText(err instanceof Error ? err.message : String(err), 200)}
|
|
5599
5717
|
`);
|
|
5600
5718
|
return false;
|
|
@@ -5654,6 +5772,27 @@ ${promptText}`;
|
|
|
5654
5772
|
`);
|
|
5655
5773
|
}
|
|
5656
5774
|
}
|
|
5775
|
+
onObservedContact(_envelope) {
|
|
5776
|
+
}
|
|
5777
|
+
/**
|
|
5778
|
+
* Observations persisted for this channel, when a read path is configured.
|
|
5779
|
+
* Adapters hydrate label caches from it after a restart so known labels are
|
|
5780
|
+
* not reverted to raw IDs by the next initial write.
|
|
5781
|
+
*/
|
|
5782
|
+
persistedObservedContacts() {
|
|
5783
|
+
const list = this.observedContacts?.list;
|
|
5784
|
+
if (!list)
|
|
5785
|
+
return void 0;
|
|
5786
|
+
try {
|
|
5787
|
+
const graph = list();
|
|
5788
|
+
return {
|
|
5789
|
+
users: graph.users.filter((user) => user.channelName === this.name),
|
|
5790
|
+
groups: graph.groups.filter((group) => group.channelName === this.name)
|
|
5791
|
+
};
|
|
5792
|
+
} catch {
|
|
5793
|
+
return void 0;
|
|
5794
|
+
}
|
|
5795
|
+
}
|
|
5657
5796
|
markPreflighted(envelope) {
|
|
5658
5797
|
this.preflightedEnvelopes.add(envelope);
|
|
5659
5798
|
}
|
|
@@ -5683,6 +5822,7 @@ ${promptText}`;
|
|
|
5683
5822
|
if (this.observedContacts && !this.observedContactEnvelopes.has(envelope)) {
|
|
5684
5823
|
this.observedContactEnvelopes.add(envelope);
|
|
5685
5824
|
await this.recordObservedContact(envelope);
|
|
5825
|
+
this.onObservedContact(envelope);
|
|
5686
5826
|
}
|
|
5687
5827
|
let memoryIntent = parseChannelMemoryIntent(envelope.text);
|
|
5688
5828
|
let memoryIntentFromClassifier = false;
|
|
@@ -5755,6 +5895,15 @@ ${output}${exitLine}`);
|
|
|
5755
5895
|
if ((envelope.isGroup || this.config.sessionScope === "single") && !envelope.alreadyPrefixed && !recognizedSlashCommand) {
|
|
5756
5896
|
const who = sanitizeSenderName(envelope.senderName || envelope.senderId || "unknown");
|
|
5757
5897
|
promptText = `[${who}] ${sanitizePromptText(promptText)}`;
|
|
5898
|
+
if (envelope.mentionedMemberIds?.length) {
|
|
5899
|
+
const ids = envelope.mentionedMemberIds.map((id) => sanitizeQuotedText(id, 64).trim()).filter((id) => id.length > 0 && id !== "\u2026");
|
|
5900
|
+
if (ids.length > 0) {
|
|
5901
|
+
const memberLabel = ids.length === 1 ? "member" : "members";
|
|
5902
|
+
promptText = `[Mentioned ${ids.length} other group ${memberLabel}: ${ids.join(", ")}]
|
|
5903
|
+
|
|
5904
|
+
${promptText}`;
|
|
5905
|
+
}
|
|
5906
|
+
}
|
|
5758
5907
|
}
|
|
5759
5908
|
if (envelope.referencedText) {
|
|
5760
5909
|
const quoted = sanitizeQuotedText(envelope.referencedText, 500);
|
|
@@ -6081,6 +6230,7 @@ ${promptToSend}`;
|
|
|
6081
6230
|
alreadyPrefixed: true,
|
|
6082
6231
|
// Clear attachments/references — already resolved in original text
|
|
6083
6232
|
referencedText: void 0,
|
|
6233
|
+
mentionedMemberIds: void 0,
|
|
6084
6234
|
attachments: void 0,
|
|
6085
6235
|
metadata: void 0,
|
|
6086
6236
|
imageBase64: void 0,
|
|
@@ -6098,14 +6248,34 @@ ${promptToSend}`;
|
|
|
6098
6248
|
}));
|
|
6099
6249
|
await current;
|
|
6100
6250
|
}
|
|
6101
|
-
|
|
6102
|
-
|
|
6103
|
-
|
|
6251
|
+
pairingRejectionMessage(rejected) {
|
|
6252
|
+
return rejected === "sender_pending" ? "You already have a pending pairing request. It must be approved or expire before another can be created." : "Too many pending pairing requests. Please try again later.";
|
|
6253
|
+
}
|
|
6254
|
+
groupPairingRejectionMessage(rejected) {
|
|
6255
|
+
return rejected === "sender_pending" ? "A pairing request cannot be created right now. Another member can mention the bot to start group approval, or try again later." : "Too many pending pairing requests. Please try again later.";
|
|
6256
|
+
}
|
|
6257
|
+
async onPairingRequired(chatId, result, threadId) {
|
|
6258
|
+
if ("code" in result) {
|
|
6259
|
+
await this.sendThreadMessage(chatId, threadId, `Your pairing code is: ${result.code}
|
|
6104
6260
|
|
|
6105
6261
|
Ask the bot operator to approve you with:
|
|
6106
|
-
qwen channel pairing approve ${this.name} ${code}`);
|
|
6262
|
+
qwen channel pairing approve ${this.name} ${result.code}`);
|
|
6263
|
+
} else {
|
|
6264
|
+
await this.sendThreadMessage(chatId, threadId, this.pairingRejectionMessage(result.rejected));
|
|
6265
|
+
}
|
|
6266
|
+
}
|
|
6267
|
+
async onGroupPairingRequired(chatId, result, threadId) {
|
|
6268
|
+
if ("code" in result) {
|
|
6269
|
+
if (this.groupPairingNotified.get(chatId) === result.code) {
|
|
6270
|
+
return;
|
|
6271
|
+
}
|
|
6272
|
+
await this.sendThreadMessage(chatId, threadId, `This group requires approval. Its pairing code is: ${result.code}
|
|
6273
|
+
|
|
6274
|
+
Ask the bot operator to approve the group with:
|
|
6275
|
+
qwen channel pairing approve ${this.name} ${result.code}`);
|
|
6276
|
+
this.groupPairingNotified.set(chatId, result.code);
|
|
6107
6277
|
} else {
|
|
6108
|
-
await this.sendThreadMessage(chatId, threadId,
|
|
6278
|
+
await this.sendThreadMessage(chatId, threadId, this.groupPairingRejectionMessage(result.rejected));
|
|
6109
6279
|
}
|
|
6110
6280
|
}
|
|
6111
6281
|
};
|
|
@@ -11,11 +11,11 @@ import {
|
|
|
11
11
|
} from "./chunk-NLREQJFK.js";
|
|
12
12
|
import {
|
|
13
13
|
loadSettings
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-OHKJVAKG.js";
|
|
15
15
|
import {
|
|
16
16
|
SkillManager,
|
|
17
17
|
isSafeModeEnv
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-GXSNGY5M.js";
|
|
19
19
|
import {
|
|
20
20
|
writeStderrLine
|
|
21
21
|
} from "./chunk-KGJGEEVR.js";
|
|
@@ -2,20 +2,20 @@
|
|
|
2
2
|
"use strict";
|
|
3
3
|
import {
|
|
4
4
|
getExtensionManager
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-QQWD7LZV.js";
|
|
6
6
|
import {
|
|
7
7
|
parseChannelConfig
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-QXVSWG66.js";
|
|
9
9
|
import {
|
|
10
10
|
getPlugin,
|
|
11
11
|
registerPlugin
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-NGYI5EF5.js";
|
|
13
13
|
import {
|
|
14
14
|
sanitizeLogText
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-DIWZNWZT.js";
|
|
16
16
|
import {
|
|
17
17
|
loadSettings
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-OHKJVAKG.js";
|
|
19
19
|
import {
|
|
20
20
|
hashDaemonWorkspace
|
|
21
21
|
} from "./chunk-L4N6TIP7.js";
|
|
@@ -2,19 +2,19 @@
|
|
|
2
2
|
"use strict";
|
|
3
3
|
import {
|
|
4
4
|
getErrorMessage
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-IYES5WOT.js";
|
|
6
6
|
import {
|
|
7
7
|
extensionToOutputString,
|
|
8
8
|
getExtensionManager
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-QQWD7LZV.js";
|
|
10
10
|
import {
|
|
11
11
|
loadSettings
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-OHKJVAKG.js";
|
|
13
13
|
import {
|
|
14
14
|
initializeI18n,
|
|
15
15
|
resolveLanguageSetting,
|
|
16
16
|
t
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-PG62DFWD.js";
|
|
18
18
|
import {
|
|
19
19
|
writeStderrLine,
|
|
20
20
|
writeStdoutLine
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// Force strict mode and setup for ESM
|
|
2
|
+
"use strict";
|
|
3
|
+
import {
|
|
4
|
+
init_esbuild_shims
|
|
5
|
+
} from "./chunk-5O2XNYP6.js";
|
|
6
|
+
|
|
7
|
+
// packages/core/src/config/models.ts
|
|
8
|
+
init_esbuild_shims();
|
|
9
|
+
var DEFAULT_QWEN_MODEL = "coder-model";
|
|
10
|
+
var DEFAULT_QWEN_EMBEDDING_MODEL = "text-embedding-v4";
|
|
11
|
+
var MAINLINE_CODER_MODEL = "qwen3.7-max";
|
|
12
|
+
|
|
13
|
+
export {
|
|
14
|
+
DEFAULT_QWEN_MODEL,
|
|
15
|
+
DEFAULT_QWEN_EMBEDDING_MODEL,
|
|
16
|
+
MAINLINE_CODER_MODEL
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* @license
|
|
20
|
+
* Copyright 2025 Google LLC
|
|
21
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
22
|
+
*/
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
"use strict";
|
|
3
3
|
import {
|
|
4
4
|
t
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-PG62DFWD.js";
|
|
6
6
|
import {
|
|
7
7
|
SessionReferenceService,
|
|
8
8
|
SessionService,
|
|
9
9
|
readManyFiles,
|
|
10
10
|
stripTerminalControlSequences
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-GXSNGY5M.js";
|
|
12
12
|
import {
|
|
13
13
|
emptyMcpResourceText,
|
|
14
14
|
formatMcpResourceContents,
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
} from "./chunk-ZPJWUGCS.js";
|
|
17
17
|
import {
|
|
18
18
|
shouldRunVisionBridge
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-3PY4LPJF.js";
|
|
20
20
|
import {
|
|
21
21
|
Storage,
|
|
22
22
|
getErrorMessage,
|