@teneo-protocol/sdk 2.0.0 → 2.2.1
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 +4 -201
- package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/list-rooms-response-handler.js +5 -7
- 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 +7 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -3
- 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 +11203 -407
- package/dist/types/messages.d.ts.map +1 -1
- package/dist/types/messages.js +251 -8
- 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 +6 -4
- 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 +22 -1
- 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 +309 -6
- 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
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Payment Flow Test - Tests the quote-approve payment flow
|
|
3
|
+
*
|
|
4
|
+
* Setup:
|
|
5
|
+
* Create a .env file in the teneo-sdk root with:
|
|
6
|
+
* PRIVATE_KEY=your_private_key_here
|
|
7
|
+
* WS_URL=wss://backend.developer.chatroom.teneo-protocol.ai/ws # optional
|
|
8
|
+
*
|
|
9
|
+
* Run:
|
|
10
|
+
* npx tsx tests/payment-flow-test.ts
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import "dotenv/config";
|
|
14
|
+
import { TeneoSDK } from "../src/teneo-sdk";
|
|
15
|
+
|
|
16
|
+
// Configuration from environment variables (loaded from .env)
|
|
17
|
+
const WS_URL = process.env.WS_URL || "wss://backend.developer.chatroom.teneo-protocol.ai/ws";
|
|
18
|
+
const PRIVATE_KEY = process.env.PRIVATE_KEY;
|
|
19
|
+
|
|
20
|
+
if (!PRIVATE_KEY) {
|
|
21
|
+
console.error("❌ Missing PRIVATE_KEY");
|
|
22
|
+
console.error("");
|
|
23
|
+
console.error("Setup: Create a .env file in the teneo-sdk root with:");
|
|
24
|
+
console.error(" PRIVATE_KEY=your_private_key_here");
|
|
25
|
+
console.error("");
|
|
26
|
+
console.error("Then run:");
|
|
27
|
+
console.error(" npx tsx tests/payment-flow-test.ts");
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Type assertion after validation
|
|
32
|
+
const privateKey: string = PRIVATE_KEY;
|
|
33
|
+
|
|
34
|
+
let TEST_ROOM = ""; // Will be set after auth to use user's private room
|
|
35
|
+
|
|
36
|
+
async function testPaymentFlow() {
|
|
37
|
+
console.log("=== Payment Flow Test ===\n");
|
|
38
|
+
console.log("WebSocket URL:", WS_URL);
|
|
39
|
+
|
|
40
|
+
// Create SDK with quote-approve enabled
|
|
41
|
+
const config = TeneoSDK.builder()
|
|
42
|
+
.withWebSocketUrl(WS_URL)
|
|
43
|
+
.withAuthentication(privateKey)
|
|
44
|
+
.withPayments({
|
|
45
|
+
autoApprove: true,
|
|
46
|
+
maxPricePerRequest: 10_000_000 // Max 10 USDC
|
|
47
|
+
})
|
|
48
|
+
.withLogging("info")
|
|
49
|
+
.build();
|
|
50
|
+
|
|
51
|
+
const sdk = new TeneoSDK(config);
|
|
52
|
+
|
|
53
|
+
// Set up event listeners
|
|
54
|
+
sdk.on("connection:open", () => console.log("✓ Connected"));
|
|
55
|
+
sdk.on("auth:success", (state) => {
|
|
56
|
+
console.log("✓ Authenticated as:", state.walletAddress);
|
|
57
|
+
// Get user's first private room
|
|
58
|
+
if (state.privateRoomIds && state.privateRoomIds.length > 0) {
|
|
59
|
+
TEST_ROOM = state.privateRoomIds[0];
|
|
60
|
+
console.log("✓ Using room:", TEST_ROOM);
|
|
61
|
+
} else if (state.rooms && state.rooms.length > 0) {
|
|
62
|
+
TEST_ROOM = state.rooms[0];
|
|
63
|
+
console.log("✓ Using room:", TEST_ROOM);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
sdk.on("quote:received", (quote) => {
|
|
67
|
+
console.log("\n📋 Quote Received:");
|
|
68
|
+
console.log(" Task ID:", quote.data.task_id);
|
|
69
|
+
console.log(" Agent:", quote.data.agent_name);
|
|
70
|
+
console.log(" Price:", quote.data.pricing.pricePerUnit, "USDC");
|
|
71
|
+
console.log(" Expires:", quote.data.expires_at);
|
|
72
|
+
});
|
|
73
|
+
sdk.on("payment:attached", (data) => {
|
|
74
|
+
console.log("\n💰 Payment Attached:");
|
|
75
|
+
console.log(" Agent:", data.agentId);
|
|
76
|
+
console.log(" Amount:", data.amount / 1_000_000, "USDC");
|
|
77
|
+
console.log(" Command:", data.command);
|
|
78
|
+
});
|
|
79
|
+
sdk.on("agent:response", (response) => {
|
|
80
|
+
console.log("\n📥 Agent Response:");
|
|
81
|
+
console.log(" Success:", response.success);
|
|
82
|
+
console.log(" Content:", response.content.substring(0, 200) + "...");
|
|
83
|
+
});
|
|
84
|
+
sdk.on("error", (error) => console.error("❌ Error:", error.message));
|
|
85
|
+
|
|
86
|
+
try {
|
|
87
|
+
// Connect
|
|
88
|
+
console.log("\nConnecting to", WS_URL);
|
|
89
|
+
await sdk.connect();
|
|
90
|
+
console.log("Connected!\n");
|
|
91
|
+
|
|
92
|
+
// Wait for auth to complete and room to be set
|
|
93
|
+
await sleep(500);
|
|
94
|
+
|
|
95
|
+
if (!TEST_ROOM) {
|
|
96
|
+
throw new Error("No room available - auth may have failed");
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Subscribe to test room
|
|
100
|
+
console.log("Subscribing to room:", TEST_ROOM);
|
|
101
|
+
try {
|
|
102
|
+
await sdk.subscribeToRoom(TEST_ROOM);
|
|
103
|
+
console.log("Subscribed!\n");
|
|
104
|
+
} catch {
|
|
105
|
+
console.log("Room subscription skipped (private room)\n");
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Wait a bit for connection to stabilize
|
|
109
|
+
await sleep(1000);
|
|
110
|
+
|
|
111
|
+
// Send test message - this will trigger quote-approve flow
|
|
112
|
+
console.log("\n=== Sending Test Request ===");
|
|
113
|
+
console.log('Request: "get me 1 post from @elonmusk from x"\n');
|
|
114
|
+
|
|
115
|
+
const response = await sdk.sendMessage("get me 1 post from @elonmusk from x", {
|
|
116
|
+
room: TEST_ROOM,
|
|
117
|
+
waitForResponse: true,
|
|
118
|
+
timeout: 120000 // 2 minutes
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
if (response) {
|
|
122
|
+
console.log("\n=== Test Complete ===");
|
|
123
|
+
console.log("Response received successfully!");
|
|
124
|
+
console.log(
|
|
125
|
+
"Humanized:",
|
|
126
|
+
typeof response.humanized === "string" ? response.humanized.substring(0, 500) : response
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
} catch (error: unknown) {
|
|
130
|
+
const err = error as Error & { details?: unknown };
|
|
131
|
+
console.error("\n❌ Test failed:", err.message);
|
|
132
|
+
if (err.details) {
|
|
133
|
+
console.error("Details:", err.details);
|
|
134
|
+
}
|
|
135
|
+
} finally {
|
|
136
|
+
console.log("\nDisconnecting...");
|
|
137
|
+
sdk.destroy();
|
|
138
|
+
console.log("Done!");
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function sleep(ms: number): Promise<void> {
|
|
143
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// Run the test
|
|
147
|
+
testPaymentFlow().catch(console.error);
|
|
@@ -135,7 +135,11 @@ describe("AgentRoomOperationResponseHandler", () => {
|
|
|
135
135
|
expect(mockLogger.warn).toHaveBeenCalledWith(
|
|
136
136
|
"Agent room operation succeeded but missing room_id or agent_id"
|
|
137
137
|
);
|
|
138
|
-
expect(emitSpy).not.toHaveBeenCalledWith(
|
|
138
|
+
expect(emitSpy).not.toHaveBeenCalledWith(
|
|
139
|
+
"agent_room:agent_added",
|
|
140
|
+
expect.anything(),
|
|
141
|
+
expect.anything()
|
|
142
|
+
);
|
|
139
143
|
});
|
|
140
144
|
|
|
141
145
|
it("should handle success without room_id", async () => {
|
|
@@ -153,7 +157,11 @@ describe("AgentRoomOperationResponseHandler", () => {
|
|
|
153
157
|
expect(mockLogger.warn).toHaveBeenCalledWith(
|
|
154
158
|
"Agent room operation succeeded but missing room_id or agent_id"
|
|
155
159
|
);
|
|
156
|
-
expect(emitSpy).not.toHaveBeenCalledWith(
|
|
160
|
+
expect(emitSpy).not.toHaveBeenCalledWith(
|
|
161
|
+
"agent_room:agent_added",
|
|
162
|
+
expect.anything(),
|
|
163
|
+
expect.anything()
|
|
164
|
+
);
|
|
157
165
|
});
|
|
158
166
|
});
|
|
159
167
|
|
|
@@ -176,21 +184,11 @@ describe("AgentRoomOperationResponseHandler", () => {
|
|
|
176
184
|
await handler.handle(message, mockContext);
|
|
177
185
|
|
|
178
186
|
// Should emit both add and remove error events
|
|
179
|
-
expect(emitSpy).toHaveBeenCalledWith(
|
|
180
|
-
|
|
181
|
-
expect.any(SDKError),
|
|
182
|
-
roomId
|
|
183
|
-
);
|
|
184
|
-
expect(emitSpy).toHaveBeenCalledWith(
|
|
185
|
-
"agent_room:remove_error",
|
|
186
|
-
expect.any(SDKError),
|
|
187
|
-
roomId
|
|
188
|
-
);
|
|
187
|
+
expect(emitSpy).toHaveBeenCalledWith("agent_room:add_error", expect.any(SDKError), roomId);
|
|
188
|
+
expect(emitSpy).toHaveBeenCalledWith("agent_room:remove_error", expect.any(SDKError), roomId);
|
|
189
189
|
|
|
190
190
|
// Verify error details
|
|
191
|
-
const addErrorCall = emitSpy.mock.calls.find(
|
|
192
|
-
(call) => call[0] === "agent_room:add_error"
|
|
193
|
-
);
|
|
191
|
+
const addErrorCall = emitSpy.mock.calls.find((call) => call[0] === "agent_room:add_error");
|
|
194
192
|
const error = addErrorCall[1] as SDKError;
|
|
195
193
|
expect(error.message).toBe(errorMessage);
|
|
196
194
|
expect(error.code).toBe(ErrorCode.OPERATION_FAILED);
|
|
@@ -230,9 +228,7 @@ describe("AgentRoomOperationResponseHandler", () => {
|
|
|
230
228
|
await handler.handle(message, mockContext);
|
|
231
229
|
|
|
232
230
|
// Should use default error message
|
|
233
|
-
const addErrorCall = emitSpy.mock.calls.find(
|
|
234
|
-
(call) => call[0] === "agent_room:add_error"
|
|
235
|
-
);
|
|
231
|
+
const addErrorCall = emitSpy.mock.calls.find((call) => call[0] === "agent_room:add_error");
|
|
236
232
|
const error = addErrorCall[1] as SDKError;
|
|
237
233
|
expect(error.message).toBe("Agent room operation failed");
|
|
238
234
|
});
|
|
@@ -250,11 +246,7 @@ describe("AgentRoomOperationResponseHandler", () => {
|
|
|
250
246
|
await handler.handle(message, mockContext);
|
|
251
247
|
|
|
252
248
|
// Should emit error events with undefined room_id
|
|
253
|
-
expect(emitSpy).toHaveBeenCalledWith(
|
|
254
|
-
"agent_room:add_error",
|
|
255
|
-
expect.any(SDKError),
|
|
256
|
-
undefined
|
|
257
|
-
);
|
|
249
|
+
expect(emitSpy).toHaveBeenCalledWith("agent_room:add_error", expect.any(SDKError), undefined);
|
|
258
250
|
expect(emitSpy).toHaveBeenCalledWith(
|
|
259
251
|
"agent_room:remove_error",
|
|
260
252
|
expect.any(SDKError),
|
|
@@ -308,7 +300,7 @@ describe("AgentRoomOperationResponseHandler", () => {
|
|
|
308
300
|
describe("Message Validation", () => {
|
|
309
301
|
it("should handle invalid message structure", async () => {
|
|
310
302
|
const invalidMessage = {
|
|
311
|
-
type: "agent_room_operation_response"
|
|
303
|
+
type: "agent_room_operation_response"
|
|
312
304
|
// Missing data field
|
|
313
305
|
} as any;
|
|
314
306
|
|
|
@@ -321,11 +313,7 @@ describe("AgentRoomOperationResponseHandler", () => {
|
|
|
321
313
|
);
|
|
322
314
|
|
|
323
315
|
// Should emit message:error event
|
|
324
|
-
expect(emitSpy).toHaveBeenCalledWith(
|
|
325
|
-
"message:error",
|
|
326
|
-
expect.any(Error),
|
|
327
|
-
invalidMessage
|
|
328
|
-
);
|
|
316
|
+
expect(emitSpy).toHaveBeenCalledWith("message:error", expect.any(Error), invalidMessage);
|
|
329
317
|
});
|
|
330
318
|
|
|
331
319
|
it("should accept valid message with extra fields", async () => {
|
|
@@ -247,7 +247,7 @@ describe("AgentStatusUpdateHandler", () => {
|
|
|
247
247
|
describe("Message Validation", () => {
|
|
248
248
|
it("should handle invalid message structure", async () => {
|
|
249
249
|
const invalidMessage = {
|
|
250
|
-
type: "agent_status_update"
|
|
250
|
+
type: "agent_status_update"
|
|
251
251
|
// Missing data field
|
|
252
252
|
} as any;
|
|
253
253
|
|
|
@@ -260,11 +260,7 @@ describe("AgentStatusUpdateHandler", () => {
|
|
|
260
260
|
);
|
|
261
261
|
|
|
262
262
|
// Should emit message:error event
|
|
263
|
-
expect(emitSpy).toHaveBeenCalledWith(
|
|
264
|
-
"message:error",
|
|
265
|
-
expect.any(Error),
|
|
266
|
-
invalidMessage
|
|
267
|
-
);
|
|
263
|
+
expect(emitSpy).toHaveBeenCalledWith("message:error", expect.any(Error), invalidMessage);
|
|
268
264
|
});
|
|
269
265
|
|
|
270
266
|
it("should accept valid message with extra fields", async () => {
|
|
@@ -542,9 +542,7 @@ describe("AuthSuccessHandler - Room Management", () => {
|
|
|
542
542
|
id: "client-123",
|
|
543
543
|
type: "user",
|
|
544
544
|
address: "0xabc...",
|
|
545
|
-
rooms: [
|
|
546
|
-
{ id: "room-1", name: "Room", is_owner: true } as RoomInfo
|
|
547
|
-
],
|
|
545
|
+
rooms: [{ id: "room-1", name: "Room", is_owner: true } as RoomInfo],
|
|
548
546
|
max_private_rooms: 3
|
|
549
547
|
}
|
|
550
548
|
} as AuthSuccessMessage;
|
|
@@ -143,12 +143,8 @@ describe("ListAvailableAgentsHandler", () => {
|
|
|
143
143
|
agent_id: "agent-1",
|
|
144
144
|
agent_name: "Weather Agent",
|
|
145
145
|
description: "Provides weather information",
|
|
146
|
-
capabilities: [
|
|
147
|
-
|
|
148
|
-
],
|
|
149
|
-
commands: [
|
|
150
|
-
{ trigger: "weather", description: "Check weather" }
|
|
151
|
-
],
|
|
146
|
+
capabilities: [{ name: "weather-forecast", description: "Get weather forecasts" }],
|
|
147
|
+
commands: [{ trigger: "weather", description: "Check weather" }],
|
|
152
148
|
image: "https://example.com/agent.png",
|
|
153
149
|
status: "online"
|
|
154
150
|
}
|
|
@@ -192,7 +188,7 @@ describe("ListAvailableAgentsHandler", () => {
|
|
|
192
188
|
describe("Message Validation", () => {
|
|
193
189
|
it("should handle invalid message structure", async () => {
|
|
194
190
|
const invalidMessage = {
|
|
195
|
-
type: "available_agents_response"
|
|
191
|
+
type: "available_agents_response"
|
|
196
192
|
// Missing data field
|
|
197
193
|
} as any;
|
|
198
194
|
|
|
@@ -205,11 +201,7 @@ describe("ListAvailableAgentsHandler", () => {
|
|
|
205
201
|
);
|
|
206
202
|
|
|
207
203
|
// Should emit message:error event
|
|
208
|
-
expect(emitSpy).toHaveBeenCalledWith(
|
|
209
|
-
"message:error",
|
|
210
|
-
expect.any(Error),
|
|
211
|
-
invalidMessage
|
|
212
|
-
);
|
|
204
|
+
expect(emitSpy).toHaveBeenCalledWith("message:error", expect.any(Error), invalidMessage);
|
|
213
205
|
});
|
|
214
206
|
|
|
215
207
|
it("should accept valid message with extra fields", async () => {
|
|
@@ -227,7 +227,7 @@ describe("ListRoomAgentsHandler", () => {
|
|
|
227
227
|
describe("Message Validation", () => {
|
|
228
228
|
it("should handle invalid message structure", async () => {
|
|
229
229
|
const invalidMessage = {
|
|
230
|
-
type: "room_agents_response"
|
|
230
|
+
type: "room_agents_response"
|
|
231
231
|
// Missing data field
|
|
232
232
|
} as any;
|
|
233
233
|
|
|
@@ -240,11 +240,7 @@ describe("ListRoomAgentsHandler", () => {
|
|
|
240
240
|
);
|
|
241
241
|
|
|
242
242
|
// Should emit message:error event
|
|
243
|
-
expect(emitSpy).toHaveBeenCalledWith(
|
|
244
|
-
"message:error",
|
|
245
|
-
expect.any(Error),
|
|
246
|
-
invalidMessage
|
|
247
|
-
);
|
|
243
|
+
expect(emitSpy).toHaveBeenCalledWith("message:error", expect.any(Error), invalidMessage);
|
|
248
244
|
});
|
|
249
245
|
|
|
250
246
|
it("should accept valid message with extra fields", async () => {
|
|
@@ -240,25 +240,12 @@ describe("RoomOperationResponseHandler", () => {
|
|
|
240
240
|
await handler.handle(message, mockContext);
|
|
241
241
|
|
|
242
242
|
// Should emit all error events (since we can't determine operation type)
|
|
243
|
-
expect(emitSpy).toHaveBeenCalledWith(
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
);
|
|
247
|
-
expect(emitSpy).toHaveBeenCalledWith(
|
|
248
|
-
"room:update_error",
|
|
249
|
-
expect.any(SDKError),
|
|
250
|
-
roomId
|
|
251
|
-
);
|
|
252
|
-
expect(emitSpy).toHaveBeenCalledWith(
|
|
253
|
-
"room:delete_error",
|
|
254
|
-
expect.any(SDKError),
|
|
255
|
-
roomId
|
|
256
|
-
);
|
|
243
|
+
expect(emitSpy).toHaveBeenCalledWith("room:create_error", expect.any(SDKError));
|
|
244
|
+
expect(emitSpy).toHaveBeenCalledWith("room:update_error", expect.any(SDKError), roomId);
|
|
245
|
+
expect(emitSpy).toHaveBeenCalledWith("room:delete_error", expect.any(SDKError), roomId);
|
|
257
246
|
|
|
258
247
|
// Verify error details
|
|
259
|
-
const createErrorCall = emitSpy.mock.calls.find(
|
|
260
|
-
(call) => call[0] === "room:create_error"
|
|
261
|
-
);
|
|
248
|
+
const createErrorCall = emitSpy.mock.calls.find((call) => call[0] === "room:create_error");
|
|
262
249
|
const error = createErrorCall[1] as SDKError;
|
|
263
250
|
expect(error.message).toBe(errorMessage);
|
|
264
251
|
expect(error.code).toBe(ErrorCode.OPERATION_FAILED);
|
|
@@ -290,9 +277,7 @@ describe("RoomOperationResponseHandler", () => {
|
|
|
290
277
|
await handler.handle(message, mockContext);
|
|
291
278
|
|
|
292
279
|
// Should use default error message
|
|
293
|
-
const createErrorCall = emitSpy.mock.calls.find(
|
|
294
|
-
(call) => call[0] === "room:create_error"
|
|
295
|
-
);
|
|
280
|
+
const createErrorCall = emitSpy.mock.calls.find((call) => call[0] === "room:create_error");
|
|
296
281
|
const error = createErrorCall[1] as SDKError;
|
|
297
282
|
expect(error.message).toBe("Room operation failed");
|
|
298
283
|
});
|
|
@@ -310,16 +295,8 @@ describe("RoomOperationResponseHandler", () => {
|
|
|
310
295
|
|
|
311
296
|
// Should still emit error events
|
|
312
297
|
expect(emitSpy).toHaveBeenCalledWith("room:create_error", expect.any(SDKError));
|
|
313
|
-
expect(emitSpy).toHaveBeenCalledWith(
|
|
314
|
-
|
|
315
|
-
expect.any(SDKError),
|
|
316
|
-
undefined
|
|
317
|
-
);
|
|
318
|
-
expect(emitSpy).toHaveBeenCalledWith(
|
|
319
|
-
"room:delete_error",
|
|
320
|
-
expect.any(SDKError),
|
|
321
|
-
undefined
|
|
322
|
-
);
|
|
298
|
+
expect(emitSpy).toHaveBeenCalledWith("room:update_error", expect.any(SDKError), undefined);
|
|
299
|
+
expect(emitSpy).toHaveBeenCalledWith("room:delete_error", expect.any(SDKError), undefined);
|
|
323
300
|
});
|
|
324
301
|
});
|
|
325
302
|
|
|
@@ -431,7 +408,7 @@ describe("RoomOperationResponseHandler", () => {
|
|
|
431
408
|
describe("Message Validation", () => {
|
|
432
409
|
it("should handle invalid message structure", async () => {
|
|
433
410
|
const invalidMessage = {
|
|
434
|
-
type: "room_operation_response"
|
|
411
|
+
type: "room_operation_response"
|
|
435
412
|
// Missing data field
|
|
436
413
|
} as any;
|
|
437
414
|
|
|
@@ -444,11 +421,7 @@ describe("RoomOperationResponseHandler", () => {
|
|
|
444
421
|
);
|
|
445
422
|
|
|
446
423
|
// Should emit message:error event
|
|
447
|
-
expect(emitSpy).toHaveBeenCalledWith(
|
|
448
|
-
"message:error",
|
|
449
|
-
expect.any(Error),
|
|
450
|
-
invalidMessage
|
|
451
|
-
);
|
|
424
|
+
expect(emitSpy).toHaveBeenCalledWith("message:error", expect.any(Error), invalidMessage);
|
|
452
425
|
});
|
|
453
426
|
|
|
454
427
|
it("should accept valid message with extra fields", async () => {
|
|
@@ -8,6 +8,7 @@ import { AgentRoomManager, AgentRoomInfo } from "../../../src/managers/agent-roo
|
|
|
8
8
|
import { RoomManagementManager } from "../../../src/managers/room-management-manager";
|
|
9
9
|
import { WebSocketClient } from "../../../src/core/websocket-client";
|
|
10
10
|
import { Logger, RoomInfo } from "../../../src/types";
|
|
11
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
11
12
|
import { ErrorCode } from "../../../src/types/error-codes";
|
|
12
13
|
|
|
13
14
|
describe("AgentRoomManager", () => {
|
|
@@ -63,7 +64,7 @@ describe("AgentRoomManager", () => {
|
|
|
63
64
|
mockWsClient.isConnected = false;
|
|
64
65
|
|
|
65
66
|
await expect(manager.addAgentToRoom("room-123", "agent-456")).rejects.toThrow(
|
|
66
|
-
"Not connected to Teneo
|
|
67
|
+
"Not connected to Teneo Protocol"
|
|
67
68
|
);
|
|
68
69
|
});
|
|
69
70
|
|
|
@@ -122,9 +123,7 @@ describe("AgentRoomManager", () => {
|
|
|
122
123
|
|
|
123
124
|
it("should invalidate cache after adding agent", async () => {
|
|
124
125
|
// Pre-populate cache
|
|
125
|
-
const cachedAgents: AgentRoomInfo[] = [
|
|
126
|
-
{ agent_id: "agent-1", agent_name: "Agent 1" }
|
|
127
|
-
];
|
|
126
|
+
const cachedAgents: AgentRoomInfo[] = [{ agent_id: "agent-1", agent_name: "Agent 1" }];
|
|
128
127
|
manager.cacheRoomAgents("room-123", cachedAgents);
|
|
129
128
|
|
|
130
129
|
expect(manager.getRoomAgents("room-123")).toHaveLength(1);
|
|
@@ -164,7 +163,7 @@ describe("AgentRoomManager", () => {
|
|
|
164
163
|
mockWsClient.isConnected = false;
|
|
165
164
|
|
|
166
165
|
await expect(manager.removeAgentFromRoom("room-123", "agent-456")).rejects.toThrow(
|
|
167
|
-
"Not connected to Teneo
|
|
166
|
+
"Not connected to Teneo Protocol"
|
|
168
167
|
);
|
|
169
168
|
});
|
|
170
169
|
|
|
@@ -203,9 +202,7 @@ describe("AgentRoomManager", () => {
|
|
|
203
202
|
|
|
204
203
|
it("should invalidate cache after removing agent", async () => {
|
|
205
204
|
// Pre-populate cache
|
|
206
|
-
const cachedAgents: AgentRoomInfo[] = [
|
|
207
|
-
{ agent_id: "agent-456", agent_name: "Agent 456" }
|
|
208
|
-
];
|
|
205
|
+
const cachedAgents: AgentRoomInfo[] = [{ agent_id: "agent-456", agent_name: "Agent 456" }];
|
|
209
206
|
manager.cacheRoomAgents("room-123", cachedAgents);
|
|
210
207
|
|
|
211
208
|
expect(manager.getRoomAgents("room-123")).toHaveLength(1);
|
|
@@ -277,7 +274,7 @@ describe("AgentRoomManager", () => {
|
|
|
277
274
|
mockWsClient.isConnected = false;
|
|
278
275
|
|
|
279
276
|
await expect(manager.listRoomAgents("room-123")).rejects.toThrow(
|
|
280
|
-
"Not connected to Teneo
|
|
277
|
+
"Not connected to Teneo Protocol"
|
|
281
278
|
);
|
|
282
279
|
});
|
|
283
280
|
|
|
@@ -359,7 +356,7 @@ describe("AgentRoomManager", () => {
|
|
|
359
356
|
mockWsClient.isConnected = false;
|
|
360
357
|
|
|
361
358
|
await expect(manager.listAvailableAgents("room-123")).rejects.toThrow(
|
|
362
|
-
"Not connected to Teneo
|
|
359
|
+
"Not connected to Teneo Protocol"
|
|
363
360
|
);
|
|
364
361
|
});
|
|
365
362
|
|
|
@@ -425,9 +422,7 @@ describe("AgentRoomManager", () => {
|
|
|
425
422
|
});
|
|
426
423
|
|
|
427
424
|
describe("Cache Management", () => {
|
|
428
|
-
const mockAgents: AgentRoomInfo[] = [
|
|
429
|
-
{ agent_id: "agent-1", agent_name: "Agent 1" }
|
|
430
|
-
];
|
|
425
|
+
const mockAgents: AgentRoomInfo[] = [{ agent_id: "agent-1", agent_name: "Agent 1" }];
|
|
431
426
|
|
|
432
427
|
it("should cache room agents", () => {
|
|
433
428
|
manager.cacheRoomAgents("room-123", mockAgents);
|
|
@@ -497,9 +492,7 @@ describe("AgentRoomManager", () => {
|
|
|
497
492
|
});
|
|
498
493
|
|
|
499
494
|
describe("Return Value Immutability", () => {
|
|
500
|
-
const mockAgents: AgentRoomInfo[] = [
|
|
501
|
-
{ agent_id: "agent-1", agent_name: "Agent 1" }
|
|
502
|
-
];
|
|
495
|
+
const mockAgents: AgentRoomInfo[] = [{ agent_id: "agent-1", agent_name: "Agent 1" }];
|
|
503
496
|
|
|
504
497
|
it("should return defensive copies from getRoomAgents", () => {
|
|
505
498
|
manager.cacheRoomAgents("room-123", mockAgents);
|
|
@@ -74,17 +74,17 @@ describe("RoomManagementManager", () => {
|
|
|
74
74
|
it("should reject if not connected", async () => {
|
|
75
75
|
mockWsClient.isConnected = false;
|
|
76
76
|
|
|
77
|
-
await expect(
|
|
78
|
-
|
|
79
|
-
)
|
|
77
|
+
await expect(manager.createRoom({ name: "Test Room" })).rejects.toThrow(
|
|
78
|
+
"Not connected to Teneo Protocol"
|
|
79
|
+
);
|
|
80
80
|
});
|
|
81
81
|
|
|
82
82
|
it("should validate room name", async () => {
|
|
83
83
|
await expect(manager.createRoom({ name: "" })).rejects.toThrow("Room name cannot be empty");
|
|
84
84
|
|
|
85
|
-
await expect(
|
|
86
|
-
|
|
87
|
-
)
|
|
85
|
+
await expect(manager.createRoom({ name: "a".repeat(101) })).rejects.toThrow(
|
|
86
|
+
"Room name too long"
|
|
87
|
+
);
|
|
88
88
|
});
|
|
89
89
|
|
|
90
90
|
it("should validate room description", async () => {
|
|
@@ -106,9 +106,7 @@ describe("RoomManagementManager", () => {
|
|
|
106
106
|
} as RoomInfo
|
|
107
107
|
]);
|
|
108
108
|
|
|
109
|
-
await expect(
|
|
110
|
-
manager.createRoom({ name: "New Room" })
|
|
111
|
-
).rejects.toThrow("Room limit reached");
|
|
109
|
+
await expect(manager.createRoom({ name: "New Room" })).rejects.toThrow("Room limit reached");
|
|
112
110
|
});
|
|
113
111
|
|
|
114
112
|
it("should timeout if no response", async () => {
|
|
@@ -178,21 +176,19 @@ describe("RoomManagementManager", () => {
|
|
|
178
176
|
});
|
|
179
177
|
|
|
180
178
|
it("should reject if user doesn't own room", async () => {
|
|
181
|
-
await expect(
|
|
182
|
-
|
|
183
|
-
)
|
|
179
|
+
await expect(manager.updateRoom("room-999", { name: "New Name" })).rejects.toThrow(
|
|
180
|
+
"don't own this room"
|
|
181
|
+
);
|
|
184
182
|
});
|
|
185
183
|
|
|
186
184
|
it("should require at least one field", async () => {
|
|
187
|
-
await expect(manager.updateRoom("room-123", {})).rejects.toThrow(
|
|
188
|
-
"At least one field"
|
|
189
|
-
);
|
|
185
|
+
await expect(manager.updateRoom("room-123", {})).rejects.toThrow("At least one field");
|
|
190
186
|
});
|
|
191
187
|
|
|
192
188
|
it("should validate updated name", async () => {
|
|
193
|
-
await expect(
|
|
194
|
-
|
|
195
|
-
)
|
|
189
|
+
await expect(manager.updateRoom("room-123", { name: "" })).rejects.toThrow(
|
|
190
|
+
"Room name cannot be empty"
|
|
191
|
+
);
|
|
196
192
|
});
|
|
197
193
|
|
|
198
194
|
it("should validate updated description", async () => {
|
|
@@ -273,9 +269,7 @@ describe("RoomManagementManager", () => {
|
|
|
273
269
|
});
|
|
274
270
|
|
|
275
271
|
it("should get room by ID from owned rooms", () => {
|
|
276
|
-
manager.setOwnedRooms([
|
|
277
|
-
{ id: "room-1", name: "Owned Room", is_owner: true } as RoomInfo
|
|
278
|
-
]);
|
|
272
|
+
manager.setOwnedRooms([{ id: "room-1", name: "Owned Room", is_owner: true } as RoomInfo]);
|
|
279
273
|
|
|
280
274
|
const result = manager.getRoomById("room-1");
|
|
281
275
|
expect(result).toBeDefined();
|
|
@@ -283,9 +277,7 @@ describe("RoomManagementManager", () => {
|
|
|
283
277
|
});
|
|
284
278
|
|
|
285
279
|
it("should get room by ID from shared rooms", () => {
|
|
286
|
-
manager.setSharedRooms([
|
|
287
|
-
{ id: "room-2", name: "Shared Room", is_owner: false } as RoomInfo
|
|
288
|
-
]);
|
|
280
|
+
manager.setSharedRooms([{ id: "room-2", name: "Shared Room", is_owner: false } as RoomInfo]);
|
|
289
281
|
|
|
290
282
|
const result = manager.getRoomById("room-2");
|
|
291
283
|
expect(result).toBeDefined();
|
|
@@ -382,9 +374,7 @@ describe("RoomManagementManager", () => {
|
|
|
382
374
|
});
|
|
383
375
|
|
|
384
376
|
it("should remove room from cache", () => {
|
|
385
|
-
manager.setOwnedRooms([
|
|
386
|
-
{ id: "room-1", name: "Room 1", is_owner: true } as RoomInfo
|
|
387
|
-
]);
|
|
377
|
+
manager.setOwnedRooms([{ id: "room-1", name: "Room 1", is_owner: true } as RoomInfo]);
|
|
388
378
|
|
|
389
379
|
expect(manager.getRoomById("room-1")).toBeDefined();
|
|
390
380
|
|
|
@@ -396,12 +386,8 @@ describe("RoomManagementManager", () => {
|
|
|
396
386
|
|
|
397
387
|
it("should clear all caches", () => {
|
|
398
388
|
manager.setRoomLimit(5);
|
|
399
|
-
manager.setOwnedRooms([
|
|
400
|
-
|
|
401
|
-
]);
|
|
402
|
-
manager.setSharedRooms([
|
|
403
|
-
{ id: "room-2", name: "Room 2", is_owner: false } as RoomInfo
|
|
404
|
-
]);
|
|
389
|
+
manager.setOwnedRooms([{ id: "room-1", name: "Room 1", is_owner: true } as RoomInfo]);
|
|
390
|
+
manager.setSharedRooms([{ id: "room-2", name: "Room 2", is_owner: false } as RoomInfo]);
|
|
405
391
|
|
|
406
392
|
manager.clearCaches();
|
|
407
393
|
|
|
@@ -413,9 +399,7 @@ describe("RoomManagementManager", () => {
|
|
|
413
399
|
|
|
414
400
|
describe("Return Value Immutability", () => {
|
|
415
401
|
it("should return defensive copies from getOwnedRooms", () => {
|
|
416
|
-
manager.setOwnedRooms([
|
|
417
|
-
{ id: "room-1", name: "Room 1", is_owner: true } as RoomInfo
|
|
418
|
-
]);
|
|
402
|
+
manager.setOwnedRooms([{ id: "room-1", name: "Room 1", is_owner: true } as RoomInfo]);
|
|
419
403
|
|
|
420
404
|
const rooms1 = manager.getOwnedRooms();
|
|
421
405
|
const rooms2 = manager.getOwnedRooms();
|
|
@@ -425,9 +409,7 @@ describe("RoomManagementManager", () => {
|
|
|
425
409
|
});
|
|
426
410
|
|
|
427
411
|
it("should return defensive copy from getRoomById", () => {
|
|
428
|
-
manager.setOwnedRooms([
|
|
429
|
-
{ id: "room-1", name: "Room 1", is_owner: true } as RoomInfo
|
|
430
|
-
]);
|
|
412
|
+
manager.setOwnedRooms([{ id: "room-1", name: "Room 1", is_owner: true } as RoomInfo]);
|
|
431
413
|
|
|
432
414
|
const room1 = manager.getRoomById("room-1");
|
|
433
415
|
const room2 = manager.getRoomById("room-1");
|
package/tsconfig.json
CHANGED
package/vitest.config.ts
CHANGED