@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.
@@ -1,22 +1,34 @@
1
1
  import type { GroupPolicy, GroupConfig, Envelope } from './types.js';
2
+ import type { CreatePairingRequestResult, PairingStore } from './PairingStore.js';
2
3
  export interface GroupCheckResult {
3
4
  allowed: boolean;
4
- reason?: 'disabled' | 'not_allowlisted' | 'mention_required';
5
+ reason?: 'disabled' | 'not_allowlisted' | 'mention_required' | 'pairing_trigger_required' | 'pairing_required';
6
+ /** Set when the check denies with `pairing_required` (a pairing request was created or reused). */
7
+ pairing?: CreatePairingRequestResult;
5
8
  }
6
9
  export declare class GroupGate {
7
10
  private policy;
8
11
  private groups;
9
- constructor(policy?: GroupPolicy, groups?: Record<string, GroupConfig>);
12
+ private pairingStore;
13
+ constructor(policy?: GroupPolicy, groups?: Record<string, GroupConfig>, pairingStore?: PairingStore);
10
14
  /**
11
- * Full group check: policy + allowlist + mention gating.
15
+ * Full group check: policy + allowlist + pairing + mention gating.
12
16
  * Evaluation order:
13
17
  * 1. groupPolicy (disabled → drop)
14
18
  * 2. group allowlist (allowlist mode, no match → drop)
15
- * 3. mention gating (requireMention + not mentioned → drop silently)
19
+ * 3. group pairing (pairing mode, group not approved → drop; an explicit
20
+ * mention or reply creates or returns a pending pairing request unless
21
+ * `options.createPairingRequest` is false)
22
+ * 4. mention gating (requireMention + not mentioned → drop silently)
16
23
  *
17
- * Mention gating runs before sender gate so that unmentioned messages
18
- * in groups don't trigger pairing flows.
24
+ * Under the pairing policy the pairing step itself drops ambient
25
+ * (unmentioned, non-reply) messages before any request is created. Mention
26
+ * gating then runs before the sender gate so unmentioned messages in
27
+ * approved groups don't trigger sender pairing flows.
19
28
  */
20
- check(envelope: Envelope): GroupCheckResult;
29
+ check(envelope: Envelope, options?: {
30
+ createPairingRequest?: boolean;
31
+ }): GroupCheckResult;
32
+ isGroupApproved(groupId: string): boolean;
21
33
  }
22
34
  //# sourceMappingURL=GroupGate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"GroupGate.d.ts","sourceRoot":"","sources":["../src/GroupGate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAErE,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,UAAU,GAAG,iBAAiB,GAAG,kBAAkB,CAAC;CAC9D;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,MAAM,CAA8B;gBAG1C,MAAM,GAAE,WAAwB,EAChC,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAM;IAM1C;;;;;;;;;OASG;IACH,KAAK,CAAC,QAAQ,EAAE,QAAQ,GAAG,gBAAgB;CA2B5C"}
