@teneo-protocol/sdk 2.2.2 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/ISSUE_TEMPLATE/config.yml +1 -1
- package/CHANGELOG.md +366 -15
- package/CONCEPTS.md +182 -44
- package/README.md +524 -94
- package/dist/constants.d.ts +3 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +5 -3
- package/dist/constants.js.map +1 -1
- package/dist/core/websocket-client.d.ts.map +1 -1
- package/dist/core/websocket-client.js +9 -5
- package/dist/core/websocket-client.js.map +1 -1
- package/dist/formatters/response-formatter.d.ts +6 -6
- package/dist/handlers/message-handlers/agent-details-response-handler.d.ts +1080 -756
- package/dist/handlers/message-handlers/agent-details-response-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/agent-details-response-handler.js +2 -2
- package/dist/handlers/message-handlers/agent-details-response-handler.js.map +1 -1
- package/dist/handlers/message-handlers/agent-error-handler.d.ts +91 -0
- package/dist/handlers/message-handlers/agent-error-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/agent-error-handler.js +44 -0
- package/dist/handlers/message-handlers/agent-error-handler.js.map +1 -0
- package/dist/handlers/message-handlers/agent-selected-handler.d.ts +6 -0
- package/dist/handlers/message-handlers/agent-selected-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/agent-status-update-handler.d.ts +1080 -756
- 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 -7
- package/dist/handlers/message-handlers/agent-status-update-handler.js.map +1 -1
- package/dist/handlers/message-handlers/all-agents-response-handler.d.ts +135 -54
- package/dist/handlers/message-handlers/all-agents-response-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/all-agents-response-handler.js +2 -2
- package/dist/handlers/message-handlers/all-agents-response-handler.js.map +1 -1
- package/dist/handlers/message-handlers/auth-error-handler.d.ts +6 -0
- package/dist/handlers/message-handlers/auth-error-handler.d.ts.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 -1
- package/dist/handlers/message-handlers/auth-message-handler.js.map +1 -1
- package/dist/handlers/message-handlers/auth-required-handler.d.ts +6 -0
- package/dist/handlers/message-handlers/auth-required-handler.d.ts.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 -1
- package/dist/handlers/message-handlers/auth-success-handler.js.map +1 -1
- package/dist/handlers/message-handlers/base-handler.d.ts +2 -1
- package/dist/handlers/message-handlers/base-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/base-handler.js +24 -4
- package/dist/handlers/message-handlers/base-handler.js.map +1 -1
- package/dist/handlers/message-handlers/challenge-handler.d.ts +6 -0
- package/dist/handlers/message-handlers/challenge-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/error-message-handler.d.ts +6 -0
- package/dist/handlers/message-handlers/error-message-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/index.d.ts +4 -0
- package/dist/handlers/message-handlers/index.d.ts.map +1 -1
- package/dist/handlers/message-handlers/index.js +23 -1
- package/dist/handlers/message-handlers/index.js.map +1 -1
- package/dist/handlers/message-handlers/list-available-agents-handler.d.ts +1116 -756
- package/dist/handlers/message-handlers/list-available-agents-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/list-available-agents-handler.js +23 -10
- package/dist/handlers/message-handlers/list-available-agents-handler.js.map +1 -1
- package/dist/handlers/message-handlers/list-room-agents-handler.d.ts +1080 -756
- 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 -6
- package/dist/handlers/message-handlers/list-room-agents-handler.js.map +1 -1
- package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/list-rooms-response-handler.js +2 -5
- package/dist/handlers/message-handlers/list-rooms-response-handler.js.map +1 -1
- package/dist/handlers/message-handlers/ping-pong-handler.d.ts +52 -4
- package/dist/handlers/message-handlers/ping-pong-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/ping-pong-handler.js +23 -4
- package/dist/handlers/message-handlers/ping-pong-handler.js.map +1 -1
- package/dist/handlers/message-handlers/rate-limit-notification-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/rate-limit-notification-handler.js +3 -2
- package/dist/handlers/message-handlers/rate-limit-notification-handler.js.map +1 -1
- package/dist/handlers/message-handlers/regular-message-handler.d.ts +6 -0
- package/dist/handlers/message-handlers/regular-message-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/subscribe-response-handler.d.ts +12 -6
- package/dist/handlers/message-handlers/subscribe-response-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/success-handler.d.ts +82 -0
- package/dist/handlers/message-handlers/success-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/success-handler.js +24 -0
- package/dist/handlers/message-handlers/success-handler.js.map +1 -0
- package/dist/handlers/message-handlers/task-confirmed-handler.d.ts +110 -0
- package/dist/handlers/message-handlers/task-confirmed-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/task-confirmed-handler.js +46 -0
- package/dist/handlers/message-handlers/task-confirmed-handler.js.map +1 -0
- package/dist/handlers/message-handlers/trigger-wallet-tx-handler.d.ts +244 -0
- package/dist/handlers/message-handlers/trigger-wallet-tx-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/trigger-wallet-tx-handler.js +58 -0
- package/dist/handlers/message-handlers/trigger-wallet-tx-handler.js.map +1 -0
- package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts +12 -6
- package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/user-authenticated-handler.js +2 -2
- package/dist/handlers/message-handlers/user-authenticated-handler.js.map +1 -1
- package/dist/handlers/message-handlers/user-count-handler.js +2 -2
- package/dist/handlers/message-handlers/user-count-handler.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -4
- package/dist/index.js.map +1 -1
- package/dist/managers/admin-manager.d.ts +3 -1
- package/dist/managers/admin-manager.d.ts.map +1 -1
- package/dist/managers/admin-manager.js +4 -3
- package/dist/managers/admin-manager.js.map +1 -1
- package/dist/managers/agent-room-manager.d.ts +89 -11
- package/dist/managers/agent-room-manager.d.ts.map +1 -1
- package/dist/managers/agent-room-manager.js +99 -35
- package/dist/managers/agent-room-manager.js.map +1 -1
- package/dist/managers/index.d.ts +1 -1
- package/dist/managers/index.d.ts.map +1 -1
- package/dist/managers/index.js.map +1 -1
- package/dist/managers/message-router.d.ts +45 -5
- package/dist/managers/message-router.d.ts.map +1 -1
- package/dist/managers/message-router.js +96 -24
- package/dist/managers/message-router.js.map +1 -1
- package/dist/managers/room-manager.d.ts +29 -7
- package/dist/managers/room-manager.d.ts.map +1 -1
- package/dist/managers/room-manager.js +37 -11
- package/dist/managers/room-manager.js.map +1 -1
- package/dist/payments/index.d.ts +3 -1
- package/dist/payments/index.d.ts.map +1 -1
- package/dist/payments/index.js +17 -3
- package/dist/payments/index.js.map +1 -1
- package/dist/payments/networks.d.ts +59 -0
- package/dist/payments/networks.d.ts.map +1 -0
- package/dist/payments/networks.js +192 -0
- package/dist/payments/networks.js.map +1 -0
- package/dist/payments/payment-client.d.ts +55 -10
- package/dist/payments/payment-client.d.ts.map +1 -1
- package/dist/payments/payment-client.js +172 -51
- package/dist/payments/payment-client.js.map +1 -1
- package/dist/teneo-sdk.d.ts +215 -41
- package/dist/teneo-sdk.d.ts.map +1 -1
- package/dist/teneo-sdk.js +361 -84
- package/dist/teneo-sdk.js.map +1 -1
- package/dist/types/config.d.ts +334 -25
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +114 -22
- package/dist/types/config.js.map +1 -1
- package/dist/types/events.d.ts +60 -14
- package/dist/types/events.d.ts.map +1 -1
- package/dist/types/events.js.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +11 -4
- package/dist/types/index.js.map +1 -1
- package/dist/types/messages.d.ts +13110 -7451
- package/dist/types/messages.d.ts.map +1 -1
- package/dist/types/messages.js +195 -44
- package/dist/types/messages.js.map +1 -1
- package/dist/utils/pricing-resolver.d.ts +1 -1
- package/dist/utils/pricing-resolver.d.ts.map +1 -1
- package/dist/utils/pricing-resolver.js +9 -1
- package/dist/utils/pricing-resolver.js.map +1 -1
- package/examples/agent-room-management-example.ts +5 -5
- package/examples/basic-usage.ts +26 -6
- package/examples/claude-agent-x-follower/index.ts +1 -1
- package/examples/minimal-chat.ts +4 -3
- package/examples/n8n-teneo/index.ts +2 -2
- package/examples/nestjs-dashboard/README.md +1 -1
- package/examples/nestjs-dashboard/src/teneo/agents.controller.ts +3 -3
- package/examples/nestjs-dashboard/src/teneo/rooms.controller.ts +5 -5
- package/examples/nestjs-dashboard/src/teneo/teneo.service.ts +8 -8
- package/examples/openai-teneo/index.ts +1 -1
- package/examples/payment-flow.ts +143 -0
- package/examples/production-dashboard/README.md +6 -8
- package/examples/production-dashboard/server.ts +22 -10
- package/examples/room-management-example.ts +2 -2
- package/examples/usage/01-connect.ts +0 -3
- package/examples/usage/02-list-agents.ts +0 -2
- package/examples/usage/03-pick-agent.ts +3 -4
- package/examples/usage/04-find-by-capability.ts +10 -12
- package/examples/usage/05-webhook-example.ts +2 -4
- package/examples/usage/06-simple-api-server.ts +13 -9
- package/examples/usage/07-event-listener.ts +1 -13
- package/examples/usage/README.md +33 -7
- package/examples/webhook-integration.ts +9 -9
- package/examples/x-influencer-battle-server.ts +1 -1
- package/package.json +1 -1
- package/scripts/diagnose-connection.ts +86 -0
- package/scripts/investigate-payload.ts +163 -0
- package/scripts/list-agents.ts +58 -0
- package/scripts/live-multi-network-test.ts +230 -0
- package/src/constants.ts +5 -3
- package/src/core/websocket-client.ts +10 -9
- package/src/handlers/message-handlers/agent-details-response-handler.ts +2 -2
- package/src/handlers/message-handlers/agent-error-handler.ts +47 -0
- package/src/handlers/message-handlers/agent-status-update-handler.ts +2 -7
- package/src/handlers/message-handlers/all-agents-response-handler.ts +2 -2
- package/src/handlers/message-handlers/auth-message-handler.ts +7 -1
- package/src/handlers/message-handlers/auth-success-handler.ts +7 -1
- package/src/handlers/message-handlers/base-handler.ts +24 -4
- package/src/handlers/message-handlers/index.ts +24 -0
- package/src/handlers/message-handlers/list-available-agents-handler.ts +24 -11
- package/src/handlers/message-handlers/list-room-agents-handler.ts +2 -6
- package/src/handlers/message-handlers/list-rooms-response-handler.ts +2 -5
- package/src/handlers/message-handlers/ping-pong-handler.ts +29 -4
- package/src/handlers/message-handlers/rate-limit-notification-handler.ts +3 -2
- package/src/handlers/message-handlers/success-handler.ts +26 -0
- package/src/handlers/message-handlers/task-confirmed-handler.ts +49 -0
- package/src/handlers/message-handlers/trigger-wallet-tx-handler.ts +62 -0
- package/src/handlers/message-handlers/user-authenticated-handler.ts +2 -2
- package/src/handlers/message-handlers/user-count-handler.ts +2 -2
- package/src/index.ts +12 -4
- package/src/managers/admin-manager.ts +6 -3
- package/src/managers/agent-room-manager.ts +155 -26
- package/src/managers/index.ts +6 -1
- package/src/managers/message-router.ts +122 -27
- package/src/managers/room-manager.ts +39 -11
- package/src/payments/index.ts +20 -5
- package/src/payments/networks.ts +208 -0
- package/src/payments/payment-client.ts +211 -56
- package/src/teneo-sdk.ts +402 -71
- package/src/types/config.test.ts +24 -4
- package/src/types/config.ts +123 -25
- package/src/types/events.ts +36 -2
- package/src/types/index.ts +16 -3
- package/src/types/messages.ts +235 -60
- package/src/utils/pricing-resolver.ts +10 -2
- package/tests/direct-agent-test.ts +1 -1
- package/tests/integration/real-server.test.ts +1 -1
- package/tests/integration/websocket.test.ts +3 -3
- package/tests/multi-network-payment.test.ts +309 -0
- package/tests/multi-network.test.ts +296 -0
- package/tests/payment-flow-test.ts +6 -4
- package/tests/unit/handlers/agent-error-handler.test.ts +388 -0
- package/tests/unit/handlers/agent-room-operation-response-handler.test.ts +9 -6
- package/tests/unit/handlers/agent-status-update-handler.test.ts +11 -16
- package/tests/unit/handlers/list-available-agents-handler.test.ts +11 -14
- package/tests/unit/handlers/list-room-agents-handler.test.ts +11 -15
- package/tests/unit/handlers/room-operation-response-handler.test.ts +9 -6
- package/tests/unit/handlers/trigger-wallet-tx-handler.test.ts +431 -0
- package/tests/unit/managers/admin-manager.test.ts +183 -0
- package/tests/unit/managers/agent-room-manager.test.ts +189 -33
- package/tests/unit/sdk-new-methods.test.ts +221 -0
package/src/types/messages.ts
CHANGED
|
@@ -68,10 +68,12 @@ export const MessageTypeSchema = z.enum([
|
|
|
68
68
|
"request_task",
|
|
69
69
|
"task_quote",
|
|
70
70
|
"confirm_task",
|
|
71
|
+
"task_confirmed",
|
|
71
72
|
|
|
72
73
|
// System
|
|
73
74
|
"agents",
|
|
74
75
|
"error",
|
|
76
|
+
"success",
|
|
75
77
|
"ping",
|
|
76
78
|
"pong",
|
|
77
79
|
"capabilities",
|
|
@@ -109,9 +111,8 @@ export const MessageTypeSchema = z.enum([
|
|
|
109
111
|
"room_agents_response",
|
|
110
112
|
"available_agents_response",
|
|
111
113
|
|
|
112
|
-
// Room Ping System (
|
|
114
|
+
// Room Ping System (1 type - pong reuses "pong" type with room data)
|
|
113
115
|
"room_ping",
|
|
114
|
-
"room_pong",
|
|
115
116
|
|
|
116
117
|
// Admin Messages (7 types)
|
|
117
118
|
"list_all_agents",
|
|
@@ -124,7 +125,17 @@ export const MessageTypeSchema = z.enum([
|
|
|
124
125
|
|
|
125
126
|
// User Preferences (2 types)
|
|
126
127
|
"set_user_preferences",
|
|
127
|
-
"user_preferences_updated"
|
|
128
|
+
"user_preferences_updated",
|
|
129
|
+
|
|
130
|
+
// API Key Preferences
|
|
131
|
+
"set_api_key_preference",
|
|
132
|
+
|
|
133
|
+
// Agent Error
|
|
134
|
+
"agent_error",
|
|
135
|
+
|
|
136
|
+
// Wallet Transaction Flow
|
|
137
|
+
"trigger_wallet_tx",
|
|
138
|
+
"tx_result"
|
|
128
139
|
]);
|
|
129
140
|
|
|
130
141
|
export const ContentTypeSchema = z.enum([
|
|
@@ -151,20 +162,35 @@ export const CapabilitySchema = z.object({
|
|
|
151
162
|
description: z.string().optional()
|
|
152
163
|
});
|
|
153
164
|
|
|
165
|
+
// Command pricing fields — flat on the command object, matching server Go struct.
|
|
166
|
+
// Kept as a standalone schema for use by pricing-resolver.
|
|
154
167
|
export const CommandPricingSchema = z.object({
|
|
155
168
|
priceType: z.string().optional(),
|
|
156
169
|
pricePerUnit: z.number().optional(),
|
|
157
170
|
taskUnit: z.string().optional(),
|
|
158
|
-
timeUnit: z.enum(["
|
|
171
|
+
timeUnit: z.enum(["second", "minute", "hour"]).optional()
|
|
159
172
|
});
|
|
160
173
|
|
|
161
174
|
export type CommandPricing = z.infer<typeof CommandPricingSchema>;
|
|
162
175
|
|
|
176
|
+
// Command schema — pricing fields are flat (not nested), matching server Go struct.
|
|
163
177
|
export const CommandSchema = z.object({
|
|
164
178
|
trigger: z.string(),
|
|
165
179
|
argument: z.string().optional(),
|
|
166
180
|
description: z.string().optional(),
|
|
167
|
-
|
|
181
|
+
// Pricing fields (flat, matching server Command struct)
|
|
182
|
+
pricePerUnit: z.number().optional(),
|
|
183
|
+
priceType: z.string().optional(),
|
|
184
|
+
taskUnit: z.string().optional(),
|
|
185
|
+
timeUnit: z.enum(["second", "minute", "hour"]).optional(),
|
|
186
|
+
// Extended fields from server
|
|
187
|
+
hasVariants: z.boolean().optional(),
|
|
188
|
+
variants: z.array(z.any()).optional(),
|
|
189
|
+
parameters: z.array(z.any()).optional(),
|
|
190
|
+
// Command validation fields
|
|
191
|
+
strictArg: z.boolean().optional(),
|
|
192
|
+
minArgs: z.number().optional(),
|
|
193
|
+
maxArgs: z.number().optional()
|
|
168
194
|
});
|
|
169
195
|
|
|
170
196
|
export const RoomSchema = z.object({
|
|
@@ -193,20 +219,31 @@ export const RoomInfoSchema = z
|
|
|
193
219
|
})
|
|
194
220
|
.passthrough(); // Allow extra fields backend might add
|
|
195
221
|
|
|
196
|
-
export const AgentSchema = z
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
222
|
+
export const AgentSchema = z
|
|
223
|
+
.object({
|
|
224
|
+
id: z.string(),
|
|
225
|
+
name: z.string(),
|
|
226
|
+
description: z.string().optional(),
|
|
227
|
+
room: z.string().optional(),
|
|
228
|
+
rooms: z.array(z.string()).optional(), // Server sends plural rooms array
|
|
229
|
+
capabilities: z.array(CapabilitySchema).optional(),
|
|
230
|
+
commands: z.array(CommandSchema).optional(),
|
|
231
|
+
status: AgentStatusSchema,
|
|
232
|
+
image: z.string().optional(),
|
|
233
|
+
// Accept both server field names and SDK field names
|
|
234
|
+
type: AgentTypeSchema.optional(), // server sends "type"
|
|
235
|
+
agentType: AgentTypeSchema.optional(), // SDK alias
|
|
236
|
+
nlp_fallback: stringToBoolean.optional(), // server sends "nlp_fallback"
|
|
237
|
+
nlpFallback: stringToBoolean.optional(), // SDK alias
|
|
238
|
+
webhookUrl: z.string().url().optional(),
|
|
239
|
+
categories: z.array(AgentCategorySchema).max(MAX_CATEGORIES).optional(),
|
|
240
|
+
review_status: z.enum(["private", "in_review", "public", "declined"]).optional()
|
|
241
|
+
})
|
|
242
|
+
.transform((data) => ({
|
|
243
|
+
...data,
|
|
244
|
+
agentType: data.agentType ?? data.type,
|
|
245
|
+
nlpFallback: data.nlpFallback ?? data.nlp_fallback
|
|
246
|
+
}));
|
|
210
247
|
|
|
211
248
|
// Base message schema
|
|
212
249
|
export const BaseMessageSchema = z
|
|
@@ -223,7 +260,9 @@ export const BaseMessageSchema = z
|
|
|
223
260
|
publicKey: z.string().optional(),
|
|
224
261
|
reasoning: z.string().optional(),
|
|
225
262
|
task_id: z.string().optional(),
|
|
226
|
-
id: z.string().optional() // Added for message tracking
|
|
263
|
+
id: z.string().optional(), // Added for message tracking
|
|
264
|
+
payment: z.string().optional(), // x402 payment payload
|
|
265
|
+
request_id: z.string().optional() // Request-response correlation
|
|
227
266
|
})
|
|
228
267
|
.passthrough(); // Allow message-specific fields to pass through
|
|
229
268
|
|
|
@@ -247,7 +286,8 @@ export const ChallengeMessageSchema = BaseMessageSchema.extend({
|
|
|
247
286
|
export const CheckCachedAuthMessageSchema = BaseMessageSchema.extend({
|
|
248
287
|
type: z.literal("check_cached_auth"),
|
|
249
288
|
data: z.object({
|
|
250
|
-
address: z.string()
|
|
289
|
+
address: z.string(),
|
|
290
|
+
session_token: z.string().optional() // 64-char hex token for fast re-auth (24h validity)
|
|
251
291
|
})
|
|
252
292
|
});
|
|
253
293
|
|
|
@@ -282,7 +322,12 @@ export const AuthMessageSchema = BaseMessageSchema.extend({
|
|
|
282
322
|
private_rooms: z.array(RoomSchema).optional(),
|
|
283
323
|
private_room_id: z.string().optional(),
|
|
284
324
|
cached_auth: stringToBoolean.optional(),
|
|
285
|
-
max_private_rooms: z.number().optional()
|
|
325
|
+
max_private_rooms: z.number().optional(),
|
|
326
|
+
// Auth enhancement fields (audit #6, #7, #9)
|
|
327
|
+
jwt_token: z.string().optional(), // JWT token for KeyVault API authentication
|
|
328
|
+
session_token: z.string().optional(), // 64-char hex token for fast re-auth (24h validity)
|
|
329
|
+
whitelist_verified: z.union([z.boolean(), z.string()]).optional(), // Whitelist verification status
|
|
330
|
+
user_count: z.number().optional() // Total user count (admin only)
|
|
286
331
|
})
|
|
287
332
|
.optional()
|
|
288
333
|
});
|
|
@@ -299,7 +344,12 @@ export const AuthSuccessMessageSchema = BaseMessageSchema.extend({
|
|
|
299
344
|
rooms: z.array(RoomInfoSchema).optional().nullable(), // v2.0.0: Uses RoomInfo with is_owner field
|
|
300
345
|
private_room_id: z.string().optional(), // DEPRECATED: Use rooms array instead
|
|
301
346
|
cached_auth: stringToBoolean.optional(), // Admin field, optional
|
|
302
|
-
max_private_rooms: z.number().optional() // NEW in v2.0.0: Max rooms user can create
|
|
347
|
+
max_private_rooms: z.number().optional(), // NEW in v2.0.0: Max rooms user can create
|
|
348
|
+
// Auth enhancement fields (audit #6, #7, #9)
|
|
349
|
+
jwt_token: z.string().optional(), // JWT token for KeyVault API authentication
|
|
350
|
+
session_token: z.string().optional(), // 64-char hex token for fast re-auth (24h validity)
|
|
351
|
+
whitelist_verified: z.union([z.boolean(), z.string()]).optional(), // Whitelist verification status
|
|
352
|
+
user_count: z.number().optional() // Total user count (admin only)
|
|
303
353
|
})
|
|
304
354
|
});
|
|
305
355
|
|
|
@@ -396,6 +446,8 @@ export const PricingInfoSchema = z
|
|
|
396
446
|
price_per_unit: z.number().optional(),
|
|
397
447
|
priceType: z.string().optional(),
|
|
398
448
|
price_type: z.string().optional(),
|
|
449
|
+
taskUnit: z.string().optional(),
|
|
450
|
+
task_unit: z.string().optional(),
|
|
399
451
|
timeUnit: z.string().optional(),
|
|
400
452
|
time_unit: z.string().optional(),
|
|
401
453
|
currency: z.string().optional().default("USDC"),
|
|
@@ -405,6 +457,7 @@ export const PricingInfoSchema = z
|
|
|
405
457
|
// Normalize to camelCase
|
|
406
458
|
pricePerUnit: data.pricePerUnit ?? data.price_per_unit ?? 0,
|
|
407
459
|
priceType: data.priceType ?? data.price_type,
|
|
460
|
+
taskUnit: data.taskUnit ?? data.task_unit,
|
|
408
461
|
timeUnit: data.timeUnit ?? data.time_unit,
|
|
409
462
|
currency: data.currency,
|
|
410
463
|
network: data.network
|
|
@@ -414,22 +467,37 @@ export const PricingInfoSchema = z
|
|
|
414
467
|
export const RequestTaskMessageSchema = BaseMessageSchema.extend({
|
|
415
468
|
type: z.literal("request_task"),
|
|
416
469
|
content: z.string(),
|
|
417
|
-
room: z.string()
|
|
470
|
+
room: z.string(),
|
|
471
|
+
data: z
|
|
472
|
+
.object({
|
|
473
|
+
network: z.string().optional() // Payment network (peaq, base, avalanche)
|
|
474
|
+
})
|
|
475
|
+
.optional()
|
|
418
476
|
});
|
|
419
477
|
|
|
420
478
|
// Task quote message (server response with pricing)
|
|
421
479
|
export const TaskQuoteMessageSchema = BaseMessageSchema.extend({
|
|
422
480
|
type: z.literal("task_quote"),
|
|
423
481
|
from: z.literal("coordinator"),
|
|
424
|
-
data: z
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
482
|
+
data: z
|
|
483
|
+
.object({
|
|
484
|
+
task_id: z.string(),
|
|
485
|
+
agent_id: z.string(),
|
|
486
|
+
agent_name: z.string(),
|
|
487
|
+
agent_wallet: z.string(),
|
|
488
|
+
command: z.string(),
|
|
489
|
+
pricing: PricingInfoSchema,
|
|
490
|
+
expires_at: z.string(),
|
|
491
|
+
// v2.5 Settlement Router fields for x402x-router-settlement extension
|
|
492
|
+
settlement_router: z.string(),
|
|
493
|
+
salt: z.string(),
|
|
494
|
+
facilitator_fee: z.string(),
|
|
495
|
+
hook: z.string(),
|
|
496
|
+
hook_data: z.string().optional().default("0x"),
|
|
497
|
+
// Request correlation
|
|
498
|
+
client_request_id: z.string().optional()
|
|
499
|
+
})
|
|
500
|
+
.passthrough()
|
|
433
501
|
});
|
|
434
502
|
|
|
435
503
|
// Confirm task message (with payment at top level - backend expects msg.payment)
|
|
@@ -441,6 +509,22 @@ export const ConfirmTaskMessageSchema = BaseMessageSchema.extend({
|
|
|
441
509
|
payment: z.string().optional() // x402 payment at top level (backend checks msg.Payment)
|
|
442
510
|
});
|
|
443
511
|
|
|
512
|
+
// Task confirmed message (server acknowledgment after confirm_task)
|
|
513
|
+
export const TaskConfirmedMessageSchema = BaseMessageSchema.extend({
|
|
514
|
+
type: z.literal("task_confirmed"),
|
|
515
|
+
data: z
|
|
516
|
+
.object({
|
|
517
|
+
task_id: z.string(),
|
|
518
|
+
agent_id: z.string().optional(),
|
|
519
|
+
agent_name: z.string().optional(),
|
|
520
|
+
client_request_id: z.string().optional()
|
|
521
|
+
})
|
|
522
|
+
.passthrough()
|
|
523
|
+
.optional()
|
|
524
|
+
});
|
|
525
|
+
|
|
526
|
+
export type TaskConfirmedMessage = z.infer<typeof TaskConfirmedMessageSchema>;
|
|
527
|
+
|
|
444
528
|
// System message schemas
|
|
445
529
|
export const AgentsListMessageSchema = BaseMessageSchema.extend({
|
|
446
530
|
type: z.literal("agents"),
|
|
@@ -459,12 +543,38 @@ export const ErrorMessageSchema = BaseMessageSchema.extend({
|
|
|
459
543
|
})
|
|
460
544
|
});
|
|
461
545
|
|
|
546
|
+
export const SuccessMessageSchema = BaseMessageSchema.extend({
|
|
547
|
+
type: z.literal("success"),
|
|
548
|
+
content: z.string().optional(),
|
|
549
|
+
from: z.literal("system").optional(),
|
|
550
|
+
data: z
|
|
551
|
+
.object({
|
|
552
|
+
content: z.string().optional()
|
|
553
|
+
})
|
|
554
|
+
.passthrough()
|
|
555
|
+
.optional()
|
|
556
|
+
}).passthrough();
|
|
557
|
+
|
|
462
558
|
export const PingMessageSchema = BaseMessageSchema.extend({
|
|
463
559
|
type: z.literal("ping")
|
|
464
560
|
});
|
|
465
561
|
|
|
466
562
|
export const PongMessageSchema = BaseMessageSchema.extend({
|
|
467
|
-
type: z.literal("pong")
|
|
563
|
+
type: z.literal("pong"),
|
|
564
|
+
data: z
|
|
565
|
+
.union([
|
|
566
|
+
// Regular pong (no data)
|
|
567
|
+
z.undefined(),
|
|
568
|
+
// Room pong (with room data)
|
|
569
|
+
z
|
|
570
|
+
.object({
|
|
571
|
+
room_id: z.string(),
|
|
572
|
+
live_count: z.number().optional(),
|
|
573
|
+
timestamp: z.string()
|
|
574
|
+
})
|
|
575
|
+
.passthrough()
|
|
576
|
+
])
|
|
577
|
+
.optional()
|
|
468
578
|
});
|
|
469
579
|
|
|
470
580
|
// Room subscription schemas
|
|
@@ -636,7 +746,18 @@ export const AgentRoomInfoSchema = z
|
|
|
636
746
|
status: z.string().optional(),
|
|
637
747
|
added_by: z.string().optional(),
|
|
638
748
|
added_at: z.string().optional(),
|
|
639
|
-
categories: z.array(AgentCategorySchema).max(MAX_CATEGORIES).optional()
|
|
749
|
+
categories: z.array(AgentCategorySchema).max(MAX_CATEGORIES).optional(),
|
|
750
|
+
// Server-sent typed fields
|
|
751
|
+
type: AgentTypeSchema.optional(),
|
|
752
|
+
nlp_fallback: z.union([z.boolean(), z.string()]).optional(),
|
|
753
|
+
review_status: z.enum(["private", "in_review", "public", "declined"]).optional(),
|
|
754
|
+
decline_reason: z.string().optional().nullable(),
|
|
755
|
+
submitted_at: z.string().optional().nullable(),
|
|
756
|
+
reviewed_at: z.string().optional().nullable(),
|
|
757
|
+
reviewed_by: z.string().optional().nullable(),
|
|
758
|
+
created_at: z.string().optional(),
|
|
759
|
+
creator: z.string().optional(),
|
|
760
|
+
is_banned: z.boolean().optional()
|
|
640
761
|
})
|
|
641
762
|
.passthrough();
|
|
642
763
|
|
|
@@ -687,7 +808,11 @@ export const AvailableAgentsResponseSchema = z
|
|
|
687
808
|
type: z.literal("available_agents_response"),
|
|
688
809
|
data: z
|
|
689
810
|
.object({
|
|
690
|
-
agents: z.array(AgentRoomInfoSchema).optional()
|
|
811
|
+
agents: z.array(AgentRoomInfoSchema).optional(),
|
|
812
|
+
total: z.number().optional(),
|
|
813
|
+
offset: z.number().optional(),
|
|
814
|
+
limit: z.number().optional(),
|
|
815
|
+
has_more: z.boolean().optional()
|
|
691
816
|
})
|
|
692
817
|
.passthrough()
|
|
693
818
|
})
|
|
@@ -730,18 +855,8 @@ export const RoomPingMessageSchema = z
|
|
|
730
855
|
})
|
|
731
856
|
.passthrough();
|
|
732
857
|
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
type: z.literal("room_pong"),
|
|
736
|
-
data: z
|
|
737
|
-
.object({
|
|
738
|
-
room_id: z.string(),
|
|
739
|
-
live_count: z.number().optional(), // Optional - consuming code should handle missing as 0
|
|
740
|
-
timestamp: z.string()
|
|
741
|
-
})
|
|
742
|
-
.passthrough()
|
|
743
|
-
})
|
|
744
|
-
.passthrough();
|
|
858
|
+
// Note: RoomPong reuses the "pong" message type with room data in the data field
|
|
859
|
+
// The PongHandler checks for room_id in data to distinguish room pong from regular pong
|
|
745
860
|
|
|
746
861
|
// Admin agent info (admin only)
|
|
747
862
|
export const AdminAgentInfoSchema = z
|
|
@@ -754,10 +869,13 @@ export const AdminAgentInfoSchema = z
|
|
|
754
869
|
image_url: z.string().optional().nullable(),
|
|
755
870
|
is_online: z.boolean().optional(),
|
|
756
871
|
is_active: z.boolean().optional(),
|
|
757
|
-
is_verified: z.boolean().optional(),
|
|
758
|
-
is_public: z.boolean().optional(),
|
|
759
872
|
is_banned: z.boolean().optional(),
|
|
760
|
-
created_at: z.string().optional().nullable()
|
|
873
|
+
created_at: z.string().optional().nullable(),
|
|
874
|
+
review_status: z.enum(["private", "in_review", "public", "declined"]).optional(),
|
|
875
|
+
decline_reason: z.string().optional().nullable(),
|
|
876
|
+
submitted_at: z.string().optional().nullable(),
|
|
877
|
+
reviewed_at: z.string().optional().nullable(),
|
|
878
|
+
reviewed_by: z.string().optional().nullable()
|
|
761
879
|
})
|
|
762
880
|
.passthrough();
|
|
763
881
|
|
|
@@ -908,6 +1026,46 @@ export const UserPreferencesUpdatedMessageSchema = z
|
|
|
908
1026
|
export type UserPreferencesUpdatedData = z.infer<typeof UserPreferencesUpdatedDataSchema>;
|
|
909
1027
|
export type UserPreferencesUpdatedMessage = z.infer<typeof UserPreferencesUpdatedMessageSchema>;
|
|
910
1028
|
|
|
1029
|
+
// Agent Error message (server → client, when an agent fails)
|
|
1030
|
+
export const AgentErrorMessageSchema = BaseMessageSchema.extend({
|
|
1031
|
+
type: z.literal("agent_error"),
|
|
1032
|
+
content: z.string().optional(),
|
|
1033
|
+
from: z.string().optional(),
|
|
1034
|
+
data: z
|
|
1035
|
+
.object({
|
|
1036
|
+
task_id: z.string().optional(),
|
|
1037
|
+
client_request_id: z.string().optional()
|
|
1038
|
+
})
|
|
1039
|
+
.passthrough()
|
|
1040
|
+
.optional()
|
|
1041
|
+
});
|
|
1042
|
+
|
|
1043
|
+
export type AgentErrorMessage = z.infer<typeof AgentErrorMessageSchema>;
|
|
1044
|
+
|
|
1045
|
+
// Wallet Transaction schemas
|
|
1046
|
+
export const TxResultStatusSchema = z.enum(["confirmed", "rejected", "failed"]);
|
|
1047
|
+
export type TxResultStatus = z.infer<typeof TxResultStatusSchema>;
|
|
1048
|
+
|
|
1049
|
+
export const TriggerWalletTxMessageSchema = BaseMessageSchema.extend({
|
|
1050
|
+
type: z.literal("trigger_wallet_tx"),
|
|
1051
|
+
from: z.string().optional(),
|
|
1052
|
+
data: z
|
|
1053
|
+
.object({
|
|
1054
|
+
task_id: z.string(),
|
|
1055
|
+
tx: z.object({
|
|
1056
|
+
to: z.string(),
|
|
1057
|
+
value: z.string(),
|
|
1058
|
+
data: z.string().optional(),
|
|
1059
|
+
chainId: z.number()
|
|
1060
|
+
}),
|
|
1061
|
+
description: z.string().optional(),
|
|
1062
|
+
optional: z.boolean().optional()
|
|
1063
|
+
})
|
|
1064
|
+
.passthrough()
|
|
1065
|
+
});
|
|
1066
|
+
|
|
1067
|
+
export type TriggerWalletTxMessage = z.infer<typeof TriggerWalletTxMessageSchema>;
|
|
1068
|
+
|
|
911
1069
|
// Union of all INCOMING message schemas for validation
|
|
912
1070
|
// Note: Outgoing message schemas (Subscribe, Unsubscribe, ListRooms) are excluded
|
|
913
1071
|
// as they share the same type values with their response counterparts
|
|
@@ -932,9 +1090,11 @@ export const AnyMessageSchema = z.discriminatedUnion("type", [
|
|
|
932
1090
|
|
|
933
1091
|
// Quote-Approve Flow (v2.2.0)
|
|
934
1092
|
TaskQuoteMessageSchema,
|
|
1093
|
+
TaskConfirmedMessageSchema,
|
|
935
1094
|
|
|
936
1095
|
// System
|
|
937
1096
|
ErrorMessageSchema,
|
|
1097
|
+
SuccessMessageSchema,
|
|
938
1098
|
PingMessageSchema,
|
|
939
1099
|
PongMessageSchema,
|
|
940
1100
|
|
|
@@ -954,9 +1114,6 @@ export const AnyMessageSchema = z.discriminatedUnion("type", [
|
|
|
954
1114
|
AvailableAgentsResponseSchema,
|
|
955
1115
|
AgentStatusUpdateMessageSchema,
|
|
956
1116
|
|
|
957
|
-
// Room Ping System (v2.0.0)
|
|
958
|
-
RoomPongResponseSchema,
|
|
959
|
-
|
|
960
1117
|
// Admin Messages
|
|
961
1118
|
AllAgentsResponseSchema,
|
|
962
1119
|
UserCountMessageSchema,
|
|
@@ -965,7 +1122,13 @@ export const AnyMessageSchema = z.discriminatedUnion("type", [
|
|
|
965
1122
|
AgentDetailsResponseMessageSchema,
|
|
966
1123
|
|
|
967
1124
|
// User Preferences
|
|
968
|
-
UserPreferencesUpdatedMessageSchema
|
|
1125
|
+
UserPreferencesUpdatedMessageSchema,
|
|
1126
|
+
|
|
1127
|
+
// Agent Error
|
|
1128
|
+
AgentErrorMessageSchema,
|
|
1129
|
+
|
|
1130
|
+
// Wallet Transaction
|
|
1131
|
+
TriggerWalletTxMessageSchema
|
|
969
1132
|
]);
|
|
970
1133
|
|
|
971
1134
|
// Type inference from schemas
|
|
@@ -1003,6 +1166,7 @@ export type TaskQuoteMessage = z.infer<typeof TaskQuoteMessageSchema>;
|
|
|
1003
1166
|
export type ConfirmTaskMessage = z.infer<typeof ConfirmTaskMessageSchema>;
|
|
1004
1167
|
|
|
1005
1168
|
export type ErrorMessage = z.infer<typeof ErrorMessageSchema>;
|
|
1169
|
+
export type SuccessMessage = z.infer<typeof SuccessMessageSchema>;
|
|
1006
1170
|
export type PingMessage = z.infer<typeof PingMessageSchema>;
|
|
1007
1171
|
export type PongMessage = z.infer<typeof PongMessageSchema>;
|
|
1008
1172
|
export type SubscribeMessage = z.infer<typeof SubscribeMessageSchema>;
|
|
@@ -1038,7 +1202,7 @@ export type AgentStatusUpdateMessage = z.infer<typeof AgentStatusUpdateMessageSc
|
|
|
1038
1202
|
|
|
1039
1203
|
// Room Ping Types (v2.0.0)
|
|
1040
1204
|
export type RoomPingMessage = z.infer<typeof RoomPingMessageSchema>;
|
|
1041
|
-
|
|
1205
|
+
// Note: Room pong responses use the PongMessage type with room data
|
|
1042
1206
|
|
|
1043
1207
|
export type AnyMessage = z.infer<typeof AnyMessageSchema>;
|
|
1044
1208
|
|
|
@@ -1089,10 +1253,16 @@ export function createRequestChallenge(
|
|
|
1089
1253
|
});
|
|
1090
1254
|
}
|
|
1091
1255
|
|
|
1092
|
-
export function createCheckCachedAuth(
|
|
1256
|
+
export function createCheckCachedAuth(
|
|
1257
|
+
address: string,
|
|
1258
|
+
sessionToken?: string
|
|
1259
|
+
): CheckCachedAuthMessage {
|
|
1093
1260
|
return CheckCachedAuthMessageSchema.parse({
|
|
1094
1261
|
type: "check_cached_auth",
|
|
1095
|
-
data: {
|
|
1262
|
+
data: {
|
|
1263
|
+
address,
|
|
1264
|
+
...(sessionToken && { session_token: sessionToken })
|
|
1265
|
+
}
|
|
1096
1266
|
});
|
|
1097
1267
|
}
|
|
1098
1268
|
|
|
@@ -1149,11 +1319,16 @@ export function createListRooms(): ListRoomsMessage {
|
|
|
1149
1319
|
}
|
|
1150
1320
|
|
|
1151
1321
|
// Quote-Approve Flow factory functions (v2.2.0)
|
|
1152
|
-
export function createRequestTask(
|
|
1322
|
+
export function createRequestTask(
|
|
1323
|
+
content: string,
|
|
1324
|
+
room: string,
|
|
1325
|
+
network?: string
|
|
1326
|
+
): RequestTaskMessage {
|
|
1153
1327
|
return RequestTaskMessageSchema.parse({
|
|
1154
1328
|
type: "request_task",
|
|
1155
1329
|
content,
|
|
1156
|
-
room
|
|
1330
|
+
room,
|
|
1331
|
+
...(network && { data: { network } })
|
|
1157
1332
|
});
|
|
1158
1333
|
}
|
|
1159
1334
|
|
|
@@ -7,7 +7,7 @@ export interface ResolvedPricing {
|
|
|
7
7
|
pricePerUnit: number;
|
|
8
8
|
priceType: PriceType;
|
|
9
9
|
taskUnit?: string;
|
|
10
|
-
timeUnit?: "
|
|
10
|
+
timeUnit?: "second" | "minute" | "hour";
|
|
11
11
|
totalPrice: number;
|
|
12
12
|
itemCount?: number;
|
|
13
13
|
duration?: number;
|
|
@@ -40,7 +40,15 @@ export function resolveAgentPricing(
|
|
|
40
40
|
const command = agent.commands.find(
|
|
41
41
|
(cmd) => cmd.trigger.toLowerCase() === commandTrigger.toLowerCase()
|
|
42
42
|
);
|
|
43
|
-
pricing
|
|
43
|
+
// Command pricing fields are flat on the command object
|
|
44
|
+
if (command) {
|
|
45
|
+
pricing = {
|
|
46
|
+
pricePerUnit: command.pricePerUnit,
|
|
47
|
+
priceType: command.priceType,
|
|
48
|
+
taskUnit: command.taskUnit,
|
|
49
|
+
timeUnit: command.timeUnit
|
|
50
|
+
};
|
|
51
|
+
}
|
|
44
52
|
}
|
|
45
53
|
|
|
46
54
|
if (!pricing) {
|
|
@@ -101,7 +101,7 @@ async function testDirectAgentCommand() {
|
|
|
101
101
|
// Subscribe to test room
|
|
102
102
|
console.log("Subscribing to room:", TEST_ROOM);
|
|
103
103
|
try {
|
|
104
|
-
await sdk.
|
|
104
|
+
await sdk.subscribeToPublicRoom(TEST_ROOM);
|
|
105
105
|
console.log("Subscribed!\n");
|
|
106
106
|
} catch {
|
|
107
107
|
console.log("Room subscription skipped (private room)\n");
|
|
@@ -614,7 +614,7 @@ describe.skipIf(!hasCredentials)("Real Teneo Server Integration Test", () => {
|
|
|
614
614
|
if (rooms.length > 0) {
|
|
615
615
|
const testRoom = rooms[0];
|
|
616
616
|
|
|
617
|
-
await sdk.
|
|
617
|
+
await sdk.subscribeToPublicRoom(testRoom.id);
|
|
618
618
|
expect(sdk.getSubscribedRooms()).toContain(testRoom.id);
|
|
619
619
|
|
|
620
620
|
console.log(`Subscribed to room: ${testRoom.name} (${testRoom.id})`);
|
|
@@ -150,7 +150,7 @@ describe("WebSocket Integration Tests", () => {
|
|
|
150
150
|
.withWebSocketUrl(`ws://localhost:${serverPort}`)
|
|
151
151
|
.withAuthentication(privateKey)
|
|
152
152
|
.withReconnection(false) // Disable for tests
|
|
153
|
-
.
|
|
153
|
+
.withAutoJoinPublicRooms(["test-room"]) // Auto-join test room
|
|
154
154
|
.withPayments({ autoApprove: false }) // Use legacy flow for mock server
|
|
155
155
|
.build();
|
|
156
156
|
|
|
@@ -241,7 +241,7 @@ describe("WebSocket Integration Tests", () => {
|
|
|
241
241
|
sdk.on("agent:list", resolve);
|
|
242
242
|
});
|
|
243
243
|
|
|
244
|
-
await sdk.
|
|
244
|
+
await sdk.subscribeToPublicRoom("test-room");
|
|
245
245
|
const agents = await agentsPromise;
|
|
246
246
|
|
|
247
247
|
expect(agents).toBeDefined();
|
|
@@ -258,7 +258,7 @@ describe("WebSocket Integration Tests", () => {
|
|
|
258
258
|
setTimeout(() => reject(new Error("Event timeout")), 10000);
|
|
259
259
|
});
|
|
260
260
|
|
|
261
|
-
await sdk.
|
|
261
|
+
await sdk.subscribeToPublicRoom("test-room-2"); // Use different room to avoid auto-join conflicts
|
|
262
262
|
await subscribePromise;
|
|
263
263
|
|
|
264
264
|
expect(sdk.getSubscribedRooms()).toContain("test-room-2");
|