@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
|
@@ -0,0 +1,665 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AgentRoomManager - Manages agent-room associations (v2.0.0)
|
|
3
|
+
* Allows room owners to control which agents are available in their rooms
|
|
4
|
+
* Implements caching with 5-minute TTL and LRU eviction for performance
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { EventEmitter } from "eventemitter3";
|
|
8
|
+
import { WebSocketClient } from "../core/websocket-client";
|
|
9
|
+
import { Logger } from "../types";
|
|
10
|
+
import { SDKEvents, SDKError } from "../types/events";
|
|
11
|
+
import { ErrorCode } from "../types/error-codes";
|
|
12
|
+
import { RoomManagementManager } from "./room-management-manager";
|
|
13
|
+
|
|
14
|
+
// AgentRoomInfo from server response
|
|
15
|
+
export interface AgentRoomInfo {
|
|
16
|
+
agent_id: string;
|
|
17
|
+
agent_name?: string;
|
|
18
|
+
description?: string;
|
|
19
|
+
capabilities?: Array<{ name: string; description?: string }>;
|
|
20
|
+
commands?: Array<{ trigger: string; argument?: string; description?: string }>;
|
|
21
|
+
image?: string;
|
|
22
|
+
status?: string;
|
|
23
|
+
added_by?: string;
|
|
24
|
+
added_at?: string;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Cache TTL: 5 minutes
|
|
28
|
+
const CACHE_TTL_MS = 5 * 60 * 1000;
|
|
29
|
+
|
|
30
|
+
// Maximum number of rooms to cache (LRU eviction beyond this)
|
|
31
|
+
const MAX_CACHED_ROOMS = 1000;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Simple LRU cache with TTL support
|
|
35
|
+
* Uses Map's insertion order for LRU tracking
|
|
36
|
+
*/
|
|
37
|
+
class LRUCache<T> {
|
|
38
|
+
private readonly cache = new Map<string, T>();
|
|
39
|
+
private readonly timestamps = new Map<string, number>();
|
|
40
|
+
private readonly maxSize: number;
|
|
41
|
+
private readonly ttlMs: number;
|
|
42
|
+
|
|
43
|
+
constructor(maxSize: number, ttlMs: number) {
|
|
44
|
+
this.maxSize = maxSize;
|
|
45
|
+
this.ttlMs = ttlMs;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
get(key: string): T | undefined {
|
|
49
|
+
const value = this.cache.get(key);
|
|
50
|
+
if (value === undefined) return undefined;
|
|
51
|
+
|
|
52
|
+
// Check TTL
|
|
53
|
+
const timestamp = this.timestamps.get(key);
|
|
54
|
+
if (timestamp && Date.now() - timestamp >= this.ttlMs) {
|
|
55
|
+
this.delete(key);
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Move to end (most recently used) by re-inserting
|
|
60
|
+
this.cache.delete(key);
|
|
61
|
+
this.cache.set(key, value);
|
|
62
|
+
|
|
63
|
+
return value;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
set(key: string, value: T): void {
|
|
67
|
+
// Delete first to update insertion order
|
|
68
|
+
this.cache.delete(key);
|
|
69
|
+
this.timestamps.delete(key);
|
|
70
|
+
|
|
71
|
+
// Evict oldest entries if at capacity
|
|
72
|
+
while (this.cache.size >= this.maxSize) {
|
|
73
|
+
const oldestKey = this.cache.keys().next().value;
|
|
74
|
+
if (oldestKey !== undefined) {
|
|
75
|
+
this.cache.delete(oldestKey);
|
|
76
|
+
this.timestamps.delete(oldestKey);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
this.cache.set(key, value);
|
|
81
|
+
this.timestamps.set(key, Date.now());
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
delete(key: string): void {
|
|
85
|
+
this.cache.delete(key);
|
|
86
|
+
this.timestamps.delete(key);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
has(key: string): boolean {
|
|
90
|
+
return this.get(key) !== undefined;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
isValid(key: string): boolean {
|
|
94
|
+
const timestamp = this.timestamps.get(key);
|
|
95
|
+
if (!timestamp) return false;
|
|
96
|
+
return Date.now() - timestamp < this.ttlMs;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
clear(): void {
|
|
100
|
+
this.cache.clear();
|
|
101
|
+
this.timestamps.clear();
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
get size(): number {
|
|
105
|
+
return this.cache.size;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export class AgentRoomManager extends EventEmitter<SDKEvents> {
|
|
110
|
+
private readonly wsClient: WebSocketClient;
|
|
111
|
+
private readonly logger: Logger;
|
|
112
|
+
private readonly roomManagementManager: RoomManagementManager; // Reference to check ownership
|
|
113
|
+
|
|
114
|
+
// LRU caches with TTL (max 1000 rooms each)
|
|
115
|
+
private readonly roomAgentsCache = new LRUCache<AgentRoomInfo[]>(MAX_CACHED_ROOMS, CACHE_TTL_MS);
|
|
116
|
+
private readonly availableAgentsCache = new LRUCache<AgentRoomInfo[]>(
|
|
117
|
+
MAX_CACHED_ROOMS,
|
|
118
|
+
CACHE_TTL_MS
|
|
119
|
+
);
|
|
120
|
+
|
|
121
|
+
constructor(
|
|
122
|
+
wsClient: WebSocketClient,
|
|
123
|
+
logger: Logger,
|
|
124
|
+
roomManagementManager: RoomManagementManager
|
|
125
|
+
) {
|
|
126
|
+
super();
|
|
127
|
+
this.wsClient = wsClient;
|
|
128
|
+
this.logger = logger;
|
|
129
|
+
this.roomManagementManager = roomManagementManager;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// ============================================================================
|
|
133
|
+
// AGENT ROOM OPERATIONS
|
|
134
|
+
// ============================================================================
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Adds an agent to a room, making it available for interactions in that room.
|
|
138
|
+
* User must own the room to perform this operation.
|
|
139
|
+
*
|
|
140
|
+
* @param roomId - ID of the room to add agent to
|
|
141
|
+
* @param agentId - ID of the agent to add
|
|
142
|
+
* @returns Promise that resolves when agent is added
|
|
143
|
+
* @throws {SDKError} If not connected, not room owner, or operation fails
|
|
144
|
+
*
|
|
145
|
+
* @example
|
|
146
|
+
* ```typescript
|
|
147
|
+
* await sdk.addAgentToRoom('room-123', 'agent-456');
|
|
148
|
+
* console.log('Agent added to room');
|
|
149
|
+
* ```
|
|
150
|
+
*/
|
|
151
|
+
public async addAgentToRoom(roomId: string, agentId: string): Promise<void> {
|
|
152
|
+
if (!this.wsClient.isConnected) {
|
|
153
|
+
throw new SDKError("Not connected to Teneo Protocol", ErrorCode.NOT_CONNECTED);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// Validate inputs
|
|
157
|
+
this.validateRoomId(roomId);
|
|
158
|
+
this.validateAgentId(agentId);
|
|
159
|
+
|
|
160
|
+
// Verify room exists
|
|
161
|
+
if (!this.roomExists(roomId)) {
|
|
162
|
+
throw new SDKError("Room not found", ErrorCode.VALIDATION_ERROR);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// Verify user owns room
|
|
166
|
+
if (!this.verifyOwnership(roomId)) {
|
|
167
|
+
throw new SDKError(
|
|
168
|
+
"Cannot add agent to room: You don't own this room",
|
|
169
|
+
ErrorCode.PERMISSION_DENIED
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
this.logger.debug("AgentRoomManager: Adding agent to room", { roomId, agentId });
|
|
174
|
+
|
|
175
|
+
const message = {
|
|
176
|
+
type: "add_agent_to_room" as const,
|
|
177
|
+
data: {
|
|
178
|
+
room_id: roomId,
|
|
179
|
+
agent_id: agentId
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
|
|
183
|
+
return new Promise((resolve, reject) => {
|
|
184
|
+
const timeout = setTimeout(() => {
|
|
185
|
+
cleanup();
|
|
186
|
+
reject(new SDKError("Add agent to room timeout", ErrorCode.TIMEOUT));
|
|
187
|
+
}, 30000);
|
|
188
|
+
|
|
189
|
+
const onSuccess = (responseRoomId: string, responseAgentId: string) => {
|
|
190
|
+
if (responseRoomId === roomId && responseAgentId === agentId) {
|
|
191
|
+
cleanup();
|
|
192
|
+
// Invalidate caches for this room
|
|
193
|
+
this.invalidateRoomCaches(roomId);
|
|
194
|
+
resolve();
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
const onError = (error: Error, responseRoomId?: string) => {
|
|
199
|
+
if (!responseRoomId || responseRoomId === roomId) {
|
|
200
|
+
cleanup();
|
|
201
|
+
reject(error);
|
|
202
|
+
}
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
const cleanup = () => {
|
|
206
|
+
clearTimeout(timeout);
|
|
207
|
+
this.off("agent_room:agent_added", onSuccess);
|
|
208
|
+
this.off("agent_room:add_error", onError);
|
|
209
|
+
};
|
|
210
|
+
|
|
211
|
+
this.once("agent_room:agent_added", onSuccess);
|
|
212
|
+
this.once("agent_room:add_error", onError);
|
|
213
|
+
|
|
214
|
+
this.wsClient.sendMessage(message);
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Removes an agent from a room.
|
|
220
|
+
* User must own the room to perform this operation.
|
|
221
|
+
*
|
|
222
|
+
* @param roomId - ID of the room to remove agent from
|
|
223
|
+
* @param agentId - ID of the agent to remove
|
|
224
|
+
* @returns Promise that resolves when agent is removed
|
|
225
|
+
* @throws {SDKError} If not connected, not room owner, or operation fails
|
|
226
|
+
*
|
|
227
|
+
* @example
|
|
228
|
+
* ```typescript
|
|
229
|
+
* await sdk.removeAgentFromRoom('room-123', 'agent-456');
|
|
230
|
+
* console.log('Agent removed from room');
|
|
231
|
+
* ```
|
|
232
|
+
*/
|
|
233
|
+
public async removeAgentFromRoom(roomId: string, agentId: string): Promise<void> {
|
|
234
|
+
if (!this.wsClient.isConnected) {
|
|
235
|
+
throw new SDKError("Not connected to Teneo Protocol", ErrorCode.NOT_CONNECTED);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// Validate inputs
|
|
239
|
+
this.validateRoomId(roomId);
|
|
240
|
+
this.validateAgentId(agentId);
|
|
241
|
+
|
|
242
|
+
// Verify user owns room
|
|
243
|
+
if (!this.verifyOwnership(roomId)) {
|
|
244
|
+
throw new SDKError(
|
|
245
|
+
"Cannot remove agent from room: You don't own this room",
|
|
246
|
+
ErrorCode.PERMISSION_DENIED
|
|
247
|
+
);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
this.logger.debug("AgentRoomManager: Removing agent from room", { roomId, agentId });
|
|
251
|
+
|
|
252
|
+
const message = {
|
|
253
|
+
type: "remove_agent_from_room" as const,
|
|
254
|
+
data: {
|
|
255
|
+
room_id: roomId,
|
|
256
|
+
agent_id: agentId
|
|
257
|
+
}
|
|
258
|
+
};
|
|
259
|
+
|
|
260
|
+
return new Promise((resolve, reject) => {
|
|
261
|
+
const timeout = setTimeout(() => {
|
|
262
|
+
cleanup();
|
|
263
|
+
reject(new SDKError("Remove agent from room timeout", ErrorCode.TIMEOUT));
|
|
264
|
+
}, 30000);
|
|
265
|
+
|
|
266
|
+
const onSuccess = (responseRoomId: string, responseAgentId: string) => {
|
|
267
|
+
if (responseRoomId === roomId && responseAgentId === agentId) {
|
|
268
|
+
cleanup();
|
|
269
|
+
// Invalidate caches for this room
|
|
270
|
+
this.invalidateRoomCaches(roomId);
|
|
271
|
+
resolve();
|
|
272
|
+
}
|
|
273
|
+
};
|
|
274
|
+
|
|
275
|
+
const onError = (error: Error, responseRoomId?: string) => {
|
|
276
|
+
if (!responseRoomId || responseRoomId === roomId) {
|
|
277
|
+
cleanup();
|
|
278
|
+
reject(error);
|
|
279
|
+
}
|
|
280
|
+
};
|
|
281
|
+
|
|
282
|
+
const cleanup = () => {
|
|
283
|
+
clearTimeout(timeout);
|
|
284
|
+
this.off("agent_room:agent_removed", onSuccess);
|
|
285
|
+
this.off("agent_room:remove_error", onError);
|
|
286
|
+
};
|
|
287
|
+
|
|
288
|
+
this.once("agent_room:agent_removed", onSuccess);
|
|
289
|
+
this.once("agent_room:remove_error", onError);
|
|
290
|
+
|
|
291
|
+
this.wsClient.sendMessage(message);
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/**
|
|
296
|
+
* Lists all agents currently in a room.
|
|
297
|
+
* Results are cached for 5 minutes for performance.
|
|
298
|
+
*
|
|
299
|
+
* @param roomId - ID of the room to list agents for
|
|
300
|
+
* @param useCache - Whether to use cached data (default: true)
|
|
301
|
+
* @returns Promise that resolves with array of agents
|
|
302
|
+
* @throws {SDKError} If not connected or operation fails
|
|
303
|
+
*
|
|
304
|
+
* @example
|
|
305
|
+
* ```typescript
|
|
306
|
+
* const agents = await sdk.listRoomAgents('room-123');
|
|
307
|
+
* console.log(`Room has ${agents.length} agents`);
|
|
308
|
+
*
|
|
309
|
+
* // Force fresh data
|
|
310
|
+
* const freshAgents = await sdk.listRoomAgents('room-123', false);
|
|
311
|
+
* ```
|
|
312
|
+
*/
|
|
313
|
+
public async listRoomAgents(roomId: string, useCache: boolean = true): Promise<AgentRoomInfo[]> {
|
|
314
|
+
if (!this.wsClient.isConnected) {
|
|
315
|
+
throw new SDKError("Not connected to Teneo Protocol", ErrorCode.NOT_CONNECTED);
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
// Validate input
|
|
319
|
+
this.validateRoomId(roomId);
|
|
320
|
+
|
|
321
|
+
// Check cache if enabled
|
|
322
|
+
if (useCache) {
|
|
323
|
+
const cached = this.roomAgentsCache.get(roomId);
|
|
324
|
+
if (cached) {
|
|
325
|
+
this.logger.debug("AgentRoomManager: Returning cached room agents", {
|
|
326
|
+
roomId,
|
|
327
|
+
count: cached.length
|
|
328
|
+
});
|
|
329
|
+
return cached.map((agent) => ({ ...agent })); // Return deep copy
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
this.logger.debug("AgentRoomManager: Listing room agents", { roomId });
|
|
334
|
+
|
|
335
|
+
const message = {
|
|
336
|
+
type: "list_room_agents" as const,
|
|
337
|
+
data: {
|
|
338
|
+
room_id: roomId
|
|
339
|
+
}
|
|
340
|
+
};
|
|
341
|
+
|
|
342
|
+
return new Promise((resolve, reject) => {
|
|
343
|
+
const timeout = setTimeout(() => {
|
|
344
|
+
cleanup();
|
|
345
|
+
reject(new SDKError("List room agents timeout", ErrorCode.TIMEOUT));
|
|
346
|
+
}, 30000);
|
|
347
|
+
|
|
348
|
+
const onSuccess = (responseRoomId: string, agents: AgentRoomInfo[]) => {
|
|
349
|
+
if (responseRoomId === roomId) {
|
|
350
|
+
cleanup();
|
|
351
|
+
resolve(agents);
|
|
352
|
+
}
|
|
353
|
+
};
|
|
354
|
+
|
|
355
|
+
const onError = (error: Error, responseRoomId?: string) => {
|
|
356
|
+
if (!responseRoomId || responseRoomId === roomId) {
|
|
357
|
+
cleanup();
|
|
358
|
+
reject(error);
|
|
359
|
+
}
|
|
360
|
+
};
|
|
361
|
+
|
|
362
|
+
const cleanup = () => {
|
|
363
|
+
clearTimeout(timeout);
|
|
364
|
+
this.off("agent_room:agents_listed", onSuccess);
|
|
365
|
+
this.off("agent_room:list_error", onError);
|
|
366
|
+
};
|
|
367
|
+
|
|
368
|
+
this.once("agent_room:agents_listed", onSuccess);
|
|
369
|
+
this.once("agent_room:list_error", onError);
|
|
370
|
+
|
|
371
|
+
this.wsClient.sendMessage(message);
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
/**
|
|
376
|
+
* Lists all agents available to add to a room (not yet in the room).
|
|
377
|
+
* Results are cached for 5 minutes for performance.
|
|
378
|
+
*
|
|
379
|
+
* @param roomId - ID of the room to check available agents for
|
|
380
|
+
* @param useCache - Whether to use cached data (default: true)
|
|
381
|
+
* @returns Promise that resolves with array of available agents
|
|
382
|
+
* @throws {SDKError} If not connected or operation fails
|
|
383
|
+
*
|
|
384
|
+
* @example
|
|
385
|
+
* ```typescript
|
|
386
|
+
* const availableAgents = await sdk.listAvailableAgents('room-123');
|
|
387
|
+
* console.log(`${availableAgents.length} agents can be added`);
|
|
388
|
+
* ```
|
|
389
|
+
*/
|
|
390
|
+
public async listAvailableAgents(
|
|
391
|
+
roomId: string,
|
|
392
|
+
useCache: boolean = true
|
|
393
|
+
): Promise<AgentRoomInfo[]> {
|
|
394
|
+
if (!this.wsClient.isConnected) {
|
|
395
|
+
throw new SDKError("Not connected to Teneo Protocol", ErrorCode.NOT_CONNECTED);
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
// Validate input
|
|
399
|
+
this.validateRoomId(roomId);
|
|
400
|
+
|
|
401
|
+
// Check cache if enabled
|
|
402
|
+
if (useCache) {
|
|
403
|
+
const cached = this.availableAgentsCache.get(roomId);
|
|
404
|
+
if (cached) {
|
|
405
|
+
this.logger.debug("AgentRoomManager: Returning cached available agents", {
|
|
406
|
+
roomId,
|
|
407
|
+
count: cached.length
|
|
408
|
+
});
|
|
409
|
+
return cached.map((agent) => ({ ...agent })); // Return deep copy
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
this.logger.debug("AgentRoomManager: Listing available agents", { roomId });
|
|
414
|
+
|
|
415
|
+
const message = {
|
|
416
|
+
type: "list_available_agents" as const,
|
|
417
|
+
data: {
|
|
418
|
+
room_id: roomId
|
|
419
|
+
}
|
|
420
|
+
};
|
|
421
|
+
|
|
422
|
+
return new Promise((resolve, reject) => {
|
|
423
|
+
const timeout = setTimeout(() => {
|
|
424
|
+
cleanup();
|
|
425
|
+
reject(new SDKError("List available agents timeout", ErrorCode.TIMEOUT));
|
|
426
|
+
}, 30000);
|
|
427
|
+
|
|
428
|
+
const onSuccess = (agents: AgentRoomInfo[]) => {
|
|
429
|
+
cleanup();
|
|
430
|
+
resolve(agents);
|
|
431
|
+
};
|
|
432
|
+
|
|
433
|
+
const onError = (error: Error) => {
|
|
434
|
+
cleanup();
|
|
435
|
+
reject(error);
|
|
436
|
+
};
|
|
437
|
+
|
|
438
|
+
const cleanup = () => {
|
|
439
|
+
clearTimeout(timeout);
|
|
440
|
+
this.off("agent_room:available_agents_listed", onSuccess);
|
|
441
|
+
this.off("agent_room:list_available_error", onError);
|
|
442
|
+
};
|
|
443
|
+
|
|
444
|
+
this.once("agent_room:available_agents_listed", onSuccess);
|
|
445
|
+
this.once("agent_room:list_available_error", onError);
|
|
446
|
+
|
|
447
|
+
this.wsClient.sendMessage(message);
|
|
448
|
+
});
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
// ============================================================================
|
|
452
|
+
// QUERY METHODS (Synchronous, from cache)
|
|
453
|
+
// ============================================================================
|
|
454
|
+
|
|
455
|
+
/**
|
|
456
|
+
* Gets agents currently in a room from cache (synchronous).
|
|
457
|
+
* Returns undefined if not cached or cache expired.
|
|
458
|
+
*
|
|
459
|
+
* @param roomId - Room ID to query
|
|
460
|
+
* @returns Array of agents or undefined if not cached
|
|
461
|
+
*
|
|
462
|
+
* @example
|
|
463
|
+
* ```typescript
|
|
464
|
+
* const agents = sdk.getRoomAgents('room-123');
|
|
465
|
+
* if (agents) {
|
|
466
|
+
* console.log(`Found ${agents.length} agents in cache`);
|
|
467
|
+
* }
|
|
468
|
+
* ```
|
|
469
|
+
*/
|
|
470
|
+
public getRoomAgents(roomId: string): AgentRoomInfo[] | undefined {
|
|
471
|
+
const cached = this.roomAgentsCache.get(roomId);
|
|
472
|
+
return cached ? cached.map((agent) => ({ ...agent })) : undefined;
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
/**
|
|
476
|
+
* Gets available agents for a room from cache (synchronous).
|
|
477
|
+
* Returns undefined if not cached or cache expired.
|
|
478
|
+
*
|
|
479
|
+
* @param roomId - Room ID to query
|
|
480
|
+
* @returns Array of available agents or undefined if not cached
|
|
481
|
+
*
|
|
482
|
+
* @example
|
|
483
|
+
* ```typescript
|
|
484
|
+
* const available = sdk.getAvailableAgents('room-123');
|
|
485
|
+
* if (available) {
|
|
486
|
+
* console.log(`${available.length} agents can be added`);
|
|
487
|
+
* }
|
|
488
|
+
* ```
|
|
489
|
+
*/
|
|
490
|
+
public getAvailableAgents(roomId: string): AgentRoomInfo[] | undefined {
|
|
491
|
+
const cached = this.availableAgentsCache.get(roomId);
|
|
492
|
+
return cached ? cached.map((agent) => ({ ...agent })) : undefined;
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
/**
|
|
496
|
+
* Checks if an agent is currently in a room (from cache).
|
|
497
|
+
* Returns undefined if cache is invalid.
|
|
498
|
+
*
|
|
499
|
+
* @param roomId - Room ID to check
|
|
500
|
+
* @param agentId - Agent ID to check
|
|
501
|
+
* @returns True if agent in room, false if not, undefined if cache invalid
|
|
502
|
+
*
|
|
503
|
+
* @example
|
|
504
|
+
* ```typescript
|
|
505
|
+
* const isInRoom = sdk.isAgentInRoom('room-123', 'agent-456');
|
|
506
|
+
* if (isInRoom === true) {
|
|
507
|
+
* console.log('Agent is in this room');
|
|
508
|
+
* }
|
|
509
|
+
* ```
|
|
510
|
+
*/
|
|
511
|
+
public isAgentInRoom(roomId: string, agentId: string): boolean | undefined {
|
|
512
|
+
const agents = this.getRoomAgents(roomId);
|
|
513
|
+
if (!agents) return undefined;
|
|
514
|
+
return agents.some((agent) => agent.agent_id === agentId);
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
/**
|
|
518
|
+
* Gets the count of agents in a room (from cache).
|
|
519
|
+
* Returns undefined if cache is invalid.
|
|
520
|
+
*
|
|
521
|
+
* @param roomId - Room ID to count agents for
|
|
522
|
+
* @returns Number of agents or undefined if cache invalid
|
|
523
|
+
*
|
|
524
|
+
* @example
|
|
525
|
+
* ```typescript
|
|
526
|
+
* const count = sdk.getRoomAgentCount('room-123');
|
|
527
|
+
* if (count !== undefined) {
|
|
528
|
+
* console.log(`Room has ${count} agents`);
|
|
529
|
+
* }
|
|
530
|
+
* ```
|
|
531
|
+
*/
|
|
532
|
+
public getRoomAgentCount(roomId: string): number | undefined {
|
|
533
|
+
const agents = this.getRoomAgents(roomId);
|
|
534
|
+
return agents ? agents.length : undefined;
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
// ============================================================================
|
|
538
|
+
// CACHE MANAGEMENT (Public methods)
|
|
539
|
+
// ============================================================================
|
|
540
|
+
|
|
541
|
+
/**
|
|
542
|
+
* Manually invalidates all caches for a specific room.
|
|
543
|
+
* Useful after operations that might have changed agent assignments.
|
|
544
|
+
*
|
|
545
|
+
* @param roomId - Room ID to invalidate cache for
|
|
546
|
+
*
|
|
547
|
+
* @example
|
|
548
|
+
* ```typescript
|
|
549
|
+
* // After bulk operations
|
|
550
|
+
* sdk.invalidateCache('room-123');
|
|
551
|
+
* const freshAgents = await sdk.listRoomAgents('room-123', false);
|
|
552
|
+
* ```
|
|
553
|
+
*/
|
|
554
|
+
public invalidateCache(roomId: string): void {
|
|
555
|
+
this.invalidateRoomCaches(roomId);
|
|
556
|
+
this.logger.debug("AgentRoomManager: Cache invalidated", { roomId });
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
/**
|
|
560
|
+
* Clears all caches for all rooms.
|
|
561
|
+
* Called automatically on disconnect.
|
|
562
|
+
* @internal
|
|
563
|
+
*/
|
|
564
|
+
public clearAllCaches(): void {
|
|
565
|
+
this.roomAgentsCache.clear();
|
|
566
|
+
this.availableAgentsCache.clear();
|
|
567
|
+
this.logger.debug("AgentRoomManager: All caches cleared");
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
// ============================================================================
|
|
571
|
+
// INTERNAL METHODS
|
|
572
|
+
// ============================================================================
|
|
573
|
+
|
|
574
|
+
/**
|
|
575
|
+
* Handles agent status updates from server.
|
|
576
|
+
* Invalidates cache when agent status changes.
|
|
577
|
+
* @internal
|
|
578
|
+
*/
|
|
579
|
+
public handleStatusUpdate(roomId: string, agentId: string, status: string): void {
|
|
580
|
+
this.logger.debug("AgentRoomManager: Agent status update", {
|
|
581
|
+
roomId,
|
|
582
|
+
agentId,
|
|
583
|
+
status
|
|
584
|
+
});
|
|
585
|
+
|
|
586
|
+
// Invalidate cache for this room as agent list may have changed
|
|
587
|
+
this.invalidateRoomCaches(roomId);
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
/**
|
|
591
|
+
* Called by handlers to cache room agents.
|
|
592
|
+
* @internal
|
|
593
|
+
*/
|
|
594
|
+
public cacheRoomAgents(roomId: string, agents: AgentRoomInfo[]): void {
|
|
595
|
+
this.roomAgentsCache.set(roomId, agents);
|
|
596
|
+
this.logger.debug("AgentRoomManager: Cached room agents", {
|
|
597
|
+
roomId,
|
|
598
|
+
count: agents.length,
|
|
599
|
+
cacheSize: this.roomAgentsCache.size
|
|
600
|
+
});
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
/**
|
|
604
|
+
* Called by handlers to cache available agents.
|
|
605
|
+
* @internal
|
|
606
|
+
*/
|
|
607
|
+
public cacheAvailableAgents(roomId: string, agents: AgentRoomInfo[]): void {
|
|
608
|
+
this.availableAgentsCache.set(roomId, agents);
|
|
609
|
+
this.logger.debug("AgentRoomManager: Cached available agents", {
|
|
610
|
+
roomId,
|
|
611
|
+
count: agents.length,
|
|
612
|
+
cacheSize: this.availableAgentsCache.size
|
|
613
|
+
});
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
// ============================================================================
|
|
617
|
+
// PRIVATE HELPERS
|
|
618
|
+
// ============================================================================
|
|
619
|
+
|
|
620
|
+
/**
|
|
621
|
+
* Invalidates all caches for a specific room
|
|
622
|
+
*/
|
|
623
|
+
private invalidateRoomCaches(roomId: string): void {
|
|
624
|
+
this.roomAgentsCache.delete(roomId);
|
|
625
|
+
this.availableAgentsCache.delete(roomId);
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
/**
|
|
629
|
+
* Verifies user owns the room
|
|
630
|
+
*/
|
|
631
|
+
private validateRoomId(roomId: string): void {
|
|
632
|
+
if (!roomId || roomId.trim() === "") {
|
|
633
|
+
throw new SDKError("Room ID cannot be empty", ErrorCode.VALIDATION_ERROR);
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
private validateAgentId(agentId: string): void {
|
|
638
|
+
if (!agentId || agentId.trim() === "") {
|
|
639
|
+
throw new SDKError("Agent ID cannot be empty", ErrorCode.VALIDATION_ERROR);
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
private roomExists(roomId: string): boolean {
|
|
644
|
+
if (!this.roomManagementManager) return true; // Skip check if manager not available
|
|
645
|
+
|
|
646
|
+
// If getRoomById method doesn't exist, skip check
|
|
647
|
+
if (typeof this.roomManagementManager.getRoomById !== "function") {
|
|
648
|
+
return true;
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
// Check if room exists (in owned or shared rooms)
|
|
652
|
+
const room = this.roomManagementManager.getRoomById(roomId);
|
|
653
|
+
return room !== undefined;
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
private verifyOwnership(roomId: string): boolean {
|
|
657
|
+
if (!this.roomManagementManager) return true; // Skip check if manager not available
|
|
658
|
+
|
|
659
|
+
// Check if room is in owned rooms
|
|
660
|
+
const ownedRooms = this.roomManagementManager.getOwnedRooms?.();
|
|
661
|
+
if (!ownedRooms) return true; // Skip check if method not available
|
|
662
|
+
|
|
663
|
+
return ownedRooms.some((room) => room.id === roomId);
|
|
664
|
+
}
|
|
665
|
+
}
|
package/src/managers/index.ts
CHANGED
|
@@ -5,5 +5,19 @@
|
|
|
5
5
|
|
|
6
6
|
export { ConnectionManager } from "./connection-manager";
|
|
7
7
|
export { RoomManager } from "./room-manager";
|
|
8
|
+
export { RoomManagementManager } from "./room-management-manager";
|
|
9
|
+
export { AgentRoomManager, type AgentRoomInfo } from "./agent-room-manager";
|
|
8
10
|
export { AgentRegistry } from "./agent-registry";
|
|
9
|
-
export {
|
|
11
|
+
export {
|
|
12
|
+
MessageRouter,
|
|
13
|
+
type SendMessageOptions,
|
|
14
|
+
type AgentCommand,
|
|
15
|
+
type QuoteResult,
|
|
16
|
+
type MessageRouterConfig
|
|
17
|
+
} from "./message-router";
|
|
18
|
+
export {
|
|
19
|
+
AdminManager,
|
|
20
|
+
type AdminManagerEvents,
|
|
21
|
+
type ListAllAgentsOptions,
|
|
22
|
+
type AllAgentsResult
|
|
23
|
+
} from "./admin-manager";
|