@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,314 @@
|
|
|
1
|
+
// NOMOS — Nomos Sovereign: participants act · verify · remember LOCALLY; hosted
|
|
2
|
+
// remotes are replaceable custody/transport, not truth. ⇒ ONE Nomos GitHolon
|
|
3
|
+
// wasm32-wasip1 artifact {kernel · projection · embedded QuickJS engine}.
|
|
4
|
+
// If a file isn't this / hosting this / authoring for this / proving this — it's gone.
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* RECEIVING-GROUP DEVICE RECOVERY — framework law, composed by the application's declaration.
|
|
8
|
+
*
|
|
9
|
+
* A verified person's receiving group is the framework's identity anchor. When the application
|
|
10
|
+
* declares `application.receivingGroup.recovery = "platform-identity-provider"`, the anchor is born
|
|
11
|
+
* with that posture (`receiving_group.ts`, the policy seed) and this module supplies the ONE recovery door that
|
|
12
|
+
* posture means: a replacement device, already seated on the attested parent platform by the ordinary
|
|
13
|
+
* `enrollFirstDevice` lane, asks the platform to re-seat it on the receiving group. Platform law derives
|
|
14
|
+
* both the target and the evidence from its own committed state (the user's current typed
|
|
15
|
+
* `SignerDelegation` and the platform's current typed `AuthProvider`); the host delivers a sealed effect
|
|
16
|
+
* and chooses nothing. The receiving group's own gate then proves the evidence against ITS birth record,
|
|
17
|
+
* ITS group facts and ITS selected posture before seating anything.
|
|
18
|
+
*
|
|
19
|
+
* Both halves live in the injected application-home domain, which runs on the platform workspace AND is
|
|
20
|
+
* installed into every receiving group at genesis, so the parent door and the child acceptor are one
|
|
21
|
+
* exported `Directive` pair in one law module (the compiler's exact-export rule).
|
|
22
|
+
*
|
|
23
|
+
* Provenance: this is the framework form of the door CO2 authored as tenant law
|
|
24
|
+
* (`co2_platform/auth_provider_epoch.ts`, `co2_home/auth_provider_epoch_accept.ts`,
|
|
25
|
+
* `auth_provider_authority.ts`). The composition of policy + signer seat + delegation + verifier epoch +
|
|
26
|
+
* parent-authority seat into ONE target transition is load-bearing: split into independently delivered
|
|
27
|
+
* effects, delivery order would become transport state rather than law.
|
|
28
|
+
*/
|
|
29
|
+
import { z } from "zod";
|
|
30
|
+
import { directive, nomosImplementationDetail } from "../directive.js";
|
|
31
|
+
import { intent } from "../intent.js";
|
|
32
|
+
import {
|
|
33
|
+
AuthProvider,
|
|
34
|
+
AuthProviderCertificate,
|
|
35
|
+
AuthProviderKey,
|
|
36
|
+
authProvider,
|
|
37
|
+
authProviderCertificates,
|
|
38
|
+
authProviderConfiguration,
|
|
39
|
+
authProviderKeys,
|
|
40
|
+
readAuthProviderConfiguration,
|
|
41
|
+
writeAuthProviderConfiguration,
|
|
42
|
+
} from "./auth_provider_law.js";
|
|
43
|
+
// THE SHARED EPOCH ACCEPTOR + PARENT-AUTHORITY SEAT live in the framework's child-authentication law
|
|
44
|
+
// (every business-born child adopts its parent's verifier epoch through the same door a receiving group
|
|
45
|
+
// does); this module re-exports them under their historical names so the composed posture law is unchanged.
|
|
46
|
+
import {
|
|
47
|
+
ACCEPT_PARENT_AUTH_PROVIDER_EPOCH_ID,
|
|
48
|
+
acceptParentAuthProviderEpoch,
|
|
49
|
+
acceptParentAuthProviderEpochEffect,
|
|
50
|
+
seatVerifiedBirthParentAuthority,
|
|
51
|
+
verifiedBirthAttestation,
|
|
52
|
+
} from "./child_authentication.js";
|
|
53
|
+
import {
|
|
54
|
+
BIRTH_ATTESTATION_ID,
|
|
55
|
+
BirthAttestation,
|
|
56
|
+
DEFAULT_RECEIVING_GROUP_POLICY,
|
|
57
|
+
PLATFORM_IDENTITY_PROVIDER_RECOVERY,
|
|
58
|
+
RECEIVING_GROUP_ID,
|
|
59
|
+
RECEIVING_GROUP_POLICY_ID,
|
|
60
|
+
ReceivingGroup,
|
|
61
|
+
ReceivingGroupPolicy,
|
|
62
|
+
type ReceivingGroupRecoveryPolicy,
|
|
63
|
+
writeReceivingGroupPolicy,
|
|
64
|
+
} from "./receiving_group.js";
|
|
65
|
+
import { RelationTuple, writeTuple } from "./relations.js";
|
|
66
|
+
import {
|
|
67
|
+
SIGNER_RELATION,
|
|
68
|
+
SignerDelegation,
|
|
69
|
+
readSignerDelegationRecoveryEvidence,
|
|
70
|
+
signerDelegationByUser,
|
|
71
|
+
signerDelegationEvidenceIsRetained,
|
|
72
|
+
signerDelegationRecoveryEvidence,
|
|
73
|
+
signerObject,
|
|
74
|
+
writeSignerDelegationRecoveryEvidence,
|
|
75
|
+
} from "./signing_identity.js";
|
|
76
|
+
import { readRef, readSet, workspaceInvariant } from "./workspace_invariant.js";
|
|
77
|
+
|
|
78
|
+
/** Wire ids — framework-internal, obscure on purpose (the 7c1f5e suffix convention). */
|
|
79
|
+
export const RECOVER_RECEIVING_GROUP_DEVICE_ID = "nomosInternalRecoverReceivingGroupDevice7c1f5e";
|
|
80
|
+
export const ACCEPT_RECEIVING_GROUP_DEVICE_RECOVERY_ID = "nomosInternalAcceptReceivingGroupDeviceRecovery7c1f5e";
|
|
81
|
+
export { ACCEPT_PARENT_AUTH_PROVIDER_EPOCH_ID, verifiedBirthAttestation };
|
|
82
|
+
|
|
83
|
+
/** The exact typed parent disclosure used to recover a receiving-group device. Neither the host nor
|
|
84
|
+
* the caller supplies verifier members: platform law reads both values from its committed state. */
|
|
85
|
+
export const receivingGroupDeviceRecoveryEvidence = z
|
|
86
|
+
.object({
|
|
87
|
+
delegation: signerDelegationRecoveryEvidence,
|
|
88
|
+
authProvider: authProviderConfiguration,
|
|
89
|
+
})
|
|
90
|
+
.strict();
|
|
91
|
+
export type ReceivingGroupDeviceRecoveryEvidence = z.infer<typeof receivingGroupDeviceRecoveryEvidence>;
|
|
92
|
+
|
|
93
|
+
// ── CHILD SIDE: the receiving group's own consequences ────────────────────────────────────────────
|
|
94
|
+
|
|
95
|
+
/** Re-seat the selected posture for a group born under the untouched framework default. Genesis seeds
|
|
96
|
+
* the declared posture directly; this exists for anchors born before the application declared one.
|
|
97
|
+
* ONE module-level singleton (the only posture with a door is the attested parent), so every evaluation
|
|
98
|
+
* of the composed law resolves the same declaration object — the compiler registers these singletons as
|
|
99
|
+
* the application-home domain's declaration exports exactly like `child_authentication.ts`. */
|
|
100
|
+
export const setReceivingGroupRecoveryPosture = nomosImplementationDetail(
|
|
101
|
+
directive("nomosInternalSetReceivingGroupRecoveryPosture7c1f5e")
|
|
102
|
+
.ensures(ReceivingGroupPolicy)
|
|
103
|
+
.payload(z.object({ setAt: z.string().min(1) }).strict())
|
|
104
|
+
.plan((p) => writeReceivingGroupPolicy({ setAt: p.setAt, recovery: PLATFORM_IDENTITY_PROVIDER_RECOVERY })),
|
|
105
|
+
);
|
|
106
|
+
|
|
107
|
+
export const seatRecoveredDevice = nomosImplementationDetail(
|
|
108
|
+
directive("nomosInternalSeatRecoveredReceivingGroupDevice7c1f5e")
|
|
109
|
+
.ensures(RelationTuple)
|
|
110
|
+
.payload(receivingGroupDeviceRecoveryEvidence)
|
|
111
|
+
.plan(({ delegation }) =>
|
|
112
|
+
writeTuple({
|
|
113
|
+
object: signerObject(delegation.user),
|
|
114
|
+
relation: SIGNER_RELATION,
|
|
115
|
+
subject: delegation.deviceKeySubject,
|
|
116
|
+
grantedBy: `workspace:${delegation.certificate.parentId}`,
|
|
117
|
+
grantedAt: delegation.enrolledAt,
|
|
118
|
+
...(delegation.certificate.verifiedVia === undefined
|
|
119
|
+
? {}
|
|
120
|
+
: { verifiedVia: delegation.certificate.verifiedVia }),
|
|
121
|
+
...(delegation.certificate.epoch === undefined
|
|
122
|
+
? {}
|
|
123
|
+
: { validFromEpoch: delegation.certificate.epoch }),
|
|
124
|
+
}),
|
|
125
|
+
),
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
/** A recovered key must carry the parent's typed delegation certificate too, otherwise a later child
|
|
129
|
+
* birth combines a certificate signed by the recovered device with the group's original-device lineage
|
|
130
|
+
* and fails the offline chain walk. */
|
|
131
|
+
export const adoptRecoveryDelegation = nomosImplementationDetail(
|
|
132
|
+
directive("nomosInternalAdoptRecoveryDelegation7c1f5e")
|
|
133
|
+
.ensures(SignerDelegation)
|
|
134
|
+
.payload(receivingGroupDeviceRecoveryEvidence)
|
|
135
|
+
.plan(({ delegation }) => writeSignerDelegationRecoveryEvidence(delegation)),
|
|
136
|
+
);
|
|
137
|
+
|
|
138
|
+
export const adoptRecoveryAuthProvider = nomosImplementationDetail(
|
|
139
|
+
directive("nomosInternalAdoptRecoveryAuthProvider7c1f5e")
|
|
140
|
+
.ensures(AuthProvider)
|
|
141
|
+
.payload(receivingGroupDeviceRecoveryEvidence)
|
|
142
|
+
.plan(({ authProvider: configuration }) => writeAuthProviderConfiguration(configuration))
|
|
143
|
+
.alsoEnsuresMany(AuthProviderKey)
|
|
144
|
+
.alsoEnsuresMany(AuthProviderCertificate),
|
|
145
|
+
);
|
|
146
|
+
|
|
147
|
+
/** The child-owned gate: the evidence must match THIS group's principal, name and verified birth, be
|
|
148
|
+
* delivered by THAT birth's parent, cite the parent's current provider issuer, and the group must be
|
|
149
|
+
* either untouched-birth-default or already the platform posture. */
|
|
150
|
+
function receivingGroupDeviceRecoveryFollowsPosture(posture: ReceivingGroupRecoveryPolicy) {
|
|
151
|
+
return workspaceInvariant("ReceivingGroupDeviceRecoveryFollowsPosture")
|
|
152
|
+
.on(ACCEPT_RECEIVING_GROUP_DEVICE_RECOVERY_ID)
|
|
153
|
+
.reads(
|
|
154
|
+
readSet(
|
|
155
|
+
readRef("group", ReceivingGroup).at(RECEIVING_GROUP_ID),
|
|
156
|
+
readRef("policy", ReceivingGroupPolicy).at(RECEIVING_GROUP_POLICY_ID),
|
|
157
|
+
readRef("birth", BirthAttestation).at(BIRTH_ATTESTATION_ID),
|
|
158
|
+
),
|
|
159
|
+
)
|
|
160
|
+
.declassify(
|
|
161
|
+
"device recovery deliberately reveals only whether the receiving group selected its attested parent identity provider",
|
|
162
|
+
)
|
|
163
|
+
.assert(({ group, policy, birth }, ctx) => {
|
|
164
|
+
const evidence = ctx?.intent as ReceivingGroupDeviceRecoveryEvidence | undefined;
|
|
165
|
+
const delegation = evidence?.delegation;
|
|
166
|
+
const certificate = delegation?.certificate;
|
|
167
|
+
const provider = evidence?.authProvider;
|
|
168
|
+
const untouchedBirthDefault =
|
|
169
|
+
policy?.recovery === DEFAULT_RECEIVING_GROUP_POLICY.recovery &&
|
|
170
|
+
typeof policy.setAt === "string" &&
|
|
171
|
+
typeof group?.bornAt === "string" &&
|
|
172
|
+
policy.setAt === group.bornAt;
|
|
173
|
+
const alreadySelected = policy?.recovery === posture;
|
|
174
|
+
if (!untouchedBirthDefault && !alreadySelected) {
|
|
175
|
+
return { reject: "receiving-group-recovery-posture-is-neither-birth-default-nor-declared" };
|
|
176
|
+
}
|
|
177
|
+
if (
|
|
178
|
+
typeof group?.principal !== "string" ||
|
|
179
|
+
typeof group.workspaceName !== "string" ||
|
|
180
|
+
delegation === undefined ||
|
|
181
|
+
certificate === undefined ||
|
|
182
|
+
provider === undefined ||
|
|
183
|
+
birth === undefined ||
|
|
184
|
+
delegation.user !== group.principal ||
|
|
185
|
+
certificate.founder !== group.principal ||
|
|
186
|
+
certificate.child !== group.workspaceName ||
|
|
187
|
+
certificate.verified !== true ||
|
|
188
|
+
certificate.parentId.length === 0 ||
|
|
189
|
+
birth.child !== group.workspaceName ||
|
|
190
|
+
birth.founder !== group.principal ||
|
|
191
|
+
birth.verified !== "true" ||
|
|
192
|
+
birth.parentId !== certificate.parentId ||
|
|
193
|
+
ctx?.principal !== `workspace:${certificate.parentId}` ||
|
|
194
|
+
certificate.verifiedVia !== provider.issuer ||
|
|
195
|
+
certificate.idpToken === undefined ||
|
|
196
|
+
certificate.capturedClock === undefined
|
|
197
|
+
) {
|
|
198
|
+
return { reject: "receiving-group-device-recovery-evidence-mismatch" };
|
|
199
|
+
}
|
|
200
|
+
return { accept: true };
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// ── PARENT SIDE: the platform's door ──────────────────────────────────────────────────────────────
|
|
205
|
+
|
|
206
|
+
function currentRecoveryEvidence(user: string, deviceKeySubject?: string) {
|
|
207
|
+
const delegation = readSignerDelegationRecoveryEvidence(user, deviceKeySubject);
|
|
208
|
+
if (delegation === undefined) {
|
|
209
|
+
throw new Error(`receiving-group recovery requires the platform's current typed SignerDelegation for '${user}'`);
|
|
210
|
+
}
|
|
211
|
+
const provider = readAuthProviderConfiguration();
|
|
212
|
+
if (provider === undefined) {
|
|
213
|
+
throw new Error("receiving-group recovery requires the platform's current typed AuthProvider");
|
|
214
|
+
}
|
|
215
|
+
if (
|
|
216
|
+
delegation.certificate.founder !== user ||
|
|
217
|
+
delegation.certificate.verified !== true ||
|
|
218
|
+
delegation.certificate.parentId.length === 0 ||
|
|
219
|
+
delegation.certificate.verifiedVia !== provider.issuer ||
|
|
220
|
+
delegation.certificate.idpToken === undefined ||
|
|
221
|
+
delegation.certificate.capturedClock === undefined
|
|
222
|
+
) {
|
|
223
|
+
throw new Error(
|
|
224
|
+
"receiving-group recovery found a delegation which is not exact current platform identity-provider evidence",
|
|
225
|
+
);
|
|
226
|
+
}
|
|
227
|
+
return receivingGroupDeviceRecoveryEvidence.parse({ delegation, authProvider: provider });
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
export const acceptReceivingGroupDeviceRecovery = nomosImplementationDetail(
|
|
231
|
+
intent(ACCEPT_RECEIVING_GROUP_DEVICE_RECOVERY_ID)
|
|
232
|
+
.contract({ accepts: receivingGroupDeviceRecoveryEvidence })
|
|
233
|
+
// Selecting the posture and applying the recovery evidence are ONE target-workspace transition.
|
|
234
|
+
.directs(setReceivingGroupRecoveryPosture, ({ delegation }) => ({ setAt: String(delegation.enrolledAt) }))
|
|
235
|
+
.directs(seatRecoveredDevice, (evidence) => evidence)
|
|
236
|
+
.directs(adoptRecoveryDelegation, (evidence) => evidence)
|
|
237
|
+
.directs(adoptRecoveryAuthProvider, (evidence) => evidence)
|
|
238
|
+
.directs(seatVerifiedBirthParentAuthority, () => ({}))
|
|
239
|
+
.acceptsVerifiedBirthParentRecoveryEffect()
|
|
240
|
+
.atomically(),
|
|
241
|
+
);
|
|
242
|
+
|
|
243
|
+
/** The replacement device authors on the platform, where its exact key is already enrolled. */
|
|
244
|
+
export const recoverReceivingGroupDevice = nomosImplementationDetail(
|
|
245
|
+
intent(RECOVER_RECEIVING_GROUP_DEVICE_ID)
|
|
246
|
+
.contract({
|
|
247
|
+
accepts: z.object({
|
|
248
|
+
user: z.string().min(1),
|
|
249
|
+
deviceKeySubject: z.string().regex(/^key:[0-9a-f]{64}$/).optional(),
|
|
250
|
+
}).strict(),
|
|
251
|
+
})
|
|
252
|
+
.reads(signerDelegationByUser, authProvider, authProviderKeys, authProviderCertificates)
|
|
253
|
+
.directsWorkspace(acceptReceivingGroupDeviceRecovery, {
|
|
254
|
+
workspace: ({ user, deviceKeySubject }) =>
|
|
255
|
+
currentRecoveryEvidence(user, deviceKeySubject).delegation.certificate.child,
|
|
256
|
+
payload: ({ user, deviceKeySubject }) => currentRecoveryEvidence(user, deviceKeySubject),
|
|
257
|
+
})
|
|
258
|
+
.directsWorkspace(acceptParentAuthProviderEpoch, {
|
|
259
|
+
workspace: ({ user, deviceKeySubject }) =>
|
|
260
|
+
currentRecoveryEvidence(user, deviceKeySubject).delegation.certificate.child,
|
|
261
|
+
payload: ({ user, deviceKeySubject }) => currentRecoveryEvidence(user, deviceKeySubject).authProvider,
|
|
262
|
+
})
|
|
263
|
+
.authenticatesWithEnrolledDevice()
|
|
264
|
+
.atomically(),
|
|
265
|
+
);
|
|
266
|
+
|
|
267
|
+
/** A device may request recovery only for its own authenticated identity. */
|
|
268
|
+
export const recoverReceivingGroupDeviceBindsPrincipal = workspaceInvariant(
|
|
269
|
+
"RecoverReceivingGroupDeviceBindsPrincipal",
|
|
270
|
+
)
|
|
271
|
+
.on(RECOVER_RECEIVING_GROUP_DEVICE_ID)
|
|
272
|
+
.reads(readSet())
|
|
273
|
+
.assert((_snapshots, ctx) =>
|
|
274
|
+
ctx?.principal === (ctx?.intent as { user?: unknown } | undefined)?.user
|
|
275
|
+
? { accept: true }
|
|
276
|
+
: { reject: "receiving-group-device-recovery-must-bind-authenticated-user" },
|
|
277
|
+
);
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* The recovery law an application composes when its declared posture is the attested parent identity
|
|
281
|
+
* provider. Returned as one export map so the application-home policy law can merge it exactly like its
|
|
282
|
+
* other `__nomos_*` members; every member is presentation-internal.
|
|
283
|
+
*/
|
|
284
|
+
export function receivingGroupRecoveryLaw(posture: ReceivingGroupRecoveryPolicy) {
|
|
285
|
+
if (posture !== PLATFORM_IDENTITY_PROVIDER_RECOVERY) {
|
|
286
|
+
throw new Error(
|
|
287
|
+
`receivingGroupRecoveryLaw: posture '${posture}' has no platform recovery door; only ` +
|
|
288
|
+
`'${PLATFORM_IDENTITY_PROVIDER_RECOVERY}' re-seats a device through the attested parent`,
|
|
289
|
+
);
|
|
290
|
+
}
|
|
291
|
+
return {
|
|
292
|
+
__nomos_receivingGroupDeviceRecoveryEvidence: receivingGroupDeviceRecoveryEvidence,
|
|
293
|
+
__nomos_verifiedBirthAttestation: verifiedBirthAttestation,
|
|
294
|
+
__nomos_setReceivingGroupRecoveryPosture: setReceivingGroupRecoveryPosture,
|
|
295
|
+
// `seatRecoveredDevice` rides ONLY the acceptor's step closure (as `child_authentication.ts` carries its
|
|
296
|
+
// gated acceptor effect): the compiler infers the framework RelationTuple bookkeeping onto an exported
|
|
297
|
+
// tuple-writing directive as a fresh object, so a second export slot would resolve the one step to two
|
|
298
|
+
// declarations (`NMS-GRAPH-001`).
|
|
299
|
+
__nomos_adoptRecoveryDelegation: adoptRecoveryDelegation,
|
|
300
|
+
__nomos_adoptRecoveryAuthProvider: adoptRecoveryAuthProvider,
|
|
301
|
+
__nomos_acceptParentAuthProviderEpochEffect: acceptParentAuthProviderEpochEffect,
|
|
302
|
+
__nomos_seatVerifiedBirthParentAuthority: seatVerifiedBirthParentAuthority,
|
|
303
|
+
__nomos_acceptReceivingGroupDeviceRecovery: acceptReceivingGroupDeviceRecovery,
|
|
304
|
+
__nomos_acceptParentAuthProviderEpoch: acceptParentAuthProviderEpoch,
|
|
305
|
+
__nomos_receivingGroupDeviceRecoveryFollowsPosture: receivingGroupDeviceRecoveryFollowsPosture(posture),
|
|
306
|
+
__nomos_receivingGroupDeviceRecoveryRetainsEvidence: signerDelegationEvidenceIsRetained(
|
|
307
|
+
"ReceivingGroupDeviceRecoveryRetainsEvidence",
|
|
308
|
+
ACCEPT_RECEIVING_GROUP_DEVICE_RECOVERY_ID,
|
|
309
|
+
"delegation.user",
|
|
310
|
+
),
|
|
311
|
+
__nomos_recoverReceivingGroupDevice: recoverReceivingGroupDevice,
|
|
312
|
+
__nomos_recoverReceivingGroupDeviceBindsPrincipal: recoverReceivingGroupDeviceBindsPrincipal,
|
|
313
|
+
};
|
|
314
|
+
}
|
|
@@ -211,20 +211,16 @@ export const RelationshipSubjectValue = valueObject("RelationshipSubject", {
|
|
|
211
211
|
ownedCustody: OwnedCustodyValue.optional(),
|
|
212
212
|
});
|
|
213
213
|
|
|
214
|
-
// Historical RelationTuple law declared this map value as `t.json()`, but the
|
|
215
|
-
// kernel has always admitted and stored only the nominal RelationshipSubject
|
|
216
|
-
// palette for this framework field. Keep that exact prior declaration as the
|
|
217
|
-
// source of the explicit evolution edge: this is a type-disclosure refinement
|
|
218
|
-
// of existing structured custody, not a JSON parser or a business-data cast.
|
|
219
|
-
const LegacyRelationshipSubjects = t.map(t.json()).merge(MapOf(Lww));
|
|
220
|
-
|
|
221
214
|
export const RelationTuple = aggregate("RelationTuple", {
|
|
222
215
|
object: t.string().merge(Lww),
|
|
223
216
|
relation: t.string().merge(Lww),
|
|
224
217
|
subjects: t
|
|
225
218
|
.map(RelationshipSubjectValue.field())
|
|
226
219
|
.merge(MapOf(Lww))
|
|
227
|
-
|
|
220
|
+
// Historical metadata called this leaf JSON, although the kernel's relation
|
|
221
|
+
// gate already required RelationshipSubject. Declare that exact disclosure
|
|
222
|
+
// transition; this does not permit arbitrary tenant JSON-to-object narrowing.
|
|
223
|
+
.evolvesFrom(t.map(t.json()).merge(MapOf(Lww))),
|
|
228
224
|
}).public();
|
|
229
225
|
export type RelationTupleHandle = typeof RelationTuple;
|
|
230
226
|
|