@agenticros/core 0.5.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.
Files changed (151) hide show
  1. package/LICENSE +192 -0
  2. package/README.md +88 -0
  3. package/dist/banner.d.ts +7 -0
  4. package/dist/banner.d.ts.map +1 -0
  5. package/dist/banner.js +25 -0
  6. package/dist/banner.js.map +1 -0
  7. package/dist/capabilities.d.ts +101 -0
  8. package/dist/capabilities.d.ts.map +1 -0
  9. package/dist/capabilities.js +240 -0
  10. package/dist/capabilities.js.map +1 -0
  11. package/dist/cmd-vel-twist.d.ts +9 -0
  12. package/dist/cmd-vel-twist.d.ts.map +1 -0
  13. package/dist/cmd-vel-twist.js +32 -0
  14. package/dist/cmd-vel-twist.js.map +1 -0
  15. package/dist/config.d.ts +1195 -0
  16. package/dist/config.d.ts.map +1 -0
  17. package/dist/config.js +427 -0
  18. package/dist/config.js.map +1 -0
  19. package/dist/discovery.d.ts +113 -0
  20. package/dist/discovery.d.ts.map +1 -0
  21. package/dist/discovery.js +141 -0
  22. package/dist/discovery.js.map +1 -0
  23. package/dist/find-robots-for.d.ts +85 -0
  24. package/dist/find-robots-for.d.ts.map +1 -0
  25. package/dist/find-robots-for.js +120 -0
  26. package/dist/find-robots-for.js.map +1 -0
  27. package/dist/index.d.ts +32 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +20 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/memory/factory.d.ts +18 -0
  32. package/dist/memory/factory.d.ts.map +1 -0
  33. package/dist/memory/factory.js +51 -0
  34. package/dist/memory/factory.js.map +1 -0
  35. package/dist/memory/index.d.ts +3 -0
  36. package/dist/memory/index.d.ts.map +1 -0
  37. package/dist/memory/index.js +2 -0
  38. package/dist/memory/index.js.map +1 -0
  39. package/dist/memory/local/provider.d.ts +29 -0
  40. package/dist/memory/local/provider.d.ts.map +1 -0
  41. package/dist/memory/local/provider.js +202 -0
  42. package/dist/memory/local/provider.js.map +1 -0
  43. package/dist/memory/mem0/provider.d.ts +66 -0
  44. package/dist/memory/mem0/provider.d.ts.map +1 -0
  45. package/dist/memory/mem0/provider.js +310 -0
  46. package/dist/memory/mem0/provider.js.map +1 -0
  47. package/dist/memory/types.d.ts +91 -0
  48. package/dist/memory/types.d.ts.map +1 -0
  49. package/dist/memory/types.js +10 -0
  50. package/dist/memory/types.js.map +1 -0
  51. package/dist/mission-registry.d.ts +94 -0
  52. package/dist/mission-registry.d.ts.map +1 -0
  53. package/dist/mission-registry.js +123 -0
  54. package/dist/mission-registry.js.map +1 -0
  55. package/dist/mission-transcript-sink.d.ts +33 -0
  56. package/dist/mission-transcript-sink.d.ts.map +1 -0
  57. package/dist/mission-transcript-sink.js +76 -0
  58. package/dist/mission-transcript-sink.js.map +1 -0
  59. package/dist/mission.d.ts +281 -0
  60. package/dist/mission.d.ts.map +1 -0
  61. package/dist/mission.js +331 -0
  62. package/dist/mission.js.map +1 -0
  63. package/dist/planner/index.d.ts +84 -0
  64. package/dist/planner/index.d.ts.map +1 -0
  65. package/dist/planner/index.js +486 -0
  66. package/dist/planner/index.js.map +1 -0
  67. package/dist/robots.d.ts +133 -0
  68. package/dist/robots.d.ts.map +1 -0
  69. package/dist/robots.js +220 -0
  70. package/dist/robots.js.map +1 -0
  71. package/dist/topic-utils.d.ts +47 -0
  72. package/dist/topic-utils.d.ts.map +1 -0
  73. package/dist/topic-utils.js +136 -0
  74. package/dist/topic-utils.js.map +1 -0
  75. package/dist/transport/factory.d.ts +10 -0
  76. package/dist/transport/factory.d.ts.map +1 -0
  77. package/dist/transport/factory.js +40 -0
  78. package/dist/transport/factory.js.map +1 -0
  79. package/dist/transport/local/conversion.d.ts +30 -0
  80. package/dist/transport/local/conversion.d.ts.map +1 -0
  81. package/dist/transport/local/conversion.js +340 -0
  82. package/dist/transport/local/conversion.js.map +1 -0
  83. package/dist/transport/local/entities.d.ts +34 -0
  84. package/dist/transport/local/entities.d.ts.map +1 -0
  85. package/dist/transport/local/entities.js +108 -0
  86. package/dist/transport/local/entities.js.map +1 -0
  87. package/dist/transport/local/transport.d.ts +53 -0
  88. package/dist/transport/local/transport.d.ts.map +1 -0
  89. package/dist/transport/local/transport.js +344 -0
  90. package/dist/transport/local/transport.js.map +1 -0
  91. package/dist/transport/rosbridge/actions.d.ts +30 -0
  92. package/dist/transport/rosbridge/actions.d.ts.map +1 -0
  93. package/dist/transport/rosbridge/actions.js +61 -0
  94. package/dist/transport/rosbridge/actions.js.map +1 -0
  95. package/dist/transport/rosbridge/adapter.d.ts +29 -0
  96. package/dist/transport/rosbridge/adapter.d.ts.map +1 -0
  97. package/dist/transport/rosbridge/adapter.js +108 -0
  98. package/dist/transport/rosbridge/adapter.js.map +1 -0
  99. package/dist/transport/rosbridge/client.d.ts +55 -0
  100. package/dist/transport/rosbridge/client.d.ts.map +1 -0
  101. package/dist/transport/rosbridge/client.js +375 -0
  102. package/dist/transport/rosbridge/client.js.map +1 -0
  103. package/dist/transport/rosbridge/services.d.ts +14 -0
  104. package/dist/transport/rosbridge/services.d.ts.map +1 -0
  105. package/dist/transport/rosbridge/services.js +25 -0
  106. package/dist/transport/rosbridge/services.js.map +1 -0
  107. package/dist/transport/rosbridge/topics.d.ts +28 -0
  108. package/dist/transport/rosbridge/topics.d.ts.map +1 -0
  109. package/dist/transport/rosbridge/topics.js +59 -0
  110. package/dist/transport/rosbridge/topics.js.map +1 -0
  111. package/dist/transport/rosbridge/types.d.ts +87 -0
  112. package/dist/transport/rosbridge/types.d.ts.map +1 -0
  113. package/dist/transport/rosbridge/types.js +6 -0
  114. package/dist/transport/rosbridge/types.js.map +1 -0
  115. package/dist/transport/transport.d.ts +39 -0
  116. package/dist/transport/transport.d.ts.map +1 -0
  117. package/dist/transport/transport.js +2 -0
  118. package/dist/transport/transport.js.map +1 -0
  119. package/dist/transport/types.d.ts +100 -0
  120. package/dist/transport/types.d.ts.map +1 -0
  121. package/dist/transport/types.js +5 -0
  122. package/dist/transport/types.js.map +1 -0
  123. package/dist/transport/webrtc/signaling-client.d.ts +38 -0
  124. package/dist/transport/webrtc/signaling-client.d.ts.map +1 -0
  125. package/dist/transport/webrtc/signaling-client.js +161 -0
  126. package/dist/transport/webrtc/signaling-client.js.map +1 -0
  127. package/dist/transport/webrtc/signaling-types.d.ts +112 -0
  128. package/dist/transport/webrtc/signaling-types.d.ts.map +1 -0
  129. package/dist/transport/webrtc/signaling-types.js +8 -0
  130. package/dist/transport/webrtc/signaling-types.js.map +1 -0
  131. package/dist/transport/webrtc/transport.d.ts +67 -0
  132. package/dist/transport/webrtc/transport.d.ts.map +1 -0
  133. package/dist/transport/webrtc/transport.js +406 -0
  134. package/dist/transport/webrtc/transport.js.map +1 -0
  135. package/dist/transport/zenoh/adapter.d.ts +47 -0
  136. package/dist/transport/zenoh/adapter.d.ts.map +1 -0
  137. package/dist/transport/zenoh/adapter.js +296 -0
  138. package/dist/transport/zenoh/adapter.js.map +1 -0
  139. package/dist/transport/zenoh/cdr.d.ts +17 -0
  140. package/dist/transport/zenoh/cdr.d.ts.map +1 -0
  141. package/dist/transport/zenoh/cdr.js +170 -0
  142. package/dist/transport/zenoh/cdr.js.map +1 -0
  143. package/dist/transport/zenoh/keys.d.ts +21 -0
  144. package/dist/transport/zenoh/keys.d.ts.map +1 -0
  145. package/dist/transport/zenoh/keys.js +44 -0
  146. package/dist/transport/zenoh/keys.js.map +1 -0
  147. package/dist/transport-pool.d.ts +74 -0
  148. package/dist/transport-pool.d.ts.map +1 -0
  149. package/dist/transport-pool.js +135 -0
  150. package/dist/transport-pool.js.map +1 -0
  151. package/package.json +80 -0
