@ibgib/space-gib 0.0.5 → 0.0.7

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 (58) hide show
  1. package/README.md +20 -0
  2. package/dist/client/bootstrap.mjs +31 -31
  3. package/dist/client/bootstrap.mjs.map +3 -3
  4. package/dist/client/chunk-RXFIBFRK.mjs +42 -0
  5. package/dist/client/chunk-RXFIBFRK.mjs.map +7 -0
  6. package/dist/client/chunk-ULFNE26Y.mjs +2216 -0
  7. package/dist/client/chunk-ULFNE26Y.mjs.map +7 -0
  8. package/dist/client/index.html +35 -14
  9. package/dist/client/index.mjs +1 -1
  10. package/dist/client/script.mjs +1 -1
  11. package/dist/client/style.css +29 -5
  12. package/dist/server/server.mjs +1447 -270
  13. package/dist/server/server.mjs.map +4 -4
  14. package/package.json +5 -5
  15. package/space-gib.localhost-1783713259760.log +45 -0
  16. package/src/client/AUTO-GENERATED-version.mts +1 -1
  17. package/src/client/bootstrap.mts +9 -0
  18. package/src/client/components/identity-header/identity-header.css +40 -2
  19. package/src/client/components/identity-header/identity-header.html +3 -2
  20. package/src/client/components/identity-header/identity-header.mts +127 -49
  21. package/src/client/components/identity-manager/identity-manager.css +57 -353
  22. package/src/client/components/identity-manager/identity-manager.html +0 -94
  23. package/src/client/components/identity-manager/identity-manager.mts +356 -484
  24. package/src/client/components/keystone-creator/keystone-creator.mts +90 -13
  25. package/src/client/components/keystone-details/keystone-details.css +472 -0
  26. package/src/client/components/keystone-details/keystone-details.html +99 -0
  27. package/src/client/components/keystone-details/keystone-details.mts +821 -0
  28. package/src/client/components/keystone-scrubber/SCRUBBER_IMPLEMENTATION.md +33 -0
  29. package/src/client/components/keystone-scrubber/keystone-scrubber.css +46 -0
  30. package/src/client/components/keystone-scrubber/keystone-scrubber.html +15 -0
  31. package/src/client/components/keystone-scrubber/keystone-scrubber.mts +356 -0
  32. package/src/client/dev-tools/common.mts +505 -10
  33. package/src/client/dev-tools/phase-4-1.mts +19 -4
  34. package/src/client/dev-tools/phase-4-10.mts +77 -305
  35. package/src/client/dev-tools/phase-4-2.mts +46 -212
  36. package/src/client/dev-tools/phase-4-3.mts +57 -198
  37. package/src/client/dev-tools/phase-4-4.mts +57 -170
  38. package/src/client/dev-tools/phase-4-5.mts +48 -204
  39. package/src/client/dev-tools/phase-4-6.mts +37 -103
  40. package/src/client/dev-tools/phase-4-7.mts +44 -228
  41. package/src/client/dev-tools/phase-4-8.mts +33 -136
  42. package/src/client/dev-tools/phase-4-9.mts +33 -137
  43. package/src/client/dev-tools/phase-4.mts +30 -6
  44. package/src/client/dev-tools.mts +18 -0
  45. package/src/client/index.html +35 -14
  46. package/src/client/style.css +29 -5
  47. package/src/client/types.mts +4 -1
  48. package/src/client/ui/shell/space-gib-shell-service.mts +4 -0
  49. package/src/server/path-constants.mts +12 -0
  50. package/src/server/serve-gib/handlers/api/keystone/sso-config.handler.mts +66 -0
  51. package/src/server/serve-gib/handlers/api/keystone/sso-link.handler.mts +119 -0
  52. package/src/server/serve-gib/handlers/api/keystone/sso-login.handler.mts +189 -0
  53. package/src/server/server.mts +6 -0
  54. package/dist/client/chunk-ANGVYAEK.mjs +0 -42
  55. package/dist/client/chunk-ANGVYAEK.mjs.map +0 -7
  56. package/dist/client/chunk-IRGFDQRD.mjs +0 -1920
  57. package/dist/client/chunk-IRGFDQRD.mjs.map +0 -7
  58. package/dist/respec-gib.node.mjs +0 -5
@@ -1,21 +1,20 @@
1
1
  // #region Imports
2
- import { extractErrorMsg, getUUID, getTimestamp, pretty } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
2
+ import { extractErrorMsg, getUUID, pretty } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
3
3
  import { Factory_V1 as factory } from '@ibgib/ts-gib/dist/V1/factory.mjs';
4
4
  import { ROOT } from '@ibgib/ts-gib/dist/V1/constants.mjs';
5
5
  import { getIbGibAddr } from '@ibgib/ts-gib/dist/helper.mjs';
6
6
  import { KeystoneIbGib_V1 } from '@ibgib/core-gib/dist/keystone/keystone-types.mjs';
