@ibgib/web-gib 0.0.52 → 0.0.55

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 (150) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/AUTO-GENERATED-version.d.mts +1 -1
  3. package/dist/AUTO-GENERATED-version.mjs +1 -1
  4. package/dist/api/commands/chat/hello-world.mjs.map +1 -1
  5. package/dist/api/commands/command-constants.d.mts +4 -4
  6. package/dist/api/commands/command-constants.d.mts.map +1 -1
  7. package/dist/api/commands/command-service-v1.d.mts.map +1 -1
  8. package/dist/api/commands/command-service-v1.mjs.map +1 -1
  9. package/dist/api/commands/ibgib/get-ibgibs.d.mts.map +1 -1
  10. package/dist/api/commands/ibgib/get-ibgibs.mjs.map +1 -1
  11. package/dist/api/ibgib-api-bridge.d.mts +81 -0
  12. package/dist/api/ibgib-api-bridge.d.mts.map +1 -0
  13. package/dist/api/ibgib-api-bridge.mjs +259 -0
  14. package/dist/api/ibgib-api-bridge.mjs.map +1 -0
  15. package/dist/app-bootstrap/init-orchestration.d.mts +1 -1
  16. package/dist/app-bootstrap/init-orchestration.d.mts.map +1 -1
  17. package/dist/app-bootstrap/init-orchestration.mjs +17 -3
  18. package/dist/app-bootstrap/init-orchestration.mjs.map +1 -1
  19. package/dist/assets/fullscreen-dialog.html +18 -0
  20. package/dist/assumptions.respec.mjs.map +1 -1
  21. package/dist/common/settings/settings-constants.d.mts.map +1 -1
  22. package/dist/helpers.d.mts.map +1 -1
  23. package/dist/helpers.mjs.map +1 -1
  24. package/dist/helpers.web.d.mts.map +1 -1
  25. package/dist/helpers.web.mjs.map +1 -1
  26. package/dist/helpers.web.respec.mjs.map +1 -1
  27. package/dist/identity/keystone-sync-service.d.mts +37 -0
  28. package/dist/identity/keystone-sync-service.d.mts.map +1 -0
  29. package/dist/identity/keystone-sync-service.mjs +211 -0
  30. package/dist/identity/keystone-sync-service.mjs.map +1 -0
  31. package/dist/identity/sso/sso-custodian-service.d.mts.map +1 -1
  32. package/dist/identity/sso/sso-custodian-service.mjs.map +1 -1
  33. package/dist/identity/sso/sso-custodian-service.respec.mjs.map +1 -1
  34. package/dist/index.d.mts +17 -1
  35. package/dist/index.d.mts.map +1 -1
  36. package/dist/index.mjs +21 -26
  37. package/dist/index.mjs.map +1 -1
  38. package/dist/storage/storage-helpers.web.mjs.map +1 -1
  39. package/dist/ui/component/common-component-styles.css +270 -0
  40. package/dist/ui/component/ibgib-component-service.d.mts.map +1 -1
  41. package/dist/ui/component/ibgib-dynamic-component-bases.d.mts.map +1 -1
  42. package/dist/ui/component/ibgib-dynamic-component-bases.mjs.map +1 -1
  43. package/dist/ui/component/identity/add-device/add-device.css +133 -0
  44. package/dist/ui/component/identity/add-device/add-device.d.mts +49 -0
  45. package/dist/ui/component/identity/add-device/add-device.d.mts.map +1 -0
  46. package/dist/ui/component/identity/add-device/add-device.html +52 -0
  47. package/dist/ui/component/identity/add-device/add-device.mjs +321 -0
  48. package/dist/ui/component/identity/add-device/add-device.mjs.map +1 -0
  49. package/dist/ui/component/identity/identity-header/identity-header.css +317 -0
  50. package/dist/ui/component/identity/identity-header/identity-header.d.mts +85 -0
  51. package/dist/ui/component/identity/identity-header/identity-header.d.mts.map +1 -0
  52. package/dist/ui/component/identity/identity-header/identity-header.html +72 -0
  53. package/dist/ui/component/identity/identity-header/identity-header.mjs +546 -0
  54. package/dist/ui/component/identity/identity-header/identity-header.mjs.map +1 -0
  55. package/dist/ui/component/identity/identity-manager/identity-manager.css +178 -0
  56. package/dist/ui/component/identity/identity-manager/identity-manager.d.mts +76 -0
  57. package/dist/ui/component/identity/identity-manager/identity-manager.d.mts.map +1 -0
  58. package/dist/ui/component/identity/identity-manager/identity-manager.html +19 -0
  59. package/dist/ui/component/identity/identity-manager/identity-manager.mjs +591 -0
  60. package/dist/ui/component/identity/identity-manager/identity-manager.mjs.map +1 -0
  61. package/dist/ui/component/identity/index.d.mts +17 -0
  62. package/dist/ui/component/identity/index.d.mts.map +1 -0
  63. package/dist/ui/component/identity/index.mjs +34 -0
  64. package/dist/ui/component/identity/index.mjs.map +1 -0
  65. package/dist/ui/component/identity/keystone-creator/keystone-creator.css +97 -0
  66. package/dist/ui/component/identity/keystone-creator/keystone-creator.d.mts +58 -0
  67. package/dist/ui/component/identity/keystone-creator/keystone-creator.d.mts.map +1 -0
  68. package/dist/ui/component/identity/keystone-creator/keystone-creator.html +51 -0
  69. package/dist/ui/component/identity/keystone-creator/keystone-creator.mjs +410 -0
  70. package/dist/ui/component/identity/keystone-creator/keystone-creator.mjs.map +1 -0
  71. package/dist/ui/component/identity/keystone-details/keystone-details.css +621 -0
  72. package/dist/ui/component/identity/keystone-details/keystone-details.d.mts +98 -0
  73. package/dist/ui/component/identity/keystone-details/keystone-details.d.mts.map +1 -0
  74. package/dist/ui/component/identity/keystone-details/keystone-details.html +154 -0
  75. package/dist/ui/component/identity/keystone-details/keystone-details.mjs +1377 -0
  76. package/dist/ui/component/identity/keystone-details/keystone-details.mjs.map +1 -0
  77. package/dist/ui/component/identity/keystone-scrubber/keystone-scrubber.css +46 -0
  78. package/dist/ui/component/identity/keystone-scrubber/keystone-scrubber.d.mts +64 -0
  79. package/dist/ui/component/identity/keystone-scrubber/keystone-scrubber.d.mts.map +1 -0
  80. package/dist/ui/component/identity/keystone-scrubber/keystone-scrubber.html +15 -0
  81. package/dist/ui/component/identity/keystone-scrubber/keystone-scrubber.mjs +300 -0
  82. package/dist/ui/component/identity/keystone-scrubber/keystone-scrubber.mjs.map +1 -0
  83. package/dist/ui/component/identity/remove-device/remove-device.css +118 -0
  84. package/dist/ui/component/identity/remove-device/remove-device.d.mts +50 -0
  85. package/dist/ui/component/identity/remove-device/remove-device.d.mts.map +1 -0
  86. package/dist/ui/component/identity/remove-device/remove-device.html +31 -0
  87. package/dist/ui/component/identity/remove-device/remove-device.mjs +188 -0
  88. package/dist/ui/component/identity/remove-device/remove-device.mjs.map +1 -0
  89. package/dist/ui/ui-constants.d.mts +1 -0
  90. package/dist/ui/ui-constants.d.mts.map +1 -1
  91. package/dist/ui/ui-constants.mjs +1 -0
  92. package/dist/ui/ui-constants.mjs.map +1 -1
  93. package/dist/ui/ui-types.d.mts +7 -0
  94. package/dist/ui/ui-types.d.mts.map +1 -1
  95. package/dist/witness/agent/agent-constants.d.mts.map +1 -1
  96. package/dist/witness/agent/agent-helpers.mjs.map +1 -1
  97. package/dist/witness/agent/agent-one-file.d.mts.map +1 -1
  98. package/dist/witness/agent/agent-one-file.mjs.map +1 -1
  99. package/dist/witness/agent/agents-service-v1.d.mts.map +1 -1
  100. package/dist/witness/agent/agents-service-v1.mjs.map +1 -1
  101. package/dist/witness/agent/gemini/agent-witness-gemini-v1.d.mts.map +1 -1
  102. package/dist/witness/agent/gemini/gemini-agent-factory.d.mts.map +1 -1
  103. package/dist/witness/live-proxy-ibgib/live-proxy-ibgib-one-file.d.mts.map +1 -1
  104. package/dist/witness/live-proxy-ibgib/live-proxy-ibgib-one-file.mjs.map +1 -1
  105. package/dist/witness/space/metaspace/metaspace-webspace/metaspace-webspace-helper.mjs.map +1 -1
  106. package/dist/witness/space/metaspace/metaspace-webspace/metaspace-webspace.d.mts +4 -0
  107. package/dist/witness/space/metaspace/metaspace-webspace/metaspace-webspace.d.mts.map +1 -1
  108. package/dist/witness/space/metaspace/metaspace-webspace/metaspace-webspace.mjs +40 -1
  109. package/dist/witness/space/metaspace/metaspace-webspace/metaspace-webspace.mjs.map +1 -1
  110. package/dist/witness/space/web-filesystem-space/web-filesystem-space-types.d.mts.map +1 -1
  111. package/dist/witness/space/web-filesystem-space/web-filesystem-space-v1.d.mts.map +1 -1
  112. package/package.json +2 -2
  113. package/src/AUTO-GENERATED-version.mts +1 -1
  114. package/src/api/ibgib-api-bridge.mts +292 -0
  115. package/src/app-bootstrap/init-orchestration.mts +17 -6
  116. package/src/custom.d.ts +11 -0
  117. package/src/identity/keystone-sync-service.mts +257 -0
  118. package/src/index.mts +24 -25
  119. package/src/ui/component/README.md +82 -5
  120. package/src/ui/component/common-component-styles.css +270 -0
  121. package/src/ui/component/identity/add-device/add-device.css +133 -0
  122. package/src/ui/component/identity/add-device/add-device.html +52 -0
  123. package/src/ui/component/identity/add-device/add-device.mts +397 -0
  124. package/src/ui/component/identity/identity-header/IMPLEMENTATION.md +45 -0
  125. package/src/ui/component/identity/identity-header/identity-header.css +317 -0
  126. package/src/ui/component/identity/identity-header/identity-header.html +72 -0
  127. package/src/ui/component/identity/identity-header/identity-header.mts +651 -0
  128. package/src/ui/component/identity/identity-manager/IMPLEMENTATION.md +100 -0
  129. package/src/ui/component/identity/identity-manager/identity-manager.css +178 -0
  130. package/src/ui/component/identity/identity-manager/identity-manager.html +19 -0
  131. package/src/ui/component/identity/identity-manager/identity-manager.mts +675 -0
  132. package/src/ui/component/identity/index.mts +36 -0
  133. package/src/ui/component/identity/keystone-creator/keystone-creator.css +97 -0
  134. package/src/ui/component/identity/keystone-creator/keystone-creator.html +51 -0
  135. package/src/ui/component/identity/keystone-creator/keystone-creator.mts +497 -0
  136. package/src/ui/component/identity/keystone-details/keystone-details.css +621 -0
  137. package/src/ui/component/identity/keystone-details/keystone-details.html +154 -0
  138. package/src/ui/component/identity/keystone-details/keystone-details.mts +1506 -0
  139. package/src/ui/component/identity/keystone-scrubber/SCRUBBER_IMPLEMENTATION.md +33 -0
  140. package/src/ui/component/identity/keystone-scrubber/keystone-scrubber.css +46 -0
  141. package/src/ui/component/identity/keystone-scrubber/keystone-scrubber.html +15 -0
  142. package/src/ui/component/identity/keystone-scrubber/keystone-scrubber.mts +355 -0
  143. package/src/ui/component/identity/remove-device/remove-device.css +118 -0
  144. package/src/ui/component/identity/remove-device/remove-device.html +31 -0
  145. package/src/ui/component/identity/remove-device/remove-device.mts +247 -0
  146. package/src/ui/ui-constants.mts +1 -0
  147. package/src/ui/ui-types.mts +8 -0
  148. package/src/witness/space/metaspace/metaspace-webspace/metaspace-webspace.mts +42 -1
  149. package/tools/auto-generated-agent-skills/skills/ibgib-dependency-graph/SKILL.md +209 -0
  150. package/tools/auto-generated-agent-skills/skills/ibgib-implementation-plan/SKILL.md +102 -0
