@ibgib/space-gib 0.0.8 → 0.0.12

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 (83) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +1 -0
  3. package/dist/client/bootstrap.mjs +33 -33
  4. package/dist/client/bootstrap.mjs.map +3 -3
  5. package/dist/client/chunk-GCWH3SH4.mjs +21 -0
  6. package/dist/client/chunk-GCWH3SH4.mjs.map +7 -0
  7. package/dist/client/chunk-I7KNBFG3.mjs +2329 -0
  8. package/dist/client/chunk-I7KNBFG3.mjs.map +7 -0
  9. package/dist/client/index.mjs +22 -1
  10. package/dist/client/index.mjs.map +4 -4
  11. package/dist/client/script.mjs +1 -1
  12. package/dist/server/server.mjs +18815 -17778
  13. package/dist/server/server.mjs.map +4 -4
  14. package/package.json +4 -4
  15. package/space-gib.localhost-1785337158142.log +75 -0
  16. package/src/client/AUTO-GENERATED-version.mts +1 -1
  17. package/src/client/README.md +1 -1
  18. package/src/client/api/space-gib-api-bridge.mts +8 -195
  19. package/src/client/dev-tools/common.mts +4 -4
  20. package/src/client/ui/shell/space-gib-shell-service.mts +68 -18
  21. package/src/common/keystone-policies.mts +1 -1
  22. package/src/server/README.md +3 -2
  23. package/src/server/server.mts +13 -32
  24. package/src/server/test.json +0 -0
  25. package/dist/client/chunk-DBHMHCGD.mjs +0 -2341
  26. package/dist/client/chunk-DBHMHCGD.mjs.map +0 -7
  27. package/dist/client/chunk-SUQ5QJH4.mjs +0 -42
  28. package/dist/client/chunk-SUQ5QJH4.mjs.map +0 -7
  29. package/space-gib.localhost-1783713259760.log +0 -45
  30. package/src/client/components/identity-header/IMPLEMENTATION.md +0 -45
  31. package/src/client/components/identity-header/identity-header.css +0 -112
  32. package/src/client/components/identity-header/identity-header.html +0 -11
  33. package/src/client/components/identity-header/identity-header.mts +0 -439
  34. package/src/client/components/identity-manager/IMPLEMENTATION.md +0 -100
  35. package/src/client/components/identity-manager/identity-manager.css +0 -171
  36. package/src/client/components/identity-manager/identity-manager.html +0 -19
  37. package/src/client/components/identity-manager/identity-manager.mts +0 -639
  38. package/src/client/components/keystone-creator/keystone-creator.css +0 -65
  39. package/src/client/components/keystone-creator/keystone-creator.html +0 -41
  40. package/src/client/components/keystone-creator/keystone-creator.mts +0 -443
  41. package/src/client/components/keystone-details/keystone-details.css +0 -569
  42. package/src/client/components/keystone-details/keystone-details.html +0 -127
  43. package/src/client/components/keystone-details/keystone-details.mts +0 -1013
  44. package/src/client/components/keystone-scrubber/SCRUBBER_IMPLEMENTATION.md +0 -33
  45. package/src/client/components/keystone-scrubber/keystone-scrubber.css +0 -46
  46. package/src/client/components/keystone-scrubber/keystone-scrubber.html +0 -15
  47. package/src/client/components/keystone-scrubber/keystone-scrubber.mts +0 -356
  48. package/src/server/bootstrap-helper.mts +0 -141
  49. package/src/server/bootstrap-helper.respec.mts +0 -100
  50. package/src/server/metaspace-nodeindexedspace/metaspace-nodeindexedspace.mts +0 -85
  51. package/src/server/path-constants.mts +0 -101
  52. package/src/server/path-helper.mts +0 -101
  53. package/src/server/path-helper.respec.mts +0 -99
  54. package/src/server/serve-gib/CHANGELOG.md +0 -29
  55. package/src/server/serve-gib/README.md +0 -43
  56. package/src/server/serve-gib/constants.mts +0 -1
  57. package/src/server/serve-gib/handlers/api/debug/ws-echo.handler.mts +0 -105
  58. package/src/server/serve-gib/handlers/api/health.handler.mts +0 -23
  59. package/src/server/serve-gib/handlers/api/health.respec.mts +0 -51
  60. package/src/server/serve-gib/handlers/api/ibgib/ibgib-handler-types.mts +0 -49
  61. package/src/server/serve-gib/handlers/api/ibgib/ibgib.handler.mts +0 -176
  62. package/src/server/serve-gib/handlers/api/keystone/keystone-evolve.handler.mts +0 -141
  63. package/src/server/serve-gib/handlers/api/keystone/keystone-genesis.handler.mts +0 -146
  64. package/src/server/serve-gib/handlers/api/keystone/keystone-get.handler.mts +0 -198
  65. package/src/server/serve-gib/handlers/api/keystone/keystone-get.respec.mts +0 -107
  66. package/src/server/serve-gib/handlers/api/keystone/keystone-handler-types.mts +0 -29
  67. package/src/server/serve-gib/handlers/api/keystone/keystone-post.handler.mts +0 -55
  68. package/src/server/serve-gib/handlers/api/keystone/keystone-post.respec.mts +0 -130
  69. package/src/server/serve-gib/handlers/api/keystone/sso-config.handler.mts +0 -66
  70. package/src/server/serve-gib/handlers/api/keystone/sso-link.handler.mts +0 -140
  71. package/src/server/serve-gib/handlers/api/keystone/sso-login.handler.mts +0 -190
  72. package/src/server/serve-gib/handlers/error-handler.mts +0 -36
  73. package/src/server/serve-gib/handlers/handler-base.mts +0 -383
  74. package/src/server/serve-gib/handlers/static-handler.mts +0 -82
  75. package/src/server/serve-gib/handlers/ws/sync-upgrade-handler-base.mts +0 -233
  76. package/src/server/serve-gib/handlers/ws/sync-upgrade.handler.mts +0 -24
  77. package/src/server/serve-gib/handlers/ws/ws-helper.mts +0 -216
  78. package/src/server/serve-gib/handlers/ws/ws-types.mts +0 -53
  79. package/src/server/serve-gib/serve-gib-helpers.mts +0 -32
  80. package/src/server/serve-gib/serve-gib-v1.mts +0 -172
  81. package/src/server/serve-gib/serve-gib.respec.mts +0 -90
  82. package/src/server/serve-gib/types.mts +0 -102
  83. package/src/server/server-constants.mts +0 -2
