@githolon/dsl 0.108.7 → 0.110.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (308) hide show
  1. package/assets/operation-contract.wasm +0 -0
  2. package/check_package.mjs +12 -15
  3. package/compile_package.mjs +17 -18
  4. package/compile_proof.mjs +16 -1
  5. package/dart/CHANGELOG.md +80 -1
  6. package/dart/README.md +25 -2
  7. package/dart/lib/src/admission_decision.dart +41 -0
  8. package/dart/lib/src/application_framework_calls.dart +52 -2
  9. package/dart/lib/src/application_model_adoption.dart +187 -0
  10. package/dart/lib/src/application_status.dart +73 -0
  11. package/dart/lib/src/console_enrolment.dart +271 -0
  12. package/dart/lib/src/console_http_io.dart +26 -0
  13. package/dart/lib/src/console_http_stub.dart +7 -0
  14. package/dart/lib/src/dev_cloud.dart +69 -22
  15. package/dart/lib/src/generated_call.dart +83 -23
  16. package/dart/lib/src/kernel_primitives.dart +119 -0
  17. package/dart/lib/src/nms_conformance_runtime.dart +1 -1
  18. package/dart/lib/src/nms_generated_runtime.dart +32 -10
  19. package/dart/lib/src/nms_test_environment.dart +1 -1
  20. package/dart/lib/src/node_runner_transport.dart +41 -46
  21. package/dart/lib/src/observed_session_directory.dart +70 -0
  22. package/dart/lib/src/operation_receipts.dart +112 -0
  23. package/dart/lib/src/peer_application_streams.dart +103 -0
  24. package/dart/lib/src/reception/dart_reception.dart +4280 -0
  25. package/dart/lib/src/reception/event_desk.dart +214 -0
  26. package/dart/lib/src/reception/extremum_read.dart +46 -0
  27. package/dart/lib/src/reception/local_copies.dart +371 -0
  28. package/dart/lib/src/reception/peer_office_connection.dart +11 -0
  29. package/dart/lib/src/reception/progress_desk.dart +268 -0
  30. package/dart/lib/src/reception/reception_contract.dart +11 -0
  31. package/dart/lib/src/reception/reception_session.dart +284 -0
  32. package/dart/lib/src/reception/sync_diagnostics.dart +26 -0
  33. package/dart/lib/src/reception/workspace_preparation_report.dart +126 -0
  34. package/dart/lib/src/replica_readiness.dart +123 -0
  35. package/dart/lib/src/runner/node-entry.mjs +23950 -15776
  36. package/dart/lib/src/runtime_v2_gateway.dart +56 -3
  37. package/dart/lib/src/runtime_v2_transport.dart +544 -3
  38. package/dart/lib/src/session_bound.dart +200 -311
  39. package/dart/lib/src/signing_identity_kernel.dart +84 -0
  40. package/dart/lib/src/sync_status_projection.dart +550 -0
  41. package/dart/lib/src/sync_status_reducer.dart +170 -0
  42. package/dart/lib/src/test_harness.dart +809 -1153
  43. package/dart/lib/src/testing/test_custody.dart +66 -0
  44. package/dart/lib/src/testing/test_peer.dart +328 -0
  45. package/dart/lib/src/typed_watch_registry.dart +169 -0
  46. package/dart/lib/src/workspace_open_progress.dart +27 -0
  47. package/dart/pubspec.lock +24 -1
  48. package/dart/pubspec.yaml +7 -2
  49. package/dart/pubspec_overrides.yaml +2 -0
  50. package/dart/test/admission_decision_test.dart +48 -0
  51. package/dart/test/background_model_adoption_test.dart +228 -0
  52. package/dart/test/bundle_version_pairing_test.dart +4 -4
  53. package/dart/test/child_authentication_repair_test.dart +359 -0
  54. package/dart/test/cloud_bound_local_shell_test.dart +119 -0
  55. package/dart/test/console_enrolment_refusal_test.dart +52 -0
  56. package/dart/test/console_enrolment_test.dart +227 -0
  57. package/dart/test/errors_test.dart +5 -5
  58. package/dart/test/event_plane_seam_test.dart +50 -164
  59. package/dart/test/extremum_read_test.dart +58 -0
  60. package/dart/test/fixtures/wedge/wedge-entry.mjs +3 -21
  61. package/dart/test/generated_query_test.dart +32 -0
  62. package/dart/test/harness_phase_timeout_test.dart +18 -23
  63. package/dart/test/kernel_author_after_read_test.dart +242 -0
  64. package/dart/test/kernel_fence_test.dart +137 -0
  65. package/dart/test/local_copies_test.dart +222 -0
  66. package/dart/test/model_adoption_test.dart +198 -0
  67. package/dart/test/node_peer_local_custody_test.dart +153 -0
  68. package/dart/test/offer_authentication_proof_test.dart +352 -52
  69. package/dart/test/operation_compatibility_test.dart +151 -0
  70. package/dart/test/platform_credential_effect_test.dart +386 -0
  71. package/dart/test/receiving_group_open_test.dart +213 -0
  72. package/dart/test/reception/workspace_preparation_report_test.dart +103 -0
  73. package/dart/test/reception_event_desk_close_test.dart +16 -0
  74. package/dart/test/reception_span_trace_test.dart +23 -0
  75. package/dart/test/replica_readiness_test.dart +156 -0
  76. package/dart/test/runtime_projections_test.dart +92 -0
  77. package/dart/test/runtime_v2_gateway_test.dart +131 -0
  78. package/dart/test/signing_identity_kernel_test.dart +75 -0
  79. package/dart/test/sync_status_preparation_report_test.dart +29 -0
  80. package/dart/test/sync_status_reducer_test.dart +419 -0
  81. package/dart/test/test_harness_test.dart +71 -95
  82. package/dart/test/typed_query_watch_test.dart +170 -0
  83. package/dart/test/typed_watch_registry_test.dart +249 -0
  84. package/dart_lints/README.md +18 -0
  85. package/dart_lints/lib/nomos_lints.dart +70 -0
  86. package/dart_lints/pubspec.lock +580 -0
  87. package/dart_lints/pubspec.yaml +12 -0
  88. package/dart_lints/test/reference_identity_test.dart +75 -0
  89. package/dart_types/CHANGELOG.md +18 -0
  90. package/dart_types/lib/nomos_kernel_protocol.dart +21 -1
  91. package/dart_types/lib/nomos_types.dart +9 -1
  92. package/dart_types/lib/src/admission_decision.dart +37 -0
  93. package/dart_types/lib/src/aggregate_meta.dart +1 -1
  94. package/dart_types/lib/src/approved_model.dart +65 -0
  95. package/dart_types/lib/src/custody.dart +10 -18
  96. package/dart_types/lib/src/error_info.dart +4 -4
  97. package/dart_types/lib/src/errors.dart +29 -29
  98. package/dart_types/lib/src/foreign_ref.dart +62 -33
  99. package/dart_types/lib/src/local_work_rejected.dart +3 -3
  100. package/dart_types/lib/src/nomos_ref.dart +3 -1
  101. package/dart_types/lib/src/principal.dart +2 -2
  102. package/dart_types/lib/src/proto/google/protobuf/any.pb.dart +163 -0
  103. package/dart_types/lib/src/proto/google/protobuf/any.pbenum.dart +11 -0
  104. package/dart_types/lib/src/proto/nomos/discovery/v1/workspace_placement.pb.dart +137 -0
  105. package/dart_types/lib/src/proto/nomos/discovery/v1/workspace_placement.pbenum.dart +11 -0
  106. package/dart_types/lib/src/proto/nomos/kernel/v1/kernel.pb.dart +20721 -10433
  107. package/dart_types/lib/src/proto/nomos/kernel/v1/kernel.pbenum.dart +555 -27
  108. package/dart_types/lib/src/proto/nomos/runtime/v2/application_desk.pb.dart +387 -0
  109. package/dart_types/lib/src/proto/nomos/runtime/v2/application_desk.pbenum.dart +46 -0
  110. package/dart_types/lib/src/proto/nomos/runtime/v2/application_readiness_desk.pb.dart +295 -0
  111. package/dart_types/lib/src/proto/nomos/runtime/v2/application_readiness_desk.pbenum.dart +139 -0
  112. package/dart_types/lib/src/proto/nomos/runtime/v2/authentication_desk.pb.dart +269 -0
  113. package/dart_types/lib/src/proto/nomos/runtime/v2/authentication_desk.pbenum.dart +103 -0
  114. package/dart_types/lib/src/proto/nomos/runtime/v2/compatibility_desk.pb.dart +417 -0
  115. package/dart_types/lib/src/proto/nomos/runtime/v2/compatibility_desk.pbenum.dart +62 -0
  116. package/dart_types/lib/src/proto/nomos/runtime/v2/correspondence_desk.pb.dart +9968 -0
  117. package/dart_types/lib/src/proto/nomos/runtime/v2/correspondence_desk.pbenum.dart +133 -0
  118. package/dart_types/lib/src/proto/nomos/runtime/v2/credentials_desk.pb.dart +204 -0
  119. package/dart_types/lib/src/proto/nomos/runtime/v2/credentials_desk.pbenum.dart +54 -0
  120. package/dart_types/lib/src/proto/nomos/runtime/v2/custody_desk.pb.dart +1550 -0
  121. package/dart_types/lib/src/proto/nomos/runtime/v2/custody_desk.pbenum.dart +11 -0
  122. package/dart_types/lib/src/proto/nomos/runtime/v2/framework.pb.dart +710 -0
  123. package/dart_types/lib/src/proto/nomos/runtime/v2/framework.pbenum.dart +11 -0
  124. package/dart_types/lib/src/proto/nomos/runtime/v2/identity_desk.pb.dart +845 -0
  125. package/dart_types/lib/src/proto/nomos/runtime/v2/identity_desk.pbenum.dart +11 -0
  126. package/dart_types/lib/src/proto/nomos/runtime/v2/interaction_desk.pb.dart +198 -0
  127. package/dart_types/lib/src/proto/nomos/runtime/v2/interaction_desk.pbenum.dart +11 -0
  128. package/dart_types/lib/src/proto/nomos/runtime/v2/law_desk.pb.dart +369 -0
  129. package/dart_types/lib/src/proto/nomos/runtime/v2/law_desk.pbenum.dart +11 -0
  130. package/dart_types/lib/src/proto/nomos/runtime/v2/maintenance_desk.pb.dart +609 -0
  131. package/dart_types/lib/src/proto/nomos/runtime/v2/maintenance_desk.pbenum.dart +65 -0
  132. package/dart_types/lib/src/proto/nomos/runtime/v2/model_adoption_desk.pb.dart +358 -0
  133. package/dart_types/lib/src/proto/nomos/runtime/v2/model_adoption_desk.pbenum.dart +100 -0
  134. package/dart_types/lib/src/proto/nomos/runtime/v2/observability_desk.pb.dart +2231 -0
  135. package/dart_types/lib/src/proto/nomos/runtime/v2/observability_desk.pbenum.dart +271 -0
  136. package/dart_types/lib/src/proto/nomos/runtime/v2/placement_desk.pb.dart +1286 -0
  137. package/dart_types/lib/src/proto/nomos/runtime/v2/placement_desk.pbenum.dart +11 -0
  138. package/dart_types/lib/src/proto/nomos/runtime/v2/receiving_group_desk.pb.dart +636 -0
  139. package/dart_types/lib/src/proto/nomos/runtime/v2/receiving_group_desk.pbenum.dart +116 -0
  140. package/dart_types/lib/src/proto/nomos/runtime/v2/records_desk.pb.dart +1637 -0
  141. package/dart_types/lib/src/proto/nomos/runtime/v2/records_desk.pbenum.dart +175 -0
  142. package/dart_types/lib/src/proto/nomos/runtime/v2/recovery_desk.pb.dart +1269 -0
  143. package/dart_types/lib/src/proto/nomos/runtime/v2/recovery_desk.pbenum.dart +129 -0
  144. package/dart_types/lib/src/proto/nomos/runtime/v2/residency_desk.pb.dart +2782 -0
  145. package/dart_types/lib/src/proto/nomos/runtime/v2/residency_desk.pbenum.dart +97 -0
  146. package/dart_types/lib/src/proto/nomos/runtime/v2/runtime.pb.dart +2232 -8627
  147. package/dart_types/lib/src/proto/nomos/runtime/v2/runtime.pbenum.dart +0 -358
  148. package/dart_types/lib/src/proto/nomos/runtime/v2/sealing_desk.pb.dart +1639 -0
  149. package/dart_types/lib/src/proto/nomos/runtime/v2/sealing_desk.pbenum.dart +46 -0
  150. package/dart_types/lib/src/runtime_outcome.dart +133 -0
  151. package/dart_types/lib/src/subscriptions.dart +116 -23
  152. package/dart_types/pubspec.yaml +1 -1
  153. package/dart_types/test/extremum_subscriptions_test.dart +40 -0
  154. package/dart_types/test/foreign_ref_resolution_test.dart +75 -0
  155. package/dart_types/test/nomos_ref_address_test.dart +25 -0
  156. package/dart_types/test/ordered_subscriptions_test.dart +34 -0
  157. package/operation_contract_check.mjs +24 -0
  158. package/package.json +11 -6
  159. package/src/aggregate.ts +70 -10
  160. package/src/application_topology.ts +18 -11
  161. package/src/attested.ts +3 -0
  162. package/src/attested_core.ts +46 -3
  163. package/src/birth_meter_ensure.ts +19 -7
  164. package/src/births.ts +29 -4
  165. package/src/build_package.ts +140 -13
  166. package/src/business_birth.ts +181 -4
  167. package/src/codegen_call_proto.ts +1276 -0
  168. package/src/codegen_call_usda.ts +49 -6
  169. package/src/codegen_dart.ts +83 -44
  170. package/src/codegen_dart_client.ts +458 -800
  171. package/src/{codegen_dart_application.ts → codegen_dart_facade.ts} +331 -582
  172. package/src/codegen_dart_framework_calls.ts +320 -37
  173. package/src/codegen_dart_indexed_variant.ts +159 -0
  174. package/src/codegen_dart_scenario.ts +42 -13
  175. package/src/codegen_proof.ts +3 -3
  176. package/src/codegen_provider_dart.ts +5 -0
  177. package/src/codegen_query_proto.ts +158 -0
  178. package/src/codegen_refusal.ts +189 -0
  179. package/src/codegen_result_proto.ts +931 -0
  180. package/src/codegen_result_usda.ts +4 -0
  181. package/src/codegen_ts.ts +464 -616
  182. package/src/codegen_workspace_access.ts +105 -0
  183. package/src/compatibility_graph.ts +759 -0
  184. package/src/compatibility_usda.ts +264 -0
  185. package/src/compile_package_main.ts +2017 -1195
  186. package/src/custody_placement.ts +156 -0
  187. package/src/custody_placement_usda.ts +91 -0
  188. package/src/decl_shapes.ts +21 -2
  189. package/src/describe_model.ts +1 -0
  190. package/src/directive.ts +59 -2
  191. package/src/drivers.ts +51 -0
  192. package/src/engine_entry.ts +52 -8
  193. package/src/evolve_preview.ts +11 -4
  194. package/src/exists.ts +2 -0
  195. package/src/fields.ts +75 -11
  196. package/src/flow_gate.ts +2 -1
  197. package/src/framework/application_home.ts +170 -18
  198. package/src/framework/attested_receipts.ts +8 -3
  199. package/src/framework/auth_provider_law.ts +169 -9
  200. package/src/framework/birth_certificate_law.ts +4 -0
  201. package/src/framework/capability.ts +34 -3
  202. package/src/framework/child_authentication.ts +346 -0
  203. package/src/framework/console_governance.ts +295 -0
  204. package/src/framework/delegated_roles.ts +301 -0
  205. package/src/framework/domain_lifecycle.ts +26 -13
  206. package/src/framework/founding_genesis.ts +193 -0
  207. package/src/framework/framework_aggregates.ts +1 -1
  208. package/src/framework/genesis.ts +6 -1
  209. package/src/framework/governance_relations.ts +19 -0
  210. package/src/framework/home.ts +5 -734
  211. package/src/framework/legacy/child_auth_provider_epoch.ts +73 -0
  212. package/src/framework/model_authority_repair.ts +116 -0
  213. package/src/framework/model_authority_seed.ts +185 -0
  214. package/src/framework/model_transition.ts +211 -0
  215. package/src/framework/owned_custody.ts +1 -1
  216. package/src/framework/principal_enrollment.ts +302 -0
  217. package/src/framework/receiving_group.ts +857 -0
  218. package/src/framework/receiving_group_recovery.ts +314 -0
  219. package/src/framework/relations.ts +4 -8
  220. package/src/framework/signing_identity.ts +242 -95
  221. package/src/framework/source_roster.ts +11 -5
  222. package/src/framework/workspace_access.ts +149 -0
  223. package/src/framework/workspace_invariant.ts +73 -52
  224. package/src/framework/workspaces.ts +407 -40
  225. package/src/framework_call_definitions.ts +32 -3
  226. package/src/generated_client_bundle_boundary.ts +97 -0
  227. package/src/generated_client_names.ts +1 -0
  228. package/src/identity_usda.ts +27 -0
  229. package/src/index.ts +183 -12
  230. package/src/indexed_variant.ts +83 -0
  231. package/src/intent.ts +173 -45
  232. package/src/law_check.ts +8 -5
  233. package/src/law_dependency_index.ts +231 -0
  234. package/src/law_graph.ts +508 -71
  235. package/src/law_graph_usda.ts +170 -24
  236. package/src/law_identity.ts +119 -81
  237. package/src/law_source_map.ts +4 -1
  238. package/src/law_units.ts +498 -0
  239. package/src/law_value_type.ts +7 -3
  240. package/src/member_authentication.ts +302 -0
  241. package/src/null_meta.ts +1 -1
  242. package/src/openusd_compiled_layer.ts +132 -0
  243. package/src/operation_contract_check.ts +31 -0
  244. package/src/ordered_read.ts +2 -1
  245. package/src/package_config.ts +33 -12
  246. package/src/package_dependencies.ts +1 -0
  247. package/src/plan_source_slice.ts +30 -1
  248. package/src/protobuf_field_number.ts +36 -0
  249. package/src/provenance_wire.ts +6 -0
  250. package/src/query.ts +2 -1
  251. package/src/read.ts +50 -0
  252. package/src/relation.ts +4 -1
  253. package/src/relation_schema.ts +15 -2
  254. package/src/report.ts +2 -2
  255. package/src/sqlite_computation_bundle.ts +78 -0
  256. package/src/sqlite_computed.ts +102 -0
  257. package/src/sqlite_counts.ts +154 -0
  258. package/src/sqlite_layout.ts +823 -0
  259. package/src/sqlite_reads.ts +275 -0
  260. package/src/sqlite_samples.ts +185 -0
  261. package/src/stable_id_identity_bridge.ts +1 -1
  262. package/src/stable_ids_for_module.ts +16 -4
  263. package/src/test_call_usda.ts +6 -6
  264. package/src/usda_relationship_integrity.ts +20 -3
  265. package/src/usda_text.ts +21 -1
  266. package/src/value_object.ts +81 -11
  267. package/src/wire.ts +22 -0
  268. package/src/wire_encode.ts +227 -20
  269. package/src/workspace_sharding.ts +15 -6
  270. package/src/workspace_sharing.ts +51 -49
  271. package/src/zod_introspection.ts +2 -0
  272. package/compat_package.mjs +0 -46
  273. package/dart/lib/src/home.dart +0 -15
  274. package/dart/lib/src/runner/offline-install.mjs +0 -15367
  275. package/dart/lib/src/source_trust.dart +0 -51
  276. package/dart/lib/src/webview_bridge.dart +0 -6540
  277. package/dart/lib/src/workspace_name.dart +0 -30
  278. package/dart/test/acquire_session_credentials_test.dart +0 -150
  279. package/dart/test/acquire_session_test.dart +0 -534
  280. package/dart/test/adv_realm_interference_test.dart +0 -600
  281. package/dart/test/cloud_bound_topology_test.dart +0 -168
  282. package/dart/test/cluster_births_test.dart +0 -202
  283. package/dart/test/cluster_device_keyed_acceptance_test.dart +0 -105
  284. package/dart/test/cluster_local_autosync_test.dart +0 -123
  285. package/dart/test/cluster_scale_test.dart +0 -122
  286. package/dart/test/compat_test.dart +0 -61
  287. package/dart/test/dlq_session_surface_test.dart +0 -222
  288. package/dart/test/first_app_gauntlet_test.dart +0 -386
  289. package/dart/test/fixtures/wedge/fake-install.mjs +0 -11
  290. package/dart/test/four_layer_nested_topology_test.dart +0 -290
  291. package/dart/test/home_parity_test.dart +0 -13
  292. package/dart/test/local_sync_inert_test.dart +0 -107
  293. package/dart/test/node_runner_transport_test.dart +0 -78
  294. package/dart/test/parent_signer_recovery_test.dart +0 -155
  295. package/dart/test/residency_refusal_test.dart +0 -49
  296. package/dart/test/sealing_client_test.dart +0 -181
  297. package/dart/test/session_bound_test.dart +0 -285
  298. package/dart/test/stale_bundle_test.dart +0 -80
  299. package/dart/test/vo_read_typing_test.dart +0 -131
  300. package/dart/test/watch_after_offer_stall_test.dart +0 -100
  301. package/dart/test/webview_bridge_test.dart +0 -1930
  302. package/dart/test/workspace_name_test.dart +0 -24
  303. package/runtime/generated-application-host.js +0 -22860
  304. package/src/codegen_query_usda.ts +0 -214
  305. package/src/compat_manifest.ts +0 -26
  306. package/src/compat_package_main.ts +0 -224
  307. package/src/shape_compat.ts +0 -352
  308. 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
- }