@@ -0,0 +1,67 @@
1
+ import type { RosTransport } from "../transport.js";
2
+ import type { ConnectionStatus, ConnectionHandler, Subscription, PublishOptions, SubscribeOptions, ServiceCallOptions, ServiceCallResult, ActionGoalOptions, ActionResult, TopicInfo, ServiceInfo, ActionInfo, MessageHandler, RTCIceServerConfig } from "../types.js";
3
+ export interface WebRTCTransportOptions {
4
+ /** WebSocket URL of the signaling server (e.g., wss://signal-host). */
5
+ signalingUrl: string;
6
+ /** REST API URL of the signaling server (e.g., https://signal-host). */
7
+ apiUrl: string;
8
+ /** Target robot's ID on the signaling server. */
9
+ robotId: string;
10
+ /** Robot key secret — validated by the robot, not the signaling server. */
11
+ robotKey: string;
12
+ /** STUN/TURN server configuration. */
13
+ iceServers?: RTCIceServerConfig[];
14
+ }
15
+ /**
16
+ * Mode C transport: WebRTC data channel for cloud/remote deployments.
17
+ *
18
+ * The frontend (this class) acts as the answering peer:
19
+ * 1. POST /api/robots/{robotId}/connect → get session_id, room_id
20
+ * 2. Open signaling WebSocket → JOIN_ROOM
21
+ * 3. Wait for robot's SDP offer
22
+ * 4. Create RTCPeerConnection, set remote description, create answer
23
+ * 5. Exchange ICE candidates
24
+ * 6. Data channel opens → rosbridge JSON over WebRTC
25
+ */
26
+ export declare class WebRTCTransport implements RosTransport {
27
+ private options;
28
+ private signaling;
29
+ private pc;
30
+ private dataChannel;
31
+ private status;
32
+ private connectionHandlers;
33
+ private topicHandlers;
34
+ private pendingRequests;
35
+ private idCounter;
36
+ private sessionId;
37
+ private roomId;
38
+ private peerId;
39
+ private robotPeerId;
40
+ constructor(options: WebRTCTransportOptions);
41
+ connect(): Promise<void>;
42
+ disconnect(): Promise<void>;
43
+ getStatus(): ConnectionStatus;
44
+ onConnection(handler: ConnectionHandler): () => void;
45
+ publish(options: PublishOptions): void;
46
+ subscribe(options: SubscribeOptions, handler: MessageHandler): Subscription;
47
+ callService(options: ServiceCallOptions): Promise<ServiceCallResult>;
48
+ sendActionGoal(options: ActionGoalOptions): Promise<ActionResult>;
49
+ cancelActionGoal(action: string): Promise<void>;
50
+ listTopics(): Promise<TopicInfo[]>;
51
+ listServices(): Promise<ServiceInfo[]>;
52
+ listActions(): Promise<ActionInfo[]>;
53
+ private nextId;
54
+ private setStatus;
55
+ private sendOverDataChannel;
56
+ private registerPending;
57
+ private resolvePending;
58
+ /** Handle incoming rosbridge JSON from the data channel. */
59
+ private handleDataChannelMessage;
60
+ /** Handle signaling messages during connection setup. */
61
+ private handleSignalingMessage;
62
+ /** Handle SDP offer from the robot and create an answer. */
63
+ private handleOffer;
64
+ private cleanup;
65
+ private rejectAllPending;
66
+ }
67
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../../src/transport/webrtc/transport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EACV,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACZ,SAAS,EACT,WAAW,EACX,UAAU,EACV,cAAc,EACd,kBAAkB,EACnB,MAAM,aAAa,CAAC;AASrB,MAAM,WAAW,sBAAsB;IACrC,uEAAuE;IACvE,YAAY,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,MAAM,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,2EAA2E;IAC3E,QAAQ,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,UAAU,CAAC,EAAE,kBAAkB,EAAE,CAAC;CACnC;AASD;;;;;;;;;;GAUG;AACH,qBAAa,eAAgB,YAAW,YAAY;IAClD,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,EAAE,CAA+B;IACzC,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,MAAM,CAAoC;IAClD,OAAO,CAAC,kBAAkB,CAAgC;IAC1D,OAAO,CAAC,aAAa,CAA0C;IAC/D,OAAO,CAAC,eAAe,CAAqC;IAC5D,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,WAAW,CAAuB;gBAE9B,OAAO,EAAE,sBAAsB;IAKrC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA2CxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBjC,SAAS,IAAI,gBAAgB;IAI7B,YAAY,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,IAAI;IAOpD,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAStC,SAAS,CAAC,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,cAAc,GAAG,YAAY;IAiCrE,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAqBpE,cAAc,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,CAAC;IAuCjE,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ/C,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAWlC,YAAY,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAWtC,WAAW,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAsB1C,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,cAAc;IAStB,4DAA4D;IAC5D,OAAO,CAAC,wBAAwB;IAmDhC,yDAAyD;IACzD,OAAO,CAAC,sBAAsB;IAqC9B,4DAA4D;IAC5D,OAAO,CAAC,WAAW;IA6DnB,OAAO,CAAC,OAAO;IAcf,OAAO,CAAC,gBAAgB;CAOzB"}
@@ -0,0 +1,406 @@
1
+ import { PeerConnection, DescriptionType } from "node-datachannel";
2
+ import { SignalingClient } from "./signaling-client.js";
3
+ /**
4
+ * Mode C transport: WebRTC data channel for cloud/remote deployments.
5
+ *
6
+ * The frontend (this class) acts as the answering peer:
7
+ * 1. POST /api/robots/{robotId}/connect → get session_id, room_id
8
+ * 2. Open signaling WebSocket → JOIN_ROOM
9
+ * 3. Wait for robot's SDP offer
10
+ * 4. Create RTCPeerConnection, set remote description, create answer
11
+ * 5. Exchange ICE candidates
12
+ * 6. Data channel opens → rosbridge JSON over WebRTC
13
+ */
14
+ export class WebRTCTransport {
15
+ options;
16
+ signaling;
17
+ pc = null;
18
+ dataChannel = null;
19
+ status = "disconnected";
20
+ connectionHandlers = new Set();
21
+ topicHandlers = new Map();
22
+ pendingRequests = new Map();
23
+ idCounter = 0;
24
+ sessionId = null;
25
+ roomId = null;
26
+ peerId = null;
27
+ robotPeerId = null;
28
+ constructor(options) {
29
+ this.options = options;
30
+ this.signaling = new SignalingClient(options.apiUrl, options.signalingUrl);
31
+ }
32
+ async connect() {
33
+ if (this.status === "connected")
34
+ return;
35
+ this.setStatus("connecting");
36
+ try {
37
+ // Step 1: Request connection via REST API
38
+ const userId = `frontend_${Date.now()}`;
39
+ const connectRes = await this.signaling.requestConnection(this.options.robotId, {
40
+ user_id: userId,
41
+ robot_id: this.options.robotId,
42
+ robot_key: this.options.robotKey,
43
+ });
44
+ this.sessionId = connectRes.session.session_id;
45
+ this.roomId = connectRes.room_id;
46
+ this.peerId = userId;
47
+ // Step 2: Connect signaling WebSocket
48
+ await this.signaling.connectWs();
49
+ // Step 3: Set up message handler before joining room
50
+ const connected = new Promise((resolve, reject) => {
51
+ const timeout = setTimeout(() => {
52
+ reject(new Error("WebRTC connection timed out (30s)"));
53
+ }, 30_000);
54
+ this.signaling.onMessage((msg) => {
55
+ this.handleSignalingMessage(msg, resolve, reject, timeout);
56
+ });
57
+ });
58
+ // Step 4: Join room
59
+ this.signaling.joinRoom(this.roomId, userId, "frontend", this.sessionId);
60
+ // Step 5: Wait for data channel to be established
61
+ await connected;
62
+ this.setStatus("connected");
63
+ }
64
+ catch (err) {
65
+ this.setStatus("disconnected");
66
+ this.cleanup();
67
+ throw err;
68
+ }
69
+ }
70
+ async disconnect() {
71
+ this.cleanup();
72
+ // Notify signaling server
73
+ if (this.sessionId) {
74
+ try {
75
+ await this.signaling.requestDisconnect(this.options.robotId);
76
+ }
77
+ catch {
78
+ // Best-effort disconnect notification
79
+ }
80
+ this.sessionId = null;
81
+ }
82
+ this.signaling.close();
83
+ this.setStatus("disconnected");
84
+ }
85
+ getStatus() {
86
+ return this.status;
87
+ }
88
+ onConnection(handler) {
89
+ this.connectionHandlers.add(handler);
90
+ return () => {
91
+ this.connectionHandlers.delete(handler);
92
+ };
93
+ }
94
+ publish(options) {
95
+ this.sendOverDataChannel({
96
+ op: "publish",
97
+ topic: options.topic,
98
+ type: options.type,
99
+ msg: options.msg,
100
+ });
101
+ }
102
+ subscribe(options, handler) {
103
+ const topic = options.topic;
104
+ if (!this.topicHandlers.has(topic)) {
105
+ this.topicHandlers.set(topic, new Set());
106
+ }
107
+ this.topicHandlers.get(topic).add(handler);
108
+ // Send rosbridge subscribe command
109
+ this.sendOverDataChannel({
110
+ op: "subscribe",
111
+ id: this.nextId("sub"),
112
+ topic,
113
+ type: options.type,
114
+ throttle_rate: options.throttleRate,
115
+ queue_length: options.queueLength,
116
+ });
117
+ return {
118
+ unsubscribe: () => {
119
+ this.topicHandlers.get(topic)?.delete(handler);
120
+ if (this.topicHandlers.get(topic)?.size === 0) {
121
+ this.topicHandlers.delete(topic);
122
+ try {
123
+ this.sendOverDataChannel({ op: "unsubscribe", topic });
124
+ }
125
+ catch {
126
+ // Already disconnected
127
+ }
128
+ }
129
+ },
130
+ };
131
+ }
132
+ async callService(options) {
133
+ const id = this.nextId("service");
134
+ const response = await new Promise((resolve, reject) => {
135
+ this.registerPending(id, (v) => resolve(v), reject, 30_000);
136
+ this.sendOverDataChannel({
137
+ op: "call_service",
138
+ id,
139
+ service: options.service,
140
+ args: options.args,
141
+ type: options.type,
142
+ });
143
+ });
144
+ return {
145
+ result: response.result,
146
+ values: response.values,
147
+ };
148
+ }
149
+ async sendActionGoal(options) {
150
+ const id = this.nextId("action");
151
+ // Register feedback handler if provided
152
+ let feedbackKey = null;
153
+ if (options.onFeedback) {
154
+ feedbackKey = `__action_feedback__${id}`;
155
+ if (!this.topicHandlers.has(feedbackKey)) {
156
+ this.topicHandlers.set(feedbackKey, new Set());
157
+ }
158
+ this.topicHandlers.get(feedbackKey).add((msg) => {
159
+ options.onFeedback(msg.values);
160
+ });
161
+ }
162
+ try {
163
+ const response = await new Promise((resolve, reject) => {
164
+ this.registerPending(id, (v) => resolve(v), reject, 120_000);
165
+ this.sendOverDataChannel({
166
+ op: "send_action_goal",
167
+ id,
168
+ action: options.action,
169
+ action_type: options.actionType,
170
+ args: options.args,
171
+ });
172
+ });
173
+ return {
174
+ result: response.result,
175
+ values: response.values,
176
+ };
177
+ }
178
+ finally {
179
+ if (feedbackKey) {
180
+ this.topicHandlers.delete(feedbackKey);
181
+ }
182
+ }
183
+ }
184
+ async cancelActionGoal(action) {
185
+ this.sendOverDataChannel({
186
+ op: "cancel_action_goal",
187
+ id: this.nextId("cancel"),
188
+ action,
189
+ });
190
+ }
191
+ async listTopics() {
192
+ const result = await this.callService({
193
+ service: "/rosapi/topics",
194
+ type: "rosapi/srv/Topics",
195
+ args: {},
196
+ });
197
+ const topics = result.values?.["topics"] ?? [];
198
+ const types = result.values?.["types"] ?? [];
199
+ return topics.map((name, i) => ({ name, type: types[i] ?? "" }));
200
+ }
201
+ async listServices() {
202
+ const result = await this.callService({
203
+ service: "/rosapi/services",
204
+ type: "rosapi/srv/Services",
205
+ args: {},
206
+ });
207
+ const services = result.values?.["services"] ?? [];
208
+ const types = result.values?.["types"] ?? [];
209
+ return services.map((name, i) => ({ name, type: types[i] ?? "" }));
210
+ }
211
+ async listActions() {
212
+ // Same heuristic as RosbridgeTransport — extract from feedback topics
213
+ const topics = await this.listTopics();
214
+ const actions = [];
215
+ const feedbackSuffix = "/_action/feedback";
216
+ for (const topic of topics) {
217
+ if (topic.name.endsWith(feedbackSuffix)) {
218
+ const actionName = topic.name.slice(0, -feedbackSuffix.length);
219
+ let actionType = topic.type;
220
+ if (actionType.endsWith("_FeedbackMessage")) {
221
+ actionType = actionType.slice(0, -"_FeedbackMessage".length);
222
+ }
223
+ actions.push({ name: actionName, type: actionType });
224
+ }
225
+ }
226
+ return actions;
227
+ }
228
+ // --- Private helpers ---
229
+ nextId(prefix = "agenticros") {
230
+ return `${prefix}_${++this.idCounter}`;
231
+ }
232
+ setStatus(status) {
233
+ this.status = status;
234
+ for (const handler of this.connectionHandlers) {
235
+ handler(status);
236
+ }
237
+ }
238
+ sendOverDataChannel(msg) {
239
+ if (!this.dataChannel) {
240
+ throw new Error("Data channel is not open");
241
+ }
242
+ this.dataChannel.sendMessage(JSON.stringify(msg));
243
+ }
244
+ registerPending(id, resolve, reject, timeoutMs) {
245
+ const timer = setTimeout(() => {
246
+ this.pendingRequests.delete(id);
247
+ reject(new Error(`Request ${id} timed out after ${timeoutMs}ms`));
248
+ }, timeoutMs);
249
+ this.pendingRequests.set(id, { resolve, reject, timer });
250
+ }
251
+ resolvePending(id, result) {
252
+ const pending = this.pendingRequests.get(id);
253
+ if (pending) {
254
+ clearTimeout(pending.timer);
255
+ this.pendingRequests.delete(id);
256
+ pending.resolve(result);
257
+ }
258
+ }
259
+ /** Handle incoming rosbridge JSON from the data channel. */
260
+ handleDataChannelMessage(data) {
261
+ let msg;
262
+ try {
263
+ msg = JSON.parse(data);
264
+ }
265
+ catch {
266
+ return;
267
+ }
268
+ const op = msg.op;
269
+ if (!op)
270
+ return;
271
+ switch (op) {
272
+ case "publish": {
273
+ const topic = msg.topic;
274
+ const payload = msg.msg;
275
+ const handlers = this.topicHandlers.get(topic);
276
+ if (handlers) {
277
+ for (const handler of handlers) {
278
+ handler(payload);
279
+ }
280
+ }
281
+ break;
282
+ }
283
+ case "service_response": {
284
+ const id = msg.id;
285
+ if (id)
286
+ this.resolvePending(id, msg);
287
+ break;
288
+ }
289
+ case "action_result": {
290
+ const id = msg.id;
291
+ if (id)
292
+ this.resolvePending(id, msg);
293
+ break;
294
+ }
295
+ case "action_feedback": {
296
+ const id = msg.id;
297
+ if (id) {
298
+ const handlers = this.topicHandlers.get(`__action_feedback__${id}`);
299
+ if (handlers) {
300
+ for (const handler of handlers) {
301
+ handler(msg);
302
+ }
303
+ }
304
+ }
305
+ break;
306
+ }
307
+ }
308
+ }
309
+ /** Handle signaling messages during connection setup. */
310
+ handleSignalingMessage(msg, onConnected, onError, timeout) {
311
+ switch (msg.type) {
312
+ case "peer_joined": {
313
+ const peerMsg = msg;
314
+ if (peerMsg.peer_type === "robot") {
315
+ this.robotPeerId = peerMsg.peer_id;
316
+ }
317
+ break;
318
+ }
319
+ case "offer": {
320
+ const offerMsg = msg;
321
+ this.handleOffer(offerMsg, onConnected, onError, timeout);
322
+ break;
323
+ }
324
+ case "ice_candidate": {
325
+ const iceMsg = msg;
326
+ if (this.pc) {
327
+ this.pc.addRemoteCandidate(iceMsg.data.candidate, iceMsg.data.sdpMid ?? "0");
328
+ }
329
+ break;
330
+ }
331
+ case "error": {
332
+ clearTimeout(timeout);
333
+ onError(new Error(`Signaling error: ${msg.message}`));
334
+ break;
335
+ }
336
+ }
337
+ }
338
+ /** Handle SDP offer from the robot and create an answer. */
339
+ handleOffer(offer, onConnected, onError, timeout) {
340
+ // Build ICE server strings for node-datachannel
341
+ const iceServers = this.options.iceServers ?? [{ urls: "stun:stun.l.google.com:19302" }];
342
+ const iceServerStrs = iceServers.map((s) => {
343
+ const urls = Array.isArray(s.urls) ? s.urls : [s.urls];
344
+ return urls[0]; // node-datachannel takes individual server strings
345
+ });
346
+ const rtcConfig = { iceServers: iceServerStrs };
347
+ this.pc = new PeerConnection("agenticros-frontend", rtcConfig);
348
+ // Handle ICE candidates from our side → send to robot
349
+ this.pc.onLocalCandidate((candidate, mid) => {
350
+ this.signaling.sendIceCandidate(candidate, mid, null, this.robotPeerId ?? undefined);
351
+ });
352
+ // Handle state changes
353
+ this.pc.onStateChange((state) => {
354
+ if (state === "failed" || state === "closed") {
355
+ this.setStatus("disconnected");
356
+ this.rejectAllPending(new Error("Peer connection closed"));
357
+ }
358
+ });
359
+ // Handle incoming data channel
360
+ this.pc.onDataChannel((dc) => {
361
+ this.dataChannel = dc;
362
+ dc.onOpen(() => {
363
+ clearTimeout(timeout);
364
+ onConnected();
365
+ });
366
+ dc.onMessage((data) => {
367
+ const str = typeof data === "string" ? data : data.toString("utf-8");
368
+ this.handleDataChannelMessage(str);
369
+ });
370
+ dc.onClosed(() => {
371
+ this.dataChannel = null;
372
+ this.setStatus("disconnected");
373
+ this.rejectAllPending(new Error("Data channel closed"));
374
+ });
375
+ });
376
+ // Set remote offer and create answer
377
+ this.pc.setRemoteDescription(offer.data.sdp, DescriptionType.Offer);
378
+ const answer = this.pc.localDescription();
379
+ if (answer) {
380
+ this.signaling.sendAnswer(answer.sdp, this.roomId, this.peerId, this.robotPeerId ?? undefined);
381
+ }
382
+ else {
383
+ clearTimeout(timeout);
384
+ onError(new Error("Failed to create SDP answer"));
385
+ }
386
+ }
387
+ cleanup() {
388
+ this.rejectAllPending(new Error("Transport disconnected"));
389
+ if (this.dataChannel) {
390
+ this.dataChannel.close();
391
+ this.dataChannel = null;
392
+ }
393
+ if (this.pc) {
394
+ this.pc.close();
395
+ this.pc = null;
396
+ }
397
+ }
398
+ rejectAllPending(error) {
399
+ for (const [, pending] of this.pendingRequests) {
400
+ clearTimeout(pending.timer);
401
+ pending.reject(error);
402
+ }
403
+ this.pendingRequests.clear();
404
+ }
405
+ }
406
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../src/transport/webrtc/transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import type { RosTransport } from "../transport.js";
2
+ import type { ConnectionStatus, ConnectionHandler, Subscription, PublishOptions, SubscribeOptions, ServiceCallOptions, ServiceCallResult, ActionGoalOptions, ActionResult, TopicInfo, ServiceInfo, ActionInfo, MessageHandler } from "../types.js";
3
+ import { type ZenohKeyFormat } from "./keys.js";
4
+ export interface ZenohAdapterConfig {
5
+ routerEndpoint: string;
6
+ domainId?: number;
7
+ /** "ros2dds" for zenoh-bridge-ros2dds, "rmw_zenoh" for ROS2 with Zenoh RMW */
8
+ keyFormat?: ZenohKeyFormat;
9
+ /** When ros2dds bridge uses a non-"/" namespace, set to the same value (e.g. "/bot1"). */
10
+ bridgeNamespace?: string;
11
+ }
12
+ /**
13
+ * Zenoh transport adapter (Mode D).
14
+ * Connects to a Zenoh router via zenoh-ts (WebSocket to zenoh-plugin-remote-api).
15
+ * Uses rmw_zenoh key mapping and CDR payloads for ROS 2 compatibility.
16
+ */
17
+ export declare class ZenohTransport implements RosTransport {
18
+ private config;
19
+ private session;
20
+ private status;
21
+ private connectionHandlers;
22
+ private subscribers;
23
+ /** Serialize Session.open/close so two connect()s never open parallel WebSockets to remote-api. */
24
+ private sessionOpQueue;
25
+ /** Serialize listTopics so overlapping tool calls do not undeclare each other's subscribers. */
26
+ private listTopicsOpQueue;
27
+ constructor(config: ZenohAdapterConfig);
28
+ private setStatus;
29
+ private domainId;
30
+ private keyFormat;
31
+ private key;
32
+ private enqueueSessionOp;
33
+ connect(): Promise<void>;
34
+ disconnect(): Promise<void>;
35
+ getStatus(): ConnectionStatus;
36
+ onConnection(handler: ConnectionHandler): () => void;
37
+ publish(options: PublishOptions): Promise<void>;
38
+ subscribe(options: SubscribeOptions, handler: MessageHandler): Subscription;
39
+ subscribeAsync(options: SubscribeOptions, handler: MessageHandler): Promise<Subscription>;
40
+ callService(_options: ServiceCallOptions): Promise<ServiceCallResult>;
41
+ sendActionGoal(_options: ActionGoalOptions): Promise<ActionResult>;
42
+ cancelActionGoal(_action: string): Promise<void>;
43
+ listTopics(): Promise<TopicInfo[]>;
44
+ listServices(): Promise<ServiceInfo[]>;
45
+ listActions(): Promise<ActionInfo[]>;
46
+ }
47
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/transport/zenoh/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EACV,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACZ,SAAS,EACT,WAAW,EACX,UAAU,EACV,cAAc,EACf,MAAM,aAAa,CAAC;AAErB,OAAO,EAA0C,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AAGxF,MAAM,WAAW,kBAAkB;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,0FAA0F;IAC1F,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;GAIG;AACH,qBAAa,cAAe,YAAW,YAAY;IACjD,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,MAAM,CAAoC;IAClD,OAAO,CAAC,kBAAkB,CAAqC;IAC/D,OAAO,CAAC,WAAW,CAA8D;IACjF,mGAAmG;IACnG,OAAO,CAAC,cAAc,CAAoC;IAC1D,gGAAgG;IAChG,OAAO,CAAC,iBAAiB,CAA6C;gBAE1D,MAAM,EAAE,kBAAkB;IActC,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,GAAG;IAIX,OAAO,CAAC,gBAAgB;IAMlB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAoCxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAcjC,SAAS,IAAI,gBAAgB;IAI7B,YAAY,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,IAAI;IAKpD,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAgC/C,SAAS,CAAC,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,cAAc,GAAG,YAAY;IAiDrE,cAAc,CAAC,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC;IA6CzF,WAAW,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAOrE,cAAc,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,CAAC;IAOlE,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IA+DlC,YAAY,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAItC,WAAW,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;CAG3C"}