syntax = "proto3"; package cmvr.config; message QuicEdgeTlsConfig { string ca_file = 1; string certificate_file = 2; string private_key_file = 3; string server_name = 4; // Development-only escape hatch. Production configurations should keep // this false and provide ca_file plus server_name. bool allow_insecure = 5; } message QuicEdgeReconnectConfig { uint32 initial_delay_ms = 1; uint32 maximum_delay_ms = 2; double multiplier = 3; uint32 jitter_percent = 4; uint32 connect_timeout_ms = 5; } message QuicEdgeTrackConfig { enum SourceKind { SOURCE_KIND_UNSPECIFIED = 0; SOURCE_KIND_CAMERA = 1; SOURCE_KIND_MICROPHONE = 2; } uint32 track_id = 1; SourceKind source_kind = 2; string device_id = 3; bool enable = 4; // Zero uses QuicEdgeConfig.maximum_frame_bytes. uint32 max_frame_bytes = 5; // Protocol-neutral MediaSourceHub track ID. When empty, the service derives // the default ID from source_kind and device_id (for example // "right_hand_cam/video/color"). The Hub's descriptor is the authority for // codec metadata and descriptor generation. string source_track_id = 6; } message QuicEdgeConfig { string id = 1; reserved 2; string server_host = 3; uint32 server_port = 4; string alpn = 5; string node_id = 6; QuicEdgeTlsConfig tls = 7; QuicEdgeReconnectConfig reconnect = 8; // Local safety limits. The effective DATAGRAM size is the minimum of this // value and the peer/path value reported by the QUIC implementation. uint32 maximum_datagram_bytes = 9; uint32 maximum_control_frame_bytes = 10; uint32 maximum_frame_bytes = 11; uint32 datagram_send_queue_depth = 12; uint32 media_poll_interval_ms = 13; // Node-presence fields migrated from the former gRPC edge agent. node_id may // be "auto" when the implementation supports hostname-based resolution. string software_version = 14; // Existing edge gRPC server endpoint advertised to the gateway. Empty or // "auto" host selects a usable address from the current interface snapshot. string grpc_endpoint_host = 15; uint32 grpc_endpoint_port = 16; bool grpc_endpoint_tls = 17; // Local heartbeat frequency in milliseconds. A zero // NodeRegisterResponse.heartbeat_interval_ms keeps this value; a non-zero // response is the platform's negotiated override. // control_response_timeout_ms applies while waiting for registration and // heartbeat acknowledgements on the reliable stream. uint32 heartbeat_interval_ms = 18; uint32 control_response_timeout_ms = 19; // An empty list, or a list with no enabled entry, is valid: node registration, // IP reporting and heartbeat continue without a camera or microphone. repeated QuicEdgeTrackConfig tracks = 20; bool include_loopback_interfaces = 21; // Immutable robot product identity, for example: // CN-CMVR-MBLRV1-CHAGAN-20260731-001. string robot_id = 22; } message QuicEdgeRootConfig { QuicEdgeConfig quic_edge = 1; }