@ibgib/web-gib 0.0.59 → 0.0.61

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 (92) hide show
  1. package/dist/AUTO-GENERATED-version.d.mts +1 -1
  2. package/dist/AUTO-GENERATED-version.mjs +1 -1
  3. package/dist/helpers.d.mts.map +1 -1
  4. package/dist/helpers.mjs +1 -0
  5. package/dist/helpers.mjs.map +1 -1
  6. package/dist/identity/device-delegate-helper.d.mts +43 -0
  7. package/dist/identity/device-delegate-helper.d.mts.map +1 -0
  8. package/dist/identity/device-delegate-helper.mjs +106 -0
  9. package/dist/identity/device-delegate-helper.mjs.map +1 -0
  10. package/dist/identity/device-delegate.respec.d.mts +2 -0
  11. package/dist/identity/device-delegate.respec.d.mts.map +1 -0
  12. package/dist/identity/device-delegate.respec.mjs +106 -0
  13. package/dist/identity/device-delegate.respec.mjs.map +1 -0
  14. package/dist/identity/identity-constants.mjs +2 -2
  15. package/dist/identity/identity-constants.mjs.map +1 -1
  16. package/dist/identity/identity-types.d.mts +4 -4
  17. package/dist/identity/identity-types.d.mts.map +1 -1
  18. package/dist/identity/keystone-sync-service.d.mts +18 -0
  19. package/dist/identity/keystone-sync-service.d.mts.map +1 -1
  20. package/dist/identity/keystone-sync-service.mjs +77 -1
  21. package/dist/identity/keystone-sync-service.mjs.map +1 -1
  22. package/dist/index.d.mts +1 -1
  23. package/dist/index.d.mts.map +1 -1
  24. package/dist/index.mjs +1 -2
  25. package/dist/index.mjs.map +1 -1
  26. package/dist/storage/storage-helpers.web.d.mts +9 -0
  27. package/dist/storage/storage-helpers.web.d.mts.map +1 -1
  28. package/dist/storage/storage-helpers.web.mjs +42 -0
  29. package/dist/storage/storage-helpers.web.mjs.map +1 -1
  30. package/dist/ui/component/identity/add-device/add-device.css +93 -17
  31. package/dist/ui/component/identity/add-device/add-device.d.mts +24 -7
  32. package/dist/ui/component/identity/add-device/add-device.d.mts.map +1 -1
  33. package/dist/ui/component/identity/add-device/add-device.html +97 -23
  34. package/dist/ui/component/identity/add-device/add-device.mjs +489 -198
  35. package/dist/ui/component/identity/add-device/add-device.mjs.map +1 -1
  36. package/dist/ui/component/identity/keystone-creator/keystone-creator.d.mts.map +1 -1
  37. package/dist/ui/component/identity/keystone-creator/keystone-creator.mjs +48 -61
  38. package/dist/ui/component/identity/keystone-creator/keystone-creator.mjs.map +1 -1
  39. package/dist/ui/component/identity/keystone-details/keystone-details.css +1 -1
  40. package/dist/ui/component/identity/keystone-details/keystone-details.d.mts +11 -8
  41. package/dist/ui/component/identity/keystone-details/keystone-details.d.mts.map +1 -1
  42. package/dist/ui/component/identity/keystone-details/keystone-details.html +29 -20
  43. package/dist/ui/component/identity/keystone-details/keystone-details.mjs +358 -97
  44. package/dist/ui/component/identity/keystone-details/keystone-details.mjs.map +1 -1
  45. package/dist/ui/component/identity/remove-device/remove-device.d.mts +1 -1
  46. package/dist/ui/component/identity/remove-device/remove-device.d.mts.map +1 -1
  47. package/dist/ui/component/identity/remove-device/remove-device.html +3 -3
  48. package/dist/ui/component/identity/remove-device/remove-device.mjs +7 -7
  49. package/dist/ui/component/identity/remove-device/remove-device.mjs.map +1 -1
  50. package/dist/ui/ui-constants.d.mts +1 -0
  51. package/dist/ui/ui-constants.d.mts.map +1 -1
  52. package/dist/ui/ui-constants.mjs +1 -0
  53. package/dist/ui/ui-constants.mjs.map +1 -1
  54. package/dist/ui/ui-types.d.mts +5 -0
  55. package/dist/ui/ui-types.d.mts.map +1 -1
  56. package/dist/util/device-helper.d.mts +30 -0
  57. package/dist/util/device-helper.d.mts.map +1 -0
  58. package/dist/util/device-helper.mjs +90 -0
  59. package/dist/util/device-helper.mjs.map +1 -0
  60. package/dist/util/device-helper.respec.d.mts +2 -0
  61. package/dist/util/device-helper.respec.d.mts.map +1 -0
  62. package/dist/util/device-helper.respec.mjs +83 -0
  63. package/dist/util/device-helper.respec.mjs.map +1 -0
  64. package/package.json +3 -3
  65. package/src/AUTO-GENERATED-version.mts +1 -1
  66. package/src/helpers.mts +1 -0
  67. package/src/identity/custodian-delegate-helper.mts.bak +7 -0
  68. package/src/identity/device-delegate-helper.mts +135 -0
  69. package/src/identity/device-delegate.respec.mts +125 -0
  70. package/src/identity/identity-constants.mts +2 -2
  71. package/src/identity/identity-types.mts +4 -4
  72. package/src/identity/keystone-sync-service.mts +95 -2
  73. package/src/index.mts +1 -2
  74. package/src/storage/storage-helpers.web.mts +47 -0
  75. package/src/ui/component/identity/add-device/add-device.css +93 -17
  76. package/src/ui/component/identity/add-device/add-device.html +97 -23
  77. package/src/ui/component/identity/add-device/add-device.mts +579 -208
  78. package/src/ui/component/identity/keystone-creator/keystone-creator.mts +55 -69
  79. package/src/ui/component/identity/keystone-details/keystone-details.css +1 -1
  80. package/src/ui/component/identity/keystone-details/keystone-details.html +29 -20
  81. package/src/ui/component/identity/keystone-details/keystone-details.mts +374 -106
  82. package/src/ui/component/identity/remove-device/remove-device.html +3 -3
  83. package/src/ui/component/identity/remove-device/remove-device.mts +8 -8
  84. package/src/ui/ui-constants.mts +1 -0
  85. package/src/ui/ui-types.mts +6 -0
  86. package/src/util/device-helper.mts +104 -0
  87. package/src/util/device-helper.respec.mts +90 -0
  88. package/dist/identity/custodian-delegate-helper.d.mts +0 -22
  89. package/dist/identity/custodian-delegate-helper.d.mts.map +0 -1
  90. package/dist/identity/custodian-delegate-helper.mjs +0 -50
  91. package/dist/identity/custodian-delegate-helper.mjs.map +0 -1
  92. package/src/identity/custodian-delegate-helper.mts +0 -61
