@teneo-protocol/sdk 2.0.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.json +11 -2
- package/.github/CODEOWNERS +2 -0
- package/.github/ISSUE_TEMPLATE/01-bug.yml +85 -0
- package/.github/ISSUE_TEMPLATE/config.yml +8 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +22 -0
- package/.github/workflows/claude-code-review.yml +8 -3
- package/.github/workflows/claude-reviewer.yml +6 -4
- package/.github/workflows/publish-npm.yml +1 -0
- package/.github/workflows/push-to-main.yml +1 -1
- package/.github/workflows/top-issue.yml +102 -0
- package/CHANGELOG.md +69 -0
- package/CONCEPTS.md +747 -0
- package/README.md +178 -8
- package/dist/constants.js +8 -8
- package/dist/constants.js.map +1 -1
- package/dist/core/websocket-client.d.ts +15 -3
- package/dist/core/websocket-client.d.ts.map +1 -1
- package/dist/core/websocket-client.js +52 -13
- package/dist/core/websocket-client.js.map +1 -1
- package/dist/formatters/response-formatter.js +4 -0
- package/dist/formatters/response-formatter.js.map +1 -1
- package/dist/handlers/message-handler-registry.js +2 -1
- package/dist/handlers/message-handler-registry.js.map +1 -1
- package/dist/handlers/message-handlers/agent-details-response-handler.d.ts +1666 -0
- package/dist/handlers/message-handlers/agent-details-response-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/agent-details-response-handler.js +38 -0
- package/dist/handlers/message-handlers/agent-details-response-handler.js.map +1 -0
- package/dist/handlers/message-handlers/agent-room-operation-response-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/agent-room-operation-response-handler.js +2 -5
- package/dist/handlers/message-handlers/agent-room-operation-response-handler.js.map +1 -1
- package/dist/handlers/message-handlers/agent-selected-handler.js +2 -5
- package/dist/handlers/message-handlers/agent-selected-handler.js.map +1 -1
- package/dist/handlers/message-handlers/agent-status-update-handler.d.ts +783 -0
- package/dist/handlers/message-handlers/agent-status-update-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/agent-status-update-handler.js +2 -5
- package/dist/handlers/message-handlers/agent-status-update-handler.js.map +1 -1
- package/dist/handlers/message-handlers/agents-list-handler.js +2 -5
- package/dist/handlers/message-handlers/agents-list-handler.js.map +1 -1
- package/dist/handlers/message-handlers/all-agents-response-handler.d.ts +439 -0
- package/dist/handlers/message-handlers/all-agents-response-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/all-agents-response-handler.js +36 -0
- package/dist/handlers/message-handlers/all-agents-response-handler.js.map +1 -0
- package/dist/handlers/message-handlers/auth-error-handler.js +2 -5
- package/dist/handlers/message-handlers/auth-error-handler.js.map +1 -1
- package/dist/handlers/message-handlers/auth-message-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/auth-message-handler.js +6 -5
- package/dist/handlers/message-handlers/auth-message-handler.js.map +1 -1
- package/dist/handlers/message-handlers/auth-required-handler.js +2 -5
- package/dist/handlers/message-handlers/auth-required-handler.js.map +1 -1
- package/dist/handlers/message-handlers/auth-success-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/auth-success-handler.js +6 -5
- package/dist/handlers/message-handlers/auth-success-handler.js.map +1 -1
- package/dist/handlers/message-handlers/base-handler.d.ts +4 -4
- package/dist/handlers/message-handlers/base-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/base-handler.js +3 -1
- package/dist/handlers/message-handlers/base-handler.js.map +1 -1
- package/dist/handlers/message-handlers/challenge-handler.js +3 -2
- package/dist/handlers/message-handlers/challenge-handler.js.map +1 -1
- package/dist/handlers/message-handlers/error-message-handler.js +2 -5
- package/dist/handlers/message-handlers/error-message-handler.js.map +1 -1
- package/dist/handlers/message-handlers/index.d.ts +6 -0
- package/dist/handlers/message-handlers/index.d.ts.map +1 -1
- package/dist/handlers/message-handlers/index.js +33 -1
- package/dist/handlers/message-handlers/index.js.map +1 -1
- package/dist/handlers/message-handlers/list-available-agents-handler.d.ts +783 -0
- package/dist/handlers/message-handlers/list-available-agents-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/list-available-agents-handler.js +2 -5
- package/dist/handlers/message-handlers/list-available-agents-handler.js.map +1 -1
- package/dist/handlers/message-handlers/list-room-agents-handler.d.ts +783 -0
- package/dist/handlers/message-handlers/list-room-agents-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/list-room-agents-handler.js +2 -5
- package/dist/handlers/message-handlers/list-room-agents-handler.js.map +1 -1
- package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts +2 -199
- package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/list-rooms-response-handler.js +4 -6
- package/dist/handlers/message-handlers/list-rooms-response-handler.js.map +1 -1
- package/dist/handlers/message-handlers/ping-pong-handler.js +4 -10
- package/dist/handlers/message-handlers/ping-pong-handler.js.map +1 -1
- package/dist/handlers/message-handlers/rate-limit-notification-handler.d.ts +94 -0
- package/dist/handlers/message-handlers/rate-limit-notification-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/rate-limit-notification-handler.js +35 -0
- package/dist/handlers/message-handlers/rate-limit-notification-handler.js.map +1 -0
- package/dist/handlers/message-handlers/regular-message-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/regular-message-handler.js +4 -6
- package/dist/handlers/message-handlers/regular-message-handler.js.map +1 -1
- package/dist/handlers/message-handlers/room-operation-response-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/room-operation-response-handler.js +2 -5
- package/dist/handlers/message-handlers/room-operation-response-handler.js.map +1 -1
- package/dist/handlers/message-handlers/subscribe-response-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/subscribe-response-handler.js +4 -6
- package/dist/handlers/message-handlers/subscribe-response-handler.js.map +1 -1
- package/dist/handlers/message-handlers/task-quote-handler.d.ts +14 -0
- package/dist/handlers/message-handlers/task-quote-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/task-quote-handler.js +29 -0
- package/dist/handlers/message-handlers/task-quote-handler.js.map +1 -0
- package/dist/handlers/message-handlers/task-response-handler.js +2 -5
- package/dist/handlers/message-handlers/task-response-handler.js.map +1 -1
- package/dist/handlers/message-handlers/types.d.ts +21 -9
- package/dist/handlers/message-handlers/types.d.ts.map +1 -1
- package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/unsubscribe-response-handler.js +4 -6
- package/dist/handlers/message-handlers/unsubscribe-response-handler.js.map +1 -1
- package/dist/handlers/message-handlers/user-authenticated-handler.d.ts +40 -0
- package/dist/handlers/message-handlers/user-authenticated-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/user-authenticated-handler.js +28 -0
- package/dist/handlers/message-handlers/user-authenticated-handler.js.map +1 -0
- package/dist/handlers/message-handlers/user-count-handler.d.ts +49 -0
- package/dist/handlers/message-handlers/user-count-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/user-count-handler.js +31 -0
- package/dist/handlers/message-handlers/user-count-handler.js.map +1 -0
- package/dist/handlers/webhook-handler.d.ts +1 -1
- package/dist/handlers/webhook-handler.d.ts.map +1 -1
- package/dist/handlers/webhook-handler.js +14 -5
- package/dist/handlers/webhook-handler.js.map +1 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -2
- package/dist/index.js.map +1 -1
- package/dist/managers/admin-manager.d.ts +116 -0
- package/dist/managers/admin-manager.d.ts.map +1 -0
- package/dist/managers/admin-manager.js +169 -0
- package/dist/managers/admin-manager.js.map +1 -0
- package/dist/managers/agent-registry.d.ts +52 -1
- package/dist/managers/agent-registry.d.ts.map +1 -1
- package/dist/managers/agent-registry.js +145 -6
- package/dist/managers/agent-registry.js.map +1 -1
- package/dist/managers/agent-room-manager.d.ts +1 -7
- package/dist/managers/agent-room-manager.d.ts.map +1 -1
- package/dist/managers/agent-room-manager.js +83 -36
- package/dist/managers/agent-room-manager.js.map +1 -1
- package/dist/managers/connection-manager.js +2 -0
- package/dist/managers/connection-manager.js.map +1 -1
- package/dist/managers/index.d.ts +2 -1
- package/dist/managers/index.d.ts.map +1 -1
- package/dist/managers/index.js +3 -1
- package/dist/managers/index.js.map +1 -1
- package/dist/managers/message-router.d.ts +56 -5
- package/dist/managers/message-router.d.ts.map +1 -1
- package/dist/managers/message-router.js +155 -8
- package/dist/managers/message-router.js.map +1 -1
- package/dist/managers/room-management-manager.d.ts.map +1 -1
- package/dist/managers/room-management-manager.js +9 -7
- package/dist/managers/room-management-manager.js.map +1 -1
- package/dist/managers/room-manager.d.ts +7 -5
- package/dist/managers/room-manager.d.ts.map +1 -1
- package/dist/managers/room-manager.js +14 -10
- package/dist/managers/room-manager.js.map +1 -1
- package/dist/payments/index.d.ts +5 -0
- package/dist/payments/index.d.ts.map +1 -0
- package/dist/payments/index.js +21 -0
- package/dist/payments/index.js.map +1 -0
- package/dist/payments/payment-client.d.ts +74 -0
- package/dist/payments/payment-client.d.ts.map +1 -0
- package/dist/payments/payment-client.js +207 -0
- package/dist/payments/payment-client.js.map +1 -0
- package/dist/teneo-sdk.d.ts +135 -21
- package/dist/teneo-sdk.d.ts.map +1 -1
- package/dist/teneo-sdk.js +268 -26
- package/dist/teneo-sdk.js.map +1 -1
- package/dist/types/categories.d.ts +22 -0
- package/dist/types/categories.d.ts.map +1 -0
- package/dist/types/categories.js +40 -0
- package/dist/types/categories.js.map +1 -0
- package/dist/types/config.d.ts +79 -8
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +62 -5
- package/dist/types/config.js.map +1 -1
- package/dist/types/error-codes.d.ts +8 -0
- package/dist/types/error-codes.d.ts.map +1 -1
- package/dist/types/error-codes.js +9 -0
- package/dist/types/error-codes.js.map +1 -1
- package/dist/types/events.d.ts +44 -0
- package/dist/types/events.d.ts.map +1 -1
- package/dist/types/events.js +19 -1
- package/dist/types/events.js.map +1 -1
- package/dist/types/index.d.ts +3 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +33 -3
- package/dist/types/index.js.map +1 -1
- package/dist/types/messages.d.ts +11219 -423
- package/dist/types/messages.d.ts.map +1 -1
- package/dist/types/messages.js +249 -7
- package/dist/types/messages.js.map +1 -1
- package/dist/utils/bounded-queue.d.ts.map +1 -1
- package/dist/utils/bounded-queue.js +5 -2
- package/dist/utils/bounded-queue.js.map +1 -1
- package/dist/utils/circuit-breaker.js +11 -4
- package/dist/utils/circuit-breaker.js.map +1 -1
- package/dist/utils/deduplication-cache.js +3 -1
- package/dist/utils/deduplication-cache.js.map +1 -1
- package/dist/utils/event-waiter.d.ts +3 -3
- package/dist/utils/event-waiter.d.ts.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +4 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/pricing-resolver.d.ts +26 -0
- package/dist/utils/pricing-resolver.d.ts.map +1 -0
- package/dist/utils/pricing-resolver.js +85 -0
- package/dist/utils/pricing-resolver.js.map +1 -0
- package/dist/utils/rate-limiter.d.ts.map +1 -1
- package/dist/utils/rate-limiter.js +6 -0
- package/dist/utils/rate-limiter.js.map +1 -1
- package/dist/utils/retry-policy.js +1 -0
- package/dist/utils/retry-policy.js.map +1 -1
- package/dist/utils/secure-private-key.js +3 -1
- package/dist/utils/secure-private-key.js.map +1 -1
- package/dist/utils/signature-verifier.d.ts.map +1 -1
- package/dist/utils/signature-verifier.js +3 -1
- package/dist/utils/signature-verifier.js.map +1 -1
- package/examples/.env.example +1 -1
- package/examples/agent-room-management-example.ts +10 -9
- package/examples/basic-usage.ts +3 -4
- package/examples/claude-agent-x-follower/.env.example +1 -1
- package/examples/claude-agent-x-follower/QUICKSTART.md +2 -2
- package/examples/claude-agent-x-follower/README.md +2 -2
- package/examples/claude-agent-x-follower/index.ts +120 -96
- package/examples/n8n-teneo/.env.example +1 -1
- package/examples/n8n-teneo/README.md +1 -1
- package/examples/n8n-teneo/index.ts +54 -44
- package/examples/nestjs-dashboard/.env.example +11 -0
- package/examples/nestjs-dashboard/README.md +297 -0
- package/examples/nestjs-dashboard/nest-cli.json +10 -0
- package/examples/nestjs-dashboard/package.json +44 -0
- package/examples/nestjs-dashboard/pnpm-lock.yaml +3079 -0
- package/examples/nestjs-dashboard/src/app.controller.ts +24 -0
- package/examples/nestjs-dashboard/src/app.module.ts +15 -0
- package/examples/nestjs-dashboard/src/main.ts +32 -0
- package/examples/nestjs-dashboard/src/public/dashboard.html +1144 -0
- package/examples/nestjs-dashboard/src/teneo/agents.controller.ts +54 -0
- package/examples/nestjs-dashboard/src/teneo/events.controller.ts +65 -0
- package/examples/nestjs-dashboard/src/teneo/messages.controller.ts +47 -0
- package/examples/nestjs-dashboard/src/teneo/rooms.controller.ts +258 -0
- package/examples/nestjs-dashboard/src/teneo/teneo.module.ts +13 -0
- package/examples/nestjs-dashboard/src/teneo/teneo.service.ts +484 -0
- package/examples/nestjs-dashboard/tsconfig.json +22 -0
- package/examples/openai-teneo/.env.example +1 -1
- package/examples/openai-teneo/README.md +2 -2
- package/examples/openai-teneo/index.ts +82 -71
- package/examples/production-dashboard/.env.example +1 -1
- package/examples/production-dashboard/README.md +1 -1
- package/examples/production-dashboard/server.ts +2 -2
- package/examples/room-management-example.ts +5 -8
- package/examples/usage/.env.example +1 -1
- package/examples/usage/01-connect.ts +3 -4
- package/examples/usage/02-list-agents.ts +2 -3
- package/examples/usage/03-pick-agent.ts +2 -3
- package/examples/usage/04-find-by-capability.ts +2 -3
- package/examples/usage/05-webhook-example.ts +2 -3
- package/examples/usage/06-simple-api-server.ts +2 -3
- package/examples/usage/07-event-listener.ts +2 -3
- package/examples/webhook-integration.ts +1 -1
- package/examples/x-influencer-battle-server.ts +2 -2
- package/package.json +4 -1
- package/src/core/websocket-client.test.ts +8 -3
- package/src/core/websocket-client.ts +36 -6
- package/src/formatters/response-formatter.test.ts +2 -0
- package/src/formatters/response-formatter.ts +3 -3
- package/src/handlers/message-handlers/agent-details-response-handler.ts +42 -0
- package/src/handlers/message-handlers/agent-room-operation-response-handler.ts +2 -8
- package/src/handlers/message-handlers/agent-status-update-handler.ts +3 -9
- package/src/handlers/message-handlers/all-agents-response-handler.ts +39 -0
- package/src/handlers/message-handlers/auth-message-handler.ts +5 -0
- package/src/handlers/message-handlers/auth-success-handler.ts +6 -1
- package/src/handlers/message-handlers/base-handler.ts +20 -7
- package/src/handlers/message-handlers/index.ts +34 -0
- package/src/handlers/message-handlers/list-room-agents-handler.ts +2 -5
- package/src/handlers/message-handlers/list-rooms-response-handler.ts +4 -2
- package/src/handlers/message-handlers/rate-limit-notification-handler.ts +45 -0
- package/src/handlers/message-handlers/regular-message-handler.ts +3 -2
- package/src/handlers/message-handlers/room-operation-response-handler.ts +3 -6
- package/src/handlers/message-handlers/subscribe-response-handler.ts +12 -2
- package/src/handlers/message-handlers/task-quote-handler.ts +31 -0
- package/src/handlers/message-handlers/types.ts +37 -9
- package/src/handlers/message-handlers/unsubscribe-response-handler.ts +12 -2
- package/src/handlers/message-handlers/user-authenticated-handler.ts +31 -0
- package/src/handlers/message-handlers/user-count-handler.ts +34 -0
- package/src/handlers/webhook-handler.test.ts +3 -2
- package/src/handlers/webhook-handler.ts +13 -7
- package/src/index.ts +21 -0
- package/src/managers/admin-manager.ts +249 -0
- package/src/managers/agent-registry.test.ts +2 -1
- package/src/managers/agent-registry.ts +170 -2
- package/src/managers/agent-room-manager.ts +98 -42
- package/src/managers/index.ts +13 -1
- package/src/managers/message-router.ts +215 -17
- package/src/managers/room-management-manager.ts +4 -7
- package/src/managers/room-manager.ts +11 -15
- package/src/payments/index.ts +22 -0
- package/src/payments/payment-client.ts +240 -0
- package/src/teneo-sdk.ts +302 -27
- package/src/types/categories.ts +45 -0
- package/src/types/config.ts +70 -2
- package/src/types/error-codes.ts +10 -0
- package/src/types/events.test.ts +1 -0
- package/src/types/events.ts +43 -0
- package/src/types/index.ts +56 -0
- package/src/types/messages.test.ts +2 -1
- package/src/types/messages.ts +307 -5
- package/src/utils/bounded-queue.test.ts +1 -1
- package/src/utils/bounded-queue.ts +2 -1
- package/src/utils/circuit-breaker.test.ts +1 -1
- package/src/utils/deduplication-cache.test.ts +1 -1
- package/src/utils/event-waiter.test.ts +1 -1
- package/src/utils/event-waiter.ts +3 -3
- package/src/utils/index.ts +7 -0
- package/src/utils/logger.ts +8 -8
- package/src/utils/pricing-resolver.ts +128 -0
- package/src/utils/rate-limiter.test.ts +1 -1
- package/src/utils/rate-limiter.ts +1 -0
- package/src/utils/signature-verifier.test.ts +2 -2
- package/src/utils/signature-verifier.ts +3 -2
- package/tests/.env.example +7 -0
- package/tests/direct-agent-test.ts +151 -0
- package/tests/integration/real-server.test.ts +2 -0
- package/tests/integration/room-management.test.ts +10 -8
- package/tests/integration/websocket.test.ts +4 -1
- package/tests/payment-flow-test.ts +147 -0
- package/tests/unit/handlers/agent-room-operation-response-handler.test.ts +17 -29
- package/tests/unit/handlers/agent-status-update-handler.test.ts +2 -6
- package/tests/unit/handlers/auth-success-handler-rooms.test.ts +1 -3
- package/tests/unit/handlers/list-available-agents-handler.test.ts +4 -12
- package/tests/unit/handlers/list-room-agents-handler.test.ts +2 -6
- package/tests/unit/handlers/room-operation-response-handler.test.ts +9 -36
- package/tests/unit/managers/agent-room-manager.test.ts +9 -16
- package/tests/unit/managers/room-management-manager.test.ts +21 -39
- package/tsconfig.json +2 -2
- package/vitest.config.ts +1 -0
|
@@ -7,6 +7,24 @@ import { z } from "zod";
|
|
|
7
7
|
import { BaseMessage, MessageType, Logger, WebhookEventType } from "../../types";
|
|
8
8
|
import { FormattedResponse } from "../../formatters/response-formatter";
|
|
9
9
|
import { PrivateKeyAccount } from "viem/accounts";
|
|
10
|
+
import type { RoomManager } from "../../managers/room-manager";
|
|
11
|
+
import type { RoomManagementManager } from "../../managers/room-management-manager";
|
|
12
|
+
import type { AgentRoomManager } from "../../managers/agent-room-manager";
|
|
13
|
+
import type { AdminManager } from "../../managers/admin-manager";
|
|
14
|
+
import type { AgentRegistry } from "../../managers/agent-registry";
|
|
15
|
+
|
|
16
|
+
// Re-export connection and auth state types from main config
|
|
17
|
+
// These types define the shape of state used by handlers
|
|
18
|
+
import type {
|
|
19
|
+
ConnectionState as ConfigConnectionState,
|
|
20
|
+
AuthenticationState as ConfigAuthenticationState
|
|
21
|
+
} from "../../types/config";
|
|
22
|
+
|
|
23
|
+
/** Connection state for the WebSocket client (re-exported from config) */
|
|
24
|
+
export type ConnectionState = ConfigConnectionState;
|
|
25
|
+
|
|
26
|
+
/** Authentication state (re-exported from config) */
|
|
27
|
+
export type AuthState = ConfigAuthenticationState;
|
|
10
28
|
|
|
11
29
|
/**
|
|
12
30
|
* Context provided to message handlers
|
|
@@ -14,10 +32,14 @@ import { PrivateKeyAccount } from "viem/accounts";
|
|
|
14
32
|
*/
|
|
15
33
|
export interface HandlerContext {
|
|
16
34
|
// Event emission
|
|
17
|
-
emit: (event: string, ...args:
|
|
35
|
+
emit: (event: string, ...args: unknown[]) => void;
|
|
18
36
|
|
|
19
37
|
// Webhook delivery
|
|
20
|
-
sendWebhook: (
|
|
38
|
+
sendWebhook: (
|
|
39
|
+
type: WebhookEventType,
|
|
40
|
+
data: Record<string, unknown>,
|
|
41
|
+
metadata?: Record<string, unknown>
|
|
42
|
+
) => Promise<void>;
|
|
21
43
|
|
|
22
44
|
// Response formatting (optional)
|
|
23
45
|
formatResponse?: (message: BaseMessage) => FormattedResponse;
|
|
@@ -26,19 +48,25 @@ export interface HandlerContext {
|
|
|
26
48
|
logger: Logger;
|
|
27
49
|
|
|
28
50
|
// State access
|
|
29
|
-
getConnectionState: () =>
|
|
30
|
-
getAuthState: () =>
|
|
31
|
-
updateConnectionState: (update:
|
|
32
|
-
updateAuthState: (update:
|
|
51
|
+
getConnectionState: () => ConnectionState;
|
|
52
|
+
getAuthState: () => AuthState;
|
|
53
|
+
updateConnectionState: (update: Partial<ConnectionState>) => void;
|
|
54
|
+
updateAuthState: (update: Partial<AuthState>) => void;
|
|
33
55
|
|
|
34
56
|
// Room manager for subscription updates (optional)
|
|
35
|
-
roomManager?:
|
|
57
|
+
roomManager?: RoomManager;
|
|
36
58
|
|
|
37
59
|
// Room management manager for CRUD operations (v2.0.0, optional)
|
|
38
|
-
roomManagementManager?:
|
|
60
|
+
roomManagementManager?: RoomManagementManager;
|
|
39
61
|
|
|
40
62
|
// Agent room manager for agent-room operations (v2.0.0, optional)
|
|
41
|
-
agentRoomManager?:
|
|
63
|
+
agentRoomManager?: AgentRoomManager;
|
|
64
|
+
|
|
65
|
+
// Admin manager for admin-only features (optional)
|
|
66
|
+
adminManager?: AdminManager;
|
|
67
|
+
|
|
68
|
+
// Agent registry for agent details lookups (optional)
|
|
69
|
+
agentRegistry?: AgentRegistry;
|
|
42
70
|
|
|
43
71
|
// Account for signing (optional, for auth handlers)
|
|
44
72
|
account?: PrivateKeyAccount;
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
* Processes room unsubscription confirmations
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { UnsubscribeResponse, UnsubscribeResponseSchema } from "../../types";
|
|
6
|
+
import { UnsubscribeResponse, UnsubscribeResponseSchema, ErrorCode } from "../../types";
|
|
7
|
+
import { SDKError } from "../../types/events";
|
|
7
8
|
import { BaseMessageHandler } from "./base-handler";
|
|
8
9
|
import { HandlerContext } from "./types";
|
|
9
10
|
|
|
@@ -41,7 +42,16 @@ export class UnsubscribeResponseHandler extends BaseMessageHandler<UnsubscribeRe
|
|
|
41
42
|
});
|
|
42
43
|
|
|
43
44
|
// Emit error event
|
|
44
|
-
this.emit(
|
|
45
|
+
this.emit(
|
|
46
|
+
context,
|
|
47
|
+
"error",
|
|
48
|
+
new SDKError(
|
|
49
|
+
`Unsubscription failed: ${message.data.message}`,
|
|
50
|
+
ErrorCode.OPERATION_FAILED,
|
|
51
|
+
{ roomId: message.data.room_id },
|
|
52
|
+
true
|
|
53
|
+
)
|
|
54
|
+
);
|
|
45
55
|
}
|
|
46
56
|
}
|
|
47
57
|
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handler for user_authenticated messages
|
|
3
|
+
* Processes user authentication broadcasts for presence tracking
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { UserAuthenticatedMessage, UserAuthenticatedMessageSchema } from "../../types";
|
|
7
|
+
import { BaseMessageHandler } from "./base-handler";
|
|
8
|
+
import { HandlerContext } from "./types";
|
|
9
|
+
|
|
10
|
+
export class UserAuthenticatedHandler extends BaseMessageHandler<UserAuthenticatedMessage> {
|
|
11
|
+
readonly type = "user_authenticated" as const;
|
|
12
|
+
readonly schema = UserAuthenticatedMessageSchema;
|
|
13
|
+
|
|
14
|
+
protected handleValidated(message: UserAuthenticatedMessage, context: HandlerContext): void {
|
|
15
|
+
const { wallet } = message.data;
|
|
16
|
+
|
|
17
|
+
context.logger.debug("Handling user_authenticated", {
|
|
18
|
+
wallet
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
context.logger.info("User authenticated broadcast received", {
|
|
22
|
+
wallet
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
// Emit presence event
|
|
26
|
+
this.emit(context, "user:authenticated", { wallet });
|
|
27
|
+
|
|
28
|
+
// Send webhook
|
|
29
|
+
this.sendWebhook(context, "user_authenticated", message.data);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handler for user_count messages (Admin only)
|
|
3
|
+
* Processes user count broadcasts to admin users
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { UserCountMessage, UserCountMessageSchema } from "../../types";
|
|
7
|
+
import { BaseMessageHandler } from "./base-handler";
|
|
8
|
+
import { HandlerContext } from "./types";
|
|
9
|
+
|
|
10
|
+
export class UserCountHandler extends BaseMessageHandler<UserCountMessage> {
|
|
11
|
+
readonly type = "user_count" as const;
|
|
12
|
+
readonly schema = UserCountMessageSchema;
|
|
13
|
+
|
|
14
|
+
protected handleValidated(message: UserCountMessage, context: HandlerContext): void {
|
|
15
|
+
const { count, timestamp } = message.data;
|
|
16
|
+
|
|
17
|
+
context.logger.debug("Handling user_count", {
|
|
18
|
+
count,
|
|
19
|
+
timestamp
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
// Delegate to admin manager if available
|
|
23
|
+
const adminManager = context.adminManager;
|
|
24
|
+
if (adminManager && typeof adminManager.handleUserCount === "function") {
|
|
25
|
+
adminManager.handleUserCount(message.data);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Emit admin event
|
|
29
|
+
this.emit(context, "admin:user_count", { count, timestamp });
|
|
30
|
+
|
|
31
|
+
// Send webhook
|
|
32
|
+
this.sendWebhook(context, "user_count", message.data);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -15,11 +15,12 @@ describe("WebhookHandler", () => {
|
|
|
15
15
|
let handler: WebhookHandler;
|
|
16
16
|
let mockConfig: SDKConfig;
|
|
17
17
|
let mockLogger: Logger;
|
|
18
|
-
|
|
18
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
19
|
+
let mockFetch: ReturnType<typeof vi.fn>;
|
|
19
20
|
|
|
20
21
|
beforeEach(() => {
|
|
21
22
|
vi.useFakeTimers();
|
|
22
|
-
mockFetch = fetch as
|
|
23
|
+
mockFetch = fetch as unknown as ReturnType<typeof vi.fn>;
|
|
23
24
|
mockFetch.mockClear();
|
|
24
25
|
|
|
25
26
|
mockConfig = {
|
|
@@ -166,7 +166,11 @@ export class WebhookHandler extends EventEmitter<SDKEvents> {
|
|
|
166
166
|
* });
|
|
167
167
|
* ```
|
|
168
168
|
*/
|
|
169
|
-
public async sendWebhook(
|
|
169
|
+
public async sendWebhook(
|
|
170
|
+
eventType: WebhookEventType,
|
|
171
|
+
data: Record<string, unknown>,
|
|
172
|
+
metadata?: Record<string, unknown>
|
|
173
|
+
): Promise<void> {
|
|
170
174
|
if (!this.webhookConfig || this.isDestroyed) {
|
|
171
175
|
return;
|
|
172
176
|
}
|
|
@@ -388,7 +392,7 @@ export class WebhookHandler extends EventEmitter<SDKEvents> {
|
|
|
388
392
|
...this.webhookConfig.headers
|
|
389
393
|
},
|
|
390
394
|
body: JSON.stringify(item.payload),
|
|
391
|
-
signal: controller.signal as
|
|
395
|
+
signal: controller.signal as AbortSignal
|
|
392
396
|
};
|
|
393
397
|
|
|
394
398
|
const response = await fetch(this.webhookConfig.url, options);
|
|
@@ -408,13 +412,14 @@ export class WebhookHandler extends EventEmitter<SDKEvents> {
|
|
|
408
412
|
|
|
409
413
|
this.emit("webhook:sent", item.payload, this.webhookConfig.url);
|
|
410
414
|
this.emit("webhook:success", responseData, this.webhookConfig.url);
|
|
411
|
-
} catch (error:
|
|
412
|
-
|
|
415
|
+
} catch (error: unknown) {
|
|
416
|
+
const err = error as Error;
|
|
417
|
+
if (err.name === "AbortError") {
|
|
413
418
|
throw new WebhookError("Webhook timeout", {
|
|
414
419
|
timeout: this.webhookConfig.timeout
|
|
415
420
|
});
|
|
416
421
|
}
|
|
417
|
-
throw new WebhookError(`Webhook delivery failed: ${
|
|
422
|
+
throw new WebhookError(`Webhook delivery failed: ${err.message}`, error);
|
|
418
423
|
} finally {
|
|
419
424
|
clearTimeout(timeout);
|
|
420
425
|
}
|
|
@@ -434,8 +439,9 @@ export class WebhookHandler extends EventEmitter<SDKEvents> {
|
|
|
434
439
|
// Use comprehensive SSRF validator
|
|
435
440
|
// allowInsecureWebhooks controls whether localhost/HTTP is allowed
|
|
436
441
|
validateSSRF(url, this.config.allowInsecureWebhooks ?? false);
|
|
437
|
-
} catch (error:
|
|
438
|
-
|
|
442
|
+
} catch (error: unknown) {
|
|
443
|
+
const err = error as Error;
|
|
444
|
+
throw new WebhookError(`Webhook URL validation failed: ${err.message}`, { url });
|
|
439
445
|
}
|
|
440
446
|
}
|
|
441
447
|
|
package/src/index.ts
CHANGED
|
@@ -202,6 +202,7 @@ export {
|
|
|
202
202
|
RateLimitError,
|
|
203
203
|
SignatureVerificationError,
|
|
204
204
|
ConfigurationError,
|
|
205
|
+
PaymentError,
|
|
205
206
|
|
|
206
207
|
// Validation helpers
|
|
207
208
|
validateEventData,
|
|
@@ -232,6 +233,26 @@ export {
|
|
|
232
233
|
*/
|
|
233
234
|
export { SecurePrivateKey } from "./utils/secure-private-key";
|
|
234
235
|
|
|
236
|
+
/**
|
|
237
|
+
* Payment utilities for x402 payment signing
|
|
238
|
+
* Enables SDK users to make payments directly using private keys
|
|
239
|
+
*/
|
|
240
|
+
export {
|
|
241
|
+
PaymentClient,
|
|
242
|
+
type PaymentClientConfig,
|
|
243
|
+
PEAQ_CHAIN_ID,
|
|
244
|
+
USDC_CONTRACT,
|
|
245
|
+
DEFAULT_PAY_TO_ADDRESS,
|
|
246
|
+
DEFAULT_RPC_URL,
|
|
247
|
+
USDC_DECIMALS,
|
|
248
|
+
X402_VERSION,
|
|
249
|
+
DEFAULT_PAYMENT_TIMEOUT_SECONDS,
|
|
250
|
+
buildX402ResourceUrl,
|
|
251
|
+
usdcToUnits,
|
|
252
|
+
unitsToUsdc,
|
|
253
|
+
type SupportedChain
|
|
254
|
+
} from "./payments";
|
|
255
|
+
|
|
235
256
|
/**
|
|
236
257
|
* SDK version string
|
|
237
258
|
*/
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AdminManager - Manages admin-only features
|
|
3
|
+
* Provides access to admin APIs like listing all agents, user counts, etc.
|
|
4
|
+
* Only available to users with admin privileges.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { EventEmitter } from "eventemitter3";
|
|
8
|
+
import { WebSocketClient } from "../core/websocket-client";
|
|
9
|
+
import { Logger, AdminAgentInfo, UserCountData } from "../types";
|
|
10
|
+
import { SDKError } from "../types/events";
|
|
11
|
+
import { ErrorCode } from "../types/error-codes";
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Events emitted by the AdminManager
|
|
15
|
+
*/
|
|
16
|
+
export interface AdminManagerEvents {
|
|
17
|
+
/** Emitted when user count is updated (broadcast to admins) */
|
|
18
|
+
user_count: (data: UserCountData) => void;
|
|
19
|
+
/** Emitted when admin status changes */
|
|
20
|
+
status_changed: (isAdmin: boolean) => void;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Options for listing all agents (admin only)
|
|
25
|
+
*/
|
|
26
|
+
export interface ListAllAgentsOptions {
|
|
27
|
+
/** Filter string for agent search */
|
|
28
|
+
filter?: string;
|
|
29
|
+
/** Pagination offset */
|
|
30
|
+
offset?: number;
|
|
31
|
+
/** Number of agents to return (default: 50) */
|
|
32
|
+
limit?: number;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Response from listing all agents
|
|
37
|
+
*/
|
|
38
|
+
export interface AllAgentsResult {
|
|
39
|
+
/** List of agents */
|
|
40
|
+
agents: AdminAgentInfo[];
|
|
41
|
+
/** Total number of agents matching filter */
|
|
42
|
+
total: number;
|
|
43
|
+
/** Current offset */
|
|
44
|
+
offset: number;
|
|
45
|
+
/** Page size */
|
|
46
|
+
limit: number;
|
|
47
|
+
/** Whether there are more agents to load */
|
|
48
|
+
hasMore: boolean;
|
|
49
|
+
/** Applied filter (if any) */
|
|
50
|
+
filter?: string;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Pending request waiting for response
|
|
55
|
+
*/
|
|
56
|
+
interface PendingRequest<T> {
|
|
57
|
+
resolve: (result: T) => void;
|
|
58
|
+
reject: (error: Error) => void;
|
|
59
|
+
timeout: ReturnType<typeof setTimeout>;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export class AdminManager extends EventEmitter<AdminManagerEvents> {
|
|
63
|
+
private readonly wsClient: WebSocketClient;
|
|
64
|
+
private readonly logger: Logger;
|
|
65
|
+
private _isAdmin: boolean = false;
|
|
66
|
+
private readonly pendingListRequests = new Map<string, PendingRequest<AllAgentsResult>>();
|
|
67
|
+
private lastUserCount: UserCountData | null = null;
|
|
68
|
+
|
|
69
|
+
/** Default timeout for requests (30 seconds) */
|
|
70
|
+
private readonly requestTimeout = 30000;
|
|
71
|
+
|
|
72
|
+
constructor(wsClient: WebSocketClient, logger: Logger) {
|
|
73
|
+
super();
|
|
74
|
+
this.wsClient = wsClient;
|
|
75
|
+
this.logger = logger;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Whether the current user has admin privileges.
|
|
80
|
+
*/
|
|
81
|
+
public get isAdmin(): boolean {
|
|
82
|
+
return this._isAdmin;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Sets the admin status. Called internally after authentication.
|
|
87
|
+
* @internal
|
|
88
|
+
*/
|
|
89
|
+
public setAdminStatus(isAdmin: boolean): void {
|
|
90
|
+
const changed = this._isAdmin !== isAdmin;
|
|
91
|
+
this._isAdmin = isAdmin;
|
|
92
|
+
|
|
93
|
+
if (changed) {
|
|
94
|
+
this.logger.info("AdminManager: Admin status changed", { isAdmin });
|
|
95
|
+
this.emit("status_changed", isAdmin);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Lists all agents in the network (admin only).
|
|
101
|
+
* Returns paginated list of agents with full admin information.
|
|
102
|
+
*
|
|
103
|
+
* @param options - Pagination and filter options
|
|
104
|
+
* @returns Promise that resolves with agents list
|
|
105
|
+
* @throws {SDKError} If not connected or not an admin
|
|
106
|
+
*
|
|
107
|
+
* @example
|
|
108
|
+
* ```typescript
|
|
109
|
+
* if (sdk.admin?.isAdmin) {
|
|
110
|
+
* const result = await sdk.admin.listAllAgents({ limit: 20 });
|
|
111
|
+
* console.log(`Found ${result.total} agents`);
|
|
112
|
+
* result.agents.forEach(agent => {
|
|
113
|
+
* console.log(`${agent.agent_name}: verified=${agent.is_verified}, banned=${agent.is_banned}`);
|
|
114
|
+
* });
|
|
115
|
+
* }
|
|
116
|
+
* ```
|
|
117
|
+
*/
|
|
118
|
+
public async listAllAgents(options: ListAllAgentsOptions = {}): Promise<AllAgentsResult> {
|
|
119
|
+
if (!this.wsClient.isConnected) {
|
|
120
|
+
throw new SDKError("Not connected to Teneo Protocol", ErrorCode.NOT_CONNECTED);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
if (!this._isAdmin) {
|
|
124
|
+
throw new SDKError("Admin privileges required", ErrorCode.AUTH_ERROR);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
const { filter, offset = 0, limit = 50 } = options;
|
|
128
|
+
|
|
129
|
+
this.logger.info("AdminManager: Listing all agents", { filter, offset, limit });
|
|
130
|
+
|
|
131
|
+
// Generate request ID
|
|
132
|
+
const requestId = `admin_list_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
133
|
+
|
|
134
|
+
// Send list_all_agents message
|
|
135
|
+
const message = {
|
|
136
|
+
type: "list_all_agents" as const,
|
|
137
|
+
filter,
|
|
138
|
+
offset,
|
|
139
|
+
limit,
|
|
140
|
+
request_id: requestId
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
await this.wsClient.sendMessage(message);
|
|
144
|
+
|
|
145
|
+
// Wait for response
|
|
146
|
+
return new Promise((resolve, reject) => {
|
|
147
|
+
const timeout = setTimeout(() => {
|
|
148
|
+
this.pendingListRequests.delete(requestId);
|
|
149
|
+
reject(new SDKError("List agents request timed out", ErrorCode.TIMEOUT_ERROR));
|
|
150
|
+
}, this.requestTimeout);
|
|
151
|
+
|
|
152
|
+
this.pendingListRequests.set(requestId, { resolve, reject, timeout });
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Gets the last received user count.
|
|
158
|
+
*
|
|
159
|
+
* @returns The last user count data, or null if not received yet
|
|
160
|
+
*/
|
|
161
|
+
public getLastUserCount(): UserCountData | null {
|
|
162
|
+
return this.lastUserCount;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Handles incoming all_agents_response message from server.
|
|
167
|
+
* @internal
|
|
168
|
+
*/
|
|
169
|
+
public handleAllAgentsResponse(
|
|
170
|
+
data: {
|
|
171
|
+
agents: AdminAgentInfo[];
|
|
172
|
+
total: number;
|
|
173
|
+
offset: number;
|
|
174
|
+
limit: number;
|
|
175
|
+
has_more: boolean;
|
|
176
|
+
filter?: string;
|
|
177
|
+
},
|
|
178
|
+
requestId?: string
|
|
179
|
+
): void {
|
|
180
|
+
this.logger.debug("AdminManager: Received agents list", {
|
|
181
|
+
count: data.agents.length,
|
|
182
|
+
total: data.total,
|
|
183
|
+
requestId
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
const result: AllAgentsResult = {
|
|
187
|
+
agents: data.agents,
|
|
188
|
+
total: data.total,
|
|
189
|
+
offset: data.offset,
|
|
190
|
+
limit: data.limit,
|
|
191
|
+
hasMore: data.has_more,
|
|
192
|
+
filter: data.filter
|
|
193
|
+
};
|
|
194
|
+
|
|
195
|
+
// Resolve pending request - prefer matching by request_id if available
|
|
196
|
+
if (requestId && this.pendingListRequests.has(requestId)) {
|
|
197
|
+
// Exact match by request_id (preferred)
|
|
198
|
+
const pending = this.pendingListRequests.get(requestId)!;
|
|
199
|
+
clearTimeout(pending.timeout);
|
|
200
|
+
this.pendingListRequests.delete(requestId);
|
|
201
|
+
pending.resolve(result);
|
|
202
|
+
} else if (this.pendingListRequests.size > 0) {
|
|
203
|
+
// Fallback to FIFO for backwards compatibility (when server doesn't echo request_id)
|
|
204
|
+
const pendingEntries = Array.from(this.pendingListRequests.entries());
|
|
205
|
+
const [fallbackRequestId, pending] = pendingEntries[0];
|
|
206
|
+
this.logger.warn("AdminManager: Using FIFO fallback for list agents correlation", {
|
|
207
|
+
pendingCount: pendingEntries.length
|
|
208
|
+
});
|
|
209
|
+
clearTimeout(pending.timeout);
|
|
210
|
+
this.pendingListRequests.delete(fallbackRequestId);
|
|
211
|
+
pending.resolve(result);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Handles incoming user_count message from server.
|
|
217
|
+
* @internal
|
|
218
|
+
*/
|
|
219
|
+
public handleUserCount(data: UserCountData): void {
|
|
220
|
+
this.logger.debug("AdminManager: Received user count", { count: data.count });
|
|
221
|
+
|
|
222
|
+
this.lastUserCount = data;
|
|
223
|
+
this.emit("user_count", data);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* Clears all cached data and pending requests.
|
|
228
|
+
*/
|
|
229
|
+
public clear(): void {
|
|
230
|
+
// Clear pending requests
|
|
231
|
+
for (const [, pending] of this.pendingListRequests) {
|
|
232
|
+
clearTimeout(pending.timeout);
|
|
233
|
+
pending.reject(new SDKError("Admin manager cleared", ErrorCode.SDK_DESTROYED));
|
|
234
|
+
}
|
|
235
|
+
this.pendingListRequests.clear();
|
|
236
|
+
|
|
237
|
+
this.lastUserCount = null;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Destroys the admin manager and cleans up resources.
|
|
242
|
+
*/
|
|
243
|
+
public destroy(): void {
|
|
244
|
+
this.logger.info("AdminManager: Destroying");
|
|
245
|
+
this.clear();
|
|
246
|
+
this._isAdmin = false;
|
|
247
|
+
this.removeAllListeners();
|
|
248
|
+
}
|
|
249
|
+
}
|
|
@@ -59,7 +59,8 @@ describe("AgentRegistry", () => {
|
|
|
59
59
|
registry.updateAgents([agent]);
|
|
60
60
|
|
|
61
61
|
const agents = registry.getAgents();
|
|
62
|
-
|
|
62
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
63
|
+
const firstAgent = agents[0] as Record<string, any>;
|
|
63
64
|
|
|
64
65
|
// Mutate returned object
|
|
65
66
|
firstAgent.name = "Modified";
|