@githolon/dsl 0.101.6 → 0.102.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 (120) hide show
  1. package/dart/CHANGELOG.md +13 -0
  2. package/dart/lib/nomos_client.dart +3 -52
  3. package/dart/lib/src/dev_cloud.dart +5 -0
  4. package/dart/lib/src/home.dart +10 -15
  5. package/dart/lib/src/nms_conformance_runtime.dart +12 -0
  6. package/dart/lib/src/nms_generated_runtime.dart +29 -0
  7. package/dart/lib/src/nms_test_environment.dart +8 -0
  8. package/dart/lib/src/node_runner_transport.dart +56 -18
  9. package/dart/lib/src/provider.dart +5 -1
  10. package/dart/lib/src/record_origin.dart +55 -0
  11. package/dart/lib/src/runner/node-entry.mjs +9105 -0
  12. package/dart/lib/src/runner/offline-install.mjs +4729 -0
  13. package/dart/lib/src/session_bound.dart +23 -10
  14. package/dart/lib/src/source_trust.dart +51 -0
  15. package/dart/lib/src/test_harness.dart +490 -58
  16. package/dart/lib/src/webview_bridge.dart +167 -58
  17. package/dart/lib/src/workspace_name.dart +7 -1
  18. package/dart/pubspec.lock +3 -3
  19. package/dart/pubspec.yaml +4 -2
  20. package/dart/test/acquire_session_credentials_test.dart +34 -17
  21. package/dart/test/acquire_session_test.dart +109 -24
  22. package/dart/test/adv_realm_interference_test.dart +227 -99
  23. package/dart/test/bundle_version_pairing_test.dart +1 -1
  24. package/dart/test/cloud_bound_topology_test.dart +1 -1
  25. package/dart/test/cluster_attested_test.dart +52 -35
  26. package/dart/test/cluster_births_test.dart +5 -2
  27. package/dart/test/cluster_device_keyed_acceptance_test.dart +5 -2
  28. package/dart/test/cluster_local_autosync_test.dart +5 -2
  29. package/dart/test/cluster_scale_test.dart +5 -2
  30. package/dart/test/compat_test.dart +1 -1
  31. package/dart/test/dlq_session_surface_test.dart +2 -1
  32. package/dart/test/errors_test.dart +1 -1
  33. package/dart/test/first_app_gauntlet_test.dart +78 -51
  34. package/dart/test/four_layer_nested_topology_test.dart +1 -1
  35. package/dart/test/harness_phase_timeout_test.dart +1 -1
  36. package/dart/test/home_parity_test.dart +9 -5
  37. package/dart/test/local_sync_inert_test.dart +22 -14
  38. package/dart/test/node_runner_transport_test.dart +9 -5
  39. package/dart/test/null_slot_test.dart +1 -1
  40. package/dart/test/parent_signer_recovery_test.dart +5 -2
  41. package/dart/test/schema_validation_test.dart +1 -1
  42. package/dart/test/sealing_client_test.dart +2 -1
  43. package/dart/test/session_bound_test.dart +92 -119
  44. package/dart/test/stale_bundle_test.dart +1 -1
  45. package/dart/test/test_harness_test.dart +77 -22
  46. package/dart/test/vo_read_typing_test.dart +32 -14
  47. package/dart/test/watch_after_offer_stall_test.dart +2 -1
  48. package/dart/test/webview_bridge_test.dart +17 -4
  49. package/dart/test/wire_test.dart +1 -1
  50. package/dart_types/CHANGELOG.md +8 -0
  51. package/dart_types/lib/nomos_types.dart +7 -6
  52. package/dart_types/lib/src/activity.dart +23 -13
  53. package/dart_types/lib/src/foreign_ref.dart +61 -112
  54. package/dart_types/lib/src/invitation.dart +96 -0
  55. package/dart_types/lib/src/nomos_ref.dart +97 -59
  56. package/dart_types/pubspec.yaml +1 -1
  57. package/dart_types/test/surfaced_test.dart +125 -19
  58. package/package.json +7 -3
  59. package/runtime/generated-application-host.js +8851 -0
  60. package/src/activity.ts +2 -2
  61. package/src/aggregate.ts +24 -1
  62. package/src/application_composition.ts +282 -0
  63. package/src/application_topology.ts +151 -0
  64. package/src/attested_core.ts +2 -2
  65. package/src/authoring_context.ts +9 -0
  66. package/src/birth_meter_ensure.ts +1 -1
  67. package/src/births.ts +53 -5
  68. package/src/build_package.ts +79 -71
  69. package/src/business_birth.ts +93 -10
  70. package/src/clear_directive.ts +3 -1
  71. package/src/codegen_dart.ts +369 -420
  72. package/src/codegen_dart_application.ts +1508 -0
  73. package/src/codegen_dart_client.ts +156 -95
  74. package/src/codegen_dart_scenario.ts +299 -0
  75. package/src/codegen_openapi.ts +8 -3
  76. package/src/codegen_proof.ts +1113 -1137
  77. package/src/codegen_provider_dart.ts +12 -1
  78. package/src/codegen_ts.ts +1176 -496
  79. package/src/compat_package_main.ts +22 -10
  80. package/src/compile_package_main.ts +1536 -337
  81. package/src/contract.ts +10 -4
  82. package/src/dart_barrel_guard.ts +5 -1
  83. package/src/describe_model.ts +13 -5
  84. package/src/directive.ts +244 -5
  85. package/src/engine_entry.ts +56 -13
  86. package/src/engine_javascript.ts +31 -0
  87. package/src/evolve_preview.ts +3 -12
  88. package/src/framework/application_home.ts +24 -10
  89. package/src/framework/capability.ts +15 -1
  90. package/src/framework/domain_lifecycle.ts +8 -0
  91. package/src/framework/framework_aggregates.ts +2 -2
  92. package/src/framework/genesis.ts +11 -1
  93. package/src/framework/home.ts +178 -75
  94. package/src/framework/impure_capability.ts +24 -7
  95. package/src/framework/relations.ts +13 -5
  96. package/src/framework/workspaces.ts +13 -12
  97. package/src/generated_client_names.ts +42 -3
  98. package/src/idof_lint.ts +65 -13
  99. package/src/index.ts +46 -12
  100. package/src/intent.ts +587 -0
  101. package/src/law_check.ts +64 -16
  102. package/src/precondition.ts +16 -4
  103. package/src/read_projection_namespace.ts +2 -7
  104. package/src/recipient.ts +33 -0
  105. package/src/relation_schema.ts +93 -0
  106. package/src/secondary_ensure.ts +11 -2
  107. package/src/shape_compat.ts +11 -1
  108. package/src/usd.ts +30 -8
  109. package/src/usd_layers.ts +447 -246
  110. package/src/usd_state.ts +1 -1
  111. package/src/value_object.ts +49 -13
  112. package/src/wire_encode.ts +124 -26
  113. package/src/workspace_sharing.ts +269 -0
  114. package/src/zod_introspection.ts +84 -0
  115. package/dart/example/nomos_secure_key_store.dart +0 -82
  116. package/dart/example/nomos_webview_transport.dart +0 -63
  117. package/dart/lib/nomos_headless.dart +0 -50
  118. package/dart/lib/testing.dart +0 -14
  119. package/dart/test/co2_product_gauntlet_test.dart +0 -244
  120. package/src/framework/identity.ts +0 -537
