@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
package/README.md
CHANGED
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
**Connect your app to the Teneo AI Agent Network**
|
|
4
4
|
|
|
5
|
-
[](https://www.npmjs.com/package/@teneo-protocol/sdk)
|
|
6
6
|
[](https://www.typescriptlang.org/)
|
|
7
7
|
[](https://nodejs.org/)
|
|
8
|
-
[](/)
|
|
9
9
|
|
|
10
10
|
The Teneo Protocol SDK lets you connect your application to a **decentralized network of specialized AI agents**. Instead of calling a single AI model, your app taps into an entire ecosystem where:
|
|
11
11
|
|
|
@@ -30,7 +30,7 @@ import { TeneoSDK } from "@teneo-protocol/sdk";
|
|
|
30
30
|
|
|
31
31
|
// 1. Initialize with your Ethereum private key
|
|
32
32
|
const sdk = new TeneoSDK({
|
|
33
|
-
wsUrl: "wss://developer.chatroom.teneo-protocol.ai/ws",
|
|
33
|
+
wsUrl: "wss://backend.developer.chatroom.teneo-protocol.ai/ws",
|
|
34
34
|
privateKey: "your_private_key_here" // No 0x prefix
|
|
35
35
|
});
|
|
36
36
|
|
|
@@ -47,12 +47,57 @@ await sdk.sendMessage("Give me the last 5 tweets from @elonmusk");
|
|
|
47
47
|
```
|
|
48
48
|
|
|
49
49
|
**That's it!** The coordinator automatically:
|
|
50
|
+
|
|
50
51
|
1. Routes your message to the right agent
|
|
51
52
|
2. Gets the response
|
|
52
53
|
3. Delivers it via the event you're listening to
|
|
53
54
|
|
|
54
55
|
---
|
|
55
56
|
|
|
57
|
+
## ✨ What's New in v2.2
|
|
58
|
+
|
|
59
|
+
Version 2.2 introduces the **Quote-Approve Payment Flow** with x402 protocol support:
|
|
60
|
+
|
|
61
|
+
### 💰 Payment Flow (Quote-Approve)
|
|
62
|
+
|
|
63
|
+
- **Automatic payment handling** - SDK handles the full quote → confirm → pay cycle
|
|
64
|
+
- **x402 Protocol** - Industry-standard payment headers (Coinbase x402)
|
|
65
|
+
- **USDC on PEAQ** - Payments settle on PEAQ network (Chain ID 3338)
|
|
66
|
+
- **Price limits** - Set maximum price per request for safety
|
|
67
|
+
|
|
68
|
+
[Jump to Payment Flow API](#-payment-flow-api)
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## ✨ What's New in v2.0
|
|
73
|
+
|
|
74
|
+
Version 2.0 introduces powerful **room management** and **agent customization** capabilities:
|
|
75
|
+
|
|
76
|
+
### 🏠 Multi-Room Management
|
|
77
|
+
|
|
78
|
+
- **Create multiple rooms** for different contexts (crypto, gaming, research, etc.)
|
|
79
|
+
- **Update and delete** your owned rooms
|
|
80
|
+
- **Track room limits** based on your subscription tier
|
|
81
|
+
- **Invite members** to your rooms (coming soon)
|
|
82
|
+
|
|
83
|
+
### 🤖 Agent Room Management
|
|
84
|
+
|
|
85
|
+
- **Customize which agents** are available in each room
|
|
86
|
+
- **Add/remove agents** from your owned rooms
|
|
87
|
+
- **List room agents** with caching for performance
|
|
88
|
+
- **Real-time agent status updates** for room availability
|
|
89
|
+
|
|
90
|
+
### 📊 Enhanced APIs
|
|
91
|
+
|
|
92
|
+
- 8 new room management methods
|
|
93
|
+
- 8 new agent-room management methods
|
|
94
|
+
- 14 new events for room and agent operations
|
|
95
|
+
- Intelligent caching with 5-minute TTL
|
|
96
|
+
|
|
97
|
+
[Jump to Room Management API](#-room-management-api) | [Jump to Agent Room Management API](#-agent-room-management-api)
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
56
101
|
## How It Works
|
|
57
102
|
|
|
58
103
|
### 1. Agent Network Architecture
|
|
@@ -88,6 +133,7 @@ Unlike traditional APIs with API keys, Teneo uses **Ethereum wallet signatures**
|
|
|
88
133
|
```
|
|
89
134
|
|
|
90
135
|
This enables:
|
|
136
|
+
|
|
91
137
|
- 🔐 **No API keys to manage** - Your wallet IS your identity
|
|
92
138
|
|
|
93
139
|
---
|
|
@@ -104,23 +150,35 @@ pnpm run build
|
|
|
104
150
|
|
|
105
151
|
# Set credentials
|
|
106
152
|
export PRIVATE_KEY=your_private_key
|
|
107
|
-
export TENEO_WS_URL=wss://developer.chatroom.teneo-protocol.ai/ws
|
|
153
|
+
export TENEO_WS_URL=wss://backend.developer.chatroom.teneo-protocol.ai/ws
|
|
108
154
|
```
|
|
109
155
|
|
|
110
|
-
###
|
|
156
|
+
### Production Dashboard Example
|
|
157
|
+
|
|
158
|
+
The **Production Dashboard** is a comprehensive example showcasing **ALL SDK features** in a real-world web application:
|
|
111
159
|
|
|
112
160
|
```bash
|
|
113
|
-
|
|
161
|
+
pnpm example:dashboard
|
|
162
|
+
# or
|
|
163
|
+
cd examples/production-dashboard && bun run server.ts
|
|
114
164
|
```
|
|
115
165
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
- ✅ Room management
|
|
120
|
-
- ✅ Sending messages
|
|
121
|
-
- ✅ Event listeners
|
|
122
|
-
- ✅ Secure private key handling
|
|
166
|
+
Then open: **[http://localhost:3000](http://localhost:3000)**
|
|
167
|
+
|
|
168
|
+
**What it demonstrates:**
|
|
123
169
|
|
|
170
|
+
- ✅ **Full WebSocket Integration** - Connection, authentication, auto-reconnection
|
|
171
|
+
- ✅ **Room Management (v2.0)** - Create, update, delete rooms with ownership tracking
|
|
172
|
+
- ✅ **Agent-Room Management (v2.0)** - Add/remove agents, list room agents with caching
|
|
173
|
+
- ✅ **Message Sending** - Coordinator-based and direct agent commands
|
|
174
|
+
- ✅ **Real-time Updates** - Server-Sent Events (SSE) for live dashboard
|
|
175
|
+
- ✅ **Agent Discovery** - List agents with capabilities and status
|
|
176
|
+
- ✅ **Secure Private Key Handling** - AES-256-GCM encryption in memory
|
|
177
|
+
- ✅ **Webhook Integration** - Real-time event streaming with circuit breaker
|
|
178
|
+
- ✅ **Health Monitoring** - `/health` and `/metrics` endpoints
|
|
179
|
+
- ✅ **Complete Event System** - All SDK events with real-time UI updates
|
|
180
|
+
|
|
181
|
+
Built with **Hono** (fast web framework) and **Bun** (fast JavaScript runtime). See `examples/production-dashboard/README.md` for details.
|
|
124
182
|
|
|
125
183
|
---
|
|
126
184
|
|
|
@@ -139,14 +197,11 @@ const sdk = new TeneoSDK({
|
|
|
139
197
|
await sdk.connect();
|
|
140
198
|
|
|
141
199
|
// Wait for response (blocks until agent responds or timeout)
|
|
142
|
-
const response = await sdk.sendMessage(
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
format: "both" // Get both raw data and humanized text
|
|
148
|
-
}
|
|
149
|
-
);
|
|
200
|
+
const response = await sdk.sendMessage("Give me the last 5 tweets from @elonmusk?", {
|
|
201
|
+
waitForResponse: true,
|
|
202
|
+
timeout: 30000, // 30 seconds
|
|
203
|
+
format: "both" // Get both raw data and humanized text
|
|
204
|
+
});
|
|
150
205
|
|
|
151
206
|
console.log("Agent:", response.agentName);
|
|
152
207
|
console.log("Answer:", response.humanized);
|
|
@@ -184,7 +239,6 @@ console.log("Active rooms:", rooms);
|
|
|
184
239
|
// Output: Active rooms: ['Crawler Room', 'KOL tracker']
|
|
185
240
|
```
|
|
186
241
|
|
|
187
|
-
|
|
188
242
|
### Example 3: Webhook Integration
|
|
189
243
|
|
|
190
244
|
Receive agent responses via HTTP POST to your server:
|
|
@@ -221,7 +275,7 @@ const sdk = new TeneoSDK({
|
|
|
221
275
|
privateKey: process.env.PRIVATE_KEY!,
|
|
222
276
|
webhookUrl: "https://your-webhook.com/",
|
|
223
277
|
webhookHeaders: {
|
|
224
|
-
|
|
278
|
+
Authorization: "Bearer your-secret-token"
|
|
225
279
|
}
|
|
226
280
|
});
|
|
227
281
|
|
|
@@ -243,6 +297,465 @@ console.log("Circuit state:", status.circuitState); // OPEN/CLOSED/HALF_OPEN
|
|
|
243
297
|
|
|
244
298
|
---
|
|
245
299
|
|
|
300
|
+
## WebSocket Endpoints
|
|
301
|
+
|
|
302
|
+
The Teneo SDK supports two deployment environments via different WebSocket endpoints:
|
|
303
|
+
|
|
304
|
+
### Development Platform (Testing)
|
|
305
|
+
|
|
306
|
+
- **URL**: `wss://backend.developer.chatroom.teneo-protocol.ai/ws`
|
|
307
|
+
- **Whitelist**: Not required - open for testing
|
|
308
|
+
- **Use case**: Development, testing, and experimentation
|
|
309
|
+
|
|
310
|
+
**Configuration:**
|
|
311
|
+
```bash
|
|
312
|
+
# .env file
|
|
313
|
+
TENEO_WS_URL=wss://backend.developer.chatroom.teneo-protocol.ai/ws
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
### Production Platform (B2B)
|
|
317
|
+
|
|
318
|
+
- **URL**: `wss://backend.chatroom.teneo-protocol.ai/ws`
|
|
319
|
+
- **Whitelist**: **Required** - you must be whitelisted to use this endpoint
|
|
320
|
+
- **Use case**: Production applications and B2B integrations
|
|
321
|
+
- **Get access**: Request whitelist access at [https://teneo-protocol.ai/chat-room](https://teneo-protocol.ai/chat-room)
|
|
322
|
+
|
|
323
|
+
**Configuration:**
|
|
324
|
+
```bash
|
|
325
|
+
# .env file
|
|
326
|
+
TENEO_WS_URL=wss://backend.chatroom.teneo-protocol.ai/ws
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
|
|
330
|
+
> **Note**: The SDK uses the **development endpoint by default**. For production use, you need to be whitelisted and explicitly configure the production URL. Use the development endpoint for testing without restrictions.
|
|
331
|
+
|
|
332
|
+
---
|
|
333
|
+
## 🏠 Room Management API
|
|
334
|
+
|
|
335
|
+
Create and manage multiple rooms for different contexts and use cases.
|
|
336
|
+
|
|
337
|
+
### Creating Rooms
|
|
338
|
+
|
|
339
|
+
```typescript
|
|
340
|
+
// Create a new room
|
|
341
|
+
const room = await sdk.createRoom({
|
|
342
|
+
name: "Crypto Research",
|
|
343
|
+
description: "Room for crypto analysis"
|
|
344
|
+
});
|
|
345
|
+
console.log(`Created room: ${room.id}`);
|
|
346
|
+
|
|
347
|
+
// Check if you can create more rooms
|
|
348
|
+
if (sdk.canCreateRoom()) {
|
|
349
|
+
await sdk.createRoom({ name: "Gaming Room" });
|
|
350
|
+
} else {
|
|
351
|
+
console.log(`Room limit reached: ${sdk.getOwnedRoomCount()}/${sdk.getRoomLimit()}`);
|
|
352
|
+
}
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
### Querying Rooms
|
|
356
|
+
|
|
357
|
+
```typescript
|
|
358
|
+
// Get all owned rooms (rooms you created)
|
|
359
|
+
const ownedRooms = sdk.getOwnedRooms();
|
|
360
|
+
console.log(`You own ${ownedRooms.length} rooms:`);
|
|
361
|
+
ownedRooms.forEach((room) => {
|
|
362
|
+
console.log(` - ${room.name} (${room.is_public ? "Public" : "Private"})`);
|
|
363
|
+
});
|
|
364
|
+
|
|
365
|
+
// Get shared rooms (rooms you were invited to)
|
|
366
|
+
const sharedRooms = sdk.getSharedRooms();
|
|
367
|
+
console.log(`You have access to ${sharedRooms.length} shared rooms`);
|
|
368
|
+
|
|
369
|
+
// Get all rooms (owned + shared)
|
|
370
|
+
const allRooms = sdk.getAllRooms();
|
|
371
|
+
console.log(`Total rooms accessible: ${allRooms.length}`);
|
|
372
|
+
|
|
373
|
+
// Get specific room by ID
|
|
374
|
+
const room = sdk.getRoomById("room-123");
|
|
375
|
+
if (room) {
|
|
376
|
+
console.log(`Room: ${room.name}`);
|
|
377
|
+
console.log(`Created by: ${room.created_by}`);
|
|
378
|
+
console.log(`You are ${room.is_owner ? "owner" : "member"}`);
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
// Check room limits
|
|
382
|
+
console.log(`Room capacity: ${sdk.getOwnedRoomCount()}/${sdk.getRoomLimit()}`);
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
### Updating Rooms
|
|
386
|
+
|
|
387
|
+
```typescript
|
|
388
|
+
// Update room details (owner only)
|
|
389
|
+
const updated = await sdk.updateRoom("room-123", {
|
|
390
|
+
name: "Updated Room Name",
|
|
391
|
+
description: "New description"
|
|
392
|
+
});
|
|
393
|
+
|
|
394
|
+
console.log(`Room updated: ${updated.name}`);
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
### Deleting Rooms
|
|
398
|
+
|
|
399
|
+
```typescript
|
|
400
|
+
// Delete a room you own
|
|
401
|
+
await sdk.deleteRoom("room-123");
|
|
402
|
+
console.log("Room deleted");
|
|
403
|
+
|
|
404
|
+
// Listen for deletion events
|
|
405
|
+
sdk.on("room:deleted", (roomId) => {
|
|
406
|
+
console.log(`Room ${roomId} was deleted`);
|
|
407
|
+
});
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
### Room Events
|
|
411
|
+
|
|
412
|
+
```typescript
|
|
413
|
+
// Room lifecycle events
|
|
414
|
+
sdk.on("room:created", (room) => {
|
|
415
|
+
console.log(`✅ Created: ${room.name}`);
|
|
416
|
+
});
|
|
417
|
+
|
|
418
|
+
sdk.on("room:updated", (room) => {
|
|
419
|
+
console.log(`📝 Updated: ${room.name}`);
|
|
420
|
+
});
|
|
421
|
+
|
|
422
|
+
sdk.on("room:deleted", (roomId) => {
|
|
423
|
+
console.log(`🗑️ Deleted: ${roomId}`);
|
|
424
|
+
});
|
|
425
|
+
|
|
426
|
+
// Error handling
|
|
427
|
+
sdk.on("room:create_error", (error) => {
|
|
428
|
+
console.error(`Failed to create room: ${error.message}`);
|
|
429
|
+
});
|
|
430
|
+
|
|
431
|
+
sdk.on("room:update_error", (error, roomId) => {
|
|
432
|
+
console.error(`Failed to update room ${roomId}: ${error.message}`);
|
|
433
|
+
});
|
|
434
|
+
|
|
435
|
+
sdk.on("room:delete_error", (error, roomId) => {
|
|
436
|
+
console.error(`Failed to delete room ${roomId}: ${error.message}`);
|
|
437
|
+
});
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
---
|
|
441
|
+
|
|
442
|
+
## 🤖 Agent Room Management API
|
|
443
|
+
|
|
444
|
+
Customize which agents are available in each of your rooms.
|
|
445
|
+
|
|
446
|
+
### Adding Agents to Rooms
|
|
447
|
+
|
|
448
|
+
```typescript
|
|
449
|
+
// Add an agent to your room (owner only)
|
|
450
|
+
await sdk.addAgentToRoom("room-123", "agent-456");
|
|
451
|
+
console.log("Agent added to room");
|
|
452
|
+
|
|
453
|
+
// Listen for confirmation
|
|
454
|
+
sdk.on("agent_room:agent_added", (roomId, agentId) => {
|
|
455
|
+
console.log(`✅ Agent ${agentId} added to room ${roomId}`);
|
|
456
|
+
});
|
|
457
|
+
```
|
|
458
|
+
|
|
459
|
+
### Removing Agents from Rooms
|
|
460
|
+
|
|
461
|
+
```typescript
|
|
462
|
+
// Remove an agent from your room (owner only)
|
|
463
|
+
await sdk.removeAgentFromRoom("room-123", "agent-456");
|
|
464
|
+
console.log("Agent removed from room");
|
|
465
|
+
|
|
466
|
+
// Listen for confirmation
|
|
467
|
+
sdk.on("agent_room:agent_removed", (roomId, agentId) => {
|
|
468
|
+
console.log(`🗑️ Agent ${agentId} removed from room ${roomId}`);
|
|
469
|
+
});
|
|
470
|
+
```
|
|
471
|
+
|
|
472
|
+
### Listing Room Agents
|
|
473
|
+
|
|
474
|
+
```typescript
|
|
475
|
+
// List all agents in a room (with 5-minute cache)
|
|
476
|
+
const roomAgents = await sdk.listRoomAgents("room-123");
|
|
477
|
+
console.log(`${roomAgents.length} agents in this room:`);
|
|
478
|
+
roomAgents.forEach((agent) => {
|
|
479
|
+
console.log(` - ${agent.agent_name} (${agent.status})`);
|
|
480
|
+
if (agent.capabilities) {
|
|
481
|
+
console.log(` Capabilities: ${agent.capabilities.map((c) => c.name).join(", ")}`);
|
|
482
|
+
}
|
|
483
|
+
});
|
|
484
|
+
|
|
485
|
+
// Force refresh (bypass cache)
|
|
486
|
+
const freshAgents = await sdk.listRoomAgents("room-123", false);
|
|
487
|
+
```
|
|
488
|
+
|
|
489
|
+
### Listing Available Agents
|
|
490
|
+
|
|
491
|
+
```typescript
|
|
492
|
+
// List agents NOT yet in the room (available to add)
|
|
493
|
+
const available = await sdk.listAvailableAgents("room-123");
|
|
494
|
+
console.log(`${available.length} agents available to add:`);
|
|
495
|
+
available.forEach((agent) => {
|
|
496
|
+
console.log(` - ${agent.agent_name}`);
|
|
497
|
+
if (agent.description) {
|
|
498
|
+
console.log(` ${agent.description}`);
|
|
499
|
+
}
|
|
500
|
+
});
|
|
501
|
+
```
|
|
502
|
+
|
|
503
|
+
### Query Methods (Synchronous - from cache)
|
|
504
|
+
|
|
505
|
+
```typescript
|
|
506
|
+
// Check if specific agent is in room (instant, no network call)
|
|
507
|
+
const isInRoom = sdk.isAgentInRoom("room-123", "agent-456");
|
|
508
|
+
if (isInRoom === true) {
|
|
509
|
+
console.log("Agent is in the room");
|
|
510
|
+
} else if (isInRoom === false) {
|
|
511
|
+
console.log("Agent is NOT in the room");
|
|
512
|
+
} else {
|
|
513
|
+
console.log("Cache not available - call listRoomAgents() first");
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
// Get room agent count (instant)
|
|
517
|
+
const count = sdk.getRoomAgentCount("room-123");
|
|
518
|
+
if (count !== undefined) {
|
|
519
|
+
console.log(`Room has ${count} agents`);
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
// Get cached room agents (instant)
|
|
523
|
+
const cached = sdk.getRoomAgents("room-123");
|
|
524
|
+
if (cached) {
|
|
525
|
+
console.log("Agents:", cached.map((a) => a.agent_name).join(", "));
|
|
526
|
+
} else {
|
|
527
|
+
console.log("No cached data - call listRoomAgents() first");
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
// Get cached available agents (instant)
|
|
531
|
+
const cachedAvailable = sdk.getAvailableAgents("room-123");
|
|
532
|
+
```
|
|
533
|
+
|
|
534
|
+
### Cache Management
|
|
535
|
+
|
|
536
|
+
```typescript
|
|
537
|
+
// Caching behavior:
|
|
538
|
+
// - listRoomAgents() and listAvailableAgents() cache results for 5 minutes
|
|
539
|
+
// - Cache automatically invalidated when you add/remove agents
|
|
540
|
+
// - Cache automatically invalidated on agent status updates
|
|
541
|
+
|
|
542
|
+
// Manual cache invalidation (if needed)
|
|
543
|
+
sdk.invalidateAgentRoomCache("room-123");
|
|
544
|
+
console.log("Cache cleared for room-123");
|
|
545
|
+
```
|
|
546
|
+
|
|
547
|
+
### Agent Room Events
|
|
548
|
+
|
|
549
|
+
```typescript
|
|
550
|
+
// Agent add/remove events
|
|
551
|
+
sdk.on("agent_room:agent_added", (roomId, agentId) => {
|
|
552
|
+
console.log(`✅ Agent ${agentId} added to ${roomId}`);
|
|
553
|
+
});
|
|
554
|
+
|
|
555
|
+
sdk.on("agent_room:agent_removed", (roomId, agentId) => {
|
|
556
|
+
console.log(`🗑️ Agent ${agentId} removed from ${roomId}`);
|
|
557
|
+
});
|
|
558
|
+
|
|
559
|
+
// List events
|
|
560
|
+
sdk.on("agent_room:agents_listed", (roomId, agents) => {
|
|
561
|
+
console.log(`📋 ${agents.length} agents in room ${roomId}`);
|
|
562
|
+
});
|
|
563
|
+
|
|
564
|
+
sdk.on("agent_room:available_agents_listed", (agents) => {
|
|
565
|
+
console.log(`📋 ${agents.length} agents available to add`);
|
|
566
|
+
});
|
|
567
|
+
|
|
568
|
+
// Status updates (real-time)
|
|
569
|
+
sdk.on("agent_room:status_update", (data) => {
|
|
570
|
+
console.log(`🔄 Agent ${data.agentId} status updated in room ${data.roomId}`);
|
|
571
|
+
console.log(` New status: ${data.status}`);
|
|
572
|
+
});
|
|
573
|
+
|
|
574
|
+
// Error handling
|
|
575
|
+
sdk.on("agent_room:add_error", (error, roomId) => {
|
|
576
|
+
console.error(`Failed to add agent to ${roomId}: ${error.message}`);
|
|
577
|
+
});
|
|
578
|
+
|
|
579
|
+
sdk.on("agent_room:remove_error", (error, roomId) => {
|
|
580
|
+
console.error(`Failed to remove agent from ${roomId}: ${error.message}`);
|
|
581
|
+
});
|
|
582
|
+
|
|
583
|
+
sdk.on("agent_room:list_error", (error, roomId) => {
|
|
584
|
+
console.error(`Failed to list agents in ${roomId}: ${error.message}`);
|
|
585
|
+
});
|
|
586
|
+
|
|
587
|
+
sdk.on("agent_room:list_available_error", (error, roomId) => {
|
|
588
|
+
console.error(`Failed to list available agents for ${roomId}: ${error.message}`);
|
|
589
|
+
});
|
|
590
|
+
```
|
|
591
|
+
|
|
592
|
+
### Complete Example: Room Setup
|
|
593
|
+
|
|
594
|
+
```typescript
|
|
595
|
+
// Complete workflow: Create room and customize agents
|
|
596
|
+
async function setupCustomRoom() {
|
|
597
|
+
// 1. Create a new room
|
|
598
|
+
const room = await sdk.createRoom({
|
|
599
|
+
name: "My Custom Room",
|
|
600
|
+
description: "Specialized agent room"
|
|
601
|
+
});
|
|
602
|
+
console.log(`✅ Created room: ${room.id}`);
|
|
603
|
+
|
|
604
|
+
// 2. See what agents are available
|
|
605
|
+
const available = await sdk.listAvailableAgents(room.id);
|
|
606
|
+
console.log(`${available.length} agents available`);
|
|
607
|
+
|
|
608
|
+
// 3. Add specific agents you want
|
|
609
|
+
const cryptoAgent = available.find((a) => a.agent_name?.includes("Crypto"));
|
|
610
|
+
if (cryptoAgent) {
|
|
611
|
+
await sdk.addAgentToRoom(room.id, cryptoAgent.agent_id);
|
|
612
|
+
console.log(`✅ Added ${cryptoAgent.agent_name}`);
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
const analyticsAgent = available.find((a) => a.agent_name?.includes("Analytics"));
|
|
616
|
+
if (analyticsAgent) {
|
|
617
|
+
await sdk.addAgentToRoom(room.id, analyticsAgent.agent_id);
|
|
618
|
+
console.log(`✅ Added ${analyticsAgent.agent_name}`);
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
// 4. Verify room configuration
|
|
622
|
+
const roomAgents = await sdk.listRoomAgents(room.id);
|
|
623
|
+
console.log(`\n🎯 Room configured with ${roomAgents.length} agents:`);
|
|
624
|
+
roomAgents.forEach((agent) => {
|
|
625
|
+
console.log(` - ${agent.agent_name}`);
|
|
626
|
+
});
|
|
627
|
+
|
|
628
|
+
// 5. Now send messages to this room
|
|
629
|
+
await sdk.sendMessage("Analyze BTC price trends", { room: room.id });
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
setupCustomRoom();
|
|
633
|
+
```
|
|
634
|
+
|
|
635
|
+
---
|
|
636
|
+
|
|
637
|
+
## 💰 Payment Flow API
|
|
638
|
+
|
|
639
|
+
The SDK supports automatic micropayments to AI agents using the x402 protocol.
|
|
640
|
+
|
|
641
|
+
### Basic Usage (Auto-Approve)
|
|
642
|
+
|
|
643
|
+
```typescript
|
|
644
|
+
import { TeneoSDK } from "@teneo-protocol/sdk";
|
|
645
|
+
|
|
646
|
+
// Enable payments with auto-approve
|
|
647
|
+
const sdk = new TeneoSDK(
|
|
648
|
+
TeneoSDK.builder()
|
|
649
|
+
.withWebSocketUrl("wss://backend.developer.chatroom.teneo-protocol.ai/ws")
|
|
650
|
+
.withAuthentication(process.env.PRIVATE_KEY!)
|
|
651
|
+
.withPayments({
|
|
652
|
+
autoApprove: true, // Automatically approve quotes
|
|
653
|
+
maxPricePerRequest: 1000000 // Max 1 USDC per request (in micro-units)
|
|
654
|
+
})
|
|
655
|
+
.build()
|
|
656
|
+
);
|
|
657
|
+
|
|
658
|
+
await sdk.connect();
|
|
659
|
+
|
|
660
|
+
// Send message - payment handled automatically
|
|
661
|
+
const response = await sdk.sendMessage("@x-agent-enterprise-v2 user @elonmusk", {
|
|
662
|
+
room: roomId,
|
|
663
|
+
waitForResponse: true
|
|
664
|
+
});
|
|
665
|
+
|
|
666
|
+
console.log(response.humanized);
|
|
667
|
+
// Output: User profile for @elonmusk...
|
|
668
|
+
```
|
|
669
|
+
|
|
670
|
+
### Direct Agent Commands
|
|
671
|
+
|
|
672
|
+
```typescript
|
|
673
|
+
// Target a specific agent directly
|
|
674
|
+
await sdk.sendMessage("@x-agent-enterprise-v2 timeline @elonmusk 5", {
|
|
675
|
+
room: roomId,
|
|
676
|
+
waitForResponse: true
|
|
677
|
+
});
|
|
678
|
+
|
|
679
|
+
// Let the coordinator choose the best agent
|
|
680
|
+
await sdk.sendMessage("Get me the latest tweets from @elonmusk", {
|
|
681
|
+
room: roomId,
|
|
682
|
+
waitForResponse: true
|
|
683
|
+
});
|
|
684
|
+
```
|
|
685
|
+
|
|
686
|
+
### Payment Events
|
|
687
|
+
|
|
688
|
+
```typescript
|
|
689
|
+
// Quote received from agent
|
|
690
|
+
sdk.on("quote:received", (quote) => {
|
|
691
|
+
console.log(`Quote: ${quote.data.pricing.pricePerUnit} USDC`);
|
|
692
|
+
console.log(`Agent: ${quote.data.agent_name}`);
|
|
693
|
+
console.log(`Expires: ${quote.data.expires_at}`);
|
|
694
|
+
});
|
|
695
|
+
|
|
696
|
+
// Payment attached to request
|
|
697
|
+
sdk.on("payment:attached", (data) => {
|
|
698
|
+
console.log(`Paid ${data.amount / 1_000_000} USDC to ${data.agentId}`);
|
|
699
|
+
});
|
|
700
|
+
|
|
701
|
+
// Payment errors
|
|
702
|
+
sdk.on("payment:error", (error) => {
|
|
703
|
+
console.error(`Payment failed: ${error.message}`);
|
|
704
|
+
});
|
|
705
|
+
```
|
|
706
|
+
|
|
707
|
+
### Manual Quote Approval
|
|
708
|
+
|
|
709
|
+
```typescript
|
|
710
|
+
const sdk = new TeneoSDK(
|
|
711
|
+
TeneoSDK.builder()
|
|
712
|
+
.withWebSocketUrl("wss://...")
|
|
713
|
+
.withAuthentication(privateKey)
|
|
714
|
+
.withPayments({
|
|
715
|
+
autoApprove: false // Require manual approval
|
|
716
|
+
})
|
|
717
|
+
.build()
|
|
718
|
+
);
|
|
719
|
+
|
|
720
|
+
// Listen for quotes
|
|
721
|
+
sdk.on("quote:received", async (quote) => {
|
|
722
|
+
const price = quote.data.pricing.pricePerUnit;
|
|
723
|
+
|
|
724
|
+
// Check price before approving
|
|
725
|
+
if (price <= 0.01) {
|
|
726
|
+
// Approve and send payment
|
|
727
|
+
await sdk.confirmQuote(quote.data.task_id);
|
|
728
|
+
} else {
|
|
729
|
+
console.log(`Quote too expensive: $${price}`);
|
|
730
|
+
}
|
|
731
|
+
});
|
|
732
|
+
|
|
733
|
+
// Request triggers quote
|
|
734
|
+
await sdk.sendMessage("@x-agent user @elonmusk", { room: roomId });
|
|
735
|
+
```
|
|
736
|
+
|
|
737
|
+
### Payment Flow Diagram
|
|
738
|
+
|
|
739
|
+
```
|
|
740
|
+
Your App Teneo Backend Agent
|
|
741
|
+
│ │ │
|
|
742
|
+
│──── request_task ──────────>│ │
|
|
743
|
+
│ │────── select agent ─────>│
|
|
744
|
+
│<───── task_quote ───────────│<────── pricing ──────────│
|
|
745
|
+
│ │ │
|
|
746
|
+
│ [Auto-approve or manual] │ │
|
|
747
|
+
│ │ │
|
|
748
|
+
│──── confirm_task ──────────>│ │
|
|
749
|
+
│ + x402 payment header │────── execute task ─────>│
|
|
750
|
+
│ │ │
|
|
751
|
+
│<───── task_response ────────│<────── response ─────────│
|
|
752
|
+
│ │ │
|
|
753
|
+
│ │──── settle payment ─────>│
|
|
754
|
+
└ └ └
|
|
755
|
+
```
|
|
756
|
+
|
|
757
|
+
---
|
|
758
|
+
|
|
246
759
|
## 🎨 Event System
|
|
247
760
|
|
|
248
761
|
The SDK is fully event-driven. Subscribe to what matters:
|
|
@@ -254,7 +767,9 @@ sdk.on("connection:open", () => console.log("🔌 WebSocket connected"));
|
|
|
254
767
|
sdk.on("connection:close", (code, reason) => console.log(`❌ Disconnected: ${reason}`));
|
|
255
768
|
sdk.on("connection:reconnecting", (attempt) => console.log(`🔄 Reconnecting (attempt ${attempt})`));
|
|
256
769
|
|
|
257
|
-
sdk.on("auth:challenge", (challenge) =>
|
|
770
|
+
sdk.on("auth:challenge", (challenge) =>
|
|
771
|
+
console.log("🔐 Challenge received, signing with wallet...")
|
|
772
|
+
);
|
|
258
773
|
sdk.on("auth:success", (state) => {
|
|
259
774
|
console.log(`✅ Authenticated as ${state.walletAddress}`);
|
|
260
775
|
console.log(`Whitelisted: ${state.isWhitelisted}`);
|
|
@@ -277,7 +792,7 @@ sdk.on("agent:response", (response) => {
|
|
|
277
792
|
|
|
278
793
|
sdk.on("agent:list", (agents) => {
|
|
279
794
|
console.log(`📋 Agent list updated: ${agents.length} agents available`);
|
|
280
|
-
agents.forEach(agent => {
|
|
795
|
+
agents.forEach((agent) => {
|
|
281
796
|
console.log(` - ${agent.name}: ${agent.capabilities?.join(", ")}`);
|
|
282
797
|
});
|
|
283
798
|
});
|
|
@@ -304,7 +819,7 @@ sdk.on("room:unsubscribed", (data) => {
|
|
|
304
819
|
|
|
305
820
|
```typescript
|
|
306
821
|
const sdk = new TeneoSDK({
|
|
307
|
-
wsUrl: "wss://developer.chatroom.teneo-protocol.ai/ws",
|
|
822
|
+
wsUrl: "wss://backend.developer.chatroom.teneo-protocol.ai/ws",
|
|
308
823
|
privateKey: "your_key", // No 0x prefix
|
|
309
824
|
defaultRoom: "general",
|
|
310
825
|
reconnect: true,
|
|
@@ -322,7 +837,7 @@ const secureKey = new SecurePrivateKey(process.env.PRIVATE_KEY!);
|
|
|
322
837
|
|
|
323
838
|
const config = new SDKConfigBuilder()
|
|
324
839
|
// Required
|
|
325
|
-
.withWebSocketUrl("wss://developer.chatroom.teneo-protocol.ai/ws")
|
|
840
|
+
.withWebSocketUrl("wss://backend.developer.chatroom.teneo-protocol.ai/ws")
|
|
326
841
|
.withAuthentication(secureKey) // Encrypted key
|
|
327
842
|
|
|
328
843
|
// Rooms
|
|
@@ -331,15 +846,15 @@ const config = new SDKConfigBuilder()
|
|
|
331
846
|
// Reconnection strategy
|
|
332
847
|
.withReconnectionStrategy({
|
|
333
848
|
type: "exponential",
|
|
334
|
-
baseDelay: 3000,
|
|
335
|
-
maxDelay: 120000,
|
|
849
|
+
baseDelay: 3000, // Start at 3 seconds
|
|
850
|
+
maxDelay: 120000, // Cap at 2 minutes
|
|
336
851
|
maxAttempts: 20,
|
|
337
|
-
jitter: true
|
|
852
|
+
jitter: true // Prevent thundering herd
|
|
338
853
|
})
|
|
339
854
|
|
|
340
855
|
// Webhook with retry
|
|
341
856
|
.withWebhook("https://your-server.com/webhook", {
|
|
342
|
-
|
|
857
|
+
Authorization: "Bearer token"
|
|
343
858
|
})
|
|
344
859
|
.withWebhookRetryStrategy({
|
|
345
860
|
type: "exponential",
|
|
@@ -350,7 +865,7 @@ const config = new SDKConfigBuilder()
|
|
|
350
865
|
|
|
351
866
|
// Response formatting
|
|
352
867
|
.withResponseFormat({
|
|
353
|
-
format: "both",
|
|
868
|
+
format: "both", // 'raw' | 'humanized' | 'both'
|
|
354
869
|
includeMetadata: true
|
|
355
870
|
})
|
|
356
871
|
|
|
@@ -362,7 +877,7 @@ const config = new SDKConfigBuilder()
|
|
|
362
877
|
})
|
|
363
878
|
|
|
364
879
|
// Performance
|
|
365
|
-
.withRateLimit(10, 20)
|
|
880
|
+
.withRateLimit(10, 20) // 10 msg/sec, burst 20
|
|
366
881
|
.withMessageDeduplication(true, 60000, 10000)
|
|
367
882
|
.withLogging("debug")
|
|
368
883
|
|
|
@@ -376,7 +891,7 @@ const sdk = new TeneoSDK(config);
|
|
|
376
891
|
Create `.env`:
|
|
377
892
|
|
|
378
893
|
```bash
|
|
379
|
-
TENEO_WS_URL=wss://developer.chatroom.teneo-protocol.ai/ws
|
|
894
|
+
TENEO_WS_URL=wss://backend.developer.chatroom.teneo-protocol.ai/ws
|
|
380
895
|
PRIVATE_KEY=your_private_key_without_0x
|
|
381
896
|
WALLET_ADDRESS=0xYourWalletAddress
|
|
382
897
|
DEFAULT_ROOM=general
|
|
@@ -448,11 +963,11 @@ console.log("Circuit state:", status.circuitState);
|
|
|
448
963
|
|
|
449
964
|
Configurable exponential backoff, linear, or constant delays:
|
|
450
965
|
|
|
451
|
-
| Strategy
|
|
452
|
-
|
|
453
|
-
| **Exponential** | `base * mult^attempt` | 2s, 4s, 8s, 16s, 32s
|
|
454
|
-
| **Linear**
|
|
455
|
-
| **Constant**
|
|
966
|
+
| Strategy | Formula | Example (base=2s, mult=2) |
|
|
967
|
+
| --------------- | --------------------- | ------------------------- |
|
|
968
|
+
| **Exponential** | `base * mult^attempt` | 2s, 4s, 8s, 16s, 32s |
|
|
969
|
+
| **Linear** | `base * attempt` | 2s, 4s, 6s, 8s, 10s |
|
|
970
|
+
| **Constant** | `base` | 2s, 2s, 2s, 2s, 2s |
|
|
456
971
|
|
|
457
972
|
```typescript
|
|
458
973
|
const config = new SDKConfigBuilder()
|
|
@@ -461,7 +976,7 @@ const config = new SDKConfigBuilder()
|
|
|
461
976
|
baseDelay: 3000,
|
|
462
977
|
maxDelay: 120000,
|
|
463
978
|
maxAttempts: 20,
|
|
464
|
-
jitter: true
|
|
979
|
+
jitter: true // Add 0-1000ms randomness
|
|
465
980
|
})
|
|
466
981
|
.build();
|
|
467
982
|
```
|
|
@@ -473,9 +988,9 @@ Prevents duplicate message processing with TTL-based cache:
|
|
|
473
988
|
```typescript
|
|
474
989
|
const config = new SDKConfigBuilder()
|
|
475
990
|
.withMessageDeduplication(
|
|
476
|
-
true,
|
|
477
|
-
300000,
|
|
478
|
-
10000
|
|
991
|
+
true, // Enable
|
|
992
|
+
300000, // 5 minute TTL
|
|
993
|
+
10000 // Cache up to 10k message IDs
|
|
479
994
|
)
|
|
480
995
|
.build();
|
|
481
996
|
|
|
@@ -569,6 +1084,7 @@ if (dedup) {
|
|
|
569
1084
|
### Issue: "ERR_REQUIRE_ESM" Error
|
|
570
1085
|
|
|
571
1086
|
**Problem:**
|
|
1087
|
+
|
|
572
1088
|
```
|
|
573
1089
|
Error [ERR_REQUIRE_ESM]: require() of ES Module node-fetch not supported
|
|
574
1090
|
```
|
|
@@ -585,6 +1101,7 @@ npx ts-node your-app.ts
|
|
|
585
1101
|
```
|
|
586
1102
|
|
|
587
1103
|
**Alternative:** Install node-fetch v2:
|
|
1104
|
+
|
|
588
1105
|
```bash
|
|
589
1106
|
npm install node-fetch@2.7.0
|
|
590
1107
|
npm run build
|
|
@@ -596,19 +1113,22 @@ npm run build
|
|
|
596
1113
|
|
|
597
1114
|
**Solutions:**
|
|
598
1115
|
|
|
599
|
-
1. **Check private key format (64 hex characters,
|
|
1116
|
+
1. **Check private key format (64 hex characters, + 0x prefix):**
|
|
1117
|
+
|
|
600
1118
|
```typescript
|
|
601
|
-
// ✅ Good
|
|
602
|
-
privateKey: "
|
|
1119
|
+
// ✅ Good - 64 hex characters after 0x prefix
|
|
1120
|
+
privateKey: "0x1234567890123456789012345678901234567890123456789012345678901234";
|
|
603
1121
|
```
|
|
604
1122
|
|
|
605
1123
|
2. **Verify key length:**
|
|
1124
|
+
|
|
606
1125
|
```bash
|
|
607
1126
|
echo -n "your_key" | wc -c
|
|
608
|
-
# Should output: 64
|
|
1127
|
+
# Should output: 64 + 0x prefix
|
|
609
1128
|
```
|
|
610
1129
|
|
|
611
1130
|
3. **Enable debug logging:**
|
|
1131
|
+
|
|
612
1132
|
```typescript
|
|
613
1133
|
const sdk = new TeneoSDK({
|
|
614
1134
|
wsUrl: "...",
|
|
@@ -620,6 +1140,7 @@ npm run build
|
|
|
620
1140
|
### Issue: Rate Limiting
|
|
621
1141
|
|
|
622
1142
|
**Problem:**
|
|
1143
|
+
|
|
623
1144
|
```
|
|
624
1145
|
RateLimitError: Rate limit exceeded
|
|
625
1146
|
```
|
|
@@ -630,7 +1151,7 @@ RateLimitError: Rate limit exceeded
|
|
|
630
1151
|
```typescript
|
|
631
1152
|
for (const message of messages) {
|
|
632
1153
|
await sdk.sendMessage(message);
|
|
633
|
-
await new Promise(r => setTimeout(r, 200)); // 200ms delay
|
|
1154
|
+
await new Promise((r) => setTimeout(r, 200)); // 200ms delay
|
|
634
1155
|
}
|
|
635
1156
|
```
|
|
636
1157
|
|
|
@@ -639,16 +1160,18 @@ RateLimitError: Rate limit exceeded
|
|
|
639
1160
|
**Solutions:**
|
|
640
1161
|
|
|
641
1162
|
1. **Verify HTTPS (except localhost):**
|
|
1163
|
+
|
|
642
1164
|
```typescript
|
|
643
1165
|
// ✅ Good
|
|
644
|
-
webhookUrl: "https://your-server.com/webhook"
|
|
645
|
-
webhookUrl: "http://localhost:3000/webhook"
|
|
1166
|
+
webhookUrl: "https://your-server.com/webhook";
|
|
1167
|
+
webhookUrl: "http://localhost:3000/webhook";
|
|
646
1168
|
|
|
647
1169
|
// ❌ Bad
|
|
648
|
-
webhookUrl: "http://your-server.com/webhook"
|
|
1170
|
+
webhookUrl: "http://your-server.com/webhook";
|
|
649
1171
|
```
|
|
650
1172
|
|
|
651
1173
|
2. **Test manually:**
|
|
1174
|
+
|
|
652
1175
|
```bash
|
|
653
1176
|
curl -X POST https://your-server.com/webhook \
|
|
654
1177
|
-H "Content-Type: application/json" \
|
|
@@ -676,8 +1199,9 @@ npm run test:integration # Integration tests
|
|
|
676
1199
|
```
|
|
677
1200
|
|
|
678
1201
|
**Test Results:**
|
|
679
|
-
|
|
680
|
-
- ✅
|
|
1202
|
+
|
|
1203
|
+
- ✅ 671 unit tests passing
|
|
1204
|
+
- ✅ 100% pass rate (Phase 0-2 complete)
|
|
681
1205
|
- ✅ Comprehensive coverage
|
|
682
1206
|
|
|
683
1207
|
---
|
|
@@ -701,7 +1225,6 @@ We welcome contributions!
|
|
|
701
1225
|
|
|
702
1226
|
AGPL-3.0 License
|
|
703
1227
|
|
|
704
|
-
|
|
705
1228
|
<div align="center">
|
|
706
1229
|
|
|
707
1230
|
**Built with ❤️ by the [Teneo Team](https://teneo.pro)**
|