@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.
Files changed (78) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +477 -0
  3. package/dist/agent-registry.d.ts +51 -0
  4. package/dist/agent-registry.d.ts.map +1 -0
  5. package/dist/agent-registry.js +78 -0
  6. package/dist/agent-registry.js.map +1 -0
  7. package/dist/app-registry.d.ts +51 -0
  8. package/dist/app-registry.d.ts.map +1 -0
  9. package/dist/app-registry.js +78 -0
  10. package/dist/app-registry.js.map +1 -0
  11. package/dist/bin.d.ts +8 -0
  12. package/dist/bin.d.ts.map +1 -0
  13. package/dist/bin.js +37 -0
  14. package/dist/bin.js.map +1 -0
  15. package/dist/gateway.d.ts +165 -0
  16. package/dist/gateway.d.ts.map +1 -0
  17. package/dist/gateway.js +1339 -0
  18. package/dist/gateway.js.map +1 -0
  19. package/dist/http-transport.d.ts +65 -0
  20. package/dist/http-transport.d.ts.map +1 -0
  21. package/dist/http-transport.js +517 -0
  22. package/dist/http-transport.js.map +1 -0
  23. package/dist/index.d.ts +16 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +23 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/protocol.d.ts +162 -0
  28. package/dist/protocol.d.ts.map +1 -0
  29. package/dist/protocol.js +16 -0
  30. package/dist/protocol.js.map +1 -0
  31. package/dist/session-manager.d.ts +101 -0
  32. package/dist/session-manager.d.ts.map +1 -0
  33. package/dist/session-manager.js +208 -0
  34. package/dist/session-manager.js.map +1 -0
  35. package/dist/testing.d.ts +92 -0
  36. package/dist/testing.d.ts.map +1 -0
  37. package/dist/testing.js +129 -0
  38. package/dist/testing.js.map +1 -0
  39. package/dist/transport-protocol.d.ts +162 -0
  40. package/dist/transport-protocol.d.ts.map +1 -0
  41. package/dist/transport-protocol.js +16 -0
  42. package/dist/transport-protocol.js.map +1 -0
  43. package/dist/transport.d.ts +115 -0
  44. package/dist/transport.d.ts.map +1 -0
  45. package/dist/transport.js +56 -0
  46. package/dist/transport.js.map +1 -0
  47. package/dist/types.d.ts +314 -0
  48. package/dist/types.d.ts.map +1 -0
  49. package/dist/types.js +37 -0
  50. package/dist/types.js.map +1 -0
  51. package/dist/websocket-server.d.ts +87 -0
  52. package/dist/websocket-server.d.ts.map +1 -0
  53. package/dist/websocket-server.js +245 -0
  54. package/dist/websocket-server.js.map +1 -0
  55. package/dist/ws-transport.d.ts +17 -0
  56. package/dist/ws-transport.d.ts.map +1 -0
  57. package/dist/ws-transport.js +174 -0
  58. package/dist/ws-transport.js.map +1 -0
  59. package/package.json +51 -0
  60. package/src/__tests__/custom-methods.spec.ts +220 -0
  61. package/src/__tests__/gateway-methods.spec.ts +262 -0
  62. package/src/__tests__/gateway.spec.ts +404 -0
  63. package/src/__tests__/guards.spec.ts +235 -0
  64. package/src/__tests__/protocol.spec.ts +58 -0
  65. package/src/__tests__/session-manager.spec.ts +220 -0
  66. package/src/__tests__/ws-transport.spec.ts +246 -0
  67. package/src/app-registry.ts +103 -0
  68. package/src/bin.ts +38 -0
  69. package/src/gateway.ts +1712 -0
  70. package/src/http-transport.ts +623 -0
  71. package/src/index.ts +94 -0
  72. package/src/session-manager.ts +272 -0
  73. package/src/testing.ts +236 -0
  74. package/src/transport-protocol.ts +249 -0
  75. package/src/transport.ts +191 -0
  76. package/src/types.ts +392 -0
  77. package/src/websocket-server.ts +303 -0
  78. 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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"}
@@ -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"}