@@ -10,11 +10,11 @@ import { getGibInfo } from "@ibgib/ts-gib/dist/V1/transforms/transform-helper.mj
10
10
  import { KeystoneService_V1 } from "@ibgib/core-gib/dist/keystone/keystone-service-v1.mjs";
11
11
  import { KeystoneProfileBuilder } from "@ibgib/core-gib/dist/keystone/policy/keystone-profile-builder.mjs";
12
12
  import { updateSpecialIndex, } from "@ibgib/core-gib/dist/timeline/timeline-api.mjs";
13
- import { toDto, getTjpAddr } from "@ibgib/core-gib/dist/common/other/ibgib-helper.mjs";
13
+ import { toDto, getTjpAddr, getTimelinesGroupedByTjp } from "@ibgib/core-gib/dist/common/other/ibgib-helper.mjs";
14
14
  import { FlatIbGibGraph } from "@ibgib/core-gib/dist/common/other/graph-types.mjs";
15
15
  import { validateEmail } from "@ibgib/core-gib/dist/keystone/keystone-helpers.mjs";
16
16
  import { KEYSTONE_USERNAME_REGEXP, KEYSTONE_DESCRIPTION_REGEXP, KEYSTONE_VERB_SYNC, KEYSTONE_VERB_CONNECT } from "@ibgib/core-gib/dist/keystone/keystone-constants.mjs";
17
- import { deriveDelegateSecret } from "@ibgib/core-gib/dist/keystone/strategy/hash-reveal-v1/hash-reveal-v1.mjs";
17
+ import { deriveDelegateSecret, createSyncDelegateKeystone } from "@ibgib/core-gib/dist/keystone/delegate/delegate-helpers.mjs";
18
18
 