@@ -0,0 +1,321 @@
1
+ import thisCss from "./add-device.css";
2
+ import thisHtml from "./add-device.html";
3
+ import commonComponentStylesCss from "../../common-component-styles.css";
4
+ import { delay, extractErrorMsg } from "@ibgib/helper-gib/dist/helpers/utils-helper.mjs";
5
+ import { getIbGibAddr } from "@ibgib/ts-gib/dist/helper.mjs";
6
+ import { getGibInfo } from "@ibgib/ts-gib/dist/V1/transforms/transform-helper.mjs";
7
+ import { KeystoneService_V1 } from "@ibgib/core-gib/dist/keystone/keystone-service-v1.mjs";
8
+ import { KeystoneProfileBuilder } from "@ibgib/core-gib/dist/keystone/policy/keystone-profile-builder.mjs";
9
+ import { KEYSTONE_VERB_SYNC, KEYSTONE_VERB_CONNECT, KEYSTONE_USERNAME_REGEXP } from "@ibgib/core-gib/dist/keystone/keystone-constants.mjs";
10
+ import { deriveDelegateSecret } from "@ibgib/core-gib/dist/keystone/strategy/hash-reveal-v1/hash-reveal-v1.mjs";
11
+ import { getTimelinesGroupedByTjp, toDto } from "@ibgib/core-gib/dist/common/other/ibgib-helper.mjs";
12
+ import { updateSpecialIndex } from "@ibgib/core-gib/dist/timeline/timeline-api.mjs";
13
+ import { getApiBridge } from "../../../../api/ibgib-api-bridge.mjs";
14
+ import { getGlobalMetaspace_waitIfNeeded } from "../../../../helpers.mjs";
15
+ import { IbGibDynamicComponentMetaBase, IbGibFormInstanceBase, } from "../../ibgib-dynamic-component-bases.mjs";
16
+ import { getComponentCtorArg } from "../../../../app-bootstrap/init-orchestration.mjs";
17
+ import { EVENT_IBGIB_IDENTITY_REQUEST_CHANGE, EVENT_IBGIB_UI_MESSAGE } from "../../../ui-constants.mjs";
18
+ export const ADD_DEVICE_COMPONENT_NAME = 'ibgib-add-device';
19
+ /**
20
+ * Metadata for the Add Device / Pairing component.
21
+ */
22
+ export class AddDeviceComponentMeta extends IbGibDynamicComponentMetaBase {
23
+ lc = `[AddDeviceComponentMeta]`;
24
+ routeRegExp = new RegExp(`^${ADD_DEVICE_COMPONENT_NAME}$`);
25
+ componentName = ADD_DEVICE_COMPONENT_NAME;
26
+ constructor() {
27
+ super(getComponentCtorArg());
28
+ if (!customElements.get(this.componentName)) {
29
+ customElements.define(this.componentName, AddDeviceComponentInstance);
30
+ }
31
+ }
32
+ async createInstance({ path, ibGibAddr }) {
33
+ const component = document.createElement(this.componentName);
34
+ await component.initialize({
35
+ ibGibAddr,
36
+ meta: this,
37
+ html: thisHtml,
38
+ css: [commonComponentStylesCss, thisCss],
39
+ });
40
+ return component;
41
+ }
42
+ }
43
+ /**
44
+ * Concrete implementation of the Add Device / Pairing component.
45
+ */
46
+ export class AddDeviceComponentInstance extends IbGibFormInstanceBase {
47
+ lc = `[AddDeviceComponentInstance]`;
48
+ constructor() {
49
+ super();
50
+ }
51
+ async initialize(opts) {
52
+ await super.initialize(opts);
53
+ }
54
+ async created() {
55
+ this.elements = {};
56
+ this.elements.containerEl = this.shadowRoot.getElementById('container');
57
+ this.elements.titleEl = this.shadowRoot.getElementById('title');
58
+ this.elements.inputIdentifier = this.shadowRoot.getElementById('input-identifier');
59
+ this.elements.inputDeviceTag = (this.shadowRoot.getElementById('input-device-tag') || this.shadowRoot.getElementById('input-device-name'));
60
+ this.elements.inputPassphrase = this.shadowRoot.getElementById('input-passphrase');
61
+ this.elements.checkboxMakeActive = this.shadowRoot.getElementById('checkbox-make-active');
62
+ this.elements.btnAddDeviceEl = this.shadowRoot.getElementById('btn-add-device');
63
+ this.elements.statusArea = this.shadowRoot.getElementById('status-area');
64
+ this.elements.statusText = this.shadowRoot.getElementById('status-text');
65
+ this.elements.resultAreaEl = this.shadowRoot.getElementById('result-area');
66
+ this.elements.delegateAddrEl = this.shadowRoot.getElementById('delegate-addr');
67
+ this.elements.contentEl = this.elements.containerEl;
68
+ this.initHandlers();
69
+ await this.renderUI();
70
+ }
71
+ async disconnected() {
72
+ // cleanup if needed
73
+ }
74
+ initHandlers() {
75
+ this.elements.btnAddDeviceEl.addEventListener('click', () => this.handleAddDevice());
76
+ this.shadowRoot.getElementById('btn-switch-create-account')?.addEventListener('click', (e) => {
77
+ e.preventDefault();
78
+ window.dispatchEvent(new CustomEvent(EVENT_IBGIB_UI_MESSAGE, {
79
+ detail: { action: 'show-keystone-creator' },
80
+ bubbles: true,
81
+ composed: true
82
+ }));
83
+ });
84
+ this.elements.inputIdentifier.addEventListener('input', () => {
85
+ this.elements.inputIdentifier.classList.remove('invalid');
86
+ });
87
+ this.elements.inputDeviceTag.addEventListener('input', () => {
88
+ this.elements.inputDeviceTag.classList.remove('invalid');
89
+ });
90
+ this.elements.inputPassphrase.addEventListener('input', () => {
91
+ this.elements.inputPassphrase.classList.remove('invalid');
92
+ });
93
+ }
94
+ setButtonLoading(isLoading) {
95
+ if (this.elements?.btnAddDeviceEl) {
96
+ this.elements.btnAddDeviceEl.disabled = isLoading;
97
+ this.elements.btnAddDeviceEl.textContent = isLoading ? 'Pairing...' : 'Pair & Add Device';
98
+ }
99
+ }
100
+ /**
101
+ * Executes the Phase 1 Add-Device pairing orchestration flow.
102
+ */
103
+ async handleAddDevice() {
104
+ const lc = `${this.lc}[${this.handleAddDevice.name}]`;
105
+ try {
106
+ const humanEyeDelay = 500;
107
+ this.setStatus("Initializing device pairing...", "info");
108
+ const identifier = this.elements.inputIdentifier.value.trim();
109
+ this.elements.inputIdentifier.value = identifier;
110
+ if (!identifier) {
111
+ this.elements.inputIdentifier.classList.add('invalid');
112
+ this.setStatus("Please enter a registered username or email.", "error");
113
+ return;
114
+ }
115
+ const deviceTag = this.elements.inputDeviceTag.value.trim();
116
+ this.elements.inputDeviceTag.value = deviceTag;
117
+ if (!deviceTag || !KEYSTONE_USERNAME_REGEXP.test(deviceTag)) {
118
+ this.elements.inputDeviceTag.classList.add('invalid');
119
+ this.setStatus("Please enter a valid Device Tag / Name (e.g. 'work-laptop').", "error");
120
+ return;
121
+ }
122
+ const masterSecret = this.elements.inputPassphrase.value.trim();
123
+ this.elements.inputPassphrase.value = masterSecret;
124
+ if (!masterSecret) {
125
+ this.elements.inputPassphrase.classList.add('invalid');
126
+ this.setStatus("Please enter your master passphrase.", "error");
127
+ return;
128
+ }
129
+ this.setButtonLoading(true);
130
+ this.showBusy({
131
+ isBusy: true,
132
+ title: 'Locating Identity...',
133
+ msg: 'Searching for primary identity...',
134
+ animationEmoji: '🔍'
135
+ });
136
+ const metaspace = await getGlobalMetaspace_waitIfNeeded();
137
+ const space = await metaspace.getLocalUserSpace({});
138
+ if (!space) {
139
+ throw new Error("No default space found in metaspace.");
140
+ }
141
+ const keystoneService = new KeystoneService_V1();
142
+ // 1a. First attempt to locate primary identity keystone locally in space
143
+ const keystonesIndex = await metaspace.getSpecialIbGib({
144
+ type: "keystones",
145
+ space,
146
+ initialize: true,
147
+ });
148
+ const registeredAddrs = keystonesIndex?.rel8ns?.keystone ?? [];
149
+ let primaryKeystone;
150
+ for (const addr of registeredAddrs) {
151
+ const res = await metaspace.get({ addrs: [addr], space });
152
+ const found = res?.ibGibs?.[0];
153
+ if (found && found.data) {
154
+ const username = found.data.frameDetails?.username ?? '';
155
+ const emails = found.data.emails ?? found.data.frameDetails?.emails ?? [];
156
+ if (username.toLowerCase() === identifier.toLowerCase() || emails.some((e) => e.toLowerCase() === identifier.toLowerCase())) {
157
+ primaryKeystone = found;
158
+ break;
159
+ }
160
+ }
161
+ }
162
+ // 1b. If not found locally, query server identity index
163
+ if (!primaryKeystone) {
164
+ this.setStatus("Locating identity on server...", "info");
165
+ const resLookup = await getApiBridge().lookupPrimaryKeystone({ identifier });
166
+ if (resLookup.success && resLookup.primaryKeystoneIbGib) {
167
+ const fetchedKeystone = resLookup.primaryKeystoneIbGib;
168
+ const domainAddr = resLookup.tjpAddr || getIbGibAddr({ ibGib: fetchedKeystone });
169
+ // Fetch full domain graph from server so local space has all historical keystone frames
170
+ const resGraph = await getApiBridge().getKeystoneGraph(domainAddr);
171
+ if (resGraph.success && resGraph.graph) {
172
+ const graphIbGibs = Object.values(resGraph.graph);
173
+ await metaspace.put({ ibGibs: graphIbGibs, space });
174
+ // Order timelines by TJP and register each frame in ascending order
175
+ const timelinesMap = getTimelinesGroupedByTjp({ ibGibs: graphIbGibs });
176
+ for (const tjpKey of Object.keys(timelinesMap)) {
177
+ const timeline = timelinesMap[tjpKey];
178
+ for (const frame of timeline) {
179
+ await metaspace.registerNewIbGib({ ibGib: frame, space });
180
+ }
181
+ }
182
+ // Set primaryKeystone to the latest frame in the domain timeline
183
+ const domainTimeline = timelinesMap[domainAddr] || timelinesMap[Object.keys(timelinesMap)[0]];
184
+ if (domainTimeline && domainTimeline.length > 0) {
185
+ primaryKeystone = domainTimeline[domainTimeline.length - 1];
186
+ }
187
+ else {
188
+ primaryKeystone = fetchedKeystone;
189
+ }
190
+ }
191
+ else {
192
+ await metaspace.put({ ibGibs: [fetchedKeystone], space });
193
+ await metaspace.registerNewIbGib({ ibGib: fetchedKeystone, space });
194
+ primaryKeystone = fetchedKeystone;
195
+ }
196
+ }
197
+ }
198
+ if (!primaryKeystone) {
199
+ const msg = `No registered identity found for '${identifier}'. Please check your username/email or create a new account.`;
200
+ console.error(`${lc} ${msg}`);
201
+ this.setStatus(msg, "error");
202
+ this.showBusy({ isBusy: false });
203
+ this.setButtonLoading(false);
204
+ return;
205
+ }
206
+ const primaryUsername = primaryKeystone.data?.frameDetails?.username ?? 'user';
207
+ // 2. Generate local device delegate keystone
208
+ this.setStatus("Generating local device delegate...", "info");
209
+ this.showBusy({
210
+ isBusy: true,
211
+ title: 'Generating Keys...',
212
+ msg: 'Generating cryptographic delegate keys for this device...',
213
+ animationEmoji: '🔑'
214
+ });
215
+ const delegateSecret = await deriveDelegateSecret({ masterSecret });
216
+ const delegateBuilder = KeystoneProfileBuilder.buildKeystone('sync')
217
+ .withUsername(`${primaryUsername}-sync-${deviceTag}`)
218
+ .withDescription(`Sync Delegate for ${primaryUsername} on ${deviceTag}`)
219
+ .withDetails({
220
+ client: 'space-gib-web',
221
+ role: 'sync-delegate',
222
+ deviceTag
223
+ });
224
+ const delegateConfigs = await delegateBuilder.compileConfigs();
225
+ const delegateKeystone = await keystoneService.genesis({
226
+ masterSecret: delegateSecret,
227
+ configs: delegateConfigs,
228
+ metaspace,
229
+ space,
230
+ frameDetails: delegateBuilder.getFrameDetails()
231
+ });
232
+ const delegateAddr = getIbGibAddr({ ibGib: delegateKeystone });
233
+ console.log(`${lc} Local device delegate generated: ${delegateAddr}`);
234
+ await delay(humanEyeDelay);
235
+ // 3. Evolve parent primary keystone to register delegate
236
+ this.setStatus("Registering device on primary identity...", "info");
237
+ this.showBusy({
238
+ isBusy: true,
239
+ title: 'Registering Device...',
240
+ msg: 'Updating primary identity with new device delegate...',
241
+ animationEmoji: '📝'
242
+ });
243
+ const evolvedPrimaryKeystone = await keystoneService.registerDelegate({
244
+ parentKeystone: primaryKeystone,
245
+ delegateKeystone,
246
+ masterSecret,
247
+ metaspace,
248
+ space,
249
+ allowedVerbs: [KEYSTONE_VERB_SYNC, KEYSTONE_VERB_CONNECT],
250
+ deviceName: deviceTag,
251
+ });
252
+ const evolvedPrimaryAddr = getIbGibAddr({ ibGib: evolvedPrimaryKeystone });
253
+ console.log(`${lc} Primary identity evolved with delegate: ${evolvedPrimaryAddr}`);
254
+ await delay(humanEyeDelay);
255
+ // 4. Post evolved primary keystone + delegate to server
256
+ this.setStatus("Syncing device pairing to server...", "info");
257
+ this.showBusy({
258
+ isBusy: true,
259
+ title: 'Syncing to Server...',
260
+ msg: 'Posting device pairing to server sync node...',
261
+ animationEmoji: '🔄'
262
+ });
263
+ const primaryTjpAddr = getGibInfo({ ibGibAddr: getIbGibAddr({ ibGib: primaryKeystone }) }).tjpGib;
264
+ const domainAddr = primaryTjpAddr ? getIbGibAddr({ ibGib: primaryKeystone }) : getIbGibAddr({ ibGib: primaryKeystone });
265
+ const resEvolve = await getApiBridge().putEvolveKeystone({
266
+ domainAddr,
267
+ keystoneIbGib: evolvedPrimaryKeystone,
268
+ relatedKeystoneIbGibs: [delegateKeystone]
269
+ });
270
+ if (!resEvolve.success) {
271
+ const msg = `Server rejected device pairing: ${resEvolve.message}`;
272
+ console.error(`${lc} ${msg}`);
273
+ this.setStatus(msg, "error");
274
+ this.showBusy({ isBusy: false });
275
+ this.setButtonLoading(false);
276
+ return;
277
+ }
278
+ // 5. Update local keystones index
279
+ this.showBusy({
280
+ isBusy: true,
281
+ title: 'Updating Local Indexes...',
282
+ msg: 'Registering new device in local index...',
283
+ animationEmoji: '💾'
284
+ });
285
+ await updateSpecialIndex({
286
+ type: "keystones",
287
+ rel8nInfos: [
288
+ {
289
+ rel8nName: "keystone",
290
+ ibGibs: [
291
+ toDto({ ibGib: evolvedPrimaryKeystone }),
292
+ toDto({ ibGib: delegateKeystone })
293
+ ],
294
+ },
295
+ ],
296
+ metaspace,
297
+ space,
298
+ });
299
+ // 6. Set as active identity if checked
300
+ if (this.elements.checkboxMakeActive.checked) {
301
+ window.dispatchEvent(new CustomEvent(EVENT_IBGIB_IDENTITY_REQUEST_CHANGE, {
302
+ detail: { activeIdentityAddr: evolvedPrimaryAddr },
303
+ bubbles: true,
304
+ composed: true
305
+ }));
306
+ }
307
+ this.showBusy({ isBusy: false });
308
+ this.setButtonLoading(false);
309
+ this.elements.delegateAddrEl.innerText = delegateAddr;
310
+ this.elements.resultAreaEl.classList.remove('collapsed');
311
+ this.setStatus("Device successfully paired!", "success");
312
+ }
313
+ catch (error) {
314
+ console.error(`${lc} ${extractErrorMsg(error)}`, error);
315
+ this.setStatus(`Pairing failed: ${extractErrorMsg(error)}`, "error");
316
+ this.showBusy({ isBusy: false });
317
+ this.setButtonLoading(false);
318
+ }
319
+ }
320
+ }
321
+ //# sourceMappingURL=add-device.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-device.mjs","sourceRoot":"","sources":["../../../../../src/ui/component/identity/add-device/add-device.mts"],"names":[],"mappings":"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"}
@@ -0,0 +1,317 @@
1
+ :host {
2
+ display: inline-block;
3
+ vertical-align: middle;
4
+ position: relative;
5
+ }
6
+
7
+ .header-widget-container {
8
+ display: flex;
9
+ align-items: center;
10
+ justify-content: flex-end;
11
+ position: relative;
12
+ }
13
+
14
+ /* Top control pill button */
15
+ .identity-pill-btn {
16
+ display: flex;
17
+ align-items: center;
18
+ gap: 0.5rem;
19
+ padding: 0.4rem 0.8rem;
20
+ background: var(--tab-background-color-active, rgba(255, 255, 255, 0.08));
21
+ border: 1px solid var(--tab-border-color-active, rgba(80, 250, 123, 0.3));
22
+ border-radius: var(--radius-lg, 20px);
23
+ color: var(--clr-text-primary, #ffffff);
24
+ font-family: inherit;
25
+ font-size: 0.85rem;
26
+ cursor: pointer;
27
+ transition: all 0.2s ease-in-out;
28
+ outline: none;
29
+ }
30
+
31
+ .identity-pill-btn:hover, .identity-pill-btn.locked {
32
+ background: rgba(80, 250, 123, 0.15);
33
+ border-color: var(--clr-accent, #50fa7b);
34
+ box-shadow: 0 2px 8px rgba(80, 250, 123, 0.15);
35
+ }
36
+
37
+ .identity-pill-btn.unauth {
38
+ background: rgba(255, 204, 68, 0.05);
39
+ border: 1px dashed var(--clr-warn, #ffcc44);
40
+ color: var(--clr-warn, #ffcc44);
41
+ }
42
+
43
+ .identity-pill-btn.unauth:hover, .identity-pill-btn.unauth.locked {
44
+ background: rgba(255, 204, 68, 0.15);
45
+ border-color: var(--clr-warn, #ffcc44);
46
+ box-shadow: 0 0 10px rgba(255, 204, 68, 0.25);
47
+ }
48
+
49
+ .pill-content {
50
+ display: flex;
51
+ align-items: center;
52
+ gap: 0.5rem;
53
+ }
54
+
55
+ .avatar-circle {
56
+ display: flex;
57
+ align-items: center;
58
+ justify-content: center;
59
+ width: 24px;
60
+ height: 24px;
61
+ border-radius: 50%;
62
+ font-size: 0.85rem;
63
+ font-weight: 700;
64
+ text-transform: uppercase;
65
+ background: var(--clr-accent, #50fa7b);
66
+ color: #11111b;
67
+ flex-shrink: 0;
68
+ }
69
+
70
+ .username-text {
71
+ font-weight: 600;
72
+ max-width: 140px;
73
+ overflow: hidden;
74
+ text-overflow: ellipsis;
75
+ white-space: nowrap;
76
+ }
77
+
78
+ .unauth-text {
79
+ font-weight: 600;
80
+ }
81
+
82
+ .caret {
83
+ font-size: 0.75rem;
84
+ transition: transform 0.2s ease;
85
+ }
86
+
87
+ .identity-pill-btn.locked .caret {
88
+ transform: rotate(180deg);
89
+ }
90
+
91
+ /* Glassmorphic Dropdown Menu Popup */
92
+ .dropdown-menu {
93
+ position: absolute;
94
+ top: calc(100% + 6px);
95
+ right: 0;
96
+ min-width: 220px;
97
+ background: var(--clr-bg-surface, rgba(30, 30, 46, 0.95));
98
+ border: 1px solid var(--clr-border, rgba(255, 255, 255, 0.12));
99
+ border-radius: 12px;
100
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);
101
+ backdrop-filter: blur(12px);
102
+ -webkit-backdrop-filter: blur(12px);
103
+ padding: 0.5rem;
104
+ display: flex;
105
+ flex-direction: column;
106
+ z-index: 1000;
107
+ }
108
+
109
+ /* Invisible hover buffer to prevent drop gap */
110
+ .dropdown-menu::before {
111
+ content: '';
112
+ position: absolute;
113
+ top: -10px;
114
+ left: 0;
115
+ width: 100%;
116
+ height: 10px;
117
+ }
118
+
119
+ .dropdown-section {
120
+ display: flex;
121
+ flex-direction: column;
122
+ }
123
+
124
+ .dropdown-header-label {
125
+ font-size: 0.68rem;
126
+ font-weight: 700;
127
+ text-transform: uppercase;
128
+ letter-spacing: 0.05em;
129
+ color: var(--clr-text-muted, #9399b2);
130
+ padding: 0.3rem 0.6rem 0.2rem 0.6rem;
131
+ }
132
+
133
+ .dropdown-divider {
134
+ border: 0;
135
+ height: 1px;
136
+ background: var(--clr-border, rgba(255, 255, 255, 0.12));
137
+ margin: 0.4rem 0;
138
+ }
139
+
140
+ .dropdown-item {
141
+ display: flex;
142
+ align-items: center;
143
+ gap: 0.6rem;
144
+ width: 100%;
145
+ padding: 0.55rem 0.75rem;
146
+ border: none;
147
+ border-radius: 8px;
148
+ background: transparent;
149
+ color: var(--clr-text-primary, #cdd6f4);
150
+ font-size: 0.85rem;
151
+ font-weight: 500;
152
+ cursor: pointer;
153
+ text-align: left;
154
+ transition: background 0.15s ease, color 0.15s ease;
155
+ box-sizing: border-box;
156
+ }
157
+
158
+ .dropdown-item:hover:not(.disabled) {
159
+ background: var(--clr-accent-hover, rgba(137, 180, 250, 0.15));
160
+ color: var(--clr-accent, #89b4fa);
161
+ }
162
+
163
+ .dropdown-item.active-identity {
164
+ background: rgba(80, 250, 123, 0.12);
165
+ font-weight: 600;
166
+ color: var(--clr-accent, #50fa7b);
167
+ }
168
+
169
+ .dropdown-item.disabled {
170
+ opacity: 0.5;
171
+ cursor: not-allowed;
172
+ }
173
+
174
+ .dropdown-item .icon {
175
+ font-size: 1rem;
176
+ display: inline-flex;
177
+ align-items: center;
178
+ justify-content: center;
179
+ min-width: 1.2rem;
180
+ }
181
+
182
+ .identity-badge-active {
183
+ margin-left: auto;
184
+ font-size: 0.75rem;
185
+ color: var(--clr-accent, #50fa7b);
186
+ }
187
+
188
+ .update-item {
189
+ color: #ffb703;
190
+ background: rgba(255, 183, 3, 0.1);
191
+ font-weight: 600;
192
+ }
193
+
194
+ .update-item:hover {
195
+ background: rgba(255, 183, 3, 0.25) !important;
196
+ color: #ffc107 !important;
197
+ }
198
+
199
+ /* Glowing amber notification dot / badge */
200
+ .update-badge {
201
+ display: inline-flex;
202
+ align-items: center;
203
+ justify-content: center;
204
+ font-size: 0.75rem;
205
+ animation: pulse-amber 2s infinite ease-in-out;
206
+ }
207
+
208
+ @keyframes pulse-amber {
209
+ 0% {
210
+ transform: scale(1);
211
+ filter: drop-shadow(0 0 2px #ffb703);
212
+ }
213
+ 50% {
214
+ transform: scale(1.25);
215
+ filter: drop-shadow(0 0 8px #ffb703);
216
+ }
217
+ 100% {
218
+ transform: scale(1);
219
+ filter: drop-shadow(0 0 2px #ffb703);
220
+ }
221
+ }
222
+
223
+ /* Modal Sync Progress Overlay */
224
+ .modal-overlay {
225
+ position: fixed;
226
+ top: 0;
227
+ left: 0;
228
+ width: 100vw;
229
+ height: 100vh;
230
+ z-index: 10000;
231
+ background: rgba(0, 0, 0, 0.7);
232
+ backdrop-filter: blur(8px);
233
+ -webkit-backdrop-filter: blur(8px);
234
+ display: flex;
235
+ align-items: center;
236
+ justify-content: center;
237
+ }
238
+
239
+ .modal-card {
240
+ background: #1e1e2e;
241
+ border: 1px solid var(--clr-border, rgba(255, 255, 255, 0.15));
242
+ border-radius: 16px;
243
+ padding: 2rem;
244
+ max-width: 400px;
245
+ width: 90%;
246
+ box-shadow: 0 12px 32px rgba(0, 0, 0, 0.5);
247
+ display: flex;
248
+ flex-direction: column;
249
+ align-items: center;
250
+ text-align: center;
251
+ gap: 1rem;
252
+ box-sizing: border-box;
253
+ }
254
+
255
+ .modal-spinner {
256
+ font-size: 2.5rem;
257
+ animation: spin-pulse 2s infinite ease-in-out;
258
+ display: inline-block;
259
+ }
260
+
261
+ @keyframes spin-pulse {
262
+ 0% {
263
+ transform: rotate(0deg) scale(1);
264
+ }
265
+ 50% {
266
+ transform: rotate(180deg) scale(1.15);
267
+ }
268
+ 100% {
269
+ transform: rotate(360deg) scale(1);
270
+ }
271
+ }
272
+
273
+ .modal-title {
274
+ margin: 0;
275
+ font-size: 1.25rem;
276
+ font-weight: 700;
277
+ color: var(--clr-text-primary, #ffffff);
278
+ }
279
+
280
+ .modal-msg {
281
+ margin: 0;
282
+ font-size: 0.9rem;
283
+ color: var(--clr-text-muted, #a6adc8);
284
+ line-height: 1.4;
285
+ }
286
+
287
+ .modal-status {
288
+ background: rgba(255, 255, 255, 0.05);
289
+ border: 1px solid rgba(255, 255, 255, 0.1);
290
+ border-radius: 8px;
291
+ padding: 0.4rem 0.8rem;
292
+ font-family: monospace;
293
+ font-size: 0.85rem;
294
+ color: var(--clr-accent, #50fa7b);
295
+ }
296
+
297
+ .modal-close-btn {
298
+ padding: 0.5rem 1.5rem;
299
+ background: var(--clr-accent, #50fa7b);
300
+ color: #11111b;
301
+ border: none;
302
+ border-radius: 8px;
303
+ font-weight: 700;
304
+ font-size: 0.9rem;
305
+ cursor: pointer;
306
+ transition: background 0.2s ease, transform 0.1s ease;
307
+ }
308
+
309
+ .modal-close-btn:hover {
310
+ background: #62ff88;
311
+ transform: translateY(-1px);
312
+ }
313
+
314
+ .hidden {
315
+ display: none !important;
316
+ }
317
+