@tjamescouch/agentchat 0.25.2 → 0.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/README.md +53 -4
  2. package/dist/lib/callback-engine.d.ts +66 -0
  3. package/dist/lib/callback-engine.d.ts.map +1 -0
  4. package/dist/lib/callback-engine.js +199 -0
  5. package/dist/lib/callback-engine.js.map +1 -0
  6. package/dist/lib/client.d.ts +3 -1
  7. package/dist/lib/client.d.ts.map +1 -1
  8. package/dist/lib/client.js +3 -2
  9. package/dist/lib/client.js.map +1 -1
  10. package/dist/lib/escalation.d.ts +99 -0
  11. package/dist/lib/escalation.d.ts.map +1 -0
  12. package/dist/lib/escalation.js +286 -0
  13. package/dist/lib/escalation.js.map +1 -0
  14. package/dist/lib/escalation.test.d.ts +8 -0
  15. package/dist/lib/escalation.test.d.ts.map +1 -0
  16. package/dist/lib/escalation.test.js +348 -0
  17. package/dist/lib/escalation.test.js.map +1 -0
  18. package/dist/lib/floor-control.d.ts +77 -0
  19. package/dist/lib/floor-control.d.ts.map +1 -0
  20. package/dist/lib/floor-control.js +166 -0
  21. package/dist/lib/floor-control.js.map +1 -0
  22. package/dist/lib/moderation-plugins/escalation-plugin.d.ts +31 -0
  23. package/dist/lib/moderation-plugins/escalation-plugin.d.ts.map +1 -0
  24. package/dist/lib/moderation-plugins/escalation-plugin.js +97 -0
  25. package/dist/lib/moderation-plugins/escalation-plugin.js.map +1 -0
  26. package/dist/lib/moderation-plugins/link-detector-plugin.d.ts +29 -0
  27. package/dist/lib/moderation-plugins/link-detector-plugin.d.ts.map +1 -0
  28. package/dist/lib/moderation-plugins/link-detector-plugin.js +61 -0
  29. package/dist/lib/moderation-plugins/link-detector-plugin.js.map +1 -0
  30. package/dist/lib/moderation.d.ts +142 -0
  31. package/dist/lib/moderation.d.ts.map +1 -0
  32. package/dist/lib/moderation.js +192 -0
  33. package/dist/lib/moderation.js.map +1 -0
  34. package/dist/lib/moderation.test.d.ts +7 -0
  35. package/dist/lib/moderation.test.d.ts.map +1 -0
  36. package/dist/lib/moderation.test.js +275 -0
  37. package/dist/lib/moderation.test.js.map +1 -0
  38. package/dist/lib/protocol.d.ts +5 -0
  39. package/dist/lib/protocol.d.ts.map +1 -1
  40. package/dist/lib/protocol.js +18 -2
  41. package/dist/lib/protocol.js.map +1 -1
  42. package/dist/lib/security.d.ts.map +1 -1
  43. package/dist/lib/security.js +13 -4
  44. package/dist/lib/security.js.map +1 -1
  45. package/dist/lib/server/handlers/message.d.ts.map +1 -1
  46. package/dist/lib/server/handlers/message.js +22 -2
  47. package/dist/lib/server/handlers/message.js.map +1 -1
  48. package/dist/lib/server.d.ts +8 -0
  49. package/dist/lib/server.d.ts.map +1 -1
  50. package/dist/lib/server.js +106 -2
  51. package/dist/lib/server.js.map +1 -1
  52. package/dist/lib/types.d.ts +13 -1
  53. package/dist/lib/types.d.ts.map +1 -1
  54. package/dist/lib/types.js +5 -0
  55. package/dist/lib/types.js.map +1 -1
  56. 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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"}