@radaros/transport 0.3.6 → 0.3.7

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.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Agent, Team, Workflow, A2AAgentCard } from '@radaros/core';
1
+ import { Agent, Team, Workflow, VoiceAgent, A2AAgentCard } from '@radaros/core';
2
2
 
3
3
  interface FileUploadOptions {
4
4
  maxFileSize?: number;
@@ -79,6 +79,14 @@ interface GatewayOptions {
79
79
 
80
80
  declare function createAgentGateway(opts: GatewayOptions): void;
81
81
 
82
+ interface VoiceGatewayOptions {
83
+ agents: Record<string, VoiceAgent>;
84
+ io: any;
85
+ namespace?: string;
86
+ authMiddleware?: (socket: any, next: (err?: Error) => void) => void;
87
+ }
88
+ declare function createVoiceGateway(opts: VoiceGatewayOptions): void;
89
+
82
90
  interface A2AServerOptions {
83
91
  agents: Record<string, Agent>;
84
92
  basePath?: string;
@@ -113,4 +121,4 @@ declare function generateMultiAgentCard(agents: Record<string, Agent>, serverUrl
113
121
  url?: string;
114
122
  }, version?: string): A2AAgentCard;
115
123
 
116
- export { type A2AServerOptions, type FileUploadOptions, type GatewayOptions, type RouterOptions, type SwaggerOptions, buildMultiModalInput, createA2AServer, createAgentGateway, createAgentRouter, createFileUploadMiddleware, errorHandler, generateAgentCard, generateMultiAgentCard, generateOpenAPISpec, requestLogger };
124
+ export { type A2AServerOptions, type FileUploadOptions, type GatewayOptions, type RouterOptions, type SwaggerOptions, type VoiceGatewayOptions, buildMultiModalInput, createA2AServer, createAgentGateway, createAgentRouter, createFileUploadMiddleware, createVoiceGateway, errorHandler, generateAgentCard, generateMultiAgentCard, generateOpenAPISpec, requestLogger };
package/dist/index.js CHANGED
@@ -767,6 +767,124 @@ function createAgentGateway(opts) {
767
767
  });
768
768
  }
769
769
 
770
+ // src/socketio/voice-gateway.ts
771
+ function createVoiceGateway(opts) {
772
+ const ns = opts.io.of(opts.namespace ?? "/radaros-voice");
773
+ if (opts.authMiddleware) {
774
+ ns.use(opts.authMiddleware);
775
+ }
776
+ const activeSessions = /* @__PURE__ */ new Map();
777
+ ns.on("connection", (socket) => {
778
+ socket.on(
779
+ "voice.start",
780
+ async (data) => {
781
+ const agent = opts.agents[data.agentName];
782
+ if (!agent) {
783
+ socket.emit("voice.error", {
784
+ error: `Voice agent "${data.agentName}" not found`
785
+ });
786
+ return;
787
+ }
788
+ if (activeSessions.has(socket.id)) {
789
+ socket.emit("voice.error", {
790
+ error: "A voice session is already active for this connection"
791
+ });
792
+ return;
793
+ }
794
+ try {
795
+ const apiKey = data.apiKey ?? socket.handshake?.auth?.apiKey;
796
+ const userId = data.userId ?? socket.handshake?.auth?.userId;
797
+ const sessionId = data.sessionId ?? socket.handshake?.auth?.sessionId;
798
+ const session = await agent.connect({
799
+ apiKey,
800
+ userId,
801
+ sessionId
802
+ });
803
+ activeSessions.set(socket.id, session);
804
+ session.on("audio", (ev) => {
805
+ socket.emit("voice.audio", {
806
+ data: ev.data.toString("base64"),
807
+ mimeType: ev.mimeType ?? "audio/pcm"
808
+ });
809
+ });
810
+ session.on("transcript", (ev) => {
811
+ socket.emit("voice.transcript", {
812
+ text: ev.text,
813
+ role: ev.role
814
+ });
815
+ });
816
+ session.on("text", (ev) => {
817
+ socket.emit("voice.text", { text: ev.text });
818
+ });
819
+ session.on(
820
+ "tool_call_start",
821
+ (ev) => {
822
+ socket.emit("voice.tool.call", {
823
+ name: ev.name,
824
+ args: ev.args
825
+ });
826
+ }
827
+ );
828
+ session.on(
829
+ "tool_result",
830
+ (ev) => {
831
+ socket.emit("voice.tool.result", {
832
+ name: ev.name,
833
+ result: ev.result
834
+ });
835
+ }
836
+ );
837
+ session.on("interrupted", () => {
838
+ socket.emit("voice.interrupted");
839
+ });
840
+ session.on("error", (ev) => {
841
+ socket.emit("voice.error", { error: ev.error.message });
842
+ });
843
+ session.on("disconnected", () => {
844
+ activeSessions.delete(socket.id);
845
+ socket.emit("voice.stopped");
846
+ });
847
+ socket.emit("voice.started", { userId });
848
+ } catch (error) {
849
+ socket.emit("voice.error", { error: error.message });
850
+ }
851
+ }
852
+ );
853
+ socket.on("voice.audio", (data) => {
854
+ const session = activeSessions.get(socket.id);
855
+ if (!session) return;
856
+ session.sendAudio(Buffer.from(data.data, "base64"));
857
+ });
858
+ socket.on("voice.text", (data) => {
859
+ const session = activeSessions.get(socket.id);
860
+ if (!session) return;
861
+ session.sendText(data.text);
862
+ });
863
+ socket.on("voice.interrupt", () => {
864
+ const session = activeSessions.get(socket.id);
865
+ if (!session) return;
866
+ session.interrupt();
867
+ });
868
+ socket.on("voice.stop", async () => {
869
+ const session = activeSessions.get(socket.id);
870
+ if (!session) return;
871
+ await session.close();
872
+ activeSessions.delete(socket.id);
873
+ socket.emit("voice.stopped");
874
+ });
875
+ socket.on("disconnect", async () => {
876
+ const session = activeSessions.get(socket.id);
877
+ if (session) {
878
+ try {
879
+ await session.close();
880
+ } catch {
881
+ }
882
+ activeSessions.delete(socket.id);
883
+ }
884
+ });
885
+ });
886
+ }
887
+
770
888
  // src/a2a/a2a-server.ts
771
889
  import { createRequire as createRequire4 } from "module";
772
890
  import { randomUUID } from "crypto";
@@ -1119,6 +1237,7 @@ export {
1119
1237
  createAgentGateway,
1120
1238
  createAgentRouter,
1121
1239
  createFileUploadMiddleware,
1240
+ createVoiceGateway,
1122
1241
  errorHandler,
1123
1242
  generateAgentCard,
1124
1243
  generateMultiAgentCard,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@radaros/transport",
3
- "version": "0.3.6",
3
+ "version": "0.3.7",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -24,7 +24,7 @@
24
24
  "typescript": "^5.6.0"
25
25
  },
26
26
  "peerDependencies": {
27
- "@radaros/core": "^0.3.6",
27
+ "@radaros/core": "^0.3.7",
28
28
  "@types/express": "^4.0.0 || ^5.0.0",
29
29
  "express": "^4.0.0 || ^5.0.0",
30
30
  "multer": ">=1.4.0",