/** * Robot hardware profile — features + ROS bindings. * * A profile declares what a *body* has (camera, base, arm, …) and where * those features live on this robot's ROS graph. Agent verbs * (`drive_base`, `follow_person`) are filtered against it; skills * address feature names, never a camera brand or URDF. * * Back-compat: `profile` is optional. No profile → no verb filtering * (today's gateway-wide registry). A declared profile is strict. */ import { z } from "zod"; /** Frozen hardware vocabulary. Names are only added, never removed or repurposed. */ export declare const FEATURE_VOCABULARY: readonly ["base", "arm", "gripper", "camera", "depth", "lidar", "imu", "dock", "display", "audio", "battery", "estop"]; export type FeatureName = (typeof FEATURE_VOCABULARY)[number]; export declare const FEATURE_VOCABULARY_SET: ReadonlySet; /** Frozen v1 binding keys. Values are ROS topic / action names. */ export declare const BINDING_KEYS: readonly ["cmd_vel", "odom", "camera.rgb", "camera.depth", "lidar", "joint_states", "navigate_to_pose", "dock", "battery"]; export type BindingKey = (typeof BINDING_KEYS)[number]; export declare const BINDING_KEYS_SET: ReadonlySet; /** * Minimum binding expected for a declared feature. Used by doctor; a * feature without its v1 binding is a contract violation. */ export declare const FEATURE_REQUIRED_BINDING: Readonly>>; export declare const PROFILE_SCHEMA_ID = "agenticros.profile.v1"; export declare const RobotProfileSchema: z.ZodObject<{ schema: z.ZodDefault>; features: z.ZodDefault>; bindings: z.ZodDefault>; }, "strip", z.ZodTypeAny, { schema: "agenticros.profile.v1"; features: string[]; bindings: Record; }, { schema?: "agenticros.profile.v1" | undefined; features?: string[] | undefined; bindings?: Record | undefined; }>; export type RobotProfile = z.infer; /** Minimal robot shape the profile helpers need (avoids importing robots.ts). */ export interface ProfileRobot { namespace: string; cameraTopic: string; kind?: string; sensors?: { has_realsense?: boolean; has_lidar?: boolean; has_arm?: boolean; }; profile?: RobotProfile; } export declare function isKnownFeature(name: string): name is FeatureName; export declare function isKnownBindingKey(key: string): key is BindingKey; export declare function unknownFeatures(features: readonly string[]): string[]; export declare function unknownBindingKeys(bindings: Record): string[]; /** Features declared on a profile that lack their v1 binding. */ export declare function featuresMissingBindings(profile: RobotProfile): string[]; export declare function resolveRobotProfile(robot: ProfileRobot): RobotProfile | undefined; /** * Map the deprecated Phase 1.e sensor booleans onto feature names. * Used only when `profile` is absent — so `--sensors=has_realsense` * still means something for fleet filtering / infer. */ export declare function featuresFromDeprecatedSensors(sensors: ProfileRobot["sensors"] | undefined): FeatureName[]; /** ALL-OF: every required feature is present on the profile. Empty requires always pass. */ export declare function featuresSatisfied(profile: RobotProfile | undefined, requires: readonly string[] | undefined): boolean; /** Required features the profile does not declare. Empty when satisfied or no profile. */ export declare function missingFeatures(profile: RobotProfile | undefined, requires: readonly string[] | undefined): string[]; /** * Resolve a binding key to a ROS name for this robot. * * Precedence: explicit `profile.bindings[key]`, then legacy fallbacks * (`cameraTopic` for `camera.rgb`, teleop/`/cmd_vel` for `cmd_vel`). * Relative names are namespace-prefixed. */ export declare function resolveBinding(robot: ProfileRobot, key: string, opts?: { cmdVelTopic?: string; }): string | undefined; export interface InferProfileOptions { cmdVelTopic?: string; } /** * Draft a profile from kind, cameraTopic, deprecated sensors, and * namespaced cmd_vel. Used by `agenticros robots profile infer`. * Does not write config. */ export declare function inferProfileDraft(robot: ProfileRobot, opts?: InferProfileOptions): RobotProfile; //# sourceMappingURL=robot-profile.d.ts.map