@teneo-protocol/sdk 1.0.1 → 2.2.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/.eslintrc.json +11 -2
- package/.github/CODEOWNERS +2 -0
- package/.github/ISSUE_TEMPLATE/01-bug.yml +85 -0
- package/.github/ISSUE_TEMPLATE/config.yml +8 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +22 -0
- package/.github/workflows/claude-code-review.yml +8 -3
- package/.github/workflows/claude-reviewer.yml +6 -4
- package/.github/workflows/publish-npm.yml +9 -6
- package/.github/workflows/push-to-main.yml +1 -1
- package/.github/workflows/top-issue.yml +102 -0
- package/CHANGELOG.md +334 -0
- package/CONCEPTS.md +747 -0
- package/README.md +577 -54
- package/dist/constants.js +8 -8
- package/dist/constants.js.map +1 -1
- package/dist/core/websocket-client.d.ts +25 -1
- package/dist/core/websocket-client.d.ts.map +1 -1
- package/dist/core/websocket-client.js +74 -15
- package/dist/core/websocket-client.js.map +1 -1
- package/dist/formatters/response-formatter.js +4 -0
- package/dist/formatters/response-formatter.js.map +1 -1
- package/dist/handlers/message-handler-registry.js +2 -1
- package/dist/handlers/message-handler-registry.js.map +1 -1
- package/dist/handlers/message-handlers/agent-details-response-handler.d.ts +1666 -0
- package/dist/handlers/message-handlers/agent-details-response-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/agent-details-response-handler.js +38 -0
- package/dist/handlers/message-handlers/agent-details-response-handler.js.map +1 -0
- package/dist/handlers/message-handlers/agent-room-operation-response-handler.d.ts +76 -0
- package/dist/handlers/message-handlers/agent-room-operation-response-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/agent-room-operation-response-handler.js +67 -0
- package/dist/handlers/message-handlers/agent-room-operation-response-handler.js.map +1 -0
- package/dist/handlers/message-handlers/agent-selected-handler.d.ts +92 -38
- package/dist/handlers/message-handlers/agent-selected-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/agent-selected-handler.js +2 -5
- package/dist/handlers/message-handlers/agent-selected-handler.js.map +1 -1
- package/dist/handlers/message-handlers/agent-status-update-handler.d.ts +1687 -0
- package/dist/handlers/message-handlers/agent-status-update-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/agent-status-update-handler.js +48 -0
- package/dist/handlers/message-handlers/agent-status-update-handler.js.map +1 -0
- package/dist/handlers/message-handlers/agents-list-handler.js +2 -5
- package/dist/handlers/message-handlers/agents-list-handler.js.map +1 -1
- package/dist/handlers/message-handlers/all-agents-response-handler.d.ts +439 -0
- package/dist/handlers/message-handlers/all-agents-response-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/all-agents-response-handler.js +36 -0
- package/dist/handlers/message-handlers/all-agents-response-handler.js.map +1 -0
- package/dist/handlers/message-handlers/auth-error-handler.d.ts +45 -31
- package/dist/handlers/message-handlers/auth-error-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/auth-error-handler.js +2 -5
- package/dist/handlers/message-handlers/auth-error-handler.js.map +1 -1
- package/dist/handlers/message-handlers/auth-message-handler.d.ts +6 -0
- package/dist/handlers/message-handlers/auth-message-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/auth-message-handler.js +71 -10
- package/dist/handlers/message-handlers/auth-message-handler.js.map +1 -1
- package/dist/handlers/message-handlers/auth-required-handler.d.ts +49 -31
- package/dist/handlers/message-handlers/auth-required-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/auth-required-handler.js +2 -5
- package/dist/handlers/message-handlers/auth-required-handler.js.map +1 -1
- package/dist/handlers/message-handlers/auth-success-handler.d.ts +6 -0
- package/dist/handlers/message-handlers/auth-success-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/auth-success-handler.js +52 -9
- package/dist/handlers/message-handlers/auth-success-handler.js.map +1 -1
- package/dist/handlers/message-handlers/base-handler.d.ts +4 -4
- package/dist/handlers/message-handlers/base-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/base-handler.js +3 -1
- package/dist/handlers/message-handlers/base-handler.js.map +1 -1
- package/dist/handlers/message-handlers/challenge-handler.d.ts +45 -31
- package/dist/handlers/message-handlers/challenge-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/challenge-handler.js +3 -2
- package/dist/handlers/message-handlers/challenge-handler.js.map +1 -1
- package/dist/handlers/message-handlers/error-message-handler.d.ts +49 -31
- package/dist/handlers/message-handlers/error-message-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/error-message-handler.js +2 -5
- package/dist/handlers/message-handlers/error-message-handler.js.map +1 -1
- package/dist/handlers/message-handlers/index.d.ts +11 -0
- package/dist/handlers/message-handlers/index.d.ts.map +1 -1
- package/dist/handlers/message-handlers/index.js +55 -1
- package/dist/handlers/message-handlers/index.js.map +1 -1
- package/dist/handlers/message-handlers/list-available-agents-handler.d.ts +1660 -0
- package/dist/handlers/message-handlers/list-available-agents-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/list-available-agents-handler.js +35 -0
- package/dist/handlers/message-handlers/list-available-agents-handler.js.map +1 -0
- package/dist/handlers/message-handlers/list-room-agents-handler.d.ts +1669 -0
- package/dist/handlers/message-handlers/list-room-agents-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/list-room-agents-handler.js +48 -0
- package/dist/handlers/message-handlers/list-room-agents-handler.js.map +1 -0
- package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts +2 -110
- package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/list-rooms-response-handler.js +4 -6
- package/dist/handlers/message-handlers/list-rooms-response-handler.js.map +1 -1
- package/dist/handlers/message-handlers/ping-pong-handler.d.ts +62 -58
- package/dist/handlers/message-handlers/ping-pong-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/ping-pong-handler.js +4 -10
- package/dist/handlers/message-handlers/ping-pong-handler.js.map +1 -1
- package/dist/handlers/message-handlers/rate-limit-notification-handler.d.ts +94 -0
- package/dist/handlers/message-handlers/rate-limit-notification-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/rate-limit-notification-handler.js +35 -0
- package/dist/handlers/message-handlers/rate-limit-notification-handler.js.map +1 -0
- package/dist/handlers/message-handlers/regular-message-handler.d.ts +31 -29
- package/dist/handlers/message-handlers/regular-message-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/regular-message-handler.js +4 -6
- package/dist/handlers/message-handlers/regular-message-handler.js.map +1 -1
- package/dist/handlers/message-handlers/room-operation-response-handler.d.ts +328 -0
- package/dist/handlers/message-handlers/room-operation-response-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/room-operation-response-handler.js +89 -0
- package/dist/handlers/message-handlers/room-operation-response-handler.js.map +1 -0
- package/dist/handlers/message-handlers/subscribe-response-handler.d.ts +53 -31
- package/dist/handlers/message-handlers/subscribe-response-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/subscribe-response-handler.js +4 -6
- package/dist/handlers/message-handlers/subscribe-response-handler.js.map +1 -1
- package/dist/handlers/message-handlers/task-quote-handler.d.ts +14 -0
- package/dist/handlers/message-handlers/task-quote-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/task-quote-handler.js +29 -0
- package/dist/handlers/message-handlers/task-quote-handler.js.map +1 -0
- package/dist/handlers/message-handlers/task-response-handler.js +2 -5
- package/dist/handlers/message-handlers/task-response-handler.js.map +1 -1
- package/dist/handlers/message-handlers/types.d.ts +21 -7
- package/dist/handlers/message-handlers/types.d.ts.map +1 -1
- package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts +53 -31
- package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/unsubscribe-response-handler.js +4 -6
- package/dist/handlers/message-handlers/unsubscribe-response-handler.js.map +1 -1
- package/dist/handlers/message-handlers/user-authenticated-handler.d.ts +40 -0
- package/dist/handlers/message-handlers/user-authenticated-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/user-authenticated-handler.js +28 -0
- package/dist/handlers/message-handlers/user-authenticated-handler.js.map +1 -0
- package/dist/handlers/message-handlers/user-count-handler.d.ts +49 -0
- package/dist/handlers/message-handlers/user-count-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/user-count-handler.js +31 -0
- package/dist/handlers/message-handlers/user-count-handler.js.map +1 -0
- package/dist/handlers/webhook-handler.d.ts +1 -1
- package/dist/handlers/webhook-handler.d.ts.map +1 -1
- package/dist/handlers/webhook-handler.js +14 -5
- package/dist/handlers/webhook-handler.js.map +1 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -2
- package/dist/index.js.map +1 -1
- package/dist/managers/admin-manager.d.ts +116 -0
- package/dist/managers/admin-manager.d.ts.map +1 -0
- package/dist/managers/admin-manager.js +169 -0
- package/dist/managers/admin-manager.js.map +1 -0
- package/dist/managers/agent-registry.d.ts +52 -1
- package/dist/managers/agent-registry.d.ts.map +1 -1
- package/dist/managers/agent-registry.js +145 -6
- package/dist/managers/agent-registry.js.map +1 -1
- package/dist/managers/agent-room-manager.d.ts +216 -0
- package/dist/managers/agent-room-manager.d.ts.map +1 -0
- package/dist/managers/agent-room-manager.js +555 -0
- package/dist/managers/agent-room-manager.js.map +1 -0
- package/dist/managers/connection-manager.js +2 -0
- package/dist/managers/connection-manager.js.map +1 -1
- package/dist/managers/index.d.ts +4 -1
- package/dist/managers/index.d.ts.map +1 -1
- package/dist/managers/index.js +7 -1
- package/dist/managers/index.js.map +1 -1
- package/dist/managers/message-router.d.ts +56 -5
- package/dist/managers/message-router.d.ts.map +1 -1
- package/dist/managers/message-router.js +155 -8
- package/dist/managers/message-router.js.map +1 -1
- package/dist/managers/room-management-manager.d.ts +213 -0
- package/dist/managers/room-management-manager.d.ts.map +1 -0
- package/dist/managers/room-management-manager.js +442 -0
- package/dist/managers/room-management-manager.js.map +1 -0
- package/dist/managers/room-manager.d.ts +11 -9
- package/dist/managers/room-manager.d.ts.map +1 -1
- package/dist/managers/room-manager.js +14 -10
- package/dist/managers/room-manager.js.map +1 -1
- package/dist/payments/index.d.ts +5 -0
- package/dist/payments/index.d.ts.map +1 -0
- package/dist/payments/index.js +21 -0
- package/dist/payments/index.js.map +1 -0
- package/dist/payments/payment-client.d.ts +74 -0
- package/dist/payments/payment-client.d.ts.map +1 -0
- package/dist/payments/payment-client.js +207 -0
- package/dist/payments/payment-client.js.map +1 -0
- package/dist/teneo-sdk.d.ts +467 -33
- package/dist/teneo-sdk.d.ts.map +1 -1
- package/dist/teneo-sdk.js +735 -26
- package/dist/teneo-sdk.js.map +1 -1
- package/dist/types/categories.d.ts +22 -0
- package/dist/types/categories.d.ts.map +1 -0
- package/dist/types/categories.js +40 -0
- package/dist/types/categories.js.map +1 -0
- package/dist/types/config.d.ts +134 -54
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +70 -9
- package/dist/types/config.js.map +1 -1
- package/dist/types/error-codes.d.ts +10 -0
- package/dist/types/error-codes.d.ts.map +1 -1
- package/dist/types/error-codes.js +12 -0
- package/dist/types/error-codes.js.map +1 -1
- package/dist/types/events.d.ts +176 -68
- package/dist/types/events.d.ts.map +1 -1
- package/dist/types/events.js +19 -1
- package/dist/types/events.js.map +1 -1
- package/dist/types/index.d.ts +3 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +57 -2
- package/dist/types/index.js.map +1 -1
- package/dist/types/messages.d.ts +22225 -2592
- package/dist/types/messages.d.ts.map +1 -1
- package/dist/types/messages.js +537 -28
- package/dist/types/messages.js.map +1 -1
- package/dist/utils/bounded-queue.d.ts.map +1 -1
- package/dist/utils/bounded-queue.js +5 -2
- package/dist/utils/bounded-queue.js.map +1 -1
- package/dist/utils/circuit-breaker.js +11 -4
- package/dist/utils/circuit-breaker.js.map +1 -1
- package/dist/utils/deduplication-cache.js +3 -1
- package/dist/utils/deduplication-cache.js.map +1 -1
- package/dist/utils/event-waiter.d.ts +3 -3
- package/dist/utils/event-waiter.d.ts.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +4 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/pricing-resolver.d.ts +26 -0
- package/dist/utils/pricing-resolver.d.ts.map +1 -0
- package/dist/utils/pricing-resolver.js +85 -0
- package/dist/utils/pricing-resolver.js.map +1 -0
- package/dist/utils/rate-limiter.d.ts.map +1 -1
- package/dist/utils/rate-limiter.js +6 -0
- package/dist/utils/rate-limiter.js.map +1 -1
- package/dist/utils/retry-policy.js +1 -0
- package/dist/utils/retry-policy.js.map +1 -1
- package/dist/utils/secure-private-key.js +3 -1
- package/dist/utils/secure-private-key.js.map +1 -1
- package/dist/utils/signature-verifier.d.ts.map +1 -1
- package/dist/utils/signature-verifier.js +3 -1
- package/dist/utils/signature-verifier.js.map +1 -1
- package/examples/.env.example +2 -2
- package/examples/agent-room-management-example.ts +335 -0
- package/examples/basic-usage.ts +3 -4
- package/examples/claude-agent-x-follower/.env.example +3 -3
- package/examples/claude-agent-x-follower/QUICKSTART.md +3 -3
- package/examples/claude-agent-x-follower/README.md +3 -3
- package/examples/claude-agent-x-follower/index.ts +120 -96
- package/examples/n8n-teneo/.env.example +3 -3
- package/examples/n8n-teneo/README.md +2 -2
- package/examples/n8n-teneo/index.ts +54 -44
- package/examples/nestjs-dashboard/.env.example +11 -0
- package/examples/nestjs-dashboard/README.md +297 -0
- package/examples/nestjs-dashboard/nest-cli.json +10 -0
- package/examples/nestjs-dashboard/package.json +44 -0
- package/examples/nestjs-dashboard/pnpm-lock.yaml +3079 -0
- package/examples/nestjs-dashboard/src/app.controller.ts +24 -0
- package/examples/nestjs-dashboard/src/app.module.ts +15 -0
- package/examples/nestjs-dashboard/src/main.ts +32 -0
- package/examples/nestjs-dashboard/src/public/dashboard.html +1144 -0
- package/examples/nestjs-dashboard/src/teneo/agents.controller.ts +54 -0
- package/examples/nestjs-dashboard/src/teneo/events.controller.ts +65 -0
- package/examples/nestjs-dashboard/src/teneo/messages.controller.ts +47 -0
- package/examples/nestjs-dashboard/src/teneo/rooms.controller.ts +258 -0
- package/examples/nestjs-dashboard/src/teneo/teneo.module.ts +13 -0
- package/examples/nestjs-dashboard/src/teneo/teneo.service.ts +484 -0
- package/examples/nestjs-dashboard/tsconfig.json +22 -0
- package/examples/openai-teneo/.env.example +3 -3
- package/examples/openai-teneo/README.md +3 -3
- package/examples/openai-teneo/index.ts +82 -71
- package/examples/production-dashboard/.env.example +3 -3
- package/examples/production-dashboard/README.md +90 -13
- package/examples/production-dashboard/public/dashboard.html +1173 -601
- package/examples/production-dashboard/server.ts +349 -7
- package/examples/room-management-example.ts +282 -0
- package/examples/usage/.env.example +2 -2
- package/examples/usage/01-connect.ts +3 -4
- package/examples/usage/02-list-agents.ts +2 -3
- package/examples/usage/03-pick-agent.ts +2 -3
- package/examples/usage/04-find-by-capability.ts +2 -3
- package/examples/usage/05-webhook-example.ts +2 -3
- package/examples/usage/06-simple-api-server.ts +2 -3
- package/examples/usage/07-event-listener.ts +2 -3
- package/examples/usage/README.md +1 -1
- package/examples/webhook-integration.ts +1 -1
- package/examples/x-influencer-battle-server.ts +2 -2
- package/package.json +12 -1
- package/src/core/websocket-client.test.ts +8 -3
- package/src/core/websocket-client.ts +58 -4
- package/src/formatters/response-formatter.test.ts +2 -0
- package/src/formatters/response-formatter.ts +3 -3
- package/src/handlers/message-handlers/agent-details-response-handler.ts +42 -0
- package/src/handlers/message-handlers/agent-room-operation-response-handler.ts +77 -0
- package/src/handlers/message-handlers/agent-status-update-handler.ts +52 -0
- package/src/handlers/message-handlers/all-agents-response-handler.ts +39 -0
- package/src/handlers/message-handlers/auth-message-handler.ts +78 -5
- package/src/handlers/message-handlers/auth-success-handler.ts +63 -6
- package/src/handlers/message-handlers/base-handler.ts +20 -7
- package/src/handlers/message-handlers/index.ts +53 -0
- package/src/handlers/message-handlers/list-available-agents-handler.ts +41 -0
- package/src/handlers/message-handlers/list-room-agents-handler.ts +58 -0
- package/src/handlers/message-handlers/list-rooms-response-handler.ts +4 -2
- package/src/handlers/message-handlers/rate-limit-notification-handler.ts +45 -0
- package/src/handlers/message-handlers/regular-message-handler.ts +3 -2
- package/src/handlers/message-handlers/room-operation-response-handler.ts +102 -0
- package/src/handlers/message-handlers/subscribe-response-handler.ts +12 -2
- package/src/handlers/message-handlers/task-quote-handler.ts +31 -0
- package/src/handlers/message-handlers/types.ts +41 -7
- package/src/handlers/message-handlers/unsubscribe-response-handler.ts +12 -2
- package/src/handlers/message-handlers/user-authenticated-handler.ts +31 -0
- package/src/handlers/message-handlers/user-count-handler.ts +34 -0
- package/src/handlers/webhook-handler.test.ts +3 -2
- package/src/handlers/webhook-handler.ts +13 -7
- package/src/index.ts +21 -0
- package/src/managers/admin-manager.ts +249 -0
- package/src/managers/agent-registry.test.ts +2 -1
- package/src/managers/agent-registry.ts +170 -2
- package/src/managers/agent-room-manager.ts +665 -0
- package/src/managers/index.ts +15 -1
- package/src/managers/message-router.ts +215 -17
- package/src/managers/room-management-manager.ts +520 -0
- package/src/managers/room-manager.ts +15 -20
- package/src/payments/index.ts +22 -0
- package/src/payments/payment-client.ts +240 -0
- package/src/teneo-sdk.ts +806 -30
- package/src/types/categories.ts +45 -0
- package/src/types/config.ts +80 -7
- package/src/types/error-codes.ts +14 -0
- package/src/types/events.test.ts +1 -0
- package/src/types/events.ts +67 -0
- package/src/types/index.ts +111 -0
- package/src/types/messages.test.ts +2 -1
- package/src/types/messages.ts +677 -42
- package/src/utils/bounded-queue.test.ts +1 -1
- package/src/utils/bounded-queue.ts +2 -1
- package/src/utils/circuit-breaker.test.ts +1 -1
- package/src/utils/deduplication-cache.test.ts +1 -1
- package/src/utils/event-waiter.test.ts +1 -1
- package/src/utils/event-waiter.ts +3 -3
- package/src/utils/index.ts +7 -0
- package/src/utils/logger.ts +8 -8
- package/src/utils/pricing-resolver.ts +128 -0
- package/src/utils/rate-limiter.test.ts +1 -1
- package/src/utils/rate-limiter.ts +1 -0
- package/src/utils/signature-verifier.test.ts +2 -2
- package/src/utils/signature-verifier.ts +3 -2
- package/tests/.env.example +7 -0
- package/tests/direct-agent-test.ts +151 -0
- package/tests/integration/real-server.test.ts +2 -0
- package/tests/integration/room-management.test.ts +516 -0
- package/tests/integration/websocket.test.ts +5 -2
- package/tests/payment-flow-test.ts +147 -0
- package/tests/unit/handlers/agent-room-operation-response-handler.test.ts +382 -0
- package/tests/unit/handlers/agent-status-update-handler.test.ts +403 -0
- package/tests/unit/handlers/auth-success-handler-rooms.test.ts +697 -0
- package/tests/unit/handlers/list-available-agents-handler.test.ts +248 -0
- package/tests/unit/handlers/list-room-agents-handler.test.ts +290 -0
- package/tests/unit/handlers/room-operation-response-handler.test.ts +500 -0
- package/tests/unit/managers/agent-room-manager.test.ts +527 -0
- package/tests/unit/managers/room-management-manager.test.ts +420 -0
- package/tsconfig.json +2 -2
- package/vitest.config.ts +1 -0
|
@@ -26,8 +26,27 @@ export class AuthMessageHandler extends BaseMessageHandler<AuthMessage> {
|
|
|
26
26
|
isCachedAuth ? "Using cached authentication" : "Authentication successful"
|
|
27
27
|
);
|
|
28
28
|
|
|
29
|
-
// Extract rooms
|
|
30
|
-
const
|
|
29
|
+
// Extract rooms from both 'rooms' (public) and 'private_rooms' (owned private) arrays
|
|
30
|
+
const publicRooms = this.extractRooms(message.data?.rooms);
|
|
31
|
+
const privateRooms = this.extractRooms(message.data?.private_rooms);
|
|
32
|
+
|
|
33
|
+
// Combine all rooms, ensuring correct ownership flags
|
|
34
|
+
// Public rooms from 'rooms' array are NOT owned by the user
|
|
35
|
+
// Private rooms from 'private_rooms' array ARE owned by the user
|
|
36
|
+
const allRooms = [
|
|
37
|
+
...publicRooms.map((r) => ({
|
|
38
|
+
...r,
|
|
39
|
+
is_owner: false, // Explicitly set to false - public rooms are not owned
|
|
40
|
+
is_public: r.is_public !== undefined ? r.is_public : true // Ensure is_public is set
|
|
41
|
+
})),
|
|
42
|
+
...privateRooms.map((r) => ({
|
|
43
|
+
...r,
|
|
44
|
+
is_owner: true, // Explicitly set to true - private_rooms array means owned
|
|
45
|
+
is_public: r.is_public !== undefined ? r.is_public : false // Ensure is_public is set
|
|
46
|
+
}))
|
|
47
|
+
];
|
|
48
|
+
|
|
49
|
+
const { privateRoomIds, sharedRoomIds } = this.categorizeRooms(allRooms);
|
|
31
50
|
|
|
32
51
|
// Update connection state
|
|
33
52
|
this.updateConnectionState(context, { authenticated: true });
|
|
@@ -40,14 +59,45 @@ export class AuthMessageHandler extends BaseMessageHandler<AuthMessage> {
|
|
|
40
59
|
isWhitelisted: message.data?.is_whitelisted,
|
|
41
60
|
isAdmin: message.data?.is_admin_whitelisted,
|
|
42
61
|
nftVerified: message.data?.nft_verified,
|
|
43
|
-
rooms:
|
|
44
|
-
roomObjects:
|
|
45
|
-
privateRoomId: message.data?.private_room_id
|
|
62
|
+
rooms: allRooms.map((r) => r.id),
|
|
63
|
+
roomObjects: allRooms,
|
|
64
|
+
privateRoomId: message.data?.private_room_id,
|
|
65
|
+
// v2.0.0: New fields
|
|
66
|
+
privateRoomIds, // Rooms user owns
|
|
67
|
+
sharedRoomIds, // Rooms user is member of
|
|
68
|
+
maxPrivateRooms: message.data?.max_private_rooms // Max rooms user can create
|
|
46
69
|
});
|
|
47
70
|
|
|
71
|
+
// Initialize room management manager with room data (v2.0.0)
|
|
72
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
73
|
+
const roomMgmt = (context as any).roomManagementManager;
|
|
74
|
+
if (roomMgmt) {
|
|
75
|
+
// Set room limit
|
|
76
|
+
if (message.data?.max_private_rooms) {
|
|
77
|
+
roomMgmt.setRoomLimit(message.data.max_private_rooms);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Categorize and cache rooms
|
|
81
|
+
const ownedRooms = allRooms.filter((r) => r.is_owner === true);
|
|
82
|
+
const sharedRooms = allRooms.filter((r) => r.is_owner === false);
|
|
83
|
+
roomMgmt.setOwnedRooms(ownedRooms);
|
|
84
|
+
roomMgmt.setSharedRooms(sharedRooms);
|
|
85
|
+
|
|
86
|
+
context.logger.debug("Room management initialized from auth message", {
|
|
87
|
+
owned: ownedRooms.length,
|
|
88
|
+
shared: sharedRooms.length,
|
|
89
|
+
limit: message.data?.max_private_rooms
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
|
|
48
93
|
// Get updated auth state
|
|
49
94
|
const authState = context.getAuthState();
|
|
50
95
|
|
|
96
|
+
// Update admin manager with admin status
|
|
97
|
+
if (context.adminManager) {
|
|
98
|
+
context.adminManager.setAdminStatus(message.data?.is_admin_whitelisted ?? false);
|
|
99
|
+
}
|
|
100
|
+
|
|
51
101
|
// Emit events
|
|
52
102
|
this.emit(context, "auth:success", authState);
|
|
53
103
|
this.emit(context, "ready");
|
|
@@ -63,4 +113,27 @@ export class AuthMessageHandler extends BaseMessageHandler<AuthMessage> {
|
|
|
63
113
|
}
|
|
64
114
|
return rooms;
|
|
65
115
|
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Categorize rooms into owned vs member rooms based on is_owner flag
|
|
119
|
+
* @param rooms - Array of room info objects
|
|
120
|
+
* @returns Object with privateRoomIds (owned) and sharedRoomIds (member)
|
|
121
|
+
*/
|
|
122
|
+
private categorizeRooms(rooms: Room[]): {
|
|
123
|
+
privateRoomIds: string[];
|
|
124
|
+
sharedRoomIds: string[];
|
|
125
|
+
} {
|
|
126
|
+
const privateRoomIds: string[] = [];
|
|
127
|
+
const sharedRoomIds: string[] = [];
|
|
128
|
+
|
|
129
|
+
for (const room of rooms) {
|
|
130
|
+
if (room.is_owner) {
|
|
131
|
+
if (room.id) privateRoomIds.push(room.id);
|
|
132
|
+
} else {
|
|
133
|
+
if (room.id) sharedRoomIds.push(room.id);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
return { privateRoomIds, sharedRoomIds };
|
|
138
|
+
}
|
|
66
139
|
}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { z } from "zod";
|
|
7
|
-
import { AuthSuccessMessage, AuthSuccessMessageSchema,
|
|
7
|
+
import { AuthSuccessMessage, AuthSuccessMessageSchema, RoomInfo } from "../../types";
|
|
8
8
|
import { BaseMessageHandler } from "./base-handler";
|
|
9
9
|
import { HandlerContext } from "./types";
|
|
10
10
|
|
|
@@ -18,8 +18,9 @@ export class AuthSuccessHandler extends BaseMessageHandler<AuthSuccessMessage> {
|
|
|
18
18
|
): Promise<void> {
|
|
19
19
|
context.logger.info("Authentication successful");
|
|
20
20
|
|
|
21
|
-
// Extract rooms
|
|
21
|
+
// Extract and categorize rooms
|
|
22
22
|
const rooms = this.extractRooms(message.data.rooms);
|
|
23
|
+
const { privateRoomIds, sharedRoomIds } = this.categorizeRooms(rooms);
|
|
23
24
|
|
|
24
25
|
// Update connection state
|
|
25
26
|
this.updateConnectionState(context, { authenticated: true });
|
|
@@ -32,14 +33,47 @@ export class AuthSuccessHandler extends BaseMessageHandler<AuthSuccessMessage> {
|
|
|
32
33
|
isWhitelisted: message.data.is_whitelisted,
|
|
33
34
|
isAdmin: message.data.is_admin_whitelisted,
|
|
34
35
|
nftVerified: message.data.nft_verified,
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
36
|
+
|
|
37
|
+
// Backward compatibility: deprecated fields
|
|
38
|
+
rooms: rooms.map((r) => r.id), // All room IDs
|
|
39
|
+
privateRoomId: message.data.private_room_id, // DEPRECATED: single private room ID
|
|
40
|
+
|
|
41
|
+
// v2.0.0: New fields
|
|
42
|
+
roomObjects: rooms, // Full room objects with is_owner field
|
|
43
|
+
privateRoomIds, // Rooms user owns
|
|
44
|
+
sharedRoomIds, // Rooms user is member of
|
|
45
|
+
maxPrivateRooms: message.data.max_private_rooms // Max rooms user can create
|
|
38
46
|
});
|
|
39
47
|
|
|
40
48
|
// Get updated auth state
|
|
41
49
|
const authState = context.getAuthState();
|
|
42
50
|
|
|
51
|
+
// Update admin manager with admin status
|
|
52
|
+
if (context.adminManager) {
|
|
53
|
+
context.adminManager.setAdminStatus(message.data.is_admin_whitelisted ?? false);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Initialize room management manager with room data (v2.0.0)
|
|
57
|
+
const roomMgmt = context.roomManagementManager;
|
|
58
|
+
if (roomMgmt) {
|
|
59
|
+
// Set room limit
|
|
60
|
+
if (message.data.max_private_rooms) {
|
|
61
|
+
roomMgmt.setRoomLimit(message.data.max_private_rooms);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Categorize and cache rooms
|
|
65
|
+
const ownedRooms = rooms.filter((r) => r.is_owner);
|
|
66
|
+
const sharedRooms = rooms.filter((r) => !r.is_owner);
|
|
67
|
+
roomMgmt.setOwnedRooms(ownedRooms);
|
|
68
|
+
roomMgmt.setSharedRooms(sharedRooms);
|
|
69
|
+
|
|
70
|
+
context.logger.debug("Room management initialized", {
|
|
71
|
+
owned: ownedRooms.length,
|
|
72
|
+
shared: sharedRooms.length,
|
|
73
|
+
limit: message.data.max_private_rooms
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
|
|
43
77
|
// Emit events
|
|
44
78
|
this.emit(context, "auth:success", authState);
|
|
45
79
|
this.emit(context, "ready");
|
|
@@ -48,10 +82,33 @@ export class AuthSuccessHandler extends BaseMessageHandler<AuthSuccessMessage> {
|
|
|
48
82
|
/**
|
|
49
83
|
* Extract and normalize rooms from auth data
|
|
50
84
|
*/
|
|
51
|
-
private extractRooms(rooms?:
|
|
85
|
+
private extractRooms(rooms?: RoomInfo[] | null): RoomInfo[] {
|
|
52
86
|
if (!rooms || !Array.isArray(rooms)) {
|
|
53
87
|
return [];
|
|
54
88
|
}
|
|
55
89
|
return rooms;
|
|
56
90
|
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Categorize rooms into owned vs member rooms based on is_owner flag
|
|
94
|
+
* @param rooms - Array of room info objects
|
|
95
|
+
* @returns Object with privateRoomIds (owned) and sharedRoomIds (member)
|
|
96
|
+
*/
|
|
97
|
+
private categorizeRooms(rooms: RoomInfo[]): {
|
|
98
|
+
privateRoomIds: string[];
|
|
99
|
+
sharedRoomIds: string[];
|
|
100
|
+
} {
|
|
101
|
+
const privateRoomIds: string[] = [];
|
|
102
|
+
const sharedRoomIds: string[] = [];
|
|
103
|
+
|
|
104
|
+
for (const room of rooms) {
|
|
105
|
+
if (room.is_owner) {
|
|
106
|
+
privateRoomIds.push(room.id);
|
|
107
|
+
} else {
|
|
108
|
+
sharedRoomIds.push(room.id);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
return { privateRoomIds, sharedRoomIds };
|
|
113
|
+
}
|
|
57
114
|
}
|
|
@@ -71,31 +71,44 @@ export abstract class BaseMessageHandler<T extends BaseMessage = BaseMessage>
|
|
|
71
71
|
/**
|
|
72
72
|
* Helper: emit event
|
|
73
73
|
*/
|
|
74
|
-
protected emit(context: HandlerContext, event: string, ...args:
|
|
74
|
+
protected emit(context: HandlerContext, event: string, ...args: unknown[]): void {
|
|
75
75
|
context.emit(event, ...args);
|
|
76
76
|
}
|
|
77
77
|
|
|
78
78
|
/**
|
|
79
79
|
* Helper: send webhook (fire-and-forget pattern)
|
|
80
80
|
*/
|
|
81
|
-
protected sendWebhook(
|
|
81
|
+
protected sendWebhook(
|
|
82
|
+
context: HandlerContext,
|
|
83
|
+
type: string,
|
|
84
|
+
data: Record<string, unknown>,
|
|
85
|
+
metadata?: Record<string, unknown>
|
|
86
|
+
): void {
|
|
82
87
|
// Fire and forget - don't block event emission
|
|
83
|
-
context
|
|
84
|
-
|
|
85
|
-
|
|
88
|
+
context
|
|
89
|
+
.sendWebhook(type as Parameters<typeof context.sendWebhook>[0], data, metadata)
|
|
90
|
+
.catch((error) => {
|
|
91
|
+
context.logger.error(`Failed to send webhook for ${this.type}`, error);
|
|
92
|
+
});
|
|
86
93
|
}
|
|
87
94
|
|
|
88
95
|
/**
|
|
89
96
|
* Helper: update connection state
|
|
90
97
|
*/
|
|
91
|
-
protected updateConnectionState(
|
|
98
|
+
protected updateConnectionState(
|
|
99
|
+
context: HandlerContext,
|
|
100
|
+
update: Partial<import("./types").ConnectionState>
|
|
101
|
+
): void {
|
|
92
102
|
context.updateConnectionState(update);
|
|
93
103
|
}
|
|
94
104
|
|
|
95
105
|
/**
|
|
96
106
|
* Helper: update auth state
|
|
97
107
|
*/
|
|
98
|
-
protected updateAuthState(
|
|
108
|
+
protected updateAuthState(
|
|
109
|
+
context: HandlerContext,
|
|
110
|
+
update: Partial<import("./types").AuthState>
|
|
111
|
+
): void {
|
|
99
112
|
context.updateAuthState(update);
|
|
100
113
|
}
|
|
101
114
|
}
|
|
@@ -9,6 +9,7 @@ export * from "./base-handler";
|
|
|
9
9
|
|
|
10
10
|
// Export all handlers
|
|
11
11
|
export { TaskResponseHandler } from "./task-response-handler";
|
|
12
|
+
export { TaskQuoteHandler } from "./task-quote-handler";
|
|
12
13
|
export { AgentSelectedHandler } from "./agent-selected-handler";
|
|
13
14
|
export { ChallengeHandler } from "./challenge-handler";
|
|
14
15
|
export { AuthMessageHandler } from "./auth-message-handler";
|
|
@@ -22,9 +23,28 @@ export { PingHandler, PongHandler } from "./ping-pong-handler";
|
|
|
22
23
|
export { SubscribeResponseHandler } from "./subscribe-response-handler";
|
|
23
24
|
export { UnsubscribeResponseHandler } from "./unsubscribe-response-handler";
|
|
24
25
|
export { ListRoomsResponseHandler } from "./list-rooms-response-handler";
|
|
26
|
+
export { RoomOperationResponseHandler } from "./room-operation-response-handler";
|
|
27
|
+
export { AgentRoomOperationResponseHandler } from "./agent-room-operation-response-handler";
|
|
28
|
+
export { ListRoomAgentsHandler } from "./list-room-agents-handler";
|
|
29
|
+
export { ListAvailableAgentsHandler } from "./list-available-agents-handler";
|
|
30
|
+
export { AgentStatusUpdateHandler } from "./agent-status-update-handler";
|
|
31
|
+
|
|
32
|
+
// Agent Details handler
|
|
33
|
+
export { AgentDetailsResponseHandler } from "./agent-details-response-handler";
|
|
34
|
+
|
|
35
|
+
// Rate Limit handler
|
|
36
|
+
export { RateLimitNotificationHandler } from "./rate-limit-notification-handler";
|
|
37
|
+
|
|
38
|
+
// Admin handlers
|
|
39
|
+
export { AllAgentsResponseHandler } from "./all-agents-response-handler";
|
|
40
|
+
export { UserCountHandler } from "./user-count-handler";
|
|
41
|
+
|
|
42
|
+
// Presence handler
|
|
43
|
+
export { UserAuthenticatedHandler } from "./user-authenticated-handler";
|
|
25
44
|
|
|
26
45
|
// Import for convenience function
|
|
27
46
|
import { TaskResponseHandler } from "./task-response-handler";
|
|
47
|
+
import { TaskQuoteHandler } from "./task-quote-handler";
|
|
28
48
|
import { AgentSelectedHandler } from "./agent-selected-handler";
|
|
29
49
|
import { ChallengeHandler } from "./challenge-handler";
|
|
30
50
|
import { AuthMessageHandler } from "./auth-message-handler";
|
|
@@ -38,6 +58,16 @@ import { PingHandler, PongHandler } from "./ping-pong-handler";
|
|
|
38
58
|
import { SubscribeResponseHandler } from "./subscribe-response-handler";
|
|
39
59
|
import { UnsubscribeResponseHandler } from "./unsubscribe-response-handler";
|
|
40
60
|
import { ListRoomsResponseHandler } from "./list-rooms-response-handler";
|
|
61
|
+
import { RoomOperationResponseHandler } from "./room-operation-response-handler";
|
|
62
|
+
import { AgentRoomOperationResponseHandler } from "./agent-room-operation-response-handler";
|
|
63
|
+
import { ListRoomAgentsHandler } from "./list-room-agents-handler";
|
|
64
|
+
import { ListAvailableAgentsHandler } from "./list-available-agents-handler";
|
|
65
|
+
import { AgentStatusUpdateHandler } from "./agent-status-update-handler";
|
|
66
|
+
import { AgentDetailsResponseHandler } from "./agent-details-response-handler";
|
|
67
|
+
import { RateLimitNotificationHandler } from "./rate-limit-notification-handler";
|
|
68
|
+
import { AllAgentsResponseHandler } from "./all-agents-response-handler";
|
|
69
|
+
import { UserCountHandler } from "./user-count-handler";
|
|
70
|
+
import { UserAuthenticatedHandler } from "./user-authenticated-handler";
|
|
41
71
|
import { MessageHandler } from "./types";
|
|
42
72
|
|
|
43
73
|
/**
|
|
@@ -58,6 +88,7 @@ export function getDefaultHandlers(
|
|
|
58
88
|
|
|
59
89
|
// Agent/coordinator handlers
|
|
60
90
|
new TaskResponseHandler(),
|
|
91
|
+
new TaskQuoteHandler(),
|
|
61
92
|
new AgentSelectedHandler(),
|
|
62
93
|
new AgentsListHandler(),
|
|
63
94
|
|
|
@@ -70,6 +101,28 @@ export function getDefaultHandlers(
|
|
|
70
101
|
new UnsubscribeResponseHandler(),
|
|
71
102
|
new ListRoomsResponseHandler(),
|
|
72
103
|
|
|
104
|
+
// Room Management handlers (v2.0.0)
|
|
105
|
+
new RoomOperationResponseHandler(),
|
|
106
|
+
|
|
107
|
+
// Agent Room Management handlers (v2.0.0)
|
|
108
|
+
new AgentRoomOperationResponseHandler(),
|
|
109
|
+
new ListRoomAgentsHandler(),
|
|
110
|
+
new ListAvailableAgentsHandler(),
|
|
111
|
+
new AgentStatusUpdateHandler(),
|
|
112
|
+
|
|
113
|
+
// Agent Details handler
|
|
114
|
+
new AgentDetailsResponseHandler(),
|
|
115
|
+
|
|
116
|
+
// Rate Limit handler
|
|
117
|
+
new RateLimitNotificationHandler(),
|
|
118
|
+
|
|
119
|
+
// Admin handlers
|
|
120
|
+
new AllAgentsResponseHandler(),
|
|
121
|
+
new UserCountHandler(),
|
|
122
|
+
|
|
123
|
+
// Presence handler
|
|
124
|
+
new UserAuthenticatedHandler(),
|
|
125
|
+
|
|
73
126
|
// Keepalive handlers
|
|
74
127
|
new PingHandler(),
|
|
75
128
|
new PongHandler()
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handler for available_agents_response messages (v2.0.0)
|
|
3
|
+
* Processes responses from list_available_agents requests
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { AvailableAgentsResponse, AvailableAgentsResponseSchema } from "../../types";
|
|
7
|
+
import { BaseMessageHandler } from "./base-handler";
|
|
8
|
+
import { HandlerContext } from "./types";
|
|
9
|
+
import { AgentRoomInfo } from "../../managers/agent-room-manager";
|
|
10
|
+
|
|
11
|
+
export class ListAvailableAgentsHandler extends BaseMessageHandler<AvailableAgentsResponse> {
|
|
12
|
+
readonly type = "available_agents_response" as const;
|
|
13
|
+
readonly schema = AvailableAgentsResponseSchema;
|
|
14
|
+
|
|
15
|
+
protected handleValidated(message: AvailableAgentsResponse, context: HandlerContext): void {
|
|
16
|
+
const { agents } = message.data;
|
|
17
|
+
|
|
18
|
+
context.logger.debug("Handling available_agents_response", {
|
|
19
|
+
agentCount: agents?.length || 0
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
// Parse agents array (handle undefined as empty array)
|
|
23
|
+
const agentList: AgentRoomInfo[] = agents || [];
|
|
24
|
+
|
|
25
|
+
context.logger.info("Available agents listed", {
|
|
26
|
+
count: agentList.length
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
// Note: We don't cache this globally since it's room-specific
|
|
30
|
+
// The AgentRoomManager will cache it with the room context
|
|
31
|
+
|
|
32
|
+
// Emit success event
|
|
33
|
+
this.emit(context, "agent_room:available_agents_listed", agentList);
|
|
34
|
+
|
|
35
|
+
// Send webhook
|
|
36
|
+
this.sendWebhook(context, "available_agents_listed", {
|
|
37
|
+
agents: agentList,
|
|
38
|
+
count: agentList.length
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handler for room_agents_response messages (v2.0.0)
|
|
3
|
+
* Processes responses from list_room_agents requests
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { RoomAgentsResponse, RoomAgentsResponseSchema } from "../../types";
|
|
7
|
+
import { BaseMessageHandler } from "./base-handler";
|
|
8
|
+
import { HandlerContext } from "./types";
|
|
9
|
+
import { SDKError } from "../../types/events";
|
|
10
|
+
import { ErrorCode } from "../../types/error-codes";
|
|
11
|
+
import { AgentRoomInfo } from "../../managers/agent-room-manager";
|
|
12
|
+
|
|
13
|
+
export class ListRoomAgentsHandler extends BaseMessageHandler<RoomAgentsResponse> {
|
|
14
|
+
readonly type = "room_agents_response" as const;
|
|
15
|
+
readonly schema = RoomAgentsResponseSchema;
|
|
16
|
+
|
|
17
|
+
protected handleValidated(message: RoomAgentsResponse, context: HandlerContext): void {
|
|
18
|
+
const { room_id, agents } = message.data;
|
|
19
|
+
|
|
20
|
+
context.logger.debug("Handling room_agents_response", {
|
|
21
|
+
roomId: room_id,
|
|
22
|
+
agentCount: agents?.length || 0
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
if (!room_id) {
|
|
26
|
+
const error = new SDKError(
|
|
27
|
+
"Room agents response missing room_id",
|
|
28
|
+
ErrorCode.VALIDATION_ERROR
|
|
29
|
+
);
|
|
30
|
+
this.emit(context, "agent_room:list_error", error, undefined);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Parse agents array (handle undefined as empty array)
|
|
35
|
+
const agentList: AgentRoomInfo[] = agents || [];
|
|
36
|
+
|
|
37
|
+
context.logger.info("Room agents listed", {
|
|
38
|
+
roomId: room_id,
|
|
39
|
+
count: agentList.length
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
// Cache via agent room manager if available
|
|
43
|
+
const agentRoomManager = context.agentRoomManager;
|
|
44
|
+
if (agentRoomManager && typeof agentRoomManager.cacheRoomAgents === "function") {
|
|
45
|
+
agentRoomManager.cacheRoomAgents(room_id, agentList);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Emit success event
|
|
49
|
+
this.emit(context, "agent_room:agents_listed", room_id, agentList);
|
|
50
|
+
|
|
51
|
+
// Send webhook
|
|
52
|
+
this.sendWebhook(context, "room_agents_listed", {
|
|
53
|
+
room_id,
|
|
54
|
+
agents: agentList,
|
|
55
|
+
count: agentList.length
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -3,16 +3,18 @@
|
|
|
3
3
|
* Processes room list from server
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
+
import { z } from "zod";
|
|
6
7
|
import { ListRoomsResponse, ListRoomsResponseSchema } from "../../types";
|
|
7
8
|
import { BaseMessageHandler } from "./base-handler";
|
|
8
9
|
import { HandlerContext } from "./types";
|
|
9
10
|
|
|
10
11
|
export class ListRoomsResponseHandler extends BaseMessageHandler<ListRoomsResponse> {
|
|
11
12
|
readonly type = "list_rooms" as const;
|
|
12
|
-
|
|
13
|
+
// Cast needed due to Zod transform creating input/output type mismatch
|
|
14
|
+
readonly schema = ListRoomsResponseSchema as z.ZodType<ListRoomsResponse>;
|
|
13
15
|
|
|
14
16
|
protected handleValidated(message: ListRoomsResponse, context: HandlerContext): void {
|
|
15
|
-
context.logger.debug("Handling list_rooms
|
|
17
|
+
context.logger.debug("Handling list_rooms", {
|
|
16
18
|
roomCount: message.data.rooms.length
|
|
17
19
|
});
|
|
18
20
|
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handler for rate_limit_notification messages
|
|
3
|
+
* Processes rate limit notifications from the server
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { RateLimitNotificationMessage, RateLimitNotificationMessageSchema } from "../../types";
|
|
7
|
+
import { BaseMessageHandler } from "./base-handler";
|
|
8
|
+
import { HandlerContext } from "./types";
|
|
9
|
+
|
|
10
|
+
export class RateLimitNotificationHandler extends BaseMessageHandler<RateLimitNotificationMessage> {
|
|
11
|
+
readonly type = "rate_limit_notification" as const;
|
|
12
|
+
readonly schema = RateLimitNotificationMessageSchema;
|
|
13
|
+
|
|
14
|
+
protected handleValidated(message: RateLimitNotificationMessage, context: HandlerContext): void {
|
|
15
|
+
const {
|
|
16
|
+
title,
|
|
17
|
+
message: msg,
|
|
18
|
+
cta_text,
|
|
19
|
+
cta_link,
|
|
20
|
+
message_type,
|
|
21
|
+
limit_type,
|
|
22
|
+
reset_at
|
|
23
|
+
} = message.data;
|
|
24
|
+
|
|
25
|
+
context.logger.warn("Rate limit notification received", {
|
|
26
|
+
title,
|
|
27
|
+
limitType: limit_type,
|
|
28
|
+
resetAt: reset_at
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
// Emit rate limit event with camelCase conversion
|
|
32
|
+
this.emit(context, "rate_limit", {
|
|
33
|
+
title,
|
|
34
|
+
message: msg,
|
|
35
|
+
ctaText: cta_text,
|
|
36
|
+
ctaLink: cta_link,
|
|
37
|
+
messageType: message_type,
|
|
38
|
+
limitType: limit_type,
|
|
39
|
+
resetAt: reset_at
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
// Send webhook
|
|
43
|
+
this.sendWebhook(context, "rate_limit_notification", message.data);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Processes messages from agents (when they send 'message' instead of 'task_response')
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { UserMessage, UserMessageSchema } from "../../types";
|
|
6
|
+
import { UserMessage, UserMessageSchema, TaskResponseMessage } from "../../types";
|
|
7
7
|
import { AgentResponse } from "../../types/events";
|
|
8
8
|
import { BaseMessageHandler } from "./base-handler";
|
|
9
9
|
import { HandlerContext } from "./types";
|
|
@@ -54,7 +54,8 @@ export class RegularMessageHandler extends BaseMessageHandler<UserMessage> {
|
|
|
54
54
|
contentType: message.content_type || "text/plain",
|
|
55
55
|
success: true,
|
|
56
56
|
timestamp: new Date(),
|
|
57
|
-
|
|
57
|
+
// Cast to TaskResponseMessage for request correlation (message format is compatible)
|
|
58
|
+
raw: message as unknown as TaskResponseMessage,
|
|
58
59
|
humanized:
|
|
59
60
|
typeof message.content === "string" ? message.content : JSON.stringify(message.content)
|
|
60
61
|
};
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handler for room_operation_response messages (v2.0.0)
|
|
3
|
+
* Processes responses from room CRUD operations (create, update, delete)
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { RoomOperationResponse, RoomOperationResponseSchema } from "../../types";
|
|
7
|
+
import { BaseMessageHandler } from "./base-handler";
|
|
8
|
+
import { HandlerContext } from "./types";
|
|
9
|
+
import { SDKError } from "../../types/events";
|
|
10
|
+
import { ErrorCode } from "../../types/error-codes";
|
|
11
|
+
|
|
12
|
+
export class RoomOperationResponseHandler extends BaseMessageHandler<RoomOperationResponse> {
|
|
13
|
+
readonly type = "room_operation_response" as const;
|
|
14
|
+
readonly schema = RoomOperationResponseSchema;
|
|
15
|
+
|
|
16
|
+
protected handleValidated(message: RoomOperationResponse, context: HandlerContext): void {
|
|
17
|
+
const { success, message: errorMessage, room_id, room } = message.data;
|
|
18
|
+
|
|
19
|
+
context.logger.debug("Handling room_operation_response", {
|
|
20
|
+
success,
|
|
21
|
+
roomId: room_id,
|
|
22
|
+
hasRoom: !!room
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
if (!success) {
|
|
26
|
+
// Operation failed - emit error event
|
|
27
|
+
const error = new SDKError(
|
|
28
|
+
errorMessage || "Room operation failed",
|
|
29
|
+
ErrorCode.OPERATION_FAILED
|
|
30
|
+
);
|
|
31
|
+
|
|
32
|
+
// Try to determine operation type from message
|
|
33
|
+
// Note: Server should ideally send operation type in response
|
|
34
|
+
// For now we emit generic errors and specific listeners will catch relevant ones
|
|
35
|
+
this.emit(context, "room:create_error", error);
|
|
36
|
+
this.emit(context, "room:update_error", error, room_id);
|
|
37
|
+
this.emit(context, "room:delete_error", error, room_id);
|
|
38
|
+
|
|
39
|
+
// Send webhook
|
|
40
|
+
this.sendWebhook(context, "room_operation_error", {
|
|
41
|
+
success: false,
|
|
42
|
+
message: errorMessage,
|
|
43
|
+
room_id
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Operation succeeded
|
|
50
|
+
if (room) {
|
|
51
|
+
// Create or Update operation (includes room object)
|
|
52
|
+
context.logger.info("Room operation succeeded", {
|
|
53
|
+
roomId: room.id,
|
|
54
|
+
roomName: room.name
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
// Determine if this was create or update based on whether we have the room cached
|
|
58
|
+
// Note: Ideally server would send operation type in response
|
|
59
|
+
// For now, handlers will emit both and listeners filter by room_id
|
|
60
|
+
|
|
61
|
+
// Update cache via room management manager if available
|
|
62
|
+
const roomManager = context.roomManagementManager;
|
|
63
|
+
if (roomManager && typeof roomManager.upsertRoom === "function") {
|
|
64
|
+
roomManager.upsertRoom(room);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Emit success events
|
|
68
|
+
// The promise handlers in RoomManagementManager will filter by room_id
|
|
69
|
+
this.emit(context, "room:created", room);
|
|
70
|
+
this.emit(context, "room:updated", room);
|
|
71
|
+
|
|
72
|
+
// Send webhook
|
|
73
|
+
this.sendWebhook(context, "room_operation", {
|
|
74
|
+
success: true,
|
|
75
|
+
room,
|
|
76
|
+
message: "Room operation completed successfully"
|
|
77
|
+
});
|
|
78
|
+
} else if (room_id) {
|
|
79
|
+
// Delete operation (only has room_id, no room object)
|
|
80
|
+
context.logger.info("Room deleted", { roomId: room_id });
|
|
81
|
+
|
|
82
|
+
// Remove from cache
|
|
83
|
+
const roomManager = context.roomManagementManager;
|
|
84
|
+
if (roomManager && typeof roomManager.removeRoom === "function") {
|
|
85
|
+
roomManager.removeRoom(room_id);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Emit delete success
|
|
89
|
+
this.emit(context, "room:deleted", room_id);
|
|
90
|
+
|
|
91
|
+
// Send webhook
|
|
92
|
+
this.sendWebhook(context, "room_deleted", {
|
|
93
|
+
success: true,
|
|
94
|
+
room_id,
|
|
95
|
+
message: "Room deleted successfully"
|
|
96
|
+
});
|
|
97
|
+
} else {
|
|
98
|
+
// Unexpected: success but no room or room_id
|
|
99
|
+
context.logger.warn("Room operation succeeded but no room data provided");
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
* Processes room subscription confirmations
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { SubscribeResponse, SubscribeResponseSchema } from "../../types";
|
|
6
|
+
import { SubscribeResponse, SubscribeResponseSchema, ErrorCode } from "../../types";
|
|
7
|
+
import { SDKError } from "../../types/events";
|
|
7
8
|
import { BaseMessageHandler } from "./base-handler";
|
|
8
9
|
import { HandlerContext } from "./types";
|
|
9
10
|
|
|
@@ -41,7 +42,16 @@ export class SubscribeResponseHandler extends BaseMessageHandler<SubscribeRespon
|
|
|
41
42
|
});
|
|
42
43
|
|
|
43
44
|
// Emit error event
|
|
44
|
-
this.emit(
|
|
45
|
+
this.emit(
|
|
46
|
+
context,
|
|
47
|
+
"error",
|
|
48
|
+
new SDKError(
|
|
49
|
+
`Subscription failed: ${message.data.message}`,
|
|
50
|
+
ErrorCode.OPERATION_FAILED,
|
|
51
|
+
{ roomId: message.data.room_id },
|
|
52
|
+
true
|
|
53
|
+
)
|
|
54
|
+
);
|
|
45
55
|
}
|
|
46
56
|
}
|
|
47
57
|
}
|