@agenticros/core 0.5.0 → 0.7.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 (73) hide show
  1. package/README.md +13 -3
  2. package/dist/capabilities.d.ts.map +1 -1
  3. package/dist/capabilities.js +37 -4
  4. package/dist/capabilities.js.map +1 -1
  5. package/dist/capability-schema.d.ts +201 -0
  6. package/dist/capability-schema.d.ts.map +1 -0
  7. package/dist/capability-schema.js +50 -0
  8. package/dist/capability-schema.js.map +1 -0
  9. package/dist/config.d.ts +16 -0
  10. package/dist/config.d.ts.map +1 -1
  11. package/dist/config.js +23 -0
  12. package/dist/config.js.map +1 -1
  13. package/dist/discoverable-capabilities.d.ts +47 -0
  14. package/dist/discoverable-capabilities.d.ts.map +1 -0
  15. package/dist/discoverable-capabilities.js +127 -0
  16. package/dist/discoverable-capabilities.js.map +1 -0
  17. package/dist/discovery.d.ts +7 -3
  18. package/dist/discovery.d.ts.map +1 -1
  19. package/dist/discovery.js +19 -3
  20. package/dist/discovery.js.map +1 -1
  21. package/dist/external-capability.d.ts +33 -0
  22. package/dist/external-capability.d.ts.map +1 -0
  23. package/dist/external-capability.js +196 -0
  24. package/dist/external-capability.js.map +1 -0
  25. package/dist/fleet-config.d.ts +32 -0
  26. package/dist/fleet-config.d.ts.map +1 -0
  27. package/dist/fleet-config.js +80 -0
  28. package/dist/fleet-config.js.map +1 -0
  29. package/dist/heartbeat.d.ts +70 -0
  30. package/dist/heartbeat.d.ts.map +1 -0
  31. package/dist/heartbeat.js +124 -0
  32. package/dist/heartbeat.js.map +1 -0
  33. package/dist/index.d.ts +16 -2
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +8 -1
  36. package/dist/index.js.map +1 -1
  37. package/dist/memory/mem0/provider.d.ts.map +1 -1
  38. package/dist/memory/mem0/provider.js +6 -3
  39. package/dist/memory/mem0/provider.js.map +1 -1
  40. package/dist/mission-bindings.d.ts +50 -0
  41. package/dist/mission-bindings.d.ts.map +1 -0
  42. package/dist/mission-bindings.js +157 -0
  43. package/dist/mission-bindings.js.map +1 -0
  44. package/dist/mission-registry.d.ts +17 -2
  45. package/dist/mission-registry.d.ts.map +1 -1
  46. package/dist/mission-registry.js +31 -2
  47. package/dist/mission-registry.js.map +1 -1
  48. package/dist/mission.d.ts +20 -7
  49. package/dist/mission.d.ts.map +1 -1
  50. package/dist/mission.js +42 -2
  51. package/dist/mission.js.map +1 -1
  52. package/dist/robots.d.ts.map +1 -1
  53. package/dist/robots.js +6 -2
  54. package/dist/robots.js.map +1 -1
  55. package/dist/skill-refs.d.ts +80 -0
  56. package/dist/skill-refs.d.ts.map +1 -0
  57. package/dist/skill-refs.js +253 -0
  58. package/dist/skill-refs.js.map +1 -0
  59. package/dist/transport/factory.d.ts.map +1 -1
  60. package/dist/transport/factory.js +11 -2
  61. package/dist/transport/factory.js.map +1 -1
  62. package/dist/transport/rosbridge/client.d.ts.map +1 -1
  63. package/dist/transport/rosbridge/client.js +7 -0
  64. package/dist/transport/rosbridge/client.js.map +1 -1
  65. package/dist/transport/webrtc/node-datachannel-loader.d.ts +12 -0
  66. package/dist/transport/webrtc/node-datachannel-loader.d.ts.map +1 -0
  67. package/dist/transport/webrtc/node-datachannel-loader.js +27 -0
  68. package/dist/transport/webrtc/node-datachannel-loader.js.map +1 -0
  69. package/dist/transport/webrtc/transport.d.ts +1 -0
  70. package/dist/transport/webrtc/transport.d.ts.map +1 -1
  71. package/dist/transport/webrtc/transport.js +5 -1
  72. package/dist/transport/webrtc/transport.js.map +1 -1
  73. package/package.json +2 -10
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Discoverable marketplace capabilities — list verbs from skills.agenticros.com
3
+ * that are not yet installed locally, so agents can propose installs.
4
+ */
5
+ import { listAllCapabilities, } from "./capabilities.js";
6
+ import { skillsApiBase } from "./skill-refs.js";
7
+ function installRefOf(s) {
8
+ if (s.marketplaceRef && typeof s.marketplaceRef === "string") {
9
+ return s.marketplaceRef.toLowerCase();
10
+ }
11
+ if (s.ownerLogin && s.skillSlug) {
12
+ return `${s.ownerLogin}/${s.skillSlug}`.toLowerCase();
13
+ }
14
+ if (s.slug && s.slug.includes("/"))
15
+ return s.slug.toLowerCase();
16
+ return null;
17
+ }
18
+ function fieldMap(raw) {
19
+ if (!raw || typeof raw !== "object" || Array.isArray(raw))
20
+ return undefined;
21
+ const out = {};
22
+ for (const [k, v] of Object.entries(raw)) {
23
+ if (typeof v === "string") {
24
+ out[k] = { type: v };
25
+ }
26
+ else if (v && typeof v === "object") {
27
+ const o = v;
28
+ out[k] = {
29
+ type: typeof o.type === "string" ? o.type : "unknown",
30
+ description: typeof o.description === "string" ? o.description : undefined,
31
+ optional: o.optional === true,
32
+ };
33
+ }
34
+ }
35
+ return Object.keys(out).length ? out : undefined;
36
+ }
37
+ function normalizeMarketplaceCap(raw, installRef, packageName) {
38
+ const id = typeof raw.id === "string" ? raw.id : null;
39
+ const verb = typeof raw.verb === "string" ? raw.verb : null;
40
+ const description = typeof raw.description === "string" ? raw.description : id ? `Marketplace capability ${id}` : null;
41
+ if (!id || !verb || !description)
42
+ return null;
43
+ const source = {
44
+ kind: "skill",
45
+ skillId: installRef.split("/")[1] ?? installRef,
46
+ package: packageName,
47
+ };
48
+ return {
49
+ id,
50
+ verb,
51
+ description,
52
+ inputs: fieldMap(raw.inputs),
53
+ outputs: fieldMap(raw.outputs),
54
+ interruptible: raw.interruptible === true ? true : raw.interruptible === false ? false : undefined,
55
+ blocks_base: raw.blocks_base === true ? true : undefined,
56
+ source,
57
+ discoverable: true,
58
+ installed: false,
59
+ install_ref: installRef,
60
+ };
61
+ }
62
+ export async function fetchMarketplaceSkills(opts = {}) {
63
+ const base = skillsApiBase(opts.apiBase);
64
+ const limit = opts.limit ?? 50;
65
+ const u = new URL(`${base}/skills`);
66
+ u.searchParams.set("limit", String(limit));
67
+ u.searchParams.set("sort", "popular");
68
+ const res = await fetch(u.toString(), { headers: { Accept: "application/json" } });
69
+ if (!res.ok) {
70
+ throw new Error(`Marketplace list ${res.status}`);
71
+ }
72
+ const body = (await res.json());
73
+ return body.skills ?? [];
74
+ }
75
+ /**
76
+ * Merge installed capabilities with discoverable marketplace capabilities
77
+ * (ids not already present locally). Soft-fails offline.
78
+ */
79
+ export async function listCapabilitiesWithDiscoverable(config, opts = {}) {
80
+ const installed = listAllCapabilities(config).map((c) => {
81
+ const listed = {
82
+ ...c,
83
+ installed: true,
84
+ discoverable: false,
85
+ };
86
+ return listed;
87
+ });
88
+ if (opts.includeDiscoverable === false) {
89
+ return installed;
90
+ }
91
+ const installedIds = new Set(installed.map((c) => c.id));
92
+ try {
93
+ const skills = await fetchMarketplaceSkills({
94
+ apiBase: opts.apiBase,
95
+ limit: opts.marketplaceLimit ?? 50,
96
+ });
97
+ const extra = [];
98
+ const seenDiscoverable = new Set();
99
+ for (const s of skills) {
100
+ if (s.visibility && s.visibility !== "public")
101
+ continue;
102
+ const ref = installRefOf(s);
103
+ if (!ref)
104
+ continue;
105
+ const caps = Array.isArray(s.capabilities) ? s.capabilities : [];
106
+ for (const raw of caps) {
107
+ if (!raw || typeof raw !== "object")
108
+ continue;
109
+ const id = typeof raw.id === "string" ? raw.id : null;
110
+ if (!id || installedIds.has(id) || seenDiscoverable.has(id))
111
+ continue;
112
+ const norm = normalizeMarketplaceCap(raw, ref, s.slug ?? ref);
113
+ if (!norm)
114
+ continue;
115
+ seenDiscoverable.add(id);
116
+ extra.push(norm);
117
+ }
118
+ }
119
+ return [...installed, ...extra];
120
+ }
121
+ catch (e) {
122
+ if (opts.softFail === false)
123
+ throw e;
124
+ return installed;
125
+ }
126
+ }
127
+ //# sourceMappingURL=discoverable-capabilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discoverable-capabilities.js","sourceRoot":"","sources":["../src/discoverable-capabilities.ts"],"names":[],"mappings":"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"}
@@ -91,9 +91,13 @@ export declare function effectiveCmdVelNamespace(robotNamespace: string): string
91
91
  /**
92
92
  * Find every robot-shaped namespace in a topic list.
93
93
  *
94
- * Detection rule: any `/<seg>/cmd_vel` topic implies a robot with
95
- * namespace `<seg>`. The unnamespaced `/cmd_vel` topic registers the
96
- * empty namespace (id=""). Topic count under each namespace is
94
+ * Detection rules (either is enough):
95
+ * 1. `/<seg>/cmd_vel` — classic mobile-base signal
96
+ * 2. `/<seg>/agenticros/robot_info` — Phase 1.d heartbeat (arms/drones
97
+ * without cmd_vel still show up)
98
+ *
99
+ * The unnamespaced `/cmd_vel` / `/agenticros/robot_info` topics register
100
+ * the empty namespace (id=""). Topic count under each namespace is
97
101
  * accumulated so consumers can rank by liveness.
98
102
  *
99
103
  * The returned `DetectedRobot.configuredRobotId` is always `null` here —
@@ -1 +1 @@
1
- {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEtD,+CAA+C;AAC/C,MAAM,WAAW,aAAa;IAC5B,qFAAqF;IACrF,EAAE,EAAE,MAAM,CAAC;IACX,0EAA0E;IAC1E,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;OAMG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED,kCAAkC;AAClC,MAAM,WAAW,oBAAoB;IACnC,gFAAgF;IAChF,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,gEAAgE;IAChE,iBAAiB,EAAE,aAAa,EAAE,CAAC;IACnC,oEAAoE;IACpE,kBAAkB,EAAE,aAAa,EAAE,CAAC;IACpC,8EAA8E;IAC9E,gBAAgB,EAAE,aAAa,EAAE,CAAC;IAClC,qDAAqD;IACrD,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAKvE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,aAAa,EAAE,CAiC3E;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,SAAS,EAAE,EACnB,MAAM,EAAE,gBAAgB,GACvB,oBAAoB,CAiCtB"}
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEtD,+CAA+C;AAC/C,MAAM,WAAW,aAAa;IAC5B,qFAAqF;IACrF,EAAE,EAAE,MAAM,CAAC;IACX,0EAA0E;IAC1E,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;OAMG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED,kCAAkC;AAClC,MAAM,WAAW,oBAAoB;IACnC,gFAAgF;IAChF,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,gEAAgE;IAChE,iBAAiB,EAAE,aAAa,EAAE,CAAC;IACnC,oEAAoE;IACpE,kBAAkB,EAAE,aAAa,EAAE,CAAC;IACpC,8EAA8E;IAC9E,gBAAgB,EAAE,aAAa,EAAE,CAAC;IAClC,qDAAqD;IACrD,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAKvE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,aAAa,EAAE,CA+C3E;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,SAAS,EAAE,EACnB,MAAM,EAAE,gBAAgB,GACvB,oBAAoB,CAiCtB"}
package/dist/discovery.js CHANGED
@@ -61,9 +61,13 @@ export function effectiveCmdVelNamespace(robotNamespace) {
61
61
  /**
62
62
  * Find every robot-shaped namespace in a topic list.
63
63
  *
64
- * Detection rule: any `/<seg>/cmd_vel` topic implies a robot with
65
- * namespace `<seg>`. The unnamespaced `/cmd_vel` topic registers the
66
- * empty namespace (id=""). Topic count under each namespace is
64
+ * Detection rules (either is enough):
65
+ * 1. `/<seg>/cmd_vel` — classic mobile-base signal
66
+ * 2. `/<seg>/agenticros/robot_info` — Phase 1.d heartbeat (arms/drones
67
+ * without cmd_vel still show up)
68
+ *
69
+ * The unnamespaced `/cmd_vel` / `/agenticros/robot_info` topics register
70
+ * the empty namespace (id=""). Topic count under each namespace is
67
71
  * accumulated so consumers can rank by liveness.
68
72
  *
69
73
  * The returned `DetectedRobot.configuredRobotId` is always `null` here —
@@ -84,6 +88,18 @@ export function detectRobotsFromTopics(topics) {
84
88
  else if (t.name === "/cmd_vel" && !byNs.has("")) {
85
89
  byNs.set("", { cmdVelTopic: "/cmd_vel", topicCount: 0 });
86
90
  }
91
+ // Heartbeat topic — covers robots that don't publish cmd_vel.
92
+ const hb = t.name.match(/^\/([^/]+)\/agenticros\/robot_info$/);
93
+ if (hb) {
94
+ const ns = hb[1];
95
+ if (!byNs.has(ns)) {
96
+ byNs.set(ns, { cmdVelTopic: `/${ns}/cmd_vel`, topicCount: 0 });
97
+ }
98
+ }
99
+ else if ((t.name === "/agenticros/robot_info" || t.name === "agenticros/robot_info") &&
100
+ !byNs.has("")) {
101
+ byNs.set("", { cmdVelTopic: "/cmd_vel", topicCount: 0 });
102
+ }
87
103
  }
88
104
  // Count topics under each detected namespace. Empty-namespace robots
89
105
  // (default) intentionally don't accumulate counts — every topic in
@@ -1 +1 @@
1
- {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * External ROS-node capability executor — Phase 1 completion.
3
+ *
4
+ * Dispatches `implementation.kind: "external_ros_node"` capabilities via
5
+ * the existing RosTransport action / service / topic APIs. The manifest
6
+ * `launch` field is metadata only (operator-owned bringup) — the gateway
7
+ * never shells out to `ros2 launch` in v1.
8
+ */
9
+ import type { Capability, CapabilityImplementation } from "./capabilities.js";
10
+ import type { RosTransport } from "./transport/transport.js";
11
+ export interface ExecuteExternalOptions {
12
+ /** Robot namespace for topic/action/service prefixing. */
13
+ namespace?: string;
14
+ /** Optional timeout for subscribe_once (ms). */
15
+ timeoutMs?: number;
16
+ }
17
+ export interface ExecuteExternalResult {
18
+ text: string;
19
+ outputs?: Record<string, unknown>;
20
+ isError?: boolean;
21
+ }
22
+ /**
23
+ * Map navigate_to-style inputs into a Nav2 NavigateToPose goal when the
24
+ * action type looks like NavigateToPose and inputs have x/y.
25
+ */
26
+ export declare function buildExternalGoal(impl: Extract<CapabilityImplementation, {
27
+ kind: "external_ros_node";
28
+ }>, inputs: Record<string, unknown>): Record<string, unknown>;
29
+ /**
30
+ * Execute an external_ros_node capability against a connected transport.
31
+ */
32
+ export declare function executeExternalCapability(capability: Capability, inputs: Record<string, unknown>, transport: RosTransport, options?: ExecuteExternalOptions): Promise<ExecuteExternalResult>;
33
+ //# sourceMappingURL=external-capability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-capability.d.ts","sourceRoot":"","sources":["../src/external-capability.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC9E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAG7D,MAAM,WAAW,sBAAsB;IACrC,0DAA0D;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAeD;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,OAAO,CAAC,wBAAwB,EAAE;IAAE,IAAI,EAAE,mBAAmB,CAAA;CAAE,CAAC,EACtE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAkCzB;AAED;;GAEG;AACH,wBAAsB,yBAAyB,CAC7C,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,SAAS,EAAE,YAAY,EACvB,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,qBAAqB,CAAC,CA6IhC"}
@@ -0,0 +1,196 @@
1
+ /**
2
+ * External ROS-node capability executor — Phase 1 completion.
3
+ *
4
+ * Dispatches `implementation.kind: "external_ros_node"` capabilities via
5
+ * the existing RosTransport action / service / topic APIs. The manifest
6
+ * `launch` field is metadata only (operator-owned bringup) — the gateway
7
+ * never shells out to `ros2 launch` in v1.
8
+ */
9
+ import { toNamespacedTopic } from "./topic-utils.js";
10
+ function isExternalImpl(impl) {
11
+ return impl?.kind === "external_ros_node";
12
+ }
13
+ function resolveName(name, namespace) {
14
+ const trimmed = name.trim();
15
+ if (!trimmed)
16
+ return trimmed;
17
+ if (!namespace?.trim())
18
+ return trimmed.startsWith("/") ? trimmed : `/${trimmed}`;
19
+ return toNamespacedTopic(namespace, trimmed);
20
+ }
21
+ /**
22
+ * Map navigate_to-style inputs into a Nav2 NavigateToPose goal when the
23
+ * action type looks like NavigateToPose and inputs have x/y.
24
+ */
25
+ export function buildExternalGoal(impl, inputs) {
26
+ // Explicit goal / request / message wins.
27
+ if (inputs.goal && typeof inputs.goal === "object") {
28
+ return inputs.goal;
29
+ }
30
+ if (inputs.request && typeof inputs.request === "object") {
31
+ return inputs.request;
32
+ }
33
+ if (inputs.message && typeof inputs.message === "object") {
34
+ return inputs.message;
35
+ }
36
+ const msgType = (impl.msg_type ?? "").toLowerCase();
37
+ if (msgType.includes("navigatetopose") || impl.action?.includes("navigate_to_pose")) {
38
+ const x = Number(inputs.x ?? 0) || 0;
39
+ const y = Number(inputs.y ?? 0) || 0;
40
+ const yaw = Number(inputs.yaw ?? 0) || 0;
41
+ const qz = Math.sin(yaw / 2);
42
+ const qw = Math.cos(yaw / 2);
43
+ const frame = typeof inputs.frame_id === "string" ? inputs.frame_id : "map";
44
+ return {
45
+ pose: {
46
+ header: { frame_id: frame },
47
+ pose: {
48
+ position: { x, y, z: 0 },
49
+ orientation: { x: 0, y: 0, z: qz, w: qw },
50
+ },
51
+ },
52
+ };
53
+ }
54
+ // Passthrough remaining inputs (minus robot_id).
55
+ const { robot_id: _rid, ...rest } = inputs;
56
+ return rest;
57
+ }
58
+ /**
59
+ * Execute an external_ros_node capability against a connected transport.
60
+ */
61
+ export async function executeExternalCapability(capability, inputs, transport, options = {}) {
62
+ const impl = capability.implementation;
63
+ if (!isExternalImpl(impl)) {
64
+ return {
65
+ text: `Capability "${capability.id}" is not an external_ros_node implementation.`,
66
+ isError: true,
67
+ };
68
+ }
69
+ const ns = options.namespace;
70
+ try {
71
+ if (impl.action) {
72
+ const action = resolveName(impl.action, ns);
73
+ const actionType = impl.msg_type ?? "";
74
+ if (!actionType) {
75
+ return {
76
+ text: `Capability "${capability.id}" external action requires implementation.msg_type.`,
77
+ isError: true,
78
+ };
79
+ }
80
+ const args = buildExternalGoal(impl, inputs);
81
+ const result = await transport.sendActionGoal({
82
+ action,
83
+ actionType,
84
+ args,
85
+ });
86
+ const outputs = {
87
+ success: result.result,
88
+ ...(result.values ?? {}),
89
+ launch_hint: impl.launch ?? null,
90
+ package_hint: impl.package ?? null,
91
+ };
92
+ return {
93
+ text: JSON.stringify(outputs),
94
+ outputs,
95
+ isError: !result.result,
96
+ };
97
+ }
98
+ if (impl.service) {
99
+ const service = resolveName(impl.service, ns);
100
+ const serviceType = impl.msg_type ?? "";
101
+ if (!serviceType) {
102
+ return {
103
+ text: `Capability "${capability.id}" external service requires implementation.msg_type.`,
104
+ isError: true,
105
+ };
106
+ }
107
+ const args = buildExternalGoal(impl, inputs);
108
+ const result = await transport.callService({
109
+ service,
110
+ type: serviceType,
111
+ args,
112
+ });
113
+ const outputs = {
114
+ success: result.result,
115
+ ...(result.values ?? {}),
116
+ launch_hint: impl.launch ?? null,
117
+ };
118
+ return {
119
+ text: JSON.stringify(outputs),
120
+ outputs,
121
+ isError: !result.result,
122
+ };
123
+ }
124
+ if (impl.topic) {
125
+ const topicName = typeof inputs.topic === "string" && inputs.topic.trim()
126
+ ? inputs.topic.trim()
127
+ : impl.topic;
128
+ const topic = resolveName(topicName, ns);
129
+ const msgType = impl.msg_type ?? "";
130
+ // Detection / sensor skills default to subscribe_once; publishers must pass mode: "publish".
131
+ const mode = typeof inputs.mode === "string"
132
+ ? inputs.mode
133
+ : "subscribe";
134
+ if (mode === "subscribe" || mode === "subscribe_once") {
135
+ const timeout = options.timeoutMs ??
136
+ (typeof inputs.timeout_ms === "number"
137
+ ? inputs.timeout_ms
138
+ : typeof inputs.timeout === "number"
139
+ ? inputs.timeout
140
+ : 5000);
141
+ const msg = await new Promise((resolve, reject) => {
142
+ let settled = false;
143
+ const timer = setTimeout(() => {
144
+ if (settled)
145
+ return;
146
+ settled = true;
147
+ try {
148
+ sub.unsubscribe();
149
+ }
150
+ catch {
151
+ /* ignore */
152
+ }
153
+ reject(new Error(`Timed out waiting for message on ${topic} after ${timeout}ms`));
154
+ }, timeout);
155
+ const sub = transport.subscribe({ topic, type: msgType || "std_msgs/msg/String" }, (message) => {
156
+ if (settled)
157
+ return;
158
+ settled = true;
159
+ clearTimeout(timer);
160
+ try {
161
+ sub.unsubscribe();
162
+ }
163
+ catch {
164
+ /* ignore */
165
+ }
166
+ resolve(message);
167
+ });
168
+ });
169
+ const outputs = { message: msg, topic };
170
+ return { text: JSON.stringify(outputs), outputs };
171
+ }
172
+ if (!msgType) {
173
+ return {
174
+ text: `Capability "${capability.id}" external topic publish requires implementation.msg_type.`,
175
+ isError: true,
176
+ };
177
+ }
178
+ const message = buildExternalGoal(impl, inputs);
179
+ await transport.publish({ topic, type: msgType, msg: message });
180
+ const outputs = { published: true, topic, launch_hint: impl.launch ?? null };
181
+ return { text: JSON.stringify(outputs), outputs };
182
+ }
183
+ return {
184
+ text: `Capability "${capability.id}" external_ros_node has no action, service, or topic. ` +
185
+ `Bringup hint: ${impl.launch ?? impl.package ?? "(none)"}.`,
186
+ isError: true,
187
+ };
188
+ }
189
+ catch (err) {
190
+ return {
191
+ text: err instanceof Error ? err.message : String(err),
192
+ isError: true,
193
+ };
194
+ }
195
+ }
196
+ //# sourceMappingURL=external-capability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-capability.js","sourceRoot":"","sources":["../src/external-capability.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Static fleet file — Phase 1.d hybrid discovery.
3
+ *
4
+ * Precedence: `AGENTICROS_FLEET_PATH` → `~/.agenticros/fleet.json` →
5
+ * `config.robots[]` (via listRobots). When a fleet file exists and
6
+ * parses as a non-empty robot array (or `{ robots: [...] }`), it wins.
7
+ */
8
+ import type { AgenticROSConfig } from "./config.js";
9
+ export declare const DEFAULT_FLEET_FILENAME = "fleet.json";
10
+ /** Resolve the fleet file path (env override or default under ~/.agenticros). */
11
+ export declare function resolveFleetPath(env?: NodeJS.ProcessEnv): string;
12
+ export interface FleetFileResult {
13
+ /** Absolute path that was checked. */
14
+ path: string;
15
+ /** True when the file exists and was used. */
16
+ used: boolean;
17
+ /** Parsed robot entries (empty when unused / invalid). */
18
+ robots: NonNullable<AgenticROSConfig["robots"]>;
19
+ /** Human-readable error when the file exists but failed to parse. */
20
+ error?: string;
21
+ }
22
+ /**
23
+ * Load `fleet.json` if present. Does not throw on missing file.
24
+ * Invalid JSON / schema → `used: false` with `error` set so callers can warn.
25
+ */
26
+ export declare function loadFleetFile(path?: string): FleetFileResult;
27
+ /**
28
+ * Return a config view where `robots` comes from fleet.json when present.
29
+ * Does not mutate the input config object.
30
+ */
31
+ export declare function applyFleetOverride(config: AgenticROSConfig, fleetPath?: string): AgenticROSConfig;
32
+ //# sourceMappingURL=fleet-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fleet-config.d.ts","sourceRoot":"","sources":["../src/fleet-config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGpD,eAAO,MAAM,sBAAsB,eAAe,CAAC;AAEnD,iFAAiF;AACjF,wBAAgB,gBAAgB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAI7E;AAED,MAAM,WAAW,eAAe;IAC9B,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,IAAI,EAAE,OAAO,CAAC;IACd,0DAA0D;IAC1D,MAAM,EAAE,WAAW,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;IAChD,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,eAAe,CA0C5D;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,gBAAgB,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAIjG"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Static fleet file — Phase 1.d hybrid discovery.
3
+ *
4
+ * Precedence: `AGENTICROS_FLEET_PATH` → `~/.agenticros/fleet.json` →
5
+ * `config.robots[]` (via listRobots). When a fleet file exists and
6
+ * parses as a non-empty robot array (or `{ robots: [...] }`), it wins.
7
+ */
8
+ import { existsSync, readFileSync } from "node:fs";
9
+ import { homedir } from "node:os";
10
+ import { join } from "node:path";
11
+ import { AgenticROSConfigSchema } from "./config.js";
12
+ export const DEFAULT_FLEET_FILENAME = "fleet.json";
13
+ /** Resolve the fleet file path (env override or default under ~/.agenticros). */
14
+ export function resolveFleetPath(env = process.env) {
15
+ const override = env.AGENTICROS_FLEET_PATH?.trim();
16
+ if (override)
17
+ return override;
18
+ return join(homedir(), ".agenticros", DEFAULT_FLEET_FILENAME);
19
+ }
20
+ /**
21
+ * Load `fleet.json` if present. Does not throw on missing file.
22
+ * Invalid JSON / schema → `used: false` with `error` set so callers can warn.
23
+ */
24
+ export function loadFleetFile(path) {
25
+ const fleetPath = path ?? resolveFleetPath();
26
+ if (!existsSync(fleetPath)) {
27
+ return { path: fleetPath, used: false, robots: [] };
28
+ }
29
+ try {
30
+ const raw = JSON.parse(readFileSync(fleetPath, "utf8"));
31
+ let robotsRaw;
32
+ if (Array.isArray(raw)) {
33
+ robotsRaw = raw;
34
+ }
35
+ else if (raw && typeof raw === "object" && Array.isArray(raw.robots)) {
36
+ robotsRaw = raw.robots;
37
+ }
38
+ else {
39
+ return {
40
+ path: fleetPath,
41
+ used: false,
42
+ robots: [],
43
+ error: "fleet.json must be an array of robots or { robots: [...] }",
44
+ };
45
+ }
46
+ const parsed = AgenticROSConfigSchema.pick({ robots: true }).safeParse({ robots: robotsRaw });
47
+ if (!parsed.success) {
48
+ return {
49
+ path: fleetPath,
50
+ used: false,
51
+ robots: [],
52
+ error: parsed.error.message,
53
+ };
54
+ }
55
+ const robots = parsed.data.robots ?? [];
56
+ if (robots.length === 0) {
57
+ return { path: fleetPath, used: false, robots: [] };
58
+ }
59
+ return { path: fleetPath, used: true, robots };
60
+ }
61
+ catch (err) {
62
+ return {
63
+ path: fleetPath,
64
+ used: false,
65
+ robots: [],
66
+ error: err instanceof Error ? err.message : String(err),
67
+ };
68
+ }
69
+ }
70
+ /**
71
+ * Return a config view where `robots` comes from fleet.json when present.
72
+ * Does not mutate the input config object.
73
+ */
74
+ export function applyFleetOverride(config, fleetPath) {
75
+ const fleet = loadFleetFile(fleetPath);
76
+ if (!fleet.used)
77
+ return config;
78
+ return { ...config, robots: fleet.robots };
79
+ }
80
+ //# sourceMappingURL=fleet-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fleet-config.js","sourceRoot":"","sources":["../src/fleet-config.ts"],"names":[],"mappings":"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"}