@ibgib/space-gib 0.0.4 → 0.0.6

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 (42) hide show
  1. package/README.md +7 -0
  2. package/dist/client/bootstrap.mjs +1 -1
  3. package/dist/client/chunk-734MMI4C.mjs +42 -0
  4. package/dist/client/chunk-734MMI4C.mjs.map +7 -0
  5. package/dist/client/{chunk-ZUEU37Z5.mjs → chunk-SMOZ2D5E.mjs} +170 -41
  6. package/dist/client/chunk-SMOZ2D5E.mjs.map +7 -0
  7. package/dist/client/index.html +35 -14
  8. package/dist/client/index.mjs +1 -1
  9. package/dist/client/script.mjs +1 -1
  10. package/dist/client/style.css +29 -5
  11. package/dist/server/server.mjs +338 -31
  12. package/dist/server/server.mjs.map +3 -3
  13. package/package.json +4 -4
  14. package/src/client/AUTO-GENERATED-version.mts +1 -1
  15. package/src/client/components/identity-header/identity-header.css +40 -2
  16. package/src/client/components/identity-header/identity-header.html +3 -2
  17. package/src/client/components/identity-header/identity-header.mts +87 -26
  18. package/src/client/components/identity-manager/IMPLEMENTATION.md +10 -10
  19. package/src/client/components/identity-manager/identity-manager.css +39 -0
  20. package/src/client/components/identity-manager/identity-manager.html +20 -0
  21. package/src/client/components/identity-manager/identity-manager.mts +59 -0
  22. package/src/client/components/keystone-creator/keystone-creator.mts +88 -12
  23. package/src/client/dev-tools/common.mts +505 -10
  24. package/src/client/dev-tools/phase-4-1.mts +19 -4
  25. package/src/client/dev-tools/phase-4-10.mts +77 -305
  26. package/src/client/dev-tools/phase-4-2.mts +46 -212
  27. package/src/client/dev-tools/phase-4-3.mts +57 -198
  28. package/src/client/dev-tools/phase-4-4.mts +57 -170
  29. package/src/client/dev-tools/phase-4-5.mts +48 -204
  30. package/src/client/dev-tools/phase-4-6.mts +37 -103
  31. package/src/client/dev-tools/phase-4-7.mts +44 -228
  32. package/src/client/dev-tools/phase-4-8.mts +33 -136
  33. package/src/client/dev-tools/phase-4-9.mts +33 -137
  34. package/src/client/dev-tools/phase-4.mts +30 -6
  35. package/src/client/dev-tools.mts +18 -0
  36. package/src/client/index.html +35 -14
  37. package/src/client/style.css +29 -5
  38. package/src/client/types.mts +4 -1
  39. package/dist/client/chunk-NCXKCVYS.mjs +0 -42
  40. package/dist/client/chunk-NCXKCVYS.mjs.map +0 -7
  41. package/dist/client/chunk-ZUEU37Z5.mjs.map +0 -7
  42. package/dist/respec-gib.node.mjs +0 -5
@@ -1,20 +1,19 @@
1
- import { extractErrorMsg, getUUID, getTimestamp } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
1
+ import { extractErrorMsg, getUUID } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
2
2
  import { Factory_V1 as factory } from '@ibgib/ts-gib/dist/V1/factory.mjs';
3
3
  import { ROOT } from '@ibgib/ts-gib/dist/V1/constants.mjs';
4
4
  import { getIbGibAddr } from '@ibgib/ts-gib/dist/helper.mjs';
5
5
  import { KeystoneIbGib_V1 } from '@ibgib/core-gib/dist/keystone/keystone-types.mjs';
6
- import { KeystoneService_V1 } from '@ibgib/core-gib/dist/keystone/keystone-service-v1.mjs';
7
6
  import { getGlobalMetaspace_waitIfNeeded } from "@ibgib/web-gib/dist/helpers.mjs";
8
7
  import { mut8Timeline } from '@ibgib/core-gib/dist/timeline/timeline-api.mjs';
9
8
  import { getTjpAddr } from '@ibgib/core-gib/dist/common/other/ibgib-helper.mjs';
10
- import { SyncPeerWebSocketSender_V1 } from '@ibgib/core-gib/dist/sync/sync-peer/sync-peer-websocket/sync-peer-websocket-sender/sync-peer-websocket-sender-v1.mjs';
11
- import { SyncSagaCoordinator } from '@ibgib/core-gib/dist/sync/sync-saga-coordinator.mjs';
12
- import { SyncConflictStrategy } from '@ibgib/core-gib/dist/sync/sync-constants.mjs';
13
9
  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';
