@githolon/dsl 0.108.7 → 0.110.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (308) hide show
  1. package/assets/operation-contract.wasm +0 -0
  2. package/check_package.mjs +12 -15
  3. package/compile_package.mjs +17 -18
  4. package/compile_proof.mjs +16 -1
  5. package/dart/CHANGELOG.md +80 -1
  6. package/dart/README.md +25 -2
  7. package/dart/lib/src/admission_decision.dart +41 -0
  8. package/dart/lib/src/application_framework_calls.dart +52 -2
  9. package/dart/lib/src/application_model_adoption.dart +187 -0
  10. package/dart/lib/src/application_status.dart +73 -0
  11. package/dart/lib/src/console_enrolment.dart +271 -0
  12. package/dart/lib/src/console_http_io.dart +26 -0
  13. package/dart/lib/src/console_http_stub.dart +7 -0
  14. package/dart/lib/src/dev_cloud.dart +69 -22
  15. package/dart/lib/src/generated_call.dart +83 -23
  16. package/dart/lib/src/kernel_primitives.dart +119 -0
  17. package/dart/lib/src/nms_conformance_runtime.dart +1 -1
  18. package/dart/lib/src/nms_generated_runtime.dart +32 -10
  19. package/dart/lib/src/nms_test_environment.dart +1 -1
  20. package/dart/lib/src/node_runner_transport.dart +41 -46
  21. package/dart/lib/src/observed_session_directory.dart +70 -0
  22. package/dart/lib/src/operation_receipts.dart +112 -0
  23. package/dart/lib/src/peer_application_streams.dart +103 -0
  24. package/dart/lib/src/reception/dart_reception.dart +4280 -0
  25. package/dart/lib/src/reception/event_desk.dart +214 -0
  26. package/dart/lib/src/reception/extremum_read.dart +46 -0
  27. package/dart/lib/src/reception/local_copies.dart +371 -0
  28. package/dart/lib/src/reception/peer_office_connection.dart +11 -0
  29. package/dart/lib/src/reception/progress_desk.dart +268 -0
  30. package/dart/lib/src/reception/reception_contract.dart +11 -0
  31. package/dart/lib/src/reception/reception_session.dart +284 -0
  32. package/dart/lib/src/reception/sync_diagnostics.dart +26 -0
  33. package/dart/lib/src/reception/workspace_preparation_report.dart +126 -0
  34. package/dart/lib/src/replica_readiness.dart +123 -0
  35. package/dart/lib/src/runner/node-entry.mjs +23950 -15776
  36. package/dart/lib/src/runtime_v2_gateway.dart +56 -3
  37. package/dart/lib/src/runtime_v2_transport.dart +544 -3
  38. package/dart/lib/src/session_bound.dart +200 -311
  39. package/dart/lib/src/signing_identity_kernel.dart +84 -0
  40. package/dart/lib/src/sync_status_projection.dart +550 -0
  41. package/dart/lib/src/sync_status_reducer.dart +170 -0
  42. package/dart/lib/src/test_harness.dart +809 -1153
  43. package/dart/lib/src/testing/test_custody.dart +66 -0
  44. package/dart/lib/src/testing/test_peer.dart +328 -0
  45. package/dart/lib/src/typed_watch_registry.dart +169 -0
  46. package/dart/lib/src/workspace_open_progress.dart +27 -0
  47. package/dart/pubspec.lock +24 -1
  48. package/dart/pubspec.yaml +7 -2
  49. package/dart/pubspec_overrides.yaml +2 -0
  50. package/dart/test/admission_decision_test.dart +48 -0
  51. package/dart/test/background_model_adoption_test.dart +228 -0
  52. package/dart/test/bundle_version_pairing_test.dart +4 -4
  53. package/dart/test/child_authentication_repair_test.dart +359 -0
  54. package/dart/test/cloud_bound_local_shell_test.dart +119 -0
  55. package/dart/test/console_enrolment_refusal_test.dart +52 -0
  56. package/dart/test/console_enrolment_test.dart +227 -0
  57. package/dart/test/errors_test.dart +5 -5
  58. package/dart/test/event_plane_seam_test.dart +50 -164
  59. package/dart/test/extremum_read_test.dart +58 -0
  60. package/dart/test/fixtures/wedge/wedge-entry.mjs +3 -21
  61. package/dart/test/generated_query_test.dart +32 -0
  62. package/dart/test/harness_phase_timeout_test.dart +18 -23
  63. package/dart/test/kernel_author_after_read_test.dart +242 -0
  64. package/dart/test/kernel_fence_test.dart +137 -0
  65. package/dart/test/local_copies_test.dart +222 -0
  66. package/dart/test/model_adoption_test.dart +198 -0
  67. package/dart/test/node_peer_local_custody_test.dart +153 -0
  68. package/dart/test/offer_authentication_proof_test.dart +352 -52
  69. package/dart/test/operation_compatibility_test.dart +151 -0
  70. package/dart/test/platform_credential_effect_test.dart +386 -0
  71. package/dart/test/receiving_group_open_test.dart +213 -0
  72. package/dart/test/reception/workspace_preparation_report_test.dart +103 -0
  73. package/dart/test/reception_event_desk_close_test.dart +16 -0
  74. package/dart/test/reception_span_trace_test.dart +23 -0
  75. package/dart/test/replica_readiness_test.dart +156 -0
  76. package/dart/test/runtime_projections_test.dart +92 -0
  77. package/dart/test/runtime_v2_gateway_test.dart +131 -0
  78. package/dart/test/signing_identity_kernel_test.dart +75 -0
  79. package/dart/test/sync_status_preparation_report_test.dart +29 -0
  80. package/dart/test/sync_status_reducer_test.dart +419 -0
  81. package/dart/test/test_harness_test.dart +71 -95
  82. package/dart/test/typed_query_watch_test.dart +170 -0
  83. package/dart/test/typed_watch_registry_test.dart +249 -0
  84. package/dart_lints/README.md +18 -0
  85. package/dart_lints/lib/nomos_lints.dart +70 -0
  86. package/dart_lints/pubspec.lock +580 -0
  87. package/dart_lints/pubspec.yaml +12 -0
  88. package/dart_lints/test/reference_identity_test.dart +75 -0
  89. package/dart_types/CHANGELOG.md +18 -0
  90. package/dart_types/lib/nomos_kernel_protocol.dart +21 -1
  91. package/dart_types/lib/nomos_types.dart +9 -1
  92. package/dart_types/lib/src/admission_decision.dart +37 -0
  93. package/dart_types/lib/src/aggregate_meta.dart +1 -1
  94. package/dart_types/lib/src/approved_model.dart +65 -0
  95. package/dart_types/lib/src/custody.dart +10 -18
  96. package/dart_types/lib/src/error_info.dart +4 -4
  97. package/dart_types/lib/src/errors.dart +29 -29
  98. package/dart_types/lib/src/foreign_ref.dart +62 -33
  99. package/dart_types/lib/src/local_work_rejected.dart +3 -3
  100. package/dart_types/lib/src/nomos_ref.dart +3 -1
  101. package/dart_types/lib/src/principal.dart +2 -2
  102. package/dart_types/lib/src/proto/google/protobuf/any.pb.dart +163 -0
  103. package/dart_types/lib/src/proto/google/protobuf/any.pbenum.dart +11 -0
  104. package/dart_types/lib/src/proto/nomos/discovery/v1/workspace_placement.pb.dart +137 -0
  105. package/dart_types/lib/src/proto/nomos/discovery/v1/workspace_placement.pbenum.dart +11 -0
  106. package/dart_types/lib/src/proto/nomos/kernel/v1/kernel.pb.dart +20721 -10433
  107. package/dart_types/lib/src/proto/nomos/kernel/v1/kernel.pbenum.dart +555 -27
  108. package/dart_types/lib/src/proto/nomos/runtime/v2/application_desk.pb.dart +387 -0
  109. package/dart_types/lib/src/proto/nomos/runtime/v2/application_desk.pbenum.dart +46 -0
  110. package/dart_types/lib/src/proto/nomos/runtime/v2/application_readiness_desk.pb.dart +295 -0
  111. package/dart_types/lib/src/proto/nomos/runtime/v2/application_readiness_desk.pbenum.dart +139 -0
  112. package/dart_types/lib/src/proto/nomos/runtime/v2/authentication_desk.pb.dart +269 -0
  113. package/dart_types/lib/src/proto/nomos/runtime/v2/authentication_desk.pbenum.dart +103 -0
  114. package/dart_types/lib/src/proto/nomos/runtime/v2/compatibility_desk.pb.dart +417 -0
  115. package/dart_types/lib/src/proto/nomos/runtime/v2/compatibility_desk.pbenum.dart +62 -0
  116. package/dart_types/lib/src/proto/nomos/runtime/v2/correspondence_desk.pb.dart +9968 -0
  117. package/dart_types/lib/src/proto/nomos/runtime/v2/correspondence_desk.pbenum.dart +133 -0
  118. package/dart_types/lib/src/proto/nomos/runtime/v2/credentials_desk.pb.dart +204 -0
  119. package/dart_types/lib/src/proto/nomos/runtime/v2/credentials_desk.pbenum.dart +54 -0
  120. package/dart_types/lib/src/proto/nomos/runtime/v2/custody_desk.pb.dart +1550 -0
  121. package/dart_types/lib/src/proto/nomos/runtime/v2/custody_desk.pbenum.dart +11 -0
  122. package/dart_types/lib/src/proto/nomos/runtime/v2/framework.pb.dart +710 -0
  123. package/dart_types/lib/src/proto/nomos/runtime/v2/framework.pbenum.dart +11 -0
  124. package/dart_types/lib/src/proto/nomos/runtime/v2/identity_desk.pb.dart +845 -0
  125. package/dart_types/lib/src/proto/nomos/runtime/v2/identity_desk.pbenum.dart +11 -0
  126. package/dart_types/lib/src/proto/nomos/runtime/v2/interaction_desk.pb.dart +198 -0
  127. package/dart_types/lib/src/proto/nomos/runtime/v2/interaction_desk.pbenum.dart +11 -0
  128. package/dart_types/lib/src/proto/nomos/runtime/v2/law_desk.pb.dart +369 -0
  129. package/dart_types/lib/src/proto/nomos/runtime/v2/law_desk.pbenum.dart +11 -0
  130. package/dart_types/lib/src/proto/nomos/runtime/v2/maintenance_desk.pb.dart +609 -0
  131. package/dart_types/lib/src/proto/nomos/runtime/v2/maintenance_desk.pbenum.dart +65 -0
  132. package/dart_types/lib/src/proto/nomos/runtime/v2/model_adoption_desk.pb.dart +358 -0
  133. package/dart_types/lib/src/proto/nomos/runtime/v2/model_adoption_desk.pbenum.dart +100 -0
  134. package/dart_types/lib/src/proto/nomos/runtime/v2/observability_desk.pb.dart +2231 -0
  135. package/dart_types/lib/src/proto/nomos/runtime/v2/observability_desk.pbenum.dart +271 -0
  136. package/dart_types/lib/src/proto/nomos/runtime/v2/placement_desk.pb.dart +1286 -0
  137. package/dart_types/lib/src/proto/nomos/runtime/v2/placement_desk.pbenum.dart +11 -0
  138. package/dart_types/lib/src/proto/nomos/runtime/v2/receiving_group_desk.pb.dart +636 -0
  139. package/dart_types/lib/src/proto/nomos/runtime/v2/receiving_group_desk.pbenum.dart +116 -0
  140. package/dart_types/lib/src/proto/nomos/runtime/v2/records_desk.pb.dart +1637 -0
  141. package/dart_types/lib/src/proto/nomos/runtime/v2/records_desk.pbenum.dart +175 -0
  142. package/dart_types/lib/src/proto/nomos/runtime/v2/recovery_desk.pb.dart +1269 -0
  143. package/dart_types/lib/src/proto/nomos/runtime/v2/recovery_desk.pbenum.dart +129 -0
  144. package/dart_types/lib/src/proto/nomos/runtime/v2/residency_desk.pb.dart +2782 -0
  145. package/dart_types/lib/src/proto/nomos/runtime/v2/residency_desk.pbenum.dart +97 -0
  146. package/dart_types/lib/src/proto/nomos/runtime/v2/runtime.pb.dart +2232 -8627
  147. package/dart_types/lib/src/proto/nomos/runtime/v2/runtime.pbenum.dart +0 -358
  148. package/dart_types/lib/src/proto/nomos/runtime/v2/sealing_desk.pb.dart +1639 -0
  149. package/dart_types/lib/src/proto/nomos/runtime/v2/sealing_desk.pbenum.dart +46 -0
  150. package/dart_types/lib/src/runtime_outcome.dart +133 -0
  151. package/dart_types/lib/src/subscriptions.dart +116 -23
  152. package/dart_types/pubspec.yaml +1 -1
  153. package/dart_types/test/extremum_subscriptions_test.dart +40 -0
  154. package/dart_types/test/foreign_ref_resolution_test.dart +75 -0
  155. package/dart_types/test/nomos_ref_address_test.dart +25 -0
  156. package/dart_types/test/ordered_subscriptions_test.dart +34 -0
  157. package/operation_contract_check.mjs +24 -0
  158. package/package.json +11 -6
  159. package/src/aggregate.ts +70 -10
  160. package/src/application_topology.ts +18 -11
  161. package/src/attested.ts +3 -0
  162. package/src/attested_core.ts +46 -3
  163. package/src/birth_meter_ensure.ts +19 -7
  164. package/src/births.ts +29 -4
  165. package/src/build_package.ts +140 -13
  166. package/src/business_birth.ts +181 -4
  167. package/src/codegen_call_proto.ts +1276 -0
  168. package/src/codegen_call_usda.ts +49 -6
  169. package/src/codegen_dart.ts +83 -44
  170. package/src/codegen_dart_client.ts +458 -800
  171. package/src/{codegen_dart_application.ts → codegen_dart_facade.ts} +331 -582
  172. package/src/codegen_dart_framework_calls.ts +320 -37
  173. package/src/codegen_dart_indexed_variant.ts +159 -0
  174. package/src/codegen_dart_scenario.ts +42 -13
  175. package/src/codegen_proof.ts +3 -3
  176. package/src/codegen_provider_dart.ts +5 -0
  177. package/src/codegen_query_proto.ts +158 -0
  178. package/src/codegen_refusal.ts +189 -0
  179. package/src/codegen_result_proto.ts +931 -0
  180. package/src/codegen_result_usda.ts +4 -0
  181. package/src/codegen_ts.ts +464 -616
  182. package/src/codegen_workspace_access.ts +105 -0
  183. package/src/compatibility_graph.ts +759 -0
  184. package/src/compatibility_usda.ts +264 -0
  185. package/src/compile_package_main.ts +2017 -1195
  186. package/src/custody_placement.ts +156 -0
  187. package/src/custody_placement_usda.ts +91 -0
  188. package/src/decl_shapes.ts +21 -2
  189. package/src/describe_model.ts +1 -0
  190. package/src/directive.ts +59 -2
  191. package/src/drivers.ts +51 -0
  192. package/src/engine_entry.ts +52 -8
  193. package/src/evolve_preview.ts +11 -4
  194. package/src/exists.ts +2 -0
  195. package/src/fields.ts +75 -11
  196. package/src/flow_gate.ts +2 -1
  197. package/src/framework/application_home.ts +170 -18
  198. package/src/framework/attested_receipts.ts +8 -3
  199. package/src/framework/auth_provider_law.ts +169 -9
  200. package/src/framework/birth_certificate_law.ts +4 -0
  201. package/src/framework/capability.ts +34 -3
  202. package/src/framework/child_authentication.ts +346 -0
  203. package/src/framework/console_governance.ts +295 -0
  204. package/src/framework/delegated_roles.ts +301 -0
  205. package/src/framework/domain_lifecycle.ts +26 -13
  206. package/src/framework/founding_genesis.ts +193 -0
  207. package/src/framework/framework_aggregates.ts +1 -1
  208. package/src/framework/genesis.ts +6 -1
  209. package/src/framework/governance_relations.ts +19 -0
  210. package/src/framework/home.ts +5 -734
  211. package/src/framework/legacy/child_auth_provider_epoch.ts +73 -0
  212. package/src/framework/model_authority_repair.ts +116 -0
  213. package/src/framework/model_authority_seed.ts +185 -0
  214. package/src/framework/model_transition.ts +211 -0
  215. package/src/framework/owned_custody.ts +1 -1
  216. package/src/framework/principal_enrollment.ts +302 -0
  217. package/src/framework/receiving_group.ts +857 -0
  218. package/src/framework/receiving_group_recovery.ts +314 -0
  219. package/src/framework/relations.ts +4 -8
  220. package/src/framework/signing_identity.ts +242 -95
  221. package/src/framework/source_roster.ts +11 -5
  222. package/src/framework/workspace_access.ts +149 -0
  223. package/src/framework/workspace_invariant.ts +73 -52
  224. package/src/framework/workspaces.ts +407 -40
  225. package/src/framework_call_definitions.ts +32 -3
  226. package/src/generated_client_bundle_boundary.ts +97 -0
  227. package/src/generated_client_names.ts +1 -0
  228. package/src/identity_usda.ts +27 -0
  229. package/src/index.ts +183 -12
  230. package/src/indexed_variant.ts +83 -0
  231. package/src/intent.ts +173 -45
  232. package/src/law_check.ts +8 -5
  233. package/src/law_dependency_index.ts +231 -0
  234. package/src/law_graph.ts +508 -71
  235. package/src/law_graph_usda.ts +170 -24
  236. package/src/law_identity.ts +119 -81
  237. package/src/law_source_map.ts +4 -1
  238. package/src/law_units.ts +498 -0
  239. package/src/law_value_type.ts +7 -3
  240. package/src/member_authentication.ts +302 -0
  241. package/src/null_meta.ts +1 -1
  242. package/src/openusd_compiled_layer.ts +132 -0
  243. package/src/operation_contract_check.ts +31 -0
  244. package/src/ordered_read.ts +2 -1
  245. package/src/package_config.ts +33 -12
  246. package/src/package_dependencies.ts +1 -0
  247. package/src/plan_source_slice.ts +30 -1
  248. package/src/protobuf_field_number.ts +36 -0
  249. package/src/provenance_wire.ts +6 -0
  250. package/src/query.ts +2 -1
  251. package/src/read.ts +50 -0
  252. package/src/relation.ts +4 -1
  253. package/src/relation_schema.ts +15 -2
  254. package/src/report.ts +2 -2
  255. package/src/sqlite_computation_bundle.ts +78 -0
  256. package/src/sqlite_computed.ts +102 -0
  257. package/src/sqlite_counts.ts +154 -0
  258. package/src/sqlite_layout.ts +823 -0
  259. package/src/sqlite_reads.ts +275 -0
  260. package/src/sqlite_samples.ts +185 -0
  261. package/src/stable_id_identity_bridge.ts +1 -1
  262. package/src/stable_ids_for_module.ts +16 -4
  263. package/src/test_call_usda.ts +6 -6
  264. package/src/usda_relationship_integrity.ts +20 -3
  265. package/src/usda_text.ts +21 -1
  266. package/src/value_object.ts +81 -11
  267. package/src/wire.ts +22 -0
  268. package/src/wire_encode.ts +227 -20
  269. package/src/workspace_sharding.ts +15 -6
  270. package/src/workspace_sharing.ts +51 -49
  271. package/src/zod_introspection.ts +2 -0
  272. package/compat_package.mjs +0 -46
  273. package/dart/lib/src/home.dart +0 -15
  274. package/dart/lib/src/runner/offline-install.mjs +0 -15367
  275. package/dart/lib/src/source_trust.dart +0 -51
  276. package/dart/lib/src/webview_bridge.dart +0 -6540
  277. package/dart/lib/src/workspace_name.dart +0 -30
  278. package/dart/test/acquire_session_credentials_test.dart +0 -150
  279. package/dart/test/acquire_session_test.dart +0 -534
  280. package/dart/test/adv_realm_interference_test.dart +0 -600
  281. package/dart/test/cloud_bound_topology_test.dart +0 -168
  282. package/dart/test/cluster_births_test.dart +0 -202
  283. package/dart/test/cluster_device_keyed_acceptance_test.dart +0 -105
  284. package/dart/test/cluster_local_autosync_test.dart +0 -123
  285. package/dart/test/cluster_scale_test.dart +0 -122
  286. package/dart/test/compat_test.dart +0 -61
  287. package/dart/test/dlq_session_surface_test.dart +0 -222
  288. package/dart/test/first_app_gauntlet_test.dart +0 -386
  289. package/dart/test/fixtures/wedge/fake-install.mjs +0 -11
  290. package/dart/test/four_layer_nested_topology_test.dart +0 -290
  291. package/dart/test/home_parity_test.dart +0 -13
  292. package/dart/test/local_sync_inert_test.dart +0 -107
  293. package/dart/test/node_runner_transport_test.dart +0 -78
  294. package/dart/test/parent_signer_recovery_test.dart +0 -155
  295. package/dart/test/residency_refusal_test.dart +0 -49
  296. package/dart/test/sealing_client_test.dart +0 -181
  297. package/dart/test/session_bound_test.dart +0 -285
  298. package/dart/test/stale_bundle_test.dart +0 -80
  299. package/dart/test/vo_read_typing_test.dart +0 -131
  300. package/dart/test/watch_after_offer_stall_test.dart +0 -100
  301. package/dart/test/webview_bridge_test.dart +0 -1930
  302. package/dart/test/workspace_name_test.dart +0 -24
  303. package/runtime/generated-application-host.js +0 -22860
  304. package/src/codegen_query_usda.ts +0 -214
  305. package/src/compat_manifest.ts +0 -26
  306. package/src/compat_package_main.ts +0 -224
  307. package/src/shape_compat.ts +0 -352
  308. package/src/usd_state.ts +0 -505
