@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 @@
1
+ {"version":3,"file":"conversion.d.ts","sourceRoot":"","sources":["../../../src/transport/local/conversion.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA8BH;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG,CASrD;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,GAAG,CAK/E;AA+LD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAsBtF;AA+CD;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAErC"}
@@ -0,0 +1,340 @@
1
+ /**
2
+ * Message conversion between plain JS objects and rclnodejs typed messages.
3
+ *
4
+ * The RosTransport interface works with `Record<string, unknown>`, but
5
+ * rclnodejs works with typed message class instances. This module bridges
6
+ * the two — analogous to rosbridge_library's `dict_to_msg` / `msg_to_dict`.
7
+ */
8
+ import { createRequire } from "node:module";
9
+ const require = createRequire(import.meta.url);
10
+ /** Cached message classes keyed by normalized type string. */
11
+ const typeCache = new Map();
12
+ /**
13
+ * Resolve the rclnodejs module. Uses createRequire because rclnodejs is CJS.
14
+ * Returns `any` — rclnodejs is an optional dependency and types may not be present.
15
+ */
16
+ function getRclnodejs() {
17
+ return require("rclnodejs");
18
+ }
19
+ /**
20
+ * Normalize a ROS2 type string to the format rclnodejs expects.
21
+ * Accepts: "geometry_msgs/msg/Twist", "geometry_msgs/Twist", etc.
22
+ */
23
+ function normalizeType(typeStr) {
24
+ const parts = typeStr.split("/");
25
+ // Already fully qualified: "pkg/msg/Type" or "pkg/srv/Type" or "pkg/action/Type"
26
+ if (parts.length === 3)
27
+ return typeStr;
28
+ // Short form: "pkg/Type" → assume msg
29
+ if (parts.length === 2)
30
+ return `${parts[0]}/msg/${parts[1]}`;
31
+ return typeStr;
32
+ }
33
+ /**
34
+ * Load a ROS2 message/service/action class via rclnodejs, with caching.
35
+ */
36
+ export function loadMessageClass(typeStr) {
37
+ const normalized = normalizeType(typeStr);
38
+ const cached = typeCache.get(normalized);
39
+ if (cached)
40
+ return cached;
41
+ const rclnodejs = getRclnodejs();
42
+ const cls = rclnodejs.require(normalized);
43
+ typeCache.set(normalized, cls);
44
+ return cls;
45
+ }
46
+ /**
47
+ * Convert a plain JS object to an rclnodejs message instance.
48
+ *
49
+ * Recursively assigns fields from `obj` onto a new message instance,
50
+ * handling nested sub-messages (e.g. Twist.linear is a Vector3).
51
+ */
52
+ export function toRosMessage(typeStr, obj) {
53
+ const MessageClass = loadMessageClass(typeStr);
54
+ const msg = new MessageClass();
55
+ assignFields(msg, obj);
56
+ return msg;
57
+ }
58
+ /**
59
+ * Recursively assign plain-object fields onto an rclnodejs message instance.
60
+ */
61
+ function assignFields(target, source) {
62
+ for (const [key, value] of Object.entries(source)) {
63
+ if (value === undefined || value === null)
64
+ continue;
65
+ if (typeof value === "object" && !Array.isArray(value)) {
66
+ // Nested sub-message — the target field should already be initialized
67
+ // by rclnodejs with default values. Recurse into it.
68
+ if (target[key] !== undefined && target[key] !== null && typeof target[key] === "object") {
69
+ assignFields(target[key], value);
70
+ }
71
+ else {
72
+ target[key] = value;
73
+ }
74
+ }
75
+ else if (Array.isArray(value)) {
76
+ // Array field — could be primitives or nested messages.
77
+ // For nested message arrays, each element needs recursive assignment
78
+ // if the target has typed array elements. For now, assign directly —
79
+ // rclnodejs handles primitive arrays and typed arrays via setter coercion.
80
+ target[key] = value;
81
+ }
82
+ else {
83
+ target[key] = value;
84
+ }
85
+ }
86
+ }
87
+ /**
88
+ * True for message shapes whose `data` must stay as raw bytes.
89
+ * rclnodejs `toPlainObject()` often expands or mis-serializes `uint8[]` / sequences
90
+ * (e.g. sensor_msgs Image / CompressedImage), which breaks camera snapshot and similar tools.
91
+ *
92
+ * Use `in` / typeof — fields may be accessors on the prototype (not own properties).
93
+ */
94
+ function isSensorImageLikeForExtraction(msg) {
95
+ if (msg == null || typeof msg !== "object")
96
+ return false;
97
+ if (!("data" in msg))
98
+ return false;
99
+ // sensor_msgs/msg/Image — PointCloud2 has width/height/data but no `encoding`.
100
+ // Width/height may be ref-wrapped in rclnodejs; only require presence + string encoding.
101
+ if (typeof msg.encoding === "string" && "width" in msg && "height" in msg) {
102
+ return true;
103
+ }
104
+ // sensor_msgs/msg/CompressedImage — `format` + `data`; no top-level `encoding` (unlike Image).
105
+ if (typeof msg.format === "string" && !(typeof msg.encoding === "string")) {
106
+ return true;
107
+ }
108
+ return false;
109
+ }
110
+ /** std_msgs/Header — read by name; stamp may be a nested ROS object. */
111
+ function copyHeaderField(header) {
112
+ if (header == null || typeof header !== "object")
113
+ return {};
114
+ const out = {};
115
+ if ("frame_id" in header)
116
+ out.frame_id = header.frame_id;
117
+ if ("stamp" in header && header.stamp != null && typeof header.stamp === "object") {
118
+ const s = header.stamp;
119
+ const stamp = {};
120
+ if (typeof s.sec === "number" || typeof s.sec === "bigint")
121
+ stamp.sec = Number(s.sec);
122
+ if (typeof s.nanosec === "number" || typeof s.nanosec === "bigint") {
123
+ stamp.nanosec = Number(s.nanosec);
124
+ }
125
+ out.stamp = stamp;
126
+ }
127
+ return out;
128
+ }
129
+ /** rclnodejs / ref-array `uint8[]` — numeric `.length` and indexed elements. */
130
+ function tryBufferFromArrayLike(value) {
131
+ if (value == null || typeof value !== "object")
132
+ return null;
133
+ const v = value;
134
+ const len = v.length;
135
+ if (typeof len !== "number" || !Number.isFinite(len) || len < 0 || len > 200_000_000) {
136
+ return null;
137
+ }
138
+ try {
139
+ const anyVal = value;
140
+ const u8 = new Uint8Array(len);
141
+ for (let i = 0; i < len; i++) {
142
+ const el = anyVal[i];
143
+ const n = typeof el === "number" ? el : Number(el);
144
+ if (!Number.isFinite(n))
145
+ return null;
146
+ u8[i] = n & 0xff;
147
+ }
148
+ return Buffer.from(u8);
149
+ }
150
+ catch {
151
+ return null;
152
+ }
153
+ }
154
+ function tryBufferFromIterable(value) {
155
+ if (value == null || typeof value !== "object")
156
+ return null;
157
+ if (typeof Buffer !== "undefined" && Buffer.isBuffer(value))
158
+ return Buffer.from(value);
159
+ if (typeof value[Symbol.iterator] !== "function")
160
+ return null;
161
+ try {
162
+ const arr = Uint8Array.from(value);
163
+ if (arr.length === 0)
164
+ return null;
165
+ return Buffer.from(arr);
166
+ }
167
+ catch {
168
+ return null;
169
+ }
170
+ }
171
+ /** Unwrap `data` for Image / CompressedImage (Buffer, views, JSON Buffer, nested `{ data }`). */
172
+ function coerceSensorImageDataField(value, depth = 0) {
173
+ if (value == null || depth > 4)
174
+ return value;
175
+ if (typeof Buffer !== "undefined" && Buffer.isBuffer(value)) {
176
+ return Buffer.from(value);
177
+ }
178
+ if (typeof ArrayBuffer !== "undefined" && ArrayBuffer.isView(value)) {
179
+ const view = value;
180
+ return Buffer.from(view.buffer, view.byteOffset, view.byteLength);
181
+ }
182
+ if (Array.isArray(value))
183
+ return value;
184
+ if (typeof value === "object") {
185
+ const rec = value;
186
+ if (rec["type"] === "Buffer" && Array.isArray(rec["data"])) {
187
+ return coerceSensorImageDataField(rec["data"], depth + 1);
188
+ }
189
+ if ("data" in rec && rec["data"] !== undefined) {
190
+ return coerceSensorImageDataField(rec["data"], depth + 1);
191
+ }
192
+ }
193
+ const fromIterable = tryBufferFromIterable(value);
194
+ if (fromIterable !== null)
195
+ return fromIterable;
196
+ const fromArrayLike = tryBufferFromArrayLike(value);
197
+ if (fromArrayLike !== null)
198
+ return fromArrayLike;
199
+ return value;
200
+ }
201
+ /**
202
+ * Copy one field value from an rclnodejs message for plain-object consumers.
203
+ * Preserves byte blobs; recurses into typical nested ROS structs (not full generic graph).
204
+ */
205
+ function copyValueForPlainTransport(value) {
206
+ if (value === null || value === undefined)
207
+ return value;
208
+ if (typeof value === "function")
209
+ return undefined;
210
+ if (typeof Buffer !== "undefined" && Buffer.isBuffer(value)) {
211
+ return Buffer.from(value);
212
+ }
213
+ if (typeof ArrayBuffer !== "undefined" && ArrayBuffer.isView(value)) {
214
+ const view = value;
215
+ return Buffer.from(view.buffer, view.byteOffset, view.byteLength);
216
+ }
217
+ if (Array.isArray(value)) {
218
+ return value.map((item) => typeof item === "object" && item !== null ? copyValueForPlainTransport(item) : item);
219
+ }
220
+ if (typeof value === "object") {
221
+ if (value.constructor && value.constructor.name !== "Object") {
222
+ return extractFields(value);
223
+ }
224
+ return value;
225
+ }
226
+ return value;
227
+ }
228
+ /**
229
+ * rclnodejs often exposes Image/CompressedImage fields via prototype getters, so
230
+ * `Object.keys(msg)` is empty and `extractFields` produced `{}`. Read the known
231
+ * sensor_msgs field names explicitly.
232
+ */
233
+ function extractSensorImageToPlain(msg) {
234
+ const keys = [
235
+ "header",
236
+ "format",
237
+ "encoding",
238
+ "height",
239
+ "width",
240
+ "is_bigendian",
241
+ "step",
242
+ "data",
243
+ ];
244
+ const result = {};
245
+ for (const key of keys) {
246
+ if (!(key in msg))
247
+ continue;
248
+ const value = msg[key];
249
+ if (typeof value === "function")
250
+ continue;
251
+ if (key === "header") {
252
+ result.header = copyHeaderField(value);
253
+ }
254
+ else if (key === "data") {
255
+ result.data = coerceSensorImageDataField(value);
256
+ }
257
+ else {
258
+ result[key] = copyValueForPlainTransport(value);
259
+ }
260
+ }
261
+ return result;
262
+ }
263
+ /**
264
+ * Convert an rclnodejs message instance to a plain JS object.
265
+ *
266
+ * Uses `toPlainObject()` if available (rclnodejs >= 0.21), otherwise
267
+ * falls back to manual recursive field extraction.
268
+ */
269
+ export function fromRosMessage(msg, rosTypeHint) {
270
+ if (msg === null || msg === undefined)
271
+ return {};
272
+ const hinted = rosTypeHint ? normalizeType(rosTypeHint) : "";
273
+ if (hinted === "sensor_msgs/msg/Image" ||
274
+ hinted === "sensor_msgs/msg/CompressedImage") {
275
+ return extractSensorImageToPlain(msg);
276
+ }
277
+ if (isSensorImageLikeForExtraction(msg)) {
278
+ return extractSensorImageToPlain(msg);
279
+ }
280
+ // Preferred path: rclnodejs provides toPlainObject()
281
+ if (typeof msg.toPlainObject === "function") {
282
+ return msg.toPlainObject();
283
+ }
284
+ // Fallback: manual extraction
285
+ return extractFields(msg);
286
+ }
287
+ /**
288
+ * Recursively extract fields from an rclnodejs message into a plain object.
289
+ */
290
+ function extractFields(msg) {
291
+ if (msg === null || msg === undefined)
292
+ return {};
293
+ if (typeof msg !== "object")
294
+ return {};
295
+ const result = {};
296
+ // Get enumerable own properties
297
+ const keys = Object.keys(msg);
298
+ for (const key of keys) {
299
+ // Skip internal/private properties
300
+ if (key.startsWith("_"))
301
+ continue;
302
+ const value = msg[key];
303
+ if (typeof value === "function")
304
+ continue;
305
+ if (value === null || value === undefined) {
306
+ result[key] = value;
307
+ }
308
+ else if (typeof Buffer !== "undefined" && Buffer.isBuffer(value)) {
309
+ // Keep raw byte blobs intact (sensor_msgs Image/CompressedImage `data`, etc.).
310
+ result[key] = Buffer.from(value);
311
+ }
312
+ else if (typeof ArrayBuffer !== "undefined" && ArrayBuffer.isView(value)) {
313
+ const view = value;
314
+ result[key] = Buffer.from(view.buffer, view.byteOffset, view.byteLength);
315
+ }
316
+ else if (Array.isArray(value)) {
317
+ result[key] = value.map((item) => typeof item === "object" && item !== null ? extractFields(item) : item);
318
+ }
319
+ else if (typeof value === "object") {
320
+ // Check if it looks like a typed message (has constructor beyond Object)
321
+ if (value.constructor && value.constructor.name !== "Object") {
322
+ result[key] = extractFields(value);
323
+ }
324
+ else {
325
+ result[key] = value;
326
+ }
327
+ }
328
+ else {
329
+ result[key] = value;
330
+ }
331
+ }
332
+ return result;
333
+ }
334
+ /**
335
+ * Clear the type cache. Called during shutdown.
336
+ */
337
+ export function clearTypeCache() {
338
+ typeCache.clear();
339
+ }
340
+ //# sourceMappingURL=conversion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversion.js","sourceRoot":"","sources":["../../../src/transport/local/conversion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Entity cache for rclnodejs publishers, subscribers, and service clients.
3
+ *
4
+ * Lazily creates and caches DDS entities so repeated publishes to the same
5
+ * topic reuse a single publisher, etc. Same pattern as the reference agents'
6
+ * `_pubs`, `_subs`, `_srv_clients` maps.
7
+ */
8
+ import type { Subscription } from "../types.js";
9
+ type Node = any;
10
+ type MessageHandler = (msg: Record<string, unknown>) => void;
11
+ export declare class EntityCache {
12
+ private publishers;
13
+ private subscriptions;
14
+ private serviceClients;
15
+ /**
16
+ * Get or create a cached publisher for the given topic and type.
17
+ */
18
+ getPublisher(node: Node, topic: string, typeStr: string): any;
19
+ /**
20
+ * Subscribe to a topic. If already subscribed, adds the handler to the
21
+ * existing subscription's handler set. Returns a Subscription handle.
22
+ */
23
+ addSubscription(node: Node, topic: string, typeStr: string, handler: MessageHandler): Subscription;
24
+ /**
25
+ * Get or create a cached service client for the given service and type.
26
+ */
27
+ getServiceClient(node: Node, service: string, typeStr: string): any;
28
+ /**
29
+ * Destroy all cached entities. Called during transport shutdown.
30
+ */
31
+ destroyAll(node: Node): void;
32
+ }
33
+ export {};
34
+ //# sourceMappingURL=entities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entities.d.ts","sourceRoot":"","sources":["../../../src/transport/local/entities.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,KAAK,IAAI,GAAG,GAAG,CAAC;AAChB,KAAK,cAAc,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;AAE7D,qBAAa,WAAW;IACtB,OAAO,CAAC,UAAU,CAA0B;IAC5C,OAAO,CAAC,aAAa,CAAqE;IAC1F,OAAO,CAAC,cAAc,CAA0B;IAEhD;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,GAAG;IAW7D;;;OAGG;IACH,eAAe,CACb,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,cAAc,GACtB,YAAY;IAyCf;;OAEG;IACH,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,GAAG;IAWnE;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;CA4B7B"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Entity cache for rclnodejs publishers, subscribers, and service clients.
3
+ *
4
+ * Lazily creates and caches DDS entities so repeated publishes to the same
5
+ * topic reuse a single publisher, etc. Same pattern as the reference agents'
6
+ * `_pubs`, `_subs`, `_srv_clients` maps.
7
+ */
8
+ import { loadMessageClass, fromRosMessage } from "./conversion.js";
9
+ export class EntityCache {
10
+ publishers = new Map();
11
+ subscriptions = new Map();
12
+ serviceClients = new Map();
13
+ /**
14
+ * Get or create a cached publisher for the given topic and type.
15
+ */
16
+ getPublisher(node, topic, typeStr) {
17
+ const key = `${topic}::${typeStr}`;
18
+ const cached = this.publishers.get(key);
19
+ if (cached)
20
+ return cached;
21
+ const MessageClass = loadMessageClass(typeStr);
22
+ const publisher = node.createPublisher(MessageClass, topic);
23
+ this.publishers.set(key, publisher);
24
+ return publisher;
25
+ }
26
+ /**
27
+ * Subscribe to a topic. If already subscribed, adds the handler to the
28
+ * existing subscription's handler set. Returns a Subscription handle.
29
+ */
30
+ addSubscription(node, topic, typeStr, handler) {
31
+ const key = `${topic}::${typeStr}`;
32
+ let entry = this.subscriptions.get(key);
33
+ if (!entry) {
34
+ const MessageClass = loadMessageClass(typeStr);
35
+ const handlers = new Set();
36
+ const handle = node.createSubscription(MessageClass, topic, (msg) => {
37
+ const plain = fromRosMessage(msg, typeStr);
38
+ for (const h of handlers) {
39
+ h(plain);
40
+ }
41
+ });
42
+ entry = { handle, handlers };
43
+ this.subscriptions.set(key, entry);
44
+ }
45
+ entry.handlers.add(handler);
46
+ return {
47
+ unsubscribe: () => {
48
+ entry.handlers.delete(handler);
49
+ // If no more handlers, destroy the subscription
50
+ if (entry.handlers.size === 0) {
51
+ try {
52
+ node.destroySubscription(entry.handle);
53
+ }
54
+ catch {
55
+ // Already destroyed
56
+ }
57
+ this.subscriptions.delete(key);
58
+ }
59
+ },
60
+ };
61
+ }
62
+ /**
63
+ * Get or create a cached service client for the given service and type.
64
+ */
65
+ getServiceClient(node, service, typeStr) {
66
+ const key = `${service}::${typeStr}`;
67
+ const cached = this.serviceClients.get(key);
68
+ if (cached)
69
+ return cached;
70
+ const ServiceClass = loadMessageClass(typeStr);
71
+ const client = node.createClient(ServiceClass, service);
72
+ this.serviceClients.set(key, client);
73
+ return client;
74
+ }
75
+ /**
76
+ * Destroy all cached entities. Called during transport shutdown.
77
+ */
78
+ destroyAll(node) {
79
+ for (const pub of this.publishers.values()) {
80
+ try {
81
+ node.destroyPublisher(pub);
82
+ }
83
+ catch {
84
+ // Best-effort cleanup
85
+ }
86
+ }
87
+ this.publishers.clear();
88
+ for (const { handle } of this.subscriptions.values()) {
89
+ try {
90
+ node.destroySubscription(handle);
91
+ }
92
+ catch {
93
+ // Best-effort cleanup
94
+ }
95
+ }
96
+ this.subscriptions.clear();
97
+ for (const client of this.serviceClients.values()) {
98
+ try {
99
+ node.destroyClient(client);
100
+ }
101
+ catch {
102
+ // Best-effort cleanup
103
+ }
104
+ }
105
+ this.serviceClients.clear();
106
+ }
107
+ }
108
+ //# sourceMappingURL=entities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entities.js","sourceRoot":"","sources":["../../../src/transport/local/entities.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
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
+ export interface LocalTransportOptions {
4
+ domainId?: number;
5
+ }
6
+ /**
7
+ * Mode A transport: direct local DDS communication via rclnodejs.
8
+ *
9
+ * When OpenClaw runs on the robot itself, this transport talks to ROS2
10
+ * directly via the local DDS bus — no network intermediary needed.
11
+ */
12
+ export declare class LocalTransport implements RosTransport {
13
+ private domainId;
14
+ private status;
15
+ private connectionHandlers;
16
+ /** rclnodejs module — loaded dynamically at runtime (optional dep, no types). */
17
+ private rclnodejs;
18
+ private node;
19
+ private entityCache;
20
+ private activeGoals;
21
+ /** Singleton guard — rclnodejs.init() must only be called once per process. */
22
+ private static rclInitialized;
23
+ constructor(options?: LocalTransportOptions);
24
+ connect(): Promise<void>;
25
+ disconnect(): Promise<void>;
26
+ getStatus(): ConnectionStatus;
27
+ onConnection(handler: ConnectionHandler): () => void;
28
+ publish(options: PublishOptions): void;
29
+ subscribe(options: SubscribeOptions, handler: MessageHandler): Subscription;
30
+ callService(options: ServiceCallOptions): Promise<ServiceCallResult>;
31
+ sendActionGoal(options: ActionGoalOptions): Promise<ActionResult>;
32
+ cancelActionGoal(action: string): Promise<void>;
33
+ listTopics(): Promise<TopicInfo[]>;
34
+ listServices(): Promise<ServiceInfo[]>;
35
+ listActions(): Promise<ActionInfo[]>;
36
+ private setStatus;
37
+ private ensureConnected;
38
+ /**
39
+ * Resolve a topic's type from the node's graph introspection.
40
+ * Returns undefined if the topic is not yet known.
41
+ */
42
+ private resolveTopicType;
43
+ /**
44
+ * Resolve a service's type from the node's graph introspection.
45
+ * Returns undefined if the service is not yet known.
46
+ */
47
+ private resolveServiceType;
48
+ /**
49
+ * Wrap rclnodejs callback-based sendRequest in a Promise with timeout.
50
+ */
51
+ private sendServiceRequest;
52
+ }
53
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../../src/transport/local/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,EACf,MAAM,aAAa,CAAC;AAMrB,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAaD;;;;;GAKG;AACH,qBAAa,cAAe,YAAW,YAAY;IACjD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAoC;IAClD,OAAO,CAAC,kBAAkB,CAAgC;IAC1D,iFAAiF;IACjF,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,WAAW,CAA0B;IAE7C,+EAA+E;IAC/E,OAAO,CAAC,MAAM,CAAC,cAAc,CAAS;gBAE1B,OAAO,CAAC,EAAE,qBAAqB;IAMrC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA4CxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAqCjC,SAAS,IAAI,gBAAgB;IAI7B,YAAY,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,IAAI;IASpD,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAOtC,SAAS,CAAC,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,cAAc,GAAG,YAAY;IAarE,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAsCpE,cAAc,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,CAAC;IA2DjE,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU/C,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAgDlC,YAAY,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAYtC,WAAW,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAsB1C,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,eAAe;IAMvB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAQxB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAQ1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;CAqB3B"}