@githolon/dsl 0.108.7 → 0.110.1
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 +80 -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 +214 -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 +268 -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 +23950 -15776
- 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 +550 -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_event_desk_close_test.dart +16 -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 +1276 -0
- package/src/codegen_call_usda.ts +49 -6
- package/src/codegen_dart.ts +83 -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 +2017 -1195
- 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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Generated protocol types shared by every Dart and Flutter Nomos host.
|
|
2
2
|
//
|
|
3
|
-
// The source of truth is
|
|
3
|
+
// The source of truth is the typed protocol graph under proto/nomos. This package owns the
|
|
4
4
|
// generated Dart projection so nomos_client and nomos_flutter cannot drift into
|
|
5
5
|
// handwritten copies of the kernel/runtime ABI.
|
|
6
6
|
library;
|
|
@@ -8,4 +8,24 @@ library;
|
|
|
8
8
|
export 'src/proto/nomos/kernel/v1/kernel.pb.dart';
|
|
9
9
|
export 'src/proto/nomos/kernel/v1/progress.pb.dart';
|
|
10
10
|
export 'src/proto/nomos/custody/v1/snapshot.pb.dart';
|
|
11
|
+
export 'src/proto/nomos/discovery/v1/workspace_placement.pb.dart';
|
|
12
|
+
export 'src/proto/nomos/runtime/v2/application_desk.pb.dart';
|
|
13
|
+
export 'src/proto/nomos/runtime/v2/application_readiness_desk.pb.dart';
|
|
14
|
+
export 'src/proto/nomos/runtime/v2/authentication_desk.pb.dart';
|
|
15
|
+
export 'src/proto/nomos/runtime/v2/custody_desk.pb.dart';
|
|
16
|
+
export 'src/proto/nomos/runtime/v2/interaction_desk.pb.dart';
|
|
17
|
+
export 'src/proto/nomos/runtime/v2/compatibility_desk.pb.dart';
|
|
18
|
+
export 'src/proto/nomos/runtime/v2/law_desk.pb.dart';
|
|
19
|
+
export 'src/proto/nomos/runtime/v2/maintenance_desk.pb.dart';
|
|
20
|
+
export 'src/proto/nomos/runtime/v2/model_adoption_desk.pb.dart';
|
|
21
|
+
export 'src/proto/nomos/runtime/v2/residency_desk.pb.dart';
|
|
22
|
+
export 'src/proto/nomos/runtime/v2/correspondence_desk.pb.dart';
|
|
23
|
+
export 'src/proto/nomos/runtime/v2/sealing_desk.pb.dart';
|
|
24
|
+
export 'src/proto/nomos/runtime/v2/credentials_desk.pb.dart';
|
|
25
|
+
export 'src/proto/nomos/runtime/v2/placement_desk.pb.dart';
|
|
26
|
+
export 'src/proto/nomos/runtime/v2/recovery_desk.pb.dart';
|
|
27
|
+
export 'src/proto/nomos/runtime/v2/records_desk.pb.dart';
|
|
28
|
+
export 'src/proto/nomos/runtime/v2/observability_desk.pb.dart';
|
|
29
|
+
export 'src/proto/nomos/runtime/v2/receiving_group_desk.pb.dart';
|
|
30
|
+
export 'src/proto/nomos/runtime/v2/framework.pb.dart';
|
|
11
31
|
export 'src/proto/nomos/runtime/v2/runtime.pb.dart';
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
/// - The ONE effectful write verb `offer(intent)` + the typed reactive read engine
|
|
15
15
|
/// `NomosReads`.
|
|
16
16
|
/// - The tri-state `NomosSlot<T>`, runtime aggregate metadata, schema validation, and
|
|
17
|
-
/// the data-only error/trace types (`
|
|
17
|
+
/// the data-only error/trace types (`NomosRuntimeError`, `NomosErrorInfo`,
|
|
18
18
|
/// `NomosTraceContext`) plus the typed diagnostics.
|
|
19
19
|
library;
|
|
20
20
|
|
|
@@ -27,6 +27,7 @@ export 'src/schema_validation.dart';
|
|
|
27
27
|
export 'src/aggregate_meta.dart';
|
|
28
28
|
export 'src/error_info.dart';
|
|
29
29
|
export 'src/errors.dart';
|
|
30
|
+
export 'src/runtime_outcome.dart';
|
|
30
31
|
// Foreign references expose identity data, while navigation readers and attestation stay behind the
|
|
31
32
|
// generated application runtime.
|
|
32
33
|
export 'src/foreign_ref.dart' show ForeignRef;
|
|
@@ -57,3 +58,10 @@ export 'src/local_work_rejected.dart';
|
|
|
57
58
|
// SURFACED MERGE CONFLICTS (architecture/surfaced_merge_conflict.md): the read-collapse types for a
|
|
58
59
|
// `.merge(Surfaced(...))` field — SurfacedValue<T> (resolved scalar | pending observations). Pure data.
|
|
59
60
|
export 'src/surfaced.dart';
|
|
61
|
+
|
|
62
|
+
// THE APPROVED LAW MODEL: NomosApprovedModel — the package identity, approval reason, domain keys and
|
|
63
|
+
// package loader a release declares. A required Reception argument, and pure data like the rest of this
|
|
64
|
+
// package: it opens no custody and starts no runtime.
|
|
65
|
+
export 'src/approved_model.dart';
|
|
66
|
+
|
|
67
|
+
export 'src/admission_decision.dart';
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import 'dart:typed_data';
|
|
2
|
+
import 'proto/nomos/kernel/v1/kernel.pbenum.dart' show KernelRefusalCode;
|
|
3
|
+
export 'proto/nomos/kernel/v1/kernel.pbenum.dart' show KernelRefusalCode;
|
|
4
|
+
|
|
5
|
+
/// Terminal admission decisions. Availability and delivery remain runtime observations.
|
|
6
|
+
sealed class AdmissionDecision<S, R> { const AdmissionDecision(); }
|
|
7
|
+
final class Admitted<S, R> extends AdmissionDecision<S, R> {
|
|
8
|
+
const Admitted(this.value);
|
|
9
|
+
final S value;
|
|
10
|
+
}
|
|
11
|
+
final class DomainRefused<S, R> extends AdmissionDecision<S, R> {
|
|
12
|
+
const DomainRefused(this.reason, this.evidence);
|
|
13
|
+
final R reason;
|
|
14
|
+
final NomosDomainRefusalEvidence evidence;
|
|
15
|
+
}
|
|
16
|
+
final class FrameworkRefused<S, R> extends AdmissionDecision<S, R> {
|
|
17
|
+
const FrameworkRefused(this.code, this.message);
|
|
18
|
+
final KernelRefusalCode code;
|
|
19
|
+
final String message;
|
|
20
|
+
}
|
|
21
|
+
final class UnsupportedRefusalContract<S, R> extends AdmissionDecision<S, R> {
|
|
22
|
+
const UnsupportedRefusalContract(this.evidence);
|
|
23
|
+
final NomosDomainRefusalEvidence evidence;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/// Ephemeral evidence attached by the deciding kernel. The law hash and type
|
|
27
|
+
/// address identify the complete schema closure. It is not a saved refusal.
|
|
28
|
+
final class NomosDomainRefusalEvidence {
|
|
29
|
+
NomosDomainRefusalEvidence({required List<int> lawSha256, required this.invariant,
|
|
30
|
+
required this.typeIdentity, required List<int> valueUsda})
|
|
31
|
+
: lawSha256 = Uint8List.fromList(lawSha256).asUnmodifiableView(),
|
|
32
|
+
valueUsda = Uint8List.fromList(valueUsda).asUnmodifiableView();
|
|
33
|
+
final Uint8List lawSha256;
|
|
34
|
+
final String invariant;
|
|
35
|
+
final String typeIdentity;
|
|
36
|
+
final Uint8List valueUsda;
|
|
37
|
+
}
|
|
@@ -71,7 +71,7 @@ class NomosAggregateMeta {
|
|
|
71
71
|
|
|
72
72
|
/// The AGGREGATE WIRE TYPE of a kernel aggregate id: minted ids are
|
|
73
73
|
/// `<domain>.<Type>_<uuidv7>`, so the type is the prefix before the trailing
|
|
74
|
-
/// `_<uuid>` (the same rule `@githolon/
|
|
74
|
+
/// `_<uuid>` (the same rule `@githolon/peer-office` applies to Create events).
|
|
75
75
|
/// Returns the input unchanged when no uuid suffix is present (already a type).
|
|
76
76
|
static String typeOfId(String aggregateId) =>
|
|
77
77
|
aggregateId.replaceFirst(RegExp(r'_[0-9a-fA-F-]+$'), '');
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/// THE LAW MODEL AN APPLICATION RELEASE APPROVES.
|
|
2
|
+
///
|
|
3
|
+
/// Pure validated data, and a REQUIRED argument to the Reception, so a tenant
|
|
4
|
+
/// cannot bind an application without naming this type. It lives here — beside
|
|
5
|
+
/// `CustodyBreakPolicy` — precisely because it belongs to no runtime: it opens no
|
|
6
|
+
/// custody, holds no session and starts nothing. The Peer Office model-adoption
|
|
7
|
+
/// desk consumes it; its phases and outcomes are the desk's observations and stay
|
|
8
|
+
/// behind the Reception.
|
|
9
|
+
library;
|
|
10
|
+
|
|
11
|
+
import 'dart:typed_data';
|
|
12
|
+
|
|
13
|
+
final RegExp _lowerHex64 = RegExp(r'^[0-9a-f]{64}$');
|
|
14
|
+
|
|
15
|
+
/// The law model an application release approves, supplied once at the
|
|
16
|
+
/// application's Reception. Every field is required: the office refuses to
|
|
17
|
+
/// adopt without the package identity, the domain keys it observes, the
|
|
18
|
+
/// attributed reason the kernel's transition demands, or the package bytes a
|
|
19
|
+
/// child must stage — none of them can be invented later.
|
|
20
|
+
final class NomosApprovedModel {
|
|
21
|
+
NomosApprovedModel({
|
|
22
|
+
required this.lawSha256,
|
|
23
|
+
required this.reason,
|
|
24
|
+
required List<String> domainKeys,
|
|
25
|
+
required this.loadPackage,
|
|
26
|
+
}) : domainKeys = List.unmodifiable(domainKeys) {
|
|
27
|
+
if (!_lowerHex64.hasMatch(lawSha256)) {
|
|
28
|
+
throw ArgumentError.value(
|
|
29
|
+
lawSha256,
|
|
30
|
+
'lawSha256',
|
|
31
|
+
'must be the kernel-derived identity of the compiled law package (64 lowercase hex)',
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
if (reason.trim().isEmpty) {
|
|
35
|
+
throw ArgumentError.value(
|
|
36
|
+
reason,
|
|
37
|
+
'reason',
|
|
38
|
+
'must be the attributed approval text the release recorded',
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
if (this.domainKeys.isEmpty ||
|
|
42
|
+
this.domainKeys.any((key) => key.trim().isEmpty)) {
|
|
43
|
+
throw ArgumentError.value(
|
|
44
|
+
domainKeys,
|
|
45
|
+
'domainKeys',
|
|
46
|
+
'must name the application domain keys the office observes on each workspace',
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/// The kernel-derived identity of the compiled `.law.usdz` closure.
|
|
52
|
+
final String lawSha256;
|
|
53
|
+
|
|
54
|
+
/// The attributed approval text. The kernel's transition demands it whenever
|
|
55
|
+
/// retirements or retypes are present; the office never invents one.
|
|
56
|
+
final String reason;
|
|
57
|
+
|
|
58
|
+
/// The application's domain keys. A workspace serving none of them is left
|
|
59
|
+
/// alone; keys it does not serve are ignored.
|
|
60
|
+
final List<String> domainKeys;
|
|
61
|
+
|
|
62
|
+
/// The exact compiled package bytes, read only when a workspace must stage
|
|
63
|
+
/// them (a bundled asset, a file beside the generated facade).
|
|
64
|
+
final Future<Uint8List> Function() loadPackage;
|
|
65
|
+
}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
// resolve them. The bridge decodes these from the runner's `custody` events + `custodyStatus` reply.
|
|
8
8
|
library;
|
|
9
9
|
|
|
10
|
-
import 'proto/nomos/runtime/v2/
|
|
10
|
+
import 'proto/nomos/runtime/v2/recovery_desk.pb.dart' as recovery;
|
|
11
11
|
|
|
12
12
|
/// WHY a chain was superseded — the lineage annotation lifted from the workspace status onto a break.
|
|
13
13
|
class NomosCustodySupersession {
|
|
@@ -98,16 +98,13 @@ class NomosCustodyBreak {
|
|
|
98
98
|
};
|
|
99
99
|
}
|
|
100
100
|
|
|
101
|
-
/// The
|
|
101
|
+
/// The mount's declared response to a custody discontinuity.
|
|
102
102
|
enum CustodyBreakPolicy {
|
|
103
103
|
/// Salvage local-only work, re-clone the new incarnation, park the salvage re-offerable, resume.
|
|
104
104
|
adopt,
|
|
105
105
|
|
|
106
106
|
/// Stay on local truth, go offline-only (the local holon keeps serving; sync suspends).
|
|
107
|
-
reject
|
|
108
|
-
|
|
109
|
-
/// Surface the break on [custodyEvents] and await `resolveCustodyBreak(...)` (async UX — a dialog).
|
|
110
|
-
ask;
|
|
107
|
+
reject;
|
|
111
108
|
|
|
112
109
|
String get wire => name;
|
|
113
110
|
}
|
|
@@ -130,8 +127,7 @@ class NomosSupersededChain {
|
|
|
130
127
|
{'ref': ref, 'supersededAt': supersededAt, 'reason': reason};
|
|
131
128
|
}
|
|
132
129
|
|
|
133
|
-
/// A custody lifecycle event pushed over the bridge (mirrors syncEvents).
|
|
134
|
-
/// "detected" | "rejected" | "adopting" | "adopted" | "ask"; "ask" awaits `resolveCustodyBreak`.
|
|
130
|
+
/// A custody lifecycle event pushed over the bridge (mirrors syncEvents).
|
|
135
131
|
class NomosCustodyEvent {
|
|
136
132
|
final String kind;
|
|
137
133
|
final String? session;
|
|
@@ -147,22 +143,18 @@ class NomosCustodyEvent {
|
|
|
147
143
|
this.parkedIntents,
|
|
148
144
|
});
|
|
149
145
|
|
|
150
|
-
/// True when this event is an interactive prompt awaiting a decision.
|
|
151
|
-
bool get isAsk => kind == 'ask';
|
|
152
|
-
|
|
153
146
|
factory NomosCustodyEvent.fromRuntime(
|
|
154
|
-
|
|
147
|
+
recovery.CustodyChanged event, {
|
|
155
148
|
String? session,
|
|
156
149
|
}) {
|
|
157
150
|
final custodyBreak = event.hasCustodyBreak() ? event.custodyBreak : null;
|
|
158
151
|
return NomosCustodyEvent(
|
|
159
152
|
kind: switch (event.kind) {
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
153
|
+
recovery.CustodyChangeKind.CUSTODY_CHANGE_KIND_DETECTED => 'detected',
|
|
154
|
+
recovery.CustodyChangeKind.CUSTODY_CHANGE_KIND_REJECTED => 'rejected',
|
|
155
|
+
recovery.CustodyChangeKind.CUSTODY_CHANGE_KIND_ADOPTING => 'adopting',
|
|
156
|
+
recovery.CustodyChangeKind.CUSTODY_CHANGE_KIND_ADOPT_REFUSED =>
|
|
164
157
|
'adopt-refused',
|
|
165
|
-
runtime.CustodyChangeKind.CUSTODY_CHANGE_KIND_ASK => 'ask',
|
|
166
158
|
_ => 'unspecified',
|
|
167
159
|
},
|
|
168
160
|
session: session,
|
|
@@ -170,7 +162,7 @@ class NomosCustodyEvent {
|
|
|
170
162
|
? null
|
|
171
163
|
: NomosCustodyBreak(
|
|
172
164
|
kind: custodyBreak.kind ==
|
|
173
|
-
|
|
165
|
+
recovery.CustodyBreakKind.CUSTODY_BREAK_KIND_DIVERGED
|
|
174
166
|
? NomosCustodyBreakKind.diverged
|
|
175
167
|
: NomosCustodyBreakKind.superseded,
|
|
176
168
|
localGenesis: custodyBreak.localGenesis,
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
/// Data-only error/trace types for the bridge boundary. These carry NO transport, NO
|
|
7
7
|
/// bridge, NO runtime — they are pure serializable value types, so they live in
|
|
8
8
|
/// `nomos_types` and are safe to depend on from generated types files + UI code. The
|
|
9
|
-
/// async
|
|
9
|
+
/// async Reception/runtime surface builds on them.
|
|
10
10
|
library;
|
|
11
11
|
|
|
12
12
|
/// Trace/span context carried over the bridge as plain JSON. It is intentionally OpenTelemetry-shaped without
|
|
@@ -174,11 +174,11 @@ class NomosErrorInfo {
|
|
|
174
174
|
|
|
175
175
|
/// A typed refusal surfaced from the githolon's gate (a law refusal, a drift, a malformed op). Carries the
|
|
176
176
|
/// human-first message verbatim plus structured detail for logging, UI mapping, and future OTel export.
|
|
177
|
-
class
|
|
177
|
+
class NomosRuntimeError implements Exception {
|
|
178
178
|
final String message;
|
|
179
179
|
final NomosErrorInfo info;
|
|
180
|
-
|
|
180
|
+
NomosRuntimeError(this.message, {NomosErrorInfo? info})
|
|
181
181
|
: info = info ?? NomosErrorInfo.legacy(message);
|
|
182
182
|
@override
|
|
183
|
-
String toString() => '
|
|
183
|
+
String toString() => 'NomosRuntimeError: $message';
|
|
184
184
|
}
|
|
@@ -5,22 +5,22 @@
|
|
|
5
5
|
|
|
6
6
|
/// TYPED DIAGNOSTICS for the home factory (co2 feedback req 7).
|
|
7
7
|
///
|
|
8
|
-
/// The generic [
|
|
8
|
+
/// The generic [NomosRuntimeError] is the catch-all for a refusal from the Peer Office or kernel
|
|
9
9
|
/// surfaces verbatim. But the HOME-BIRTH CEREMONY ([NomosScope.home]) has a small, fixed set of ways it can
|
|
10
10
|
/// fail — and each one wants a DIFFERENT remedy from the app (re-auth vs. retry vs. "deploy the home law").
|
|
11
11
|
/// These typed errors name the exact failure so the app's `errorBuilder` can branch on `is`, and so a log
|
|
12
12
|
/// line says WHICH leg of the ceremony broke, not just "connect failed".
|
|
13
13
|
///
|
|
14
|
-
/// All extend [
|
|
14
|
+
/// All extend [NomosRuntimeError] so existing `catch (NomosRuntimeError)` handlers still catch them.
|
|
15
15
|
library;
|
|
16
16
|
|
|
17
|
-
import 'error_info.dart' show
|
|
17
|
+
import 'error_info.dart' show NomosRuntimeError, NomosErrorInfo;
|
|
18
18
|
|
|
19
19
|
/// Mint the MOST SPECIFIC typed error for a structured refusal — the one construction point the bridge
|
|
20
20
|
/// uses everywhere it surfaces an `errorInfo`. A `nomos.custody.*` code becomes a [CustodyError] (typed,
|
|
21
21
|
/// recoverable, carrying the eviction/escalation decision fields); everything else stays the generic
|
|
22
|
-
/// [
|
|
23
|
-
|
|
22
|
+
/// [NomosRuntimeError]. Apps `switch` on the type / `code`, never scrape prose.
|
|
23
|
+
NomosRuntimeError nomosErrorFromInfo(NomosErrorInfo info) {
|
|
24
24
|
if (info.code == 'nomos.owned.recovery_pending') {
|
|
25
25
|
return OwnedRecoveryPending.fromInfo(info);
|
|
26
26
|
}
|
|
@@ -38,7 +38,7 @@ NomosBridgeError nomosErrorFromInfo(NomosErrorInfo info) {
|
|
|
38
38
|
if (info.code == 'kernel-capability-skew') {
|
|
39
39
|
return KernelCoherenceError.fromInfo(info);
|
|
40
40
|
}
|
|
41
|
-
return
|
|
41
|
+
return NomosRuntimeError(info.message, info: info);
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
/// THE ONE recommendedAction vocabulary, shared across EVERY typed error (custody, law, auth, load). A repair
|
|
@@ -77,9 +77,8 @@ class NomosRecommendedAction {
|
|
|
77
77
|
/// [ParentSignerEnrollmentMissing] (a reborn parent that lost the signer tuple).
|
|
78
78
|
static const ensureParentSignerEnrollment = 'ensureParentSignerEnrollment';
|
|
79
79
|
|
|
80
|
-
///
|
|
81
|
-
///
|
|
82
|
-
/// [SourceSessionNotMounted] (a directive's `read(q, {from})` resolves in-engine from the mounted source).
|
|
80
|
+
/// Retain the SOURCE workspace on this peer so Replica Follow can make its
|
|
81
|
+
/// custody locally resident — the remedy for [SourceSessionNotMounted].
|
|
83
82
|
static const mountSourceSession = 'mountSourceSession';
|
|
84
83
|
|
|
85
84
|
/// Ask the designated recovery person to open this workspace once. Nomos completes the handoff privately.
|
|
@@ -131,7 +130,7 @@ class NomosRecommendedAction {
|
|
|
131
130
|
|
|
132
131
|
/// All-device-loss recovery is a normal, resumable lifecycle state. The app may render the one concrete
|
|
133
132
|
/// [recommendedAction]; the private recovery protocol stays inside Nomos.
|
|
134
|
-
class OwnedRecoveryPending extends
|
|
133
|
+
class OwnedRecoveryPending extends NomosRuntimeError {
|
|
135
134
|
final String code;
|
|
136
135
|
final String? workspace;
|
|
137
136
|
final String stage;
|
|
@@ -181,7 +180,7 @@ class OwnedRecoveryPending extends NomosBridgeError {
|
|
|
181
180
|
/// §5 connect-time compat check, or a dispatch-time refusal when a payload's baked hash names law the workspace
|
|
182
181
|
/// no longer runs. When [structurallyCompatible] is true the operation can still proceed (structural subtyping);
|
|
183
182
|
/// when false it names the [incompatibleMember] that broke. REMEDY: `recompileClient` or `redeployLaw`.
|
|
184
|
-
class LawMismatchError extends
|
|
183
|
+
class LawMismatchError extends NomosRuntimeError {
|
|
185
184
|
/// The stable machine code, e.g. `nomos.law.mismatch`.
|
|
186
185
|
final String code;
|
|
187
186
|
|
|
@@ -287,7 +286,7 @@ class LawMismatchError extends NomosBridgeError {
|
|
|
287
286
|
/// `.requires(<relation>)` tuple is absent for the actor on [object].
|
|
288
287
|
/// These fields ride the UNSEALED presentation lanes only (verdict / 422 body / bridge errorInfo) —
|
|
289
288
|
/// never the sealed chain bytes.
|
|
290
|
-
class AuthzRefusedError extends
|
|
289
|
+
class AuthzRefusedError extends NomosRuntimeError {
|
|
291
290
|
/// The stable machine code, e.g. `nomos.authz.signer_enrollment_missing`.
|
|
292
291
|
final String code;
|
|
293
292
|
|
|
@@ -415,7 +414,7 @@ class ParentSignerEnrollmentMissing extends AuthzRefusedError {
|
|
|
415
414
|
/// AUTH — the auth-provider token was missing/malformed/expired/rejected, or its issuer does not match the
|
|
416
415
|
/// workspace's law-declared key (`nomos.auth.*`, e.g. `nomos.auth.issuer_mismatch`, `nomos.auth.token_invalid`,
|
|
417
416
|
/// `nomos.auth.token_expired`). REMEDY is always `reauth`: acquire a fresh token and reconnect.
|
|
418
|
-
class AuthError extends
|
|
417
|
+
class AuthError extends NomosRuntimeError {
|
|
419
418
|
/// The stable machine code, e.g. `nomos.auth.issuer_mismatch`.
|
|
420
419
|
final String code;
|
|
421
420
|
|
|
@@ -471,7 +470,7 @@ class AuthError extends NomosBridgeError {
|
|
|
471
470
|
/// (`nomos.load.*`, e.g. `nomos.load.wasm_fetch_failed`, `nomos.load.instantiate_failed`,
|
|
472
471
|
/// `nomos.load.manifest_failed`). This is a transport/runtime fault, never a law refusal. REMEDY: `retry` for a
|
|
473
472
|
/// transient fetch, `reopen` when the loaded runtime is unusable.
|
|
474
|
-
class LoadError extends
|
|
473
|
+
class LoadError extends NomosRuntimeError {
|
|
475
474
|
/// The stable machine code, e.g. `nomos.load.wasm_fetch_failed`.
|
|
476
475
|
final String code;
|
|
477
476
|
|
|
@@ -520,12 +519,13 @@ class LoadError extends NomosBridgeError {
|
|
|
520
519
|
|
|
521
520
|
/// SOURCE SESSION NOT MOUNTED (`nomos.attested_read.source_not_mounted`) — a directive whose law declares a
|
|
522
521
|
/// colocated foreign read (`read(query, {from: <sourceWs>})`) was offered while the SOURCE workspace was NOT
|
|
523
|
-
/// mounted as a session on this device's
|
|
522
|
+
/// mounted as a session on this device's kernel host. A colocated attested read resolves + signs IN-ENGINE
|
|
524
523
|
/// (zero HTTP) from the mounted source; when the source is absent the bridge refuses IMMEDIATELY (this error)
|
|
525
524
|
/// instead of a doomed ~31s remote fetch that answers an unsigned projection. The remedy is
|
|
526
|
-
/// [NomosRecommendedAction.mountSourceSession]:
|
|
527
|
-
///
|
|
528
|
-
|
|
525
|
+
/// [NomosRecommendedAction.mountSourceSession]: ensure [sourceWorkspace] has a retained placement on this
|
|
526
|
+
/// peer and wait for Replica Follow to make it resident before offering the directive. Binding an interaction
|
|
527
|
+
/// session is deliberately insufficient.
|
|
528
|
+
class SourceSessionNotMounted extends NomosRuntimeError {
|
|
529
529
|
/// The stable machine code — always `nomos.attested_read.source_not_mounted`.
|
|
530
530
|
final String code;
|
|
531
531
|
|
|
@@ -582,7 +582,7 @@ class SourceSessionNotMounted extends NomosBridgeError {
|
|
|
582
582
|
}
|
|
583
583
|
|
|
584
584
|
/// The provider-selected OSGi resource does not satisfy the generated law's Contract Namespace requirements.
|
|
585
|
-
class KernelCoherenceError extends
|
|
585
|
+
class KernelCoherenceError extends NomosRuntimeError {
|
|
586
586
|
/// The stable machine code — always `kernel-contract-incompatible`.
|
|
587
587
|
final String code;
|
|
588
588
|
|
|
@@ -609,12 +609,12 @@ enum CustodySource { localSnapshot, cloudPack, unknown }
|
|
|
609
609
|
/// missing history the operation needed (`nomos.custody.shallow_insufficient` /
|
|
610
610
|
/// `nomos.custody.missing_object`), and the in-client gap-fill repair could not complete it.
|
|
611
611
|
///
|
|
612
|
-
/// This replaces pattern-matching `shallow-insufficient` out of a stringly [
|
|
612
|
+
/// This replaces pattern-matching `shallow-insufficient` out of a stringly [NomosRuntimeError]: the app
|
|
613
613
|
/// switches on [code] and decides from the structured fields whether to EVICT LOCAL CUSTODY
|
|
614
614
|
/// ([recommendedAction] == `quarantineLocalSnapshotAndReclone` — quarantine the snapshot, `inspectSnapshot`
|
|
615
615
|
/// / `recoverFrom`, reconnect fresh) or ESCALATE CLOUD CUSTODY (`refetchFullHistoryAndRetry` — the cloud
|
|
616
|
-
/// must serve the full chain). Trace IDs ride [
|
|
617
|
-
class CustodyError extends
|
|
616
|
+
/// must serve the full chain). Trace IDs ride [NomosRuntimeError.info.trace] as on every bridge error.
|
|
617
|
+
class CustodyError extends NomosRuntimeError {
|
|
618
618
|
/// The stable machine code, e.g. `nomos.custody.shallow_insufficient`.
|
|
619
619
|
final String code;
|
|
620
620
|
|
|
@@ -701,7 +701,7 @@ class CustodyError extends NomosBridgeError {
|
|
|
701
701
|
/// The auth-provider access token the cloud was given was missing, malformed, expired, or rejected — the
|
|
702
702
|
/// cloud answered 401 / "invalid token" on a lane that requires a verified principal (every birth does).
|
|
703
703
|
/// REMEDY: re-acquire a fresh token from the auth provider and reconnect.
|
|
704
|
-
class AuthTokenInvalid extends
|
|
704
|
+
class AuthTokenInvalid extends NomosRuntimeError {
|
|
705
705
|
final String code = 'nomos.auth.token_invalid';
|
|
706
706
|
final String recommendedAction = NomosRecommendedAction.reauth;
|
|
707
707
|
AuthTokenInvalid([String? message])
|
|
@@ -714,7 +714,7 @@ class AuthTokenInvalid extends NomosBridgeError {
|
|
|
714
714
|
/// The workspace name the cloud reported for the born home does NOT equal `homeNameOf(subject)`. The home's
|
|
715
715
|
/// own law commits to `home-<sha256(subject)>` (the squat invariant), so a mismatch means the cloud routed to
|
|
716
716
|
/// the wrong slot — a fail-closed safety stop, never silently mount the wrong holon.
|
|
717
|
-
class HomeNameMismatch extends
|
|
717
|
+
class HomeNameMismatch extends NomosRuntimeError {
|
|
718
718
|
final String code = 'nomos.home.name_mismatch';
|
|
719
719
|
final String recommendedAction = NomosRecommendedAction.reopen;
|
|
720
720
|
|
|
@@ -737,7 +737,7 @@ class HomeNameMismatch extends NomosBridgeError {
|
|
|
737
737
|
/// workspace, not a home holon. Per req 2 there is NO generic fallback: a home that cannot be confirmed to
|
|
738
738
|
/// run the home law FAILS here rather than silently mounting a lawless workspace. REMEDY: the tenant's
|
|
739
739
|
/// governance must install the home law (the birth offer should author it; if it didn't, the deploy is wrong).
|
|
740
|
-
class HomeLawMissing extends
|
|
740
|
+
class HomeLawMissing extends NomosRuntimeError {
|
|
741
741
|
final String code = 'nomos.home.law_missing';
|
|
742
742
|
final String recommendedAction = NomosRecommendedAction.redeployLaw;
|
|
743
743
|
|
|
@@ -753,7 +753,7 @@ class HomeLawMissing extends NomosBridgeError {
|
|
|
753
753
|
/// The offer to the home's birth lane was REFUSED by the parent's gate (the law denied the birth — e.g. the
|
|
754
754
|
/// principal lacks creation authority, the pool is exhausted, or the genesis recipe was rejected). Carries
|
|
755
755
|
/// the cloud's verdict verbatim. REMEDY is tenant-specific (grant creation authority / raise the pool).
|
|
756
|
-
class BirthRejected extends
|
|
756
|
+
class BirthRejected extends NomosRuntimeError {
|
|
757
757
|
final String code = 'nomos.home.birth_refused';
|
|
758
758
|
final String recommendedAction = NomosRecommendedAction.redeployLaw;
|
|
759
759
|
|
|
@@ -772,7 +772,7 @@ class BirthRejected extends NomosBridgeError {
|
|
|
772
772
|
/// A pack the cloud returned (or the local holon produced) was malformed — it could not be parsed/applied as
|
|
773
773
|
/// a git pack. This is a transport/custody integrity fault, not a law refusal. REMEDY: retry; if persistent,
|
|
774
774
|
/// the custody bytes are corrupt.
|
|
775
|
-
class PackMalformed extends
|
|
775
|
+
class PackMalformed extends NomosRuntimeError {
|
|
776
776
|
final String code = 'nomos.custody.pack_malformed';
|
|
777
777
|
final String recommendedAction =
|
|
778
778
|
NomosRecommendedAction.refetchFullHistoryAndRetry;
|
|
@@ -786,7 +786,7 @@ class PackMalformed extends NomosBridgeError {
|
|
|
786
786
|
/// The home law's content hash could not be resolved — the cloud reported no current law for the home's
|
|
787
787
|
/// domain key, so the app cannot confirm WHICH law the home runs (and thus cannot baked-hash-pin or judge
|
|
788
788
|
/// installed-ness). REMEDY: the home law must be deployed; if it was, retry once the deploy has folded.
|
|
789
|
-
class LawHashUnavailable extends
|
|
789
|
+
class LawHashUnavailable extends NomosRuntimeError {
|
|
790
790
|
final String code = 'nomos.home.law_hash_unavailable';
|
|
791
791
|
final String recommendedAction = NomosRecommendedAction.redeployLaw;
|
|
792
792
|
|
|
@@ -804,7 +804,7 @@ class LawHashUnavailable extends NomosBridgeError {
|
|
|
804
804
|
/// BEFORE any submit, so an actorless gated offer is impossible to GENERATE (never merely refused at the
|
|
805
805
|
/// kernel gate). REMEDY: construct the generated client with an `actor` (the verified principal — under a
|
|
806
806
|
/// home scope this is the subject; the bridge owns signing). Secrets NEVER appear here — only the identity.
|
|
807
|
-
class MissingOfferAuthority extends
|
|
807
|
+
class MissingOfferAuthority extends NomosRuntimeError {
|
|
808
808
|
/// The domain of the gated directive.
|
|
809
809
|
final String domain;
|
|
810
810
|
|
|
@@ -4,13 +4,15 @@
|
|
|
4
4
|
//
|
|
5
5
|
// These types live in the pure `nomos_types` core (no bridge, no lifecycle) so BOTH the layered TYPES
|
|
6
6
|
// package (frontend-safe) AND the runtime `nomos_client` package resolve them; `nomos_client` re-exports
|
|
7
|
-
// this barrel, and
|
|
7
|
+
// this barrel, and Dart Reception implements [NomosForeignReader] over the device's multi-workspace plane.
|
|
8
8
|
library;
|
|
9
9
|
|
|
10
|
+
import 'dart:typed_data';
|
|
11
|
+
|
|
10
12
|
import 'nomos_ref.dart';
|
|
11
13
|
|
|
12
14
|
/// Reads a FOREIGN workspace on demand — the surface a [ForeignRef] resolves against. It is STRUCTURAL: any
|
|
13
|
-
/// object with this shape works. `nomos_client`'s
|
|
15
|
+
/// object with this shape works. `nomos_client`'s Reception implements it over the device's local
|
|
14
16
|
/// multi-workspace plane (`bridge.session(ws).queryById(id)`, mounting the workspace lazily); the TS twin is
|
|
15
17
|
/// the `openRealm()` reader. A plain single-workspace holon is NOT one — pass the multi-workspace reader.
|
|
16
18
|
abstract class NomosForeignReader {
|
|
@@ -18,17 +20,16 @@ abstract class NomosForeignReader {
|
|
|
18
20
|
NomosForeignWorkspaceReader foreignWorkspace(String workspace);
|
|
19
21
|
}
|
|
20
22
|
|
|
21
|
-
/// One foreign workspace's by-id read surface.
|
|
22
|
-
///
|
|
23
|
-
/// via the target `fromJson` it captured at construction (the same shape [NomosReads.decodeRows] consumes).
|
|
23
|
+
/// One foreign workspace's by-id read surface. It returns the kernel's canonical
|
|
24
|
+
/// nominal USDA image; only code generated from the target domain may decode it.
|
|
24
25
|
abstract class NomosForeignWorkspaceReader {
|
|
25
|
-
///
|
|
26
|
-
///
|
|
27
|
-
Future<
|
|
26
|
+
/// Canonical USDA result bytes for one nominal aggregate kind and identity.
|
|
27
|
+
/// Only the generated target codec may interpret the application value.
|
|
28
|
+
Future<Uint8List> queryById(String aggregateType, String id);
|
|
28
29
|
|
|
29
30
|
/// OPTIONAL reactive by-id read — the target's rows re-emitted on each projection tick. `null` when this
|
|
30
31
|
/// reader offers no watch lane (then the internal watcher calls back once with `null` and no-ops).
|
|
31
|
-
Stream<
|
|
32
|
+
Stream<Uint8List>? watchById(String aggregateType, String id) => null;
|
|
32
33
|
}
|
|
33
34
|
|
|
34
35
|
/// The outcome of an internal foreign-reference resolution, with the reason named — a foreign read can come back empty
|
|
@@ -61,11 +62,29 @@ class ForeignUnreachable<T> extends ForeignResolveResult<T> {
|
|
|
61
62
|
const ForeignUnreachable(this.error);
|
|
62
63
|
}
|
|
63
64
|
|
|
65
|
+
enum ForeignReadFailureKind { denied, unreachable }
|
|
66
|
+
|
|
67
|
+
/// A failed read is not an absent business record. Keep only address and
|
|
68
|
+
/// classification metadata here; never retain/print transport or auth payloads.
|
|
69
|
+
final class ForeignReadFailure implements Exception {
|
|
70
|
+
final ForeignReadFailureKind kind;
|
|
71
|
+
final String workspace;
|
|
72
|
+
final String type;
|
|
73
|
+
final String id;
|
|
74
|
+
final String sourceErrorType;
|
|
75
|
+
const ForeignReadFailure(
|
|
76
|
+
this.kind, this.workspace, this.type, this.id, this.sourceErrorType);
|
|
77
|
+
|
|
78
|
+
@override
|
|
79
|
+
String toString() => 'ForeignReadFailure(${kind.name}: $workspace/$type/$id; '
|
|
80
|
+
'source=$sourceErrorType)';
|
|
81
|
+
}
|
|
82
|
+
|
|
64
83
|
/// A typed, inspectable cross-application business reference. Tenant code can retain, serialize and pass
|
|
65
84
|
/// it back to generated application methods; navigation, decoding and attestation remain framework state.
|
|
66
85
|
final class ForeignRef<T> {
|
|
67
86
|
final NomosRef<T> _ref;
|
|
68
|
-
final T Function(
|
|
87
|
+
final T? Function(Uint8List bytes, String workspace, String id)? _decode;
|
|
69
88
|
|
|
70
89
|
const ForeignRef._(this._ref, this._decode);
|
|
71
90
|
|
|
@@ -92,31 +111,23 @@ abstract final class NmsInternalForeignRefs {
|
|
|
92
111
|
required String id,
|
|
93
112
|
required String workspace,
|
|
94
113
|
required String type,
|
|
95
|
-
|
|
114
|
+
T? Function(Uint8List bytes, String workspace, String id)? fromUsda,
|
|
96
115
|
}) =>
|
|
97
116
|
ForeignRef<T>._(
|
|
98
117
|
NmsInternalNomosRefs.create<T>(
|
|
99
118
|
workspace: workspace, type: type, id: id),
|
|
100
|
-
|
|
119
|
+
fromUsda,
|
|
101
120
|
);
|
|
102
121
|
|
|
103
|
-
static T?
|
|
104
|
-
|
|
105
|
-
if (
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
match = r;
|
|
111
|
-
break;
|
|
112
|
-
}
|
|
122
|
+
static T? _decodeResult<T>(ForeignRef<T> reference, Uint8List bytes) {
|
|
123
|
+
final decoder = reference._decode;
|
|
124
|
+
if (decoder == null) {
|
|
125
|
+
throw StateError(
|
|
126
|
+
'This ForeignRef was decoded by a retired projection-map path; '
|
|
127
|
+
'regenerate its application client to install the nominal USDA codec.',
|
|
128
|
+
);
|
|
113
129
|
}
|
|
114
|
-
|
|
115
|
-
final data = match['data'];
|
|
116
|
-
if (data is! Map<String, dynamic>) return null;
|
|
117
|
-
final rawId = match['id'];
|
|
118
|
-
final rowId = rawId is String ? rawId : (rawId?.toString() ?? id);
|
|
119
|
-
return reference._decode(data, rowId);
|
|
130
|
+
return decoder(bytes, reference.workspace, reference.id);
|
|
120
131
|
}
|
|
121
132
|
|
|
122
133
|
static Future<ForeignResolveResult<T>> resolveResult<T>(
|
|
@@ -125,8 +136,11 @@ abstract final class NmsInternalForeignRefs {
|
|
|
125
136
|
final workspace = NmsInternalNomosRefs.workspace(reference._ref);
|
|
126
137
|
if (id.isEmpty || workspace.isEmpty) return ForeignNotFound<T>();
|
|
127
138
|
try {
|
|
128
|
-
final
|
|
129
|
-
|
|
139
|
+
final bytes = await nomos.foreignWorkspace(workspace).queryById(
|
|
140
|
+
reference.type,
|
|
141
|
+
id,
|
|
142
|
+
);
|
|
143
|
+
final row = _decodeResult(reference, bytes);
|
|
130
144
|
return row != null ? ForeignFound<T>(row) : ForeignNotFound<T>();
|
|
131
145
|
} catch (error) {
|
|
132
146
|
final m = error.toString().toLowerCase();
|
|
@@ -140,7 +154,19 @@ abstract final class NmsInternalForeignRefs {
|
|
|
140
154
|
static Future<T?> resolve<T>(
|
|
141
155
|
ForeignRef<T> reference, NomosForeignReader nomos) async {
|
|
142
156
|
final r = await resolveResult(reference, nomos);
|
|
143
|
-
|
|
157
|
+
if (r is ForeignFound<T>) return r.row;
|
|
158
|
+
if (r is ForeignNotFound<T>) return null;
|
|
159
|
+
final error =
|
|
160
|
+
r is ForeignDenied<T> ? r.error : (r as ForeignUnreachable<T>).error;
|
|
161
|
+
throw ForeignReadFailure(
|
|
162
|
+
r is ForeignDenied<T>
|
|
163
|
+
? ForeignReadFailureKind.denied
|
|
164
|
+
: ForeignReadFailureKind.unreachable,
|
|
165
|
+
reference.workspace,
|
|
166
|
+
reference.type,
|
|
167
|
+
reference.id,
|
|
168
|
+
error.runtimeType.toString(),
|
|
169
|
+
);
|
|
144
170
|
}
|
|
145
171
|
|
|
146
172
|
static void Function() watch<T>(ForeignRef<T> reference,
|
|
@@ -151,13 +177,16 @@ abstract final class NmsInternalForeignRefs {
|
|
|
151
177
|
cb(null);
|
|
152
178
|
return () {};
|
|
153
179
|
}
|
|
154
|
-
final stream = nomos.foreignWorkspace(workspace).watchById(
|
|
180
|
+
final stream = nomos.foreignWorkspace(workspace).watchById(
|
|
181
|
+
reference.type,
|
|
182
|
+
id,
|
|
183
|
+
);
|
|
155
184
|
if (stream == null) {
|
|
156
185
|
cb(null);
|
|
157
186
|
return () {};
|
|
158
187
|
}
|
|
159
188
|
final sub = stream.listen(
|
|
160
|
-
(
|
|
189
|
+
(bytes) => cb(_decodeResult(reference, bytes)),
|
|
161
190
|
onError: (Object _) => cb(null),
|
|
162
191
|
);
|
|
163
192
|
return sub.cancel;
|