agenticros 0.1.18 → 0.2.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 (164) hide show
  1. package/dist/__tests__/robot-config.test.d.ts +2 -0
  2. package/dist/__tests__/robot-config.test.d.ts.map +1 -0
  3. package/dist/__tests__/robot-config.test.js +374 -0
  4. package/dist/__tests__/robot-config.test.js.map +1 -0
  5. package/dist/__tests__/transport-shorthand.test.d.ts +2 -0
  6. package/dist/__tests__/transport-shorthand.test.d.ts.map +1 -0
  7. package/dist/__tests__/transport-shorthand.test.js +88 -0
  8. package/dist/__tests__/transport-shorthand.test.js.map +1 -0
  9. package/dist/commands/robots.d.ts +57 -0
  10. package/dist/commands/robots.d.ts.map +1 -0
  11. package/dist/commands/robots.js +678 -0
  12. package/dist/commands/robots.js.map +1 -0
  13. package/dist/commands/skills.d.ts.map +1 -1
  14. package/dist/commands/skills.js +125 -2
  15. package/dist/commands/skills.js.map +1 -1
  16. package/dist/index.js +29 -1
  17. package/dist/index.js.map +1 -1
  18. package/dist/menu.js +22 -4
  19. package/dist/menu.js.map +1 -1
  20. package/dist/util/marketplace.d.ts +57 -0
  21. package/dist/util/marketplace.d.ts.map +1 -0
  22. package/dist/util/marketplace.js +144 -0
  23. package/dist/util/marketplace.js.map +1 -0
  24. package/dist/util/mcp-discovery.d.ts +57 -0
  25. package/dist/util/mcp-discovery.d.ts.map +1 -0
  26. package/dist/util/mcp-discovery.js +153 -0
  27. package/dist/util/mcp-discovery.js.map +1 -0
  28. package/dist/util/robot-config.d.ts +167 -0
  29. package/dist/util/robot-config.d.ts.map +1 -0
  30. package/dist/util/robot-config.js +375 -0
  31. package/dist/util/robot-config.js.map +1 -0
  32. package/dist/util/skills.d.ts +6 -6
  33. package/dist/util/skills.d.ts.map +1 -1
  34. package/dist/util/skills.js +14 -9
  35. package/dist/util/skills.js.map +1 -1
  36. package/dist/util/transport-shorthand.d.ts +66 -0
  37. package/dist/util/transport-shorthand.d.ts.map +1 -0
  38. package/dist/util/transport-shorthand.js +102 -0
  39. package/dist/util/transport-shorthand.js.map +1 -0
  40. package/package.json +12 -10
  41. package/runtime/BUNDLE.json +1 -1
  42. package/runtime/README.md +62 -1
  43. package/runtime/package.json +6 -1
  44. package/runtime/packages/agenticros/openclaw.plugin.json +7 -1
  45. package/runtime/packages/agenticros/package.json +2 -1
  46. package/runtime/packages/agenticros/src/__tests__/capabilities-plugin.test.ts +568 -0
  47. package/runtime/packages/agenticros/src/config-page.ts +1 -1
  48. package/runtime/packages/agenticros/src/mission-registry.ts +22 -0
  49. package/runtime/packages/agenticros/src/service.ts +120 -2
  50. package/runtime/packages/agenticros/src/skill-loader.ts +109 -30
  51. package/runtime/packages/agenticros/src/tools/_robot-helpers.ts +68 -0
  52. package/runtime/packages/agenticros/src/tools/index.ts +49 -9
  53. package/runtime/packages/agenticros/src/tools/mission-cancel.ts +70 -0
  54. package/runtime/packages/agenticros/src/tools/ros2-action.ts +11 -4
  55. package/runtime/packages/agenticros/src/tools/ros2-camera.ts +10 -4
  56. package/runtime/packages/agenticros/src/tools/ros2-capabilities.ts +63 -0
  57. package/runtime/packages/agenticros/src/tools/ros2-depth-distance.ts +11 -4
  58. package/runtime/packages/agenticros/src/tools/ros2-discover.ts +65 -0
  59. package/runtime/packages/agenticros/src/tools/ros2-find-robots-for.ts +128 -0
  60. package/runtime/packages/agenticros/src/tools/ros2-mission.ts +311 -0
  61. package/runtime/packages/agenticros/src/tools/ros2-param.ts +20 -7
  62. package/runtime/packages/agenticros/src/tools/ros2-publish.ts +15 -8
  63. package/runtime/packages/agenticros/src/tools/ros2-robots.ts +52 -0
  64. package/runtime/packages/agenticros/src/tools/ros2-service.ts +11 -4
  65. package/runtime/packages/agenticros/src/tools/ros2-subscribe.ts +11 -4
  66. package/runtime/packages/agenticros-claude-code/README.md +52 -9
  67. package/runtime/packages/agenticros-claude-code/dist/__tests__/capabilities-mcp.test.d.ts +2 -0
  68. package/runtime/packages/agenticros-claude-code/dist/__tests__/capabilities-mcp.test.d.ts.map +1 -0
  69. package/runtime/packages/agenticros-claude-code/dist/__tests__/capabilities-mcp.test.js +773 -0
  70. package/runtime/packages/agenticros-claude-code/dist/__tests__/capabilities-mcp.test.js.map +1 -0
  71. package/runtime/packages/agenticros-claude-code/dist/__tests__/follow-me-registry.test.d.ts +2 -0
  72. package/runtime/packages/agenticros-claude-code/dist/__tests__/follow-me-registry.test.d.ts.map +1 -0
  73. package/runtime/packages/agenticros-claude-code/dist/__tests__/follow-me-registry.test.js +97 -0
  74. package/runtime/packages/agenticros-claude-code/dist/__tests__/follow-me-registry.test.js.map +1 -0
  75. package/runtime/packages/agenticros-claude-code/dist/find-object/find-object.d.ts +2 -2
  76. package/runtime/packages/agenticros-claude-code/dist/find-object/find-object.d.ts.map +1 -1
  77. package/runtime/packages/agenticros-claude-code/dist/find-object/find-object.js +5 -5
  78. package/runtime/packages/agenticros-claude-code/dist/find-object/find-object.js.map +1 -1
  79. package/runtime/packages/agenticros-claude-code/dist/follow-me/depth-loop.d.ts +109 -0
  80. package/runtime/packages/agenticros-claude-code/dist/follow-me/depth-loop.d.ts.map +1 -0
  81. package/runtime/packages/agenticros-claude-code/dist/follow-me/depth-loop.js +392 -0
  82. package/runtime/packages/agenticros-claude-code/dist/follow-me/depth-loop.js.map +1 -0
  83. package/runtime/packages/agenticros-claude-code/dist/follow-me/loop.d.ts +8 -3
  84. package/runtime/packages/agenticros-claude-code/dist/follow-me/loop.d.ts.map +1 -1
  85. package/runtime/packages/agenticros-claude-code/dist/follow-me/loop.js +30 -12
  86. package/runtime/packages/agenticros-claude-code/dist/follow-me/loop.js.map +1 -1
  87. package/runtime/packages/agenticros-claude-code/dist/index.js +5 -5
  88. package/runtime/packages/agenticros-claude-code/dist/index.js.map +1 -1
  89. package/runtime/packages/agenticros-claude-code/dist/mission-registry.d.ts +16 -0
  90. package/runtime/packages/agenticros-claude-code/dist/mission-registry.d.ts.map +1 -0
  91. package/runtime/packages/agenticros-claude-code/dist/mission-registry.js +19 -0
  92. package/runtime/packages/agenticros-claude-code/dist/mission-registry.js.map +1 -0
  93. package/runtime/packages/agenticros-claude-code/dist/tools.d.ts +9 -0
  94. package/runtime/packages/agenticros-claude-code/dist/tools.d.ts.map +1 -1
  95. package/runtime/packages/agenticros-claude-code/dist/tools.js +700 -54
  96. package/runtime/packages/agenticros-claude-code/dist/tools.js.map +1 -1
  97. package/runtime/packages/agenticros-claude-code/dist/transport.d.ts +28 -8
  98. package/runtime/packages/agenticros-claude-code/dist/transport.d.ts.map +1 -1
  99. package/runtime/packages/agenticros-claude-code/dist/transport.js +37 -34
  100. package/runtime/packages/agenticros-claude-code/dist/transport.js.map +1 -1
  101. package/runtime/packages/agenticros-claude-code/package.json +2 -1
  102. package/runtime/packages/agenticros-claude-code/src/__tests__/capabilities-mcp.test.ts +965 -0
  103. package/runtime/packages/agenticros-claude-code/src/__tests__/follow-me-registry.test.ts +119 -0
  104. package/runtime/packages/agenticros-claude-code/src/find-object/find-object.ts +7 -6
  105. package/runtime/packages/agenticros-claude-code/src/follow-me/depth-loop.ts +41 -9
  106. package/runtime/packages/agenticros-claude-code/src/follow-me/loop.ts +40 -11
  107. package/runtime/packages/agenticros-claude-code/src/index.ts +5 -5
  108. package/runtime/packages/agenticros-claude-code/src/mission-registry.ts +21 -0
  109. package/runtime/packages/agenticros-claude-code/src/tools.ts +668 -56
  110. package/runtime/packages/agenticros-claude-code/src/transport.ts +43 -43
  111. package/runtime/packages/agenticros-gemini/package.json +1 -0
  112. package/runtime/packages/agenticros-gemini/src/__tests__/mission-cancel.test.ts +197 -0
  113. package/runtime/packages/agenticros-gemini/src/__tests__/mission-transcripts.test.ts +178 -0
  114. package/runtime/packages/agenticros-gemini/src/tools.ts +504 -21
  115. package/runtime/packages/agenticros-gemini/src/transport.ts +40 -43
  116. package/runtime/packages/core/LICENSE +192 -0
  117. package/runtime/packages/core/README.md +88 -0
  118. package/runtime/packages/core/package.json +36 -3
  119. package/runtime/packages/core/src/__tests__/capabilities.test.ts +266 -0
  120. package/runtime/packages/core/src/__tests__/discovery.test.ts +206 -0
  121. package/runtime/packages/core/src/__tests__/find-robots-for.test.ts +258 -0
  122. package/runtime/packages/core/src/__tests__/mission-cancel-transcript.test.ts +371 -0
  123. package/runtime/packages/core/src/__tests__/mission-transcript-sink.test.ts +189 -0
  124. package/runtime/packages/core/src/__tests__/mission.test.ts +501 -0
  125. package/runtime/packages/core/src/__tests__/planner.test.ts +279 -0
  126. package/runtime/packages/core/src/__tests__/robots.test.ts +406 -0
  127. package/runtime/packages/core/src/__tests__/topic-utils.test.ts +105 -0
  128. package/runtime/packages/core/src/__tests__/transport-pool.test.ts +295 -0
  129. package/runtime/packages/core/src/capabilities.ts +314 -0
  130. package/runtime/packages/core/src/config.ts +221 -39
  131. package/runtime/packages/core/src/discovery.ts +193 -0
  132. package/runtime/packages/core/src/find-robots-for.ts +164 -0
  133. package/runtime/packages/core/src/index.ts +67 -1
  134. package/runtime/packages/core/src/mission-registry.ts +142 -0
  135. package/runtime/packages/core/src/mission-transcript-sink.ts +81 -0
  136. package/runtime/packages/core/src/mission.ts +574 -0
  137. package/runtime/packages/core/src/planner/index.ts +564 -0
  138. package/runtime/packages/core/src/robots.ts +282 -0
  139. package/runtime/packages/core/src/topic-utils.ts +47 -9
  140. package/runtime/packages/core/src/transport-pool.ts +171 -0
  141. package/runtime/ros2_ws/src/agenticros_discovery/agenticros_discovery/discovery_node.py +108 -13
  142. package/runtime/ros2_ws/src/agenticros_msgs/CMakeLists.txt +1 -0
  143. package/runtime/ros2_ws/src/agenticros_msgs/msg/RobotInfo.msg +44 -0
  144. package/runtime/scripts/__tests__/refresh-skill-deps.test.mjs +222 -0
  145. package/runtime/scripts/configure_agenticros.sh +0 -0
  146. package/runtime/scripts/configure_for_sim.sh +0 -0
  147. package/runtime/scripts/fix-openclaw-control-ui-path.sh +0 -0
  148. package/runtime/scripts/install_cli.sh +0 -0
  149. package/runtime/scripts/install_rosbridge_from_source.sh +0 -0
  150. package/runtime/scripts/onboard_robot.sh +0 -0
  151. package/runtime/scripts/pack-runtime.mjs +0 -0
  152. package/runtime/scripts/refresh-skill-deps.mjs +381 -0
  153. package/runtime/scripts/run_demo_native.sh +0 -0
  154. package/runtime/scripts/run_nemoclaw_host_stack.sh +0 -0
  155. package/runtime/scripts/run_robot_rosbridge.sh +0 -0
  156. package/runtime/scripts/setup_gateway_plugin.sh +32 -5
  157. package/runtime/scripts/setup_robot.sh +0 -0
  158. package/runtime/scripts/setup_workspace.sh +0 -0
  159. package/runtime/scripts/sim/run_sim.sh +0 -0
  160. package/runtime/scripts/smoke_test_nemoclaw.sh +0 -0
  161. package/runtime/scripts/start_demo.sh +0 -0
  162. package/runtime/scripts/sync-skill-tools.mjs +69 -12
  163. package/runtime/scripts/use-openclaw-2026.2.26.sh +0 -0
  164. package/runtime/scripts/use-openclaw-2026.3.11.sh +0 -0
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=robot-config.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"robot-config.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/robot-config.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,374 @@
1
+ /**
2
+ * Unit tests for the CLI's robot-config persistence layer.
3
+ *
4
+ * What these tests pin down (each one corresponds to a real failure mode
5
+ * the persistence layer has to defend against in production):
6
+ *
7
+ * - readRobots: explicit `robots[]` wins; falls back to a legacy
8
+ * `config.robot` when the array is empty; reports an empty list +
9
+ * `from: 'none'` when neither is set.
10
+ * - addRobot: legacy single-robot config is promoted into `robots[0]`
11
+ * on first multi-robot write, marked default so the prior behavior
12
+ * ("the single robot is active") is preserved.
13
+ * - addRobot is idempotent — re-adding the same id updates the entry
14
+ * in place but reports `added: false`.
15
+ * - setDefault: switches the default flag across entries (exactly one
16
+ * robot is default at a time). Throws with a self-correcting error
17
+ * when the id is unknown.
18
+ * - removeRobot: idempotent; leaves an empty array (not undefined) so
19
+ * the core resolver re-falls-back to legacy `config.robot`.
20
+ *
21
+ * The tests operate on plain config objects — never touching the
22
+ * filesystem — so they're isolation-safe.
23
+ */
24
+ import { test } from "node:test";
25
+ import assert from "node:assert/strict";
26
+ import { addRobot, clearTransportForRobot, getActiveRobotId, readRobots, removeRobot, setDefaultRobot, setTransportForRobot, } from "../util/robot-config.js";
27
+ test("robot-config: readRobots falls back to legacy config.robot when robots[] is empty", () => {
28
+ const obj = { robot: { name: "Spot", namespace: "robot-alpha", cameraTopic: "/cam" } };
29
+ const { robots, from } = readRobots(obj);
30
+ assert.equal(from, "legacy");
31
+ assert.equal(robots.length, 1);
32
+ assert.equal(robots[0].id, "robot-alpha", "id derives from namespace");
33
+ assert.equal(robots[0].name, "Spot");
34
+ assert.equal(robots[0].cameraTopic, "/cam");
35
+ });
36
+ test("robot-config: readRobots prefers explicit robots[] over legacy config.robot", () => {
37
+ const obj = {
38
+ robot: { name: "Legacy", namespace: "legacy-ns" },
39
+ robots: [{ id: "alpha", name: "Alpha", namespace: "alpha-ns" }],
40
+ };
41
+ const { robots, from } = readRobots(obj);
42
+ assert.equal(from, "explicit");
43
+ assert.equal(robots.length, 1);
44
+ assert.equal(robots[0].id, "alpha");
45
+ });
46
+ test("robot-config: readRobots returns empty + from='none' when nothing is configured", () => {
47
+ const { robots, from } = readRobots({});
48
+ assert.equal(from, "none");
49
+ assert.deepEqual(robots, []);
50
+ });
51
+ test("robot-config: addRobot promotes legacy config.robot into robots[0] on first multi-robot write", () => {
52
+ const obj = {
53
+ robot: { name: "Legacy", namespace: "legacy-ns", cameraTopic: "/legacy/cam" },
54
+ };
55
+ const result = addRobot({ id: "beta", name: "Beta", namespace: "beta-ns" }, { obj });
56
+ assert.equal(result.added, true);
57
+ assert.equal(result.promotedLegacy, true, "legacy.robot must be promoted on first add");
58
+ assert.equal(result.robots.length, 2);
59
+ assert.equal(result.robots[0].id, "legacy-ns");
60
+ assert.equal(result.robots[0].default, true, "promoted legacy entry stays default so the prior single-robot behavior is preserved");
61
+ assert.equal(result.robots[1].id, "beta");
62
+ assert.notEqual(result.robots[1].default, true, "new entry isn't default unless asked");
63
+ });
64
+ test("robot-config: addRobot is idempotent — re-adding the same id updates in place and reports added=false", () => {
65
+ const obj = {
66
+ robots: [{ id: "alpha", name: "Old", namespace: "alpha-ns" }],
67
+ };
68
+ const result = addRobot({ id: "alpha", name: "New", namespace: "alpha-ns", cameraTopic: "/cam" }, { obj });
69
+ assert.equal(result.added, false, "re-adding same id must not double-count");
70
+ assert.equal(result.robots.length, 1);
71
+ assert.equal(result.robots[0].name, "New", "name must be updated in place");
72
+ assert.equal(result.robots[0].cameraTopic, "/cam");
73
+ });
74
+ test("robot-config: addRobot with setDefault=true demotes the previous default", () => {
75
+ const obj = {
76
+ robots: [
77
+ { id: "alpha", namespace: "alpha-ns", default: true },
78
+ { id: "beta", namespace: "beta-ns" },
79
+ ],
80
+ };
81
+ const result = addRobot({ id: "gamma", namespace: "gamma-ns" }, { setDefault: true, obj });
82
+ assert.equal(result.added, true);
83
+ const defaults = result.robots.filter((r) => r.default === true);
84
+ assert.equal(defaults.length, 1, "exactly one robot must be default at a time");
85
+ assert.equal(defaults[0].id, "gamma", "gamma should be the new default");
86
+ });
87
+ test("robot-config: removeRobot leaves an empty array so legacy fallback can resume", () => {
88
+ const obj = {
89
+ robots: [{ id: "alpha", namespace: "alpha-ns" }],
90
+ robot: { name: "Legacy", namespace: "legacy-ns" },
91
+ };
92
+ const result = removeRobot("alpha", obj);
93
+ assert.equal(result.removed, true);
94
+ assert.deepEqual(result.robots, [], "robots[] should be empty after removing the last entry");
95
+ // And reading again should now surface the legacy fallback.
96
+ const { from, robots } = readRobots(obj);
97
+ assert.equal(from, "legacy");
98
+ assert.equal(robots.length, 1);
99
+ assert.equal(robots[0].id, "legacy-ns");
100
+ });
101
+ test("robot-config: removeRobot is idempotent and reports removed=false for unknown ids", () => {
102
+ const obj = {
103
+ robots: [{ id: "alpha", namespace: "alpha-ns" }],
104
+ };
105
+ const result = removeRobot("no-such-robot", obj);
106
+ assert.equal(result.removed, false);
107
+ assert.equal(result.robots.length, 1, "robots[] must be untouched on no-op remove");
108
+ });
109
+ test("robot-config: setDefaultRobot swaps the default flag and only ever marks one robot default", () => {
110
+ const obj = {
111
+ robots: [
112
+ { id: "alpha", namespace: "alpha-ns", default: true },
113
+ { id: "beta", namespace: "beta-ns" },
114
+ ],
115
+ };
116
+ const { robots } = setDefaultRobot("beta", obj);
117
+ const defaults = robots.filter((r) => r.default === true);
118
+ assert.equal(defaults.length, 1);
119
+ assert.equal(defaults[0].id, "beta");
120
+ // Alpha must have been demoted (no leftover default flag).
121
+ const alpha = robots.find((r) => r.id === "alpha");
122
+ assert.equal(alpha?.default, undefined);
123
+ });
124
+ test("robot-config: setDefaultRobot promotes legacy then sets default on the named entry", () => {
125
+ const obj = {
126
+ robot: { namespace: "legacy-ns", name: "Legacy" },
127
+ };
128
+ // Add a second robot first.
129
+ addRobot({ id: "beta", namespace: "beta-ns" }, { obj });
130
+ // Now set the legacy one (now promoted into robots[]) as default.
131
+ const { robots, promotedLegacy } = setDefaultRobot("legacy-ns", obj);
132
+ assert.equal(promotedLegacy, false, "legacy was already promoted by the earlier addRobot");
133
+ const defaults = robots.filter((r) => r.default === true);
134
+ assert.equal(defaults.length, 1);
135
+ assert.equal(defaults[0].id, "legacy-ns");
136
+ });
137
+ test("robot-config: setDefaultRobot throws a self-correcting error when the id is unknown", () => {
138
+ const obj = {
139
+ robots: [{ id: "alpha", namespace: "alpha-ns" }],
140
+ };
141
+ assert.throws(() => setDefaultRobot("no-such-robot", obj), /Unknown robot id "no-such-robot".*Known: alpha/);
142
+ });
143
+ test("robot-config: getActiveRobotId picks the default-flagged entry over the first", () => {
144
+ const obj = {
145
+ robots: [
146
+ { id: "alpha", namespace: "alpha-ns" },
147
+ { id: "beta", namespace: "beta-ns", default: true },
148
+ ],
149
+ };
150
+ assert.equal(getActiveRobotId(obj), "beta");
151
+ });
152
+ test("robot-config: getActiveRobotId falls back to the first robot when no default is flagged", () => {
153
+ const obj = {
154
+ robots: [
155
+ { id: "alpha", namespace: "alpha-ns" },
156
+ { id: "beta", namespace: "beta-ns" },
157
+ ],
158
+ };
159
+ assert.equal(getActiveRobotId(obj), "alpha");
160
+ });
161
+ test("robot-config: getActiveRobotId falls back to legacy when robots[] is empty", () => {
162
+ const obj = { robot: { namespace: "legacy-ns" } };
163
+ assert.equal(getActiveRobotId(obj), "legacy-ns");
164
+ });
165
+ // ─────────────────────────────────────────────────────────────────────────────
166
+ // Per-robot transport override (CLI persistence layer)
167
+ // ─────────────────────────────────────────────────────────────────────────────
168
+ test("robot-config: readRobots surfaces the per-robot transport override verbatim", () => {
169
+ const obj = {
170
+ robots: [
171
+ {
172
+ id: "alpha",
173
+ namespace: "alpha-ns",
174
+ transport: { mode: "zenoh", zenoh: { routerEndpoint: "ws://farm:10000" } },
175
+ },
176
+ ],
177
+ };
178
+ const { robots } = readRobots(obj);
179
+ assert.deepEqual(robots[0].transport, {
180
+ mode: "zenoh",
181
+ zenoh: { routerEndpoint: "ws://farm:10000" },
182
+ });
183
+ });
184
+ test("robot-config: addRobot writes transport on a new entry when provided", () => {
185
+ const obj = {};
186
+ const result = addRobot({
187
+ id: "alpha",
188
+ namespace: "alpha-ns",
189
+ transport: { mode: "zenoh", zenoh: { routerEndpoint: "ws://farm:10000" } },
190
+ }, { obj });
191
+ assert.equal(result.added, true);
192
+ assert.deepEqual(result.robots[0].transport, {
193
+ mode: "zenoh",
194
+ zenoh: { routerEndpoint: "ws://farm:10000" },
195
+ });
196
+ });
197
+ test("robot-config: addRobot preserves a prior transport on update when --transport is omitted", () => {
198
+ // This is the critical UX invariant: running `agenticros robots add alpha`
199
+ // again (e.g. to change the display name) must NOT silently drop a
200
+ // previously-configured per-robot transport override.
201
+ const obj = {
202
+ robots: [
203
+ {
204
+ id: "alpha",
205
+ namespace: "alpha-ns",
206
+ name: "Old",
207
+ transport: { mode: "local", local: { domainId: 5 } },
208
+ },
209
+ ],
210
+ };
211
+ const result = addRobot({ id: "alpha", name: "New", namespace: "alpha-ns" }, { obj });
212
+ assert.equal(result.added, false);
213
+ assert.equal(result.robots[0].name, "New");
214
+ assert.deepEqual(result.robots[0].transport, { mode: "local", local: { domainId: 5 } }, "prior transport must survive a name-only update");
215
+ });
216
+ test("robot-config: addRobot replaces transport on update when --transport is supplied", () => {
217
+ const obj = {
218
+ robots: [
219
+ {
220
+ id: "alpha",
221
+ namespace: "alpha-ns",
222
+ transport: { mode: "local", local: { domainId: 5 } },
223
+ },
224
+ ],
225
+ };
226
+ const result = addRobot({
227
+ id: "alpha",
228
+ namespace: "alpha-ns",
229
+ transport: { mode: "zenoh", zenoh: { routerEndpoint: "ws://farm:10000" } },
230
+ }, { obj });
231
+ assert.equal(result.added, false);
232
+ assert.deepEqual(result.robots[0].transport, {
233
+ mode: "zenoh",
234
+ zenoh: { routerEndpoint: "ws://farm:10000" },
235
+ });
236
+ });
237
+ test("robot-config: setTransportForRobot applies an override to an existing robot", () => {
238
+ const obj = {
239
+ robots: [
240
+ { id: "alpha", namespace: "alpha-ns" },
241
+ { id: "beta", namespace: "beta-ns" },
242
+ ],
243
+ };
244
+ const { robots, promotedLegacy } = setTransportForRobot("beta", { mode: "zenoh", zenoh: { routerEndpoint: "ws://farm:10000" } }, obj);
245
+ assert.equal(promotedLegacy, false);
246
+ const beta = robots.find((r) => r.id === "beta");
247
+ assert.deepEqual(beta.transport, {
248
+ mode: "zenoh",
249
+ zenoh: { routerEndpoint: "ws://farm:10000" },
250
+ });
251
+ // Alpha must be untouched.
252
+ const alpha = robots.find((r) => r.id === "alpha");
253
+ assert.equal(alpha.transport, undefined);
254
+ });
255
+ test("robot-config: setTransportForRobot promotes legacy first, then targets the promoted entry", () => {
256
+ const obj = {
257
+ robot: { namespace: "legacy-ns", name: "Legacy" },
258
+ };
259
+ const { robots, promotedLegacy } = setTransportForRobot("legacy-ns", { mode: "rosbridge", rosbridge: { url: "ws://10.0.0.5:9090" } }, obj);
260
+ assert.equal(promotedLegacy, true);
261
+ assert.equal(robots.length, 1);
262
+ assert.equal(robots[0].id, "legacy-ns");
263
+ assert.deepEqual(robots[0].transport, {
264
+ mode: "rosbridge",
265
+ rosbridge: { url: "ws://10.0.0.5:9090" },
266
+ });
267
+ });
268
+ test("robot-config: setTransportForRobot throws a self-correcting error on unknown id", () => {
269
+ const obj = {
270
+ robots: [{ id: "alpha", namespace: "alpha-ns" }],
271
+ };
272
+ assert.throws(() => setTransportForRobot("no-such-robot", { mode: "zenoh" }, obj), /Unknown robot id "no-such-robot".*Known: alpha/);
273
+ });
274
+ test("robot-config: clearTransportForRobot removes a previously-set override", () => {
275
+ const obj = {
276
+ robots: [
277
+ {
278
+ id: "alpha",
279
+ namespace: "alpha-ns",
280
+ transport: { mode: "local", local: { domainId: 5 } },
281
+ },
282
+ ],
283
+ };
284
+ const { cleared, robots } = clearTransportForRobot("alpha", obj);
285
+ assert.equal(cleared, true);
286
+ assert.equal(robots[0].transport, undefined);
287
+ });
288
+ test("robot-config: clearTransportForRobot is idempotent (cleared=false when no prior override)", () => {
289
+ const obj = {
290
+ robots: [{ id: "alpha", namespace: "alpha-ns" }],
291
+ };
292
+ const { cleared } = clearTransportForRobot("alpha", obj);
293
+ assert.equal(cleared, false);
294
+ });
295
+ test("robot-config: clearTransportForRobot throws on unknown id", () => {
296
+ const obj = {
297
+ robots: [{ id: "alpha", namespace: "alpha-ns" }],
298
+ };
299
+ assert.throws(() => clearTransportForRobot("no-such-robot", obj), /Unknown robot id "no-such-robot"/);
300
+ });
301
+ // ─────────────────────────────────────────────────────────────────────────────
302
+ // Phase 1.e — kind / sensors / capabilities on RobotEntry
303
+ // ─────────────────────────────────────────────────────────────────────────────
304
+ test("robot-config: readRobots surfaces kind / sensors / capabilities verbatim", () => {
305
+ const obj = {
306
+ robots: [
307
+ {
308
+ id: "alpha",
309
+ namespace: "alpha-ns",
310
+ kind: "arm",
311
+ sensors: { has_realsense: true, has_arm: true },
312
+ capabilities: ["arm_grasp", "drive_base"],
313
+ },
314
+ ],
315
+ };
316
+ const { robots } = readRobots(obj);
317
+ assert.equal(robots[0].kind, "arm");
318
+ assert.deepEqual(robots[0].sensors, { has_realsense: true, has_arm: true });
319
+ assert.deepEqual(robots[0].capabilities, ["arm_grasp", "drive_base"]);
320
+ });
321
+ test("robot-config: addRobot writes kind / sensors / capabilities on a new entry", () => {
322
+ const obj = {};
323
+ const result = addRobot({
324
+ id: "alpha",
325
+ namespace: "alpha-ns",
326
+ kind: "drone",
327
+ sensors: { has_lidar: true },
328
+ capabilities: ["fly_to", "take_snapshot"],
329
+ }, { obj });
330
+ assert.equal(result.added, true);
331
+ const written = result.robots[0];
332
+ assert.equal(written.kind, "drone");
333
+ assert.deepEqual(written.sensors, { has_lidar: true });
334
+ assert.deepEqual(written.capabilities, ["fly_to", "take_snapshot"]);
335
+ });
336
+ test("robot-config: addRobot preserves prior kind / sensors / capabilities on a name-only update", () => {
337
+ // Same preserve-on-update invariant as `transport`: a follow-up
338
+ // `add` without these flags must NOT clobber what's already there.
339
+ const obj = {
340
+ robots: [
341
+ {
342
+ id: "alpha",
343
+ namespace: "alpha-ns",
344
+ kind: "drone",
345
+ sensors: { has_lidar: true },
346
+ capabilities: ["fly_to"],
347
+ },
348
+ ],
349
+ };
350
+ const result = addRobot({ id: "alpha", name: "Renamed", namespace: "alpha-ns" }, { obj });
351
+ const r = result.robots[0];
352
+ assert.equal(r.name, "Renamed");
353
+ assert.equal(r.kind, "drone", "prior kind must survive name-only update");
354
+ assert.deepEqual(r.sensors, { has_lidar: true });
355
+ assert.deepEqual(r.capabilities, ["fly_to"]);
356
+ });
357
+ test("robot-config: addRobot replaces capabilities with [] (caller-driven clear)", () => {
358
+ // Empty array means "clear the allowlist" — the CLI relies on this
359
+ // when the user passes --capabilities='' to revert a robot to the
360
+ // gateway-wide registry without removing the whole entry.
361
+ const obj = {
362
+ robots: [
363
+ {
364
+ id: "alpha",
365
+ namespace: "alpha-ns",
366
+ capabilities: ["arm_grasp"],
367
+ },
368
+ ],
369
+ };
370
+ const result = addRobot({ id: "alpha", namespace: "alpha-ns", capabilities: [] }, { obj });
371
+ const r = result.robots[0];
372
+ assert.deepEqual(r.capabilities, []);
373
+ });
374
+ //# sourceMappingURL=robot-config.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"robot-config.test.js","sourceRoot":"","sources":["../../src/__tests__/robot-config.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=transport-shorthand.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport-shorthand.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/transport-shorthand.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,88 @@
1
+ import { describe, it } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { parseTransportShorthand, parseTransportJson, } from "../util/transport-shorthand.js";
4
+ describe("parseTransportShorthand", () => {
5
+ it("zenoh: mode-only inherits everything from global config", () => {
6
+ assert.deepEqual(parseTransportShorthand("zenoh"), { mode: "zenoh" });
7
+ });
8
+ it("zenoh:<url> overrides only the router endpoint", () => {
9
+ assert.deepEqual(parseTransportShorthand("zenoh:ws://farm:10000"), {
10
+ mode: "zenoh",
11
+ zenoh: { routerEndpoint: "ws://farm:10000" },
12
+ });
13
+ });
14
+ it("rosbridge:<url> overrides only the websocket url", () => {
15
+ assert.deepEqual(parseTransportShorthand("rosbridge:ws://10.0.0.5:9090"), {
16
+ mode: "rosbridge",
17
+ rosbridge: { url: "ws://10.0.0.5:9090" },
18
+ });
19
+ });
20
+ it("local mode-only inherits domainId from global config", () => {
21
+ assert.deepEqual(parseTransportShorthand("local"), { mode: "local" });
22
+ });
23
+ it("local:<n> overrides domainId (integer)", () => {
24
+ assert.deepEqual(parseTransportShorthand("local:7"), {
25
+ mode: "local",
26
+ local: { domainId: 7 },
27
+ });
28
+ });
29
+ it("local:0 is accepted (non-negative integer)", () => {
30
+ assert.deepEqual(parseTransportShorthand("local:0"), {
31
+ mode: "local",
32
+ local: { domainId: 0 },
33
+ });
34
+ });
35
+ it("local:<non-integer> is rejected with an actionable message", () => {
36
+ assert.throws(() => parseTransportShorthand("local:abc"), /non-negative integer/);
37
+ assert.throws(() => parseTransportShorthand("local:1.5"), /non-negative integer/);
38
+ assert.throws(() => parseTransportShorthand("local:-1"), /non-negative integer/);
39
+ });
40
+ it("webrtc:<signalingUrl> overrides only the signaling url", () => {
41
+ assert.deepEqual(parseTransportShorthand("webrtc:wss://sig.example/signal"), {
42
+ mode: "webrtc",
43
+ webrtc: { signalingUrl: "wss://sig.example/signal" },
44
+ });
45
+ });
46
+ it("unknown mode is rejected and the message lists accepted modes", () => {
47
+ assert.throws(() => parseTransportShorthand("bogus"), /Accepted:/);
48
+ assert.throws(() => parseTransportShorthand("bogus:value"), /Accepted:/);
49
+ });
50
+ it("empty input is rejected with usage hint", () => {
51
+ assert.throws(() => parseTransportShorthand(""), /requires a value/);
52
+ assert.throws(() => parseTransportShorthand(" "), /requires a value/);
53
+ });
54
+ it("mode is case-insensitive but value is preserved verbatim", () => {
55
+ assert.deepEqual(parseTransportShorthand("ZENOH:ws://Foo:10000"), {
56
+ mode: "zenoh",
57
+ zenoh: { routerEndpoint: "ws://Foo:10000" },
58
+ });
59
+ });
60
+ it("URLs containing colons are preserved (only first colon splits mode)", () => {
61
+ assert.deepEqual(parseTransportShorthand("zenoh:ws://farm:10000"), {
62
+ mode: "zenoh",
63
+ zenoh: { routerEndpoint: "ws://farm:10000" },
64
+ });
65
+ });
66
+ });
67
+ describe("parseTransportJson", () => {
68
+ it("accepts a well-formed override object", () => {
69
+ const out = parseTransportJson(JSON.stringify({ mode: "zenoh", zenoh: { routerEndpoint: "ws://farm:10000" } }));
70
+ assert.deepEqual(out, {
71
+ mode: "zenoh",
72
+ zenoh: { routerEndpoint: "ws://farm:10000" },
73
+ });
74
+ });
75
+ it("rejects invalid JSON with a helpful message", () => {
76
+ assert.throws(() => parseTransportJson("{not json"), /invalid JSON/);
77
+ });
78
+ it("rejects non-object JSON (array, number, string)", () => {
79
+ assert.throws(() => parseTransportJson("[]"), /must be a JSON object/);
80
+ assert.throws(() => parseTransportJson("42"), /must be a JSON object/);
81
+ assert.throws(() => parseTransportJson("\"zenoh\""), /must be a JSON object/);
82
+ });
83
+ it("rejects JSON missing or with invalid mode", () => {
84
+ assert.throws(() => parseTransportJson("{}"), /missing or invalid "mode"/);
85
+ assert.throws(() => parseTransportJson(JSON.stringify({ mode: "bogus" })), /missing or invalid "mode"/);
86
+ });
87
+ });
88
+ //# sourceMappingURL=transport-shorthand.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport-shorthand.test.js","sourceRoot":"","sources":["../../src/__tests__/transport-shorthand.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * `agenticros robots` — manage the multi-robot fleet config.
3
+ *
4
+ * Subactions:
5
+ * list / show / ls Print configured robots + their online status (default).
6
+ * discover / scan Live-discover robots on the wire, offer to add unknown ones.
7
+ * add [id] Add a robot to config.robots[] (interactive when id omitted).
8
+ * Flags: --name, --namespace, --camera, --default,
9
+ * --transport=<shorthand>, --transport-json=<json>.
10
+ * remove / rm <id> Remove a robot from config.robots[].
11
+ * set-default <id> Mark a robot as the active default.
12
+ * set-transport <id> [shorthand] Apply a per-robot transport override (or use
13
+ * --transport / --transport-json instead of [shorthand]).
14
+ * clear-transport <id> Drop the per-robot transport override so the robot
15
+ * inherits the global transport config.
16
+ *
17
+ * All mutations target `~/.agenticros/config.json`. The legacy single-robot
18
+ * `config.robot` is automatically promoted into `config.robots[]` on the first
19
+ * multi-robot write — see `util/robot-config.ts` for the exact rules.
20
+ *
21
+ * Live discovery is delegated to the `ros2_discover_robots` MCP tool via a
22
+ * subprocess to the agenticros-claude-code server. That keeps this CLI small
23
+ * (no `@agenticros/core` import) AND ensures the user sees the same robots
24
+ * the AI agent sees.
25
+ */
26
+ export interface RobotsOptions {
27
+ action?: string;
28
+ arg?: string;
29
+ /** --name <name> (used by `add` to set the display name non-interactively) */
30
+ name?: string;
31
+ /** --namespace <ns> (used by `add` to set the ROS2 namespace non-interactively) */
32
+ namespace?: string;
33
+ /** --camera <topic> (used by `add` to set the default camera topic non-interactively) */
34
+ camera?: string;
35
+ /** --default (used by `add` to mark the new entry as default non-interactively) */
36
+ default?: boolean;
37
+ /** --kind <kind> (Phase 1.e — sets robot.kind, e.g. "amr" | "arm" | "drone") */
38
+ kind?: string;
39
+ /**
40
+ * --sensors=<csv> (Phase 1.e — sensor tags). Parsed by
41
+ * `parseSensorsCsv`: comma-separated entries, prefix with '!' to set
42
+ * false. Recognized keys: has_realsense, has_lidar, has_arm.
43
+ */
44
+ sensors?: string;
45
+ /**
46
+ * --capabilities=<csv> (Phase 1.e — per-robot capability allowlist).
47
+ * Empty string ("") clears the field so the robot reverts to the
48
+ * gateway-wide registry.
49
+ */
50
+ capabilities?: string;
51
+ /** --transport=<shorthand> (used by `add` / `set-transport` to apply a per-robot override) */
52
+ transport?: string;
53
+ /** --transport-json=<raw json> (used by `add` / `set-transport` for non-shorthand overrides) */
54
+ transportJson?: string;
55
+ }
56
+ export declare function robotsCommand(opts: RobotsOptions): Promise<void>;
57
+ //# sourceMappingURL=robots.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"robots.d.ts","sourceRoot":"","sources":["../../src/commands/robots.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AA6BH,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,8EAA8E;IAC9E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mFAAmF;IACnF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yFAAyF;IACzF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mFAAmF;IACnF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gFAAgF;IAChF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,8FAA8F;IAC9F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gGAAgG;IAChG,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAiED,wBAAsB,aAAa,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BtE"}