7
- import { KeystoneService_V1 } from '@ibgib/core-gib/dist/keystone/keystone-service-v1.mjs';
8
7
  import { getGlobalMetaspace_waitIfNeeded } from "@ibgib/web-gib/dist/helpers.mjs";
9
8
  import { mut8Timeline, appendToTimeline } from '@ibgib/core-gib/dist/timeline/timeline-api.mjs';
10
9
  import { getTjpAddr } from '@ibgib/core-gib/dist/common/other/ibgib-helper.mjs';
11
- import { SyncPeerWebSocketSender_V1 } from '@ibgib/core-gib/dist/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-sender/sync-peer-websocket-sender-v1.mjs';
12
10
  import { SyncSagaCoordinator } from '@ibgib/core-gib/dist/sync/sync-saga-coordinator.mjs';
13
- import { SyncConflictStrategy } from '@ibgib/core-gib/dist/sync/sync-constants.mjs';
14
11
  import { GRAFT_BASE_REL8N_NAME, GRAFT_ORPHAN_REL8N_NAME, GRAFT_INFO_REL8N_NAME } from '@ibgib/core-gib/dist/sync/graft-info/graft-info-constants.mjs';
15
- import { SESSION_KEYSTONE_POLICY, getSpaceGibPoolConfig } from "../../common/keystone-policies.mjs";
16
12
  import { SpaceGibApiBridge } from '../api/space-gib-api-bridge.mjs';
17
13
 
18
- import { debugState, devLog } from './common.mjs';
14
+ import {
15
+ debugState, devLog, lc,
16
+ setupDomainAndDelegateIdentities, runSyncPass, runSyncPassFromSpace, copyIdentitiesToSpace
17
+ } from './common.mjs';
19
18
  import { IbGibAddr } from '@ibgib/ts-gib/dist/types.mjs';
20
19
  // #endregion Imports
21
20
 
