@githolon/dsl 0.101.6 → 0.102.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.
- package/dart/CHANGELOG.md +13 -0
- package/dart/lib/nomos_client.dart +3 -52
- package/dart/lib/src/dev_cloud.dart +5 -0
- package/dart/lib/src/home.dart +10 -15
- package/dart/lib/src/nms_conformance_runtime.dart +12 -0
- package/dart/lib/src/nms_generated_runtime.dart +29 -0
- package/dart/lib/src/nms_test_environment.dart +8 -0
- package/dart/lib/src/node_runner_transport.dart +56 -18
- package/dart/lib/src/provider.dart +5 -1
- package/dart/lib/src/record_origin.dart +55 -0
- package/dart/lib/src/runner/node-entry.mjs +9105 -0
- package/dart/lib/src/runner/offline-install.mjs +4729 -0
- package/dart/lib/src/session_bound.dart +23 -10
- package/dart/lib/src/source_trust.dart +51 -0
- package/dart/lib/src/test_harness.dart +490 -58
- package/dart/lib/src/webview_bridge.dart +167 -58
- package/dart/lib/src/workspace_name.dart +7 -1
- package/dart/pubspec.lock +3 -3
- package/dart/pubspec.yaml +4 -2
- package/dart/test/acquire_session_credentials_test.dart +34 -17
- package/dart/test/acquire_session_test.dart +109 -24
- package/dart/test/adv_realm_interference_test.dart +227 -99
- package/dart/test/bundle_version_pairing_test.dart +1 -1
- package/dart/test/cloud_bound_topology_test.dart +1 -1
- package/dart/test/cluster_attested_test.dart +52 -35
- package/dart/test/cluster_births_test.dart +5 -2
- package/dart/test/cluster_device_keyed_acceptance_test.dart +5 -2
- package/dart/test/cluster_local_autosync_test.dart +5 -2
- package/dart/test/cluster_scale_test.dart +5 -2
- package/dart/test/compat_test.dart +1 -1
- package/dart/test/dlq_session_surface_test.dart +2 -1
- package/dart/test/errors_test.dart +1 -1
- package/dart/test/first_app_gauntlet_test.dart +78 -51
- package/dart/test/four_layer_nested_topology_test.dart +1 -1
- package/dart/test/harness_phase_timeout_test.dart +1 -1
- package/dart/test/home_parity_test.dart +9 -5
- package/dart/test/local_sync_inert_test.dart +22 -14
- package/dart/test/node_runner_transport_test.dart +9 -5
- package/dart/test/null_slot_test.dart +1 -1
- package/dart/test/parent_signer_recovery_test.dart +5 -2
- package/dart/test/schema_validation_test.dart +1 -1
- package/dart/test/sealing_client_test.dart +2 -1
- package/dart/test/session_bound_test.dart +92 -119
- package/dart/test/stale_bundle_test.dart +1 -1
- package/dart/test/test_harness_test.dart +77 -22
- package/dart/test/vo_read_typing_test.dart +32 -14
- package/dart/test/watch_after_offer_stall_test.dart +2 -1
- package/dart/test/webview_bridge_test.dart +17 -4
- package/dart/test/wire_test.dart +1 -1
- package/dart_types/CHANGELOG.md +8 -0
- package/dart_types/lib/nomos_types.dart +7 -6
- package/dart_types/lib/src/activity.dart +23 -13
- package/dart_types/lib/src/foreign_ref.dart +61 -112
- package/dart_types/lib/src/invitation.dart +96 -0
- package/dart_types/lib/src/nomos_ref.dart +97 -59
- package/dart_types/pubspec.yaml +1 -1
- package/dart_types/test/surfaced_test.dart +125 -19
- package/package.json +7 -3
- package/runtime/generated-application-host.js +8851 -0
- package/src/activity.ts +2 -2
- package/src/aggregate.ts +24 -1
- package/src/application_composition.ts +282 -0
- package/src/application_topology.ts +151 -0
- package/src/attested_core.ts +2 -2
- package/src/authoring_context.ts +9 -0
- package/src/birth_meter_ensure.ts +1 -1
- package/src/births.ts +53 -5
- package/src/build_package.ts +79 -71
- package/src/business_birth.ts +93 -10
- package/src/clear_directive.ts +3 -1
- package/src/codegen_dart.ts +369 -420
- package/src/codegen_dart_application.ts +1508 -0
- package/src/codegen_dart_client.ts +156 -95
- package/src/codegen_dart_scenario.ts +299 -0
- package/src/codegen_openapi.ts +8 -3
- package/src/codegen_proof.ts +1113 -1137
- package/src/codegen_provider_dart.ts +12 -1
- package/src/codegen_ts.ts +1176 -496
- package/src/compat_package_main.ts +22 -10
- package/src/compile_package_main.ts +1536 -337
- package/src/contract.ts +10 -4
- package/src/dart_barrel_guard.ts +5 -1
- package/src/describe_model.ts +13 -5
- package/src/directive.ts +244 -5
- package/src/engine_entry.ts +56 -13
- package/src/engine_javascript.ts +31 -0
- package/src/evolve_preview.ts +3 -12
- package/src/framework/application_home.ts +24 -10
- package/src/framework/capability.ts +15 -1
- package/src/framework/domain_lifecycle.ts +8 -0
- package/src/framework/framework_aggregates.ts +2 -2
- package/src/framework/genesis.ts +11 -1
- package/src/framework/home.ts +178 -75
- package/src/framework/impure_capability.ts +24 -7
- package/src/framework/relations.ts +13 -5
- package/src/framework/workspaces.ts +13 -12
- package/src/generated_client_names.ts +42 -3
- package/src/idof_lint.ts +65 -13
- package/src/index.ts +46 -12
- package/src/intent.ts +587 -0
- package/src/law_check.ts +64 -16
- package/src/precondition.ts +16 -4
- package/src/read_projection_namespace.ts +2 -7
- package/src/recipient.ts +33 -0
- package/src/relation_schema.ts +93 -0
- package/src/secondary_ensure.ts +11 -2
- package/src/shape_compat.ts +11 -1
- package/src/usd.ts +30 -8
- package/src/usd_layers.ts +447 -246
- package/src/usd_state.ts +1 -1
- package/src/value_object.ts +49 -13
- package/src/wire_encode.ts +124 -26
- package/src/workspace_sharing.ts +269 -0
- package/src/zod_introspection.ts +84 -0
- package/dart/example/nomos_secure_key_store.dart +0 -82
- package/dart/example/nomos_webview_transport.dart +0 -63
- package/dart/lib/nomos_headless.dart +0 -50
- package/dart/lib/testing.dart +0 -14
- package/dart/test/co2_product_gauntlet_test.dart +0 -244
- 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/
|
|
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>
|
|
16
|
+
final List<String>
|
|
17
|
+
resident; // workspaces the plane already holds (realm.list())
|
|
17
18
|
|
|
18
19
|
FakeRunner({this.resident = const []}) {
|
|
19
|
-
scheduleMicrotask(
|
|
20
|
-
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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 =
|
|
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,
|
|
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(
|
|
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,
|
|
126
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
163
|
-
|
|
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',
|
|
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(
|
|
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(
|
|
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 =
|
|
204
|
-
|
|
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(
|
|
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 =
|
|
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
|
});
|