@teneo-protocol/sdk 2.0.0 → 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 +1 -0
- package/.github/workflows/push-to-main.yml +1 -1
- package/.github/workflows/top-issue.yml +102 -0
- package/CHANGELOG.md +69 -0
- package/CONCEPTS.md +747 -0
- package/README.md +178 -8
- package/dist/constants.js +8 -8
- package/dist/constants.js.map +1 -1
- package/dist/core/websocket-client.d.ts +15 -3
- package/dist/core/websocket-client.d.ts.map +1 -1
- package/dist/core/websocket-client.js +52 -13
- 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.map +1 -1
- package/dist/handlers/message-handlers/agent-room-operation-response-handler.js +2 -5
- package/dist/handlers/message-handlers/agent-room-operation-response-handler.js.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 +783 -0
- package/dist/handlers/message-handlers/agent-status-update-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/agent-status-update-handler.js +2 -5
- package/dist/handlers/message-handlers/agent-status-update-handler.js.map +1 -1
- 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.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.map +1 -1
- package/dist/handlers/message-handlers/auth-message-handler.js +6 -5
- package/dist/handlers/message-handlers/auth-message-handler.js.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.map +1 -1
- package/dist/handlers/message-handlers/auth-success-handler.js +6 -5
- 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.js +3 -2
- package/dist/handlers/message-handlers/challenge-handler.js.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 +6 -0
- package/dist/handlers/message-handlers/index.d.ts.map +1 -1
- package/dist/handlers/message-handlers/index.js +33 -1
- package/dist/handlers/message-handlers/index.js.map +1 -1
- package/dist/handlers/message-handlers/list-available-agents-handler.d.ts +783 -0
- package/dist/handlers/message-handlers/list-available-agents-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/list-available-agents-handler.js +2 -5
- package/dist/handlers/message-handlers/list-available-agents-handler.js.map +1 -1
- package/dist/handlers/message-handlers/list-room-agents-handler.d.ts +783 -0
- package/dist/handlers/message-handlers/list-room-agents-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/list-room-agents-handler.js +2 -5
- package/dist/handlers/message-handlers/list-room-agents-handler.js.map +1 -1
- package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts +2 -199
- 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.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.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.map +1 -1
- package/dist/handlers/message-handlers/room-operation-response-handler.js +2 -5
- package/dist/handlers/message-handlers/room-operation-response-handler.js.map +1 -1
- 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 -9
- package/dist/handlers/message-handlers/types.d.ts.map +1 -1
- 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 +1 -7
- package/dist/managers/agent-room-manager.d.ts.map +1 -1
- package/dist/managers/agent-room-manager.js +83 -36
- package/dist/managers/agent-room-manager.js.map +1 -1
- package/dist/managers/connection-manager.js +2 -0
- package/dist/managers/connection-manager.js.map +1 -1
- package/dist/managers/index.d.ts +2 -1
- package/dist/managers/index.d.ts.map +1 -1
- package/dist/managers/index.js +3 -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.map +1 -1
- package/dist/managers/room-management-manager.js +9 -7
- package/dist/managers/room-management-manager.js.map +1 -1
- package/dist/managers/room-manager.d.ts +7 -5
- 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 +135 -21
- package/dist/teneo-sdk.d.ts.map +1 -1
- package/dist/teneo-sdk.js +268 -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 +79 -8
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +62 -5
- package/dist/types/config.js.map +1 -1
- package/dist/types/error-codes.d.ts +8 -0
- package/dist/types/error-codes.d.ts.map +1 -1
- package/dist/types/error-codes.js +9 -0
- package/dist/types/error-codes.js.map +1 -1
- package/dist/types/events.d.ts +44 -0
- 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 +33 -3
- package/dist/types/index.js.map +1 -1
- package/dist/types/messages.d.ts +11219 -423
- package/dist/types/messages.d.ts.map +1 -1
- package/dist/types/messages.js +249 -7
- 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 +1 -1
- package/examples/agent-room-management-example.ts +10 -9
- package/examples/basic-usage.ts +3 -4
- package/examples/claude-agent-x-follower/.env.example +1 -1
- package/examples/claude-agent-x-follower/QUICKSTART.md +2 -2
- package/examples/claude-agent-x-follower/README.md +2 -2
- package/examples/claude-agent-x-follower/index.ts +120 -96
- package/examples/n8n-teneo/.env.example +1 -1
- package/examples/n8n-teneo/README.md +1 -1
- 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 +1 -1
- package/examples/openai-teneo/README.md +2 -2
- package/examples/openai-teneo/index.ts +82 -71
- package/examples/production-dashboard/.env.example +1 -1
- package/examples/production-dashboard/README.md +1 -1
- package/examples/production-dashboard/server.ts +2 -2
- package/examples/room-management-example.ts +5 -8
- package/examples/usage/.env.example +1 -1
- 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/webhook-integration.ts +1 -1
- package/examples/x-influencer-battle-server.ts +2 -2
- package/package.json +4 -1
- package/src/core/websocket-client.test.ts +8 -3
- package/src/core/websocket-client.ts +36 -6
- 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 +2 -8
- package/src/handlers/message-handlers/agent-status-update-handler.ts +3 -9
- package/src/handlers/message-handlers/all-agents-response-handler.ts +39 -0
- package/src/handlers/message-handlers/auth-message-handler.ts +5 -0
- package/src/handlers/message-handlers/auth-success-handler.ts +6 -1
- package/src/handlers/message-handlers/base-handler.ts +20 -7
- package/src/handlers/message-handlers/index.ts +34 -0
- package/src/handlers/message-handlers/list-room-agents-handler.ts +2 -5
- 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 +3 -6
- 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 +37 -9
- 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 +98 -42
- package/src/managers/index.ts +13 -1
- package/src/managers/message-router.ts +215 -17
- package/src/managers/room-management-manager.ts +4 -7
- package/src/managers/room-manager.ts +11 -15
- package/src/payments/index.ts +22 -0
- package/src/payments/payment-client.ts +240 -0
- package/src/teneo-sdk.ts +302 -27
- package/src/types/categories.ts +45 -0
- package/src/types/config.ts +70 -2
- package/src/types/error-codes.ts +10 -0
- package/src/types/events.test.ts +1 -0
- package/src/types/events.ts +43 -0
- package/src/types/index.ts +56 -0
- package/src/types/messages.test.ts +2 -1
- package/src/types/messages.ts +307 -5
- 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 +10 -8
- package/tests/integration/websocket.test.ts +4 -1
- package/tests/payment-flow-test.ts +147 -0
- package/tests/unit/handlers/agent-room-operation-response-handler.test.ts +17 -29
- package/tests/unit/handlers/agent-status-update-handler.test.ts +2 -6
- package/tests/unit/handlers/auth-success-handler-rooms.test.ts +1 -3
- package/tests/unit/handlers/list-available-agents-handler.test.ts +4 -12
- package/tests/unit/handlers/list-room-agents-handler.test.ts +2 -6
- package/tests/unit/handlers/room-operation-response-handler.test.ts +9 -36
- package/tests/unit/managers/agent-room-manager.test.ts +9 -16
- package/tests/unit/managers/room-management-manager.test.ts +21 -39
- package/tsconfig.json +2 -2
- package/vitest.config.ts +1 -0
package/CONCEPTS.md
ADDED
|
@@ -0,0 +1,747 @@
|
|
|
1
|
+
# Teneo SDK - Core Concepts
|
|
2
|
+
|
|
3
|
+
This guide explains how the Teneo Protocol works under the hood. Understanding these concepts will help you build better applications.
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
|
|
7
|
+
- [Overview](#overview)
|
|
8
|
+
- [Authentication](#authentication)
|
|
9
|
+
- [Rooms](#rooms)
|
|
10
|
+
- [The Coordinator](#the-coordinator)
|
|
11
|
+
- [Agents](#agents)
|
|
12
|
+
- [Message Flow](#message-flow)
|
|
13
|
+
- [Payments (X402)](#payments-x402)
|
|
14
|
+
- [Events](#events)
|
|
15
|
+
- [Connection Lifecycle](#connection-lifecycle)
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Overview
|
|
20
|
+
|
|
21
|
+
The Teneo Protocol connects your application to a network of AI agents through a WebSocket connection. Here's the high-level architecture:
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
Your Application
|
|
25
|
+
│
|
|
26
|
+
▼
|
|
27
|
+
┌─────────────────┐
|
|
28
|
+
│ Teneo SDK │ ◄── You are here
|
|
29
|
+
└────────┬────────┘
|
|
30
|
+
│ WebSocket
|
|
31
|
+
▼
|
|
32
|
+
┌─────────────────┐
|
|
33
|
+
│ Teneo Server │
|
|
34
|
+
│ ┌───────────┐ │
|
|
35
|
+
│ │Coordinator│ │ ◄── Selects the best agent for each request
|
|
36
|
+
│ └─────┬─────┘ │
|
|
37
|
+
│ │ │
|
|
38
|
+
│ ┌─────▼─────┐ │
|
|
39
|
+
│ │ Agents │ │ ◄── Specialized AI agents (weather, analytics, etc.)
|
|
40
|
+
│ └───────────┘ │
|
|
41
|
+
└─────────────────┘
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
**Key Components:**
|
|
45
|
+
- **SDK**: Handles connection, authentication, and message routing
|
|
46
|
+
- **Coordinator**: Server-side AI that analyzes your message and picks the best agent
|
|
47
|
+
- **Agents**: Specialized AI agents that handle specific tasks
|
|
48
|
+
- **Rooms**: Isolated spaces where you interact with agents
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Authentication
|
|
53
|
+
|
|
54
|
+
Teneo uses **Web3 wallet authentication** instead of API keys. Your Ethereum private key proves your identity through cryptographic signatures.
|
|
55
|
+
|
|
56
|
+
### How It Works
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
1. SDK connects to server
|
|
60
|
+
│
|
|
61
|
+
▼
|
|
62
|
+
2. Server sends random challenge
|
|
63
|
+
"Please sign: abc123xyz..."
|
|
64
|
+
│
|
|
65
|
+
▼
|
|
66
|
+
3. SDK signs challenge with your private key
|
|
67
|
+
signature = sign("Teneo authentication challenge: abc123xyz...")
|
|
68
|
+
│
|
|
69
|
+
▼
|
|
70
|
+
4. SDK sends signature + wallet address
|
|
71
|
+
│
|
|
72
|
+
▼
|
|
73
|
+
5. Server verifies signature matches address
|
|
74
|
+
│
|
|
75
|
+
▼
|
|
76
|
+
6. Authenticated! Server sends your rooms, limits, etc.
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### Why Wallet Auth?
|
|
80
|
+
|
|
81
|
+
- **No API keys to leak** - Your identity is your wallet
|
|
82
|
+
- **Cryptographically secure** - Signatures can't be forged
|
|
83
|
+
- **Web3 native** - Works with existing Ethereum wallets
|
|
84
|
+
- **Your private key never leaves your machine** - Only signatures are sent
|
|
85
|
+
|
|
86
|
+
### Code Example
|
|
87
|
+
|
|
88
|
+
```typescript
|
|
89
|
+
const sdk = new TeneoSDK({
|
|
90
|
+
wsUrl: "wss://backend.developer.chatroom.teneo-protocol.ai/ws",
|
|
91
|
+
privateKey: "0xYourPrivateKey" // Used only for signing
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
// For production, use SecurePrivateKey for memory encryption
|
|
95
|
+
import { SecurePrivateKey } from "@teneo-protocol/sdk";
|
|
96
|
+
const secureKey = new SecurePrivateKey(process.env.PRIVATE_KEY);
|
|
97
|
+
|
|
98
|
+
const sdk = new TeneoSDK({
|
|
99
|
+
wsUrl: "...",
|
|
100
|
+
privateKey: secureKey // Encrypted in RAM, decrypted only when signing
|
|
101
|
+
});
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Events
|
|
105
|
+
|
|
106
|
+
```typescript
|
|
107
|
+
sdk.on("auth:challenge", (challenge) => {
|
|
108
|
+
// Challenge received, SDK will sign automatically
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
sdk.on("auth:success", (state) => {
|
|
112
|
+
console.log(`Authenticated as ${state.walletAddress}`);
|
|
113
|
+
console.log(`You have ${state.rooms.length} rooms`);
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
sdk.on("auth:error", (error) => {
|
|
117
|
+
console.error("Authentication failed:", error.message);
|
|
118
|
+
});
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## Rooms
|
|
124
|
+
|
|
125
|
+
Rooms are isolated spaces where you send messages and receive responses from agents. Think of them as chat channels or conversation contexts.
|
|
126
|
+
|
|
127
|
+
### Room Types
|
|
128
|
+
|
|
129
|
+
| Type | Subscription | Ownership | Use Case |
|
|
130
|
+
|------|-------------|-----------|----------|
|
|
131
|
+
| **Private** | Automatic | You own it | Personal workspace, private conversations |
|
|
132
|
+
| **Public** | Manual (`subscribeToRoom()`) | System/shared | Community channels, announcements |
|
|
133
|
+
| **Shared** | Automatic | Someone invited you | Collaboration, team rooms |
|
|
134
|
+
|
|
135
|
+
### Private Rooms
|
|
136
|
+
|
|
137
|
+
- **You create them** with `createRoom()`
|
|
138
|
+
- **You're always subscribed** - no need to call `subscribeToRoom()`
|
|
139
|
+
- **You control agents** - add/remove agents as needed
|
|
140
|
+
- **Subject to limits** - typically 1-10 rooms based on your plan
|
|
141
|
+
|
|
142
|
+
```typescript
|
|
143
|
+
// Check if you can create more rooms
|
|
144
|
+
if (sdk.canCreateRoom()) {
|
|
145
|
+
const room = await sdk.createRoom({
|
|
146
|
+
name: "My Research Room",
|
|
147
|
+
description: "For crypto analysis"
|
|
148
|
+
});
|
|
149
|
+
console.log(`Created room: ${room.id}`);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Check your limits
|
|
153
|
+
console.log(`Rooms: ${sdk.getOwnedRoomCount()}/${sdk.getRoomLimit()}`);
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### Public Rooms
|
|
157
|
+
|
|
158
|
+
- **System-created** or community channels
|
|
159
|
+
- **Require explicit subscription** to receive messages
|
|
160
|
+
- **Shared agents** - you can't modify the agent list
|
|
161
|
+
|
|
162
|
+
```typescript
|
|
163
|
+
// Subscribe to a public room
|
|
164
|
+
await sdk.subscribeToRoom("public-announcements");
|
|
165
|
+
|
|
166
|
+
// Unsubscribe when done
|
|
167
|
+
await sdk.unsubscribeFromRoom("public-announcements");
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### Room Lifecycle
|
|
171
|
+
|
|
172
|
+
```typescript
|
|
173
|
+
// 1. Create a room
|
|
174
|
+
const room = await sdk.createRoom({ name: "My Room" });
|
|
175
|
+
|
|
176
|
+
// 2. Add agents to customize it
|
|
177
|
+
const available = await sdk.listAvailableAgents(room.id);
|
|
178
|
+
await sdk.addAgentToRoom(room.id, available[0].agent_id);
|
|
179
|
+
|
|
180
|
+
// 3. Send messages
|
|
181
|
+
await sdk.sendMessage("Hello!", { room: room.id });
|
|
182
|
+
|
|
183
|
+
// 4. Update room details (owner only)
|
|
184
|
+
await sdk.updateRoom(room.id, { name: "Renamed Room" });
|
|
185
|
+
|
|
186
|
+
// 5. Delete when done (owner only)
|
|
187
|
+
await sdk.deleteRoom(room.id);
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### Room Events
|
|
191
|
+
|
|
192
|
+
```typescript
|
|
193
|
+
sdk.on("room:created", (room) => console.log(`Created: ${room.name}`));
|
|
194
|
+
sdk.on("room:updated", (room) => console.log(`Updated: ${room.name}`));
|
|
195
|
+
sdk.on("room:deleted", (roomId) => console.log(`Deleted: ${roomId}`));
|
|
196
|
+
sdk.on("room:subscribed", (data) => console.log(`Subscribed to: ${data.roomId}`));
|
|
197
|
+
sdk.on("room:unsubscribed", (data) => console.log(`Left: ${data.roomId}`));
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## The Coordinator
|
|
203
|
+
|
|
204
|
+
The Coordinator is the brain of the Teneo Protocol. It analyzes your message and selects the most appropriate agent to handle it.
|
|
205
|
+
|
|
206
|
+
### How Agent Selection Works
|
|
207
|
+
|
|
208
|
+
```
|
|
209
|
+
Your Message: "What's the weather in Tokyo?"
|
|
210
|
+
│
|
|
211
|
+
▼
|
|
212
|
+
┌───────────────┐
|
|
213
|
+
│ Coordinator │
|
|
214
|
+
│ │
|
|
215
|
+
│ Analyzes: │
|
|
216
|
+
│ - Intent │
|
|
217
|
+
│ - Keywords │
|
|
218
|
+
│ - Context │
|
|
219
|
+
└───────┬───────┘
|
|
220
|
+
│
|
|
221
|
+
┌───────────┼───────────┐
|
|
222
|
+
▼ ▼ ▼
|
|
223
|
+
┌─────────┐ ┌─────────┐ ┌─────────┐
|
|
224
|
+
│ Weather │ │Analytics│ │ News │
|
|
225
|
+
│ Agent │ │ Agent │ │ Agent │
|
|
226
|
+
│ ✓ MATCH │ │ ✗ │ │ ✗ │
|
|
227
|
+
└─────────┘ └─────────┘ └─────────┘
|
|
228
|
+
│
|
|
229
|
+
▼
|
|
230
|
+
Weather Agent processes request
|
|
231
|
+
│
|
|
232
|
+
▼
|
|
233
|
+
Response: "Tokyo: 22°C, Partly cloudy"
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
### Coordinator Events
|
|
237
|
+
|
|
238
|
+
```typescript
|
|
239
|
+
sdk.on("agent:selected", (selection) => {
|
|
240
|
+
console.log(`Selected: ${selection.agentName}`);
|
|
241
|
+
console.log(`Reason: ${selection.reasoning}`);
|
|
242
|
+
console.log(`Capabilities: ${selection.capabilities.join(", ")}`);
|
|
243
|
+
});
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
### Bypassing the Coordinator
|
|
247
|
+
|
|
248
|
+
Use **direct commands** when you know exactly which agent you want:
|
|
249
|
+
|
|
250
|
+
```typescript
|
|
251
|
+
// Regular message - Coordinator selects agent
|
|
252
|
+
await sdk.sendMessage("What's the weather?", { room: roomId });
|
|
253
|
+
|
|
254
|
+
// Direct command - Bypass coordinator, go straight to agent
|
|
255
|
+
await sdk.sendDirectCommand({
|
|
256
|
+
agent: "weather-agent",
|
|
257
|
+
command: "forecast Tokyo",
|
|
258
|
+
room: roomId
|
|
259
|
+
});
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
### When to Use Direct Commands
|
|
263
|
+
|
|
264
|
+
| Use Coordinator | Use Direct Command |
|
|
265
|
+
|-----------------|-------------------|
|
|
266
|
+
| General questions | Specific agent tasks |
|
|
267
|
+
| "Help me with..." | "Agent X, do Y" |
|
|
268
|
+
| Don't know which agent | Know the exact agent |
|
|
269
|
+
| Want intelligent routing | Want predictable routing |
|
|
270
|
+
|
|
271
|
+
---
|
|
272
|
+
|
|
273
|
+
## Agents
|
|
274
|
+
|
|
275
|
+
Agents are specialized AI services that handle specific tasks. Each agent has:
|
|
276
|
+
|
|
277
|
+
- **Capabilities**: What it can do (e.g., "weather-forecast", "crypto-analysis")
|
|
278
|
+
- **Commands**: Specific actions it supports
|
|
279
|
+
- **Pricing**: Free or paid per task
|
|
280
|
+
|
|
281
|
+
### Agent Visibility in Rooms
|
|
282
|
+
|
|
283
|
+
Agents must be **assigned to a room** to respond to messages in that room.
|
|
284
|
+
|
|
285
|
+
```typescript
|
|
286
|
+
// List agents currently in your room
|
|
287
|
+
const roomAgents = await sdk.listRoomAgents(roomId);
|
|
288
|
+
|
|
289
|
+
// List agents you can add to your room
|
|
290
|
+
const availableAgents = await sdk.listAvailableAgents(roomId);
|
|
291
|
+
|
|
292
|
+
// Add an agent to your room (owner only)
|
|
293
|
+
await sdk.addAgentToRoom(roomId, "weather-agent-001");
|
|
294
|
+
|
|
295
|
+
// Remove an agent from your room
|
|
296
|
+
await sdk.removeAgentFromRoom(roomId, "weather-agent-001");
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
### Getting Agent Details
|
|
300
|
+
|
|
301
|
+
```typescript
|
|
302
|
+
const details = await sdk.getAgentDetails("weather-agent-001");
|
|
303
|
+
|
|
304
|
+
console.log(`Name: ${details.agent_name}`);
|
|
305
|
+
console.log(`Description: ${details.description}`);
|
|
306
|
+
console.log(`Status: ${details.status}`);
|
|
307
|
+
|
|
308
|
+
// Capabilities
|
|
309
|
+
details.capabilities?.forEach(cap => {
|
|
310
|
+
console.log(`- ${cap.name}: ${cap.description}`);
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
// Commands
|
|
314
|
+
details.commands?.forEach(cmd => {
|
|
315
|
+
console.log(`- ${cmd.name}: ${cmd.description}`);
|
|
316
|
+
});
|
|
317
|
+
|
|
318
|
+
// Pricing (if paid agent)
|
|
319
|
+
if (details.pricing) {
|
|
320
|
+
console.log(`Price: $${details.pricing.price_per_unit} per ${details.pricing.task_unit}`);
|
|
321
|
+
}
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
### Agent Events
|
|
325
|
+
|
|
326
|
+
```typescript
|
|
327
|
+
sdk.on("agent:selected", (data) => {
|
|
328
|
+
console.log(`${data.agentName} selected for your request`);
|
|
329
|
+
});
|
|
330
|
+
|
|
331
|
+
sdk.on("agent:response", (response) => {
|
|
332
|
+
console.log(`${response.agentName}: ${response.content}`);
|
|
333
|
+
});
|
|
334
|
+
|
|
335
|
+
sdk.on("agent:list", (agents) => {
|
|
336
|
+
console.log(`${agents.length} agents available`);
|
|
337
|
+
});
|
|
338
|
+
|
|
339
|
+
sdk.on("agent_room:agent_added", (roomId, agentId) => {
|
|
340
|
+
console.log(`Agent ${agentId} added to room ${roomId}`);
|
|
341
|
+
});
|
|
342
|
+
|
|
343
|
+
sdk.on("agent_room:agent_removed", (roomId, agentId) => {
|
|
344
|
+
console.log(`Agent ${agentId} removed from room ${roomId}`);
|
|
345
|
+
});
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
---
|
|
349
|
+
|
|
350
|
+
## Message Flow
|
|
351
|
+
|
|
352
|
+
Understanding how messages flow through the system helps you debug and optimize your application.
|
|
353
|
+
|
|
354
|
+
### Complete Flow: sendMessage to Response
|
|
355
|
+
|
|
356
|
+
```
|
|
357
|
+
sdk.sendMessage("What's 2+2?", { room: "math-room" })
|
|
358
|
+
│
|
|
359
|
+
▼
|
|
360
|
+
┌─────────────────────────────────────┐
|
|
361
|
+
│ 1. SDK validates │
|
|
362
|
+
│ - Connected? ✓ │
|
|
363
|
+
│ - Room specified? ✓ │
|
|
364
|
+
│ - Content not empty? ✓ │
|
|
365
|
+
└─────────────────┬───────────────────┘
|
|
366
|
+
│
|
|
367
|
+
▼
|
|
368
|
+
┌─────────────────────────────────────┐
|
|
369
|
+
│ 2. Create message │
|
|
370
|
+
│ { │
|
|
371
|
+
│ type: "message", │
|
|
372
|
+
│ content: "What's 2+2?", │
|
|
373
|
+
│ room: "math-room", │
|
|
374
|
+
│ from: "0xYourWallet" │
|
|
375
|
+
│ } │
|
|
376
|
+
└─────────────────┬───────────────────┘
|
|
377
|
+
│
|
|
378
|
+
▼
|
|
379
|
+
┌─────────────────────────────────────┐
|
|
380
|
+
│ 3. Send over WebSocket │
|
|
381
|
+
│ - Rate limit check │
|
|
382
|
+
│ - Emit "message:sent" event │
|
|
383
|
+
└─────────────────┬───────────────────┘
|
|
384
|
+
│
|
|
385
|
+
════════════════ Network ═══════
|
|
386
|
+
│
|
|
387
|
+
▼
|
|
388
|
+
┌─────────────────────────────────────┐
|
|
389
|
+
│ 4. Server receives message │
|
|
390
|
+
│ - Coordinator analyzes │
|
|
391
|
+
│ - Selects Math Agent │
|
|
392
|
+
│ - Emits "agent:selected" │
|
|
393
|
+
└─────────────────┬───────────────────┘
|
|
394
|
+
│
|
|
395
|
+
▼
|
|
396
|
+
┌─────────────────────────────────────┐
|
|
397
|
+
│ 5. Agent processes │
|
|
398
|
+
│ - Math Agent calculates │
|
|
399
|
+
│ - Sends response │
|
|
400
|
+
└─────────────────┬───────────────────┘
|
|
401
|
+
│
|
|
402
|
+
▼
|
|
403
|
+
┌─────────────────────────────────────┐
|
|
404
|
+
│ 6. SDK receives response │
|
|
405
|
+
│ - Parse task_response │
|
|
406
|
+
│ - Emit "agent:response" event │
|
|
407
|
+
└─────────────────────────────────────┘
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
### Fire-and-Forget vs Wait-for-Response
|
|
411
|
+
|
|
412
|
+
**Fire-and-Forget** (Default):
|
|
413
|
+
```typescript
|
|
414
|
+
// Returns immediately after sending
|
|
415
|
+
await sdk.sendMessage("Hello", { room: roomId });
|
|
416
|
+
|
|
417
|
+
// Handle response via event
|
|
418
|
+
sdk.on("agent:response", (response) => {
|
|
419
|
+
console.log(response.content);
|
|
420
|
+
});
|
|
421
|
+
```
|
|
422
|
+
|
|
423
|
+
**Wait-for-Response**:
|
|
424
|
+
```typescript
|
|
425
|
+
// Blocks until response received or timeout
|
|
426
|
+
const response = await sdk.sendMessage("What's 2+2?", {
|
|
427
|
+
room: roomId,
|
|
428
|
+
waitForResponse: true,
|
|
429
|
+
timeout: 30000 // 30 seconds
|
|
430
|
+
});
|
|
431
|
+
|
|
432
|
+
console.log(response.content); // "4"
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
### When to Use Each
|
|
436
|
+
|
|
437
|
+
| Fire-and-Forget | Wait-for-Response |
|
|
438
|
+
|-----------------|-------------------|
|
|
439
|
+
| Chat interfaces | Request-response APIs |
|
|
440
|
+
| Real-time updates | Sequential operations |
|
|
441
|
+
| Multiple concurrent requests | Single request at a time |
|
|
442
|
+
| Non-blocking UX | Need the response to continue |
|
|
443
|
+
|
|
444
|
+
---
|
|
445
|
+
|
|
446
|
+
## Payments (X402)
|
|
447
|
+
|
|
448
|
+
Some agents charge for their services using the X402 payment protocol. The flow is: **Quote → Confirm → Response**.
|
|
449
|
+
|
|
450
|
+
### Automatic Payment Signing
|
|
451
|
+
|
|
452
|
+
The SDK includes a `PaymentSigner` that **automatically creates x402 payment headers** when you confirm a task. No manual payment encoding needed!
|
|
453
|
+
|
|
454
|
+
- Uses **PEAQ chain** with **USDC** stablecoin
|
|
455
|
+
- Payment headers are signed using your private key
|
|
456
|
+
- The SDK handles all the complexity for you
|
|
457
|
+
|
|
458
|
+
### Payment Flow
|
|
459
|
+
|
|
460
|
+
```
|
|
461
|
+
1. Request a Quote
|
|
462
|
+
"How much to analyze this data?"
|
|
463
|
+
│
|
|
464
|
+
▼
|
|
465
|
+
2. Agent Returns Quote
|
|
466
|
+
{
|
|
467
|
+
task_id: "task_123",
|
|
468
|
+
agent: "DataAnalyst",
|
|
469
|
+
price: $0.05,
|
|
470
|
+
expires: "in 5 minutes"
|
|
471
|
+
}
|
|
472
|
+
│
|
|
473
|
+
▼
|
|
474
|
+
3. Confirm Task
|
|
475
|
+
SDK auto-signs the payment!
|
|
476
|
+
│
|
|
477
|
+
▼
|
|
478
|
+
4. Server Validates Payment
|
|
479
|
+
│
|
|
480
|
+
▼
|
|
481
|
+
5. Agent Executes Task
|
|
482
|
+
│
|
|
483
|
+
▼
|
|
484
|
+
6. Response Delivered
|
|
485
|
+
"Here's your analysis..."
|
|
486
|
+
```
|
|
487
|
+
|
|
488
|
+
### Code Example
|
|
489
|
+
|
|
490
|
+
```typescript
|
|
491
|
+
// 1. Request a quote
|
|
492
|
+
const quote = await sdk.requestQuote({
|
|
493
|
+
content: "Analyze Bitcoin trends for the past week",
|
|
494
|
+
room: roomId
|
|
495
|
+
});
|
|
496
|
+
|
|
497
|
+
console.log(`Agent: ${quote.agent_name}`);
|
|
498
|
+
console.log(`Price: $${quote.pricing.price_per_unit}`);
|
|
499
|
+
console.log(`Expires: ${quote.expires_at}`);
|
|
500
|
+
|
|
501
|
+
// 2. Confirm the task - SDK auto-signs the payment!
|
|
502
|
+
await sdk.confirmTask({ taskId: quote.task_id });
|
|
503
|
+
|
|
504
|
+
// 3. Response comes via event
|
|
505
|
+
sdk.on("agent:response", (response) => {
|
|
506
|
+
if (response.taskId === quote.task_id) {
|
|
507
|
+
console.log("Analysis complete:", response.content);
|
|
508
|
+
}
|
|
509
|
+
});
|
|
510
|
+
```
|
|
511
|
+
|
|
512
|
+
### Payment Events
|
|
513
|
+
|
|
514
|
+
```typescript
|
|
515
|
+
sdk.on("payment:quote", (quote) => {
|
|
516
|
+
console.log(`Quote received: $${quote.pricing.price_per_unit}`);
|
|
517
|
+
console.log(`Expires: ${quote.expires_at}`);
|
|
518
|
+
});
|
|
519
|
+
|
|
520
|
+
sdk.on("payment:confirmed", (taskId) => {
|
|
521
|
+
console.log(`Payment confirmed for task ${taskId}`);
|
|
522
|
+
console.log("Agent is now processing your request...");
|
|
523
|
+
});
|
|
524
|
+
|
|
525
|
+
sdk.on("payment:error", (error) => {
|
|
526
|
+
console.error(`Payment failed: ${error.message}`);
|
|
527
|
+
});
|
|
528
|
+
```
|
|
529
|
+
|
|
530
|
+
### Free vs Paid Tasks
|
|
531
|
+
|
|
532
|
+
- **Free**: Message → Coordinator → Agent → Response (direct)
|
|
533
|
+
- **Paid**: Message → Coordinator → Quote → Confirm → Agent → Response
|
|
534
|
+
|
|
535
|
+
You'll know it's a paid task when you receive a `payment:quote` event instead of going directly to `agent:response`.
|
|
536
|
+
|
|
537
|
+
---
|
|
538
|
+
|
|
539
|
+
## Events
|
|
540
|
+
|
|
541
|
+
The SDK is fully event-driven. Here's the complete event reference:
|
|
542
|
+
|
|
543
|
+
### Connection Events
|
|
544
|
+
|
|
545
|
+
| Event | When | Data |
|
|
546
|
+
|-------|------|------|
|
|
547
|
+
| `connection:open` | WebSocket connected | - |
|
|
548
|
+
| `connection:close` | WebSocket closed | `(code, reason)` |
|
|
549
|
+
| `connection:error` | Connection error | `(error)` |
|
|
550
|
+
| `connection:reconnecting` | Attempting reconnect | `(attempt)` |
|
|
551
|
+
| `connection:reconnected` | Reconnect successful | - |
|
|
552
|
+
|
|
553
|
+
### Authentication Events
|
|
554
|
+
|
|
555
|
+
| Event | When | Data |
|
|
556
|
+
|-------|------|------|
|
|
557
|
+
| `auth:challenge` | Challenge received | `(challenge)` |
|
|
558
|
+
| `auth:success` | Authenticated | `(authState)` |
|
|
559
|
+
| `auth:error` | Auth failed | `(error)` |
|
|
560
|
+
|
|
561
|
+
### Message Events
|
|
562
|
+
|
|
563
|
+
| Event | When | Data |
|
|
564
|
+
|-------|------|------|
|
|
565
|
+
| `message:sent` | Message sent | `(message)` |
|
|
566
|
+
| `message:received` | Message received | `(message)` |
|
|
567
|
+
| `message:error` | Message error | `(error, message)` |
|
|
568
|
+
|
|
569
|
+
### Agent Events
|
|
570
|
+
|
|
571
|
+
| Event | When | Data |
|
|
572
|
+
|-------|------|------|
|
|
573
|
+
| `agent:selected` | Coordinator selected agent | `(selection)` |
|
|
574
|
+
| `agent:response` | Agent responded | `(response)` |
|
|
575
|
+
| `agent:list` | Agent list received | `(agents)` |
|
|
576
|
+
|
|
577
|
+
### Room Events
|
|
578
|
+
|
|
579
|
+
| Event | When | Data |
|
|
580
|
+
|-------|------|------|
|
|
581
|
+
| `room:created` | Room created | `(room)` |
|
|
582
|
+
| `room:updated` | Room updated | `(room)` |
|
|
583
|
+
| `room:deleted` | Room deleted | `(roomId)` |
|
|
584
|
+
| `room:subscribed` | Subscribed to room | `(data)` |
|
|
585
|
+
| `room:unsubscribed` | Unsubscribed from room | `(data)` |
|
|
586
|
+
|
|
587
|
+
### Payment Events
|
|
588
|
+
|
|
589
|
+
| Event | When | Data |
|
|
590
|
+
|-------|------|------|
|
|
591
|
+
| `payment:quote` | Quote received | `(quote)` |
|
|
592
|
+
| `payment:confirmed` | Payment confirmed | `(taskId)` |
|
|
593
|
+
| `payment:error` | Payment error | `(error)` |
|
|
594
|
+
|
|
595
|
+
### Lifecycle Events
|
|
596
|
+
|
|
597
|
+
| Event | When | Data |
|
|
598
|
+
|-------|------|------|
|
|
599
|
+
| `ready` | SDK ready to use | - |
|
|
600
|
+
| `disconnect` | Disconnected | - |
|
|
601
|
+
| `destroy` | SDK destroyed | - |
|
|
602
|
+
| `error` | General error | `(error)` |
|
|
603
|
+
|
|
604
|
+
### Event Order on Connect
|
|
605
|
+
|
|
606
|
+
```
|
|
607
|
+
1. connection:open ─── WebSocket connected
|
|
608
|
+
2. auth:challenge ─── Challenge received
|
|
609
|
+
3. auth:success ─── Authenticated
|
|
610
|
+
4. ready ─── SDK ready
|
|
611
|
+
```
|
|
612
|
+
|
|
613
|
+
### Event Order on Message (Free Agent)
|
|
614
|
+
|
|
615
|
+
```
|
|
616
|
+
1. message:sent ─── Your message sent
|
|
617
|
+
2. agent:selected ─── Coordinator picked agent (optional)
|
|
618
|
+
3. agent:response ─── Agent responded
|
|
619
|
+
```
|
|
620
|
+
|
|
621
|
+
### Event Order on Message (Paid Agent)
|
|
622
|
+
|
|
623
|
+
```
|
|
624
|
+
1. message:sent ─── Your message sent
|
|
625
|
+
2. agent:selected ─── Coordinator picked agent
|
|
626
|
+
3. payment:quote ─── Quote received
|
|
627
|
+
... user confirms payment ...
|
|
628
|
+
4. payment:confirmed ─── Payment validated
|
|
629
|
+
5. agent:response ─── Agent responded
|
|
630
|
+
```
|
|
631
|
+
|
|
632
|
+
---
|
|
633
|
+
|
|
634
|
+
## Connection Lifecycle
|
|
635
|
+
|
|
636
|
+
### States
|
|
637
|
+
|
|
638
|
+
```
|
|
639
|
+
┌──────────────┐
|
|
640
|
+
│ DISCONNECTED │◄──────────────────────────────┐
|
|
641
|
+
└──────┬───────┘ │
|
|
642
|
+
│ connect() │
|
|
643
|
+
▼ │
|
|
644
|
+
┌──────────────┐ │
|
|
645
|
+
│ CONNECTING │ │
|
|
646
|
+
└──────┬───────┘ │
|
|
647
|
+
│ WebSocket opens │
|
|
648
|
+
▼ │
|
|
649
|
+
┌──────────────┐ │
|
|
650
|
+
│AUTHENTICATING│ │
|
|
651
|
+
└──────┬───────┘ │
|
|
652
|
+
│ auth:success │
|
|
653
|
+
▼ │
|
|
654
|
+
┌──────────────┐ disconnect() │
|
|
655
|
+
│ CONNECTED │───────────────────────────────┤
|
|
656
|
+
└──────┬───────┘ │
|
|
657
|
+
│ connection lost │
|
|
658
|
+
▼ │
|
|
659
|
+
┌──────────────┐ max attempts reached │
|
|
660
|
+
│ RECONNECTING │───────────────────────────────┘
|
|
661
|
+
└──────┬───────┘
|
|
662
|
+
│ reconnect success
|
|
663
|
+
▼
|
|
664
|
+
┌──────────────┐
|
|
665
|
+
│ CONNECTED │
|
|
666
|
+
└──────────────┘
|
|
667
|
+
```
|
|
668
|
+
|
|
669
|
+
### Checking State
|
|
670
|
+
|
|
671
|
+
```typescript
|
|
672
|
+
// Connection state
|
|
673
|
+
const connState = sdk.getConnectionState();
|
|
674
|
+
console.log(`Connected: ${connState.connected}`);
|
|
675
|
+
console.log(`Authenticated: ${connState.authenticated}`);
|
|
676
|
+
console.log(`Reconnecting: ${connState.reconnecting}`);
|
|
677
|
+
console.log(`Reconnect attempts: ${connState.reconnectAttempts}`);
|
|
678
|
+
|
|
679
|
+
// Auth state
|
|
680
|
+
const authState = sdk.getAuthState();
|
|
681
|
+
console.log(`Wallet: ${authState.walletAddress}`);
|
|
682
|
+
console.log(`Rooms: ${authState.rooms?.length}`);
|
|
683
|
+
console.log(`Room limit: ${authState.maxPrivateRooms}`);
|
|
684
|
+
console.log(`Is admin: ${authState.isAdmin}`);
|
|
685
|
+
|
|
686
|
+
// Health check
|
|
687
|
+
const health = sdk.getHealth();
|
|
688
|
+
console.log(`Status: ${health.status}`); // 'healthy' | 'degraded' | 'unhealthy'
|
|
689
|
+
```
|
|
690
|
+
|
|
691
|
+
### Reconnection
|
|
692
|
+
|
|
693
|
+
The SDK automatically reconnects with exponential backoff:
|
|
694
|
+
|
|
695
|
+
```typescript
|
|
696
|
+
const sdk = new TeneoSDK({
|
|
697
|
+
wsUrl: "...",
|
|
698
|
+
privateKey: "...",
|
|
699
|
+
reconnect: true, // Enable auto-reconnect
|
|
700
|
+
reconnectDelay: 5000, // Start with 5s delay
|
|
701
|
+
maxReconnectAttempts: 10 // Give up after 10 attempts
|
|
702
|
+
});
|
|
703
|
+
|
|
704
|
+
// Or use advanced configuration
|
|
705
|
+
const sdk = new TeneoSDK({
|
|
706
|
+
wsUrl: "...",
|
|
707
|
+
privateKey: "...",
|
|
708
|
+
reconnectionStrategy: {
|
|
709
|
+
type: "exponential",
|
|
710
|
+
baseDelay: 3000, // 3s initial
|
|
711
|
+
maxDelay: 120000, // 2 minute max
|
|
712
|
+
maxAttempts: 20,
|
|
713
|
+
jitter: true // Random variation to avoid thundering herd
|
|
714
|
+
}
|
|
715
|
+
});
|
|
716
|
+
|
|
717
|
+
// Monitor reconnection
|
|
718
|
+
sdk.on("connection:reconnecting", (attempt) => {
|
|
719
|
+
console.log(`Reconnecting... attempt ${attempt}`);
|
|
720
|
+
});
|
|
721
|
+
|
|
722
|
+
sdk.on("connection:reconnected", () => {
|
|
723
|
+
console.log("Reconnected successfully!");
|
|
724
|
+
});
|
|
725
|
+
```
|
|
726
|
+
|
|
727
|
+
### Graceful Shutdown
|
|
728
|
+
|
|
729
|
+
```typescript
|
|
730
|
+
// Disconnect cleanly
|
|
731
|
+
await sdk.disconnect();
|
|
732
|
+
|
|
733
|
+
// Or destroy completely (removes all listeners)
|
|
734
|
+
sdk.destroy();
|
|
735
|
+
```
|
|
736
|
+
|
|
737
|
+
---
|
|
738
|
+
|
|
739
|
+
## Next Steps
|
|
740
|
+
|
|
741
|
+
- **[README.md](./README.md)** - Quick start and API reference
|
|
742
|
+
- **[Examples](./examples/)** - Working code examples
|
|
743
|
+
- **[API Reference](./docs/api.md)** - Full API documentation
|
|
744
|
+
|
|
745
|
+
---
|
|
746
|
+
|
|
747
|
+
**Built by the [Teneo Protocol Team](https://teneo-protocol.ai)**
|