@tjamescouch/agentchat 0.25.2 → 0.26.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +53 -4
- package/dist/lib/callback-engine.d.ts +66 -0
- package/dist/lib/callback-engine.d.ts.map +1 -0
- package/dist/lib/callback-engine.js +199 -0
- package/dist/lib/callback-engine.js.map +1 -0
- package/dist/lib/client.d.ts +3 -1
- package/dist/lib/client.d.ts.map +1 -1
- package/dist/lib/client.js +3 -2
- package/dist/lib/client.js.map +1 -1
- package/dist/lib/escalation.d.ts +99 -0
- package/dist/lib/escalation.d.ts.map +1 -0
- package/dist/lib/escalation.js +286 -0
- package/dist/lib/escalation.js.map +1 -0
- package/dist/lib/escalation.test.d.ts +8 -0
- package/dist/lib/escalation.test.d.ts.map +1 -0
- package/dist/lib/escalation.test.js +348 -0
- package/dist/lib/escalation.test.js.map +1 -0
- package/dist/lib/floor-control.d.ts +77 -0
- package/dist/lib/floor-control.d.ts.map +1 -0
- package/dist/lib/floor-control.js +166 -0
- package/dist/lib/floor-control.js.map +1 -0
- package/dist/lib/moderation-plugins/escalation-plugin.d.ts +31 -0
- package/dist/lib/moderation-plugins/escalation-plugin.d.ts.map +1 -0
- package/dist/lib/moderation-plugins/escalation-plugin.js +97 -0
- package/dist/lib/moderation-plugins/escalation-plugin.js.map +1 -0
- package/dist/lib/moderation-plugins/link-detector-plugin.d.ts +29 -0
- package/dist/lib/moderation-plugins/link-detector-plugin.d.ts.map +1 -0
- package/dist/lib/moderation-plugins/link-detector-plugin.js +61 -0
- package/dist/lib/moderation-plugins/link-detector-plugin.js.map +1 -0
- package/dist/lib/moderation.d.ts +142 -0
- package/dist/lib/moderation.d.ts.map +1 -0
- package/dist/lib/moderation.js +192 -0
- package/dist/lib/moderation.js.map +1 -0
- package/dist/lib/moderation.test.d.ts +7 -0
- package/dist/lib/moderation.test.d.ts.map +1 -0
- package/dist/lib/moderation.test.js +275 -0
- package/dist/lib/moderation.test.js.map +1 -0
- package/dist/lib/protocol.d.ts +5 -0
- package/dist/lib/protocol.d.ts.map +1 -1
- package/dist/lib/protocol.js +18 -2
- package/dist/lib/protocol.js.map +1 -1
- package/dist/lib/security.d.ts.map +1 -1
- package/dist/lib/security.js +13 -4
- package/dist/lib/security.js.map +1 -1
- package/dist/lib/server/handlers/message.d.ts.map +1 -1
- package/dist/lib/server/handlers/message.js +22 -2
- package/dist/lib/server/handlers/message.js.map +1 -1
- package/dist/lib/server.d.ts +8 -0
- package/dist/lib/server.d.ts.map +1 -1
- package/dist/lib/server.js +106 -2
- package/dist/lib/server.js.map +1 -1
- package/dist/lib/types.d.ts +13 -1
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/lib/types.js +5 -0
- package/dist/lib/types.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"escalation.test.js","sourceRoot":"","sources":["../../lib/escalation.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Floor Control — RESPONDING_TO protocol
|
|
3
|
+
*
|
|
4
|
+
* Implements optimistic locking for agent channel responses.
|
|
5
|
+
* When an agent starts inference to respond to a message, it broadcasts
|
|
6
|
+
* RESPONDING_TO with {msg_id, started_at}. The server tracks claims
|
|
7
|
+
* per channel — earliest started_at wins, losers get YIELD.
|
|
8
|
+
*
|
|
9
|
+
* Design: advisory v1 — server dispatches YIELD but doesn't hard-block messages.
|
|
10
|
+
* Well-behaved agents abort their inference on YIELD.
|
|
11
|
+
*/
|
|
12
|
+
export interface FloorClaim {
|
|
13
|
+
agentId: string;
|
|
14
|
+
msgId: string;
|
|
15
|
+
channel: string;
|
|
16
|
+
startedAt: number;
|
|
17
|
+
receivedAt: number;
|
|
18
|
+
expiresAt: number;
|
|
19
|
+
}
|
|
20
|
+
export interface RespondingToMessage {
|
|
21
|
+
type: 'RESPONDING_TO';
|
|
22
|
+
msg_id: string;
|
|
23
|
+
channel: string;
|
|
24
|
+
started_at: number;
|
|
25
|
+
}
|
|
26
|
+
export interface YieldMessage {
|
|
27
|
+
type: 'YIELD';
|
|
28
|
+
msg_id: string;
|
|
29
|
+
channel: string;
|
|
30
|
+
holder: string;
|
|
31
|
+
holder_started_at: number;
|
|
32
|
+
reason: string;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* FloorControl tracks active claims per channel and resolves conflicts.
|
|
36
|
+
*/
|
|
37
|
+
export declare class FloorControl {
|
|
38
|
+
private claims;
|
|
39
|
+
private cleanupTimer;
|
|
40
|
+
start(): void;
|
|
41
|
+
stop(): void;
|
|
42
|
+
/**
|
|
43
|
+
* Process a RESPONDING_TO claim from an agent.
|
|
44
|
+
* Returns:
|
|
45
|
+
* { granted: true } if the agent wins the floor
|
|
46
|
+
* { granted: false, holder: FloorClaim } if someone else already has it
|
|
47
|
+
*/
|
|
48
|
+
claim(agentId: string, channel: string, msgId: string, startedAt: number): {
|
|
49
|
+
granted: boolean;
|
|
50
|
+
holder?: FloorClaim;
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Release a claim when an agent sends their actual response,
|
|
54
|
+
* or on disconnect.
|
|
55
|
+
*/
|
|
56
|
+
release(agentId: string, channel?: string): void;
|
|
57
|
+
/**
|
|
58
|
+
* Check if an agent currently holds the floor for any message in a channel.
|
|
59
|
+
*/
|
|
60
|
+
holdsFloor(agentId: string, channel: string): FloorClaim | null;
|
|
61
|
+
/**
|
|
62
|
+
* Get the current floor holder for a specific message.
|
|
63
|
+
*/
|
|
64
|
+
getHolder(channel: string, msgId: string): FloorClaim | null;
|
|
65
|
+
/**
|
|
66
|
+
* Expire stale claims.
|
|
67
|
+
*/
|
|
68
|
+
private cleanup;
|
|
69
|
+
/**
|
|
70
|
+
* Get stats for health/debug.
|
|
71
|
+
*/
|
|
72
|
+
get stats(): {
|
|
73
|
+
channels: number;
|
|
74
|
+
totalClaims: number;
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=floor-control.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"floor-control.d.ts","sourceRoot":"","sources":["../../lib/floor-control.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,eAAe,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,qBAAa,YAAY;IAGvB,OAAO,CAAC,MAAM,CAAmD;IACjE,OAAO,CAAC,YAAY,CAA+C;IAEnE,KAAK,IAAI,IAAI;IAIb,IAAI,IAAI,IAAI;IAQZ;;;;;OAKG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG;QACzE,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,CAAC,EAAE,UAAU,CAAC;KACrB;IA4DD;;;OAGG;IACH,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAqBhD;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAS/D;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAI5D;;OAEG;IACH,OAAO,CAAC,OAAO;IAcf;;OAEG;IACH,IAAI,KAAK,IAAI;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAMrD;CACF"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Floor Control — RESPONDING_TO protocol
|
|
3
|
+
*
|
|
4
|
+
* Implements optimistic locking for agent channel responses.
|
|
5
|
+
* When an agent starts inference to respond to a message, it broadcasts
|
|
6
|
+
* RESPONDING_TO with {msg_id, started_at}. The server tracks claims
|
|
7
|
+
* per channel — earliest started_at wins, losers get YIELD.
|
|
8
|
+
*
|
|
9
|
+
* Design: advisory v1 — server dispatches YIELD but doesn't hard-block messages.
|
|
10
|
+
* Well-behaved agents abort their inference on YIELD.
|
|
11
|
+
*/
|
|
12
|
+
// Claim TTL — auto-expire if agent doesn't send a response within this window
|
|
13
|
+
const CLAIM_TTL_MS = parseInt(process.env.AGENTCHAT_CLAIM_TTL_MS || '45000', 10);
|
|
14
|
+
// Cleanup interval
|
|
15
|
+
const CLEANUP_INTERVAL_MS = 5000;
|
|
16
|
+
/**
|
|
17
|
+
* FloorControl tracks active claims per channel and resolves conflicts.
|
|
18
|
+
*/
|
|
19
|
+
export class FloorControl {
|
|
20
|
+
// Map: channel → Map<msg_id → FloorClaim>
|
|
21
|
+
// Only one claim per msg_id per channel (the winner)
|
|
22
|
+
claims = new Map();
|
|
23
|
+
cleanupTimer = null;
|
|
24
|
+
start() {
|
|
25
|
+
this.cleanupTimer = setInterval(() => this.cleanup(), CLEANUP_INTERVAL_MS);
|
|
26
|
+
}
|
|
27
|
+
stop() {
|
|
28
|
+
if (this.cleanupTimer) {
|
|
29
|
+
clearInterval(this.cleanupTimer);
|
|
30
|
+
this.cleanupTimer = null;
|
|
31
|
+
}
|
|
32
|
+
this.claims.clear();
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Process a RESPONDING_TO claim from an agent.
|
|
36
|
+
* Returns:
|
|
37
|
+
* { granted: true } if the agent wins the floor
|
|
38
|
+
* { granted: false, holder: FloorClaim } if someone else already has it
|
|
39
|
+
*/
|
|
40
|
+
claim(agentId, channel, msgId, startedAt) {
|
|
41
|
+
if (!this.claims.has(channel)) {
|
|
42
|
+
this.claims.set(channel, new Map());
|
|
43
|
+
}
|
|
44
|
+
const channelClaims = this.claims.get(channel);
|
|
45
|
+
const existing = channelClaims.get(msgId);
|
|
46
|
+
if (!existing) {
|
|
47
|
+
// No existing claim — grant it
|
|
48
|
+
const claim = {
|
|
49
|
+
agentId,
|
|
50
|
+
msgId,
|
|
51
|
+
channel,
|
|
52
|
+
startedAt,
|
|
53
|
+
receivedAt: Date.now(),
|
|
54
|
+
expiresAt: Date.now() + CLAIM_TTL_MS,
|
|
55
|
+
};
|
|
56
|
+
channelClaims.set(msgId, claim);
|
|
57
|
+
return { granted: true };
|
|
58
|
+
}
|
|
59
|
+
// Conflict — compare started_at timestamps
|
|
60
|
+
if (startedAt < existing.startedAt) {
|
|
61
|
+
// New claim started earlier — it wins, old holder gets yielded
|
|
62
|
+
const oldHolder = { ...existing };
|
|
63
|
+
const claim = {
|
|
64
|
+
agentId,
|
|
65
|
+
msgId,
|
|
66
|
+
channel,
|
|
67
|
+
startedAt,
|
|
68
|
+
receivedAt: Date.now(),
|
|
69
|
+
expiresAt: Date.now() + CLAIM_TTL_MS,
|
|
70
|
+
};
|
|
71
|
+
channelClaims.set(msgId, claim);
|
|
72
|
+
// Return the old holder so caller can send them YIELD
|
|
73
|
+
return { granted: true, holder: oldHolder };
|
|
74
|
+
}
|
|
75
|
+
if (startedAt === existing.startedAt) {
|
|
76
|
+
// Exact tie — tiebreak by agent ID (lexicographic, deterministic)
|
|
77
|
+
if (agentId < existing.agentId) {
|
|
78
|
+
const oldHolder = { ...existing };
|
|
79
|
+
const claim = {
|
|
80
|
+
agentId,
|
|
81
|
+
msgId,
|
|
82
|
+
channel,
|
|
83
|
+
startedAt,
|
|
84
|
+
receivedAt: Date.now(),
|
|
85
|
+
expiresAt: Date.now() + CLAIM_TTL_MS,
|
|
86
|
+
};
|
|
87
|
+
channelClaims.set(msgId, claim);
|
|
88
|
+
return { granted: true, holder: oldHolder };
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Existing claim started earlier (or won the tiebreak) — deny
|
|
92
|
+
return { granted: false, holder: existing };
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Release a claim when an agent sends their actual response,
|
|
96
|
+
* or on disconnect.
|
|
97
|
+
*/
|
|
98
|
+
release(agentId, channel) {
|
|
99
|
+
if (channel) {
|
|
100
|
+
const channelClaims = this.claims.get(channel);
|
|
101
|
+
if (!channelClaims)
|
|
102
|
+
return;
|
|
103
|
+
for (const [msgId, claim] of channelClaims) {
|
|
104
|
+
if (claim.agentId === agentId) {
|
|
105
|
+
channelClaims.delete(msgId);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
// Release all claims by this agent (disconnect cleanup)
|
|
111
|
+
for (const channelClaims of this.claims.values()) {
|
|
112
|
+
for (const [msgId, claim] of channelClaims) {
|
|
113
|
+
if (claim.agentId === agentId) {
|
|
114
|
+
channelClaims.delete(msgId);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Check if an agent currently holds the floor for any message in a channel.
|
|
122
|
+
*/
|
|
123
|
+
holdsFloor(agentId, channel) {
|
|
124
|
+
const channelClaims = this.claims.get(channel);
|
|
125
|
+
if (!channelClaims)
|
|
126
|
+
return null;
|
|
127
|
+
for (const claim of channelClaims.values()) {
|
|
128
|
+
if (claim.agentId === agentId)
|
|
129
|
+
return claim;
|
|
130
|
+
}
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Get the current floor holder for a specific message.
|
|
135
|
+
*/
|
|
136
|
+
getHolder(channel, msgId) {
|
|
137
|
+
return this.claims.get(channel)?.get(msgId) || null;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Expire stale claims.
|
|
141
|
+
*/
|
|
142
|
+
cleanup() {
|
|
143
|
+
const now = Date.now();
|
|
144
|
+
for (const [channel, channelClaims] of this.claims) {
|
|
145
|
+
for (const [msgId, claim] of channelClaims) {
|
|
146
|
+
if (claim.expiresAt <= now) {
|
|
147
|
+
channelClaims.delete(msgId);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
if (channelClaims.size === 0) {
|
|
151
|
+
this.claims.delete(channel);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Get stats for health/debug.
|
|
157
|
+
*/
|
|
158
|
+
get stats() {
|
|
159
|
+
let totalClaims = 0;
|
|
160
|
+
for (const channelClaims of this.claims.values()) {
|
|
161
|
+
totalClaims += channelClaims.size;
|
|
162
|
+
}
|
|
163
|
+
return { channels: this.claims.size, totalClaims };
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=floor-control.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"floor-control.js","sourceRoot":"","sources":["../../lib/floor-control.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Escalation Plugin
|
|
3
|
+
*
|
|
4
|
+
* Wraps the EscalationEngine as a ModerationPlugin.
|
|
5
|
+
* Tracks rate limit violations and progressively escalates:
|
|
6
|
+
* warn -> throttle -> timeout -> kick
|
|
7
|
+
*/
|
|
8
|
+
import type { ModerationPlugin, ModerationEvent, ModerationAction } from '../moderation.js';
|
|
9
|
+
import { type EscalationOptions } from '../escalation.js';
|
|
10
|
+
export declare class EscalationPlugin implements ModerationPlugin {
|
|
11
|
+
readonly name = "escalation";
|
|
12
|
+
readonly failBehavior: "closed";
|
|
13
|
+
private engine;
|
|
14
|
+
constructor(options?: EscalationOptions);
|
|
15
|
+
check(event: ModerationEvent): ModerationAction;
|
|
16
|
+
/**
|
|
17
|
+
* Call this when a rate limit violation occurs (separate from check).
|
|
18
|
+
* Returns the escalation action.
|
|
19
|
+
*/
|
|
20
|
+
recordViolation(agentId: string): ModerationAction;
|
|
21
|
+
onDisconnect(agentId: string): void;
|
|
22
|
+
cleanup(): number;
|
|
23
|
+
/** Expose engine stats for monitoring */
|
|
24
|
+
stats(): {
|
|
25
|
+
tracked: number;
|
|
26
|
+
warned: number;
|
|
27
|
+
throttled: number;
|
|
28
|
+
timedOut: number;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=escalation-plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"escalation-plugin.d.ts","sourceRoot":"","sources":["../../../lib/moderation-plugins/escalation-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAE5F,OAAO,EAAoB,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAE5E,qBAAa,gBAAiB,YAAW,gBAAgB;IACvD,QAAQ,CAAC,IAAI,gBAAgB;IAC7B,QAAQ,CAAC,YAAY,EAAG,QAAQ,CAAU;IAC1C,OAAO,CAAC,MAAM,CAAmB;gBAErB,OAAO,CAAC,EAAE,iBAAiB;IAIvC,KAAK,CAAC,KAAK,EAAE,eAAe,GAAG,gBAAgB;IA+B/C;;;OAGG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB;IAuClD,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKnC,OAAO,IAAI,MAAM;IAIjB,yCAAyC;IACzC,KAAK;;;;;;CAGN"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Escalation Plugin
|
|
3
|
+
*
|
|
4
|
+
* Wraps the EscalationEngine as a ModerationPlugin.
|
|
5
|
+
* Tracks rate limit violations and progressively escalates:
|
|
6
|
+
* warn -> throttle -> timeout -> kick
|
|
7
|
+
*/
|
|
8
|
+
import { ModerationActionType } from '../moderation.js';
|
|
9
|
+
import { EscalationEngine } from '../escalation.js';
|
|
10
|
+
export class EscalationPlugin {
|
|
11
|
+
name = 'escalation';
|
|
12
|
+
failBehavior = 'closed';
|
|
13
|
+
engine;
|
|
14
|
+
constructor(options) {
|
|
15
|
+
this.engine = new EscalationEngine(options);
|
|
16
|
+
}
|
|
17
|
+
check(event) {
|
|
18
|
+
const connId = event.agentId || event.ip || 'unknown';
|
|
19
|
+
// Check if currently timed out
|
|
20
|
+
if (this.engine.isTimedOut(connId)) {
|
|
21
|
+
return {
|
|
22
|
+
type: ModerationActionType.TIMEOUT,
|
|
23
|
+
reason: 'Connection is currently timed out',
|
|
24
|
+
plugin: this.name,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
// Check if throttled — return throttle action with metadata
|
|
28
|
+
const throttleDelay = this.engine.getThrottleDelay(connId);
|
|
29
|
+
if (throttleDelay > 0) {
|
|
30
|
+
return {
|
|
31
|
+
type: ModerationActionType.THROTTLE,
|
|
32
|
+
reason: `Throttled: max 1 message per ${Math.ceil(throttleDelay / 1000)} seconds`,
|
|
33
|
+
plugin: this.name,
|
|
34
|
+
metadata: { throttleMs: throttleDelay },
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
// No active enforcement — allow
|
|
38
|
+
return {
|
|
39
|
+
type: ModerationActionType.ALLOW,
|
|
40
|
+
reason: '',
|
|
41
|
+
plugin: this.name,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Call this when a rate limit violation occurs (separate from check).
|
|
46
|
+
* Returns the escalation action.
|
|
47
|
+
*/
|
|
48
|
+
recordViolation(agentId) {
|
|
49
|
+
const action = this.engine.recordViolation(agentId);
|
|
50
|
+
switch (action.type) {
|
|
51
|
+
case 'kick':
|
|
52
|
+
return {
|
|
53
|
+
type: ModerationActionType.KICK,
|
|
54
|
+
reason: action.message,
|
|
55
|
+
plugin: this.name,
|
|
56
|
+
};
|
|
57
|
+
case 'timeout':
|
|
58
|
+
return {
|
|
59
|
+
type: ModerationActionType.TIMEOUT,
|
|
60
|
+
reason: action.message,
|
|
61
|
+
plugin: this.name,
|
|
62
|
+
metadata: { timeoutMs: action.timeoutMs },
|
|
63
|
+
};
|
|
64
|
+
case 'throttle':
|
|
65
|
+
return {
|
|
66
|
+
type: ModerationActionType.THROTTLE,
|
|
67
|
+
reason: action.message,
|
|
68
|
+
plugin: this.name,
|
|
69
|
+
metadata: { throttleMs: action.throttleMs },
|
|
70
|
+
};
|
|
71
|
+
case 'warn':
|
|
72
|
+
return {
|
|
73
|
+
type: ModerationActionType.WARN,
|
|
74
|
+
reason: action.message,
|
|
75
|
+
plugin: this.name,
|
|
76
|
+
};
|
|
77
|
+
default:
|
|
78
|
+
return {
|
|
79
|
+
type: ModerationActionType.ALLOW,
|
|
80
|
+
reason: '',
|
|
81
|
+
plugin: this.name,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
onDisconnect(agentId) {
|
|
86
|
+
// Don't remove state on disconnect — prevents reconnect-to-reset abuse
|
|
87
|
+
// Stale entries cleaned up via cleanup()
|
|
88
|
+
}
|
|
89
|
+
cleanup() {
|
|
90
|
+
return this.engine.cleanup();
|
|
91
|
+
}
|
|
92
|
+
/** Expose engine stats for monitoring */
|
|
93
|
+
stats() {
|
|
94
|
+
return this.engine.stats();
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=escalation-plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"escalation-plugin.js","sourceRoot":"","sources":["../../../lib/moderation-plugins/escalation-plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Link Detector Plugin
|
|
3
|
+
*
|
|
4
|
+
* Flags or blocks messages containing URLs from new/untrusted connections.
|
|
5
|
+
* Trusted (verified) agents can post links freely.
|
|
6
|
+
*/
|
|
7
|
+
import type { ModerationPlugin, ModerationEvent, ModerationAction } from '../moderation.js';
|
|
8
|
+
import { ModerationActionType } from '../moderation.js';
|
|
9
|
+
export interface LinkDetectorOptions {
|
|
10
|
+
/** Action for untrusted agents posting links (default: warn) */
|
|
11
|
+
untrustedAction?: ModerationActionType;
|
|
12
|
+
/** Minimum connection age in ms before links are allowed (default: 300000 = 5min) */
|
|
13
|
+
minConnectionAgeMs?: number;
|
|
14
|
+
/** Allow verified (persistent identity) agents to post links regardless of age */
|
|
15
|
+
trustVerified?: boolean;
|
|
16
|
+
/** URL patterns to always block (regex strings) */
|
|
17
|
+
blockedPatterns?: string[];
|
|
18
|
+
}
|
|
19
|
+
export declare class LinkDetectorPlugin implements ModerationPlugin {
|
|
20
|
+
readonly name = "link-detector";
|
|
21
|
+
readonly failBehavior: "open";
|
|
22
|
+
private untrustedAction;
|
|
23
|
+
private minConnectionAgeMs;
|
|
24
|
+
private trustVerified;
|
|
25
|
+
private blockedPatterns;
|
|
26
|
+
constructor(options?: LinkDetectorOptions);
|
|
27
|
+
check(event: ModerationEvent): ModerationAction;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=link-detector-plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link-detector-plugin.d.ts","sourceRoot":"","sources":["../../../lib/moderation-plugins/link-detector-plugin.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAC5F,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD,MAAM,WAAW,mBAAmB;IAClC,gEAAgE;IAChE,eAAe,CAAC,EAAE,oBAAoB,CAAC;IACvC,qFAAqF;IACrF,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,kFAAkF;IAClF,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,mDAAmD;IACnD,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAID,qBAAa,kBAAmB,YAAW,gBAAgB;IACzD,QAAQ,CAAC,IAAI,mBAAmB;IAChC,QAAQ,CAAC,YAAY,EAAG,MAAM,CAAU;IACxC,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,aAAa,CAAU;IAC/B,OAAO,CAAC,eAAe,CAAW;gBAEtB,OAAO,GAAE,mBAAwB;IAO7C,KAAK,CAAC,KAAK,EAAE,eAAe,GAAG,gBAAgB;CA2ChD"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Link Detector Plugin
|
|
3
|
+
*
|
|
4
|
+
* Flags or blocks messages containing URLs from new/untrusted connections.
|
|
5
|
+
* Trusted (verified) agents can post links freely.
|
|
6
|
+
*/
|
|
7
|
+
import { ModerationActionType } from '../moderation.js';
|
|
8
|
+
const URL_REGEX = /https?:\/\/[^\s<>"{}|\\^`\[\]]+/gi;
|
|
9
|
+
export class LinkDetectorPlugin {
|
|
10
|
+
name = 'link-detector';
|
|
11
|
+
failBehavior = 'open';
|
|
12
|
+
untrustedAction;
|
|
13
|
+
minConnectionAgeMs;
|
|
14
|
+
trustVerified;
|
|
15
|
+
blockedPatterns;
|
|
16
|
+
constructor(options = {}) {
|
|
17
|
+
this.untrustedAction = options.untrustedAction || ModerationActionType.WARN;
|
|
18
|
+
this.minConnectionAgeMs = options.minConnectionAgeMs ?? 300000;
|
|
19
|
+
this.trustVerified = options.trustVerified !== false;
|
|
20
|
+
this.blockedPatterns = (options.blockedPatterns || []).map(p => new RegExp(p, 'i'));
|
|
21
|
+
}
|
|
22
|
+
check(event) {
|
|
23
|
+
// Only check MSG-type events with content
|
|
24
|
+
if (event.messageType !== 'MSG' || !event.content) {
|
|
25
|
+
return { type: ModerationActionType.ALLOW, reason: '', plugin: this.name };
|
|
26
|
+
}
|
|
27
|
+
const urls = event.content.match(URL_REGEX);
|
|
28
|
+
if (!urls || urls.length === 0) {
|
|
29
|
+
return { type: ModerationActionType.ALLOW, reason: '', plugin: this.name };
|
|
30
|
+
}
|
|
31
|
+
// Check for always-blocked URL patterns
|
|
32
|
+
for (const url of urls) {
|
|
33
|
+
for (const pattern of this.blockedPatterns) {
|
|
34
|
+
if (pattern.test(url)) {
|
|
35
|
+
return {
|
|
36
|
+
type: ModerationActionType.BLOCK,
|
|
37
|
+
reason: `Blocked URL pattern detected: ${url}`,
|
|
38
|
+
plugin: this.name,
|
|
39
|
+
metadata: { matchedUrl: url, pattern: pattern.source },
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// Verified agents with persistent identity are trusted
|
|
45
|
+
if (this.trustVerified && event.verified) {
|
|
46
|
+
return { type: ModerationActionType.ALLOW, reason: '', plugin: this.name };
|
|
47
|
+
}
|
|
48
|
+
// Check connection age
|
|
49
|
+
const age = event.connectionAgeMs || 0;
|
|
50
|
+
if (age < this.minConnectionAgeMs) {
|
|
51
|
+
return {
|
|
52
|
+
type: this.untrustedAction,
|
|
53
|
+
reason: `New connection (${Math.ceil(age / 1000)}s) posting links. Min age: ${Math.ceil(this.minConnectionAgeMs / 1000)}s.`,
|
|
54
|
+
plugin: this.name,
|
|
55
|
+
metadata: { urls, connectionAgeMs: age },
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
return { type: ModerationActionType.ALLOW, reason: '', plugin: this.name };
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=link-detector-plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link-detector-plugin.js","sourceRoot":"","sources":["../../../lib/moderation-plugins/link-detector-plugin.ts"],"names":[],"mappings":"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"}
|