@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.
Files changed (307) 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 +76 -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 +211 -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 +267 -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 +23905 -15774
  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 +548 -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_span_trace_test.dart +23 -0
  74. package/dart/test/replica_readiness_test.dart +156 -0
  75. package/dart/test/runtime_projections_test.dart +92 -0
  76. package/dart/test/runtime_v2_gateway_test.dart +131 -0
  77. package/dart/test/signing_identity_kernel_test.dart +75 -0
  78. package/dart/test/sync_status_preparation_report_test.dart +29 -0
  79. package/dart/test/sync_status_reducer_test.dart +419 -0
  80. package/dart/test/test_harness_test.dart +71 -95
  81. package/dart/test/typed_query_watch_test.dart +170 -0
  82. package/dart/test/typed_watch_registry_test.dart +249 -0
  83. package/dart_lints/README.md +18 -0
  84. package/dart_lints/lib/nomos_lints.dart +70 -0
  85. package/dart_lints/pubspec.lock +580 -0
  86. package/dart_lints/pubspec.yaml +12 -0
  87. package/dart_lints/test/reference_identity_test.dart +75 -0
  88. package/dart_types/CHANGELOG.md +18 -0
  89. package/dart_types/lib/nomos_kernel_protocol.dart +21 -1
  90. package/dart_types/lib/nomos_types.dart +9 -1
  91. package/dart_types/lib/src/admission_decision.dart +37 -0
  92. package/dart_types/lib/src/aggregate_meta.dart +1 -1
  93. package/dart_types/lib/src/approved_model.dart +65 -0
  94. package/dart_types/lib/src/custody.dart +10 -18
  95. package/dart_types/lib/src/error_info.dart +4 -4
  96. package/dart_types/lib/src/errors.dart +29 -29
  97. package/dart_types/lib/src/foreign_ref.dart +62 -33
  98. package/dart_types/lib/src/local_work_rejected.dart +3 -3
  99. package/dart_types/lib/src/nomos_ref.dart +3 -1
  100. package/dart_types/lib/src/principal.dart +2 -2
  101. package/dart_types/lib/src/proto/google/protobuf/any.pb.dart +163 -0
  102. package/dart_types/lib/src/proto/google/protobuf/any.pbenum.dart +11 -0
  103. package/dart_types/lib/src/proto/nomos/discovery/v1/workspace_placement.pb.dart +137 -0
  104. package/dart_types/lib/src/proto/nomos/discovery/v1/workspace_placement.pbenum.dart +11 -0
  105. package/dart_types/lib/src/proto/nomos/kernel/v1/kernel.pb.dart +20721 -10433
  106. package/dart_types/lib/src/proto/nomos/kernel/v1/kernel.pbenum.dart +555 -27
  107. package/dart_types/lib/src/proto/nomos/runtime/v2/application_desk.pb.dart +387 -0
  108. package/dart_types/lib/src/proto/nomos/runtime/v2/application_desk.pbenum.dart +46 -0
  109. package/dart_types/lib/src/proto/nomos/runtime/v2/application_readiness_desk.pb.dart +295 -0
  110. package/dart_types/lib/src/proto/nomos/runtime/v2/application_readiness_desk.pbenum.dart +139 -0
  111. package/dart_types/lib/src/proto/nomos/runtime/v2/authentication_desk.pb.dart +269 -0
  112. package/dart_types/lib/src/proto/nomos/runtime/v2/authentication_desk.pbenum.dart +103 -0
  113. package/dart_types/lib/src/proto/nomos/runtime/v2/compatibility_desk.pb.dart +417 -0
  114. package/dart_types/lib/src/proto/nomos/runtime/v2/compatibility_desk.pbenum.dart +62 -0
  115. package/dart_types/lib/src/proto/nomos/runtime/v2/correspondence_desk.pb.dart +9968 -0
  116. package/dart_types/lib/src/proto/nomos/runtime/v2/correspondence_desk.pbenum.dart +133 -0
  117. package/dart_types/lib/src/proto/nomos/runtime/v2/credentials_desk.pb.dart +204 -0
  118. package/dart_types/lib/src/proto/nomos/runtime/v2/credentials_desk.pbenum.dart +54 -0
  119. package/dart_types/lib/src/proto/nomos/runtime/v2/custody_desk.pb.dart +1550 -0
  120. package/dart_types/lib/src/proto/nomos/runtime/v2/custody_desk.pbenum.dart +11 -0
  121. package/dart_types/lib/src/proto/nomos/runtime/v2/framework.pb.dart +710 -0
  122. package/dart_types/lib/src/proto/nomos/runtime/v2/framework.pbenum.dart +11 -0
  123. package/dart_types/lib/src/proto/nomos/runtime/v2/identity_desk.pb.dart +845 -0
  124. package/dart_types/lib/src/proto/nomos/runtime/v2/identity_desk.pbenum.dart +11 -0
  125. package/dart_types/lib/src/proto/nomos/runtime/v2/interaction_desk.pb.dart +198 -0
  126. package/dart_types/lib/src/proto/nomos/runtime/v2/interaction_desk.pbenum.dart +11 -0
  127. package/dart_types/lib/src/proto/nomos/runtime/v2/law_desk.pb.dart +369 -0
  128. package/dart_types/lib/src/proto/nomos/runtime/v2/law_desk.pbenum.dart +11 -0
  129. package/dart_types/lib/src/proto/nomos/runtime/v2/maintenance_desk.pb.dart +609 -0
  130. package/dart_types/lib/src/proto/nomos/runtime/v2/maintenance_desk.pbenum.dart +65 -0
  131. package/dart_types/lib/src/proto/nomos/runtime/v2/model_adoption_desk.pb.dart +358 -0
  132. package/dart_types/lib/src/proto/nomos/runtime/v2/model_adoption_desk.pbenum.dart +100 -0
  133. package/dart_types/lib/src/proto/nomos/runtime/v2/observability_desk.pb.dart +2231 -0
  134. package/dart_types/lib/src/proto/nomos/runtime/v2/observability_desk.pbenum.dart +271 -0
  135. package/dart_types/lib/src/proto/nomos/runtime/v2/placement_desk.pb.dart +1286 -0
  136. package/dart_types/lib/src/proto/nomos/runtime/v2/placement_desk.pbenum.dart +11 -0
  137. package/dart_types/lib/src/proto/nomos/runtime/v2/receiving_group_desk.pb.dart +636 -0
  138. package/dart_types/lib/src/proto/nomos/runtime/v2/receiving_group_desk.pbenum.dart +116 -0
  139. package/dart_types/lib/src/proto/nomos/runtime/v2/records_desk.pb.dart +1637 -0
  140. package/dart_types/lib/src/proto/nomos/runtime/v2/records_desk.pbenum.dart +175 -0
  141. package/dart_types/lib/src/proto/nomos/runtime/v2/recovery_desk.pb.dart +1269 -0
  142. package/dart_types/lib/src/proto/nomos/runtime/v2/recovery_desk.pbenum.dart +129 -0
  143. package/dart_types/lib/src/proto/nomos/runtime/v2/residency_desk.pb.dart +2782 -0
  144. package/dart_types/lib/src/proto/nomos/runtime/v2/residency_desk.pbenum.dart +97 -0
  145. package/dart_types/lib/src/proto/nomos/runtime/v2/runtime.pb.dart +2232 -8627
  146. package/dart_types/lib/src/proto/nomos/runtime/v2/runtime.pbenum.dart +0 -358
  147. package/dart_types/lib/src/proto/nomos/runtime/v2/sealing_desk.pb.dart +1639 -0
  148. package/dart_types/lib/src/proto/nomos/runtime/v2/sealing_desk.pbenum.dart +46 -0
  149. package/dart_types/lib/src/runtime_outcome.dart +133 -0
  150. package/dart_types/lib/src/subscriptions.dart +116 -23
  151. package/dart_types/pubspec.yaml +1 -1
  152. package/dart_types/test/extremum_subscriptions_test.dart +40 -0
  153. package/dart_types/test/foreign_ref_resolution_test.dart +75 -0
  154. package/dart_types/test/nomos_ref_address_test.dart +25 -0
  155. package/dart_types/test/ordered_subscriptions_test.dart +34 -0
  156. package/operation_contract_check.mjs +24 -0
  157. package/package.json +11 -6
  158. package/src/aggregate.ts +70 -10
  159. package/src/application_topology.ts +18 -11
  160. package/src/attested.ts +3 -0
  161. package/src/attested_core.ts +46 -3
  162. package/src/birth_meter_ensure.ts +19 -7
  163. package/src/births.ts +29 -4
  164. package/src/build_package.ts +140 -13
  165. package/src/business_birth.ts +181 -4
  166. package/src/codegen_call_proto.ts +1274 -0
  167. package/src/codegen_call_usda.ts +49 -6
  168. package/src/codegen_dart.ts +79 -44
  169. package/src/codegen_dart_client.ts +458 -800
  170. package/src/{codegen_dart_application.ts → codegen_dart_facade.ts} +331 -582
  171. package/src/codegen_dart_framework_calls.ts +320 -37
  172. package/src/codegen_dart_indexed_variant.ts +159 -0
  173. package/src/codegen_dart_scenario.ts +42 -13
  174. package/src/codegen_proof.ts +3 -3
  175. package/src/codegen_provider_dart.ts +5 -0
  176. package/src/codegen_query_proto.ts +158 -0
  177. package/src/codegen_refusal.ts +189 -0
  178. package/src/codegen_result_proto.ts +931 -0
  179. package/src/codegen_result_usda.ts +4 -0
  180. package/src/codegen_ts.ts +464 -616
  181. package/src/codegen_workspace_access.ts +105 -0
  182. package/src/compatibility_graph.ts +759 -0
  183. package/src/compatibility_usda.ts +264 -0
  184. package/src/compile_package_main.ts +1994 -1189
  185. package/src/custody_placement.ts +156 -0
  186. package/src/custody_placement_usda.ts +91 -0
  187. package/src/decl_shapes.ts +21 -2
  188. package/src/describe_model.ts +1 -0
  189. package/src/directive.ts +59 -2
  190. package/src/drivers.ts +51 -0
  191. package/src/engine_entry.ts +52 -8
  192. package/src/evolve_preview.ts +11 -4
  193. package/src/exists.ts +2 -0
  194. package/src/fields.ts +75 -11
  195. package/src/flow_gate.ts +2 -1
  196. package/src/framework/application_home.ts +170 -18
  197. package/src/framework/attested_receipts.ts +8 -3
  198. package/src/framework/auth_provider_law.ts +169 -9
  199. package/src/framework/birth_certificate_law.ts +4 -0
  200. package/src/framework/capability.ts +34 -3
  201. package/src/framework/child_authentication.ts +346 -0
  202. package/src/framework/console_governance.ts +295 -0
  203. package/src/framework/delegated_roles.ts +301 -0
  204. package/src/framework/domain_lifecycle.ts +26 -13
  205. package/src/framework/founding_genesis.ts +193 -0
  206. package/src/framework/framework_aggregates.ts +1 -1
  207. package/src/framework/genesis.ts +6 -1
  208. package/src/framework/governance_relations.ts +19 -0
  209. package/src/framework/home.ts +5 -734
  210. package/src/framework/legacy/child_auth_provider_epoch.ts +73 -0
  211. package/src/framework/model_authority_repair.ts +116 -0
  212. package/src/framework/model_authority_seed.ts +185 -0
  213. package/src/framework/model_transition.ts +211 -0
  214. package/src/framework/owned_custody.ts +1 -1
  215. package/src/framework/principal_enrollment.ts +302 -0
  216. package/src/framework/receiving_group.ts +857 -0
  217. package/src/framework/receiving_group_recovery.ts +314 -0
  218. package/src/framework/relations.ts +4 -8
  219. package/src/framework/signing_identity.ts +242 -95
  220. package/src/framework/source_roster.ts +11 -5
  221. package/src/framework/workspace_access.ts +149 -0
  222. package/src/framework/workspace_invariant.ts +73 -52
  223. package/src/framework/workspaces.ts +407 -40
  224. package/src/framework_call_definitions.ts +32 -3
  225. package/src/generated_client_bundle_boundary.ts +97 -0
  226. package/src/generated_client_names.ts +1 -0
  227. package/src/identity_usda.ts +27 -0
  228. package/src/index.ts +183 -12
  229. package/src/indexed_variant.ts +83 -0
  230. package/src/intent.ts +173 -45
  231. package/src/law_check.ts +8 -5
  232. package/src/law_dependency_index.ts +231 -0
  233. package/src/law_graph.ts +508 -71
  234. package/src/law_graph_usda.ts +170 -24
  235. package/src/law_identity.ts +119 -81
  236. package/src/law_source_map.ts +4 -1
  237. package/src/law_units.ts +498 -0
  238. package/src/law_value_type.ts +7 -3
  239. package/src/member_authentication.ts +302 -0
  240. package/src/null_meta.ts +1 -1
  241. package/src/openusd_compiled_layer.ts +132 -0
  242. package/src/operation_contract_check.ts +31 -0
  243. package/src/ordered_read.ts +2 -1
  244. package/src/package_config.ts +33 -12
  245. package/src/package_dependencies.ts +1 -0
  246. package/src/plan_source_slice.ts +30 -1
  247. package/src/protobuf_field_number.ts +36 -0
  248. package/src/provenance_wire.ts +6 -0
  249. package/src/query.ts +2 -1
  250. package/src/read.ts +50 -0
  251. package/src/relation.ts +4 -1
  252. package/src/relation_schema.ts +15 -2
  253. package/src/report.ts +2 -2
  254. package/src/sqlite_computation_bundle.ts +78 -0
  255. package/src/sqlite_computed.ts +102 -0
  256. package/src/sqlite_counts.ts +154 -0
  257. package/src/sqlite_layout.ts +823 -0
  258. package/src/sqlite_reads.ts +275 -0
  259. package/src/sqlite_samples.ts +185 -0
  260. package/src/stable_id_identity_bridge.ts +1 -1
  261. package/src/stable_ids_for_module.ts +16 -4
  262. package/src/test_call_usda.ts +6 -6
  263. package/src/usda_relationship_integrity.ts +20 -3
  264. package/src/usda_text.ts +21 -1
  265. package/src/value_object.ts +81 -11
  266. package/src/wire.ts +22 -0
  267. package/src/wire_encode.ts +227 -20
  268. package/src/workspace_sharding.ts +15 -6
  269. package/src/workspace_sharing.ts +51 -49
  270. package/src/zod_introspection.ts +2 -0
  271. package/compat_package.mjs +0 -46
  272. package/dart/lib/src/home.dart +0 -15
  273. package/dart/lib/src/runner/offline-install.mjs +0 -15367
  274. package/dart/lib/src/source_trust.dart +0 -51
  275. package/dart/lib/src/webview_bridge.dart +0 -6540
  276. package/dart/lib/src/workspace_name.dart +0 -30
  277. package/dart/test/acquire_session_credentials_test.dart +0 -150
  278. package/dart/test/acquire_session_test.dart +0 -534
  279. package/dart/test/adv_realm_interference_test.dart +0 -600
  280. package/dart/test/cloud_bound_topology_test.dart +0 -168
  281. package/dart/test/cluster_births_test.dart +0 -202
  282. package/dart/test/cluster_device_keyed_acceptance_test.dart +0 -105
  283. package/dart/test/cluster_local_autosync_test.dart +0 -123
  284. package/dart/test/cluster_scale_test.dart +0 -122
  285. package/dart/test/compat_test.dart +0 -61
  286. package/dart/test/dlq_session_surface_test.dart +0 -222
  287. package/dart/test/first_app_gauntlet_test.dart +0 -386
  288. package/dart/test/fixtures/wedge/fake-install.mjs +0 -11
  289. package/dart/test/four_layer_nested_topology_test.dart +0 -290
  290. package/dart/test/home_parity_test.dart +0 -13
  291. package/dart/test/local_sync_inert_test.dart +0 -107
  292. package/dart/test/node_runner_transport_test.dart +0 -78
  293. package/dart/test/parent_signer_recovery_test.dart +0 -155
  294. package/dart/test/residency_refusal_test.dart +0 -49
  295. package/dart/test/sealing_client_test.dart +0 -181
  296. package/dart/test/session_bound_test.dart +0 -285
  297. package/dart/test/stale_bundle_test.dart +0 -80
  298. package/dart/test/vo_read_typing_test.dart +0 -131
  299. package/dart/test/watch_after_offer_stall_test.dart +0 -100
  300. package/dart/test/webview_bridge_test.dart +0 -1930
  301. package/dart/test/workspace_name_test.dart +0 -24
  302. package/runtime/generated-application-host.js +0 -22860
  303. package/src/codegen_query_usda.ts +0 -214
  304. package/src/compat_manifest.ts +0 -26
  305. package/src/compat_package_main.ts +0 -224
  306. package/src/shape_compat.ts +0 -352
  307. package/src/usd_state.ts +0 -505
