@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 +23 -18
- package/dist/ChannelBase.d.ts +17 -3
- package/dist/ChannelBase.d.ts.map +1 -1
- package/dist/ChannelBase.js +111 -14
- package/dist/ChannelBase.js.map +1 -1
- package/dist/GroupGate.d.ts +19 -7
- package/dist/GroupGate.d.ts.map +1 -1
- package/dist/GroupGate.js +29 -6
- package/dist/GroupGate.js.map +1 -1
- package/dist/PairingStore.d.ts +25 -4
- package/dist/PairingStore.d.ts.map +1 -1
- package/dist/PairingStore.js +106 -16
- package/dist/PairingStore.js.map +1 -1
- package/dist/SenderGate.d.ts +3 -2
- package/dist/SenderGate.d.ts.map +1 -1
- package/dist/SenderGate.js +5 -2
- package/dist/SenderGate.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +63 -6
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
package/dist/GroupGate.d.ts
CHANGED
|
@@ -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
|
-
|
|
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.
|
|
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
|
-
*
|
|
18
|
-
*
|
|
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
|
|
29
|
+
check(envelope: Envelope, options?: {
|
|
30
|
+
createPairingRequest?: boolean;
|
|
31
|
+
}): GroupCheckResult;
|
|
32
|
+
isGroupApproved(groupId: string): boolean;
|
|
21
33
|
}
|
|
22
34
|
//# sourceMappingURL=GroupGate.d.ts.map
|
package/dist/GroupGate.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
-
|
|
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.
|
|
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
|
-
*
|
|
16
|
-
*
|
|
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
|
package/dist/GroupGate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GroupGate.js","sourceRoot":"","sources":["../src/GroupGate.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/PairingStore.d.ts
CHANGED
|
@@ -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
|
|
53
|
-
*
|
|
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):
|
|
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
|
|
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;
|
|
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"}
|
package/dist/PairingStore.js
CHANGED
|
@@ -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
|
|
136
|
-
*
|
|
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
|
|
144
|
-
const existing = active.find((
|
|
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
|
|
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
|
|
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
|
-
|
|
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 = '';
|
package/dist/PairingStore.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PairingStore.js","sourceRoot":"","sources":["../src/PairingStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAExE,6CAA6C;AAC7C,MAAM,aAAa,GAAG,kCAAkC,CAAC;AACzD,MAAM,WAAW,GAAG,CAAC,CAAC;AACtB,MAAM,SAAS,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,SAAS;AAC3C,MAAM,WAAW,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"PairingStore.js","sourceRoot":"","sources":["../src/PairingStore.ts"],"names":[],"mappings":"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"}
|
package/dist/SenderGate.d.ts
CHANGED
|
@@ -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
|
-
|
|
5
|
+
/** Set when the pairing policy denies the sender. */
|
|
6
|
+
pairing?: CreatePairingRequestResult;
|
|
6
7
|
}
|
|
7
8
|
export declare class SenderGate {
|
|
8
9
|
private policy;
|
package/dist/SenderGate.d.ts.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/SenderGate.js
CHANGED
|
@@ -39,8 +39,11 @@ export class SenderGate {
|
|
|
39
39
|
return { allowed: true };
|
|
40
40
|
}
|
|
41
41
|
// Generate pairing code
|
|
42
|
-
const
|
|
43
|
-
return {
|
|
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}`);
|
package/dist/SenderGate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SenderGate.js","sourceRoot":"","sources":["../src/SenderGate.ts"],"names":[],"mappings":"
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","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,YAAY,EACV,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,0BAA0B,EAC1B,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,EACtB,uBAAuB,EACvB,gBAAgB,EAChB,aAAa,GACd,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,YAAY,EACV,0BAA0B,EAC1B,wBAAwB,EACxB,kBAAkB,EAClB,0BAA0B,EAC1B,2BAA2B,EAC3B,kCAAkC,EAClC,yBAAyB,EACzB,4BAA4B,EAC5B,6BAA6B,GAC9B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,YAAY,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EACL,qCAAqC,EACrC,6BAA6B,EAC7B,+BAA+B,GAChC,MAAM,oCAAoC,CAAC;AAC5C,YAAY,EAAE,mCAAmC,EAAE,MAAM,oCAAoC,CAAC;AAC9F,YAAY,EACV,kBAAkB,EAClB,8BAA8B,EAC9B,8BAA8B,EAC9B,yBAAyB,EACzB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AACrE,YAAY,EACV,2BAA2B,EAC3B,iBAAiB,GAClB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,yBAAyB,EACzB,2BAA2B,GAC5B,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACV,oBAAoB,EACpB,wBAAwB,EACxB,0BAA0B,EAC1B,0BAA0B,EAC1B,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,YAAY,EACV,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,
|
|
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;
|
|
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
|
-
|
|
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
|