@qwen-code/channel-base 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 CHANGED
@@ -120,7 +120,7 @@ Everything between `handleInbound()` and `sendMessage()` is handled by the base
120
120
  | `ChannelPlugin` | Plugin factory interface (what you export) |
121
121
  | `Envelope` | Normalized inbound message format |
122
122
  | `SenderPolicy` | `'allowlist' \| 'pairing' \| 'open'` |
123
- | `GroupPolicy` | `'disabled' \| 'allowlist' \| 'open'` |
123
+ | `GroupPolicy` | `'disabled' \| 'allowlist' \| 'pairing' \| 'open'` |
124
124
  | `SessionScope` | `'user' \| 'thread' \| 'single'` |
125
125
  | `GroupConfig` | Per-group settings (e.g. `requireMention`) |
126
126
  | `SessionTarget` | Maps a session back to its channel/sender/chat |
@@ -263,9 +263,9 @@ constructor(bridge: ChannelAgentBridge, defaultCwd: string, scope?: SessionScope
263
263
  constructor(policy: SenderPolicy, allowedUsers?: string[], pairingStore?: PairingStore)
264
264
  ```
265
265
 
266
- | Method | Description |
267
- | ------------------------------ | ------------------------------------------------------------ |
268
- | `check(senderId, senderName?)` | Returns `{ allowed: boolean, pairingCode?: string \| null }` |
266
+ | Method | Description |
267
+ | ------------------------------ | -------------------------------------------------------------------- |
268
+ | `check(senderId, senderName?)` | Returns `{ allowed: boolean, pairing?: CreatePairingRequestResult }` |
269
269
 
270
270
  **Policy behavior:**
271
271
 
@@ -278,12 +278,12 @@ constructor(policy: SenderPolicy, allowedUsers?: string[], pairingStore?: Pairin
278
278
  ### GroupGate
279
279
 
280
280
  ```typescript
281
- constructor(policy?: GroupPolicy, groups?: Record<string, GroupConfig>)
281
+ constructor(policy?: GroupPolicy, groups?: Record<string, GroupConfig>, pairingStore?: PairingStore)
282
282
  ```
283
283
 
284
- | Method | Description |
285
- | ----------------- | ---------------------------------------------------------------------------------------------- |
286
- | `check(envelope)` | Returns `{ allowed: boolean, reason?: 'disabled' \| 'not_allowlisted' \| 'mention_required' }` |
284
+ | Method | Description |
285
+ | --------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
286
+ | `check(envelope, options?)` | Returns the group policy decision and an optional pairing result. Under `pairing`, a mention/reply from an unapproved group creates (or reuses) a pending pairing request; pass `{ createPairingRequest: false }` for read-only probes |
287
287
 
288
288
  **Policy behavior:**
289
289
 
@@ -291,6 +291,7 @@ constructor(policy?: GroupPolicy, groups?: Record<string, GroupConfig>)
291
291
  | ----------- | ---------------------------------------- |
292
292
  | `disabled` | All group messages rejected |
293
293
  | `allowlist` | Only groups listed in config are allowed |
294
+ | `pairing` | A group must be approved once by chat ID |
294
295
  | `open` | All groups allowed |
295
296
 
296
297
  When `requireMention` is `true` (default), group messages are only processed if the bot is @mentioned or the message is a reply to the bot.
@@ -301,16 +302,20 @@ When `requireMention` is `true` (default), group messages are only processed if
301
302
  constructor(channelName: string, workspaceCwd?: string)
302
303
  ```
303
304
 
304
- Persists pairing state to `{channelName}-pairing.json` and `{channelName}-allowlist.json`. With `workspaceCwd` (what `ChannelBase` passes — the channel's `cwd`), the files live under the workspace-scoped directory `~/.qwen/channels/<workspace-scope>/` so two workspaces reusing the same channel name never share pairing requests or allowlist entries. Without it, the legacy global `~/.qwen/channels/` layout is used. The first time a given (workspace, channel) pair is constructed, existing legacy global files are copied in once (grandfathering) so already-approved senders stay approved; a per-channel `<channel>.migrated` sentinel in the scope directory marks that decision, after which legacy files are never consulted again for that channel. Channel names are URI-encoded in file names, so a name containing path separators cannot escape the scope directory. `revoke(senderId)` removes the sender only from this store's allowlist and never mutates the legacy global baseline.
305
-
306
- | Method | Description |
307
- | ------------------------------------- | --------------------------------------------------------------------------------------------------------- |
308
- | `createRequest(senderId, senderName)` | Generate an 8-char pairing code (or return existing). Returns `null` if 3 pending requests already exist. |
309
- | `approve(code)` | Approve a pairing request, adds sender to allowlist. Returns the request or `null`. |
310
- | `isApproved(senderId)` | Check if sender is in the approved allowlist |
311
- | `listPending()` | Get active (non-expired) pending requests |
312
- | `getAllowlist()` | Get approved sender IDs |
313
- | `revoke(senderId)` | Remove an approved sender. Returns whether the sender was present. |
305
+ Persists pending pairing state to `{channelName}-pairing.json`, user approvals to `{channelName}-allowlist.json`, and group approvals to `{channelName}-groups.json`. With `workspaceCwd` (what `ChannelBase` passes — the channel's `cwd`), the files live under the workspace-scoped directory `~/.qwen/channels/<workspace-scope>/` so two workspaces reusing the same channel name never share pairing requests or allowlist entries. Without it, the legacy global `~/.qwen/channels/` layout is used. The first time a given (workspace, channel) pair is constructed, existing legacy global files are copied in once (grandfathering) so already-approved senders stay approved; a per-channel `<channel>.migrated` sentinel in the scope directory marks that decision, after which legacy files are never consulted again for that channel. Channel names are URI-encoded in file names, so a name containing path separators cannot escape the scope directory. `revoke(senderId)` removes the sender only from this store's allowlist and never mutates the legacy global baseline.
306
+
307
+ | Method | Description |
308
+ | ------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
309
+ | `createRequest(senderId, senderName)` | Generate an 8-char pairing code (or return the existing one). Returns `{ rejected: 'sender_pending' }` if the sender already holds a request, or `{ rejected: 'cap_reached' }` if 3 requests are already pending. |
310
+ | `createGroupRequest(...)` | Generate a request keyed by stable group ID and record its initiating sender. |
311
+ | `approve(code)` | Approve a user or group request and update its corresponding allowlist. |
312
+ | `isApproved(senderId)` | Check if sender is in the approved allowlist |
313
+ | `isGroupApproved(groupId)` | Check if a group is approved |
314
+ | `listPending()` | Get active (non-expired) pending requests |
315
+ | `getAllowlist()` | Get approved sender IDs |
316
+ | `getGroupAllowlist()` | Get approved group IDs |
317
+ | `revoke(senderId)` | Remove an approved sender. Returns whether the sender was present. |
318
+ | `revokeGroup(groupId)` | Remove an approved group. Returns whether the group was present. |
314
319
 
315
320
  ## Envelope
316
321
 
@@ -1,7 +1,8 @@
1
- import type { ChannelConfig, ChannelMemoryCallbacks, ChannelMemoryIntentClassifier, ChannelOutputSegmentContext, ChannelOutputSegmentEndReason, ChannelProactiveTarget, ChannelRuntimeIdentity, ChannelRuntimeMemoryScope, ChannelTaskLifecycleEvent, ChannelUserInputRequestContext, Envelope, ObservedChannelContactObservation, SessionTarget, UserInputPresentationResult } from './types.js';
1
+ import type { ChannelConfig, ChannelMemoryCallbacks, ChannelMemoryIntentClassifier, ChannelOutputSegmentContext, ChannelOutputSegmentEndReason, ChannelProactiveTarget, ChannelRuntimeIdentity, ChannelRuntimeMemoryScope, ChannelTaskLifecycleEvent, ChannelUserInputRequestContext, Envelope, ObservedChannelContactGraph, ObservedChannelContactObservation, SessionTarget, UserInputPresentationResult } from './types.js';
2
2
  import { GroupGate } from './GroupGate.js';
3
3
  import { DmGate } from './DmGate.js';
4
4
  import { SenderGate } from './SenderGate.js';
5
+ import type { CreatePairingRequestResult } from './PairingStore.js';
5
6
  import { SessionRouter } from './SessionRouter.js';
6
7
  import type { ChannelAgentBridge, PermissionRequestEvent, PermissionResolvedEvent, ToolCallEvent } from './ChannelAgentBridge.js';
7
8
  import type { ChannelLoop, ChannelLoopInput } from './ChannelLoopStore.js';
@@ -42,6 +43,8 @@ export interface ChannelBaseOptions {
42
43
  loopController?: ChannelLoopController;
43
44
  observedContacts?: {
44
45
  observe(channelName: string, observation: ObservedChannelContactObservation): void | Promise<void>;
46
+ /** Read persisted observations so adapters can hydrate label caches. */
47
+ list?(): ObservedChannelContactGraph;
45
48
  };
46
49
  }
47
50
  export interface ChannelLoopController {
@@ -81,6 +84,7 @@ export declare abstract class ChannelBase {
81
84
  private readonly memoryIntentClassifier?;
82
85
  private readonly channelMemoryRecallObserver?;
83
86
  private groupHistory;
87
+ private readonly groupPairingNotified;
84
88
  private readonly loopController?;
85
89
  private readonly observedContacts?;
86
90
  private readonly observedContactEnvelopes;
@@ -394,7 +398,14 @@ export declare abstract class ChannelBase {
394
398
  protected logPreflightRejected(reason: string): void;
395
399
  protected logDebugPayload(platform: string, payload: unknown): void;
396
400
  handleInbound(envelope: Envelope): Promise<void>;
397
- private recordObservedContact;
401
+ protected recordObservedContact(envelope: Envelope): Promise<void>;
402
+ protected onObservedContact(_envelope: Envelope): void;
403
+ /**
404
+ * Observations persisted for this channel, when a read path is configured.
405
+ * Adapters hydrate label caches from it after a restart so known labels are
406
+ * not reverted to raw IDs by the next initial write.
407
+ */
408
+ protected persistedObservedContacts(): ObservedChannelContactGraph | undefined;
398
409
  protected markPreflighted(envelope: Envelope): void;
399
410
  /** Wait until the currently active bridge recovery, if any, has completed. */
400
411
  private waitForBridgeRecovery;
@@ -406,7 +417,10 @@ export declare abstract class ChannelBase {
406
417
  * already preflighted, such as during collect-buffer drain.
407
418
  */
408
419
  protected processInbound(envelope: Envelope): Promise<void>;
409
- protected onPairingRequired(chatId: string, code: string | null, threadId?: string): Promise<void>;
420
+ private pairingRejectionMessage;
421
+ private groupPairingRejectionMessage;
422
+ protected onPairingRequired(chatId: string, result: CreatePairingRequestResult, threadId?: string): Promise<void>;
423
+ protected onGroupPairingRequired(chatId: string, result: CreatePairingRequestResult, threadId?: string): Promise<void>;
410
424
  }
411
425
  export {};
412
426
  //# sourceMappingURL=ChannelBase.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChannelBase.d.ts","sourceRoot":"","sources":["../src/ChannelBase.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ChannelBase.d.ts","sourceRoot":"","sources":["../src/ChannelBase.ts"],"names":[],"mappings":"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"}
@@ -114,6 +114,11 @@ export class ChannelBase {
114
114
  memoryIntentClassifier;
115
115
  channelMemoryRecallObserver;
116
116
  groupHistory;
117
+ // Tracks the pairing code already announced per group so repeated triggers
118
+ // of the same pending request (extra mentions, parallel notification lanes)
119
+ // post the public notification once. In-memory by design: a restart can
120
+ // re-post once per still-pending request, but never per trigger.
121
+ groupPairingNotified = new Map();
117
122
  loopController;
118
123
  observedContacts;
119
124
  observedContactEnvelopes = new WeakSet();
@@ -454,13 +459,13 @@ export class ChannelBase {
454
459
  this.loopController = options?.loopController;
455
460
  this.observedContacts = options?.observedContacts;
456
461
  this.bridgeRecovery = options?.bridgeRecovery;
457
- this.groupGate = new GroupGate(config.groupPolicy, config.groups);
458
- this.dmGate = new DmGate(config.dmPolicy);
459
462
  // Scoped by the channel's workspace cwd: two workspaces reusing the same
460
463
  // channel name must not share pairing/allowlist state (#7017).
461
- const pairingStore = config.senderPolicy === 'pairing'
464
+ const pairingStore = config.senderPolicy === 'pairing' || config.groupPolicy === 'pairing'
462
465
  ? new PairingStore(name, config.cwd)
463
466
  : undefined;
467
+ this.groupGate = new GroupGate(config.groupPolicy, config.groups, pairingStore);
468
+ this.dmGate = new DmGate(config.dmPolicy);
464
469
  this.gate = new SenderGate(config.senderPolicy, config.allowedUsers, pairingStore);
465
470
  this.router =
466
471
  options?.router ||
@@ -879,6 +884,7 @@ export class ChannelBase {
879
884
  text: coalesced,
880
885
  alreadyPrefixed: true,
881
886
  referencedText: undefined,
887
+ mentionedMemberIds: undefined,
882
888
  attachments: undefined,
883
889
  metadata: undefined,
884
890
  imageBase64: undefined,
@@ -2438,9 +2444,11 @@ export class ChannelBase {
2438
2444
  isMentioned: true,
2439
2445
  isReplyToBot: true,
2440
2446
  };
2441
- return (this.groupGate.check(envelope).allowed &&
2447
+ return (this.groupGate.check(envelope, { createPairingRequest: false }).allowed &&
2442
2448
  this.dmGate.check(envelope).allowed &&
2443
- this.gate.isAllowed(normalizedTarget.senderId) &&
2449
+ (normalizedTarget.isGroup && this.config.groupPolicy === 'pairing'
2450
+ ? true
2451
+ : this.gate.isAllowed(normalizedTarget.senderId)) &&
2444
2452
  this.isAuthorizedForSharedSession(envelope));
2445
2453
  }
2446
2454
  /** Check if a message text matches a registered local command. */
@@ -3219,7 +3227,8 @@ export class ChannelBase {
3219
3227
  return;
3220
3228
  }
3221
3229
  const senderId = truncateGroupHistoryField(envelope.senderId);
3222
- if (!this.gate.isAllowed(senderId)) {
3230
+ if (this.config.groupPolicy !== 'pairing' &&
3231
+ !this.gate.isAllowed(senderId)) {
3223
3232
  return;
3224
3233
  }
3225
3234
  const entry = {
@@ -3244,7 +3253,12 @@ export class ChannelBase {
3244
3253
  return [];
3245
3254
  }
3246
3255
  try {
3247
- return this.groupHistory.drain(this.groupHistoryKey(envelope), limit);
3256
+ const entries = this.groupHistory.drain(this.groupHistoryKey(envelope), limit);
3257
+ if (this.config.groupPolicy === 'pairing' &&
3258
+ !this.groupGate.isGroupApproved(envelope.chatId)) {
3259
+ return [];
3260
+ }
3261
+ return entries;
3248
3262
  }
3249
3263
  catch (err) {
3250
3264
  process.stderr.write(`[${this.name}] failed to drain group history for chat ${sanitizeLogText(envelope.chatId, 64)}: ${err instanceof Error ? err.message : err}\n`);
@@ -3271,7 +3285,9 @@ export class ChannelBase {
3271
3285
  if (entries.length === 0) {
3272
3286
  return promptText;
3273
3287
  }
3274
- const lines = entries.filter((entry) => this.gate.isAllowed(entry.senderId));
3288
+ const lines = this.config.groupPolicy === 'pairing'
3289
+ ? entries
3290
+ : entries.filter((entry) => this.gate.isAllowed(entry.senderId));
3275
3291
  if (lines.length === 0) {
3276
3292
  return promptText;
3277
3293
  }
@@ -3285,10 +3301,22 @@ export class ChannelBase {
3285
3301
  preflightInbound(envelope) {
3286
3302
  const groupResult = this.groupGate.check(envelope);
3287
3303
  if (!groupResult.allowed) {
3304
+ if (groupResult.pairing !== undefined) {
3305
+ this.logPreflightRejected('group_pairing_required');
3306
+ return this.onGroupPairingRequired(envelope.chatId, groupResult.pairing, envelope.threadId)
3307
+ .then(() => false)
3308
+ .catch((err) => {
3309
+ process.stderr.write(`[Channel:${this.name}] group pairing notification failed: ${sanitizeLogText(err instanceof Error ? err.message : String(err), 200)}\n`);
3310
+ return false;
3311
+ });
3312
+ }
3288
3313
  if (groupResult.reason === 'mention_required') {
3289
3314
  // This is the expected high-frequency drop path for group bots.
3290
3315
  this.recordPendingGroupHistory(envelope);
3291
3316
  }
3317
+ else if (groupResult.reason === 'pairing_trigger_required') {
3318
+ return false;
3319
+ }
3292
3320
  else {
3293
3321
  this.logPreflightRejected(`group_${groupResult.reason ?? 'denied'}`);
3294
3322
  }
@@ -3299,11 +3327,15 @@ export class ChannelBase {
3299
3327
  this.logPreflightRejected(`dm_${dmResult.reason ?? 'denied'}`);
3300
3328
  return false;
3301
3329
  }
3330
+ if (envelope.isGroup && this.config.groupPolicy === 'pairing') {
3331
+ this.markPreflighted(envelope);
3332
+ return true;
3333
+ }
3302
3334
  const result = this.gate.check(envelope.senderId, envelope.senderName);
3303
3335
  if (!result.allowed) {
3304
- if (result.pairingCode !== undefined) {
3336
+ if (result.pairing !== undefined) {
3305
3337
  this.logPreflightRejected('sender_pairing_required');
3306
- return this.onPairingRequired(envelope.chatId, result.pairingCode, envelope.threadId)
3338
+ return this.onPairingRequired(envelope.chatId, result.pairing, envelope.threadId)
3307
3339
  .then(() => false)
3308
3340
  .catch((err) => {
3309
3341
  process.stderr.write(`[Channel:${this.name}] pairing notification failed: ${sanitizeLogText(err instanceof Error ? err.message : String(err), 200)}\n`);
@@ -3374,6 +3406,27 @@ export class ChannelBase {
3374
3406
  process.stderr.write(`[Channel:${sanitizeLogText(this.name, 80)}] observed contact persistence failed.\n`);
3375
3407
  }
3376
3408
  }
3409
+ onObservedContact(_envelope) { }
3410
+ /**
3411
+ * Observations persisted for this channel, when a read path is configured.
3412
+ * Adapters hydrate label caches from it after a restart so known labels are
3413
+ * not reverted to raw IDs by the next initial write.
3414
+ */
3415
+ persistedObservedContacts() {
3416
+ const list = this.observedContacts?.list;
3417
+ if (!list)
3418
+ return undefined;
3419
+ try {
3420
+ const graph = list();
3421
+ return {
3422
+ users: graph.users.filter((user) => user.channelName === this.name),
3423
+ groups: graph.groups.filter((group) => group.channelName === this.name),
3424
+ };
3425
+ }
3426
+ catch {
3427
+ return undefined;
3428
+ }
3429
+ }
3377
3430
  markPreflighted(envelope) {
3378
3431
  this.preflightedEnvelopes.add(envelope);
3379
3432
  }
@@ -3403,6 +3456,7 @@ export class ChannelBase {
3403
3456
  if (this.observedContacts && !this.observedContactEnvelopes.has(envelope)) {
3404
3457
  this.observedContactEnvelopes.add(envelope);
3405
3458
  await this.recordObservedContact(envelope);
3459
+ this.onObservedContact(envelope);
3406
3460
  }
3407
3461
  let memoryIntent = parseChannelMemoryIntent(envelope.text);
3408
3462
  let memoryIntentFromClassifier = false;
@@ -3525,6 +3579,24 @@ export class ChannelBase {
3525
3579
  !recognizedSlashCommand) {
3526
3580
  const who = sanitizeSenderName(envelope.senderName || envelope.senderId || 'unknown');
3527
3581
  promptText = `[${who}] ${sanitizePromptText(promptText)}`;
3582
+ // Render the non-bot mention marker AFTER sanitization (like the
3583
+ // [Replying to:] wrapper below). Inside `text` it would pass through
3584
+ // sanitizePromptText, which strips brackets only on content <=64 chars
3585
+ // and folds its newline — so with IDs included, the delivered format
3586
+ // would depend on the ID list's length. IDs are platform-controlled, so
3587
+ // neutralize them like quoted text before they bypass the sanitizer here.
3588
+ if (envelope.mentionedMemberIds?.length) {
3589
+ const ids = envelope.mentionedMemberIds
3590
+ .map((id) => sanitizeQuotedText(id, 64).trim())
3591
+ // A junk-only ID over the cap truncates to a bare '…' (not
3592
+ // whitespace), which would advertise a phantom member — drop it
3593
+ // like an empty ID.
3594
+ .filter((id) => id.length > 0 && id !== '…');
3595
+ if (ids.length > 0) {
3596
+ const memberLabel = ids.length === 1 ? 'member' : 'members';
3597
+ promptText = `[Mentioned ${ids.length} other group ${memberLabel}: ${ids.join(', ')}]\n\n${promptText}`;
3598
+ }
3599
+ }
3528
3600
  }
3529
3601
  if (envelope.referencedText) {
3530
3602
  // Quoted text is attacker-controlled. sanitizeQuotedText strips C0/DEL
@@ -4009,6 +4081,7 @@ export class ChannelBase {
4009
4081
  alreadyPrefixed: true,
4010
4082
  // Clear attachments/references — already resolved in original text
4011
4083
  referencedText: undefined,
4084
+ mentionedMemberIds: undefined,
4012
4085
  attachments: undefined,
4013
4086
  metadata: undefined,
4014
4087
  imageBase64: undefined,
@@ -4026,12 +4099,36 @@ export class ChannelBase {
4026
4099
  this.sessionQueues.set(sessionId, current.catch(() => { }));
4027
4100
  await current;
4028
4101
  }
4029
- async onPairingRequired(chatId, code, threadId) {
4030
- if (code) {
4031
- await this.sendThreadMessage(chatId, threadId, `Your pairing code is: ${code}\n\nAsk the bot operator to approve you with:\n qwen channel pairing approve ${this.name} ${code}`);
4102
+ pairingRejectionMessage(rejected) {
4103
+ return rejected === 'sender_pending'
4104
+ ? 'You already have a pending pairing request. It must be approved or expire before another can be created.'
4105
+ : 'Too many pending pairing requests. Please try again later.';
4106
+ }
4107
+ groupPairingRejectionMessage(rejected) {
4108
+ // Group variant: the DM wording would publicly attribute the mentioning
4109
+ // member's unrelated pending request to the whole group.
4110
+ return rejected === 'sender_pending'
4111
+ ? 'A pairing request cannot be created right now. Another member can mention the bot to start group approval, or try again later.'
4112
+ : 'Too many pending pairing requests. Please try again later.';
4113
+ }
4114
+ async onPairingRequired(chatId, result, threadId) {
4115
+ if ('code' in result) {
4116
+ await this.sendThreadMessage(chatId, threadId, `Your pairing code is: ${result.code}\n\nAsk the bot operator to approve you with:\n qwen channel pairing approve ${this.name} ${result.code}`);
4117
+ }
4118
+ else {
4119
+ await this.sendThreadMessage(chatId, threadId, this.pairingRejectionMessage(result.rejected));
4120
+ }
4121
+ }
4122
+ async onGroupPairingRequired(chatId, result, threadId) {
4123
+ if ('code' in result) {
4124
+ if (this.groupPairingNotified.get(chatId) === result.code) {
4125
+ return;
4126
+ }
4127
+ await this.sendThreadMessage(chatId, threadId, `This group requires approval. Its pairing code is: ${result.code}\n\nAsk the bot operator to approve the group with:\n qwen channel pairing approve ${this.name} ${result.code}`);
4128
+ this.groupPairingNotified.set(chatId, result.code);
4032
4129
  }
4033
4130
  else {
4034
- await this.sendThreadMessage(chatId, threadId, 'Too many pending pairing requests. Please try again later.');
4131
+ await this.sendThreadMessage(chatId, threadId, this.groupPairingRejectionMessage(result.rejected));
4035
4132
  }
4036
4133
  }
4037
4134
  }