@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
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import { describe, it, expect, beforeEach } from "vitest";
|
|
6
|
-
import { BoundedQueue, QueueOverflowError
|
|
6
|
+
import { BoundedQueue, QueueOverflowError } from "./bounded-queue";
|
|
7
7
|
|
|
8
8
|
describe("BoundedQueue", () => {
|
|
9
9
|
describe("constructor", () => {
|
|
@@ -181,10 +181,11 @@ export class BoundedQueue<T> {
|
|
|
181
181
|
`Queue is full (max size: ${this.maxSize}). Cannot add more items.`
|
|
182
182
|
);
|
|
183
183
|
|
|
184
|
-
default:
|
|
184
|
+
default: {
|
|
185
185
|
// TypeScript exhaustiveness check
|
|
186
186
|
const _exhaustive: never = this.strategy;
|
|
187
187
|
throw new Error(`Unknown overflow strategy: ${_exhaustive}`);
|
|
188
|
+
}
|
|
188
189
|
}
|
|
189
190
|
}
|
|
190
191
|
}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import { describe, it, expect, beforeEach, vi } from "vitest";
|
|
6
|
-
import { CircuitBreaker, CircuitBreakerError
|
|
6
|
+
import { CircuitBreaker, CircuitBreakerError } from "./circuit-breaker";
|
|
7
7
|
|
|
8
8
|
describe("CircuitBreaker", () => {
|
|
9
9
|
describe("constructor", () => {
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Tests for Deduplication Cache
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import { describe, it, expect, beforeEach
|
|
5
|
+
import { describe, it, expect, beforeEach } from "vitest";
|
|
6
6
|
import { DeduplicationCache } from "./deduplication-cache";
|
|
7
7
|
|
|
8
8
|
describe("DeduplicationCache", () => {
|
|
@@ -123,7 +123,7 @@ describe("waitForEvent", () => {
|
|
|
123
123
|
it("should timeout if no matching event arrives", async () => {
|
|
124
124
|
const promise = waitForEvent(emitter, "filtered:event", {
|
|
125
125
|
timeout: 1000,
|
|
126
|
-
filter: (data:
|
|
126
|
+
filter: (data: { id: number }) => data.id === 999
|
|
127
127
|
});
|
|
128
128
|
|
|
129
129
|
// Emit non-matching events
|
|
@@ -60,7 +60,7 @@ export interface WaitForEventOptions<T> {
|
|
|
60
60
|
* });
|
|
61
61
|
* ```
|
|
62
62
|
*/
|
|
63
|
-
export async function waitForEvent<T =
|
|
63
|
+
export async function waitForEvent<T = unknown>(
|
|
64
64
|
emitter: EventEmitter,
|
|
65
65
|
eventName: string,
|
|
66
66
|
options: WaitForEventOptions<T>
|
|
@@ -129,7 +129,7 @@ export async function waitForEvent<T = any>(
|
|
|
129
129
|
* ]);
|
|
130
130
|
* ```
|
|
131
131
|
*/
|
|
132
|
-
export async function waitForAnyEvent<T =
|
|
132
|
+
export async function waitForAnyEvent<T = unknown>(
|
|
133
133
|
waiters: Array<{
|
|
134
134
|
emitter: EventEmitter;
|
|
135
135
|
eventName: string;
|
|
@@ -157,7 +157,7 @@ export async function waitForAnyEvent<T = any>(
|
|
|
157
157
|
* ]);
|
|
158
158
|
* ```
|
|
159
159
|
*/
|
|
160
|
-
export async function waitForAllEvents<T =
|
|
160
|
+
export async function waitForAllEvents<T = unknown>(
|
|
161
161
|
waiters: Array<{
|
|
162
162
|
emitter: EventEmitter;
|
|
163
163
|
eventName: string;
|
package/src/utils/index.ts
CHANGED
package/src/utils/logger.ts
CHANGED
|
@@ -55,30 +55,30 @@ export function createPinoLogger(level: LogLevel, name?: string): Logger {
|
|
|
55
55
|
|
|
56
56
|
// Adapt pino's API to match our Logger interface
|
|
57
57
|
return {
|
|
58
|
-
debug: (message: string, data?:
|
|
58
|
+
debug: (message: string, data?: unknown) => {
|
|
59
59
|
if (data !== undefined) {
|
|
60
|
-
pinoLogger.debug(data, message);
|
|
60
|
+
pinoLogger.debug(data as object, message);
|
|
61
61
|
} else {
|
|
62
62
|
pinoLogger.debug(message);
|
|
63
63
|
}
|
|
64
64
|
},
|
|
65
|
-
info: (message: string, data?:
|
|
65
|
+
info: (message: string, data?: unknown) => {
|
|
66
66
|
if (data !== undefined) {
|
|
67
|
-
pinoLogger.info(data, message);
|
|
67
|
+
pinoLogger.info(data as object, message);
|
|
68
68
|
} else {
|
|
69
69
|
pinoLogger.info(message);
|
|
70
70
|
}
|
|
71
71
|
},
|
|
72
|
-
warn: (message: string, data?:
|
|
72
|
+
warn: (message: string, data?: unknown) => {
|
|
73
73
|
if (data !== undefined) {
|
|
74
|
-
pinoLogger.warn(data, message);
|
|
74
|
+
pinoLogger.warn(data as object, message);
|
|
75
75
|
} else {
|
|
76
76
|
pinoLogger.warn(message);
|
|
77
77
|
}
|
|
78
78
|
},
|
|
79
|
-
error: (message: string, data?:
|
|
79
|
+
error: (message: string, data?: unknown) => {
|
|
80
80
|
if (data !== undefined) {
|
|
81
|
-
pinoLogger.error(data, message);
|
|
81
|
+
pinoLogger.error(data as object, message);
|
|
82
82
|
} else {
|
|
83
83
|
pinoLogger.error(message);
|
|
84
84
|
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { Agent, CommandPricing } from "../types";
|
|
2
|
+
|
|
3
|
+
const VALID_PRICE_TYPES = ["free", "per-query", "per-item", "time-based-task"] as const;
|
|
4
|
+
type PriceType = (typeof VALID_PRICE_TYPES)[number];
|
|
5
|
+
|
|
6
|
+
export interface ResolvedPricing {
|
|
7
|
+
pricePerUnit: number;
|
|
8
|
+
priceType: PriceType;
|
|
9
|
+
taskUnit?: string;
|
|
10
|
+
timeUnit?: "hour" | "day";
|
|
11
|
+
totalPrice: number;
|
|
12
|
+
itemCount?: number;
|
|
13
|
+
duration?: number;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface PriceResolutionOptions {
|
|
17
|
+
commandTrigger?: string;
|
|
18
|
+
itemCount?: number;
|
|
19
|
+
duration?: number;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function isValidPriceType(type: string): type is PriceType {
|
|
23
|
+
return VALID_PRICE_TYPES.includes(type as PriceType);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function resolveAgentPricing(
|
|
27
|
+
agent: Agent,
|
|
28
|
+
options: PriceResolutionOptions = {}
|
|
29
|
+
): ResolvedPricing | null {
|
|
30
|
+
const { commandTrigger, itemCount = 1, duration = 1 } = options;
|
|
31
|
+
|
|
32
|
+
// Validate itemCount and duration are positive
|
|
33
|
+
if (itemCount < 0 || duration < 0) {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
let pricing: CommandPricing | undefined;
|
|
38
|
+
|
|
39
|
+
if (commandTrigger && agent.commands) {
|
|
40
|
+
const command = agent.commands.find(
|
|
41
|
+
(cmd) => cmd.trigger.toLowerCase() === commandTrigger.toLowerCase()
|
|
42
|
+
);
|
|
43
|
+
pricing = command?.pricing;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (!pricing) {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const rawPriceType = pricing.priceType || "free";
|
|
51
|
+
const priceType: PriceType = isValidPriceType(rawPriceType) ? rawPriceType : "free";
|
|
52
|
+
const pricePerUnit = pricing.pricePerUnit || 0;
|
|
53
|
+
|
|
54
|
+
// Reject negative prices
|
|
55
|
+
if (pricePerUnit < 0) {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (priceType === "free" || pricePerUnit === 0) {
|
|
60
|
+
return {
|
|
61
|
+
pricePerUnit: 0,
|
|
62
|
+
priceType: "free",
|
|
63
|
+
totalPrice: 0
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
let totalPrice: number;
|
|
68
|
+
|
|
69
|
+
switch (priceType) {
|
|
70
|
+
case "per-query":
|
|
71
|
+
totalPrice = pricePerUnit;
|
|
72
|
+
break;
|
|
73
|
+
case "per-item":
|
|
74
|
+
totalPrice = pricePerUnit * itemCount;
|
|
75
|
+
break;
|
|
76
|
+
case "time-based-task":
|
|
77
|
+
totalPrice = pricePerUnit * duration;
|
|
78
|
+
break;
|
|
79
|
+
default:
|
|
80
|
+
totalPrice = pricePerUnit;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return {
|
|
84
|
+
pricePerUnit,
|
|
85
|
+
priceType,
|
|
86
|
+
taskUnit: pricing.taskUnit,
|
|
87
|
+
timeUnit: pricing.timeUnit,
|
|
88
|
+
totalPrice,
|
|
89
|
+
itemCount: priceType === "per-item" ? itemCount : undefined,
|
|
90
|
+
duration: priceType === "time-based-task" ? duration : undefined
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export function parseCommandForPricing(content: string): {
|
|
95
|
+
agentName?: string;
|
|
96
|
+
commandTrigger?: string;
|
|
97
|
+
itemCount?: number;
|
|
98
|
+
duration?: number;
|
|
99
|
+
} {
|
|
100
|
+
const directCommandMatch = content.match(/^@(\S+)\s+(.+)$/);
|
|
101
|
+
if (!directCommandMatch) {
|
|
102
|
+
return {};
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const agentName = directCommandMatch[1];
|
|
106
|
+
const commandContent = directCommandMatch[2];
|
|
107
|
+
|
|
108
|
+
const parts = commandContent.trim().split(/\s+/);
|
|
109
|
+
const commandTrigger = parts[0];
|
|
110
|
+
const args = parts.slice(1);
|
|
111
|
+
|
|
112
|
+
let itemCount: number | undefined;
|
|
113
|
+
let duration: number | undefined;
|
|
114
|
+
|
|
115
|
+
for (const arg of args) {
|
|
116
|
+
const numMatch = arg.match(/^(\d+)$/);
|
|
117
|
+
if (numMatch) {
|
|
118
|
+
itemCount = parseInt(numMatch[1], 10);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
const durationMatch = arg.match(/^(\d+)(h|d)$/i);
|
|
122
|
+
if (durationMatch) {
|
|
123
|
+
duration = parseInt(durationMatch[1], 10);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
return { agentName, commandTrigger, itemCount, duration };
|
|
128
|
+
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Tests for Token Bucket Rate Limiter
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import { describe, it, expect
|
|
5
|
+
import { describe, it, expect } from "vitest";
|
|
6
6
|
import { TokenBucketRateLimiter, RateLimitError } from "./rate-limiter";
|
|
7
7
|
|
|
8
8
|
describe("TokenBucketRateLimiter", () => {
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
* Tests for Signature Verifier
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import { describe, it, expect
|
|
5
|
+
import { describe, it, expect } from "vitest";
|
|
6
6
|
import { privateKeyToAccount } from "viem/accounts";
|
|
7
7
|
import { SignatureVerifier } from "./signature-verifier";
|
|
8
|
-
import { BaseMessage
|
|
8
|
+
import { BaseMessage } from "../types";
|
|
9
9
|
|
|
10
10
|
describe("SignatureVerifier", () => {
|
|
11
11
|
// Test accounts
|
|
@@ -198,10 +198,11 @@ export class SignatureVerifier {
|
|
|
198
198
|
* @returns Object containing signable fields
|
|
199
199
|
*/
|
|
200
200
|
public getSignableContent(message: BaseMessage): object {
|
|
201
|
-
|
|
201
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
202
|
+
const { signature: _signature, publicKey: _publicKey, id: _id, ...signableContent } = message;
|
|
202
203
|
|
|
203
204
|
// Include only defined fields for consistent hashing
|
|
204
|
-
const filtered: Record<string,
|
|
205
|
+
const filtered: Record<string, unknown> = {};
|
|
205
206
|
for (const [key, value] of Object.entries(signableContent)) {
|
|
206
207
|
if (value !== undefined) {
|
|
207
208
|
filtered[key] = value;
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Direct Agent Test - Tests direct @agent commands with payment
|
|
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/direct-agent-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/direct-agent-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 testDirectAgentCommand() {
|
|
37
|
+
console.log("=== Direct Agent Command 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
|
+
if (response.content) {
|
|
83
|
+
console.log(" Content:", response.content.substring(0, 200) + "...");
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
sdk.on("error", (error) => console.error("❌ Error:", error.message));
|
|
87
|
+
|
|
88
|
+
try {
|
|
89
|
+
// Connect
|
|
90
|
+
console.log("\nConnecting to", WS_URL);
|
|
91
|
+
await sdk.connect();
|
|
92
|
+
console.log("Connected!\n");
|
|
93
|
+
|
|
94
|
+
// Wait for auth to complete and room to be set
|
|
95
|
+
await sleep(500);
|
|
96
|
+
|
|
97
|
+
if (!TEST_ROOM) {
|
|
98
|
+
throw new Error("No room available - auth may have failed");
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// Subscribe to test room
|
|
102
|
+
console.log("Subscribing to room:", TEST_ROOM);
|
|
103
|
+
try {
|
|
104
|
+
await sdk.subscribeToRoom(TEST_ROOM);
|
|
105
|
+
console.log("Subscribed!\n");
|
|
106
|
+
} catch {
|
|
107
|
+
console.log("Room subscription skipped (private room)\n");
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Wait a bit for connection to stabilize
|
|
111
|
+
await sleep(1000);
|
|
112
|
+
|
|
113
|
+
// Send direct agent command - bypasses coordinator, goes directly to agent
|
|
114
|
+
console.log("\n=== Sending Direct Agent Command ===");
|
|
115
|
+
console.log('Command: "@x-agent-enterprise-v2 user @elonmusk"\n');
|
|
116
|
+
|
|
117
|
+
const response = await sdk.sendMessage("@x-agent-enterprise-v2 user @elonmusk", {
|
|
118
|
+
room: TEST_ROOM,
|
|
119
|
+
waitForResponse: true,
|
|
120
|
+
timeout: 120000 // 2 minutes
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
if (response) {
|
|
124
|
+
console.log("\n=== Test Complete ===");
|
|
125
|
+
console.log("Response received successfully!");
|
|
126
|
+
console.log(
|
|
127
|
+
"Humanized:",
|
|
128
|
+
typeof response.humanized === "string"
|
|
129
|
+
? response.humanized.substring(0, 500)
|
|
130
|
+
: JSON.stringify(response, null, 2).substring(0, 500)
|
|
131
|
+
);
|
|
132
|
+
}
|
|
133
|
+
} catch (error: unknown) {
|
|
134
|
+
const err = error as Error & { details?: unknown };
|
|
135
|
+
console.error("\n❌ Test failed:", err.message);
|
|
136
|
+
if (err.details) {
|
|
137
|
+
console.error("Details:", err.details);
|
|
138
|
+
}
|
|
139
|
+
} finally {
|
|
140
|
+
console.log("\nDisconnecting...");
|
|
141
|
+
sdk.destroy();
|
|
142
|
+
console.log("Done!");
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function sleep(ms: number): Promise<void> {
|
|
147
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// Run the test
|
|
151
|
+
testDirectAgentCommand().catch(console.error);
|
|
@@ -49,6 +49,7 @@ const hasCredentials = !!(
|
|
|
49
49
|
describe.skipIf(!hasCredentials)("Real Teneo Server Integration Test", () => {
|
|
50
50
|
let sdk: TeneoSDK;
|
|
51
51
|
let authState: AuthenticationState;
|
|
52
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
52
53
|
let receivedAgents: Agent[] = [];
|
|
53
54
|
let privateRoomId: string = "";
|
|
54
55
|
|
|
@@ -143,6 +144,7 @@ describe.skipIf(!hasCredentials)("Real Teneo Server Integration Test", () => {
|
|
|
143
144
|
|
|
144
145
|
let challengeReceived = false;
|
|
145
146
|
let authSuccessReceived = false;
|
|
147
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
146
148
|
let usedCachedAuth = false;
|
|
147
149
|
|
|
148
150
|
const challengePromise = new Promise<string | null>((resolve) => {
|