14
- import { SESSION_KEYSTONE_POLICY, getSpaceGibPoolConfig } from "../../common/keystone-policies.mjs";
15
10
  import { SpaceGibApiBridge } from '../api/space-gib-api-bridge.mjs';
11
+ import { SyncSagaCoordinator } from '@ibgib/core-gib/dist/sync/sync-saga-coordinator.mjs';
16
12
 
17
- import { debugState, devLog } from './common.mjs';
13
+ import {
14
+ debugState, devLog, lc,
15
+ setupDomainAndDelegateIdentities, runSyncPass, runSyncPassFromSpace, copyIdentitiesToSpace
16
+ } from './common.mjs';
18
17
 
19
18
  interface Phase49State {
20
19
  domainI_latest?: KeystoneIbGib_V1;
@@ -40,32 +39,19 @@ export function init4_9bSetupButton(): void {
40
39
  const space = await metaspace.getLocalUserSpace({}) as any;
41
40
  if (!space) { throw new Error("No default space."); }
42
41
 
43
- const keystoneService = new KeystoneService_V1();
44
- const protocol = location.protocol === 'https:' ? 'wss:' : 'ws:';
42
+ const apiBridge = new SpaceGibApiBridge();
45
43
 
46
- // 1. Generate Domain User Identity
47
- const domainI = await keystoneService.genesis({
44
+ // 1. Create domain + delegate identities (DRY helper)
45
+ await setupDomainAndDelegateIdentities({
48
46
  masterSecret: 'test-sender-secret-phase4-9b',
49
- configs: [
50
- getSpaceGibPoolConfig('sync', 'senderidentitysyncsaltphase4-9b'),
51
- getSpaceGibPoolConfig('manage', 'senderidentitymanagesaltphase4-9b'),
52
- ],
53
- metaspace,
54
- space,
55
- frameDetails: { client: 'space-gib-web-dev', timestamp: getTimestamp() }
47
+ syncSalt: 'senderidentitysyncsaltphase4-9b',
48
+ manageSalt: 'senderidentitymanagesaltphase4-9b',
49
+ metaspace, space, apiBridge,
50
+ phaseText: '4.9B'
56
51
  });
52
+ const domainI = debugState.domainI!;
57
53
  state.domainI_latest = domainI;
58
- let domainI_latest: any = domainI;
59
54
  const domainAddr = getIbGibAddr({ ibGib: domainI });
60
- devLog(`4.9B Setup: ✓ Created identity: ${domainAddr}`);
61
-
62
- // Register on server
63
- const apiBridge = new SpaceGibApiBridge();
64
- const resGenesis = await apiBridge.postGenesisKeystone(domainI);
65
- if (!resGenesis.success) {
66
- throw new Error(`Server rejected genesis domain keystone: ${resGenesis.message}`);
67
- }
68
- devLog('4.9B Setup: ✓ Identity registered on server.');
69
55
 
70
56
  // 2. Create the divergent "remote" space
71
57
  devLog('4.9B Setup: Creating temporary remote space...');
@@ -78,9 +64,8 @@ export function init4_9bSetupButton(): void {
78
64
  }) as any;
79
65
  await remoteSpace.initialized;
80
66
 
81
- // Copy user identity to remote space
82
- await metaspace.put({ ibGib: domainI, space: remoteSpace });
83
- await metaspace.registerNewIbGib({ ibGib: domainI, space: remoteSpace });
67
+ // Copy user identity and delegate to remote space
68
+ await copyIdentitiesToSpace({ domainI, metaspace, fromSpace: space, toSpace: remoteSpace });
84
69
 
85
70
  // 3. Seed common history root -> v1 (with initial text) locally
86
71
  const resRoot = await factory.firstGen({
@@ -103,48 +88,16 @@ export function init4_9bSetupButton(): void {
103
88
 
104
89
  // 5. Initial sync of testRoot to the server so server has it
105
90
  devLog('4.9B Setup: Syncing testRoot to server...');
106
- const senderPeerInit = new SyncPeerWebSocketSender_V1({
107
- classname: 'SyncPeerWebSocketSender_V1',
108
- httpEvolveUrl: `${location.protocol}//${location.host}/api/keystone/evolve/${encodeURIComponent(domainAddr)}`,
109
- wsUrl: `${protocol}//${location.host}/api/sync/ws/${encodeURIComponent(domainAddr)}`
110
- });
111
- const coordinatorInit = new SyncSagaCoordinator();
112
- await senderPeerInit.initializeOpts({
113
- localMetaspace: metaspace,
114
- localSpace: space,
115
- senderIdentity: domainI,
116
- fnSenderSecret: async () => 'test-sender-secret-phase4-9b',
117
- sagaId: await getUUID(),
118
- sessionConnectPoolConfig: SESSION_KEYSTONE_POLICY.CONNECT_POOL as any,
119
- sessionSyncPoolConfig: SESSION_KEYSTONE_POLICY.DEFAULT_POOL as any,
120
- targetAddrs: [domainAddr]
121
- });
122
- const syncSagaInit = await coordinatorInit.sync({
91
+ await runSyncPass({
123
92
  domainIbGibs: [testRoot],
124
- senderIdentity: domainI,
125
- fnSenderSecret: async () => 'test-sender-secret-phase4-9b',
126
- peer: senderPeerInit,
127
- localSpace: space,
93
+ passLabel: 'Seed testRoot',
128
94
  metaspace,
129
- conflictStrategy: SyncConflictStrategy.optimisticWithLCS,
95
+ space
130
96
  });
131
- await syncSagaInit.done;
132
97
  devLog('4.9B Setup: ✓ Seeding complete on server.');
133
98
 
134
- // Fetch evolved user identity from space (now at n=2)
135
- const domainLatestAddr = await metaspace.getLatestAddr({ ibGib: domainI, space });
136
- if (!domainLatestAddr) { throw new Error("Could not find latest evolved identity address in local space."); }
137
- const resGetLatest = await metaspace.get({ addr: domainLatestAddr, space });
138
- if (!resGetLatest.success || !resGetLatest.ibGibs || resGetLatest.ibGibs.length === 0) {
139
- throw new Error("Could not find latest evolved identity in local space.");
140
- }
141
- domainI_latest = resGetLatest.ibGibs[0] as KeystoneIbGib_V1;
142
- state.domainI_latest = domainI_latest;
143
- devLog(`4.9B Setup: ✓ Fetched evolved identity: ${domainLatestAddr}`);
144
-
145
- // Copy evolved user identity to remote space
146
- await metaspace.put({ ibGib: domainI_latest, space: remoteSpace });
147
- await metaspace.registerNewIbGib({ ibGib: domainI_latest, space: remoteSpace });
99
+ // Copy evolved delegate and domain tip to remoteSpace
100
+ await copyIdentitiesToSpace({ domainI: debugState.domainI!, metaspace, fromSpace: space, toSpace: remoteSpace });
148
101
 
149
102
  // 6. Create Divergence:
150
103
  // Client (default space) appends to end
@@ -174,46 +127,17 @@ export function init4_9bSetupButton(): void {
174
127
 
175
128
  // 7. Sync remote prepended edit to server, so server tip becomes the prepended edit
176
129
  devLog('4.9B Setup: Pushing remote prepended edit to server...');
177
- const senderPeerRemote = new SyncPeerWebSocketSender_V1({
178
- classname: 'SyncPeerWebSocketSender_V1',
179
- httpEvolveUrl: `${location.protocol}//${location.host}/api/keystone/evolve/${encodeURIComponent(domainAddr)}`,
180
- wsUrl: `${protocol}//${location.host}/api/sync/ws/${encodeURIComponent(domainAddr)}`
181
- });
182
- const coordinatorRemote = new SyncSagaCoordinator();
183
- await senderPeerRemote.initializeOpts({
184
- localMetaspace: metaspace,
185
- localSpace: remoteSpace,
186
- senderIdentity: domainI_latest,
187
- fnSenderSecret: async () => 'test-sender-secret-phase4-9b',
188
- sagaId: await getUUID(),
189
- sessionConnectPoolConfig: SESSION_KEYSTONE_POLICY.CONNECT_POOL as any,
190
- sessionSyncPoolConfig: SESSION_KEYSTONE_POLICY.DEFAULT_POOL as any,
191
- targetAddrs: [domainAddr]
192
- });
193
- const syncSagaRemote = await coordinatorRemote.sync({
130
+ await runSyncPassFromSpace({
194
131
  domainIbGibs: [alpha_v1_remote],
195
- senderIdentity: domainI_latest,
196
- fnSenderSecret: async () => 'test-sender-secret-phase4-9b',
197
- peer: senderPeerRemote,
198
- localSpace: remoteSpace,
132
+ passLabel: 'Push remote prepended edit',
199
133
  metaspace,
200
- conflictStrategy: SyncConflictStrategy.optimisticWithLCS,
134
+ space: remoteSpace,
135
+ primarySpace: space,
136
+ domainI: debugState.domainI!,
137
+ masterSecret: 'test-sender-secret-phase4-9b'
201
138
  });
202
- await syncSagaRemote.done;
203
- devLog('4.9B Setup: ✓ Server tip is now the prepended edit.');
204
-
205
- // Fetch evolved user identity from remote space (now at n=3)
206
- const domainLatestAddrRemote = await metaspace.getLatestAddr({ ibGib: domainI, space: remoteSpace });
207
- if (!domainLatestAddrRemote) { throw new Error("Could not find latest evolved identity address in remote space."); }
208
- const resGetLatestRemote = await metaspace.get({ addr: domainLatestAddrRemote, space: remoteSpace });
209
- if (!resGetLatestRemote.success || !resGetLatestRemote.ibGibs || resGetLatestRemote.ibGibs.length === 0) {
210
- throw new Error("Could not find latest evolved identity in remote space.");
211
- }
212
- const domainI_latestRemote = resGetLatestRemote.ibGibs[0] as KeystoneIbGib_V1;
213
- await metaspace.put({ ibGib: domainI_latestRemote, space });
214
- await metaspace.registerNewIbGib({ ibGib: domainI_latestRemote, space });
215
- state.domainI_latest = domainI_latestRemote;
216
- devLog(`4.9B Setup: ✓ Copied evolved identity tip (n=3) back to default space: ${domainLatestAddrRemote}`);
139
+ state.domainI_latest = debugState.domainI;
140
+ devLog('4.9B Setup: ✓ Server tip is now the prepended edit. Evolved identity copied back.');
217
141
 
218
142
  devLog('✓ 4.9B Setup Complete! Ready for 4.9B Sync.');
219
143
  btn.textContent = '✓ 4.9B Setup Complete';
@@ -245,45 +169,17 @@ export function init4_9bSyncButton(): void {
245
169
  return;
246
170
  }
247
171
 
248
- const domainAddr = getIbGibAddr({ ibGib: domainI });
249
172
  const metaspace = await getGlobalMetaspace_waitIfNeeded();
250
173
  const space = await metaspace.getLocalUserSpace({}) as any;
251
174
  if (!space) { throw new Error("No default space."); }
252
175
 
253
- const protocol = location.protocol === 'https:' ? 'wss:' : 'ws:';
254
-
255
- const senderPeer = new SyncPeerWebSocketSender_V1({
256
- classname: 'SyncPeerWebSocketSender_V1',
257
- httpEvolveUrl: `${location.protocol}//${location.host}/api/keystone/evolve/${encodeURIComponent(domainAddr)}`,
258
- wsUrl: `${protocol}//${location.host}/api/sync/ws/${encodeURIComponent(domainAddr)}`
259
- });
260
-
261
- const coordinator = new SyncSagaCoordinator();
262
- const sagaId = await getUUID();
263
-
264
- await senderPeer.initializeOpts({
265
- localMetaspace: metaspace,
266
- localSpace: space,
267
- senderIdentity: domainI,
268
- fnSenderSecret: async () => 'test-sender-secret-phase4-9b',
269
- sagaId,
270
- sessionConnectPoolConfig: SESSION_KEYSTONE_POLICY.CONNECT_POOL as any,
271
- sessionSyncPoolConfig: SESSION_KEYSTONE_POLICY.DEFAULT_POOL as any,
272
- targetAddrs: [domainAddr]
273
- });
274
-
275
- // Run Sync. Client has appended text edit, server has prepended text edit.
276
- // This will trigger optimistic graft merge using LCS algorithm on the text field!
277
- const syncSaga = await coordinator.sync({
176
+ await runSyncPass({
278
177
  domainIbGibs: [targetAlphaV1Source],
279
- senderIdentity: domainI,
280
- fnSenderSecret: async () => 'test-sender-secret-phase4-9b',
281
- peer: senderPeer,
282
- localSpace: space,
178
+ passLabel: 'Sync divergent edit and merge',
283
179
  metaspace,
284
- conflictStrategy: SyncConflictStrategy.optimisticWithLCS,
180
+ space
285
181
  });
286
- await syncSaga.done;
182
+ state.domainI_latest = debugState.domainI;
287
183
 
288
184
  devLog('✓ 4.9B Sync Execution Complete! Ready for 4.9B Check.');
289
185
  btn.textContent = '✓ 4.9B Sync Run';
@@ -264,6 +264,7 @@ async function performPhaseSync4_2b(): Promise<void> {
264
264
  localMetaspace: metaspace,
265
265
  localSpace: space,
266
266
  senderIdentity: domainI,
267
+ senderDomainAddr: domainAddr,
267
268
  fnSenderSecret: async () => debugState.domainIMasterSecret!,
268
269
  sagaId,
269
270
  sessionConnectPoolConfig: SESSION_KEYSTONE_POLICY.CONNECT_POOL as any,
@@ -273,7 +274,10 @@ async function performPhaseSync4_2b(): Promise<void> {
273
274
 
274
275
  let syncSaga = await coordinator.sync({
275
276
  domainIbGibs: [c1],
276
- senderIdentity: domainI,
277
+ senderIdentityInfo: {
278
+ senderIdentity: domainI,
279
+ senderDomainAddr: domainAddr,
280
+ },
277
281
  fnSenderSecret: async () => debugState.domainIMasterSecret!,
278
282
  peer: senderPeer,
279
283
  localSpace: space,
@@ -306,6 +310,7 @@ async function performPhaseSync4_2b(): Promise<void> {
306
310
  localMetaspace: metaspace,
307
311
  localSpace: space,
308
312
  senderIdentity: senderIdentityEvolved1,
313
+ senderDomainAddr: domainAddr,
309
314
  fnSenderSecret: async () => debugState.domainIMasterSecret!,
310
315
  sagaId,
311
316
  sessionConnectPoolConfig: SESSION_KEYSTONE_POLICY.CONNECT_POOL as any,
@@ -315,7 +320,10 @@ async function performPhaseSync4_2b(): Promise<void> {
315
320
 
316
321
  syncSaga = await coordinator.sync({
317
322
  domainIbGibs: [c1],
318
- senderIdentity: senderIdentityEvolved1,
323
+ senderIdentityInfo: {
324
+ senderIdentity: senderIdentityEvolved1,
325
+ senderDomainAddr: domainAddr,
326
+ },
319
327
  fnSenderSecret: async () => debugState.domainIMasterSecret!,
320
328
  peer: senderPeer,
321
329
  localSpace: space,
@@ -362,6 +370,7 @@ async function performPhaseSync4_2b(): Promise<void> {
362
370
  localMetaspace: metaspace,
363
371
  localSpace: space,
364
372
  senderIdentity: senderIdentityEvolved2,
373
+ senderDomainAddr: domainAddr,
365
374
  fnSenderSecret: async () => debugState.domainIMasterSecret!,
366
375
  sagaId,
367
376
  sessionConnectPoolConfig: SESSION_KEYSTONE_POLICY.CONNECT_POOL as any,
@@ -371,7 +380,10 @@ async function performPhaseSync4_2b(): Promise<void> {
371
380
 
372
381
  syncSaga = await coordinator.sync({
373
382
  domainIbGibs: [c2],
374
- senderIdentity: senderIdentityEvolved2,
383
+ senderIdentityInfo: {
384
+ senderIdentity: senderIdentityEvolved2,
385
+ senderDomainAddr: domainAddr,
386
+ },
375
387
  fnSenderSecret: async () => debugState.domainIMasterSecret!,
376
388
  peer: senderPeer,
377
389
  localSpace: space,
@@ -682,6 +694,7 @@ async function performPhaseSync4_3b(): Promise<void> {
682
694
  localMetaspace: metaspace,
683
695
  localSpace: space,
684
696
  senderIdentity: domainI,
697
+ senderDomainAddr: domainAddr,
685
698
  fnSenderSecret: async () => debugState.domainIMasterSecret!,
686
699
  sagaId,
687
700
  sessionConnectPoolConfig: SESSION_KEYSTONE_POLICY.CONNECT_POOL as any,
@@ -691,7 +704,10 @@ async function performPhaseSync4_3b(): Promise<void> {
691
704
 
692
705
  let syncSaga = await coordinator.sync({
693
706
  domainIbGibs: [targetV1],
694
- senderIdentity: domainI,
707
+ senderIdentityInfo: {
708
+ senderIdentity: domainI,
709
+ senderDomainAddr: domainAddr,
710
+ },
695
711
  fnSenderSecret: async () => debugState.domainIMasterSecret!,
696
712
  peer: senderPeer,
697
713
  localSpace: space,
@@ -733,6 +749,7 @@ async function performPhaseSync4_3b(): Promise<void> {
733
749
  localMetaspace: metaspace,
734
750
  localSpace: space,
735
751
  senderIdentity: senderIdentityEvolved1,
752
+ senderDomainAddr: domainAddr,
736
753
  fnSenderSecret: async () => debugState.domainIMasterSecret!,
737
754
  sagaId,
738
755
  sessionConnectPoolConfig: SESSION_KEYSTONE_POLICY.CONNECT_POOL as any,
@@ -742,7 +759,10 @@ async function performPhaseSync4_3b(): Promise<void> {
742
759
 
743
760
  syncSaga = await coordinator.sync({
744
761
  domainIbGibs: [r1_v2],
745
- senderIdentity: senderIdentityEvolved1,
762
+ senderIdentityInfo: {
763
+ senderIdentity: senderIdentityEvolved1,
764
+ senderDomainAddr: domainAddr,
765
+ },
746
766
  fnSenderSecret: async () => debugState.domainIMasterSecret!,
747
767
  peer: senderPeer,
748
768
  localSpace: space,
@@ -1068,6 +1088,7 @@ async function performPhaseSync4_4b(): Promise<void> {
1068
1088
  localMetaspace: metaspace,
1069
1089
  localSpace: space,
1070
1090
  senderIdentity: domainI,
1091
+ senderDomainAddr: domainAddr,
1071
1092
  fnSenderSecret: async () => debugState.domainIMasterSecret!,
1072
1093
  sagaId,
1073
1094
  sessionConnectPoolConfig: SESSION_KEYSTONE_POLICY.CONNECT_POOL as any,
@@ -1077,7 +1098,10 @@ async function performPhaseSync4_4b(): Promise<void> {
1077
1098
 
1078
1099
  const syncSaga = await coordinator.sync({
1079
1100
  domainIbGibs: [targetV2],
1080
- senderIdentity: domainI,
1101
+ senderIdentityInfo: {
1102
+ senderIdentity: domainI,
1103
+ senderDomainAddr: domainAddr,
1104
+ },
1081
1105
  fnSenderSecret: async () => debugState.domainIMasterSecret!,
1082
1106
  peer: senderPeer,
1083
1107
  localSpace: space,
@@ -34,6 +34,24 @@ export { devLog, debugState };
34
34
  export function initDevTools(): void {
35
35
  const lc_fn = `${lc}[initDevTools]`;
36
36
  try {
37
+ const selectEl = document.getElementById('dev-tools-row-select') as HTMLSelectElement | null;
38
+ if (selectEl) {
39
+ selectEl.addEventListener('change', () => {
40
+ const val = selectEl.value;
41
+ const rows = document.querySelectorAll('.dev-panel-row-container') as NodeListOf<HTMLElement>;
42
+ rows.forEach(row => {
43
+ const rowId = row.getAttribute('data-row-id');
44
+ if (val === 'all' || rowId === val) {
45
+ row.style.display = 'flex';
46
+ } else {
47
+ row.style.display = 'none';
48
+ }
49
+ });
50
+ });
51
+ // Trigger change event to initialize display:
52
+ selectEl.dispatchEvent(new Event('change'));
53
+ }
54
+
37
55
  initPrintStateButton();
38
56
  initCreateDomainKeystoneButton();
39
57
  initWsTestButton();
@@ -104,8 +104,29 @@
104
104
  <section class="dev-panel" id="dev-panel" aria-label="Developer tools">
105
105
  <h2 class="dev-panel-title">Dev Tools</h2>
106
106
 
107
+ <div class="dev-panel-select-container">
108
+ <label for="dev-tools-row-select" style="color: var(--clr-warn); font-size: 0.9rem; font-weight: 500;">Select Phase:</label>
109
+ <select id="dev-tools-row-select" class="dev-select">
110
+ <option value="all">Show All</option>
111
+ <option value="00">Row 00 (POC)</option>
112
+ <option value="1B">Row 1B (Phase 1B)</option>
113
+ <option value="2B">Row 2B (Phase 2B)</option>
114
+ <option value="3B">Row 3B (Phase 3B)</option>
115
+ <option value="4.1B">Row 4.1B (Phase 4.1B)</option>
116
+ <option value="4.2B">Row 4.2B (Phase 4.2B)</option>
117
+ <option value="4.3B">Row 4.3B (Phase 4.3B)</option>
118
+ <option value="4.4B">Row 4.4B (Phase 4.4B)</option>
119
+ <option value="4.5B">Row 4.5B (Phase 4.5B)</option>
120
+ <option value="4.6B">Row 4.6B (Phase 4.6B)</option>
121
+ <option value="4.7B">Row 4.7B (Phase 4.7B)</option>
122
+ <option value="4.8B">Row 4.8B (Phase 4.8B)</option>
123
+ <option value="4.9B">Row 4.9B (Phase 4.9B)</option>
124
+ <option value="4.10B">Row 4.10B (Phase 4.10B)</option>
125
+ </select>
126
+ </div>
127
+
107
128
  <!-- Row 00: Raw POC buttons -->
108
- <div class="dev-panel-row-container">
129
+ <div class="dev-panel-row-container" data-row-id="00">
109
130
  <span class="dev-panel-row-label">00</span>
110
131
  <div class="dev-panel-row">
111
132
  <button id="btn-print-dev-state" class="dev-btn">Print Dev State</button>
@@ -119,7 +140,7 @@
119
140
  </div>
120
141
 
121
142
  <!-- Row 1B: Phase 1B -->
122
- <div class="dev-panel-row-container">
143
+ <div class="dev-panel-row-container" data-row-id="1B">
123
144
  <span class="dev-panel-row-label">1B</span>
124
145
  <div class="dev-panel-row">
125
146
  <button id="btn-1b-setup" class="dev-btn">1B Setup</button>
@@ -129,7 +150,7 @@
129
150
  </div>
130
151
 
131
152
  <!-- Row 2B: Phase 2B -->
132
- <div class="dev-panel-row-container">
153
+ <div class="dev-panel-row-container" data-row-id="2B">
133
154
  <span class="dev-panel-row-label">2B</span>
134
155
  <div class="dev-panel-row">
135
156
  <button id="btn-2b-setup" class="dev-btn">2B Setup</button>
@@ -139,7 +160,7 @@
139
160
  </div>
140
161
 
141
162
  <!-- Row 3B: Phase 3B -->
142
- <div class="dev-panel-row-container">
163
+ <div class="dev-panel-row-container" data-row-id="3B">
143
164
  <span class="dev-panel-row-label">3B</span>
144
165
  <div class="dev-panel-row">
145
166
  <button id="btn-3b-setup" class="dev-btn">3B Setup</button>
@@ -149,7 +170,7 @@
149
170
  </div>
150
171
 
151
172
  <!-- Row 4.1B: Phase 4.1B -->
152
- <div class="dev-panel-row-container">
173
+ <div class="dev-panel-row-container" data-row-id="4.1B">
153
174
  <span class="dev-panel-row-label">4.1B</span>
154
175
  <div class="dev-panel-row">
155
176
  <button id="btn-4-1b-setup" class="dev-btn">4.1B Setup</button>
@@ -159,7 +180,7 @@
159
180
  </div>
160
181
 
161
182
  <!-- Row 4.2B: Phase 4.2B -->
162
- <div class="dev-panel-row-container">
183
+ <div class="dev-panel-row-container" data-row-id="4.2B">
163
184
  <span class="dev-panel-row-label">4.2B</span>
164
185
  <div class="dev-panel-row">
165
186
  <button id="btn-4-2b-setup" class="dev-btn">4.2B Setup</button>
@@ -169,7 +190,7 @@
169
190
  </div>
170
191
 
171
192
  <!-- Row 4.3B: Phase 4.3B -->
172
- <div class="dev-panel-row-container">
193
+ <div class="dev-panel-row-container" data-row-id="4.3B">
173
194
  <span class="dev-panel-row-label">4.3B</span>
174
195
  <div class="dev-panel-row">
175
196
  <button id="btn-4-3b-setup" class="dev-btn">4.3B Setup</button>
@@ -179,7 +200,7 @@
179
200
  </div>
180
201
 
181
202
  <!-- Row 4.4B: Phase 4.4B -->
182
- <div class="dev-panel-row-container">
203
+ <div class="dev-panel-row-container" data-row-id="4.4B">
183
204
  <span class="dev-panel-row-label">4.4B</span>
184
205
  <div class="dev-panel-row">
185
206
  <button id="btn-4-4b-setup" class="dev-btn">4.4B Setup</button>
@@ -189,7 +210,7 @@
189
210
  </div>
190
211
 
191
212
  <!-- Row 4.5B: Phase 4.5B -->
192
- <div class="dev-panel-row-container">
213
+ <div class="dev-panel-row-container" data-row-id="4.5B">
193
214
  <span class="dev-panel-row-label">4.5B</span>
194
215
  <div class="dev-panel-row">
195
216
  <button id="btn-4-5b-setup" class="dev-btn">4.5B Setup</button>
@@ -199,7 +220,7 @@
199
220
  </div>
200
221
 
201
222
  <!-- Row 4.6B: Phase 4.6B -->
202
- <div class="dev-panel-row-container">
223
+ <div class="dev-panel-row-container" data-row-id="4.6B">
203
224
  <span class="dev-panel-row-label">4.6B</span>
204
225
  <div class="dev-panel-row">
205
226
  <button id="btn-4-6b-setup" class="dev-btn">4.6B Setup</button>
@@ -209,7 +230,7 @@
209
230
  </div>
210
231
 
211
232
  <!-- Row 4.7B: Phase 4.7B -->
212
- <div class="dev-panel-row-container">
233
+ <div class="dev-panel-row-container" data-row-id="4.7B">
213
234
  <span class="dev-panel-row-label">4.7B</span>
214
235
  <div class="dev-panel-row">
215
236
  <button id="btn-4-7b-setup" class="dev-btn">4.7B Setup</button>
@@ -219,7 +240,7 @@
219
240
  </div>
220
241
 
221
242
  <!-- Row 4.8B: Phase 4.8B -->
222
- <div class="dev-panel-row-container">
243
+ <div class="dev-panel-row-container" data-row-id="4.8B">
223
244
  <span class="dev-panel-row-label">4.8B</span>
224
245
  <div class="dev-panel-row">
225
246
  <button id="btn-4-8b-setup" class="dev-btn">4.8B Setup</button>
@@ -229,7 +250,7 @@
229
250
  </div>
230
251
 
231
252
  <!-- Row 4.9B: Phase 4.9B -->
232
- <div class="dev-panel-row-container">
253
+ <div class="dev-panel-row-container" data-row-id="4.9B">
233
254
  <span class="dev-panel-row-label">4.9B</span>
234
255
  <div class="dev-panel-row">
235
256
  <button id="btn-4-9b-setup" class="dev-btn">4.9B Setup</button>
@@ -239,7 +260,7 @@
239
260
  </div>
240
261
 
241
262
  <!-- Row 4.10B: Phase 4.10B -->
242
- <div class="dev-panel-row-container">
263
+ <div class="dev-panel-row-container" data-row-id="4.10B">
243
264
  <span class="dev-panel-row-label">4.10B</span>
244
265
  <div class="dev-panel-row">
245
266
  <button id="btn-4-10b-setup" class="dev-btn">4.10B Setup</button>
@@ -702,7 +702,8 @@ body::before {
702
702
 
703
703
  /* ── Dev Tools Panel (diagnostic only — remove when WS sync confirmed) ── */
704
704
  .dev-panel {
705
- max-width: 720px;
705
+ max-width: 100%;
706
+ width: 100%;
706
707
  margin: 0 auto;
707
708
  padding: 1.5rem;
708
709
  border: 1px dashed rgba(255, 204, 68, 0.35);
@@ -712,8 +713,7 @@ body::before {
712
713
  flex-direction: column;
713
714
  gap: 1rem;
714
715
  margin-bottom: 3rem;
715
- max-height: 250px;
716
- overflow-y: auto;
716
+ max-height: none;
717
717
  }
718
718
 
719
719
  .dev-panel-title {
@@ -725,6 +725,30 @@ body::before {
725
725
  opacity: 0.7;
726
726
  }
727
727
 
728
+ .dev-panel-select-container {
729
+ display: flex;
730
+ align-items: center;
731
+ gap: 0.75rem;
732
+ margin-bottom: 0.5rem;
733
+ }
734
+
735
+ .dev-select {
736
+ background: var(--clr-bg-surface);
737
+ color: var(--clr-text-primary);
738
+ border: 1px solid rgba(255, 204, 68, 0.4);
739
+ padding: 0.5rem 1rem;
740
+ border-radius: var(--radius-sm);
741
+ font-family: var(--font-sans);
742
+ outline: none;
743
+ cursor: pointer;
744
+ font-size: 0.9rem;
745
+ transition: border-color var(--t-fast);
746
+ }
747
+
748
+ .dev-select:hover {
749
+ border-color: rgba(255, 204, 68, 0.7);
750
+ }
751
+
728
752
  .dev-panel-row {
729
753
  display: flex;
730
754
  gap: 0.75rem;
@@ -763,11 +787,11 @@ body::before {
763
787
  border: 1px solid var(--clr-border);
764
788
  border-radius: var(--radius-sm);
765
789
  padding: 0.75rem 1rem;
766
- max-height: 240px;
790
+ max-height: 800px;
767
791
  overflow-y: auto;
768
792
  white-space: pre-wrap;
769
793
  word-break: break-all;
770
- min-height: 3rem;
794
+ min-height: 10rem;
771
795
  }
772
796
 
773
797
  /* dev tools row styles */
@@ -44,6 +44,8 @@ export interface SpaceShimGlobalInfo {
44
44
  cwd: string;
45
45
  }
46
46
 
47
+ import { KeystoneIbGib_V1 } from "@ibgib/core-gib/dist/keystone/keystone-types.mjs";
48
+
47
49
  // ---------------------------------------------------------------------------
48
50
  // Identity (optional)
49
51
  // ---------------------------------------------------------------------------
@@ -51,7 +53,8 @@ export interface SpaceShimGlobalInfo {
51
53
  export interface IbGibIdentityContext {
52
54
  resolved: boolean;
53
55
  authenticated: boolean;
54
- data?: Record<string, any>;
56
+ domainIdentity?: KeystoneIbGib_V1;
57
+ syncDelegateIdentity?: KeystoneIbGib_V1;
55
58
  }
56
59
 
57
60
  // ---------------------------------------------------------------------------