@@ -1,188 +1,74 @@
1
- // THE EVENT-PLANE TRIPWIRE (source-level, no mirrors).
1
+ // Reception state-ownership tripwire (source-level, no mirrors).
2
2
  //
3
- // THE BUG CLASS THIS CLOSES: NomosSession extends NomosBridge but shares the parent's transport —
4
- // _onMessage only ever runs on the PARENT, so any Stream-returning member (or stateful snapshot) that
5
- // touches `this`'s controller registries registers on a session's DEAD registry and never emits
6
- // (shipped instances: watchPendingConflicts pre-0.48.1 + the five hand-written session watch overrides).
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
- /// Extract `class <name> ... { ... }`'s body via brace matching.
30
- String classBody(String src, String name) {
31
- final decl = RegExp('class $name[\\s<]').firstMatch(src);
32
- if (decl == null) fail('class $name not found');
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 i = open; i < src.length; i++) {
36
- final c = src[i];
37
- if (c == '{') depth++;
38
- if (c == '}') {
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 src.substring(open + 1, i);
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 src = File('lib/src/webview_bridge.dart').readAsStringSync();
105
- final bridge = classBody(src, 'NomosBridge');
106
- final session = classBody(src, 'NomosSession');
107
- final bridgeStreams = streamMembers(bridge);
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
- test('every NomosBridge Stream member routes through the _eventPlane seam',
126
- () {
127
- for (final m in bridgeStreams) {
128
- final routed = m.body.contains('_eventPlane') ||
129
- RegExp(r'\b_watchStream\(').hasMatch(m.body);
130
- expect(routed, isTrue,
131
- reason: 'NomosBridge.${m.name} returns a Stream but its body '
132
- 'references neither _eventPlane nor _watchStream — on a '
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('controller registries are only indexed via the seam in Stream members',
149
- () {
150
- for (final m in bridgeStreams) {
151
- for (final reg in ['_watches[', '_compatWatches[']) {
152
- var from = 0;
153
- while (true) {
154
- final at = m.body.indexOf(reg, from);
155
- if (at < 0) break;
156
- from = at + reg.length;
157
- final prefix =
158
- m.body.substring(at < 12 ? 0 : at - 12, at);
159
- expect(prefix, endsWith('_eventPlane.'),
160
- reason: 'NomosBridge.${m.name} indexes $reg without the '
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 declares no Stream members and no controller state', () {
169
- final sessionStreams = streamMembers(session);
170
- expect(sessionStreams, isEmpty,
171
- reason: 'NomosSession re-declares Stream member(s) '
172
- '${sessionStreams.map((m) => m.name).toList()} — the per-method '
173
- 'override was the WORKAROUND for the dead-registry bug, not the '
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 plane', () {
67
+ test('the session event-plane seam chases to the root', () {
181
68
  expect(
182
- RegExp(r'NomosBridge get _eventPlane => parent\._eventPlane;')
183
- .hasMatch(session),
184
- isTrue,
185
- reason: 'NomosSession._eventPlane must be parent._eventPlane (not '
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 WEDGING FAKE RUNNER for the hermetic HARNESS PHASE-TIMEOUT tests: speaks the NDJSON bridge protocol,
3
- // answers everything — EXCEPT the op named in NOMOS_WEDGE_OP (optionally only when the args carry an
4
- // authorSecret, i.e. the 3b keyed reconnect), which it swallows FOREVER. This forges the exact "silent
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 runner (test/fixtures/wedge/wedge-entry.mjs) speaks the bridge protocol but
3
- // SWALLOWS the 3b keyed reconnect forever — the exact wedge co2 reported. With a short `phaseTimeout` the
4
- // harness must throw the TYPED [HarnessPhaseTimeout] naming the phase/workspace/op, never hang; and the
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 wedged keyed reconnect fires HarnessPhaseTimeout naming phase 3b (typed, no hang)', () async {
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'], // the fake install helper ignores the paths
24
+ 'catalogue': ['unused.law.usdz'],
27
25
  },
28
- deviceKeyed: {'catalogue'},
29
26
  nodeEntry: _wedgeEntry,
30
- installHelper: _fakeInstall,
31
- phaseTimeout: const Duration(seconds: 2), // hermetic: a short deadline, not a real 120s wait
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: 'the wedge must surface as the typed phase timeout, never an eternal await');
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, "3b: keyed reconnect of 'catalogue'");
41
- expect(t.workspace, 'catalogue');
42
- expect(t.awaiting, 'connect');
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("3b: keyed reconnect of 'catalogue'"));
48
- // ask 5 — the phases before the wedge logged enter AND exit; the wedged phase logged its enter.
49
- expect(log.any((l) => l.contains('3: connect session') && l.contains('done')), isTrue);
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)', () async {
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: _wedgeEntry,
63
- installHelper: _fakeInstall,
58
+ nodeEntry: '/unused-because-validation-is-pure',
64
59
  phaseTimeout: const Duration(seconds: 5),
65
60
  );
66
61
  } catch (e) {