@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
@@ -0,0 +1,268 @@
1
+ import 'dart:async';
2
+ import 'dart:convert';
3
+ import 'dart:typed_data';
4
+
5
+ import 'package:nomos_types/nomos_kernel_protocol.dart' as nomos_protocol;
6
+
7
+ import '../sync_status_projection.dart' show TransferProgress;
8
+
9
+ /// One typed, authority-free observation of peer work.
10
+ enum NomosSpanPhase { begin, end }
11
+
12
+ final class NomosSpanEvent {
13
+ const NomosSpanEvent({
14
+ required this.phase,
15
+ required this.id,
16
+ required this.name,
17
+ this.traceId,
18
+ this.session,
19
+ this.workspace,
20
+ this.track,
21
+ this.kind,
22
+ this.startedAtMillis,
23
+ this.endedAtMillis,
24
+ this.head,
25
+ this.attempt,
26
+ this.elapsedMillis,
27
+ this.retryAfterMillis,
28
+ this.attributes = const [],
29
+ });
30
+
31
+ factory NomosSpanEvent.fromRuntime(
32
+ nomos_protocol.RuntimeSpan span, {
33
+ String? session,
34
+ }) {
35
+ Object? attribute(String name) {
36
+ for (final value in span.attributes) {
37
+ if (value.name != name) continue;
38
+ return switch (value.whichValue()) {
39
+ nomos_protocol.DiagnosticAttribute_Value.stringValue =>
40
+ value.stringValue,
41
+ nomos_protocol.DiagnosticAttribute_Value.integerValue =>
42
+ value.integerValue.toInt(),
43
+ nomos_protocol.DiagnosticAttribute_Value.doubleValue =>
44
+ value.doubleValue,
45
+ nomos_protocol.DiagnosticAttribute_Value.booleanValue =>
46
+ value.booleanValue,
47
+ nomos_protocol.DiagnosticAttribute_Value.bytesValue =>
48
+ Uint8List.fromList(value.bytesValue),
49
+ nomos_protocol.DiagnosticAttribute_Value.notSet => null,
50
+ };
51
+ }
52
+ return null;
53
+ }
54
+
55
+ String? text(String name) {
56
+ final value = attribute(name);
57
+ return value == null ? null : value.toString();
58
+ }
59
+
60
+ int? integer(String name) {
61
+ final value = attribute(name);
62
+ return value is num
63
+ ? value.toInt()
64
+ : int.tryParse(value?.toString() ?? '');
65
+ }
66
+
67
+ final started = span.startedUnixNanos.toInt() ~/ 1000000;
68
+ final duration = span.durationNanos.toInt() ~/ 1000000;
69
+ return NomosSpanEvent(
70
+ phase: NomosSpanPhase.end,
71
+ id: text('id') ?? base64Url.encode(span.spanId).replaceAll('=', ''),
72
+ name: span.name,
73
+ traceId: span.traceId
74
+ .map((byte) => byte.toRadixString(16).padLeft(2, '0'))
75
+ .join(),
76
+ session: session,
77
+ workspace: text('workspace') ?? session,
78
+ track: text('track'),
79
+ kind: text('kind'),
80
+ startedAtMillis: started,
81
+ endedAtMillis: started + duration,
82
+ head: text('head'),
83
+ attempt: integer('attempt'),
84
+ elapsedMillis: integer('elapsedMs'),
85
+ retryAfterMillis: integer('retryAfterMs'),
86
+ attributes: List.unmodifiable(span.attributes),
87
+ );
88
+ }
89
+
90
+ final NomosSpanPhase phase;
91
+ final String id;
92
+ final String name;
93
+
94
+ /// The peer's causal trace identity. It is metadata, never a custody identity.
95
+ final String? traceId;
96
+ final String? session;
97
+ final String? workspace;
98
+ final String? track;
99
+ final String? kind;
100
+ final int? startedAtMillis;
101
+ final int? endedAtMillis;
102
+ final String? head;
103
+ final int? attempt;
104
+ final int? elapsedMillis;
105
+ final int? retryAfterMillis;
106
+ final List<nomos_protocol.DiagnosticAttribute> attributes;
107
+ }
108
+
109
+ enum KernelProgressOperation { unspecified, restoreMain }
110
+
111
+ enum KernelProgressPhase {
112
+ unspecified,
113
+ checkCustody,
114
+ readChain,
115
+ initializeEngine,
116
+ readTimeline,
117
+ hydrateLaw,
118
+ recoveryPrescan,
119
+ verifyIntents,
120
+ promoteCustody,
121
+ rebuildFrontier,
122
+ complete,
123
+ }
124
+
125
+ enum KernelProgressUnit { unspecified, intent, lawPackage }
126
+
127
+ enum KernelLawHydrationStep {
128
+ unspecified,
129
+ readClosure,
130
+ composeStage,
131
+ deriveSchemas,
132
+ loadPolicyShell,
133
+ packageComplete,
134
+ }
135
+
136
+ /// Typed, authority-free progress from a long-running kernel operation.
137
+ final class KernelProgress {
138
+ const KernelProgress({
139
+ required this.sequence,
140
+ required this.operation,
141
+ required this.phase,
142
+ required this.completed,
143
+ required this.total,
144
+ required this.unit,
145
+ required this.terminal,
146
+ required this.lawHydrationStep,
147
+ required this.lawPackageSha256,
148
+ required this.hostObservedElapsedMicros,
149
+ required this.hostObservedPhaseElapsedMicros,
150
+ required this.kernelAllocatorLiveBytes,
151
+ required this.kernelAllocatorPeakBytes,
152
+ required this.processResidentBytes,
153
+ required this.processPeakResidentBytes,
154
+ });
155
+
156
+ final int sequence;
157
+ final KernelProgressOperation operation;
158
+ final KernelProgressPhase phase;
159
+ final int completed;
160
+ final int total;
161
+ final KernelProgressUnit unit;
162
+ final bool terminal;
163
+ final KernelLawHydrationStep lawHydrationStep;
164
+ final String lawPackageSha256;
165
+ final int hostObservedElapsedMicros;
166
+ final int hostObservedPhaseElapsedMicros;
167
+ final int kernelAllocatorLiveBytes;
168
+ final int kernelAllocatorPeakBytes;
169
+ final int processResidentBytes;
170
+ final int processPeakResidentBytes;
171
+
172
+ int get unaccountedResidentBytes {
173
+ final remainder = processResidentBytes - kernelAllocatorLiveBytes;
174
+ return remainder > 0 ? remainder : 0;
175
+ }
176
+
177
+ double? get fraction =>
178
+ (total <= 0) ? null : (completed / total).clamp(0.0, 1.0);
179
+
180
+ factory KernelProgress.fromRuntime(
181
+ nomos_protocol.KernelProgressObserved observed,
182
+ ) {
183
+ final snapshot = observed.snapshot;
184
+ return KernelProgress(
185
+ sequence: snapshot.sequence.toInt(),
186
+ operation: snapshot.operation.value == 1
187
+ ? KernelProgressOperation.restoreMain
188
+ : KernelProgressOperation.unspecified,
189
+ phase: switch (snapshot.phase.value) {
190
+ 1 => KernelProgressPhase.checkCustody,
191
+ 2 => KernelProgressPhase.readChain,
192
+ 3 => KernelProgressPhase.initializeEngine,
193
+ 4 => KernelProgressPhase.readTimeline,
194
+ 5 => KernelProgressPhase.hydrateLaw,
195
+ 6 => KernelProgressPhase.recoveryPrescan,
196
+ 7 => KernelProgressPhase.verifyIntents,
197
+ 8 => KernelProgressPhase.promoteCustody,
198
+ 9 => KernelProgressPhase.rebuildFrontier,
199
+ 10 => KernelProgressPhase.complete,
200
+ _ => KernelProgressPhase.unspecified,
201
+ },
202
+ completed: snapshot.completedUnits.toInt(),
203
+ total: snapshot.totalUnits.toInt(),
204
+ unit: switch (snapshot.unit.value) {
205
+ 1 => KernelProgressUnit.intent,
206
+ 2 => KernelProgressUnit.lawPackage,
207
+ _ => KernelProgressUnit.unspecified,
208
+ },
209
+ terminal: snapshot.terminal,
210
+ lawHydrationStep: switch (snapshot.lawHydrationStep.value) {
211
+ 1 => KernelLawHydrationStep.readClosure,
212
+ 2 => KernelLawHydrationStep.composeStage,
213
+ 3 => KernelLawHydrationStep.deriveSchemas,
214
+ 4 => KernelLawHydrationStep.loadPolicyShell,
215
+ 5 => KernelLawHydrationStep.packageComplete,
216
+ _ => KernelLawHydrationStep.unspecified,
217
+ },
218
+ lawPackageSha256: snapshot.lawPackageSha256,
219
+ hostObservedElapsedMicros: observed.hostObservedElapsedMicros.toInt(),
220
+ hostObservedPhaseElapsedMicros:
221
+ observed.hostObservedPhaseElapsedMicros.toInt(),
222
+ kernelAllocatorLiveBytes: snapshot.allocatorLiveBytes.toInt(),
223
+ kernelAllocatorPeakBytes: snapshot.allocatorPeakBytes.toInt(),
224
+ processResidentBytes: observed.processResidentBytes.toInt(),
225
+ processPeakResidentBytes: observed.processPeakResidentBytes.toInt(),
226
+ );
227
+ }
228
+ }
229
+
230
+ /// Reception's observability desk. It owns only ephemeral subscriptions and a
231
+ /// bounded recent-span cache; no custody, authority, or application state.
232
+ final class ReceptionProgressDesk {
233
+ final StreamController<NomosSpanEvent> _spans =
234
+ StreamController<NomosSpanEvent>.broadcast();
235
+ final StreamController<TransferProgress> _transfers =
236
+ StreamController<TransferProgress>.broadcast();
237
+ final StreamController<KernelProgress> _kernel =
238
+ StreamController<KernelProgress>.broadcast();
239
+ final List<NomosSpanEvent> _recentSpans = [];
240
+
241
+ Stream<NomosSpanEvent> get spans => _spans.stream;
242
+ Stream<TransferProgress> get transfers => _transfers.stream;
243
+ Stream<KernelProgress> get kernel => _kernel.stream;
244
+ List<NomosSpanEvent> get recentSpans => List.unmodifiable(_recentSpans);
245
+
246
+ void observeSpan(NomosSpanEvent event) {
247
+ _recentSpans.add(event);
248
+ if (_recentSpans.length > 400) {
249
+ _recentSpans.removeRange(0, _recentSpans.length - 400);
250
+ }
251
+ if (!_spans.isClosed) _spans.add(event);
252
+ }
253
+
254
+ void observeTransfer(TransferProgress event) {
255
+ if (!_transfers.isClosed) _transfers.add(event);
256
+ }
257
+
258
+ void observeKernel(KernelProgress event) {
259
+ if (!_kernel.isClosed) _kernel.add(event);
260
+ }
261
+
262
+ Future<void> close() async {
263
+ // Observers may be paused while their widget tree is being replaced.
264
+ if (!_spans.isClosed) unawaited(_spans.close());
265
+ if (!_transfers.isClosed) unawaited(_transfers.close());
266
+ if (!_kernel.isClosed) unawaited(_kernel.close());
267
+ }
268
+ }
@@ -0,0 +1,11 @@
1
+ import '../application_framework_calls.dart' show NmsApplicationFrameworkCalls;
2
+ import 'reception_session.dart' show NmsReceptionSession;
3
+
4
+ /// The static, compiler-generated vocabulary Reception needs to expose one
5
+ /// tenant application. It owns no kernel, custody, credentials, timers, sync,
6
+ /// placement, or mutable application state.
7
+ abstract interface class NmsReceptionContract<TApplication> {
8
+ NmsApplicationFrameworkCalls get frameworkCalls;
9
+
10
+ Future<TApplication> receive(NmsReceptionSession session);
11
+ }
@@ -0,0 +1,284 @@
1
+ import '../application_framework_calls.dart' show NmsApplicationFrameworkCalls;
2
+ import '../application_status.dart'
3
+ show ApplicationStatus, ApplicationStatusPhase;
4
+ import '../nms_generated_runtime.dart'
5
+ show
6
+ Invitation,
7
+ NmsInternalInvitations,
8
+ DartReception,
9
+ NomosOperationReceipt,
10
+ NomosSession,
11
+ Recipient,
12
+ SyncPhase,
13
+ SyncStatus;
14
+ import '../peer_application_streams.dart'
15
+ show NmsPeerApplicationStreams, NmsPeerApplicationStreamView;
16
+ import '../workspace_open_progress.dart' show ApplicationWorkspaceOpenProgress;
17
+
18
+ /// Identity already established by Peer Office for a Reception session.
19
+ final class NmsReceptionUser {
20
+ const NmsReceptionUser({
21
+ required this.actor,
22
+ required this.identityId,
23
+ required this.identityAddress,
24
+ });
25
+
26
+ final String actor;
27
+ final String identityId;
28
+ final String identityAddress;
29
+ }
30
+
31
+ /// One generated invitation route. Generated code supplies only typed law
32
+ /// identities and queries; Peer Office owns the ceremony.
33
+ final class NmsReceptionInvitationPolicy {
34
+ const NmsReceptionInvitationPolicy({
35
+ required this.domain,
36
+ required this.domainHash,
37
+ required this.redeem,
38
+ required this.pending,
39
+ });
40
+
41
+ final String domain;
42
+ final String domainHash;
43
+ final String redeem;
44
+ final Future<List<NmsReceptionInvitationMatch>> Function(String address)
45
+ pending;
46
+ }
47
+
48
+ final class NmsReceptionInvitationMatch {
49
+ const NmsReceptionInvitationMatch({
50
+ required this.orderId,
51
+ required this.object,
52
+ required this.relation,
53
+ });
54
+
55
+ final String orderId;
56
+ final String object;
57
+ final String relation;
58
+ }
59
+
60
+ /// The complete Reception session generated Dart facades may receive.
61
+ /// It contains no cloud URL, credential store, custody store, kernel,
62
+ /// placement policy, sync scheduler, recovery policy, or law lifecycle.
63
+ abstract interface class NmsReceptionSession {
64
+ NomosSession get desk;
65
+ NmsReceptionUser get user;
66
+ NmsPeerApplicationStreams get streams;
67
+
68
+ ApplicationStatus get currentStatus;
69
+ Future<void> whenCurrent({required Duration timeout});
70
+
71
+ ApplicationStatus get applicationStatus;
72
+ Future<void> whenApplicationCurrent({required Duration timeout});
73
+
74
+ NomosOperationReceipt? get creationReceipt;
75
+
76
+ Recipient<TSubject> recipient<TSubject>(String uid);
77
+ Future<Invitation<TSubject>> createInvitation<TSubject>();
78
+ Future<void> redeemInvitation<TSubject>({
79
+ required String link,
80
+ required List<NmsReceptionInvitationPolicy> policies,
81
+ required NmsApplicationFrameworkCalls frameworkCalls,
82
+ });
83
+
84
+ /// The workspace a keyed birth addresses, as THE OFFICE names it. Generated
85
+ /// facades ask; they never hash `(namespace, key)` themselves — that function
86
+ /// is law, and a client-local copy of it drifts silently.
87
+ Future<String> keyedBirthWorkspace({
88
+ required String namespace,
89
+ required String key,
90
+ });
91
+
92
+ Future<List<String>> activeChildWorkspaces({required String namespace});
93
+
94
+ /// Fetch [workspace] onto this device now, reading and opening nothing: the
95
+ /// office names its placement and that placement's Replica Follow mounts the
96
+ /// provider's head in the background. Completes once the follow exists.
97
+ Future<void> fetchWorkspace(String workspace);
98
+
99
+ Future<NmsReceptionSession> follow(String workspace);
100
+ Future<void> close();
101
+ }
102
+
103
+ typedef NmsCreateInvitation = Future<Invitation<T>> Function<T>(
104
+ NomosSession session,
105
+ );
106
+ typedef NmsRedeemInvitation = Future<void> Function<T>(
107
+ NomosSession session, {
108
+ required NmsReceptionUser user,
109
+ required String link,
110
+ required List<NmsReceptionInvitationPolicy> policies,
111
+ required NmsApplicationFrameworkCalls frameworkCalls,
112
+ });
113
+
114
+ /// A thin view over a Peer Office session. It owns no lifecycle state: status,
115
+ /// lineage and child handles are read from the supplied session, while optional
116
+ /// ceremonies are injected as desk capabilities by the platform composition
117
+ /// root.
118
+ final class NmsReceptionSessionView implements NmsReceptionSession {
119
+ NmsReceptionSessionView({
120
+ required NomosSession desk,
121
+ required this.user,
122
+ this.createInvitationCapability,
123
+ this.redeemInvitationCapability,
124
+ this.watchOpenProgressCapability,
125
+ this.closeCapability,
126
+ }) : desk = desk,
127
+ streams = NmsPeerApplicationStreamView(
128
+ session: desk,
129
+ statusProjection: _applicationStatus,
130
+ workspaceOpenProgressSource: watchOpenProgressCapability,
131
+ );
132
+
133
+ @override
134
+ final NomosSession desk;
135
+ @override
136
+ final NmsReceptionUser user;
137
+ @override
138
+ final NmsPeerApplicationStreams streams;
139
+ final NmsCreateInvitation? createInvitationCapability;
140
+ final NmsRedeemInvitation? redeemInvitationCapability;
141
+ final Stream<ApplicationWorkspaceOpenProgress> Function(String workspace)?
142
+ watchOpenProgressCapability;
143
+ final Future<void> Function()? closeCapability;
144
+
145
+ @override
146
+ ApplicationStatus get currentStatus => _applicationStatus(desk.currentStatus);
147
+
148
+ @override
149
+ Future<void> whenCurrent({required Duration timeout}) =>
150
+ _whenCurrent(desk, timeout);
151
+
152
+ @override
153
+ ApplicationStatus get applicationStatus =>
154
+ _applicationStatus(desk.parent.currentStatus);
155
+
156
+ @override
157
+ Future<void> whenApplicationCurrent({required Duration timeout}) =>
158
+ _whenCurrent(desk.parent, timeout);
159
+
160
+ @override
161
+ NomosOperationReceipt? get creationReceipt =>
162
+ desk.nomosInternalWorkspaceCreationReceipt();
163
+
164
+ @override
165
+ Recipient<TSubject> recipient<TSubject>(String uid) {
166
+ final value = uid.trim();
167
+ if (value.isEmpty) {
168
+ throw ArgumentError.value(uid, 'uid', 'must not be empty');
169
+ }
170
+ return NmsInternalInvitations.recipient<TSubject>('user:$value');
171
+ }
172
+
173
+ @override
174
+ Future<Invitation<TSubject>> createInvitation<TSubject>() {
175
+ final capability = createInvitationCapability;
176
+ if (capability == null) {
177
+ throw UnsupportedError('This Reception session has no invitation desk');
178
+ }
179
+ return capability<TSubject>(desk);
180
+ }
181
+
182
+ @override
183
+ Future<void> redeemInvitation<TSubject>({
184
+ required String link,
185
+ required List<NmsReceptionInvitationPolicy> policies,
186
+ required NmsApplicationFrameworkCalls frameworkCalls,
187
+ }) {
188
+ final capability = redeemInvitationCapability;
189
+ if (capability == null) {
190
+ throw UnsupportedError('This Reception session has no invitation desk');
191
+ }
192
+ return capability<TSubject>(
193
+ desk,
194
+ user: user,
195
+ link: link,
196
+ policies: policies,
197
+ frameworkCalls: frameworkCalls,
198
+ );
199
+ }
200
+
201
+ @override
202
+ Future<String> keyedBirthWorkspace({
203
+ required String namespace,
204
+ required String key,
205
+ }) =>
206
+ desk.nmsKeyedBirthWorkspace(namespace: namespace, key: key);
207
+
208
+ @override
209
+ Future<void> fetchWorkspace(String workspace) =>
210
+ desk.nmsFetchWorkspace(workspace);
211
+
212
+ @override
213
+ Future<List<String>> activeChildWorkspaces(
214
+ {required String namespace}) async {
215
+ // The namespace rides the paper: the office owns the namespace-to-workspace-name
216
+ // relation and selects the active children itself. Reading a `<namespace>-`
217
+ // prefix here would be a second, client-local copy of that law fact.
218
+ final children =
219
+ await desk.nomosFrameworkChildWorkspaces(namespace: namespace);
220
+ return children.map((child) => child.workspace).toList(growable: false);
221
+ }
222
+
223
+ @override
224
+ Future<NmsReceptionSession> follow(String workspace) async {
225
+ final child = await desk.bindWorkspace(workspace);
226
+ return NmsReceptionSessionView(
227
+ desk: child,
228
+ user: user,
229
+ createInvitationCapability: createInvitationCapability,
230
+ redeemInvitationCapability: redeemInvitationCapability,
231
+ watchOpenProgressCapability: watchOpenProgressCapability,
232
+ closeCapability: closeCapability,
233
+ );
234
+ }
235
+
236
+ @override
237
+ Future<void> close() => closeCapability?.call() ?? Future<void>.value();
238
+ }
239
+
240
+ ApplicationStatus _applicationStatus(SyncStatus status) => ApplicationStatus(
241
+ phase: switch (status.presentationPhase) {
242
+ SyncPhase.checking => ApplicationStatusPhase.checking,
243
+ SyncPhase.idle => ApplicationStatusPhase.current,
244
+ SyncPhase.syncing => ApplicationStatusPhase.saving,
245
+ SyncPhase.awaitingRemoteDurability =>
246
+ ApplicationStatusPhase.awaitingRemoteDurability,
247
+ SyncPhase.transferring => ApplicationStatusPhase.receiving,
248
+ SyncPhase.behind => ApplicationStatusPhase.catchingUp,
249
+ SyncPhase.offline => ApplicationStatusPhase.offline,
250
+ SyncPhase.error => ApplicationStatusPhase.attention,
251
+ },
252
+ localChanges: status.ahead,
253
+ availableChanges: status.behind,
254
+ savedChanges: status.saved,
255
+ acceptedChanges: status.onMain,
256
+ decisionsNeeded: status.deadLetters,
257
+ receivedBytes: status.transfer?.received,
258
+ totalBytes: status.transfer?.total,
259
+ lastUpdatedAt: status.lastSyncedAt,
260
+ message: status.lastError,
261
+ live: status.live,
262
+ followedWorkspaces: status.followed,
263
+ workspacesInSync: status.followsInSync,
264
+ workspacesLive: status.followsLive,
265
+ workspaceFollows: status.followStatuses,
266
+ followReportAt: status.followReportAt,
267
+ preparingWorkspaces: status.preparingWorkspaces,
268
+ retryingWorkspaces: status.retryingWorkspaces,
269
+ preparationActivity: status.preparationActivity,
270
+ );
271
+
272
+ Future<void> _whenCurrent(DartReception application, Duration timeout) async {
273
+ final initial = _applicationStatus(application.currentStatus);
274
+ if (initial.isCurrent) return;
275
+ if (initial.phase == ApplicationStatusPhase.attention) {
276
+ throw StateError(initial.message ?? 'This workspace needs attention');
277
+ }
278
+ await application.syncStatus.map(_applicationStatus).firstWhere((status) {
279
+ if (status.phase == ApplicationStatusPhase.attention) {
280
+ throw StateError(status.message ?? 'This workspace needs attention');
281
+ }
282
+ return status.isCurrent;
283
+ }).timeout(timeout);
284
+ }
@@ -0,0 +1,26 @@
1
+ import '../sync_status_projection.dart';
2
+
3
+ /// A view of an existing session, not an inventory of all local Git custody.
4
+ final class WorkspaceSyncObservation {
5
+ const WorkspaceSyncObservation({
6
+ required this.session,
7
+ required this.workspace,
8
+ required this.status,
9
+ });
10
+
11
+ final String session;
12
+ final String workspace;
13
+ final SyncStatus status;
14
+ }
15
+
16
+ /// Fixed Reception capability. No generated facade, timer, workspace opening,
17
+ /// credentials, or independently maintained status map belongs here.
18
+ final class ReceptionSyncDiagnostics {
19
+ const ReceptionSyncDiagnostics({
20
+ required this.read,
21
+ required this.changes,
22
+ });
23
+
24
+ final List<WorkspaceSyncObservation> Function() read;
25
+ final Stream<void> changes;
26
+ }