19
19
  import { getGlobalMetaspace_waitIfNeeded, } from "../../../../helpers.mjs";
20
20
  import { IbGibDynamicComponentMetaBase, IbGibFormInstanceBase, } from "../../ibgib-dynamic-component-bases.mjs";
@@ -24,8 +24,9 @@ import {
24
24
  } from "../../component-types.mjs";
25
25
  import { getComponentCtorArg } from "../../../../app-bootstrap/init-orchestration.mjs";
26
26
  import { getApiBridge } from "../../../../api/ibgib-api-bridge.mjs";
27
- import { deriveLocalCustodianDelegateSecret } from "../../../../identity/custodian-delegate-helper.mjs";
27
+ import { getOrCreateDeviceDelegateSecret, setDeviceDelegateSecret } from "../../../../identity/device-delegate-helper.mjs";
28
28
  import { executeSsoOAuthPopup } from "../../../../identity/sso-popup-helper.mjs";
29
+ import { generateDefaultDeviceTag } from "../../../../util/device-helper.mjs";
29
30
  import { EVENT_IBGIB_IDENTITY_REQUEST_CHANGE, EVENT_IBGIB_UI_MESSAGE } from "../../../ui-constants.mjs";
30
31
  import { alertUser, shadowRoot_getElementById } from "../../../../helpers.web.mjs";
31
32
 
@@ -307,25 +308,6 @@ export class KeystoneCreatorComponentInstance
307
308
  animationEmoji: '🔑'
308
309
  });
309
310
 
310
- const delegateSecret = await deriveLocalCustodianDelegateSecret({ primaryTjpAddr });
311
- const email = resLogin.userInfo?.email || '';
312
- const username = email ? email.split('@')[0] : 'user';
313
- const custodianSyncProfileName = process.env.KEYSTONE_PROFILE_CUSTODIAN_SYNC;
314
- if (!custodianSyncProfileName || !custodianSyncProfileName.trim()) {
315
- throw new Error('KEYSTONE_PROFILE_CUSTODIAN_SYNC environment variable is missing. Expected valid profile name like "sync-profile.dev" or "sync-profile.prod". (E: 4d5e6f7890123456789abcdef4)');
316
- }
317
-
318
- const delegateBuilder = KeystoneProfileBuilder.buildKeystone(custodianSyncProfileName.trim() as any)
319
- .withUsername(`${username}-sync`)
320
- .withDescription(`Sync Delegate for ${username}`)
321
- .withDetails({
322
- client: 'space-gib-web',
323
- role: 'sync-delegate',
324
- primaryTjpAddr,
325
- custodianReqs,
326
- });
327
-
328
- const configs = await delegateBuilder.compileConfigs();
329
311
  const metaspace = await getGlobalMetaspace_waitIfNeeded();
330
312
  const space = await metaspace.getLocalUserSpace({ lock: false });
331
313
  if (!space) {
@@ -333,14 +315,24 @@ export class KeystoneCreatorComponentInstance
333
315
  return;
334
316
  }
335
317
 
336
- const keystoneService = new KeystoneService_V1();
337
- const delegateKeystone = await keystoneService.genesis({
338
- masterSecret: delegateSecret,
339
- configs,
318
+ const delegateSecret = await getOrCreateDeviceDelegateSecret({ primaryTjpAddr });
319
+ const email = resLogin.userInfo?.email || '';
320
+ const username = email ? email.split('@')[0] : 'user';
321
+ const custodianSyncProfileName = process.env.KEYSTONE_PROFILE_CUSTODIAN_SYNC;
322
+ if (!custodianSyncProfileName || !custodianSyncProfileName.trim()) {
323
+ throw new Error('KEYSTONE_PROFILE_CUSTODIAN_SYNC environment variable is missing. Expected valid profile name like "sync-profile.dev" or "sync-profile.prod". (E: 4d5e6f7890123456789abcdef4)');
324
+ }
325
+
326
+ const delegateKeystone = await createSyncDelegateKeystone({
327
+ profileName: custodianSyncProfileName.trim() as any,
328
+ username,
329
+ deviceTag: generateDefaultDeviceTag(),
330
+ primaryTjpAddr,
331
+ delegateSecret,
332
+ custodianReqs,
333
+ additionalFrameDetails: { client: 'space-gib-web' },
340
334
  metaspace,
341
335
  space,
342
- frameDetails: delegateBuilder.getFrameDetails(),
343
- isPrimary: false
344
336
  });
345
337
 
346
338
  this.setStatus('Registering device delegate with custodian server...', 'info');
@@ -467,24 +459,6 @@ export class KeystoneCreatorComponentInstance
467
459
  animationEmoji: '🔑'
468
460
  });