@@ -1,214 +0,0 @@
1
- import type { LawGraph, LawQueryReadNode } from "./law_graph.js";
2
-
3
- export type QueryScalarKind = "string" | "reference" | "token" | "integer" | "boolean";
4
-
5
- export interface DartQueryUsdaParameter {
6
- readonly authoredPath: string;
7
- readonly name: string;
8
- readonly type: "String" | "int" | "bool";
9
- readonly value: string;
10
- readonly kind: QueryScalarKind;
11
- }
12
-
13
- export interface DartQueryUsdaEncoder {
14
- readonly functionName: string;
15
- readonly call: string;
16
- readonly source: readonly string[];
17
- }
18
-
19
- export interface TsQueryUsdaParameter {
20
- readonly authoredPath: string;
21
- readonly name: string;
22
- readonly type: "string" | "number" | "boolean";
23
- readonly value: string;
24
- readonly kind: QueryScalarKind;
25
- }
26
-
27
- export interface TsQueryUsdaEncoder {
28
- readonly functionName: string;
29
- readonly call: string;
30
- readonly source: readonly string[];
31
- }
32
-
33
- const symbol = (value: string): string =>
34
- value.replace(/[^A-Za-z0-9_$]+/g, "_").replace(/^[^A-Za-z_$]/, "_$&");
35
-
36
- const pathLeaf = (path: string): string => path.slice(path.lastIndexOf("/") + 1);
37
-
38
- const dartString = (value: string): string => JSON.stringify(value);
39
-
40
- /**
41
- * Emit one query-specific USDA encoder from the same composed graph that emitted law.usda.
42
- *
43
- * There is intentionally no schema interpreter or generic value bag in the generated runtime:
44
- * each parameter has one Dart type, one OpenUSD value type and exact query/field relationships.
45
- */
46
- export function emitDartQueryUsdaEncoder(
47
- graph: LawGraph,
48
- paths: ReadonlyMap<string, string>,
49
- domain: string,
50
- queryId: string,
51
- parameters: readonly DartQueryUsdaParameter[],
52
- ): DartQueryUsdaEncoder {
53
- const query = graph.nodes.find(
54
- (node): node is LawQueryReadNode =>
55
- node.kind === "read" && node.readKind === "query" && node.entity.label === queryId,
56
- );
57
- if (query === undefined) {
58
- throw new Error(`query USDA codegen: domain '${domain}' has no law query '${queryId}'`);
59
- }
60
- const queryPath = paths.get(query.entity.id);
61
- if (queryPath === undefined) {
62
- throw new Error(`query USDA codegen: '${domain}/${queryId}' has no rendered law path`);
63
- }
64
- if (query.key.length !== parameters.length) {
65
- throw new Error(
66
- `query USDA codegen: '${domain}/${queryId}' has ${query.key.length} law keys but ${parameters.length} generated parameters`,
67
- );
68
- }
69
- const functionName = `_nmsQueryUsda_${symbol(domain)}_${symbol(queryId)}`;
70
- const signature = parameters.map((parameter) => `${parameter.type} ${parameter.name}`).join(", ");
71
- const lines = [
72
- `NmsGeneratedQuery ${functionName}(${signature}) {`,
73
- ` final out = <String>[`,
74
- ` '#usda 1.0',`,
75
- ` '(',`,
76
- ` ' defaultPrim = "Query"',`,
77
- ` ')',`,
78
- ` '',`,
79
- ` 'def NomosQuery "Query"',`,
80
- ` '{',`,
81
- ` ' custom rel nomos:query = <${queryPath}>',`,
82
- ` '',`,
83
- ` ' def NomosQueryArguments "Arguments"',`,
84
- ` ' {',`,
85
- ` ];`,
86
- ];
87
- for (let index = 0; index < parameters.length; index++) {
88
- const parameter = parameters[index]!;
89
- const key = query.key[index]!;
90
- if (key.authoredPath !== parameter.authoredPath) {
91
- throw new Error(
92
- `query USDA codegen: '${domain}/${queryId}' key ${index} is '${key.authoredPath}', not '${parameter.authoredPath}'`,
93
- );
94
- }
95
- const fieldPath = paths.get(key.field.id);
96
- if (fieldPath === undefined) {
97
- throw new Error(
98
- `query USDA codegen: '${domain}/${queryId}.${parameter.authoredPath}' has no rendered field path`,
99
- );
100
- }
101
- const valuePath = `/Query/Arguments/${pathLeaf(fieldPath)}`;
102
- const [primType, declaredType, expression] = (() => {
103
- switch (parameter.kind) {
104
- case "string":
105
- return ["NomosStringValue", "string", `_nmsUsdaQuote(${parameter.name})`] as const;
106
- case "reference":
107
- return ["NomosReferenceValue", "string", `_nmsUsdaQuote(${parameter.name})`] as const;
108
- case "token":
109
- return ["NomosTokenValue", "token", `_nmsUsdaQuote(${parameter.name})`] as const;
110
- case "integer":
111
- return ["NomosIntValue", "int64", `_nmsUsdaInt(${parameter.name})`] as const;
112
- case "boolean":
113
- return ["NomosBoolValue", "bool", `${parameter.name} ? 'true' : 'false'`] as const;
114
- }
115
- })();
116
- lines.push(
117
- ` _nmsUsdaBegin(out, 2, ${dartString(primType)}, ${dartString(valuePath)});`,
118
- ` _nmsUsdaRel(out, 3, 'nomos:field', ${dartString(fieldPath)});`,
119
- ` _nmsUsdaLine(out, 3, 'custom uniform string[] nomos:keyPath = [' + _nmsUsdaQuote(${dartString(parameter.authoredPath)}) + ']');`,
120
- ` _nmsUsdaLine(out, 3, 'custom uniform ${declaredType} nomos:value = ' + ${expression});`,
121
- ` _nmsUsdaClose(out, 2);`,
122
- );
123
- }
124
- lines.push(
125
- ` _nmsUsdaClose(out, 1);`,
126
- ` _nmsUsdaClose(out, 0);`,
127
- ` return NmsInternalGeneratedQueries.create(`,
128
- ` domain: ${dartString(domain)},`,
129
- ` query: ${dartString(queryId)},`,
130
- ` canonicalArgumentsUsda: Uint8List.fromList(utf8.encode('\${out.join('\\n')}\\n')),`,
131
- ` );`,
132
- `}`,
133
- ``,
134
- );
135
- return {
136
- functionName,
137
- call: `${functionName}(${parameters.map((parameter) => parameter.value).join(", ")})`,
138
- source: lines,
139
- };
140
- }
141
-
142
- export function emitTsQueryUsdaEncoder(
143
- graph: LawGraph,
144
- paths: ReadonlyMap<string, string>,
145
- domain: string,
146
- queryId: string,
147
- parameters: readonly TsQueryUsdaParameter[],
148
- ): TsQueryUsdaEncoder {
149
- const query = graph.nodes.find(
150
- (node): node is LawQueryReadNode =>
151
- node.kind === "read" && node.readKind === "query" && node.entity.label === queryId,
152
- );
153
- if (query === undefined) throw new Error(`query USDA codegen: domain '${domain}' has no law query '${queryId}'`);
154
- const queryPath = paths.get(query.entity.id);
155
- if (queryPath === undefined) throw new Error(`query USDA codegen: '${domain}/${queryId}' has no rendered law path`);
156
- if (query.key.length !== parameters.length) {
157
- throw new Error(`query USDA codegen: '${domain}/${queryId}' key/parameter length differs`);
158
- }
159
- const functionName = `_nmsQueryUsda_${symbol(domain)}_${symbol(queryId)}`;
160
- const lines = [
161
- `function ${functionName}(${parameters.map((parameter) => `${parameter.name}: ${parameter.type}`).join(", ")}): NmsGeneratedQuery<${JSON.stringify(domain)}, ${JSON.stringify(queryId)}> {`,
162
- ` const out: string[] = [`,
163
- ` "#usda 1.0",`,
164
- ` "(",`,
165
- ` ' defaultPrim = "Query"',`,
166
- ` ")",`,
167
- ` "",`,
168
- ` 'def NomosQuery "Query"',`,
169
- ` "{",`,
170
- ` " custom rel nomos:query = <${queryPath}>",`,
171
- ` "",`,
172
- ` ' def NomosQueryArguments "Arguments"',`,
173
- ` " {",`,
174
- ` ];`,
175
- ];
176
- for (let index = 0; index < parameters.length; index++) {
177
- const parameter = parameters[index]!;
178
- const key = query.key[index]!;
179
- if (key.authoredPath !== parameter.authoredPath) {
180
- throw new Error(`query USDA codegen: '${domain}/${queryId}' key ${index} identity differs`);
181
- }
182
- const fieldPath = paths.get(key.field.id);
183
- if (fieldPath === undefined) throw new Error(`query USDA codegen: '${domain}/${queryId}.${parameter.authoredPath}' has no field path`);
184
- const valuePath = `/Query/Arguments/${pathLeaf(fieldPath)}`;
185
- const [primType, declaredType, expression] = (() => {
186
- switch (parameter.kind) {
187
- case "string": return ["NomosStringValue", "string", `_nmsUsdaQuote(${parameter.name})`] as const;
188
- case "reference": return ["NomosReferenceValue", "string", `_nmsUsdaQuote(${parameter.name})`] as const;
189
- case "token": return ["NomosTokenValue", "token", `_nmsUsdaQuote(${parameter.name})`] as const;
190
- case "integer": return ["NomosIntValue", "int64", `_nmsUsdaInt(${parameter.name})`] as const;
191
- case "boolean": return ["NomosBoolValue", "bool", `${parameter.name} ? "true" : "false"`] as const;
192
- }
193
- })();
194
- lines.push(
195
- ` _nmsUsdaBegin(out, 2, ${JSON.stringify(primType)}, ${JSON.stringify(valuePath)});`,
196
- ` _nmsUsdaRel(out, 3, "nomos:field", ${JSON.stringify(fieldPath)});`,
197
- ` _nmsUsdaLine(out, 3, "custom uniform string[] nomos:keyPath = [" + _nmsUsdaQuote(${JSON.stringify(parameter.authoredPath)}) + "]");`,
198
- ` _nmsUsdaLine(out, 3, "custom uniform ${declaredType} nomos:value = " + ${expression});`,
199
- ` _nmsUsdaClose(out, 2);`,
200
- );
201
- }
202
- lines.push(
203
- ` _nmsUsdaClose(out, 1);`,
204
- ` _nmsUsdaClose(out, 0);`,
205
- ` return _nmsGeneratedQuery(${JSON.stringify(domain)}, ${JSON.stringify(queryId)}, _nmsUsdaUtf8(out.join("\\n") + "\\n"));`,
206
- `}`,
207
- ``,
208
- );
209
- return {
210
- functionName,
211
- call: `${functionName}(${parameters.map((parameter) => parameter.value).join(", ")})`,
212
- source: lines,
213
- };
214
- }
@@ -1,26 +0,0 @@
1
- // The CLIENT/LAW COMPATIBILITY MANIFEST (architecture/shape_compatibility.md).
2
- //
3
- // A DIAGNOSIS surface, NEVER a gate. Clients fit workspaces by STRUCTURAL INTERFACE
4
- // (stable-id subtyping, #72), not by law-hash pin — the hash pin was a bug we removed.
5
- // This block is baked into the generated TS + Dart clients and mirrored into the deploy
6
- // JSON so a connect() can classify: lawHash-equal (silent) vs lawHash-differs-shape-compat
7
- // (proceed, log) vs structurally-incompatible (warn). It is FRONTEND-ONLY — emitted like
8
- // the dart codegen hints, it does NOT enter the USD IR / package bytes / domainHash.
9
- export interface NomosCompat {
10
- /** The package name (`cfg.name`). */
11
- readonly packageName: string;
12
- /** The deploy domainHash — the composed typed USDA closure identity. */
13
- readonly lawHash: string;
14
- /** sha256 over the CANONICAL serialization of the package structural interface. */
15
- readonly interfaceHash: string;
16
- /** Per domain key → its canonical typed USDA layer identity. */
17
- readonly domains: Record<string, { readonly identityHash?: string }>;
18
- /** The generator provenance — the `@githolon/dsl` version + this manifest's schema. */
19
- readonly generator: { readonly dsl: string; readonly schema: number };
20
- /** Standard OSGi Contract Namespace requirements derived from the law shape. */
21
- readonly kernelContracts: readonly {
22
- readonly namespace: "osgi.contract";
23
- readonly name: string;
24
- readonly version: string;
25
- }[];
26
- }
@@ -1,224 +0,0 @@
1
- // NOMOS — Nomos Sovereign: participants act · verify · remember LOCALLY; hosted
2
- // remotes are replaceable custody/transport, not truth. ⇒ ONE Nomos GitHolon
3
- // wasm32-wasip1 artifact. If a file isn't this / hosting this / authoring for this / proving this — it's gone.
4
-
5
- /**
6
- * `githolon compat <target> [--config …] [--domain …] [--json]` — THE CI GATE (task #31, the compat superpower).
7
- *
8
- * Compares the CURRENT generated client's carried structural REQUIREMENT against a TARGET's
9
- * installed law (the workspace OFFER), PER MEMBER, via the #72
10
- * subtype relation (`memberVerdicts`). Exits NON-ZERO on any incompatible member — so a client/law
11
- * mismatch is caught in CI, before it ships. The target is:
12
- * • a generated `.client.mjs` (or a build/package DIR containing one);
13
- * • a LIVE workspace URL (`https://host/v2/workspaces/<ws>` or `https://host --workspace <ws>`) —
14
- * connect()s and reads the on-ledger offer (`holon.interfaceOffer()`).
15
- *
16
- * Human report by default; `--json` emits the machine surface (the per-member array + verdict).
17
- */
18
- import { existsSync, readdirSync, statSync } from "node:fs";
19
- import path from "node:path";
20
-
21
- import { memberVerdicts, type DomainInterface, type MemberVerdict } from "./shape_compat.js";
22
-
23
- interface PackageConfig {
24
- name: string;
25
- }
26
- type InterfaceMap = Record<string, DomainInterface>;
27
-
28
- function fail(msg: string): never {
29
- console.error(`githolon compat: ${msg}`);
30
- process.exit(2);
31
- }
32
-
33
- /** Merge a per-domain interface map into ONE flat interface (directives + aggregates unioned). */
34
- function mergeInterfaces(byDomain: InterfaceMap | undefined): DomainInterface {
35
- const out: DomainInterface = { v: 1, domain: "*", directives: {}, aggregates: {} };
36
- for (const di of Object.values(byDomain ?? {})) {
37
- if (!di || typeof di !== "object") continue;
38
- Object.assign(out.directives, di.directives ?? {});
39
- Object.assign(out.aggregates, di.aggregates ?? {});
40
- }
41
- return out;
42
- }
43
-
44
- /** The package name from `nomos.project.ts` (only field we need — to locate its generated client). */
45
- async function loadPackageName(configArg: string): Promise<{ name: string; dir: string }> {
46
- const configPath = path.resolve(process.cwd(), configArg);
47
- if (!existsSync(configPath)) fail(`config not found: ${configPath} (pass the package config, or run from the package dir)`);
48
- const { pathToFileURL } = await import("node:url");
49
- const cfg = ((await import(`${pathToFileURL(configPath).href}?t=${Date.now()}`)) as { default?: PackageConfig }).default;
50
- if (!cfg || typeof cfg.name !== "string") fail(`config must default-export { name, … }`);
51
- return { name: cfg.name, dir: path.dirname(configPath) };
52
- }
53
-
54
- const GENERATED_INTERFACE = Symbol.for("nomos.generated-interface");
55
-
56
- async function loadClientRequirement(file: string): Promise<InterfaceMap> {
57
- const { pathToFileURL } = await import("node:url");
58
- let generated: Record<string, unknown>;
59
- try {
60
- generated = await import(`${pathToFileURL(file).href}?compat=${Date.now()}`) as Record<string, unknown>;
61
- } catch (error) {
62
- fail(`could not load generated client ${file}: ${(error as Error).message}`);
63
- }
64
- for (const value of Object.values(generated)) {
65
- if (typeof value !== "function") continue;
66
- const requirement = (value as unknown as Record<PropertyKey, unknown>)[GENERATED_INTERFACE];
67
- if (requirement !== null && typeof requirement === "object") return requirement as InterfaceMap;
68
- }
69
- fail(`generated client ${file} carries no Nomos structural requirement; recompile it with the current @githolon/dsl`);
70
- }
71
-
72
- /** The CURRENT requirement carried by the generated client that will ship. */
73
- async function loadCurrentInterface(pkgDir: string, name: string): Promise<InterfaceMap> {
74
- const p = path.join(pkgDir, "build", `${name}.client.mjs`);
75
- if (!existsSync(p)) {
76
- fail(
77
- `no current generated client at ${p} — run \`githolon compile\` first.`,
78
- );
79
- }
80
- return loadClientRequirement(p);
81
- }
82
-
83
- /** Read a TARGET requirement from the generated client it will ship. */
84
- async function loadFileOffer(arg: string): Promise<{ offer: InterfaceMap; source: string }> {
85
- const abs = path.resolve(process.cwd(), arg);
86
- if (!existsSync(abs)) fail(`target not found: ${abs}`);
87
- let file = abs;
88
- if (statSync(abs).isDirectory()) {
89
- const scan = (d: string): string | undefined => {
90
- if (!existsSync(d)) return undefined;
91
- const hit = readdirSync(d).find((f) => f.endsWith(".client.mjs"));
92
- return hit !== undefined ? path.join(d, hit) : undefined;
93
- };
94
- const found = scan(abs) ?? scan(path.join(abs, "build"));
95
- if (found === undefined) fail(`no *.client.mjs under ${abs}`);
96
- file = found;
97
- }
98
- return { offer: await loadClientRequirement(file), source: file };
99
- }
100
-
101
- /** Read a LIVE workspace's on-ledger offer through the compiler-private runtime bundled with the DSL. */
102
- /**
103
- * Parse a live compat target URL into its cloud BASE and workspace. The base is everything BEFORE
104
- * `/v2/workspaces/` — NOT just the origin — so a gateway mounted under a PATH PREFIX
105
- * (`https://host/nomos/cloud/v2/workspaces/<ws>`) keeps that prefix. Otherwise the client would fetch the
106
- * runtime at the wrong base (`https://host/v1/runtime/holon.wasm` 404s instead of
107
- * `https://host/nomos/cloud/v1/runtime/holon.wasm`). Split on the marker so an arbitrary-depth prefix
108
- * survives; without the marker the whole URL (a `--workspace`-paired base) is the cloud.
109
- */
110
- export function parseLiveTarget(
111
- url: string,
112
- workspaceFlag?: string,
113
- ): { cloud: string; workspace: string | undefined } {
114
- const marker = "/v2/workspaces/";
115
- const at = url.indexOf(marker);
116
- const cloud = (at >= 0 ? url.slice(0, at) : url.replace(/[?#].*$/, "")).replace(/\/+$/, "");
117
- const wsFromUrl = at >= 0 ? url.slice(at + marker.length).split(/[/?#]/)[0] : undefined;
118
- const workspace = workspaceFlag ?? (wsFromUrl !== undefined && wsFromUrl !== "" ? wsFromUrl : undefined);
119
- return { cloud, workspace };
120
- }
121
-
122
- async function loadLiveOffer(url: string, workspaceFlag?: string): Promise<{ offer: InterfaceMap; source: string }> {
123
- if (!/^https?:\/\//.test(url)) fail(`could not parse the live target URL: ${url}`);
124
- const { cloud, workspace } = parseLiveTarget(url, workspaceFlag);
125
- if (!workspace) fail(`live target needs a workspace — use https://host/v2/workspaces/<ws> or add --workspace <ws>`);
126
- let read: (cloud: string, workspace: string) => Promise<Record<string, unknown> | null>;
127
- try {
128
- const dynamicImport = Function("specifier", "return import(specifier)") as (specifier: string) => Promise<unknown>;
129
- const runtime = await dynamicImport(new URL("../runtime/generated-application-host.js", import.meta.url).href) as {
130
- nomosInternalReadWorkspaceInterface?: typeof read;
131
- };
132
- if (typeof runtime.nomosInternalReadWorkspaceInterface !== "function") throw new Error("operator reader absent");
133
- read = runtime.nomosInternalReadWorkspaceInterface;
134
- } catch {
135
- fail(`live target inspection is missing from this @githolon/dsl installation; reinstall the current release`);
136
- }
137
- const offer = await read(cloud, workspace) as InterfaceMap | null;
138
- if (offer === null) fail(`workspace '${workspace}' exposes no on-ledger structural interface (pre-#72e law)`);
139
- return { offer, source: `${cloud}/v2/workspaces/${workspace}` };
140
- }
141
-
142
- interface MemberReport {
143
- member: string;
144
- kind: "directive" | "aggregate";
145
- ok: boolean;
146
- reason?: string;
147
- }
148
-
149
- async function main(): Promise<void> {
150
- const argv = process.argv.slice(2);
151
- const flagVal = (name: string): string | undefined => {
152
- const i = argv.indexOf(name);
153
- if (i >= 0) return argv[i + 1];
154
- const inline = argv.find((a) => a.startsWith(`${name}=`));
155
- return inline?.slice(name.length + 1);
156
- };
157
- const asJson = argv.includes("--json");
158
- const configArg = flagVal("--config") ?? "nomos.project.ts";
159
- const workspaceFlag = flagVal("--workspace");
160
- const domainFlag = flagVal("--domain");
161
- // The positional target = the first non-flag arg that isn't a flag VALUE.
162
- const flagsWithVals = new Set(["--config", "--workspace", "--domain"]);
163
- const target = argv.find((a, i) => !a.startsWith("--") && !(i > 0 && flagsWithVals.has(argv[i - 1]!)));
164
- if (!target) fail(`usage: githolon compat <workspace-url | client.mjs | dir> [--config <cfg>] [--workspace <ws>] [--domain <name,...>] [--json]`);
165
-
166
- const { name, dir } = await loadPackageName(configArg);
167
- const allCurrent = await loadCurrentInterface(dir, name);
168
- const requestedDomains = domainFlag?.split(",").map((domain) => domain.trim()).filter(Boolean) ?? [];
169
- for (const domain of requestedDomains) {
170
- if (allCurrent[domain] === undefined) fail(`current package '${name}' has no domain '${domain}'`);
171
- }
172
- const current = requestedDomains.length === 0
173
- ? allCurrent
174
- : Object.fromEntries(requestedDomains.map((domain) => [domain, allCurrent[domain]!]));
175
-
176
- const { offer, source } = /^https?:\/\//.test(target)
177
- ? await loadLiveOffer(target, workspaceFlag)
178
- : await loadFileOffer(target);
179
-
180
- // The subtype check is PER MEMBER over the merged interfaces (directives keyed by id, aggregates by label).
181
- const verdicts = memberVerdicts(mergeInterfaces(current), mergeInterfaces(offer));
182
- // Tag each member's kind for the report (a directive id vs an aggregate label).
183
- const merged = mergeInterfaces(current);
184
- const dirIds = new Set(Object.keys(merged.directives));
185
- const reports: MemberReport[] = Object.entries(verdicts)
186
- .map(([member, v]: [string, MemberVerdict]) => ({
187
- member,
188
- kind: (dirIds.has(member) ? "directive" : "aggregate") as MemberReport["kind"],
189
- ok: v.ok,
190
- ...(v.reason !== undefined ? { reason: v.reason } : {}),
191
- }))
192
- .sort((a, b) => (a.member < b.member ? -1 : a.member > b.member ? 1 : 0));
193
-
194
- const incompatible = reports.filter((r) => !r.ok);
195
- const verdict = incompatible.length > 0 ? "incompatible" : "compatible";
196
-
197
- if (asJson) {
198
- process.stdout.write(JSON.stringify({ package: name, target: source, verdict, members: reports }) + "\n");
199
- process.exit(incompatible.length > 0 ? 1 : 0);
200
- }
201
-
202
- console.log(`githolon compat: package '${name}' vs ${source}`);
203
- console.log(` ${reports.length} member(s) checked — ${verdict.toUpperCase()}`);
204
- for (const r of reports) {
205
- const mark = r.ok ? " ✓ " : " ✗ ";
206
- console.log(`${mark}${r.kind} '${r.member}'${r.ok ? "" : ` — ${r.reason}`}`);
207
- }
208
- if (incompatible.length > 0) {
209
- console.log(
210
- `\ngitholon compat: ${incompatible.length} incompatible member(s) — this client cannot ship against that law. ` +
211
- `Recompile + regenerate the client (githolon compile), or deploy a law that still exposes these members.`,
212
- );
213
- } else {
214
- console.log(`\ngitholon compat: all members compatible — safe to ship.`);
215
- }
216
- process.exit(incompatible.length > 0 ? 1 : 0);
217
- }
218
-
219
- // Run ONLY as the entry point (the compat launcher), never on import (the test imports parseLiveTarget).
220
- {
221
- const { pathToFileURL } = await import("node:url");
222
- const entry = process.argv[1];
223
- if (entry !== undefined && import.meta.url === pathToFileURL(entry).href) void main();
224
- }