@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,131 +0,0 @@
|
|
|
1
|
-
// RUNTIME PROOF (task #27) — read-side VO typing end-to-end. Install a REAL VO-bearing law
|
|
2
|
-
// (nested VO + map-of-VO) into a fresh LOCAL holon, write one create through the real engine,
|
|
3
|
-
// then read it back three ways — declared query, by-id, and a WATCH stream — parsing each
|
|
4
|
-
// through the GENERATED read model and asserting TYPED nested + map-of-VO access
|
|
5
|
-
// (`site.location!.point!.coordinates`, `site.rooms['a']!.address!.city`). No cloud, no network.
|
|
6
|
-
//
|
|
7
|
-
// Prereqs (skipped-with-reason when absent, so CI stays green): `node` on PATH; the in-repo
|
|
8
|
-
// runner; a warm `~/.holon/runtime`; and the compiled fixture deploy.json + generated Dart
|
|
9
|
-
// (`cd bench/scale/fixtures/vo-read-typing && npx nomos-compile`).
|
|
10
|
-
@TestOn('vm')
|
|
11
|
-
library;
|
|
12
|
-
|
|
13
|
-
import 'dart:io';
|
|
14
|
-
|
|
15
|
-
import 'package:nomos_client/src/nms_conformance_runtime.dart';
|
|
16
|
-
import 'package:test/test.dart';
|
|
17
|
-
|
|
18
|
-
// The fixture's GENERATED Dart read models (support: "package" → imports package:nomos_client).
|
|
19
|
-
import '../../../bench/scale/fixtures/vo-read-typing/build/dart/src/generated/estate.dart';
|
|
20
|
-
|
|
21
|
-
String get _root => '${Directory.current.path}/../..';
|
|
22
|
-
String get _repoEntry => '$_root/cloud/web-client/runner/node-entry.ts';
|
|
23
|
-
String get _deployJson =>
|
|
24
|
-
'$_root/bench/scale/fixtures/vo-read-typing/build/vo-read-typing.law.usdz';
|
|
25
|
-
String get _runtimeDir =>
|
|
26
|
-
Platform.environment['NOMOS_DART_RUNTIME'] ??
|
|
27
|
-
Platform.environment['NOMOS_OFFLINE_RUNTIME'] ??
|
|
28
|
-
'${Platform.environment['HOME'] ?? ''}/.holon/runtime';
|
|
29
|
-
|
|
30
|
-
String? _missingPrereq() {
|
|
31
|
-
if (!File(_repoEntry).existsSync())
|
|
32
|
-
return 'in-repo runner not found at $_repoEntry';
|
|
33
|
-
if (!File(_deployJson).existsSync()) {
|
|
34
|
-
return 'compile the fixture: cd bench/scale/fixtures/vo-read-typing && npx nomos-compile';
|
|
35
|
-
}
|
|
36
|
-
if (!File('$_runtimeDir/holon-testmint.wasm').existsSync() ||
|
|
37
|
-
!File('$_runtimeDir/bootstrap.law.usdz').existsSync() ||
|
|
38
|
-
!File('$_runtimeDir/nomos.law.usdz').existsSync()) {
|
|
39
|
-
return 'warm ~/.holon/runtime first (run any `githolon` command once)';
|
|
40
|
-
}
|
|
41
|
-
return null;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
void main() {
|
|
45
|
-
test(
|
|
46
|
-
'OFFLINE: nested VO + map-of-VO read back TYPED via query, by-id, and watch',
|
|
47
|
-
() async {
|
|
48
|
-
final skip = _missingPrereq();
|
|
49
|
-
if (skip != null) {
|
|
50
|
-
markTestSkipped(skip);
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
final harness = await NomosTestHarness.ephemeral(
|
|
54
|
-
lawUsdzPaths: [_deployJson],
|
|
55
|
-
nodeEntry: _repoEntry,
|
|
56
|
-
runtimeDir: _runtimeDir,
|
|
57
|
-
registerTearDown: addTearDown,
|
|
58
|
-
);
|
|
59
|
-
|
|
60
|
-
// Author one Site through the REAL law: a nested VO `location` + a map-of-VO `rooms`.
|
|
61
|
-
final outcome = await harness.bridge.offerCreates(
|
|
62
|
-
domain: 'estate',
|
|
63
|
-
directiveId: 'placeSite',
|
|
64
|
-
payload: {
|
|
65
|
-
'name': 'HQ',
|
|
66
|
-
'location': {
|
|
67
|
-
'address': {'streetAddress': '1 High St', 'city': 'Leeds'},
|
|
68
|
-
'point': {
|
|
69
|
-
'type': 'Point',
|
|
70
|
-
'coordinates': [-1.55, 53.8]
|
|
71
|
-
},
|
|
72
|
-
},
|
|
73
|
-
'rooms': {
|
|
74
|
-
'atrium': {
|
|
75
|
-
'address': {'streetAddress': '1 High St', 'city': 'Leeds'},
|
|
76
|
-
'point': {
|
|
77
|
-
'type': 'Point',
|
|
78
|
-
'coordinates': [-1.5, 53.79]
|
|
79
|
-
},
|
|
80
|
-
},
|
|
81
|
-
},
|
|
82
|
-
},
|
|
83
|
-
);
|
|
84
|
-
expect(outcome.created, hasLength(1));
|
|
85
|
-
// Deliberately raw framework-mechanism probe: generated tenant applications retain the typed
|
|
86
|
-
// NomosRef<Site>; this test exercises queryById/watchById beneath that sealed surface.
|
|
87
|
-
final siteId = outcome.created.single.id;
|
|
88
|
-
|
|
89
|
-
// ── (1) declared query → typed Site, typed nested VO + typed map-of-VO ──
|
|
90
|
-
final qRows = await harness.bridge.query('sitesByName', {'name': 'HQ'});
|
|
91
|
-
expect(qRows, hasLength(1));
|
|
92
|
-
final fromQuery = Site.fromJson(
|
|
93
|
-
(qRows.first['data'] as Map).cast<String, dynamic>(),
|
|
94
|
-
(qRows.first['id'] ?? '').toString());
|
|
95
|
-
|
|
96
|
-
expect(fromQuery.name, 'HQ');
|
|
97
|
-
// Typed nested VO access — no map indexing, no casts.
|
|
98
|
-
expect(fromQuery.location, isA<SiteLocation>());
|
|
99
|
-
expect(fromQuery.location!.point, isA<GeoPoint>());
|
|
100
|
-
expect(fromQuery.location!.point!.coordinates, [-1.55, 53.8]);
|
|
101
|
-
expect(fromQuery.location!.address!.city, 'Leeds');
|
|
102
|
-
// Typed map-of-VO access: rooms is Map<String, SiteLocation>, NOT a raw map.
|
|
103
|
-
expect(fromQuery.rooms, isA<Map<String, SiteLocation>>());
|
|
104
|
-
expect(fromQuery.rooms['atrium'], isA<SiteLocation>());
|
|
105
|
-
expect(fromQuery.rooms['atrium']!.point!.coordinates, [-1.5, 53.79]);
|
|
106
|
-
expect(fromQuery.rooms['atrium']!.address!.city, 'Leeds');
|
|
107
|
-
|
|
108
|
-
// ── (2) by-id read → same typed shape ──
|
|
109
|
-
final byIdRows = await harness.bridge.queryById(siteId);
|
|
110
|
-
expect(byIdRows, hasLength(1));
|
|
111
|
-
final fromById = Site.fromJson(
|
|
112
|
-
(byIdRows.first['data'] as Map).cast<String, dynamic>(),
|
|
113
|
-
(byIdRows.first['id'] ?? '').toString());
|
|
114
|
-
expect(fromById.location!.point!.coordinates, [-1.55, 53.8]);
|
|
115
|
-
expect(fromById.rooms['atrium']!.point!.coordinates, [-1.5, 53.79]);
|
|
116
|
-
|
|
117
|
-
// ── (3) watch stream → typed rows, identical decode ──
|
|
118
|
-
final watched = await harness.bridge
|
|
119
|
-
.watchById(siteId)
|
|
120
|
-
.map((rows) => rows
|
|
121
|
-
.map((r) => Site.fromJson(
|
|
122
|
-
(r['data'] as Map).cast<String, dynamic>(),
|
|
123
|
-
(r['id'] ?? '').toString()))
|
|
124
|
-
.toList())
|
|
125
|
-
.firstWhere((rows) => rows.isNotEmpty);
|
|
126
|
-
expect(watched, hasLength(1));
|
|
127
|
-
final fromWatch = watched.single;
|
|
128
|
-
expect(fromWatch.location!.point!.coordinates, [-1.55, 53.8]);
|
|
129
|
-
expect(fromWatch.rooms['atrium']!.address!.city, 'Leeds');
|
|
130
|
-
}, timeout: const Timeout(Duration(minutes: 2)));
|
|
131
|
-
}
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
// REGRESSION (co2, 0.76 offer-ack decoupling): the generated watch must emit the locally
|
|
2
|
-
// committed projection promptly after an offer's acknowledgement — with NO subsequent bridge op.
|
|
3
|
-
// co2's Flutter AppSim (NodeRunnerTransport → node-entry → realm sessions → watchById → Riverpod)
|
|
4
|
-
// saw the post-offer tick NEVER arrive after upgrading to @githolon/client 0.76 / nomos_client 0.52.
|
|
5
|
-
@TestOn('vm')
|
|
6
|
-
library;
|
|
7
|
-
|
|
8
|
-
import 'dart:async';
|
|
9
|
-
import 'dart:io';
|
|
10
|
-
|
|
11
|
-
import 'package:nomos_client/src/nms_conformance_runtime.dart';
|
|
12
|
-
import 'package:test/test.dart';
|
|
13
|
-
|
|
14
|
-
String get _root => '${Directory.current.path}/../..';
|
|
15
|
-
String get _repoEntry => '$_root/cloud/web-client/runner/node-entry.ts';
|
|
16
|
-
String get _gbDeploy => '$_root/examples/guestbook/build/guestbook.law.usdz';
|
|
17
|
-
String get _runtimeDir =>
|
|
18
|
-
Platform.environment['NOMOS_DART_RUNTIME'] ??
|
|
19
|
-
Platform.environment['NOMOS_OFFLINE_RUNTIME'] ??
|
|
20
|
-
'${Platform.environment['HOME'] ?? ''}/.holon/runtime';
|
|
21
|
-
|
|
22
|
-
String? _missingPrereq() {
|
|
23
|
-
if (!File(_repoEntry).existsSync()) return 'in-repo runner not found at $_repoEntry';
|
|
24
|
-
if (!File(_gbDeploy).existsSync()) {
|
|
25
|
-
return 'missing $_gbDeploy — compile it (cd examples/guestbook && npx nomos-compile)';
|
|
26
|
-
}
|
|
27
|
-
if (!File('$_runtimeDir/holon-testmint.wasm').existsSync() ||
|
|
28
|
-
!File('$_runtimeDir/bootstrap.law.usdz').existsSync() ||
|
|
29
|
-
!File('$_runtimeDir/nomos.law.usdz').existsSync()) {
|
|
30
|
-
return 'warm ~/.holon/runtime first (run any `githolon` command once)';
|
|
31
|
-
}
|
|
32
|
-
return null;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
void main() {
|
|
36
|
-
test('watch emits the post-offer projection under COMPLETE SILENCE (no follow-up ops)',
|
|
37
|
-
timeout: const Timeout(Duration(minutes: 4)), () async {
|
|
38
|
-
final missing = _missingPrereq();
|
|
39
|
-
if (missing != null) {
|
|
40
|
-
// ignore: avoid_print
|
|
41
|
-
print('SKIP: $missing');
|
|
42
|
-
return;
|
|
43
|
-
}
|
|
44
|
-
final harness = await NomosTestHarness.ephemeral(
|
|
45
|
-
lawUsdzPaths: [_gbDeploy],
|
|
46
|
-
workspace: 'stall-ws',
|
|
47
|
-
nodeEntry: _repoEntry,
|
|
48
|
-
resolveFrom: '$_root/cloud/web-client',
|
|
49
|
-
runtimeDir: _runtimeDir,
|
|
50
|
-
onDiagnostic: (l) {}, // keep output small
|
|
51
|
-
);
|
|
52
|
-
addTearDown(harness.dispose);
|
|
53
|
-
final s = harness.bridge;
|
|
54
|
-
|
|
55
|
-
// 1. create one entry, find its id.
|
|
56
|
-
await s.offerDirective(
|
|
57
|
-
domain: 'guestbook',
|
|
58
|
-
directiveId: 'signGuestbook',
|
|
59
|
-
payload: {
|
|
60
|
-
'author': 'ada',
|
|
61
|
-
'message': 'hi',
|
|
62
|
-
'mood': 'delighted',
|
|
63
|
-
'signedAt': DateTime.now().toUtc().toIso8601String(),
|
|
64
|
-
});
|
|
65
|
-
final rows = await s.query('entriesByAuthor', {'author': 'ada'});
|
|
66
|
-
expect(rows.length, 1);
|
|
67
|
-
final id = (rows.first as Map)['id'] as String;
|
|
68
|
-
|
|
69
|
-
// 2. subscribe (the app's watchById lane) and wait for the initial tick.
|
|
70
|
-
final ticks = <List<dynamic>>[];
|
|
71
|
-
final gotInitial = Completer<void>();
|
|
72
|
-
final gotMutated = Completer<void>();
|
|
73
|
-
final sub = s.watchById(id).listen((r) {
|
|
74
|
-
ticks.add(r);
|
|
75
|
-
if (!gotInitial.isCompleted) {
|
|
76
|
-
gotInitial.complete();
|
|
77
|
-
return;
|
|
78
|
-
}
|
|
79
|
-
final tags = ((r.first as Map)['data'] as Map)['tags'];
|
|
80
|
-
if (tags is List && tags.contains('t-after') && !gotMutated.isCompleted) {
|
|
81
|
-
gotMutated.complete();
|
|
82
|
-
}
|
|
83
|
-
});
|
|
84
|
-
addTearDown(sub.cancel);
|
|
85
|
-
await gotInitial.future.timeout(const Duration(seconds: 20),
|
|
86
|
-
onTimeout: () => throw StateError('initial watch tick never arrived'));
|
|
87
|
-
|
|
88
|
-
// 3. THE TEST — mutate the watched row, then COMPLETE SILENCE: no further bridge ops.
|
|
89
|
-
// The post-ack deferred nudge (0.76) must still deliver the tick.
|
|
90
|
-
await s.offerDirective(
|
|
91
|
-
domain: 'guestbook',
|
|
92
|
-
directiveId: 'tagEntry',
|
|
93
|
-
payload: {'entryId': id, 'tags': ['t-after']});
|
|
94
|
-
await gotMutated.future.timeout(const Duration(seconds: 8), onTimeout: () {
|
|
95
|
-
throw StateError(
|
|
96
|
-
'REGRESSION: the post-offer watch tick never arrived under silence '
|
|
97
|
-
'(ticks seen: ${ticks.length})');
|
|
98
|
-
});
|
|
99
|
-
});
|
|
100
|
-
}
|