469
461
 
470
- const delegateSecret = await deriveLocalCustodianDelegateSecret({ primaryTjpAddr });
471
- const username = email ? email.split('@')[0] : 'user';
472
- const custodianSyncProfileName = process.env.KEYSTONE_PROFILE_CUSTODIAN_SYNC;
473
- if (!custodianSyncProfileName || !custodianSyncProfileName.trim()) {
474
- throw new Error('KEYSTONE_PROFILE_CUSTODIAN_SYNC environment variable is missing. Expected valid profile name like "sync-profile.dev" or "sync-profile.prod". (E: 4d5e6f7890123456789abcdef4)');
475
- }
476
-
477
- const delegateBuilder = KeystoneProfileBuilder.buildKeystone(custodianSyncProfileName.trim() as any)
478
- .withUsername(`${username}-sync`)
479
- .withDescription(`Sync Delegate for ${username}`)
480
- .withDetails({
481
- client: 'space-gib-web',
482
- role: 'sync-delegate',
483
- primaryTjpAddr,
484
- custodianReqs,
485
- });
486
-
487
- const configs = await delegateBuilder.compileConfigs();
488
462
  const metaspace = await getGlobalMetaspace_waitIfNeeded();
489
463
  const space = await metaspace.getLocalUserSpace({ lock: false });
490
464
  if (!space) {
@@ -492,14 +466,23 @@ export class KeystoneCreatorComponentInstance
492
466
  return;
493
467
  }
494
468
 
495
- const keystoneService = new KeystoneService_V1();
496
- const delegateKeystone = await keystoneService.genesis({
497
- masterSecret: delegateSecret,
498
- configs,
469
+ const delegateSecret = await getOrCreateDeviceDelegateSecret({ primaryTjpAddr });
470
+ const username = email ? email.split('@')[0] : 'user';
471
+ const custodianSyncProfileName = process.env.KEYSTONE_PROFILE_CUSTODIAN_SYNC;
472
+ if (!custodianSyncProfileName || !custodianSyncProfileName.trim()) {
473
+ throw new Error('KEYSTONE_PROFILE_CUSTODIAN_SYNC environment variable is missing. Expected valid profile name like "sync-profile.dev" or "sync-profile.prod". (E: 4d5e6f7890123456789abcdef4)');
474
+ }
475
+
476
+ const delegateKeystone = await createSyncDelegateKeystone({
477
+ profileName: custodianSyncProfileName.trim() as any,
478
+ username,
479
+ deviceTag: generateDefaultDeviceTag(),
480
+ primaryTjpAddr,
481
+ delegateSecret,
482
+ custodianReqs,
483
+ additionalFrameDetails: { client: 'space-gib-web' },
499
484
  metaspace,
500
485
  space,
501
- frameDetails: delegateBuilder.getFrameDetails(),
502
- isPrimary: false
503
486
  });
504
487
 
505
488
  // Register delegate with server
@@ -684,27 +667,22 @@ export class KeystoneCreatorComponentInstance
684
667
  });
685
668
 
686
669
  const delegateSecret = await deriveDelegateSecret({ masterSecret });
670
+ await setDeviceDelegateSecret({ primaryTjpAddr, delegateSecret });
671
+
687
672
  const sovereignSyncProfileName = process.env.KEYSTONE_PROFILE_SOVEREIGN_SYNC;
688
673
  if (!sovereignSyncProfileName || !sovereignSyncProfileName.trim()) {
689
674
  throw new Error('KEYSTONE_PROFILE_SOVEREIGN_SYNC environment variable is missing. Expected valid profile name like "sync-profile.dev" or "sync-profile.prod". (E: 5e6f7890123456789abcdef5)');
690
675
  }
691
676
 