1
+ {"version":3,"file":"GroupGate.d.ts","sourceRoot":"","sources":["../src/GroupGate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACrE,OAAO,KAAK,EACV,0BAA0B,EAC1B,YAAY,EACb,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EACH,UAAU,GACV,iBAAiB,GACjB,kBAAkB,GAClB,0BAA0B,GAC1B,kBAAkB,CAAC;IACvB,mGAAmG;IACnG,OAAO,CAAC,EAAE,0BAA0B,CAAC;CACtC;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,MAAM,CAA8B;IAC5C,OAAO,CAAC,YAAY,CAAsB;gBAGxC,MAAM,GAAE,WAAwB,EAChC,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAM,EACxC,YAAY,CAAC,EAAE,YAAY;IAO7B;;;;;;;;;;;;;;OAcG;IACH,KAAK,CACH,QAAQ,EAAE,QAAQ,EAClB,OAAO,GAAE;QAAE,oBAAoB,CAAC,EAAE,OAAO,CAAA;KAAO,GAC/C,gBAAgB;IAmDnB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;CAG1C"}
package/dist/GroupGate.js CHANGED
@@ -1,21 +1,28 @@
1
1
  export class GroupGate {
2
2
  policy;
3
3
  groups;
4
- constructor(policy = 'disabled', groups = {}) {
4
+ pairingStore;
5
+ constructor(policy = 'disabled', groups = {}, pairingStore) {
5
6
  this.policy = policy;
6
7
  this.groups = groups;
8
+ this.pairingStore = pairingStore ?? null;
7
9
  }
8
10
  /**
9
- * Full group check: policy + allowlist + mention gating.
11
+ * Full group check: policy + allowlist + pairing + mention gating.
10
12
  * Evaluation order:
11
13
  * 1. groupPolicy (disabled → drop)
12
14
  * 2. group allowlist (allowlist mode, no match → drop)
13
- * 3. mention gating (requireMention + not mentioned → drop silently)
15
+ * 3. group pairing (pairing mode, group not approved → drop; an explicit
16
+ * mention or reply creates or returns a pending pairing request unless
17
+ * `options.createPairingRequest` is false)
18
+ * 4. mention gating (requireMention + not mentioned → drop silently)
14
19
  *
15
- * Mention gating runs before sender gate so that unmentioned messages
16
- * in groups don't trigger pairing flows.
20
+ * Under the pairing policy the pairing step itself drops ambient
21
+ * (unmentioned, non-reply) messages before any request is created. Mention
22
+ * gating then runs before the sender gate so unmentioned messages in
23
+ * approved groups don't trigger sender pairing flows.
17
24
  */
18
- check(envelope) {
25
+ check(envelope, options = {}) {
19
26
  if (!envelope.isGroup) {
20
27
  return { allowed: true };
21
28
  }
@@ -29,6 +36,19 @@ export class GroupGate {
29
36
  return { allowed: false, reason: 'not_allowlisted' };
30
37
  }
31
38
  }
39
+ if (this.policy === 'pairing' &&
40
+ !this.pairingStore?.isGroupApproved(envelope.chatId)) {
41
+ if (options.createPairingRequest === false ||
42
+ (!envelope.isMentioned && !envelope.isReplyToBot)) {
43
+ return { allowed: false, reason: 'pairing_trigger_required' };
44
+ }
45
+ const result = this.pairingStore?.createGroupRequest(envelope.chatId, envelope.chatName || envelope.chatId, envelope.senderId, envelope.senderName);
46
+ return {
47
+ allowed: false,
48
+ reason: 'pairing_required',
49
+ pairing: result ?? { rejected: 'cap_reached' },
50
+ };
51
+ }
32
52
  // Per-group config, falling back to "*" defaults, then built-in defaults
33
53
  const groupConfig = this.groups[envelope.chatId] || this.groups['*'] || {};
34
54
  const requireMention = groupConfig.requireMention ?? true;
@@ -37,5 +57,8 @@ export class GroupGate {
37
57
  }
38
58
  return { allowed: true };
39
59
  }
60
+ isGroupApproved(groupId) {
61
+ return this.pairingStore?.isGroupApproved(groupId) ?? false;
62
+ }
40
63
  }
41
64
  //# sourceMappingURL=GroupGate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"GroupGate.js","sourceRoot":"","sources":["../src/GroupGate.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,SAAS;IACZ,MAAM,CAAc;IACpB,MAAM,CAA8B;IAE5C,YACE,SAAsB,UAAU,EAChC,SAAsC,EAAE;QAExC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,QAAkB;QACtB,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YACtB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YAC/B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;QAChD,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YAChC,0EAA0E;YAC1E,6CAA6C;YAC7C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAClC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;YACvD,CAAC;QACH,CAAC;QAED,yEAAyE;QACzE,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAC3E,MAAM,cAAc,GAAG,WAAW,CAAC,cAAc,IAAI,IAAI,CAAC;QAE1D,IAAI,cAAc,IAAI,CAAC,QAAQ,CAAC,WAAW,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;YACtE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;QACxD,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;CACF"}
1
+ {"version":3,"file":"GroupGate.js","sourceRoot":"","sources":["../src/GroupGate.ts"],"names":[],"mappings":"AAkBA,MAAM,OAAO,SAAS;IACZ,MAAM,CAAc;IACpB,MAAM,CAA8B;IACpC,YAAY,CAAsB;IAE1C,YACE,SAAsB,UAAU,EAChC,SAAsC,EAAE,EACxC,YAA2B;QAE3B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,YAAY,GAAG,YAAY,IAAI,IAAI,CAAC;IAC3C,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACH,KAAK,CACH,QAAkB,EAClB,UAA8C,EAAE;QAEhD,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YACtB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YAC/B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;QAChD,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YAChC,0EAA0E;YAC1E,6CAA6C;YAC7C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAClC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;YACvD,CAAC;QACH,CAAC;QAED,IACE,IAAI,CAAC,MAAM,KAAK,SAAS;YACzB,CAAC,IAAI,CAAC,YAAY,EAAE,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,EACpD,CAAC;YACD,IACE,OAAO,CAAC,oBAAoB,KAAK,KAAK;gBACtC,CAAC,CAAC,QAAQ,CAAC,WAAW,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EACjD,CAAC;gBACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,0BAA0B,EAAE,CAAC;YAChE,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,kBAAkB,CAClD,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,EACpC,QAAQ,CAAC,QAAQ,EACjB,QAAQ,CAAC,UAAU,CACpB,CAAC;YACF,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,kBAAkB;gBAC1B,OAAO,EAAE,MAAM,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE;aAC/C,CAAC;QACJ,CAAC;QAED,yEAAyE;QACzE,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAC3E,MAAM,cAAc,GAAG,WAAW,CAAC,cAAc,IAAI,IAAI,CAAC;QAE1D,IAAI,cAAc,IAAI,CAAC,QAAQ,CAAC,WAAW,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;YACtE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;QACxD,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,eAAe,CAAC,OAAe;QAC7B,OAAO,IAAI,CAAC,YAAY,EAAE,eAAe,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC;IAC9D,CAAC;CACF"}
@@ -1,13 +1,25 @@
1
1
  export interface PairingRequest {
2
2
  senderId: string;
3
3
  senderName: string;
4
+ subject: PairingSubject;
4
5
  code: string;
5
6
  createdAt: number;
6
7
  }
8
+ export interface PairingSubject {
9
+ type: 'user' | 'group';
10
+ id: string;
11
+ name: string;
12
+ }
13
+ export type CreatePairingRequestResult = {
14
+ code: string;
15
+ } | {
16
+ rejected: 'sender_pending' | 'cap_reached';
17
+ };
7
18
  export declare class PairingStore {
8
19
  private dir;
9
20
  private pendingPath;
10
21
  private allowlistPath;
22
+ private groupAllowlistPath;
11
23
  private migratedSentinelPath;
12
24
  /**
13
25
  * @param channelName Channel name the state is keyed by.
@@ -47,24 +59,33 @@ export declare class PairingStore {
47
59
  */
48
60
  private migrateLegacyState;
49
61
  isApproved(senderId: string): boolean;
62
+ isGroupApproved(groupId: string): boolean;
50
63
  /**
51
64
  * Create a pairing request for an unknown sender.
52
- * Returns the code if created, or null if the pending cap is reached.
53
- * If the sender already has a non-expired pending request, returns that code.
65
+ * Returns the code if created; if the subject already has a non-expired
66
+ * pending request, returns that code. Rejects with `sender_pending` when
67
+ * the sender already holds a request for another subject, or
68
+ * `cap_reached` when the pending cap is reached.
54
69
  */
55
- createRequest(senderId: string, senderName: string): string | null;
70
+ createRequest(senderId: string, senderName: string): CreatePairingRequestResult;
71
+ createGroupRequest(groupId: string, groupName: string, senderId: string, senderName: string): CreatePairingRequestResult;
72
+ private createSubjectRequest;
56
73
  /**
57
74
  * Approve a pairing request by code.
58
- * Returns the sender ID if found, or null if not found / expired.
75
+ * Returns the request if found, or null if not found / expired.
59
76
  */
60
77
  approve(code: string): PairingRequest | null;
61
78
  listPending(): PairingRequest[];
62
79
  getAllowlist(): string[];
80
+ getGroupAllowlist(): string[];
63
81
  revoke(senderId: string): boolean;
82
+ revokeGroup(groupId: string): boolean;
64
83
  private ensureDir;
65
84
  private readPending;
66
85
  private writePending;
67
86
  private readAllowlist;
68
87
  private writeAllowlist;
88
+ private readGroupAllowlist;
89
+ private writeGroupAllowlist;
69
90
  }
70
91
  //# sourceMappingURL=PairingStore.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PairingStore.d.ts","sourceRoot":"","sources":["../src/PairingStore.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,oBAAoB,CAAS;IAErC;;;;;;;;;OASG;gBACS,WAAW,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM;IA2BtD;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,OAAO,CAAC,kBAAkB;IA8D1B,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAKrC;;;;OAIG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAwBlE;;;OAGG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAsB5C,WAAW,IAAI,cAAc,EAAE;IAM/B,YAAY,IAAI,MAAM,EAAE;IAIxB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAUjC,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,cAAc;CAIvB"}
1
+ {"version":3,"file":"PairingStore.d.ts","sourceRoot":"","sources":["../src/PairingStore.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,cAAc,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,0BAA0B,GAClC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,QAAQ,EAAE,gBAAgB,GAAG,aAAa,CAAA;CAAE,CAAC;AAMnD,qBAAa,YAAY;IACvB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,oBAAoB,CAAS;IAErC;;;;;;;;;OASG;gBACS,WAAW,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM;IA+BtD;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,OAAO,CAAC,kBAAkB;IAkE1B,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAKrC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIzC;;;;;;OAMG;IACH,aAAa,CACX,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,0BAA0B;IAQ7B,kBAAkB,CAChB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,0BAA0B;IAQ7B,OAAO,CAAC,oBAAoB;IAyC5B;;;OAGG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAkC5C,WAAW,IAAI,cAAc,EAAE;IAM/B,YAAY,IAAI,MAAM,EAAE;IAIxB,iBAAiB,IAAI,MAAM,EAAE;IAI7B,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAUjC,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAUrC,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,WAAW;IAiBnB,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,kBAAkB;IA4B1B,OAAO,CAAC,mBAAmB;CAQ5B"}
@@ -11,6 +11,7 @@ export class PairingStore {
11
11
  dir;
12
12
  pendingPath;
13
13
  allowlistPath;
14
+ groupAllowlistPath;
14
15
  migratedSentinelPath;
15
16
  /**
16
17
  * @param channelName Channel name the state is keyed by.
@@ -37,6 +38,7 @@ export class PairingStore {
37
38
  const safeChannelName = encodeURIComponent(channelName);
38
39
  this.pendingPath = path.join(this.dir, `${safeChannelName}-pairing.json`);
39
40
  this.allowlistPath = path.join(this.dir, `${safeChannelName}-allowlist.json`);
41
+ this.groupAllowlistPath = path.join(this.dir, `${safeChannelName}-groups.json`);
40
42
  this.migratedSentinelPath = path.join(this.dir, `${safeChannelName}.migrated`);
41
43
  if (workspaceCwd) {
42
44
  this.migrateLegacyState(channelsRoot, channelName);
@@ -85,6 +87,10 @@ export class PairingStore {
85
87
  path.join(channelsRoot, `${channelName}-allowlist.json`),
86
88
  this.allowlistPath,
87
89
  ],
90
+ [
91
+ path.join(channelsRoot, `${channelName}-groups.json`),
92
+ this.groupAllowlistPath,
93
+ ],
88
94
  ];
89
95
  this.ensureDir();
90
96
  let allSucceeded = true;
@@ -130,33 +136,53 @@ export class PairingStore {
130
136
  const list = this.readAllowlist();
131
137
  return list.includes(senderId);
132
138
  }
139
+ isGroupApproved(groupId) {
140
+ return this.readGroupAllowlist().includes(groupId);
141
+ }
133
142
  /**
134
143
  * Create a pairing request for an unknown sender.
135
- * Returns the code if created, or null if the pending cap is reached.
136
- * If the sender already has a non-expired pending request, returns that code.
144
+ * Returns the code if created; if the subject already has a non-expired
145
+ * pending request, returns that code. Rejects with `sender_pending` when
146
+ * the sender already holds a request for another subject, or
147
+ * `cap_reached` when the pending cap is reached.
137
148
  */
138
149
  createRequest(senderId, senderName) {
150
+ return this.createSubjectRequest({ type: 'user', id: senderId, name: senderName }, senderId, senderName);
151
+ }
152
+ createGroupRequest(groupId, groupName, senderId, senderName) {
153
+ return this.createSubjectRequest({ type: 'group', id: groupId, name: groupName }, senderId, senderName);
154
+ }
155
+ createSubjectRequest(subject, senderId, senderName) {
139
156
  const pending = this.readPending();
140
157
  // Purge expired
141
158
  const now = Date.now();
142
159
  const active = pending.filter((r) => now - r.createdAt < EXPIRY_MS);
143
- // Check if sender already has a pending request
144
- const existing = active.find((r) => r.senderId === senderId);
160
+ // Check if the same user or group already has a pending request
161
+ const existing = active.find((request) => request.subject.type === subject.type &&
162
+ request.subject.id === subject.id);
145
163
  if (existing) {
146
- return existing.code;
164
+ return { code: existing.code };
165
+ }
166
+ // One sender may hold only one pending request at a time: without this
167
+ // limit one sender could occupy every shared slot and block all other
168
+ // pairing requests until expiry. Subject-keyed dedup (above) keeps
169
+ // re-mentions of the same group returning its existing code instead of
170
+ // tripping this check.
171
+ if (active.some((request) => request.senderId === senderId)) {
172
+ return { rejected: 'sender_pending' };
147
173
  }
148
174
  // Cap check
149
175
  if (active.length >= MAX_PENDING) {
150
- return null;
176
+ return { rejected: 'cap_reached' };
151
177
  }
152
178
  const code = generateCode();
153
- active.push({ senderId, senderName, code, createdAt: now });
179
+ active.push({ senderId, senderName, subject, code, createdAt: now });
154
180
  this.writePending(active);
155
- return code;
181
+ return { code };
156
182
  }
157
183
  /**
158
184
  * Approve a pairing request by code.
159
- * Returns the sender ID if found, or null if not found / expired.
185
+ * Returns the request if found, or null if not found / expired.
160
186
  */
161
187
  approve(code) {
162
188
  const pending = this.readPending();
@@ -165,14 +191,26 @@ export class PairingStore {
165
191
  if (idx === -1)
166
192
  return null;
167
193
  const request = pending[idx];
194
+ // Persist the approval BEFORE consuming the request: if the allowlist
195
+ // write fails (or an existing allowlist file is unreadable and we refuse
196
+ // to rebuild it from []), the request stays pending and the code remains
197
+ // usable instead of being silently burned.
198
+ if (request.subject.type === 'group') {
199
+ const groups = this.readGroupAllowlist(true);
200
+ if (!groups.includes(request.subject.id)) {
201
+ groups.push(request.subject.id);
202
+ this.writeGroupAllowlist(groups);
203
+ }
204
+ }
205
+ else {
206
+ const users = this.readAllowlist();
207
+ if (!users.includes(request.subject.id)) {
208
+ users.push(request.subject.id);
209
+ this.writeAllowlist(users);
210
+ }
211
+ }
168
212
  pending.splice(idx, 1);
169
213
  this.writePending(pending);
170
- // Add to allowlist
171
- const list = this.readAllowlist();
172
- if (!list.includes(request.senderId)) {
173
- list.push(request.senderId);
174
- this.writeAllowlist(list);
175
- }
176
214
  return request;
177
215
  }
178
216
  listPending() {
@@ -183,6 +221,9 @@ export class PairingStore {
183
221
  getAllowlist() {
184
222
  return this.readAllowlist();
185
223
  }
224
+ getGroupAllowlist() {
225
+ return this.readGroupAllowlist();
226
+ }
186
227
  revoke(senderId) {
187
228
  const list = this.readAllowlist();
188
229
  const next = list.filter((id) => id !== senderId);
@@ -192,6 +233,15 @@ export class PairingStore {
192
233
  this.writeAllowlist(next);
193
234
  return true;
194
235
  }
236
+ revokeGroup(groupId) {
237
+ const list = this.readGroupAllowlist();
238
+ const next = list.filter((id) => id !== groupId);
239
+ if (next.length === list.length) {
240
+ return false;
241
+ }
242
+ this.writeGroupAllowlist(next);
243
+ return true;
244
+ }
195
245
  ensureDir() {
196
246
  if (!fs.existsSync(this.dir)) {
197
247
  fs.mkdirSync(this.dir, { recursive: true });
@@ -200,7 +250,15 @@ export class PairingStore {
200
250
  readPending() {
201
251
  try {
202
252
  const data = fs.readFileSync(this.pendingPath, 'utf-8');
203
- return JSON.parse(data);
253
+ const requests = JSON.parse(data);
254
+ return requests.map((request) => ({
255
+ ...request,
256
+ subject: request.subject ?? {
257
+ type: 'user',
258
+ id: request.senderId,
259
+ name: request.senderName,
260
+ },
261
+ }));
204
262
  }
205
263
  catch {
206
264
  return [];
@@ -223,6 +281,38 @@ export class PairingStore {
223
281
  this.ensureDir();
224
282
  fs.writeFileSync(this.allowlistPath, JSON.stringify(list, null, 2));
225
283
  }
284
+ readGroupAllowlist(strict = false) {
285
+ try {
286
+ const data = fs.readFileSync(this.groupAllowlistPath, 'utf-8');
287
+ return JSON.parse(data);
288
+ }
289
+ catch (err) {
290
+ const exists = fs.existsSync(this.groupAllowlistPath);
291
+ if (strict && exists) {
292
+ // An existing-but-unreadable allowlist (torn write, permissions)
293
+ // must not be silently rebuilt from []: that would permanently
294
+ // discard every stored group approval on the next write.
295
+ throw new Error(`refusing to rewrite unreadable group allowlist ` +
296
+ `"${path.basename(this.groupAllowlistPath)}": ` +
297
+ `${err?.message}`);
298
+ }
299
+ if (exists) {
300
+ process.stderr.write(`[PairingStore] group allowlist ` +
301
+ `"${path.basename(this.groupAllowlistPath)}" is unreadable ` +
302
+ `(${err?.message}); treating as empty — stored group ` +
303
+ `approvals are not in effect and will be lost on the next approve\n`);
304
+ }
305
+ return [];
306
+ }
307
+ }
308
+ writeGroupAllowlist(list) {
309
+ this.ensureDir();
310
+ // Atomic temp+rename: this file is an authorization artifact, and a torn
311
+ // write left behind by a crash mid-write would read as "no approvals".
312
+ const tmpPath = `${this.groupAllowlistPath}.${process.pid}.tmp`;
313
+ fs.writeFileSync(tmpPath, JSON.stringify(list, null, 2));
314
+ fs.renameSync(tmpPath, this.groupAllowlistPath);
315
+ }
226
316
  }
227
317
  function generateCode() {
228
318
  let code = '';
@@ -1 +1 @@
1
- {"version":3,"file":"PairingStore.js","sourceRoot":"","sources":["../src/PairingStore.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PairingStore.js","sourceRoot":"","sources":["../src/PairingStore.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,9 @@
1
1
  import type { SenderPolicy } from './types.js';
2
- import type { PairingStore } from './PairingStore.js';
2
+ import type { CreatePairingRequestResult, PairingStore } from './PairingStore.js';
3
3
  export interface SenderCheckResult {
4
4
  allowed: boolean;
5
- pairingCode?: string | null;
5
+ /** Set when the pairing policy denies the sender. */
6
+ pairing?: CreatePairingRequestResult;
6
7
  }
7
8
  export declare class SenderGate {
8
9
  private policy;
@@ -1 +1 @@
1
- {"version":3,"file":"SenderGate.d.ts","sourceRoot":"","sources":["../src/SenderGate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,YAAY,CAAsB;gBAGxC,MAAM,EAAE,YAAY,EACpB,YAAY,GAAE,MAAM,EAAO,EAC3B,YAAY,CAAC,EAAE,YAAY;IAO7B,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI;IAI1C,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAgBpC,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,iBAAiB;CA0BhE"}
1
+ {"version":3,"file":"SenderGate.d.ts","sourceRoot":"","sources":["../src/SenderGate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EACV,0BAA0B,EAC1B,YAAY,EACb,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,qDAAqD;IACrD,OAAO,CAAC,EAAE,0BAA0B,CAAC;CACtC;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,YAAY,CAAsB;gBAGxC,MAAM,EAAE,YAAY,EACpB,YAAY,GAAE,MAAM,EAAO,EAC3B,YAAY,CAAC,EAAE,YAAY;IAO7B,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI;IAI1C,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAgBpC,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,iBAAiB;CA6BhE"}
@@ -39,8 +39,11 @@ export class SenderGate {
39
39
  return { allowed: true };
40
40
  }
41
41
  // Generate pairing code
42
- const code = this.pairingStore?.createRequest(senderId, senderName || senderId);
43
- return { allowed: false, pairingCode: code ?? null };
42
+ const result = this.pairingStore?.createRequest(senderId, senderName || senderId);
43
+ return {
44
+ allowed: false,
45
+ pairing: result ?? { rejected: 'cap_reached' },
46
+ };
44
47
  }
45
48
  default:
46
49
  throw new Error(`Unknown sender policy: ${this.policy}`);
@@ -1 +1 @@
1
- {"version":3,"file":"SenderGate.js","sourceRoot":"","sources":["../src/SenderGate.ts"],"names":[],"mappings":"AAQA,MAAM,OAAO,UAAU;IACb,MAAM,CAAe;IACrB,YAAY,CAAc;IAC1B,YAAY,CAAsB;IAE1C,YACE,MAAoB,EACpB,eAAyB,EAAE,EAC3B,YAA2B;QAE3B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,YAAY,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;QAC1C,IAAI,CAAC,YAAY,GAAG,YAAY,IAAI,IAAI,CAAC;IAC3C,CAAC;IAED,mBAAmB,CAAC,KAAe;QACjC,IAAI,CAAC,YAAY,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,SAAS,CAAC,QAAgB;QACxB,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;YACpB,KAAK,MAAM;gBACT,OAAO,IAAI,CAAC;YACd,KAAK,WAAW;gBACd,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACzC,KAAK,SAAS;gBACZ,OAAO,CACL,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC;oBAC/B,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,QAAQ,CAAC,KAAK,IAAI,CACjD,CAAC;YACJ;gBACE,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAgB,EAAE,UAAmB;QACzC,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;YACpB,KAAK,MAAM;gBACT,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,KAAK,WAAW;gBACd,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACtD,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,+BAA+B;gBAC/B,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;gBAC3B,CAAC;gBACD,8BAA8B;gBAC9B,IAAI,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;gBAC3B,CAAC;gBACD,wBAAwB;gBACxB,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE,aAAa,CAC3C,QAAQ,EACR,UAAU,IAAI,QAAQ,CACvB,CAAC;gBACF,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC;YACvD,CAAC;YACD;gBACE,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"SenderGate.js","sourceRoot":"","sources":["../src/SenderGate.ts"],"names":[],"mappings":"AAYA,MAAM,OAAO,UAAU;IACb,MAAM,CAAe;IACrB,YAAY,CAAc;IAC1B,YAAY,CAAsB;IAE1C,YACE,MAAoB,EACpB,eAAyB,EAAE,EAC3B,YAA2B;QAE3B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,YAAY,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;QAC1C,IAAI,CAAC,YAAY,GAAG,YAAY,IAAI,IAAI,CAAC;IAC3C,CAAC;IAED,mBAAmB,CAAC,KAAe;QACjC,IAAI,CAAC,YAAY,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,SAAS,CAAC,QAAgB;QACxB,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;YACpB,KAAK,MAAM;gBACT,OAAO,IAAI,CAAC;YACd,KAAK,WAAW;gBACd,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACzC,KAAK,SAAS;gBACZ,OAAO,CACL,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC;oBAC/B,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,QAAQ,CAAC,KAAK,IAAI,CACjD,CAAC;YACJ;gBACE,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAgB,EAAE,UAAmB;QACzC,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;YACpB,KAAK,MAAM;gBACT,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,KAAK,WAAW;gBACd,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACtD,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,+BAA+B;gBAC/B,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;gBAC3B,CAAC;gBACD,8BAA8B;gBAC9B,IAAI,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;gBAC3B,CAAC;gBACD,wBAAwB;gBACxB,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,aAAa,CAC7C,QAAQ,EACR,UAAU,IAAI,QAAQ,CACvB,CAAC;gBACF,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,OAAO,EAAE,MAAM,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE;iBAC/C,CAAC;YACJ,CAAC;YACD;gBACE,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;CACF"}
package/dist/index.d.ts CHANGED
@@ -19,7 +19,7 @@ export type { ChannelWebhookConfig, ChannelWebhookRunOptions, ChannelWebhookSour
19
19
  export { ChannelLoopStore } from './ChannelLoopStore.js';
20
20
  export type { ChannelLoop, ChannelLoopInput, ChannelLoopPatch, ChannelLoopStatus, ChannelLoopStoreOptions, } from './ChannelLoopStore.js';
21
21
  export { PairingStore } from './PairingStore.js';
22
- export type { PairingRequest } from './PairingStore.js';
22
+ export type { CreatePairingRequestResult, PairingRequest, PairingSubject, } from './PairingStore.js';
23
23
  export { GroupGate } from './GroupGate.js';
24
24
  export type { GroupCheckResult } from './GroupGate.js';
25
25
  export { DmGate } from './DmGate.js';
@@ -29,5 +29,5 @@ export type { SenderCheckResult } from './SenderGate.js';
29
29
  export { SessionRouter } from './SessionRouter.js';
30
30
  export { sanitizeSenderName, sanitizePromptText, sanitizeLogText, truncateCodePoints, } from './sanitize.js';
31
31
  export { isTerminalTaskLifecycleType } from './types.js';
32
- export type { Attachment, BlockStreamingChunkConfig, BlockStreamingCoalesceConfig, ChannelConfig, ChannelConfigFieldDescriptor, ChannelConfigFieldKind, ChannelIdentityConfig, ChannelManagementDescriptor, ChannelMemoryIntentClassifier, ChannelMemoryIntentClassifierResult, ChannelMemoryScopeConfig, ChannelMemoryScopeMode, ChannelOutputSegmentContext, ChannelOutputSegmentEndReason, ChannelPlugin, ChannelPromptOwner, ChannelProactiveTarget, ChannelRuntimeIdentity, ChannelRuntimeMemoryScope, ChannelTaskCancellationReason, ChannelTaskLifecycleBase, ChannelTaskLifecycleEvent, ChannelType, ChannelUserInputRequestContext, ChannelUserInputResponse, ChannelUserQuestion, DispatchMode, DmPolicy, Envelope, GroupConfig, GroupPolicy, ObservedChannelIdentity, ObservedChannelContactObservation, ObservedChannelContact, ObservedChannelRelatedContact, ObservedChannelTopic, ObservedChannelGroup, ObservedChannelContactGraph, SanitizedToolCallEvent, SenderPolicy, SessionScope, SessionTarget, UserInputPresentationResult, UserInputSettlementReason, } from './types.js';
32
+ export type { Attachment, BlockStreamingChunkConfig, BlockStreamingCoalesceConfig, ChannelConfig, ChannelConfigEnumFieldDescriptor, ChannelConfigFieldDescriptor, ChannelConfigFieldKind, ChannelConfigNestedFieldDescriptor, ChannelConfigNumberFieldDescriptor, ChannelConfigObjectFieldDescriptor, ChannelConfigPlainValueFieldDescriptor, ChannelConfigValueFieldDescriptor, ChannelIdentityConfig, ChannelManagementDescriptor, ChannelMemoryIntentClassifier, ChannelMemoryIntentClassifierResult, ChannelMemoryScopeConfig, ChannelMemoryScopeMode, ChannelOutputSegmentContext, ChannelOutputSegmentEndReason, ChannelPlugin, ChannelPromptOwner, ChannelProactiveTarget, ChannelRuntimeIdentity, ChannelRuntimeMemoryScope, ChannelTaskCancellationReason, ChannelTaskLifecycleBase, ChannelTaskLifecycleEvent, ChannelType, ChannelUserInputRequestContext, ChannelUserInputResponse, ChannelUserQuestion, DispatchMode, DmPolicy, Envelope, GroupConfig, GroupPolicy, ObservedChannelIdentity, ObservedChannelContactObservation, ObservedChannelContact, ObservedChannelRelatedContact, ObservedChannelTopic, ObservedChannelGroup, ObservedChannelContactGraph, SanitizedToolCallEvent, SenderPolicy, SessionScope, SessionTarget, UserInputPresentationResult, UserInputSettlementReason, } from './types.js';
33
33
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,wBAAwB,EACxB,WAAW,GACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,+BAA+B,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAc5E,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAY/D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EACL,qCAAqC,EACrC,6BAA6B,EAC7B,+BAA+B,GAChC,MAAM,oCAAoC,CAAC;AAS5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AAKrE,OAAO,EACL,yBAAyB,EACzB,2BAA2B,GAC5B,MAAM,yBAAyB,CAAC;AAQjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAQzD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,kBAAkB,GACnB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,wBAAwB,EACxB,WAAW,GACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,+BAA+B,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAc5E,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAY/D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EACL,qCAAqC,EACrC,6BAA6B,EAC7B,+BAA+B,GAChC,MAAM,oCAAoC,CAAC;AAS5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AAKrE,OAAO,EACL,yBAAyB,EACzB,2BAA2B,GAC5B,MAAM,yBAAyB,CAAC;AAQjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAQzD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAMjD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,kBAAkB,GACnB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC"}
package/dist/types.d.ts CHANGED
@@ -5,7 +5,7 @@ import type { ChannelWebhookConfig } from './ChannelWebhookTask.js';
5
5
  export type SenderPolicy = 'allowlist' | 'pairing' | 'open';
6
6
  export type SessionScope = 'user' | 'thread' | 'chat_thread' | 'single';
7
7
  export type ChannelType = string;
8
- export type GroupPolicy = 'disabled' | 'allowlist' | 'open';
8
+ export type GroupPolicy = 'disabled' | 'allowlist' | 'pairing' | 'open';
9
9
  export type DmPolicy = 'disabled' | 'open';
10
10
  export type DispatchMode = 'collect' | 'steer' | 'followup';
11
11
  export interface ChannelIdentityConfig {
@@ -99,6 +99,19 @@ export interface Envelope {
99
99
  isReplyToBot: boolean;
100
100
  /** Text of the message being replied to (quoted/referenced message). */
101
101
  referencedText?: string;
102
+ /**
103
+ * Stable identifiers (staffId preferred, platform ID fallback) of non-bot
104
+ * members mentioned alongside the bot in a group message, deduplicated and
105
+ * excluding the bot itself. Kept separate from `text` (like `metadata`) so
106
+ * slash-command parsing sees the message body alone; ChannelBase renders it
107
+ * as a `[Mentioned …]` wrapper AFTER prompt sanitization so the delivered
108
+ * format stays uniform regardless of the identifier list length.
109
+ * Rendered only when sender attribution is rendered (group/single-scope,
110
+ * not `alreadyPrefixed`, not a recognized slash command) — self-prefixing
111
+ * adapters must render it themselves. Group history backfill records the
112
+ * message body only; mention IDs are intentionally not persisted.
113
+ */
114
+ mentionedMemberIds?: string[];
102
115
  /** Base64-encoded image data (e.g. from WeChat CDN download). */
103
116
  imageBase64?: string;
104
117
  /** MIME type for the image (e.g. "image/jpeg", "image/png"). */
@@ -324,13 +337,10 @@ export type ChannelMemoryIntentClassifierResult = {
324
337
  export interface ChannelMemoryIntentClassifier {
325
338
  classifyChannelMemoryIntent(text: string, entries?: readonly ChannelMemoryEntry[]): Promise<ChannelMemoryIntentClassifierResult>;
326
339
  }
327
- export type ChannelConfigFieldKind = 'string' | 'secret' | 'boolean' | 'number' | 'enum' | 'string-list' | 'record';
328
- export interface ChannelConfigFieldDescriptor {
340
+ export type ChannelConfigFieldKind = 'string' | 'secret' | 'boolean' | 'number' | 'enum' | 'string-list' | 'record' | 'object';
341
+ interface ChannelConfigFieldDescriptorBase {
329
342
  key: string;
330
343
  label: string;
331
- kind: ChannelConfigFieldKind;
332
- required?: boolean;
333
- envResolvable?: boolean;
334
344
  options?: ReadonlyArray<{
335
345
  value: string;
336
346
  label: string;
@@ -338,6 +348,52 @@ export interface ChannelConfigFieldDescriptor {
338
348
  default?: string;
339
349
  description?: string;
340
350
  }
351
+ export interface ChannelConfigValueFieldDescriptor extends ChannelConfigFieldDescriptorBase {
352
+ kind: 'string' | 'secret';
353
+ required?: boolean;
354
+ envResolvable?: boolean;
355
+ properties?: never;
356
+ }
357
+ export interface ChannelConfigPlainValueFieldDescriptor extends ChannelConfigFieldDescriptorBase {
358
+ kind: 'boolean' | 'string-list' | 'record';
359
+ required?: boolean;
360
+ envResolvable?: never;
361
+ properties?: never;
362
+ }
363
+ export interface ChannelConfigEnumFieldDescriptor extends ChannelConfigFieldDescriptorBase {
364
+ kind: 'enum';
365
+ required?: boolean;
366
+ envResolvable?: never;
367
+ options: ReadonlyArray<{
368
+ value: string;
369
+ label: string;
370
+ }>;
371
+ properties?: never;
372
+ }
373
+ export interface ChannelConfigNumberFieldDescriptor extends ChannelConfigFieldDescriptorBase {
374
+ kind: 'number';
375
+ required?: boolean;
376
+ envResolvable?: never;
377
+ exclusiveMinimum?: number;
378
+ properties?: never;
379
+ }
380
+ export interface ChannelConfigObjectFieldDescriptor extends ChannelConfigFieldDescriptorBase {
381
+ kind: 'object';
382
+ required?: false;
383
+ envResolvable?: never;
384
+ properties: readonly ChannelConfigNestedFieldDescriptor[];
385
+ }
386
+ export type ChannelConfigNestedFieldDescriptor = (Omit<ChannelConfigValueFieldDescriptor, 'kind' | 'envResolvable'> & {
387
+ kind: Exclude<ChannelConfigFieldKind, 'secret' | 'enum' | 'number' | 'object'>;
388
+ envResolvable?: never;
389
+ }) | (Omit<ChannelConfigEnumFieldDescriptor, 'kind' | 'envResolvable'> & {
390
+ kind: 'enum';
391
+ envResolvable?: never;
392
+ }) | (Omit<ChannelConfigNumberFieldDescriptor, 'kind' | 'envResolvable'> & {
393
+ kind: 'number';
394
+ envResolvable?: never;
395
+ }) | ChannelConfigObjectFieldDescriptor;
396
+ export type ChannelConfigFieldDescriptor = ChannelConfigValueFieldDescriptor | ChannelConfigPlainValueFieldDescriptor | ChannelConfigEnumFieldDescriptor | ChannelConfigNumberFieldDescriptor | ChannelConfigObjectFieldDescriptor;
341
397
  export interface ChannelManagementDescriptor {
342
398
  fields: readonly ChannelConfigFieldDescriptor[];
343
399
  /**
@@ -371,4 +427,5 @@ export interface ChannelPlugin {
371
427
  /** Create a channel adapter instance. */
372
428
  createChannel(name: string, config: ChannelConfig & Record<string, unknown>, bridge: ChannelAgentBridge, options?: ChannelBaseOptions): ChannelBase;
373
429
  }
430
+ export {};
374
431
  //# sourceMappingURL=types.d.ts.map