@ibgib/space-gib 0.0.6 → 0.0.8

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 (38) 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-DBHMHCGD.mjs +2341 -0
  5. package/dist/client/{chunk-SMOZ2D5E.mjs.map → chunk-DBHMHCGD.mjs.map} +4 -4
  6. package/dist/client/chunk-SUQ5QJH4.mjs +42 -0
  7. package/dist/client/chunk-SUQ5QJH4.mjs.map +7 -0
  8. package/dist/client/index.mjs +1 -1
  9. package/dist/client/script.mjs +1 -1
  10. package/dist/server/server.mjs +1561 -179
  11. package/dist/server/server.mjs.map +4 -4
  12. package/package.json +5 -5
  13. package/space-gib.localhost-1783713259760.log +45 -0
  14. package/src/client/AUTO-GENERATED-version.mts +1 -1
  15. package/src/client/api/space-gib-api-bridge.mts +7 -2
  16. package/src/client/bootstrap.mts +9 -0
  17. package/src/client/components/identity-header/identity-header.mts +43 -26
  18. package/src/client/components/identity-manager/identity-manager.css +57 -392
  19. package/src/client/components/identity-manager/identity-manager.html +0 -114
  20. package/src/client/components/identity-manager/identity-manager.mts +356 -543
  21. package/src/client/components/keystone-creator/keystone-creator.mts +4 -3
  22. package/src/client/components/keystone-details/keystone-details.css +569 -0
  23. package/src/client/components/keystone-details/keystone-details.html +127 -0
  24. package/src/client/components/keystone-details/keystone-details.mts +1013 -0
  25. package/src/client/components/keystone-scrubber/SCRUBBER_IMPLEMENTATION.md +33 -0
  26. package/src/client/components/keystone-scrubber/keystone-scrubber.css +46 -0
  27. package/src/client/components/keystone-scrubber/keystone-scrubber.html +15 -0
  28. package/src/client/components/keystone-scrubber/keystone-scrubber.mts +356 -0
  29. package/src/client/ui/shell/space-gib-shell-service.mts +4 -0
  30. package/src/server/path-constants.mts +12 -0
  31. package/src/server/serve-gib/handlers/api/keystone/keystone-evolve.handler.mts +33 -0
  32. package/src/server/serve-gib/handlers/api/keystone/sso-config.handler.mts +66 -0
  33. package/src/server/serve-gib/handlers/api/keystone/sso-link.handler.mts +140 -0
  34. package/src/server/serve-gib/handlers/api/keystone/sso-login.handler.mts +190 -0
  35. package/src/server/server.mts +6 -0
  36. package/dist/client/chunk-734MMI4C.mjs +0 -42
  37. package/dist/client/chunk-734MMI4C.mjs.map +0 -7
  38. package/dist/client/chunk-SMOZ2D5E.mjs +0 -2049
