@kilnai/runtime 0.9.2 → 0.13.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/dist/gateway/gateway-server.d.ts.map +1 -1
- package/dist/gateway/gateway-server.js +17 -6
- package/dist/gateway/gateway-server.js.map +1 -1
- package/dist/gateway/knowledge-admin-routes.d.ts.map +1 -1
- package/dist/gateway/knowledge-admin-routes.js +37 -0
- package/dist/gateway/knowledge-admin-routes.js.map +1 -1
- package/dist/gateway/message-pipeline.d.ts +12 -1
- package/dist/gateway/message-pipeline.d.ts.map +1 -1
- package/dist/gateway/message-pipeline.js +119 -1
- package/dist/gateway/message-pipeline.js.map +1 -1
- package/dist/gateway/tenant-admin-routes.d.ts.map +1 -1
- package/dist/gateway/tenant-admin-routes.js +3 -0
- package/dist/gateway/tenant-admin-routes.js.map +1 -1
- package/dist/gateway/visitor-sanitizer.d.ts +12 -0
- package/dist/gateway/visitor-sanitizer.d.ts.map +1 -0
- package/dist/gateway/visitor-sanitizer.js +73 -0
- package/dist/gateway/visitor-sanitizer.js.map +1 -0
- package/dist/gateway/whatsapp-webhook-routes.d.ts.map +1 -1
- package/dist/gateway/whatsapp-webhook-routes.js +81 -0
- package/dist/gateway/whatsapp-webhook-routes.js.map +1 -1
- package/dist/gateway/ws-tenant-routes.d.ts.map +1 -1
- package/dist/gateway/ws-tenant-routes.js +22 -2
- package/dist/gateway/ws-tenant-routes.js.map +1 -1
- package/dist/session/mode-b-orchestrator.d.ts +1 -0
- package/dist/session/mode-b-orchestrator.d.ts.map +1 -1
- package/dist/session/mode-b-orchestrator.js +3 -0
- package/dist/session/mode-b-orchestrator.js.map +1 -1
- package/dist/session/mode-b-session.d.ts +11 -0
- package/dist/session/mode-b-session.d.ts.map +1 -1
- package/dist/session/mode-b-session.js +29 -0
- package/dist/session/mode-b-session.js.map +1 -1
- package/dist/session/repetitive-abuse-detector.d.ts +12 -0
- package/dist/session/repetitive-abuse-detector.d.ts.map +1 -0
- package/dist/session/repetitive-abuse-detector.js +47 -0
- package/dist/session/repetitive-abuse-detector.js.map +1 -0
- package/dist/session/session-serializer.d.ts.map +1 -1
- package/dist/session/session-serializer.js +3 -0
- package/dist/session/session-serializer.js.map +1 -1
- package/package.json +2 -2
|
@@ -22,6 +22,9 @@ export interface SerializedSessionData {
|
|
|
22
22
|
readonly agentTurnHistory: readonly AgentTurnEntry[];
|
|
23
23
|
readonly handoffCount: number;
|
|
24
24
|
readonly lastRouteChangeAt: number;
|
|
25
|
+
readonly totalTokens?: number;
|
|
26
|
+
readonly userTurnCount?: number;
|
|
27
|
+
readonly lastHumanMessageAt?: number | null;
|
|
25
28
|
}
|
|
26
29
|
export interface ModeBSessionConfig {
|
|
27
30
|
readonly appName: string;
|
|
@@ -47,6 +50,9 @@ export declare class ModeBSession {
|
|
|
47
50
|
private _agentTurnHistory;
|
|
48
51
|
private _handoffCount;
|
|
49
52
|
private _lastRouteChangeAt;
|
|
53
|
+
private _totalTokens;
|
|
54
|
+
private _userTurnCount;
|
|
55
|
+
private _lastHumanMessageAt;
|
|
50
56
|
constructor(config: ModeBSessionConfig);
|
|
51
57
|
get lastActivityAt(): Date;
|
|
52
58
|
get isExpired(): boolean;
|
|
@@ -68,6 +74,11 @@ export declare class ModeBSession {
|
|
|
68
74
|
get agentTurnHistory(): readonly AgentTurnEntry[];
|
|
69
75
|
get handoffCount(): number;
|
|
70
76
|
get lastRouteChangeAt(): number;
|
|
77
|
+
get totalTokens(): number;
|
|
78
|
+
get userTurnCount(): number;
|
|
79
|
+
get lastHumanMessageAt(): number | null;
|
|
80
|
+
recordHumanMessage(): void;
|
|
81
|
+
accumulateTokens(count: number): void;
|
|
71
82
|
setActiveAgent(agentId: string, handoffBrief?: string): void;
|
|
72
83
|
setSystemPrompt(prompt: string): void;
|
|
73
84
|
lastAssistantTexts(count: number): string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mode-b-session.d.ts","sourceRoot":"","sources":["../../src/session/mode-b-session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,CAAC;IAC1C,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,gBAAgB,EAAE,SAAS,cAAc,EAAE,CAAC;IACrD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"mode-b-session.d.ts","sourceRoot":"","sources":["../../src/session/mode-b-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,6 +17,9 @@ export class ModeBSession {
|
|
|
17
17
|
_agentTurnHistory = [];
|
|
18
18
|
_handoffCount = 0;
|
|
19
19
|
_lastRouteChangeAt = 0;
|
|
20
|
+
_totalTokens = 0;
|
|
21
|
+
_userTurnCount = 0;
|
|
22
|
+
_lastHumanMessageAt = null;
|
|
20
23
|
constructor(config) {
|
|
21
24
|
this.appName = config.appName;
|
|
22
25
|
this.tenantId = config.tenantId;
|
|
@@ -80,6 +83,15 @@ export class ModeBSession {
|
|
|
80
83
|
session._agentTurnHistory = [...data.agentTurnHistory];
|
|
81
84
|
session._handoffCount = data.handoffCount;
|
|
82
85
|
session._lastRouteChangeAt = data.lastRouteChangeAt;
|
|
86
|
+
// Restore token/turn counters (userTurnCount was incremented during history replay -- override with stored value)
|
|
87
|
+
session._totalTokens = data.totalTokens ?? 0;
|
|
88
|
+
if (data.userTurnCount !== undefined) {
|
|
89
|
+
session._userTurnCount = data.userTurnCount;
|
|
90
|
+
}
|
|
91
|
+
// Restore coexistence timestamp
|
|
92
|
+
if (data.lastHumanMessageAt != null) {
|
|
93
|
+
session._lastHumanMessageAt = data.lastHumanMessageAt;
|
|
94
|
+
}
|
|
83
95
|
// Restore version and record loaded version for conflict detection
|
|
84
96
|
const storedVersion = data.version;
|
|
85
97
|
session._version = storedVersion;
|
|
@@ -88,6 +100,7 @@ export class ModeBSession {
|
|
|
88
100
|
}
|
|
89
101
|
addUserMessage(parts) {
|
|
90
102
|
this._history.push({ role: "user", parts });
|
|
103
|
+
this._userTurnCount++;
|
|
91
104
|
this.touch();
|
|
92
105
|
}
|
|
93
106
|
addAssistantMessage(parts) {
|
|
@@ -117,6 +130,22 @@ export class ModeBSession {
|
|
|
117
130
|
get lastRouteChangeAt() {
|
|
118
131
|
return this._lastRouteChangeAt;
|
|
119
132
|
}
|
|
133
|
+
get totalTokens() {
|
|
134
|
+
return this._totalTokens;
|
|
135
|
+
}
|
|
136
|
+
get userTurnCount() {
|
|
137
|
+
return this._userTurnCount;
|
|
138
|
+
}
|
|
139
|
+
get lastHumanMessageAt() {
|
|
140
|
+
return this._lastHumanMessageAt;
|
|
141
|
+
}
|
|
142
|
+
recordHumanMessage() {
|
|
143
|
+
this._lastHumanMessageAt = Date.now();
|
|
144
|
+
this._version++;
|
|
145
|
+
}
|
|
146
|
+
accumulateTokens(count) {
|
|
147
|
+
this._totalTokens += count;
|
|
148
|
+
}
|
|
120
149
|
setActiveAgent(agentId, handoffBrief) {
|
|
121
150
|
if (this._activeAgentId === agentId)
|
|
122
151
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mode-b-session.js","sourceRoot":"","sources":["../../src/session/mode-b-session.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"mode-b-session.js","sourceRoot":"","sources":["../../src/session/mode-b-session.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAsC1D,MAAM,OAAO,YAAY;IACd,EAAE,CAAS;IACX,OAAO,CAAS;IAChB,QAAQ,CAAS;IACjB,MAAM,CAAS;IACf,SAAS,CAAO;IAEjB,eAAe,CAAO;IACtB,aAAa,CAAS;IACb,cAAc,CAAS;IACvB,QAAQ,GAAmB,EAAE,CAAC;IACvC,YAAY,GAAgB,WAAW,CAAC;IACxC,QAAQ,GAAG,CAAC,CAAC;IACb,cAAc,GAAG,CAAC,CAAC;IACnB,cAAc,GAAkB,IAAI,CAAC;IACrC,iBAAiB,GAAqB,EAAE,CAAC;IACzC,aAAa,GAAG,CAAC,CAAC;IAClB,kBAAkB,GAAG,CAAC,CAAC;IACvB,YAAY,GAAG,CAAC,CAAC;IACjB,cAAc,GAAG,CAAC,CAAC;IACnB,mBAAmB,GAAkB,IAAI,CAAC;IAElD,YAAY,MAA0B;QACpC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC9B,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,YAAY,CAAC;QACzC,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,aAAa,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QAC7D,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,eAAe,GAAG,IAAI,IAAI,EAAE,CAAC;QAClC,IAAI,CAAC,EAAE,GAAG,GAAG,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IAClF,CAAC;IAED,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC;IAC3E,CAAC;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;IAC9B,CAAC;IAED,IAAI,mBAAmB;QACrB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED,qEAAqE;IACrE,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,oFAAoF;IACpF,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,IAA2B;QAC/C,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;YAC/B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,aAAa,EAAE,IAAI,CAAC,aAAa;SAClC,CAAC,CAAC;QACH,uDAAuD;QACtD,OAA0B,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QACxC,OAA+B,CAAC,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACrE,OAAgD,CAAC,eAAe,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACjG,OAAoD,CAAC,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC;QACtF,iBAAiB;QACjB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC/B,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM;gBAAE,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;;gBACtD,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC9C,CAAC;QACD,uDAAuD;QACtD,OAAgD,CAAC,eAAe,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAClG,8BAA8B;QAC7B,OAAwD,CAAC,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC;QAC7F,OAA8D,CAAC,iBAAiB,GAAG,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC9G,OAAgD,CAAC,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC;QACnF,OAAqD,CAAC,kBAAkB,GAAG,IAAI,CAAC,iBAAiB,CAAC;QACnG,kHAAkH;QACjH,OAA+C,CAAC,YAAY,GAAG,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC;QACtF,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACpC,OAAiD,CAAC,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC;QACzF,CAAC;QACD,gCAAgC;QAChC,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,EAAE,CAAC;YACnC,OAA6D,CAAC,mBAAmB,GAAG,IAAI,CAAC,kBAAkB,CAAC;QAC/G,CAAC;QACD,mEAAmE;QACnE,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC;QAClC,OAA2C,CAAC,QAAQ,GAAG,aAAa,CAAC;QACrE,OAAiD,CAAC,cAAc,GAAG,aAAa,CAAC;QAClF,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,cAAc,CAAC,KAA6B;QAC1C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;IAED,mBAAmB,CAAC,KAA6B;QAC/C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;IAED,KAAK;QACH,IAAI,CAAC,eAAe,GAAG,IAAI,IAAI,EAAE,CAAC;QAClC,IAAI,CAAC,QAAQ,EAAE,CAAC;IAClB,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED,cAAc,CAAC,IAAiB;QAC9B,IAAI,CAAC,YAAY,GAAG,qBAAqB,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QACnE,IAAI,CAAC,QAAQ,EAAE,CAAC;IAClB,CAAC;IAED,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED,IAAI,gBAAgB;QAClB,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,IAAI,iBAAiB;QACnB,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED,IAAI,kBAAkB;QACpB,OAAO,IAAI,CAAC,mBAAmB,CAAC;IAClC,CAAC;IAED,kBAAkB;QAChB,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACtC,IAAI,CAAC,QAAQ,EAAE,CAAC;IAClB,CAAC;IAED,gBAAgB,CAAC,KAAa;QAC5B,IAAI,CAAC,YAAY,IAAI,KAAK,CAAC;IAC7B,CAAC;IAED,cAAc,CAAC,OAAe,EAAE,YAAqB;QACnD,IAAI,IAAI,CAAC,cAAc,KAAK,OAAO;YAAE,OAAO;QAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,IAAI,SAAS,CAAC;QACrD,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC;QAC9B,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC;QACrG,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC/C,IAAI,CAAC,QAAQ,EAAE,CAAC;IAClB,CAAC;IAED,eAAe,CAAC,MAAc;QAC5B,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;QAC5B,IAAI,CAAC,QAAQ,EAAE,CAAC;IAClB,CAAC;IAED,kBAAkB,CAAC,KAAa;QAC9B,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3E,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBAC3C,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC,OAAO,EAAE,CAAC;IACzB,CAAC;IAED,qBAAqB,CAAC,KAA6B;QACjD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;CACF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { AgentMessage } from "@kilnai/core";
|
|
2
|
+
export interface AbuseSignal {
|
|
3
|
+
readonly type: "repetition" | "sequential";
|
|
4
|
+
readonly confidence: number;
|
|
5
|
+
readonly detail: string;
|
|
6
|
+
}
|
|
7
|
+
export interface AbuseDetectionConfig {
|
|
8
|
+
readonly windowSize?: number;
|
|
9
|
+
readonly repetitionThreshold?: number;
|
|
10
|
+
}
|
|
11
|
+
export declare function detectRepetitiveAbuse(userText: string, recentHistory: readonly AgentMessage[], config?: AbuseDetectionConfig): AbuseSignal | null;
|
|
12
|
+
//# sourceMappingURL=repetitive-abuse-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repetitive-abuse-detector.d.ts","sourceRoot":"","sources":["../../src/session/repetitive-abuse-detector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGjD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,YAAY,CAAC;IAC3C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;CACvC;AAID,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,SAAS,YAAY,EAAE,EACtC,MAAM,CAAC,EAAE,oBAAoB,GAC5B,WAAW,GAAG,IAAI,CAmDpB"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { extractText } from "@kilnai/core";
|
|
2
|
+
const ABUSE_KEYWORDS = ["continue", "go on", "next", "more", "keep going"];
|
|
3
|
+
export function detectRepetitiveAbuse(userText, recentHistory, config) {
|
|
4
|
+
const windowSize = config?.windowSize ?? 5;
|
|
5
|
+
const threshold = config?.repetitionThreshold ?? 0.6;
|
|
6
|
+
// Extract recent user messages
|
|
7
|
+
const recentUserTexts = [];
|
|
8
|
+
for (let i = recentHistory.length - 1; i >= 0 && recentUserTexts.length < windowSize; i--) {
|
|
9
|
+
if (recentHistory[i].role === "user") {
|
|
10
|
+
recentUserTexts.push(extractText(recentHistory[i].parts).toLowerCase().trim());
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
if (recentUserTexts.length < 2)
|
|
14
|
+
return null;
|
|
15
|
+
const currentLower = userText.toLowerCase().trim();
|
|
16
|
+
// Check 1: Exact repetition (same message repeated)
|
|
17
|
+
const exactMatches = recentUserTexts.filter(t => t === currentLower).length;
|
|
18
|
+
if (exactMatches / recentUserTexts.length >= threshold) {
|
|
19
|
+
return {
|
|
20
|
+
type: "repetition",
|
|
21
|
+
confidence: exactMatches / recentUserTexts.length,
|
|
22
|
+
detail: `Repeated message "${currentLower.slice(0, 50)}" ${exactMatches}/${recentUserTexts.length} times`,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
// Check 2: Abuse keyword spam (continue/next/more repeatedly)
|
|
26
|
+
const keywordMessages = [currentLower, ...recentUserTexts];
|
|
27
|
+
const keywordMatches = keywordMessages.filter(t => ABUSE_KEYWORDS.some(kw => t === kw || t.startsWith(kw + " ") || t.endsWith(" " + kw))).length;
|
|
28
|
+
if (keywordMatches / keywordMessages.length >= threshold) {
|
|
29
|
+
return {
|
|
30
|
+
type: "repetition",
|
|
31
|
+
confidence: keywordMatches / keywordMessages.length,
|
|
32
|
+
detail: `Abuse keyword pattern detected ${keywordMatches}/${keywordMessages.length} messages`,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
// Check 3: Sequential counting (1, 2, 3, 4...)
|
|
36
|
+
const allTexts = [currentLower, ...recentUserTexts];
|
|
37
|
+
const numberCount = allTexts.filter(t => /^\d+$/.test(t)).length;
|
|
38
|
+
if (numberCount >= 3 && numberCount / allTexts.length >= threshold) {
|
|
39
|
+
return {
|
|
40
|
+
type: "sequential",
|
|
41
|
+
confidence: numberCount / allTexts.length,
|
|
42
|
+
detail: `Sequential number pattern: ${numberCount}/${allTexts.length} messages are bare numbers`,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=repetitive-abuse-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repetitive-abuse-detector.js","sourceRoot":"","sources":["../../src/session/repetitive-abuse-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-serializer.d.ts","sourceRoot":"","sources":["../../src/session/session-serializer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGnD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"session-serializer.d.ts","sourceRoot":"","sources":["../../src/session/session-serializer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGnD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAsB9D;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAG7D"}
|
|
@@ -16,6 +16,9 @@ export function serializeSession(session) {
|
|
|
16
16
|
agentTurnHistory: session.agentTurnHistory,
|
|
17
17
|
handoffCount: session.handoffCount,
|
|
18
18
|
lastRouteChangeAt: session.lastRouteChangeAt,
|
|
19
|
+
totalTokens: session.totalTokens,
|
|
20
|
+
userTurnCount: session.userTurnCount,
|
|
21
|
+
lastHumanMessageAt: session.lastHumanMessageAt,
|
|
19
22
|
};
|
|
20
23
|
return JSON.stringify(data);
|
|
21
24
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-serializer.js","sourceRoot":"","sources":["../../src/session/session-serializer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGnD,MAAM,UAAU,gBAAgB,CAAC,OAAqB;IACpD,MAAM,IAAI,GAA0B;QAClC,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,WAAW,EAAE;QAC1C,cAAc,EAAE,OAAO,CAAC,cAAc,CAAC,WAAW,EAAE;QACpD,OAAO,EAAE,OAAO,CAAC,mBAAqC;QACtD,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;QAC1C,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;
|
|
1
|
+
{"version":3,"file":"session-serializer.js","sourceRoot":"","sources":["../../src/session/session-serializer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGnD,MAAM,UAAU,gBAAgB,CAAC,OAAqB;IACpD,MAAM,IAAI,GAA0B;QAClC,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,WAAW,EAAE;QAC1C,cAAc,EAAE,OAAO,CAAC,cAAc,CAAC,WAAW,EAAE;QACpD,OAAO,EAAE,OAAO,CAAC,mBAAqC;QACtD,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;QAC1C,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;KAC/C,CAAC;IACF,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA0B,CAAC;IACvD,OAAO,YAAY,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;AAC3C,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kilnai/runtime",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.13.0",
|
|
4
4
|
"description": "Multi-app gateway server, multi-tenant management, and channel adapters for @kilnai/core",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
"hono": "^4.7.0"
|
|
43
43
|
},
|
|
44
44
|
"peerDependencies": {
|
|
45
|
-
"@kilnai/core": "^0.
|
|
45
|
+
"@kilnai/core": "^0.13.0",
|
|
46
46
|
"@opentelemetry/api": "^1.9.0",
|
|
47
47
|
"ioredis": ">=5.0.0"
|
|
48
48
|
},
|