@xmanrui/dsh-im 4.2.1 → 4.4.0

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 (74) hide show
  1. package/README.en.md +4 -2
  2. package/README.md +4 -2
  3. package/lib/client.js +1267 -787
  4. package/lib/index.js +237 -235
  5. package/package.json +1 -1
  6. package/plugin-src/client/access-policy-settings.js +351 -0
  7. package/plugin-src/client/channel-card-meta.js +2 -1
  8. package/plugin-src/client/channels/dingtalk/api.js +5 -0
  9. package/plugin-src/client/channels/dingtalk/index.js +1 -0
  10. package/plugin-src/client/channels/feishu/api.js +5 -0
  11. package/plugin-src/client/channels/feishu/index.js +1 -0
  12. package/plugin-src/client/channels/qq/api.js +5 -0
  13. package/plugin-src/client/channels/qq/index.js +1 -0
  14. package/plugin-src/client/channels/shared/token-api.js +5 -0
  15. package/plugin-src/client/channels/shared/token-channel.js +1 -0
  16. package/plugin-src/client/channels/telegram/api.js +2 -17
  17. package/plugin-src/client/channels/telegram/index.js +0 -112
  18. package/plugin-src/client/channels/telegram/styles.js +0 -28
  19. package/plugin-src/client/channels/wecom/api.js +5 -0
  20. package/plugin-src/client/channels/wecom/index.js +1 -0
  21. package/plugin-src/client/channels/weixin/api.js +5 -0
  22. package/plugin-src/client/channels/weixin/index.js +1 -0
  23. package/plugin-src/client/channels/whatsapp/api.js +4 -10
  24. package/plugin-src/client/channels/whatsapp/index.js +1 -125
  25. package/plugin-src/client/channels/whatsapp/styles.js +0 -25
  26. package/plugin-src/client/context-enhancement.js +207 -102
  27. package/plugin-src/client/delivery-settings.js +61 -9
  28. package/plugin-src/client/i18n.js +71 -3
  29. package/plugin-src/client/index.js +1 -0
  30. package/plugin-src/client/styles.js +59 -8
  31. package/plugin-src/host/channels/dingtalk/production.mjs +12 -1
  32. package/plugin-src/host/channels/dingtalk/rpc.mjs +11 -0
  33. package/plugin-src/host/channels/feishu/production.mjs +39 -1
  34. package/plugin-src/host/channels/feishu/rpc.mjs +19 -2
  35. package/plugin-src/host/channels/qq/production.mjs +12 -1
  36. package/plugin-src/host/channels/qq/rpc.mjs +11 -0
  37. package/plugin-src/host/channels/shared/access-policy-production.mjs +137 -0
  38. package/plugin-src/host/channels/shared/access-policy-rpc.mjs +17 -0
  39. package/plugin-src/host/channels/shared/production.mjs +15 -1
  40. package/plugin-src/host/channels/shared/rpc.mjs +9 -0
  41. package/plugin-src/host/channels/slack/production.mjs +12 -1
  42. package/plugin-src/host/channels/slack/rpc.mjs +10 -0
  43. package/plugin-src/host/channels/telegram/rpc.mjs +2 -49
  44. package/plugin-src/host/channels/wecom/production.mjs +12 -1
  45. package/plugin-src/host/channels/wecom/rpc.mjs +11 -0
  46. package/plugin-src/host/channels/weixin/production.mjs +12 -1
  47. package/plugin-src/host/channels/weixin/rpc.mjs +11 -0
  48. package/plugin-src/host/channels/whatsapp/production.mjs +16 -2
  49. package/plugin-src/host/channels/whatsapp/rpc.mjs +10 -15
  50. package/scripts/verify-package.mjs +4 -3
  51. package/src/channels/dingtalk/dingtalk-bridge.mjs +61 -9
  52. package/src/channels/dingtalk/dingtalk-runtime.mjs +4 -0
  53. package/src/channels/discord/discord-runtime.mjs +29 -1
  54. package/src/channels/feishu/bridge.mjs +286 -120
  55. package/src/channels/feishu/feishu-runtime.mjs +4 -0
  56. package/src/channels/feishu/message-utils.mjs +5 -0
  57. package/src/channels/qq/qq-bridge.mjs +59 -17
  58. package/src/channels/qq/qq-runtime.mjs +25 -3
  59. package/src/channels/shared/access-policy.mjs +210 -0
  60. package/src/channels/shared/bot-workspace-store.mjs +176 -33
  61. package/src/channels/shared/command-permission.mjs +32 -0
  62. package/src/channels/shared/compact-command.mjs +5 -2
  63. package/src/channels/shared/context-enhancement.mjs +73 -20
  64. package/src/channels/shared/i18n-en/shared-c.mjs +2 -0
  65. package/src/channels/shared/inbound-access.mjs +43 -0
  66. package/src/channels/shared/text-harness-bridge.mjs +47 -4
  67. package/src/channels/shared/workspace-command.mjs +10 -1
  68. package/src/channels/slack/slack-runtime.mjs +4 -0
  69. package/src/channels/telegram/telegram-runtime.mjs +5 -13
  70. package/src/channels/wecom/wecom-bridge.mjs +51 -4
  71. package/src/channels/wecom/wecom-runtime.mjs +4 -0
  72. package/src/channels/weixin/weixin-bridge.mjs +59 -16
  73. package/src/channels/weixin/weixin-runtime.mjs +4 -0
  74. package/src/channels/whatsapp/whatsapp-runtime.mjs +42 -20
