@radaros/transport 0.3.44 → 0.3.46

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/dist/index.cjs CHANGED
@@ -28,6 +28,7 @@ __export(index_exports, {
28
28
  createAgentRouter: () => createAgentRouter,
29
29
  createBrowserGateway: () => createBrowserGateway,
30
30
  createFileUploadMiddleware: () => createFileUploadMiddleware,
31
+ createVisionGateway: () => createVisionGateway,
31
32
  createVoiceGateway: () => createVoiceGateway,
32
33
  errorHandler: () => errorHandler,
33
34
  generateAgentCard: () => generateAgentCard,
@@ -2080,6 +2081,128 @@ function createAgentGateway(opts) {
2080
2081
  });
2081
2082
  }
2082
2083
 
2084
+ // src/socketio/vision-gateway.ts
2085
+ function createVisionGateway(opts) {
2086
+ const ns = opts.io.of(opts.namespace ?? "/radaros-vision");
2087
+ if (opts.authMiddleware) {
2088
+ ns.use(opts.authMiddleware);
2089
+ }
2090
+ const activeSessions = /* @__PURE__ */ new Map();
2091
+ ns.on("connection", (socket) => {
2092
+ socket.on(
2093
+ "vision.start",
2094
+ async (data) => {
2095
+ const agent = opts.agents[data.agentName];
2096
+ if (!agent) {
2097
+ socket.emit("vision.error", { error: `Vision agent "${data.agentName}" not found` });
2098
+ return;
2099
+ }
2100
+ if (activeSessions.has(socket.id)) {
2101
+ socket.emit("vision.error", { error: "A vision session is already active for this connection" });
2102
+ return;
2103
+ }
2104
+ try {
2105
+ const apiKey = data.apiKey ?? socket.handshake?.auth?.apiKey;
2106
+ const userId = data.userId ?? socket.handshake?.auth?.userId;
2107
+ const sessionId = data.sessionId ?? socket.handshake?.auth?.sessionId;
2108
+ const session = await agent.connect({ apiKey, userId, sessionId });
2109
+ activeSessions.set(socket.id, session);
2110
+ session.on("audio", (ev) => {
2111
+ socket.emit("vision.audio", {
2112
+ data: ev.data.toString("base64"),
2113
+ mimeType: ev.mimeType ?? "audio/pcm"
2114
+ });
2115
+ });
2116
+ session.on("transcript", (ev) => {
2117
+ socket.emit("vision.transcript", { text: ev.text, role: ev.role });
2118
+ });
2119
+ session.on("text", (ev) => {
2120
+ socket.emit("vision.text", { text: ev.text });
2121
+ });
2122
+ session.on("tool_call_start", (ev) => {
2123
+ socket.emit("vision.tool.call", { name: ev.name, args: ev.args });
2124
+ });
2125
+ session.on("tool_result", (ev) => {
2126
+ socket.emit("vision.tool.result", { name: ev.name, result: ev.result });
2127
+ });
2128
+ session.on("usage", (ev) => {
2129
+ socket.emit("vision.usage", ev);
2130
+ });
2131
+ session.on("interrupted", () => {
2132
+ socket.emit("vision.interrupted");
2133
+ });
2134
+ session.on("error", (ev) => {
2135
+ socket.emit("vision.error", { error: ev.error.message });
2136
+ });
2137
+ session.on("disconnected", () => {
2138
+ activeSessions.delete(socket.id);
2139
+ socket.emit("vision.stopped");
2140
+ });
2141
+ socket.emit("vision.started", { userId });
2142
+ } catch (error) {
2143
+ socket.emit("vision.error", { error: error.message });
2144
+ }
2145
+ }
2146
+ );
2147
+ socket.on("vision.audio", (data) => {
2148
+ const session = activeSessions.get(socket.id);
2149
+ if (!session) return;
2150
+ if (typeof data?.data !== "string" || data.data.length > 1e6) return;
2151
+ try {
2152
+ session.sendAudio(Buffer.from(data.data, "base64"));
2153
+ } catch {
2154
+ socket.emit("vision.error", { error: "Invalid audio data" });
2155
+ }
2156
+ });
2157
+ socket.on("vision.image", (data) => {
2158
+ const session = activeSessions.get(socket.id);
2159
+ if (!session) return;
2160
+ if (typeof data?.data !== "string" || data.data.length > 5e6) return;
2161
+ try {
2162
+ session.sendImage(Buffer.from(data.data, "base64"), data.mimeType ?? "image/jpeg");
2163
+ } catch {
2164
+ socket.emit("vision.error", { error: "Invalid image data" });
2165
+ }
2166
+ });
2167
+ socket.on("vision.text", (data) => {
2168
+ const session = activeSessions.get(socket.id);
2169
+ if (!session) return;
2170
+ if (typeof data?.text !== "string" || data.text.length > 1e4) return;
2171
+ session.sendText(data.text);
2172
+ });
2173
+ socket.on("vision.interrupt", () => {
2174
+ const session = activeSessions.get(socket.id);
2175
+ if (!session) return;
2176
+ session.interrupt();
2177
+ });
2178
+ socket.on("vision.stop", async () => {
2179
+ const session = activeSessions.get(socket.id);
2180
+ if (!session) return;
2181
+ try {
2182
+ await session.close();
2183
+ } catch (err) {
2184
+ console.warn("[vision-gateway] Error closing session:", err);
2185
+ }
2186
+ activeSessions.delete(socket.id);
2187
+ socket.emit("vision.stopped");
2188
+ });
2189
+ socket.on("disconnect", async () => {
2190
+ const session = activeSessions.get(socket.id);
2191
+ if (session) {
2192
+ try {
2193
+ await session.close();
2194
+ } catch (err) {
2195
+ console.warn(
2196
+ "[radaros/vision-gateway] Error closing session on disconnect:",
2197
+ err instanceof Error ? err.message : err
2198
+ );
2199
+ }
2200
+ activeSessions.delete(socket.id);
2201
+ }
2202
+ });
2203
+ });
2204
+ }
2205
+
2083
2206
  // src/socketio/voice-gateway.ts
