agenticros 0.1.17 → 0.1.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/robot-config.test.d.ts +2 -0
- package/dist/__tests__/robot-config.test.d.ts.map +1 -0
- package/dist/__tests__/robot-config.test.js +374 -0
- package/dist/__tests__/robot-config.test.js.map +1 -0
- package/dist/__tests__/transport-shorthand.test.d.ts +2 -0
- package/dist/__tests__/transport-shorthand.test.d.ts.map +1 -0
- package/dist/__tests__/transport-shorthand.test.js +88 -0
- package/dist/__tests__/transport-shorthand.test.js.map +1 -0
- package/dist/commands/down.d.ts.map +1 -1
- package/dist/commands/down.js +55 -3
- package/dist/commands/down.js.map +1 -1
- package/dist/commands/robots.d.ts +57 -0
- package/dist/commands/robots.d.ts.map +1 -0
- package/dist/commands/robots.js +678 -0
- package/dist/commands/robots.js.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -1
- package/dist/util/mcp-discovery.d.ts +57 -0
- package/dist/util/mcp-discovery.d.ts.map +1 -0
- package/dist/util/mcp-discovery.js +153 -0
- package/dist/util/mcp-discovery.js.map +1 -0
- package/dist/util/robot-config.d.ts +167 -0
- package/dist/util/robot-config.d.ts.map +1 -0
- package/dist/util/robot-config.js +375 -0
- package/dist/util/robot-config.js.map +1 -0
- package/dist/util/transport-shorthand.d.ts +66 -0
- package/dist/util/transport-shorthand.d.ts.map +1 -0
- package/dist/util/transport-shorthand.js +102 -0
- package/dist/util/transport-shorthand.js.map +1 -0
- package/package.json +2 -1
- package/runtime/BUNDLE.json +1 -1
- package/runtime/README.md +4 -0
- package/runtime/package.json +6 -1
- package/runtime/packages/agenticros/openclaw.plugin.json +6 -0
- package/runtime/packages/agenticros/package.json +2 -1
- package/runtime/packages/agenticros/src/__tests__/capabilities-plugin.test.ts +568 -0
- package/runtime/packages/agenticros/src/mission-registry.ts +22 -0
- package/runtime/packages/agenticros/src/service.ts +120 -2
- package/runtime/packages/agenticros/src/skill-loader.ts +9 -1
- package/runtime/packages/agenticros/src/tools/_robot-helpers.ts +68 -0
- package/runtime/packages/agenticros/src/tools/index.ts +49 -9
- package/runtime/packages/agenticros/src/tools/mission-cancel.ts +70 -0
- package/runtime/packages/agenticros/src/tools/ros2-action.ts +11 -4
- package/runtime/packages/agenticros/src/tools/ros2-camera.ts +10 -4
- package/runtime/packages/agenticros/src/tools/ros2-capabilities.ts +63 -0
- package/runtime/packages/agenticros/src/tools/ros2-depth-distance.ts +11 -4
- package/runtime/packages/agenticros/src/tools/ros2-discover.ts +65 -0
- package/runtime/packages/agenticros/src/tools/ros2-find-robots-for.ts +128 -0
- package/runtime/packages/agenticros/src/tools/ros2-mission.ts +311 -0
- package/runtime/packages/agenticros/src/tools/ros2-param.ts +20 -7
- package/runtime/packages/agenticros/src/tools/ros2-publish.ts +15 -8
- package/runtime/packages/agenticros/src/tools/ros2-robots.ts +52 -0
- package/runtime/packages/agenticros/src/tools/ros2-service.ts +11 -4
- package/runtime/packages/agenticros/src/tools/ros2-subscribe.ts +11 -4
- package/runtime/packages/agenticros-claude-code/package.json +2 -1
- package/runtime/packages/agenticros-claude-code/src/__tests__/capabilities-mcp.test.ts +964 -0
- package/runtime/packages/agenticros-claude-code/src/__tests__/follow-me-registry.test.ts +119 -0
- package/runtime/packages/agenticros-claude-code/src/find-object/find-object.ts +7 -6
- package/runtime/packages/agenticros-claude-code/src/follow-me/depth-loop.ts +41 -9
- package/runtime/packages/agenticros-claude-code/src/follow-me/loop.ts +40 -11
- package/runtime/packages/agenticros-claude-code/src/index.ts +5 -5
- package/runtime/packages/agenticros-claude-code/src/mission-registry.ts +21 -0
- package/runtime/packages/agenticros-claude-code/src/tools.ts +668 -56
- package/runtime/packages/agenticros-claude-code/src/transport.ts +43 -43
- package/runtime/packages/agenticros-gemini/package.json +1 -0
- package/runtime/packages/agenticros-gemini/src/__tests__/mission-cancel.test.ts +197 -0
- package/runtime/packages/agenticros-gemini/src/__tests__/mission-transcripts.test.ts +178 -0
- package/runtime/packages/agenticros-gemini/src/tools.ts +504 -21
- package/runtime/packages/agenticros-gemini/src/transport.ts +40 -43
- package/runtime/packages/core/package.json +1 -1
- package/runtime/packages/core/src/__tests__/capabilities.test.ts +261 -0
- package/runtime/packages/core/src/__tests__/discovery.test.ts +206 -0
- package/runtime/packages/core/src/__tests__/find-robots-for.test.ts +258 -0
- package/runtime/packages/core/src/__tests__/mission-cancel-transcript.test.ts +371 -0
- package/runtime/packages/core/src/__tests__/mission-transcript-sink.test.ts +189 -0
- package/runtime/packages/core/src/__tests__/mission.test.ts +501 -0
- package/runtime/packages/core/src/__tests__/planner.test.ts +279 -0
- package/runtime/packages/core/src/__tests__/robots.test.ts +406 -0
- package/runtime/packages/core/src/__tests__/topic-utils.test.ts +105 -0
- package/runtime/packages/core/src/__tests__/transport-pool.test.ts +295 -0
- package/runtime/packages/core/src/capabilities.ts +340 -0
- package/runtime/packages/core/src/config.ts +220 -38
- package/runtime/packages/core/src/discovery.ts +193 -0
- package/runtime/packages/core/src/find-robots-for.ts +164 -0
- package/runtime/packages/core/src/index.ts +67 -1
- package/runtime/packages/core/src/mission-registry.ts +142 -0
- package/runtime/packages/core/src/mission-transcript-sink.ts +81 -0
- package/runtime/packages/core/src/mission.ts +574 -0
- package/runtime/packages/core/src/planner/index.ts +564 -0
- package/runtime/packages/core/src/robots.ts +282 -0
- package/runtime/packages/core/src/topic-utils.ts +47 -9
- package/runtime/packages/core/src/transport-pool.ts +171 -0
- package/runtime/ros2_ws/src/agenticros_discovery/agenticros_discovery/discovery_node.py +108 -13
- package/runtime/ros2_ws/src/agenticros_msgs/CMakeLists.txt +1 -0
- package/runtime/ros2_ws/src/agenticros_msgs/msg/RobotInfo.msg +44 -0
- package/runtime/scripts/__tests__/refresh-skill-deps.test.mjs +222 -0
- package/runtime/scripts/refresh-skill-deps.mjs +381 -0
- package/runtime/scripts/setup_gateway_plugin.sh +32 -5
- package/runtime/scripts/start_demo.sh +26 -3
- package/runtime/scripts/sync-skill-tools.mjs +67 -10
|
@@ -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 @@
|
|
|
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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"down.d.ts","sourceRoot":"","sources":["../../src/commands/down.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,qEAAqE;IACrE,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAID,wBAAsB,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"down.d.ts","sourceRoot":"","sources":["../../src/commands/down.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,qEAAqE;IACrE,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAID,wBAAsB,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAgDlE"}
|
package/dist/commands/down.js
CHANGED
|
@@ -29,9 +29,24 @@ export async function downCommand(opts) {
|
|
|
29
29
|
clearPid(name);
|
|
30
30
|
});
|
|
31
31
|
}
|
|
32
|
-
// Mop up
|
|
33
|
-
//
|
|
34
|
-
|
|
32
|
+
// Mop up stray subprocesses that don't have a pidfile we own. Two common
|
|
33
|
+
// sources of orphans:
|
|
34
|
+
// - `ros2 launch realsense2_camera rs_launch.py` writes the launch parent's
|
|
35
|
+
// PID to the pidfile, but the actual `realsense2_camera_node` is a
|
|
36
|
+
// detached child. If the launch parent dies (or start_demo.sh's "already
|
|
37
|
+
// running, skipping" path runs), the node keeps running with its IR
|
|
38
|
+
// projector lit and is invisible to our pidfile bookkeeping.
|
|
39
|
+
// - Sim children (gz sim, rviz, parameter_bridge) inherit termination from
|
|
40
|
+
// ros2 launch in most cases but not always.
|
|
41
|
+
// We pkill them all by name. -f matches the full command line; SIGTERM first,
|
|
42
|
+
// then a brief grace period, then SIGKILL anything still hanging on.
|
|
43
|
+
if (!opts.keepCamera) {
|
|
44
|
+
await pkillAndWait([
|
|
45
|
+
"realsense2_camera_node",
|
|
46
|
+
"ros2 launch realsense2_camera",
|
|
47
|
+
]);
|
|
48
|
+
}
|
|
49
|
+
await pkillAndWait(["gz sim", "ign gazebo", "rviz2", "parameter_bridge"]);
|
|
35
50
|
if (opts.stopGateway) {
|
|
36
51
|
await stopGatewayService();
|
|
37
52
|
}
|
|
@@ -72,6 +87,43 @@ async function tryKill(patterns) {
|
|
|
72
87
|
}
|
|
73
88
|
}
|
|
74
89
|
}
|
|
90
|
+
/**
|
|
91
|
+
* Send SIGTERM to anything matching `patterns`, wait for the kernel to schedule
|
|
92
|
+
* the exits, then SIGKILL any survivors. Crucially, this is what actually turns
|
|
93
|
+
* the RealSense IR projector off: SIGTERM gives the realsense2_camera_node a
|
|
94
|
+
* chance to release the USB device cleanly, and the SIGKILL fallback handles
|
|
95
|
+
* the case where it's wedged.
|
|
96
|
+
*/
|
|
97
|
+
async function pkillAndWait(patterns, termGraceMs = 1500) {
|
|
98
|
+
// Phase 1: gentle termination.
|
|
99
|
+
let matchedAny = false;
|
|
100
|
+
for (const pattern of patterns) {
|
|
101
|
+
try {
|
|
102
|
+
const { exitCode } = await execa("pkill", ["-TERM", "-f", pattern], {
|
|
103
|
+
reject: false,
|
|
104
|
+
});
|
|
105
|
+
// pkill exits 0 when at least one process matched, 1 when nothing did.
|
|
106
|
+
if (exitCode === 0)
|
|
107
|
+
matchedAny = true;
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
// pkill missing — nothing to do.
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
if (!matchedAny)
|
|
114
|
+
return;
|
|
115
|
+
// Phase 2: brief wait so well-behaved processes can exit cleanly.
|
|
116
|
+
await new Promise((r) => setTimeout(r, termGraceMs));
|
|
117
|
+
// Phase 3: SIGKILL anything that's still around.
|
|
118
|
+
for (const pattern of patterns) {
|
|
119
|
+
try {
|
|
120
|
+
await execa("pkill", ["-KILL", "-f", pattern], { reject: false });
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
// ignore
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
75
127
|
async function stopGatewayService() {
|
|
76
128
|
try {
|
|
77
129
|
const { exitCode } = await execa("systemctl", ["--user", "is-active", "openclaw-gateway.service"], { reject: false });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"down.js","sourceRoot":"","sources":["../../src/commands/down.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAE9B,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAuB,MAAM,oBAAoB,CAAC;AACxF,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAQ7E,MAAM,SAAS,GAAqB,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;AAE1E,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAiB;IACjD,MAAM,CAAC,4BAA4B,CAAC,CAAC;IAErC,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACzC,IAAI,CAAC,kCAAkC,CAAC,CAAC;YACzC,SAAS;QACX,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,SAAS;QAChC,UAAU,GAAG,IAAI,CAAC;QAClB,MAAM,WAAW,CAAC,YAAY,IAAI,EAAE,EAAE,KAAK,IAAI,EAAE;YAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YACrC,IAAI,GAAG,KAAK,SAAS;gBAAE,OAAO;YAC9B,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;YACvB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACjB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,8EAA8E;IAC9E,
|
|
1
|
+
{"version":3,"file":"down.js","sourceRoot":"","sources":["../../src/commands/down.ts"],"names":[],"mappings":"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"}
|