@@ -3,6 +3,7 @@ import { fetchFileStream } from '../shared/file-download.mjs';
3
3
  import { fetchImageBuffer } from '../shared/image-prompt.mjs';
4
4
  import { t } from '../shared/i18n.mjs';
5
5
  import { captureContextEnhancement } from '../shared/context-enhancement.mjs';
6
+ import { evaluateInboundAccess } from '../shared/inbound-access.mjs';
6
7
  import { DiscordApi } from './discord-api.mjs';
7
8
  import { createDiscordBridgeStatus, DiscordHarnessBridge } from './discord-bridge.mjs';
8
9
 
@@ -433,6 +434,7 @@ export class DiscordRuntime {
433
434
  #harness;
434
435
  #state;
435
436
  #contextEnhancement;
437
+ #accessPolicy;
436
438
  #logger;
437
439
  #replyTimeoutMs;
438
440
  #connectTimeoutMs;
@@ -464,6 +466,7 @@ export class DiscordRuntime {
464
466
  harness,
465
467
  state,
466
468
  contextEnhancement,
469
+ accessPolicy,
467
470
  logger = console,
468
471
  replyTimeoutMs = 600_000,
469
472
  connectTimeoutMs = 20_000,
@@ -480,6 +483,7 @@ export class DiscordRuntime {
480
483
  this.#harness = harness;
481
484
  this.#state = state;
482
485
  this.#contextEnhancement = contextEnhancement;
486
+ this.#accessPolicy = accessPolicy;
483
487
  this.#logger = logger;
484
488
  this.#replyTimeoutMs = replyTimeoutMs;
485
489
  this.#connectTimeoutMs = connectTimeoutMs;
@@ -559,6 +563,7 @@ export class DiscordRuntime {
559
563
  harness: this.#harness,
560
564
  state: this.#state,
561
565
  contextEnhancement: this.#contextEnhancement,
566
+ accessPolicy: this.#accessPolicy,
562
567
  status: this.#status,
563
568
  logger: this.#logger,
564
569
  replyTimeoutMs: this.#replyTimeoutMs,
@@ -730,6 +735,24 @@ export class DiscordRuntime {
730
735
  async #acceptMessage(message, bridge) {
731
736
  const messageId = String(message?.id ?? '');
732
737
  if (!messageId || this.#state.hasSeen(messageId)) return;
738
+ const preflight = normalizeDiscordMessage(message, this.#config.platformId);
739
+ let accessDecision;
740
+ if (preflight?.kind === 'group' && preflight.addressed === true
741
+ && preflight.senderIsBot !== true) {
742
+ accessDecision = evaluateInboundAccess(this.#accessPolicy, {
743
+ conversationType: 'group',
744
+ senderIds: [preflight.senderId],
745
+ text: preflight.content,
746
+ hasImages: preflight.images.length > 0,
747
+ hasFiles: preflight.files.length > 0,
748
+ });
749
+ if (!accessDecision.allowed) {
750
+ // Let the shared bridge apply its normal silent/command-denial behavior,
751
+ // but do so against the source channel before creating a Thread.
752
+ await bridge.accept(preflight, { accessDecision });
753
+ return;
754
+ }
755
+ }
733
756
  let route = this.#routing.get(messageId);
734
757
  if (!route) {
735
758
  const contextSnapshot = captureContextEnhancement(
@@ -750,7 +773,12 @@ export class DiscordRuntime {
750
773
  }
751
774
  try {
752
775
  const normalized = await route.pendingRoute;
753
- if (normalized) await bridge.accept(normalized, { contextSnapshot: route.contextSnapshot });
776
+ if (normalized) {
777
+ await bridge.accept(normalized, {
778
+ contextSnapshot: route.contextSnapshot,
779
+ ...(accessDecision ? { accessDecision } : {}),
780
+ });
781
+ }
754
782
  } catch (error) {
755
783
  if (error?.code === 'discord-thread-create-uncertain') {
756
784
  await this.#state.markSeen(messageId);