agenticros 0.1.18 → 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/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/sync-skill-tools.mjs +67 -10
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Robot config R/W for the AgenticROS CLI.
|
|
3
|
+
*
|
|
4
|
+
* Lives in the CLI so the multi-robot persistence path does NOT pull
|
|
5
|
+
* `@agenticros/core` (and its transport deps) into the published
|
|
6
|
+
* `agenticros` tarball. The shape we read/write is intentionally a
|
|
7
|
+
* subset of `@agenticros/core`'s `AgenticROSConfig.robots`:
|
|
8
|
+
*
|
|
9
|
+
* robots: Array<{
|
|
10
|
+
* id: string;
|
|
11
|
+
* name?: string;
|
|
12
|
+
* namespace?: string;
|
|
13
|
+
* cameraTopic?: string;
|
|
14
|
+
* default?: boolean;
|
|
15
|
+
* }>
|
|
16
|
+
*
|
|
17
|
+
* Backwards compat with the legacy single-robot config:
|
|
18
|
+
* - If `config.robots` is absent/empty AND `config.robot` is set, we
|
|
19
|
+
* "promote" `config.robot` into `robots[0]` on the next write. The
|
|
20
|
+
* legacy `config.robot` field is LEFT in place (harmlessly — the
|
|
21
|
+
* core resolver prefers the explicit array when non-empty) so older
|
|
22
|
+
* adapters that only read `config.robot` keep working.
|
|
23
|
+
* - When the file is missing or empty we treat it as `{}`. Writes
|
|
24
|
+
* create both the file and its directory.
|
|
25
|
+
*
|
|
26
|
+
* All paths route through the CLI's own paths helper so workspace /
|
|
27
|
+
* installed / bundle modes pick up the same `~/.agenticros/config.json`.
|
|
28
|
+
*/
|
|
29
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
30
|
+
import { dirname, join } from "node:path";
|
|
31
|
+
import { getCliPaths } from "./paths.js";
|
|
32
|
+
/** Default value carried over when the legacy `config.robot` is promoted. */
|
|
33
|
+
const DEFAULT_ROBOT_NAME = "Robot";
|
|
34
|
+
export function robotConfigPath() {
|
|
35
|
+
return join(getCliPaths().userDataDir, "config.json");
|
|
36
|
+
}
|
|
37
|
+
/** Parse `~/.agenticros/config.json` to a plain object, or `{}` when absent/bad. */
|
|
38
|
+
export function readConfigObject(path = robotConfigPath()) {
|
|
39
|
+
if (!existsSync(path))
|
|
40
|
+
return {};
|
|
41
|
+
try {
|
|
42
|
+
const parsed = JSON.parse(readFileSync(path, "utf8"));
|
|
43
|
+
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
|
|
44
|
+
return parsed;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
/* fallthrough — return {} on parse error */
|
|
49
|
+
}
|
|
50
|
+
return {};
|
|
51
|
+
}
|
|
52
|
+
/** Write the config object back, creating directories as needed. */
|
|
53
|
+
export function writeConfigObject(obj, path = robotConfigPath()) {
|
|
54
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
55
|
+
writeFileSync(path, `${JSON.stringify(obj, null, 2)}\n`);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Resolve the legacy `config.robot` to a RobotEntry, mirroring the core
|
|
59
|
+
* resolver. `id` falls back to namespace (or "default"), `name` to "Robot".
|
|
60
|
+
* Returns `null` if neither the legacy object nor a usable namespace exists.
|
|
61
|
+
*/
|
|
62
|
+
function legacyToEntry(legacy) {
|
|
63
|
+
if (!legacy || typeof legacy !== "object" || Array.isArray(legacy))
|
|
64
|
+
return null;
|
|
65
|
+
const r = legacy;
|
|
66
|
+
const namespace = typeof r["namespace"] === "string" ? r["namespace"] : "";
|
|
67
|
+
const name = typeof r["name"] === "string" && r["name"].trim() ? r["name"] : DEFAULT_ROBOT_NAME;
|
|
68
|
+
const cameraTopic = typeof r["cameraTopic"] === "string" ? r["cameraTopic"] : "";
|
|
69
|
+
// Synthesise id from namespace, falling back to "default" — same as
|
|
70
|
+
// @agenticros/core's `listRobots()` legacy fallback.
|
|
71
|
+
const id = namespace.trim() || "default";
|
|
72
|
+
return { id, name, namespace, cameraTopic };
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Return the robots[] view the agent would see (explicit array when
|
|
76
|
+
* non-empty, otherwise a one-entry array synthesised from legacy
|
|
77
|
+
* `config.robot`). Read-only — the CLI uses this to render `robots list`
|
|
78
|
+
* without ever needing to import @agenticros/core.
|
|
79
|
+
*/
|
|
80
|
+
export function readRobots(obj = readConfigObject()) {
|
|
81
|
+
const explicit = Array.isArray(obj["robots"]) ? obj["robots"] : [];
|
|
82
|
+
if (explicit.length > 0) {
|
|
83
|
+
const robots = explicit
|
|
84
|
+
.filter((r) => !!r && typeof r === "object" && !Array.isArray(r))
|
|
85
|
+
.map((r) => ({
|
|
86
|
+
id: String(r["id"] ?? ""),
|
|
87
|
+
name: typeof r["name"] === "string" ? r["name"] : undefined,
|
|
88
|
+
namespace: typeof r["namespace"] === "string" ? r["namespace"] : undefined,
|
|
89
|
+
cameraTopic: typeof r["cameraTopic"] === "string" ? r["cameraTopic"] : undefined,
|
|
90
|
+
default: r["default"] === true ? true : undefined,
|
|
91
|
+
kind: typeof r["kind"] === "string" ? r["kind"] : undefined,
|
|
92
|
+
sensors: r["sensors"] && typeof r["sensors"] === "object" && !Array.isArray(r["sensors"])
|
|
93
|
+
? r["sensors"]
|
|
94
|
+
: undefined,
|
|
95
|
+
capabilities: Array.isArray(r["capabilities"])
|
|
96
|
+
? r["capabilities"].filter((c) => typeof c === "string")
|
|
97
|
+
: undefined,
|
|
98
|
+
transport: r["transport"] && typeof r["transport"] === "object" && !Array.isArray(r["transport"])
|
|
99
|
+
? r["transport"]
|
|
100
|
+
: undefined,
|
|
101
|
+
}))
|
|
102
|
+
.filter((r) => r.id.length > 0);
|
|
103
|
+
return { robots, from: "explicit" };
|
|
104
|
+
}
|
|
105
|
+
const legacy = legacyToEntry(obj["robot"]);
|
|
106
|
+
if (legacy)
|
|
107
|
+
return { robots: [legacy], from: "legacy" };
|
|
108
|
+
return { robots: [], from: "none" };
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Compute the active robot id using the same precedence the core
|
|
112
|
+
* resolver does:
|
|
113
|
+
* 1. explicit robots[] entry with `default: true`
|
|
114
|
+
* 2. first entry in robots[] (with legacy fallback)
|
|
115
|
+
* 3. undefined when there are no robots at all
|
|
116
|
+
*/
|
|
117
|
+
export function getActiveRobotId(obj = readConfigObject()) {
|
|
118
|
+
const explicit = Array.isArray(obj["robots"]) ? obj["robots"] : [];
|
|
119
|
+
if (explicit.length > 0) {
|
|
120
|
+
const flagged = explicit.find((r) => r != null &&
|
|
121
|
+
typeof r === "object" &&
|
|
122
|
+
!Array.isArray(r) &&
|
|
123
|
+
r["default"] === true);
|
|
124
|
+
if (flagged && typeof flagged["id"] === "string" && flagged["id"]) {
|
|
125
|
+
return flagged["id"];
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
const { robots } = readRobots(obj);
|
|
129
|
+
return robots[0]?.id;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Add a robot to `config.robots[]`.
|
|
133
|
+
*
|
|
134
|
+
* Promotes the legacy single-robot config on first multi-robot write —
|
|
135
|
+
* `config.robot` is copied as the first entry in the array, and any
|
|
136
|
+
* `default: true` flag we'd set on the new entry is held against that
|
|
137
|
+
* promoted incumbent (it stays the default unless the caller explicitly
|
|
138
|
+
* asks otherwise).
|
|
139
|
+
*
|
|
140
|
+
* Idempotent: re-adding an existing id updates name/namespace/cameraTopic
|
|
141
|
+
* in place but returns `added: false` so the CLI can render the right
|
|
142
|
+
* "already present" message.
|
|
143
|
+
*/
|
|
144
|
+
export function addRobot(entry, opts = {}) {
|
|
145
|
+
const obj = opts.obj ?? readConfigObject();
|
|
146
|
+
const explicit = Array.isArray(obj["robots"]) ? [...obj["robots"]] : [];
|
|
147
|
+
let promotedLegacy = false;
|
|
148
|
+
if (explicit.length === 0) {
|
|
149
|
+
const legacy = legacyToEntry(obj["robot"]);
|
|
150
|
+
if (legacy) {
|
|
151
|
+
// Promote: legacy becomes the (default) first entry. We mark it
|
|
152
|
+
// default so the existing behavior — "the single configured robot
|
|
153
|
+
// is the active one" — is preserved unless the caller of this
|
|
154
|
+
// add explicitly sets the new entry as default below.
|
|
155
|
+
explicit.push({ ...legacy, default: true });
|
|
156
|
+
promotedLegacy = true;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// De-dup by id. If the id already exists, update in place and return
|
|
160
|
+
// added=false. This is what makes `agenticros robots add <id>` a
|
|
161
|
+
// safe idempotent operation.
|
|
162
|
+
const existingIdx = explicit.findIndex((r) => r != null &&
|
|
163
|
+
typeof r === "object" &&
|
|
164
|
+
!Array.isArray(r) &&
|
|
165
|
+
String(r["id"] ?? "") === entry.id);
|
|
166
|
+
const next = {
|
|
167
|
+
id: entry.id,
|
|
168
|
+
name: entry.name ?? DEFAULT_ROBOT_NAME,
|
|
169
|
+
namespace: entry.namespace ?? "",
|
|
170
|
+
cameraTopic: entry.cameraTopic ?? "",
|
|
171
|
+
};
|
|
172
|
+
if (opts.setDefault)
|
|
173
|
+
next["default"] = true;
|
|
174
|
+
// Caller may carry an explicit per-robot transport override into the
|
|
175
|
+
// entry. When omitted on an in-place update we preserve the prior
|
|
176
|
+
// override (see below) so re-running `robots add` without --transport
|
|
177
|
+
// doesn't silently drop a previously-configured override.
|
|
178
|
+
if (entry.transport !== undefined)
|
|
179
|
+
next["transport"] = entry.transport;
|
|
180
|
+
// Same preserve-on-update story for kind / sensors / capabilities —
|
|
181
|
+
// these are sticky Phase 1.e fleet-metadata fields that survive a
|
|
182
|
+
// `robots add <id> --name=...`.
|
|
183
|
+
if (entry.kind !== undefined)
|
|
184
|
+
next["kind"] = entry.kind;
|
|
185
|
+
if (entry.sensors !== undefined)
|
|
186
|
+
next["sensors"] = entry.sensors;
|
|
187
|
+
if (entry.capabilities !== undefined)
|
|
188
|
+
next["capabilities"] = entry.capabilities;
|
|
189
|
+
let added;
|
|
190
|
+
if (existingIdx >= 0) {
|
|
191
|
+
// Update in place. Preserve any `default` already on the entry
|
|
192
|
+
// unless the caller is explicitly setting it.
|
|
193
|
+
const prev = explicit[existingIdx];
|
|
194
|
+
if (opts.setDefault === undefined && prev["default"] === true)
|
|
195
|
+
next["default"] = true;
|
|
196
|
+
if (entry.transport === undefined &&
|
|
197
|
+
prev["transport"] &&
|
|
198
|
+
typeof prev["transport"] === "object" &&
|
|
199
|
+
!Array.isArray(prev["transport"])) {
|
|
200
|
+
next["transport"] = prev["transport"];
|
|
201
|
+
}
|
|
202
|
+
if (entry.kind === undefined && typeof prev["kind"] === "string") {
|
|
203
|
+
next["kind"] = prev["kind"];
|
|
204
|
+
}
|
|
205
|
+
if (entry.sensors === undefined &&
|
|
206
|
+
prev["sensors"] &&
|
|
207
|
+
typeof prev["sensors"] === "object" &&
|
|
208
|
+
!Array.isArray(prev["sensors"])) {
|
|
209
|
+
next["sensors"] = prev["sensors"];
|
|
210
|
+
}
|
|
211
|
+
if (entry.capabilities === undefined && Array.isArray(prev["capabilities"])) {
|
|
212
|
+
next["capabilities"] = prev["capabilities"];
|
|
213
|
+
}
|
|
214
|
+
explicit[existingIdx] = next;
|
|
215
|
+
added = false;
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
explicit.push(next);
|
|
219
|
+
added = true;
|
|
220
|
+
}
|
|
221
|
+
// If the caller is making this new entry the default, strip default
|
|
222
|
+
// off every other entry — only one robot is default at a time.
|
|
223
|
+
if (opts.setDefault) {
|
|
224
|
+
for (let i = 0; i < explicit.length; i++) {
|
|
225
|
+
const r = explicit[i];
|
|
226
|
+
if (i === (existingIdx >= 0 ? existingIdx : explicit.length - 1))
|
|
227
|
+
continue;
|
|
228
|
+
if (r && r["default"] === true) {
|
|
229
|
+
const { default: _drop, ...rest } = r;
|
|
230
|
+
void _drop;
|
|
231
|
+
explicit[i] = rest;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
obj["robots"] = explicit;
|
|
236
|
+
return {
|
|
237
|
+
added,
|
|
238
|
+
promotedLegacy,
|
|
239
|
+
robots: explicit.map((r) => r),
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Remove a robot from `config.robots[]` by id.
|
|
244
|
+
*
|
|
245
|
+
* Returns `removed: false` when the id isn't present. Removing the last
|
|
246
|
+
* entry leaves `robots: []` (which the core resolver then ignores in
|
|
247
|
+
* favour of the legacy `config.robot` fallback — so the deployment
|
|
248
|
+
* keeps working).
|
|
249
|
+
*
|
|
250
|
+
* Idempotent across re-runs.
|
|
251
|
+
*/
|
|
252
|
+
export function removeRobot(id, obj = readConfigObject()) {
|
|
253
|
+
const explicit = Array.isArray(obj["robots"]) ? [...obj["robots"]] : [];
|
|
254
|
+
const idx = explicit.findIndex((r) => r != null &&
|
|
255
|
+
typeof r === "object" &&
|
|
256
|
+
!Array.isArray(r) &&
|
|
257
|
+
String(r["id"] ?? "") === id);
|
|
258
|
+
if (idx < 0) {
|
|
259
|
+
return { removed: false, robots: explicit };
|
|
260
|
+
}
|
|
261
|
+
explicit.splice(idx, 1);
|
|
262
|
+
obj["robots"] = explicit;
|
|
263
|
+
return { removed: true, robots: explicit };
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Set `default: true` on exactly one robot in `config.robots[]`.
|
|
267
|
+
*
|
|
268
|
+
* Auto-promotes the legacy single-robot config first if needed (so
|
|
269
|
+
* marking the first new robot as default doesn't lose the previous
|
|
270
|
+
* incumbent). Throws when the id isn't present after promotion.
|
|
271
|
+
*/
|
|
272
|
+
export function setDefaultRobot(id, obj = readConfigObject()) {
|
|
273
|
+
const explicit = Array.isArray(obj["robots"]) ? [...obj["robots"]] : [];
|
|
274
|
+
let promotedLegacy = false;
|
|
275
|
+
if (explicit.length === 0) {
|
|
276
|
+
const legacy = legacyToEntry(obj["robot"]);
|
|
277
|
+
if (legacy) {
|
|
278
|
+
explicit.push({ ...legacy, default: false });
|
|
279
|
+
promotedLegacy = true;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
const idx = explicit.findIndex((r) => r != null &&
|
|
283
|
+
typeof r === "object" &&
|
|
284
|
+
!Array.isArray(r) &&
|
|
285
|
+
String(r["id"] ?? "") === id);
|
|
286
|
+
if (idx < 0) {
|
|
287
|
+
const known = explicit
|
|
288
|
+
.map((r) => String(r["id"] ?? ""))
|
|
289
|
+
.filter((s) => s.length > 0)
|
|
290
|
+
.join(", ");
|
|
291
|
+
throw new Error(`Unknown robot id "${id}". Known: ${known || "(none — add it first with `agenticros robots add`)"}.`);
|
|
292
|
+
}
|
|
293
|
+
for (let i = 0; i < explicit.length; i++) {
|
|
294
|
+
const r = { ...explicit[i] };
|
|
295
|
+
if (i === idx)
|
|
296
|
+
r["default"] = true;
|
|
297
|
+
else
|
|
298
|
+
delete r["default"];
|
|
299
|
+
explicit[i] = r;
|
|
300
|
+
}
|
|
301
|
+
obj["robots"] = explicit;
|
|
302
|
+
return { robots: explicit, promotedLegacy };
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Apply a per-robot transport override to an existing robot.
|
|
306
|
+
*
|
|
307
|
+
* Auto-promotes legacy `config.robot` into `config.robots[]` so the
|
|
308
|
+
* caller can target the historical single-robot config by its derived
|
|
309
|
+
* id. Throws when the id can't be found after promotion — matching the
|
|
310
|
+
* UX of `setDefaultRobot`.
|
|
311
|
+
*
|
|
312
|
+
* The `override` argument is the plain JSON shape the core's
|
|
313
|
+
* `RobotTransportOverrideSchema` will validate at config-load time. The
|
|
314
|
+
* CLI doesn't validate field shapes — that lives in `@agenticros/core`.
|
|
315
|
+
*/
|
|
316
|
+
export function setTransportForRobot(id, override, obj = readConfigObject()) {
|
|
317
|
+
const explicit = Array.isArray(obj["robots"]) ? [...obj["robots"]] : [];
|
|
318
|
+
let promotedLegacy = false;
|
|
319
|
+
if (explicit.length === 0) {
|
|
320
|
+
const legacy = legacyToEntry(obj["robot"]);
|
|
321
|
+
if (legacy) {
|
|
322
|
+
explicit.push({ ...legacy, default: true });
|
|
323
|
+
promotedLegacy = true;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
const idx = explicit.findIndex((r) => r != null &&
|
|
327
|
+
typeof r === "object" &&
|
|
328
|
+
!Array.isArray(r) &&
|
|
329
|
+
String(r["id"] ?? "") === id);
|
|
330
|
+
if (idx < 0) {
|
|
331
|
+
const known = explicit
|
|
332
|
+
.map((r) => String(r["id"] ?? ""))
|
|
333
|
+
.filter((s) => s.length > 0)
|
|
334
|
+
.join(", ");
|
|
335
|
+
throw new Error(`Unknown robot id "${id}". Known: ${known || "(none — add it first with `agenticros robots add`)"}.`);
|
|
336
|
+
}
|
|
337
|
+
explicit[idx] = { ...explicit[idx], transport: override };
|
|
338
|
+
obj["robots"] = explicit;
|
|
339
|
+
return { robots: explicit, promotedLegacy };
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Remove a per-robot transport override (so the robot inherits the
|
|
343
|
+
* global transport config). Idempotent — returns `cleared: false` when
|
|
344
|
+
* the robot didn't have an override to begin with. Throws on unknown id
|
|
345
|
+
* (we'd rather complain loudly than silently no-op against a typo).
|
|
346
|
+
*/
|
|
347
|
+
export function clearTransportForRobot(id, obj = readConfigObject()) {
|
|
348
|
+
const explicit = Array.isArray(obj["robots"]) ? [...obj["robots"]] : [];
|
|
349
|
+
let promotedLegacy = false;
|
|
350
|
+
if (explicit.length === 0) {
|
|
351
|
+
const legacy = legacyToEntry(obj["robot"]);
|
|
352
|
+
if (legacy) {
|
|
353
|
+
explicit.push({ ...legacy, default: true });
|
|
354
|
+
promotedLegacy = true;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
const idx = explicit.findIndex((r) => r != null &&
|
|
358
|
+
typeof r === "object" &&
|
|
359
|
+
!Array.isArray(r) &&
|
|
360
|
+
String(r["id"] ?? "") === id);
|
|
361
|
+
if (idx < 0) {
|
|
362
|
+
const known = explicit
|
|
363
|
+
.map((r) => String(r["id"] ?? ""))
|
|
364
|
+
.filter((s) => s.length > 0)
|
|
365
|
+
.join(", ");
|
|
366
|
+
throw new Error(`Unknown robot id "${id}". Known: ${known || "(none — add it first with `agenticros robots add`)"}.`);
|
|
367
|
+
}
|
|
368
|
+
const prev = { ...explicit[idx] };
|
|
369
|
+
const hadOverride = prev["transport"] !== undefined;
|
|
370
|
+
delete prev["transport"];
|
|
371
|
+
explicit[idx] = prev;
|
|
372
|
+
obj["robots"] = explicit;
|
|
373
|
+
return { cleared: hadOverride, robots: explicit, promotedLegacy };
|
|
374
|
+
}
|
|
375
|
+
//# sourceMappingURL=robot-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"robot-config.js","sourceRoot":"","sources":["../../src/util/robot-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA0CzC,6EAA6E;AAC7E,MAAM,kBAAkB,GAAG,OAAO,CAAC;AAEnC,MAAM,UAAU,eAAe;IAC7B,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;AACxD,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,gBAAgB,CAAC,IAAI,GAAG,eAAe,EAAE;IACvD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAY,CAAC;QACjE,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACnE,OAAO,MAAiC,CAAC;QAC3C,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,4CAA4C;IAC9C,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,iBAAiB,CAAC,GAA4B,EAAE,IAAI,GAAG,eAAe,EAAE;IACtF,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,aAAa,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AAC3D,CAAC;AAED;;;;GAIG;AACH,SAAS,aAAa,CAAC,MAAe;IACpC,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IAChF,MAAM,CAAC,GAAG,MAAiC,CAAC;IAC5C,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,WAAW,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3E,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC;IAChG,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,aAAa,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACjF,oEAAoE;IACpE,qDAAqD;IACrD,MAAM,EAAE,GAAG,SAAS,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC;IACzC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;AAC9C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CACxB,MAA+B,gBAAgB,EAAE;IAEjD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,QAAQ,CAAe,CAAC,CAAC,CAAC,EAAE,CAAC;IAClF,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,QAAQ;aACpB,MAAM,CAAC,CAAC,CAAC,EAAgC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;aAC9F,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACX,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACzB,IAAI,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;YAC3D,SAAS,EAAE,OAAO,CAAC,CAAC,WAAW,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS;YAC1E,WAAW,EAAE,OAAO,CAAC,CAAC,aAAa,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS;YAChF,OAAO,EAAE,CAAC,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;YACjD,IAAI,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;YAC3D,OAAO,EACL,CAAC,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,CAAC,SAAS,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;gBAC9E,CAAC,CAAE,CAAC,CAAC,SAAS,CAAkB;gBAChC,CAAC,CAAC,SAAS;YACf,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;gBAC5C,CAAC,CAAE,CAAC,CAAC,cAAc,CAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;gBACpF,CAAC,CAAC,SAAS;YACb,SAAS,EACP,CAAC,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,CAAC,WAAW,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;gBACpF,CAAC,CAAE,CAAC,CAAC,WAAW,CAA6B;gBAC7C,CAAC,CAAC,SAAS;SAChB,CAAC,CAAC;aACF,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAClC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IACtC,CAAC;IAED,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3C,IAAI,MAAM;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IACxD,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AACtC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAA+B,gBAAgB,EAAE;IAChF,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,QAAQ,CAAe,CAAC,CAAC,CAAC,EAAE,CAAC;IAClF,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAC3B,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,IAAI,IAAI;YACT,OAAO,CAAC,KAAK,QAAQ;YACrB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YAChB,CAA6B,CAAC,SAAS,CAAC,KAAK,IAAI,CACd,CAAC;QACzC,IAAI,OAAO,IAAI,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAClE,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IACD,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IACnC,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AACvB,CAAC;AAWD;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,QAAQ,CACtB,KAAiB,EACjB,OAAgE,EAAE;IAElE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,gBAAgB,EAAE,CAAC;IAC3C,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAI,GAAG,CAAC,QAAQ,CAAe,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEvF,IAAI,cAAc,GAAG,KAAK,CAAC;IAC3B,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QAC3C,IAAI,MAAM,EAAE,CAAC;YACX,gEAAgE;YAChE,kEAAkE;YAClE,8DAA8D;YAC9D,sDAAsD;YACtD,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5C,cAAc,GAAG,IAAI,CAAC;QACxB,CAAC;IACH,CAAC;IAED,qEAAqE;IACrE,iEAAiE;IACjE,6BAA6B;IAC7B,MAAM,WAAW,GAAG,QAAQ,CAAC,SAAS,CACpC,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,IAAI,IAAI;QACT,OAAO,CAAC,KAAK,QAAQ;QACrB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QACjB,MAAM,CAAE,CAA6B,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,KAAK,CAAC,EAAE,CAClE,CAAC;IAEF,MAAM,IAAI,GAA4B;QACpC,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,kBAAkB;QACtC,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,EAAE;QAChC,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,EAAE;KACrC,CAAC;IACF,IAAI,IAAI,CAAC,UAAU;QAAE,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;IAC5C,qEAAqE;IACrE,kEAAkE;IAClE,sEAAsE;IACtE,0DAA0D;IAC1D,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS;QAAE,IAAI,CAAC,WAAW,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC;IACvE,oEAAoE;IACpE,kEAAkE;IAClE,gCAAgC;IAChC,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;QAAE,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC;IACxD,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS;QAAE,IAAI,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC;IACjE,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS;QAAE,IAAI,CAAC,cAAc,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC;IAEhF,IAAI,KAAc,CAAC;IACnB,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;QACrB,+DAA+D;QAC/D,8CAA8C;QAC9C,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,CAA4B,CAAC;QAC9D,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI;YAAE,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;QACtF,IACE,KAAK,CAAC,SAAS,KAAK,SAAS;YAC7B,IAAI,CAAC,WAAW,CAAC;YACjB,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,QAAQ;YACrC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,EACjC,CAAC;YACD,IAAI,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,QAAQ,EAAE,CAAC;YACjE,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;QACD,IACE,KAAK,CAAC,OAAO,KAAK,SAAS;YAC3B,IAAI,CAAC,SAAS,CAAC;YACf,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,QAAQ;YACnC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAC/B,CAAC;YACD,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;QACpC,CAAC;QACD,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC;YAC5E,IAAI,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC;QAC9C,CAAC;QACD,QAAQ,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC;QAC7B,KAAK,GAAG,KAAK,CAAC;IAChB,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,KAAK,GAAG,IAAI,CAAC;IACf,CAAC;IAED,oEAAoE;IACpE,+DAA+D;IAC/D,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAA4B,CAAC;YACjD,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;gBAAE,SAAS;YAC3E,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC/B,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC;gBACtC,KAAK,KAAK,CAAC;gBACX,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC;IAED,GAAG,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC;IACzB,OAAO;QACL,KAAK;QACL,cAAc;QACd,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAe,CAAC;KAC7C,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,WAAW,CACzB,EAAU,EACV,MAA+B,gBAAgB,EAAE;IAEjD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAI,GAAG,CAAC,QAAQ,CAAe,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACvF,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,CAC5B,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,IAAI,IAAI;QACT,OAAO,CAAC,KAAK,QAAQ;QACrB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QACjB,MAAM,CAAE,CAA6B,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,CAC5D,CAAC;IACF,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;QACZ,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAwB,EAAE,CAAC;IAC9D,CAAC;IACD,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACxB,GAAG,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC;IACzB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAwB,EAAE,CAAC;AAC7D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAC7B,EAAU,EACV,MAA+B,gBAAgB,EAAE;IAEjD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAI,GAAG,CAAC,QAAQ,CAAe,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACvF,IAAI,cAAc,GAAG,KAAK,CAAC;IAE3B,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QAC3C,IAAI,MAAM,EAAE,CAAC;YACX,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YAC7C,cAAc,GAAG,IAAI,CAAC;QACxB,CAAC;IACH,CAAC;IAED,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,CAC5B,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,IAAI,IAAI;QACT,OAAO,CAAC,KAAK,QAAQ;QACrB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QACjB,MAAM,CAAE,CAA6B,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,CAC5D,CAAC;IAEF,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;QACZ,MAAM,KAAK,GAAG,QAAQ;aACnB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAE,CAA6B,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;aAC9D,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;aAC3B,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,IAAI,KAAK,CACb,qBAAqB,EAAE,aAAa,KAAK,IAAI,oDAAoD,GAAG,CACrG,CAAC;IACJ,CAAC;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,CAAC,GAAG,EAAE,GAAI,QAAQ,CAAC,CAAC,CAA6B,EAAE,CAAC;QAC1D,IAAI,CAAC,KAAK,GAAG;YAAE,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;;YAC9B,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC;QACzB,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAClB,CAAC;IAED,GAAG,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC;IACzB,OAAO,EAAE,MAAM,EAAE,QAAwB,EAAE,cAAc,EAAE,CAAC;AAC9D,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,oBAAoB,CAClC,EAAU,EACV,QAAiC,EACjC,MAA+B,gBAAgB,EAAE;IAEjD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAI,GAAG,CAAC,QAAQ,CAAe,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACvF,IAAI,cAAc,GAAG,KAAK,CAAC;IAE3B,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QAC3C,IAAI,MAAM,EAAE,CAAC;YACX,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5C,cAAc,GAAG,IAAI,CAAC;QACxB,CAAC;IACH,CAAC;IAED,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,CAC5B,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,IAAI,IAAI;QACT,OAAO,CAAC,KAAK,QAAQ;QACrB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QACjB,MAAM,CAAE,CAA6B,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,CAC5D,CAAC;IAEF,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;QACZ,MAAM,KAAK,GAAG,QAAQ;aACnB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAE,CAA6B,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;aAC9D,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;aAC3B,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,IAAI,KAAK,CACb,qBAAqB,EAAE,aAAa,KAAK,IAAI,oDAAoD,GAAG,CACrG,CAAC;IACJ,CAAC;IAED,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,GAAI,QAAQ,CAAC,GAAG,CAA6B,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;IACvF,GAAG,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC;IACzB,OAAO,EAAE,MAAM,EAAE,QAAwB,EAAE,cAAc,EAAE,CAAC;AAC9D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CACpC,EAAU,EACV,MAA+B,gBAAgB,EAAE;IAEjD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAI,GAAG,CAAC,QAAQ,CAAe,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACvF,IAAI,cAAc,GAAG,KAAK,CAAC;IAE3B,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QAC3C,IAAI,MAAM,EAAE,CAAC;YACX,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5C,cAAc,GAAG,IAAI,CAAC;QACxB,CAAC;IACH,CAAC;IAED,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,CAC5B,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,IAAI,IAAI;QACT,OAAO,CAAC,KAAK,QAAQ;QACrB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QACjB,MAAM,CAAE,CAA6B,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,CAC5D,CAAC;IAEF,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;QACZ,MAAM,KAAK,GAAG,QAAQ;aACnB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAE,CAA6B,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;aAC9D,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;aAC3B,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,IAAI,KAAK,CACb,qBAAqB,EAAE,aAAa,KAAK,IAAI,oDAAoD,GAAG,CACrG,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,EAAE,GAAI,QAAQ,CAAC,GAAG,CAA6B,EAAE,CAAC;IAC/D,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,SAAS,CAAC;IACpD,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC;IACzB,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IACrB,GAAG,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC;IACzB,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,QAAwB,EAAE,cAAc,EAAE,CAAC;AACpF,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse a `--transport=<shorthand>` flag into the JSON-shaped object the
|
|
3
|
+
* core resolver expects under `config.robots[i].transport`.
|
|
4
|
+
*
|
|
5
|
+
* Shorthand grammar (most-common-case-first):
|
|
6
|
+
*
|
|
7
|
+
* <mode>[:<primary-value>]
|
|
8
|
+
*
|
|
9
|
+
* - `zenoh` ⇒ inherit everything from global config.zenoh
|
|
10
|
+
* - `zenoh:<routerEndpoint>` ⇒ override the router endpoint only
|
|
11
|
+
* - `rosbridge` ⇒ inherit global rosbridge config
|
|
12
|
+
* - `rosbridge:<url>` ⇒ override rosbridge url
|
|
13
|
+
* - `local` ⇒ inherit global local config
|
|
14
|
+
* - `local:<domainId>` ⇒ override DDS domain id (integer ≥ 0)
|
|
15
|
+
* - `webrtc` ⇒ inherit global webrtc config
|
|
16
|
+
* - `webrtc:<signalingUrl>` ⇒ override signaling url
|
|
17
|
+
*
|
|
18
|
+
* Anything more elaborate (multiple sub-fields, custom iceServers, etc.)
|
|
19
|
+
* should use `--transport-json=...` which is passed straight through to
|
|
20
|
+
* the core Zod schema. The CLI deliberately doesn't model the full set
|
|
21
|
+
* of sub-fields — that would couple this layer to every transport
|
|
22
|
+
* adapter's settings shape. The shorthand exists for the 95% of users
|
|
23
|
+
* who only want to point one robot at a different router.
|
|
24
|
+
*
|
|
25
|
+
* Errors are intentionally specific — they tell the user the exact
|
|
26
|
+
* accepted forms so they can recover without hunting through docs.
|
|
27
|
+
*/
|
|
28
|
+
export type TransportOverrideJson = {
|
|
29
|
+
mode: "zenoh";
|
|
30
|
+
zenoh?: {
|
|
31
|
+
routerEndpoint?: string;
|
|
32
|
+
};
|
|
33
|
+
} | {
|
|
34
|
+
mode: "rosbridge";
|
|
35
|
+
rosbridge?: {
|
|
36
|
+
url?: string;
|
|
37
|
+
};
|
|
38
|
+
} | {
|
|
39
|
+
mode: "local";
|
|
40
|
+
local?: {
|
|
41
|
+
domainId?: number;
|
|
42
|
+
};
|
|
43
|
+
} | {
|
|
44
|
+
mode: "webrtc";
|
|
45
|
+
webrtc?: {
|
|
46
|
+
signalingUrl?: string;
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Parse a `--transport=<shorthand>` value. Throws with an actionable
|
|
51
|
+
* message on malformed input. The returned object is a plain JSON
|
|
52
|
+
* structure that the core `RobotTransportOverrideSchema` will then
|
|
53
|
+
* validate at config-load time, so this parser doesn't have to repeat
|
|
54
|
+
* field-level validation — it only needs to produce well-shaped JSON.
|
|
55
|
+
*/
|
|
56
|
+
export declare function parseTransportShorthand(raw: string): TransportOverrideJson;
|
|
57
|
+
/**
|
|
58
|
+
* Validate a raw JSON string passed via `--transport-json`. Returns the
|
|
59
|
+
* parsed object on success; throws a friendly error on parse failure or
|
|
60
|
+
* when the JSON doesn't look at all like a transport override (missing
|
|
61
|
+
* `mode`). Field-level validation is deferred to the core Zod schema at
|
|
62
|
+
* config-load time — this is just a smoke check so an obviously-wrong
|
|
63
|
+
* JSON string doesn't slip into the file.
|
|
64
|
+
*/
|
|
65
|
+
export declare function parseTransportJson(raw: string): Record<string, unknown>;
|
|
66
|
+
//# sourceMappingURL=transport-shorthand.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport-shorthand.d.ts","sourceRoot":"","sources":["../../src/util/transport-shorthand.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,MAAM,MAAM,qBAAqB,GAC7B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GACtD;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,SAAS,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC;AAS3D;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,qBAAqB,CA2C1E;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAoBvE"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse a `--transport=<shorthand>` flag into the JSON-shaped object the
|
|
3
|
+
* core resolver expects under `config.robots[i].transport`.
|
|
4
|
+
*
|
|
5
|
+
* Shorthand grammar (most-common-case-first):
|
|
6
|
+
*
|
|
7
|
+
* <mode>[:<primary-value>]
|
|
8
|
+
*
|
|
9
|
+
* - `zenoh` ⇒ inherit everything from global config.zenoh
|
|
10
|
+
* - `zenoh:<routerEndpoint>` ⇒ override the router endpoint only
|
|
11
|
+
* - `rosbridge` ⇒ inherit global rosbridge config
|
|
12
|
+
* - `rosbridge:<url>` ⇒ override rosbridge url
|
|
13
|
+
* - `local` ⇒ inherit global local config
|
|
14
|
+
* - `local:<domainId>` ⇒ override DDS domain id (integer ≥ 0)
|
|
15
|
+
* - `webrtc` ⇒ inherit global webrtc config
|
|
16
|
+
* - `webrtc:<signalingUrl>` ⇒ override signaling url
|
|
17
|
+
*
|
|
18
|
+
* Anything more elaborate (multiple sub-fields, custom iceServers, etc.)
|
|
19
|
+
* should use `--transport-json=...` which is passed straight through to
|
|
20
|
+
* the core Zod schema. The CLI deliberately doesn't model the full set
|
|
21
|
+
* of sub-fields — that would couple this layer to every transport
|
|
22
|
+
* adapter's settings shape. The shorthand exists for the 95% of users
|
|
23
|
+
* who only want to point one robot at a different router.
|
|
24
|
+
*
|
|
25
|
+
* Errors are intentionally specific — they tell the user the exact
|
|
26
|
+
* accepted forms so they can recover without hunting through docs.
|
|
27
|
+
*/
|
|
28
|
+
const VALID_MODES = ["zenoh", "rosbridge", "local", "webrtc"];
|
|
29
|
+
function isValidMode(s) {
|
|
30
|
+
return VALID_MODES.includes(s);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Parse a `--transport=<shorthand>` value. Throws with an actionable
|
|
34
|
+
* message on malformed input. The returned object is a plain JSON
|
|
35
|
+
* structure that the core `RobotTransportOverrideSchema` will then
|
|
36
|
+
* validate at config-load time, so this parser doesn't have to repeat
|
|
37
|
+
* field-level validation — it only needs to produce well-shaped JSON.
|
|
38
|
+
*/
|
|
39
|
+
export function parseTransportShorthand(raw) {
|
|
40
|
+
const input = raw.trim();
|
|
41
|
+
if (!input) {
|
|
42
|
+
throw new Error("--transport requires a value. Examples: --transport=zenoh, --transport=zenoh:ws://farm:10000, --transport=local:1");
|
|
43
|
+
}
|
|
44
|
+
const colon = input.indexOf(":");
|
|
45
|
+
const modeRaw = (colon < 0 ? input : input.slice(0, colon)).trim().toLowerCase();
|
|
46
|
+
const valueRaw = colon < 0 ? "" : input.slice(colon + 1).trim();
|
|
47
|
+
if (!isValidMode(modeRaw)) {
|
|
48
|
+
throw new Error(`Unknown transport mode "${modeRaw}". Accepted: ${VALID_MODES.join(", ")}. ` +
|
|
49
|
+
"Example: --transport=zenoh:ws://farm:10000");
|
|
50
|
+
}
|
|
51
|
+
switch (modeRaw) {
|
|
52
|
+
case "zenoh":
|
|
53
|
+
return valueRaw
|
|
54
|
+
? { mode: "zenoh", zenoh: { routerEndpoint: valueRaw } }
|
|
55
|
+
: { mode: "zenoh" };
|
|
56
|
+
case "rosbridge":
|
|
57
|
+
return valueRaw
|
|
58
|
+
? { mode: "rosbridge", rosbridge: { url: valueRaw } }
|
|
59
|
+
: { mode: "rosbridge" };
|
|
60
|
+
case "local": {
|
|
61
|
+
if (!valueRaw)
|
|
62
|
+
return { mode: "local" };
|
|
63
|
+
const n = Number(valueRaw);
|
|
64
|
+
if (!Number.isInteger(n) || n < 0) {
|
|
65
|
+
throw new Error(`--transport=local:<domainId> requires a non-negative integer (got "${valueRaw}"). ` +
|
|
66
|
+
"Example: --transport=local:1");
|
|
67
|
+
}
|
|
68
|
+
return { mode: "local", local: { domainId: n } };
|
|
69
|
+
}
|
|
70
|
+
case "webrtc":
|
|
71
|
+
return valueRaw
|
|
72
|
+
? { mode: "webrtc", webrtc: { signalingUrl: valueRaw } }
|
|
73
|
+
: { mode: "webrtc" };
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Validate a raw JSON string passed via `--transport-json`. Returns the
|
|
78
|
+
* parsed object on success; throws a friendly error on parse failure or
|
|
79
|
+
* when the JSON doesn't look at all like a transport override (missing
|
|
80
|
+
* `mode`). Field-level validation is deferred to the core Zod schema at
|
|
81
|
+
* config-load time — this is just a smoke check so an obviously-wrong
|
|
82
|
+
* JSON string doesn't slip into the file.
|
|
83
|
+
*/
|
|
84
|
+
export function parseTransportJson(raw) {
|
|
85
|
+
let obj;
|
|
86
|
+
try {
|
|
87
|
+
obj = JSON.parse(raw);
|
|
88
|
+
}
|
|
89
|
+
catch (e) {
|
|
90
|
+
throw new Error(`--transport-json: invalid JSON (${e instanceof Error ? e.message : String(e)}). ` +
|
|
91
|
+
'Example: --transport-json=\'{"mode":"zenoh","zenoh":{"routerEndpoint":"ws://farm:10000"}}\'');
|
|
92
|
+
}
|
|
93
|
+
if (!obj || typeof obj !== "object" || Array.isArray(obj)) {
|
|
94
|
+
throw new Error("--transport-json: must be a JSON object, e.g. {\"mode\":\"zenoh\"}");
|
|
95
|
+
}
|
|
96
|
+
const mode = obj["mode"];
|
|
97
|
+
if (typeof mode !== "string" || !isValidMode(mode)) {
|
|
98
|
+
throw new Error(`--transport-json: missing or invalid "mode" (expected one of ${VALID_MODES.join(", ")}).`);
|
|
99
|
+
}
|
|
100
|
+
return obj;
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=transport-shorthand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport-shorthand.js","sourceRoot":"","sources":["../../src/util/transport-shorthand.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agenticros",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.19",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "AgenticROS - agentic AI for ROS-powered robots. Single CLI to launch real-robot or simulated demos, manage configuration, and inspect status.",
|
|
6
6
|
"keywords": [
|
|
@@ -53,6 +53,7 @@
|
|
|
53
53
|
"scripts": {
|
|
54
54
|
"build": "tsc",
|
|
55
55
|
"typecheck": "tsc --noEmit",
|
|
56
|
+
"test": "node --test --test-force-exit \"dist/__tests__/*.test.js\"",
|
|
56
57
|
"clean": "rm -rf dist runtime tsconfig.tsbuildinfo",
|
|
57
58
|
"pack:runtime": "node ../../scripts/pack-runtime.mjs",
|
|
58
59
|
"size:check": "node ../../scripts/check-cli-tarball-size.mjs",
|
package/runtime/BUNDLE.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"packedAt": "2026-06-
|
|
2
|
+
"packedAt": "2026-06-10T22:14:39.896Z",
|
|
3
3
|
"repo": "https://github.com/PlaiPin/agenticros",
|
|
4
4
|
"note": "This directory is a snapshot of the agenticros monorepo source. `agenticros init` will copy it to ~/agenticros and run pnpm install + colcon build there.",
|
|
5
5
|
"layout": {
|
package/runtime/README.md
CHANGED
|
@@ -384,6 +384,10 @@ Per-skill behaviour lives under `config.skills.<skillId>` (e.g. `config.skills.f
|
|
|
384
384
|
|
|
385
385
|
A skill is a Node package with `"agenticrosSkill": true` in `package.json` and a `registerSkill(api, config, context)` export from `main`. See **[docs/skills.md](docs/skills.md)** for the full contract and **[agenticros-skill-followme](https://github.com/your-org/agenticros-skill-followme)** as a reference template.
|
|
386
386
|
|
|
387
|
+
## Strategy & vision
|
|
388
|
+
|
|
389
|
+
Where AgenticROS is going next — the four-phase roadmap covering capability registry + skill chaining + multi-robot fleet discovery, the `skills.agenticros.com` marketplace with declarative auto-fetch, spatial memory, and cross-vendor agent collaboration via ACP / A2A: **[docs/strategy-ai-agents-plus-ros.md](docs/strategy-ai-agents-plus-ros.md)**.
|
|
390
|
+
|
|
387
391
|
## License
|
|
388
392
|
|
|
389
393
|
Apache-2.0
|
package/runtime/package.json
CHANGED
|
@@ -9,9 +9,14 @@
|
|
|
9
9
|
"clean": "pnpm -r exec rm -rf dist tsconfig.tsbuildinfo",
|
|
10
10
|
"lint": "pnpm -r lint",
|
|
11
11
|
"typecheck": "pnpm -r typecheck",
|
|
12
|
+
"test": "pnpm test:scripts && pnpm -r --workspace-concurrency 1 --if-present test",
|
|
13
|
+
"test:scripts": "node --test scripts/__tests__/*.test.mjs",
|
|
12
14
|
"mcp:kill": "pkill -f 'node packages/agenticros-claude-code/dist/index.js' || true",
|
|
13
15
|
"sync-skill-tools": "node scripts/sync-skill-tools.mjs",
|
|
14
|
-
"sync-skill-tools:dry": "node scripts/sync-skill-tools.mjs --dry-run --verbose"
|
|
16
|
+
"sync-skill-tools:dry": "node scripts/sync-skill-tools.mjs --dry-run --verbose",
|
|
17
|
+
"refresh:skills": "node scripts/refresh-skill-deps.mjs",
|
|
18
|
+
"refresh:skills:dry": "node scripts/refresh-skill-deps.mjs --dry-run --verbose",
|
|
19
|
+
"deploy:plugin": "bash scripts/setup_gateway_plugin.sh --skip-build --no-systemd --no-restart"
|
|
15
20
|
},
|
|
16
21
|
"engines": {
|
|
17
22
|
"node": ">=20.0.0",
|
|
@@ -15,6 +15,12 @@
|
|
|
15
15
|
"ros2_param_get",
|
|
16
16
|
"ros2_param_set",
|
|
17
17
|
"ros2_list_topics",
|
|
18
|
+
"ros2_list_capabilities",
|
|
19
|
+
"ros2_list_robots",
|
|
20
|
+
"ros2_discover_robots",
|
|
21
|
+
"ros2_find_robots_for",
|
|
22
|
+
"run_mission",
|
|
23
|
+
"mission_cancel",
|
|
18
24
|
"ros2_camera_snapshot",
|
|
19
25
|
"ros2_depth_distance",
|
|
20
26
|
"memory_remember",
|