@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
|
@@ -16,6 +16,14 @@
|
|
|
16
16
|
* - Real-time event streaming
|
|
17
17
|
* - Complete error handling
|
|
18
18
|
*
|
|
19
|
+
* 🆕 V2.0 Features:
|
|
20
|
+
* - Multi-room management (create, update, delete rooms)
|
|
21
|
+
* - Room ownership tracking (owned vs shared rooms)
|
|
22
|
+
* - Room limits and quotas
|
|
23
|
+
* - Agent-room customization (add/remove agents per room)
|
|
24
|
+
* - Agent-room caching with 5-minute TTL
|
|
25
|
+
* - Real-time agent status updates
|
|
26
|
+
*
|
|
19
27
|
* Run with: bun run server.ts
|
|
20
28
|
*/
|
|
21
29
|
|
|
@@ -28,11 +36,9 @@ import { SDKConfigBuilder, TeneoSDK, SecurePrivateKey } from "../../dist/index.j
|
|
|
28
36
|
|
|
29
37
|
// Load environment variables
|
|
30
38
|
const PORT = parseInt(process.env.PORT || "3001");
|
|
31
|
-
const WS_URL =
|
|
32
|
-
process.env.WS_URL || "wss://dev-rooms-websocket-ai-core-o9fmb.ondigitalocean.app/ws";
|
|
39
|
+
const WS_URL = process.env.WS_URL || "wss://your-teneo-server.com/ws";
|
|
33
40
|
const PRIVATE_KEY = process.env.PRIVATE_KEY || "";
|
|
34
41
|
const WALLET_ADDRESS = process.env.WALLET_ADDRESS || "";
|
|
35
|
-
const DEFAULT_ROOM = process.env.DEFAULT_ROOM || "as1LfBarJNzOIpOQJQ7PH";
|
|
36
42
|
const ENABLE_SIG_VERIFICATION = process.env.ENABLE_SIGNATURE_VERIFICATION === "true";
|
|
37
43
|
const TRUSTED_ADDRESSES = process.env.TRUSTED_ADDRESSES?.split(",").filter(Boolean) || [];
|
|
38
44
|
|
|
@@ -75,7 +81,6 @@ async function initializeSDK() {
|
|
|
75
81
|
const config = new SDKConfigBuilder()
|
|
76
82
|
.withWebSocketUrl(WS_URL)
|
|
77
83
|
.withAuthentication(secureKey, WALLET_ADDRESS) // Pass SecurePrivateKey instead of plain string
|
|
78
|
-
.withAutoJoinRooms([DEFAULT_ROOM])
|
|
79
84
|
.withReconnection({ enabled: true, delay: 5000, maxAttempts: 10 })
|
|
80
85
|
// REL-3: Configure custom retry strategies for production resilience
|
|
81
86
|
.withReconnectionStrategy({
|
|
@@ -125,8 +130,8 @@ async function initializeSDK() {
|
|
|
125
130
|
// Set up comprehensive event listeners
|
|
126
131
|
setupSDKEventListeners(sdk);
|
|
127
132
|
|
|
128
|
-
// Connect to Teneo
|
|
129
|
-
console.log("[SDK] Connecting to Teneo
|
|
133
|
+
// Connect to Teneo Protocol
|
|
134
|
+
console.log("[SDK] Connecting to Teneo Protocol...");
|
|
130
135
|
await sdk.connect();
|
|
131
136
|
console.log("[SDK] Successfully connected and authenticated!");
|
|
132
137
|
|
|
@@ -257,6 +262,81 @@ function setupSDKEventListeners(sdk: TeneoSDK) {
|
|
|
257
262
|
broadcastSSE({ type: "room:list", rooms });
|
|
258
263
|
});
|
|
259
264
|
|
|
265
|
+
// Room Management events (v2.0.0)
|
|
266
|
+
sdk.on("room:created", (room) => {
|
|
267
|
+
addEvent("room:created", { roomId: room.id, name: room.name });
|
|
268
|
+
broadcastSSE({ type: "room:created", room });
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
sdk.on("room:updated", (room) => {
|
|
272
|
+
addEvent("room:updated", { roomId: room.id, name: room.name });
|
|
273
|
+
broadcastSSE({ type: "room:updated", room });
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
sdk.on("room:deleted", (roomId) => {
|
|
277
|
+
addEvent("room:deleted", { roomId });
|
|
278
|
+
broadcastSSE({ type: "room:deleted", roomId });
|
|
279
|
+
});
|
|
280
|
+
|
|
281
|
+
sdk.on("room:create_error", (error) => {
|
|
282
|
+
addEvent("room:create_error", { error: error.message });
|
|
283
|
+
errorCounter++;
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
sdk.on("room:update_error", (error, roomId) => {
|
|
287
|
+
addEvent("room:update_error", { error: error.message, roomId });
|
|
288
|
+
errorCounter++;
|
|
289
|
+
});
|
|
290
|
+
|
|
291
|
+
sdk.on("room:delete_error", (error, roomId) => {
|
|
292
|
+
addEvent("room:delete_error", { error: error.message, roomId });
|
|
293
|
+
errorCounter++;
|
|
294
|
+
});
|
|
295
|
+
|
|
296
|
+
// Agent Room Management events (v2.0.0)
|
|
297
|
+
sdk.on("agent_room:agent_added", (roomId, agentId) => {
|
|
298
|
+
addEvent("agent_room:agent_added", { roomId, agentId });
|
|
299
|
+
broadcastSSE({ type: "agent_room:agent_added", roomId, agentId });
|
|
300
|
+
});
|
|
301
|
+
|
|
302
|
+
sdk.on("agent_room:agent_removed", (roomId, agentId) => {
|
|
303
|
+
addEvent("agent_room:agent_removed", { roomId, agentId });
|
|
304
|
+
broadcastSSE({ type: "agent_room:agent_removed", roomId, agentId });
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
sdk.on("agent_room:agents_listed", (roomId, agents) => {
|
|
308
|
+
addEvent("agent_room:agents_listed", { roomId, count: agents.length });
|
|
309
|
+
});
|
|
310
|
+
|
|
311
|
+
sdk.on("agent_room:available_agents_listed", (agents) => {
|
|
312
|
+
addEvent("agent_room:available_agents_listed", { count: agents.length });
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
sdk.on("agent_room:status_update", (data) => {
|
|
316
|
+
addEvent("agent_room:status_update", data);
|
|
317
|
+
broadcastSSE({ type: "agent_room:status_update", data });
|
|
318
|
+
});
|
|
319
|
+
|
|
320
|
+
sdk.on("agent_room:add_error", (error, roomId) => {
|
|
321
|
+
addEvent("agent_room:add_error", { error: error.message, roomId });
|
|
322
|
+
errorCounter++;
|
|
323
|
+
});
|
|
324
|
+
|
|
325
|
+
sdk.on("agent_room:remove_error", (error, roomId) => {
|
|
326
|
+
addEvent("agent_room:remove_error", { error: error.message, roomId });
|
|
327
|
+
errorCounter++;
|
|
328
|
+
});
|
|
329
|
+
|
|
330
|
+
sdk.on("agent_room:list_error", (error, roomId) => {
|
|
331
|
+
addEvent("agent_room:list_error", { error: error.message, roomId });
|
|
332
|
+
errorCounter++;
|
|
333
|
+
});
|
|
334
|
+
|
|
335
|
+
sdk.on("agent_room:list_available_error", (error) => {
|
|
336
|
+
addEvent("agent_room:list_available_error", { error: error.message });
|
|
337
|
+
errorCounter++;
|
|
338
|
+
});
|
|
339
|
+
|
|
260
340
|
// Webhook events
|
|
261
341
|
sdk.on("webhook:sent", (payload, url) => {
|
|
262
342
|
addEvent("webhook:sent", { event: payload.event, url });
|
|
@@ -594,7 +674,7 @@ app.get("/api/rooms", (c) => {
|
|
|
594
674
|
return c.json(rooms);
|
|
595
675
|
});
|
|
596
676
|
|
|
597
|
-
// Get available rooms for sending messages (subscribed + private room)
|
|
677
|
+
// Get available rooms for sending messages (subscribed + private room + owned rooms)
|
|
598
678
|
app.get("/api/rooms/available", (c) => {
|
|
599
679
|
if (!sdk) {
|
|
600
680
|
return c.json({ error: "SDK not initialized" }, 503);
|
|
@@ -602,6 +682,8 @@ app.get("/api/rooms/available", (c) => {
|
|
|
602
682
|
|
|
603
683
|
const authState = sdk.getAuthState();
|
|
604
684
|
const subscribedRooms = sdk.getSubscribedRooms();
|
|
685
|
+
const ownedRooms = sdk.getOwnedRooms(); // v2.0.0: Include newly created rooms
|
|
686
|
+
const sharedRooms = sdk.getSharedRooms(); // v2.0.0: Include shared rooms
|
|
605
687
|
|
|
606
688
|
// Combine all available rooms
|
|
607
689
|
const availableRooms: Array<{
|
|
@@ -637,6 +719,36 @@ app.get("/api/rooms/available", (c) => {
|
|
|
637
719
|
});
|
|
638
720
|
}
|
|
639
721
|
|
|
722
|
+
// Add owned rooms (v2.0.0) - includes newly created rooms
|
|
723
|
+
if (ownedRooms && ownedRooms.length > 0) {
|
|
724
|
+
ownedRooms.forEach((room) => {
|
|
725
|
+
// Only add if not already in the list
|
|
726
|
+
if (!availableRooms.find((r) => r.id === room.id)) {
|
|
727
|
+
availableRooms.push({
|
|
728
|
+
id: room.id,
|
|
729
|
+
name: room.name || room.id,
|
|
730
|
+
type: room.is_public ? "public" : "private",
|
|
731
|
+
description: room.description || undefined
|
|
732
|
+
});
|
|
733
|
+
}
|
|
734
|
+
});
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
// Add shared rooms (v2.0.0) - rooms user is a member of
|
|
738
|
+
if (sharedRooms && sharedRooms.length > 0) {
|
|
739
|
+
sharedRooms.forEach((room) => {
|
|
740
|
+
// Only add if not already in the list
|
|
741
|
+
if (!availableRooms.find((r) => r.id === room.id)) {
|
|
742
|
+
availableRooms.push({
|
|
743
|
+
id: room.id,
|
|
744
|
+
name: room.name || room.id,
|
|
745
|
+
type: room.is_public ? "public" : "private",
|
|
746
|
+
description: room.description || undefined
|
|
747
|
+
});
|
|
748
|
+
}
|
|
749
|
+
});
|
|
750
|
+
}
|
|
751
|
+
|
|
640
752
|
// Add private room ID if not already included
|
|
641
753
|
if (authState.privateRoomId && !availableRooms.find((r) => r.id === authState.privateRoomId)) {
|
|
642
754
|
availableRooms.push({
|
|
@@ -703,6 +815,236 @@ app.post("/api/room/leave", async (c) => {
|
|
|
703
815
|
}
|
|
704
816
|
});
|
|
705
817
|
|
|
818
|
+
// ========================================
|
|
819
|
+
// 🆕 V2.0 ROOM MANAGEMENT API
|
|
820
|
+
// ========================================
|
|
821
|
+
|
|
822
|
+
// Get owned rooms (v2.0)
|
|
823
|
+
app.get("/api/v2/rooms/owned", (c) => {
|
|
824
|
+
if (!sdk) {
|
|
825
|
+
return c.json({ error: "SDK not initialized" }, 503);
|
|
826
|
+
}
|
|
827
|
+
|
|
828
|
+
const ownedRooms = sdk.getOwnedRooms();
|
|
829
|
+
return c.json(ownedRooms);
|
|
830
|
+
});
|
|
831
|
+
|
|
832
|
+
// Get shared rooms (v2.0)
|
|
833
|
+
app.get("/api/v2/rooms/shared", (c) => {
|
|
834
|
+
if (!sdk) {
|
|
835
|
+
return c.json({ error: "SDK not initialized" }, 503);
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
const sharedRooms = sdk.getSharedRooms();
|
|
839
|
+
return c.json(sharedRooms);
|
|
840
|
+
});
|
|
841
|
+
|
|
842
|
+
// Get room limit info (v2.0)
|
|
843
|
+
app.get("/api/v2/rooms/limit", (c) => {
|
|
844
|
+
if (!sdk) {
|
|
845
|
+
return c.json({ error: "SDK not initialized" }, 503);
|
|
846
|
+
}
|
|
847
|
+
|
|
848
|
+
return c.json({
|
|
849
|
+
limit: sdk.getRoomLimit(),
|
|
850
|
+
count: sdk.getOwnedRoomCount(),
|
|
851
|
+
canCreate: sdk.canCreateRoom()
|
|
852
|
+
});
|
|
853
|
+
});
|
|
854
|
+
|
|
855
|
+
// Create room (v2.0)
|
|
856
|
+
app.post("/api/v2/rooms", async (c) => {
|
|
857
|
+
if (!sdk || !sdk.isConnected) {
|
|
858
|
+
return c.json({ error: "SDK not connected" }, 503);
|
|
859
|
+
}
|
|
860
|
+
|
|
861
|
+
try {
|
|
862
|
+
const { name, description } = await c.req.json();
|
|
863
|
+
|
|
864
|
+
if (!name) {
|
|
865
|
+
return c.json({ error: "Room name is required" }, 400);
|
|
866
|
+
}
|
|
867
|
+
|
|
868
|
+
const room = await sdk.createRoom({ name, description });
|
|
869
|
+
return c.json(room);
|
|
870
|
+
} catch (error: any) {
|
|
871
|
+
return c.json({ error: error.message }, 500);
|
|
872
|
+
}
|
|
873
|
+
});
|
|
874
|
+
|
|
875
|
+
// Update room (v2.0)
|
|
876
|
+
app.put("/api/v2/rooms/:id", async (c) => {
|
|
877
|
+
if (!sdk || !sdk.isConnected) {
|
|
878
|
+
return c.json({ error: "SDK not connected" }, 503);
|
|
879
|
+
}
|
|
880
|
+
|
|
881
|
+
try {
|
|
882
|
+
const roomId = c.req.param("id");
|
|
883
|
+
const updates = await c.req.json();
|
|
884
|
+
|
|
885
|
+
if (!updates.name && !updates.description) {
|
|
886
|
+
return c.json({ error: "At least one field (name or description) must be provided" }, 400);
|
|
887
|
+
}
|
|
888
|
+
|
|
889
|
+
const room = await sdk.updateRoom(roomId, updates);
|
|
890
|
+
return c.json(room);
|
|
891
|
+
} catch (error: any) {
|
|
892
|
+
return c.json({ error: error.message }, 500);
|
|
893
|
+
}
|
|
894
|
+
});
|
|
895
|
+
|
|
896
|
+
// Delete room (v2.0)
|
|
897
|
+
app.delete("/api/v2/rooms/:id", async (c) => {
|
|
898
|
+
if (!sdk || !sdk.isConnected) {
|
|
899
|
+
return c.json({ error: "SDK not connected" }, 503);
|
|
900
|
+
}
|
|
901
|
+
|
|
902
|
+
try {
|
|
903
|
+
const roomId = c.req.param("id");
|
|
904
|
+
await sdk.deleteRoom(roomId);
|
|
905
|
+
return c.json({ success: true, message: "Room deleted successfully" });
|
|
906
|
+
} catch (error: any) {
|
|
907
|
+
return c.json({ error: error.message }, 500);
|
|
908
|
+
}
|
|
909
|
+
});
|
|
910
|
+
|
|
911
|
+
// ========================================
|
|
912
|
+
// 🆕 V2.0 AGENT ROOM MANAGEMENT API
|
|
913
|
+
// ========================================
|
|
914
|
+
|
|
915
|
+
// List agents in a room (v2.0)
|
|
916
|
+
app.get("/api/v2/rooms/:id/agents", async (c) => {
|
|
917
|
+
if (!sdk || !sdk.isConnected) {
|
|
918
|
+
return c.json({ error: "SDK not connected" }, 503);
|
|
919
|
+
}
|
|
920
|
+
|
|
921
|
+
try {
|
|
922
|
+
const roomId = c.req.param("id");
|
|
923
|
+
const useCache = c.req.query("cache") !== "false"; // Default to true
|
|
924
|
+
|
|
925
|
+
const agents = await sdk.listRoomAgents(roomId, useCache);
|
|
926
|
+
return c.json({
|
|
927
|
+
roomId,
|
|
928
|
+
agents,
|
|
929
|
+
cached: useCache,
|
|
930
|
+
count: agents.length
|
|
931
|
+
});
|
|
932
|
+
} catch (error: any) {
|
|
933
|
+
return c.json({ error: error.message }, 500);
|
|
934
|
+
}
|
|
935
|
+
});
|
|
936
|
+
|
|
937
|
+
// List available agents for a room (v2.0)
|
|
938
|
+
app.get("/api/v2/rooms/:id/available-agents", async (c) => {
|
|
939
|
+
if (!sdk || !sdk.isConnected) {
|
|
940
|
+
return c.json({ error: "SDK not connected" }, 503);
|
|
941
|
+
}
|
|
942
|
+
|
|
943
|
+
try {
|
|
944
|
+
const roomId = c.req.param("id");
|
|
945
|
+
const useCache = c.req.query("cache") !== "false"; // Default to true
|
|
946
|
+
|
|
947
|
+
const agents = await sdk.listAvailableAgents(roomId, useCache);
|
|
948
|
+
return c.json({
|
|
949
|
+
roomId,
|
|
950
|
+
agents,
|
|
951
|
+
cached: useCache,
|
|
952
|
+
count: agents.length
|
|
953
|
+
});
|
|
954
|
+
} catch (error: any) {
|
|
955
|
+
return c.json({ error: error.message }, 500);
|
|
956
|
+
}
|
|
957
|
+
});
|
|
958
|
+
|
|
959
|
+
// Add agent to room (v2.0)
|
|
960
|
+
app.post("/api/v2/rooms/:roomId/agents/:agentId", async (c) => {
|
|
961
|
+
if (!sdk || !sdk.isConnected) {
|
|
962
|
+
return c.json({ error: "SDK not connected" }, 503);
|
|
963
|
+
}
|
|
964
|
+
|
|
965
|
+
try {
|
|
966
|
+
const roomId = c.req.param("roomId");
|
|
967
|
+
const agentId = c.req.param("agentId");
|
|
968
|
+
|
|
969
|
+
await sdk.addAgentToRoom(roomId, agentId);
|
|
970
|
+
return c.json({
|
|
971
|
+
success: true,
|
|
972
|
+
message: `Agent ${agentId} added to room ${roomId}`
|
|
973
|
+
});
|
|
974
|
+
} catch (error: any) {
|
|
975
|
+
return c.json({ error: error.message }, 500);
|
|
976
|
+
}
|
|
977
|
+
});
|
|
978
|
+
|
|
979
|
+
// Remove agent from room (v2.0)
|
|
980
|
+
app.delete("/api/v2/rooms/:roomId/agents/:agentId", async (c) => {
|
|
981
|
+
if (!sdk || !sdk.isConnected) {
|
|
982
|
+
return c.json({ error: "SDK not connected" }, 503);
|
|
983
|
+
}
|
|
984
|
+
|
|
985
|
+
try {
|
|
986
|
+
const roomId = c.req.param("roomId");
|
|
987
|
+
const agentId = c.req.param("agentId");
|
|
988
|
+
|
|
989
|
+
await sdk.removeAgentFromRoom(roomId, agentId);
|
|
990
|
+
return c.json({
|
|
991
|
+
success: true,
|
|
992
|
+
message: `Agent ${agentId} removed from room ${roomId}`
|
|
993
|
+
});
|
|
994
|
+
} catch (error: any) {
|
|
995
|
+
return c.json({ error: error.message }, 500);
|
|
996
|
+
}
|
|
997
|
+
});
|
|
998
|
+
|
|
999
|
+
// Check if agent is in room - instant cache query (v2.0)
|
|
1000
|
+
app.get("/api/v2/rooms/:roomId/agents/:agentId/check", (c) => {
|
|
1001
|
+
if (!sdk) {
|
|
1002
|
+
return c.json({ error: "SDK not initialized" }, 503);
|
|
1003
|
+
}
|
|
1004
|
+
|
|
1005
|
+
const roomId = c.req.param("roomId");
|
|
1006
|
+
const agentId = c.req.param("agentId");
|
|
1007
|
+
const isInRoom = sdk.isAgentInRoom(roomId, agentId);
|
|
1008
|
+
|
|
1009
|
+
return c.json({
|
|
1010
|
+
roomId,
|
|
1011
|
+
agentId,
|
|
1012
|
+
inRoom: isInRoom,
|
|
1013
|
+
cached: true
|
|
1014
|
+
});
|
|
1015
|
+
});
|
|
1016
|
+
|
|
1017
|
+
// Get room agent count - instant cache query (v2.0)
|
|
1018
|
+
app.get("/api/v2/rooms/:id/agents/count", (c) => {
|
|
1019
|
+
if (!sdk) {
|
|
1020
|
+
return c.json({ error: "SDK not initialized" }, 503);
|
|
1021
|
+
}
|
|
1022
|
+
|
|
1023
|
+
const roomId = c.req.param("id");
|
|
1024
|
+
const count = sdk.getRoomAgentCount(roomId);
|
|
1025
|
+
|
|
1026
|
+
return c.json({
|
|
1027
|
+
roomId,
|
|
1028
|
+
count,
|
|
1029
|
+
cached: true
|
|
1030
|
+
});
|
|
1031
|
+
});
|
|
1032
|
+
|
|
1033
|
+
// Invalidate agent-room cache for a room (v2.0)
|
|
1034
|
+
app.post("/api/v2/rooms/:id/cache/invalidate", (c) => {
|
|
1035
|
+
if (!sdk) {
|
|
1036
|
+
return c.json({ error: "SDK not initialized" }, 503);
|
|
1037
|
+
}
|
|
1038
|
+
|
|
1039
|
+
const roomId = c.req.param("id");
|
|
1040
|
+
sdk.invalidateAgentRoomCache(roomId);
|
|
1041
|
+
|
|
1042
|
+
return c.json({
|
|
1043
|
+
success: true,
|
|
1044
|
+
message: `Cache invalidated for room ${roomId}`
|
|
1045
|
+
});
|
|
1046
|
+
});
|
|
1047
|
+
|
|
706
1048
|
// Get recent events
|
|
707
1049
|
app.get("/api/events", (c) => {
|
|
708
1050
|
return c.json(recentEvents.slice(0, 50));
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Room Management Example
|
|
3
|
+
*
|
|
4
|
+
* Demonstrates how to create, manage, and organize multiple rooms in the Teneo SDK v2.0.
|
|
5
|
+
*
|
|
6
|
+
* This example shows:
|
|
7
|
+
* - Creating rooms with different configurations
|
|
8
|
+
* - Checking room limits and quotas
|
|
9
|
+
* - Querying owned vs shared rooms
|
|
10
|
+
* - Updating room properties
|
|
11
|
+
* - Deleting rooms
|
|
12
|
+
* - Handling room events
|
|
13
|
+
*
|
|
14
|
+
* Prerequisites:
|
|
15
|
+
* - Set TENEO_WS_URL environment variable
|
|
16
|
+
* - Set PRIVATE_KEY environment variable (64 hex characters, no 0x prefix)
|
|
17
|
+
*
|
|
18
|
+
* Run:
|
|
19
|
+
* npx ts-node examples/room-management-example.ts
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import { TeneoSDK } from "../src";
|
|
23
|
+
import * as dotenv from "dotenv";
|
|
24
|
+
|
|
25
|
+
dotenv.config();
|
|
26
|
+
|
|
27
|
+
const wsUrl = process.env.TENEO_WS_URL!;
|
|
28
|
+
const privateKey = process.env.PRIVATE_KEY!;
|
|
29
|
+
|
|
30
|
+
async function main() {
|
|
31
|
+
console.log("🚀 Teneo SDK v2.0 - Room Management Example\n");
|
|
32
|
+
|
|
33
|
+
// Initialize SDK
|
|
34
|
+
const sdk = new TeneoSDK({
|
|
35
|
+
wsUrl,
|
|
36
|
+
privateKey,
|
|
37
|
+
logLevel: "info",
|
|
38
|
+
reconnect: true
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
// Set up event listeners for room operations
|
|
42
|
+
setupEventListeners(sdk);
|
|
43
|
+
|
|
44
|
+
try {
|
|
45
|
+
// Connect and authenticate
|
|
46
|
+
console.log("📡 Connecting to Teneo Protocol...");
|
|
47
|
+
await sdk.connect();
|
|
48
|
+
console.log("✅ Connected and authenticated\n");
|
|
49
|
+
|
|
50
|
+
// Wait a moment for initial room data to load
|
|
51
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
52
|
+
|
|
53
|
+
// Step 1: Check current room status
|
|
54
|
+
console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
|
|
55
|
+
console.log("📊 Current Room Status");
|
|
56
|
+
console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
|
|
57
|
+
await displayRoomStatus(sdk);
|
|
58
|
+
|
|
59
|
+
// Step 2: Create new rooms
|
|
60
|
+
console.log("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
|
|
61
|
+
console.log("🏗️ Creating New Rooms");
|
|
62
|
+
console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
|
|
63
|
+
const newRooms = await createSampleRooms(sdk);
|
|
64
|
+
|
|
65
|
+
// Wait for room creation events to process
|
|
66
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
67
|
+
|
|
68
|
+
// Step 3: Display updated room status
|
|
69
|
+
console.log("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
|
|
70
|
+
console.log("📊 Updated Room Status");
|
|
71
|
+
console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
|
|
72
|
+
await displayRoomStatus(sdk);
|
|
73
|
+
|
|
74
|
+
// Step 4: Update a room
|
|
75
|
+
if (newRooms.length > 0) {
|
|
76
|
+
console.log("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
|
|
77
|
+
console.log("📝 Updating Room");
|
|
78
|
+
console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
|
|
79
|
+
await updateRoomExample(sdk, newRooms[0].id);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Step 5: Query specific room
|
|
83
|
+
if (newRooms.length > 0) {
|
|
84
|
+
console.log("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
|
|
85
|
+
console.log("🔍 Querying Specific Room");
|
|
86
|
+
console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
|
|
87
|
+
const room = sdk.getRoomById(newRooms[0].id);
|
|
88
|
+
if (room) {
|
|
89
|
+
console.log(`Room ID: ${room.id}`);
|
|
90
|
+
console.log(`Name: ${room.name}`);
|
|
91
|
+
console.log(`Description: ${room.description || "N/A"}`);
|
|
92
|
+
console.log(`Type: ${room.is_public ? "Public" : "Private"}`);
|
|
93
|
+
console.log(`Created by: ${room.created_by}`);
|
|
94
|
+
console.log(`Created at: ${room.created_at}`);
|
|
95
|
+
console.log(`You are: ${room.is_owner ? "Owner" : "Member"}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Step 6: Delete rooms
|
|
100
|
+
console.log("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
|
|
101
|
+
console.log("🗑️ Cleaning Up (Deleting Rooms)");
|
|
102
|
+
console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
|
|
103
|
+
await deleteRooms(sdk, newRooms);
|
|
104
|
+
|
|
105
|
+
// Wait for deletion events to process
|
|
106
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
107
|
+
|
|
108
|
+
// Step 7: Final room status
|
|
109
|
+
console.log("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
|
|
110
|
+
console.log("📊 Final Room Status");
|
|
111
|
+
console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
|
|
112
|
+
await displayRoomStatus(sdk);
|
|
113
|
+
|
|
114
|
+
console.log("\n✅ Room management example completed!");
|
|
115
|
+
} catch (error: any) {
|
|
116
|
+
console.error("\n❌ Error:", error.message);
|
|
117
|
+
console.error(error.stack);
|
|
118
|
+
} finally {
|
|
119
|
+
// Disconnect
|
|
120
|
+
console.log("\n👋 Disconnecting...");
|
|
121
|
+
sdk.disconnect();
|
|
122
|
+
console.log("✅ Disconnected");
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function setupEventListeners(sdk: TeneoSDK) {
|
|
127
|
+
// Room created
|
|
128
|
+
sdk.on("room:created", (room) => {
|
|
129
|
+
console.log(` ✅ Room created: "${room.name}" (${room.id})`);
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
// Room updated
|
|
133
|
+
sdk.on("room:updated", (room) => {
|
|
134
|
+
console.log(` ✅ Room updated: "${room.name}" (${room.id})`);
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
// Room deleted
|
|
138
|
+
sdk.on("room:deleted", (roomId) => {
|
|
139
|
+
console.log(` ✅ Room deleted: ${roomId}`);
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
// Room errors
|
|
143
|
+
sdk.on("room:create_error", (error) => {
|
|
144
|
+
console.error(` ❌ Failed to create room: ${error.message}`);
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
sdk.on("room:update_error", (error, roomId) => {
|
|
148
|
+
console.error(` ❌ Failed to update room ${roomId}: ${error.message}`);
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
sdk.on("room:delete_error", (error, roomId) => {
|
|
152
|
+
console.error(` ❌ Failed to delete room ${roomId}: ${error.message}`);
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
async function displayRoomStatus(sdk: TeneoSDK) {
|
|
157
|
+
const ownedRooms = sdk.getOwnedRooms();
|
|
158
|
+
const sharedRooms = sdk.getSharedRooms();
|
|
159
|
+
const roomLimit = sdk.getRoomLimit();
|
|
160
|
+
const roomCount = sdk.getOwnedRoomCount();
|
|
161
|
+
|
|
162
|
+
console.log(`Room Capacity: ${roomCount}/${roomLimit} rooms used`);
|
|
163
|
+
console.log(`Can create more rooms: ${sdk.canCreateRoom() ? "✅ Yes" : "❌ No (limit reached)"}`);
|
|
164
|
+
|
|
165
|
+
console.log(`\n📁 Owned Rooms (${ownedRooms.length}):`);
|
|
166
|
+
if (ownedRooms.length === 0) {
|
|
167
|
+
console.log(" (none)");
|
|
168
|
+
} else {
|
|
169
|
+
ownedRooms.forEach((room, i) => {
|
|
170
|
+
console.log(` ${i + 1}. "${room.name}" - ${room.is_public ? "Public" : "Private"}`);
|
|
171
|
+
console.log(` ID: ${room.id}`);
|
|
172
|
+
if (room.description) {
|
|
173
|
+
console.log(` Description: ${room.description}`);
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
console.log(`\n🤝 Shared Rooms (${sharedRooms.length}):`);
|
|
179
|
+
if (sharedRooms.length === 0) {
|
|
180
|
+
console.log(" (none)");
|
|
181
|
+
} else {
|
|
182
|
+
sharedRooms.forEach((room, i) => {
|
|
183
|
+
console.log(` ${i + 1}. "${room.name}" - ${room.is_public ? "Public" : "Private"}`);
|
|
184
|
+
console.log(` ID: ${room.id}`);
|
|
185
|
+
console.log(` Created by: ${room.created_by}`);
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
async function createSampleRooms(sdk: TeneoSDK) {
|
|
191
|
+
const newRooms = [];
|
|
192
|
+
|
|
193
|
+
// Check if we can create rooms
|
|
194
|
+
if (!sdk.canCreateRoom()) {
|
|
195
|
+
console.log("⚠️ Cannot create rooms - limit reached");
|
|
196
|
+
console.log(` Current: ${sdk.getOwnedRoomCount()}/${sdk.getRoomLimit()}`);
|
|
197
|
+
return newRooms;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
try {
|
|
201
|
+
// Create room 1: Private crypto research room
|
|
202
|
+
console.log("Creating 'Crypto Research' room...");
|
|
203
|
+
const cryptoRoom = await sdk.createRoom({
|
|
204
|
+
name: "Crypto Research",
|
|
205
|
+
description: "Room for cryptocurrency analysis and tracking",
|
|
206
|
+
isPublic: false
|
|
207
|
+
});
|
|
208
|
+
newRooms.push(cryptoRoom);
|
|
209
|
+
|
|
210
|
+
// Create room 2: Public gaming room (if we have capacity)
|
|
211
|
+
if (sdk.canCreateRoom()) {
|
|
212
|
+
console.log("Creating 'Gaming Hub' room...");
|
|
213
|
+
const gamingRoom = await sdk.createRoom({
|
|
214
|
+
name: "Gaming Hub",
|
|
215
|
+
description: "Public room for gaming-related AI agents",
|
|
216
|
+
isPublic: true
|
|
217
|
+
});
|
|
218
|
+
newRooms.push(gamingRoom);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// Create room 3: Research room (if we have capacity)
|
|
222
|
+
if (sdk.canCreateRoom()) {
|
|
223
|
+
console.log("Creating 'AI Research' room...");
|
|
224
|
+
const researchRoom = await sdk.createRoom({
|
|
225
|
+
name: "AI Research",
|
|
226
|
+
description: "Room for AI research and experimentation"
|
|
227
|
+
});
|
|
228
|
+
newRooms.push(researchRoom);
|
|
229
|
+
}
|
|
230
|
+
} catch (error: any) {
|
|
231
|
+
console.error(`Failed to create room: ${error.message}`);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
return newRooms;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
async function updateRoomExample(sdk: TeneoSDK, roomId: string) {
|
|
238
|
+
try {
|
|
239
|
+
const originalRoom = sdk.getRoomById(roomId);
|
|
240
|
+
if (!originalRoom) {
|
|
241
|
+
console.log(" ⚠️ Room not found");
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
console.log(`Original room name: "${originalRoom.name}"`);
|
|
246
|
+
console.log(`Original description: "${originalRoom.description || "N/A"}"`);
|
|
247
|
+
|
|
248
|
+
console.log("\nUpdating room...");
|
|
249
|
+
const updatedRoom = await sdk.updateRoom(roomId, {
|
|
250
|
+
name: `${originalRoom.name} (Updated)`,
|
|
251
|
+
description: "This room was updated via the SDK v2.0 API"
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
console.log(`\nNew room name: "${updatedRoom.name}"`);
|
|
255
|
+
console.log(`New description: "${updatedRoom.description}"`);
|
|
256
|
+
} catch (error: any) {
|
|
257
|
+
console.error(`Failed to update room: ${error.message}`);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
async function deleteRooms(sdk: TeneoSDK, rooms: any[]) {
|
|
262
|
+
if (rooms.length === 0) {
|
|
263
|
+
console.log("No rooms to delete");
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
console.log(`Deleting ${rooms.length} room(s)...\n`);
|
|
268
|
+
|
|
269
|
+
for (const room of rooms) {
|
|
270
|
+
try {
|
|
271
|
+
console.log(`Deleting "${room.name}" (${room.id})...`);
|
|
272
|
+
await sdk.deleteRoom(room.id);
|
|
273
|
+
// Wait a bit between deletions
|
|
274
|
+
await new Promise((resolve) => setTimeout(resolve, 300));
|
|
275
|
+
} catch (error: any) {
|
|
276
|
+
console.error(`Failed to delete room ${room.id}: ${error.message}`);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
// Run the example
|
|
282
|
+
main().catch(console.error);
|