692
- const delegateBuilder = KeystoneProfileBuilder.buildKeystone(sovereignSyncProfileName.trim() as any)
693
- .withUsername(`${username}-sync`)
694
- .withDescription(`Sync Delegate for ${username}`)
695
- .withDetails({
696
- client: 'space-gib-web',
697
- role: 'sync-delegate',
698
- primaryTjpAddr: primaryTjpAddr,
699
- });
700
- const delegateConfigs = await delegateBuilder.compileConfigs();
701
-
702
- const delegateKeystoneIbGib = await keystoneService.genesis({
703
- masterSecret: delegateSecret,
704
- configs: delegateConfigs,
677
+ const delegateKeystoneIbGib = await createSyncDelegateKeystone({
678
+ profileName: sovereignSyncProfileName.trim() as any,
679
+ username,
680
+ deviceTag: generateDefaultDeviceTag(),
681
+ primaryTjpAddr,
682
+ delegateSecret,
683
+ additionalFrameDetails: { client: 'space-gib-web' },
705
684
  metaspace,
706
685
  space,
707
- frameDetails: delegateBuilder.getFrameDetails()
708
686
  });
709
687
 
710
688
  const delegateAddr = getIbGibAddr({ ibGib: delegateKeystoneIbGib });
@@ -921,9 +899,12 @@ export class KeystoneCreatorComponentInstance
921
899
  // 0. Persist all frames of primary identity graph into local browser space
922
900
  if (primaryGraph) {
923
901
  const graphIbGibs = Object.values(primaryGraph) as IbGib_V1[];
924
- for (const frame of graphIbGibs) {
925
- await metaspace.put({ ibGibs: [frame], space });
926
- await metaspace.registerNewIbGib({ ibGib: frame, space });
902
+ await metaspace.put({ ibGibs: graphIbGibs, space });
903
+ const timelinesMap = getTimelinesGroupedByTjp({ ibGibs: graphIbGibs });
904
+ for (const tjpKey of Object.keys(timelinesMap)) {
905
+ for (const frame of timelinesMap[tjpKey]) {
906
+ await metaspace.registerNewIbGib({ ibGib: frame, space });
907
+ }
927
908
  }
928
909
  } else if (primaryKeystone) {
929
910
  await metaspace.put({ ibGibs: [primaryKeystone], space });
@@ -1006,6 +987,11 @@ export class KeystoneCreatorComponentInstance
1006
987
  this.setStatus(successMsg, "success");
1007
988
  console.log(`${lc} ✓ ${successMsg}`);
1008
989
 
990
+ // 3.5 Sanitize secret input fields from DOM
991
+ if (this.elements?.inputSecret) {
992
+ this.elements.inputSecret.value = '';
993
+ }
994
+
1009
995
  // 4. Dispatch UI navigation message to close creator and open identity manager
1010
996
  window.dispatchEvent(new CustomEvent(EVENT_IBGIB_UI_MESSAGE, {
1011
997
  detail: { action: 'show-identity-manager', addr: primaryTjpAddr },
@@ -578,7 +578,7 @@
578
578
  opacity: 0.4;
579
579
  }
580
580
 
581
- /* Form Layout for Passphrase Rotation */
581
+ /* Form Layout for Password Rotation */
582
582
  .form-row {
583
583
  display: flex;
584
584
  gap: 1rem;
@@ -60,7 +60,8 @@
60
60
  <div id="delegates-card" class="card">
61
61
  <h3>Registered Delegates</h3>
62
62
  <div id="delegates-container" class="delegates-container">
63
- <p class="description">Active sub-keystones authorized to perform sync and operations on behalf of this Domain Identity.</p>
63
+ <p class="description">Active sub-keystones authorized to perform operations on behalf of this Domain
64
+ Identity.</p>
64
65
  <table class="delegates-table">
65
66
  <thead>
66
67
  <tr>
@@ -80,7 +81,8 @@
80
81
  <!-- SSO Identity Linking Card -->
81
82
  <div id="sso-link-card" class="card hidden">
82
83
  <h3>Identity Providers</h3>
83
- <p class="description">Securely link or unlink external OAuth2 providers to delegate sync access to this identity.</p>
84
+ <p class="description">Securely link or unlink external OAuth2 providers to delegate sync access to this
85
+ identity.</p>
84
86
  <div class="sso-toggle-group">
85
87
  <!-- Google Card Toggle -->
86
88
  <div id="btn-link-google" class="sso-toggle-card google" role="button" tabindex="0">
@@ -88,10 +90,14 @@
88
90
  <div class="toggle-content">
89
91
  <!-- Custom Google SVG Icon -->
90
92
  <svg class="sso-icon" viewBox="0 0 24 24">
91
- <path fill="#4285F4" d="M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z"/>
92
- <path fill="#34A853" d="M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z"/>
93
- <path fill="#FBBC05" d="M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.06H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.94l2.85-2.22.81-.63z"/>
94
- <path fill="#EA4335" d="M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.06l3.66 2.84c.87-2.6 3.3-4.52 6.16-4.52z"/>
93
+ <path fill="#4285F4"
94
+ d="M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z" />
95
+ <path fill="#34A853"
96
+ d="M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z" />
97
+ <path fill="#FBBC05"
98
+ d="M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.06H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.94l2.85-2.22.81-.63z" />
99
+ <path fill="#EA4335"
100
+ d="M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.06l3.66 2.84c.87-2.6 3.3-4.52 6.16-4.52z" />
95
101
  </svg>
96
102
  <span class="provider-label">Google</span>
97
103
  <span class="toggle-state-text">Unlinked</span>
@@ -105,7 +111,8 @@
105
111
  <div class="toggle-content">
106
112
  <!-- Custom GitHub SVG Icon -->
107
113
  <svg class="sso-icon" viewBox="0 0 24 24" fill="currentColor">
108
- <path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/>
114
+ <path
115
+ d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12" />
109
116
  </svg>
110
117
  <span class="provider-label">GitHub</span>
111
118
  <span class="toggle-state-text">Unlinked</span>
@@ -116,28 +123,30 @@
116
123
  <div id="sso-status-msg" class="status-msg hidden"></div>
117
124
  </div>
118
125
 
119
- <!-- Change Passphrase Card -->
120
- <div id="change-passphrase-card" class="card">
121
- <h3>Change Master Passphrase</h3>
122
- <p class="description">Rotate your local master passphrase. This will cryptographically evolve your primary identity and all registered user-owned delegate keystones to the new passphrase.</p>
126
+ <!-- Change Password Card -->
127
+ <div id="change-password-card" class="card">
128
+ <h3>Change Password</h3>
129
+ <p class="description">Rotate your local password that drives this identity. This will cryptographically
130
+ evolve your primary
131
+ identity and all registered user-owned delegate keystones to the new password.</p>
123
132
  <div class="form-row">
124
133
  <div class="form-group">
125
- <label for="input-current-passphrase">Current Passphrase</label>
126
- <input type="password" id="input-current-passphrase" placeholder="••••••••" class="form-input">
134
+ <label for="input-current-password">Current Password</label>
135
+ <input type="password" id="input-current-password" placeholder="••••••••" class="form-input">
127
136
  </div>
128
137
  <div class="form-group">
129
- <label for="input-new-passphrase">New Passphrase</label>
130
- <input type="password" id="input-new-passphrase" placeholder="••••••••" class="form-input">
138
+ <label for="input-new-password">New Password</label>
139
+ <input type="password" id="input-new-password" placeholder="••••••••" class="form-input">
131
140
  </div>
132
141
  <div class="form-group">
133
- <label for="input-confirm-passphrase">Confirm New Passphrase</label>
134
- <input type="password" id="input-confirm-passphrase" placeholder="••••••••" class="form-input">
142
+ <label for="input-confirm-password">Confirm New Password</label>
143
+ <input type="password" id="input-confirm-password" placeholder="••••••••" class="form-input">
135
144
  </div>
136
145
  </div>
137
146
  <div class="action-row">
138
- <button id="btn-change-passphrase" class="action-btn">Update Passphrase</button>
147
+ <button id="btn-change-password" class="action-btn">Update Password</button>
139
148
  </div>
140
- <div id="change-passphrase-status" class="status-msg hidden"></div>
149
+ <div id="change-password-status" class="status-msg hidden"></div>
141
150
  </div>
142
151
 
143
152
  <!-- Raw Keystone Timeline Explorer -->
@@ -151,4 +160,4 @@
151
160
  </div>
152
161
  </div>
153
162
  </div>
154
- </div>
163
+ </div>