@agentick/gateway 0.0.1
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/LICENSE +21 -0
- package/README.md +477 -0
- package/dist/agent-registry.d.ts +51 -0
- package/dist/agent-registry.d.ts.map +1 -0
- package/dist/agent-registry.js +78 -0
- package/dist/agent-registry.js.map +1 -0
- package/dist/app-registry.d.ts +51 -0
- package/dist/app-registry.d.ts.map +1 -0
- package/dist/app-registry.js +78 -0
- package/dist/app-registry.js.map +1 -0
- package/dist/bin.d.ts +8 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +37 -0
- package/dist/bin.js.map +1 -0
- package/dist/gateway.d.ts +165 -0
- package/dist/gateway.d.ts.map +1 -0
- package/dist/gateway.js +1339 -0
- package/dist/gateway.js.map +1 -0
- package/dist/http-transport.d.ts +65 -0
- package/dist/http-transport.d.ts.map +1 -0
- package/dist/http-transport.js +517 -0
- package/dist/http-transport.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/protocol.d.ts +162 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +16 -0
- package/dist/protocol.js.map +1 -0
- package/dist/session-manager.d.ts +101 -0
- package/dist/session-manager.d.ts.map +1 -0
- package/dist/session-manager.js +208 -0
- package/dist/session-manager.js.map +1 -0
- package/dist/testing.d.ts +92 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +129 -0
- package/dist/testing.js.map +1 -0
- package/dist/transport-protocol.d.ts +162 -0
- package/dist/transport-protocol.d.ts.map +1 -0
- package/dist/transport-protocol.js +16 -0
- package/dist/transport-protocol.js.map +1 -0
- package/dist/transport.d.ts +115 -0
- package/dist/transport.d.ts.map +1 -0
- package/dist/transport.js +56 -0
- package/dist/transport.js.map +1 -0
- package/dist/types.d.ts +314 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +37 -0
- package/dist/types.js.map +1 -0
- package/dist/websocket-server.d.ts +87 -0
- package/dist/websocket-server.d.ts.map +1 -0
- package/dist/websocket-server.js +245 -0
- package/dist/websocket-server.js.map +1 -0
- package/dist/ws-transport.d.ts +17 -0
- package/dist/ws-transport.d.ts.map +1 -0
- package/dist/ws-transport.js +174 -0
- package/dist/ws-transport.js.map +1 -0
- package/package.json +51 -0
- package/src/__tests__/custom-methods.spec.ts +220 -0
- package/src/__tests__/gateway-methods.spec.ts +262 -0
- package/src/__tests__/gateway.spec.ts +404 -0
- package/src/__tests__/guards.spec.ts +235 -0
- package/src/__tests__/protocol.spec.ts +58 -0
- package/src/__tests__/session-manager.spec.ts +220 -0
- package/src/__tests__/ws-transport.spec.ts +246 -0
- package/src/app-registry.ts +103 -0
- package/src/bin.ts +38 -0
- package/src/gateway.ts +1712 -0
- package/src/http-transport.ts +623 -0
- package/src/index.ts +94 -0
- package/src/session-manager.ts +272 -0
- package/src/testing.ts +236 -0
- package/src/transport-protocol.ts +249 -0
- package/src/transport.ts +191 -0
- package/src/types.ts +392 -0
- package/src/websocket-server.ts +303 -0
- package/src/ws-transport.ts +205 -0
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gateway Protocol Types
|
|
3
|
+
*
|
|
4
|
+
* Defines the WebSocket message protocol between clients and the gateway.
|
|
5
|
+
*/
|
|
6
|
+
export interface ConnectMessage {
|
|
7
|
+
type: "connect";
|
|
8
|
+
clientId: string;
|
|
9
|
+
token?: string;
|
|
10
|
+
metadata?: Record<string, unknown>;
|
|
11
|
+
}
|
|
12
|
+
export interface RequestMessage {
|
|
13
|
+
type: "req";
|
|
14
|
+
id: string;
|
|
15
|
+
method: GatewayMethod;
|
|
16
|
+
params: Record<string, unknown>;
|
|
17
|
+
}
|
|
18
|
+
export interface PingMessage {
|
|
19
|
+
type: "ping";
|
|
20
|
+
timestamp: number;
|
|
21
|
+
}
|
|
22
|
+
export type ClientMessage = ConnectMessage | RequestMessage | PingMessage;
|
|
23
|
+
export interface ConnectedMessage {
|
|
24
|
+
type: "connected";
|
|
25
|
+
gatewayId: string;
|
|
26
|
+
apps: string[];
|
|
27
|
+
sessions: string[];
|
|
28
|
+
}
|
|
29
|
+
export interface ResponseMessage {
|
|
30
|
+
type: "res";
|
|
31
|
+
id: string;
|
|
32
|
+
ok: boolean;
|
|
33
|
+
payload?: unknown;
|
|
34
|
+
error?: {
|
|
35
|
+
code: string;
|
|
36
|
+
message: string;
|
|
37
|
+
details?: unknown;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export interface EventMessage {
|
|
41
|
+
type: "event";
|
|
42
|
+
event: GatewayEventType;
|
|
43
|
+
sessionId: string;
|
|
44
|
+
data: unknown;
|
|
45
|
+
}
|
|
46
|
+
export interface PongMessage {
|
|
47
|
+
type: "pong";
|
|
48
|
+
timestamp: number;
|
|
49
|
+
}
|
|
50
|
+
export interface ErrorMessage {
|
|
51
|
+
type: "error";
|
|
52
|
+
code: string;
|
|
53
|
+
message: string;
|
|
54
|
+
}
|
|
55
|
+
export type GatewayMessage = ConnectedMessage | ResponseMessage | EventMessage | PongMessage | ErrorMessage;
|
|
56
|
+
/**
|
|
57
|
+
* Built-in gateway methods with autocomplete support.
|
|
58
|
+
*/
|
|
59
|
+
export type BuiltInMethod = "send" | "abort" | "status" | "history" | "reset" | "close" | "apps" | "sessions" | "subscribe" | "unsubscribe";
|
|
60
|
+
/**
|
|
61
|
+
* Gateway method - built-in methods or custom method strings.
|
|
62
|
+
* The (string & {}) allows any string while preserving autocomplete for built-in methods.
|
|
63
|
+
*/
|
|
64
|
+
export type GatewayMethod = BuiltInMethod | (string & {});
|
|
65
|
+
export type GatewayEventType = "content_delta" | "content_block_start" | "content_block_end" | "tool_call_start" | "tool_call_delta" | "tool_result" | "message_start" | "message_end" | "error";
|
|
66
|
+
export interface SendParams {
|
|
67
|
+
sessionId: string;
|
|
68
|
+
message: string;
|
|
69
|
+
attachments?: Array<{
|
|
70
|
+
type: "image" | "file";
|
|
71
|
+
data: string;
|
|
72
|
+
mimeType: string;
|
|
73
|
+
name?: string;
|
|
74
|
+
}>;
|
|
75
|
+
}
|
|
76
|
+
export interface AbortParams {
|
|
77
|
+
sessionId: string;
|
|
78
|
+
}
|
|
79
|
+
export interface StatusParams {
|
|
80
|
+
sessionId?: string;
|
|
81
|
+
}
|
|
82
|
+
export interface HistoryParams {
|
|
83
|
+
sessionId: string;
|
|
84
|
+
limit?: number;
|
|
85
|
+
before?: string;
|
|
86
|
+
}
|
|
87
|
+
export interface ResetParams {
|
|
88
|
+
sessionId: string;
|
|
89
|
+
}
|
|
90
|
+
export interface CloseParams {
|
|
91
|
+
sessionId: string;
|
|
92
|
+
}
|
|
93
|
+
export interface SubscribeParams {
|
|
94
|
+
sessionId: string;
|
|
95
|
+
}
|
|
96
|
+
export interface UnsubscribeParams {
|
|
97
|
+
sessionId: string;
|
|
98
|
+
}
|
|
99
|
+
export interface StatusPayload {
|
|
100
|
+
gateway: {
|
|
101
|
+
id: string;
|
|
102
|
+
uptime: number;
|
|
103
|
+
clients: number;
|
|
104
|
+
sessions: number;
|
|
105
|
+
apps: string[];
|
|
106
|
+
};
|
|
107
|
+
session?: {
|
|
108
|
+
id: string;
|
|
109
|
+
appId: string;
|
|
110
|
+
messageCount: number;
|
|
111
|
+
createdAt: string;
|
|
112
|
+
lastActivityAt: string;
|
|
113
|
+
isActive: boolean;
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
export interface HistoryPayload {
|
|
117
|
+
messages: Array<{
|
|
118
|
+
id: string;
|
|
119
|
+
role: "user" | "assistant" | "system";
|
|
120
|
+
content: string;
|
|
121
|
+
timestamp: string;
|
|
122
|
+
toolCalls?: Array<{
|
|
123
|
+
name: string;
|
|
124
|
+
input: unknown;
|
|
125
|
+
output?: unknown;
|
|
126
|
+
}>;
|
|
127
|
+
}>;
|
|
128
|
+
hasMore: boolean;
|
|
129
|
+
}
|
|
130
|
+
export interface AppsPayload {
|
|
131
|
+
apps: Array<{
|
|
132
|
+
id: string;
|
|
133
|
+
name: string;
|
|
134
|
+
description?: string;
|
|
135
|
+
isDefault: boolean;
|
|
136
|
+
}>;
|
|
137
|
+
}
|
|
138
|
+
export interface SessionsPayload {
|
|
139
|
+
sessions: Array<{
|
|
140
|
+
id: string;
|
|
141
|
+
appId: string;
|
|
142
|
+
createdAt: string;
|
|
143
|
+
lastActivityAt: string;
|
|
144
|
+
messageCount: number;
|
|
145
|
+
}>;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Session keys follow the format: [app:]name
|
|
149
|
+
*
|
|
150
|
+
* Examples:
|
|
151
|
+
* - "main" → default app, "main" session
|
|
152
|
+
* - "chat:main" → "chat" app, "main" session
|
|
153
|
+
* - "research:task-123" → "research" app, "task-123" session
|
|
154
|
+
* - "whatsapp:+1234567890" → WhatsApp channel session
|
|
155
|
+
*/
|
|
156
|
+
export interface SessionKey {
|
|
157
|
+
appId: string;
|
|
158
|
+
sessionName: string;
|
|
159
|
+
}
|
|
160
|
+
export declare function parseSessionKey(key: string, defaultApp: string): SessionKey;
|
|
161
|
+
export declare function formatSessionKey(key: SessionKey): string;
|
|
162
|
+
//# sourceMappingURL=protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
|
package/dist/protocol.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gateway Protocol Types
|
|
3
|
+
*
|
|
4
|
+
* Defines the WebSocket message protocol between clients and the gateway.
|
|
5
|
+
*/
|
|
6
|
+
export function parseSessionKey(key, defaultApp) {
|
|
7
|
+
const parts = key.split(":");
|
|
8
|
+
if (parts.length === 1) {
|
|
9
|
+
return { appId: defaultApp, sessionName: parts[0] };
|
|
10
|
+
}
|
|
11
|
+
return { appId: parts[0], sessionName: parts.slice(1).join(":") };
|
|
12
|
+
}
|
|
13
|
+
export function formatSessionKey(key) {
|
|
14
|
+
return `${key.appId}:${key.sessionName}`;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA0OH,MAAM,UAAU,eAAe,CAAC,GAAW,EAAE,UAAkB;IAC7D,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IACtD,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAe;IAC9C,OAAO,GAAG,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages persistent sessions across apps.
|
|
5
|
+
*/
|
|
6
|
+
import type { Session } from "@agentick/core";
|
|
7
|
+
import type { AppRegistry, AppInfo } from "./app-registry.js";
|
|
8
|
+
import type { SessionState } from "./types.js";
|
|
9
|
+
interface ManagedSession {
|
|
10
|
+
state: SessionState;
|
|
11
|
+
coreSession: Session | null;
|
|
12
|
+
appInfo: AppInfo;
|
|
13
|
+
/** The session name without app prefix - used when creating App sessions */
|
|
14
|
+
sessionName: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* SessionManager configuration
|
|
18
|
+
*/
|
|
19
|
+
export interface SessionManagerConfig {
|
|
20
|
+
/** Gateway ID for DevTools events */
|
|
21
|
+
gatewayId: string;
|
|
22
|
+
}
|
|
23
|
+
export declare class SessionManager {
|
|
24
|
+
private sessions;
|
|
25
|
+
private registry;
|
|
26
|
+
private gatewayId;
|
|
27
|
+
private devToolsSequence;
|
|
28
|
+
constructor(registry: AppRegistry, config?: SessionManagerConfig);
|
|
29
|
+
/**
|
|
30
|
+
* Normalize a session key to the canonical format (appId:sessionName).
|
|
31
|
+
* This ensures consistent lookups regardless of input format.
|
|
32
|
+
*/
|
|
33
|
+
private normalizeKey;
|
|
34
|
+
/**
|
|
35
|
+
* Emit a DevTools session event
|
|
36
|
+
*/
|
|
37
|
+
private emitDevToolsEvent;
|
|
38
|
+
/**
|
|
39
|
+
* Get or create a session
|
|
40
|
+
*/
|
|
41
|
+
getOrCreate(sessionKey: string, clientId?: string): Promise<ManagedSession>;
|
|
42
|
+
/**
|
|
43
|
+
* Get an existing session
|
|
44
|
+
*/
|
|
45
|
+
get(sessionKey: string): ManagedSession | undefined;
|
|
46
|
+
/**
|
|
47
|
+
* Check if a session exists
|
|
48
|
+
*/
|
|
49
|
+
has(sessionKey: string): boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Close a session
|
|
52
|
+
*/
|
|
53
|
+
close(sessionKey: string): Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* Reset a session (clear history but keep session)
|
|
56
|
+
*/
|
|
57
|
+
reset(sessionKey: string): Promise<void>;
|
|
58
|
+
/**
|
|
59
|
+
* Get all session IDs
|
|
60
|
+
*/
|
|
61
|
+
ids(): string[];
|
|
62
|
+
/**
|
|
63
|
+
* Get all sessions
|
|
64
|
+
*/
|
|
65
|
+
all(): ManagedSession[];
|
|
66
|
+
/**
|
|
67
|
+
* Get sessions for a specific app
|
|
68
|
+
*/
|
|
69
|
+
forApp(appId: string): ManagedSession[];
|
|
70
|
+
/**
|
|
71
|
+
* Get session count
|
|
72
|
+
*/
|
|
73
|
+
get size(): number;
|
|
74
|
+
/**
|
|
75
|
+
* Add a subscriber to a session.
|
|
76
|
+
* Creates the session if it doesn't exist (ensures subscription is never lost).
|
|
77
|
+
*/
|
|
78
|
+
subscribe(sessionKey: string, clientId: string): Promise<void>;
|
|
79
|
+
/**
|
|
80
|
+
* Remove a subscriber from a session
|
|
81
|
+
*/
|
|
82
|
+
unsubscribe(sessionKey: string, clientId: string): void;
|
|
83
|
+
/**
|
|
84
|
+
* Remove a client from all subscriptions
|
|
85
|
+
*/
|
|
86
|
+
unsubscribeAll(clientId: string): void;
|
|
87
|
+
/**
|
|
88
|
+
* Get subscribers for a session
|
|
89
|
+
*/
|
|
90
|
+
getSubscribers(sessionKey: string): Set<string>;
|
|
91
|
+
/**
|
|
92
|
+
* Update message count for a session
|
|
93
|
+
*/
|
|
94
|
+
incrementMessageCount(sessionKey: string, clientId?: string): void;
|
|
95
|
+
/**
|
|
96
|
+
* Set session active state
|
|
97
|
+
*/
|
|
98
|
+
setActive(sessionKey: string, isActive: boolean): void;
|
|
99
|
+
}
|
|
100
|
+
export {};
|
|
101
|
+
//# sourceMappingURL=session-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../src/session-manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,UAAU,cAAc;IACtB,KAAK,EAAE,YAAY,CAAC;IACpB,WAAW,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,4EAA4E;IAC5E,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAqC;IACrD,OAAO,CAAC,QAAQ,CAAc;IAC9B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,gBAAgB,CAAK;gBAEjB,QAAQ,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,oBAAoB;IAKhE;;;OAGG;IACH,OAAO,CAAC,YAAY;IAKpB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAsBzB;;OAEG;IACG,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IA4CjF;;OAEG;IACH,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAInD;;OAEG;IACH,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAIhC;;OAEG;IACG,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB9C;;OAEG;IACG,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB9C;;OAEG;IACH,GAAG,IAAI,MAAM,EAAE;IAIf;;OAEG;IACH,GAAG,IAAI,cAAc,EAAE;IAIvB;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,EAAE;IAIvC;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;;OAGG;IACG,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKpE;;OAEG;IACH,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAOvD;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAMtC;;OAEG;IACH,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;IAK/C;;OAEG;IACH,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAiBlE;;OAEG;IACH,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI;CAMvD"}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages persistent sessions across apps.
|
|
5
|
+
*/
|
|
6
|
+
import { devToolsEmitter } from "@agentick/shared";
|
|
7
|
+
import { parseSessionKey, formatSessionKey } from "./transport-protocol.js";
|
|
8
|
+
export class SessionManager {
|
|
9
|
+
sessions = new Map();
|
|
10
|
+
registry;
|
|
11
|
+
gatewayId;
|
|
12
|
+
devToolsSequence = 0;
|
|
13
|
+
constructor(registry, config) {
|
|
14
|
+
this.registry = registry;
|
|
15
|
+
this.gatewayId = config?.gatewayId ?? "gateway";
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Normalize a session key to the canonical format (appId:sessionName).
|
|
19
|
+
* This ensures consistent lookups regardless of input format.
|
|
20
|
+
*/
|
|
21
|
+
normalizeKey(sessionKey) {
|
|
22
|
+
const { appId, sessionName } = parseSessionKey(sessionKey, this.registry.defaultId);
|
|
23
|
+
return formatSessionKey({ appId, sessionName });
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Emit a DevTools session event
|
|
27
|
+
*/
|
|
28
|
+
emitDevToolsEvent(action, sessionId, appId, messageCount, clientId) {
|
|
29
|
+
if (!devToolsEmitter.hasSubscribers())
|
|
30
|
+
return;
|
|
31
|
+
devToolsEmitter.emitEvent({
|
|
32
|
+
type: "gateway_session",
|
|
33
|
+
executionId: this.gatewayId,
|
|
34
|
+
action,
|
|
35
|
+
sessionId,
|
|
36
|
+
appId,
|
|
37
|
+
messageCount,
|
|
38
|
+
clientId,
|
|
39
|
+
sequence: this.devToolsSequence++,
|
|
40
|
+
timestamp: Date.now(),
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Get or create a session
|
|
45
|
+
*/
|
|
46
|
+
async getOrCreate(sessionKey, clientId) {
|
|
47
|
+
const normalizedKey = this.normalizeKey(sessionKey);
|
|
48
|
+
// Check if session exists
|
|
49
|
+
let session = this.sessions.get(normalizedKey);
|
|
50
|
+
if (session) {
|
|
51
|
+
session.state.lastActivityAt = new Date();
|
|
52
|
+
return session;
|
|
53
|
+
}
|
|
54
|
+
// Parse session key to get app and name
|
|
55
|
+
const { appId, sessionName } = parseSessionKey(sessionKey, this.registry.defaultId);
|
|
56
|
+
// Get the app
|
|
57
|
+
const appInfo = this.registry.resolve(appId);
|
|
58
|
+
// Create session state
|
|
59
|
+
const state = {
|
|
60
|
+
id: formatSessionKey({ appId, sessionName }),
|
|
61
|
+
appId,
|
|
62
|
+
createdAt: new Date(),
|
|
63
|
+
lastActivityAt: new Date(),
|
|
64
|
+
messageCount: 0,
|
|
65
|
+
isActive: false,
|
|
66
|
+
subscribers: new Set(),
|
|
67
|
+
};
|
|
68
|
+
// Create the managed session
|
|
69
|
+
// Note: sessionName is the name WITHOUT app prefix - used when creating App sessions
|
|
70
|
+
session = {
|
|
71
|
+
state,
|
|
72
|
+
coreSession: null,
|
|
73
|
+
appInfo,
|
|
74
|
+
sessionName,
|
|
75
|
+
};
|
|
76
|
+
this.sessions.set(state.id, session);
|
|
77
|
+
// Emit DevTools event for session creation
|
|
78
|
+
this.emitDevToolsEvent("created", state.id, appId, 0, clientId);
|
|
79
|
+
return session;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Get an existing session
|
|
83
|
+
*/
|
|
84
|
+
get(sessionKey) {
|
|
85
|
+
return this.sessions.get(this.normalizeKey(sessionKey));
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Check if a session exists
|
|
89
|
+
*/
|
|
90
|
+
has(sessionKey) {
|
|
91
|
+
return this.sessions.has(this.normalizeKey(sessionKey));
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Close a session
|
|
95
|
+
*/
|
|
96
|
+
async close(sessionKey) {
|
|
97
|
+
const normalizedKey = this.normalizeKey(sessionKey);
|
|
98
|
+
const session = this.sessions.get(normalizedKey);
|
|
99
|
+
if (!session)
|
|
100
|
+
return;
|
|
101
|
+
const { id, appId, messageCount } = session.state;
|
|
102
|
+
// Clean up session if active
|
|
103
|
+
if (session.coreSession) {
|
|
104
|
+
session.coreSession.close();
|
|
105
|
+
session.coreSession = null;
|
|
106
|
+
}
|
|
107
|
+
this.sessions.delete(normalizedKey);
|
|
108
|
+
// Emit DevTools event for session closure
|
|
109
|
+
this.emitDevToolsEvent("closed", id, appId, messageCount);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Reset a session (clear history but keep session)
|
|
113
|
+
*/
|
|
114
|
+
async reset(sessionKey) {
|
|
115
|
+
const normalizedKey = this.normalizeKey(sessionKey);
|
|
116
|
+
const session = this.sessions.get(normalizedKey);
|
|
117
|
+
if (!session)
|
|
118
|
+
return;
|
|
119
|
+
const { id, appId, messageCount } = session.state;
|
|
120
|
+
// Reset session state
|
|
121
|
+
session.state.messageCount = 0;
|
|
122
|
+
session.state.lastActivityAt = new Date();
|
|
123
|
+
if (session.coreSession) {
|
|
124
|
+
session.coreSession.close();
|
|
125
|
+
session.coreSession = null;
|
|
126
|
+
}
|
|
127
|
+
// Emit DevTools event for session reset (treated as closed + recreated)
|
|
128
|
+
this.emitDevToolsEvent("closed", id, appId, messageCount);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Get all session IDs
|
|
132
|
+
*/
|
|
133
|
+
ids() {
|
|
134
|
+
return Array.from(this.sessions.keys());
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Get all sessions
|
|
138
|
+
*/
|
|
139
|
+
all() {
|
|
140
|
+
return Array.from(this.sessions.values());
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Get sessions for a specific app
|
|
144
|
+
*/
|
|
145
|
+
forApp(appId) {
|
|
146
|
+
return this.all().filter((s) => s.state.appId === appId);
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Get session count
|
|
150
|
+
*/
|
|
151
|
+
get size() {
|
|
152
|
+
return this.sessions.size;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Add a subscriber to a session.
|
|
156
|
+
* Creates the session if it doesn't exist (ensures subscription is never lost).
|
|
157
|
+
*/
|
|
158
|
+
async subscribe(sessionKey, clientId) {
|
|
159
|
+
const session = await this.getOrCreate(sessionKey, clientId);
|
|
160
|
+
session.state.subscribers.add(clientId);
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Remove a subscriber from a session
|
|
164
|
+
*/
|
|
165
|
+
unsubscribe(sessionKey, clientId) {
|
|
166
|
+
const session = this.sessions.get(this.normalizeKey(sessionKey));
|
|
167
|
+
if (session) {
|
|
168
|
+
session.state.subscribers.delete(clientId);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Remove a client from all subscriptions
|
|
173
|
+
*/
|
|
174
|
+
unsubscribeAll(clientId) {
|
|
175
|
+
for (const session of this.sessions.values()) {
|
|
176
|
+
session.state.subscribers.delete(clientId);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Get subscribers for a session
|
|
181
|
+
*/
|
|
182
|
+
getSubscribers(sessionKey) {
|
|
183
|
+
const session = this.sessions.get(this.normalizeKey(sessionKey));
|
|
184
|
+
return session?.state.subscribers ?? new Set();
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Update message count for a session
|
|
188
|
+
*/
|
|
189
|
+
incrementMessageCount(sessionKey, clientId) {
|
|
190
|
+
const session = this.sessions.get(this.normalizeKey(sessionKey));
|
|
191
|
+
if (session) {
|
|
192
|
+
session.state.messageCount++;
|
|
193
|
+
session.state.lastActivityAt = new Date();
|
|
194
|
+
// Emit DevTools event for session message
|
|
195
|
+
this.emitDevToolsEvent("message", session.state.id, session.state.appId, session.state.messageCount, clientId);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Set session active state
|
|
200
|
+
*/
|
|
201
|
+
setActive(sessionKey, isActive) {
|
|
202
|
+
const session = this.sessions.get(this.normalizeKey(sessionKey));
|
|
203
|
+
if (session) {
|
|
204
|
+
session.state.isActive = isActive;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=session-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../src/session-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gateway Testing Utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides helpers for testing gateway interactions.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* import { createTestGateway, createMockApp } from '@agentick/gateway/testing';
|
|
9
|
+
*
|
|
10
|
+
* test('gateway handles messages', async () => {
|
|
11
|
+
* const mockApp = createMockApp({
|
|
12
|
+
* response: 'Hello!',
|
|
13
|
+
* });
|
|
14
|
+
*
|
|
15
|
+
* const { gateway, client, cleanup } = await createTestGateway({
|
|
16
|
+
* agents: { chat: mockApp },
|
|
17
|
+
* defaultAgent: 'chat',
|
|
18
|
+
* });
|
|
19
|
+
*
|
|
20
|
+
* try {
|
|
21
|
+
* const response = await client.send('main', 'Hi there');
|
|
22
|
+
* expect(response.payload.messageId).toBeDefined();
|
|
23
|
+
* } finally {
|
|
24
|
+
* await cleanup();
|
|
25
|
+
* }
|
|
26
|
+
* });
|
|
27
|
+
* ```
|
|
28
|
+
*
|
|
29
|
+
* @module @agentick/gateway/testing
|
|
30
|
+
*/
|
|
31
|
+
import WebSocket from "ws";
|
|
32
|
+
import type { Gateway } from "./gateway.js";
|
|
33
|
+
import type { GatewayConfig, GatewayEvents } from "./types.js";
|
|
34
|
+
export { createMockApp, createMockSession, createMockExecutionHandle, createTestProcedure, type MockAppOptions, type MockSessionOptions, type MockSession, type MockApp, type MockSessionExecutionHandle, type MockExecutionHandleOptions, type TestProcedure, type TestProcedureOptions, } from "@agentick/core/testing";
|
|
35
|
+
export interface TestGatewayOptions extends Omit<GatewayConfig, "port" | "host"> {
|
|
36
|
+
/** Custom port (default: random available port) */
|
|
37
|
+
port?: number;
|
|
38
|
+
}
|
|
39
|
+
export interface TestGatewayClient {
|
|
40
|
+
/** Send a request to the gateway */
|
|
41
|
+
request<T = unknown>(method: string, params?: Record<string, unknown>): Promise<{
|
|
42
|
+
ok: boolean;
|
|
43
|
+
payload?: T;
|
|
44
|
+
error?: {
|
|
45
|
+
code: string;
|
|
46
|
+
message: string;
|
|
47
|
+
};
|
|
48
|
+
}>;
|
|
49
|
+
/** Send a message to a session */
|
|
50
|
+
send(sessionId: string, message: string): Promise<{
|
|
51
|
+
ok: boolean;
|
|
52
|
+
payload?: {
|
|
53
|
+
messageId: string;
|
|
54
|
+
};
|
|
55
|
+
error?: {
|
|
56
|
+
code: string;
|
|
57
|
+
message: string;
|
|
58
|
+
};
|
|
59
|
+
}>;
|
|
60
|
+
/** Collect events for a session */
|
|
61
|
+
collectEvents(sessionId: string, timeout?: number): Promise<Array<{
|
|
62
|
+
type: string;
|
|
63
|
+
data: unknown;
|
|
64
|
+
}>>;
|
|
65
|
+
/** Close the client connection */
|
|
66
|
+
close(): void;
|
|
67
|
+
/** The raw WebSocket */
|
|
68
|
+
ws: WebSocket;
|
|
69
|
+
}
|
|
70
|
+
export interface TestGatewayResult {
|
|
71
|
+
/** The gateway instance */
|
|
72
|
+
gateway: Gateway;
|
|
73
|
+
/** A connected test client */
|
|
74
|
+
client: TestGatewayClient;
|
|
75
|
+
/** Gateway URL */
|
|
76
|
+
url: string;
|
|
77
|
+
/** Port the gateway is running on */
|
|
78
|
+
port: number;
|
|
79
|
+
/** Clean up resources */
|
|
80
|
+
cleanup: () => Promise<void>;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Create a test gateway with a connected client.
|
|
84
|
+
*
|
|
85
|
+
* Automatically handles port allocation, client connection, and cleanup.
|
|
86
|
+
*/
|
|
87
|
+
export declare function createTestGateway(options: TestGatewayOptions): Promise<TestGatewayResult>;
|
|
88
|
+
/**
|
|
89
|
+
* Wait for a specific gateway event.
|
|
90
|
+
*/
|
|
91
|
+
export declare function waitForGatewayEvent<K extends keyof GatewayEvents>(gateway: Gateway, event: K, timeout?: number): Promise<GatewayEvents[K]>;
|
|
92
|
+
//# sourceMappingURL=testing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,SAAS,MAAM,IAAI,CAAC;AAC3B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAG/D,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,yBAAyB,EACzB,mBAAmB,EACnB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,WAAW,EAChB,KAAK,OAAO,EACZ,KAAK,0BAA0B,EAC/B,KAAK,0BAA0B,EAC/B,KAAK,aAAa,EAClB,KAAK,oBAAoB,GAC1B,MAAM,wBAAwB,CAAC;AAMhC,MAAM,WAAW,kBAAmB,SAAQ,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9E,mDAAmD;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,oCAAoC;IACpC,OAAO,CAAC,CAAC,GAAG,OAAO,EACjB,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC;QACT,EAAE,EAAE,OAAO,CAAC;QACZ,OAAO,CAAC,EAAE,CAAC,CAAC;QACZ,KAAK,CAAC,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC;KAC3C,CAAC,CAAC;IAEH,kCAAkC;IAClC,IAAI,CACF,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;QACT,EAAE,EAAE,OAAO,CAAC;QACZ,OAAO,CAAC,EAAE;YAAE,SAAS,EAAE,MAAM,CAAA;SAAE,CAAC;QAChC,KAAK,CAAC,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC;KAC3C,CAAC,CAAC;IAEH,mCAAmC;IACnC,aAAa,CACX,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC,CAAC;IAEnD,kCAAkC;IAClC,KAAK,IAAI,IAAI,CAAC;IAEd,wBAAwB;IACxB,EAAE,EAAE,SAAS,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,2BAA2B;IAC3B,OAAO,EAAE,OAAO,CAAC;IAEjB,8BAA8B;IAC9B,MAAM,EAAE,iBAAiB,CAAC;IAE1B,kBAAkB;IAClB,GAAG,EAAE,MAAM,CAAC;IAEZ,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IAEb,yBAAyB;IACzB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA8F/F;AAMD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,MAAM,aAAa,EAC/D,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,CAAC,EACR,OAAO,SAAO,GACb,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAW3B"}
|