@@ -5,7 +5,7 @@
5
5
  // cluster_local_autosync_test.dart.
6
6
  import 'dart:async';
7
7
 
8
- import 'package:nomos_client/nomos_client.dart';
8
+ import 'package:nomos_client/src/nms_generated_runtime.dart';
9
9
  import 'package:test/test.dart';
10
10
 
11
11
  /// A fake runner: answers connect (after a real async gap, so concurrency is observable) and
@@ -13,11 +13,15 @@ import 'package:test/test.dart';
13
13
  class FakeRunner implements BridgeTransport {
14
14
  final _incoming = StreamController<Map<String, Object?>>.broadcast();
15
15
  final List<Map<String, Object?>> sent = [];
16
- final List<String> resident; // workspaces the plane already holds (realm.list())
16
+ final List<String>
17
+ resident; // workspaces the plane already holds (realm.list())
17
18
 
18
19
  FakeRunner({this.resident = const []}) {
19
- scheduleMicrotask(
20
- () => _incoming.add({'v': kWebviewBridgeVersion, 'event': 'ready', 'bundleVersion': 'unbundled-dev'}));
20
+ scheduleMicrotask(() => _incoming.add({
21
+ 'v': kWebviewBridgeVersion,
22
+ 'event': 'ready',
23
+ 'bundleVersion': 'unbundled-dev'
24
+ }));
21
25
  }
22
26
 
23
27
  int get connectCount => sent.where((m) => m['op'] == 'connect').length;
@@ -64,14 +68,16 @@ class FakeRunner implements BridgeTransport {
64
68
  default:
65
69
  result = {};
66
70
  }
67
- _incoming
68
- .add({'v': kWebviewBridgeVersion, 'id': id, 'ok': true, 'result': result});
71
+ _incoming.add(
72
+ {'v': kWebviewBridgeVersion, 'id': id, 'ok': true, 'result': result});
69
73
  });
