merge: @main into client-integrity-verification
Some checks failed
ci/woodpecker/push/server-vet Pipeline failed
ci/woodpecker/push/server-lint Pipeline failed
ci/woodpecker/pr/useragent-analyze Pipeline failed
ci/woodpecker/pr/server-lint Pipeline failed
ci/woodpecker/push/useragent-analyze Pipeline failed
ci/woodpecker/push/server-test Pipeline failed
ci/woodpecker/pr/server-test Pipeline failed
ci/woodpecker/pr/server-vet Pipeline failed
ci/woodpecker/push/server-audit Pipeline was successful
ci/woodpecker/pr/server-audit Pipeline was successful

This commit was merged in pull request #43.
This commit is contained in:
hdbg
2026-04-05 10:13:19 +02:00
135 changed files with 9327 additions and 5831 deletions

View File

@@ -1,12 +1,12 @@
import 'package:arbiter/proto/user_agent.pb.dart';
import 'package:arbiter/proto/user_agent/sdk_client.pb.dart' as ua_sdk;
import 'package:auto_route/auto_route.dart';
import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
@RoutePage()
class ClientDetails extends ConsumerWidget {
final SdkClientEntry client;
final ua_sdk.Entry client;
const ClientDetails({super.key, required this.client});
@override
@@ -14,4 +14,4 @@ class ClientDetails extends ConsumerWidget {
throw UnimplementedError();
}
}
}

View File

