@ibgib/space-gib 0.0.9 → 0.0.13

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 (82) 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-ROJZUPPE.mjs +19 -0
  6. package/dist/client/chunk-ROJZUPPE.mjs.map +7 -0
  7. package/dist/client/chunk-WJHRARK6.mjs +2329 -0
  8. package/dist/client/chunk-WJHRARK6.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 +19147 -18210
  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 -224
  19. package/src/client/ui/shell/space-gib-shell-service.mts +68 -18
  20. package/src/common/keystone-policies.mts +1 -1
  21. package/src/server/README.md +3 -2
  22. package/src/server/server.mts +13 -32
  23. package/src/server/test.json +0 -0
  24. package/dist/client/chunk-ACIGPCQW.mjs +0 -2407
  25. package/dist/client/chunk-ACIGPCQW.mjs.map +0 -7
  26. package/dist/client/chunk-QRMTJE6M.mjs +0 -42
  27. package/dist/client/chunk-QRMTJE6M.mjs.map +0 -7
  28. package/space-gib.localhost-1783713259760.log +0 -45
  29. package/src/client/components/identity-header/IMPLEMENTATION.md +0 -45
  30. package/src/client/components/identity-header/identity-header.css +0 -112
  31. package/src/client/components/identity-header/identity-header.html +0 -11
  32. package/src/client/components/identity-header/identity-header.mts +0 -439
  33. package/src/client/components/identity-manager/IMPLEMENTATION.md +0 -100
  34. package/src/client/components/identity-manager/identity-manager.css +0 -171
  35. package/src/client/components/identity-manager/identity-manager.html +0 -19
  36. package/src/client/components/identity-manager/identity-manager.mts +0 -639
  37. package/src/client/components/keystone-creator/keystone-creator.css +0 -65
  38. package/src/client/components/keystone-creator/keystone-creator.html +0 -41
  39. package/src/client/components/keystone-creator/keystone-creator.mts +0 -443
  40. package/src/client/components/keystone-details/keystone-details.css +0 -611
  41. package/src/client/components/keystone-details/keystone-details.html +0 -151
  42. package/src/client/components/keystone-details/keystone-details.mts +0 -1213
  43. package/src/client/components/keystone-scrubber/SCRUBBER_IMPLEMENTATION.md +0 -33
  44. package/src/client/components/keystone-scrubber/keystone-scrubber.css +0 -46
  45. package/src/client/components/keystone-scrubber/keystone-scrubber.html +0 -15
  46. package/src/client/components/keystone-scrubber/keystone-scrubber.mts +0 -356
  47. package/src/server/bootstrap-helper.mts +0 -141
  48. package/src/server/bootstrap-helper.respec.mts +0 -100
  49. package/src/server/metaspace-nodeindexedspace/metaspace-nodeindexedspace.mts +0 -85
  50. package/src/server/path-constants.mts +0 -101
  51. package/src/server/path-helper.mts +0 -101
  52. package/src/server/path-helper.respec.mts +0 -99
  53. package/src/server/serve-gib/CHANGELOG.md +0 -29
  54. package/src/server/serve-gib/README.md +0 -43
  55. package/src/server/serve-gib/constants.mts +0 -1
  56. package/src/server/serve-gib/handlers/api/debug/ws-echo.handler.mts +0 -105
  57. package/src/server/serve-gib/handlers/api/health.handler.mts +0 -23
  58. package/src/server/serve-gib/handlers/api/health.respec.mts +0 -51
  59. package/src/server/serve-gib/handlers/api/ibgib/ibgib-handler-types.mts +0 -49
  60. package/src/server/serve-gib/handlers/api/ibgib/ibgib.handler.mts +0 -176
  61. package/src/server/serve-gib/handlers/api/keystone/keystone-evolve.handler.mts +0 -150
  62. package/src/server/serve-gib/handlers/api/keystone/keystone-genesis.handler.mts +0 -146
  63. package/src/server/serve-gib/handlers/api/keystone/keystone-get.handler.mts +0 -198
  64. package/src/server/serve-gib/handlers/api/keystone/keystone-get.respec.mts +0 -107
  65. package/src/server/serve-gib/handlers/api/keystone/keystone-handler-types.mts +0 -29
  66. package/src/server/serve-gib/handlers/api/keystone/keystone-post.handler.mts +0 -55
  67. package/src/server/serve-gib/handlers/api/keystone/keystone-post.respec.mts +0 -130
  68. package/src/server/serve-gib/handlers/api/keystone/sso-config.handler.mts +0 -66
  69. package/src/server/serve-gib/handlers/api/keystone/sso-link.handler.mts +0 -140
  70. package/src/server/serve-gib/handlers/api/keystone/sso-login.handler.mts +0 -190
  71. package/src/server/serve-gib/handlers/error-handler.mts +0 -36
  72. package/src/server/serve-gib/handlers/handler-base.mts +0 -383
  73. package/src/server/serve-gib/handlers/static-handler.mts +0 -82
  74. package/src/server/serve-gib/handlers/ws/sync-upgrade-handler-base.mts +0 -233
  75. package/src/server/serve-gib/handlers/ws/sync-upgrade.handler.mts +0 -24
  76. package/src/server/serve-gib/handlers/ws/ws-helper.mts +0 -216
  77. package/src/server/serve-gib/handlers/ws/ws-types.mts +0 -53
  78. package/src/server/serve-gib/serve-gib-helpers.mts +0 -32
  79. package/src/server/serve-gib/serve-gib-v1.mts +0 -172
  80. package/src/server/serve-gib/serve-gib.respec.mts +0 -90
  81. package/src/server/serve-gib/types.mts +0 -102
  82. 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
- domainAddr: addr,
368
- keystoneIbGib: evolvedParentKeystoneIbGib,
369
- relatedKeystoneIbGibs: [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
- }