From 9c0d461fb7445bdc3ed746cf13c5403d857e88a7 Mon Sep 17 00:00:00 2001 From: flemming-it Date: Sat, 13 Jun 2026 14:07:30 +0200 Subject: [PATCH] feat: regenerate protos + federation client methods Regenerate the Dart bindings from the platform protos (now including fai/v1/federation.proto and the IssueBootstrapToken / ListSatellites HubAdmin RPCs + the new primary_ca_pem field). Add HubClient wrappers: listSatellites() and issueBootstrapToken(name, region, ttl), the latter returning the primary CA so callers can bootstrap a satellite in one step. Signed-off-by: flemming-it --- lib/src/generated/fai/v1/federation.pb.dart | 2444 +++++++++++++++++ .../generated/fai/v1/federation.pbenum.dart | 11 + .../generated/fai/v1/federation.pbgrpc.dart | 181 ++ .../generated/fai/v1/federation.pbjson.dart | 674 +++++ lib/src/generated/fai/v1/hub.pb.dart | 337 +++ lib/src/generated/fai/v1/hub.pbgrpc.dart | 61 + lib/src/generated/fai/v1/hub.pbjson.dart | 74 + lib/src/hub_client.dart | 25 + 8 files changed, 3807 insertions(+) create mode 100644 lib/src/generated/fai/v1/federation.pb.dart create mode 100644 lib/src/generated/fai/v1/federation.pbenum.dart create mode 100644 lib/src/generated/fai/v1/federation.pbgrpc.dart create mode 100644 lib/src/generated/fai/v1/federation.pbjson.dart diff --git a/lib/src/generated/fai/v1/federation.pb.dart b/lib/src/generated/fai/v1/federation.pb.dart new file mode 100644 index 0000000..1afa284 --- /dev/null +++ b/lib/src/generated/fai/v1/federation.pb.dart @@ -0,0 +1,2444 @@ +// This is a generated file - do not edit. +// +// Generated from fai/v1/federation.proto. + +// @dart = 3.3 + +// ignore_for_file: annotate_overrides, camel_case_types, comment_references +// ignore_for_file: constant_identifier_names +// ignore_for_file: curly_braces_in_flow_control_structures +// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_relative_imports + +import 'dart:core' as $core; + +import 'package:fixnum/fixnum.dart' as $fixnum; +import 'package:protobuf/protobuf.dart' as $pb; + +import 'common.pb.dart' as $1; + +export 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions; + +enum ControlMessage_Kind { + hello, + accept, + advertise, + withdraw, + heartbeat, + heartbeatAck, + rename, + certRenewRequest, + certRenewResponse, + dispatchCall, + dispatchResult, + notSet +} + +/// All Control-stream messages share this envelope so a single +/// gRPC stream can carry the full state-machine vocabulary +/// without needing one stream per message kind. +class ControlMessage extends $pb.GeneratedMessage { + factory ControlMessage({ + HelloMessage? hello, + AcceptMessage? accept, + AdvertiseMessage? advertise, + WithdrawMessage? withdraw, + HeartbeatMessage? heartbeat, + HeartbeatAck? heartbeatAck, + RenameMessage? rename, + CertRenewRequest? certRenewRequest, + CertRenewResponse? certRenewResponse, + DispatchCall? dispatchCall, + DispatchResult? dispatchResult, + }) { + final result = create(); + if (hello != null) result.hello = hello; + if (accept != null) result.accept = accept; + if (advertise != null) result.advertise = advertise; + if (withdraw != null) result.withdraw = withdraw; + if (heartbeat != null) result.heartbeat = heartbeat; + if (heartbeatAck != null) result.heartbeatAck = heartbeatAck; + if (rename != null) result.rename = rename; + if (certRenewRequest != null) result.certRenewRequest = certRenewRequest; + if (certRenewResponse != null) result.certRenewResponse = certRenewResponse; + if (dispatchCall != null) result.dispatchCall = dispatchCall; + if (dispatchResult != null) result.dispatchResult = dispatchResult; + return result; + } + + ControlMessage._(); + + factory ControlMessage.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory ControlMessage.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static const $core.Map<$core.int, ControlMessage_Kind> + _ControlMessage_KindByTag = { + 1: ControlMessage_Kind.hello, + 2: ControlMessage_Kind.accept, + 3: ControlMessage_Kind.advertise, + 4: ControlMessage_Kind.withdraw, + 5: ControlMessage_Kind.heartbeat, + 6: ControlMessage_Kind.heartbeatAck, + 7: ControlMessage_Kind.rename, + 8: ControlMessage_Kind.certRenewRequest, + 9: ControlMessage_Kind.certRenewResponse, + 10: ControlMessage_Kind.dispatchCall, + 11: ControlMessage_Kind.dispatchResult, + 0: ControlMessage_Kind.notSet + }; + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'ControlMessage', + package: const $pb.PackageName(_omitMessageNames ? '' : 'fai.v1'), + createEmptyInstance: create) + ..oo(0, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) + ..aOM(1, _omitFieldNames ? '' : 'hello', + subBuilder: HelloMessage.create) + ..aOM(2, _omitFieldNames ? '' : 'accept', + subBuilder: AcceptMessage.create) + ..aOM(3, _omitFieldNames ? '' : 'advertise', + subBuilder: AdvertiseMessage.create) + ..aOM(4, _omitFieldNames ? '' : 'withdraw', + subBuilder: WithdrawMessage.create) + ..aOM(5, _omitFieldNames ? '' : 'heartbeat', + subBuilder: HeartbeatMessage.create) + ..aOM(6, _omitFieldNames ? '' : 'heartbeatAck', + subBuilder: HeartbeatAck.create) + ..aOM(7, _omitFieldNames ? '' : 'rename', + subBuilder: RenameMessage.create) + ..aOM(8, _omitFieldNames ? '' : 'certRenewRequest', + subBuilder: CertRenewRequest.create) + ..aOM(9, _omitFieldNames ? '' : 'certRenewResponse', + subBuilder: CertRenewResponse.create) + ..aOM(10, _omitFieldNames ? '' : 'dispatchCall', + subBuilder: DispatchCall.create) + ..aOM(11, _omitFieldNames ? '' : 'dispatchResult', + subBuilder: DispatchResult.create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ControlMessage clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + ControlMessage copyWith(void Function(ControlMessage) updates) => + super.copyWith((message) => updates(message as ControlMessage)) + as ControlMessage; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static ControlMessage create() => ControlMessage._(); + @$core.override + ControlMessage createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static ControlMessage getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static ControlMessage? _defaultInstance; + + @$pb.TagNumber(1) + @$pb.TagNumber(2) + @$pb.TagNumber(3) + @$pb.TagNumber(4) + @$pb.TagNumber(5) + @$pb.TagNumber(6) + @$pb.TagNumber(7) + @$pb.TagNumber(8) + @$pb.TagNumber(9) + @$pb.TagNumber(10) + @$pb.TagNumber(11) + ControlMessage_Kind whichKind() => + _ControlMessage_KindByTag[$_whichOneof(0)]!; + @$pb.TagNumber(1) + @$pb.TagNumber(2) + @$pb.TagNumber(3) + @$pb.TagNumber(4) + @$pb.TagNumber(5) + @$pb.TagNumber(6) + @$pb.TagNumber(7) + @$pb.TagNumber(8) + @$pb.TagNumber(9) + @$pb.TagNumber(10) + @$pb.TagNumber(11) + void clearKind() => $_clearField($_whichOneof(0)); + + @$pb.TagNumber(1) + HelloMessage get hello => $_getN(0); + @$pb.TagNumber(1) + set hello(HelloMessage value) => $_setField(1, value); + @$pb.TagNumber(1) + $core.bool hasHello() => $_has(0); + @$pb.TagNumber(1) + void clearHello() => $_clearField(1); + @$pb.TagNumber(1) + HelloMessage ensureHello() => $_ensure(0); + + @$pb.TagNumber(2) + AcceptMessage get accept => $_getN(1); + @$pb.TagNumber(2) + set accept(AcceptMessage value) => $_setField(2, value); + @$pb.TagNumber(2) + $core.bool hasAccept() => $_has(1); + @$pb.TagNumber(2) + void clearAccept() => $_clearField(2); + @$pb.TagNumber(2) + AcceptMessage ensureAccept() => $_ensure(1); + + @$pb.TagNumber(3) + AdvertiseMessage get advertise => $_getN(2); + @$pb.TagNumber(3) + set advertise(AdvertiseMessage value) => $_setField(3, value); + @$pb.TagNumber(3) + $core.bool hasAdvertise() => $_has(2); + @$pb.TagNumber(3) + void clearAdvertise() => $_clearField(3); + @$pb.TagNumber(3) + AdvertiseMessage ensureAdvertise() => $_ensure(2); + + @$pb.TagNumber(4) + WithdrawMessage get withdraw => $_getN(3); + @$pb.TagNumber(4) + set withdraw(WithdrawMessage value) => $_setField(4, value); + @$pb.TagNumber(4) + $core.bool hasWithdraw() => $_has(3); + @$pb.TagNumber(4) + void clearWithdraw() => $_clearField(4); + @$pb.TagNumber(4) + WithdrawMessage ensureWithdraw() => $_ensure(3); + + @$pb.TagNumber(5) + HeartbeatMessage get heartbeat => $_getN(4); + @$pb.TagNumber(5) + set heartbeat(HeartbeatMessage value) => $_setField(5, value); + @$pb.TagNumber(5) + $core.bool hasHeartbeat() => $_has(4); + @$pb.TagNumber(5) + void clearHeartbeat() => $_clearField(5); + @$pb.TagNumber(5) + HeartbeatMessage ensureHeartbeat() => $_ensure(4); + + @$pb.TagNumber(6) + HeartbeatAck get heartbeatAck => $_getN(5); + @$pb.TagNumber(6) + set heartbeatAck(HeartbeatAck value) => $_setField(6, value); + @$pb.TagNumber(6) + $core.bool hasHeartbeatAck() => $_has(5); + @$pb.TagNumber(6) + void clearHeartbeatAck() => $_clearField(6); + @$pb.TagNumber(6) + HeartbeatAck ensureHeartbeatAck() => $_ensure(5); + + @$pb.TagNumber(7) + RenameMessage get rename => $_getN(6); + @$pb.TagNumber(7) + set rename(RenameMessage value) => $_setField(7, value); + @$pb.TagNumber(7) + $core.bool hasRename() => $_has(6); + @$pb.TagNumber(7) + void clearRename() => $_clearField(7); + @$pb.TagNumber(7) + RenameMessage ensureRename() => $_ensure(6); + + @$pb.TagNumber(8) + CertRenewRequest get certRenewRequest => $_getN(7); + @$pb.TagNumber(8) + set certRenewRequest(CertRenewRequest value) => $_setField(8, value); + @$pb.TagNumber(8) + $core.bool hasCertRenewRequest() => $_has(7); + @$pb.TagNumber(8) + void clearCertRenewRequest() => $_clearField(8); + @$pb.TagNumber(8) + CertRenewRequest ensureCertRenewRequest() => $_ensure(7); + + @$pb.TagNumber(9) + CertRenewResponse get certRenewResponse => $_getN(8); + @$pb.TagNumber(9) + set certRenewResponse(CertRenewResponse value) => $_setField(9, value); + @$pb.TagNumber(9) + $core.bool hasCertRenewResponse() => $_has(8); + @$pb.TagNumber(9) + void clearCertRenewResponse() => $_clearField(9); + @$pb.TagNumber(9) + CertRenewResponse ensureCertRenewResponse() => $_ensure(8); + + /// FED-06: cross-hub dispatch multiplexes over this same + /// satellite-opened stream (the satellite is the gRPC client, + /// so the primary cannot open a unary call back into it). The + /// primary sends DispatchCall down; the satellite executes + /// locally and sends DispatchResult back up, correlated by + /// request_id. + @$pb.TagNumber(10) + DispatchCall get dispatchCall => $_getN(9); + @$pb.TagNumber(10) + set dispatchCall(DispatchCall value) => $_setField(10, value); + @$pb.TagNumber(10) + $core.bool hasDispatchCall() => $_has(9); + @$pb.TagNumber(10) + void clearDispatchCall() => $_clearField(10); + @$pb.TagNumber(10) + DispatchCall ensureDispatchCall() => $_ensure(9); + + @$pb.TagNumber(11) + DispatchResult get dispatchResult => $_getN(10); + @$pb.TagNumber(11) + set dispatchResult(DispatchResult value) => $_setField(11, value); + @$pb.TagNumber(11) + $core.bool hasDispatchResult() => $_has(10); + @$pb.TagNumber(11) + void clearDispatchResult() => $_clearField(11); + @$pb.TagNumber(11) + DispatchResult ensureDispatchResult() => $_ensure(10); +} + +/// Primary -> satellite: please execute this capability call. The +/// request_id correlates the matching DispatchResult flowing back +/// up the same Control stream. +class DispatchCall extends $pb.GeneratedMessage { + factory DispatchCall({ + $core.String? requestId, + DispatchRequest? request, + }) { + final result = create(); + if (requestId != null) result.requestId = requestId; + if (request != null) result.request = request; + return result; + } + + DispatchCall._(); + + factory DispatchCall.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory DispatchCall.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'DispatchCall', + package: const $pb.PackageName(_omitMessageNames ? '' : 'fai.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'requestId') + ..aOM(2, _omitFieldNames ? '' : 'request', + subBuilder: DispatchRequest.create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + DispatchCall clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + DispatchCall copyWith(void Function(DispatchCall) updates) => + super.copyWith((message) => updates(message as DispatchCall)) + as DispatchCall; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static DispatchCall create() => DispatchCall._(); + @$core.override + DispatchCall createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static DispatchCall getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static DispatchCall? _defaultInstance; + + /// Per-call correlation id (UUIDv7), primary-generated. Unique + /// within the connection's in-flight window. + @$pb.TagNumber(1) + $core.String get requestId => $_getSZ(0); + @$pb.TagNumber(1) + set requestId($core.String value) => $_setString(0, value); + @$pb.TagNumber(1) + $core.bool hasRequestId() => $_has(0); + @$pb.TagNumber(1) + void clearRequestId() => $_clearField(1); + + /// The call to execute. Reuses the unary message shape. + @$pb.TagNumber(2) + DispatchRequest get request => $_getN(1); + @$pb.TagNumber(2) + set request(DispatchRequest value) => $_setField(2, value); + @$pb.TagNumber(2) + $core.bool hasRequest() => $_has(1); + @$pb.TagNumber(2) + void clearRequest() => $_clearField(2); + @$pb.TagNumber(2) + DispatchRequest ensureRequest() => $_ensure(1); +} + +/// Satellite -> primary: the result of a prior DispatchCall. +class DispatchResult extends $pb.GeneratedMessage { + factory DispatchResult({ + $core.String? requestId, + DispatchResponse? response, + }) { + final result = create(); + if (requestId != null) result.requestId = requestId; + if (response != null) result.response = response; + return result; + } + + DispatchResult._(); + + factory DispatchResult.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory DispatchResult.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'DispatchResult', + package: const $pb.PackageName(_omitMessageNames ? '' : 'fai.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'requestId') + ..aOM(2, _omitFieldNames ? '' : 'response', + subBuilder: DispatchResponse.create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + DispatchResult clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + DispatchResult copyWith(void Function(DispatchResult) updates) => + super.copyWith((message) => updates(message as DispatchResult)) + as DispatchResult; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static DispatchResult create() => DispatchResult._(); + @$core.override + DispatchResult createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static DispatchResult getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static DispatchResult? _defaultInstance; + + /// Echoes the originating DispatchCall.request_id. + @$pb.TagNumber(1) + $core.String get requestId => $_getSZ(0); + @$pb.TagNumber(1) + set requestId($core.String value) => $_setString(0, value); + @$pb.TagNumber(1) + $core.bool hasRequestId() => $_has(0); + @$pb.TagNumber(1) + void clearRequestId() => $_clearField(1); + + /// Outputs / error / timing for the executed call. + @$pb.TagNumber(2) + DispatchResponse get response => $_getN(1); + @$pb.TagNumber(2) + set response(DispatchResponse value) => $_setField(2, value); + @$pb.TagNumber(2) + $core.bool hasResponse() => $_has(1); + @$pb.TagNumber(2) + void clearResponse() => $_clearField(2); + @$pb.TagNumber(2) + DispatchResponse ensureResponse() => $_ensure(1); +} + +/// First message a satellite sends after the TLS handshake. The +/// primary either responds with Accept (success) or closes the +/// stream with a status carrying a friendlyError-shaped detail +/// (no overlap on wire_version, bootstrap token rejected, display +/// name already in use, etc.). +class HelloMessage extends $pb.GeneratedMessage { + factory HelloMessage({ + $core.String? hubId, + $core.String? displayName, + $core.String? hubVersion, + $core.Iterable<$core.int>? wireVersionsSupported, + $core.Iterable<$core.String>? witVersionsSupported, + $core.String? bootstrapToken, + $core.String? region, + $core.String? csrPem, + }) { + final result = create(); + if (hubId != null) result.hubId = hubId; + if (displayName != null) result.displayName = displayName; + if (hubVersion != null) result.hubVersion = hubVersion; + if (wireVersionsSupported != null) + result.wireVersionsSupported.addAll(wireVersionsSupported); + if (witVersionsSupported != null) + result.witVersionsSupported.addAll(witVersionsSupported); + if (bootstrapToken != null) result.bootstrapToken = bootstrapToken; + if (region != null) result.region = region; + if (csrPem != null) result.csrPem = csrPem; + return result; + } + + HelloMessage._(); + + factory HelloMessage.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory HelloMessage.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'HelloMessage', + package: const $pb.PackageName(_omitMessageNames ? '' : 'fai.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'hubId') + ..aOS(2, _omitFieldNames ? '' : 'displayName') + ..aOS(3, _omitFieldNames ? '' : 'hubVersion') + ..p<$core.int>( + 4, _omitFieldNames ? '' : 'wireVersionsSupported', $pb.PbFieldType.KU3) + ..pPS(5, _omitFieldNames ? '' : 'witVersionsSupported') + ..aOS(6, _omitFieldNames ? '' : 'bootstrapToken') + ..aOS(7, _omitFieldNames ? '' : 'region') + ..aOS(8, _omitFieldNames ? '' : 'csrPem') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + HelloMessage clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + HelloMessage copyWith(void Function(HelloMessage) updates) => + super.copyWith((message) => updates(message as HelloMessage)) + as HelloMessage; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static HelloMessage create() => HelloMessage._(); + @$core.override + HelloMessage createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static HelloMessage getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static HelloMessage? _defaultInstance; + + /// Immutable Hub Instance UUID (UUIDv7) generated at the + /// satellite's first `fai init`. Persisted in `~/.fai/hub-id`. + /// The federation cert's subject embeds this value; it can + /// never change without a fresh `fai init`. + @$pb.TagNumber(1) + $core.String get hubId => $_getSZ(0); + @$pb.TagNumber(1) + set hubId($core.String value) => $_setString(0, value); + @$pb.TagNumber(1) + $core.bool hasHubId() => $_has(0); + @$pb.TagNumber(1) + void clearHubId() => $_clearField(1); + + /// Operator-chosen display name (e.g. "satellite-a"). May be + /// changed later via the Rename message. The primary refuses + /// a Hello whose display_name collides with another connected + /// satellite. + @$pb.TagNumber(2) + $core.String get displayName => $_getSZ(1); + @$pb.TagNumber(2) + set displayName($core.String value) => $_setString(1, value); + @$pb.TagNumber(2) + $core.bool hasDisplayName() => $_has(1); + @$pb.TagNumber(2) + void clearDisplayName() => $_clearField(2); + + /// F∆I binary version, informational. Lets the primary record + /// satellite versions for operator visibility without coupling + /// them to wire compatibility (which is governed by + /// wire_versions_supported below). + @$pb.TagNumber(3) + $core.String get hubVersion => $_getSZ(2); + @$pb.TagNumber(3) + set hubVersion($core.String value) => $_setString(2, value); + @$pb.TagNumber(3) + $core.bool hasHubVersion() => $_has(2); + @$pb.TagNumber(3) + void clearHubVersion() => $_clearField(3); + + /// Set of federation wire-protocol versions the satellite can + /// speak. The primary picks the highest element also in its own + /// supported set. Empty list is treated as `[1]`. + @$pb.TagNumber(4) + $pb.PbList<$core.int> get wireVersionsSupported => $_getList(3); + + /// Set of module-WIT contract versions the satellite supports. + /// Per-capability advertisements carry their own wit_version; + /// this is the satellite's overall envelope. + @$pb.TagNumber(5) + $pb.PbList<$core.String> get witVersionsSupported => $_getList(4); + + /// Single-use bootstrap token, present only on the *very first* + /// connect when the satellite has no federation cert yet. The + /// primary validates against its issued-but-unused token store, + /// issues a 24h federation cert in the Accept message, and + /// marks the token consumed. + /// + /// Empty string on every subsequent connect — the satellite + /// identifies itself with the mTLS cert and this field is + /// ignored. + @$pb.TagNumber(6) + $core.String get bootstrapToken => $_getSZ(5); + @$pb.TagNumber(6) + set bootstrapToken($core.String value) => $_setString(5, value); + @$pb.TagNumber(6) + $core.bool hasBootstrapToken() => $_has(5); + @$pb.TagNumber(6) + void clearBootstrapToken() => $_clearField(6); + + /// Optional region tag the satellite claims at first enrollment. + /// Signed into the issued cert by the primary; future connects + /// read region from the cert, not from this field. + @$pb.TagNumber(7) + $core.String get region => $_getSZ(6); + @$pb.TagNumber(7) + set region($core.String value) => $_setString(6, value); + @$pb.TagNumber(7) + $core.bool hasRegion() => $_has(6); + @$pb.TagNumber(7) + void clearRegion() => $_clearField(7); + + /// PEM-encoded PKCS#10 CSR generated by the satellite on first + /// enrollment, with its immutable hub UUID in the subject CN. The + /// primary's CA signs it (pinning that UUID) and returns the leaf + /// cert in `AcceptMessage.issued_cert_pem`. Empty on reconnects + /// once the satellite already holds a valid cert. + @$pb.TagNumber(8) + $core.String get csrPem => $_getSZ(7); + @$pb.TagNumber(8) + set csrPem($core.String value) => $_setString(7, value); + @$pb.TagNumber(8) + $core.bool hasCsrPem() => $_has(7); + @$pb.TagNumber(8) + void clearCsrPem() => $_clearField(8); +} + +/// First message the primary sends in response to Hello. Closes +/// the handshake; the connection is then ready for advertisements +/// and dispatch. +class AcceptMessage extends $pb.GeneratedMessage { + factory AcceptMessage({ + $core.int? wireVersionChosen, + $core.String? primaryHubId, + $core.String? primaryDisplayName, + $core.String? primaryHubVersion, + $core.Iterable<$core.int>? primaryWireVersionsSupported, + $core.String? issuedCertPem, + $core.String? certExpiresAt, + }) { + final result = create(); + if (wireVersionChosen != null) result.wireVersionChosen = wireVersionChosen; + if (primaryHubId != null) result.primaryHubId = primaryHubId; + if (primaryDisplayName != null) + result.primaryDisplayName = primaryDisplayName; + if (primaryHubVersion != null) result.primaryHubVersion = primaryHubVersion; + if (primaryWireVersionsSupported != null) + result.primaryWireVersionsSupported.addAll(primaryWireVersionsSupported); + if (issuedCertPem != null) result.issuedCertPem = issuedCertPem; + if (certExpiresAt != null) result.certExpiresAt = certExpiresAt; + return result; + } + + AcceptMessage._(); + + factory AcceptMessage.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory AcceptMessage.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'AcceptMessage', + package: const $pb.PackageName(_omitMessageNames ? '' : 'fai.v1'), + createEmptyInstance: create) + ..aI(1, _omitFieldNames ? '' : 'wireVersionChosen', + fieldType: $pb.PbFieldType.OU3) + ..aOS(2, _omitFieldNames ? '' : 'primaryHubId') + ..aOS(3, _omitFieldNames ? '' : 'primaryDisplayName') + ..aOS(4, _omitFieldNames ? '' : 'primaryHubVersion') + ..p<$core.int>(5, _omitFieldNames ? '' : 'primaryWireVersionsSupported', + $pb.PbFieldType.KU3) + ..aOS(6, _omitFieldNames ? '' : 'issuedCertPem') + ..aOS(7, _omitFieldNames ? '' : 'certExpiresAt') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + AcceptMessage clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + AcceptMessage copyWith(void Function(AcceptMessage) updates) => + super.copyWith((message) => updates(message as AcceptMessage)) + as AcceptMessage; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static AcceptMessage create() => AcceptMessage._(); + @$core.override + AcceptMessage createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static AcceptMessage getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static AcceptMessage? _defaultInstance; + + /// Wire version both sides will use for the lifetime of this + /// connection. Highest common element of + /// `hello.wire_versions_supported` and the primary's own list. + @$pb.TagNumber(1) + $core.int get wireVersionChosen => $_getIZ(0); + @$pb.TagNumber(1) + set wireVersionChosen($core.int value) => $_setUnsignedInt32(0, value); + @$pb.TagNumber(1) + $core.bool hasWireVersionChosen() => $_has(0); + @$pb.TagNumber(1) + void clearWireVersionChosen() => $_clearField(1); + + /// Primary's own identity, so the satellite can record it in + /// its routing table and audit log. + @$pb.TagNumber(2) + $core.String get primaryHubId => $_getSZ(1); + @$pb.TagNumber(2) + set primaryHubId($core.String value) => $_setString(1, value); + @$pb.TagNumber(2) + $core.bool hasPrimaryHubId() => $_has(1); + @$pb.TagNumber(2) + void clearPrimaryHubId() => $_clearField(2); + + @$pb.TagNumber(3) + $core.String get primaryDisplayName => $_getSZ(2); + @$pb.TagNumber(3) + set primaryDisplayName($core.String value) => $_setString(2, value); + @$pb.TagNumber(3) + $core.bool hasPrimaryDisplayName() => $_has(2); + @$pb.TagNumber(3) + void clearPrimaryDisplayName() => $_clearField(3); + + @$pb.TagNumber(4) + $core.String get primaryHubVersion => $_getSZ(3); + @$pb.TagNumber(4) + set primaryHubVersion($core.String value) => $_setString(3, value); + @$pb.TagNumber(4) + $core.bool hasPrimaryHubVersion() => $_has(3); + @$pb.TagNumber(4) + void clearPrimaryHubVersion() => $_clearField(4); + + @$pb.TagNumber(5) + $pb.PbList<$core.int> get primaryWireVersionsSupported => $_getList(4); + + /// Federation cert PEM issued by the primary. Present on + /// enrollment connect (when hello.bootstrap_token was set) and + /// on cert renewals (in response to CertRenewRequest). Empty + /// on plain reconnect with an existing valid cert. + @$pb.TagNumber(6) + $core.String get issuedCertPem => $_getSZ(5); + @$pb.TagNumber(6) + set issuedCertPem($core.String value) => $_setString(5, value); + @$pb.TagNumber(6) + $core.bool hasIssuedCertPem() => $_has(5); + @$pb.TagNumber(6) + void clearIssuedCertPem() => $_clearField(6); + + /// ISO-8601 expiry of `issued_cert_pem`. Empty when no cert + /// issued in this message. + @$pb.TagNumber(7) + $core.String get certExpiresAt => $_getSZ(6); + @$pb.TagNumber(7) + set certExpiresAt($core.String value) => $_setString(6, value); + @$pb.TagNumber(7) + $core.bool hasCertExpiresAt() => $_has(6); + @$pb.TagNumber(7) + void clearCertExpiresAt() => $_clearField(7); +} + +/// Capability advertisement. Sent after Accept and any time the +/// satellite's local registry changes (install, uninstall, +/// disable). Replaces — does not append to — any prior +/// advertisement from this connection. +class AdvertiseMessage extends $pb.GeneratedMessage { + factory AdvertiseMessage({ + $core.Iterable? capabilities, + }) { + final result = create(); + if (capabilities != null) result.capabilities.addAll(capabilities); + return result; + } + + AdvertiseMessage._(); + + factory AdvertiseMessage.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory AdvertiseMessage.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'AdvertiseMessage', + package: const $pb.PackageName(_omitMessageNames ? '' : 'fai.v1'), + createEmptyInstance: create) + ..pPM(1, _omitFieldNames ? '' : 'capabilities', + subBuilder: CapabilityAdvertisement.create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + AdvertiseMessage clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + AdvertiseMessage copyWith(void Function(AdvertiseMessage) updates) => + super.copyWith((message) => updates(message as AdvertiseMessage)) + as AdvertiseMessage; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static AdvertiseMessage create() => AdvertiseMessage._(); + @$core.override + AdvertiseMessage createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static AdvertiseMessage getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static AdvertiseMessage? _defaultInstance; + + @$pb.TagNumber(1) + $pb.PbList get capabilities => $_getList(0); +} + +/// One advertised capability. The primary indexes by +/// (capability_id, origin_uuid) — never by display name, so a +/// rename never invalidates the index. +class CapabilityAdvertisement extends $pb.GeneratedMessage { + factory CapabilityAdvertisement({ + $core.String? capabilityId, + $core.String? originUuid, + $core.String? originName, + $core.Iterable<$core.String>? route, + $core.String? region, + Quality? quality, + $core.Iterable<$core.String>? permissions, + $core.String? witVersion, + $core.String? hubVersion, + }) { + final result = create(); + if (capabilityId != null) result.capabilityId = capabilityId; + if (originUuid != null) result.originUuid = originUuid; + if (originName != null) result.originName = originName; + if (route != null) result.route.addAll(route); + if (region != null) result.region = region; + if (quality != null) result.quality = quality; + if (permissions != null) result.permissions.addAll(permissions); + if (witVersion != null) result.witVersion = witVersion; + if (hubVersion != null) result.hubVersion = hubVersion; + return result; + } + + CapabilityAdvertisement._(); + + factory CapabilityAdvertisement.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory CapabilityAdvertisement.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'CapabilityAdvertisement', + package: const $pb.PackageName(_omitMessageNames ? '' : 'fai.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'capabilityId') + ..aOS(2, _omitFieldNames ? '' : 'originUuid') + ..aOS(3, _omitFieldNames ? '' : 'originName') + ..pPS(4, _omitFieldNames ? '' : 'route') + ..aOS(5, _omitFieldNames ? '' : 'region') + ..aOM(6, _omitFieldNames ? '' : 'quality', + subBuilder: Quality.create) + ..pPS(7, _omitFieldNames ? '' : 'permissions') + ..aOS(8, _omitFieldNames ? '' : 'witVersion') + ..aOS(9, _omitFieldNames ? '' : 'hubVersion') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + CapabilityAdvertisement clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + CapabilityAdvertisement copyWith( + void Function(CapabilityAdvertisement) updates) => + super.copyWith((message) => updates(message as CapabilityAdvertisement)) + as CapabilityAdvertisement; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static CapabilityAdvertisement create() => CapabilityAdvertisement._(); + @$core.override + CapabilityAdvertisement createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static CapabilityAdvertisement getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static CapabilityAdvertisement? _defaultInstance; + + /// Fully qualified id, e.g. "text.extract@1.4.2". SemVer + /// version follows the @. + @$pb.TagNumber(1) + $core.String get capabilityId => $_getSZ(0); + @$pb.TagNumber(1) + set capabilityId($core.String value) => $_setString(0, value); + @$pb.TagNumber(1) + $core.bool hasCapabilityId() => $_has(0); + @$pb.TagNumber(1) + void clearCapabilityId() => $_clearField(1); + + /// UUID of the hub that *originally* provides this capability. + /// Distinct from the connection's sender UUID when an + /// intermediate hub is re-advertising (mesh phases). + @$pb.TagNumber(2) + $core.String get originUuid => $_getSZ(1); + @$pb.TagNumber(2) + set originUuid($core.String value) => $_setString(1, value); + @$pb.TagNumber(2) + $core.bool hasOriginUuid() => $_has(1); + @$pb.TagNumber(2) + void clearOriginUuid() => $_clearField(2); + + /// Display name of the origin hub at advertisement time. + /// Operator-friendly label; the primary stores the UUID for + /// routing and resolves to name for display. + @$pb.TagNumber(3) + $core.String get originName => $_getSZ(2); + @$pb.TagNumber(3) + set originName($core.String value) => $_setString(2, value); + @$pb.TagNumber(3) + $core.bool hasOriginName() => $_has(2); + @$pb.TagNumber(3) + void clearOriginName() => $_clearField(3); + + /// BGP-style path: ordered list of hub UUIDs the advertisement + /// travelled through, **oldest first**. The receiving hub + /// refuses to accept an advertisement whose route already + /// contains its own UUID (loop prevention). + @$pb.TagNumber(4) + $pb.PbList<$core.String> get route => $_getList(3); + + /// Optional region tag inherited from the origin's cert. + /// Empty when the origin advertises no region. + @$pb.TagNumber(5) + $core.String get region => $_getSZ(4); + @$pb.TagNumber(5) + set region($core.String value) => $_setString(4, value); + @$pb.TagNumber(5) + $core.bool hasRegion() => $_has(4); + @$pb.TagNumber(5) + void clearRegion() => $_clearField(5); + + /// Quality metrics measured at the origin hub. Used by the + /// primary for `auto:healthiest` / `auto:lowest_rtt` selection. + @$pb.TagNumber(6) + Quality get quality => $_getN(5); + @$pb.TagNumber(6) + set quality(Quality value) => $_setField(6, value); + @$pb.TagNumber(6) + $core.bool hasQuality() => $_has(5); + @$pb.TagNumber(6) + void clearQuality() => $_clearField(6); + @$pb.TagNumber(6) + Quality ensureQuality() => $_ensure(5); + + /// Permission strings the satellite-side module declared, + /// informational only. Each satellite enforces its own + /// ceiling locally; the primary cannot widen permissions + /// remotely. + @$pb.TagNumber(7) + $pb.PbList<$core.String> get permissions => $_getList(6); + + /// Module WIT contract version. The primary refuses to + /// dispatch into a satellite advertising a WIT version it does + /// not support. + @$pb.TagNumber(8) + $core.String get witVersion => $_getSZ(7); + @$pb.TagNumber(8) + set witVersion($core.String value) => $_setString(7, value); + @$pb.TagNumber(8) + $core.bool hasWitVersion() => $_has(7); + @$pb.TagNumber(8) + void clearWitVersion() => $_clearField(8); + + /// F∆I binary version that loaded this capability at the + /// origin. Informational. + @$pb.TagNumber(9) + $core.String get hubVersion => $_getSZ(8); + @$pb.TagNumber(9) + set hubVersion($core.String value) => $_setString(8, value); + @$pb.TagNumber(9) + $core.bool hasHubVersion() => $_has(8); + @$pb.TagNumber(9) + void clearHubVersion() => $_clearField(9); +} + +/// Quality metrics piggybacked on every advertisement update. +/// Numbers measured at the origin hub; an end-to-end RTT field +/// (sum across hops) lands in Phase 1.2 when mesh +/// re-advertisement ships. +class Quality extends $pb.GeneratedMessage { + factory Quality({ + $core.int? rttP50Ms, + $core.int? rttP95Ms, + $core.double? successRate30m, + $core.int? streamsActive, + $core.int? streamsCapacity, + }) { + final result = create(); + if (rttP50Ms != null) result.rttP50Ms = rttP50Ms; + if (rttP95Ms != null) result.rttP95Ms = rttP95Ms; + if (successRate30m != null) result.successRate30m = successRate30m; + if (streamsActive != null) result.streamsActive = streamsActive; + if (streamsCapacity != null) result.streamsCapacity = streamsCapacity; + return result; + } + + Quality._(); + + factory Quality.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory Quality.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'Quality', + package: const $pb.PackageName(_omitMessageNames ? '' : 'fai.v1'), + createEmptyInstance: create) + ..aI(1, _omitFieldNames ? '' : 'rttP50Ms', fieldType: $pb.PbFieldType.OU3) + ..aI(2, _omitFieldNames ? '' : 'rttP95Ms', fieldType: $pb.PbFieldType.OU3) + ..aD(3, _omitFieldNames ? '' : 'successRate30m', + protoName: 'success_rate_30m', fieldType: $pb.PbFieldType.OF) + ..aI(4, _omitFieldNames ? '' : 'streamsActive', + fieldType: $pb.PbFieldType.OU3) + ..aI(5, _omitFieldNames ? '' : 'streamsCapacity', + fieldType: $pb.PbFieldType.OU3) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + Quality clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + Quality copyWith(void Function(Quality) updates) => + super.copyWith((message) => updates(message as Quality)) as Quality; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static Quality create() => Quality._(); + @$core.override + Quality createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static Quality getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static Quality? _defaultInstance; + + /// 50th percentile round-trip time over the recent window. + @$pb.TagNumber(1) + $core.int get rttP50Ms => $_getIZ(0); + @$pb.TagNumber(1) + set rttP50Ms($core.int value) => $_setUnsignedInt32(0, value); + @$pb.TagNumber(1) + $core.bool hasRttP50Ms() => $_has(0); + @$pb.TagNumber(1) + void clearRttP50Ms() => $_clearField(1); + + /// 95th percentile round-trip time over the recent window. + @$pb.TagNumber(2) + $core.int get rttP95Ms => $_getIZ(1); + @$pb.TagNumber(2) + set rttP95Ms($core.int value) => $_setUnsignedInt32(1, value); + @$pb.TagNumber(2) + $core.bool hasRttP95Ms() => $_has(1); + @$pb.TagNumber(2) + void clearRttP95Ms() => $_clearField(2); + + /// Successful invocations / total in last 30 min. 1.0 = all + /// succeeded. 0.0 = all failed (or no data). + @$pb.TagNumber(3) + $core.double get successRate30m => $_getN(2); + @$pb.TagNumber(3) + set successRate30m($core.double value) => $_setFloat(2, value); + @$pb.TagNumber(3) + $core.bool hasSuccessRate30m() => $_has(2); + @$pb.TagNumber(3) + void clearSuccessRate30m() => $_clearField(3); + + /// Currently in-flight streams (rough load indicator). + @$pb.TagNumber(4) + $core.int get streamsActive => $_getIZ(3); + @$pb.TagNumber(4) + set streamsActive($core.int value) => $_setUnsignedInt32(3, value); + @$pb.TagNumber(4) + $core.bool hasStreamsActive() => $_has(3); + @$pb.TagNumber(4) + void clearStreamsActive() => $_clearField(4); + + /// Per-satellite hard limit on concurrent streams. Lets the + /// primary calculate utilisation for least-loaded selection. + @$pb.TagNumber(5) + $core.int get streamsCapacity => $_getIZ(4); + @$pb.TagNumber(5) + set streamsCapacity($core.int value) => $_setUnsignedInt32(4, value); + @$pb.TagNumber(5) + $core.bool hasStreamsCapacity() => $_has(4); + @$pb.TagNumber(5) + void clearStreamsCapacity() => $_clearField(5); +} + +/// Withdraw one or more capabilities. Equivalent to sending an +/// Advertise without these entries, but lighter on the wire when +/// only a small subset changed. +class WithdrawMessage extends $pb.GeneratedMessage { + factory WithdrawMessage({ + $core.Iterable<$core.String>? capabilityIds, + $core.String? originUuid, + }) { + final result = create(); + if (capabilityIds != null) result.capabilityIds.addAll(capabilityIds); + if (originUuid != null) result.originUuid = originUuid; + return result; + } + + WithdrawMessage._(); + + factory WithdrawMessage.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory WithdrawMessage.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'WithdrawMessage', + package: const $pb.PackageName(_omitMessageNames ? '' : 'fai.v1'), + createEmptyInstance: create) + ..pPS(1, _omitFieldNames ? '' : 'capabilityIds') + ..aOS(2, _omitFieldNames ? '' : 'originUuid') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + WithdrawMessage clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + WithdrawMessage copyWith(void Function(WithdrawMessage) updates) => + super.copyWith((message) => updates(message as WithdrawMessage)) + as WithdrawMessage; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static WithdrawMessage create() => WithdrawMessage._(); + @$core.override + WithdrawMessage createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static WithdrawMessage getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static WithdrawMessage? _defaultInstance; + + /// Fully-qualified ids to withdraw. + @$pb.TagNumber(1) + $pb.PbList<$core.String> get capabilityIds => $_getList(0); + + /// Only advertisements from this origin UUID are affected. + @$pb.TagNumber(2) + $core.String get originUuid => $_getSZ(1); + @$pb.TagNumber(2) + set originUuid($core.String value) => $_setString(1, value); + @$pb.TagNumber(2) + $core.bool hasOriginUuid() => $_has(1); + @$pb.TagNumber(2) + void clearOriginUuid() => $_clearField(2); +} + +/// Liveness + RTT probe. Cadence configurable; default 10 s with +/// jitter. +class HeartbeatMessage extends $pb.GeneratedMessage { + factory HeartbeatMessage({ + $fixnum.Int64? nonce, + $fixnum.Int64? satelliteTimeMs, + }) { + final result = create(); + if (nonce != null) result.nonce = nonce; + if (satelliteTimeMs != null) result.satelliteTimeMs = satelliteTimeMs; + return result; + } + + HeartbeatMessage._(); + + factory HeartbeatMessage.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory HeartbeatMessage.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'HeartbeatMessage', + package: const $pb.PackageName(_omitMessageNames ? '' : 'fai.v1'), + createEmptyInstance: create) + ..a<$fixnum.Int64>(1, _omitFieldNames ? '' : 'nonce', $pb.PbFieldType.OU6, + defaultOrMaker: $fixnum.Int64.ZERO) + ..aInt64(2, _omitFieldNames ? '' : 'satelliteTimeMs') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + HeartbeatMessage clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + HeartbeatMessage copyWith(void Function(HeartbeatMessage) updates) => + super.copyWith((message) => updates(message as HeartbeatMessage)) + as HeartbeatMessage; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static HeartbeatMessage create() => HeartbeatMessage._(); + @$core.override + HeartbeatMessage createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static HeartbeatMessage getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static HeartbeatMessage? _defaultInstance; + + /// Monotonic per-connection nonce so the Ack can be matched. + @$pb.TagNumber(1) + $fixnum.Int64 get nonce => $_getI64(0); + @$pb.TagNumber(1) + set nonce($fixnum.Int64 value) => $_setInt64(0, value); + @$pb.TagNumber(1) + $core.bool hasNonce() => $_has(0); + @$pb.TagNumber(1) + void clearNonce() => $_clearField(1); + + /// Milliseconds since epoch on the satellite at send time. + @$pb.TagNumber(2) + $fixnum.Int64 get satelliteTimeMs => $_getI64(1); + @$pb.TagNumber(2) + set satelliteTimeMs($fixnum.Int64 value) => $_setInt64(1, value); + @$pb.TagNumber(2) + $core.bool hasSatelliteTimeMs() => $_has(1); + @$pb.TagNumber(2) + void clearSatelliteTimeMs() => $_clearField(2); +} + +class HeartbeatAck extends $pb.GeneratedMessage { + factory HeartbeatAck({ + $fixnum.Int64? nonce, + $fixnum.Int64? primaryTimeMs, + }) { + final result = create(); + if (nonce != null) result.nonce = nonce; + if (primaryTimeMs != null) result.primaryTimeMs = primaryTimeMs; + return result; + } + + HeartbeatAck._(); + + factory HeartbeatAck.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory HeartbeatAck.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'HeartbeatAck', + package: const $pb.PackageName(_omitMessageNames ? '' : 'fai.v1'), + createEmptyInstance: create) + ..a<$fixnum.Int64>(1, _omitFieldNames ? '' : 'nonce', $pb.PbFieldType.OU6, + defaultOrMaker: $fixnum.Int64.ZERO) + ..aInt64(2, _omitFieldNames ? '' : 'primaryTimeMs') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + HeartbeatAck clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + HeartbeatAck copyWith(void Function(HeartbeatAck) updates) => + super.copyWith((message) => updates(message as HeartbeatAck)) + as HeartbeatAck; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static HeartbeatAck create() => HeartbeatAck._(); + @$core.override + HeartbeatAck createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static HeartbeatAck getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static HeartbeatAck? _defaultInstance; + + @$pb.TagNumber(1) + $fixnum.Int64 get nonce => $_getI64(0); + @$pb.TagNumber(1) + set nonce($fixnum.Int64 value) => $_setInt64(0, value); + @$pb.TagNumber(1) + $core.bool hasNonce() => $_has(0); + @$pb.TagNumber(1) + void clearNonce() => $_clearField(1); + + /// Milliseconds since epoch on the primary at ack time. + @$pb.TagNumber(2) + $fixnum.Int64 get primaryTimeMs => $_getI64(1); + @$pb.TagNumber(2) + set primaryTimeMs($fixnum.Int64 value) => $_setInt64(1, value); + @$pb.TagNumber(2) + $core.bool hasPrimaryTimeMs() => $_has(1); + @$pb.TagNumber(2) + void clearPrimaryTimeMs() => $_clearField(2); +} + +/// Operator-driven rename. Display name changes do not require a +/// new cert because the UUID stays the same. The primary +/// re-validates name uniqueness within its federation, updates +/// its routing table, and emits an audit event tying old and new +/// names to the unchanged UUID. +class RenameMessage extends $pb.GeneratedMessage { + factory RenameMessage({ + $core.String? newDisplayName, + }) { + final result = create(); + if (newDisplayName != null) result.newDisplayName = newDisplayName; + return result; + } + + RenameMessage._(); + + factory RenameMessage.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory RenameMessage.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'RenameMessage', + package: const $pb.PackageName(_omitMessageNames ? '' : 'fai.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'newDisplayName') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + RenameMessage clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + RenameMessage copyWith(void Function(RenameMessage) updates) => + super.copyWith((message) => updates(message as RenameMessage)) + as RenameMessage; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static RenameMessage create() => RenameMessage._(); + @$core.override + RenameMessage createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static RenameMessage getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static RenameMessage? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get newDisplayName => $_getSZ(0); + @$pb.TagNumber(1) + set newDisplayName($core.String value) => $_setString(0, value); + @$pb.TagNumber(1) + $core.bool hasNewDisplayName() => $_has(0); + @$pb.TagNumber(1) + void clearNewDisplayName() => $_clearField(1); +} + +/// Cert renewal. The satellite generates a CSR locally, embedding +/// its immutable hub UUID in the subject. The primary's CA +/// signing logic MUST verify that the CSR subject's hub UUID +/// matches the connection's existing mTLS cert UUID — a stolen +/// cert otherwise lets an attacker renew into a different UUID +/// and bypass revocation. +class CertRenewRequest extends $pb.GeneratedMessage { + factory CertRenewRequest({ + $core.String? csrPem, + }) { + final result = create(); + if (csrPem != null) result.csrPem = csrPem; + return result; + } + + CertRenewRequest._(); + + factory CertRenewRequest.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory CertRenewRequest.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'CertRenewRequest', + package: const $pb.PackageName(_omitMessageNames ? '' : 'fai.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'csrPem') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + CertRenewRequest clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + CertRenewRequest copyWith(void Function(CertRenewRequest) updates) => + super.copyWith((message) => updates(message as CertRenewRequest)) + as CertRenewRequest; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static CertRenewRequest create() => CertRenewRequest._(); + @$core.override + CertRenewRequest createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static CertRenewRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static CertRenewRequest? _defaultInstance; + + /// PEM-encoded PKCS#10 certificate signing request. + @$pb.TagNumber(1) + $core.String get csrPem => $_getSZ(0); + @$pb.TagNumber(1) + set csrPem($core.String value) => $_setString(0, value); + @$pb.TagNumber(1) + $core.bool hasCsrPem() => $_has(0); + @$pb.TagNumber(1) + void clearCsrPem() => $_clearField(1); +} + +class CertRenewResponse extends $pb.GeneratedMessage { + factory CertRenewResponse({ + $core.String? certPem, + $core.String? expiresAt, + $core.String? error, + }) { + final result = create(); + if (certPem != null) result.certPem = certPem; + if (expiresAt != null) result.expiresAt = expiresAt; + if (error != null) result.error = error; + return result; + } + + CertRenewResponse._(); + + factory CertRenewResponse.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory CertRenewResponse.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'CertRenewResponse', + package: const $pb.PackageName(_omitMessageNames ? '' : 'fai.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'certPem') + ..aOS(2, _omitFieldNames ? '' : 'expiresAt') + ..aOS(3, _omitFieldNames ? '' : 'error') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + CertRenewResponse clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + CertRenewResponse copyWith(void Function(CertRenewResponse) updates) => + super.copyWith((message) => updates(message as CertRenewResponse)) + as CertRenewResponse; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static CertRenewResponse create() => CertRenewResponse._(); + @$core.override + CertRenewResponse createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static CertRenewResponse getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static CertRenewResponse? _defaultInstance; + + /// PEM-encoded fresh cert on success. Empty on refusal. + @$pb.TagNumber(1) + $core.String get certPem => $_getSZ(0); + @$pb.TagNumber(1) + set certPem($core.String value) => $_setString(0, value); + @$pb.TagNumber(1) + $core.bool hasCertPem() => $_has(0); + @$pb.TagNumber(1) + void clearCertPem() => $_clearField(1); + + /// ISO-8601 expiry of `cert_pem`. Empty when refused. + @$pb.TagNumber(2) + $core.String get expiresAt => $_getSZ(1); + @$pb.TagNumber(2) + set expiresAt($core.String value) => $_setString(1, value); + @$pb.TagNumber(2) + $core.bool hasExpiresAt() => $_has(1); + @$pb.TagNumber(2) + void clearExpiresAt() => $_clearField(2); + + /// Human-readable refusal reason. Empty on success. + @$pb.TagNumber(3) + $core.String get error => $_getSZ(2); + @$pb.TagNumber(3) + set error($core.String value) => $_setString(2, value); + @$pb.TagNumber(3) + $core.bool hasError() => $_has(2); + @$pb.TagNumber(3) + void clearError() => $_clearField(3); +} + +/// Dispatch one capability call. The dispatcher at the primary +/// resolves a flow step's `use:` + `on:` into one DispatchRequest +/// addressed at the chosen satellite's UUID. +class DispatchRequest extends $pb.GeneratedMessage { + factory DispatchRequest({ + $core.String? capabilityId, + $core.String? targetHubId, + $core.Iterable<$core.MapEntry<$core.String, $1.Payload>>? inputs, + $core.String? traceId, + $core.String? nonce, + $core.String? callerName, + $core.String? regionRequired, + }) { + final result = create(); + if (capabilityId != null) result.capabilityId = capabilityId; + if (targetHubId != null) result.targetHubId = targetHubId; + if (inputs != null) result.inputs.addEntries(inputs); + if (traceId != null) result.traceId = traceId; + if (nonce != null) result.nonce = nonce; + if (callerName != null) result.callerName = callerName; + if (regionRequired != null) result.regionRequired = regionRequired; + return result; + } + + DispatchRequest._(); + + factory DispatchRequest.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory DispatchRequest.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'DispatchRequest', + package: const $pb.PackageName(_omitMessageNames ? '' : 'fai.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'capabilityId') + ..aOS(2, _omitFieldNames ? '' : 'targetHubId') + ..m<$core.String, $1.Payload>(3, _omitFieldNames ? '' : 'inputs', + entryClassName: 'DispatchRequest.InputsEntry', + keyFieldType: $pb.PbFieldType.OS, + valueFieldType: $pb.PbFieldType.OM, + valueCreator: $1.Payload.create, + valueDefaultOrMaker: $1.Payload.getDefault, + packageName: const $pb.PackageName('fai.v1')) + ..aOS(4, _omitFieldNames ? '' : 'traceId') + ..aOS(5, _omitFieldNames ? '' : 'nonce') + ..aOS(6, _omitFieldNames ? '' : 'callerName') + ..aOS(7, _omitFieldNames ? '' : 'regionRequired') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + DispatchRequest clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + DispatchRequest copyWith(void Function(DispatchRequest) updates) => + super.copyWith((message) => updates(message as DispatchRequest)) + as DispatchRequest; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static DispatchRequest create() => DispatchRequest._(); + @$core.override + DispatchRequest createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static DispatchRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static DispatchRequest? _defaultInstance; + + /// Fully qualified capability id (matching the advertised id). + @$pb.TagNumber(1) + $core.String get capabilityId => $_getSZ(0); + @$pb.TagNumber(1) + set capabilityId($core.String value) => $_setString(0, value); + @$pb.TagNumber(1) + $core.bool hasCapabilityId() => $_has(0); + @$pb.TagNumber(1) + void clearCapabilityId() => $_clearField(1); + + /// UUID of the hub expected to execute. The recipient verifies + /// that this matches its own UUID OR (Phase 1.2+ mesh) routes + /// the call along the next hop toward the target UUID. Required. + @$pb.TagNumber(2) + $core.String get targetHubId => $_getSZ(1); + @$pb.TagNumber(2) + set targetHubId($core.String value) => $_setString(1, value); + @$pb.TagNumber(2) + $core.bool hasTargetHubId() => $_has(1); + @$pb.TagNumber(2) + void clearTargetHubId() => $_clearField(2); + + /// Inputs in the same Payload shape Hub::Submit uses, so + /// module-side conversion is identical to local invocation. + @$pb.TagNumber(3) + $pb.PbMap<$core.String, $1.Payload> get inputs => $_getMap(2); + + /// UUIDv7 correlation id shared across hops + audit logs on + /// both sides for a single cross-hub call. Lets `fai admin + /// events` reconstruct the full trace later. + @$pb.TagNumber(4) + $core.String get traceId => $_getSZ(3); + @$pb.TagNumber(4) + set traceId($core.String value) => $_setString(3, value); + @$pb.TagNumber(4) + $core.bool hasTraceId() => $_has(3); + @$pb.TagNumber(4) + void clearTraceId() => $_clearField(4); + + /// Per-call nonce; the satellite rejects replays within a + /// sliding window (default 60 s) to defend against captured- + /// call replay attacks. + @$pb.TagNumber(5) + $core.String get nonce => $_getSZ(4); + @$pb.TagNumber(5) + set nonce($core.String value) => $_setString(4, value); + @$pb.TagNumber(5) + $core.bool hasNonce() => $_has(4); + @$pb.TagNumber(5) + void clearNonce() => $_clearField(5); + + /// Operator-friendly caller identity (e.g. token name, user + /// login) for the satellite's local audit attribution. Empty + /// for anonymous primary configurations. + @$pb.TagNumber(6) + $core.String get callerName => $_getSZ(5); + @$pb.TagNumber(6) + set callerName($core.String value) => $_setString(5, value); + @$pb.TagNumber(6) + $core.bool hasCallerName() => $_has(5); + @$pb.TagNumber(6) + void clearCallerName() => $_clearField(6); + + /// Optional region requirement. When set, the satellite must + /// refuse the call if its own region tag doesn't match + /// (case-insensitive exact match in 1.0; hierarchical match + /// lands in 1.1). + @$pb.TagNumber(7) + $core.String get regionRequired => $_getSZ(6); + @$pb.TagNumber(7) + set regionRequired($core.String value) => $_setString(6, value); + @$pb.TagNumber(7) + $core.bool hasRegionRequired() => $_has(6); + @$pb.TagNumber(7) + void clearRegionRequired() => $_clearField(7); +} + +class DispatchResponse extends $pb.GeneratedMessage { + factory DispatchResponse({ + $core.Iterable<$core.MapEntry<$core.String, $1.Payload>>? outputs, + $1.FaiError? error, + $core.int? durationMs, + $core.String? executedAtHubId, + }) { + final result = create(); + if (outputs != null) result.outputs.addEntries(outputs); + if (error != null) result.error = error; + if (durationMs != null) result.durationMs = durationMs; + if (executedAtHubId != null) result.executedAtHubId = executedAtHubId; + return result; + } + + DispatchResponse._(); + + factory DispatchResponse.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory DispatchResponse.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'DispatchResponse', + package: const $pb.PackageName(_omitMessageNames ? '' : 'fai.v1'), + createEmptyInstance: create) + ..m<$core.String, $1.Payload>(1, _omitFieldNames ? '' : 'outputs', + entryClassName: 'DispatchResponse.OutputsEntry', + keyFieldType: $pb.PbFieldType.OS, + valueFieldType: $pb.PbFieldType.OM, + valueCreator: $1.Payload.create, + valueDefaultOrMaker: $1.Payload.getDefault, + packageName: const $pb.PackageName('fai.v1')) + ..aOM<$1.FaiError>(2, _omitFieldNames ? '' : 'error', + subBuilder: $1.FaiError.create) + ..aI(3, _omitFieldNames ? '' : 'durationMs', fieldType: $pb.PbFieldType.OU3) + ..aOS(4, _omitFieldNames ? '' : 'executedAtHubId') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + DispatchResponse clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + DispatchResponse copyWith(void Function(DispatchResponse) updates) => + super.copyWith((message) => updates(message as DispatchResponse)) + as DispatchResponse; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static DispatchResponse create() => DispatchResponse._(); + @$core.override + DispatchResponse createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static DispatchResponse getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static DispatchResponse? _defaultInstance; + + /// Outputs on success. + @$pb.TagNumber(1) + $pb.PbMap<$core.String, $1.Payload> get outputs => $_getMap(0); + + /// Error shape on failure. The `code` mirrors common.FaiError + /// codes; the satellite maps its local FaiError to this wire. + @$pb.TagNumber(2) + $1.FaiError get error => $_getN(1); + @$pb.TagNumber(2) + set error($1.FaiError value) => $_setField(2, value); + @$pb.TagNumber(2) + $core.bool hasError() => $_has(1); + @$pb.TagNumber(2) + void clearError() => $_clearField(2); + @$pb.TagNumber(2) + $1.FaiError ensureError() => $_ensure(1); + + /// Wall-clock duration of the actual module invocation at the + /// satellite, in milliseconds. Excludes federation transport. + @$pb.TagNumber(3) + $core.int get durationMs => $_getIZ(2); + @$pb.TagNumber(3) + set durationMs($core.int value) => $_setUnsignedInt32(2, value); + @$pb.TagNumber(3) + $core.bool hasDurationMs() => $_has(2); + @$pb.TagNumber(3) + void clearDurationMs() => $_clearField(3); + + /// UUID of the hub that actually executed. Same as + /// `target_hub_id` in 1.0; in Phase 1.2+ relayed calls may + /// surface a different value when an intermediate hub had a + /// local copy. + @$pb.TagNumber(4) + $core.String get executedAtHubId => $_getSZ(3); + @$pb.TagNumber(4) + set executedAtHubId($core.String value) => $_setString(3, value); + @$pb.TagNumber(4) + $core.bool hasExecutedAtHubId() => $_has(3); + @$pb.TagNumber(4) + void clearExecutedAtHubId() => $_clearField(4); +} + +enum BlobChunk_Kind { open, data, eof, error, notSet } + +/// One chunk on the bidirectional Blob stream. The opening +/// message describes the operation; subsequent messages carry +/// payload bytes or end-of-stream / error markers. +/// +/// Chunk-size convention: 256 KiB. Receivers MUST NOT assume a +/// fixed chunk size — HTTP/2 framing and senders may differ. +class BlobChunk extends $pb.GeneratedMessage { + factory BlobChunk({ + BlobOpen? open, + $core.List<$core.int>? data, + BlobEof? eof, + BlobError? error, + }) { + final result = create(); + if (open != null) result.open = open; + if (data != null) result.data = data; + if (eof != null) result.eof = eof; + if (error != null) result.error = error; + return result; + } + + BlobChunk._(); + + factory BlobChunk.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory BlobChunk.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static const $core.Map<$core.int, BlobChunk_Kind> _BlobChunk_KindByTag = { + 1: BlobChunk_Kind.open, + 2: BlobChunk_Kind.data, + 3: BlobChunk_Kind.eof, + 4: BlobChunk_Kind.error, + 0: BlobChunk_Kind.notSet + }; + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'BlobChunk', + package: const $pb.PackageName(_omitMessageNames ? '' : 'fai.v1'), + createEmptyInstance: create) + ..oo(0, [1, 2, 3, 4]) + ..aOM(1, _omitFieldNames ? '' : 'open', + subBuilder: BlobOpen.create) + ..a<$core.List<$core.int>>( + 2, _omitFieldNames ? '' : 'data', $pb.PbFieldType.OY) + ..aOM(3, _omitFieldNames ? '' : 'eof', subBuilder: BlobEof.create) + ..aOM(4, _omitFieldNames ? '' : 'error', + subBuilder: BlobError.create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + BlobChunk clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + BlobChunk copyWith(void Function(BlobChunk) updates) => + super.copyWith((message) => updates(message as BlobChunk)) as BlobChunk; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static BlobChunk create() => BlobChunk._(); + @$core.override + BlobChunk createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static BlobChunk getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static BlobChunk? _defaultInstance; + + @$pb.TagNumber(1) + @$pb.TagNumber(2) + @$pb.TagNumber(3) + @$pb.TagNumber(4) + BlobChunk_Kind whichKind() => _BlobChunk_KindByTag[$_whichOneof(0)]!; + @$pb.TagNumber(1) + @$pb.TagNumber(2) + @$pb.TagNumber(3) + @$pb.TagNumber(4) + void clearKind() => $_clearField($_whichOneof(0)); + + @$pb.TagNumber(1) + BlobOpen get open => $_getN(0); + @$pb.TagNumber(1) + set open(BlobOpen value) => $_setField(1, value); + @$pb.TagNumber(1) + $core.bool hasOpen() => $_has(0); + @$pb.TagNumber(1) + void clearOpen() => $_clearField(1); + @$pb.TagNumber(1) + BlobOpen ensureOpen() => $_ensure(0); + + @$pb.TagNumber(2) + $core.List<$core.int> get data => $_getN(1); + @$pb.TagNumber(2) + set data($core.List<$core.int> value) => $_setBytes(1, value); + @$pb.TagNumber(2) + $core.bool hasData() => $_has(1); + @$pb.TagNumber(2) + void clearData() => $_clearField(2); + + @$pb.TagNumber(3) + BlobEof get eof => $_getN(2); + @$pb.TagNumber(3) + set eof(BlobEof value) => $_setField(3, value); + @$pb.TagNumber(3) + $core.bool hasEof() => $_has(2); + @$pb.TagNumber(3) + void clearEof() => $_clearField(3); + @$pb.TagNumber(3) + BlobEof ensureEof() => $_ensure(2); + + @$pb.TagNumber(4) + BlobError get error => $_getN(3); + @$pb.TagNumber(4) + set error(BlobError value) => $_setField(4, value); + @$pb.TagNumber(4) + $core.bool hasError() => $_has(3); + @$pb.TagNumber(4) + void clearError() => $_clearField(4); + @$pb.TagNumber(4) + BlobError ensureError() => $_ensure(3); +} + +class BlobOpen extends $pb.GeneratedMessage { + factory BlobOpen({ + $core.String? operation, + $core.String? sha256, + $fixnum.Int64? sizeBytes, + $core.String? mimeType, + $core.String? signedRef, + }) { + final result = create(); + if (operation != null) result.operation = operation; + if (sha256 != null) result.sha256 = sha256; + if (sizeBytes != null) result.sizeBytes = sizeBytes; + if (mimeType != null) result.mimeType = mimeType; + if (signedRef != null) result.signedRef = signedRef; + return result; + } + + BlobOpen._(); + + factory BlobOpen.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory BlobOpen.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'BlobOpen', + package: const $pb.PackageName(_omitMessageNames ? '' : 'fai.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'operation') + ..aOS(2, _omitFieldNames ? '' : 'sha256') + ..a<$fixnum.Int64>( + 3, _omitFieldNames ? '' : 'sizeBytes', $pb.PbFieldType.OU6, + defaultOrMaker: $fixnum.Int64.ZERO) + ..aOS(4, _omitFieldNames ? '' : 'mimeType') + ..aOS(5, _omitFieldNames ? '' : 'signedRef') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + BlobOpen clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + BlobOpen copyWith(void Function(BlobOpen) updates) => + super.copyWith((message) => updates(message as BlobOpen)) as BlobOpen; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static BlobOpen create() => BlobOpen._(); + @$core.override + BlobOpen createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static BlobOpen getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static BlobOpen? _defaultInstance; + + /// "upload" or "download". Other values reserved for future + /// expansion (e.g. "resume", "verify"). + @$pb.TagNumber(1) + $core.String get operation => $_getSZ(0); + @$pb.TagNumber(1) + set operation($core.String value) => $_setString(0, value); + @$pb.TagNumber(1) + $core.bool hasOperation() => $_has(0); + @$pb.TagNumber(1) + void clearOperation() => $_clearField(1); + + /// Sha256 (lowercase hex) when known up-front. Required for + /// downloads (which sha256 to fetch); empty for streaming + /// uploads where the sha is computed during the transfer. + @$pb.TagNumber(2) + $core.String get sha256 => $_getSZ(1); + @$pb.TagNumber(2) + set sha256($core.String value) => $_setString(1, value); + @$pb.TagNumber(2) + $core.bool hasSha256() => $_has(1); + @$pb.TagNumber(2) + void clearSha256() => $_clearField(2); + + /// Total payload size in bytes when known up-front; 0 means + /// "streaming with unknown size". + @$pb.TagNumber(3) + $fixnum.Int64 get sizeBytes => $_getI64(2); + @$pb.TagNumber(3) + set sizeBytes($fixnum.Int64 value) => $_setInt64(2, value); + @$pb.TagNumber(3) + $core.bool hasSizeBytes() => $_has(2); + @$pb.TagNumber(3) + void clearSizeBytes() => $_clearField(3); + + /// Mime type metadata propagated from the source `Bytes` payload. + @$pb.TagNumber(4) + $core.String get mimeType => $_getSZ(3); + @$pb.TagNumber(4) + set mimeType($core.String value) => $_setString(3, value); + @$pb.TagNumber(4) + $core.bool hasMimeType() => $_has(3); + @$pb.TagNumber(4) + void clearMimeType() => $_clearField(4); + + /// HMAC-signed blob reference URL for downloads. The primary + /// verifies signature, expiry, and audience (target hub UUID) + /// before honouring the open. Empty on uploads. + @$pb.TagNumber(5) + $core.String get signedRef => $_getSZ(4); + @$pb.TagNumber(5) + set signedRef($core.String value) => $_setString(4, value); + @$pb.TagNumber(5) + $core.bool hasSignedRef() => $_has(4); + @$pb.TagNumber(5) + void clearSignedRef() => $_clearField(5); +} + +class BlobEof extends $pb.GeneratedMessage { + factory BlobEof({ + $core.String? sha256, + $fixnum.Int64? sizeBytes, + }) { + final result = create(); + if (sha256 != null) result.sha256 = sha256; + if (sizeBytes != null) result.sizeBytes = sizeBytes; + return result; + } + + BlobEof._(); + + factory BlobEof.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory BlobEof.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'BlobEof', + package: const $pb.PackageName(_omitMessageNames ? '' : 'fai.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'sha256') + ..a<$fixnum.Int64>( + 2, _omitFieldNames ? '' : 'sizeBytes', $pb.PbFieldType.OU6, + defaultOrMaker: $fixnum.Int64.ZERO) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + BlobEof clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + BlobEof copyWith(void Function(BlobEof) updates) => + super.copyWith((message) => updates(message as BlobEof)) as BlobEof; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static BlobEof create() => BlobEof._(); + @$core.override + BlobEof createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static BlobEof getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static BlobEof? _defaultInstance; + + /// Final sha256 of the assembled blob. The receiver verifies + /// this against its running hash; a mismatch closes the stream + /// with a BlobError and discards the partial. + @$pb.TagNumber(1) + $core.String get sha256 => $_getSZ(0); + @$pb.TagNumber(1) + set sha256($core.String value) => $_setString(0, value); + @$pb.TagNumber(1) + $core.bool hasSha256() => $_has(0); + @$pb.TagNumber(1) + void clearSha256() => $_clearField(1); + + /// Final byte count actually transferred. Lets the receiver + /// sanity-check against any prior `BlobOpen.size_bytes`. + @$pb.TagNumber(2) + $fixnum.Int64 get sizeBytes => $_getI64(1); + @$pb.TagNumber(2) + set sizeBytes($fixnum.Int64 value) => $_setInt64(1, value); + @$pb.TagNumber(2) + $core.bool hasSizeBytes() => $_has(1); + @$pb.TagNumber(2) + void clearSizeBytes() => $_clearField(2); +} + +class BlobError extends $pb.GeneratedMessage { + factory BlobError({ + $core.String? code, + $core.String? message, + }) { + final result = create(); + if (code != null) result.code = code; + if (message != null) result.message = message; + return result; + } + + BlobError._(); + + factory BlobError.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory BlobError.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'BlobError', + package: const $pb.PackageName(_omitMessageNames ? '' : 'fai.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'code') + ..aOS(2, _omitFieldNames ? '' : 'message') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + BlobError clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + BlobError copyWith(void Function(BlobError) updates) => + super.copyWith((message) => updates(message as BlobError)) as BlobError; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static BlobError create() => BlobError._(); + @$core.override + BlobError createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static BlobError getDefault() => + _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static BlobError? _defaultInstance; + + /// Stable kebab-cased code so callers can map to friendlyError + /// copy. Known values: "size-cap-exceeded", "hash-mismatch", + /// "expired", "audience-mismatch", "permission-denied", + /// "internal". + @$pb.TagNumber(1) + $core.String get code => $_getSZ(0); + @$pb.TagNumber(1) + set code($core.String value) => $_setString(0, value); + @$pb.TagNumber(1) + $core.bool hasCode() => $_has(0); + @$pb.TagNumber(1) + void clearCode() => $_clearField(1); + + /// Free-form diagnostic text. + @$pb.TagNumber(2) + $core.String get message => $_getSZ(1); + @$pb.TagNumber(2) + set message($core.String value) => $_setString(1, value); + @$pb.TagNumber(2) + $core.bool hasMessage() => $_has(1); + @$pb.TagNumber(2) + void clearMessage() => $_clearField(2); +} + +/// Subscription request from a primary that wants to receive +/// remote-step events. The satellite first replays up to +/// `backfill` historical events then streams live ones. +class EventsRequest extends $pb.GeneratedMessage { + factory EventsRequest({ + $core.String? filterHubId, + $core.Iterable<$core.String>? eventTypes, + $core.int? backfill, + }) { + final result = create(); + if (filterHubId != null) result.filterHubId = filterHubId; + if (eventTypes != null) result.eventTypes.addAll(eventTypes); + if (backfill != null) result.backfill = backfill; + return result; + } + + EventsRequest._(); + + factory EventsRequest.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory EventsRequest.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'EventsRequest', + package: const $pb.PackageName(_omitMessageNames ? '' : 'fai.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'filterHubId') + ..pPS(2, _omitFieldNames ? '' : 'eventTypes') + ..aI(3, _omitFieldNames ? '' : 'backfill', fieldType: $pb.PbFieldType.OU3) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + EventsRequest clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + EventsRequest copyWith(void Function(EventsRequest) updates) => + super.copyWith((message) => updates(message as EventsRequest)) + as EventsRequest; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static EventsRequest create() => EventsRequest._(); + @$core.override + EventsRequest createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static EventsRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static EventsRequest? _defaultInstance; + + /// Optional filter on the origin hub UUID. Empty = receive + /// everything the satellite relays. + @$pb.TagNumber(1) + $core.String get filterHubId => $_getSZ(0); + @$pb.TagNumber(1) + set filterHubId($core.String value) => $_setString(0, value); + @$pb.TagNumber(1) + $core.bool hasFilterHubId() => $_has(0); + @$pb.TagNumber(1) + void clearFilterHubId() => $_clearField(1); + + /// Optional glob-style filter on event_type strings. + /// E.g. ["step.*", "approval.*"]. Empty = no filter. + @$pb.TagNumber(2) + $pb.PbList<$core.String> get eventTypes => $_getList(1); + + /// Backfill count before switching to live tail. Defaults to + /// 50 when 0; capped at 1000 by the satellite. + @$pb.TagNumber(3) + $core.int get backfill => $_getIZ(2); + @$pb.TagNumber(3) + set backfill($core.int value) => $_setUnsignedInt32(2, value); + @$pb.TagNumber(3) + $core.bool hasBackfill() => $_has(2); + @$pb.TagNumber(3) + void clearBackfill() => $_clearField(3); +} + +/// One forwarded event. The event payload mirrors LoggedEvent's +/// shape so existing Studio renderers handle it without +/// branching. The origin annotation lets Studio show "from +/// satellite X" badges. +class RelayedEvent extends $pb.GeneratedMessage { + factory RelayedEvent({ + $core.String? originHubId, + $core.String? originDisplayName, + $core.String? eventId, + $core.String? timestamp, + $core.String? eventType, + $core.String? flowExecution, + $core.String? invocationId, + $core.String? flowName, + $core.String? stepId, + $core.String? moduleName, + $core.String? moduleVersion, + $fixnum.Int64? durationMs, + $core.String? error, + $core.String? detail, + $core.String? callerName, + }) { + final result = create(); + if (originHubId != null) result.originHubId = originHubId; + if (originDisplayName != null) result.originDisplayName = originDisplayName; + if (eventId != null) result.eventId = eventId; + if (timestamp != null) result.timestamp = timestamp; + if (eventType != null) result.eventType = eventType; + if (flowExecution != null) result.flowExecution = flowExecution; + if (invocationId != null) result.invocationId = invocationId; + if (flowName != null) result.flowName = flowName; + if (stepId != null) result.stepId = stepId; + if (moduleName != null) result.moduleName = moduleName; + if (moduleVersion != null) result.moduleVersion = moduleVersion; + if (durationMs != null) result.durationMs = durationMs; + if (error != null) result.error = error; + if (detail != null) result.detail = detail; + if (callerName != null) result.callerName = callerName; + return result; + } + + RelayedEvent._(); + + factory RelayedEvent.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory RelayedEvent.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'RelayedEvent', + package: const $pb.PackageName(_omitMessageNames ? '' : 'fai.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'originHubId') + ..aOS(2, _omitFieldNames ? '' : 'originDisplayName') + ..aOS(3, _omitFieldNames ? '' : 'eventId') + ..aOS(4, _omitFieldNames ? '' : 'timestamp') + ..aOS(5, _omitFieldNames ? '' : 'eventType') + ..aOS(6, _omitFieldNames ? '' : 'flowExecution') + ..aOS(7, _omitFieldNames ? '' : 'invocationId') + ..aOS(8, _omitFieldNames ? '' : 'flowName') + ..aOS(9, _omitFieldNames ? '' : 'stepId') + ..aOS(10, _omitFieldNames ? '' : 'moduleName') + ..aOS(11, _omitFieldNames ? '' : 'moduleVersion') + ..aInt64(12, _omitFieldNames ? '' : 'durationMs') + ..aOS(13, _omitFieldNames ? '' : 'error') + ..aOS(14, _omitFieldNames ? '' : 'detail') + ..aOS(15, _omitFieldNames ? '' : 'callerName') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + RelayedEvent clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + RelayedEvent copyWith(void Function(RelayedEvent) updates) => + super.copyWith((message) => updates(message as RelayedEvent)) + as RelayedEvent; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static RelayedEvent create() => RelayedEvent._(); + @$core.override + RelayedEvent createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static RelayedEvent getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static RelayedEvent? _defaultInstance; + + /// UUID of the hub the event originated at. + @$pb.TagNumber(1) + $core.String get originHubId => $_getSZ(0); + @$pb.TagNumber(1) + set originHubId($core.String value) => $_setString(0, value); + @$pb.TagNumber(1) + $core.bool hasOriginHubId() => $_has(0); + @$pb.TagNumber(1) + void clearOriginHubId() => $_clearField(1); + + /// Display name of the origin hub at relay time. May be stale + /// (operator just renamed) — receivers resolve UUID -> name + /// from their routing table as the source of truth. + @$pb.TagNumber(2) + $core.String get originDisplayName => $_getSZ(1); + @$pb.TagNumber(2) + set originDisplayName($core.String value) => $_setString(1, value); + @$pb.TagNumber(2) + $core.bool hasOriginDisplayName() => $_has(1); + @$pb.TagNumber(2) + void clearOriginDisplayName() => $_clearField(2); + + /// Event payload. Shape mirrors hub.proto's LoggedEvent so + /// Studio doesn't need a second renderer; the fields listed + /// here are the wire stable subset. + @$pb.TagNumber(3) + $core.String get eventId => $_getSZ(2); + @$pb.TagNumber(3) + set eventId($core.String value) => $_setString(2, value); + @$pb.TagNumber(3) + $core.bool hasEventId() => $_has(2); + @$pb.TagNumber(3) + void clearEventId() => $_clearField(3); + + @$pb.TagNumber(4) + $core.String get timestamp => $_getSZ(3); + @$pb.TagNumber(4) + set timestamp($core.String value) => $_setString(3, value); + @$pb.TagNumber(4) + $core.bool hasTimestamp() => $_has(3); + @$pb.TagNumber(4) + void clearTimestamp() => $_clearField(4); + + @$pb.TagNumber(5) + $core.String get eventType => $_getSZ(4); + @$pb.TagNumber(5) + set eventType($core.String value) => $_setString(4, value); + @$pb.TagNumber(5) + $core.bool hasEventType() => $_has(4); + @$pb.TagNumber(5) + void clearEventType() => $_clearField(5); + + @$pb.TagNumber(6) + $core.String get flowExecution => $_getSZ(5); + @$pb.TagNumber(6) + set flowExecution($core.String value) => $_setString(5, value); + @$pb.TagNumber(6) + $core.bool hasFlowExecution() => $_has(5); + @$pb.TagNumber(6) + void clearFlowExecution() => $_clearField(6); + + @$pb.TagNumber(7) + $core.String get invocationId => $_getSZ(6); + @$pb.TagNumber(7) + set invocationId($core.String value) => $_setString(6, value); + @$pb.TagNumber(7) + $core.bool hasInvocationId() => $_has(6); + @$pb.TagNumber(7) + void clearInvocationId() => $_clearField(7); + + @$pb.TagNumber(8) + $core.String get flowName => $_getSZ(7); + @$pb.TagNumber(8) + set flowName($core.String value) => $_setString(7, value); + @$pb.TagNumber(8) + $core.bool hasFlowName() => $_has(7); + @$pb.TagNumber(8) + void clearFlowName() => $_clearField(8); + + @$pb.TagNumber(9) + $core.String get stepId => $_getSZ(8); + @$pb.TagNumber(9) + set stepId($core.String value) => $_setString(8, value); + @$pb.TagNumber(9) + $core.bool hasStepId() => $_has(8); + @$pb.TagNumber(9) + void clearStepId() => $_clearField(9); + + @$pb.TagNumber(10) + $core.String get moduleName => $_getSZ(9); + @$pb.TagNumber(10) + set moduleName($core.String value) => $_setString(9, value); + @$pb.TagNumber(10) + $core.bool hasModuleName() => $_has(9); + @$pb.TagNumber(10) + void clearModuleName() => $_clearField(10); + + @$pb.TagNumber(11) + $core.String get moduleVersion => $_getSZ(10); + @$pb.TagNumber(11) + set moduleVersion($core.String value) => $_setString(10, value); + @$pb.TagNumber(11) + $core.bool hasModuleVersion() => $_has(10); + @$pb.TagNumber(11) + void clearModuleVersion() => $_clearField(11); + + @$pb.TagNumber(12) + $fixnum.Int64 get durationMs => $_getI64(11); + @$pb.TagNumber(12) + set durationMs($fixnum.Int64 value) => $_setInt64(11, value); + @$pb.TagNumber(12) + $core.bool hasDurationMs() => $_has(11); + @$pb.TagNumber(12) + void clearDurationMs() => $_clearField(12); + + @$pb.TagNumber(13) + $core.String get error => $_getSZ(12); + @$pb.TagNumber(13) + set error($core.String value) => $_setString(12, value); + @$pb.TagNumber(13) + $core.bool hasError() => $_has(12); + @$pb.TagNumber(13) + void clearError() => $_clearField(13); + + /// Free-form JSON. Capped at the satellite's + /// `federation.limits.event_detail_max_bytes` (default 32 KiB) + /// before forwarding to defend against exfiltration via large + /// detail blobs. + @$pb.TagNumber(14) + $core.String get detail => $_getSZ(13); + @$pb.TagNumber(14) + set detail($core.String value) => $_setString(13, value); + @$pb.TagNumber(14) + $core.bool hasDetail() => $_has(13); + @$pb.TagNumber(14) + void clearDetail() => $_clearField(14); + + @$pb.TagNumber(15) + $core.String get callerName => $_getSZ(14); + @$pb.TagNumber(15) + set callerName($core.String value) => $_setString(14, value); + @$pb.TagNumber(15) + $core.bool hasCallerName() => $_has(14); + @$pb.TagNumber(15) + void clearCallerName() => $_clearField(15); +} + +const $core.bool _omitFieldNames = + $core.bool.fromEnvironment('protobuf.omit_field_names'); +const $core.bool _omitMessageNames = + $core.bool.fromEnvironment('protobuf.omit_message_names'); diff --git a/lib/src/generated/fai/v1/federation.pbenum.dart b/lib/src/generated/fai/v1/federation.pbenum.dart new file mode 100644 index 0000000..cd500f2 --- /dev/null +++ b/lib/src/generated/fai/v1/federation.pbenum.dart @@ -0,0 +1,11 @@ +// This is a generated file - do not edit. +// +// Generated from fai/v1/federation.proto. + +// @dart = 3.3 + +// ignore_for_file: annotate_overrides, camel_case_types, comment_references +// ignore_for_file: constant_identifier_names +// ignore_for_file: curly_braces_in_flow_control_structures +// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_relative_imports diff --git a/lib/src/generated/fai/v1/federation.pbgrpc.dart b/lib/src/generated/fai/v1/federation.pbgrpc.dart new file mode 100644 index 0000000..b8ff4b5 --- /dev/null +++ b/lib/src/generated/fai/v1/federation.pbgrpc.dart @@ -0,0 +1,181 @@ +// This is a generated file - do not edit. +// +// Generated from fai/v1/federation.proto. + +// @dart = 3.3 + +// ignore_for_file: annotate_overrides, camel_case_types, comment_references +// ignore_for_file: constant_identifier_names +// ignore_for_file: curly_braces_in_flow_control_structures +// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_relative_imports + +import 'dart:async' as $async; +import 'dart:core' as $core; + +import 'package:grpc/service_api.dart' as $grpc; +import 'package:protobuf/protobuf.dart' as $pb; + +import 'federation.pb.dart' as $0; + +export 'federation.pb.dart'; + +/// Hub-to-hub federation. A satellite hub opens one persistent +/// HTTP/2 connection to a primary hub. Within that connection, +/// the four streams below multiplex. +/// +/// Phase 1.0 ships Control + Invoke + Blob + Events. A fifth +/// stream (`Stream` for bidirectional streaming caps, e.g. live +/// audio) is reserved for Phase 1.1; the slot stays free in the +/// service so adding it is purely additive. +/// +/// See `docs/architecture/federation.md` for the full design, +/// security model, and threat-model summary. +@$pb.GrpcServiceName('fai.v1.Federation') +class FederationClient extends $grpc.Client { + /// The hostname for this service. + static const $core.String defaultHost = ''; + + /// OAuth scopes needed for the client. + static const $core.List<$core.String> oauthScopes = [ + '', + ]; + + FederationClient(super.channel, {super.options, super.interceptors}); + + /// Long-lived bidirectional Control stream. First two messages + /// exchanged are always Hello (satellite -> primary) and Accept + /// (primary -> satellite). Subsequent messages multiplex over + /// the same channel: advertisements, withdrawals, heartbeats, + /// renames, and cert renewals. + /// + /// Disconnect signals shutdown: the primary withdraws every + /// capability advertised by this satellite. The satellite is + /// expected to reconnect with exponential backoff. + $grpc.ResponseStream<$0.ControlMessage> control( + $async.Stream<$0.ControlMessage> request, { + $grpc.CallOptions? options, + }) { + return $createStreamingCall(_$control, request, options: options); + } + + /// Reserved stub. Cross-hub dispatch does NOT use a unary RPC: + /// the satellite dials outbound (NAT-friendly) and is the gRPC + /// client, so the primary cannot open a call back into it. Real + /// dispatch flows over the Control stream via DispatchCall / + /// DispatchResult (FED-06). This RPC stays declared only so the + /// service slot is stable; it returns UNIMPLEMENTED. + /// + /// The satellite resolves `capability_id` against its **local** + /// registry; unknown capabilities return CAPABILITY_NOT_SUPPORTED. + /// The wire never carries executable content — only inputs. + $grpc.ResponseFuture<$0.DispatchResponse> dispatch( + $0.DispatchRequest request, { + $grpc.CallOptions? options, + }) { + return $createUnaryCall(_$dispatch, request, options: options); + } + + /// Bidirectional chunked binary transfer. Used for `bytes` + /// payloads above `federation.blob_threshold` (default 1 MiB). + /// The first message on either side is BlobOpen describing the + /// operation ("upload" or "download"); subsequent messages + /// carry data or end-of-stream / error markers. + $grpc.ResponseStream<$0.BlobChunk> blob( + $async.Stream<$0.BlobChunk> request, { + $grpc.CallOptions? options, + }) { + return $createStreamingCall(_$blob, request, options: options); + } + + /// Server-streaming relay of audit + step events from a + /// satellite to the primary. The primary's Studio uses this to + /// show live progress of remote flow runs and to surface + /// approval-pending notices from remote steps. + $grpc.ResponseStream<$0.RelayedEvent> events( + $0.EventsRequest request, { + $grpc.CallOptions? options, + }) { + return $createStreamingCall(_$events, $async.Stream.fromIterable([request]), + options: options); + } + + // method descriptors + + static final _$control = + $grpc.ClientMethod<$0.ControlMessage, $0.ControlMessage>( + '/fai.v1.Federation/Control', + ($0.ControlMessage value) => value.writeToBuffer(), + $0.ControlMessage.fromBuffer); + static final _$dispatch = + $grpc.ClientMethod<$0.DispatchRequest, $0.DispatchResponse>( + '/fai.v1.Federation/Dispatch', + ($0.DispatchRequest value) => value.writeToBuffer(), + $0.DispatchResponse.fromBuffer); + static final _$blob = $grpc.ClientMethod<$0.BlobChunk, $0.BlobChunk>( + '/fai.v1.Federation/Blob', + ($0.BlobChunk value) => value.writeToBuffer(), + $0.BlobChunk.fromBuffer); + static final _$events = $grpc.ClientMethod<$0.EventsRequest, $0.RelayedEvent>( + '/fai.v1.Federation/Events', + ($0.EventsRequest value) => value.writeToBuffer(), + $0.RelayedEvent.fromBuffer); +} + +@$pb.GrpcServiceName('fai.v1.Federation') +abstract class FederationServiceBase extends $grpc.Service { + $core.String get $name => 'fai.v1.Federation'; + + FederationServiceBase() { + $addMethod($grpc.ServiceMethod<$0.ControlMessage, $0.ControlMessage>( + 'Control', + control, + true, + true, + ($core.List<$core.int> value) => $0.ControlMessage.fromBuffer(value), + ($0.ControlMessage value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$0.DispatchRequest, $0.DispatchResponse>( + 'Dispatch', + dispatch_Pre, + false, + false, + ($core.List<$core.int> value) => $0.DispatchRequest.fromBuffer(value), + ($0.DispatchResponse value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$0.BlobChunk, $0.BlobChunk>( + 'Blob', + blob, + true, + true, + ($core.List<$core.int> value) => $0.BlobChunk.fromBuffer(value), + ($0.BlobChunk value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$0.EventsRequest, $0.RelayedEvent>( + 'Events', + events_Pre, + false, + true, + ($core.List<$core.int> value) => $0.EventsRequest.fromBuffer(value), + ($0.RelayedEvent value) => value.writeToBuffer())); + } + + $async.Stream<$0.ControlMessage> control( + $grpc.ServiceCall call, $async.Stream<$0.ControlMessage> request); + + $async.Future<$0.DispatchResponse> dispatch_Pre($grpc.ServiceCall $call, + $async.Future<$0.DispatchRequest> $request) async { + return dispatch($call, await $request); + } + + $async.Future<$0.DispatchResponse> dispatch( + $grpc.ServiceCall call, $0.DispatchRequest request); + + $async.Stream<$0.BlobChunk> blob( + $grpc.ServiceCall call, $async.Stream<$0.BlobChunk> request); + + $async.Stream<$0.RelayedEvent> events_Pre($grpc.ServiceCall $call, + $async.Future<$0.EventsRequest> $request) async* { + yield* events($call, await $request); + } + + $async.Stream<$0.RelayedEvent> events( + $grpc.ServiceCall call, $0.EventsRequest request); +} diff --git a/lib/src/generated/fai/v1/federation.pbjson.dart b/lib/src/generated/fai/v1/federation.pbjson.dart new file mode 100644 index 0000000..2cd2d22 --- /dev/null +++ b/lib/src/generated/fai/v1/federation.pbjson.dart @@ -0,0 +1,674 @@ +// This is a generated file - do not edit. +// +// Generated from fai/v1/federation.proto. + +// @dart = 3.3 + +// ignore_for_file: annotate_overrides, camel_case_types, comment_references +// ignore_for_file: constant_identifier_names +// ignore_for_file: curly_braces_in_flow_control_structures +// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes +// ignore_for_file: non_constant_identifier_names, prefer_relative_imports +// ignore_for_file: unused_import + +import 'dart:convert' as $convert; +import 'dart:core' as $core; +import 'dart:typed_data' as $typed_data; + +@$core.Deprecated('Use controlMessageDescriptor instead') +const ControlMessage$json = { + '1': 'ControlMessage', + '2': [ + { + '1': 'hello', + '3': 1, + '4': 1, + '5': 11, + '6': '.fai.v1.HelloMessage', + '9': 0, + '10': 'hello' + }, + { + '1': 'accept', + '3': 2, + '4': 1, + '5': 11, + '6': '.fai.v1.AcceptMessage', + '9': 0, + '10': 'accept' + }, + { + '1': 'advertise', + '3': 3, + '4': 1, + '5': 11, + '6': '.fai.v1.AdvertiseMessage', + '9': 0, + '10': 'advertise' + }, + { + '1': 'withdraw', + '3': 4, + '4': 1, + '5': 11, + '6': '.fai.v1.WithdrawMessage', + '9': 0, + '10': 'withdraw' + }, + { + '1': 'heartbeat', + '3': 5, + '4': 1, + '5': 11, + '6': '.fai.v1.HeartbeatMessage', + '9': 0, + '10': 'heartbeat' + }, + { + '1': 'heartbeat_ack', + '3': 6, + '4': 1, + '5': 11, + '6': '.fai.v1.HeartbeatAck', + '9': 0, + '10': 'heartbeatAck' + }, + { + '1': 'rename', + '3': 7, + '4': 1, + '5': 11, + '6': '.fai.v1.RenameMessage', + '9': 0, + '10': 'rename' + }, + { + '1': 'cert_renew_request', + '3': 8, + '4': 1, + '5': 11, + '6': '.fai.v1.CertRenewRequest', + '9': 0, + '10': 'certRenewRequest' + }, + { + '1': 'cert_renew_response', + '3': 9, + '4': 1, + '5': 11, + '6': '.fai.v1.CertRenewResponse', + '9': 0, + '10': 'certRenewResponse' + }, + { + '1': 'dispatch_call', + '3': 10, + '4': 1, + '5': 11, + '6': '.fai.v1.DispatchCall', + '9': 0, + '10': 'dispatchCall' + }, + { + '1': 'dispatch_result', + '3': 11, + '4': 1, + '5': 11, + '6': '.fai.v1.DispatchResult', + '9': 0, + '10': 'dispatchResult' + }, + ], + '8': [ + {'1': 'kind'}, + ], +}; + +/// Descriptor for `ControlMessage`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List controlMessageDescriptor = $convert.base64Decode( + 'Cg5Db250cm9sTWVzc2FnZRIsCgVoZWxsbxgBIAEoCzIULmZhaS52MS5IZWxsb01lc3NhZ2VIAF' + 'IFaGVsbG8SLwoGYWNjZXB0GAIgASgLMhUuZmFpLnYxLkFjY2VwdE1lc3NhZ2VIAFIGYWNjZXB0' + 'EjgKCWFkdmVydGlzZRgDIAEoCzIYLmZhaS52MS5BZHZlcnRpc2VNZXNzYWdlSABSCWFkdmVydG' + 'lzZRI1Cgh3aXRoZHJhdxgEIAEoCzIXLmZhaS52MS5XaXRoZHJhd01lc3NhZ2VIAFIId2l0aGRy' + 'YXcSOAoJaGVhcnRiZWF0GAUgASgLMhguZmFpLnYxLkhlYXJ0YmVhdE1lc3NhZ2VIAFIJaGVhcn' + 'RiZWF0EjsKDWhlYXJ0YmVhdF9hY2sYBiABKAsyFC5mYWkudjEuSGVhcnRiZWF0QWNrSABSDGhl' + 'YXJ0YmVhdEFjaxIvCgZyZW5hbWUYByABKAsyFS5mYWkudjEuUmVuYW1lTWVzc2FnZUgAUgZyZW' + '5hbWUSSAoSY2VydF9yZW5ld19yZXF1ZXN0GAggASgLMhguZmFpLnYxLkNlcnRSZW5ld1JlcXVl' + 'c3RIAFIQY2VydFJlbmV3UmVxdWVzdBJLChNjZXJ0X3JlbmV3X3Jlc3BvbnNlGAkgASgLMhkuZm' + 'FpLnYxLkNlcnRSZW5ld1Jlc3BvbnNlSABSEWNlcnRSZW5ld1Jlc3BvbnNlEjsKDWRpc3BhdGNo' + 'X2NhbGwYCiABKAsyFC5mYWkudjEuRGlzcGF0Y2hDYWxsSABSDGRpc3BhdGNoQ2FsbBJBCg9kaX' + 'NwYXRjaF9yZXN1bHQYCyABKAsyFi5mYWkudjEuRGlzcGF0Y2hSZXN1bHRIAFIOZGlzcGF0Y2hS' + 'ZXN1bHRCBgoEa2luZA=='); + +@$core.Deprecated('Use dispatchCallDescriptor instead') +const DispatchCall$json = { + '1': 'DispatchCall', + '2': [ + {'1': 'request_id', '3': 1, '4': 1, '5': 9, '10': 'requestId'}, + { + '1': 'request', + '3': 2, + '4': 1, + '5': 11, + '6': '.fai.v1.DispatchRequest', + '10': 'request' + }, + ], +}; + +/// Descriptor for `DispatchCall`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List dispatchCallDescriptor = $convert.base64Decode( + 'CgxEaXNwYXRjaENhbGwSHQoKcmVxdWVzdF9pZBgBIAEoCVIJcmVxdWVzdElkEjEKB3JlcXVlc3' + 'QYAiABKAsyFy5mYWkudjEuRGlzcGF0Y2hSZXF1ZXN0UgdyZXF1ZXN0'); + +@$core.Deprecated('Use dispatchResultDescriptor instead') +const DispatchResult$json = { + '1': 'DispatchResult', + '2': [ + {'1': 'request_id', '3': 1, '4': 1, '5': 9, '10': 'requestId'}, + { + '1': 'response', + '3': 2, + '4': 1, + '5': 11, + '6': '.fai.v1.DispatchResponse', + '10': 'response' + }, + ], +}; + +/// Descriptor for `DispatchResult`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List dispatchResultDescriptor = $convert.base64Decode( + 'Cg5EaXNwYXRjaFJlc3VsdBIdCgpyZXF1ZXN0X2lkGAEgASgJUglyZXF1ZXN0SWQSNAoIcmVzcG' + '9uc2UYAiABKAsyGC5mYWkudjEuRGlzcGF0Y2hSZXNwb25zZVIIcmVzcG9uc2U='); + +@$core.Deprecated('Use helloMessageDescriptor instead') +const HelloMessage$json = { + '1': 'HelloMessage', + '2': [ + {'1': 'hub_id', '3': 1, '4': 1, '5': 9, '10': 'hubId'}, + {'1': 'display_name', '3': 2, '4': 1, '5': 9, '10': 'displayName'}, + {'1': 'hub_version', '3': 3, '4': 1, '5': 9, '10': 'hubVersion'}, + { + '1': 'wire_versions_supported', + '3': 4, + '4': 3, + '5': 13, + '10': 'wireVersionsSupported' + }, + { + '1': 'wit_versions_supported', + '3': 5, + '4': 3, + '5': 9, + '10': 'witVersionsSupported' + }, + {'1': 'bootstrap_token', '3': 6, '4': 1, '5': 9, '10': 'bootstrapToken'}, + {'1': 'region', '3': 7, '4': 1, '5': 9, '10': 'region'}, + {'1': 'csr_pem', '3': 8, '4': 1, '5': 9, '10': 'csrPem'}, + ], +}; + +/// Descriptor for `HelloMessage`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List helloMessageDescriptor = $convert.base64Decode( + 'CgxIZWxsb01lc3NhZ2USFQoGaHViX2lkGAEgASgJUgVodWJJZBIhCgxkaXNwbGF5X25hbWUYAi' + 'ABKAlSC2Rpc3BsYXlOYW1lEh8KC2h1Yl92ZXJzaW9uGAMgASgJUgpodWJWZXJzaW9uEjYKF3dp' + 'cmVfdmVyc2lvbnNfc3VwcG9ydGVkGAQgAygNUhV3aXJlVmVyc2lvbnNTdXBwb3J0ZWQSNAoWd2' + 'l0X3ZlcnNpb25zX3N1cHBvcnRlZBgFIAMoCVIUd2l0VmVyc2lvbnNTdXBwb3J0ZWQSJwoPYm9v' + 'dHN0cmFwX3Rva2VuGAYgASgJUg5ib290c3RyYXBUb2tlbhIWCgZyZWdpb24YByABKAlSBnJlZ2' + 'lvbhIXCgdjc3JfcGVtGAggASgJUgZjc3JQZW0='); + +@$core.Deprecated('Use acceptMessageDescriptor instead') +const AcceptMessage$json = { + '1': 'AcceptMessage', + '2': [ + { + '1': 'wire_version_chosen', + '3': 1, + '4': 1, + '5': 13, + '10': 'wireVersionChosen' + }, + {'1': 'primary_hub_id', '3': 2, '4': 1, '5': 9, '10': 'primaryHubId'}, + { + '1': 'primary_display_name', + '3': 3, + '4': 1, + '5': 9, + '10': 'primaryDisplayName' + }, + { + '1': 'primary_hub_version', + '3': 4, + '4': 1, + '5': 9, + '10': 'primaryHubVersion' + }, + { + '1': 'primary_wire_versions_supported', + '3': 5, + '4': 3, + '5': 13, + '10': 'primaryWireVersionsSupported' + }, + {'1': 'issued_cert_pem', '3': 6, '4': 1, '5': 9, '10': 'issuedCertPem'}, + {'1': 'cert_expires_at', '3': 7, '4': 1, '5': 9, '10': 'certExpiresAt'}, + ], +}; + +/// Descriptor for `AcceptMessage`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List acceptMessageDescriptor = $convert.base64Decode( + 'Cg1BY2NlcHRNZXNzYWdlEi4KE3dpcmVfdmVyc2lvbl9jaG9zZW4YASABKA1SEXdpcmVWZXJzaW' + '9uQ2hvc2VuEiQKDnByaW1hcnlfaHViX2lkGAIgASgJUgxwcmltYXJ5SHViSWQSMAoUcHJpbWFy' + 'eV9kaXNwbGF5X25hbWUYAyABKAlSEnByaW1hcnlEaXNwbGF5TmFtZRIuChNwcmltYXJ5X2h1Yl' + '92ZXJzaW9uGAQgASgJUhFwcmltYXJ5SHViVmVyc2lvbhJFCh9wcmltYXJ5X3dpcmVfdmVyc2lv' + 'bnNfc3VwcG9ydGVkGAUgAygNUhxwcmltYXJ5V2lyZVZlcnNpb25zU3VwcG9ydGVkEiYKD2lzc3' + 'VlZF9jZXJ0X3BlbRgGIAEoCVINaXNzdWVkQ2VydFBlbRImCg9jZXJ0X2V4cGlyZXNfYXQYByAB' + 'KAlSDWNlcnRFeHBpcmVzQXQ='); + +@$core.Deprecated('Use advertiseMessageDescriptor instead') +const AdvertiseMessage$json = { + '1': 'AdvertiseMessage', + '2': [ + { + '1': 'capabilities', + '3': 1, + '4': 3, + '5': 11, + '6': '.fai.v1.CapabilityAdvertisement', + '10': 'capabilities' + }, + ], +}; + +/// Descriptor for `AdvertiseMessage`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List advertiseMessageDescriptor = $convert.base64Decode( + 'ChBBZHZlcnRpc2VNZXNzYWdlEkMKDGNhcGFiaWxpdGllcxgBIAMoCzIfLmZhaS52MS5DYXBhYm' + 'lsaXR5QWR2ZXJ0aXNlbWVudFIMY2FwYWJpbGl0aWVz'); + +@$core.Deprecated('Use capabilityAdvertisementDescriptor instead') +const CapabilityAdvertisement$json = { + '1': 'CapabilityAdvertisement', + '2': [ + {'1': 'capability_id', '3': 1, '4': 1, '5': 9, '10': 'capabilityId'}, + {'1': 'origin_uuid', '3': 2, '4': 1, '5': 9, '10': 'originUuid'}, + {'1': 'origin_name', '3': 3, '4': 1, '5': 9, '10': 'originName'}, + {'1': 'route', '3': 4, '4': 3, '5': 9, '10': 'route'}, + {'1': 'region', '3': 5, '4': 1, '5': 9, '10': 'region'}, + { + '1': 'quality', + '3': 6, + '4': 1, + '5': 11, + '6': '.fai.v1.Quality', + '10': 'quality' + }, + {'1': 'permissions', '3': 7, '4': 3, '5': 9, '10': 'permissions'}, + {'1': 'wit_version', '3': 8, '4': 1, '5': 9, '10': 'witVersion'}, + {'1': 'hub_version', '3': 9, '4': 1, '5': 9, '10': 'hubVersion'}, + ], +}; + +/// Descriptor for `CapabilityAdvertisement`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List capabilityAdvertisementDescriptor = $convert.base64Decode( + 'ChdDYXBhYmlsaXR5QWR2ZXJ0aXNlbWVudBIjCg1jYXBhYmlsaXR5X2lkGAEgASgJUgxjYXBhYm' + 'lsaXR5SWQSHwoLb3JpZ2luX3V1aWQYAiABKAlSCm9yaWdpblV1aWQSHwoLb3JpZ2luX25hbWUY' + 'AyABKAlSCm9yaWdpbk5hbWUSFAoFcm91dGUYBCADKAlSBXJvdXRlEhYKBnJlZ2lvbhgFIAEoCV' + 'IGcmVnaW9uEikKB3F1YWxpdHkYBiABKAsyDy5mYWkudjEuUXVhbGl0eVIHcXVhbGl0eRIgCgtw' + 'ZXJtaXNzaW9ucxgHIAMoCVILcGVybWlzc2lvbnMSHwoLd2l0X3ZlcnNpb24YCCABKAlSCndpdF' + 'ZlcnNpb24SHwoLaHViX3ZlcnNpb24YCSABKAlSCmh1YlZlcnNpb24='); + +@$core.Deprecated('Use qualityDescriptor instead') +const Quality$json = { + '1': 'Quality', + '2': [ + {'1': 'rtt_p50_ms', '3': 1, '4': 1, '5': 13, '10': 'rttP50Ms'}, + {'1': 'rtt_p95_ms', '3': 2, '4': 1, '5': 13, '10': 'rttP95Ms'}, + {'1': 'success_rate_30m', '3': 3, '4': 1, '5': 2, '10': 'successRate30m'}, + {'1': 'streams_active', '3': 4, '4': 1, '5': 13, '10': 'streamsActive'}, + {'1': 'streams_capacity', '3': 5, '4': 1, '5': 13, '10': 'streamsCapacity'}, + ], +}; + +/// Descriptor for `Quality`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List qualityDescriptor = $convert.base64Decode( + 'CgdRdWFsaXR5EhwKCnJ0dF9wNTBfbXMYASABKA1SCHJ0dFA1ME1zEhwKCnJ0dF9wOTVfbXMYAi' + 'ABKA1SCHJ0dFA5NU1zEigKEHN1Y2Nlc3NfcmF0ZV8zMG0YAyABKAJSDnN1Y2Nlc3NSYXRlMzBt' + 'EiUKDnN0cmVhbXNfYWN0aXZlGAQgASgNUg1zdHJlYW1zQWN0aXZlEikKEHN0cmVhbXNfY2FwYW' + 'NpdHkYBSABKA1SD3N0cmVhbXNDYXBhY2l0eQ=='); + +@$core.Deprecated('Use withdrawMessageDescriptor instead') +const WithdrawMessage$json = { + '1': 'WithdrawMessage', + '2': [ + {'1': 'capability_ids', '3': 1, '4': 3, '5': 9, '10': 'capabilityIds'}, + {'1': 'origin_uuid', '3': 2, '4': 1, '5': 9, '10': 'originUuid'}, + ], +}; + +/// Descriptor for `WithdrawMessage`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List withdrawMessageDescriptor = $convert.base64Decode( + 'Cg9XaXRoZHJhd01lc3NhZ2USJQoOY2FwYWJpbGl0eV9pZHMYASADKAlSDWNhcGFiaWxpdHlJZH' + 'MSHwoLb3JpZ2luX3V1aWQYAiABKAlSCm9yaWdpblV1aWQ='); + +@$core.Deprecated('Use heartbeatMessageDescriptor instead') +const HeartbeatMessage$json = { + '1': 'HeartbeatMessage', + '2': [ + {'1': 'nonce', '3': 1, '4': 1, '5': 4, '10': 'nonce'}, + {'1': 'satellite_time_ms', '3': 2, '4': 1, '5': 3, '10': 'satelliteTimeMs'}, + ], +}; + +/// Descriptor for `HeartbeatMessage`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List heartbeatMessageDescriptor = $convert.base64Decode( + 'ChBIZWFydGJlYXRNZXNzYWdlEhQKBW5vbmNlGAEgASgEUgVub25jZRIqChFzYXRlbGxpdGVfdG' + 'ltZV9tcxgCIAEoA1IPc2F0ZWxsaXRlVGltZU1z'); + +@$core.Deprecated('Use heartbeatAckDescriptor instead') +const HeartbeatAck$json = { + '1': 'HeartbeatAck', + '2': [ + {'1': 'nonce', '3': 1, '4': 1, '5': 4, '10': 'nonce'}, + {'1': 'primary_time_ms', '3': 2, '4': 1, '5': 3, '10': 'primaryTimeMs'}, + ], +}; + +/// Descriptor for `HeartbeatAck`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List heartbeatAckDescriptor = $convert.base64Decode( + 'CgxIZWFydGJlYXRBY2sSFAoFbm9uY2UYASABKARSBW5vbmNlEiYKD3ByaW1hcnlfdGltZV9tcx' + 'gCIAEoA1INcHJpbWFyeVRpbWVNcw=='); + +@$core.Deprecated('Use renameMessageDescriptor instead') +const RenameMessage$json = { + '1': 'RenameMessage', + '2': [ + {'1': 'new_display_name', '3': 1, '4': 1, '5': 9, '10': 'newDisplayName'}, + ], +}; + +/// Descriptor for `RenameMessage`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List renameMessageDescriptor = $convert.base64Decode( + 'Cg1SZW5hbWVNZXNzYWdlEigKEG5ld19kaXNwbGF5X25hbWUYASABKAlSDm5ld0Rpc3BsYXlOYW' + '1l'); + +@$core.Deprecated('Use certRenewRequestDescriptor instead') +const CertRenewRequest$json = { + '1': 'CertRenewRequest', + '2': [ + {'1': 'csr_pem', '3': 1, '4': 1, '5': 9, '10': 'csrPem'}, + ], +}; + +/// Descriptor for `CertRenewRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List certRenewRequestDescriptor = $convert.base64Decode( + 'ChBDZXJ0UmVuZXdSZXF1ZXN0EhcKB2Nzcl9wZW0YASABKAlSBmNzclBlbQ=='); + +@$core.Deprecated('Use certRenewResponseDescriptor instead') +const CertRenewResponse$json = { + '1': 'CertRenewResponse', + '2': [ + {'1': 'cert_pem', '3': 1, '4': 1, '5': 9, '10': 'certPem'}, + {'1': 'expires_at', '3': 2, '4': 1, '5': 9, '10': 'expiresAt'}, + {'1': 'error', '3': 3, '4': 1, '5': 9, '10': 'error'}, + ], +}; + +/// Descriptor for `CertRenewResponse`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List certRenewResponseDescriptor = $convert.base64Decode( + 'ChFDZXJ0UmVuZXdSZXNwb25zZRIZCghjZXJ0X3BlbRgBIAEoCVIHY2VydFBlbRIdCgpleHBpcm' + 'VzX2F0GAIgASgJUglleHBpcmVzQXQSFAoFZXJyb3IYAyABKAlSBWVycm9y'); + +@$core.Deprecated('Use dispatchRequestDescriptor instead') +const DispatchRequest$json = { + '1': 'DispatchRequest', + '2': [ + {'1': 'capability_id', '3': 1, '4': 1, '5': 9, '10': 'capabilityId'}, + {'1': 'target_hub_id', '3': 2, '4': 1, '5': 9, '10': 'targetHubId'}, + { + '1': 'inputs', + '3': 3, + '4': 3, + '5': 11, + '6': '.fai.v1.DispatchRequest.InputsEntry', + '10': 'inputs' + }, + {'1': 'trace_id', '3': 4, '4': 1, '5': 9, '10': 'traceId'}, + {'1': 'nonce', '3': 5, '4': 1, '5': 9, '10': 'nonce'}, + {'1': 'caller_name', '3': 6, '4': 1, '5': 9, '10': 'callerName'}, + {'1': 'region_required', '3': 7, '4': 1, '5': 9, '10': 'regionRequired'}, + ], + '3': [DispatchRequest_InputsEntry$json], +}; + +@$core.Deprecated('Use dispatchRequestDescriptor instead') +const DispatchRequest_InputsEntry$json = { + '1': 'InputsEntry', + '2': [ + {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'}, + { + '1': 'value', + '3': 2, + '4': 1, + '5': 11, + '6': '.fai.v1.Payload', + '10': 'value' + }, + ], + '7': {'7': true}, +}; + +/// Descriptor for `DispatchRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List dispatchRequestDescriptor = $convert.base64Decode( + 'Cg9EaXNwYXRjaFJlcXVlc3QSIwoNY2FwYWJpbGl0eV9pZBgBIAEoCVIMY2FwYWJpbGl0eUlkEi' + 'IKDXRhcmdldF9odWJfaWQYAiABKAlSC3RhcmdldEh1YklkEjsKBmlucHV0cxgDIAMoCzIjLmZh' + 'aS52MS5EaXNwYXRjaFJlcXVlc3QuSW5wdXRzRW50cnlSBmlucHV0cxIZCgh0cmFjZV9pZBgEIA' + 'EoCVIHdHJhY2VJZBIUCgVub25jZRgFIAEoCVIFbm9uY2USHwoLY2FsbGVyX25hbWUYBiABKAlS' + 'CmNhbGxlck5hbWUSJwoPcmVnaW9uX3JlcXVpcmVkGAcgASgJUg5yZWdpb25SZXF1aXJlZBpKCg' + 'tJbnB1dHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIlCgV2YWx1ZRgCIAEoCzIPLmZhaS52MS5Q' + 'YXlsb2FkUgV2YWx1ZToCOAE='); + +@$core.Deprecated('Use dispatchResponseDescriptor instead') +const DispatchResponse$json = { + '1': 'DispatchResponse', + '2': [ + { + '1': 'outputs', + '3': 1, + '4': 3, + '5': 11, + '6': '.fai.v1.DispatchResponse.OutputsEntry', + '10': 'outputs' + }, + { + '1': 'error', + '3': 2, + '4': 1, + '5': 11, + '6': '.fai.v1.FaiError', + '10': 'error' + }, + {'1': 'duration_ms', '3': 3, '4': 1, '5': 13, '10': 'durationMs'}, + { + '1': 'executed_at_hub_id', + '3': 4, + '4': 1, + '5': 9, + '10': 'executedAtHubId' + }, + ], + '3': [DispatchResponse_OutputsEntry$json], +}; + +@$core.Deprecated('Use dispatchResponseDescriptor instead') +const DispatchResponse_OutputsEntry$json = { + '1': 'OutputsEntry', + '2': [ + {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'}, + { + '1': 'value', + '3': 2, + '4': 1, + '5': 11, + '6': '.fai.v1.Payload', + '10': 'value' + }, + ], + '7': {'7': true}, +}; + +/// Descriptor for `DispatchResponse`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List dispatchResponseDescriptor = $convert.base64Decode( + 'ChBEaXNwYXRjaFJlc3BvbnNlEj8KB291dHB1dHMYASADKAsyJS5mYWkudjEuRGlzcGF0Y2hSZX' + 'Nwb25zZS5PdXRwdXRzRW50cnlSB291dHB1dHMSJgoFZXJyb3IYAiABKAsyEC5mYWkudjEuRmFp' + 'RXJyb3JSBWVycm9yEh8KC2R1cmF0aW9uX21zGAMgASgNUgpkdXJhdGlvbk1zEisKEmV4ZWN1dG' + 'VkX2F0X2h1Yl9pZBgEIAEoCVIPZXhlY3V0ZWRBdEh1YklkGksKDE91dHB1dHNFbnRyeRIQCgNr' + 'ZXkYASABKAlSA2tleRIlCgV2YWx1ZRgCIAEoCzIPLmZhaS52MS5QYXlsb2FkUgV2YWx1ZToCOA' + 'E='); + +@$core.Deprecated('Use blobChunkDescriptor instead') +const BlobChunk$json = { + '1': 'BlobChunk', + '2': [ + { + '1': 'open', + '3': 1, + '4': 1, + '5': 11, + '6': '.fai.v1.BlobOpen', + '9': 0, + '10': 'open' + }, + {'1': 'data', '3': 2, '4': 1, '5': 12, '9': 0, '10': 'data'}, + { + '1': 'eof', + '3': 3, + '4': 1, + '5': 11, + '6': '.fai.v1.BlobEof', + '9': 0, + '10': 'eof' + }, + { + '1': 'error', + '3': 4, + '4': 1, + '5': 11, + '6': '.fai.v1.BlobError', + '9': 0, + '10': 'error' + }, + ], + '8': [ + {'1': 'kind'}, + ], +}; + +/// Descriptor for `BlobChunk`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List blobChunkDescriptor = $convert.base64Decode( + 'CglCbG9iQ2h1bmsSJgoEb3BlbhgBIAEoCzIQLmZhaS52MS5CbG9iT3BlbkgAUgRvcGVuEhQKBG' + 'RhdGEYAiABKAxIAFIEZGF0YRIjCgNlb2YYAyABKAsyDy5mYWkudjEuQmxvYkVvZkgAUgNlb2YS' + 'KQoFZXJyb3IYBCABKAsyES5mYWkudjEuQmxvYkVycm9ySABSBWVycm9yQgYKBGtpbmQ='); + +@$core.Deprecated('Use blobOpenDescriptor instead') +const BlobOpen$json = { + '1': 'BlobOpen', + '2': [ + {'1': 'operation', '3': 1, '4': 1, '5': 9, '10': 'operation'}, + {'1': 'sha256', '3': 2, '4': 1, '5': 9, '10': 'sha256'}, + {'1': 'size_bytes', '3': 3, '4': 1, '5': 4, '10': 'sizeBytes'}, + {'1': 'mime_type', '3': 4, '4': 1, '5': 9, '10': 'mimeType'}, + {'1': 'signed_ref', '3': 5, '4': 1, '5': 9, '10': 'signedRef'}, + ], +}; + +/// Descriptor for `BlobOpen`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List blobOpenDescriptor = $convert.base64Decode( + 'CghCbG9iT3BlbhIcCglvcGVyYXRpb24YASABKAlSCW9wZXJhdGlvbhIWCgZzaGEyNTYYAiABKA' + 'lSBnNoYTI1NhIdCgpzaXplX2J5dGVzGAMgASgEUglzaXplQnl0ZXMSGwoJbWltZV90eXBlGAQg' + 'ASgJUghtaW1lVHlwZRIdCgpzaWduZWRfcmVmGAUgASgJUglzaWduZWRSZWY='); + +@$core.Deprecated('Use blobEofDescriptor instead') +const BlobEof$json = { + '1': 'BlobEof', + '2': [ + {'1': 'sha256', '3': 1, '4': 1, '5': 9, '10': 'sha256'}, + {'1': 'size_bytes', '3': 2, '4': 1, '5': 4, '10': 'sizeBytes'}, + ], +}; + +/// Descriptor for `BlobEof`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List blobEofDescriptor = $convert.base64Decode( + 'CgdCbG9iRW9mEhYKBnNoYTI1NhgBIAEoCVIGc2hhMjU2Eh0KCnNpemVfYnl0ZXMYAiABKARSCX' + 'NpemVCeXRlcw=='); + +@$core.Deprecated('Use blobErrorDescriptor instead') +const BlobError$json = { + '1': 'BlobError', + '2': [ + {'1': 'code', '3': 1, '4': 1, '5': 9, '10': 'code'}, + {'1': 'message', '3': 2, '4': 1, '5': 9, '10': 'message'}, + ], +}; + +/// Descriptor for `BlobError`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List blobErrorDescriptor = $convert.base64Decode( + 'CglCbG9iRXJyb3ISEgoEY29kZRgBIAEoCVIEY29kZRIYCgdtZXNzYWdlGAIgASgJUgdtZXNzYW' + 'dl'); + +@$core.Deprecated('Use eventsRequestDescriptor instead') +const EventsRequest$json = { + '1': 'EventsRequest', + '2': [ + {'1': 'filter_hub_id', '3': 1, '4': 1, '5': 9, '10': 'filterHubId'}, + {'1': 'event_types', '3': 2, '4': 3, '5': 9, '10': 'eventTypes'}, + {'1': 'backfill', '3': 3, '4': 1, '5': 13, '10': 'backfill'}, + ], +}; + +/// Descriptor for `EventsRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List eventsRequestDescriptor = $convert.base64Decode( + 'Cg1FdmVudHNSZXF1ZXN0EiIKDWZpbHRlcl9odWJfaWQYASABKAlSC2ZpbHRlckh1YklkEh8KC2' + 'V2ZW50X3R5cGVzGAIgAygJUgpldmVudFR5cGVzEhoKCGJhY2tmaWxsGAMgASgNUghiYWNrZmls' + 'bA=='); + +@$core.Deprecated('Use relayedEventDescriptor instead') +const RelayedEvent$json = { + '1': 'RelayedEvent', + '2': [ + {'1': 'origin_hub_id', '3': 1, '4': 1, '5': 9, '10': 'originHubId'}, + { + '1': 'origin_display_name', + '3': 2, + '4': 1, + '5': 9, + '10': 'originDisplayName' + }, + {'1': 'event_id', '3': 3, '4': 1, '5': 9, '10': 'eventId'}, + {'1': 'timestamp', '3': 4, '4': 1, '5': 9, '10': 'timestamp'}, + {'1': 'event_type', '3': 5, '4': 1, '5': 9, '10': 'eventType'}, + {'1': 'flow_execution', '3': 6, '4': 1, '5': 9, '10': 'flowExecution'}, + {'1': 'invocation_id', '3': 7, '4': 1, '5': 9, '10': 'invocationId'}, + {'1': 'flow_name', '3': 8, '4': 1, '5': 9, '10': 'flowName'}, + {'1': 'step_id', '3': 9, '4': 1, '5': 9, '10': 'stepId'}, + {'1': 'module_name', '3': 10, '4': 1, '5': 9, '10': 'moduleName'}, + {'1': 'module_version', '3': 11, '4': 1, '5': 9, '10': 'moduleVersion'}, + {'1': 'duration_ms', '3': 12, '4': 1, '5': 3, '10': 'durationMs'}, + {'1': 'error', '3': 13, '4': 1, '5': 9, '10': 'error'}, + {'1': 'detail', '3': 14, '4': 1, '5': 9, '10': 'detail'}, + {'1': 'caller_name', '3': 15, '4': 1, '5': 9, '10': 'callerName'}, + ], +}; + +/// Descriptor for `RelayedEvent`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List relayedEventDescriptor = $convert.base64Decode( + 'CgxSZWxheWVkRXZlbnQSIgoNb3JpZ2luX2h1Yl9pZBgBIAEoCVILb3JpZ2luSHViSWQSLgoTb3' + 'JpZ2luX2Rpc3BsYXlfbmFtZRgCIAEoCVIRb3JpZ2luRGlzcGxheU5hbWUSGQoIZXZlbnRfaWQY' + 'AyABKAlSB2V2ZW50SWQSHAoJdGltZXN0YW1wGAQgASgJUgl0aW1lc3RhbXASHQoKZXZlbnRfdH' + 'lwZRgFIAEoCVIJZXZlbnRUeXBlEiUKDmZsb3dfZXhlY3V0aW9uGAYgASgJUg1mbG93RXhlY3V0' + 'aW9uEiMKDWludm9jYXRpb25faWQYByABKAlSDGludm9jYXRpb25JZBIbCglmbG93X25hbWUYCC' + 'ABKAlSCGZsb3dOYW1lEhcKB3N0ZXBfaWQYCSABKAlSBnN0ZXBJZBIfCgttb2R1bGVfbmFtZRgK' + 'IAEoCVIKbW9kdWxlTmFtZRIlCg5tb2R1bGVfdmVyc2lvbhgLIAEoCVINbW9kdWxlVmVyc2lvbh' + 'IfCgtkdXJhdGlvbl9tcxgMIAEoA1IKZHVyYXRpb25NcxIUCgVlcnJvchgNIAEoCVIFZXJyb3IS' + 'FgoGZGV0YWlsGA4gASgJUgZkZXRhaWwSHwoLY2FsbGVyX25hbWUYDyABKAlSCmNhbGxlck5hbW' + 'U='); diff --git a/lib/src/generated/fai/v1/hub.pb.dart b/lib/src/generated/fai/v1/hub.pb.dart index 2a80a62..d0af970 100644 --- a/lib/src/generated/fai/v1/hub.pb.dart +++ b/lib/src/generated/fai/v1/hub.pb.dart @@ -6838,6 +6838,343 @@ class RemoveN8nEndpointRequest extends $pb.GeneratedMessage { void clearName() => $_clearField(1); } +class IssueBootstrapTokenRequest extends $pb.GeneratedMessage { + factory IssueBootstrapTokenRequest({ + $core.String? satelliteName, + $core.String? region, + $fixnum.Int64? ttlSeconds, + }) { + final result = create(); + if (satelliteName != null) result.satelliteName = satelliteName; + if (region != null) result.region = region; + if (ttlSeconds != null) result.ttlSeconds = ttlSeconds; + return result; + } + + IssueBootstrapTokenRequest._(); + + factory IssueBootstrapTokenRequest.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory IssueBootstrapTokenRequest.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'IssueBootstrapTokenRequest', + package: const $pb.PackageName(_omitMessageNames ? '' : 'fai.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'satelliteName') + ..aOS(2, _omitFieldNames ? '' : 'region') + ..a<$fixnum.Int64>( + 3, _omitFieldNames ? '' : 'ttlSeconds', $pb.PbFieldType.OU6, + defaultOrMaker: $fixnum.Int64.ZERO) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + IssueBootstrapTokenRequest clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + IssueBootstrapTokenRequest copyWith( + void Function(IssueBootstrapTokenRequest) updates) => + super.copyWith( + (message) => updates(message as IssueBootstrapTokenRequest)) + as IssueBootstrapTokenRequest; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static IssueBootstrapTokenRequest create() => IssueBootstrapTokenRequest._(); + @$core.override + IssueBootstrapTokenRequest createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static IssueBootstrapTokenRequest getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static IssueBootstrapTokenRequest? _defaultInstance; + + /// Operator-friendly satellite display name the token enrols. + @$pb.TagNumber(1) + $core.String get satelliteName => $_getSZ(0); + @$pb.TagNumber(1) + set satelliteName($core.String value) => $_setString(0, value); + @$pb.TagNumber(1) + $core.bool hasSatelliteName() => $_has(0); + @$pb.TagNumber(1) + void clearSatelliteName() => $_clearField(1); + + /// Optional region tag signed into the issued cert at enrollment. + @$pb.TagNumber(2) + $core.String get region => $_getSZ(1); + @$pb.TagNumber(2) + set region($core.String value) => $_setString(1, value); + @$pb.TagNumber(2) + $core.bool hasRegion() => $_has(1); + @$pb.TagNumber(2) + void clearRegion() => $_clearField(2); + + /// Token lifetime in seconds; 0 defaults to 24h server-side. + @$pb.TagNumber(3) + $fixnum.Int64 get ttlSeconds => $_getI64(2); + @$pb.TagNumber(3) + set ttlSeconds($fixnum.Int64 value) => $_setInt64(2, value); + @$pb.TagNumber(3) + $core.bool hasTtlSeconds() => $_has(2); + @$pb.TagNumber(3) + void clearTtlSeconds() => $_clearField(3); +} + +class IssueBootstrapTokenResponse extends $pb.GeneratedMessage { + factory IssueBootstrapTokenResponse({ + $core.String? token, + $core.String? expiresAt, + $core.String? primaryCaPem, + }) { + final result = create(); + if (token != null) result.token = token; + if (expiresAt != null) result.expiresAt = expiresAt; + if (primaryCaPem != null) result.primaryCaPem = primaryCaPem; + return result; + } + + IssueBootstrapTokenResponse._(); + + factory IssueBootstrapTokenResponse.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory IssueBootstrapTokenResponse.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'IssueBootstrapTokenResponse', + package: const $pb.PackageName(_omitMessageNames ? '' : 'fai.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'token') + ..aOS(2, _omitFieldNames ? '' : 'expiresAt') + ..aOS(3, _omitFieldNames ? '' : 'primaryCaPem') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + IssueBootstrapTokenResponse clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + IssueBootstrapTokenResponse copyWith( + void Function(IssueBootstrapTokenResponse) updates) => + super.copyWith( + (message) => updates(message as IssueBootstrapTokenResponse)) + as IssueBootstrapTokenResponse; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static IssueBootstrapTokenResponse create() => + IssueBootstrapTokenResponse._(); + @$core.override + IssueBootstrapTokenResponse createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static IssueBootstrapTokenResponse getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static IssueBootstrapTokenResponse? _defaultInstance; + + /// The single-use token. Shown once; hand it to the satellite + /// operator over a secure channel. + @$pb.TagNumber(1) + $core.String get token => $_getSZ(0); + @$pb.TagNumber(1) + set token($core.String value) => $_setString(0, value); + @$pb.TagNumber(1) + $core.bool hasToken() => $_has(0); + @$pb.TagNumber(1) + void clearToken() => $_clearField(1); + + /// ISO-8601 expiry of the token. + @$pb.TagNumber(2) + $core.String get expiresAt => $_getSZ(1); + @$pb.TagNumber(2) + set expiresAt($core.String value) => $_setString(1, value); + @$pb.TagNumber(2) + $core.bool hasExpiresAt() => $_has(1); + @$pb.TagNumber(2) + void clearExpiresAt() => $_clearField(2); + + /// The primary's CA certificate PEM. The operator installs this on + /// the satellite (`federation.primary_ca`) alongside the token so + /// the satellite verifies the primary on its very first connect — + /// closing the first-connect MITM window with no extra lookup. + @$pb.TagNumber(3) + $core.String get primaryCaPem => $_getSZ(2); + @$pb.TagNumber(3) + set primaryCaPem($core.String value) => $_setString(2, value); + @$pb.TagNumber(3) + $core.bool hasPrimaryCaPem() => $_has(2); + @$pb.TagNumber(3) + void clearPrimaryCaPem() => $_clearField(3); +} + +class SatelliteList extends $pb.GeneratedMessage { + factory SatelliteList({ + $core.Iterable? satellites, + }) { + final result = create(); + if (satellites != null) result.satellites.addAll(satellites); + return result; + } + + SatelliteList._(); + + factory SatelliteList.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory SatelliteList.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'SatelliteList', + package: const $pb.PackageName(_omitMessageNames ? '' : 'fai.v1'), + createEmptyInstance: create) + ..pPM(1, _omitFieldNames ? '' : 'satellites', + subBuilder: SatelliteEntry.create) + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + SatelliteList clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + SatelliteList copyWith(void Function(SatelliteList) updates) => + super.copyWith((message) => updates(message as SatelliteList)) + as SatelliteList; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static SatelliteList create() => SatelliteList._(); + @$core.override + SatelliteList createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static SatelliteList getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static SatelliteList? _defaultInstance; + + @$pb.TagNumber(1) + $pb.PbList get satellites => $_getList(0); +} + +class SatelliteEntry extends $pb.GeneratedMessage { + factory SatelliteEntry({ + $core.String? hubId, + $core.String? displayName, + $core.String? hubVersion, + $core.int? wireVersion, + $core.String? region, + $core.Iterable<$core.String>? capabilities, + }) { + final result = create(); + if (hubId != null) result.hubId = hubId; + if (displayName != null) result.displayName = displayName; + if (hubVersion != null) result.hubVersion = hubVersion; + if (wireVersion != null) result.wireVersion = wireVersion; + if (region != null) result.region = region; + if (capabilities != null) result.capabilities.addAll(capabilities); + return result; + } + + SatelliteEntry._(); + + factory SatelliteEntry.fromBuffer($core.List<$core.int> data, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromBuffer(data, registry); + factory SatelliteEntry.fromJson($core.String json, + [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => + create()..mergeFromJson(json, registry); + + static final $pb.BuilderInfo _i = $pb.BuilderInfo( + _omitMessageNames ? '' : 'SatelliteEntry', + package: const $pb.PackageName(_omitMessageNames ? '' : 'fai.v1'), + createEmptyInstance: create) + ..aOS(1, _omitFieldNames ? '' : 'hubId') + ..aOS(2, _omitFieldNames ? '' : 'displayName') + ..aOS(3, _omitFieldNames ? '' : 'hubVersion') + ..aI(4, _omitFieldNames ? '' : 'wireVersion', + fieldType: $pb.PbFieldType.OU3) + ..aOS(5, _omitFieldNames ? '' : 'region') + ..pPS(6, _omitFieldNames ? '' : 'capabilities') + ..hasRequiredFields = false; + + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + SatelliteEntry clone() => deepCopy(); + @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') + SatelliteEntry copyWith(void Function(SatelliteEntry) updates) => + super.copyWith((message) => updates(message as SatelliteEntry)) + as SatelliteEntry; + + @$core.override + $pb.BuilderInfo get info_ => _i; + + @$core.pragma('dart2js:noInline') + static SatelliteEntry create() => SatelliteEntry._(); + @$core.override + SatelliteEntry createEmptyInstance() => create(); + @$core.pragma('dart2js:noInline') + static SatelliteEntry getDefault() => _defaultInstance ??= + $pb.GeneratedMessage.$_defaultFor(create); + static SatelliteEntry? _defaultInstance; + + /// Immutable hub UUID of the satellite. + @$pb.TagNumber(1) + $core.String get hubId => $_getSZ(0); + @$pb.TagNumber(1) + set hubId($core.String value) => $_setString(0, value); + @$pb.TagNumber(1) + $core.bool hasHubId() => $_has(0); + @$pb.TagNumber(1) + void clearHubId() => $_clearField(1); + + /// Operator-chosen display name. + @$pb.TagNumber(2) + $core.String get displayName => $_getSZ(1); + @$pb.TagNumber(2) + set displayName($core.String value) => $_setString(1, value); + @$pb.TagNumber(2) + $core.bool hasDisplayName() => $_has(1); + @$pb.TagNumber(2) + void clearDisplayName() => $_clearField(2); + + /// F∆I version the satellite reported. + @$pb.TagNumber(3) + $core.String get hubVersion => $_getSZ(2); + @$pb.TagNumber(3) + set hubVersion($core.String value) => $_setString(2, value); + @$pb.TagNumber(3) + $core.bool hasHubVersion() => $_has(2); + @$pb.TagNumber(3) + void clearHubVersion() => $_clearField(3); + + /// Negotiated federation wire version. + @$pb.TagNumber(4) + $core.int get wireVersion => $_getIZ(3); + @$pb.TagNumber(4) + set wireVersion($core.int value) => $_setUnsignedInt32(3, value); + @$pb.TagNumber(4) + $core.bool hasWireVersion() => $_has(3); + @$pb.TagNumber(4) + void clearWireVersion() => $_clearField(4); + + /// Region tag, empty when none. + @$pb.TagNumber(5) + $core.String get region => $_getSZ(4); + @$pb.TagNumber(5) + set region($core.String value) => $_setString(4, value); + @$pb.TagNumber(5) + $core.bool hasRegion() => $_has(4); + @$pb.TagNumber(5) + void clearRegion() => $_clearField(5); + + /// Capability ids the satellite currently advertises. + @$pb.TagNumber(6) + $pb.PbList<$core.String> get capabilities => $_getList(5); +} + const $core.bool _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names'); const $core.bool _omitMessageNames = diff --git a/lib/src/generated/fai/v1/hub.pbgrpc.dart b/lib/src/generated/fai/v1/hub.pbgrpc.dart index 47dd11d..b6b27f7 100644 --- a/lib/src/generated/fai/v1/hub.pbgrpc.dart +++ b/lib/src/generated/fai/v1/hub.pbgrpc.dart @@ -619,6 +619,24 @@ class HubAdminClient extends $grpc.Client { options: options); } + /// Federation (primary side). Issue a single-use bootstrap + /// token enrolling a named satellite (`fai admin satellites + /// peer-add`), and list the satellites currently connected + /// (`fai admin satellites list`). + $grpc.ResponseFuture<$0.IssueBootstrapTokenResponse> issueBootstrapToken( + $0.IssueBootstrapTokenRequest request, { + $grpc.CallOptions? options, + }) { + return $createUnaryCall(_$issueBootstrapToken, request, options: options); + } + + $grpc.ResponseFuture<$0.SatelliteList> listSatellites( + $1.Empty request, { + $grpc.CallOptions? options, + }) { + return $createUnaryCall(_$listSatellites, request, options: options); + } + // method descriptors static final _$listCapabilities = @@ -848,6 +866,16 @@ class HubAdminClient extends $grpc.Client { '/fai.v1.HubAdmin/ListSystemAiCuratedModels', ($1.Empty value) => value.writeToBuffer(), $0.ListSystemAiCuratedModelsResponse.fromBuffer); + static final _$issueBootstrapToken = $grpc.ClientMethod< + $0.IssueBootstrapTokenRequest, $0.IssueBootstrapTokenResponse>( + '/fai.v1.HubAdmin/IssueBootstrapToken', + ($0.IssueBootstrapTokenRequest value) => value.writeToBuffer(), + $0.IssueBootstrapTokenResponse.fromBuffer); + static final _$listSatellites = + $grpc.ClientMethod<$1.Empty, $0.SatelliteList>( + '/fai.v1.HubAdmin/ListSatellites', + ($1.Empty value) => value.writeToBuffer(), + $0.SatelliteList.fromBuffer); } @$pb.GrpcServiceName('fai.v1.HubAdmin') @@ -1221,6 +1249,22 @@ abstract class HubAdminServiceBase extends $grpc.Service { ($core.List<$core.int> value) => $1.Empty.fromBuffer(value), ($0.ListSystemAiCuratedModelsResponse value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$0.IssueBootstrapTokenRequest, + $0.IssueBootstrapTokenResponse>( + 'IssueBootstrapToken', + issueBootstrapToken_Pre, + false, + false, + ($core.List<$core.int> value) => + $0.IssueBootstrapTokenRequest.fromBuffer(value), + ($0.IssueBootstrapTokenResponse value) => value.writeToBuffer())); + $addMethod($grpc.ServiceMethod<$1.Empty, $0.SatelliteList>( + 'ListSatellites', + listSatellites_Pre, + false, + false, + ($core.List<$core.int> value) => $1.Empty.fromBuffer(value), + ($0.SatelliteList value) => value.writeToBuffer())); } $async.Future<$0.CapabilityList> listCapabilities_Pre( @@ -1609,4 +1653,21 @@ abstract class HubAdminServiceBase extends $grpc.Service { $async.Future<$0.ListSystemAiCuratedModelsResponse> listSystemAiCuratedModels( $grpc.ServiceCall call, $1.Empty request); + + $async.Future<$0.IssueBootstrapTokenResponse> issueBootstrapToken_Pre( + $grpc.ServiceCall $call, + $async.Future<$0.IssueBootstrapTokenRequest> $request) async { + return issueBootstrapToken($call, await $request); + } + + $async.Future<$0.IssueBootstrapTokenResponse> issueBootstrapToken( + $grpc.ServiceCall call, $0.IssueBootstrapTokenRequest request); + + $async.Future<$0.SatelliteList> listSatellites_Pre( + $grpc.ServiceCall $call, $async.Future<$1.Empty> $request) async { + return listSatellites($call, await $request); + } + + $async.Future<$0.SatelliteList> listSatellites( + $grpc.ServiceCall call, $1.Empty request); } diff --git a/lib/src/generated/fai/v1/hub.pbjson.dart b/lib/src/generated/fai/v1/hub.pbjson.dart index 472e80e..d5d5228 100644 --- a/lib/src/generated/fai/v1/hub.pbjson.dart +++ b/lib/src/generated/fai/v1/hub.pbjson.dart @@ -1632,3 +1632,77 @@ const RemoveN8nEndpointRequest$json = { final $typed_data.Uint8List removeN8nEndpointRequestDescriptor = $convert.base64Decode( 'ChhSZW1vdmVOOG5FbmRwb2ludFJlcXVlc3QSEgoEbmFtZRgBIAEoCVIEbmFtZQ=='); + +@$core.Deprecated('Use issueBootstrapTokenRequestDescriptor instead') +const IssueBootstrapTokenRequest$json = { + '1': 'IssueBootstrapTokenRequest', + '2': [ + {'1': 'satellite_name', '3': 1, '4': 1, '5': 9, '10': 'satelliteName'}, + {'1': 'region', '3': 2, '4': 1, '5': 9, '10': 'region'}, + {'1': 'ttl_seconds', '3': 3, '4': 1, '5': 4, '10': 'ttlSeconds'}, + ], +}; + +/// Descriptor for `IssueBootstrapTokenRequest`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List issueBootstrapTokenRequestDescriptor = + $convert.base64Decode( + 'ChpJc3N1ZUJvb3RzdHJhcFRva2VuUmVxdWVzdBIlCg5zYXRlbGxpdGVfbmFtZRgBIAEoCVINc2' + 'F0ZWxsaXRlTmFtZRIWCgZyZWdpb24YAiABKAlSBnJlZ2lvbhIfCgt0dGxfc2Vjb25kcxgDIAEo' + 'BFIKdHRsU2Vjb25kcw=='); + +@$core.Deprecated('Use issueBootstrapTokenResponseDescriptor instead') +const IssueBootstrapTokenResponse$json = { + '1': 'IssueBootstrapTokenResponse', + '2': [ + {'1': 'token', '3': 1, '4': 1, '5': 9, '10': 'token'}, + {'1': 'expires_at', '3': 2, '4': 1, '5': 9, '10': 'expiresAt'}, + {'1': 'primary_ca_pem', '3': 3, '4': 1, '5': 9, '10': 'primaryCaPem'}, + ], +}; + +/// Descriptor for `IssueBootstrapTokenResponse`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List issueBootstrapTokenResponseDescriptor = + $convert.base64Decode( + 'ChtJc3N1ZUJvb3RzdHJhcFRva2VuUmVzcG9uc2USFAoFdG9rZW4YASABKAlSBXRva2VuEh0KCm' + 'V4cGlyZXNfYXQYAiABKAlSCWV4cGlyZXNBdBIkCg5wcmltYXJ5X2NhX3BlbRgDIAEoCVIMcHJp' + 'bWFyeUNhUGVt'); + +@$core.Deprecated('Use satelliteListDescriptor instead') +const SatelliteList$json = { + '1': 'SatelliteList', + '2': [ + { + '1': 'satellites', + '3': 1, + '4': 3, + '5': 11, + '6': '.fai.v1.SatelliteEntry', + '10': 'satellites' + }, + ], +}; + +/// Descriptor for `SatelliteList`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List satelliteListDescriptor = $convert.base64Decode( + 'Cg1TYXRlbGxpdGVMaXN0EjYKCnNhdGVsbGl0ZXMYASADKAsyFi5mYWkudjEuU2F0ZWxsaXRlRW' + '50cnlSCnNhdGVsbGl0ZXM='); + +@$core.Deprecated('Use satelliteEntryDescriptor instead') +const SatelliteEntry$json = { + '1': 'SatelliteEntry', + '2': [ + {'1': 'hub_id', '3': 1, '4': 1, '5': 9, '10': 'hubId'}, + {'1': 'display_name', '3': 2, '4': 1, '5': 9, '10': 'displayName'}, + {'1': 'hub_version', '3': 3, '4': 1, '5': 9, '10': 'hubVersion'}, + {'1': 'wire_version', '3': 4, '4': 1, '5': 13, '10': 'wireVersion'}, + {'1': 'region', '3': 5, '4': 1, '5': 9, '10': 'region'}, + {'1': 'capabilities', '3': 6, '4': 3, '5': 9, '10': 'capabilities'}, + ], +}; + +/// Descriptor for `SatelliteEntry`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List satelliteEntryDescriptor = $convert.base64Decode( + 'Cg5TYXRlbGxpdGVFbnRyeRIVCgZodWJfaWQYASABKAlSBWh1YklkEiEKDGRpc3BsYXlfbmFtZR' + 'gCIAEoCVILZGlzcGxheU5hbWUSHwoLaHViX3ZlcnNpb24YAyABKAlSCmh1YlZlcnNpb24SIQoM' + 'd2lyZV92ZXJzaW9uGAQgASgNUgt3aXJlVmVyc2lvbhIWCgZyZWdpb24YBSABKAlSBnJlZ2lvbh' + 'IiCgxjYXBhYmlsaXRpZXMYBiADKAlSDGNhcGFiaWxpdGllcw=='); diff --git a/lib/src/hub_client.dart b/lib/src/hub_client.dart index 1ac69fc..baa66d0 100644 --- a/lib/src/hub_client.dart +++ b/lib/src/hub_client.dart @@ -6,6 +6,7 @@ import 'dart:typed_data'; +import 'package:fixnum/fixnum.dart'; import 'package:grpc/grpc.dart' as grpc; import 'package:grpc/grpc_connection_interface.dart'; @@ -139,6 +140,30 @@ class HubClient { return r.capabilities; } + /// Federation satellites currently connected to this hub + /// (primary side). Empty when none are connected or this hub does + /// not accept satellites. + Future> listSatellites() async { + final r = await _admin.listSatellites(Empty()); + return r.satellites; + } + + /// Issue a single-use federation bootstrap token enrolling + /// `satelliteName`. The response also carries the primary's CA + /// certificate so the operator can install token + CA on the + /// satellite in one step (secure first connect). + Future issueBootstrapToken( + String satelliteName, { + String region = '', + int ttlSeconds = 0, + }) { + final req = pb.IssueBootstrapTokenRequest() + ..satelliteName = satelliteName + ..region = region + ..ttlSeconds = Int64(ttlSeconds); + return _admin.issueBootstrapToken(req); + } + /// Detailed info for one installed module: name, version, /// provided capabilities, declared permissions, on-disk path. Future moduleInfo(String moduleName) {