@@ -1,5 +1,5 @@
import 'package:arbiter/providers/sdk_clients/details.dart';
import 'package:arbiter/proto/user_agent.pb.dart';
import 'package:arbiter/proto/user_agent/sdk_client.pb.dart' as ua_sdk;
import 'package:arbiter/screens/dashboard/clients/details/widgets/client_details_content.dart';
import 'package:arbiter/screens/dashboard/clients/details/widgets/client_details_state_panel.dart';
import 'package:auto_route/auto_route.dart';
@@ -40,7 +40,7 @@ class _ClientDetailsState extends StatelessWidget {
const _ClientDetailsState({required this.clientId, required this.client});
final int clientId;
final SdkClientEntry? client;
final ua_sdk.Entry? client;
@override
Widget build(BuildContext context) {

View File

@@ -1,4 +1,4 @@
import 'package:arbiter/proto/user_agent.pb.dart';
import 'package:arbiter/proto/user_agent/sdk_client.pb.dart' as ua_sdk;
import 'package:arbiter/providers/sdk_clients/wallet_access.dart';
import 'package:arbiter/screens/dashboard/clients/details/widgets/client_details_header.dart';
import 'package:arbiter/screens/dashboard/clients/details/widgets/client_summary_card.dart';
@@ -16,7 +16,7 @@ class ClientDetailsContent extends ConsumerWidget {
});
final int clientId;
final SdkClientEntry client;
final ua_sdk.Entry client;
@override
Widget build(BuildContext context, WidgetRef ref) {

View File

@@ -1,11 +1,11 @@
import 'package:arbiter/proto/user_agent.pb.dart';
import 'package:arbiter/proto/user_agent/sdk_client.pb.dart' as ua_sdk;
import 'package:arbiter/widgets/cream_frame.dart';
import 'package:flutter/material.dart';
class ClientSummaryCard extends StatelessWidget {
const ClientSummaryCard({super.key, required this.client});
final SdkClientEntry client;
final ua_sdk.Entry client;
@override
Widget build(BuildContext context) {

View File

@@ -1,6 +1,6 @@
import 'dart:math' as math;
import 'package:arbiter/proto/user_agent.pb.dart';
import 'package:arbiter/proto/user_agent/sdk_client.pb.dart' as ua_sdk;
import 'package:arbiter/providers/connection/connection_manager.dart';
import 'package:arbiter/router.gr.dart';
import 'package:arbiter/providers/sdk_clients/list.dart';
@@ -175,7 +175,7 @@ class _ClientTableHeader extends StatelessWidget {
class _ClientTableRow extends HookWidget {
const _ClientTableRow({required this.client});
final SdkClientEntry client;
final ua_sdk.Entry client;
@override
Widget build(BuildContext context) {
@@ -366,7 +366,7 @@ class _ClientTableRow extends HookWidget {
class _ClientTable extends StatelessWidget {
const _ClientTable({required this.clients});
final List<SdkClientEntry> clients;
final List<ua_sdk.Entry> clients;
@override
Widget build(BuildContext context) {

View File

@@ -1,5 +1,5 @@
// lib/screens/dashboard/evm/grants/create/fields/client_picker_field.dart
import 'package:arbiter/proto/user_agent.pb.dart';
import 'package:arbiter/proto/user_agent/sdk_client.pb.dart' as ua_sdk;
import 'package:arbiter/providers/sdk_clients/list.dart';
import 'package:arbiter/screens/dashboard/evm/grants/create/provider.dart';
import 'package:flutter/material.dart';
@@ -12,7 +12,7 @@ class ClientPickerField extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final clients =
ref.watch(sdkClientsProvider).asData?.value ?? const <SdkClientEntry>[];
ref.watch(sdkClientsProvider).asData?.value ?? const <ua_sdk.Entry>[];
return FormBuilderDropdown<int>(
name: 'clientId',

View File

@@ -1,6 +1,6 @@
// lib/screens/dashboard/evm/grants/create/fields/wallet_access_picker_field.dart
import 'package:arbiter/proto/evm.pb.dart';
import 'package:arbiter/proto/user_agent.pb.dart';
import 'package:arbiter/proto/user_agent/sdk_client.pb.dart' as ua_sdk;
import 'package:arbiter/providers/evm/evm.dart';
import 'package:arbiter/providers/sdk_clients/wallet_access_list.dart';
import 'package:arbiter/screens/dashboard/evm/grants/create/provider.dart';
@@ -17,13 +17,13 @@ class WalletAccessPickerField extends ConsumerWidget {
final state = ref.watch(grantCreationProvider);
final allAccesses =
ref.watch(walletAccessListProvider).asData?.value ??
const <SdkClientWalletAccess>[];
const <ua_sdk.WalletAccessEntry>[];
final wallets =
ref.watch(evmProvider).asData?.value ?? const <WalletEntry>[];
final walletById = <int, WalletEntry>{for (final w in wallets) w.id: w};
final accesses = state.selectedClientId == null
? const <SdkClientWalletAccess>[]
? const <ua_sdk.WalletAccessEntry>[]
: allAccesses
.where((a) => a.access.sdkClientId == state.selectedClientId)
.toList();

View File

@@ -1,5 +1,5 @@
import 'package:arbiter/proto/evm.pb.dart';
import 'package:arbiter/proto/user_agent.pb.dart';
import 'package:arbiter/proto/user_agent/sdk_client.pb.dart' as ua_sdk;
import 'package:arbiter/providers/evm/evm.dart';
import 'package:arbiter/providers/evm/evm_grants.dart';
import 'package:arbiter/providers/sdk_clients/list.dart';
@@ -30,7 +30,6 @@ class GrantCard extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
// Enrichment lookups — each watch scopes rebuilds to this card only
final walletAccesses =
ref.watch(walletAccessListProvider).asData?.value ?? const [];
final wallets = ref.watch(evmProvider).asData?.value ?? const [];
@@ -44,8 +43,7 @@ class GrantCard extends ConsumerWidget {
final theme = Theme.of(context);
final muted = Palette.ink.withValues(alpha: 0.62);
// Resolve wallet_access_id → wallet address + client name
final accessById = <int, SdkClientWalletAccess>{
final accessById = <int, ua_sdk.WalletAccessEntry>{
for (final a in walletAccesses) a.id: a,
};
final walletById = <int, WalletEntry>{
@@ -94,7 +92,6 @@ class GrantCard extends ConsumerWidget {
child: Row(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
// Accent strip
Container(
width: 0.8.w,
decoration: BoxDecoration(
@@ -104,7 +101,6 @@ class GrantCard extends ConsumerWidget {
),
),
),
// Card body
Expanded(
child: Padding(
padding: EdgeInsets.symmetric(
@@ -114,7 +110,6 @@ class GrantCard extends ConsumerWidget {
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// Row 1: type badge · chain · spacer · revoke button
Row(
children: [
Container(
@@ -184,7 +179,6 @@ class GrantCard extends ConsumerWidget {
],
),
SizedBox(height: 0.8.h),
// Row 2: wallet address · client name
Row(
children: [
Text(