2084
2207
  function createVoiceGateway(opts) {
2085
2208
  const ns = opts.io.of(opts.namespace ?? "/radaros-voice");
@@ -2221,6 +2344,7 @@ function createVoiceGateway(opts) {
2221
2344
  createAgentRouter,
2222
2345
  createBrowserGateway,
2223
2346
  createFileUploadMiddleware,
2347
+ createVisionGateway,
2224
2348
  createVoiceGateway,
2225
2349
  errorHandler,
2226
2350
  generateAgentCard,
package/dist/index.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { Agent, A2AAgentCard, MCPToolProviderConfig, ToolDef, MCPToolProvider, Registry, Servable, Team, Workflow, Toolkit, EventBus, VoiceAgent } from '@radaros/core';
1
+ import { Agent, A2AAgentCard, MCPToolProviderConfig, ToolDef, MCPToolProvider, Registry, Servable, Team, Workflow, Toolkit, EventBus, VisionAgent, VoiceAgent } from '@radaros/core';
2
2
 
3
3
  interface A2AServerOptions {
4
4
  agents: Record<string, Agent>;
@@ -332,6 +332,14 @@ interface GatewayOptions {
332
332
 
333
333
  declare function createAgentGateway(opts: GatewayOptions): void;
334
334
 
335
+ interface VisionGatewayOptions {
336
+ agents: Record<string, VisionAgent>;
337
+ io: any;
338
+ namespace?: string;
339
+ authMiddleware?: (socket: any, next: (err?: Error) => void) => void;
340
+ }
341
+ declare function createVisionGateway(opts: VisionGatewayOptions): void;
342
+
335
343
  interface VoiceGatewayOptions {
336
344
  agents: Record<string, VoiceAgent>;
337
345
  io: any;
@@ -340,4 +348,4 @@ interface VoiceGatewayOptions {
340
348
  }
341
349
  declare function createVoiceGateway(opts: VoiceGatewayOptions): void;
342
350
 
343
- export { type A2AServerOptions, type AdminRouterOptions, type BrowserGatewayOptions, type FileUploadOptions, type GatewayOptions, MCPManager, type MCPServerEntry, type MCPServerSummary, type RouterOptions, type SwaggerOptions, type VoiceGatewayOptions, buildMultiModalInput, createA2AServer, createAdminRouter, createAgentGateway, createAgentRouter, createBrowserGateway, createFileUploadMiddleware, createVoiceGateway, errorHandler, generateAgentCard, generateMultiAgentCard, generateOpenAPISpec, requestLogger };
351
+ export { type A2AServerOptions, type AdminRouterOptions, type BrowserGatewayOptions, type FileUploadOptions, type GatewayOptions, MCPManager, type MCPServerEntry, type MCPServerSummary, type RouterOptions, type SwaggerOptions, type VisionGatewayOptions, type VoiceGatewayOptions, buildMultiModalInput, createA2AServer, createAdminRouter, createAgentGateway, createAgentRouter, createBrowserGateway, createFileUploadMiddleware, createVisionGateway, createVoiceGateway, errorHandler, generateAgentCard, generateMultiAgentCard, generateOpenAPISpec, requestLogger };
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Agent, A2AAgentCard, MCPToolProviderConfig, ToolDef, MCPToolProvider, Registry, Servable, Team, Workflow, Toolkit, EventBus, VoiceAgent } from '@radaros/core';
1
+ import { Agent, A2AAgentCard, MCPToolProviderConfig, ToolDef, MCPToolProvider, Registry, Servable, Team, Workflow, Toolkit, EventBus, VisionAgent, VoiceAgent } from '@radaros/core';
2
2
 
3
3
  interface A2AServerOptions {
4
4
  agents: Record<string, Agent>;
@@ -332,6 +332,14 @@ interface GatewayOptions {
332
332
 
333
333
  declare function createAgentGateway(opts: GatewayOptions): void;
334
334
 
335
+ interface VisionGatewayOptions {
336
+ agents: Record<string, VisionAgent>;
337
+ io: any;
338
+ namespace?: string;
339
+ authMiddleware?: (socket: any, next: (err?: Error) => void) => void;
340
+ }
341
+ declare function createVisionGateway(opts: VisionGatewayOptions): void;
342
+
335
343
  interface VoiceGatewayOptions {
336
344
  agents: Record<string, VoiceAgent>;
337
345
  io: any;
@@ -340,4 +348,4 @@ interface VoiceGatewayOptions {
340
348
  }
341
349
  declare function createVoiceGateway(opts: VoiceGatewayOptions): void;
342
350
 
343
- export { type A2AServerOptions, type AdminRouterOptions, type BrowserGatewayOptions, type FileUploadOptions, type GatewayOptions, MCPManager, type MCPServerEntry, type MCPServerSummary, type RouterOptions, type SwaggerOptions, type VoiceGatewayOptions, buildMultiModalInput, createA2AServer, createAdminRouter, createAgentGateway, createAgentRouter, createBrowserGateway, createFileUploadMiddleware, createVoiceGateway, errorHandler, generateAgentCard, generateMultiAgentCard, generateOpenAPISpec, requestLogger };
351
+ export { type A2AServerOptions, type AdminRouterOptions, type BrowserGatewayOptions, type FileUploadOptions, type GatewayOptions, MCPManager, type MCPServerEntry, type MCPServerSummary, type RouterOptions, type SwaggerOptions, type VisionGatewayOptions, type VoiceGatewayOptions, buildMultiModalInput, createA2AServer, createAdminRouter, createAgentGateway, createAgentRouter, createBrowserGateway, createFileUploadMiddleware, createVisionGateway, createVoiceGateway, errorHandler, generateAgentCard, generateMultiAgentCard, generateOpenAPISpec, requestLogger };
package/dist/index.js CHANGED
@@ -2037,6 +2037,128 @@ function createAgentGateway(opts) {
2037
2037
  });
2038
2038
  }
2039
2039
 
2040
+ // src/socketio/vision-gateway.ts
2041
+ function createVisionGateway(opts) {
2042
+ const ns = opts.io.of(opts.namespace ?? "/radaros-vision");
2043
+ if (opts.authMiddleware) {
2044
+ ns.use(opts.authMiddleware);
2045
+ }
2046
+ const activeSessions = /* @__PURE__ */ new Map();
2047
+ ns.on("connection", (socket) => {
2048
+ socket.on(
2049
+ "vision.start",
2050
+ async (data) => {
2051
+ const agent = opts.agents[data.agentName];
2052
+ if (!agent) {
2053
+ socket.emit("vision.error", { error: `Vision agent "${data.agentName}" not found` });
2054
+ return;
2055
+ }
2056
+ if (activeSessions.has(socket.id)) {
2057
+ socket.emit("vision.error", { error: "A vision session is already active for this connection" });
2058
+ return;
2059
+ }
2060
+ try {
2061
+ const apiKey = data.apiKey ?? socket.handshake?.auth?.apiKey;
2062
+ const userId = data.userId ?? socket.handshake?.auth?.userId;
2063
+ const sessionId = data.sessionId ?? socket.handshake?.auth?.sessionId;
2064
+ const session = await agent.connect({ apiKey, userId, sessionId });
2065
+ activeSessions.set(socket.id, session);
2066
+ session.on("audio", (ev) => {
2067
+ socket.emit("vision.audio", {
2068
+ data: ev.data.toString("base64"),
2069
+ mimeType: ev.mimeType ?? "audio/pcm"
2070
+ });
2071
+ });
2072
+ session.on("transcript", (ev) => {
2073
+ socket.emit("vision.transcript", { text: ev.text, role: ev.role });
2074
+ });
2075
+ session.on("text", (ev) => {
2076
+ socket.emit("vision.text", { text: ev.text });
2077
+ });
2078
+ session.on("tool_call_start", (ev) => {
2079
+ socket.emit("vision.tool.call", { name: ev.name, args: ev.args });
2080
+ });
2081
+ session.on("tool_result", (ev) => {
2082
+ socket.emit("vision.tool.result", { name: ev.name, result: ev.result });
2083
+ });
2084
+ session.on("usage", (ev) => {
2085
+ socket.emit("vision.usage", ev);
2086
+ });
2087
+ session.on("interrupted", () => {
2088
+ socket.emit("vision.interrupted");
2089
+ });
2090
+ session.on("error", (ev) => {
2091
+ socket.emit("vision.error", { error: ev.error.message });
2092
+ });
2093
+ session.on("disconnected", () => {
2094
+ activeSessions.delete(socket.id);
2095
+ socket.emit("vision.stopped");
2096
+ });
2097
+ socket.emit("vision.started", { userId });
2098
+ } catch (error) {
2099
+ socket.emit("vision.error", { error: error.message });
2100
+ }
2101
+ }
2102
+ );
2103
+ socket.on("vision.audio", (data) => {
2104
+ const session = activeSessions.get(socket.id);
2105
+ if (!session) return;
2106
+ if (typeof data?.data !== "string" || data.data.length > 1e6) return;
2107
+ try {
2108
+ session.sendAudio(Buffer.from(data.data, "base64"));
2109
+ } catch {
2110
+ socket.emit("vision.error", { error: "Invalid audio data" });
2111
+ }
2112
+ });
2113
+ socket.on("vision.image", (data) => {
2114
+ const session = activeSessions.get(socket.id);
2115
+ if (!session) return;
2116
+ if (typeof data?.data !== "string" || data.data.length > 5e6) return;
2117
+ try {
2118
+ session.sendImage(Buffer.from(data.data, "base64"), data.mimeType ?? "image/jpeg");
2119
+ } catch {
2120
+ socket.emit("vision.error", { error: "Invalid image data" });
2121
+ }
2122
+ });
2123
+ socket.on("vision.text", (data) => {
2124
+ const session = activeSessions.get(socket.id);
2125
+ if (!session) return;
2126
+ if (typeof data?.text !== "string" || data.text.length > 1e4) return;
2127
+ session.sendText(data.text);
2128
+ });
2129
+ socket.on("vision.interrupt", () => {
2130
+ const session = activeSessions.get(socket.id);
2131
+ if (!session) return;
2132
+ session.interrupt();
2133
+ });
2134
+ socket.on("vision.stop", async () => {
2135
+ const session = activeSessions.get(socket.id);
2136
+ if (!session) return;
2137
+ try {
2138
+ await session.close();
2139
+ } catch (err) {
2140
+ console.warn("[vision-gateway] Error closing session:", err);
2141
+ }
2142
+ activeSessions.delete(socket.id);
2143
+ socket.emit("vision.stopped");
2144
+ });
2145
+ socket.on("disconnect", async () => {
2146
+ const session = activeSessions.get(socket.id);
2147
+ if (session) {
2148
+ try {
2149
+ await session.close();
2150
+ } catch (err) {
2151
+ console.warn(
2152
+ "[radaros/vision-gateway] Error closing session on disconnect:",
2153
+ err instanceof Error ? err.message : err
2154
+ );
2155
+ }
2156
+ activeSessions.delete(socket.id);
2157
+ }
2158
+ });
2159
+ });
2160
+ }
2161
+
2040
2162
  // src/socketio/voice-gateway.ts
2041
2163
  function createVoiceGateway(opts) {
2042
2164
  const ns = opts.io.of(opts.namespace ?? "/radaros-voice");
@@ -2177,6 +2299,7 @@ export {
2177
2299
  createAgentRouter,
2178
2300
  createBrowserGateway,
2179
2301
  createFileUploadMiddleware,
2302
+ createVisionGateway,
2180
2303
  createVoiceGateway,
2181
2304
  errorHandler,
2182
2305
  generateAgentCard,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@radaros/transport",
3
- "version": "0.3.44",
3
+ "version": "0.3.46",
4
4
  "description": "HTTP and WebSocket transport layer for RadarOS agents",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -42,7 +42,7 @@
42
42
  "typescript": "^5.6.0"
43
43
  },
44
44
  "peerDependencies": {
45
- "@radaros/core": "^0.3.44",
45
+ "@radaros/core": "^0.3.46",
46
46
  "@types/express": "^4.0.0 || ^5.0.0",
47
47
  "express": "^4.0.0 || ^5.0.0",
48
48
  "multer": ">=2.0.0",