@agenticros/core 0.8.4 → 0.8.5
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/capabilities.js +1 -1
- package/dist/capabilities.js.map +1 -1
- package/dist/config.d.ts +185 -35
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +29 -8
- package/dist/config.js.map +1 -1
- package/dist/external-capability.d.ts +3 -0
- package/dist/external-capability.d.ts.map +1 -1
- package/dist/external-capability.js +10 -0
- package/dist/external-capability.js.map +1 -1
- package/dist/find-robots-for.d.ts.map +1 -1
- package/dist/find-robots-for.js +15 -5
- package/dist/find-robots-for.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/robots.d.ts +6 -1
- package/dist/robots.d.ts.map +1 -1
- package/dist/robots.js +1 -0
- package/dist/robots.js.map +1 -1
- package/dist/safety.d.ts +116 -0
- package/dist/safety.d.ts.map +1 -0
- package/dist/safety.js +365 -0
- package/dist/safety.js.map +1 -0
- package/dist/transport-pool.d.ts +4 -0
- package/dist/transport-pool.d.ts.map +1 -1
- package/dist/transport-pool.js +47 -5
- package/dist/transport-pool.js.map +1 -1
- package/package.json +9 -10
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @agenticros/core — Platform-agnostic ROS2 transport, config, and utilities.
|
|
3
3
|
*/
|
|
4
|
-
export type { AgenticROSConfig, RobotTransportOverride } from "./config.js";
|
|
5
|
-
export { AgenticROSConfigSchema, parseConfig, prepareConfigForPersistence, getTransportConfig, } from "./config.js";
|
|
4
|
+
export type { AgenticROSConfig, RobotTransportOverride, RobotSafetyOverlay, WorkspaceLimits } from "./config.js";
|
|
5
|
+
export { AgenticROSConfigSchema, parseConfig, prepareConfigForPersistence, getTransportConfig, WorkspaceLimitsSchema, RobotSafetyOverlaySchema, } from "./config.js";
|
|
6
6
|
export { FEATURE_VOCABULARY, FEATURE_VOCABULARY_SET, BINDING_KEYS, BINDING_KEYS_SET, FEATURE_REQUIRED_BINDING, PROFILE_SCHEMA_ID, RobotProfileSchema, isKnownFeature, isKnownBindingKey, unknownFeatures, unknownBindingKeys, featuresMissingBindings, resolveRobotProfile, featuresFromDeprecatedSensors, featuresSatisfied, missingFeatures, resolveBinding, inferProfileDraft, } from "./robot-profile.js";
|
|
7
7
|
export type { FeatureName, BindingKey, RobotProfile, ProfileRobot, InferProfileOptions } from "./robot-profile.js";
|
|
8
8
|
export { createTransport } from "./transport/factory.js";
|
|
@@ -10,6 +10,8 @@ export type { RosTransport } from "./transport/transport.js";
|
|
|
10
10
|
export type { ConnectionStatus, ConnectionHandler, Subscription, PublishOptions, AdvertiseOptions, SubscribeOptions, ServiceCallOptions, ServiceCallResult, ActionGoalOptions, ActionResult, TopicInfo, ServiceInfo, ActionInfo, MessageHandler, TransportConfig, } from "./transport/types.js";
|
|
11
11
|
export { toNamespacedTopic, toNamespacedTopicFull, toTeleopCameraTopicShort, resolveCameraSubscribeTopic, } from "./topic-utils.js";
|
|
12
12
|
export { applyCmdVelTwistSignConvention } from "./cmd-vel-twist.js";
|
|
13
|
+
export { TWIST_MSG_TYPE, ZERO_TWIST, resolveSafetyForRobot, isTwistMessage, checkTwistMessage, clampTwistToLimits, checkWorkspacePosition, extractWorkspacePositions, checkWorkspacePayload, checkPublishSafety, checkActionGoalSafety, checkInputsWorkspace, robotHasMobileBase, publishStopForBases, attachDisconnectFailSafe, checkLiveBindings, } from "./safety.js";
|
|
14
|
+
export type { SafetyLimits, SafetyCheckResult, TwistComponents, LiveBindingCheck, LiveCheckSeverity, LiveGraphSnapshot, } from "./safety.js";
|
|
13
15
|
export { isCdrTypeSupported } from "./transport/zenoh/cdr.js";
|
|
14
16
|
export { renderAgenticROSBanner, agenticROSBannerLines, type AgenticROSBannerOptions, } from "./banner.js";
|
|
15
17
|
export { createMemory, resolveMemoryNamespace } from "./memory/index.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @agenticros/core — Platform-agnostic ROS2 transport, config, and utilities.
|
|
3
3
|
*/
|
|
4
|
-
export { AgenticROSConfigSchema, parseConfig, prepareConfigForPersistence, getTransportConfig, } from "./config.js";
|
|
4
|
+
export { AgenticROSConfigSchema, parseConfig, prepareConfigForPersistence, getTransportConfig, WorkspaceLimitsSchema, RobotSafetyOverlaySchema, } from "./config.js";
|
|
5
5
|
export { FEATURE_VOCABULARY, FEATURE_VOCABULARY_SET, BINDING_KEYS, BINDING_KEYS_SET, FEATURE_REQUIRED_BINDING, PROFILE_SCHEMA_ID, RobotProfileSchema, isKnownFeature, isKnownBindingKey, unknownFeatures, unknownBindingKeys, featuresMissingBindings, resolveRobotProfile, featuresFromDeprecatedSensors, featuresSatisfied, missingFeatures, resolveBinding, inferProfileDraft, } from "./robot-profile.js";
|
|
6
6
|
export { createTransport } from "./transport/factory.js";
|
|
7
7
|
export { toNamespacedTopic, toNamespacedTopicFull, toTeleopCameraTopicShort, resolveCameraSubscribeTopic, } from "./topic-utils.js";
|
|
8
8
|
export { applyCmdVelTwistSignConvention } from "./cmd-vel-twist.js";
|
|
9
|
+
export { TWIST_MSG_TYPE, ZERO_TWIST, resolveSafetyForRobot, isTwistMessage, checkTwistMessage, clampTwistToLimits, checkWorkspacePosition, extractWorkspacePositions, checkWorkspacePayload, checkPublishSafety, checkActionGoalSafety, checkInputsWorkspace, robotHasMobileBase, publishStopForBases, attachDisconnectFailSafe, checkLiveBindings, } from "./safety.js";
|
|
9
10
|
export { isCdrTypeSupported } from "./transport/zenoh/cdr.js";
|
|
10
11
|
export { renderAgenticROSBanner, agenticROSBannerLines, } from "./banner.js";
|
|
11
12
|
export { createMemory, resolveMemoryNamespace } from "./memory/index.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,sBAAsB,EACtB,WAAW,EACX,2BAA2B,EAC3B,kBAAkB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,sBAAsB,EACtB,WAAW,EACX,2BAA2B,EAC3B,kBAAkB,EAClB,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,YAAY,EACZ,gBAAgB,EAChB,wBAAwB,EACxB,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,uBAAuB,EACvB,mBAAmB,EACnB,6BAA6B,EAC7B,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAoBzD,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,wBAAwB,EACxB,2BAA2B,GAC5B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,8BAA8B,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EACL,cAAc,EACd,UAAU,EACV,qBAAqB,EACrB,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,yBAAyB,EACzB,qBAAqB,EACrB,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,wBAAwB,EACxB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AASrB,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EACL,sBAAsB,EACtB,qBAAqB,GAEtB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAUzE,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,wBAAwB,EACxB,4BAA4B,GAC7B,MAAM,mBAAmB,CAAC;AAQ3B,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,8BAA8B,EAC9B,eAAe,EACf,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,iBAAiB,EACjB,yBAAyB,GAC1B,MAAM,0BAA0B,CAAC;AAMlC,OAAO,EAAE,UAAU,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAiBnE,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,oBAAoB,EACpB,4BAA4B,EAC5B,wBAAwB,EACxB,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAM/B,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,0BAA0B,GAC3B,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAE1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAG1D,OAAO,EACL,UAAU,EACV,YAAY,EACZ,oBAAoB,EACpB,gBAAgB,EAChB,0BAA0B,EAC1B,yBAAyB,GAC1B,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,sBAAsB,EACtB,cAAc,EACd,wBAAwB,GACzB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,8BAA8B,EAC9B,mCAAmC,EACnC,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EACpB,2BAA2B,EAC3B,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,aAAa,EACb,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAOrD,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,EACtB,kBAAkB,EAClB,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,iBAAiB,CAAC;AAQzB,OAAO,EACL,sBAAsB,EACtB,gCAAgC,GACjC,MAAM,gCAAgC,CAAC;AAOxC,OAAO,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC"}
|
package/dist/robots.d.ts
CHANGED
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
* mental model keep working unchanged. The synthesised entry is marked
|
|
22
22
|
* default so it's selected by `getActiveRobotId()`.
|
|
23
23
|
*/
|
|
24
|
-
import type { AgenticROSConfig } from "./config.js";
|
|
24
|
+
import type { AgenticROSConfig, RobotSafetyOverlay } from "./config.js";
|
|
25
25
|
import type { TransportConfig } from "./transport/types.js";
|
|
26
26
|
import type { RobotProfile } from "./robot-profile.js";
|
|
27
27
|
/** Sensor/hardware tags on a robot (Phase 1.e). */
|
|
@@ -63,6 +63,11 @@ export interface ResolvedRobot {
|
|
|
63
63
|
* — callers must not invent one; verb filtering is skipped.
|
|
64
64
|
*/
|
|
65
65
|
profile?: RobotProfile;
|
|
66
|
+
/**
|
|
67
|
+
* Optional per-robot safety overlay. Undefined → inherit gateway
|
|
68
|
+
* `config.safety` via `resolveSafetyForRobot`.
|
|
69
|
+
*/
|
|
70
|
+
safety?: RobotSafetyOverlay;
|
|
66
71
|
/**
|
|
67
72
|
* Source tag — handy for diagnostics ("Why is this robot in the list?").
|
|
68
73
|
* - "config": from config.robots[]
|
package/dist/robots.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"robots.d.ts","sourceRoot":"","sources":["../src/robots.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"robots.d.ts","sourceRoot":"","sources":["../src/robots.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAExE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,mDAAmD;AACnD,MAAM,WAAW,YAAY;IAC3B,wCAAwC;IACxC,aAAa,EAAE,OAAO,CAAC;IACvB,6BAA6B;IAC7B,SAAS,EAAE,OAAO,CAAC;IACnB,0CAA0C;IAC1C,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,+DAA+D;AAC/D,MAAM,WAAW,aAAa;IAC5B,+EAA+E;IAC/E,EAAE,EAAE,MAAM,CAAC;IACX,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,qFAAqF;IACrF,SAAS,EAAE,MAAM,CAAC;IAClB,gFAAgF;IAChF,WAAW,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,OAAO,EAAE,YAAY,CAAC;IACtB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB;;;OAGG;IACH,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB;;;OAGG;IACH,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B;;;;OAIG;IACH,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;CAC7B;AAiBD,wBAAgB,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,aAAa,EAAE,CAyCpE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAUpF;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,aAAa,CAIf;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,aAAa,CAiBtF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,gBAAgB,EACxB,OAAO,CAAC,EAAE,MAAM,GACf,eAAe,CAuCjB;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,gBAAgB,EACxB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAUT"}
|
package/dist/robots.js
CHANGED
package/dist/robots.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"robots.js","sourceRoot":"","sources":["../src/robots.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"robots.js","sourceRoot":"","sources":["../src/robots.ts"],"names":[],"mappings":"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"}
|
package/dist/safety.d.ts
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared safety gates: per-robot velocity limits, optional workspace
|
|
3
|
+
* geofence, and fail-safe zero-Twist on transport loss.
|
|
4
|
+
*
|
|
5
|
+
* Adapters (MCP, OpenClaw, Gemini, teleop, skills) must call these
|
|
6
|
+
* helpers rather than reading `config.safety` directly so a mixed
|
|
7
|
+
* fleet does not share one clamp.
|
|
8
|
+
*/
|
|
9
|
+
import type { AgenticROSConfig, RobotSafetyOverlay, WorkspaceLimits } from "./config.js";
|
|
10
|
+
import type { ProfileRobot } from "./robot-profile.js";
|
|
11
|
+
import type { RosTransport } from "./transport/transport.js";
|
|
12
|
+
export declare const TWIST_MSG_TYPE = "geometry_msgs/msg/Twist";
|
|
13
|
+
export declare const ZERO_TWIST: {
|
|
14
|
+
linear: {
|
|
15
|
+
x: number;
|
|
16
|
+
y: number;
|
|
17
|
+
z: number;
|
|
18
|
+
};
|
|
19
|
+
angular: {
|
|
20
|
+
x: number;
|
|
21
|
+
y: number;
|
|
22
|
+
z: number;
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
export interface SafetyLimits {
|
|
26
|
+
maxLinearVelocity: number;
|
|
27
|
+
maxAngularVelocity: number;
|
|
28
|
+
workspaceLimits?: WorkspaceLimits;
|
|
29
|
+
}
|
|
30
|
+
export interface SafetyCheckResult {
|
|
31
|
+
block: boolean;
|
|
32
|
+
blockReason?: string;
|
|
33
|
+
}
|
|
34
|
+
export interface TwistComponents {
|
|
35
|
+
linear: {
|
|
36
|
+
x: number;
|
|
37
|
+
y: number;
|
|
38
|
+
z: number;
|
|
39
|
+
};
|
|
40
|
+
angular: {
|
|
41
|
+
x: number;
|
|
42
|
+
y: number;
|
|
43
|
+
z: number;
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Resolve velocity + workspace limits for a robot. Robot overlay fields
|
|
48
|
+
* win; unset fields inherit the gateway `config.safety` defaults.
|
|
49
|
+
*/
|
|
50
|
+
export declare function resolveSafetyForRobot(config: AgenticROSConfig, robot?: {
|
|
51
|
+
safety?: RobotSafetyOverlay;
|
|
52
|
+
} | null): SafetyLimits;
|
|
53
|
+
/** True when the payload looks like geometry_msgs/Twist. */
|
|
54
|
+
export declare function isTwistMessage(msg: unknown): boolean;
|
|
55
|
+
export declare function checkTwistMessage(limits: SafetyLimits, msg: unknown): SafetyCheckResult;
|
|
56
|
+
/** Scale a Twist down to the velocity ceilings (teleop / skills). */
|
|
57
|
+
export declare function clampTwistToLimits(limits: SafetyLimits, linearX: number, linearY: number, linearZ: number, angularX: number, angularY: number, angularZ: number): TwistComponents;
|
|
58
|
+
export declare function checkWorkspacePosition(limits: SafetyLimits, x: number, y: number): SafetyCheckResult;
|
|
59
|
+
/**
|
|
60
|
+
* Pull map-frame (x, y) pairs from Twist-unrelated nav payloads:
|
|
61
|
+
* `{x,y}`, Pose, PoseStamped, NavigateToPose goal, NavigateThroughPoses.
|
|
62
|
+
*/
|
|
63
|
+
export declare function extractWorkspacePositions(payload: unknown): Array<{
|
|
64
|
+
x: number;
|
|
65
|
+
y: number;
|
|
66
|
+
}>;
|
|
67
|
+
export declare function checkWorkspacePayload(limits: SafetyLimits, payload: unknown): SafetyCheckResult;
|
|
68
|
+
export declare function checkPublishSafety(config: AgenticROSConfig, params: Record<string, unknown>, robot?: {
|
|
69
|
+
safety?: RobotSafetyOverlay;
|
|
70
|
+
} | null): SafetyCheckResult;
|
|
71
|
+
export declare function checkActionGoalSafety(config: AgenticROSConfig, params: Record<string, unknown>, robot?: {
|
|
72
|
+
safety?: RobotSafetyOverlay;
|
|
73
|
+
} | null): SafetyCheckResult;
|
|
74
|
+
export declare function checkInputsWorkspace(config: AgenticROSConfig, inputs: Record<string, unknown>, robot?: {
|
|
75
|
+
safety?: RobotSafetyOverlay;
|
|
76
|
+
} | null): SafetyCheckResult;
|
|
77
|
+
/**
|
|
78
|
+
* A body that accepts Twist. Profile `base` wins; with no profile,
|
|
79
|
+
* anything except an arm-only cell is treated as having a base
|
|
80
|
+
* (legacy configs default kind to "amr").
|
|
81
|
+
*/
|
|
82
|
+
export declare function robotHasMobileBase(robot: ProfileRobot): boolean;
|
|
83
|
+
/** Best-effort zero Twist on every mobile-base robot sharing this transport. */
|
|
84
|
+
export declare function publishStopForBases(transport: RosTransport, robots: readonly ProfileRobot[]): Promise<void>;
|
|
85
|
+
/**
|
|
86
|
+
* Publish zero Twist when the transport drops (and again on reconnect
|
|
87
|
+
* so a stale last-command cannot resume). Returns an unsubscribe.
|
|
88
|
+
*/
|
|
89
|
+
export declare function attachDisconnectFailSafe(transport: RosTransport, robots: readonly ProfileRobot[]): () => void;
|
|
90
|
+
export type LiveCheckSeverity = "green" | "yellow" | "red";
|
|
91
|
+
export interface LiveBindingCheck {
|
|
92
|
+
id: string;
|
|
93
|
+
robotId: string;
|
|
94
|
+
key: string;
|
|
95
|
+
name: string;
|
|
96
|
+
severity: LiveCheckSeverity;
|
|
97
|
+
reason: string;
|
|
98
|
+
}
|
|
99
|
+
export interface LiveGraphSnapshot {
|
|
100
|
+
topics: ReadonlyArray<{
|
|
101
|
+
name: string;
|
|
102
|
+
type?: string;
|
|
103
|
+
}>;
|
|
104
|
+
actions?: ReadonlyArray<{
|
|
105
|
+
name: string;
|
|
106
|
+
type?: string;
|
|
107
|
+
}>;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Compare declared profile bindings against a live topic/action list.
|
|
111
|
+
* Missing declared hardware is red; type mismatch is yellow.
|
|
112
|
+
*/
|
|
113
|
+
export declare function checkLiveBindings(robots: ReadonlyArray<ProfileRobot & {
|
|
114
|
+
id: string;
|
|
115
|
+
}>, graph: LiveGraphSnapshot): LiveBindingCheck[];
|
|
116
|
+
//# sourceMappingURL=safety.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safety.d.ts","sourceRoot":"","sources":["../src/safety.ts"],"names":[],"mappings":"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"}
|
package/dist/safety.js
ADDED
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared safety gates: per-robot velocity limits, optional workspace
|
|
3
|
+
* geofence, and fail-safe zero-Twist on transport loss.
|
|
4
|
+
*
|
|
5
|
+
* Adapters (MCP, OpenClaw, Gemini, teleop, skills) must call these
|
|
6
|
+
* helpers rather than reading `config.safety` directly so a mixed
|
|
7
|
+
* fleet does not share one clamp.
|
|
8
|
+
*/
|
|
9
|
+
import { resolveBinding } from "./robot-profile.js";
|
|
10
|
+
export const TWIST_MSG_TYPE = "geometry_msgs/msg/Twist";
|
|
11
|
+
export const ZERO_TWIST = {
|
|
12
|
+
linear: { x: 0, y: 0, z: 0 },
|
|
13
|
+
angular: { x: 0, y: 0, z: 0 },
|
|
14
|
+
};
|
|
15
|
+
const PASS = { block: false };
|
|
16
|
+
function overlayOf(robot) {
|
|
17
|
+
return robot?.safety;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Resolve velocity + workspace limits for a robot. Robot overlay fields
|
|
21
|
+
* win; unset fields inherit the gateway `config.safety` defaults.
|
|
22
|
+
*/
|
|
23
|
+
export function resolveSafetyForRobot(config, robot) {
|
|
24
|
+
const gateway = config.safety ?? {
|
|
25
|
+
maxLinearVelocity: 1.0,
|
|
26
|
+
maxAngularVelocity: 1.5,
|
|
27
|
+
};
|
|
28
|
+
const overlay = overlayOf(robot);
|
|
29
|
+
return {
|
|
30
|
+
maxLinearVelocity: overlay?.maxLinearVelocity ?? gateway.maxLinearVelocity ?? 1.0,
|
|
31
|
+
maxAngularVelocity: overlay?.maxAngularVelocity ?? gateway.maxAngularVelocity ?? 1.5,
|
|
32
|
+
workspaceLimits: overlay?.workspaceLimits ?? gateway.workspaceLimits,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function asRecord(value) {
|
|
36
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
37
|
+
return undefined;
|
|
38
|
+
return value;
|
|
39
|
+
}
|
|
40
|
+
function num(value, fallback = 0) {
|
|
41
|
+
const n = Number(value);
|
|
42
|
+
return Number.isFinite(n) ? n : fallback;
|
|
43
|
+
}
|
|
44
|
+
/** True when the payload looks like geometry_msgs/Twist. */
|
|
45
|
+
export function isTwistMessage(msg) {
|
|
46
|
+
const rec = asRecord(msg);
|
|
47
|
+
if (!rec)
|
|
48
|
+
return false;
|
|
49
|
+
return asRecord(rec["linear"]) !== undefined || asRecord(rec["angular"]) !== undefined;
|
|
50
|
+
}
|
|
51
|
+
export function checkTwistMessage(limits, msg) {
|
|
52
|
+
if (!isTwistMessage(msg))
|
|
53
|
+
return PASS;
|
|
54
|
+
const rec = asRecord(msg);
|
|
55
|
+
const linear = asRecord(rec["linear"]);
|
|
56
|
+
const angular = asRecord(rec["angular"]);
|
|
57
|
+
if (linear) {
|
|
58
|
+
const speed = Math.sqrt(num(linear["x"]) ** 2 + num(linear["y"]) ** 2 + num(linear["z"]) ** 2);
|
|
59
|
+
if (speed > limits.maxLinearVelocity) {
|
|
60
|
+
return {
|
|
61
|
+
block: true,
|
|
62
|
+
blockReason: `Linear velocity ${speed.toFixed(2)} m/s exceeds safety limit of ${limits.maxLinearVelocity} m/s`,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (angular) {
|
|
67
|
+
const rate = Math.abs(num(angular["z"]));
|
|
68
|
+
if (rate > limits.maxAngularVelocity) {
|
|
69
|
+
return {
|
|
70
|
+
block: true,
|
|
71
|
+
blockReason: `Angular velocity ${rate.toFixed(2)} rad/s exceeds safety limit of ${limits.maxAngularVelocity} rad/s`,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return PASS;
|
|
76
|
+
}
|
|
77
|
+
/** Scale a Twist down to the velocity ceilings (teleop / skills). */
|
|
78
|
+
export function clampTwistToLimits(limits, linearX, linearY, linearZ, angularX, angularY, angularZ) {
|
|
79
|
+
const maxLin = limits.maxLinearVelocity;
|
|
80
|
+
const maxAng = limits.maxAngularVelocity;
|
|
81
|
+
const linMag = Math.sqrt(linearX * linearX + linearY * linearY + linearZ * linearZ);
|
|
82
|
+
const scaleLin = linMag > maxLin && linMag > 0 ? maxLin / linMag : 1;
|
|
83
|
+
const angMag = Math.abs(angularZ);
|
|
84
|
+
const scaleAng = angMag > maxAng && angMag > 0 ? maxAng / angMag : 1;
|
|
85
|
+
return {
|
|
86
|
+
linear: {
|
|
87
|
+
x: linearX * scaleLin,
|
|
88
|
+
y: linearY * scaleLin,
|
|
89
|
+
z: linearZ * scaleLin,
|
|
90
|
+
},
|
|
91
|
+
angular: {
|
|
92
|
+
x: angularX * scaleAng,
|
|
93
|
+
y: angularY * scaleAng,
|
|
94
|
+
z: Math.max(-maxAng, Math.min(maxAng, angularZ)),
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
function workspaceMalformed(bounds) {
|
|
99
|
+
if (bounds.xMin > bounds.xMax) {
|
|
100
|
+
return `Malformed workspaceLimits: xMin (${bounds.xMin}) > xMax (${bounds.xMax})`;
|
|
101
|
+
}
|
|
102
|
+
if (bounds.yMin > bounds.yMax) {
|
|
103
|
+
return `Malformed workspaceLimits: yMin (${bounds.yMin}) > yMax (${bounds.yMax})`;
|
|
104
|
+
}
|
|
105
|
+
return undefined;
|
|
106
|
+
}
|
|
107
|
+
export function checkWorkspacePosition(limits, x, y) {
|
|
108
|
+
const bounds = limits.workspaceLimits;
|
|
109
|
+
if (!bounds)
|
|
110
|
+
return PASS;
|
|
111
|
+
const malformed = workspaceMalformed(bounds);
|
|
112
|
+
if (malformed)
|
|
113
|
+
return { block: true, blockReason: malformed };
|
|
114
|
+
if (x < bounds.xMin || x > bounds.xMax || y < bounds.yMin || y > bounds.yMax) {
|
|
115
|
+
return {
|
|
116
|
+
block: true,
|
|
117
|
+
blockReason: `Position (${x.toFixed(2)}, ${y.toFixed(2)}) is outside workspaceLimits ` +
|
|
118
|
+
`[x ${bounds.xMin}..${bounds.xMax}, y ${bounds.yMin}..${bounds.yMax}]`,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
return PASS;
|
|
122
|
+
}
|
|
123
|
+
function pushPosition(out, rec) {
|
|
124
|
+
if (!rec)
|
|
125
|
+
return;
|
|
126
|
+
if ("x" in rec && "y" in rec) {
|
|
127
|
+
out.push({ x: num(rec["x"]), y: num(rec["y"]) });
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
const position = asRecord(rec["position"]);
|
|
131
|
+
if (position && "x" in position && "y" in position) {
|
|
132
|
+
out.push({ x: num(position["x"]), y: num(position["y"]) });
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Pull map-frame (x, y) pairs from Twist-unrelated nav payloads:
|
|
137
|
+
* `{x,y}`, Pose, PoseStamped, NavigateToPose goal, NavigateThroughPoses.
|
|
138
|
+
*/
|
|
139
|
+
export function extractWorkspacePositions(payload) {
|
|
140
|
+
const out = [];
|
|
141
|
+
const rec = asRecord(payload);
|
|
142
|
+
if (!rec)
|
|
143
|
+
return out;
|
|
144
|
+
if (Array.isArray(rec["poses"])) {
|
|
145
|
+
for (const p of rec["poses"]) {
|
|
146
|
+
out.push(...extractWorkspacePositions(p));
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
const nestedGoal = rec["goal"] ?? rec["request"] ?? rec["message"];
|
|
150
|
+
if (nestedGoal && nestedGoal !== payload) {
|
|
151
|
+
out.push(...extractWorkspacePositions(nestedGoal));
|
|
152
|
+
}
|
|
153
|
+
const pose = asRecord(rec["pose"]);
|
|
154
|
+
if (pose) {
|
|
155
|
+
const inner = asRecord(pose["pose"]);
|
|
156
|
+
if (inner) {
|
|
157
|
+
pushPosition(out, inner);
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
pushPosition(out, pose);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
if ("x" in rec && "y" in rec && !asRecord(rec["linear"]) && !asRecord(rec["angular"])) {
|
|
164
|
+
pushPosition(out, rec);
|
|
165
|
+
}
|
|
166
|
+
return out;
|
|
167
|
+
}
|
|
168
|
+
export function checkWorkspacePayload(limits, payload) {
|
|
169
|
+
if (!limits.workspaceLimits)
|
|
170
|
+
return PASS;
|
|
171
|
+
for (const pos of extractWorkspacePositions(payload)) {
|
|
172
|
+
const hit = checkWorkspacePosition(limits, pos.x, pos.y);
|
|
173
|
+
if (hit.block)
|
|
174
|
+
return hit;
|
|
175
|
+
}
|
|
176
|
+
return PASS;
|
|
177
|
+
}
|
|
178
|
+
export function checkPublishSafety(config, params, robot) {
|
|
179
|
+
const limits = resolveSafetyForRobot(config, robot);
|
|
180
|
+
const msg = params["message"];
|
|
181
|
+
const twist = checkTwistMessage(limits, msg);
|
|
182
|
+
if (twist.block)
|
|
183
|
+
return twist;
|
|
184
|
+
return checkWorkspacePayload(limits, msg);
|
|
185
|
+
}
|
|
186
|
+
export function checkActionGoalSafety(config, params, robot) {
|
|
187
|
+
const limits = resolveSafetyForRobot(config, robot);
|
|
188
|
+
const goal = params["goal"] ?? params["args"] ?? params["inputs"] ?? params;
|
|
189
|
+
return checkWorkspacePayload(limits, goal);
|
|
190
|
+
}
|
|
191
|
+
export function checkInputsWorkspace(config, inputs, robot) {
|
|
192
|
+
return checkWorkspacePayload(resolveSafetyForRobot(config, robot), inputs);
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* A body that accepts Twist. Profile `base` wins; with no profile,
|
|
196
|
+
* anything except an arm-only cell is treated as having a base
|
|
197
|
+
* (legacy configs default kind to "amr").
|
|
198
|
+
*/
|
|
199
|
+
export function robotHasMobileBase(robot) {
|
|
200
|
+
if (robot.profile) {
|
|
201
|
+
return robot.profile.features.includes("base");
|
|
202
|
+
}
|
|
203
|
+
const kind = (robot.kind ?? "amr").trim().toLowerCase();
|
|
204
|
+
return kind !== "arm";
|
|
205
|
+
}
|
|
206
|
+
const STOP_PUBLISH_BUDGET_MS = 500;
|
|
207
|
+
/** Best-effort zero Twist on every mobile-base robot sharing this transport. */
|
|
208
|
+
export async function publishStopForBases(transport, robots) {
|
|
209
|
+
const pubs = [];
|
|
210
|
+
for (const robot of robots) {
|
|
211
|
+
if (!robotHasMobileBase(robot))
|
|
212
|
+
continue;
|
|
213
|
+
const topic = resolveBinding(robot, "cmd_vel");
|
|
214
|
+
if (!topic)
|
|
215
|
+
continue;
|
|
216
|
+
try {
|
|
217
|
+
transport.advertise?.({ topic, type: TWIST_MSG_TYPE });
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
/* rosbridge advertise is optional */
|
|
221
|
+
}
|
|
222
|
+
try {
|
|
223
|
+
const result = transport.publish({
|
|
224
|
+
topic,
|
|
225
|
+
type: TWIST_MSG_TYPE,
|
|
226
|
+
msg: {
|
|
227
|
+
linear: { ...ZERO_TWIST.linear },
|
|
228
|
+
angular: { ...ZERO_TWIST.angular },
|
|
229
|
+
},
|
|
230
|
+
});
|
|
231
|
+
if (result && typeof result.then === "function") {
|
|
232
|
+
pubs.push(Promise.resolve(result).catch(() => { }));
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
catch {
|
|
236
|
+
/* socket may already be half-closed */
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
if (pubs.length === 0)
|
|
240
|
+
return;
|
|
241
|
+
await Promise.race([
|
|
242
|
+
Promise.all(pubs),
|
|
243
|
+
new Promise((resolve) => setTimeout(resolve, STOP_PUBLISH_BUDGET_MS)),
|
|
244
|
+
]);
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Publish zero Twist when the transport drops (and again on reconnect
|
|
248
|
+
* so a stale last-command cannot resume). Returns an unsubscribe.
|
|
249
|
+
*/
|
|
250
|
+
export function attachDisconnectFailSafe(transport, robots) {
|
|
251
|
+
if (typeof transport.onConnection !== "function")
|
|
252
|
+
return () => { };
|
|
253
|
+
let everConnected = transport.getStatus() === "connected";
|
|
254
|
+
return transport.onConnection((status) => {
|
|
255
|
+
if (status === "connected") {
|
|
256
|
+
if (everConnected) {
|
|
257
|
+
void publishStopForBases(transport, robots);
|
|
258
|
+
}
|
|
259
|
+
everConnected = true;
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
if (status === "disconnected" && everConnected) {
|
|
263
|
+
void publishStopForBases(transport, robots);
|
|
264
|
+
}
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
const ACTION_BINDING_KEYS = new Set(["navigate_to_pose", "dock"]);
|
|
268
|
+
const EXPECTED_TYPE_FRAGMENT = {
|
|
269
|
+
cmd_vel: /Twist/i,
|
|
270
|
+
odom: /Odometry/i,
|
|
271
|
+
"camera.rgb": /Image/i,
|
|
272
|
+
"camera.depth": /Image/i,
|
|
273
|
+
lidar: /LaserScan|PointCloud/i,
|
|
274
|
+
joint_states: /JointState/i,
|
|
275
|
+
battery: /BatteryState/i,
|
|
276
|
+
};
|
|
277
|
+
function normalizeGraphName(name) {
|
|
278
|
+
const trimmed = name.trim();
|
|
279
|
+
if (!trimmed)
|
|
280
|
+
return trimmed;
|
|
281
|
+
const withSlash = trimmed.startsWith("/") ? trimmed : `/${trimmed}`;
|
|
282
|
+
return withSlash.replace(/\/+$/, "") || "/";
|
|
283
|
+
}
|
|
284
|
+
function findGraphEntry(names, wanted) {
|
|
285
|
+
const target = normalizeGraphName(wanted);
|
|
286
|
+
return names.find((n) => normalizeGraphName(n.name) === target);
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Compare declared profile bindings against a live topic/action list.
|
|
290
|
+
* Missing declared hardware is red; type mismatch is yellow.
|
|
291
|
+
*/
|
|
292
|
+
export function checkLiveBindings(robots, graph) {
|
|
293
|
+
const checks = [];
|
|
294
|
+
for (const robot of robots) {
|
|
295
|
+
const profile = robot.profile;
|
|
296
|
+
if (!profile)
|
|
297
|
+
continue;
|
|
298
|
+
const entries = Object.entries(profile.bindings);
|
|
299
|
+
if (entries.length === 0) {
|
|
300
|
+
checks.push({
|
|
301
|
+
id: `live-${robot.id}-no-bindings`,
|
|
302
|
+
robotId: robot.id,
|
|
303
|
+
key: "",
|
|
304
|
+
name: "",
|
|
305
|
+
severity: "yellow",
|
|
306
|
+
reason: `Robot "${robot.id}" has a profile but no bindings to verify`,
|
|
307
|
+
});
|
|
308
|
+
continue;
|
|
309
|
+
}
|
|
310
|
+
for (const [key, raw] of entries) {
|
|
311
|
+
const resolved = resolveBinding(robot, key) ??
|
|
312
|
+
(typeof raw === "string" ? raw.trim() : "");
|
|
313
|
+
if (!resolved)
|
|
314
|
+
continue;
|
|
315
|
+
const isAction = ACTION_BINDING_KEYS.has(key);
|
|
316
|
+
const pool = isAction ? (graph.actions ?? []) : graph.topics;
|
|
317
|
+
const found = findGraphEntry(pool, resolved);
|
|
318
|
+
const checkId = `live-${robot.id}-${key}`;
|
|
319
|
+
if (!found) {
|
|
320
|
+
if (isAction && (graph.actions === undefined || graph.actions.length === 0)) {
|
|
321
|
+
checks.push({
|
|
322
|
+
id: checkId,
|
|
323
|
+
robotId: robot.id,
|
|
324
|
+
key,
|
|
325
|
+
name: resolved,
|
|
326
|
+
severity: "yellow",
|
|
327
|
+
reason: `Could not verify action ${key}=${resolved} (transport returned no action list)`,
|
|
328
|
+
});
|
|
329
|
+
continue;
|
|
330
|
+
}
|
|
331
|
+
checks.push({
|
|
332
|
+
id: checkId,
|
|
333
|
+
robotId: robot.id,
|
|
334
|
+
key,
|
|
335
|
+
name: resolved,
|
|
336
|
+
severity: "red",
|
|
337
|
+
reason: `Declared ${key}=${resolved} is not on the live graph`,
|
|
338
|
+
});
|
|
339
|
+
continue;
|
|
340
|
+
}
|
|
341
|
+
const expected = EXPECTED_TYPE_FRAGMENT[key];
|
|
342
|
+
if (expected && found.type && !expected.test(found.type)) {
|
|
343
|
+
checks.push({
|
|
344
|
+
id: checkId,
|
|
345
|
+
robotId: robot.id,
|
|
346
|
+
key,
|
|
347
|
+
name: resolved,
|
|
348
|
+
severity: "yellow",
|
|
349
|
+
reason: `${key}=${resolved} type is ${found.type} (expected ${expected})`,
|
|
350
|
+
});
|
|
351
|
+
continue;
|
|
352
|
+
}
|
|
353
|
+
checks.push({
|
|
354
|
+
id: checkId,
|
|
355
|
+
robotId: robot.id,
|
|
356
|
+
key,
|
|
357
|
+
name: resolved,
|
|
358
|
+
severity: "green",
|
|
359
|
+
reason: `${key}=${resolved} present`,
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
return checks;
|
|
364
|
+
}
|
|
365
|
+
//# sourceMappingURL=safety.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safety.js","sourceRoot":"","sources":["../src/safety.ts"],"names":[],"mappings":"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"}
|