@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.
Files changed (314) hide show
  1. package/README.md +2 -0
  2. package/bundled/qc-helper/docs/configuration/settings.md +43 -30
  3. package/bundled/qc-helper/docs/features/channels/dingtalk.md +40 -2
  4. package/bundled/qc-helper/docs/features/channels/feishu.md +13 -2
  5. package/bundled/qc-helper/docs/features/channels/github.md +13 -11
  6. package/bundled/qc-helper/docs/features/channels/gitlab.md +13 -11
  7. package/bundled/qc-helper/docs/features/channels/overview.md +49 -31
  8. package/bundled/qc-helper/docs/features/channels/plugins.md +2 -2
  9. package/bundled/qc-helper/docs/features/channels/qqbot.md +4 -2
  10. package/bundled/qc-helper/docs/features/channels/telegram.md +4 -2
  11. package/bundled/qc-helper/docs/features/channels/wecom.md +1 -1
  12. package/bundled/qc-helper/docs/features/code-review.md +4 -0
  13. package/bundled/qc-helper/docs/features/commands.md +1 -1
  14. package/bundled/qc-helper/docs/features/hooks.md +52 -0
  15. package/bundled/qc-helper/docs/integration-jetbrains.md +1 -0
  16. package/bundled/qc-helper/docs/qwen-serve.md +4 -1
  17. package/bundled/qc-helper/docs/reference/keyboard-shortcuts.md +50 -36
  18. package/bundled/review/SKILL.md +28 -5
  19. package/chunks/{MaxSizedBox-ANWZBPTS.js → MaxSizedBox-7PM6BGJ5.js} +26 -22
  20. package/chunks/{StandaloneSessionPicker-XKS3VU3A.js → StandaloneSessionPicker-3UQHM7GV.js} +44 -40
  21. package/chunks/{acp-startup-profiler-ORIQ2CCQ.js → acp-startup-profiler-B5BYAMYQ.js} +2 -2
  22. package/chunks/{acpAgent-KUAZ3GCZ.js → acpAgent-5UWLFV6V.js} +534 -262
  23. package/chunks/{agent-T6PTGX5R.js → agent-624T2BLO.js} +26 -22
  24. package/chunks/{agent-headless-PR7YCB7S.js → agent-headless-2EE5J2KX.js} +26 -22
  25. package/chunks/{artifact-tool-U4VOZIK5.js → artifact-tool-N652YE4L.js} +1 -1
  26. package/chunks/{askUserQuestion-XOBQLPFA.js → askUserQuestion-ONW74PKJ.js} +1 -1
  27. package/chunks/{bridge-NU6YEEHK.js → bridge-JENKGFFP.js} +29 -25
  28. package/chunks/{ca-NYKNH222.js → ca-ZLKAB4K3.js} +6 -0
  29. package/chunks/{channel-management-service-FSQ7SHYI.js → channel-management-service-DDWUPHMU.js} +19 -10
  30. package/chunks/{channel-settings-store-35VQVUVV.js → channel-settings-store-SA6JZSPH.js} +34 -30
  31. package/chunks/{channel-worker-group-JWQK224X.js → channel-worker-group-E67EN3RV.js} +5 -5
  32. package/chunks/{channel-worker-manager-77E3OXRQ.js → channel-worker-manager-SW4C45CF.js} +5 -5
  33. package/chunks/{channel-worker-supervisor-62YWUGP2.js → channel-worker-supervisor-5SRD24FG.js} +3 -3
  34. package/chunks/{chunk-CJXIIILK.js → chunk-2FRY5CRX.js} +1 -1
  35. package/chunks/{chunk-ZJ3VGYHK.js → chunk-2ILAOM2I.js} +34 -17
  36. package/chunks/{chunk-6XJMFJ4D.js → chunk-2M4K4KYS.js} +177 -120
  37. package/chunks/{chunk-CNIID3TV.js → chunk-2UUMVNYT.js} +1 -1
  38. package/chunks/{chunk-22NBYCPD.js → chunk-3P2LV43B.js} +1 -1
  39. package/chunks/{chunk-2U3WZGZG.js → chunk-3PY4LPJF.js} +19 -131
  40. package/chunks/{chunk-SPMY6CX6.js → chunk-3SE7J4DR.js} +3 -3
  41. package/chunks/{chunk-6UWFTUQL.js → chunk-3WNQOYHQ.js} +66 -22
  42. package/chunks/{chunk-KXSDEOFU.js → chunk-4ALIARFY.js} +1 -1
  43. package/chunks/{chunk-D3UEZIQH.js → chunk-4DU3NCHG.js} +48 -55
  44. package/chunks/{chunk-BGG4MBYD.js → chunk-4PYCZH2V.js} +4 -187
  45. package/chunks/{chunk-H2UQ2M5Z.js → chunk-4WU6NY7F.js} +96 -22
  46. package/chunks/{chunk-TLV2IMHR.js → chunk-5ZGR6RKJ.js} +3 -3
  47. package/chunks/{chunk-3K7FH2KQ.js → chunk-67N6HB5H.js} +1310 -171
  48. package/chunks/{chunk-EORNAQDT.js → chunk-6TR7CFXH.js} +1 -1
  49. package/chunks/{chunk-NG2R4N5O.js → chunk-6ZRFAKXK.js} +1 -1
  50. package/chunks/{chunk-P2AJ7FTI.js → chunk-757GB46F.js} +1 -1
  51. package/chunks/{chunk-72LNFGUY.js → chunk-77QVBFCU.js} +3 -3
  52. package/chunks/{chunk-OH2VKQXH.js → chunk-7DVT4LVV.js} +37 -30
  53. package/chunks/{chunk-KKJJB5X6.js → chunk-7VUERJHS.js} +1503 -815
  54. package/chunks/{chunk-VOARQPTA.js → chunk-B52AWKBB.js} +65 -21
  55. package/chunks/{chunk-Y4EWSQF7.js → chunk-BF224XHL.js} +2 -2
  56. package/chunks/{chunk-PJOBIWUG.js → chunk-BF52U4XJ.js} +1 -1
  57. package/chunks/{chunk-55LYDVPU.js → chunk-C5VWPTGT.js} +1 -1
  58. package/chunks/{chunk-W7U4ESW2.js → chunk-CG3WBKJK.js} +1 -1
  59. package/chunks/chunk-COBO5EBO.js +135 -0
  60. package/chunks/chunk-CPG6P4GG.js +82 -0
  61. package/chunks/{chunk-DIEFUBV6.js → chunk-DIWZNWZT.js} +205 -35
  62. package/chunks/{chunk-AE77C5ZU.js → chunk-DQSDACD2.js} +1 -1
  63. package/chunks/{chunk-P3LEG54R.js → chunk-DX5W5AON.js} +2 -2
  64. package/chunks/{chunk-EUQTXRKZ.js → chunk-E4ZBKMSF.js} +5 -5
  65. package/chunks/{chunk-FPM27XN4.js → chunk-EIVICVHM.js} +4 -4
  66. package/chunks/{chunk-YHEEE624.js → chunk-EN2TKTFH.js} +1 -1
  67. package/chunks/chunk-F6WFNA7U.js +22 -0
  68. package/chunks/{chunk-FZBZSYKU.js → chunk-FN6YXJOP.js} +1 -1
  69. package/chunks/{chunk-KR4ZSC7K.js → chunk-FWBXMANW.js} +3 -3
  70. package/chunks/{chunk-LA7YLSR6.js → chunk-FYAXKJK7.js} +327 -67
  71. package/chunks/{chunk-CSZEXZBE.js → chunk-GBDINRIL.js} +3 -3
  72. package/chunks/{chunk-SCI7K3GM.js → chunk-GOEVOFQI.js} +19 -10
  73. package/chunks/{chunk-LEMXGVEP.js → chunk-GQCEQPYQ.js} +3 -3
  74. package/chunks/{chunk-Y7E5LNLO.js → chunk-GXSNGY5M.js} +1027 -876
  75. package/chunks/{chunk-6XU3PH66.js → chunk-HA3SAB64.js} +22 -69
  76. package/chunks/{chunk-Y4NGLFGJ.js → chunk-HUWENAHO.js} +1 -1
  77. package/chunks/{chunk-3ULCB3NE.js → chunk-HV76SFIA.js} +1 -1
  78. package/chunks/{chunk-CB2464BK.js → chunk-HWX5HPUG.js} +14 -4
  79. package/chunks/{chunk-LZC3B5N2.js → chunk-IA7TGCN2.js} +2 -2
  80. package/chunks/{chunk-RERATVSK.js → chunk-IBYULW65.js} +6 -6
  81. package/chunks/{chunk-HYRDKNUY.js → chunk-IUQ52YJK.js} +1 -1
  82. package/chunks/{chunk-TDXGKHDN.js → chunk-IYES5WOT.js} +2 -2
  83. package/chunks/{chunk-RGSBTHSU.js → chunk-KAQCJO6Y.js} +131 -4
  84. package/chunks/{chunk-VWOVHOTT.js → chunk-KJZ26VBX.js} +1 -1
  85. package/chunks/{chunk-6GONZVLS.js → chunk-KKDVZLGL.js} +1 -1
  86. package/chunks/{chunk-MKVZE4ZJ.js → chunk-KTJFU7RT.js} +3 -2
  87. package/chunks/{chunk-R574ATRM.js → chunk-M2PNLYGY.js} +41 -0
  88. package/chunks/{chunk-6EOI4HOK.js → chunk-M3STHEMM.js} +12 -17
  89. package/chunks/chunk-NGYI5EF5.js +244 -0
  90. package/chunks/{chunk-ALGGS7UH.js → chunk-NPQ5ZKRP.js} +82 -1
  91. package/chunks/{chunk-HQB2KUAN.js → chunk-NPUXXRJI.js} +1 -1
  92. package/chunks/{chunk-QETYKPMG.js → chunk-NVRDQFCX.js} +1 -1
  93. package/chunks/{chunk-PQBHU2IA.js → chunk-OHKJVAKG.js} +10 -10
  94. package/chunks/{chunk-CYR3HI5X.js → chunk-OQTXYMKW.js} +2 -2
  95. package/chunks/{chunk-DBOFL3LQ.js → chunk-PG62DFWD.js} +10 -10
  96. package/chunks/{chunk-2VSTGY6M.js → chunk-PJRW65JO.js} +1 -1
  97. package/chunks/{chunk-33ACCIIY.js → chunk-PLFATELK.js} +1 -1
  98. package/chunks/{chunk-IC4Z6LX6.js → chunk-PYQADEFD.js} +5 -0
  99. package/chunks/{chunk-MAJS7AT4.js → chunk-QGHSP65Z.js} +2 -2
  100. package/chunks/{chunk-OHJLEW5J.js → chunk-QQWD7LZV.js} +4 -4
  101. package/chunks/{chunk-ZXU5UHMI.js → chunk-QXVSWG66.js} +2 -2
  102. package/chunks/{chunk-E33LOKRA.js → chunk-RPWVIXDB.js} +18 -1
  103. package/chunks/{chunk-TYKC75AX.js → chunk-S3Y3GBFD.js} +1 -1
  104. package/chunks/{chunk-7UFKAV7Y.js → chunk-S6HYI3MF.js} +2 -2
  105. package/chunks/chunk-SAH4BD2J.js +92 -0
  106. package/chunks/{chunk-OMKQH5C5.js → chunk-SNRT2TJJ.js} +6 -23
  107. package/chunks/chunk-SR7RZ4MS.js +202 -0
  108. package/chunks/{chunk-CXE7E23H.js → chunk-TE3ZAJE7.js} +45 -17
  109. package/chunks/{chunk-S7CV4KO6.js → chunk-TKSZJ5BV.js} +3 -3
  110. package/chunks/{chunk-3NB7TSE2.js → chunk-U5SLIG7E.js} +1 -1
  111. package/chunks/chunk-UA5H3DS2.js +203 -0
  112. package/chunks/{chunk-24ER7UV4.js → chunk-UFALT4LK.js} +1 -1
  113. package/chunks/{chunk-YJQCUTT2.js → chunk-VWMUDKLC.js} +3 -3
  114. package/chunks/{chunk-RMH5OWLD.js → chunk-VXZ5HAOV.js} +1 -1
  115. package/chunks/{chunk-BVWVWGLE.js → chunk-WAUGQKUU.js} +4 -64
  116. package/chunks/{chunk-SHZYHGQH.js → chunk-WG6542MA.js} +1 -1
  117. package/chunks/{chunk-5KH532V7.js → chunk-WV5J6Q6N.js} +1 -1
  118. package/chunks/{chunk-RNVQB725.js → chunk-XHD7CRP2.js} +2 -2
  119. package/chunks/{chunk-W4B7UBUS.js → chunk-XZKQT2B2.js} +5 -5
  120. package/chunks/{chunk-6HVUFDS2.js → chunk-Y4TETC74.js} +22 -13
  121. package/chunks/{chunk-RZHU3ILK.js → chunk-YEF7XEO2.js} +4 -4
  122. package/chunks/{chunk-RUL4S3K3.js → chunk-YHJFF7KH.js} +146 -45
  123. package/chunks/{chunk-23RZCH76.js → chunk-YOM7DEGB.js} +3 -3
  124. package/chunks/{chunk-OFI7IGST.js → chunk-ZCLLJARV.js} +9 -9
  125. package/chunks/{chunk-GSS34377.js → chunk-ZHA242R4.js} +2 -2
  126. package/chunks/{chunk-TRLYP7OF.js → chunk-ZPLALRXZ.js} +17 -9
  127. package/chunks/{chunk-WUC6ZFXO.js → chunk-ZWBUH5UP.js} +1 -1
  128. package/chunks/{computer-use-KEAPATUY.js → computer-use-ESQYJ3JY.js} +26 -22
  129. package/chunks/{config-utils-K7SCOWHD.js → config-utils-XQHBJP7G.js} +4 -4
  130. package/chunks/{contextCommand-ZJA6A5K5.js → contextCommand-CX3YF4ZE.js} +28 -24
  131. package/chunks/{core-runtime-QMJPWHCI.js → core-runtime-DIAU7JMG.js} +30 -26
  132. package/chunks/{create-sub-session-DJE6XICH.js → create-sub-session-HDPD6HOA.js} +26 -22
  133. package/chunks/{create-sub-session-E4PBYXV5.js → create-sub-session-QIDZUOPU.js} +1 -1
  134. package/chunks/{cron-create-GRBWYMIJ.js → cron-create-VONA5JYY.js} +1 -1
  135. package/chunks/{cron-delete-4CMKBR2M.js → cron-delete-5JXSP2MI.js} +1 -1
  136. package/chunks/{cron-list-W7K4ASOA.js → cron-list-KE4F2CIR.js} +1 -1
  137. package/chunks/{daemon-SCTQMM7Z.js → daemon-VZBGJUNL.js} +30 -0
  138. package/chunks/{daemon-status-provider-FSWDPE2G.js → daemon-status-provider-H6O4UQ4F.js} +33 -29
  139. package/chunks/{daemon-trust-policy-P5L5VFAY.js → daemon-trust-policy-BNUXG6MT.js} +33 -29
  140. package/chunks/{daemon-trust-policy-monitor-73JYN6ET.js → daemon-trust-policy-monitor-E4EQ7GF4.js} +33 -29
  141. package/chunks/{de-VL76CPLV.js → de-LIW4XVLN.js} +5 -0
  142. package/chunks/{deferred-core-runtime-BWRCCFTE.js → deferred-core-runtime-CBMSHPAU.js} +26 -22
  143. package/chunks/{display-image-O2XFPQTC.js → display-image-NQRSIBXM.js} +2 -2
  144. package/chunks/{dist-DPPHJAVL.js → dist-EEEQGCZA.js} +918 -142
  145. package/chunks/{dist-K4WWQBHS.js → dist-HIACTZEK.js} +55 -15
  146. package/chunks/{dist-3BMEUGTG.js → dist-IRL7WA5Z.js} +1 -1
  147. package/chunks/{dist-HVBMEYWK.js → dist-KVISB2O2.js} +1 -1
  148. package/chunks/{dist-KS4O2NKE.js → dist-MBF3I5MX.js} +14 -8
  149. package/chunks/{dist-SFQ34F4M.js → dist-MKX5OSFF.js} +5 -4
  150. package/chunks/{dist-7JGAAQSC.js → dist-RCH3I7SS.js} +2 -2
  151. package/chunks/{dist-C5U4LJKW.js → dist-TUSWNE2I.js} +5 -4
  152. package/chunks/{earlyInputCapture-L5ST23A6.js → earlyInputCapture-UIOP7OIN.js} +26 -22
  153. package/chunks/{edit-LHHRFNFK.js → edit-ITMZYFKA.js} +26 -22
  154. package/chunks/{en-IRJ2WN5T.js → en-SY5GTIGX.js} +6 -0
  155. package/chunks/{enter-worktree-6NXCRZPF.js → enter-worktree-S4PL5UV6.js} +26 -22
  156. package/chunks/{enterPlanMode-ZVQT4U7D.js → enterPlanMode-YV52NNJT.js} +26 -22
  157. package/chunks/{environment-GJ2HWJOS.js → environment-NGOWPRZV.js} +30 -26
  158. package/chunks/{errors-6RLH3XXC.js → errors-BU26DTDX.js} +28 -24
  159. package/chunks/{exit-worktree-I2YLUHHY.js → exit-worktree-XRM6LH5F.js} +26 -22
  160. package/chunks/{exitPlanMode-7CCWKO7I.js → exitPlanMode-ZLI5F7KR.js} +26 -22
  161. package/chunks/{fast-path-DVFD4HQD.js → fast-path-UJWORIED.js} +23 -3
  162. package/chunks/{fast-path-settings-WQJU2LAT.js → fast-path-settings-37WQD5B2.js} +6 -3
  163. package/chunks/{fr-GK3HQYVB.js → fr-RQFO7U4P.js} +5 -0
  164. package/chunks/{gemini-7FWGOYD4.js → gemini-ZSKNDUMU.js} +77 -65
  165. package/chunks/{geminiContentGenerator-V2WVLIXU.js → geminiContentGenerator-YGEXOEKD.js} +1 -1
  166. package/chunks/{glob-3N6GGI75.js → glob-7KZG44BR.js} +26 -22
  167. package/chunks/{goal-tools-APOW6UXL.js → goal-tools-PXWN5VK3.js} +4 -2
  168. package/chunks/{grep-V43ILZVX.js → grep-6ZFC7RJ5.js} +26 -22
  169. package/chunks/{handleAutoUpdate-A5WFVWIA.js → handleAutoUpdate-KSEL3TQS.js} +30 -26
  170. package/chunks/{i18n-PLVQ4FBZ.js → i18n-ZIUXBW5V.js} +27 -23
  171. package/chunks/{image-gen-7C6IK6DC.js → image-gen-AUIZJJNK.js} +7 -5
  172. package/chunks/{initializer-CVAIKZYL.js → initializer-7AHY3N6Q.js} +33 -29
  173. package/chunks/{installationInfo-J6QDHNTK.js → installationInfo-VGBXMYLY.js} +27 -23
  174. package/chunks/{ja-3FA46IKD.js → ja-KOZKHJHZ.js} +5 -0
  175. package/chunks/{list-ZZ4OUUWV.js → list-PSFKQHLB.js} +36 -32
  176. package/chunks/{list-agents-KFFIIS2G.js → list-agents-Z4WABFDZ.js} +1 -1
  177. package/chunks/{loadedSettingsAdapter-QRYRJSWL.js → loadedSettingsAdapter-FTMRCTOF.js} +33 -29
  178. package/chunks/{loggingContentGenerator-OJCO75HM.js → loggingContentGenerator-MZAN52UV.js} +7 -5
  179. package/chunks/{loop-wakeup-TLMJPMMP.js → loop-wakeup-UZ5RL5Y2.js} +2 -2
  180. package/chunks/{ls-UVVE2XGE.js → ls-TVHDGIES.js} +1 -1
  181. package/chunks/{lsp-QMEA2VLB.js → lsp-CVN6OQPI.js} +1 -1
  182. package/chunks/{managed-npm-update-PCOSCP2N.js → managed-npm-update-O4NHK45X.js} +27 -23
  183. package/chunks/{mcp-M3WKKWKY.js → mcp-6CFP2AYQ.js} +33 -29
  184. package/chunks/{monitor-GN24FH6C.js → monitor-DAKD6OU4.js} +26 -22
  185. package/chunks/{nonInteractiveCli-KPTU3VSQ.js → nonInteractiveCli-RC7VIUZL.js} +66 -60
  186. package/chunks/{notebook-edit-4YM65BBO.js → notebook-edit-474DPMRL.js} +34 -22
  187. package/chunks/{openaiContentGenerator-EDQT6GTV.js → openaiContentGenerator-2NFY2MWO.js} +19 -9
  188. package/chunks/{pidfile-JOIIRN2C.js → pidfile-KBFVDNQP.js} +26 -22
  189. package/chunks/{process-registry-2CHQBXH5.js → process-registry-PMJOA5CO.js} +15 -0
  190. package/chunks/{processUtils-5SV4MX3Q.js → processUtils-6GRYH4Y3.js} +2 -2
  191. package/chunks/{pt-3AOBKPIJ.js → pt-U6AOCTMF.js} +5 -0
  192. package/chunks/{qwenContentGenerator-ODRJSUGR.js → qwenContentGenerator-KAHU6IZY.js} +33 -28
  193. package/chunks/{qwenOAuth2-NESCMZ47.js → qwenOAuth2-RRQTCP4W.js} +7 -5
  194. package/chunks/{read-file-HPSODLPK.js → read-file-3M6WXDXP.js} +6 -4
  195. package/chunks/{read-mcp-resource-2TNSJTC3.js → read-mcp-resource-PZ4ZF6YL.js} +1 -1
  196. package/chunks/{record-artifact-RAON52FC.js → record-artifact-P4HFMS7X.js} +2 -2
  197. package/chunks/{resumeHistoryUtils-TXCOFFMQ.js → resumeHistoryUtils-D6TAY3HX.js} +30 -26
  198. package/chunks/{ripGrep-ZKQGTQAO.js → ripGrep-PLPENT3E.js} +26 -22
  199. package/chunks/{ru-VJRAMC4W.js → ru-CMX4UMYP.js} +5 -0
  200. package/chunks/{run-qwen-serve-ZPKPKECF.js → run-qwen-serve-ZAFIJKJC.js} +168 -54
  201. package/chunks/{runtime-2FLNNM36.js → runtime-ZED7CYOZ.js} +38 -34
  202. package/chunks/{scheduler-365PJHNR.js → scheduler-MD3AL2W5.js} +26 -22
  203. package/chunks/{send-message-ZM7MRUGP.js → send-message-CAMSLG2L.js} +4 -3
  204. package/chunks/{serve-QD2RNLKJ.js → serve-E3VUDRZN.js} +33 -29
  205. package/chunks/{server-XLJVLTYM.js → server-OWMEMAKR.js} +450 -231
  206. package/chunks/{session-3VTUHH4Q.js → session-HZ57QK7K.js} +158 -97
  207. package/chunks/{settings-KULVPCQC.js → settings-V7BR3RKP.js} +32 -28
  208. package/chunks/{shell-3SWW22MH.js → shell-23OMNMW6.js} +26 -22
  209. package/chunks/{skill-KDHWYS7W.js → skill-6HBDYZRS.js} +7 -5
  210. package/chunks/{skill-settings-NMY4JEJC.js → skill-settings-HWJLTU7M.js} +32 -28
  211. package/chunks/{spawnChannel-ZKS4Q5OU.js → spawnChannel-N6KKUW5B.js} +27 -23
  212. package/chunks/{standalone-update-7CXPGAQ4.js → standalone-update-QGIKHATD.js} +28 -24
  213. package/chunks/{startInteractiveUI-2QQLEKM6.js → startInteractiveUI-GX2CRL42.js} +365 -155
  214. package/chunks/{syntheticOutput-ZLCUTKO2.js → syntheticOutput-PEBJQYJV.js} +2 -2
  215. package/chunks/{task-create-CQP5UEA3.js → task-create-5NWCQSJF.js} +5 -4
  216. package/chunks/{task-list-XLEZOJXP.js → task-list-53265TRZ.js} +1 -1
  217. package/chunks/{task-stop-7ZQM5CFF.js → task-stop-FPCOIRYX.js} +1 -1
  218. package/chunks/{task-update-JA75U2SN.js → task-update-5HN577LS.js} +5 -4
  219. package/chunks/{team-create-2WTNGAOX.js → team-create-CFFKU7KL.js} +26 -22
  220. package/chunks/{team-delete-MHY3UZGY.js → team-delete-MMQB4OSC.js} +1 -1
  221. package/chunks/{team-plan-approval-LZTYLEG4.js → team-plan-approval-6EFOKR6A.js} +26 -22
  222. package/chunks/{terminal-image-renderer-R5HHAFJN.js → terminal-image-renderer-TLDNACQY.js} +28 -24
  223. package/chunks/{theme-manager-PAUCSJFF.js → theme-manager-5LJ3H7VO.js} +26 -22
  224. package/chunks/{todoWrite-UPVOHYGD.js → todoWrite-JGV6VLOX.js} +1 -1
  225. package/chunks/{tool-search-2BFCGLI6.js → tool-search-UJV3A24H.js} +9 -6
  226. package/chunks/{total-session-admission-MK4SINFK.js → total-session-admission-D63QYXGO.js} +29 -25
  227. package/chunks/{trustedFolders-TJ5S26N7.js → trustedFolders-KZCOB53W.js} +30 -24
  228. package/chunks/{update-relaunch-N7AYLARF.js → update-relaunch-IFILM3SA.js} +5 -5
  229. package/chunks/{updateCheck-QRZ3DVT5.js → updateCheck-YZ2CRCFC.js} +29 -25
  230. package/chunks/{useAutoAcceptIndicator-DBJ7Y5AF.js → useAutoAcceptIndicator-AXEVNA3Q.js} +35 -31
  231. package/chunks/{validateNonInterActiveAuth-6ZQWUDS3.js → validateNonInterActiveAuth-3WTOJFWA.js} +61 -57
  232. package/chunks/{version-AJQGQWXC.js → version-GXK7OHZY.js} +1 -1
  233. package/chunks/{web-fetch-QWJYRXFL.js → web-fetch-ILB4GAVR.js} +12 -8
  234. package/chunks/{web-search-2AOXJGHU.js → web-search-HKRPGPZZ.js} +8 -6
  235. package/chunks/{workflow-ERH3SJG2.js → workflow-FXIPRQQA.js} +750 -147
  236. package/chunks/{workspace-providers-status-HZ474RA4.js → workspace-providers-status-NYHC7HSR.js} +35 -31
  237. package/chunks/{workspace-registration-store-6EUP4JXG.js → workspace-registration-store-AKEB7OMW.js} +1 -1
  238. package/chunks/{workspace-registry-R4APRRNC.js → workspace-registry-CDAS5TVZ.js} +29 -25
  239. package/chunks/{workspace-service-HFIFDMU7.js → workspace-service-PAMUKMAV.js} +36 -32
  240. package/chunks/{workspace-skills-status-HAHEIHGK.js → workspace-skills-status-YQSHCCMS.js} +33 -29
  241. package/chunks/{workspace-trust-reconciler-65GTAGDK.js → workspace-trust-reconciler-RPTXOIY2.js} +36 -32
  242. package/chunks/{write-file-B34CDELV.js → write-file-CGS57TS4.js} +26 -22
  243. package/chunks/{zh-ARWDLDLR.js → zh-AGL2FVBI.js} +6 -0
  244. package/chunks/{zh-TW-Y4RGI3P7.js → zh-TW-KI66MHQY.js} +6 -0
  245. package/chunks/{zoom-image-HPRBZHSS.js → zoom-image-E7D72GYV.js} +6 -4
  246. package/cli.js +13 -13
  247. package/locales/ca.js +10 -0
  248. package/locales/de.js +9 -0
  249. package/locales/en.js +10 -0
  250. package/locales/fr.js +9 -0
  251. package/locales/ja.js +9 -0
  252. package/locales/pt.js +9 -0
  253. package/locales/ru.js +9 -0
  254. package/locales/zh-TW.js +10 -0
  255. package/locales/zh.js +10 -0
  256. package/package.json +3 -3
  257. package/web-shell/assets/{arc-Ip-FFDJ0.js → arc-DybZaz32.js} +1 -1
  258. package/web-shell/assets/{architectureDiagram-3BPJPVTR-CChqgwIb.js → architectureDiagram-3BPJPVTR-jN3qBd19.js} +1 -1
  259. package/web-shell/assets/{blockDiagram-GPEHLZMM-BHN-Tfss.js → blockDiagram-GPEHLZMM-Ct5DZPrj.js} +1 -1
  260. package/web-shell/assets/{c4Diagram-AAUBKEIU-BhyjzDjN.js → c4Diagram-AAUBKEIU-CUAFMlUG.js} +1 -1
  261. package/web-shell/assets/channel-BMwLrwLW.js +1 -0
  262. package/web-shell/assets/{chunk-2J33WTMH-BB9eyHrx.js → chunk-2J33WTMH-CuV8n90B.js} +1 -1
  263. package/web-shell/assets/{chunk-4BX2VUAB-BeV7ce_J.js → chunk-4BX2VUAB-BUzl_kls.js} +1 -1
  264. package/web-shell/assets/{chunk-55IACEB6-DO7kXDiV.js → chunk-55IACEB6-BnDBLX6A.js} +1 -1
  265. package/web-shell/assets/{chunk-727SXJPM-B27MPznD.js → chunk-727SXJPM-B83uTOjm.js} +1 -1
  266. package/web-shell/assets/{chunk-AQP2D5EJ-DHIjqjD_.js → chunk-AQP2D5EJ-DM3HLgpT.js} +1 -1
  267. package/web-shell/assets/{chunk-FMBD7UC4-DabMqyN2.js → chunk-FMBD7UC4-CSQ5hgyb.js} +1 -1
  268. package/web-shell/assets/{chunk-ND2GUHAM-Dw7Nnnxc.js → chunk-ND2GUHAM-BWOF4SxX.js} +1 -1
  269. package/web-shell/assets/{chunk-QZHKN3VN-DdaZew1Q.js → chunk-QZHKN3VN-BsOH9LMi.js} +1 -1
  270. package/web-shell/assets/classDiagram-4FO5ZUOK-BGDv98jY.js +1 -0
  271. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-BGDv98jY.js +1 -0
  272. package/web-shell/assets/{cose-bilkent-S5V4N54A-CgBpCYH5.js → cose-bilkent-S5V4N54A-IENqH2iJ.js} +1 -1
  273. package/web-shell/assets/{dagre-BM42HDAG-BB4IU8G0.js → dagre-BM42HDAG--dyzDTGo.js} +1 -1
  274. package/web-shell/assets/{diagram-2AECGRRQ-BcUTHU37.js → diagram-2AECGRRQ-BE7Dcqof.js} +1 -1
  275. package/web-shell/assets/{diagram-5GNKFQAL-B6Lyihyv.js → diagram-5GNKFQAL-Cr8-5OTj.js} +1 -1
  276. package/web-shell/assets/{diagram-KO2AKTUF-CRIJOjpG.js → diagram-KO2AKTUF-Bzey3uAY.js} +1 -1
  277. package/web-shell/assets/{diagram-LMA3HP47-DdNiwWWT.js → diagram-LMA3HP47-sErl28Xb.js} +1 -1
  278. package/web-shell/assets/{diagram-OG6HWLK6-Dz4b32Do.js → diagram-OG6HWLK6-Dq30ATIo.js} +1 -1
  279. package/web-shell/assets/{erDiagram-TEJ5UH35-D-8NGw77.js → erDiagram-TEJ5UH35-BkCoEfVW.js} +1 -1
  280. package/web-shell/assets/{flowDiagram-I6XJVG4X-Dun26LyM.js → flowDiagram-I6XJVG4X-DHwO0rrI.js} +1 -1
  281. package/web-shell/assets/{ganttDiagram-6RSMTGT7-F10Hu1Gc.js → ganttDiagram-6RSMTGT7-s7vAPxWq.js} +1 -1
  282. package/web-shell/assets/{gitGraphDiagram-PVQCEYII-Bf8Ez6-D.js → gitGraphDiagram-PVQCEYII-CQxhwPOU.js} +1 -1
  283. package/web-shell/assets/index-Bckpjr-I.css +5 -0
  284. package/web-shell/assets/{index-BXqw-nGq.js → index-CF4wApWp.js} +1 -1
  285. package/web-shell/assets/index-DwEr9HEW.js +1768 -0
  286. package/web-shell/assets/{infoDiagram-5YYISTIA-DVgTMLvj.js → infoDiagram-5YYISTIA-BnFrD0bq.js} +1 -1
  287. package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-uT-KepvK.js → ishikawaDiagram-YF4QCWOH-Bf9zK5NK.js} +1 -1
  288. package/web-shell/assets/{journeyDiagram-JHISSGLW-Vg_XadQf.js → journeyDiagram-JHISSGLW-CyGAhsxi.js} +1 -1
  289. package/web-shell/assets/{kanban-definition-UN3LZRKU-Dyv1ESBE.js → kanban-definition-UN3LZRKU-CbsK5akB.js} +1 -1
  290. package/web-shell/assets/{linear-BMIepYX3.js → linear-cQsF4P8D.js} +1 -1
  291. package/web-shell/assets/{mermaid.core-zA8pJ9ag.js → mermaid.core-Z4HVqrKY.js} +5 -5
  292. package/web-shell/assets/{mindmap-definition-RKZ34NQL-BCW_BZ_5.js → mindmap-definition-RKZ34NQL-CYnrBo_f.js} +1 -1
  293. package/web-shell/assets/{pieDiagram-4H26LBE5-DseNEGp2.js → pieDiagram-4H26LBE5-CBzOfhrs.js} +1 -1
  294. package/web-shell/assets/{quadrantDiagram-W4KKPZXB-6Z7wr1Fi.js → quadrantDiagram-W4KKPZXB-D4LK1Ebn.js} +1 -1
  295. package/web-shell/assets/{requirementDiagram-4Y6WPE33-CVOlCRPf.js → requirementDiagram-4Y6WPE33-Bzti2Lcj.js} +1 -1
  296. package/web-shell/assets/{sankeyDiagram-5OEKKPKP-CGhgrUJZ.js → sankeyDiagram-5OEKKPKP-yTBw5Z2s.js} +1 -1
  297. package/web-shell/assets/{sequenceDiagram-3UESZ5HK-dlqmpLuQ.js → sequenceDiagram-3UESZ5HK-D07UVRiZ.js} +1 -1
  298. package/web-shell/assets/{stateDiagram-AJRCARHV-B9EW10Xb.js → stateDiagram-AJRCARHV-UE_lHsTn.js} +1 -1
  299. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-DC6xgXjX.js +1 -0
  300. package/web-shell/assets/{timeline-definition-PNZ67QCA-BBRh0mgZ.js → timeline-definition-PNZ67QCA-DRvYdiTs.js} +1 -1
  301. package/web-shell/assets/{vennDiagram-CIIHVFJN-B8Gs-REP.js → vennDiagram-CIIHVFJN-CQLIXs0u.js} +1 -1
  302. package/web-shell/assets/{wardley-L42UT6IY-D_y80Ur7.js → wardley-L42UT6IY-JZz_Xqse.js} +1 -1
  303. package/web-shell/assets/{wardleyDiagram-YWT4CUSO-D-CNfHJ-.js → wardleyDiagram-YWT4CUSO--i7BiJwB.js} +1 -1
  304. package/web-shell/assets/{xychartDiagram-2RQKCTM6-DQ5CvELo.js → xychartDiagram-2RQKCTM6-Bkc-bW0S.js} +1 -1
  305. package/web-shell/index.html +2 -2
  306. package/chunks/chunk-6PEXNQTX.js +0 -68
  307. package/chunks/chunk-IUFV6FYU.js +0 -81
  308. package/web-shell/assets/channel-Cu8qd6OB.js +0 -1
  309. package/web-shell/assets/classDiagram-4FO5ZUOK-BI3KrXhq.js +0 -1
  310. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-BI3KrXhq.js +0 -1
  311. package/web-shell/assets/index-QQlUCJGg.css +0 -5
  312. package/web-shell/assets/index-hcgjV7vS.js +0 -1768
  313. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-CJTZJJ5X.js +0 -1
  314. 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, or null if the pending cap is reached.