@@ -34,7 +34,6 @@ h2 {
34
34
  color: var(--clr-accent, #50fa7b);
35
35
  }
36
36
 
37
-
38
37
  .icon-btn {
39
38
  width: 2.2rem;
40
39
  height: 2.2rem;
@@ -75,432 +74,98 @@ h2 {
75
74
  margin-bottom: 1.5rem;
76
75
  }
77
76
 
78
- .card {
79
- padding: 1.5rem;
80
- background: rgba(255, 255, 255, 0.02);
81
- border: 1px solid var(--border-color-base, rgba(255, 255, 255, 0.05));
82
- border-radius: var(--radius-md, 8px);
83
- display: flex;
84
- flex-direction: column;
85
- gap: 1rem;
86
- }
87
-
88
- .card h3 {
89
- margin: 0;
90
- font-size: var(--h3-font-size, 1.15rem);
91
- font-weight: var(--h3-font-weight, 500);
92
- color: var(--clr-accent, #50fa7b);
93
- }
94
-
95
- .info-group {
96
- display: flex;
97
- flex-direction: column;
98
- gap: 0.5rem;
99
- }
100
-
101
- .info-group label {
102
- font-size: 0.8rem;
103
- color: var(--clr-text-secondary, #b3b3b3);
104
- text-transform: uppercase;
105
- letter-spacing: 0.05em;
106
- }
107
-
108
-
109
- .replicas-list {
110
- display: flex;
111
- flex-direction: column;
112
- gap: 0.5rem;
113
- max-height: 150px;
114
- overflow-y: auto;
115
- }
116
-
117
- .input-row {
118
- display: flex;
119
- gap: 0.5rem;
120
- }
121
-
122
- /* Accordion raw styles */
123
- .accordion {
124
- padding: 0;
125
- overflow: hidden;
126
- }
127
-
128
- .accordion-header {
129
- padding: 1.25rem 1.5rem;
130
- display: flex;
131
- justify-content: space-between;
132
- align-items: center;
77
+ .action-btn {
78
+ padding: 0.6rem 1.2rem;
79
+ background: var(--clr-accent, #50fa7b);
80
+ border: none;
81
+ border-radius: var(--radius-sm, 4px);
82
+ color: #1a1a24;
83
+ font-weight: 600;
133
84
  cursor: pointer;
134
- background: rgba(255, 255, 255, 0.01);
135
- transition: background 0.2s ease-in-out;
136
- }
137
-
138
- .accordion-header:hover {
139
- background: rgba(255, 255, 255, 0.03);
140
- }
141
-
142
- .accordion-header .chevron {
143
- transition: transform 0.2s ease-in-out;
144
- font-size: 0.8rem;
145
- color: var(--clr-text-secondary, #b3b3b3);
146
- }
147
-
148
- .accordion-header.expanded .chevron {
149
- transform: rotate(180deg);
150
- }
151
-
152
- .accordion-content {
153
- max-height: 0;
154
- transition: max-height 0.3s cubic-bezier(0, 1, 0, 1);
155
- background: rgba(0, 0, 0, 0.15);
156
- border-top: 1px solid var(--border-color-base, rgba(255, 255, 255, 0.03));
157
- }
158
-
159
- .accordion-content.expanded {
160
- max-height: 5000px;
161
- overflow-y: visible;
162
- transition: max-height 0.3s cubic-bezier(1, 0, 1, 0);
163
- }
164
-
165
- .json-code {
166
- margin: 0;
167
- padding: 1.25rem;
168
- font-family: var(--font-mono, monospace);
169
- font-size: 0.8rem;
170
- color: var(--clr-accent, #50fa7b);
171
- background: transparent;
172
- overflow: auto;
173
- max-height: 70dvh;
174
- white-space: pre-wrap;
175
- word-break: break-all;
85
+ transition: all 0.2s ease-in-out;
176
86
  }
177
87
 
178
- .description {
179
- font-size: 0.85rem;
180
- color: var(--clr-text-secondary, #b3b3b3);
181
- margin: 0;
88
+ .action-btn:hover {
89
+ background: #40c767;
182
90
  }
183
91
 
184
-
185
92
  .hidden {
186
93
  display: none !important;
187
94
  }
188
95
 
189
- .info-group-grid {
190
- display: grid;
191
- grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
192
- gap: 1rem;
193
- margin-top: 0.5rem;
194
- }
195
-
196
- .value-text {
197
- font-family: var(--font-family-base, inherit);
198
- font-size: 0.9rem;
199
- color: var(--text-color-base, #ffffff);
200
- font-weight: 500;
201
- }
202
-
203
- .pools-container {
204
- display: flex;
205
- flex-direction: column;
206
- gap: 1rem;
207
- }
208
-
209
- .pool-card {
210
- padding: 1rem;
211
- background: rgba(0, 0, 0, 0.25);
212
- border: 1px solid var(--border-color-base, rgba(255, 255, 255, 0.05));
213
- border-radius: 6px;
214
- display: flex;
215
- flex-direction: column;
216
- gap: 0.75rem;
217
- }
218
-
219
- .pool-header {
96
+ /* Tab Buttons row */
97
+ .tabs-row {
220
98
  display: flex;
221
99
  justify-content: space-between;
222
100
  align-items: center;
223
- border-bottom: 1px solid rgba(255, 255, 255, 0.05);
224
- padding-bottom: 0.5rem;
225
- }
226
-
227
- .pool-title {
228
- font-size: 0.95rem;
229
- font-weight: 600;
230
- color: var(--clr-accent, #50fa7b);
231
- }
232
-
233
- .pool-tag {
234
- font-size: 0.7rem;
235
- padding: 0.15rem 0.4rem;
236
- border-radius: 4px;
237
- font-weight: bold;
238
- text-transform: uppercase;
239
- }
240
-
241
- .pool-tag.foreign {
242
- background: rgba(255, 184, 108, 0.15);
243
- border: 1px solid rgba(255, 184, 108, 0.3);
244
- color: #ffb86c;
245
- }
246
-
247
- .pool-tag.native {
248
- background: rgba(80, 250, 123, 0.1);
249
- border: 1px solid rgba(80, 250, 123, 0.2);
250
- color: #50fa7b;
251
- }
252
-
253
- .pool-grid {
254
- display: grid;
255
- grid-template-columns: repeat(auto-fit, minmax(130px, 1fr));
256
- gap: 0.75rem;
257
- font-size: 0.85rem;
258
- }
259
-
260
- .pool-field {
261
- display: flex;
262
- flex-direction: column;
263
- gap: 0.2rem;
264
- }
265
-
266
- .pool-field label {
267
- font-size: 0.7rem;
268
- color: var(--clr-text-secondary, #b3b3b3);
269
- text-transform: uppercase;
270
- letter-spacing: 0.03em;
271
- }
272
-
273
- .pool-field span {
274
- color: #ffffff;
275
- font-weight: 500;
276
- word-break: break-all;
277
- }
278
-
279
- /* Key-Value Details Grid Layout */
280
- .kv-grid {
281
- display: grid;
282
- grid-template-columns: minmax(140px, 180px) 1fr;
283
- gap: 0.75rem 1.5rem;
284
- align-items: baseline;
285
- margin-top: 1rem;
286
- margin-bottom: 1.5rem;
287
- }
288
-
289
- .kv-label {
290
- font-family: var(--font-sans);
291
- font-size: 0.75rem;
292
- font-weight: 600;
293
- text-transform: uppercase;
294
- letter-spacing: 0.05em;
295
- color: var(--clr-text-secondary, #8fa08f);
296
- user-select: none;
297
- }
298
-
299
- .kv-value {
300
- font-size: 0.9375rem;
301
- color: var(--clr-text-primary, #ffffff);
302
- word-break: break-all;
303
- }
304
-
305
- .kv-pre {
306
- margin: 0;
307
- padding: 0.6rem 0.8rem;
308
- background: rgba(0, 0, 0, 0.3);
309
- border: 1px solid var(--border-color-base, rgba(255, 255, 255, 0.05));
310
- border-radius: var(--radius-sm, 6px);
311
- font-family: var(--font-mono, monospace);
312
- font-size: 0.8rem;
313
- color: var(--clr-accent, #50fa7b);
314
- max-height: 150px;
315
- overflow: auto;
316
- white-space: pre;
317
- word-break: normal;
101
+ gap: 1rem;
102
+ margin-top: 0.5rem;
318
103
  }
319
104
 
320
- /* Timeline Scrubber Navigation */
321
- .scrubber-nav {
105
+ .tabs-list {
322
106
  display: flex;
323
- align-items: center;
324
- justify-content: center;
325
107
  gap: 0.5rem;
326
- padding: 0.75rem;
327
- background: rgba(0, 0, 0, 0.2);
328
- border: 1px solid var(--border-color-base, rgba(255, 255, 255, 0.05));
329
- border-radius: var(--radius-md, 8px);
330
- margin-top: 1rem;
331
- margin-bottom: 1.5rem;
108
+ overflow-x: auto;
109
+ scrollbar-width: none;
110
+ -ms-overflow-style: none;
111
+ padding-bottom: 0.25rem;
112
+ flex-grow: 1;
332
113
  }
333
114
 
334
- .scrubber-info {
335
- font-family: var(--font-mono, monospace);
336
- font-size: 0.85rem;
337
- color: var(--clr-accent, #50fa7b);
338
- min-width: 120px;
339
- text-align: center;
340
- font-weight: 500;
341
- }
342
-
343
- .scrubber-btn {
344
- padding: 0.4rem 0.8rem;
345
- font-size: 0.8rem;
346
- min-width: 2.2rem;
347
- }
348
-
349
- /* Pool Details & Challenges/Binding Map styling */
350
- .pool-details {
351
- margin-top: 0.75rem;
352
- border-top: 1px solid rgba(255, 255, 255, 0.05);
353
- padding-top: 0.5rem;
354
- }
355
-
356
- .pool-details-summary {
357
- font-size: 0.8rem;
358
- font-weight: 600;
359
- color: var(--clr-text-secondary, #8fa08f);
360
- cursor: pointer;
361
- user-select: none;
362
- outline: none;
363
- padding: 0.25rem 0;
364
- display: flex;
365
- align-items: center;
366
- gap: 0.25rem;
367
- transition: color var(--t-fast, 120ms ease);
115
+ .tabs-list::-webkit-scrollbar {
116
+ display: none;
368
117
  }
369
118
 
370
- .pool-details-summary:hover {
371
- color: var(--clr-accent, #78f87e);
372
- }
373
-
374
- .pool-challenges-list {
375
- margin-top: 0.5rem;
376
- display: flex;
377
- flex-direction: column;
378
- gap: 0.4rem;
379
- max-height: 180px;
380
- overflow-y: auto;
381
- padding-right: 0.25rem;
119
+ .tab-btn {
120
+ padding: 0.55rem 1.25rem;
121
+ background: rgba(255, 255, 255, 0.03);
382
122
  border: 1px solid rgba(255, 255, 255, 0.05);
383
- background: rgba(0, 0, 0, 0.15);
384
- border-radius: 4px;
385
- padding: 0.5rem;
386
- }
387
-
388
- .pool-challenge-item {
389
- display: flex;
390
- justify-content: space-between;
391
- align-items: center;
392
- background: rgba(255, 255, 255, 0.02);
393
- border: 1px solid rgba(255, 255, 255, 0.03);
394
- border-radius: 4px;
395
- padding: 0.35rem 0.5rem;
396
- font-size: 0.75rem;
397
- font-family: var(--font-mono, monospace);
398
- }
399
-
400
- .challenge-id {
123
+ border-radius: var(--radius-sm, 6px);
401
124
  color: var(--clr-text-secondary, #8fa08f);
125
+ font-family: var(--font-sans, inherit);
126
+ font-size: 0.9rem;
402
127
  font-weight: 500;
403
- }
404
-
405
- .challenge-hash {
406
- color: var(--clr-accent, #78f87e);
407
- word-break: break-all;
408
- margin-left: 1rem;
409
- text-align: right;
410
- }
411
-
412
- .pool-binding-map {
413
- margin-top: 0.5rem;
414
- display: grid;
415
- grid-template-columns: repeat(auto-fill, minmax(80px, 1fr));
416
- gap: 0.4rem;
417
- max-height: 200px;
418
- overflow-y: auto;
419
- padding-right: 0.25rem;
420
- border: 1px solid rgba(255, 255, 255, 0.05);
421
- background: rgba(0, 0, 0, 0.15);
422
- border-radius: 4px;
423
- padding: 0.5rem;
424
- }
425
-
426
- .binding-bucket {
427
- display: flex;
428
- flex-direction: column;
429
- align-items: center;
430
- background: rgba(255, 255, 255, 0.02);
431
- border: 1px solid rgba(255, 255, 255, 0.03);
432
- border-radius: 4px;
433
- padding: 0.35rem;
434
- font-family: var(--font-mono, monospace);
435
- font-size: 0.75rem;
436
- }
437
-
438
- .binding-key {
439
- color: var(--clr-text-secondary, #8fa08f);
440
- font-weight: bold;
441
- border-bottom: 1px solid rgba(255, 255, 255, 0.05);
442
- width: 100%;
443
- text-align: center;
444
- padding-bottom: 0.15rem;
445
- margin-bottom: 0.15rem;
446
- }
447
-
448
- .binding-ids {
449
- display: flex;
450
- flex-direction: column;
451
- gap: 0.15rem;
452
- width: 100%;
128
+ cursor: pointer;
129
+ transition: all 0.2s ease-in-out;
130
+ white-space: nowrap;
131
+ display: inline-flex;
453
132
  align-items: center;
454
133
  }
455
134
 
456
- .binding-id-tag {
457
- font-size: 0.65rem;
458
- background: rgba(120, 248, 126, 0.08);
459
- color: var(--clr-accent, #78f87e);
460
- padding: 0.05rem 0.25rem;
461
- border-radius: 3px;
462
- width: 100%;
463
- text-align: center;
464
- white-space: nowrap;
465
- overflow: hidden;
466
- text-overflow: ellipsis;
135
+ .tab-btn:hover {
136
+ background: rgba(255, 255, 255, 0.08);
137
+ color: var(--clr-accent, #50fa7b);
138
+ border-color: rgba(120, 248, 126, 0.2);
467
139
  }
468
140
 
469
- /* Delegates Card styling */
470
- .delegates-table {
471
- width: 100%;
472
- border-collapse: collapse;
473
- margin-top: 1rem;
474
- font-size: 0.9rem;
475
- background: rgba(0, 0, 0, 0.2);
476
- border-radius: var(--radius-sm, 6px);
477
- overflow: hidden;
141
+ .tab-btn.active {
142
+ background: rgba(80, 250, 123, 0.1);
143
+ color: var(--clr-accent, #50fa7b);
144
+ border-color: var(--clr-accent-dim, rgba(120, 248, 126, 0.35));
145
+ box-shadow: 0 0 10px rgba(120, 248, 126, 0.05);
478
146
  }
479
147
 
480
- .delegates-table th,
481
- .delegates-table td {
482
- padding: 0.75rem 1rem;
483
- text-align: left;
484
- border-bottom: 1px solid rgba(255, 255, 255, 0.05);
148
+ .tab-btn.global-active {
149
+ border-style: double;
150
+ border-width: 3px;
485
151
  }
486
152
 
487
- .delegates-table th {
488
- font-family: var(--font-sans);
153
+ .tab-btn.global-active::after {
154
+ content: " (active)";
489
155
  font-size: 0.75rem;
490
- font-weight: 600;
491
- text-transform: uppercase;
492
- letter-spacing: 0.05em;
493
- color: var(--clr-text-secondary, #8fa08f);
494
- background: rgba(255, 255, 255, 0.02);
156
+ font-style: italic;
157
+ opacity: 0.8;
158
+ margin-left: 0.25rem;
495
159
  }
496
160
 
497
- .delegates-table td {
498
- font-family: var(--font-mono, monospace);
499
- font-size: 0.8rem;
500
- color: var(--clr-text-primary, #ffffff);
501
- word-break: break-all;
161
+ .close-tab-button {
162
+ font-size: 0.85rem;
163
+ color: var(--clr-text-secondary, #8fa08f);
164
+ transition: color 0.2s ease-in-out;
165
+ margin-left: 0.5rem;
166
+ line-height: 1;
502
167
  }
503
168
 
504
- .delegates-table tbody tr:hover {
505
- background: rgba(255, 255, 255, 0.02);
169
+ .close-tab-button:hover {
170
+ color: var(--clr-danger, #ff5555) !important;
506
171
  }
@@ -15,119 +15,5 @@
15
15
  <p>No Domain Identities loaded. Create or load one to begin.</p>
16
16
  <button id="btn-create-placeholder" class="action-btn">Create/Load Identity</button>
17
17
  </div>
18
-
19
- <div id="identity-details-view" class="details-view hidden">
20
- <!-- Details for the active Domain Identity -->
21
- <div class="card">
22
- <h3>Domain Identity Details</h3>
23
-
24
- <!-- History Scrubber Navigation -->
25
- <div id="history-scrubber" class="scrubber-nav">
26
- <button id="btn-scrub-first" class="action-btn secondary scrubber-btn"
27
- title="First Frame (Genesis)">|&lt;</button>
28
- <button id="btn-scrub-prev10" class="action-btn secondary scrubber-btn"
29
- title="Back 10 Frames">&lt;&lt; 10</button>
30
- <button id="btn-scrub-prev" class="action-btn secondary scrubber-btn"
31
- title="Previous Frame">&lt;</button>
32
- <span id="scrubber-status" class="scrubber-info">Frame - / -</span>
33
- <button id="btn-scrub-next" class="action-btn secondary scrubber-btn"
34
- title="Next Frame">&gt;</button>
35
- <button id="btn-scrub-next10" class="action-btn secondary scrubber-btn" title="Forward 10 Frames">10
36
- &gt;&gt;</button>
37
- <button id="btn-scrub-latest" class="action-btn secondary scrubber-btn"
38
- title="Latest Frame (Tip)">&gt;|</button>
39
- </div>
40
-
41
- <!-- Key-Value Grid -->
42
- <div class="kv-grid">
43
- <div class="kv-label">Username</div>
44
- <div id="identity-name" class="kv-value">-</div>
45
-
46
- <div class="kv-label">Description</div>
47
- <div id="identity-description" class="kv-value">-</div>
48
-
49
- <div class="kv-label">Verifiable Address</div>
50
- <code id="identity-addr" class="address-code"></code>
51
-
52
- <div class="kv-label">Generation (n)</div>
53
- <div id="identity-gen" class="kv-value">-</div>
54
-
55
- <div class="kv-label">Timestamp</div>
56
- <div id="identity-timestamp" class="kv-value">-</div>
57
-
58
- <div class="kv-label">UUID</div>
59
- <div id="identity-uuid" class="kv-value">-</div>
60
-
61
- <div class="kv-label">Frame Details</div>
62
- <div class="kv-value">
63
- <pre id="identity-frame-details" class="kv-pre">-</pre>
64
- </div>
65
-
66
- <div class="kv-label">Aggr. Details</div>
67
- <div class="kv-value">
68
- <pre id="identity-aggr-details" class="kv-pre">-</pre>
69
- </div>
70
- </div>
71
-
72
- <div class="action-row">
73
- <button id="btn-set-active" class="action-btn">Set as Active Identity</button>
74
- <button id="btn-verify-chain" class="action-btn secondary">Verify Identity Chain</button>
75
- <!-- <button id="btn-sync-identity" class="action-btn" disabled>Sync Identity & Data</button> -->
76
- </div>
77
- <div id="verification-status" class="status-msg hidden"></div>
78
- </div>
79
-
80
- <!-- Challenge Pools Card -->
81
- <div class="card">
82
- <h3>Challenge Pools</h3>
83
- <div id="pools-container" class="pools-container">
84
- <!-- Dynamic pools list gets injected here -->
85
- </div>
86
- </div>
87
-
88
- <!-- Delegates Card -->
89
- <div class="card">
90
- <h3>Registered Delegates</h3>
91
- <div id="delegates-container" class="delegates-container">
92
- <p class="description">Active sub-keystones authorized to perform sync and operations on behalf of this Domain Identity.</p>
93
- <table class="delegates-table">
94
- <thead>
95
- <tr>
96
- <th>Name / Description</th>
97
- <th>TJP Address</th>
98
- <th>Allowed Verbs</th>
99
- </tr>
100
- </thead>
101
- <tbody id="delegates-list">
102
- <!-- Dynamic list of delegates gets injected here -->
103
- </tbody>
104
- </table>
105
- </div>
106
- </div>
107
-
108
- <!-- Replicas / Sync Peers Repository Manager -->
109
- <!-- <div class="card">
110
- <h3>Replication & Spaces</h3>
111
- <p class="description">Manage remote space providers where this identity's data is replicated.</p>
112
- <div id="replicas-list" class="replicas-list"> -->
113
- <!-- Configured space URLs listed here -->
114
- <!-- </div>
115
- <div class="input-row">
116
- <input type="url" id="input-replica-url" placeholder="https://space.example.com/api" class="text-input" disabled>
117
- <button id="btn-add-replica" class="action-btn secondary" disabled>Add Space</button>
118
- </div>
119
- </div> -->
120
-
121
- <!-- Raw Keystone Timeline Explorer -->
122
- <div class="card accordion">
123
- <div id="raw-accordion-header" class="accordion-header">
124
- <span>Raw Keystone Timeline (JSON)</span>
125
- <span class="chevron">▼</span>
126
- </div>
127
- <div id="raw-accordion-content" class="accordion-content">
128
- <pre id="raw-keystone-json" class="json-code"></pre>
129
- </div>
130
- </div>
131
- </div>
132
18
  </div>
133
19
  </div>