@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 +124 -0
- package/dist/index.d.cts +10 -2
- package/dist/index.d.ts +10 -2
- package/dist/index.js +123 -0
- package/package.json +2 -2
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.
|
|
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.
|
|
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",
|