@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
|
@@ -5,31 +5,38 @@
|
|
|
5
5
|
* Uses the OpenAI Codex SDK for thread-based conversations.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import
|
|
9
|
-
import express, { Request, Response } from
|
|
10
|
-
import { Codex } from
|
|
11
|
-
import { SDKConfigBuilder, TeneoSDK } from
|
|
8
|
+
import "dotenv/config";
|
|
9
|
+
import express, { Request, Response } from "express";
|
|
10
|
+
import { Codex } from "@openai/codex-sdk";
|
|
11
|
+
import { SDKConfigBuilder, TeneoSDK } from "../../dist/index.js";
|
|
12
12
|
|
|
13
13
|
// Load environment variables
|
|
14
|
-
const WS_URL = process.env.WS_URL ||
|
|
15
|
-
const PRIVATE_KEY = process.env.PRIVATE_KEY ||
|
|
16
|
-
const WALLET_ADDRESS = process.env.WALLET_ADDRESS ||
|
|
17
|
-
const DEFAULT_ROOM = process.env.DEFAULT_ROOM ||
|
|
18
|
-
const LOG_LEVEL = (process.env.LOG_LEVEL ||
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
const
|
|
25
|
-
const
|
|
26
|
-
const
|
|
27
|
-
const
|
|
14
|
+
const WS_URL = process.env.WS_URL || "";
|
|
15
|
+
const PRIVATE_KEY = process.env.PRIVATE_KEY || "";
|
|
16
|
+
const WALLET_ADDRESS = process.env.WALLET_ADDRESS || "";
|
|
17
|
+
const DEFAULT_ROOM = process.env.DEFAULT_ROOM || "general";
|
|
18
|
+
const LOG_LEVEL = (process.env.LOG_LEVEL || "info") as
|
|
19
|
+
| "debug"
|
|
20
|
+
| "info"
|
|
21
|
+
| "warn"
|
|
22
|
+
| "error"
|
|
23
|
+
| "silent";
|
|
24
|
+
const ENABLE_SIG_VERIFICATION = process.env.ENABLE_SIGNATURE_VERIFICATION === "true";
|
|
25
|
+
const TRUSTED_ADDRESSES = process.env.TRUSTED_ADDRESSES?.split(",").filter(Boolean) || [];
|
|
26
|
+
const ENABLE_CACHE = process.env.ENABLE_CACHE !== "false";
|
|
27
|
+
const CACHE_TIMEOUT = parseInt(process.env.CACHE_TIMEOUT || "300000");
|
|
28
|
+
const MAX_CACHE_SIZE = parseInt(process.env.MAX_CACHE_SIZE || "100");
|
|
29
|
+
const ENABLE_RECONNECTION = process.env.ENABLE_RECONNECTION !== "false";
|
|
30
|
+
const RECONNECT_DELAY = parseInt(process.env.RECONNECT_DELAY || "5000");
|
|
31
|
+
const MAX_RECONNECT_ATTEMPTS = parseInt(process.env.MAX_RECONNECT_ATTEMPTS || "10");
|
|
32
|
+
const OPENAI_API_KEY = process.env.OPENAI_API_KEY || "";
|
|
28
33
|
|
|
29
34
|
// Validate required environment variables
|
|
30
35
|
if (!WS_URL || !PRIVATE_KEY) {
|
|
31
|
-
console.error(
|
|
32
|
-
console.error(
|
|
36
|
+
console.error("Missing required environment variables: WS_URL, PRIVATE_KEY");
|
|
37
|
+
console.error(
|
|
38
|
+
"Note: OPENAI_API_KEY is optional - Codex SDK will use default auth if not provided"
|
|
39
|
+
);
|
|
33
40
|
process.exit(1);
|
|
34
41
|
}
|
|
35
42
|
|
|
@@ -39,20 +46,20 @@ app.use(express.json());
|
|
|
39
46
|
// Initialize Teneo SDK using SDKConfigBuilder pattern
|
|
40
47
|
const config = new SDKConfigBuilder()
|
|
41
48
|
.withWebSocketUrl(WS_URL)
|
|
42
|
-
.withAuthentication(PRIVATE_KEY, WALLET_ADDRESS)
|
|
49
|
+
.withAuthentication(PRIVATE_KEY, WALLET_ADDRESS) // Wallet auto-derived if not provided
|
|
43
50
|
.withAutoJoinRooms([DEFAULT_ROOM])
|
|
44
51
|
.withReconnection({
|
|
45
52
|
enabled: ENABLE_RECONNECTION,
|
|
46
53
|
delay: RECONNECT_DELAY,
|
|
47
54
|
maxAttempts: MAX_RECONNECT_ATTEMPTS
|
|
48
55
|
})
|
|
49
|
-
.withResponseFormat({ format:
|
|
56
|
+
.withResponseFormat({ format: "both", includeMetadata: true })
|
|
50
57
|
.withLogging(LOG_LEVEL)
|
|
51
58
|
.withCache(ENABLE_CACHE, CACHE_TIMEOUT, MAX_CACHE_SIZE)
|
|
52
59
|
.withSignatureVerification({
|
|
53
60
|
enabled: ENABLE_SIG_VERIFICATION,
|
|
54
61
|
trustedAddresses: TRUSTED_ADDRESSES,
|
|
55
|
-
requireFor: [
|
|
62
|
+
requireFor: ["task_response", "agent_selected"],
|
|
56
63
|
strictMode: false
|
|
57
64
|
})
|
|
58
65
|
.build();
|
|
@@ -66,17 +73,17 @@ const codex = new Codex({
|
|
|
66
73
|
});
|
|
67
74
|
|
|
68
75
|
// Connect to Teneo
|
|
69
|
-
console.log(
|
|
76
|
+
console.log("📡 Connecting to Teneo Protocol...");
|
|
70
77
|
await teneoSDK.connect();
|
|
71
|
-
console.log(
|
|
78
|
+
console.log("✅ Connected to Teneo\n");
|
|
72
79
|
|
|
73
80
|
// Health endpoint
|
|
74
|
-
app.get(
|
|
81
|
+
app.get("/health", (_req: Request, res: Response) => {
|
|
75
82
|
const teneoHealth = teneoSDK.getHealth();
|
|
76
83
|
res.json({
|
|
77
|
-
status:
|
|
84
|
+
status: "ok",
|
|
78
85
|
teneo: {
|
|
79
|
-
connected: teneoHealth.connection.status ===
|
|
86
|
+
connected: teneoHealth.connection.status === "connected",
|
|
80
87
|
authenticated: teneoHealth.connection.authenticated
|
|
81
88
|
},
|
|
82
89
|
codex: {
|
|
@@ -87,14 +94,14 @@ app.get('/health', (_req: Request, res: Response) => {
|
|
|
87
94
|
});
|
|
88
95
|
|
|
89
96
|
// Query endpoint - Codex analyzes, then routes to Teneo agent
|
|
90
|
-
app.post(
|
|
97
|
+
app.post("/query", async (req: Request, res: Response) => {
|
|
91
98
|
try {
|
|
92
99
|
const { message } = req.body;
|
|
93
100
|
|
|
94
101
|
if (!message) {
|
|
95
102
|
return res.status(400).json({
|
|
96
103
|
success: false,
|
|
97
|
-
error:
|
|
104
|
+
error: "Message is required"
|
|
98
105
|
});
|
|
99
106
|
}
|
|
100
107
|
|
|
@@ -104,11 +111,11 @@ app.post('/query', async (req: Request, res: Response) => {
|
|
|
104
111
|
const agents = teneoSDK.getAgents();
|
|
105
112
|
|
|
106
113
|
// Step 2: Ask Codex to select the best agent
|
|
107
|
-
console.log(
|
|
114
|
+
console.log("🤖 Asking Codex to select best agent...");
|
|
108
115
|
|
|
109
|
-
const agentList = agents
|
|
110
|
-
`- ${a.name}: ${a.description ||
|
|
111
|
-
|
|
116
|
+
const agentList = agents
|
|
117
|
+
.map((a) => `- ${a.name}: ${a.description || "No description"}`)
|
|
118
|
+
.join("\n");
|
|
112
119
|
|
|
113
120
|
const thread = codex.startThread();
|
|
114
121
|
const codexResponse = await thread.run(
|
|
@@ -125,50 +132,55 @@ Respond with ONLY the agent name, nothing else.`
|
|
|
125
132
|
// Extract text from Codex response
|
|
126
133
|
// Codex SDK returns an object with finalResponse property
|
|
127
134
|
let selectedAgentName: string;
|
|
128
|
-
if (typeof codexResponse ===
|
|
135
|
+
if (typeof codexResponse === "string") {
|
|
129
136
|
selectedAgentName = codexResponse.trim();
|
|
130
|
-
} else if (codexResponse && typeof codexResponse ===
|
|
137
|
+
} else if (codexResponse && typeof codexResponse === "object") {
|
|
131
138
|
// Extract from finalResponse property
|
|
132
|
-
selectedAgentName =
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
139
|
+
selectedAgentName =
|
|
140
|
+
(codexResponse as any).finalResponse ||
|
|
141
|
+
(codexResponse as any).text ||
|
|
142
|
+
(codexResponse as any).content ||
|
|
143
|
+
String(codexResponse);
|
|
144
|
+
if (typeof selectedAgentName === "object") {
|
|
137
145
|
selectedAgentName = JSON.stringify(selectedAgentName);
|
|
138
146
|
}
|
|
139
147
|
selectedAgentName = selectedAgentName.trim();
|
|
140
148
|
} else {
|
|
141
|
-
selectedAgentName = agents[0]?.name ||
|
|
149
|
+
selectedAgentName = agents[0]?.name || "";
|
|
142
150
|
}
|
|
143
151
|
|
|
144
152
|
console.log(`✅ Selected agent: ${selectedAgentName}`);
|
|
145
153
|
|
|
146
154
|
// Find the agent by name or ID
|
|
147
|
-
const selectedAgent = agents.find(
|
|
148
|
-
a
|
|
149
|
-
|
|
155
|
+
const selectedAgent = agents.find(
|
|
156
|
+
(a) =>
|
|
157
|
+
a.name?.toLowerCase() === selectedAgentName.toLowerCase() ||
|
|
158
|
+
a.id?.toLowerCase() === selectedAgentName.toLowerCase()
|
|
150
159
|
);
|
|
151
160
|
|
|
152
161
|
if (!selectedAgent) {
|
|
153
162
|
return res.status(404).json({
|
|
154
163
|
success: false,
|
|
155
|
-
error: `Agent '${selectedAgentName}' not found. Available agents: ${agents.map(a => a.name || a.id).join(
|
|
164
|
+
error: `Agent '${selectedAgentName}' not found. Available agents: ${agents.map((a) => a.name || a.id).join(", ")}`
|
|
156
165
|
});
|
|
157
166
|
}
|
|
158
167
|
|
|
159
168
|
// Step 3: Send direct command to selected Teneo agent (bypasses coordinator)
|
|
160
169
|
// Use the SDK's built-in waitForResponse feature with the improved fallback matching
|
|
161
170
|
console.log(`📤 Sending to Teneo agent: ${selectedAgent.name || selectedAgent.id}...`);
|
|
162
|
-
const teneoResponse = await teneoSDK.sendDirectCommand(
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
171
|
+
const teneoResponse = await teneoSDK.sendDirectCommand(
|
|
172
|
+
{
|
|
173
|
+
agent: selectedAgent.id,
|
|
174
|
+
command: message,
|
|
175
|
+
room: DEFAULT_ROOM
|
|
176
|
+
},
|
|
177
|
+
true
|
|
178
|
+
); // waitForResponse = true
|
|
167
179
|
|
|
168
180
|
if (!teneoResponse || !teneoResponse.humanized) {
|
|
169
181
|
return res.json({
|
|
170
182
|
success: false,
|
|
171
|
-
error:
|
|
183
|
+
error: "No response from Teneo agent"
|
|
172
184
|
});
|
|
173
185
|
}
|
|
174
186
|
|
|
@@ -186,25 +198,24 @@ Respond with ONLY the agent name, nothing else.`
|
|
|
186
198
|
metadata: teneoResponse.metadata
|
|
187
199
|
}
|
|
188
200
|
});
|
|
189
|
-
|
|
190
201
|
} catch (error) {
|
|
191
|
-
console.error(
|
|
202
|
+
console.error("❌ Query error:", error);
|
|
192
203
|
res.status(500).json({
|
|
193
204
|
success: false,
|
|
194
|
-
error: error instanceof Error ? error.message :
|
|
205
|
+
error: error instanceof Error ? error.message : "Unknown error"
|
|
195
206
|
});
|
|
196
207
|
}
|
|
197
208
|
});
|
|
198
209
|
|
|
199
210
|
// Direct Codex query (bypass Teneo)
|
|
200
|
-
app.post(
|
|
211
|
+
app.post("/codex", async (req: Request, res: Response) => {
|
|
201
212
|
try {
|
|
202
213
|
const { message, threadId } = req.body;
|
|
203
214
|
|
|
204
215
|
if (!message) {
|
|
205
216
|
return res.status(400).json({
|
|
206
217
|
success: false,
|
|
207
|
-
error:
|
|
218
|
+
error: "Message is required"
|
|
208
219
|
});
|
|
209
220
|
}
|
|
210
221
|
|
|
@@ -217,13 +228,14 @@ app.post('/codex', async (req: Request, res: Response) => {
|
|
|
217
228
|
// Extract text from Codex response
|
|
218
229
|
// Codex SDK returns an object with finalResponse property
|
|
219
230
|
let responseText: string;
|
|
220
|
-
if (typeof codexResult ===
|
|
231
|
+
if (typeof codexResult === "string") {
|
|
221
232
|
responseText = codexResult;
|
|
222
|
-
} else if (codexResult && typeof codexResult ===
|
|
223
|
-
responseText =
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
233
|
+
} else if (codexResult && typeof codexResult === "object") {
|
|
234
|
+
responseText =
|
|
235
|
+
(codexResult as any).finalResponse ||
|
|
236
|
+
(codexResult as any).text ||
|
|
237
|
+
(codexResult as any).content ||
|
|
238
|
+
JSON.stringify(codexResult);
|
|
227
239
|
} else {
|
|
228
240
|
responseText = String(codexResult);
|
|
229
241
|
}
|
|
@@ -232,26 +244,25 @@ app.post('/codex', async (req: Request, res: Response) => {
|
|
|
232
244
|
success: true,
|
|
233
245
|
data: {
|
|
234
246
|
response: responseText,
|
|
235
|
-
threadId: thread.id ||
|
|
247
|
+
threadId: thread.id || "new",
|
|
236
248
|
usage: (codexResult as any).usage // Include token usage if available
|
|
237
249
|
}
|
|
238
250
|
});
|
|
239
|
-
|
|
240
251
|
} catch (error) {
|
|
241
|
-
console.error(
|
|
252
|
+
console.error("❌ Codex error:", error);
|
|
242
253
|
res.status(500).json({
|
|
243
254
|
success: false,
|
|
244
|
-
error: error instanceof Error ? error.message :
|
|
255
|
+
error: error instanceof Error ? error.message : "Unknown error"
|
|
245
256
|
});
|
|
246
257
|
}
|
|
247
258
|
});
|
|
248
259
|
|
|
249
260
|
// List Teneo agents
|
|
250
|
-
app.get(
|
|
261
|
+
app.get("/agents", (_req: Request, res: Response) => {
|
|
251
262
|
const agents = teneoSDK.getAgents();
|
|
252
263
|
res.json({
|
|
253
264
|
success: true,
|
|
254
|
-
agents: agents.map(a => ({
|
|
265
|
+
agents: agents.map((a) => ({
|
|
255
266
|
id: a.id,
|
|
256
267
|
name: a.name,
|
|
257
268
|
description: a.description,
|
|
@@ -272,8 +283,8 @@ app.listen(PORT, () => {
|
|
|
272
283
|
});
|
|
273
284
|
|
|
274
285
|
// Graceful shutdown
|
|
275
|
-
process.on(
|
|
276
|
-
console.log(
|
|
286
|
+
process.on("SIGINT", () => {
|
|
287
|
+
console.log("\n👋 Shutting down...");
|
|
277
288
|
teneoSDK.disconnect();
|
|
278
289
|
teneoSDK.destroy();
|
|
279
290
|
process.exit(0);
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
# Copy this file to .env and fill in your values
|
|
3
3
|
|
|
4
4
|
# ============================================================================
|
|
5
|
-
# REQUIRED: Teneo
|
|
5
|
+
# REQUIRED: Teneo Protocol Connection
|
|
6
6
|
# ============================================================================
|
|
7
7
|
|
|
8
8
|
# WebSocket URL for Teneo AI Network
|
|
9
9
|
# Production: wss://your-production-server.com/ws
|
|
10
|
-
# Development: wss://
|
|
11
|
-
WS_URL=wss://
|
|
10
|
+
# Development: wss://your-teneo-server.com/ws
|
|
11
|
+
WS_URL=wss://your-teneo-server.com/ws
|
|
12
12
|
|
|
13
13
|
# Ethereum Private Key (with 0x prefix)
|
|
14
14
|
# IMPORTANT: Never commit your actual private key to version control!
|
|
@@ -11,7 +11,9 @@ This is the **ultimate reference implementation** showcasing every SDK capabilit
|
|
|
11
11
|
✅ **WebSocket Connection** - Auto-reconnection with exponential backoff
|
|
12
12
|
✅ **Ethereum Authentication** - Wallet-based authentication
|
|
13
13
|
✅ **Message Sending** - Coordinator-based and direct agent commands
|
|
14
|
-
✅ **Room Management** - Subscribe, unsubscribe, and list rooms
|
|
14
|
+
✅ **Room Management (v1)** - Subscribe, unsubscribe, and list rooms
|
|
15
|
+
✅ **Room Management (v2.0)** - Create, update, delete rooms with ownership tracking
|
|
16
|
+
✅ **Agent-Room Management (v2.0)** - Add/remove agents per room, list room agents
|
|
15
17
|
✅ **Agent Discovery** - List agents with capabilities
|
|
16
18
|
✅ **Response Formatting** - Raw JSON, humanized text, or both
|
|
17
19
|
|
|
@@ -29,6 +31,17 @@ This is the **ultimate reference implementation** showcasing every SDK capabilit
|
|
|
29
31
|
✅ **Error Handling** - Custom error classes with recovery strategies
|
|
30
32
|
✅ **Event System** - Complete event-driven architecture
|
|
31
33
|
|
|
34
|
+
### v2.0 Features (New!)
|
|
35
|
+
|
|
36
|
+
✅ **Multi-Room Management** - Create, update, and delete your own rooms
|
|
37
|
+
✅ **Room Ownership Tracking** - Distinguish between owned and shared rooms
|
|
38
|
+
✅ **Room Limits** - Track and display room creation quotas
|
|
39
|
+
✅ **Agent-Room Customization** - Add/remove agents per room (owner only)
|
|
40
|
+
✅ **Room Agent Listing** - List agents in specific rooms with caching
|
|
41
|
+
✅ **Available Agents** - See which agents can be added to a room
|
|
42
|
+
✅ **Real-time Room Events** - Live updates for room creation/updates/deletions
|
|
43
|
+
✅ **Real-time Agent-Room Events** - Live updates when agents are added/removed
|
|
44
|
+
|
|
32
45
|
### Production Features
|
|
33
46
|
|
|
34
47
|
✅ **Health Check Endpoint** - `/health` for Kubernetes/Docker monitoring
|
|
@@ -205,15 +218,46 @@ const config = new SDKConfigBuilder()
|
|
|
205
218
|
- `GET /api/agents/search/capability/:capability` - **PERF-3**: Search by capability (O(1))
|
|
206
219
|
- `GET /api/agents/search/name/:name` - **PERF-3**: Search by name (O(k))
|
|
207
220
|
- `GET /api/agents/search/status/:status` - **PERF-3**: Search by status (O(1))
|
|
208
|
-
- `GET /api/rooms` - List all available rooms
|
|
221
|
+
- `GET /api/rooms` - List all available rooms (v1)
|
|
209
222
|
- `GET /api/deduplication` - **CB-4**: Get message deduplication status
|
|
210
|
-
- `POST /api/room/subscribe` - Subscribe to a room
|
|
223
|
+
- `POST /api/room/subscribe` - Subscribe to a room (v1)
|
|
211
224
|
```json
|
|
212
225
|
{
|
|
213
226
|
"roomId": "tech-support"
|
|
214
227
|
}
|
|
215
228
|
```
|
|
216
|
-
- `POST /api/room/unsubscribe` - Unsubscribe from a room
|
|
229
|
+
- `POST /api/room/unsubscribe` - Unsubscribe from a room (v1)
|
|
230
|
+
|
|
231
|
+
### Room Management v2.0 API
|
|
232
|
+
|
|
233
|
+
- `GET /api/v2/rooms/owned` - Get all rooms you own
|
|
234
|
+
- `GET /api/v2/rooms/shared` - Get all rooms you're a member of
|
|
235
|
+
- `GET /api/v2/rooms/limit` - Get your room creation limit
|
|
236
|
+
- `POST /api/v2/rooms` - Create a new room
|
|
237
|
+
```json
|
|
238
|
+
{
|
|
239
|
+
"name": "My Room",
|
|
240
|
+
"description": "Optional description"
|
|
241
|
+
}
|
|
242
|
+
```
|
|
243
|
+
- `PUT /api/v2/rooms/:id` - Update room (owner only)
|
|
244
|
+
```json
|
|
245
|
+
{
|
|
246
|
+
"name": "Updated Name",
|
|
247
|
+
"description": "New description"
|
|
248
|
+
}
|
|
249
|
+
```
|
|
250
|
+
- `DELETE /api/v2/rooms/:id` - Delete room (owner only)
|
|
251
|
+
|
|
252
|
+
### Agent-Room Management v2.0 API
|
|
253
|
+
|
|
254
|
+
- `GET /api/v2/rooms/:id/agents` - List agents in room (with 5-min cache)
|
|
255
|
+
- `GET /api/v2/rooms/:id/available-agents` - List agents available to add
|
|
256
|
+
- `GET /api/v2/rooms/:id/agents/count` - Get agent count (instant, from cache)
|
|
257
|
+
- `GET /api/v2/rooms/:roomId/agents/:agentId/check` - Check if agent is in room
|
|
258
|
+
- `POST /api/v2/rooms/:roomId/agents/:agentId` - Add agent to room (owner only)
|
|
259
|
+
- `DELETE /api/v2/rooms/:roomId/agents/:agentId` - Remove agent from room (owner only)
|
|
260
|
+
- `POST /api/v2/rooms/:id/cache/invalidate` - Manually invalidate agent-room cache
|
|
217
261
|
|
|
218
262
|
### Real-time Data
|
|
219
263
|
|
|
@@ -240,10 +284,12 @@ const config = new SDKConfigBuilder()
|
|
|
240
284
|
### Tabs
|
|
241
285
|
|
|
242
286
|
1. **Agents Tab**: List all agents with capabilities and status
|
|
243
|
-
2. **Rooms Tab**: Manage room subscriptions (subscribe/unsubscribe)
|
|
244
|
-
3. **
|
|
245
|
-
4. **
|
|
246
|
-
5. **
|
|
287
|
+
2. **Rooms Tab**: Manage room subscriptions (subscribe/unsubscribe) - v1
|
|
288
|
+
3. **Room Mgmt Tab** 🆕: Create, update, delete rooms - View owned/shared rooms with room limits (v2.0)
|
|
289
|
+
4. **Agent-Room Tab** 🆕: Add/remove agents to rooms - List room agents and available agents (v2.0)
|
|
290
|
+
5. **Messages Tab**: View message history with responses
|
|
291
|
+
6. **Webhooks Tab**: Monitor received webhooks
|
|
292
|
+
7. **Events Tab**: Real-time event stream (includes v2.0 room and agent-room events)
|
|
247
293
|
|
|
248
294
|
### Health Monitor
|
|
249
295
|
|
|
@@ -265,18 +311,18 @@ import { SecurePrivateKey } from "@teneo-protocol/sdk";
|
|
|
265
311
|
const secureKey = new SecurePrivateKey(process.env.PRIVATE_KEY);
|
|
266
312
|
|
|
267
313
|
// Use with SDK - automatically decrypted when needed
|
|
268
|
-
const config = new SDKConfigBuilder()
|
|
269
|
-
.withAuthentication(secureKey, WALLET_ADDRESS)
|
|
270
|
-
.build();
|
|
314
|
+
const config = new SDKConfigBuilder().withAuthentication(secureKey, WALLET_ADDRESS).build();
|
|
271
315
|
```
|
|
272
316
|
|
|
273
317
|
**Security Benefits:**
|
|
318
|
+
|
|
274
319
|
- Private key is encrypted in memory using AES-256-GCM
|
|
275
320
|
- Protected from memory dumps and debugging tools
|
|
276
321
|
- Automatic secure cleanup when no longer needed
|
|
277
322
|
- Minimal performance overhead
|
|
278
323
|
|
|
279
324
|
**Example Test:**
|
|
325
|
+
|
|
280
326
|
```bash
|
|
281
327
|
# Without encryption: private key visible in memory dump
|
|
282
328
|
# With encryption: only encrypted bytes visible
|
|
@@ -298,17 +344,20 @@ Prevent duplicate message processing using a TTL-based cache:
|
|
|
298
344
|
```
|
|
299
345
|
|
|
300
346
|
**How It Works:**
|
|
347
|
+
|
|
301
348
|
- Maintains an in-memory cache of processed message IDs
|
|
302
349
|
- Automatically expires entries after TTL (Time To Live)
|
|
303
350
|
- Bounded size prevents unbounded memory growth
|
|
304
351
|
- Messages without IDs are allowed through (graceful degradation)
|
|
305
352
|
|
|
306
353
|
**Configuration Options:**
|
|
354
|
+
|
|
307
355
|
- `enabled`: Enable/disable deduplication (default: true)
|
|
308
356
|
- `ttl`: How long to remember message IDs in milliseconds (default: 60000ms = 1 minute)
|
|
309
357
|
- `maxSize`: Maximum number of message IDs to cache (default: 10000)
|
|
310
358
|
|
|
311
359
|
**Monitoring:**
|
|
360
|
+
|
|
312
361
|
```bash
|
|
313
362
|
# Check deduplication status
|
|
314
363
|
curl http://localhost:3000/api/deduplication
|
|
@@ -324,15 +373,18 @@ curl http://localhost:3000/api/deduplication
|
|
|
324
373
|
```
|
|
325
374
|
|
|
326
375
|
**Events:**
|
|
376
|
+
|
|
327
377
|
- `message:duplicate` - Emitted when a duplicate message is detected and skipped
|
|
328
378
|
|
|
329
379
|
**Testing:**
|
|
380
|
+
|
|
330
381
|
1. Send the same message multiple times rapidly
|
|
331
382
|
2. Watch Events tab for `message:duplicate` events
|
|
332
383
|
3. Verify duplicates are not processed
|
|
333
384
|
4. Monitor `/api/deduplication` to see cache size increase
|
|
334
385
|
|
|
335
386
|
**Production Benefits:**
|
|
387
|
+
|
|
336
388
|
- Prevents duplicate task execution if messages are retransmitted
|
|
337
389
|
- Protects against network-level duplicates during reconnections
|
|
338
390
|
- Configurable TTL balances memory usage vs duplicate window
|
|
@@ -354,11 +406,13 @@ curl http://localhost:3000/api/agents/search/status/online
|
|
|
354
406
|
```
|
|
355
407
|
|
|
356
408
|
**Performance Comparison:**
|
|
409
|
+
|
|
357
410
|
- Traditional: O(n) - iterate through all agents
|
|
358
411
|
- Indexed: O(1) - direct map lookup for capability/status
|
|
359
412
|
- Indexed: O(k) - token-based search for names (k = tokens)
|
|
360
413
|
|
|
361
414
|
**SDK Usage:**
|
|
415
|
+
|
|
362
416
|
```typescript
|
|
363
417
|
// Fast capability search
|
|
364
418
|
const weatherAgents = sdk.findAgentsByCapability("weather-forecast");
|
|
@@ -524,7 +578,7 @@ Monitor rate limit status via `/metrics` endpoint.
|
|
|
524
578
|
- Watch Webhooks tab for incoming webhook events
|
|
525
579
|
- See event types: `task`, `agent_selected`, `task_response`
|
|
526
580
|
|
|
527
|
-
### 5. Test Room Management
|
|
581
|
+
### 5. Test Room Management (v1)
|
|
528
582
|
|
|
529
583
|
- Go to Rooms tab
|
|
530
584
|
- Enter a room ID
|
|
@@ -532,6 +586,29 @@ Monitor rate limit status via `/metrics` endpoint.
|
|
|
532
586
|
- See room appear in subscribed list
|
|
533
587
|
- Click "Unsubscribe" to unsubscribe from room
|
|
534
588
|
|
|
589
|
+
### 5b. Test Room Management v2.0
|
|
590
|
+
|
|
591
|
+
- Go to **Room Mgmt** tab
|
|
592
|
+
- See your owned and shared rooms
|
|
593
|
+
- Check your room limit (e.g., "2/50 rooms")
|
|
594
|
+
- **Create a room**: Enter name and description, click "Create Room"
|
|
595
|
+
- See room appear in "Private Rooms" list with owner badge
|
|
596
|
+
- **Update room**: Click "Update" on an owned room, modify name/description
|
|
597
|
+
- **Delete room**: Click "Delete" on an owned room
|
|
598
|
+
- Watch Events tab for `room:created`, `room:updated`, `room:deleted` events
|
|
599
|
+
|
|
600
|
+
### 5c. Test Agent-Room Management v2.0
|
|
601
|
+
|
|
602
|
+
- Go to **Agent-Room** tab
|
|
603
|
+
- Select a room you own from the dropdown
|
|
604
|
+
- See "Agents in Room" list (may be empty for new rooms)
|
|
605
|
+
- See "Available Agents" list (agents you can add)
|
|
606
|
+
- **Add an agent**: Click "Add" next to an available agent
|
|
607
|
+
- Watch agent move from "Available" to "Agents in Room"
|
|
608
|
+
- See agent count update in real-time
|
|
609
|
+
- **Remove an agent**: Click "Remove" next to an agent in room
|
|
610
|
+
- Watch Events tab for `agent_room:agent_added`, `agent_room:agent_removed` events
|
|
611
|
+
|
|
535
612
|
### 6. Test Signature Verification
|
|
536
613
|
|
|
537
614
|
- Enable in `.env`: `ENABLE_SIGNATURE_VERIFICATION=true`
|
|
@@ -637,7 +714,7 @@ Monitor rate limit status via `/metrics` endpoint.
|
|
|
637
714
|
|
|
638
715
|
- **Problem**: "Authentication Pending" never completes
|
|
639
716
|
- **Solution**: Verify `PRIVATE_KEY` and `WALLET_ADDRESS` are correct
|
|
640
|
-
- **Check**: Ensure wallet has access to the Teneo
|
|
717
|
+
- **Check**: Ensure wallet has access to the Teneo Protocol
|
|
641
718
|
|
|
642
719
|
### Webhook Not Receiving
|
|
643
720
|
|