@githolon/dsl 0.108.6 → 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 +2083 -1248
  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
@@ -0,0 +1,267 @@
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
+ if (!_spans.isClosed) await _spans.close();
264
+ if (!_transfers.isClosed) await _transfers.close();
265
+ if (!_kernel.isClosed) await _kernel.close();
266
+ }
267
+ }
@@ -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
+ }