@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
|
@@ -1,188 +1,74 @@
|
|
|
1
|
-
//
|
|
1
|
+
// Reception state-ownership tripwire (source-level, no mirrors).
|
|
2
2
|
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
// The structural fix: ONE overridable seam — `NomosBridge get _eventPlane` — and every event-dispatch /
|
|
8
|
-
// plane-state access goes through it.
|
|
9
|
-
//
|
|
10
|
-
// WHAT THIS TEST ASSERTS (each chosen to FAIL if the bug class is re-opened):
|
|
11
|
-
// 1. Every public Stream-returning member declared on NomosBridge routes through the seam: its body
|
|
12
|
-
// either references `_eventPlane` directly or delegates to `_watchStream` (whose own body must).
|
|
13
|
-
// 2. The controller registries (`_watches[` / `_compatWatches[`) are only ever indexed via
|
|
14
|
-
// `_eventPlane.` inside Stream-returning members — a new method with its own local registry, or a
|
|
15
|
-
// bare `this._watches[subId] = ctrl`, trips it.
|
|
16
|
-
// 3. NomosSession declares NO Stream-returning members and NO StreamController state of its own — a
|
|
17
|
-
// re-added per-method override (the old workaround, i.e. the smell) trips it.
|
|
18
|
-
// 4. The seam override on NomosSession chases to the root (`parent._eventPlane`, not `parent`).
|
|
19
|
-
//
|
|
20
|
-
// HONESTY NOTE: this is a text-level check, not semantic analysis. It cannot prove an `_eventPlane`
|
|
21
|
-
// mention is the LOAD-BEARING one — but every re-occurrence of the bug so far shipped as a member whose
|
|
22
|
-
// body never named the parent plane at all, which this catches. Keep the seam's doc comment in
|
|
23
|
-
// webview_bridge.dart in sync if the routing rule ever changes.
|
|
3
|
+
// A NomosSession is a workspace-scoped view of one Reception plane. It must
|
|
4
|
+
// never allocate another set of event controllers, registries, projections,
|
|
5
|
+
// correlation counters or request gateways. Those objects have one owner for
|
|
6
|
+
// the lifetime of Reception and every session view shares their exact identity.
|
|
24
7
|
|
|
25
8
|
import 'dart:io';
|
|
26
9
|
|
|
27
10
|
import 'package:test/test.dart';
|
|
28
11
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
final open = src.indexOf('{', decl.start);
|
|
12
|
+
String classBody(String source, String name) {
|
|
13
|
+
final declaration = RegExp('class $name[\\s<]').firstMatch(source);
|
|
14
|
+
if (declaration == null) fail('class $name not found');
|
|
15
|
+
final open = source.indexOf('{', declaration.start);
|
|
34
16
|
var depth = 0;
|
|
35
|
-
for (var
|
|
36
|
-
final
|
|
37
|
-
if (
|
|
38
|
-
if (
|
|
17
|
+
for (var index = open; index < source.length; index++) {
|
|
18
|
+
final character = source[index];
|
|
19
|
+
if (character == '{') depth++;
|
|
20
|
+
if (character == '}') {
|
|
39
21
|
depth--;
|
|
40
|
-
if (depth == 0) return
|
|
22
|
+
if (depth == 0) return source.substring(open + 1, index);
|
|
41
23
|
}
|
|
42
24
|
}
|
|
43
25
|
fail('unbalanced braces for class $name');
|
|
44
26
|
}
|
|
45
27
|
|
|
46
|
-
class Member {
|
|
47
|
-
Member(this.name, this.body);
|
|
48
|
-
final String name;
|
|
49
|
-
final String body; // the full text from `=>`/`{` to the member's end
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/// Collect every member whose declared return type is `Stream<...>` (methods AND getters).
|
|
53
|
-
/// Text-level: finds `Stream<` at member position, then captures the arrow-or-block body.
|
|
54
|
-
List<Member> streamMembers(String body) {
|
|
55
|
-
final out = <Member>[];
|
|
56
|
-
final decl = RegExp(
|
|
57
|
-
r'\n Stream<[^=;{]*?(?:get\s+(\w+)|(\w+)\s*\()',
|
|
58
|
-
dotAll: true);
|
|
59
|
-
for (final m in decl.allMatches(body)) {
|
|
60
|
-
final name = m.group(1) ?? m.group(2)!;
|
|
61
|
-
// scan from the end of the declaration match to the member's end (arrow → `;` at depth 0;
|
|
62
|
-
// block → matching `}`), tracking (), {}, [] together so `=>` inside args doesn't confuse it.
|
|
63
|
-
// for a method the regex consumed the opening `(` — rewind one so paren depth balances.
|
|
64
|
-
var i = m.group(2) != null ? m.end - 1 : m.end;
|
|
65
|
-
var depth = 0;
|
|
66
|
-
var start = -1; // where the body proper begins
|
|
67
|
-
var isBlock = false;
|
|
68
|
-
for (; i < body.length; i++) {
|
|
69
|
-
final c = body[i];
|
|
70
|
-
if (c == '(' || c == '[') depth++;
|
|
71
|
-
if (c == ')' || c == ']') depth--;
|
|
72
|
-
if (depth == 0 && start < 0) {
|
|
73
|
-
if (c == '=' && i + 1 < body.length && body[i + 1] == '>') {
|
|
74
|
-
start = i;
|
|
75
|
-
continue;
|
|
76
|
-
}
|
|
77
|
-
if (c == '{') {
|
|
78
|
-
start = i;
|
|
79
|
-
isBlock = true;
|
|
80
|
-
depth = 1;
|
|
81
|
-
continue;
|
|
82
|
-
}
|
|
83
|
-
continue;
|
|
84
|
-
}
|
|
85
|
-
if (start < 0) continue;
|
|
86
|
-
if (isBlock) {
|
|
87
|
-
if (c == '{') depth++;
|
|
88
|
-
if (c == '}') {
|
|
89
|
-
depth--;
|
|
90
|
-
if (depth == 0) break;
|
|
91
|
-
}
|
|
92
|
-
} else {
|
|
93
|
-
if (c == '{') depth++;
|
|
94
|
-
if (c == '}') depth--;
|
|
95
|
-
if (c == ';' && depth == 0) break;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
out.add(Member(name, body.substring(m.start, i + 1)));
|
|
99
|
-
}
|
|
100
|
-
return out;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
28
|
void main() {
|
|
104
|
-
final
|
|
105
|
-
|
|
106
|
-
final
|
|
107
|
-
final
|
|
108
|
-
|
|
109
|
-
test('found the known Stream surface on NomosBridge (parser sanity)', () {
|
|
110
|
-
final names = bridgeStreams.map((m) => m.name).toSet();
|
|
111
|
-
// if one of these is renamed/removed, update this list deliberately.
|
|
112
|
-
for (final expected in [
|
|
113
|
-
'custodyEvents', 'syncEvents', 'transferProgress', 'syncStatus',
|
|
114
|
-
'signalEvents', 'flameEvents', 'spanEvents', 'onLawChanged',
|
|
115
|
-
'watch', 'watchById', 'watchSpatial', 'watchPendingConflicts',
|
|
116
|
-
'watchActivity', 'watchCompatibility', '_watchStream',
|
|
117
|
-
]) {
|
|
118
|
-
expect(names, contains(expected),
|
|
119
|
-
reason: 'the source parser lost sight of $expected — fix the '
|
|
120
|
-
'parser (or update the list if the member was deliberately '
|
|
121
|
-
'renamed)');
|
|
122
|
-
}
|
|
123
|
-
});
|
|
29
|
+
final source =
|
|
30
|
+
File('lib/src/reception/dart_reception.dart').readAsStringSync();
|
|
31
|
+
final reception = classBody(source, 'DartReception');
|
|
32
|
+
final session = classBody(source, 'NomosSession');
|
|
124
33
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
'NomosSession its events would resolve against a DEAD '
|
|
134
|
-
'registry (the watchPendingConflicts 0.48.1 bug class). '
|
|
135
|
-
'Register controllers/state on _eventPlane.<field>.');
|
|
136
|
-
}
|
|
137
|
-
// and the shared helper itself must land its registry on the plane.
|
|
138
|
-
final ws = bridgeStreams.firstWhere((m) => m.name == '_watchStream');
|
|
139
|
-
expect(ws.body, contains('_eventPlane._watches[subId] = ctrl'),
|
|
140
|
-
reason: '_watchStream must register its controller on the event '
|
|
141
|
-
'plane\'s registry');
|
|
142
|
-
final wc = bridgeStreams.firstWhere((m) => m.name == 'watchCompatibility');
|
|
143
|
-
expect(wc.body, contains('_eventPlane._compatWatches[subId] = ctrl'),
|
|
144
|
-
reason: 'watchCompatibility must register its controller on the '
|
|
145
|
-
'event plane\'s registry');
|
|
146
|
-
});
|
|
34
|
+
const sharedPlaneState = <String>[
|
|
35
|
+
'_transport',
|
|
36
|
+
'_events',
|
|
37
|
+
'_sessions',
|
|
38
|
+
'_receipts',
|
|
39
|
+
'_sequences',
|
|
40
|
+
'_runtimeV2',
|
|
41
|
+
];
|
|
147
42
|
|
|
148
|
-
test('
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
'_eventPlane. prefix — a bare registry access is the '
|
|
162
|
-
'dead-registry bug on sessions');
|
|
163
|
-
}
|
|
164
|
-
}
|
|
43
|
+
test('a session view shares every Reception plane state owner', () {
|
|
44
|
+
final view = RegExp(
|
|
45
|
+
r'DartReception\._view\(DartReception parent\)([\s\S]*?)allowStaleRunnerBundle = false;',
|
|
46
|
+
).firstMatch(reception)?.group(1);
|
|
47
|
+
expect(view, isNotNull,
|
|
48
|
+
reason: 'DartReception._view constructor not found');
|
|
49
|
+
for (final field in sharedPlaneState) {
|
|
50
|
+
expect(
|
|
51
|
+
view,
|
|
52
|
+
contains('$field = parent.$field'),
|
|
53
|
+
reason:
|
|
54
|
+
'$field must be the parent plane object, not session-local state',
|
|
55
|
+
);
|
|
165
56
|
}
|
|
166
57
|
});
|
|
167
58
|
|
|
168
|
-
test('NomosSession
|
|
169
|
-
|
|
170
|
-
expect(
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
'fix. Make the base implementation _eventPlane-correct instead.');
|
|
175
|
-
expect(session.contains('StreamController'), isFalse,
|
|
176
|
-
reason: 'NomosSession holds StreamController state of its own — '
|
|
177
|
-
'event state belongs on the plane (_eventPlane)');
|
|
59
|
+
test('NomosSession constructs a view of its parent, not another plane', () {
|
|
60
|
+
expect(session, contains('super._view(parent)'));
|
|
61
|
+
expect(session, isNot(contains('super._view(parent._transport)')));
|
|
62
|
+
expect(session, isNot(contains('StreamController')));
|
|
63
|
+
expect(session, isNot(contains('NmsRuntimeV2Gateway(')));
|
|
64
|
+
expect(session, isNot(contains('NmsObservedSessionDirectory')));
|
|
178
65
|
});
|
|
179
66
|
|
|
180
|
-
test('the session seam chases to the root
|
|
67
|
+
test('the session event-plane seam chases to the root', () {
|
|
181
68
|
expect(
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
'parent) so nested delegation stays correct');
|
|
69
|
+
RegExp(r'DartReception get _eventPlane => parent\._eventPlane;')
|
|
70
|
+
.hasMatch(session),
|
|
71
|
+
isTrue,
|
|
72
|
+
);
|
|
187
73
|
});
|
|
188
74
|
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import 'package:fixnum/fixnum.dart';
|
|
2
|
+
import 'package:nomos_client/src/reception/extremum_read.dart';
|
|
3
|
+
import 'package:nomos_types/nomos_kernel_protocol.dart' as protocol;
|
|
4
|
+
import 'package:test/test.dart';
|
|
5
|
+
|
|
6
|
+
protocol.QueryResponse result(protocol.NomosValue? value, {bool ok = true}) =>
|
|
7
|
+
protocol.QueryResponse(
|
|
8
|
+
value: protocol.NomosValue(
|
|
9
|
+
object: protocol.NomosStruct(
|
|
10
|
+
fields: {
|
|
11
|
+
'ok': protocol.NomosValue(boolean: ok),
|
|
12
|
+
if (value != null) 'value': value,
|
|
13
|
+
}.entries)));
|
|
14
|
+
|
|
15
|
+
void main() {
|
|
16
|
+
test('fixed extremum query carries its declaration, kind and exact group',
|
|
17
|
+
() {
|
|
18
|
+
final query = extremumQuery('minimum', 'min', '');
|
|
19
|
+
expect(query.named.operation,
|
|
20
|
+
protocol.QueryOperation.QUERY_OPERATION_EXTREMUM);
|
|
21
|
+
expect(query.named.arguments.fields['extremumId']!.text, 'minimum');
|
|
22
|
+
expect(query.named.arguments.fields['kind']!.text, 'min');
|
|
23
|
+
expect(query.named.arguments.fields['groupKey']!.text, '');
|
|
24
|
+
expect(() => extremumQuery('', 'min', null), throwsArgumentError);
|
|
25
|
+
expect(() => extremumQuery('minimum', 'other', null), throwsArgumentError);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
test('null and zero differ; signed extrema remain exact', () {
|
|
29
|
+
expect(extremumValue(result(protocol.NomosValue(null_1: protocol.Null()))),
|
|
30
|
+
isNull);
|
|
31
|
+
for (final value in [0, -7, 9, -9007199254740991, 9007199254740991]) {
|
|
32
|
+
final wire = value < 0
|
|
33
|
+
? protocol.NomosValue(signedInteger: Int64(value))
|
|
34
|
+
: protocol.NomosValue(unsignedInteger: Int64(value));
|
|
35
|
+
expect(extremumValue(result(wire)), value);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
test('missing, refused, malformed and unsafe values never become null', () {
|
|
40
|
+
for (final value in [
|
|
41
|
+
null,
|
|
42
|
+
protocol.NomosValue(),
|
|
43
|
+
protocol.NomosValue(text: '7'),
|
|
44
|
+
protocol.NomosValue(floatingPoint: 1.5),
|
|
45
|
+
protocol.NomosValue(boolean: false),
|
|
46
|
+
protocol.NomosValue(signedInteger: Int64(-9007199254740992)),
|
|
47
|
+
protocol.NomosValue(unsignedInteger: Int64(9007199254740992)),
|
|
48
|
+
protocol.NomosValue(unsignedInteger: Int64(-1))
|
|
49
|
+
]) {
|
|
50
|
+
expect(() => extremumValue(result(value)), throwsStateError);
|
|
51
|
+
}
|
|
52
|
+
expect(
|
|
53
|
+
() => extremumValue(
|
|
54
|
+
result(protocol.NomosValue(null_1: protocol.Null()), ok: false)),
|
|
55
|
+
throwsStateError);
|
|
56
|
+
expect(() => extremumValue(protocol.QueryResponse()), throwsStateError);
|
|
57
|
+
});
|
|
58
|
+
}
|
|
@@ -1,22 +1,4 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
// A
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
// hang" co2 reported so the harness's typed HarnessPhaseTimeout can be asserted without a real wait.
|
|
6
|
-
import { createInterface } from "node:readline";
|
|
7
|
-
const post = (msg) => process.stdout.write(JSON.stringify(msg) + "\n");
|
|
8
|
-
const wedgeOp = process.env.NOMOS_WEDGE_OP || "connect"; // default: wedge the KEYED reconnect (co2's shape)
|
|
9
|
-
const wedgeOnlyKeyed = process.env.NOMOS_WEDGE_ONLY_KEYED !== "0";
|
|
10
|
-
post({ v: 1, event: "ready", bundleVersion: "unbundled-dev" });
|
|
11
|
-
const rl = createInterface({ input: process.stdin, crlfDelay: Infinity });
|
|
12
|
-
rl.on("line", (line) => {
|
|
13
|
-
const s = line.trim();
|
|
14
|
-
if (!s) return;
|
|
15
|
-
let msg; try { msg = JSON.parse(s); } catch { return; }
|
|
16
|
-
const a = msg.args || {};
|
|
17
|
-
if (msg.op === wedgeOp && (!wedgeOnlyKeyed || a.authorSecret)) return; // THE WEDGE: never answer
|
|
18
|
-
if (msg.op === "authorKeygen") return post({ v: 1, id: msg.id, ok: true, result: { secret: "c2VjcmV0", public: "cHVibGlj" } });
|
|
19
|
-
if (msg.op === "connect") return post({ v: 1, id: msg.id, ok: true, result: { workspace: a.workspace, session: a.session } });
|
|
20
|
-
post({ v: 1, id: msg.id, ok: true, result: {} });
|
|
21
|
-
});
|
|
22
|
-
rl.on("close", () => process.exit(0));
|
|
2
|
+
// A physical Platform Shell which deliberately never announces Runtime v2
|
|
3
|
+
// readiness. It contains no alternate protocol or fake workspace lifecycle.
|
|
4
|
+
process.stdin.resume();
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import 'dart:typed_data';
|
|
2
|
+
import 'package:nomos_client/src/generated_call.dart';
|
|
3
|
+
import 'package:test/test.dart';
|
|
4
|
+
|
|
5
|
+
void main() {
|
|
6
|
+
test(
|
|
7
|
+
'no-argument generated queries retain their nominal type with zero bytes',
|
|
8
|
+
() {
|
|
9
|
+
final query = NmsInternalGeneratedQueries.create(
|
|
10
|
+
domain: 'test',
|
|
11
|
+
query: 'first',
|
|
12
|
+
protobufType: 'type.nomos.dev/nomos.operation.v1.Query_1',
|
|
13
|
+
protobufPayload: Uint8List(0));
|
|
14
|
+
expect(query.protobufPayload, isEmpty);
|
|
15
|
+
expect(query.query, 'first');
|
|
16
|
+
expect(query.protobufType, 'type.nomos.dev/nomos.operation.v1.Query_1');
|
|
17
|
+
expect(
|
|
18
|
+
() => NmsInternalGeneratedQueries.create(
|
|
19
|
+
domain: '',
|
|
20
|
+
query: 'first',
|
|
21
|
+
protobufType: query.protobufType,
|
|
22
|
+
protobufPayload: Uint8List(0)),
|
|
23
|
+
throwsArgumentError);
|
|
24
|
+
expect(
|
|
25
|
+
() => NmsInternalGeneratedQueries.create(
|
|
26
|
+
domain: 'test',
|
|
27
|
+
query: 'first',
|
|
28
|
+
protobufType: '',
|
|
29
|
+
protobufPayload: Uint8List(0)),
|
|
30
|
+
throwsArgumentError);
|
|
31
|
+
});
|
|
32
|
+
}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
// NO SILENT HANGS — the harness's per-phase deadline machinery, proven HERMETICALLY (no real waits, no
|
|
2
|
-
// wasm, no network): a fake
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
// failed construction must tear the runner down by itself (no leaked process holding the test runner).
|
|
2
|
+
// wasm, no network): a fake Platform Shell never announces Runtime v2 readiness.
|
|
3
|
+
// With a short `phaseTimeout` the harness must throw the typed
|
|
4
|
+
// [HarnessPhaseTimeout], never hang, and tear the process down itself.
|
|
6
5
|
@TestOn('vm')
|
|
7
6
|
@Timeout(Duration(seconds: 60))
|
|
8
7
|
library;
|
|
@@ -14,44 +13,41 @@ import 'package:test/test.dart';
|
|
|
14
13
|
|
|
15
14
|
String get _fixtures => '${Directory.current.path}/test/fixtures/wedge';
|
|
16
15
|
String get _wedgeEntry => '$_fixtures/wedge-entry.mjs';
|
|
17
|
-
String get _fakeInstall => '$_fixtures/fake-install.mjs';
|
|
18
16
|
|
|
19
17
|
void main() {
|
|
20
|
-
test('a
|
|
18
|
+
test('a Platform Shell readiness wedge is typed and bounded', () async {
|
|
21
19
|
final log = <String>[];
|
|
22
20
|
Object? err;
|
|
23
21
|
try {
|
|
24
22
|
await NomosTestHarness.cluster(
|
|
25
23
|
workspaces: {
|
|
26
|
-
'catalogue': ['unused.law.usdz'],
|
|
24
|
+
'catalogue': ['unused.law.usdz'],
|
|
27
25
|
},
|
|
28
|
-
deviceKeyed: {'catalogue'},
|
|
29
26
|
nodeEntry: _wedgeEntry,
|
|
30
|
-
|
|
31
|
-
phaseTimeout: const Duration(seconds: 2),
|
|
27
|
+
runtimeDir: _fixtures,
|
|
28
|
+
phaseTimeout: const Duration(seconds: 2),
|
|
32
29
|
onDiagnostic: log.add,
|
|
33
30
|
);
|
|
34
31
|
} catch (e) {
|
|
35
32
|
err = e;
|
|
36
33
|
}
|
|
37
34
|
expect(err, isA<HarnessPhaseTimeout>(),
|
|
38
|
-
reason:
|
|
35
|
+
reason:
|
|
36
|
+
'the wedge must surface as the typed phase timeout, never an eternal await');
|
|
39
37
|
final t = err as HarnessPhaseTimeout;
|
|
40
|
-
expect(t.phase,
|
|
41
|
-
expect(t.workspace,
|
|
42
|
-
expect(t.awaiting, '
|
|
38
|
+
expect(t.phase, '1/2: open canonical test peer');
|
|
39
|
+
expect(t.workspace, isNull);
|
|
40
|
+
expect(t.awaiting, 'Peer Office + filesystem Git custody');
|
|
43
41
|
expect(t.elapsed, const Duration(seconds: 2));
|
|
44
|
-
expect(t.likelyCauses, isNotEmpty, reason: 'known wedges carry their likely causes');
|
|
45
42
|
expect(t, isA<NomosTestHarnessException>(),
|
|
46
43
|
reason: 'existing on-NomosTestHarnessException handling keeps working');
|
|
47
|
-
expect(t.toString(), contains(
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
expect(log.any((l) => l.contains('3b: device keygen') && l.contains('done')), isTrue);
|
|
51
|
-
expect(log.any((l) => l.contains("3b: keyed reconnect of 'catalogue'")), isTrue);
|
|
44
|
+
expect(t.toString(), contains('1/2: open canonical test peer'));
|
|
45
|
+
expect(log.any((line) => line.contains('1/2: open canonical test peer')),
|
|
46
|
+
isTrue);
|
|
52
47
|
});
|
|
53
48
|
|
|
54
|
-
test('deviceKeyed naming an unknown workspace refuses typed (never a wedge)',
|
|
49
|
+
test('deviceKeyed naming an unknown workspace refuses typed (never a wedge)',
|
|
50
|
+
() async {
|
|
55
51
|
Object? err;
|
|
56
52
|
try {
|
|
57
53
|
await NomosTestHarness.cluster(
|
|
@@ -59,8 +55,7 @@ void main() {
|
|
|
59
55
|
'catalogue': ['unused.law.usdz'],
|
|
60
56
|
},
|
|
61
57
|
deviceKeyed: {'not-a-workspace'},
|
|
62
|
-
nodeEntry:
|
|
63
|
-
installHelper: _fakeInstall,
|
|
58
|
+
nodeEntry: '/unused-because-validation-is-pure',
|
|
64
59
|
phaseTimeout: const Duration(seconds: 5),
|
|
65
60
|
);
|
|
66
61
|
} catch (e) {
|