@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
|
@@ -4,26 +4,52 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { EventEmitter } from "eventemitter3";
|
|
7
|
-
import { Agent, Logger } from "../types";
|
|
8
|
-
import { SDKEvents } from "../types/events";
|
|
7
|
+
import { Agent, AgentCategory, Logger, AgentRoomInfo } from "../types";
|
|
8
|
+
import { SDKEvents, SDKError } from "../types/events";
|
|
9
|
+
import { ErrorCode } from "../types/error-codes";
|
|
9
10
|
import { AgentIdSchema, SearchQuerySchema } from "../types/validation";
|
|
11
|
+
import { WebSocketClient } from "../core/websocket-client";
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Pending request for agent details with promise sharing for concurrent requests
|
|
15
|
+
*/
|
|
16
|
+
interface PendingDetailsRequest {
|
|
17
|
+
promise: Promise<AgentRoomInfo>;
|
|
18
|
+
resolve: (agent: AgentRoomInfo) => void;
|
|
19
|
+
reject: (error: Error) => void;
|
|
20
|
+
timeout: ReturnType<typeof setTimeout>;
|
|
21
|
+
}
|
|
10
22
|
|
|
11
23
|
export class AgentRegistry extends EventEmitter<SDKEvents> {
|
|
12
24
|
private readonly logger: Logger;
|
|
13
25
|
private readonly agents = new Map<string, Agent>();
|
|
14
26
|
private cachedAgents?: Readonly<Agent>[];
|
|
15
27
|
private isAgentsCacheDirty = true;
|
|
28
|
+
private wsClient?: WebSocketClient;
|
|
16
29
|
|
|
17
30
|
// PERF-3: Search indices for O(1) lookups
|
|
18
31
|
private capabilityIndex = new Map<string, Set<string>>();
|
|
19
32
|
private nameTokenIndex = new Map<string, Set<string>>();
|
|
20
33
|
private statusIndex = new Map<string, Set<string>>();
|
|
34
|
+
private categoryIndex = new Map<AgentCategory, Set<string>>();
|
|
35
|
+
|
|
36
|
+
// Pending agent details requests
|
|
37
|
+
private readonly pendingDetailsRequests = new Map<string, PendingDetailsRequest>();
|
|
38
|
+
private readonly detailsTimeout = 30000; // 30 seconds
|
|
21
39
|
|
|
22
40
|
constructor(logger: Logger) {
|
|
23
41
|
super();
|
|
24
42
|
this.logger = logger;
|
|
25
43
|
}
|
|
26
44
|
|
|
45
|
+
/**
|
|
46
|
+
* Sets the WebSocket client for making requests.
|
|
47
|
+
* @internal
|
|
48
|
+
*/
|
|
49
|
+
public setWebSocketClient(wsClient: WebSocketClient): void {
|
|
50
|
+
this.wsClient = wsClient;
|
|
51
|
+
}
|
|
52
|
+
|
|
27
53
|
/**
|
|
28
54
|
* Gets a cached list of all available agents in the network.
|
|
29
55
|
* Uses lazy caching with dirty flag for optimal performance.
|
|
@@ -200,6 +226,39 @@ export class AgentRegistry extends EventEmitter<SDKEvents> {
|
|
|
200
226
|
.map((agent) => ({ ...agent }));
|
|
201
227
|
}
|
|
202
228
|
|
|
229
|
+
/**
|
|
230
|
+
* Finds all agents that have a specific category.
|
|
231
|
+
* Uses O(1) category index lookup instead of O(n) filtering.
|
|
232
|
+
*
|
|
233
|
+
* @param category - The category to search for
|
|
234
|
+
* @returns Read-only array of agents with the specified category
|
|
235
|
+
*
|
|
236
|
+
* @example
|
|
237
|
+
* ```typescript
|
|
238
|
+
* const tradingAgents = agentRegistry.findByCategory('Trading');
|
|
239
|
+
* console.log(`Found ${tradingAgents.length} trading agents`);
|
|
240
|
+
* ```
|
|
241
|
+
*/
|
|
242
|
+
public findByCategory(category: AgentCategory): ReadonlyArray<Agent> {
|
|
243
|
+
// Ensure cache is up to date
|
|
244
|
+
if (this.isAgentsCacheDirty || !this.cachedAgents) {
|
|
245
|
+
this.rebuildCache();
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// O(1) index lookup
|
|
249
|
+
const agentIds = this.categoryIndex.get(category);
|
|
250
|
+
|
|
251
|
+
if (!agentIds || agentIds.size === 0) {
|
|
252
|
+
return [];
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// Map agent IDs to agent objects with defensive copies
|
|
256
|
+
return Array.from(agentIds)
|
|
257
|
+
.map((id) => this.agents.get(id))
|
|
258
|
+
.filter((agent): agent is Agent => agent !== undefined)
|
|
259
|
+
.map((agent) => ({ ...agent }));
|
|
260
|
+
}
|
|
261
|
+
|
|
203
262
|
/**
|
|
204
263
|
* Updates the registry with a new list of agents.
|
|
205
264
|
* Merges with existing agents and marks cache as dirty.
|
|
@@ -244,6 +303,97 @@ export class AgentRegistry extends EventEmitter<SDKEvents> {
|
|
|
244
303
|
this.isAgentsCacheDirty = true;
|
|
245
304
|
}
|
|
246
305
|
|
|
306
|
+
/**
|
|
307
|
+
* Fetches detailed information about a specific agent from the server.
|
|
308
|
+
* Makes a request to the server for full agent details including capabilities,
|
|
309
|
+
* commands, pricing, and more.
|
|
310
|
+
*
|
|
311
|
+
* Multiple concurrent calls for the same agent will share the same request,
|
|
312
|
+
* avoiding redundant server calls and preventing race conditions.
|
|
313
|
+
*
|
|
314
|
+
* @param agentId - The unique identifier of the agent
|
|
315
|
+
* @returns Promise that resolves with full agent details
|
|
316
|
+
* @throws {SDKError} If not connected or request times out
|
|
317
|
+
* @throws {ValidationError} If agentId is invalid
|
|
318
|
+
*
|
|
319
|
+
* @example
|
|
320
|
+
* ```typescript
|
|
321
|
+
* const details = await agentRegistry.getAgentDetails('weather-agent-001');
|
|
322
|
+
* console.log(`Agent: ${details.agent_name}`);
|
|
323
|
+
* console.log(`Capabilities: ${details.capabilities?.length}`);
|
|
324
|
+
* console.log(`Status: ${details.status}`);
|
|
325
|
+
* ```
|
|
326
|
+
*/
|
|
327
|
+
public async getAgentDetails(agentId: string): Promise<AgentRoomInfo> {
|
|
328
|
+
if (!this.wsClient || !this.wsClient.isConnected) {
|
|
329
|
+
throw new SDKError("Not connected to Teneo Protocol", ErrorCode.NOT_CONNECTED);
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
// Validate agent ID
|
|
333
|
+
const validatedAgentId = AgentIdSchema.parse(agentId);
|
|
334
|
+
|
|
335
|
+
// Check if there's already a pending request for this agent - reuse it
|
|
336
|
+
const existingRequest = this.pendingDetailsRequests.get(validatedAgentId);
|
|
337
|
+
if (existingRequest) {
|
|
338
|
+
this.logger.debug("AgentRegistry: Reusing pending request for agent details", {
|
|
339
|
+
agentId: validatedAgentId
|
|
340
|
+
});
|
|
341
|
+
return existingRequest.promise;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
this.logger.info("AgentRegistry: Requesting agent details", { agentId: validatedAgentId });
|
|
345
|
+
|
|
346
|
+
// Send get_agent_details message
|
|
347
|
+
const message = {
|
|
348
|
+
type: "get_agent_details" as const,
|
|
349
|
+
agent_id: validatedAgentId
|
|
350
|
+
};
|
|
351
|
+
|
|
352
|
+
await this.wsClient.sendMessage(message);
|
|
353
|
+
|
|
354
|
+
// Create promise with stored resolve/reject for later resolution
|
|
355
|
+
let resolvePromise: (agent: AgentRoomInfo) => void;
|
|
356
|
+
let rejectPromise: (error: Error) => void;
|
|
357
|
+
|
|
358
|
+
const promise = new Promise<AgentRoomInfo>((resolve, reject) => {
|
|
359
|
+
resolvePromise = resolve;
|
|
360
|
+
rejectPromise = reject;
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
const timeout = setTimeout(() => {
|
|
364
|
+
this.pendingDetailsRequests.delete(validatedAgentId);
|
|
365
|
+
rejectPromise!(new SDKError("Agent details request timed out", ErrorCode.TIMEOUT_ERROR));
|
|
366
|
+
}, this.detailsTimeout);
|
|
367
|
+
|
|
368
|
+
this.pendingDetailsRequests.set(validatedAgentId, {
|
|
369
|
+
promise,
|
|
370
|
+
resolve: resolvePromise!,
|
|
371
|
+
reject: rejectPromise!,
|
|
372
|
+
timeout
|
|
373
|
+
});
|
|
374
|
+
|
|
375
|
+
return promise;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
/**
|
|
379
|
+
* Handles incoming agent_details_response from server.
|
|
380
|
+
* @internal
|
|
381
|
+
*/
|
|
382
|
+
public handleAgentDetails(agent: AgentRoomInfo): void {
|
|
383
|
+
this.logger.debug("AgentRegistry: Received agent details", {
|
|
384
|
+
agentId: agent.agent_id,
|
|
385
|
+
agentName: agent.agent_name
|
|
386
|
+
});
|
|
387
|
+
|
|
388
|
+
// Resolve pending request
|
|
389
|
+
const pending = this.pendingDetailsRequests.get(agent.agent_id);
|
|
390
|
+
if (pending) {
|
|
391
|
+
clearTimeout(pending.timeout);
|
|
392
|
+
this.pendingDetailsRequests.delete(agent.agent_id);
|
|
393
|
+
pending.resolve(agent);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
|
|
247
397
|
/**
|
|
248
398
|
* Clears all agents from the registry.
|
|
249
399
|
* Removes all cached agents and marks cache as dirty.
|
|
@@ -257,6 +407,13 @@ export class AgentRegistry extends EventEmitter<SDKEvents> {
|
|
|
257
407
|
public clear(): void {
|
|
258
408
|
this.agents.clear();
|
|
259
409
|
this.isAgentsCacheDirty = true;
|
|
410
|
+
|
|
411
|
+
// Clear pending requests
|
|
412
|
+
for (const [, pending] of this.pendingDetailsRequests) {
|
|
413
|
+
clearTimeout(pending.timeout);
|
|
414
|
+
pending.reject(new SDKError("Agent registry cleared", ErrorCode.SDK_DESTROYED));
|
|
415
|
+
}
|
|
416
|
+
this.pendingDetailsRequests.clear();
|
|
260
417
|
}
|
|
261
418
|
|
|
262
419
|
/**
|
|
@@ -291,6 +448,7 @@ export class AgentRegistry extends EventEmitter<SDKEvents> {
|
|
|
291
448
|
this.capabilityIndex.clear();
|
|
292
449
|
this.nameTokenIndex.clear();
|
|
293
450
|
this.statusIndex.clear();
|
|
451
|
+
this.categoryIndex.clear();
|
|
294
452
|
|
|
295
453
|
// Populate indices
|
|
296
454
|
for (const agent of this.agents.values()) {
|
|
@@ -320,6 +478,16 @@ export class AgentRegistry extends EventEmitter<SDKEvents> {
|
|
|
320
478
|
this.statusIndex.set(status, new Set());
|
|
321
479
|
}
|
|
322
480
|
this.statusIndex.get(status)!.add(agent.id);
|
|
481
|
+
|
|
482
|
+
// Index categories
|
|
483
|
+
if (agent.categories) {
|
|
484
|
+
for (const category of agent.categories) {
|
|
485
|
+
if (!this.categoryIndex.has(category)) {
|
|
486
|
+
this.categoryIndex.set(category, new Set());
|
|
487
|
+
}
|
|
488
|
+
this.categoryIndex.get(category)!.add(agent.id);
|
|
489
|
+
}
|
|
490
|
+
}
|
|
323
491
|
}
|
|
324
492
|
|
|
325
493
|
this.isAgentsCacheDirty = false;
|