@teneo-protocol/sdk 1.0.0 → 2.0.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/.github/workflows/publish-npm.yml +8 -6
- package/CHANGELOG.md +265 -0
- package/README.md +406 -53
- package/dist/core/websocket-client.d.ts +13 -0
- package/dist/core/websocket-client.d.ts.map +1 -1
- package/dist/core/websocket-client.js +34 -3
- package/dist/core/websocket-client.js.map +1 -1
- package/dist/handlers/message-handlers/agent-room-operation-response-handler.d.ts +76 -0
- package/dist/handlers/message-handlers/agent-room-operation-response-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/agent-room-operation-response-handler.js +70 -0
- package/dist/handlers/message-handlers/agent-room-operation-response-handler.js.map +1 -0
- package/dist/handlers/message-handlers/agent-selected-handler.d.ts +92 -38
- package/dist/handlers/message-handlers/agent-selected-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/agent-status-update-handler.d.ts +904 -0
- package/dist/handlers/message-handlers/agent-status-update-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/agent-status-update-handler.js +51 -0
- package/dist/handlers/message-handlers/agent-status-update-handler.js.map +1 -0
- package/dist/handlers/message-handlers/auth-error-handler.d.ts +45 -31
- package/dist/handlers/message-handlers/auth-error-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/auth-message-handler.d.ts +6 -0
- package/dist/handlers/message-handlers/auth-message-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/auth-message-handler.js +65 -5
- package/dist/handlers/message-handlers/auth-message-handler.js.map +1 -1
- package/dist/handlers/message-handlers/auth-required-handler.d.ts +49 -31
- package/dist/handlers/message-handlers/auth-required-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/auth-success-handler.d.ts +6 -0
- package/dist/handlers/message-handlers/auth-success-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/auth-success-handler.js +46 -4
- package/dist/handlers/message-handlers/auth-success-handler.js.map +1 -1
- package/dist/handlers/message-handlers/challenge-handler.d.ts +45 -31
- package/dist/handlers/message-handlers/challenge-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/error-message-handler.d.ts +49 -31
- package/dist/handlers/message-handlers/error-message-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/index.d.ts +5 -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 +877 -0
- package/dist/handlers/message-handlers/list-available-agents-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/list-available-agents-handler.js +38 -0
- package/dist/handlers/message-handlers/list-available-agents-handler.js.map +1 -0
- package/dist/handlers/message-handlers/list-room-agents-handler.d.ts +886 -0
- package/dist/handlers/message-handlers/list-room-agents-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/list-room-agents-handler.js +51 -0
- package/dist/handlers/message-handlers/list-room-agents-handler.js.map +1 -0
- package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts +178 -89
- package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/ping-pong-handler.d.ts +62 -58
- package/dist/handlers/message-handlers/ping-pong-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/regular-message-handler.d.ts +31 -29
- package/dist/handlers/message-handlers/regular-message-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/regular-message-handler.js +1 -0
- package/dist/handlers/message-handlers/regular-message-handler.js.map +1 -1
- package/dist/handlers/message-handlers/room-operation-response-handler.d.ts +328 -0
- package/dist/handlers/message-handlers/room-operation-response-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/room-operation-response-handler.js +92 -0
- package/dist/handlers/message-handlers/room-operation-response-handler.js.map +1 -0
- package/dist/handlers/message-handlers/subscribe-response-handler.d.ts +53 -31
- package/dist/handlers/message-handlers/subscribe-response-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/types.d.ts +2 -0
- package/dist/handlers/message-handlers/types.d.ts.map +1 -1
- package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts +53 -31
- package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts.map +1 -1
- package/dist/managers/agent-room-manager.d.ts +222 -0
- package/dist/managers/agent-room-manager.d.ts.map +1 -0
- package/dist/managers/agent-room-manager.js +508 -0
- package/dist/managers/agent-room-manager.js.map +1 -0
- package/dist/managers/index.d.ts +2 -0
- package/dist/managers/index.d.ts.map +1 -1
- package/dist/managers/index.js +5 -1
- package/dist/managers/index.js.map +1 -1
- package/dist/managers/message-router.d.ts +1 -1
- package/dist/managers/message-router.d.ts.map +1 -1
- package/dist/managers/message-router.js +41 -4
- package/dist/managers/message-router.js.map +1 -1
- package/dist/managers/room-management-manager.d.ts +213 -0
- package/dist/managers/room-management-manager.d.ts.map +1 -0
- package/dist/managers/room-management-manager.js +440 -0
- package/dist/managers/room-management-manager.js.map +1 -0
- package/dist/managers/room-manager.d.ts +4 -4
- package/dist/managers/room-manager.d.ts.map +1 -1
- package/dist/managers/room-manager.js +1 -1
- package/dist/managers/room-manager.js.map +1 -1
- package/dist/teneo-sdk.d.ts +362 -14
- package/dist/teneo-sdk.d.ts.map +1 -1
- package/dist/teneo-sdk.js +497 -7
- package/dist/teneo-sdk.js.map +1 -1
- package/dist/types/config.d.ts +63 -54
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +9 -5
- package/dist/types/config.js.map +1 -1
- package/dist/types/error-codes.d.ts +2 -0
- package/dist/types/error-codes.d.ts.map +1 -1
- package/dist/types/error-codes.js +3 -0
- package/dist/types/error-codes.js.map +1 -1
- package/dist/types/events.d.ts +132 -68
- 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 +27 -2
- package/dist/types/index.js.map +1 -1
- package/dist/types/messages.d.ts +11396 -2559
- package/dist/types/messages.d.ts.map +1 -1
- package/dist/types/messages.js +294 -27
- package/dist/types/messages.js.map +1 -1
- package/dist/types/validation.d.ts.map +1 -1
- package/dist/types/validation.js +1 -1
- package/dist/types/validation.js.map +1 -1
- package/dist/utils/bounded-queue.d.ts +1 -1
- package/dist/utils/bounded-queue.js +6 -6
- package/dist/utils/circuit-breaker.d.ts.map +1 -1
- package/dist/utils/circuit-breaker.js.map +1 -1
- package/dist/utils/event-waiter.d.ts.map +1 -1
- package/dist/utils/event-waiter.js +2 -1
- package/dist/utils/event-waiter.js.map +1 -1
- package/dist/utils/rate-limiter.d.ts.map +1 -1
- package/dist/utils/rate-limiter.js +4 -6
- package/dist/utils/rate-limiter.js.map +1 -1
- package/dist/utils/secure-private-key.d.ts.map +1 -1
- package/dist/utils/secure-private-key.js +9 -15
- package/dist/utils/secure-private-key.js.map +1 -1
- package/dist/utils/signature-verifier.d.ts +2 -2
- package/dist/utils/signature-verifier.d.ts.map +1 -1
- package/dist/utils/signature-verifier.js +5 -5
- package/dist/utils/signature-verifier.js.map +1 -1
- package/examples/.env.example +1 -1
- package/examples/agent-room-management-example.ts +334 -0
- package/examples/claude-agent-x-follower/.env.example +117 -0
- package/examples/claude-agent-x-follower/QUICKSTART.md +243 -0
- package/examples/claude-agent-x-follower/README.md +540 -0
- package/examples/claude-agent-x-follower/index.ts +248 -0
- package/examples/claude-agent-x-follower/package.json +37 -0
- package/examples/claude-agent-x-follower/tsconfig.json +20 -0
- package/examples/n8n-teneo/.env.example +127 -0
- package/examples/n8n-teneo/Dockerfile +42 -0
- package/examples/n8n-teneo/README.md +564 -0
- package/examples/n8n-teneo/docker-compose.yml +71 -0
- package/examples/n8n-teneo/index.ts +177 -0
- package/examples/n8n-teneo/package.json +22 -0
- package/examples/n8n-teneo/tsconfig.json +12 -0
- package/examples/n8n-teneo/workflows/x-timeline.json +66 -0
- package/examples/openai-teneo/.env.example +130 -0
- package/examples/openai-teneo/README.md +635 -0
- package/examples/openai-teneo/index.ts +280 -0
- package/examples/openai-teneo/package.json +24 -0
- package/examples/openai-teneo/tsconfig.json +16 -0
- package/examples/production-dashboard/.env.example +5 -3
- package/examples/production-dashboard/README.md +839 -0
- package/examples/production-dashboard/pnpm-lock.yaml +92 -0
- package/examples/production-dashboard/public/dashboard.html +1150 -504
- package/examples/production-dashboard/server.ts +428 -12
- package/examples/room-management-example.ts +285 -0
- package/examples/usage/.env.example +17 -0
- package/examples/usage/01-connect.ts +116 -0
- package/examples/usage/02-list-agents.ts +153 -0
- package/examples/usage/03-pick-agent.ts +201 -0
- package/examples/usage/04-find-by-capability.ts +237 -0
- package/examples/usage/05-webhook-example.ts +319 -0
- package/examples/usage/06-simple-api-server.ts +396 -0
- package/examples/usage/07-event-listener.ts +402 -0
- package/examples/usage/README.md +383 -0
- package/examples/usage/package.json +42 -0
- package/package.json +13 -3
- package/src/core/websocket-client.ts +43 -9
- package/src/formatters/response-formatter.test.ts +8 -2
- package/src/handlers/message-handlers/agent-room-operation-response-handler.ts +83 -0
- package/src/handlers/message-handlers/agent-status-update-handler.ts +58 -0
- package/src/handlers/message-handlers/auth-message-handler.ts +73 -5
- package/src/handlers/message-handlers/auth-success-handler.ts +58 -6
- package/src/handlers/message-handlers/index.ts +19 -0
- package/src/handlers/message-handlers/list-available-agents-handler.ts +41 -0
- package/src/handlers/message-handlers/list-room-agents-handler.ts +61 -0
- package/src/handlers/message-handlers/regular-message-handler.ts +1 -0
- package/src/handlers/message-handlers/room-operation-response-handler.ts +105 -0
- package/src/handlers/message-handlers/types.ts +6 -0
- package/src/handlers/webhook-handler.test.ts +13 -10
- package/src/managers/agent-room-manager.ts +609 -0
- package/src/managers/index.ts +2 -0
- package/src/managers/message-router.ts +48 -6
- package/src/managers/room-management-manager.ts +523 -0
- package/src/managers/room-manager.ts +12 -6
- package/src/teneo-sdk.ts +543 -10
- package/src/types/config.ts +13 -6
- package/src/types/error-codes.ts +4 -0
- package/src/types/events.ts +24 -0
- package/src/types/index.ts +55 -0
- package/src/types/messages.ts +374 -41
- package/src/types/validation.ts +4 -1
- package/src/utils/bounded-queue.ts +9 -9
- package/src/utils/circuit-breaker.ts +4 -1
- package/src/utils/deduplication-cache.test.ts +2 -6
- package/src/utils/event-waiter.test.ts +4 -1
- package/src/utils/event-waiter.ts +5 -7
- package/src/utils/rate-limiter.test.ts +5 -17
- package/src/utils/rate-limiter.ts +6 -9
- package/src/utils/secure-private-key.test.ts +66 -59
- package/src/utils/secure-private-key.ts +10 -16
- package/src/utils/signature-verifier.test.ts +75 -70
- package/src/utils/signature-verifier.ts +7 -8
- package/src/utils/ssrf-validator.test.ts +3 -3
- package/tests/integration/room-management.test.ts +514 -0
- package/tests/integration/websocket.test.ts +1 -1
- package/tests/unit/handlers/agent-room-operation-response-handler.test.ts +394 -0
- package/tests/unit/handlers/agent-status-update-handler.test.ts +407 -0
- package/tests/unit/handlers/auth-success-handler-rooms.test.ts +699 -0
- package/tests/unit/handlers/list-available-agents-handler.test.ts +256 -0
- package/tests/unit/handlers/list-room-agents-handler.test.ts +294 -0
- package/tests/unit/handlers/room-operation-response-handler.test.ts +527 -0
- package/tests/unit/managers/agent-room-manager.test.ts +534 -0
- package/tests/unit/managers/room-management-manager.test.ts +438 -0
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
1
2
|
/**
|
|
2
3
|
* Production Dashboard Example - Hono + Bun
|
|
3
4
|
*
|
|
@@ -15,6 +16,14 @@
|
|
|
15
16
|
* - Real-time event streaming
|
|
16
17
|
* - Complete error handling
|
|
17
18
|
*
|
|
19
|
+
* 🆕 V2.0 Features:
|
|
20
|
+
* - Multi-room management (create, update, delete rooms)
|
|
21
|
+
* - Room ownership tracking (owned vs shared rooms)
|
|
22
|
+
* - Room limits and quotas
|
|
23
|
+
* - Agent-room customization (add/remove agents per room)
|
|
24
|
+
* - Agent-room caching with 5-minute TTL
|
|
25
|
+
* - Real-time agent status updates
|
|
26
|
+
*
|
|
18
27
|
* Run with: bun run server.ts
|
|
19
28
|
*/
|
|
20
29
|
|
|
@@ -26,12 +35,10 @@ import type { AgentResponse } from "../../dist/index.js";
|
|
|
26
35
|
import { SDKConfigBuilder, TeneoSDK, SecurePrivateKey } from "../../dist/index.js";
|
|
27
36
|
|
|
28
37
|
// Load environment variables
|
|
29
|
-
const PORT = parseInt(process.env.PORT || "
|
|
30
|
-
const WS_URL =
|
|
31
|
-
process.env.WS_URL;
|
|
38
|
+
const PORT = parseInt(process.env.PORT || "3001");
|
|
39
|
+
const WS_URL = process.env.WS_URL || "wss://your-teneo-server.com/ws";
|
|
32
40
|
const PRIVATE_KEY = process.env.PRIVATE_KEY || "";
|
|
33
41
|
const WALLET_ADDRESS = process.env.WALLET_ADDRESS || "";
|
|
34
|
-
const DEFAULT_ROOM = process.env.DEFAULT_ROOM || "as1LfBarJNzOIpOQJQ7PH";
|
|
35
42
|
const ENABLE_SIG_VERIFICATION = process.env.ENABLE_SIGNATURE_VERIFICATION === "true";
|
|
36
43
|
const TRUSTED_ADDRESSES = process.env.TRUSTED_ADDRESSES?.split(",").filter(Boolean) || [];
|
|
37
44
|
|
|
@@ -74,7 +81,6 @@ async function initializeSDK() {
|
|
|
74
81
|
const config = new SDKConfigBuilder()
|
|
75
82
|
.withWebSocketUrl(WS_URL)
|
|
76
83
|
.withAuthentication(secureKey, WALLET_ADDRESS) // Pass SecurePrivateKey instead of plain string
|
|
77
|
-
.withAutoJoinRooms([DEFAULT_ROOM])
|
|
78
84
|
.withReconnection({ enabled: true, delay: 5000, maxAttempts: 10 })
|
|
79
85
|
// REL-3: Configure custom retry strategies for production resilience
|
|
80
86
|
.withReconnectionStrategy({
|
|
@@ -161,7 +167,9 @@ function setupSDKEventListeners(sdk: TeneoSDK) {
|
|
|
161
167
|
|
|
162
168
|
// Authentication events
|
|
163
169
|
sdk.on("auth:challenge", (challenge) => {
|
|
164
|
-
addEvent("auth:challenge", {
|
|
170
|
+
addEvent("auth:challenge", {
|
|
171
|
+
challenge: challenge.substring(0, 20) + "..."
|
|
172
|
+
});
|
|
165
173
|
});
|
|
166
174
|
|
|
167
175
|
sdk.on("auth:success", (state) => {
|
|
@@ -195,7 +203,10 @@ function setupSDKEventListeners(sdk: TeneoSDK) {
|
|
|
195
203
|
messageId: message.id,
|
|
196
204
|
from: message.from
|
|
197
205
|
});
|
|
198
|
-
broadcastSSE({
|
|
206
|
+
broadcastSSE({
|
|
207
|
+
type: "message:duplicate",
|
|
208
|
+
message: { type: message.type, id: message.id }
|
|
209
|
+
});
|
|
199
210
|
});
|
|
200
211
|
|
|
201
212
|
// Agent events
|
|
@@ -231,12 +242,18 @@ function setupSDKEventListeners(sdk: TeneoSDK) {
|
|
|
231
242
|
|
|
232
243
|
// Room events
|
|
233
244
|
sdk.on("room:subscribed", (data) => {
|
|
234
|
-
addEvent("room:subscribed", {
|
|
245
|
+
addEvent("room:subscribed", {
|
|
246
|
+
roomId: data.roomId,
|
|
247
|
+
subscriptions: data.subscriptions
|
|
248
|
+
});
|
|
235
249
|
broadcastSSE({ type: "room:subscribed", data });
|
|
236
250
|
});
|
|
237
251
|
|
|
238
252
|
sdk.on("room:unsubscribed", (data) => {
|
|
239
|
-
addEvent("room:unsubscribed", {
|
|
253
|
+
addEvent("room:unsubscribed", {
|
|
254
|
+
roomId: data.roomId,
|
|
255
|
+
subscriptions: data.subscriptions
|
|
256
|
+
});
|
|
240
257
|
broadcastSSE({ type: "room:unsubscribed", data });
|
|
241
258
|
});
|
|
242
259
|
|
|
@@ -245,6 +262,81 @@ function setupSDKEventListeners(sdk: TeneoSDK) {
|
|
|
245
262
|
broadcastSSE({ type: "room:list", rooms });
|
|
246
263
|
});
|
|
247
264
|
|
|
265
|
+
// Room Management events (v2.0.0)
|
|
266
|
+
sdk.on("room:created", (room) => {
|
|
267
|
+
addEvent("room:created", { roomId: room.id, name: room.name });
|
|
268
|
+
broadcastSSE({ type: "room:created", room });
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
sdk.on("room:updated", (room) => {
|
|
272
|
+
addEvent("room:updated", { roomId: room.id, name: room.name });
|
|
273
|
+
broadcastSSE({ type: "room:updated", room });
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
sdk.on("room:deleted", (roomId) => {
|
|
277
|
+
addEvent("room:deleted", { roomId });
|
|
278
|
+
broadcastSSE({ type: "room:deleted", roomId });
|
|
279
|
+
});
|
|
280
|
+
|
|
281
|
+
sdk.on("room:create_error", (error) => {
|
|
282
|
+
addEvent("room:create_error", { error: error.message });
|
|
283
|
+
errorCounter++;
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
sdk.on("room:update_error", (error, roomId) => {
|
|
287
|
+
addEvent("room:update_error", { error: error.message, roomId });
|
|
288
|
+
errorCounter++;
|
|
289
|
+
});
|
|
290
|
+
|
|
291
|
+
sdk.on("room:delete_error", (error, roomId) => {
|
|
292
|
+
addEvent("room:delete_error", { error: error.message, roomId });
|
|
293
|
+
errorCounter++;
|
|
294
|
+
});
|
|
295
|
+
|
|
296
|
+
// Agent Room Management events (v2.0.0)
|
|
297
|
+
sdk.on("agent_room:agent_added", (roomId, agentId) => {
|
|
298
|
+
addEvent("agent_room:agent_added", { roomId, agentId });
|
|
299
|
+
broadcastSSE({ type: "agent_room:agent_added", roomId, agentId });
|
|
300
|
+
});
|
|
301
|
+
|
|
302
|
+
sdk.on("agent_room:agent_removed", (roomId, agentId) => {
|
|
303
|
+
addEvent("agent_room:agent_removed", { roomId, agentId });
|
|
304
|
+
broadcastSSE({ type: "agent_room:agent_removed", roomId, agentId });
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
sdk.on("agent_room:agents_listed", (roomId, agents) => {
|
|
308
|
+
addEvent("agent_room:agents_listed", { roomId, count: agents.length });
|
|
309
|
+
});
|
|
310
|
+
|
|
311
|
+
sdk.on("agent_room:available_agents_listed", (agents) => {
|
|
312
|
+
addEvent("agent_room:available_agents_listed", { count: agents.length });
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
sdk.on("agent_room:status_update", (data) => {
|
|
316
|
+
addEvent("agent_room:status_update", data);
|
|
317
|
+
broadcastSSE({ type: "agent_room:status_update", data });
|
|
318
|
+
});
|
|
319
|
+
|
|
320
|
+
sdk.on("agent_room:add_error", (error, roomId) => {
|
|
321
|
+
addEvent("agent_room:add_error", { error: error.message, roomId });
|
|
322
|
+
errorCounter++;
|
|
323
|
+
});
|
|
324
|
+
|
|
325
|
+
sdk.on("agent_room:remove_error", (error, roomId) => {
|
|
326
|
+
addEvent("agent_room:remove_error", { error: error.message, roomId });
|
|
327
|
+
errorCounter++;
|
|
328
|
+
});
|
|
329
|
+
|
|
330
|
+
sdk.on("agent_room:list_error", (error, roomId) => {
|
|
331
|
+
addEvent("agent_room:list_error", { error: error.message, roomId });
|
|
332
|
+
errorCounter++;
|
|
333
|
+
});
|
|
334
|
+
|
|
335
|
+
sdk.on("agent_room:list_available_error", (error) => {
|
|
336
|
+
addEvent("agent_room:list_available_error", { error: error.message });
|
|
337
|
+
errorCounter++;
|
|
338
|
+
});
|
|
339
|
+
|
|
248
340
|
// Webhook events
|
|
249
341
|
sdk.on("webhook:sent", (payload, url) => {
|
|
250
342
|
addEvent("webhook:sent", { event: payload.event, url });
|
|
@@ -272,7 +364,10 @@ function setupSDKEventListeners(sdk: TeneoSDK) {
|
|
|
272
364
|
recoverable: error.recoverable
|
|
273
365
|
});
|
|
274
366
|
errorCounter++;
|
|
275
|
-
broadcastSSE({
|
|
367
|
+
broadcastSSE({
|
|
368
|
+
type: "error",
|
|
369
|
+
error: { message: error.message, code: error.code }
|
|
370
|
+
});
|
|
276
371
|
});
|
|
277
372
|
|
|
278
373
|
sdk.on("warning", (warning) => {
|
|
@@ -440,12 +535,16 @@ app.post("/api/message", async (c) => {
|
|
|
440
535
|
}
|
|
441
536
|
|
|
442
537
|
try {
|
|
443
|
-
const { content, waitForResponse = false } = await c.req.json();
|
|
538
|
+
const { content, room, waitForResponse = false } = await c.req.json();
|
|
444
539
|
|
|
445
540
|
if (!content || typeof content !== "string") {
|
|
446
541
|
return c.json({ error: "Content is required" }, 400);
|
|
447
542
|
}
|
|
448
543
|
|
|
544
|
+
if (!room || typeof room !== "string") {
|
|
545
|
+
return c.json({ error: "Room is required" }, 400);
|
|
546
|
+
}
|
|
547
|
+
|
|
449
548
|
const messageId = `msg_${Date.now()}`;
|
|
450
549
|
const storedMessage: StoredMessage = {
|
|
451
550
|
id: messageId,
|
|
@@ -458,7 +557,7 @@ app.post("/api/message", async (c) => {
|
|
|
458
557
|
messageCounter++;
|
|
459
558
|
|
|
460
559
|
const response = await sdk.sendMessage(content, {
|
|
461
|
-
room
|
|
560
|
+
room,
|
|
462
561
|
waitForResponse,
|
|
463
562
|
timeout: 60000
|
|
464
563
|
});
|
|
@@ -575,6 +674,93 @@ app.get("/api/rooms", (c) => {
|
|
|
575
674
|
return c.json(rooms);
|
|
576
675
|
});
|
|
577
676
|
|
|
677
|
+
// Get available rooms for sending messages (subscribed + private room + owned rooms)
|
|
678
|
+
app.get("/api/rooms/available", (c) => {
|
|
679
|
+
if (!sdk) {
|
|
680
|
+
return c.json({ error: "SDK not initialized" }, 503);
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
const authState = sdk.getAuthState();
|
|
684
|
+
const subscribedRooms = sdk.getSubscribedRooms();
|
|
685
|
+
const ownedRooms = sdk.getOwnedRooms(); // v2.0.0: Include newly created rooms
|
|
686
|
+
const sharedRooms = sdk.getSharedRooms(); // v2.0.0: Include shared rooms
|
|
687
|
+
|
|
688
|
+
// Combine all available rooms
|
|
689
|
+
const availableRooms: Array<{
|
|
690
|
+
id: string;
|
|
691
|
+
name: string;
|
|
692
|
+
type: string;
|
|
693
|
+
description?: string;
|
|
694
|
+
}> = [];
|
|
695
|
+
|
|
696
|
+
// Add subscribed public rooms
|
|
697
|
+
if (subscribedRooms && subscribedRooms.length > 0) {
|
|
698
|
+
subscribedRooms.forEach((roomId: string) => {
|
|
699
|
+
availableRooms.push({
|
|
700
|
+
id: roomId,
|
|
701
|
+
name: roomId,
|
|
702
|
+
type: "subscribed"
|
|
703
|
+
});
|
|
704
|
+
});
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
// Add rooms from auth state (includes both public and private rooms with full details)
|
|
708
|
+
if (authState.roomObjects && authState.roomObjects.length > 0) {
|
|
709
|
+
authState.roomObjects.forEach((room: any) => {
|
|
710
|
+
// Only add if not already in the list
|
|
711
|
+
if (!availableRooms.find((r) => r.id === room.id)) {
|
|
712
|
+
availableRooms.push({
|
|
713
|
+
id: room.id,
|
|
714
|
+
name: room.name || room.id,
|
|
715
|
+
type: room.is_public ? "public" : "private",
|
|
716
|
+
description: room.description
|
|
717
|
+
});
|
|
718
|
+
}
|
|
719
|
+
});
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
// Add owned rooms (v2.0.0) - includes newly created rooms
|
|
723
|
+
if (ownedRooms && ownedRooms.length > 0) {
|
|
724
|
+
ownedRooms.forEach((room) => {
|
|
725
|
+
// Only add if not already in the list
|
|
726
|
+
if (!availableRooms.find((r) => r.id === room.id)) {
|
|
727
|
+
availableRooms.push({
|
|
728
|
+
id: room.id,
|
|
729
|
+
name: room.name || room.id,
|
|
730
|
+
type: room.is_public ? "public" : "private",
|
|
731
|
+
description: room.description || undefined
|
|
732
|
+
});
|
|
733
|
+
}
|
|
734
|
+
});
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
// Add shared rooms (v2.0.0) - rooms user is a member of
|
|
738
|
+
if (sharedRooms && sharedRooms.length > 0) {
|
|
739
|
+
sharedRooms.forEach((room) => {
|
|
740
|
+
// Only add if not already in the list
|
|
741
|
+
if (!availableRooms.find((r) => r.id === room.id)) {
|
|
742
|
+
availableRooms.push({
|
|
743
|
+
id: room.id,
|
|
744
|
+
name: room.name || room.id,
|
|
745
|
+
type: room.is_public ? "public" : "private",
|
|
746
|
+
description: room.description || undefined
|
|
747
|
+
});
|
|
748
|
+
}
|
|
749
|
+
});
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
// Add private room ID if not already included
|
|
753
|
+
if (authState.privateRoomId && !availableRooms.find((r) => r.id === authState.privateRoomId)) {
|
|
754
|
+
availableRooms.push({
|
|
755
|
+
id: authState.privateRoomId,
|
|
756
|
+
name: "My Private Room",
|
|
757
|
+
type: "private"
|
|
758
|
+
});
|
|
759
|
+
}
|
|
760
|
+
|
|
761
|
+
return c.json(availableRooms);
|
|
762
|
+
});
|
|
763
|
+
|
|
578
764
|
// List all rooms
|
|
579
765
|
app.get("/api/rooms/list", async (c) => {
|
|
580
766
|
if (!sdk || !sdk.isConnected) {
|
|
@@ -629,6 +815,236 @@ app.post("/api/room/leave", async (c) => {
|
|
|
629
815
|
}
|
|
630
816
|
});
|
|
631
817
|
|
|
818
|
+
// ========================================
|
|
819
|
+
// 🆕 V2.0 ROOM MANAGEMENT API
|
|
820
|
+
// ========================================
|
|
821
|
+
|
|
822
|
+
// Get owned rooms (v2.0)
|
|
823
|
+
app.get("/api/v2/rooms/owned", (c) => {
|
|
824
|
+
if (!sdk) {
|
|
825
|
+
return c.json({ error: "SDK not initialized" }, 503);
|
|
826
|
+
}
|
|
827
|
+
|
|
828
|
+
const ownedRooms = sdk.getOwnedRooms();
|
|
829
|
+
return c.json(ownedRooms);
|
|
830
|
+
});
|
|
831
|
+
|
|
832
|
+
// Get shared rooms (v2.0)
|
|
833
|
+
app.get("/api/v2/rooms/shared", (c) => {
|
|
834
|
+
if (!sdk) {
|
|
835
|
+
return c.json({ error: "SDK not initialized" }, 503);
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
const sharedRooms = sdk.getSharedRooms();
|
|
839
|
+
return c.json(sharedRooms);
|
|
840
|
+
});
|
|
841
|
+
|
|
842
|
+
// Get room limit info (v2.0)
|
|
843
|
+
app.get("/api/v2/rooms/limit", (c) => {
|
|
844
|
+
if (!sdk) {
|
|
845
|
+
return c.json({ error: "SDK not initialized" }, 503);
|
|
846
|
+
}
|
|
847
|
+
|
|
848
|
+
return c.json({
|
|
849
|
+
limit: sdk.getRoomLimit(),
|
|
850
|
+
count: sdk.getOwnedRoomCount(),
|
|
851
|
+
canCreate: sdk.canCreateRoom()
|
|
852
|
+
});
|
|
853
|
+
});
|
|
854
|
+
|
|
855
|
+
// Create room (v2.0)
|
|
856
|
+
app.post("/api/v2/rooms", async (c) => {
|
|
857
|
+
if (!sdk || !sdk.isConnected) {
|
|
858
|
+
return c.json({ error: "SDK not connected" }, 503);
|
|
859
|
+
}
|
|
860
|
+
|
|
861
|
+
try {
|
|
862
|
+
const { name, description } = await c.req.json();
|
|
863
|
+
|
|
864
|
+
if (!name) {
|
|
865
|
+
return c.json({ error: "Room name is required" }, 400);
|
|
866
|
+
}
|
|
867
|
+
|
|
868
|
+
const room = await sdk.createRoom({ name, description });
|
|
869
|
+
return c.json(room);
|
|
870
|
+
} catch (error: any) {
|
|
871
|
+
return c.json({ error: error.message }, 500);
|
|
872
|
+
}
|
|
873
|
+
});
|
|
874
|
+
|
|
875
|
+
// Update room (v2.0)
|
|
876
|
+
app.put("/api/v2/rooms/:id", async (c) => {
|
|
877
|
+
if (!sdk || !sdk.isConnected) {
|
|
878
|
+
return c.json({ error: "SDK not connected" }, 503);
|
|
879
|
+
}
|
|
880
|
+
|
|
881
|
+
try {
|
|
882
|
+
const roomId = c.req.param("id");
|
|
883
|
+
const updates = await c.req.json();
|
|
884
|
+
|
|
885
|
+
if (!updates.name && !updates.description) {
|
|
886
|
+
return c.json({ error: "At least one field (name or description) must be provided" }, 400);
|
|
887
|
+
}
|
|
888
|
+
|
|
889
|
+
const room = await sdk.updateRoom(roomId, updates);
|
|
890
|
+
return c.json(room);
|
|
891
|
+
} catch (error: any) {
|
|
892
|
+
return c.json({ error: error.message }, 500);
|
|
893
|
+
}
|
|
894
|
+
});
|
|
895
|
+
|
|
896
|
+
// Delete room (v2.0)
|
|
897
|
+
app.delete("/api/v2/rooms/:id", async (c) => {
|
|
898
|
+
if (!sdk || !sdk.isConnected) {
|
|
899
|
+
return c.json({ error: "SDK not connected" }, 503);
|
|
900
|
+
}
|
|
901
|
+
|
|
902
|
+
try {
|
|
903
|
+
const roomId = c.req.param("id");
|
|
904
|
+
await sdk.deleteRoom(roomId);
|
|
905
|
+
return c.json({ success: true, message: "Room deleted successfully" });
|
|
906
|
+
} catch (error: any) {
|
|
907
|
+
return c.json({ error: error.message }, 500);
|
|
908
|
+
}
|
|
909
|
+
});
|
|
910
|
+
|
|
911
|
+
// ========================================
|
|
912
|
+
// 🆕 V2.0 AGENT ROOM MANAGEMENT API
|
|
913
|
+
// ========================================
|
|
914
|
+
|
|
915
|
+
// List agents in a room (v2.0)
|
|
916
|
+
app.get("/api/v2/rooms/:id/agents", async (c) => {
|
|
917
|
+
if (!sdk || !sdk.isConnected) {
|
|
918
|
+
return c.json({ error: "SDK not connected" }, 503);
|
|
919
|
+
}
|
|
920
|
+
|
|
921
|
+
try {
|
|
922
|
+
const roomId = c.req.param("id");
|
|
923
|
+
const useCache = c.req.query("cache") !== "false"; // Default to true
|
|
924
|
+
|
|
925
|
+
const agents = await sdk.listRoomAgents(roomId, useCache);
|
|
926
|
+
return c.json({
|
|
927
|
+
roomId,
|
|
928
|
+
agents,
|
|
929
|
+
cached: useCache,
|
|
930
|
+
count: agents.length
|
|
931
|
+
});
|
|
932
|
+
} catch (error: any) {
|
|
933
|
+
return c.json({ error: error.message }, 500);
|
|
934
|
+
}
|
|
935
|
+
});
|
|
936
|
+
|
|
937
|
+
// List available agents for a room (v2.0)
|
|
938
|
+
app.get("/api/v2/rooms/:id/available-agents", async (c) => {
|
|
939
|
+
if (!sdk || !sdk.isConnected) {
|
|
940
|
+
return c.json({ error: "SDK not connected" }, 503);
|
|
941
|
+
}
|
|
942
|
+
|
|
943
|
+
try {
|
|
944
|
+
const roomId = c.req.param("id");
|
|
945
|
+
const useCache = c.req.query("cache") !== "false"; // Default to true
|
|
946
|
+
|
|
947
|
+
const agents = await sdk.listAvailableAgents(roomId, useCache);
|
|
948
|
+
return c.json({
|
|
949
|
+
roomId,
|
|
950
|
+
agents,
|
|
951
|
+
cached: useCache,
|
|
952
|
+
count: agents.length
|
|
953
|
+
});
|
|
954
|
+
} catch (error: any) {
|
|
955
|
+
return c.json({ error: error.message }, 500);
|
|
956
|
+
}
|
|
957
|
+
});
|
|
958
|
+
|
|
959
|
+
// Add agent to room (v2.0)
|
|
960
|
+
app.post("/api/v2/rooms/:roomId/agents/:agentId", async (c) => {
|
|
961
|
+
if (!sdk || !sdk.isConnected) {
|
|
962
|
+
return c.json({ error: "SDK not connected" }, 503);
|
|
963
|
+
}
|
|
964
|
+
|
|
965
|
+
try {
|
|
966
|
+
const roomId = c.req.param("roomId");
|
|
967
|
+
const agentId = c.req.param("agentId");
|
|
968
|
+
|
|
969
|
+
await sdk.addAgentToRoom(roomId, agentId);
|
|
970
|
+
return c.json({
|
|
971
|
+
success: true,
|
|
972
|
+
message: `Agent ${agentId} added to room ${roomId}`
|
|
973
|
+
});
|
|
974
|
+
} catch (error: any) {
|
|
975
|
+
return c.json({ error: error.message }, 500);
|
|
976
|
+
}
|
|
977
|
+
});
|
|
978
|
+
|
|
979
|
+
// Remove agent from room (v2.0)
|
|
980
|
+
app.delete("/api/v2/rooms/:roomId/agents/:agentId", async (c) => {
|
|
981
|
+
if (!sdk || !sdk.isConnected) {
|
|
982
|
+
return c.json({ error: "SDK not connected" }, 503);
|
|
983
|
+
}
|
|
984
|
+
|
|
985
|
+
try {
|
|
986
|
+
const roomId = c.req.param("roomId");
|
|
987
|
+
const agentId = c.req.param("agentId");
|
|
988
|
+
|
|
989
|
+
await sdk.removeAgentFromRoom(roomId, agentId);
|
|
990
|
+
return c.json({
|
|
991
|
+
success: true,
|
|
992
|
+
message: `Agent ${agentId} removed from room ${roomId}`
|
|
993
|
+
});
|
|
994
|
+
} catch (error: any) {
|
|
995
|
+
return c.json({ error: error.message }, 500);
|
|
996
|
+
}
|
|
997
|
+
});
|
|
998
|
+
|
|
999
|
+
// Check if agent is in room - instant cache query (v2.0)
|
|
1000
|
+
app.get("/api/v2/rooms/:roomId/agents/:agentId/check", (c) => {
|
|
1001
|
+
if (!sdk) {
|
|
1002
|
+
return c.json({ error: "SDK not initialized" }, 503);
|
|
1003
|
+
}
|
|
1004
|
+
|
|
1005
|
+
const roomId = c.req.param("roomId");
|
|
1006
|
+
const agentId = c.req.param("agentId");
|
|
1007
|
+
const isInRoom = sdk.isAgentInRoom(roomId, agentId);
|
|
1008
|
+
|
|
1009
|
+
return c.json({
|
|
1010
|
+
roomId,
|
|
1011
|
+
agentId,
|
|
1012
|
+
inRoom: isInRoom,
|
|
1013
|
+
cached: true
|
|
1014
|
+
});
|
|
1015
|
+
});
|
|
1016
|
+
|
|
1017
|
+
// Get room agent count - instant cache query (v2.0)
|
|
1018
|
+
app.get("/api/v2/rooms/:id/agents/count", (c) => {
|
|
1019
|
+
if (!sdk) {
|
|
1020
|
+
return c.json({ error: "SDK not initialized" }, 503);
|
|
1021
|
+
}
|
|
1022
|
+
|
|
1023
|
+
const roomId = c.req.param("id");
|
|
1024
|
+
const count = sdk.getRoomAgentCount(roomId);
|
|
1025
|
+
|
|
1026
|
+
return c.json({
|
|
1027
|
+
roomId,
|
|
1028
|
+
count,
|
|
1029
|
+
cached: true
|
|
1030
|
+
});
|
|
1031
|
+
});
|
|
1032
|
+
|
|
1033
|
+
// Invalidate agent-room cache for a room (v2.0)
|
|
1034
|
+
app.post("/api/v2/rooms/:id/cache/invalidate", (c) => {
|
|
1035
|
+
if (!sdk) {
|
|
1036
|
+
return c.json({ error: "SDK not initialized" }, 503);
|
|
1037
|
+
}
|
|
1038
|
+
|
|
1039
|
+
const roomId = c.req.param("id");
|
|
1040
|
+
sdk.invalidateAgentRoomCache(roomId);
|
|
1041
|
+
|
|
1042
|
+
return c.json({
|
|
1043
|
+
success: true,
|
|
1044
|
+
message: `Cache invalidated for room ${roomId}`
|
|
1045
|
+
});
|
|
1046
|
+
});
|
|
1047
|
+
|
|
632
1048
|
// Get recent events
|
|
633
1049
|
app.get("/api/events", (c) => {
|
|
634
1050
|
return c.json(recentEvents.slice(0, 50));
|