@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
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* MessageRouter - Manages message sending and routing
|
|
3
3
|
* Handles user messages, direct commands, and message-response patterns
|
|
4
|
+
* Supports quote-approve payment flow (v2.2.0)
|
|
4
5
|
*/
|
|
5
6
|
|
|
6
7
|
import { EventEmitter } from "eventemitter3";
|
|
@@ -11,11 +12,15 @@ import { ResponseFormatter, FormattedResponse } from "../formatters/response-for
|
|
|
11
12
|
import {
|
|
12
13
|
UserMessage,
|
|
13
14
|
createUserMessage,
|
|
15
|
+
createRequestTask,
|
|
16
|
+
createConfirmTask,
|
|
14
17
|
Logger,
|
|
15
18
|
ResponseFormat,
|
|
16
|
-
TaskResponseMessage
|
|
19
|
+
TaskResponseMessage,
|
|
20
|
+
TaskQuoteMessage,
|
|
21
|
+
PricingInfo
|
|
17
22
|
} from "../types";
|
|
18
|
-
import { SDKEvents, SDKError, ValidationError, AgentResponse } from "../types/events";
|
|
23
|
+
import { SDKEvents, SDKError, ValidationError, AgentResponse, PaymentError } from "../types/events";
|
|
19
24
|
import { ErrorCode } from "../types/error-codes";
|
|
20
25
|
import { TIMEOUTS } from "../constants";
|
|
21
26
|
import {
|
|
@@ -24,6 +29,8 @@ import {
|
|
|
24
29
|
AgentCommandContentSchema
|
|
25
30
|
} from "../types/validation";
|
|
26
31
|
import { waitForEvent } from "../utils/event-waiter";
|
|
32
|
+
import { PaymentClient, buildX402ResourceUrl } from "../payments/payment-client";
|
|
33
|
+
import type { SecurePrivateKey } from "../utils/secure-private-key";
|
|
27
34
|
|
|
28
35
|
export interface SendMessageOptions {
|
|
29
36
|
room: string;
|
|
@@ -39,6 +46,30 @@ export interface AgentCommand {
|
|
|
39
46
|
room: string;
|
|
40
47
|
}
|
|
41
48
|
|
|
49
|
+
/**
|
|
50
|
+
* Result of a quote request, containing pricing and agent details.
|
|
51
|
+
*/
|
|
52
|
+
export interface QuoteResult {
|
|
53
|
+
taskId: string;
|
|
54
|
+
agentId: string;
|
|
55
|
+
agentName: string;
|
|
56
|
+
agentWallet: string;
|
|
57
|
+
command: string;
|
|
58
|
+
pricing: PricingInfo;
|
|
59
|
+
expiresAt: Date;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export interface MessageRouterConfig {
|
|
63
|
+
messageTimeout?: number;
|
|
64
|
+
responseFormat?: ResponseFormat;
|
|
65
|
+
autoApproveQuotes?: boolean;
|
|
66
|
+
maxPricePerRequest?: number;
|
|
67
|
+
quoteTimeout?: number;
|
|
68
|
+
wsUrl?: string;
|
|
69
|
+
paymentNetwork?: string;
|
|
70
|
+
paymentAsset?: string;
|
|
71
|
+
}
|
|
72
|
+
|
|
42
73
|
export class MessageRouter extends EventEmitter<SDKEvents> {
|
|
43
74
|
private readonly wsClient: WebSocketClient;
|
|
44
75
|
private readonly webhookHandler: WebhookHandler;
|
|
@@ -47,15 +78,22 @@ export class MessageRouter extends EventEmitter<SDKEvents> {
|
|
|
47
78
|
private readonly messageTimeout: number;
|
|
48
79
|
private readonly responseFormat: ResponseFormat;
|
|
49
80
|
|
|
81
|
+
// Quote-approve flow (v2.2.0)
|
|
82
|
+
private paymentClient: PaymentClient | null = null;
|
|
83
|
+
private readonly pendingQuotes: Map<string, QuoteResult> = new Map();
|
|
84
|
+
private readonly autoApproveQuotes: boolean;
|
|
85
|
+
private readonly maxPricePerRequest?: number;
|
|
86
|
+
private readonly quoteTimeout: number;
|
|
87
|
+
private readonly wsUrl: string;
|
|
88
|
+
private readonly paymentNetwork: string;
|
|
89
|
+
private readonly paymentAsset: string;
|
|
90
|
+
|
|
50
91
|
constructor(
|
|
51
92
|
wsClient: WebSocketClient,
|
|
52
93
|
webhookHandler: WebhookHandler,
|
|
53
94
|
responseFormatter: ResponseFormatter,
|
|
54
95
|
logger: Logger,
|
|
55
|
-
config:
|
|
56
|
-
messageTimeout?: number;
|
|
57
|
-
responseFormat?: ResponseFormat;
|
|
58
|
-
}
|
|
96
|
+
config: MessageRouterConfig
|
|
59
97
|
) {
|
|
60
98
|
super();
|
|
61
99
|
this.wsClient = wsClient;
|
|
@@ -65,9 +103,29 @@ export class MessageRouter extends EventEmitter<SDKEvents> {
|
|
|
65
103
|
this.messageTimeout = config.messageTimeout ?? TIMEOUTS.DEFAULT_MESSAGE_TIMEOUT;
|
|
66
104
|
this.responseFormat = config.responseFormat ?? "humanized";
|
|
67
105
|
|
|
106
|
+
// Quote-approve config (v2.2.0)
|
|
107
|
+
this.autoApproveQuotes = config.autoApproveQuotes ?? true;
|
|
108
|
+
this.maxPricePerRequest = config.maxPricePerRequest;
|
|
109
|
+
this.quoteTimeout = config.quoteTimeout ?? 30000;
|
|
110
|
+
this.wsUrl = config.wsUrl ?? "";
|
|
111
|
+
this.paymentNetwork = config.paymentNetwork ?? "eip155:3338";
|
|
112
|
+
// USDC contract address on PEAQ network
|
|
113
|
+
this.paymentAsset = config.paymentAsset ?? "0xbbA60da06c2c5424f03f7434542280FCAd453d10";
|
|
114
|
+
|
|
68
115
|
this.setupEventForwarding();
|
|
69
116
|
}
|
|
70
117
|
|
|
118
|
+
/**
|
|
119
|
+
* Sets up the payment client for quote-approve flow.
|
|
120
|
+
* Must be called before using requestQuote/confirmQuote with paid tasks.
|
|
121
|
+
*/
|
|
122
|
+
public setPaymentClient(secureKey: SecurePrivateKey, walletAddress: string): void {
|
|
123
|
+
this.paymentClient = new PaymentClient(secureKey, walletAddress, {
|
|
124
|
+
network: this.paymentNetwork,
|
|
125
|
+
asset: this.paymentAsset
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
|
|
71
129
|
/**
|
|
72
130
|
* Sends a message to agents via the coordinator.
|
|
73
131
|
* The coordinator intelligently selects the most appropriate agent.
|
|
@@ -107,21 +165,31 @@ export class MessageRouter extends EventEmitter<SDKEvents> {
|
|
|
107
165
|
throw new SDKError("Not connected to Teneo network", ErrorCode.NOT_CONNECTED);
|
|
108
166
|
}
|
|
109
167
|
|
|
110
|
-
// Validate content
|
|
111
168
|
const validatedContent = MessageContentSchema.parse(content);
|
|
112
|
-
|
|
113
169
|
const room = options.room;
|
|
114
170
|
if (!room) {
|
|
115
171
|
throw new ValidationError("Room parameter is required");
|
|
116
172
|
}
|
|
117
173
|
|
|
118
|
-
// Use
|
|
174
|
+
// Use quote-approve flow with auto-approval (v2.2.0)
|
|
175
|
+
if (this.autoApproveQuotes) {
|
|
176
|
+
this.logger.debug("MessageRouter: Using quote-approve flow", {
|
|
177
|
+
content: validatedContent,
|
|
178
|
+
room
|
|
179
|
+
});
|
|
180
|
+
const quote = await this.requestQuote(validatedContent, room);
|
|
181
|
+
return await this.confirmQuote(quote.taskId, {
|
|
182
|
+
waitForResponse: options.waitForResponse,
|
|
183
|
+
timeout: options.timeout ?? this.messageTimeout
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Legacy flow (auto-approval disabled - user must manually confirm quotes)
|
|
119
188
|
const authState = this.wsClient.getAuthState();
|
|
120
189
|
const fromAddress = options.from ?? authState.walletAddress;
|
|
121
|
-
|
|
122
190
|
const message = createUserMessage(validatedContent, room, fromAddress);
|
|
123
191
|
|
|
124
|
-
this.logger.debug("MessageRouter: Sending message", {
|
|
192
|
+
this.logger.debug("MessageRouter: Sending message (legacy)", {
|
|
125
193
|
content: validatedContent,
|
|
126
194
|
room,
|
|
127
195
|
from: fromAddress
|
|
@@ -164,7 +232,6 @@ export class MessageRouter extends EventEmitter<SDKEvents> {
|
|
|
164
232
|
throw new SDKError("Not connected to Teneo network", ErrorCode.NOT_CONNECTED);
|
|
165
233
|
}
|
|
166
234
|
|
|
167
|
-
// Validate command
|
|
168
235
|
const validatedAgent = AgentIdSchema.parse(command.agent);
|
|
169
236
|
const validatedCommand = AgentCommandContentSchema.parse(command.command);
|
|
170
237
|
|
|
@@ -173,15 +240,24 @@ export class MessageRouter extends EventEmitter<SDKEvents> {
|
|
|
173
240
|
throw new ValidationError("Room parameter is required");
|
|
174
241
|
}
|
|
175
242
|
|
|
176
|
-
|
|
243
|
+
const content = `@${validatedAgent} ${validatedCommand}`;
|
|
244
|
+
|
|
245
|
+
// Use quote-approve flow with auto-approval (v2.2.0)
|
|
246
|
+
if (this.autoApproveQuotes) {
|
|
247
|
+
this.logger.debug("MessageRouter: Using quote-approve flow", { content, room });
|
|
248
|
+
const quote = await this.requestQuote(content, room);
|
|
249
|
+
return await this.confirmQuote(quote.taskId, {
|
|
250
|
+
waitForResponse,
|
|
251
|
+
timeout: this.messageTimeout
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// Legacy flow (auto-approval disabled - user must manually confirm quotes)
|
|
177
256
|
const authState = this.wsClient.getAuthState();
|
|
178
257
|
const walletAddress = authState.walletAddress;
|
|
179
|
-
|
|
180
|
-
// Format as direct command
|
|
181
|
-
const content = `@${validatedAgent} ${validatedCommand}`;
|
|
182
258
|
const message = createUserMessage(content, room, walletAddress);
|
|
183
259
|
|
|
184
|
-
this.logger.debug("MessageRouter: Sending direct command", {
|
|
260
|
+
this.logger.debug("MessageRouter: Sending direct command (legacy)", {
|
|
185
261
|
agent: validatedAgent,
|
|
186
262
|
command: validatedCommand,
|
|
187
263
|
room,
|
|
@@ -204,6 +280,128 @@ export class MessageRouter extends EventEmitter<SDKEvents> {
|
|
|
204
280
|
}
|
|
205
281
|
}
|
|
206
282
|
|
|
283
|
+
/**
|
|
284
|
+
* Requests a quote for a task without auto-approval.
|
|
285
|
+
* Returns the quote data for manual confirmation.
|
|
286
|
+
*/
|
|
287
|
+
public async requestQuote(content: string, room: string): Promise<QuoteResult> {
|
|
288
|
+
if (!this.wsClient.isConnected) {
|
|
289
|
+
throw new SDKError("Not connected to Teneo network", ErrorCode.NOT_CONNECTED);
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
const message = createRequestTask(content, room);
|
|
293
|
+
this.logger.debug("MessageRouter: Requesting quote", { content, room });
|
|
294
|
+
|
|
295
|
+
await this.wsClient.sendMessage(message);
|
|
296
|
+
|
|
297
|
+
const quote = await waitForEvent<TaskQuoteMessage>(this.wsClient, "quote:received", {
|
|
298
|
+
timeout: this.quoteTimeout,
|
|
299
|
+
timeoutMessage: `Quote request timed out after ${this.quoteTimeout}ms`
|
|
300
|
+
});
|
|
301
|
+
|
|
302
|
+
const result: QuoteResult = {
|
|
303
|
+
taskId: quote.data.task_id,
|
|
304
|
+
agentId: quote.data.agent_id,
|
|
305
|
+
agentName: quote.data.agent_name,
|
|
306
|
+
agentWallet: quote.data.agent_wallet,
|
|
307
|
+
command: quote.data.command,
|
|
308
|
+
pricing: quote.data.pricing,
|
|
309
|
+
expiresAt: new Date(quote.data.expires_at)
|
|
310
|
+
};
|
|
311
|
+
|
|
312
|
+
this.pendingQuotes.set(result.taskId, result);
|
|
313
|
+
return result;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/**
|
|
317
|
+
* Confirms a quote and executes the task with payment.
|
|
318
|
+
* Can optionally wait for the task response.
|
|
319
|
+
*/
|
|
320
|
+
public async confirmQuote(
|
|
321
|
+
taskId: string,
|
|
322
|
+
options?: { waitForResponse?: boolean; timeout?: number }
|
|
323
|
+
): Promise<FormattedResponse | void> {
|
|
324
|
+
if (!this.wsClient.isConnected) {
|
|
325
|
+
throw new SDKError("Not connected to Teneo network", ErrorCode.NOT_CONNECTED);
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
const quote = this.pendingQuotes.get(taskId);
|
|
329
|
+
if (!quote) {
|
|
330
|
+
throw new ValidationError(`No pending quote found for task ${taskId}`);
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
if (new Date() > quote.expiresAt) {
|
|
334
|
+
this.pendingQuotes.delete(taskId);
|
|
335
|
+
throw new SDKError("Quote has expired", ErrorCode.QUOTE_EXPIRED);
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
// Check price limit
|
|
339
|
+
if (this.maxPricePerRequest !== undefined) {
|
|
340
|
+
const priceInUnits = quote.pricing.pricePerUnit * 1_000_000;
|
|
341
|
+
if (priceInUnits > this.maxPricePerRequest) {
|
|
342
|
+
this.emit("payment:blocked", {
|
|
343
|
+
agentId: quote.agentId,
|
|
344
|
+
agentPrice: priceInUnits,
|
|
345
|
+
maxPrice: this.maxPricePerRequest
|
|
346
|
+
});
|
|
347
|
+
throw new PaymentError(
|
|
348
|
+
`Quote price exceeds limit: ${priceInUnits} > ${this.maxPricePerRequest}`,
|
|
349
|
+
ErrorCode.PRICE_LIMIT_EXCEEDED,
|
|
350
|
+
{ agentId: quote.agentId, agentPrice: priceInUnits, maxPrice: this.maxPricePerRequest }
|
|
351
|
+
);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
let paymentHeader: string | undefined;
|
|
356
|
+
|
|
357
|
+
// Create payment header if payment client is configured and price > 0
|
|
358
|
+
if (this.paymentClient && quote.pricing.pricePerUnit > 0) {
|
|
359
|
+
try {
|
|
360
|
+
paymentHeader = await this.paymentClient.createPaymentHeader(
|
|
361
|
+
quote.pricing.pricePerUnit * 1_000_000,
|
|
362
|
+
quote.agentWallet,
|
|
363
|
+
buildX402ResourceUrl(this.wsUrl)
|
|
364
|
+
);
|
|
365
|
+
this.emit("payment:attached", {
|
|
366
|
+
agentId: quote.agentId,
|
|
367
|
+
amount: quote.pricing.pricePerUnit * 1_000_000,
|
|
368
|
+
command: quote.command
|
|
369
|
+
});
|
|
370
|
+
} catch (error) {
|
|
371
|
+
this.logger.error("Failed to create payment header for quote confirmation", error);
|
|
372
|
+
throw new PaymentError("Failed to create payment", ErrorCode.PAYMENT_FAILED, {
|
|
373
|
+
agentId: quote.agentId
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
const confirmMessage = createConfirmTask(taskId, paymentHeader);
|
|
379
|
+
|
|
380
|
+
this.logger.debug("MessageRouter: Confirming quote", { taskId });
|
|
381
|
+
|
|
382
|
+
await this.wsClient.sendMessage(confirmMessage);
|
|
383
|
+
|
|
384
|
+
// Delete quote only after successful send (enables retry on network failure)
|
|
385
|
+
this.pendingQuotes.delete(taskId);
|
|
386
|
+
|
|
387
|
+
if (options?.waitForResponse) {
|
|
388
|
+
const timeout = options.timeout ?? this.messageTimeout;
|
|
389
|
+
const response = await waitForEvent<AgentResponse>(this.wsClient, "agent:response", {
|
|
390
|
+
timeout,
|
|
391
|
+
filter: (r) => r.taskId === taskId,
|
|
392
|
+
timeoutMessage: `Task response timed out after ${timeout}ms (taskId: ${taskId})`
|
|
393
|
+
});
|
|
394
|
+
return response as FormattedResponse;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
/**
|
|
399
|
+
* Gets a pending quote by task ID.
|
|
400
|
+
*/
|
|
401
|
+
public getPendingQuote(taskId: string): QuoteResult | undefined {
|
|
402
|
+
return this.pendingQuotes.get(taskId);
|
|
403
|
+
}
|
|
404
|
+
|
|
207
405
|
/**
|
|
208
406
|
* Send message and wait for agent response
|
|
209
407
|
* Uses event-waiter utility for clean Promise-based waiting with automatic cleanup
|