@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
package/src/types/config.ts
CHANGED
|
@@ -118,7 +118,17 @@ export const SDKConfigSchema = z.object({
|
|
|
118
118
|
// Message deduplication (CB-4)
|
|
119
119
|
enableMessageDeduplication: z.boolean().optional(),
|
|
120
120
|
messageDedupeTtl: z.number().min(1000).max(3600000).optional(), // 1s to 1 hour
|
|
121
|
-
messageDedupMaxSize: z.number().min(1).max(100000).optional()
|
|
121
|
+
messageDedupMaxSize: z.number().min(1).max(100000).optional(),
|
|
122
|
+
|
|
123
|
+
// Quote-Approve Payment Flow (v2.2.0)
|
|
124
|
+
autoApproveQuotes: z.boolean().optional(),
|
|
125
|
+
maxPricePerRequest: z.number().min(0).optional(), // in micro-USDC
|
|
126
|
+
quoteTimeout: z.number().min(1000).max(120000).optional(), // 1s to 2 minutes
|
|
127
|
+
paymentNetwork: z
|
|
128
|
+
.string()
|
|
129
|
+
.regex(/^[a-z0-9-]+:\d+$/, "Must be valid CAIP-2 format")
|
|
130
|
+
.optional(),
|
|
131
|
+
paymentAsset: z.string().optional()
|
|
122
132
|
});
|
|
123
133
|
|
|
124
134
|
// Partial config for constructor
|
|
@@ -222,7 +232,13 @@ export const DEFAULT_CONFIG: PartialSDKConfig = SDKConfigSchema.partial().parse(
|
|
|
222
232
|
webhookTimeout: 10000,
|
|
223
233
|
enableMessageDeduplication: true, // Enable by default to prevent duplicates
|
|
224
234
|
messageDedupeTtl: 60000, // 60 seconds (1 minute)
|
|
225
|
-
messageDedupMaxSize: 10000 // 10k messages
|
|
235
|
+
messageDedupMaxSize: 10000, // 10k messages
|
|
236
|
+
|
|
237
|
+
// Quote-Approve Payment Flow (v2.2.0)
|
|
238
|
+
autoApproveQuotes: true, // Auto-approve quotes by default
|
|
239
|
+
quoteTimeout: 30000, // 30 seconds for quote responses
|
|
240
|
+
paymentNetwork: "eip155:3338", // PEAQ mainnet
|
|
241
|
+
paymentAsset: "0xbbA60da06c2c5424f03f7434542280FCAd453d10" // USDC on PEAQ
|
|
226
242
|
});
|
|
227
243
|
|
|
228
244
|
// Configuration validation with custom refinements
|
|
@@ -779,6 +795,58 @@ export class SDKConfigBuilder {
|
|
|
779
795
|
return this;
|
|
780
796
|
}
|
|
781
797
|
|
|
798
|
+
/**
|
|
799
|
+
* Configures payment settings for the quote-approve flow (v2.2.0).
|
|
800
|
+
* Controls how the SDK handles task pricing and payments.
|
|
801
|
+
*
|
|
802
|
+
* @param options - Payment configuration options
|
|
803
|
+
* @param options.autoApprove - Auto-approve and pay for quotes (default: true)
|
|
804
|
+
* @param options.maxPricePerRequest - Maximum price per request in micro-USDC (1000000 = 1 USDC)
|
|
805
|
+
* @param options.quoteTimeout - Timeout for quote responses in ms (default: 30000)
|
|
806
|
+
* @param options.network - Payment network in CAIP-2 format (default: "eip155:3338")
|
|
807
|
+
* @param options.asset - Payment asset (default: "USDC")
|
|
808
|
+
* @returns this builder for method chaining
|
|
809
|
+
*
|
|
810
|
+
* @example
|
|
811
|
+
* ```typescript
|
|
812
|
+
* // Auto-approve with price limit
|
|
813
|
+
* builder.withPayments({
|
|
814
|
+
* autoApprove: true,
|
|
815
|
+
* maxPricePerRequest: 1000000 // Max 1 USDC per request
|
|
816
|
+
* })
|
|
817
|
+
*
|
|
818
|
+
* // Manual approval mode
|
|
819
|
+
* builder.withPayments({ autoApprove: false })
|
|
820
|
+
* ```
|
|
821
|
+
*/
|
|
822
|
+
withPayments(options: {
|
|
823
|
+
autoApprove?: boolean;
|
|
824
|
+
maxPricePerRequest?: number;
|
|
825
|
+
quoteTimeout?: number;
|
|
826
|
+
network?: string;
|
|
827
|
+
asset?: string;
|
|
828
|
+
}): this {
|
|
829
|
+
if (options.autoApprove !== undefined) {
|
|
830
|
+
this.config.autoApproveQuotes = z.boolean().parse(options.autoApprove);
|
|
831
|
+
}
|
|
832
|
+
if (options.maxPricePerRequest !== undefined) {
|
|
833
|
+
this.config.maxPricePerRequest = z.number().min(0).parse(options.maxPricePerRequest);
|
|
834
|
+
}
|
|
835
|
+
if (options.quoteTimeout !== undefined) {
|
|
836
|
+
this.config.quoteTimeout = z.number().min(1000).max(120000).parse(options.quoteTimeout);
|
|
837
|
+
}
|
|
838
|
+
if (options.network !== undefined) {
|
|
839
|
+
this.config.paymentNetwork = z
|
|
840
|
+
.string()
|
|
841
|
+
.regex(/^[a-z0-9-]+:\d+$/)
|
|
842
|
+
.parse(options.network);
|
|
843
|
+
}
|
|
844
|
+
if (options.asset !== undefined) {
|
|
845
|
+
this.config.paymentAsset = z.string().parse(options.asset);
|
|
846
|
+
}
|
|
847
|
+
return this;
|
|
848
|
+
}
|
|
849
|
+
|
|
782
850
|
/**
|
|
783
851
|
* Builds and validates the final SDK configuration.
|
|
784
852
|
* Performs comprehensive validation including custom refinements (e.g., webhook security).
|
package/src/types/error-codes.ts
CHANGED
|
@@ -42,6 +42,16 @@ export enum ErrorCode {
|
|
|
42
42
|
OPERATION_FAILED = "OPERATION_FAILED",
|
|
43
43
|
PERMISSION_DENIED = "PERMISSION_DENIED",
|
|
44
44
|
|
|
45
|
+
// Quote-Approve Payment errors (v2.2.0)
|
|
46
|
+
QUOTE_EXPIRED = "QUOTE_EXPIRED",
|
|
47
|
+
QUOTE_NOT_FOUND = "QUOTE_NOT_FOUND",
|
|
48
|
+
QUOTE_TIMEOUT = "QUOTE_TIMEOUT",
|
|
49
|
+
PRICE_LIMIT_EXCEEDED = "PRICE_LIMIT_EXCEEDED",
|
|
50
|
+
INVALID_PAYMENT_NETWORK = "INVALID_PAYMENT_NETWORK",
|
|
51
|
+
INSUFFICIENT_BALANCE = "INSUFFICIENT_BALANCE",
|
|
52
|
+
PAYMENT_FAILED = "PAYMENT_FAILED",
|
|
53
|
+
PAYMENT_SIGNATURE_FAILED = "PAYMENT_SIGNATURE_FAILED",
|
|
54
|
+
|
|
45
55
|
// Generic timeout (for backward compatibility)
|
|
46
56
|
TIMEOUT_ERROR = "TIMEOUT_ERROR",
|
|
47
57
|
TIMEOUT = "TIMEOUT"
|
package/src/types/events.test.ts
CHANGED
|
@@ -231,6 +231,7 @@ describe("Error Classes", () => {
|
|
|
231
231
|
expect(isRecoverableError(regularError)).toBe(false);
|
|
232
232
|
|
|
233
233
|
const customError = { message: "Not an error object" };
|
|
234
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
234
235
|
expect(isRecoverableError(customError as any)).toBe(false);
|
|
235
236
|
});
|
|
236
237
|
});
|
package/src/types/events.ts
CHANGED
|
@@ -262,6 +262,21 @@ export class ConfigurationError extends SDKError {
|
|
|
262
262
|
}
|
|
263
263
|
}
|
|
264
264
|
|
|
265
|
+
/**
|
|
266
|
+
* Error thrown when payment operations fail (v2.2.0).
|
|
267
|
+
* Can occur when:
|
|
268
|
+
* - Payment signature creation fails
|
|
269
|
+
* - Price limit is exceeded
|
|
270
|
+
* - Insufficient balance
|
|
271
|
+
* - Invalid payment network
|
|
272
|
+
*/
|
|
273
|
+
export class PaymentError extends SDKError {
|
|
274
|
+
constructor(message: string, code: ErrorCode, details?: any) {
|
|
275
|
+
super(message, code, details, false);
|
|
276
|
+
this.name = "PaymentError";
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
265
280
|
// SDK Events interface with proper typing
|
|
266
281
|
export interface SDKEvents {
|
|
267
282
|
// Connection events
|
|
@@ -332,6 +347,34 @@ export interface SDKEvents {
|
|
|
332
347
|
"coordinator:selected": (agentId: string, reasoning: string) => void;
|
|
333
348
|
"coordinator:error": (error: string) => void;
|
|
334
349
|
|
|
350
|
+
// Quote-Approve Payment events (v2.2.0)
|
|
351
|
+
"quote:received": (quote: any) => void;
|
|
352
|
+
"quote:expired": (taskId: string) => void;
|
|
353
|
+
"payment:blocked": (data: { agentId: string; agentPrice: number; maxPrice: number }) => void;
|
|
354
|
+
"payment:attached": (data: { agentId: string; amount: number; command: string }) => void;
|
|
355
|
+
"payment:error": (error: Error, agentId?: string) => void;
|
|
356
|
+
|
|
357
|
+
// Rate Limit events
|
|
358
|
+
rate_limit: (notification: {
|
|
359
|
+
title: string;
|
|
360
|
+
message: string;
|
|
361
|
+
ctaText?: string;
|
|
362
|
+
ctaLink?: string;
|
|
363
|
+
messageType: string;
|
|
364
|
+
limitType: string;
|
|
365
|
+
resetAt?: string;
|
|
366
|
+
}) => void;
|
|
367
|
+
|
|
368
|
+
// Admin events
|
|
369
|
+
"admin:user_count": (data: { count: number; timestamp?: string }) => void;
|
|
370
|
+
"admin:status_changed": (isAdmin: boolean) => void;
|
|
371
|
+
|
|
372
|
+
// User Presence events
|
|
373
|
+
"user:authenticated": (data: { wallet: string }) => void;
|
|
374
|
+
|
|
375
|
+
// User Preferences events
|
|
376
|
+
"preferences:updated": (data: { maxPricePerRequest?: number | null }) => void;
|
|
377
|
+
|
|
335
378
|
// Webhook events
|
|
336
379
|
"webhook:sent": (payload: any, url: string) => void;
|
|
337
380
|
"webhook:success": (response: any, url: string) => void;
|
package/src/types/index.ts
CHANGED
|
@@ -14,6 +14,7 @@ export {
|
|
|
14
14
|
|
|
15
15
|
// Supporting schemas
|
|
16
16
|
CapabilitySchema,
|
|
17
|
+
CommandPricingSchema,
|
|
17
18
|
CommandSchema,
|
|
18
19
|
RoomSchema,
|
|
19
20
|
AgentSchema,
|
|
@@ -40,6 +41,12 @@ export {
|
|
|
40
41
|
TaskResponseMessageSchema,
|
|
41
42
|
AgentSelectedMessageSchema,
|
|
42
43
|
|
|
44
|
+
// Quote-Approve Flow schemas (v2.2.0)
|
|
45
|
+
PricingInfoSchema,
|
|
46
|
+
RequestTaskMessageSchema,
|
|
47
|
+
TaskQuoteMessageSchema,
|
|
48
|
+
ConfirmTaskMessageSchema,
|
|
49
|
+
|
|
43
50
|
// System message schemas
|
|
44
51
|
AgentsListMessageSchema,
|
|
45
52
|
ErrorMessageSchema,
|
|
@@ -92,6 +99,7 @@ export {
|
|
|
92
99
|
type AgentType,
|
|
93
100
|
type AgentStatus,
|
|
94
101
|
type Capability,
|
|
102
|
+
type CommandPricing,
|
|
95
103
|
type Command,
|
|
96
104
|
type Room,
|
|
97
105
|
type Agent,
|
|
@@ -109,6 +117,12 @@ export {
|
|
|
109
117
|
type TaskMessage,
|
|
110
118
|
type TaskResponseMessage,
|
|
111
119
|
type AgentSelectedMessage,
|
|
120
|
+
|
|
121
|
+
// Quote-Approve Flow types (v2.2.0)
|
|
122
|
+
type PricingInfo,
|
|
123
|
+
type RequestTaskMessage,
|
|
124
|
+
type TaskQuoteMessage,
|
|
125
|
+
type ConfirmTaskMessage,
|
|
112
126
|
type AgentsListMessage,
|
|
113
127
|
type ErrorMessage,
|
|
114
128
|
type PingMessage,
|
|
@@ -148,6 +162,36 @@ export {
|
|
|
148
162
|
type RoomPingMessage,
|
|
149
163
|
type RoomPongResponse,
|
|
150
164
|
|
|
165
|
+
// Admin types
|
|
166
|
+
AdminAgentInfoSchema,
|
|
167
|
+
ListAllAgentsMessageSchema,
|
|
168
|
+
AllAgentsResponseSchema,
|
|
169
|
+
UserCountDataSchema,
|
|
170
|
+
UserCountMessageSchema,
|
|
171
|
+
UserAuthenticatedMessageSchema,
|
|
172
|
+
RateLimitNotificationMessageSchema,
|
|
173
|
+
GetAgentDetailsMessageSchema,
|
|
174
|
+
AgentDetailsResponseMessageSchema,
|
|
175
|
+
type AdminAgentInfo,
|
|
176
|
+
type ListAllAgentsMessage,
|
|
177
|
+
type AllAgentsResponse,
|
|
178
|
+
type UserCountData,
|
|
179
|
+
type UserCountMessage,
|
|
180
|
+
type UserAuthenticatedMessage,
|
|
181
|
+
type RateLimitNotificationMessage,
|
|
182
|
+
type GetAgentDetailsMessage,
|
|
183
|
+
type AgentDetailsResponseMessage,
|
|
184
|
+
|
|
185
|
+
// User Preferences types
|
|
186
|
+
SetUserPreferencesDataSchema,
|
|
187
|
+
SetUserPreferencesMessageSchema,
|
|
188
|
+
UserPreferencesUpdatedDataSchema,
|
|
189
|
+
UserPreferencesUpdatedMessageSchema,
|
|
190
|
+
type SetUserPreferencesData,
|
|
191
|
+
type SetUserPreferencesMessage,
|
|
192
|
+
type UserPreferencesUpdatedData,
|
|
193
|
+
type UserPreferencesUpdatedMessage,
|
|
194
|
+
|
|
151
195
|
type AnyMessage,
|
|
152
196
|
|
|
153
197
|
// Type guards
|
|
@@ -169,6 +213,9 @@ export {
|
|
|
169
213
|
createSubscribe,
|
|
170
214
|
createUnsubscribe,
|
|
171
215
|
createListRooms,
|
|
216
|
+
createRequestTask,
|
|
217
|
+
createConfirmTask,
|
|
218
|
+
createSetUserPreferences,
|
|
172
219
|
|
|
173
220
|
// Validation helpers
|
|
174
221
|
validateMessage,
|
|
@@ -241,6 +288,7 @@ export {
|
|
|
241
288
|
ValidationError,
|
|
242
289
|
TimeoutError,
|
|
243
290
|
RateLimitError,
|
|
291
|
+
PaymentError,
|
|
244
292
|
|
|
245
293
|
// Validation helpers
|
|
246
294
|
validateEventData,
|
|
@@ -252,3 +300,11 @@ export { ErrorCode } from "./error-codes";
|
|
|
252
300
|
|
|
253
301
|
// Health status types
|
|
254
302
|
export { type HealthStatus } from "./health";
|
|
303
|
+
|
|
304
|
+
// Agent category types
|
|
305
|
+
export {
|
|
306
|
+
AGENT_CATEGORIES,
|
|
307
|
+
MAX_CATEGORIES,
|
|
308
|
+
AgentCategorySchema,
|
|
309
|
+
type AgentCategory
|
|
310
|
+
} from "./categories";
|
|
@@ -20,7 +20,8 @@ import {
|
|
|
20
20
|
describe("stringToBoolean transform", () => {
|
|
21
21
|
// Test stringToBoolean indirectly through RoomSchema which uses it for is_public and is_active
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
24
|
+
const createTestRoom = (is_public: unknown, is_active: unknown) => ({
|
|
24
25
|
id: "room-1",
|
|
25
26
|
name: "Test Room",
|
|
26
27
|
is_public,
|
package/src/types/messages.ts
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { z } from "zod";
|
|
7
|
+
import { AgentCategorySchema, MAX_CATEGORIES } from "./categories";
|
|
7
8
|
|
|
8
9
|
/**
|
|
9
10
|
* Coerces string booleans to actual booleans with strict validation.
|
|
@@ -63,6 +64,11 @@ export const MessageTypeSchema = z.enum([
|
|
|
63
64
|
"task_response",
|
|
64
65
|
"agent_selected",
|
|
65
66
|
|
|
67
|
+
// Quote-Approve Flow (v2.2.0)
|
|
68
|
+
"request_task",
|
|
69
|
+
"task_quote",
|
|
70
|
+
"confirm_task",
|
|
71
|
+
|
|
66
72
|
// System
|
|
67
73
|
"agents",
|
|
68
74
|
"error",
|
|
@@ -104,7 +110,20 @@ export const MessageTypeSchema = z.enum([
|
|
|
104
110
|
|
|
105
111
|
// Room Ping System (2 types)
|
|
106
112
|
"room_ping",
|
|
107
|
-
"room_pong"
|
|
113
|
+
"room_pong",
|
|
114
|
+
|
|
115
|
+
// Admin Messages (7 types)
|
|
116
|
+
"list_all_agents",
|
|
117
|
+
"all_agents_response",
|
|
118
|
+
"user_count",
|
|
119
|
+
"user_authenticated",
|
|
120
|
+
"rate_limit_notification",
|
|
121
|
+
"get_agent_details",
|
|
122
|
+
"agent_details_response",
|
|
123
|
+
|
|
124
|
+
// User Preferences (2 types)
|
|
125
|
+
"set_user_preferences",
|
|
126
|
+
"user_preferences_updated"
|
|
108
127
|
]);
|
|
109
128
|
|
|
110
129
|
export const ContentTypeSchema = z.enum([
|
|
@@ -131,10 +150,20 @@ export const CapabilitySchema = z.object({
|
|
|
131
150
|
description: z.string().optional()
|
|
132
151
|
});
|
|
133
152
|
|
|
153
|
+
export const CommandPricingSchema = z.object({
|
|
154
|
+
priceType: z.string().optional(),
|
|
155
|
+
pricePerUnit: z.number().optional(),
|
|
156
|
+
taskUnit: z.string().optional(),
|
|
157
|
+
timeUnit: z.enum(["hour", "day"]).optional()
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
export type CommandPricing = z.infer<typeof CommandPricingSchema>;
|
|
161
|
+
|
|
134
162
|
export const CommandSchema = z.object({
|
|
135
163
|
trigger: z.string(),
|
|
136
164
|
argument: z.string().optional(),
|
|
137
|
-
description: z.string().optional()
|
|
165
|
+
description: z.string().optional(),
|
|
166
|
+
pricing: CommandPricingSchema.optional()
|
|
138
167
|
});
|
|
139
168
|
|
|
140
169
|
export const RoomSchema = z.object({
|
|
@@ -174,7 +203,8 @@ export const AgentSchema = z.object({
|
|
|
174
203
|
image: z.string().optional(),
|
|
175
204
|
agentType: AgentTypeSchema.optional(),
|
|
176
205
|
nlpFallback: stringToBoolean.optional(),
|
|
177
|
-
webhookUrl: z.string().url().optional()
|
|
206
|
+
webhookUrl: z.string().url().optional(),
|
|
207
|
+
categories: z.array(AgentCategorySchema).max(MAX_CATEGORIES).optional()
|
|
178
208
|
});
|
|
179
209
|
|
|
180
210
|
// Base message schema
|
|
@@ -354,6 +384,62 @@ export const AgentSelectedMessageSchema = BaseMessageSchema.extend({
|
|
|
354
384
|
})
|
|
355
385
|
});
|
|
356
386
|
|
|
387
|
+
// ============================================================================
|
|
388
|
+
// QUOTE-APPROVE FLOW SCHEMAS (v2.2.0)
|
|
389
|
+
// ============================================================================
|
|
390
|
+
|
|
391
|
+
// Pricing information schema (flexible to handle server variations)
|
|
392
|
+
export const PricingInfoSchema = z
|
|
393
|
+
.object({
|
|
394
|
+
pricePerUnit: z.number().optional(),
|
|
395
|
+
price_per_unit: z.number().optional(),
|
|
396
|
+
priceType: z.string().optional(),
|
|
397
|
+
price_type: z.string().optional(),
|
|
398
|
+
timeUnit: z.string().optional(),
|
|
399
|
+
time_unit: z.string().optional(),
|
|
400
|
+
currency: z.string().optional().default("USDC"),
|
|
401
|
+
network: z.string().optional()
|
|
402
|
+
})
|
|
403
|
+
.transform((data) => ({
|
|
404
|
+
// Normalize to camelCase
|
|
405
|
+
pricePerUnit: data.pricePerUnit ?? data.price_per_unit ?? 0,
|
|
406
|
+
priceType: data.priceType ?? data.price_type,
|
|
407
|
+
timeUnit: data.timeUnit ?? data.time_unit,
|
|
408
|
+
currency: data.currency,
|
|
409
|
+
network: data.network
|
|
410
|
+
}));
|
|
411
|
+
|
|
412
|
+
// Request task message (initiates quote-approve flow)
|
|
413
|
+
export const RequestTaskMessageSchema = BaseMessageSchema.extend({
|
|
414
|
+
type: z.literal("request_task"),
|
|
415
|
+
content: z.string(),
|
|
416
|
+
room: z.string()
|
|
417
|
+
});
|
|
418
|
+
|
|
419
|
+
// Task quote message (server response with pricing)
|
|
420
|
+
export const TaskQuoteMessageSchema = BaseMessageSchema.extend({
|
|
421
|
+
type: z.literal("task_quote"),
|
|
422
|
+
from: z.literal("coordinator"),
|
|
423
|
+
data: z.object({
|
|
424
|
+
task_id: z.string(),
|
|
425
|
+
agent_id: z.string(),
|
|
426
|
+
agent_name: z.string(),
|
|
427
|
+
agent_wallet: z.string(),
|
|
428
|
+
command: z.string(),
|
|
429
|
+
pricing: PricingInfoSchema,
|
|
430
|
+
expires_at: z.string()
|
|
431
|
+
})
|
|
432
|
+
});
|
|
433
|
+
|
|
434
|
+
// Confirm task message (with payment at top level - backend expects msg.payment)
|
|
435
|
+
export const ConfirmTaskMessageSchema = BaseMessageSchema.extend({
|
|
436
|
+
type: z.literal("confirm_task"),
|
|
437
|
+
data: z.object({
|
|
438
|
+
task_id: z.string()
|
|
439
|
+
}),
|
|
440
|
+
payment: z.string().optional() // x402 payment at top level (backend checks msg.Payment)
|
|
441
|
+
});
|
|
442
|
+
|
|
357
443
|
// System message schemas
|
|
358
444
|
export const AgentsListMessageSchema = BaseMessageSchema.extend({
|
|
359
445
|
type: z.literal("agents"),
|
|
@@ -548,7 +634,8 @@ export const AgentRoomInfoSchema = z
|
|
|
548
634
|
image: z.string().optional(),
|
|
549
635
|
status: z.string().optional(),
|
|
550
636
|
added_by: z.string().optional(),
|
|
551
|
-
added_at: z.string().optional()
|
|
637
|
+
added_at: z.string().optional(),
|
|
638
|
+
categories: z.array(AgentCategorySchema).max(MAX_CATEGORIES).optional()
|
|
552
639
|
})
|
|
553
640
|
.passthrough();
|
|
554
641
|
|
|
@@ -655,6 +742,171 @@ export const RoomPongResponseSchema = z
|
|
|
655
742
|
})
|
|
656
743
|
.passthrough();
|
|
657
744
|
|
|
745
|
+
// Admin agent info (admin only)
|
|
746
|
+
export const AdminAgentInfoSchema = z
|
|
747
|
+
.object({
|
|
748
|
+
agent_id: z.string(),
|
|
749
|
+
agent_name: z.string(),
|
|
750
|
+
creator: z.string(),
|
|
751
|
+
creator_name: z.string().optional().nullable(),
|
|
752
|
+
description: z.string().optional().nullable(),
|
|
753
|
+
image_url: z.string().optional().nullable(),
|
|
754
|
+
is_online: z.boolean().optional(),
|
|
755
|
+
is_active: z.boolean().optional(),
|
|
756
|
+
is_verified: z.boolean().optional(),
|
|
757
|
+
is_public: z.boolean().optional(),
|
|
758
|
+
is_banned: z.boolean().optional(),
|
|
759
|
+
created_at: z.string().optional().nullable()
|
|
760
|
+
})
|
|
761
|
+
.passthrough();
|
|
762
|
+
|
|
763
|
+
export type AdminAgentInfo = z.infer<typeof AdminAgentInfoSchema>;
|
|
764
|
+
|
|
765
|
+
// List all agents request (client → server, admin only)
|
|
766
|
+
export const ListAllAgentsMessageSchema = z
|
|
767
|
+
.object({
|
|
768
|
+
type: z.literal("list_all_agents"),
|
|
769
|
+
request_id: z.string().optional(),
|
|
770
|
+
filter: z.string().optional(),
|
|
771
|
+
offset: z.number().optional(),
|
|
772
|
+
limit: z.number().optional()
|
|
773
|
+
})
|
|
774
|
+
.passthrough();
|
|
775
|
+
|
|
776
|
+
export type ListAllAgentsMessage = z.infer<typeof ListAllAgentsMessageSchema>;
|
|
777
|
+
|
|
778
|
+
// All agents response (server → client, admin only)
|
|
779
|
+
export const AllAgentsResponseSchema = z
|
|
780
|
+
.object({
|
|
781
|
+
type: z.literal("all_agents_response"),
|
|
782
|
+
request_id: z.string().optional(),
|
|
783
|
+
data: z
|
|
784
|
+
.object({
|
|
785
|
+
agents: z.array(AdminAgentInfoSchema),
|
|
786
|
+
total: z.number(),
|
|
787
|
+
offset: z.number(),
|
|
788
|
+
limit: z.number(),
|
|
789
|
+
has_more: z.boolean(),
|
|
790
|
+
filter: z.string().optional()
|
|
791
|
+
})
|
|
792
|
+
.passthrough()
|
|
793
|
+
})
|
|
794
|
+
.passthrough();
|
|
795
|
+
|
|
796
|
+
export type AllAgentsResponse = z.infer<typeof AllAgentsResponseSchema>;
|
|
797
|
+
|
|
798
|
+
// User count data schema
|
|
799
|
+
export const UserCountDataSchema = z.object({
|
|
800
|
+
count: z.number(),
|
|
801
|
+
timestamp: z.string()
|
|
802
|
+
});
|
|
803
|
+
|
|
804
|
+
export type UserCountData = z.infer<typeof UserCountDataSchema>;
|
|
805
|
+
|
|
806
|
+
// User count message (server → client, admin only)
|
|
807
|
+
export const UserCountMessageSchema = z
|
|
808
|
+
.object({
|
|
809
|
+
type: z.literal("user_count"),
|
|
810
|
+
data: UserCountDataSchema.passthrough()
|
|
811
|
+
})
|
|
812
|
+
.passthrough();
|
|
813
|
+
|
|
814
|
+
export type UserCountMessage = z.infer<typeof UserCountMessageSchema>;
|
|
815
|
+
|
|
816
|
+
// User authenticated message (server → client)
|
|
817
|
+
export const UserAuthenticatedMessageSchema = z
|
|
818
|
+
.object({
|
|
819
|
+
type: z.literal("user_authenticated"),
|
|
820
|
+
data: z
|
|
821
|
+
.object({
|
|
822
|
+
wallet: z.string()
|
|
823
|
+
})
|
|
824
|
+
.passthrough()
|
|
825
|
+
})
|
|
826
|
+
.passthrough();
|
|
827
|
+
|
|
828
|
+
export type UserAuthenticatedMessage = z.infer<typeof UserAuthenticatedMessageSchema>;
|
|
829
|
+
|
|
830
|
+
// Rate limit notification (server → client)
|
|
831
|
+
export const RateLimitNotificationMessageSchema = z
|
|
832
|
+
.object({
|
|
833
|
+
type: z.literal("rate_limit_notification"),
|
|
834
|
+
data: z
|
|
835
|
+
.object({
|
|
836
|
+
title: z.string(),
|
|
837
|
+
message: z.string(),
|
|
838
|
+
cta_text: z.string().optional(),
|
|
839
|
+
cta_link: z.string().optional(),
|
|
840
|
+
message_type: z.string(),
|
|
841
|
+
limit_type: z.string(),
|
|
842
|
+
reset_at: z.string().optional()
|
|
843
|
+
})
|
|
844
|
+
.passthrough()
|
|
845
|
+
})
|
|
846
|
+
.passthrough();
|
|
847
|
+
|
|
848
|
+
export type RateLimitNotificationMessage = z.infer<typeof RateLimitNotificationMessageSchema>;
|
|
849
|
+
|
|
850
|
+
// Agent details request (client → server)
|
|
851
|
+
export const GetAgentDetailsMessageSchema = z
|
|
852
|
+
.object({
|
|
853
|
+
type: z.literal("get_agent_details"),
|
|
854
|
+
agent_id: z.string(),
|
|
855
|
+
request_id: z.string().optional()
|
|
856
|
+
})
|
|
857
|
+
.passthrough();
|
|
858
|
+
|
|
859
|
+
export type GetAgentDetailsMessage = z.infer<typeof GetAgentDetailsMessageSchema>;
|
|
860
|
+
|
|
861
|
+
// Agent details response (server → client)
|
|
862
|
+
export const AgentDetailsResponseMessageSchema = z
|
|
863
|
+
.object({
|
|
864
|
+
type: z.literal("agent_details_response"),
|
|
865
|
+
request_id: z.string().optional(),
|
|
866
|
+
data: z
|
|
867
|
+
.object({
|
|
868
|
+
agent: AgentRoomInfoSchema
|
|
869
|
+
})
|
|
870
|
+
.passthrough()
|
|
871
|
+
.optional(),
|
|
872
|
+
error: z.string().optional()
|
|
873
|
+
})
|
|
874
|
+
.passthrough();
|
|
875
|
+
|
|
876
|
+
export type AgentDetailsResponseMessage = z.infer<typeof AgentDetailsResponseMessageSchema>;
|
|
877
|
+
|
|
878
|
+
// User Preferences (set_user_preferences)
|
|
879
|
+
export const SetUserPreferencesDataSchema = z.object({
|
|
880
|
+
max_price_per_request: z.number().min(0).optional().nullable()
|
|
881
|
+
});
|
|
882
|
+
|
|
883
|
+
export const SetUserPreferencesMessageSchema = z
|
|
884
|
+
.object({
|
|
885
|
+
type: z.literal("set_user_preferences"),
|
|
886
|
+
data: SetUserPreferencesDataSchema
|
|
887
|
+
})
|
|
888
|
+
.passthrough();
|
|
889
|
+
|
|
890
|
+
export type SetUserPreferencesData = z.infer<typeof SetUserPreferencesDataSchema>;
|
|
891
|
+
export type SetUserPreferencesMessage = z.infer<typeof SetUserPreferencesMessageSchema>;
|
|
892
|
+
|
|
893
|
+
// User Preferences Response (user_preferences_updated)
|
|
894
|
+
export const UserPreferencesUpdatedDataSchema = z.object({
|
|
895
|
+
success: z.boolean(),
|
|
896
|
+
message: z.string(),
|
|
897
|
+
max_price_per_request: z.number().optional().nullable()
|
|
898
|
+
});
|
|
899
|
+
|
|
900
|
+
export const UserPreferencesUpdatedMessageSchema = z
|
|
901
|
+
.object({
|
|
902
|
+
type: z.literal("user_preferences_updated"),
|
|
903
|
+
data: UserPreferencesUpdatedDataSchema
|
|
904
|
+
})
|
|
905
|
+
.passthrough();
|
|
906
|
+
|
|
907
|
+
export type UserPreferencesUpdatedData = z.infer<typeof UserPreferencesUpdatedDataSchema>;
|
|
908
|
+
export type UserPreferencesUpdatedMessage = z.infer<typeof UserPreferencesUpdatedMessageSchema>;
|
|
909
|
+
|
|
658
910
|
// Union of all INCOMING message schemas for validation
|
|
659
911
|
// Note: Outgoing message schemas (Subscribe, Unsubscribe, ListRooms) are excluded
|
|
660
912
|
// as they share the same type values with their response counterparts
|
|
@@ -677,6 +929,9 @@ export const AnyMessageSchema = z.discriminatedUnion("type", [
|
|
|
677
929
|
AgentSelectedMessageSchema,
|
|
678
930
|
AgentsListMessageSchema,
|
|
679
931
|
|
|
932
|
+
// Quote-Approve Flow (v2.2.0)
|
|
933
|
+
TaskQuoteMessageSchema,
|
|
934
|
+
|
|
680
935
|
// System
|
|
681
936
|
ErrorMessageSchema,
|
|
682
937
|
PingMessageSchema,
|
|
@@ -699,7 +954,17 @@ export const AnyMessageSchema = z.discriminatedUnion("type", [
|
|
|
699
954
|
AgentStatusUpdateMessageSchema,
|
|
700
955
|
|
|
701
956
|
// Room Ping System (v2.0.0)
|
|
702
|
-
RoomPongResponseSchema
|
|
957
|
+
RoomPongResponseSchema,
|
|
958
|
+
|
|
959
|
+
// Admin Messages
|
|
960
|
+
AllAgentsResponseSchema,
|
|
961
|
+
UserCountMessageSchema,
|
|
962
|
+
UserAuthenticatedMessageSchema,
|
|
963
|
+
RateLimitNotificationMessageSchema,
|
|
964
|
+
AgentDetailsResponseMessageSchema,
|
|
965
|
+
|
|
966
|
+
// User Preferences
|
|
967
|
+
UserPreferencesUpdatedMessageSchema
|
|
703
968
|
]);
|
|
704
969
|
|
|
705
970
|
// Type inference from schemas
|
|
@@ -729,6 +994,13 @@ export type TaskMessage = z.infer<typeof TaskMessageSchema>;
|
|
|
729
994
|
export type TaskResponseMessage = z.infer<typeof TaskResponseMessageSchema>;
|
|
730
995
|
export type AgentSelectedMessage = z.infer<typeof AgentSelectedMessageSchema>;
|
|
731
996
|
export type AgentsListMessage = z.infer<typeof AgentsListMessageSchema>;
|
|
997
|
+
|
|
998
|
+
// Quote-Approve Flow Types (v2.2.0)
|
|
999
|
+
export type PricingInfo = z.infer<typeof PricingInfoSchema>;
|
|
1000
|
+
export type RequestTaskMessage = z.infer<typeof RequestTaskMessageSchema>;
|
|
1001
|
+
export type TaskQuoteMessage = z.infer<typeof TaskQuoteMessageSchema>;
|
|
1002
|
+
export type ConfirmTaskMessage = z.infer<typeof ConfirmTaskMessageSchema>;
|
|
1003
|
+
|
|
732
1004
|
export type ErrorMessage = z.infer<typeof ErrorMessageSchema>;
|
|
733
1005
|
export type PingMessage = z.infer<typeof PingMessageSchema>;
|
|
734
1006
|
export type PongMessage = z.infer<typeof PongMessageSchema>;
|
|
@@ -875,6 +1147,36 @@ export function createListRooms(): ListRoomsMessage {
|
|
|
875
1147
|
});
|
|
876
1148
|
}
|
|
877
1149
|
|
|
1150
|
+
// Quote-Approve Flow factory functions (v2.2.0)
|
|
1151
|
+
export function createRequestTask(content: string, room: string): RequestTaskMessage {
|
|
1152
|
+
return RequestTaskMessageSchema.parse({
|
|
1153
|
+
type: "request_task",
|
|
1154
|
+
content,
|
|
1155
|
+
room
|
|
1156
|
+
});
|
|
1157
|
+
}
|
|
1158
|
+
|
|
1159
|
+
export function createConfirmTask(taskId: string, x402Payment?: string): ConfirmTaskMessage {
|
|
1160
|
+
return ConfirmTaskMessageSchema.parse({
|
|
1161
|
+
type: "confirm_task",
|
|
1162
|
+
data: {
|
|
1163
|
+
task_id: taskId
|
|
1164
|
+
},
|
|
1165
|
+
...(x402Payment && { payment: x402Payment }) // payment at top level for backend
|
|
1166
|
+
});
|
|
1167
|
+
}
|
|
1168
|
+
|
|
1169
|
+
export function createSetUserPreferences(
|
|
1170
|
+
maxPricePerRequest?: number | null
|
|
1171
|
+
): SetUserPreferencesMessage {
|
|
1172
|
+
return SetUserPreferencesMessageSchema.parse({
|
|
1173
|
+
type: "set_user_preferences",
|
|
1174
|
+
data: {
|
|
1175
|
+
max_price_per_request: maxPricePerRequest
|
|
1176
|
+
}
|
|
1177
|
+
});
|
|
1178
|
+
}
|
|
1179
|
+
|
|
878
1180
|
// Validation helper
|
|
879
1181
|
export function validateMessage(message: unknown): AnyMessage {
|
|
880
1182
|
return AnyMessageSchema.parse(message);
|
|
@@ -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", () => {
|