@@ -1,41 +0,0 @@
1
- <div id="container" class="component-container">
2
- <h2 id="title">Keystone Creator</h2>
3
- <div class="content">
4
- <p>This will generate a new root keystone (identity) for your space.</p>
5
-
6
- <div class="input-group">
7
- <label for="input-username">Username</label>
8
- <input type="text" id="input-username" placeholder="Enter your username..." class="text-input">
9
- </div>
10
-
11
- <div class="input-group">
12
- <label for="input-description">Description (Optional)</label>
13
- <input type="text" id="input-description" placeholder="Enter an optional description..." class="text-input">
14
- </div>
15
-
16
- <div class="input-group">
17
- <label for="input-secret">Master Secret (Keep this private!)</label>
18
- <input type="password" id="input-secret" placeholder="Enter your master secret..." class="secret-input">
19
- </div>
20
-
21
- <div class="checkbox-group" style="margin-bottom: 1.5rem; display: flex; align-items: center; gap: 0.5rem;">
22
- <input type="checkbox" id="checkbox-make-active" checked style="cursor: pointer; width: 1rem; height: 1rem;">
23
- <label for="checkbox-make-active" style="cursor: pointer; font-size: 0.9rem; user-select: none;">Make this the active identity</label>
24
- </div>
25
-
26
- <div class="action-row">
27
- <button id="btn-generate" class="action-btn">Generate Identity Keystone</button>
28
- </div>
29
-
30
- <div id="status-area" class="status-area hidden">
31
- <p id="status-text" class="status-msg"></p>
32
- </div>
33
-
34
- <div id="result-area" class="result-area collapsed">
35
- <h3>New Keystone Generated!</h3>
36
- <p class="address-label">Address:</p>
37
- <code id="keystone-addr" class="keystone-addr"></code>
38
- <p class="warning">⚠️ Store this address safely. It is your root identity for this space.</p>
39
- </div>
40
- </div>
41
- </div>
@@ -1,443 +0,0 @@
1
- import thisCss from "./keystone-creator.css";
2
- import thisHtml from "./keystone-creator.html";
3
- import styleCss from "../../style.css";
4
-
5
- import { delay, extractErrorMsg, hash } from "@ibgib/helper-gib/dist/helpers/utils-helper.mjs";
6
- import { HashAlgorithm } from "@ibgib/helper-gib/dist/helpers/utils-helper.mjs";
7
- import { IbGibAddr } from "@ibgib/ts-gib/dist/types.mjs";
8
- import { IbGib_V1 } from "@ibgib/ts-gib/dist/V1/types.mjs";
9
- import { getIbGibAddr } from "@ibgib/ts-gib/dist/helper.mjs";
10
- import { KeystoneService_V1 } from "@ibgib/core-gib/dist/keystone/keystone-service-v1.mjs";
11
- import {
12
- KeystonePoolConfig, KeystoneChallengeType, KeystoneReplenishStrategy
13
- } from "@ibgib/core-gib/dist/keystone/keystone-types.mjs";
14
- import { KeystoneProfileBuilder } from "@ibgib/core-gib/dist/keystone/policy/keystone-profile-builder.mjs";
15
- import { getGlobalMetaspace_waitIfNeeded, getLocalCoupledIbGibForDomainIbGib } from "@ibgib/web-gib/dist/helpers.mjs";
16
- import {
17
- IbGibDynamicComponentMetaBase, IbGibFormInstanceBase,
18
- } from "@ibgib/web-gib/dist/ui/component/ibgib-dynamic-component-bases.mjs";
19
- import {
20
- ElementsBase, IbGibDynamicComponentInstance,
21
- IbGibDynamicComponentInstanceInitOpts,
22
- } from "@ibgib/web-gib/dist/ui/component/component-types.mjs";
23
-
24
- import { getComponentCtorArg } from "../../helpers.web.mjs";
25
- import { spaceGibApiBridge } from "../../api/space-gib-api-bridge.mjs";
26
- import { devLog } from "../../dev-tools.mjs";
27
-
28
- import {
29
- createSettings, getSectionName, getSettingsScope
30
- } from "@ibgib/web-gib/dist/common/settings/settings-helpers.mjs";
31
- import { SettingsType } from "@ibgib/web-gib/dist/common/settings/settings-constants.mjs";
32
- import { SettingsIbGib_V1 } from "@ibgib/web-gib/dist/common/settings/settings-types.mjs";
33
- import { updateSpecialIndex, mut8Timeline } from "@ibgib/core-gib/dist/timeline/timeline-api.mjs";
34
- import { toDto } from "@ibgib/core-gib/dist/common/other/ibgib-helper.mjs";
35
- import { KEYSTONE_USERNAME_REGEXP, KEYSTONE_DESCRIPTION_REGEXP, KEYSTONE_VERB_SYNC, KEYSTONE_VERB_CONNECT } from "@ibgib/core-gib/dist/keystone/keystone-constants.mjs";
36
- import { deriveDelegateSecret } from "@ibgib/core-gib/dist/keystone/strategy/hash-reveal-v1/hash-reveal-v1.mjs";
37
- import { EVENT_IBGIB_IDENTITY_REQUEST_CHANGE } from "@ibgib/web-gib/dist/ui/ui-constants.mjs";
38
-
39
- export const KEYSTONE_CREATOR_COMPONENT_NAME = 'ibgib-keystone-creator';
40
-
41
- /**
42
- * Metadata for the Keystone Creator component.
43
- */
44
- export class KeystoneCreatorComponentMeta extends IbGibDynamicComponentMetaBase {
45
- protected lc: string = `[KeystoneCreatorComponentMeta]`;
46
-
47
- routeRegExp?: RegExp = new RegExp(`^${KEYSTONE_CREATOR_COMPONENT_NAME}$`);
48
- componentName = KEYSTONE_CREATOR_COMPONENT_NAME;
49
-
50
- constructor() {
51
- super(getComponentCtorArg());
52
- if (!customElements.get(this.componentName)) {
53
- customElements.define(this.componentName, KeystoneCreatorComponentInstance);
54
- }
55
- }
56
-
57
- async createInstance({
58
- path,
59
- ibGibAddr
60
- }: {
61
- path: string;
62
- ibGibAddr: IbGibAddr;
63
- }): Promise<IbGibDynamicComponentInstance> {
64
- const lc = `${this.lc}[${this.createInstance.name}]`;
65
- const component = document.createElement(this.componentName) as KeystoneCreatorComponentInstance;
66
- await component.initialize({
67
- ibGibAddr,
68
- meta: this,
69
- html: thisHtml,
70
- css: [styleCss, thisCss],
71
- });
72
- return component;
73
- }
74
- }
75
-
76
- /**
77
- * References to DOM elements within the component's shadow root.
78
- */
79
- interface KeystoneCreatorElements extends ElementsBase {
80
- containerEl: HTMLDivElement;
81
- titleEl: HTMLHeadingElement;
82
- btnGenerateEl: HTMLButtonElement;
83
- resultAreaEl: HTMLDivElement;
84
- keystoneAddrEl: HTMLElement;
85
- inputUsername: HTMLInputElement;
86
- inputDescription: HTMLInputElement;
87
- inputSecret: HTMLInputElement;
88
- checkboxMakeActive: HTMLInputElement;
89
- statusArea: HTMLDivElement;
90
- statusText: HTMLParagraphElement;
91
- }
92
-
93
- /**
94
- * Concrete implementation of the Keystone Creator component.
95
- */
96
- export class KeystoneCreatorComponentInstance
97
- extends IbGibFormInstanceBase<IbGib_V1, KeystoneCreatorElements>
98
- implements IbGibDynamicComponentInstance<IbGib_V1, KeystoneCreatorElements> {
99
-
100
- protected lc: string = `[KeystoneCreatorComponentInstance]`;
101
- private hasExistingIdentities = false;
102
-
103
- constructor() {
104
- super();
105
- }
106
-
107
- override async initialize(opts: IbGibDynamicComponentInstanceInitOpts): Promise<void> {
108
- await super.initialize(opts);
109
- }
110
-
111
- override async created(): Promise<void> {
112
- this.elements = {} as KeystoneCreatorElements;
113
-
114
- this.elements.containerEl = this.shadowRoot!.getElementById('container') as HTMLDivElement;
115
- this.elements.titleEl = this.shadowRoot!.getElementById('title') as HTMLHeadingElement;
116
- this.elements.btnGenerateEl = this.shadowRoot!.getElementById('btn-generate') as HTMLButtonElement;
117
- this.elements.resultAreaEl = this.shadowRoot!.getElementById('result-area') as HTMLDivElement;
118
- this.elements.keystoneAddrEl = this.shadowRoot!.getElementById('keystone-addr') as HTMLElement;
119
- this.elements.inputUsername = this.shadowRoot!.getElementById('input-username') as HTMLInputElement;
120
- this.elements.inputDescription = this.shadowRoot!.getElementById('input-description') as HTMLInputElement;
121
- this.elements.inputSecret = this.shadowRoot!.getElementById('input-secret') as HTMLInputElement;
122
- this.elements.checkboxMakeActive = this.shadowRoot!.getElementById('checkbox-make-active') as HTMLInputElement;
123
- this.elements.statusArea = this.shadowRoot!.getElementById('status-area') as HTMLDivElement;
124
- this.elements.statusText = this.shadowRoot!.getElementById('status-text') as HTMLParagraphElement;
125
-
126
- // ElementBase requires contentEl
127
- this.elements.contentEl = this.elements.containerEl;
128
-
129
- this.initHandlers();
130
-
131
- if (this.ibGibAddr && !this.ibGib) {
132
- await this.loadIbGib();
133
- }
134
- await this.checkExistingIdentities();
135
- await this.renderUI();
136
- }
137
-
138
- private async checkExistingIdentities() {
139
- const lc = `${this.lc}[checkExistingIdentities]`;
140
- try {
141
- const metaspace = await getGlobalMetaspace_waitIfNeeded();
142
- const space = await metaspace.getLocalUserSpace({});
143
- if (space) {
144
- const keystonesIndex = await metaspace.getSpecialIbGib({
145
- type: "keystones",
146
- space,
147
- initialize: true,
148
- });
149
- const registeredKeystones = keystonesIndex?.rel8ns?.keystone ?? [];
150
- this.hasExistingIdentities = registeredKeystones.length > 0;
151
- }
152
- } catch (error) {
153
- console.warn(`${lc} Error checking existing identities: ${extractErrorMsg(error)}`);
154
- this.hasExistingIdentities = false;
155
- }
156
-
157
- const checkbox = this.elements!.checkboxMakeActive;
158
- if (checkbox) {
159
- if (!this.hasExistingIdentities) {
160
- checkbox.checked = true;
161
- checkbox.disabled = true;
162
- checkbox.title = "At least one active identity is required.";
163
- } else {
164
- checkbox.disabled = false;
165
- checkbox.title = "";
166
- }
167
- }
168
- }
169
-
170
- override async disconnected(): Promise<void> {
171
- // cleanup if needed
172
- }
173
-
174
- private initHandlers() {
175
- this.elements!.btnGenerateEl.addEventListener('click', () => this.handleGenerate());
176
-
177
- // Clear invalid styling when user inputs text
178
- this.elements!.inputUsername.addEventListener('input', () => {
179
- this.elements!.inputUsername.classList.remove('invalid');
180
- });
181
- this.elements!.inputDescription.addEventListener('input', () => {
182
- this.elements!.inputDescription.classList.remove('invalid');
183
- });
184
- this.elements!.inputSecret.addEventListener('input', () => {
185
- this.elements!.inputSecret.classList.remove('invalid');
186
- });
187
- }
188
-
189
- /**
190
- * Triggered by the "Generate" button.
191
- * Orchestrates: Secret -> Local Genesis -> Graph Collection -> Server Sync.
192
- */
193
- protected async handleGenerate() {
194
- const lc = `${this.lc}[${this.handleGenerate.name}]`;
195
- try {
196
- console.log(`${lc} [NAG][ibgib-paradigm] starting genesis orchestration...`);
197
- /**
198
- * Delay update messages so the human eye has a chance to comprehend
199
- * progress.
200
- */
201
- const humanEyeDelay = 500;
202
- this.setStatus("Initializing genesis...", "info");
203
-
204
- devLog('Starting local genesis orchestration...');
205
-
206
- // Validate Username using base class validation plumbing
207
- if (!this.validateInputPattern({
208
- input: this.elements!.inputUsername,
209
- pattern: KEYSTONE_USERNAME_REGEXP,
210
- errorMessage: "Username must be 1-63 characters (alphanumeric, underscores, hyphens, dots).",
211
- required: true
212
- })) {
213
- this.setStatus("Invalid username. Must be 1-63 characters (alphanumeric, _, -, .).", "error");
214
- devLog('✗ Invalid username.');
215
- return; /* <<<< returns early */
216
- }
217
- const username = this.elements!.inputUsername.value.trim();
218
-
219
- // Validate Description using base class validation plumbing
220
- if (!this.validateInputPattern({
221
- input: this.elements!.inputDescription,
222
- pattern: KEYSTONE_DESCRIPTION_REGEXP,
223
- errorMessage: "Description must be 0-128 characters and consist of English characters and common punctuation.",
224
- required: false
225
- })) {
226
- this.setStatus("Invalid description. Alphanumeric + common punctuation, max 128 chars.", "error");
227
- devLog('✗ Invalid description.');
228
- return; /* <<<< returns early */
229
- }
230
- const description = this.elements!.inputDescription.value.trim();
231
-
232
- const masterSecret = this.elements!.inputSecret.value;
233
- if (!masterSecret) {
234
- this.elements!.inputSecret.classList.add('invalid');
235
- this.setStatus("Please enter a master secret.", "error");
236
- devLog('✗ Please enter a master secret.');
237
- return; /* <<<< returns early */
238
- } else {
239
- this.elements!.inputSecret.classList.remove('invalid');
240
- }
241
-
242
- this.showBusy({
243
- isBusy: true,
244
- title: 'Generating Identity...',
245
- msg: 'Preparing configuration and policy options...',
246
- animationEmoji: '⚙️',
247
- submitBtnSelector: '#btn-generate',
248
- loadingText: 'Generating...'
249
- });
250
-
251
- // 1. Prepare Primary/Domain Keystone Configs
252
- const builder = KeystoneProfileBuilder.buildKeystone('domain')
253
- .withUsername(username)
254
- .withDescription(description)
255
- .withDetails({
256
- client: 'space-gib-web',
257
- role: 'domain-identity'
258
- });
259
- const configs = await builder.compileConfigs();
260
-
261
- // 2. Get local services
262
- const metaspace = await getGlobalMetaspace_waitIfNeeded();
263
- const space = await metaspace.getLocalUserSpace({});
264
- if (!space) { throw new Error("No default space found in metaspace."); }
265
-
266
- // 3. Perform Genesis (Local)
267
- this.showBusy({
268
- isBusy: true,
269
- title: 'Generating Identity...',
270
- msg: 'Performing cryptographic local genesis...\n(This runs compute-heavy Key Derivation Functions)',
271
- animationEmoji: '🗝️'
272
- });
273
- const keystoneService = new KeystoneService_V1();
274
- const keystoneIbGib = await keystoneService.genesis({
275
- masterSecret,
276
- configs,
277
- metaspace,
278
- space,
279
- frameDetails: builder.getFrameDetails(),
280
- isPrimary: true
281
- });
282
-
283
- const addr = getIbGibAddr({ ibGib: keystoneIbGib });
284
- console.log(`${lc} [NAG][ibgib-paradigm] local genesis complete: ${addr}`);
285
- await delay(humanEyeDelay); // for human eyes, not needed for functionality
286
- this.setStatus("Local genesis complete. Creating sync delegate...", "info");
287
- devLog(`✓ Local genesis complete: ${addr}`);
288
-
289
- // Automatically generate Sync Delegate Keystone
290
- this.showBusy({
291
- isBusy: true,
292
- title: 'Creating Sync Delegate...',
293
- msg: 'Generating cryptographic sync delegate keys...',
294
- animationEmoji: '🔑'
295
- });
296
-
297
- const delegateSecret = await deriveDelegateSecret({ masterSecret });
298
- const delegateBuilder = KeystoneProfileBuilder.buildKeystone('sync')
299
- .withUsername(`${username}-sync`)
300
- .withDescription(`Sync Delegate for ${username}`)
301
- .withDetails({
302
- client: 'space-gib-web',
303
- role: 'sync-delegate'
304
- });
305
- const delegateConfigs = await delegateBuilder.compileConfigs();
306
-
307
- const delegateKeystoneIbGib = await keystoneService.genesis({
308
- masterSecret: delegateSecret,
309
- configs: delegateConfigs,
310
- metaspace,
311
- space,
312
- frameDetails: delegateBuilder.getFrameDetails()
313
- });
314
-
315
- const delegateAddr = getIbGibAddr({ ibGib: delegateKeystoneIbGib });
316
- console.log(`${lc} sync delegate genesis complete: ${delegateAddr}`);
317
- await delay(humanEyeDelay);
318
-
319
- // Register delegate on parent
320
- this.setStatus("Registering delegate on parent...", "info");
321
- this.showBusy({
322
- isBusy: true,
323
- title: 'Registering Delegate...',
324
- msg: 'Evolving domain identity to register delegate...',
325
- animationEmoji: '📝'
326
- });
327
- const evolvedParentKeystoneIbGib = await keystoneService.registerDelegate({
328
- parentKeystone: keystoneIbGib,
329
- delegateKeystone: delegateKeystoneIbGib,
330
- masterSecret,
331
- metaspace,
332
- space,
333
- allowedVerbs: [KEYSTONE_VERB_SYNC, KEYSTONE_VERB_CONNECT]
334
- });
335
- const evolvedParentAddr = getIbGibAddr({ ibGib: evolvedParentKeystoneIbGib });
336
- console.log(`${lc} delegate registered. evolved parent address: ${evolvedParentAddr}`);
337
- await delay(humanEyeDelay);
338
-
339
- // 4. Post to Server
340
- devLog(`Posting genesis keystone to server...`);
341
- this.setStatus("Syncing genesis to server...", "info");
342
- this.showBusy({
343
- isBusy: true,
344
- title: 'Syncing to Server...',
345
- msg: [
346
- 'Posting genesis keystone to server sync node...',
347
- '(may take awhile, depending on strength of keystone...)',
348
- ].join('\n'),
349
- animationEmoji: '🔄'
350
- });
351
- const resSync = await spaceGibApiBridge.postGenesisKeystone(keystoneIbGib);
352
- if (!resSync.success) {
353
- this.setStatus(`Sync failed: ${resSync.message}`, "error");
354
- devLog(`✗ Server rejected genesis keystone: ${resSync.message}`);
355
- return; /* <<<< returns early */
356
- }
357
-
358
- // Post evolved keystone + delegate keystone
359
- this.setStatus("Syncing delegate registration to server...", "info");
360
- this.showBusy({
361
- isBusy: true,
362
- title: 'Syncing Delegate...',
363
- msg: 'Posting evolved domain identity and sync delegate to server...',
364
- animationEmoji: '🔄'
365
- });
366
- const resEvolve = await spaceGibApiBridge.putEvolveKeystone(
367
- addr,
368
- evolvedParentKeystoneIbGib,
369
- [delegateKeystoneIbGib]
370
- );
371
- if (!resEvolve.success) {
372
- this.setStatus(`Delegate registration sync failed: ${resEvolve.message}`, "error");
373
- devLog(`✗ Server rejected delegate registration: ${resEvolve.message}`);
374
- return; /* <<<< returns early */
375
- }
376
-
377
- // 5. Register with the keystones special index
378
- this.showBusy({
379
- isBusy: true,
380
- title: 'Registering Identity...',
381
- msg: 'Server sync succeeded!\nUpdating local identity indexes and scope settings...',
382
- animationEmoji: '💾'
383
- });
384
- await delay(humanEyeDelay); // for human eyes, not needed for functionality
385
- await updateSpecialIndex({
386
- type: "keystones",
387
- rel8nInfos: [
388
- {
389
- rel8nName: "keystone",
390
- ibGibs: [
391
- toDto({ ibGib: evolvedParentKeystoneIbGib }),
392
- toDto({ ibGib: delegateKeystoneIbGib })
393
- ],
394
- },
395
- ],
396
- metaspace,
397
- space,
398
- });
399
-
400
- // Expose for dev tools
401
- (window as any).dev_domainI = evolvedParentKeystoneIbGib;
402
- (window as any).dev_domainIMasterSecret = masterSecret;
403
- (window as any).dev_syncDelegate = delegateKeystoneIbGib;
404
- (window as any).dev_syncDelegateSecret = delegateSecret;
405
-
406
- // 6. Request to make the new identity active if the checkbox is checked
407
- const makeActive = this.elements!.checkboxMakeActive?.checked;
408
- if (makeActive) {
409
- window.dispatchEvent(new CustomEvent(EVENT_IBGIB_IDENTITY_REQUEST_CHANGE, {
410
- detail: { activeIdentityAddr: evolvedParentAddr },
411
- bubbles: true,
412
- composed: true
413
- }));
414
- }
415
-
416
- // 7. Success
417
- this.elements!.keystoneAddrEl.textContent = evolvedParentAddr;
418
- this.elements!.statusArea.classList.remove('hidden');
419
- this.setStatus("Keystone successfully created and synced!", "success");
420
- await delay(humanEyeDelay); // for human eyes, not needed for functionality
421
- devLog(`✓ Keystone successfully created and synced!`);
422
-
423
- } catch (error) {
424
- const emsg = extractErrorMsg(error);
425
- console.error(`${lc} ${emsg}`);
426
- this.setStatus(`Error: ${emsg}`, "error");
427
- devLog(`✗ Error: ${emsg}`);
428
- } finally {
429
- this.showBusy({
430
- isBusy: false,
431
- submitBtnSelector: '#btn-generate'
432
- });
433
- }
434
- }
435
-
436
- protected override async renderUI(): Promise<void> {
437
- // No complex rendering needed for this simple creator component yet
438
- }
439
-
440
- override async handleContextUpdated(): Promise<void> {
441
- await this.renderUI();
442
- }
443
- }