feat(client): listStores / addStore / removeStore for the store manager
Some checks failed
Security / Security check (push) Failing after 2s

Regenerate the gRPC stubs for the new HubAdmin store-management RPCs and
wrap them in HubClient (returns StoreSource list / Add+RemoveStoreResponse)
so Studio can list and edit the module-store list from the GUI.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
This commit is contained in:
flemming-it 2026-06-18 15:49:23 +02:00
parent 2d87030945
commit d07a0a9777
8 changed files with 956 additions and 143 deletions

View file

@ -22,6 +22,62 @@ export 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions;
export 'hub.pbenum.dart';
class RevokeSatelliteRequest extends $pb.GeneratedMessage {
factory RevokeSatelliteRequest({
$core.String? hubId,
}) {
final result = create();
if (hubId != null) result.hubId = hubId;
return result;
}
RevokeSatelliteRequest._();
factory RevokeSatelliteRequest.fromBuffer($core.List<$core.int> data,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromBuffer(data, registry);
factory RevokeSatelliteRequest.fromJson($core.String json,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromJson(json, registry);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
_omitMessageNames ? '' : 'RevokeSatelliteRequest',
package: const $pb.PackageName(_omitMessageNames ? '' : 'chain.v1'),
createEmptyInstance: create)
..aOS(1, _omitFieldNames ? '' : 'hubId')
..hasRequiredFields = false;
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
RevokeSatelliteRequest clone() => deepCopy();
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
RevokeSatelliteRequest copyWith(
void Function(RevokeSatelliteRequest) updates) =>
super.copyWith((message) => updates(message as RevokeSatelliteRequest))
as RevokeSatelliteRequest;
@$core.override
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static RevokeSatelliteRequest create() => RevokeSatelliteRequest._();
@$core.override
RevokeSatelliteRequest createEmptyInstance() => create();
@$core.pragma('dart2js:noInline')
static RevokeSatelliteRequest getDefault() => _defaultInstance ??=
$pb.GeneratedMessage.$_defaultFor<RevokeSatelliteRequest>(create);
static RevokeSatelliteRequest? _defaultInstance;
/// Immutable hub UUID of the satellite to revoke.
@$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);
}
class SubmitRequest extends $pb.GeneratedMessage {
factory SubmitRequest({
$core.List<$core.int>? flowYaml,
@ -4266,7 +4322,7 @@ class ChannelStatusResponse extends $pb.GeneratedMessage {
$pb.GeneratedMessage.$_defaultFor<ChannelStatusResponse>(create);
static ChannelStatusResponse? _defaultInstance;
/// Active channel pointer from `~/.fai/current-channel`.
/// Active channel pointer from `~/.chain/current-channel`.
@$pb.TagNumber(1)
$core.String get active => $_getSZ(0);
@$pb.TagNumber(1)
@ -4362,7 +4418,7 @@ class ChannelEntry extends $pb.GeneratedMessage {
@$pb.TagNumber(3)
void clearRunning() => $_clearField(3);
/// Endpoint string from `~/.fai/run/<channel>.endpoint` when
/// Endpoint string from `~/.chain/run/<channel>.endpoint` when
/// the daemon is up, otherwise empty.
@$pb.TagNumber(4)
$core.String get endpoint => $_getSZ(3);
@ -4474,7 +4530,7 @@ class DaemonPathsResponse extends $pb.GeneratedMessage {
@$pb.TagNumber(4)
void clearFlowsDir() => $_clearField(4);
/// Operator config file (~/.fai/config.yaml).
/// Operator config file (~/.chain/config.yaml).
@$pb.TagNumber(5)
$core.String get configPath => $_getSZ(4);
@$pb.TagNumber(5)
@ -7140,7 +7196,7 @@ class SatelliteEntry extends $pb.GeneratedMessage {
@$pb.TagNumber(2)
void clearDisplayName() => $_clearField(2);
/// FI version the satellite reported.
/// ChIn version the satellite reported.
@$pb.TagNumber(3)
$core.String get hubVersion => $_getSZ(2);
@$pb.TagNumber(3)
@ -7175,6 +7231,482 @@ class SatelliteEntry extends $pb.GeneratedMessage {
$pb.PbList<$core.String> get capabilities => $_getList(5);
}
class ListStoresRequest extends $pb.GeneratedMessage {
factory ListStoresRequest() => create();
ListStoresRequest._();
factory ListStoresRequest.fromBuffer($core.List<$core.int> data,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromBuffer(data, registry);
factory ListStoresRequest.fromJson($core.String json,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromJson(json, registry);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
_omitMessageNames ? '' : 'ListStoresRequest',
package: const $pb.PackageName(_omitMessageNames ? '' : 'chain.v1'),
createEmptyInstance: create)
..hasRequiredFields = false;
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
ListStoresRequest clone() => deepCopy();
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
ListStoresRequest copyWith(void Function(ListStoresRequest) updates) =>
super.copyWith((message) => updates(message as ListStoresRequest))
as ListStoresRequest;
@$core.override
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static ListStoresRequest create() => ListStoresRequest._();
@$core.override
ListStoresRequest createEmptyInstance() => create();
@$core.pragma('dart2js:noInline')
static ListStoresRequest getDefault() => _defaultInstance ??=
$pb.GeneratedMessage.$_defaultFor<ListStoresRequest>(create);
static ListStoresRequest? _defaultInstance;
}
class StoreSource extends $pb.GeneratedMessage {
factory StoreSource({
$core.String? name,
$core.String? url,
$core.bool? removable,
$core.int? moduleCount,
}) {
final result = create();
if (name != null) result.name = name;
if (url != null) result.url = url;
if (removable != null) result.removable = removable;
if (moduleCount != null) result.moduleCount = moduleCount;
return result;
}
StoreSource._();
factory StoreSource.fromBuffer($core.List<$core.int> data,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromBuffer(data, registry);
factory StoreSource.fromJson($core.String json,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromJson(json, registry);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
_omitMessageNames ? '' : 'StoreSource',
package: const $pb.PackageName(_omitMessageNames ? '' : 'chain.v1'),
createEmptyInstance: create)
..aOS(1, _omitFieldNames ? '' : 'name')
..aOS(2, _omitFieldNames ? '' : 'url')
..aOB(3, _omitFieldNames ? '' : 'removable')
..aI(4, _omitFieldNames ? '' : 'moduleCount')
..hasRequiredFields = false;
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
StoreSource clone() => deepCopy();
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
StoreSource copyWith(void Function(StoreSource) updates) =>
super.copyWith((message) => updates(message as StoreSource))
as StoreSource;
@$core.override
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static StoreSource create() => StoreSource._();
@$core.override
StoreSource createEmptyInstance() => create();
@$core.pragma('dart2js:noInline')
static StoreSource getDefault() => _defaultInstance ??=
$pb.GeneratedMessage.$_defaultFor<StoreSource>(create);
static StoreSource? _defaultInstance;
/// "bundled" for the seed index, else the operator-given name.
@$pb.TagNumber(1)
$core.String get name => $_getSZ(0);
@$pb.TagNumber(1)
set name($core.String value) => $_setString(0, value);
@$pb.TagNumber(1)
$core.bool hasName() => $_has(0);
@$pb.TagNumber(1)
void clearName() => $_clearField(1);
/// Index URL; empty for the bundled seed.
@$pb.TagNumber(2)
$core.String get url => $_getSZ(1);
@$pb.TagNumber(2)
set url($core.String value) => $_setString(1, value);
@$pb.TagNumber(2)
$core.bool hasUrl() => $_has(1);
@$pb.TagNumber(2)
void clearUrl() => $_clearField(2);
/// False for the bundled seed (cannot be removed).
@$pb.TagNumber(3)
$core.bool get removable => $_getBF(2);
@$pb.TagNumber(3)
set removable($core.bool value) => $_setBool(2, value);
@$pb.TagNumber(3)
$core.bool hasRemovable() => $_has(2);
@$pb.TagNumber(3)
void clearRemovable() => $_clearField(3);
/// Modules currently contributed by this source to the live index.
@$pb.TagNumber(4)
$core.int get moduleCount => $_getIZ(3);
@$pb.TagNumber(4)
set moduleCount($core.int value) => $_setSignedInt32(3, value);
@$pb.TagNumber(4)
$core.bool hasModuleCount() => $_has(3);
@$pb.TagNumber(4)
void clearModuleCount() => $_clearField(4);
}
class ListStoresResponse extends $pb.GeneratedMessage {
factory ListStoresResponse({
$core.Iterable<StoreSource>? stores,
}) {
final result = create();
if (stores != null) result.stores.addAll(stores);
return result;
}
ListStoresResponse._();
factory ListStoresResponse.fromBuffer($core.List<$core.int> data,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromBuffer(data, registry);
factory ListStoresResponse.fromJson($core.String json,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromJson(json, registry);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
_omitMessageNames ? '' : 'ListStoresResponse',
package: const $pb.PackageName(_omitMessageNames ? '' : 'chain.v1'),
createEmptyInstance: create)
..pPM<StoreSource>(1, _omitFieldNames ? '' : 'stores',
subBuilder: StoreSource.create)
..hasRequiredFields = false;
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
ListStoresResponse clone() => deepCopy();
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
ListStoresResponse copyWith(void Function(ListStoresResponse) updates) =>
super.copyWith((message) => updates(message as ListStoresResponse))
as ListStoresResponse;
@$core.override
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static ListStoresResponse create() => ListStoresResponse._();
@$core.override
ListStoresResponse createEmptyInstance() => create();
@$core.pragma('dart2js:noInline')
static ListStoresResponse getDefault() => _defaultInstance ??=
$pb.GeneratedMessage.$_defaultFor<ListStoresResponse>(create);
static ListStoresResponse? _defaultInstance;
@$pb.TagNumber(1)
$pb.PbList<StoreSource> get stores => $_getList(0);
}
class AddStoreRequest extends $pb.GeneratedMessage {
factory AddStoreRequest({
$core.String? name,
$core.String? url,
$core.String? bearerEnv,
$core.String? basicUser,
$core.String? basicPasswordEnv,
}) {
final result = create();
if (name != null) result.name = name;
if (url != null) result.url = url;
if (bearerEnv != null) result.bearerEnv = bearerEnv;
if (basicUser != null) result.basicUser = basicUser;
if (basicPasswordEnv != null) result.basicPasswordEnv = basicPasswordEnv;
return result;
}
AddStoreRequest._();
factory AddStoreRequest.fromBuffer($core.List<$core.int> data,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromBuffer(data, registry);
factory AddStoreRequest.fromJson($core.String json,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromJson(json, registry);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
_omitMessageNames ? '' : 'AddStoreRequest',
package: const $pb.PackageName(_omitMessageNames ? '' : 'chain.v1'),
createEmptyInstance: create)
..aOS(1, _omitFieldNames ? '' : 'name')
..aOS(2, _omitFieldNames ? '' : 'url')
..aOS(3, _omitFieldNames ? '' : 'bearerEnv')
..aOS(4, _omitFieldNames ? '' : 'basicUser')
..aOS(5, _omitFieldNames ? '' : 'basicPasswordEnv')
..hasRequiredFields = false;
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
AddStoreRequest clone() => deepCopy();
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
AddStoreRequest copyWith(void Function(AddStoreRequest) updates) =>
super.copyWith((message) => updates(message as AddStoreRequest))
as AddStoreRequest;
@$core.override
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static AddStoreRequest create() => AddStoreRequest._();
@$core.override
AddStoreRequest createEmptyInstance() => create();
@$core.pragma('dart2js:noInline')
static AddStoreRequest getDefault() => _defaultInstance ??=
$pb.GeneratedMessage.$_defaultFor<AddStoreRequest>(create);
static AddStoreRequest? _defaultInstance;
/// Operator-friendly name, unique within configured stores.
@$pb.TagNumber(1)
$core.String get name => $_getSZ(0);
@$pb.TagNumber(1)
set name($core.String value) => $_setString(0, value);
@$pb.TagNumber(1)
$core.bool hasName() => $_has(0);
@$pb.TagNumber(1)
void clearName() => $_clearField(1);
/// Index URL: https:// , http:// , or file:// .
@$pb.TagNumber(2)
$core.String get url => $_getSZ(1);
@$pb.TagNumber(2)
set url($core.String value) => $_setString(1, value);
@$pb.TagNumber(2)
$core.bool hasUrl() => $_has(1);
@$pb.TagNumber(2)
void clearUrl() => $_clearField(2);
/// Optional bearer-token env var name (hub reads $value at request time).
@$pb.TagNumber(3)
$core.String get bearerEnv => $_getSZ(2);
@$pb.TagNumber(3)
set bearerEnv($core.String value) => $_setString(2, value);
@$pb.TagNumber(3)
$core.bool hasBearerEnv() => $_has(2);
@$pb.TagNumber(3)
void clearBearerEnv() => $_clearField(3);
/// Optional HTTP Basic username.
@$pb.TagNumber(4)
$core.String get basicUser => $_getSZ(3);
@$pb.TagNumber(4)
set basicUser($core.String value) => $_setString(3, value);
@$pb.TagNumber(4)
$core.bool hasBasicUser() => $_has(3);
@$pb.TagNumber(4)
void clearBasicUser() => $_clearField(4);
/// Optional HTTP Basic password env var name. Pair with basic_user.
@$pb.TagNumber(5)
$core.String get basicPasswordEnv => $_getSZ(4);
@$pb.TagNumber(5)
set basicPasswordEnv($core.String value) => $_setString(4, value);
@$pb.TagNumber(5)
$core.bool hasBasicPasswordEnv() => $_has(4);
@$pb.TagNumber(5)
void clearBasicPasswordEnv() => $_clearField(5);
}
class AddStoreResponse extends $pb.GeneratedMessage {
factory AddStoreResponse({
$core.int? modulesAdded,
$core.String? message,
}) {
final result = create();
if (modulesAdded != null) result.modulesAdded = modulesAdded;
if (message != null) result.message = message;
return result;
}
AddStoreResponse._();
factory AddStoreResponse.fromBuffer($core.List<$core.int> data,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromBuffer(data, registry);
factory AddStoreResponse.fromJson($core.String json,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromJson(json, registry);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
_omitMessageNames ? '' : 'AddStoreResponse',
package: const $pb.PackageName(_omitMessageNames ? '' : 'chain.v1'),
createEmptyInstance: create)
..aI(1, _omitFieldNames ? '' : 'modulesAdded')
..aOS(2, _omitFieldNames ? '' : 'message')
..hasRequiredFields = false;
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
AddStoreResponse clone() => deepCopy();
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
AddStoreResponse copyWith(void Function(AddStoreResponse) updates) =>
super.copyWith((message) => updates(message as AddStoreResponse))
as AddStoreResponse;
@$core.override
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static AddStoreResponse create() => AddStoreResponse._();
@$core.override
AddStoreResponse createEmptyInstance() => create();
@$core.pragma('dart2js:noInline')
static AddStoreResponse getDefault() => _defaultInstance ??=
$pb.GeneratedMessage.$_defaultFor<AddStoreResponse>(create);
static AddStoreResponse? _defaultInstance;
/// Modules the new store contributed to the live index.
@$pb.TagNumber(1)
$core.int get modulesAdded => $_getIZ(0);
@$pb.TagNumber(1)
set modulesAdded($core.int value) => $_setSignedInt32(0, value);
@$pb.TagNumber(1)
$core.bool hasModulesAdded() => $_has(0);
@$pb.TagNumber(1)
void clearModulesAdded() => $_clearField(1);
/// Human-readable result (e.g. "added 8 modules from reclaim").
@$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);
}
class RemoveStoreRequest extends $pb.GeneratedMessage {
factory RemoveStoreRequest({
$core.String? name,
}) {
final result = create();
if (name != null) result.name = name;
return result;
}
RemoveStoreRequest._();
factory RemoveStoreRequest.fromBuffer($core.List<$core.int> data,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromBuffer(data, registry);
factory RemoveStoreRequest.fromJson($core.String json,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromJson(json, registry);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
_omitMessageNames ? '' : 'RemoveStoreRequest',
package: const $pb.PackageName(_omitMessageNames ? '' : 'chain.v1'),
createEmptyInstance: create)
..aOS(1, _omitFieldNames ? '' : 'name')
..hasRequiredFields = false;
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
RemoveStoreRequest clone() => deepCopy();
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
RemoveStoreRequest copyWith(void Function(RemoveStoreRequest) updates) =>
super.copyWith((message) => updates(message as RemoveStoreRequest))
as RemoveStoreRequest;
@$core.override
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static RemoveStoreRequest create() => RemoveStoreRequest._();
@$core.override
RemoveStoreRequest createEmptyInstance() => create();
@$core.pragma('dart2js:noInline')
static RemoveStoreRequest getDefault() => _defaultInstance ??=
$pb.GeneratedMessage.$_defaultFor<RemoveStoreRequest>(create);
static RemoveStoreRequest? _defaultInstance;
@$pb.TagNumber(1)
$core.String get name => $_getSZ(0);
@$pb.TagNumber(1)
set name($core.String value) => $_setString(0, value);
@$pb.TagNumber(1)
$core.bool hasName() => $_has(0);
@$pb.TagNumber(1)
void clearName() => $_clearField(1);
}
class RemoveStoreResponse extends $pb.GeneratedMessage {
factory RemoveStoreResponse({
$core.bool? removed,
$core.String? message,
}) {
final result = create();
if (removed != null) result.removed = removed;
if (message != null) result.message = message;
return result;
}
RemoveStoreResponse._();
factory RemoveStoreResponse.fromBuffer($core.List<$core.int> data,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromBuffer(data, registry);
factory RemoveStoreResponse.fromJson($core.String json,
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
create()..mergeFromJson(json, registry);
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
_omitMessageNames ? '' : 'RemoveStoreResponse',
package: const $pb.PackageName(_omitMessageNames ? '' : 'chain.v1'),
createEmptyInstance: create)
..aOB(1, _omitFieldNames ? '' : 'removed')
..aOS(2, _omitFieldNames ? '' : 'message')
..hasRequiredFields = false;
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
RemoveStoreResponse clone() => deepCopy();
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
RemoveStoreResponse copyWith(void Function(RemoveStoreResponse) updates) =>
super.copyWith((message) => updates(message as RemoveStoreResponse))
as RemoveStoreResponse;
@$core.override
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static RemoveStoreResponse create() => RemoveStoreResponse._();
@$core.override
RemoveStoreResponse createEmptyInstance() => create();
@$core.pragma('dart2js:noInline')
static RemoveStoreResponse getDefault() => _defaultInstance ??=
$pb.GeneratedMessage.$_defaultFor<RemoveStoreResponse>(create);
static RemoveStoreResponse? _defaultInstance;
@$pb.TagNumber(1)
$core.bool get removed => $_getBF(0);
@$pb.TagNumber(1)
set removed($core.bool value) => $_setBool(0, value);
@$pb.TagNumber(1)
$core.bool hasRemoved() => $_has(0);
@$pb.TagNumber(1)
void clearRemoved() => $_clearField(1);
@$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);
}
const $core.bool _omitFieldNames =
$core.bool.fromEnvironment('protobuf.omit_field_names');
const $core.bool _omitMessageNames =