@githolon/dsl 0.108.7 → 0.110.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/operation-contract.wasm +0 -0
- package/check_package.mjs +12 -15
- package/compile_package.mjs +17 -18
- package/compile_proof.mjs +16 -1
- package/dart/CHANGELOG.md +76 -1
- package/dart/README.md +25 -2
- package/dart/lib/src/admission_decision.dart +41 -0
- package/dart/lib/src/application_framework_calls.dart +52 -2
- package/dart/lib/src/application_model_adoption.dart +187 -0
- package/dart/lib/src/application_status.dart +73 -0
- package/dart/lib/src/console_enrolment.dart +271 -0
- package/dart/lib/src/console_http_io.dart +26 -0
- package/dart/lib/src/console_http_stub.dart +7 -0
- package/dart/lib/src/dev_cloud.dart +69 -22
- package/dart/lib/src/generated_call.dart +83 -23
- package/dart/lib/src/kernel_primitives.dart +119 -0
- package/dart/lib/src/nms_conformance_runtime.dart +1 -1
- package/dart/lib/src/nms_generated_runtime.dart +32 -10
- package/dart/lib/src/nms_test_environment.dart +1 -1
- package/dart/lib/src/node_runner_transport.dart +41 -46
- package/dart/lib/src/observed_session_directory.dart +70 -0
- package/dart/lib/src/operation_receipts.dart +112 -0
- package/dart/lib/src/peer_application_streams.dart +103 -0
- package/dart/lib/src/reception/dart_reception.dart +4280 -0
- package/dart/lib/src/reception/event_desk.dart +211 -0
- package/dart/lib/src/reception/extremum_read.dart +46 -0
- package/dart/lib/src/reception/local_copies.dart +371 -0
- package/dart/lib/src/reception/peer_office_connection.dart +11 -0
- package/dart/lib/src/reception/progress_desk.dart +267 -0
- package/dart/lib/src/reception/reception_contract.dart +11 -0
- package/dart/lib/src/reception/reception_session.dart +284 -0
- package/dart/lib/src/reception/sync_diagnostics.dart +26 -0
- package/dart/lib/src/reception/workspace_preparation_report.dart +126 -0
- package/dart/lib/src/replica_readiness.dart +123 -0
- package/dart/lib/src/runner/node-entry.mjs +23905 -15774
- package/dart/lib/src/runtime_v2_gateway.dart +56 -3
- package/dart/lib/src/runtime_v2_transport.dart +544 -3
- package/dart/lib/src/session_bound.dart +200 -311
- package/dart/lib/src/signing_identity_kernel.dart +84 -0
- package/dart/lib/src/sync_status_projection.dart +548 -0
- package/dart/lib/src/sync_status_reducer.dart +170 -0
- package/dart/lib/src/test_harness.dart +809 -1153
- package/dart/lib/src/testing/test_custody.dart +66 -0
- package/dart/lib/src/testing/test_peer.dart +328 -0
- package/dart/lib/src/typed_watch_registry.dart +169 -0
- package/dart/lib/src/workspace_open_progress.dart +27 -0
- package/dart/pubspec.lock +24 -1
- package/dart/pubspec.yaml +7 -2
- package/dart/pubspec_overrides.yaml +2 -0
- package/dart/test/admission_decision_test.dart +48 -0
- package/dart/test/background_model_adoption_test.dart +228 -0
- package/dart/test/bundle_version_pairing_test.dart +4 -4
- package/dart/test/child_authentication_repair_test.dart +359 -0
- package/dart/test/cloud_bound_local_shell_test.dart +119 -0
- package/dart/test/console_enrolment_refusal_test.dart +52 -0
- package/dart/test/console_enrolment_test.dart +227 -0
- package/dart/test/errors_test.dart +5 -5
- package/dart/test/event_plane_seam_test.dart +50 -164
- package/dart/test/extremum_read_test.dart +58 -0
- package/dart/test/fixtures/wedge/wedge-entry.mjs +3 -21
- package/dart/test/generated_query_test.dart +32 -0
- package/dart/test/harness_phase_timeout_test.dart +18 -23
- package/dart/test/kernel_author_after_read_test.dart +242 -0
- package/dart/test/kernel_fence_test.dart +137 -0
- package/dart/test/local_copies_test.dart +222 -0
- package/dart/test/model_adoption_test.dart +198 -0
- package/dart/test/node_peer_local_custody_test.dart +153 -0
- package/dart/test/offer_authentication_proof_test.dart +352 -52
- package/dart/test/operation_compatibility_test.dart +151 -0
- package/dart/test/platform_credential_effect_test.dart +386 -0
- package/dart/test/receiving_group_open_test.dart +213 -0
- package/dart/test/reception/workspace_preparation_report_test.dart +103 -0
- package/dart/test/reception_span_trace_test.dart +23 -0
- package/dart/test/replica_readiness_test.dart +156 -0
- package/dart/test/runtime_projections_test.dart +92 -0
- package/dart/test/runtime_v2_gateway_test.dart +131 -0
- package/dart/test/signing_identity_kernel_test.dart +75 -0
- package/dart/test/sync_status_preparation_report_test.dart +29 -0
- package/dart/test/sync_status_reducer_test.dart +419 -0
- package/dart/test/test_harness_test.dart +71 -95
- package/dart/test/typed_query_watch_test.dart +170 -0
- package/dart/test/typed_watch_registry_test.dart +249 -0
- package/dart_lints/README.md +18 -0
- package/dart_lints/lib/nomos_lints.dart +70 -0
- package/dart_lints/pubspec.lock +580 -0
- package/dart_lints/pubspec.yaml +12 -0
- package/dart_lints/test/reference_identity_test.dart +75 -0
- package/dart_types/CHANGELOG.md +18 -0
- package/dart_types/lib/nomos_kernel_protocol.dart +21 -1
- package/dart_types/lib/nomos_types.dart +9 -1
- package/dart_types/lib/src/admission_decision.dart +37 -0
- package/dart_types/lib/src/aggregate_meta.dart +1 -1
- package/dart_types/lib/src/approved_model.dart +65 -0
- package/dart_types/lib/src/custody.dart +10 -18
- package/dart_types/lib/src/error_info.dart +4 -4
- package/dart_types/lib/src/errors.dart +29 -29
- package/dart_types/lib/src/foreign_ref.dart +62 -33
- package/dart_types/lib/src/local_work_rejected.dart +3 -3
- package/dart_types/lib/src/nomos_ref.dart +3 -1
- package/dart_types/lib/src/principal.dart +2 -2
- package/dart_types/lib/src/proto/google/protobuf/any.pb.dart +163 -0
- package/dart_types/lib/src/proto/google/protobuf/any.pbenum.dart +11 -0
- package/dart_types/lib/src/proto/nomos/discovery/v1/workspace_placement.pb.dart +137 -0
- package/dart_types/lib/src/proto/nomos/discovery/v1/workspace_placement.pbenum.dart +11 -0
- package/dart_types/lib/src/proto/nomos/kernel/v1/kernel.pb.dart +20721 -10433
- package/dart_types/lib/src/proto/nomos/kernel/v1/kernel.pbenum.dart +555 -27
- package/dart_types/lib/src/proto/nomos/runtime/v2/application_desk.pb.dart +387 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/application_desk.pbenum.dart +46 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/application_readiness_desk.pb.dart +295 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/application_readiness_desk.pbenum.dart +139 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/authentication_desk.pb.dart +269 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/authentication_desk.pbenum.dart +103 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/compatibility_desk.pb.dart +417 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/compatibility_desk.pbenum.dart +62 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/correspondence_desk.pb.dart +9968 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/correspondence_desk.pbenum.dart +133 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/credentials_desk.pb.dart +204 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/credentials_desk.pbenum.dart +54 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/custody_desk.pb.dart +1550 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/custody_desk.pbenum.dart +11 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/framework.pb.dart +710 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/framework.pbenum.dart +11 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/identity_desk.pb.dart +845 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/identity_desk.pbenum.dart +11 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/interaction_desk.pb.dart +198 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/interaction_desk.pbenum.dart +11 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/law_desk.pb.dart +369 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/law_desk.pbenum.dart +11 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/maintenance_desk.pb.dart +609 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/maintenance_desk.pbenum.dart +65 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/model_adoption_desk.pb.dart +358 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/model_adoption_desk.pbenum.dart +100 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/observability_desk.pb.dart +2231 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/observability_desk.pbenum.dart +271 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/placement_desk.pb.dart +1286 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/placement_desk.pbenum.dart +11 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/receiving_group_desk.pb.dart +636 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/receiving_group_desk.pbenum.dart +116 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/records_desk.pb.dart +1637 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/records_desk.pbenum.dart +175 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/recovery_desk.pb.dart +1269 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/recovery_desk.pbenum.dart +129 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/residency_desk.pb.dart +2782 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/residency_desk.pbenum.dart +97 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/runtime.pb.dart +2232 -8627
- package/dart_types/lib/src/proto/nomos/runtime/v2/runtime.pbenum.dart +0 -358
- package/dart_types/lib/src/proto/nomos/runtime/v2/sealing_desk.pb.dart +1639 -0
- package/dart_types/lib/src/proto/nomos/runtime/v2/sealing_desk.pbenum.dart +46 -0
- package/dart_types/lib/src/runtime_outcome.dart +133 -0
- package/dart_types/lib/src/subscriptions.dart +116 -23
- package/dart_types/pubspec.yaml +1 -1
- package/dart_types/test/extremum_subscriptions_test.dart +40 -0
- package/dart_types/test/foreign_ref_resolution_test.dart +75 -0
- package/dart_types/test/nomos_ref_address_test.dart +25 -0
- package/dart_types/test/ordered_subscriptions_test.dart +34 -0
- package/operation_contract_check.mjs +24 -0
- package/package.json +11 -6
- package/src/aggregate.ts +70 -10
- package/src/application_topology.ts +18 -11
- package/src/attested.ts +3 -0
- package/src/attested_core.ts +46 -3
- package/src/birth_meter_ensure.ts +19 -7
- package/src/births.ts +29 -4
- package/src/build_package.ts +140 -13
- package/src/business_birth.ts +181 -4
- package/src/codegen_call_proto.ts +1274 -0
- package/src/codegen_call_usda.ts +49 -6
- package/src/codegen_dart.ts +79 -44
- package/src/codegen_dart_client.ts +458 -800
- package/src/{codegen_dart_application.ts → codegen_dart_facade.ts} +331 -582
- package/src/codegen_dart_framework_calls.ts +320 -37
- package/src/codegen_dart_indexed_variant.ts +159 -0
- package/src/codegen_dart_scenario.ts +42 -13
- package/src/codegen_proof.ts +3 -3
- package/src/codegen_provider_dart.ts +5 -0
- package/src/codegen_query_proto.ts +158 -0
- package/src/codegen_refusal.ts +189 -0
- package/src/codegen_result_proto.ts +931 -0
- package/src/codegen_result_usda.ts +4 -0
- package/src/codegen_ts.ts +464 -616
- package/src/codegen_workspace_access.ts +105 -0
- package/src/compatibility_graph.ts +759 -0
- package/src/compatibility_usda.ts +264 -0
- package/src/compile_package_main.ts +1994 -1189
- package/src/custody_placement.ts +156 -0
- package/src/custody_placement_usda.ts +91 -0
- package/src/decl_shapes.ts +21 -2
- package/src/describe_model.ts +1 -0
- package/src/directive.ts +59 -2
- package/src/drivers.ts +51 -0
- package/src/engine_entry.ts +52 -8
- package/src/evolve_preview.ts +11 -4
- package/src/exists.ts +2 -0
- package/src/fields.ts +75 -11
- package/src/flow_gate.ts +2 -1
- package/src/framework/application_home.ts +170 -18
- package/src/framework/attested_receipts.ts +8 -3
- package/src/framework/auth_provider_law.ts +169 -9
- package/src/framework/birth_certificate_law.ts +4 -0
- package/src/framework/capability.ts +34 -3
- package/src/framework/child_authentication.ts +346 -0
- package/src/framework/console_governance.ts +295 -0
- package/src/framework/delegated_roles.ts +301 -0
- package/src/framework/domain_lifecycle.ts +26 -13
- package/src/framework/founding_genesis.ts +193 -0
- package/src/framework/framework_aggregates.ts +1 -1
- package/src/framework/genesis.ts +6 -1
- package/src/framework/governance_relations.ts +19 -0
- package/src/framework/home.ts +5 -734
- package/src/framework/legacy/child_auth_provider_epoch.ts +73 -0
- package/src/framework/model_authority_repair.ts +116 -0
- package/src/framework/model_authority_seed.ts +185 -0
- package/src/framework/model_transition.ts +211 -0
- package/src/framework/owned_custody.ts +1 -1
- package/src/framework/principal_enrollment.ts +302 -0
- package/src/framework/receiving_group.ts +857 -0
- package/src/framework/receiving_group_recovery.ts +314 -0
- package/src/framework/relations.ts +4 -8
- package/src/framework/signing_identity.ts +242 -95
- package/src/framework/source_roster.ts +11 -5
- package/src/framework/workspace_access.ts +149 -0
- package/src/framework/workspace_invariant.ts +73 -52
- package/src/framework/workspaces.ts +407 -40
- package/src/framework_call_definitions.ts +32 -3
- package/src/generated_client_bundle_boundary.ts +97 -0
- package/src/generated_client_names.ts +1 -0
- package/src/identity_usda.ts +27 -0
- package/src/index.ts +183 -12
- package/src/indexed_variant.ts +83 -0
- package/src/intent.ts +173 -45
- package/src/law_check.ts +8 -5
- package/src/law_dependency_index.ts +231 -0
- package/src/law_graph.ts +508 -71
- package/src/law_graph_usda.ts +170 -24
- package/src/law_identity.ts +119 -81
- package/src/law_source_map.ts +4 -1
- package/src/law_units.ts +498 -0
- package/src/law_value_type.ts +7 -3
- package/src/member_authentication.ts +302 -0
- package/src/null_meta.ts +1 -1
- package/src/openusd_compiled_layer.ts +132 -0
- package/src/operation_contract_check.ts +31 -0
- package/src/ordered_read.ts +2 -1
- package/src/package_config.ts +33 -12
- package/src/package_dependencies.ts +1 -0
- package/src/plan_source_slice.ts +30 -1
- package/src/protobuf_field_number.ts +36 -0
- package/src/provenance_wire.ts +6 -0
- package/src/query.ts +2 -1
- package/src/read.ts +50 -0
- package/src/relation.ts +4 -1
- package/src/relation_schema.ts +15 -2
- package/src/report.ts +2 -2
- package/src/sqlite_computation_bundle.ts +78 -0
- package/src/sqlite_computed.ts +102 -0
- package/src/sqlite_counts.ts +154 -0
- package/src/sqlite_layout.ts +823 -0
- package/src/sqlite_reads.ts +275 -0
- package/src/sqlite_samples.ts +185 -0
- package/src/stable_id_identity_bridge.ts +1 -1
- package/src/stable_ids_for_module.ts +16 -4
- package/src/test_call_usda.ts +6 -6
- package/src/usda_relationship_integrity.ts +20 -3
- package/src/usda_text.ts +21 -1
- package/src/value_object.ts +81 -11
- package/src/wire.ts +22 -0
- package/src/wire_encode.ts +227 -20
- package/src/workspace_sharding.ts +15 -6
- package/src/workspace_sharing.ts +51 -49
- package/src/zod_introspection.ts +2 -0
- package/compat_package.mjs +0 -46
- package/dart/lib/src/home.dart +0 -15
- package/dart/lib/src/runner/offline-install.mjs +0 -15367
- package/dart/lib/src/source_trust.dart +0 -51
- package/dart/lib/src/webview_bridge.dart +0 -6540
- package/dart/lib/src/workspace_name.dart +0 -30
- package/dart/test/acquire_session_credentials_test.dart +0 -150
- package/dart/test/acquire_session_test.dart +0 -534
- package/dart/test/adv_realm_interference_test.dart +0 -600
- package/dart/test/cloud_bound_topology_test.dart +0 -168
- package/dart/test/cluster_births_test.dart +0 -202
- package/dart/test/cluster_device_keyed_acceptance_test.dart +0 -105
- package/dart/test/cluster_local_autosync_test.dart +0 -123
- package/dart/test/cluster_scale_test.dart +0 -122
- package/dart/test/compat_test.dart +0 -61
- package/dart/test/dlq_session_surface_test.dart +0 -222
- package/dart/test/first_app_gauntlet_test.dart +0 -386
- package/dart/test/fixtures/wedge/fake-install.mjs +0 -11
- package/dart/test/four_layer_nested_topology_test.dart +0 -290
- package/dart/test/home_parity_test.dart +0 -13
- package/dart/test/local_sync_inert_test.dart +0 -107
- package/dart/test/node_runner_transport_test.dart +0 -78
- package/dart/test/parent_signer_recovery_test.dart +0 -155
- package/dart/test/residency_refusal_test.dart +0 -49
- package/dart/test/sealing_client_test.dart +0 -181
- package/dart/test/session_bound_test.dart +0 -285
- package/dart/test/stale_bundle_test.dart +0 -80
- package/dart/test/vo_read_typing_test.dart +0 -131
- package/dart/test/watch_after_offer_stall_test.dart +0 -100
- package/dart/test/webview_bridge_test.dart +0 -1930
- package/dart/test/workspace_name_test.dart +0 -24
- package/runtime/generated-application-host.js +0 -22860
- package/src/codegen_query_usda.ts +0 -214
- package/src/compat_manifest.ts +0 -26
- package/src/compat_package_main.ts +0 -224
- package/src/shape_compat.ts +0 -352
- package/src/usd_state.ts +0 -505
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
import 'dart:async';
|
|
2
|
+
import 'dart:convert';
|
|
3
|
+
import 'dart:typed_data';
|
|
4
|
+
|
|
5
|
+
import 'package:nomos_types/nomos_kernel_protocol.dart' as nomos_protocol;
|
|
6
|
+
|
|
7
|
+
import '../sync_status_projection.dart' show TransferProgress;
|
|
8
|
+
|
|
9
|
+
/// One typed, authority-free observation of peer work.
|
|
10
|
+
enum NomosSpanPhase { begin, end }
|
|
11
|
+
|
|
12
|
+
final class NomosSpanEvent {
|
|
13
|
+
const NomosSpanEvent({
|
|
14
|
+
required this.phase,
|
|
15
|
+
required this.id,
|
|
16
|
+
required this.name,
|
|
17
|
+
this.traceId,
|
|
18
|
+
this.session,
|
|
19
|
+
this.workspace,
|
|
20
|
+
this.track,
|
|
21
|
+
this.kind,
|
|
22
|
+
this.startedAtMillis,
|
|
23
|
+
this.endedAtMillis,
|
|
24
|
+
this.head,
|
|
25
|
+
this.attempt,
|
|
26
|
+
this.elapsedMillis,
|
|
27
|
+
this.retryAfterMillis,
|
|
28
|
+
this.attributes = const [],
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
factory NomosSpanEvent.fromRuntime(
|
|
32
|
+
nomos_protocol.RuntimeSpan span, {
|
|
33
|
+
String? session,
|
|
34
|
+
}) {
|
|
35
|
+
Object? attribute(String name) {
|
|
36
|
+
for (final value in span.attributes) {
|
|
37
|
+
if (value.name != name) continue;
|
|
38
|
+
return switch (value.whichValue()) {
|
|
39
|
+
nomos_protocol.DiagnosticAttribute_Value.stringValue =>
|
|
40
|
+
value.stringValue,
|
|
41
|
+
nomos_protocol.DiagnosticAttribute_Value.integerValue =>
|
|
42
|
+
value.integerValue.toInt(),
|
|
43
|
+
nomos_protocol.DiagnosticAttribute_Value.doubleValue =>
|
|
44
|
+
value.doubleValue,
|
|
45
|
+
nomos_protocol.DiagnosticAttribute_Value.booleanValue =>
|
|
46
|
+
value.booleanValue,
|
|
47
|
+
nomos_protocol.DiagnosticAttribute_Value.bytesValue =>
|
|
48
|
+
Uint8List.fromList(value.bytesValue),
|
|
49
|
+
nomos_protocol.DiagnosticAttribute_Value.notSet => null,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
String? text(String name) {
|
|
56
|
+
final value = attribute(name);
|
|
57
|
+
return value == null ? null : value.toString();
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
int? integer(String name) {
|
|
61
|
+
final value = attribute(name);
|
|
62
|
+
return value is num
|
|
63
|
+
? value.toInt()
|
|
64
|
+
: int.tryParse(value?.toString() ?? '');
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
final started = span.startedUnixNanos.toInt() ~/ 1000000;
|
|
68
|
+
final duration = span.durationNanos.toInt() ~/ 1000000;
|
|
69
|
+
return NomosSpanEvent(
|
|
70
|
+
phase: NomosSpanPhase.end,
|
|
71
|
+
id: text('id') ?? base64Url.encode(span.spanId).replaceAll('=', ''),
|
|
72
|
+
name: span.name,
|
|
73
|
+
traceId: span.traceId
|
|
74
|
+
.map((byte) => byte.toRadixString(16).padLeft(2, '0'))
|
|
75
|
+
.join(),
|
|
76
|
+
session: session,
|
|
77
|
+
workspace: text('workspace') ?? session,
|
|
78
|
+
track: text('track'),
|
|
79
|
+
kind: text('kind'),
|
|
80
|
+
startedAtMillis: started,
|
|
81
|
+
endedAtMillis: started + duration,
|
|
82
|
+
head: text('head'),
|
|
83
|
+
attempt: integer('attempt'),
|
|
84
|
+
elapsedMillis: integer('elapsedMs'),
|
|
85
|
+
retryAfterMillis: integer('retryAfterMs'),
|
|
86
|
+
attributes: List.unmodifiable(span.attributes),
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
final NomosSpanPhase phase;
|
|
91
|
+
final String id;
|
|
92
|
+
final String name;
|
|
93
|
+
|
|
94
|
+
/// The peer's causal trace identity. It is metadata, never a custody identity.
|
|
95
|
+
final String? traceId;
|
|
96
|
+
final String? session;
|
|
97
|
+
final String? workspace;
|
|
98
|
+
final String? track;
|
|
99
|
+
final String? kind;
|
|
100
|
+
final int? startedAtMillis;
|
|
101
|
+
final int? endedAtMillis;
|
|
102
|
+
final String? head;
|
|
103
|
+
final int? attempt;
|
|
104
|
+
final int? elapsedMillis;
|
|
105
|
+
final int? retryAfterMillis;
|
|
106
|
+
final List<nomos_protocol.DiagnosticAttribute> attributes;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
enum KernelProgressOperation { unspecified, restoreMain }
|
|
110
|
+
|
|
111
|
+
enum KernelProgressPhase {
|
|
112
|
+
unspecified,
|
|
113
|
+
checkCustody,
|
|
114
|
+
readChain,
|
|
115
|
+
initializeEngine,
|
|
116
|
+
readTimeline,
|
|
117
|
+
hydrateLaw,
|
|
118
|
+
recoveryPrescan,
|
|
119
|
+
verifyIntents,
|
|
120
|
+
promoteCustody,
|
|
121
|
+
rebuildFrontier,
|
|
122
|
+
complete,
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
enum KernelProgressUnit { unspecified, intent, lawPackage }
|
|
126
|
+
|
|
127
|
+
enum KernelLawHydrationStep {
|
|
128
|
+
unspecified,
|
|
129
|
+
readClosure,
|
|
130
|
+
composeStage,
|
|
131
|
+
deriveSchemas,
|
|
132
|
+
loadPolicyShell,
|
|
133
|
+
packageComplete,
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/// Typed, authority-free progress from a long-running kernel operation.
|
|
137
|
+
final class KernelProgress {
|
|
138
|
+
const KernelProgress({
|
|
139
|
+
required this.sequence,
|
|
140
|
+
required this.operation,
|
|
141
|
+
required this.phase,
|
|
142
|
+
required this.completed,
|
|
143
|
+
required this.total,
|
|
144
|
+
required this.unit,
|
|
145
|
+
required this.terminal,
|
|
146
|
+
required this.lawHydrationStep,
|
|
147
|
+
required this.lawPackageSha256,
|
|
148
|
+
required this.hostObservedElapsedMicros,
|
|
149
|
+
required this.hostObservedPhaseElapsedMicros,
|
|
150
|
+
required this.kernelAllocatorLiveBytes,
|
|
151
|
+
required this.kernelAllocatorPeakBytes,
|
|
152
|
+
required this.processResidentBytes,
|
|
153
|
+
required this.processPeakResidentBytes,
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
final int sequence;
|
|
157
|
+
final KernelProgressOperation operation;
|
|
158
|
+
final KernelProgressPhase phase;
|
|
159
|
+
final int completed;
|
|
160
|
+
final int total;
|
|
161
|
+
final KernelProgressUnit unit;
|
|
162
|
+
final bool terminal;
|
|
163
|
+
final KernelLawHydrationStep lawHydrationStep;
|
|
164
|
+
final String lawPackageSha256;
|
|
165
|
+
final int hostObservedElapsedMicros;
|
|
166
|
+
final int hostObservedPhaseElapsedMicros;
|
|
167
|
+
final int kernelAllocatorLiveBytes;
|
|
168
|
+
final int kernelAllocatorPeakBytes;
|
|
169
|
+
final int processResidentBytes;
|
|
170
|
+
final int processPeakResidentBytes;
|
|
171
|
+
|
|
172
|
+
int get unaccountedResidentBytes {
|
|
173
|
+
final remainder = processResidentBytes - kernelAllocatorLiveBytes;
|
|
174
|
+
return remainder > 0 ? remainder : 0;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
double? get fraction =>
|
|
178
|
+
(total <= 0) ? null : (completed / total).clamp(0.0, 1.0);
|
|
179
|
+
|
|
180
|
+
factory KernelProgress.fromRuntime(
|
|
181
|
+
nomos_protocol.KernelProgressObserved observed,
|
|
182
|
+
) {
|
|
183
|
+
final snapshot = observed.snapshot;
|
|
184
|
+
return KernelProgress(
|
|
185
|
+
sequence: snapshot.sequence.toInt(),
|
|
186
|
+
operation: snapshot.operation.value == 1
|
|
187
|
+
? KernelProgressOperation.restoreMain
|
|
188
|
+
: KernelProgressOperation.unspecified,
|
|
189
|
+
phase: switch (snapshot.phase.value) {
|
|
190
|
+
1 => KernelProgressPhase.checkCustody,
|
|
191
|
+
2 => KernelProgressPhase.readChain,
|
|
192
|
+
3 => KernelProgressPhase.initializeEngine,
|
|
193
|
+
4 => KernelProgressPhase.readTimeline,
|
|
194
|
+
5 => KernelProgressPhase.hydrateLaw,
|
|
195
|
+
6 => KernelProgressPhase.recoveryPrescan,
|
|
196
|
+
7 => KernelProgressPhase.verifyIntents,
|
|
197
|
+
8 => KernelProgressPhase.promoteCustody,
|
|
198
|
+
9 => KernelProgressPhase.rebuildFrontier,
|
|
199
|
+
10 => KernelProgressPhase.complete,
|
|
200
|
+
_ => KernelProgressPhase.unspecified,
|
|
201
|
+
},
|
|
202
|
+
completed: snapshot.completedUnits.toInt(),
|
|
203
|
+
total: snapshot.totalUnits.toInt(),
|
|
204
|
+
unit: switch (snapshot.unit.value) {
|
|
205
|
+
1 => KernelProgressUnit.intent,
|
|
206
|
+
2 => KernelProgressUnit.lawPackage,
|
|
207
|
+
_ => KernelProgressUnit.unspecified,
|
|
208
|
+
},
|
|
209
|
+
terminal: snapshot.terminal,
|
|
210
|
+
lawHydrationStep: switch (snapshot.lawHydrationStep.value) {
|
|
211
|
+
1 => KernelLawHydrationStep.readClosure,
|
|
212
|
+
2 => KernelLawHydrationStep.composeStage,
|
|
213
|
+
3 => KernelLawHydrationStep.deriveSchemas,
|
|
214
|
+
4 => KernelLawHydrationStep.loadPolicyShell,
|
|
215
|
+
5 => KernelLawHydrationStep.packageComplete,
|
|
216
|
+
_ => KernelLawHydrationStep.unspecified,
|
|
217
|
+
},
|
|
218
|
+
lawPackageSha256: snapshot.lawPackageSha256,
|
|
219
|
+
hostObservedElapsedMicros: observed.hostObservedElapsedMicros.toInt(),
|
|
220
|
+
hostObservedPhaseElapsedMicros:
|
|
221
|
+
observed.hostObservedPhaseElapsedMicros.toInt(),
|
|
222
|
+
kernelAllocatorLiveBytes: snapshot.allocatorLiveBytes.toInt(),
|
|
223
|
+
kernelAllocatorPeakBytes: snapshot.allocatorPeakBytes.toInt(),
|
|
224
|
+
processResidentBytes: observed.processResidentBytes.toInt(),
|
|
225
|
+
processPeakResidentBytes: observed.processPeakResidentBytes.toInt(),
|
|
226
|
+
);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/// Reception's observability desk. It owns only ephemeral subscriptions and a
|
|
231
|
+
/// bounded recent-span cache; no custody, authority, or application state.
|
|
232
|
+
final class ReceptionProgressDesk {
|
|
233
|
+
final StreamController<NomosSpanEvent> _spans =
|
|
234
|
+
StreamController<NomosSpanEvent>.broadcast();
|
|
235
|
+
final StreamController<TransferProgress> _transfers =
|
|
236
|
+
StreamController<TransferProgress>.broadcast();
|
|
237
|
+
final StreamController<KernelProgress> _kernel =
|
|
238
|
+
StreamController<KernelProgress>.broadcast();
|
|
239
|
+
final List<NomosSpanEvent> _recentSpans = [];
|
|
240
|
+
|
|
241
|
+
Stream<NomosSpanEvent> get spans => _spans.stream;
|
|
242
|
+
Stream<TransferProgress> get transfers => _transfers.stream;
|
|
243
|
+
Stream<KernelProgress> get kernel => _kernel.stream;
|
|
244
|
+
List<NomosSpanEvent> get recentSpans => List.unmodifiable(_recentSpans);
|
|
245
|
+
|
|
246
|
+
void observeSpan(NomosSpanEvent event) {
|
|
247
|
+
_recentSpans.add(event);
|
|
248
|
+
if (_recentSpans.length > 400) {
|
|
249
|
+
_recentSpans.removeRange(0, _recentSpans.length - 400);
|
|
250
|
+
}
|
|
251
|
+
if (!_spans.isClosed) _spans.add(event);
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
void observeTransfer(TransferProgress event) {
|
|
255
|
+
if (!_transfers.isClosed) _transfers.add(event);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
void observeKernel(KernelProgress event) {
|
|
259
|
+
if (!_kernel.isClosed) _kernel.add(event);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
Future<void> close() async {
|
|
263
|
+
if (!_spans.isClosed) await _spans.close();
|
|
264
|
+
if (!_transfers.isClosed) await _transfers.close();
|
|
265
|
+
if (!_kernel.isClosed) await _kernel.close();
|
|
266
|
+
}
|
|
267
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import '../application_framework_calls.dart' show NmsApplicationFrameworkCalls;
|
|
2
|
+
import 'reception_session.dart' show NmsReceptionSession;
|
|
3
|
+
|
|
4
|
+
/// The static, compiler-generated vocabulary Reception needs to expose one
|
|
5
|
+
/// tenant application. It owns no kernel, custody, credentials, timers, sync,
|
|
6
|
+
/// placement, or mutable application state.
|
|
7
|
+
abstract interface class NmsReceptionContract<TApplication> {
|
|
8
|
+
NmsApplicationFrameworkCalls get frameworkCalls;
|
|
9
|
+
|
|
10
|
+
Future<TApplication> receive(NmsReceptionSession session);
|
|
11
|
+
}
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
import '../application_framework_calls.dart' show NmsApplicationFrameworkCalls;
|
|
2
|
+
import '../application_status.dart'
|
|
3
|
+
show ApplicationStatus, ApplicationStatusPhase;
|
|
4
|
+
import '../nms_generated_runtime.dart'
|
|
5
|
+
show
|
|
6
|
+
Invitation,
|
|
7
|
+
NmsInternalInvitations,
|
|
8
|
+
DartReception,
|
|
9
|
+
NomosOperationReceipt,
|
|
10
|
+
NomosSession,
|
|
11
|
+
Recipient,
|
|
12
|
+
SyncPhase,
|
|
13
|
+
SyncStatus;
|
|
14
|
+
import '../peer_application_streams.dart'
|
|
15
|
+
show NmsPeerApplicationStreams, NmsPeerApplicationStreamView;
|
|
16
|
+
import '../workspace_open_progress.dart' show ApplicationWorkspaceOpenProgress;
|
|
17
|
+
|
|
18
|
+
/// Identity already established by Peer Office for a Reception session.
|
|
19
|
+
final class NmsReceptionUser {
|
|
20
|
+
const NmsReceptionUser({
|
|
21
|
+
required this.actor,
|
|
22
|
+
required this.identityId,
|
|
23
|
+
required this.identityAddress,
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
final String actor;
|
|
27
|
+
final String identityId;
|
|
28
|
+
final String identityAddress;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/// One generated invitation route. Generated code supplies only typed law
|
|
32
|
+
/// identities and queries; Peer Office owns the ceremony.
|
|
33
|
+
final class NmsReceptionInvitationPolicy {
|
|
34
|
+
const NmsReceptionInvitationPolicy({
|
|
35
|
+
required this.domain,
|
|
36
|
+
required this.domainHash,
|
|
37
|
+
required this.redeem,
|
|
38
|
+
required this.pending,
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
final String domain;
|
|
42
|
+
final String domainHash;
|
|
43
|
+
final String redeem;
|
|
44
|
+
final Future<List<NmsReceptionInvitationMatch>> Function(String address)
|
|
45
|
+
pending;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
final class NmsReceptionInvitationMatch {
|
|
49
|
+
const NmsReceptionInvitationMatch({
|
|
50
|
+
required this.orderId,
|
|
51
|
+
required this.object,
|
|
52
|
+
required this.relation,
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
final String orderId;
|
|
56
|
+
final String object;
|
|
57
|
+
final String relation;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/// The complete Reception session generated Dart facades may receive.
|
|
61
|
+
/// It contains no cloud URL, credential store, custody store, kernel,
|
|
62
|
+
/// placement policy, sync scheduler, recovery policy, or law lifecycle.
|
|
63
|
+
abstract interface class NmsReceptionSession {
|
|
64
|
+
NomosSession get desk;
|
|
65
|
+
NmsReceptionUser get user;
|
|
66
|
+
NmsPeerApplicationStreams get streams;
|
|
67
|
+
|
|
68
|
+
ApplicationStatus get currentStatus;
|
|
69
|
+
Future<void> whenCurrent({required Duration timeout});
|
|
70
|
+
|
|
71
|
+
ApplicationStatus get applicationStatus;
|
|
72
|
+
Future<void> whenApplicationCurrent({required Duration timeout});
|
|
73
|
+
|
|
74
|
+
NomosOperationReceipt? get creationReceipt;
|
|
75
|
+
|
|
76
|
+
Recipient<TSubject> recipient<TSubject>(String uid);
|
|
77
|
+
Future<Invitation<TSubject>> createInvitation<TSubject>();
|
|
78
|
+
Future<void> redeemInvitation<TSubject>({
|
|
79
|
+
required String link,
|
|
80
|
+
required List<NmsReceptionInvitationPolicy> policies,
|
|
81
|
+
required NmsApplicationFrameworkCalls frameworkCalls,
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
/// The workspace a keyed birth addresses, as THE OFFICE names it. Generated
|
|
85
|
+
/// facades ask; they never hash `(namespace, key)` themselves — that function
|
|
86
|
+
/// is law, and a client-local copy of it drifts silently.
|
|
87
|
+
Future<String> keyedBirthWorkspace({
|
|
88
|
+
required String namespace,
|
|
89
|
+
required String key,
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
Future<List<String>> activeChildWorkspaces({required String namespace});
|
|
93
|
+
|
|
94
|
+
/// Fetch [workspace] onto this device now, reading and opening nothing: the
|
|
95
|
+
/// office names its placement and that placement's Replica Follow mounts the
|
|
96
|
+
/// provider's head in the background. Completes once the follow exists.
|
|
97
|
+
Future<void> fetchWorkspace(String workspace);
|
|
98
|
+
|
|
99
|
+
Future<NmsReceptionSession> follow(String workspace);
|
|
100
|
+
Future<void> close();
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
typedef NmsCreateInvitation = Future<Invitation<T>> Function<T>(
|
|
104
|
+
NomosSession session,
|
|
105
|
+
);
|
|
106
|
+
typedef NmsRedeemInvitation = Future<void> Function<T>(
|
|
107
|
+
NomosSession session, {
|
|
108
|
+
required NmsReceptionUser user,
|
|
109
|
+
required String link,
|
|
110
|
+
required List<NmsReceptionInvitationPolicy> policies,
|
|
111
|
+
required NmsApplicationFrameworkCalls frameworkCalls,
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
/// A thin view over a Peer Office session. It owns no lifecycle state: status,
|
|
115
|
+
/// lineage and child handles are read from the supplied session, while optional
|
|
116
|
+
/// ceremonies are injected as desk capabilities by the platform composition
|
|
117
|
+
/// root.
|
|
118
|
+
final class NmsReceptionSessionView implements NmsReceptionSession {
|
|
119
|
+
NmsReceptionSessionView({
|
|
120
|
+
required NomosSession desk,
|
|
121
|
+
required this.user,
|
|
122
|
+
this.createInvitationCapability,
|
|
123
|
+
this.redeemInvitationCapability,
|
|
124
|
+
this.watchOpenProgressCapability,
|
|
125
|
+
this.closeCapability,
|
|
126
|
+
}) : desk = desk,
|
|
127
|
+
streams = NmsPeerApplicationStreamView(
|
|
128
|
+
session: desk,
|
|
129
|
+
statusProjection: _applicationStatus,
|
|
130
|
+
workspaceOpenProgressSource: watchOpenProgressCapability,
|
|
131
|
+
);
|
|
132
|
+
|
|
133
|
+
@override
|
|
134
|
+
final NomosSession desk;
|
|
135
|
+
@override
|
|
136
|
+
final NmsReceptionUser user;
|
|
137
|
+
@override
|
|
138
|
+
final NmsPeerApplicationStreams streams;
|
|
139
|
+
final NmsCreateInvitation? createInvitationCapability;
|
|
140
|
+
final NmsRedeemInvitation? redeemInvitationCapability;
|
|
141
|
+
final Stream<ApplicationWorkspaceOpenProgress> Function(String workspace)?
|
|
142
|
+
watchOpenProgressCapability;
|
|
143
|
+
final Future<void> Function()? closeCapability;
|
|
144
|
+
|
|
145
|
+
@override
|
|
146
|
+
ApplicationStatus get currentStatus => _applicationStatus(desk.currentStatus);
|
|
147
|
+
|
|
148
|
+
@override
|
|
149
|
+
Future<void> whenCurrent({required Duration timeout}) =>
|
|
150
|
+
_whenCurrent(desk, timeout);
|
|
151
|
+
|
|
152
|
+
@override
|
|
153
|
+
ApplicationStatus get applicationStatus =>
|
|
154
|
+
_applicationStatus(desk.parent.currentStatus);
|
|
155
|
+
|
|
156
|
+
@override
|
|
157
|
+
Future<void> whenApplicationCurrent({required Duration timeout}) =>
|
|
158
|
+
_whenCurrent(desk.parent, timeout);
|
|
159
|
+
|
|
160
|
+
@override
|
|
161
|
+
NomosOperationReceipt? get creationReceipt =>
|
|
162
|
+
desk.nomosInternalWorkspaceCreationReceipt();
|
|
163
|
+
|
|
164
|
+
@override
|
|
165
|
+
Recipient<TSubject> recipient<TSubject>(String uid) {
|
|
166
|
+
final value = uid.trim();
|
|
167
|
+
if (value.isEmpty) {
|
|
168
|
+
throw ArgumentError.value(uid, 'uid', 'must not be empty');
|
|
169
|
+
}
|
|
170
|
+
return NmsInternalInvitations.recipient<TSubject>('user:$value');
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
@override
|
|
174
|
+
Future<Invitation<TSubject>> createInvitation<TSubject>() {
|
|
175
|
+
final capability = createInvitationCapability;
|
|
176
|
+
if (capability == null) {
|
|
177
|
+
throw UnsupportedError('This Reception session has no invitation desk');
|
|
178
|
+
}
|
|
179
|
+
return capability<TSubject>(desk);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
@override
|
|
183
|
+
Future<void> redeemInvitation<TSubject>({
|
|
184
|
+
required String link,
|
|
185
|
+
required List<NmsReceptionInvitationPolicy> policies,
|
|
186
|
+
required NmsApplicationFrameworkCalls frameworkCalls,
|
|
187
|
+
}) {
|
|
188
|
+
final capability = redeemInvitationCapability;
|
|
189
|
+
if (capability == null) {
|
|
190
|
+
throw UnsupportedError('This Reception session has no invitation desk');
|
|
191
|
+
}
|
|
192
|
+
return capability<TSubject>(
|
|
193
|
+
desk,
|
|
194
|
+
user: user,
|
|
195
|
+
link: link,
|
|
196
|
+
policies: policies,
|
|
197
|
+
frameworkCalls: frameworkCalls,
|
|
198
|
+
);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
@override
|
|
202
|
+
Future<String> keyedBirthWorkspace({
|
|
203
|
+
required String namespace,
|
|
204
|
+
required String key,
|
|
205
|
+
}) =>
|
|
206
|
+
desk.nmsKeyedBirthWorkspace(namespace: namespace, key: key);
|
|
207
|
+
|
|
208
|
+
@override
|
|
209
|
+
Future<void> fetchWorkspace(String workspace) =>
|
|
210
|
+
desk.nmsFetchWorkspace(workspace);
|
|
211
|
+
|
|
212
|
+
@override
|
|
213
|
+
Future<List<String>> activeChildWorkspaces(
|
|
214
|
+
{required String namespace}) async {
|
|
215
|
+
// The namespace rides the paper: the office owns the namespace-to-workspace-name
|
|
216
|
+
// relation and selects the active children itself. Reading a `<namespace>-`
|
|
217
|
+
// prefix here would be a second, client-local copy of that law fact.
|
|
218
|
+
final children =
|
|
219
|
+
await desk.nomosFrameworkChildWorkspaces(namespace: namespace);
|
|
220
|
+
return children.map((child) => child.workspace).toList(growable: false);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
@override
|
|
224
|
+
Future<NmsReceptionSession> follow(String workspace) async {
|
|
225
|
+
final child = await desk.bindWorkspace(workspace);
|
|
226
|
+
return NmsReceptionSessionView(
|
|
227
|
+
desk: child,
|
|
228
|
+
user: user,
|
|
229
|
+
createInvitationCapability: createInvitationCapability,
|
|
230
|
+
redeemInvitationCapability: redeemInvitationCapability,
|
|
231
|
+
watchOpenProgressCapability: watchOpenProgressCapability,
|
|
232
|
+
closeCapability: closeCapability,
|
|
233
|
+
);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
@override
|
|
237
|
+
Future<void> close() => closeCapability?.call() ?? Future<void>.value();
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
ApplicationStatus _applicationStatus(SyncStatus status) => ApplicationStatus(
|
|
241
|
+
phase: switch (status.presentationPhase) {
|
|
242
|
+
SyncPhase.checking => ApplicationStatusPhase.checking,
|
|
243
|
+
SyncPhase.idle => ApplicationStatusPhase.current,
|
|
244
|
+
SyncPhase.syncing => ApplicationStatusPhase.saving,
|
|
245
|
+
SyncPhase.awaitingRemoteDurability =>
|
|
246
|
+
ApplicationStatusPhase.awaitingRemoteDurability,
|
|
247
|
+
SyncPhase.transferring => ApplicationStatusPhase.receiving,
|
|
248
|
+
SyncPhase.behind => ApplicationStatusPhase.catchingUp,
|
|
249
|
+
SyncPhase.offline => ApplicationStatusPhase.offline,
|
|
250
|
+
SyncPhase.error => ApplicationStatusPhase.attention,
|
|
251
|
+
},
|
|
252
|
+
localChanges: status.ahead,
|
|
253
|
+
availableChanges: status.behind,
|
|
254
|
+
savedChanges: status.saved,
|
|
255
|
+
acceptedChanges: status.onMain,
|
|
256
|
+
decisionsNeeded: status.deadLetters,
|
|
257
|
+
receivedBytes: status.transfer?.received,
|
|
258
|
+
totalBytes: status.transfer?.total,
|
|
259
|
+
lastUpdatedAt: status.lastSyncedAt,
|
|
260
|
+
message: status.lastError,
|
|
261
|
+
live: status.live,
|
|
262
|
+
followedWorkspaces: status.followed,
|
|
263
|
+
workspacesInSync: status.followsInSync,
|
|
264
|
+
workspacesLive: status.followsLive,
|
|
265
|
+
workspaceFollows: status.followStatuses,
|
|
266
|
+
followReportAt: status.followReportAt,
|
|
267
|
+
preparingWorkspaces: status.preparingWorkspaces,
|
|
268
|
+
retryingWorkspaces: status.retryingWorkspaces,
|
|
269
|
+
preparationActivity: status.preparationActivity,
|
|
270
|
+
);
|
|
271
|
+
|
|
272
|
+
Future<void> _whenCurrent(DartReception application, Duration timeout) async {
|
|
273
|
+
final initial = _applicationStatus(application.currentStatus);
|
|
274
|
+
if (initial.isCurrent) return;
|
|
275
|
+
if (initial.phase == ApplicationStatusPhase.attention) {
|
|
276
|
+
throw StateError(initial.message ?? 'This workspace needs attention');
|
|
277
|
+
}
|
|
278
|
+
await application.syncStatus.map(_applicationStatus).firstWhere((status) {
|
|
279
|
+
if (status.phase == ApplicationStatusPhase.attention) {
|
|
280
|
+
throw StateError(status.message ?? 'This workspace needs attention');
|
|
281
|
+
}
|
|
282
|
+
return status.isCurrent;
|
|
283
|
+
}).timeout(timeout);
|
|
284
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import '../sync_status_projection.dart';
|
|
2
|
+
|
|
3
|
+
/// A view of an existing session, not an inventory of all local Git custody.
|
|
4
|
+
final class WorkspaceSyncObservation {
|
|
5
|
+
const WorkspaceSyncObservation({
|
|
6
|
+
required this.session,
|
|
7
|
+
required this.workspace,
|
|
8
|
+
required this.status,
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
final String session;
|
|
12
|
+
final String workspace;
|
|
13
|
+
final SyncStatus status;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/// Fixed Reception capability. No generated facade, timer, workspace opening,
|
|
17
|
+
/// credentials, or independently maintained status map belongs here.
|
|
18
|
+
final class ReceptionSyncDiagnostics {
|
|
19
|
+
const ReceptionSyncDiagnostics({
|
|
20
|
+
required this.read,
|
|
21
|
+
required this.changes,
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
final List<WorkspaceSyncObservation> Function() read;
|
|
25
|
+
final Stream<void> changes;
|
|
26
|
+
}
|