@@ -51,34 +50,20 @@ export function init4_10bSetupButton(): void {
51
50
  const space = await metaspace.getLocalUserSpace({}) as any;
52
51
  if (!space) { throw new Error("No default space."); }
53
52
 
54
- const keystoneService = new KeystoneService_V1();
55
- const protocol = location.protocol === 'https:' ? 'wss:' : 'ws:';
53
+ const apiBridge = new SpaceGibApiBridge();
56
54
 
57
- // 1. Generate Domain User Identity
58
- const domainI = await keystoneService.genesis({
55
+ // 1. Create domain + delegate identities (DRY helper)
56
+ await setupDomainAndDelegateIdentities({
59
57
  masterSecret: 'test-sender-secret-phase4-10b',
60
- configs: [
61
- getSpaceGibPoolConfig('sync', 'senderidentitysyncsaltphase4-10b'),
62
- getSpaceGibPoolConfig('manage', 'senderidentitymanagesaltphase4-10b'),
63
- ],
64
- metaspace,
65
- space,
66
- frameDetails: { client: 'space-gib-web-dev', timestamp: getTimestamp() }
58
+ syncSalt: 'senderidentitysyncsaltphase4-10b',
59
+ manageSalt: 'senderidentitymanagesaltphase4-10b',
60
+ metaspace, space, apiBridge,
61
+ phaseText: '4.10B'
67
62
  });
68
-
63
+ const domainI = debugState.domainI!;
69
64
  state.domainI_initial = domainI;
70
65
  state.domainI_latest = domainI;
71
- let domainI_latest = domainI;
72
66
  const domainAddr = getIbGibAddr({ ibGib: domainI });
73
- devLog(`4.10B Setup: ✓ Created identity: ${domainAddr}`);
74
-
75
- // Register on server
76
- const apiBridge = new SpaceGibApiBridge();
77
- const resGenesis = await apiBridge.postGenesisKeystone(domainI);
78
- if (!resGenesis.success) {
79
- throw new Error(`Server rejected genesis domain keystone: ${resGenesis.message}`);
80
- }
81
- devLog('4.10B Setup: ✓ Identity registered on server.');
82
67
 
83
68
  // 2. Create the divergent "remote" space
84
69
  devLog('4.10B Setup: Creating temporary remote space...');
@@ -92,9 +77,8 @@ export function init4_10bSetupButton(): void {
92
77
  await remoteSpace.initialized;
93
78
  state.remoteSpace = remoteSpace;
94
79
 
95
- // Copy user identity to remote space
96
- await metaspace.put({ ibGib: domainI, space: remoteSpace });
97
- await metaspace.registerNewIbGib({ ibGib: domainI, space: remoteSpace });
80
+ // Copy user identity and delegate to remote space
81
+ await copyIdentitiesToSpace({ domainI, metaspace, fromSpace: space, toSpace: remoteSpace });
98
82
 
99
83
  // 3. Seed common history (Round 1) locally in default space
100
84
  devLog('4.10B Setup: Creating common history for alpha...');
@@ -119,43 +103,17 @@ export function init4_10bSetupButton(): void {
119
103
 
120
104
  // Sync alpha_v0 to server immediately so server has it
121
105
  devLog('4.10B Setup: Seeding alpha_v0 to server...');
122
- const senderPeerInit = new SyncPeerWebSocketSender_V1({
123
- classname: 'SyncPeerWebSocketSender_V1',
124
- httpEvolveUrl: `${location.protocol}//${location.host}/api/keystone/evolve/${encodeURIComponent(domainAddr)}`,
125
- wsUrl: `${protocol}//${location.host}/api/sync/ws/${encodeURIComponent(domainAddr)}`
126
- });
127
- const coordinatorInit = new SyncSagaCoordinator();
128
- await senderPeerInit.initializeOpts({
129
- localMetaspace: metaspace,
130
- localSpace: space,
131
- senderIdentity: domainI,
132
- fnSenderSecret: async () => 'test-sender-secret-phase4-10b',
133
- sessionConnectPoolConfig: SESSION_KEYSTONE_POLICY.CONNECT_POOL as any,
134
- sessionSyncPoolConfig: SESSION_KEYSTONE_POLICY.DEFAULT_POOL as any,
135
- targetAddrs: [domainAddr]
136
- });
137
- const syncSagaInit = await coordinatorInit.sync({
106
+ await runSyncPass({
138
107
  domainIbGibs: [alpha_v0],
139
- senderIdentity: domainI,
140
- fnSenderSecret: async () => 'test-sender-secret-phase4-10b',
141
- peer: senderPeerInit,
142
- localSpace: space,
108
+ passLabel: 'Seed alpha_v0',
143
109
  metaspace,
144
- conflictStrategy: SyncConflictStrategy.optimisticWithLCS,
110
+ space
145
111
  });
146
- await syncSagaInit.done;
112
+ state.domainI_latest = debugState.domainI;
147
113
  devLog('4.10B Setup: ✓ alpha_v0 seeded on server.');
148
114
 
149
- // Fetch evolved user identity (n=2)
150
- const domainLatestAddr = await metaspace.getLatestAddr({ ibGib: domainI, space });
151
- if (!domainLatestAddr) { throw new Error("Could not find latest evolved identity address in local space."); }
152
- const resGetLatest = await metaspace.get({ addr: domainLatestAddr, space });
153
- domainI_latest = resGetLatest.ibGibs![0] as KeystoneIbGib_V1;
154
- state.domainI_latest = domainI_latest;
155
-
156
- // Copy to remote space
157
- await metaspace.put({ ibGib: domainI_latest, space: remoteSpace });
158
- await metaspace.registerNewIbGib({ ibGib: domainI_latest, space: remoteSpace });
115
+ // Copy evolved delegate and domain tip to remoteSpace
116
+ await copyIdentitiesToSpace({ domainI: debugState.domainI!, metaspace, fromSpace: space, toSpace: remoteSpace });
159
117
 
160
118
  // 4. Create Round 2 Divergence:
161
119
  // Client (default space): Create beta, mutate alpha fieldA, relate alpha to beta
@@ -214,43 +172,16 @@ export function init4_10bSetupButton(): void {
214
172
 
215
173
  // Sync remote Round 2 edit to server
216
174
  devLog('4.10B Setup: Pushing remote Round 2 edit to server...');
217
- const senderPeerRemote = new SyncPeerWebSocketSender_V1({
218
- classname: 'SyncPeerWebSocketSender_V1',
219
- httpEvolveUrl: `${location.protocol}//${location.host}/api/keystone/evolve/${encodeURIComponent(domainAddr)}`,
220
- wsUrl: `${protocol}//${location.host}/api/sync/ws/${encodeURIComponent(domainAddr)}`
221
- });
222
- const coordinatorRemote = new SyncSagaCoordinator();
223
- await senderPeerRemote.initializeOpts({
224
- localMetaspace: metaspace,
225
- localSpace: remoteSpace,
226
- senderIdentity: domainI_latest,
227
- fnSenderSecret: async () => 'test-sender-secret-phase4-10b',
228
- sessionConnectPoolConfig: SESSION_KEYSTONE_POLICY.CONNECT_POOL as any,
229
- sessionSyncPoolConfig: SESSION_KEYSTONE_POLICY.DEFAULT_POOL as any,
230
- targetAddrs: [domainAddr]
231
- });
232
- const syncSagaRemote = await coordinatorRemote.sync({
175
+ await runSyncPassFromSpace({
233
176
  domainIbGibs: [r2_alpha_v1_remote],
234
- senderIdentity: domainI_latest,
235
- fnSenderSecret: async () => 'test-sender-secret-phase4-10b',
236
- peer: senderPeerRemote,
237
- localSpace: remoteSpace,
177
+ passLabel: 'Push remote Round 2 edit',
238
178
  metaspace,
239
- conflictStrategy: SyncConflictStrategy.optimisticWithLCS,
179
+ space: remoteSpace,
180
+ primarySpace: space,
181
+ domainI: debugState.domainI!,
182
+ masterSecret: 'test-sender-secret-phase4-10b'
240
183
  });
241
- await syncSagaRemote.done;
242
- devLog('4.10B Setup: ✓ Server tip is now remote Round 2 edit.');
243
-
244
- // Fetch evolved user identity from remote space (n=3)
245
- const domainLatestAddrRemote = await metaspace.getLatestAddr({ ibGib: domainI, space: remoteSpace });
246
- if (!domainLatestAddrRemote) { throw new Error("Could not find latest evolved identity address in remote space."); }
247
- const resGetLatestRemote = await metaspace.get({ addr: domainLatestAddrRemote, space: remoteSpace });
248
- const domainI_latestRemote = resGetLatestRemote.ibGibs![0] as KeystoneIbGib_V1;
249
-
250
- // Copy back to default space
251
- await metaspace.put({ ibGib: domainI_latestRemote, space });
252
- await metaspace.registerNewIbGib({ ibGib: domainI_latestRemote, space });
253
- state.domainI_latest = domainI_latestRemote;
184
+ state.domainI_latest = debugState.domainI;
254
185
 
255
186
  devLog('✓ 4.10B Setup Complete! Ready for 4.10B Sync (which runs Round 2, 3, and 4 in succession).');
256
187
  btn.textContent = '✓ 4.10B Setup Complete';
@@ -295,41 +226,17 @@ export function init4_10bSyncButton(): void {
295
226
  // #region Round 2 Sync
296
227
  // ----------------------------------------------------
297
228
  devLog('4.10B Sync: Running Round 2 Sync (merging divergent alpha edits)...');
298
- const senderPeerR2 = new SyncPeerWebSocketSender_V1({
299
- classname: 'SyncPeerWebSocketSender_V1',
300
- httpEvolveUrl: `${location.protocol}//${location.host}/api/keystone/evolve/${encodeURIComponent(domainAddr)}`,
301
- wsUrl: `${protocol}//${location.host}/api/sync/ws/${encodeURIComponent(domainAddr)}`
302
- });
303
- const coordinatorR2 = new SyncSagaCoordinator();
304
- await senderPeerR2.initializeOpts({
305
- localMetaspace: metaspace,
306
- localSpace: space,
307
- senderIdentity: domainI,
308
- fnSenderSecret: async () => 'test-sender-secret-phase4-10b',
309
- sessionConnectPoolConfig: SESSION_KEYSTONE_POLICY.CONNECT_POOL as any,
310
- sessionSyncPoolConfig: SESSION_KEYSTONE_POLICY.DEFAULT_POOL as any,
311
- targetAddrs: [domainAddr]
312
- });
313
- const syncSagaR2 = await coordinatorR2.sync({
229
+ await runSyncPass({
314
230
  domainIbGibs: [state.r2_alpha_v3_source_rel8beta],
315
- senderIdentity: domainI,
316
- fnSenderSecret: async () => 'test-sender-secret-phase4-10b',
317
- peer: senderPeerR2,
318
- localSpace: space,
231
+ passLabel: 'Sync divergent alpha edits R2',
319
232
  metaspace,
320
- conflictStrategy: SyncConflictStrategy.optimisticWithLCS,
233
+ space
321
234
  });
322
- await syncSagaR2.done;
235
+ state.domainI_latest = debugState.domainI;
323
236
  devLog('4.10B Sync: ✓ Round 2 Sync complete.');
324
237
 
325
- // Fetch evolved user identity (n=4)
326
- let domainLatestAddr = await metaspace.getLatestAddr({ ibGib: state.domainI_initial!, space });
327
- let resGetLatest = await metaspace.get({ addr: domainLatestAddr!, space });
328
- domainI = resGetLatest.ibGibs![0] as KeystoneIbGib_V1;
329
-
330
- // Copy to remote space
331
- await metaspace.put({ ibGib: domainI, space: remoteSpace });
332
- await metaspace.registerNewIbGib({ ibGib: domainI, space: remoteSpace });
238
+ // Copy evolved delegate and domain tip to remoteSpace
239
+ await copyIdentitiesToSpace({ domainI: debugState.domainI!, metaspace, fromSpace: space, toSpace: remoteSpace });
333
240
  // #endregion Round 2 Sync
334
241
 
335
242
  // ----------------------------------------------------
@@ -337,7 +244,7 @@ export function init4_10bSyncButton(): void {
337
244
  // ----------------------------------------------------
338
245
  devLog('4.10B Sync: Preparing Round 3 divergence (multiple conflicting timelines)...');
339
246
  // Client: Mutate alpha (fieldC), mutate beta (betaFieldA)
340
- const clientKV_R2 = await coordinatorR2.getKnowledgeMap({
247
+ const clientKV_R2 = await new SyncSagaCoordinator().getKnowledgeMap({
341
248
  domainIbGibs: [state.r2_alpha_v3_source_rel8beta, state.r2_beta_v0_source],
342
249
  space,
343
250
  metaspace,
@@ -370,21 +277,6 @@ export function init4_10bSyncButton(): void {
370
277
 
371
278
  // Remote: Sync remote to latest merged tips, then mutate alpha (fieldD), mutate beta (betaFieldB)
372
279
  devLog('4.10B Sync: Updating remote space to latest merged tips...');
373
- const senderPeerRemoteR3_Init = new SyncPeerWebSocketSender_V1({
374
- classname: 'SyncPeerWebSocketSender_V1',
375
- httpEvolveUrl: `${location.protocol}//${location.host}/api/keystone/evolve/${encodeURIComponent(domainAddr)}`,
376
- wsUrl: `${protocol}//${location.host}/api/sync/ws/${encodeURIComponent(domainAddr)}`
377
- });
378
- const coordinatorRemoteR3_Init = new SyncSagaCoordinator();
379
- await senderPeerRemoteR3_Init.initializeOpts({
380
- localMetaspace: metaspace,
381
- localSpace: remoteSpace,
382
- senderIdentity: domainI,
383
- fnSenderSecret: async () => 'test-sender-secret-phase4-10b',
384
- sessionConnectPoolConfig: SESSION_KEYSTONE_POLICY.CONNECT_POOL as any,
385
- sessionSyncPoolConfig: SESSION_KEYSTONE_POLICY.DEFAULT_POOL as any,
386
- targetAddrs: [domainAddr]
387
- });
388
280
 
389
281
  // Query remoteSpace for its latest tips to initiate sync
390
282
  const alphaLatestAddrRemoteR3 = await metaspace.getLatestAddr({ addr: alpha_tjpAddr, space: remoteSpace });
@@ -400,26 +292,21 @@ export function init4_10bSyncButton(): void {
400
292
  }
401
293
 
402
294
  // Sync remote space to pull merged alpha and beta from server
403
- const syncSagaRemoteR3_Init = await coordinatorRemoteR3_Init.sync({
295
+ await runSyncPassFromSpace({
404
296
  domainIbGibs: domainIbGibsRemoteR3,
405
- senderIdentity: domainI,
406
- fnSenderSecret: async () => 'test-sender-secret-phase4-10b',
407
- peer: senderPeerRemoteR3_Init,
408
- localSpace: remoteSpace,
297
+ passLabel: 'Pull merged R2 tips to remoteSpace',
409
298
  metaspace,
410
- conflictStrategy: SyncConflictStrategy.optimisticWithLCS,
299
+ space: remoteSpace,
300
+ primarySpace: space,
301
+ domainI: debugState.domainI!,
302
+ masterSecret: 'test-sender-secret-phase4-10b'
411
303
  });
412
- await syncSagaRemoteR3_Init.done;
304
+ state.domainI_latest = debugState.domainI;
305
+
413
306
 
414
- // Fetch evolved identity (n=5)
415
- domainLatestAddr = await metaspace.getLatestAddr({ ibGib: state.domainI_initial!, space: remoteSpace });
416
- resGetLatest = await metaspace.get({ addr: domainLatestAddr!, space: remoteSpace });
417
- domainI = resGetLatest.ibGibs![0] as KeystoneIbGib_V1;
418
- await metaspace.put({ ibGib: domainI, space });
419
- await metaspace.registerNewIbGib({ ibGib: domainI, space });
420
307
 
421
308
  // Now mutate alpha (fieldD) and beta (betaFieldB) in remote space
422
- const remoteKV_R3 = await coordinatorRemoteR3_Init.getKnowledgeMap({ space: remoteSpace, metaspace, domainIbGibs: [alpha_v0, state.r2_beta_v0_source] });
309
+ const remoteKV_R3 = await new SyncSagaCoordinator().getKnowledgeMap({ space: remoteSpace, metaspace, domainIbGibs: [alpha_v0, state.r2_beta_v0_source] });
423
310
  const alpha_tipAddr_R2_remote = remoteKV_R3[alpha_tjpAddr];
424
311
  const beta_tipAddr_R2_remote = remoteKV_R3[beta_tjpAddr];
425
312
 
@@ -448,81 +335,37 @@ export function init4_10bSyncButton(): void {
448
335
 
449
336
  // Sync remote Round 3 edits to server
450
337
  devLog('4.10B Sync: Pushing remote Round 3 edits to server...');
451
- const senderPeerRemoteR3 = new SyncPeerWebSocketSender_V1({
452
- classname: 'SyncPeerWebSocketSender_V1',
453
- httpEvolveUrl: `${location.protocol}//${location.host}/api/keystone/evolve/${encodeURIComponent(domainAddr)}`,
454
- wsUrl: `${protocol}//${location.host}/api/sync/ws/${encodeURIComponent(domainAddr)}`
455
- });
456
- const coordinatorRemoteR3 = new SyncSagaCoordinator();
457
- await senderPeerRemoteR3.initializeOpts({
458
- localMetaspace: metaspace,
459
- localSpace: remoteSpace,
460
- senderIdentity: domainI,
461
- fnSenderSecret: async () => 'test-sender-secret-phase4-10b',
462
- sessionConnectPoolConfig: SESSION_KEYSTONE_POLICY.CONNECT_POOL as any,
463
- sessionSyncPoolConfig: SESSION_KEYSTONE_POLICY.DEFAULT_POOL as any,
464
- targetAddrs: [domainAddr]
465
- });
466
- const syncSagaRemoteR3 = await coordinatorRemoteR3.sync({
338
+ await runSyncPassFromSpace({
467
339
  domainIbGibs: [r3_alpha_v4_remote, r3_beta_v1_remote],
468
- senderIdentity: domainI,
469
- fnSenderSecret: async () => 'test-sender-secret-phase4-10b',
470
- peer: senderPeerRemoteR3,
471
- localSpace: remoteSpace,
340
+ passLabel: 'Push remote Round 3 edits',
472
341
  metaspace,
473
- conflictStrategy: SyncConflictStrategy.optimisticWithLCS,
342
+ space: remoteSpace,
343
+ primarySpace: space,
344
+ domainI: debugState.domainI!,
345
+ masterSecret: 'test-sender-secret-phase4-10b'
474
346
  });
475
- await syncSagaRemoteR3.done;
476
-
477
- // Fetch evolved identity (n=6)
478
- domainLatestAddr = await metaspace.getLatestAddr({ ibGib: state.domainI_initial!, space: remoteSpace });
479
- resGetLatest = await metaspace.get({ addr: domainLatestAddr!, space: remoteSpace });
480
- domainI = resGetLatest.ibGibs![0] as KeystoneIbGib_V1;
481
- await metaspace.put({ ibGib: domainI, space });
482
- await metaspace.registerNewIbGib({ ibGib: domainI, space });
347
+ state.domainI_latest = debugState.domainI;
483
348
 
484
349
  // Sync Client Round 3 edits to server (merges client and server)
485
350
  devLog('4.10B Sync: Running Round 3 Client Sync (merging alpha & beta divergence)...');
486
- const senderPeerR3 = new SyncPeerWebSocketSender_V1({
487
- classname: 'SyncPeerWebSocketSender_V1',
488
- httpEvolveUrl: `${location.protocol}//${location.host}/api/keystone/evolve/${encodeURIComponent(domainAddr)}`,
489
- wsUrl: `${protocol}//${location.host}/api/sync/ws/${encodeURIComponent(domainAddr)}`
490
- });
491
- const coordinatorR3 = new SyncSagaCoordinator();
492
- await senderPeerR3.initializeOpts({
493
- localMetaspace: metaspace,
494
- localSpace: space,
495
- senderIdentity: domainI,
496
- fnSenderSecret: async () => 'test-sender-secret-phase4-10b',
497
- sessionConnectPoolConfig: SESSION_KEYSTONE_POLICY.CONNECT_POOL as any,
498
- sessionSyncPoolConfig: SESSION_KEYSTONE_POLICY.DEFAULT_POOL as any,
499
- targetAddrs: [domainAddr]
500
- });
501
- const syncSagaR3 = await coordinatorR3.sync({
351
+ await runSyncPass({
502
352
  domainIbGibs: [r3_alpha_v4_source, r3_beta_v1_source],
503
- senderIdentity: domainI,
504
- fnSenderSecret: async () => 'test-sender-secret-phase4-10b',
505
- peer: senderPeerR3,
506
- localSpace: space,
353
+ passLabel: 'Sync Client Round 3 edits',
507
354
  metaspace,
508
- conflictStrategy: SyncConflictStrategy.optimisticWithLCS,
355
+ space
509
356
  });
510
- await syncSagaR3.done;
357
+ state.domainI_latest = debugState.domainI;
511
358
  devLog('4.10B Sync: ✓ Round 3 Sync complete.');
512
359
 
513
- // Fetch evolved identity (n=7)
514
- domainLatestAddr = await metaspace.getLatestAddr({ ibGib: state.domainI_initial!, space: space });
515
- resGetLatest = await metaspace.get({ addr: domainLatestAddr!, space });
516
- domainI = resGetLatest.ibGibs![0] as KeystoneIbGib_V1;
517
- await metaspace.put({ ibGib: domainI, space: remoteSpace });
518
- await metaspace.registerNewIbGib({ ibGib: domainI, space: remoteSpace });
360
+ // Copy evolved delegate and domain tip to remoteSpace
361
+ await copyIdentitiesToSpace({ domainI: debugState.domainI!, metaspace, fromSpace: space, toSpace: remoteSpace });
519
362
  // #endregion Round 3 Divergence & Sync
520
363
 
521
364
  // ----------------------------------------------------
522
365
  // #region Round 4 Divergence & Sync
523
366
  // ----------------------------------------------------
524
367
  devLog('4.10B Sync: Preparing Round 4 divergence (post-graft chain edits & new timeline)...');
525
- const clientKV_R3 = await coordinatorR3.getKnowledgeMap({ space, metaspace, domainIbGibs: [alpha_v0, state.r2_beta_v0_source] });
368
+ const clientKV_R3 = await new SyncSagaCoordinator().getKnowledgeMap({ space, metaspace, domainIbGibs: [alpha_v0, state.r2_beta_v0_source] });
526
369
  const alpha_tipAddr_R3_client = clientKV_R3[alpha_tjpAddr];
527
370
  const beta_tipAddr_R3_client = clientKV_R3[beta_tjpAddr];
528
371
 
@@ -590,21 +433,6 @@ export function init4_10bSyncButton(): void {
590
433
 
591
434
  // Remote: Sync remote to latest merged tips, then mutate alpha (fieldG), mutate beta (betaFieldC)
592
435
  devLog('4.10B Sync: Updating remote space to Round 3 merged tips...');
593
- const senderPeerRemoteR4_Init = new SyncPeerWebSocketSender_V1({
594
- classname: 'SyncPeerWebSocketSender_V1',
595
- httpEvolveUrl: `${location.protocol}//${location.host}/api/keystone/evolve/${encodeURIComponent(domainAddr)}`,
596
- wsUrl: `${protocol}//${location.host}/api/sync/ws/${encodeURIComponent(domainAddr)}`
597
- });
598
- const coordinatorRemoteR4_Init = new SyncSagaCoordinator();
599
- await senderPeerRemoteR4_Init.initializeOpts({
600
- localMetaspace: metaspace,
601
- localSpace: remoteSpace,
602
- senderIdentity: domainI,
603
- fnSenderSecret: async () => 'test-sender-secret-phase4-10b',
604
- sessionConnectPoolConfig: SESSION_KEYSTONE_POLICY.CONNECT_POOL as any,
605
- sessionSyncPoolConfig: SESSION_KEYSTONE_POLICY.DEFAULT_POOL as any,
606
- targetAddrs: [domainAddr]
607
- });
608
436
 
609
437
  // Query remoteSpace for its latest tips to initiate sync
610
438
  const alphaLatestAddrRemoteR4 = await metaspace.getLatestAddr({ addr: alpha_tjpAddr, space: remoteSpace });
@@ -619,27 +447,19 @@ export function init4_10bSyncButton(): void {
619
447
  domainIbGibsRemoteR4.push(resGetBetaRemoteTipR4.ibGibs![0]);
620
448
  }
621
449
 
622
- const syncSagaRemoteR4_Init = await coordinatorRemoteR4_Init.sync({
450
+ await runSyncPassFromSpace({
623
451
  domainIbGibs: domainIbGibsRemoteR4,
624
- senderIdentity: domainI,
625
- fnSenderSecret: async () => 'test-sender-secret-phase4-10b',
626
- peer: senderPeerRemoteR4_Init,
627
- localSpace: remoteSpace,
452
+ passLabel: 'Pull merged R3 tips to remoteSpace',
628
453
  metaspace,
629
- conflictStrategy: SyncConflictStrategy.optimisticWithLCS,
454
+ space: remoteSpace,
455
+ primarySpace: space,
456
+ domainI: debugState.domainI!,
457
+ masterSecret: 'test-sender-secret-phase4-10b'
630
458
  });
631
- await syncSagaRemoteR4_Init.done;
632
-
633
-
634
- // Fetch evolved identity (n=8)
635
- domainLatestAddr = await metaspace.getLatestAddr({ ibGib: state.domainI_initial!, space: remoteSpace });
636
- resGetLatest = await metaspace.get({ addr: domainLatestAddr!, space: remoteSpace });
637
- domainI = resGetLatest.ibGibs![0] as KeystoneIbGib_V1;
638
- await metaspace.put({ ibGib: domainI, space });
639
- await metaspace.registerNewIbGib({ ibGib: domainI, space });
459
+ state.domainI_latest = debugState.domainI;
640
460
 
641
461
  // Mutate alpha (fieldG) and beta (betaFieldC) in remote space
642
- const remoteKV_R4 = await coordinatorRemoteR4_Init.getKnowledgeMap({ space: remoteSpace, metaspace, domainIbGibs: [alpha_v0, state.r2_beta_v0_source] });
462
+ const remoteKV_R4 = await new SyncSagaCoordinator().getKnowledgeMap({ space: remoteSpace, metaspace, domainIbGibs: [alpha_v0, state.r2_beta_v0_source] });
643
463
  const alpha_tipAddr_R3_remote = remoteKV_R4[alpha_tjpAddr];
644
464
  const beta_tipAddr_R3_remote = remoteKV_R4[beta_tjpAddr];
645
465
 
@@ -668,74 +488,26 @@ export function init4_10bSyncButton(): void {
668
488
 
669
489
  // Sync remote edits to server
670
490
  devLog('4.10B Sync: Pushing remote Round 4 edits to server...');
671
- const senderPeerRemoteR4 = new SyncPeerWebSocketSender_V1({
672
- classname: 'SyncPeerWebSocketSender_V1',
673
- httpEvolveUrl: `${location.protocol}//${location.host}/api/keystone/evolve/${encodeURIComponent(domainAddr)}`,
674
- wsUrl: `${protocol}//${location.host}/api/sync/ws/${encodeURIComponent(domainAddr)}`
675
- });
676
- const coordinatorRemoteR4 = new SyncSagaCoordinator();
677
- await senderPeerRemoteR4.initializeOpts({
678
- localMetaspace: metaspace,
679
- localSpace: remoteSpace,
680
- senderIdentity: domainI,
681
- fnSenderSecret: async () => 'test-sender-secret-phase4-10b',
682
- sessionConnectPoolConfig: SESSION_KEYSTONE_POLICY.CONNECT_POOL as any,
683
- sessionSyncPoolConfig: SESSION_KEYSTONE_POLICY.DEFAULT_POOL as any,
684
- targetAddrs: [domainAddr]
685
- });
686
- const syncSagaRemoteR4 = await coordinatorRemoteR4.sync({
491
+ await runSyncPassFromSpace({
687
492
  domainIbGibs: [r4_alpha_v5_remote, r4_beta_v2_remote],
688
- senderIdentity: domainI,
689
- fnSenderSecret: async () => 'test-sender-secret-phase4-10b',
690
- peer: senderPeerRemoteR4,
691
- localSpace: remoteSpace,
493
+ passLabel: 'Push remote Round 4 edits',
692
494
  metaspace,
693
- conflictStrategy: SyncConflictStrategy.optimisticWithLCS,
495
+ space: remoteSpace,
496
+ primarySpace: space,
497
+ domainI: debugState.domainI!,
498
+ masterSecret: 'test-sender-secret-phase4-10b'
694
499
  });
695
- await syncSagaRemoteR4.done;
696
-
697
-
698
- // Fetch evolved identity (n=9)
699
- domainLatestAddr = await metaspace.getLatestAddr({ ibGib: state.domainI_initial!, space: remoteSpace });
700
- resGetLatest = await metaspace.get({ addr: domainLatestAddr!, space: remoteSpace });
701
- domainI = resGetLatest.ibGibs![0] as KeystoneIbGib_V1;
702
- await metaspace.put({ ibGib: domainI, space });
703
- await metaspace.registerNewIbGib({ ibGib: domainI, space });
500
+ state.domainI_latest = debugState.domainI;
704
501
 
705
502
  // Sync Client Round 4 edits to server (merges client and server final states)
706
503
  devLog('4.10B Sync: Running final Round 4 Client Sync (merging alpha, beta, and propagating gamma)...');
707
- // debugger; // walk through this, but a breakpoint on createInitFrame
708
- const senderPeerR4 = new SyncPeerWebSocketSender_V1({
709
- classname: 'SyncPeerWebSocketSender_V1',
710
- httpEvolveUrl: `${location.protocol}//${location.host}/api/keystone/evolve/${encodeURIComponent(domainAddr)}`,
711
- wsUrl: `${protocol}//${location.host}/api/sync/ws/${encodeURIComponent(domainAddr)}`
712
- });
713
- const coordinatorR4 = new SyncSagaCoordinator();
714
- await senderPeerR4.initializeOpts({
715
- localMetaspace: metaspace,
716
- localSpace: space,
717
- senderIdentity: domainI,
718
- fnSenderSecret: async () => 'test-sender-secret-phase4-10b',
719
- sessionConnectPoolConfig: SESSION_KEYSTONE_POLICY.CONNECT_POOL as any,
720
- sessionSyncPoolConfig: SESSION_KEYSTONE_POLICY.DEFAULT_POOL as any,
721
- targetAddrs: [domainAddr]
722
- });
723
- const syncSagaR4 = await coordinatorR4.sync({
504
+ await runSyncPass({
724
505
  domainIbGibs: [r4_alpha_v7_source, r4_beta_v2_source, gamma_v0_source],
725
- senderIdentity: domainI,
726
- fnSenderSecret: async () => 'test-sender-secret-phase4-10b',
727
- peer: senderPeerR4,
728
- localSpace: space,
506
+ passLabel: 'Sync final Round 4 edits',
729
507
  metaspace,
730
- conflictStrategy: SyncConflictStrategy.optimisticWithLCS,
508
+ space
731
509
  });
732
- await syncSagaR4.done;
733
-
734
- // Fetch final evolved identity (n=10)
735
- domainLatestAddr = await metaspace.getLatestAddr({ ibGib: state.domainI_initial!, space: space });
736
- resGetLatest = await metaspace.get({ addr: domainLatestAddr!, space });
737
- domainI = resGetLatest.ibGibs![0] as KeystoneIbGib_V1;
738
- state.domainI_latest = domainI;
510
+ state.domainI_latest = debugState.domainI;
739
511
 
740
512
  devLog('✓ 4.10B Sync: All rounds of divergent edits and merges complete!');
741
513
  btn.textContent = '✓ 4.10B Sync Complete';