@teneo-protocol/sdk 1.0.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/.dockerignore +14 -0
- package/.env.test.example +14 -0
- package/.eslintrc.json +26 -0
- package/.github/workflows/claude-code-review.yml +78 -0
- package/.github/workflows/claude-reviewer.yml +64 -0
- package/.github/workflows/publish-npm.yml +38 -0
- package/.github/workflows/push-to-main.yml +23 -0
- package/.node-version +1 -0
- package/.prettierrc +11 -0
- package/Dockerfile +25 -0
- package/LICENCE +661 -0
- package/README.md +709 -0
- package/dist/constants.d.ts +42 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +45 -0
- package/dist/constants.js.map +1 -0
- package/dist/core/websocket-client.d.ts +261 -0
- package/dist/core/websocket-client.d.ts.map +1 -0
- package/dist/core/websocket-client.js +875 -0
- package/dist/core/websocket-client.js.map +1 -0
- package/dist/formatters/response-formatter.d.ts +354 -0
- package/dist/formatters/response-formatter.d.ts.map +1 -0
- package/dist/formatters/response-formatter.js +575 -0
- package/dist/formatters/response-formatter.js.map +1 -0
- package/dist/handlers/message-handler-registry.d.ts +155 -0
- package/dist/handlers/message-handler-registry.d.ts.map +1 -0
- package/dist/handlers/message-handler-registry.js +216 -0
- package/dist/handlers/message-handler-registry.js.map +1 -0
- package/dist/handlers/message-handlers/agent-selected-handler.d.ts +112 -0
- package/dist/handlers/message-handlers/agent-selected-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/agent-selected-handler.js +40 -0
- package/dist/handlers/message-handlers/agent-selected-handler.js.map +1 -0
- package/dist/handlers/message-handlers/agents-list-handler.d.ts +14 -0
- package/dist/handlers/message-handlers/agents-list-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/agents-list-handler.js +25 -0
- package/dist/handlers/message-handlers/agents-list-handler.js.map +1 -0
- package/dist/handlers/message-handlers/auth-error-handler.d.ts +71 -0
- package/dist/handlers/message-handlers/auth-error-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/auth-error-handler.js +30 -0
- package/dist/handlers/message-handlers/auth-error-handler.js.map +1 -0
- package/dist/handlers/message-handlers/auth-message-handler.d.ts +18 -0
- package/dist/handlers/message-handlers/auth-message-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/auth-message-handler.js +60 -0
- package/dist/handlers/message-handlers/auth-message-handler.js.map +1 -0
- package/dist/handlers/message-handlers/auth-required-handler.d.ts +76 -0
- package/dist/handlers/message-handlers/auth-required-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/auth-required-handler.js +23 -0
- package/dist/handlers/message-handlers/auth-required-handler.js.map +1 -0
- package/dist/handlers/message-handlers/auth-success-handler.d.ts +18 -0
- package/dist/handlers/message-handlers/auth-success-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/auth-success-handler.js +51 -0
- package/dist/handlers/message-handlers/auth-success-handler.js.map +1 -0
- package/dist/handlers/message-handlers/base-handler.d.ts +55 -0
- package/dist/handlers/message-handlers/base-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/base-handler.js +83 -0
- package/dist/handlers/message-handlers/base-handler.js.map +1 -0
- package/dist/handlers/message-handlers/challenge-handler.d.ts +73 -0
- package/dist/handlers/message-handlers/challenge-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/challenge-handler.js +47 -0
- package/dist/handlers/message-handlers/challenge-handler.js.map +1 -0
- package/dist/handlers/message-handlers/error-message-handler.d.ts +76 -0
- package/dist/handlers/message-handlers/error-message-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/error-message-handler.js +29 -0
- package/dist/handlers/message-handlers/error-message-handler.js.map +1 -0
- package/dist/handlers/message-handlers/index.d.ts +28 -0
- package/dist/handlers/message-handlers/index.d.ts.map +1 -0
- package/dist/handlers/message-handlers/index.js +100 -0
- package/dist/handlers/message-handlers/index.js.map +1 -0
- package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts +122 -0
- package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/list-rooms-response-handler.js +30 -0
- package/dist/handlers/message-handlers/list-rooms-response-handler.js.map +1 -0
- package/dist/handlers/message-handlers/ping-pong-handler.d.ts +104 -0
- package/dist/handlers/message-handlers/ping-pong-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/ping-pong-handler.js +36 -0
- package/dist/handlers/message-handlers/ping-pong-handler.js.map +1 -0
- package/dist/handlers/message-handlers/regular-message-handler.d.ts +56 -0
- package/dist/handlers/message-handlers/regular-message-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/regular-message-handler.js +59 -0
- package/dist/handlers/message-handlers/regular-message-handler.js.map +1 -0
- package/dist/handlers/message-handlers/subscribe-response-handler.d.ts +81 -0
- package/dist/handlers/message-handlers/subscribe-response-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/subscribe-response-handler.js +48 -0
- package/dist/handlers/message-handlers/subscribe-response-handler.js.map +1 -0
- package/dist/handlers/message-handlers/task-response-handler.d.ts +14 -0
- package/dist/handlers/message-handlers/task-response-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/task-response-handler.js +44 -0
- package/dist/handlers/message-handlers/task-response-handler.js.map +1 -0
- package/dist/handlers/message-handlers/types.d.ts +51 -0
- package/dist/handlers/message-handlers/types.d.ts.map +1 -0
- package/dist/handlers/message-handlers/types.js +7 -0
- package/dist/handlers/message-handlers/types.js.map +1 -0
- package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts +81 -0
- package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/unsubscribe-response-handler.js +48 -0
- package/dist/handlers/message-handlers/unsubscribe-response-handler.js.map +1 -0
- package/dist/handlers/webhook-handler.d.ts +202 -0
- package/dist/handlers/webhook-handler.d.ts.map +1 -0
- package/dist/handlers/webhook-handler.js +511 -0
- package/dist/handlers/webhook-handler.js.map +1 -0
- package/dist/index.d.ts +71 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +217 -0
- package/dist/index.js.map +1 -0
- package/dist/managers/agent-registry.d.ts +173 -0
- package/dist/managers/agent-registry.d.ts.map +1 -0
- package/dist/managers/agent-registry.js +310 -0
- package/dist/managers/agent-registry.js.map +1 -0
- package/dist/managers/connection-manager.d.ts +134 -0
- package/dist/managers/connection-manager.d.ts.map +1 -0
- package/dist/managers/connection-manager.js +176 -0
- package/dist/managers/connection-manager.js.map +1 -0
- package/dist/managers/index.d.ts +9 -0
- package/dist/managers/index.d.ts.map +1 -0
- package/dist/managers/index.js +16 -0
- package/dist/managers/index.js.map +1 -0
- package/dist/managers/message-router.d.ts +112 -0
- package/dist/managers/message-router.d.ts.map +1 -0
- package/dist/managers/message-router.js +260 -0
- package/dist/managers/message-router.js.map +1 -0
- package/dist/managers/room-manager.d.ts +165 -0
- package/dist/managers/room-manager.d.ts.map +1 -0
- package/dist/managers/room-manager.js +227 -0
- package/dist/managers/room-manager.js.map +1 -0
- package/dist/teneo-sdk.d.ts +703 -0
- package/dist/teneo-sdk.d.ts.map +1 -0
- package/dist/teneo-sdk.js +907 -0
- package/dist/teneo-sdk.js.map +1 -0
- package/dist/types/config.d.ts +1047 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +720 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/error-codes.d.ts +29 -0
- package/dist/types/error-codes.d.ts.map +1 -0
- package/dist/types/error-codes.js +41 -0
- package/dist/types/error-codes.js.map +1 -0
- package/dist/types/events.d.ts +616 -0
- package/dist/types/events.d.ts.map +1 -0
- package/dist/types/events.js +261 -0
- package/dist/types/events.js.map +1 -0
- package/dist/types/health.d.ts +40 -0
- package/dist/types/health.d.ts.map +1 -0
- package/dist/types/health.js +6 -0
- package/dist/types/health.js.map +1 -0
- package/dist/types/index.d.ts +10 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +123 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/messages.d.ts +3734 -0
- package/dist/types/messages.d.ts.map +1 -0
- package/dist/types/messages.js +482 -0
- package/dist/types/messages.js.map +1 -0
- package/dist/types/validation.d.ts +81 -0
- package/dist/types/validation.d.ts.map +1 -0
- package/dist/types/validation.js +115 -0
- package/dist/types/validation.js.map +1 -0
- package/dist/utils/bounded-queue.d.ts +127 -0
- package/dist/utils/bounded-queue.d.ts.map +1 -0
- package/dist/utils/bounded-queue.js +181 -0
- package/dist/utils/bounded-queue.js.map +1 -0
- package/dist/utils/circuit-breaker.d.ts +141 -0
- package/dist/utils/circuit-breaker.d.ts.map +1 -0
- package/dist/utils/circuit-breaker.js +215 -0
- package/dist/utils/circuit-breaker.js.map +1 -0
- package/dist/utils/deduplication-cache.d.ts +110 -0
- package/dist/utils/deduplication-cache.d.ts.map +1 -0
- package/dist/utils/deduplication-cache.js +177 -0
- package/dist/utils/deduplication-cache.js.map +1 -0
- package/dist/utils/event-waiter.d.ts +101 -0
- package/dist/utils/event-waiter.d.ts.map +1 -0
- package/dist/utils/event-waiter.js +118 -0
- package/dist/utils/event-waiter.js.map +1 -0
- package/dist/utils/index.d.ts +51 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +72 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +22 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +91 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/rate-limiter.d.ts +122 -0
- package/dist/utils/rate-limiter.d.ts.map +1 -0
- package/dist/utils/rate-limiter.js +190 -0
- package/dist/utils/rate-limiter.js.map +1 -0
- package/dist/utils/retry-policy.d.ts +191 -0
- package/dist/utils/retry-policy.d.ts.map +1 -0
- package/dist/utils/retry-policy.js +225 -0
- package/dist/utils/retry-policy.js.map +1 -0
- package/dist/utils/secure-private-key.d.ts +113 -0
- package/dist/utils/secure-private-key.d.ts.map +1 -0
- package/dist/utils/secure-private-key.js +188 -0
- package/dist/utils/secure-private-key.js.map +1 -0
- package/dist/utils/signature-verifier.d.ts +143 -0
- package/dist/utils/signature-verifier.d.ts.map +1 -0
- package/dist/utils/signature-verifier.js +238 -0
- package/dist/utils/signature-verifier.js.map +1 -0
- package/dist/utils/ssrf-validator.d.ts +36 -0
- package/dist/utils/ssrf-validator.d.ts.map +1 -0
- package/dist/utils/ssrf-validator.js +195 -0
- package/dist/utils/ssrf-validator.js.map +1 -0
- package/examples/.env.example +17 -0
- package/examples/basic-usage.ts +211 -0
- package/examples/production-dashboard/.env.example +153 -0
- package/examples/production-dashboard/package.json +39 -0
- package/examples/production-dashboard/public/dashboard.html +642 -0
- package/examples/production-dashboard/server.ts +753 -0
- package/examples/webhook-integration.ts +239 -0
- package/examples/x-influencer-battle-redesign.html +1065 -0
- package/examples/x-influencer-battle-server.ts +217 -0
- package/examples/x-influencer-battle.html +787 -0
- package/package.json +65 -0
- package/src/constants.ts +43 -0
- package/src/core/websocket-client.test.ts +512 -0
- package/src/core/websocket-client.ts +1056 -0
- package/src/formatters/response-formatter.test.ts +571 -0
- package/src/formatters/response-formatter.ts +677 -0
- package/src/handlers/message-handler-registry.ts +239 -0
- package/src/handlers/message-handlers/agent-selected-handler.ts +40 -0
- package/src/handlers/message-handlers/agents-list-handler.ts +26 -0
- package/src/handlers/message-handlers/auth-error-handler.ts +31 -0
- package/src/handlers/message-handlers/auth-message-handler.ts +66 -0
- package/src/handlers/message-handlers/auth-required-handler.ts +23 -0
- package/src/handlers/message-handlers/auth-success-handler.ts +57 -0
- package/src/handlers/message-handlers/base-handler.ts +101 -0
- package/src/handlers/message-handlers/challenge-handler.ts +57 -0
- package/src/handlers/message-handlers/error-message-handler.ts +27 -0
- package/src/handlers/message-handlers/index.ts +77 -0
- package/src/handlers/message-handlers/list-rooms-response-handler.ts +28 -0
- package/src/handlers/message-handlers/ping-pong-handler.ts +30 -0
- package/src/handlers/message-handlers/regular-message-handler.ts +65 -0
- package/src/handlers/message-handlers/subscribe-response-handler.ts +47 -0
- package/src/handlers/message-handlers/task-response-handler.ts +45 -0
- package/src/handlers/message-handlers/types.ts +77 -0
- package/src/handlers/message-handlers/unsubscribe-response-handler.ts +47 -0
- package/src/handlers/webhook-handler.test.ts +789 -0
- package/src/handlers/webhook-handler.ts +576 -0
- package/src/index.ts +269 -0
- package/src/managers/agent-registry.test.ts +466 -0
- package/src/managers/agent-registry.ts +347 -0
- package/src/managers/connection-manager.ts +195 -0
- package/src/managers/index.ts +9 -0
- package/src/managers/message-router.ts +349 -0
- package/src/managers/room-manager.ts +248 -0
- package/src/teneo-sdk.ts +1022 -0
- package/src/types/config.test.ts +325 -0
- package/src/types/config.ts +799 -0
- package/src/types/error-codes.ts +44 -0
- package/src/types/events.test.ts +302 -0
- package/src/types/events.ts +382 -0
- package/src/types/health.ts +46 -0
- package/src/types/index.ts +199 -0
- package/src/types/messages.test.ts +660 -0
- package/src/types/messages.ts +570 -0
- package/src/types/validation.ts +123 -0
- package/src/utils/bounded-queue.test.ts +356 -0
- package/src/utils/bounded-queue.ts +205 -0
- package/src/utils/circuit-breaker.test.ts +394 -0
- package/src/utils/circuit-breaker.ts +262 -0
- package/src/utils/deduplication-cache.test.ts +380 -0
- package/src/utils/deduplication-cache.ts +198 -0
- package/src/utils/event-waiter.test.ts +381 -0
- package/src/utils/event-waiter.ts +172 -0
- package/src/utils/index.ts +74 -0
- package/src/utils/logger.ts +87 -0
- package/src/utils/rate-limiter.test.ts +341 -0
- package/src/utils/rate-limiter.ts +211 -0
- package/src/utils/retry-policy.test.ts +558 -0
- package/src/utils/retry-policy.ts +272 -0
- package/src/utils/secure-private-key.test.ts +356 -0
- package/src/utils/secure-private-key.ts +205 -0
- package/src/utils/signature-verifier.test.ts +464 -0
- package/src/utils/signature-verifier.ts +298 -0
- package/src/utils/ssrf-validator.test.ts +372 -0
- package/src/utils/ssrf-validator.ts +224 -0
- package/tests/integration/real-server.test.ts +740 -0
- package/tests/integration/websocket.test.ts +381 -0
- package/tests/integration-setup.ts +16 -0
- package/tests/setup.ts +34 -0
- package/tsconfig.json +32 -0
- package/vitest.config.ts +42 -0
- package/vitest.integration.config.ts +23 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Message handlers index
|
|
3
|
+
* Exports all message handlers and provides convenience functions
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
// Export types
|
|
7
|
+
export * from "./types";
|
|
8
|
+
export * from "./base-handler";
|
|
9
|
+
|
|
10
|
+
// Export all handlers
|
|
11
|
+
export { TaskResponseHandler } from "./task-response-handler";
|
|
12
|
+
export { AgentSelectedHandler } from "./agent-selected-handler";
|
|
13
|
+
export { ChallengeHandler } from "./challenge-handler";
|
|
14
|
+
export { AuthMessageHandler } from "./auth-message-handler";
|
|
15
|
+
export { AuthSuccessHandler } from "./auth-success-handler";
|
|
16
|
+
export { AuthErrorHandler } from "./auth-error-handler";
|
|
17
|
+
export { AuthRequiredHandler } from "./auth-required-handler";
|
|
18
|
+
export { AgentsListHandler } from "./agents-list-handler";
|
|
19
|
+
export { ErrorMessageHandler } from "./error-message-handler";
|
|
20
|
+
export { RegularMessageHandler } from "./regular-message-handler";
|
|
21
|
+
export { PingHandler, PongHandler } from "./ping-pong-handler";
|
|
22
|
+
export { SubscribeResponseHandler } from "./subscribe-response-handler";
|
|
23
|
+
export { UnsubscribeResponseHandler } from "./unsubscribe-response-handler";
|
|
24
|
+
export { ListRoomsResponseHandler } from "./list-rooms-response-handler";
|
|
25
|
+
|
|
26
|
+
// Import for convenience function
|
|
27
|
+
import { TaskResponseHandler } from "./task-response-handler";
|
|
28
|
+
import { AgentSelectedHandler } from "./agent-selected-handler";
|
|
29
|
+
import { ChallengeHandler } from "./challenge-handler";
|
|
30
|
+
import { AuthMessageHandler } from "./auth-message-handler";
|
|
31
|
+
import { AuthSuccessHandler } from "./auth-success-handler";
|
|
32
|
+
import { AuthErrorHandler } from "./auth-error-handler";
|
|
33
|
+
import { AuthRequiredHandler } from "./auth-required-handler";
|
|
34
|
+
import { AgentsListHandler } from "./agents-list-handler";
|
|
35
|
+
import { ErrorMessageHandler } from "./error-message-handler";
|
|
36
|
+
import { RegularMessageHandler } from "./regular-message-handler";
|
|
37
|
+
import { PingHandler, PongHandler } from "./ping-pong-handler";
|
|
38
|
+
import { SubscribeResponseHandler } from "./subscribe-response-handler";
|
|
39
|
+
import { UnsubscribeResponseHandler } from "./unsubscribe-response-handler";
|
|
40
|
+
import { ListRoomsResponseHandler } from "./list-rooms-response-handler";
|
|
41
|
+
import { MessageHandler } from "./types";
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Get all default message handlers
|
|
45
|
+
* @param clientType - The client type for authentication (default: "user")
|
|
46
|
+
* @returns Array of all default handlers
|
|
47
|
+
*/
|
|
48
|
+
export function getDefaultHandlers(
|
|
49
|
+
clientType: "user" | "agent" | "coordinator" = "user"
|
|
50
|
+
): MessageHandler[] {
|
|
51
|
+
return [
|
|
52
|
+
// Authentication handlers
|
|
53
|
+
new ChallengeHandler(clientType),
|
|
54
|
+
new AuthMessageHandler(),
|
|
55
|
+
new AuthSuccessHandler(),
|
|
56
|
+
new AuthErrorHandler(),
|
|
57
|
+
new AuthRequiredHandler(),
|
|
58
|
+
|
|
59
|
+
// Agent/coordinator handlers
|
|
60
|
+
new TaskResponseHandler(),
|
|
61
|
+
new AgentSelectedHandler(),
|
|
62
|
+
new AgentsListHandler(),
|
|
63
|
+
|
|
64
|
+
// Message handlers
|
|
65
|
+
new RegularMessageHandler(),
|
|
66
|
+
new ErrorMessageHandler(),
|
|
67
|
+
|
|
68
|
+
// Room handlers
|
|
69
|
+
new SubscribeResponseHandler(),
|
|
70
|
+
new UnsubscribeResponseHandler(),
|
|
71
|
+
new ListRoomsResponseHandler(),
|
|
72
|
+
|
|
73
|
+
// Keepalive handlers
|
|
74
|
+
new PingHandler(),
|
|
75
|
+
new PongHandler()
|
|
76
|
+
];
|
|
77
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handler for list_rooms response messages
|
|
3
|
+
* Processes room list from server
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { ListRoomsResponse, ListRoomsResponseSchema } from "../../types";
|
|
7
|
+
import { BaseMessageHandler } from "./base-handler";
|
|
8
|
+
import { HandlerContext } from "./types";
|
|
9
|
+
|
|
10
|
+
export class ListRoomsResponseHandler extends BaseMessageHandler<ListRoomsResponse> {
|
|
11
|
+
readonly type = "list_rooms" as const;
|
|
12
|
+
readonly schema = ListRoomsResponseSchema;
|
|
13
|
+
|
|
14
|
+
protected handleValidated(message: ListRoomsResponse, context: HandlerContext): void {
|
|
15
|
+
context.logger.debug("Handling list_rooms response", {
|
|
16
|
+
roomCount: message.data.rooms.length
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
// Emit room:list event with room info array
|
|
20
|
+
this.emit(context, "room:list", message.data.rooms);
|
|
21
|
+
|
|
22
|
+
// Send webhook (fire-and-forget)
|
|
23
|
+
this.sendWebhook(context, "room_list", {
|
|
24
|
+
rooms: message.data.rooms,
|
|
25
|
+
count: message.data.rooms.length
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handler for ping and pong messages
|
|
3
|
+
* These are keepalive messages that don't require special handling
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { PingMessage, PongMessage, PingMessageSchema, PongMessageSchema } from "../../types";
|
|
7
|
+
import { BaseMessageHandler } from "./base-handler";
|
|
8
|
+
import { HandlerContext } from "./types";
|
|
9
|
+
|
|
10
|
+
export class PingHandler extends BaseMessageHandler<PingMessage> {
|
|
11
|
+
readonly type = "ping" as const;
|
|
12
|
+
readonly schema = PingMessageSchema;
|
|
13
|
+
|
|
14
|
+
protected async handleValidated(_message: PingMessage, context: HandlerContext): Promise<void> {
|
|
15
|
+
// Ping messages are handled at the WebSocket level (ws library)
|
|
16
|
+
// No special processing needed here
|
|
17
|
+
context.logger.debug("Received ping");
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export class PongHandler extends BaseMessageHandler<PongMessage> {
|
|
22
|
+
readonly type = "pong" as const;
|
|
23
|
+
readonly schema = PongMessageSchema;
|
|
24
|
+
|
|
25
|
+
protected async handleValidated(_message: PongMessage, context: HandlerContext): Promise<void> {
|
|
26
|
+
// Pong messages are handled at the WebSocket level (ws library)
|
|
27
|
+
// No special processing needed here
|
|
28
|
+
context.logger.debug("Received pong");
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handler for regular 'message' type messages
|
|
3
|
+
* Processes messages from agents (when they send 'message' instead of 'task_response')
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { UserMessage, UserMessageSchema } from "../../types";
|
|
7
|
+
import { AgentResponse } from "../../types/events";
|
|
8
|
+
import { BaseMessageHandler } from "./base-handler";
|
|
9
|
+
import { HandlerContext } from "./types";
|
|
10
|
+
|
|
11
|
+
export class RegularMessageHandler extends BaseMessageHandler<UserMessage> {
|
|
12
|
+
readonly type = "message" as const;
|
|
13
|
+
readonly schema = UserMessageSchema;
|
|
14
|
+
|
|
15
|
+
protected async handleValidated(message: UserMessage, context: HandlerContext): Promise<void> {
|
|
16
|
+
// Check if this message has a 'from' field and content
|
|
17
|
+
if (!message.from || !message.content) {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
if (!message.room) {
|
|
22
|
+
context.logger.warn("Inbound 'message' lacks room; proceeding without room context", {
|
|
23
|
+
from: message.from
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const authState = context.getAuthState();
|
|
28
|
+
const fromLower = message.from.toLowerCase();
|
|
29
|
+
const walletLower = authState.walletAddress?.toLowerCase();
|
|
30
|
+
|
|
31
|
+
context.logger.debug('Received message type "message"', {
|
|
32
|
+
from: message.from,
|
|
33
|
+
fromLower,
|
|
34
|
+
walletLower
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
// If message is NOT from the user's wallet, it's likely from an agent
|
|
38
|
+
// Treat it as an agent response
|
|
39
|
+
if (fromLower !== walletLower) {
|
|
40
|
+
context.logger.info("Treating message as agent response", {
|
|
41
|
+
from: message.from,
|
|
42
|
+
contentPreview:
|
|
43
|
+
typeof message.content === "string" ? message.content.substring(0, 100) : "non-string",
|
|
44
|
+
room: message.room
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
// Build agent response
|
|
48
|
+
const response: AgentResponse = {
|
|
49
|
+
taskId: message.data?.task_id || `msg-${Date.now()}`,
|
|
50
|
+
agentId: message.from,
|
|
51
|
+
agentName: message.data?.agent_name || "Agent",
|
|
52
|
+
content:
|
|
53
|
+
typeof message.content === "string" ? message.content : JSON.stringify(message.content),
|
|
54
|
+
contentType: message.content_type || "text/plain",
|
|
55
|
+
success: true,
|
|
56
|
+
timestamp: new Date(),
|
|
57
|
+
humanized:
|
|
58
|
+
typeof message.content === "string" ? message.content : JSON.stringify(message.content)
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
// Emit agent:response event
|
|
62
|
+
this.emit(context, "agent:response", response);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handler for subscribe response messages
|
|
3
|
+
* Processes room subscription confirmations
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { SubscribeResponse, SubscribeResponseSchema } from "../../types";
|
|
7
|
+
import { BaseMessageHandler } from "./base-handler";
|
|
8
|
+
import { HandlerContext } from "./types";
|
|
9
|
+
|
|
10
|
+
export class SubscribeResponseHandler extends BaseMessageHandler<SubscribeResponse> {
|
|
11
|
+
readonly type = "subscribe" as const;
|
|
12
|
+
readonly schema = SubscribeResponseSchema;
|
|
13
|
+
|
|
14
|
+
protected handleValidated(message: SubscribeResponse, context: HandlerContext): void {
|
|
15
|
+
context.logger.debug("Handling subscribe response", {
|
|
16
|
+
roomId: message.data.room_id,
|
|
17
|
+
success: message.data.success
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
if (message.data.success) {
|
|
21
|
+
// Update subscription state from server's authoritative list
|
|
22
|
+
if (context.roomManager && message.data.subscriptions) {
|
|
23
|
+
context.roomManager.updateSubscriptions(message.data.subscriptions);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Emit room:subscribed event
|
|
27
|
+
this.emit(context, "room:subscribed", {
|
|
28
|
+
roomId: message.data.room_id,
|
|
29
|
+
subscriptions: message.data.subscriptions || []
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
// Send webhook (fire-and-forget)
|
|
33
|
+
this.sendWebhook(context, "room_subscribed", {
|
|
34
|
+
roomId: message.data.room_id,
|
|
35
|
+
subscriptions: message.data.subscriptions
|
|
36
|
+
});
|
|
37
|
+
} else {
|
|
38
|
+
context.logger.warn("Room subscription failed", {
|
|
39
|
+
roomId: message.data.room_id,
|
|
40
|
+
message: message.data.message
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
// Emit error event
|
|
44
|
+
this.emit(context, "error", new Error(`Subscription failed: ${message.data.message}`));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handler for task_response messages
|
|
3
|
+
* Processes agent responses to tasks
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
import { TaskResponseMessage, TaskResponseMessageSchema } from "../../types";
|
|
8
|
+
import { AgentResponse } from "../../types/events";
|
|
9
|
+
import { BaseMessageHandler } from "./base-handler";
|
|
10
|
+
import { HandlerContext } from "./types";
|
|
11
|
+
|
|
12
|
+
export class TaskResponseHandler extends BaseMessageHandler<TaskResponseMessage> {
|
|
13
|
+
readonly type = "task_response" as const;
|
|
14
|
+
readonly schema = TaskResponseMessageSchema as z.ZodSchema<TaskResponseMessage>;
|
|
15
|
+
|
|
16
|
+
protected handleValidated(message: TaskResponseMessage, context: HandlerContext): void {
|
|
17
|
+
context.logger.debug("Handling task_response message", {
|
|
18
|
+
taskId: message.data.task_id,
|
|
19
|
+
from: message.from
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
// Build agent response
|
|
23
|
+
const response: AgentResponse = {
|
|
24
|
+
taskId: message.data.task_id,
|
|
25
|
+
agentId: message.from || "",
|
|
26
|
+
agentName: message.data.agent_name,
|
|
27
|
+
content: message.content,
|
|
28
|
+
contentType: message.content_type,
|
|
29
|
+
success: message.data.success !== false,
|
|
30
|
+
error: message.data.error,
|
|
31
|
+
timestamp: new Date(),
|
|
32
|
+
raw: message,
|
|
33
|
+
humanized: message.content
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
// Emit agent:response event
|
|
37
|
+
this.emit(context, "agent:response", response);
|
|
38
|
+
|
|
39
|
+
// Send webhook (fire-and-forget)
|
|
40
|
+
this.sendWebhook(context, "task_response", response, {
|
|
41
|
+
agentId: response.agentId,
|
|
42
|
+
taskId: response.taskId
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types and interfaces for the Message Handler Registry pattern
|
|
3
|
+
* Defines the contract for message handlers and their context
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
import { BaseMessage, MessageType, Logger, WebhookEventType } from "../../types";
|
|
8
|
+
import { FormattedResponse } from "../../formatters/response-formatter";
|
|
9
|
+
import { PrivateKeyAccount } from "viem/accounts";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Context provided to message handlers
|
|
13
|
+
* Contains all dependencies needed to handle messages
|
|
14
|
+
*/
|
|
15
|
+
export interface HandlerContext {
|
|
16
|
+
// Event emission
|
|
17
|
+
emit: (event: string, ...args: any[]) => void;
|
|
18
|
+
|
|
19
|
+
// Webhook delivery
|
|
20
|
+
sendWebhook: (type: WebhookEventType, data: any, metadata?: any) => Promise<void>;
|
|
21
|
+
|
|
22
|
+
// Response formatting (optional)
|
|
23
|
+
formatResponse?: (message: BaseMessage) => FormattedResponse;
|
|
24
|
+
|
|
25
|
+
// Logging
|
|
26
|
+
logger: Logger;
|
|
27
|
+
|
|
28
|
+
// State access
|
|
29
|
+
getConnectionState: () => any;
|
|
30
|
+
getAuthState: () => any;
|
|
31
|
+
updateConnectionState: (update: any) => void;
|
|
32
|
+
updateAuthState: (update: any) => void;
|
|
33
|
+
|
|
34
|
+
// Room manager for subscription updates (optional)
|
|
35
|
+
roomManager?: any;
|
|
36
|
+
|
|
37
|
+
// Account for signing (optional, for auth handlers)
|
|
38
|
+
account?: PrivateKeyAccount;
|
|
39
|
+
|
|
40
|
+
// Send message back to server
|
|
41
|
+
sendMessage: (message: BaseMessage) => Promise<void>;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Message handler interface
|
|
46
|
+
* Each message type has a handler implementing this interface
|
|
47
|
+
*/
|
|
48
|
+
export interface MessageHandler<T extends BaseMessage = BaseMessage> {
|
|
49
|
+
// Message type this handler processes
|
|
50
|
+
readonly type: MessageType;
|
|
51
|
+
|
|
52
|
+
// Zod schema for validation
|
|
53
|
+
readonly schema: z.ZodSchema<T>;
|
|
54
|
+
|
|
55
|
+
// Handle the message
|
|
56
|
+
handle(message: BaseMessage, context: HandlerContext): Promise<void> | void;
|
|
57
|
+
|
|
58
|
+
// Validate if this handler can handle a message
|
|
59
|
+
canHandle(message: BaseMessage): boolean;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Handler metadata for registration
|
|
64
|
+
*/
|
|
65
|
+
export interface HandlerMetadata {
|
|
66
|
+
type: MessageType;
|
|
67
|
+
description?: string;
|
|
68
|
+
priority?: number; // For handler ordering (lower = higher priority)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Handler registration options
|
|
73
|
+
*/
|
|
74
|
+
export interface HandlerRegistrationOptions {
|
|
75
|
+
replace?: boolean; // Replace existing handler for this type
|
|
76
|
+
priority?: number; // Handler priority
|
|
77
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handler for unsubscribe response messages
|
|
3
|
+
* Processes room unsubscription confirmations
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { UnsubscribeResponse, UnsubscribeResponseSchema } from "../../types";
|
|
7
|
+
import { BaseMessageHandler } from "./base-handler";
|
|
8
|
+
import { HandlerContext } from "./types";
|
|
9
|
+
|
|
10
|
+
export class UnsubscribeResponseHandler extends BaseMessageHandler<UnsubscribeResponse> {
|
|
11
|
+
readonly type = "unsubscribe" as const;
|
|
12
|
+
readonly schema = UnsubscribeResponseSchema;
|
|
13
|
+
|
|
14
|
+
protected handleValidated(message: UnsubscribeResponse, context: HandlerContext): void {
|
|
15
|
+
context.logger.debug("Handling unsubscribe response", {
|
|
16
|
+
roomId: message.data.room_id,
|
|
17
|
+
success: message.data.success
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
if (message.data.success) {
|
|
21
|
+
// Update subscription state from server's authoritative list
|
|
22
|
+
if (context.roomManager && message.data.subscriptions) {
|
|
23
|
+
context.roomManager.updateSubscriptions(message.data.subscriptions);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Emit room:unsubscribed event
|
|
27
|
+
this.emit(context, "room:unsubscribed", {
|
|
28
|
+
roomId: message.data.room_id,
|
|
29
|
+
subscriptions: message.data.subscriptions || []
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
// Send webhook (fire-and-forget)
|
|
33
|
+
this.sendWebhook(context, "room_unsubscribed", {
|
|
34
|
+
roomId: message.data.room_id,
|
|
35
|
+
subscriptions: message.data.subscriptions
|
|
36
|
+
});
|
|
37
|
+
} else {
|
|
38
|
+
context.logger.warn("Room unsubscription failed", {
|
|
39
|
+
roomId: message.data.room_id,
|
|
40
|
+
message: message.data.message
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
// Emit error event
|
|
44
|
+
this.emit(context, "error", new Error(`Unsubscription failed: ${message.data.message}`));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|