170
- * If the sender already has a non-expired pending request, returns that code.
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((r) => r.senderId === senderId);
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 null;
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 sender ID if found, or null if not found / expired.
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
- return JSON.parse(data);
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
- constructor(policy = "disabled", groups = {}) {
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. mention gating (requireMention + not mentioned → drop silently)
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
- * Mention gating runs before sender gate so that unmentioned messages
1081
- * in groups don't trigger pairing flows.
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 code = this.pairingStore?.createRequest(senderId, senderName || senderId);
1414
- return { allowed: false, pairingCode: code ?? null };
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
- this.groupGate = new GroupGate(config.groupPolicy, config.groups);
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
- return this.groupHistory.drain(this.groupHistoryKey(envelope), limit);
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.pairingCode !== void 0) {
5713
+ if (result.pairing !== void 0) {
5596
5714
  this.logPreflightRejected("sender_pairing_required");
5597
- return this.onPairingRequired(envelope.chatId, result.pairingCode, envelope.threadId).then(() => false).catch((err) => {
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
- async onPairingRequired(chatId, code, threadId) {
6102
- if (code) {
6103
- await this.sendThreadMessage(chatId, threadId, `Your pairing code is: ${code}
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, "Too many pending pairing requests. Please try again later.");
6278
+ await this.sendThreadMessage(chatId, threadId, this.groupPairingRejectionMessage(result.rejected));
6109
6279
  }
6110
6280
  }
6111
6281
  };
@@ -5,7 +5,7 @@ import {
5
5
  isTranscribableVoiceModel,
6
6
  readVoiceLanguage,
7
7
  resolveVoiceTransport
8
- } from "./chunk-55LYDVPU.js";
8
+ } from "./chunk-C5VWPTGT.js";
9
9
  import {
10
10
  resolvePath
11
11
  } from "./chunk-AOHJKPKL.js";
@@ -11,11 +11,11 @@ import {
11
11
  } from "./chunk-NLREQJFK.js";
12
12
  import {
13
13
  loadSettings
14
- } from "./chunk-PQBHU2IA.js";
14
+ } from "./chunk-OHKJVAKG.js";
15
15
  import {
16
16
  SkillManager,
17
17
  isSafeModeEnv
18
- } from "./chunk-Y7E5LNLO.js";
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-OHJLEW5J.js";
5
+ } from "./chunk-QQWD7LZV.js";
6
6
  import {
7
7
  parseChannelConfig
8
- } from "./chunk-ZXU5UHMI.js";
8
+ } from "./chunk-QXVSWG66.js";
9
9
  import {
10
10
  getPlugin,
11
11
  registerPlugin
12
- } from "./chunk-IUFV6FYU.js";
12
+ } from "./chunk-NGYI5EF5.js";
13
13
  import {
14
14
  sanitizeLogText
15
- } from "./chunk-DIEFUBV6.js";
15
+ } from "./chunk-DIWZNWZT.js";
16
16
  import {
17
17
  loadSettings
18
- } from "./chunk-PQBHU2IA.js";
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-TDXGKHDN.js";
5
+ } from "./chunk-IYES5WOT.js";
6
6
  import {
7
7
  extensionToOutputString,
8
8
  getExtensionManager
9
- } from "./chunk-OHJLEW5J.js";
9
+ } from "./chunk-QQWD7LZV.js";
10
10
  import {
11
11
  loadSettings
12
- } from "./chunk-PQBHU2IA.js";
12
+ } from "./chunk-OHKJVAKG.js";
13
13
  import {
14
14
  initializeI18n,
15
15
  resolveLanguageSetting,
16
16
  t
17
- } from "./chunk-DBOFL3LQ.js";
17
+ } from "./chunk-PG62DFWD.js";
18
18
  import {
19
19
  writeStderrLine,
20
20
  writeStdoutLine
@@ -2,7 +2,7 @@
2
2
  "use strict";
3
3
  import {
4
4
  wrapForMultiplexer
5
- } from "./chunk-22NBYCPD.js";
5
+ } from "./chunk-3P2LV43B.js";
6
6
  import {
7
7
  createDebugLogger
8
8
  } from "./chunk-OIVKILPI.js";
@@ -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
+ */
@@ -14,7 +14,7 @@ import {
14
14
  init_esbuild_shims();
15
15
  async function getCliVersion() {
16
16
  const pkgJson = await getPackageJson();
17
- return "0.21.7";
17
+ return "0.21.8";
18
18
  }
19
19
  __name(getCliVersion, "getCliVersion");
20
20
 
@@ -2,13 +2,13 @@
2
2
  "use strict";
3
3
  import {
4
4
  t
5
- } from "./chunk-DBOFL3LQ.js";
5
+ } from "./chunk-PG62DFWD.js";
6
6
  import {
7
7
  SessionReferenceService,
8
8
  SessionService,
9
9
  readManyFiles,
10
10
  stripTerminalControlSequences
11
- } from "./chunk-Y7E5LNLO.js";
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-2U3WZGZG.js";
19
+ } from "./chunk-3PY4LPJF.js";
20
20
  import {
21
21
  Storage,
22
22
  getErrorMessage,