70
74
  }
71
75
  }
72
76
 
73
77
  void main() {
74
- test('an already-connected session is reused — credentials NEVER invoked, no second connect', () async {
78
+ test(
79
+ 'an already-connected session is reused — credentials NEVER invoked, no second connect',
80
+ () async {
75
81
  final runner = FakeRunner();
76
82
  final bridge = NomosBridge(runner);
77
83
  await bridge.ready;
@@ -86,17 +92,21 @@ void main() {
86
92
  await bridge.dispose();
87
93
  });
88
94
 
89
- test('a plane-resident (parked) workspace opens LOCALLY — no cloud, credentials NOT invoked', () async {
95
+ test(
96
+ 'a plane-resident (parked) workspace opens LOCALLY — no cloud, credentials NOT invoked',
97
+ () async {
90
98
  final runner = FakeRunner(resident: ['estate']);
91
99
  final bridge = NomosBridge(runner);
92
100
  await bridge.ready;
93
101
 
94
102
  var asked = false;
95
- final s = await bridge.acquireSession('estate', ifAbsentCredentials: () async {
103
+ final s =
104
+ await bridge.acquireSession('estate', ifAbsentCredentials: () async {
96
105
  asked = true;
97
106
  return const NomosSessionCredentials(cloud: 'https://never.invalid');
98
107
  });
99
- expect(asked, isFalse, reason: 'a resident workspace never asks for credentials');
108
+ expect(asked, isFalse,
109
+ reason: 'a resident workspace never asks for credentials');
100
110
  expect(s.workspace, 'estate');
101
111
  expect(runner.connectCount, 1);
102
112
  expect(runner.connectArgs(0).containsKey('cloud'), isFalse,
@@ -104,7 +114,9 @@ void main() {
104
114
  await bridge.dispose();
105
115
  });
106
116
 
107
- test('concurrent acquisition SINGLE-FLIGHTS: one open, one credentials call, the same session', () async {
117
+ test(
118
+ 'concurrent acquisition SINGLE-FLIGHTS: one open, one credentials call, the same session',
119
+ () async {
108
120
  final runner = FakeRunner();
109
121
  final bridge = NomosBridge(runner);
110
122
  await bridge.ready;
@@ -122,8 +134,10 @@ void main() {
122
134
  bridge.acquireSession('cloudy', ifAbsentCredentials: creds),
123
135
  bridge.acquireSession('cloudy', ifAbsentCredentials: creds),
124
136
  ]);
125
- expect(credentialCalls, 1, reason: 'the credentials callback fires exactly once');
126
- expect(runner.connectCount, 1, reason: 'ONE connect for three concurrent acquires');
137
+ expect(credentialCalls, 1,
138
+ reason: 'the credentials callback fires exactly once');
139
+ expect(runner.connectCount, 1,
140
+ reason: 'ONE connect for three concurrent acquires');
127
141
  expect(identical(results[0], results[1]), isTrue);
128
142
  expect(identical(results[1], results[2]), isTrue);
129
143
  final args = runner.connectArgs(0);
@@ -133,7 +147,8 @@ void main() {
133
147
  await bridge.dispose();
134
148
  });
135
149
 
136
- test('genuinely absent + no credentials callback → a named StateError (never a silent cloudless mount)',
150
+ test(
151
+ 'genuinely absent + no credentials callback → a named StateError (never a silent cloudless mount)',
137
152
  () async {
138
153
  final runner = FakeRunner();
139
154
  final bridge = NomosBridge(runner);
@@ -143,7 +158,9 @@ void main() {
143
158
  await bridge.dispose();
144
159
  });
145
160
 
146
- test('a NomosSession delegates acquireSession to the parent plane (one registry)', () async {
161
+ test(
162
+ 'a NomosSession delegates acquireSession to the parent plane (one registry)',
163
+ () async {
147
164
  final runner = FakeRunner();
148
165
  final bridge = NomosBridge(runner);
149
166
  await bridge.ready;
@@ -157,17 +174,76 @@ void main() {
157
174
  await bridge.dispose();
158
175
  });
159
176
 
177
+ test('a resident child inherits its opening session identity', () async {
178
+ final runner = FakeRunner(resident: ['child']);
179
+ final bridge = NomosBridge(runner);
180
+ await bridge.ready;
181
+ await bridge.connect(
182
+ workspace: 'home',
183
+ session: 'home',
184
+ authToken: 'header.eyJzdWIiOiJhZGEifQ.signature',
185
+ );
186
+
187
+ final child = await bridge.session('home').acquireSession('child');
188
+
189
+ expect(child.principal, 'user:ada');
190
+ await bridge.dispose();
191
+ });
192
+
193
+ test(
194
+ 'a generated application session privately refreshes cloud access for an absent referenced workspace',
195
+ () async {
196
+ final runner = FakeRunner();
197
+ final bridge = NomosBridge(runner);
198
+ await bridge.ready;
199
+ await bridge.connect(
200
+ cloud: 'https://cloud.example',
201
+ workspace: 'home',
202
+ session: 'home',
203
+ authToken: 'header.eyJzdWIiOiJhZGEifQ.signature',
204
+ authorSecret: 'device-secret',
205
+ );
206
+ var refreshes = 0;
207
+ bridge.session('home').nomosInternalRetainCloudAccess(
208
+ cloud: 'https://cloud.example',
209
+ signIn: () async {
210
+ refreshes += 1;
211
+ return 'fresh-token-$refreshes';
212
+ },
213
+ );
214
+
215
+ final target = await bridge.session('home').acquireSession('shared-home');
216
+ expect(target.workspace, 'shared-home');
217
+ expect(refreshes, 1);
218
+ expect(runner.connectArgs(1)['cloud'], 'https://cloud.example');
219
+ expect(runner.connectArgs(1)['authToken'], 'fresh-token-1');
220
+ expect(runner.connectArgs(1)['authorSecret'], 'device-secret');
221
+ expect(target.principal, 'user:ada');
222
+
223
+ // The retained posture follows the opened handle, so navigation can continue without a public lane.
224
+ final child = await target.acquireSession('shared-child');
225
+ expect(child.workspace, 'shared-child');
226
+ expect(refreshes, 2);
227
+ expect(runner.connectArgs(2)['authToken'], 'fresh-token-2');
228
+ await bridge.dispose();
229
+ });
230
+
160
231
  // ── SESSION-STATE DX cluster (co2): explicit lifecycle state + fail-at-bind + openable refs ──
161
232
 
162
- test('listWorkspaces() reports explicit state: resident/parked before open, connected after', () async {
163
- final runner = FakeRunner(resident: ['estate']); // realm returns mounted:false, parked:true
233
+ test(
234
+ 'listWorkspaces() reports explicit state: resident/parked before open, connected after',
235
+ () async {
236
+ final runner = FakeRunner(
237
+ resident: ['estate']); // realm returns mounted:false, parked:true
164
238
  final bridge = NomosBridge(runner);
165
239
  await bridge.ready;
166
240
 
167
241
  // Before any connect: the plane-resident (parked) workspace surfaces with an explicit non-connected state.
168
242
  var list = await bridge.listWorkspaces();
169
243
  final before = list.firstWhere((w) => w['workspace'] == 'estate');
170
- expect(before['state'], 'parked', reason: 'parked custody is not connected — the app must acquire it first');
244
+ expect(before['state'], 'parked',
245
+ reason:
246
+ 'parked custody is not connected — the app must acquire it first');
171
247
 
172
248
  // After connecting it, the SAME workspace reports connected.
173
249
  await bridge.connect(workspace: 'estate', session: 'estate');
@@ -177,7 +253,9 @@ void main() {
177
253
  await bridge.dispose();
178
254
  });
179
255
 
180
- test('NomosSession.isConnected + assertConnected: fail at BIND, not on first query', () async {
256
+ test(
257
+ 'NomosSession.isConnected + assertConnected: fail at BIND, not on first query',
258
+ () async {
181
259
  final runner = FakeRunner();
182
260
  final bridge = NomosBridge(runner);
183
261
  await bridge.ready;
@@ -194,25 +272,32 @@ void main() {
194
272
  await bridge.dispose();
195
273
  });
196
274
 
197
- test('NomosRef.acquire(bridge) opens a born/resident ref directly → a live session', () async {
275
+ test(
276
+ 'NomosRef.acquire(bridge) opens a born/resident ref directly → a live session',
277
+ () async {
198
278
  final runner = FakeRunner(resident: ['estate-42']);
199
279
  final bridge = NomosBridge(runner);
200
280
  await bridge.ready;
201
281
 
202
282
  // The shape a `.births()` outcome yields: outcome.bornRefs.single is a NomosRef on the born workspace.
203
- final ref = NomosRef(workspace: 'estate-42', type: 'nomos.Workspace', id: 'estate-42');
204
- final session = await ref.acquire(bridge); // no credentials — resident opens local-only
283
+ final ref = NmsInternalNomosRefs.create<Object?>(
284
+ workspace: 'estate-42', type: 'nomos.Workspace', id: 'estate-42');
285
+ final session =
286
+ await ref.acquire(bridge); // no credentials — resident opens local-only
205
287
  expect(session.workspace, 'estate-42');
206
288
  expect(session.isConnected, isTrue);
207
289
  expect(identical(session, bridge.session('estate-42')), isTrue);
208
290
  await bridge.dispose();
209
291
  });
210
292
 
211
- test('NomosRef.acquire refuses a workspace-less ref (a bad locator fails HERE, not later)', () async {
293
+ test(
294
+ 'NomosRef.acquire refuses a workspace-less ref (a bad locator fails HERE, not later)',
295
+ () async {
212
296
  final runner = FakeRunner();
213
297
  final bridge = NomosBridge(runner);
214
298
  await bridge.ready;
215
- final bad = NomosRef(workspace: '', type: 'nomos.Workspace', id: 'x');
299
+ final bad = NmsInternalNomosRefs.create<Object?>(
300
+ workspace: '', type: 'nomos.Workspace', id: 'x');
216
301
  expect(() => bad.acquire(bridge), throwsArgumentError);
217
302
  await bridge.dispose();
218
303
  });