@oxy.so/core 4.5.0-oxy-one.1 → 4.6.0

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 (283) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/HttpService.js +63 -19
  3. package/dist/cjs/api/accounts.js +10 -3
  4. package/dist/cjs/api/agency.js +3 -1
  5. package/dist/cjs/api/apps.js +15 -4
  6. package/dist/cjs/api/assets.js +39 -11
  7. package/dist/cjs/api/auth.js +28 -8
  8. package/dist/cjs/api/billing.js +24 -7
  9. package/dist/cjs/api/civic.js +14 -4
  10. package/dist/cjs/api/follows.js +9 -2
  11. package/dist/cjs/api/identity.js +31 -9
  12. package/dist/cjs/api/nodes.js +3 -1
  13. package/dist/cjs/api/privacy.js +8 -2
  14. package/dist/cjs/api/session.js +15 -4
  15. package/dist/cjs/api/store.js +15 -5
  16. package/dist/cjs/api/topics.js +10 -3
  17. package/dist/cjs/api/users.js +16 -4
  18. package/dist/cjs/boot/sessionColdBoot.js +40 -13
  19. package/dist/cjs/constants/version.js +6 -6
  20. package/dist/cjs/crypto/identityMarker.js +3 -1
  21. package/dist/cjs/crypto/identityProof.js +6 -1
  22. package/dist/cjs/crypto/keyManager.js +87 -32
  23. package/dist/cjs/crypto/recoveryPhrase.js +2 -2
  24. package/dist/cjs/crypto/signatureService.js +3 -4
  25. package/dist/cjs/i18n/index.js +16 -3
  26. package/dist/cjs/i18n/locales/ar-SA.js +366 -366
  27. package/dist/cjs/i18n/locales/ca-ES.js +366 -366
  28. package/dist/cjs/i18n/locales/de-DE.js +366 -366
  29. package/dist/cjs/i18n/locales/en-US.js +1994 -1994
  30. package/dist/cjs/i18n/locales/es-ES.js +1994 -1994
  31. package/dist/cjs/i18n/locales/fr-FR.js +366 -366
  32. package/dist/cjs/i18n/locales/it-IT.js +366 -366
  33. package/dist/cjs/i18n/locales/ja-JP.js +366 -366
  34. package/dist/cjs/i18n/locales/ko-KR.js +366 -366
  35. package/dist/cjs/i18n/locales/pt-PT.js +366 -366
  36. package/dist/cjs/i18n/locales/zh-CN.js +366 -366
  37. package/dist/cjs/inference/OxyInferenceClient.js +12 -18
  38. package/dist/cjs/models/interfaces.js +11 -11
  39. package/dist/cjs/server/OxyServer.js +86 -28
  40. package/dist/cjs/server/agentAccount.js +6 -2
  41. package/dist/cjs/server/aliaMachineCredential.js +39 -14
  42. package/dist/cjs/server/auth.js +5 -4
  43. package/dist/cjs/server/capabilityTicket.js +5 -5
  44. package/dist/cjs/server/index.js +2 -1
  45. package/dist/cjs/server/liveCapabilityTicket.js +4 -1
  46. package/dist/cjs/server/middleware.js +61 -42
  47. package/dist/cjs/server/namespaces.js +28 -7
  48. package/dist/cjs/server/requesterAssertion.js +36 -30
  49. package/dist/cjs/server/serviceTokenLifetime.js +7 -4
  50. package/dist/cjs/server/traffic.js +53 -14
  51. package/dist/cjs/server/trafficNodeHttp.js +33 -8
  52. package/dist/cjs/server/workloadIdentity.client.js +4 -0
  53. package/dist/cjs/server/workloadIdentity.js +28 -1
  54. package/dist/cjs/session/SessionClient.js +54 -17
  55. package/dist/cjs/session/accountDelegationAccess.js +4 -6
  56. package/dist/cjs/session/accountDialogController.js +1 -1
  57. package/dist/cjs/session/authStateStore.js +18 -9
  58. package/dist/cjs/session/identityPin.js +6 -2
  59. package/dist/cjs/session/refresh.js +81 -23
  60. package/dist/cjs/session/sharedDeviceCredential.js +28 -15
  61. package/dist/cjs/shared/utils/errorUtils.js +1 -1
  62. package/dist/cjs/shared/utils/networkUtils.js +1 -1
  63. package/dist/cjs/shared/utils/themeUtils.js +1 -1
  64. package/dist/cjs/utils/accountCacheSweep.js +3 -1
  65. package/dist/cjs/utils/accountUtils.js +1 -3
  66. package/dist/cjs/utils/asyncUtils.js +1 -1
  67. package/dist/cjs/utils/authHelpers.js +2 -1
  68. package/dist/cjs/utils/avatarUtils.js +4 -2
  69. package/dist/cjs/utils/cache.js +1 -1
  70. package/dist/cjs/utils/cacheKey.js +3 -1
  71. package/dist/cjs/utils/deviceManager.js +4 -4
  72. package/dist/cjs/utils/errorUtils.js +6 -4
  73. package/dist/cjs/utils/languageUtils.js +404 -57
  74. package/dist/cjs/utils/profileLinks.js +1 -3
  75. package/dist/cjs/utils/requestUtils.js +7 -1
  76. package/dist/cjs/utils/userIdentity.js +1 -1
  77. package/dist/cjs/utils/validationUtils.js +5 -6
  78. package/dist/esm/HttpService.js +64 -20
  79. package/dist/esm/api/accounts.js +11 -4
  80. package/dist/esm/api/agency.js +3 -1
  81. package/dist/esm/api/apps.js +15 -4
  82. package/dist/esm/api/assets.js +39 -11
  83. package/dist/esm/api/auth.js +28 -8
  84. package/dist/esm/api/billing.js +25 -8
  85. package/dist/esm/api/civic.js +14 -4
  86. package/dist/esm/api/follows.js +9 -2
  87. package/dist/esm/api/identity.js +31 -9
  88. package/dist/esm/api/nodes.js +3 -1
  89. package/dist/esm/api/privacy.js +8 -2
  90. package/dist/esm/api/session.js +15 -4
  91. package/dist/esm/api/store.js +15 -5
  92. package/dist/esm/api/topics.js +10 -3
  93. package/dist/esm/api/users.js +16 -4
  94. package/dist/esm/boot/sessionColdBoot.js +41 -14
  95. package/dist/esm/constants/version.js +6 -6
  96. package/dist/esm/crypto/identityMarker.js +3 -1
  97. package/dist/esm/crypto/identityProof.js +6 -1
  98. package/dist/esm/crypto/internal.js +1 -1
  99. package/dist/esm/crypto/keyManager.js +87 -32
  100. package/dist/esm/crypto/recoveryPhrase.js +2 -2
  101. package/dist/esm/crypto/signatureService.js +3 -4
  102. package/dist/esm/i18n/index.js +16 -3
  103. package/dist/esm/i18n/locales/ar-SA.js +366 -366
  104. package/dist/esm/i18n/locales/ca-ES.js +366 -366
  105. package/dist/esm/i18n/locales/de-DE.js +366 -366
  106. package/dist/esm/i18n/locales/en-US.js +1994 -1994
  107. package/dist/esm/i18n/locales/es-ES.js +1994 -1994
  108. package/dist/esm/i18n/locales/fr-FR.js +366 -366
  109. package/dist/esm/i18n/locales/it-IT.js +366 -366
  110. package/dist/esm/i18n/locales/ja-JP.js +366 -366
  111. package/dist/esm/i18n/locales/ko-KR.js +366 -366
  112. package/dist/esm/i18n/locales/pt-PT.js +366 -366
  113. package/dist/esm/i18n/locales/zh-CN.js +366 -366
  114. package/dist/esm/index.js +1 -1
  115. package/dist/esm/inference/OxyInferenceClient.js +13 -19
  116. package/dist/esm/models/interfaces.js +11 -11
  117. package/dist/esm/server/OxyServer.js +87 -29
  118. package/dist/esm/server/agentAccount.js +6 -2
  119. package/dist/esm/server/aliaMachineCredential.js +39 -14
  120. package/dist/esm/server/auth.js +6 -5
  121. package/dist/esm/server/capabilityTicket.js +6 -6
  122. package/dist/esm/server/index.js +5 -5
  123. package/dist/esm/server/liveCapabilityTicket.js +6 -3
  124. package/dist/esm/server/middleware.js +62 -43
  125. package/dist/esm/server/namespaces.js +31 -10
  126. package/dist/esm/server/requesterAssertion.js +36 -30
  127. package/dist/esm/server/serviceTokenLifetime.js +7 -4
  128. package/dist/esm/server/traffic.js +55 -16
  129. package/dist/esm/server/trafficNodeHttp.js +34 -9
  130. package/dist/esm/server/userInvalidation.js +1 -1
  131. package/dist/esm/server/workloadIdentity.client.js +3 -0
  132. package/dist/esm/server/workloadIdentity.js +27 -1
  133. package/dist/esm/session/SessionClient.js +54 -17
  134. package/dist/esm/session/accountDelegationAccess.js +5 -7
  135. package/dist/esm/session/accountDialogController.js +1 -1
  136. package/dist/esm/session/authStateStore.js +18 -9
  137. package/dist/esm/session/identityPin.js +6 -2
  138. package/dist/esm/session/refresh.js +82 -24
  139. package/dist/esm/session/sharedDeviceCredential.js +28 -15
  140. package/dist/esm/shared/utils/errorUtils.js +1 -1
  141. package/dist/esm/shared/utils/networkUtils.js +1 -1
  142. package/dist/esm/shared/utils/themeUtils.js +1 -1
  143. package/dist/esm/utils/accountCacheSweep.js +3 -1
  144. package/dist/esm/utils/accountUtils.js +1 -3
  145. package/dist/esm/utils/asyncUtils.js +1 -1
  146. package/dist/esm/utils/authHelpers.js +2 -1
  147. package/dist/esm/utils/avatarUtils.js +4 -2
  148. package/dist/esm/utils/cache.js +1 -1
  149. package/dist/esm/utils/cacheKey.js +3 -1
  150. package/dist/esm/utils/deviceManager.js +4 -4
  151. package/dist/esm/utils/errorUtils.js +6 -4
  152. package/dist/esm/utils/languageUtils.js +404 -57
  153. package/dist/esm/utils/profileLinks.js +1 -3
  154. package/dist/esm/utils/requestUtils.js +7 -1
  155. package/dist/esm/utils/userIdentity.js +1 -1
  156. package/dist/esm/utils/validationUtils.js +5 -6
  157. package/dist/types/HttpService.d.ts +1 -1
  158. package/dist/types/api/accounts.d.ts +16 -3
  159. package/dist/types/api/apps.d.ts +4 -4
  160. package/dist/types/crypto/internal.d.ts +1 -1
  161. package/dist/types/index.d.ts +4 -4
  162. package/dist/types/models/interfaces.d.ts +9 -1
  163. package/dist/types/server/index.d.ts +6 -6
  164. package/dist/types/server/workloadIdentity.client.d.ts +5 -1
  165. package/dist/types/server/workloadIdentity.d.ts +26 -0
  166. package/dist/types/session/accountDelegationAccess.d.ts +1 -1
  167. package/dist/types/session/index.d.ts +1 -1
  168. package/dist/types/utils/userIdentity.d.ts +1 -1
  169. package/dist/types/utils/validationUtils.d.ts +4 -5
  170. package/package.json +3 -4
  171. package/src/HttpService.ts +183 -53
  172. package/src/OxyServices.errors.ts +7 -3
  173. package/src/OxyServices.ts +6 -2
  174. package/src/api/accounts.ts +96 -28
  175. package/src/api/agency.ts +24 -9
  176. package/src/api/appData.ts +12 -2
  177. package/src/api/apps.ts +81 -31
  178. package/src/api/assets.ts +113 -43
  179. package/src/api/auth.ts +145 -77
  180. package/src/api/billing.ts +112 -65
  181. package/src/api/civic.ts +61 -19
  182. package/src/api/contacts.ts +4 -1
  183. package/src/api/devices.ts +54 -21
  184. package/src/api/follows.ts +88 -31
  185. package/src/api/identity.ts +101 -33
  186. package/src/api/linkedAccounts.ts +26 -8
  187. package/src/api/nodes.ts +18 -6
  188. package/src/api/notifications.ts +26 -6
  189. package/src/api/privacy.ts +42 -8
  190. package/src/api/reputation.ts +18 -7
  191. package/src/api/session.ts +23 -5
  192. package/src/api/store.ts +81 -31
  193. package/src/api/topics.ts +18 -6
  194. package/src/api/users.ts +98 -35
  195. package/src/boot/sessionColdBoot.ts +60 -19
  196. package/src/civic/payloads.ts +1 -4
  197. package/src/client/context.ts +6 -1
  198. package/src/constants/version.ts +7 -6
  199. package/src/crypto/aead.ts +1 -5
  200. package/src/crypto/ecdh.ts +1 -4
  201. package/src/crypto/identityDerivations.ts +5 -1
  202. package/src/crypto/identityMarker.ts +3 -1
  203. package/src/crypto/identityProof.ts +6 -1
  204. package/src/crypto/index.ts +11 -11
  205. package/src/crypto/internal.ts +6 -1
  206. package/src/crypto/keyManager.ts +348 -98
  207. package/src/crypto/recoveryPhrase.ts +14 -9
  208. package/src/crypto/registrationPow.ts +1 -1
  209. package/src/crypto/signatureService.ts +14 -6
  210. package/src/i18n/accountCategoryLabels.ts +1 -4
  211. package/src/i18n/accountRoleLabels.ts +1 -4
  212. package/src/i18n/index.ts +25 -7
  213. package/src/i18n/locales/ar-SA.ts +375 -366
  214. package/src/i18n/locales/ca-ES.ts +382 -366
  215. package/src/i18n/locales/de-DE.ts +387 -366
  216. package/src/i18n/locales/en-US.ts +2034 -1994
  217. package/src/i18n/locales/es-ES.ts +2043 -1994
  218. package/src/i18n/locales/fr-FR.ts +387 -366
  219. package/src/i18n/locales/it-IT.ts +380 -366
  220. package/src/i18n/locales/ja-JP.ts +380 -366
  221. package/src/i18n/locales/ko-KR.ts +377 -366
  222. package/src/i18n/locales/pt-PT.ts +383 -366
  223. package/src/i18n/locales/zh-CN.ts +373 -366
  224. package/src/i18n/trustTierLabels.ts +1 -4
  225. package/src/index.ts +371 -349
  226. package/src/inference/OxyInferenceClient.ts +784 -780
  227. package/src/models/interfaces.ts +39 -27
  228. package/src/server/OxyServer.ts +227 -68
  229. package/src/server/agentAccount.ts +8 -2
  230. package/src/server/aliaMachineCredential.ts +57 -16
  231. package/src/server/auth.ts +9 -5
  232. package/src/server/capabilityTicket.ts +30 -21
  233. package/src/server/index.ts +29 -6
  234. package/src/server/liveCapabilityTicket.ts +31 -9
  235. package/src/server/middleware.ts +212 -121
  236. package/src/server/namespaces.ts +247 -94
  237. package/src/server/rateLimit.ts +2 -4
  238. package/src/server/requesterAssertion.ts +93 -54
  239. package/src/server/serviceTokenLifetime.ts +9 -4
  240. package/src/server/traffic.ts +117 -23
  241. package/src/server/trafficNodeHttp.ts +61 -14
  242. package/src/server/userInvalidation.ts +1 -4
  243. package/src/server/workloadIdentity.client.ts +12 -1
  244. package/src/server/workloadIdentity.ts +52 -5
  245. package/src/session/SessionClient.ts +170 -49
  246. package/src/session/accountDelegationAccess.ts +24 -31
  247. package/src/session/accountDialogController.ts +59 -14
  248. package/src/session/accountSwitchTargets.ts +10 -15
  249. package/src/session/authStateStore.ts +121 -81
  250. package/src/session/deviceDirectory.ts +1 -3
  251. package/src/session/identityPin.ts +10 -11
  252. package/src/session/identitySession.ts +3 -1
  253. package/src/session/index.ts +87 -82
  254. package/src/session/refresh.ts +138 -44
  255. package/src/session/sessionClientHost.ts +1 -3
  256. package/src/session/sharedDeviceCredential.ts +35 -14
  257. package/src/session/socketLoader.ts +9 -2
  258. package/src/shared/utils/errorUtils.ts +5 -2
  259. package/src/shared/utils/networkUtils.ts +5 -8
  260. package/src/shared/utils/themeUtils.ts +2 -6
  261. package/src/types/buffer.d.ts +66 -21
  262. package/src/types/expo-secure-store.d.ts +5 -1
  263. package/src/utils/accountCacheSweep.ts +4 -5
  264. package/src/utils/accountUtils.ts +107 -108
  265. package/src/utils/apiUtils.ts +3 -3
  266. package/src/utils/asyncUtils.ts +2 -2
  267. package/src/utils/authHelpers.ts +10 -5
  268. package/src/utils/avatarUtils.ts +11 -6
  269. package/src/utils/cache.ts +9 -10
  270. package/src/utils/cacheKey.ts +5 -1
  271. package/src/utils/coldBoot.ts +1 -3
  272. package/src/utils/commonsDelivery.ts +1 -4
  273. package/src/utils/deviceManager.ts +15 -14
  274. package/src/utils/errorUtils.ts +68 -86
  275. package/src/utils/languageUtils.ts +407 -58
  276. package/src/utils/oauthPkce.ts +1 -4
  277. package/src/utils/platform.ts +0 -1
  278. package/src/utils/profileLinks.ts +2 -5
  279. package/src/utils/requestUtils.ts +18 -14
  280. package/src/utils/sessionUtils.ts +34 -33
  281. package/src/utils/userHandle.ts +3 -1
  282. package/src/utils/userIdentity.ts +1 -1
  283. package/src/utils/validationUtils.ts +11 -9
@@ -227,7 +227,7 @@ async function initExpoCrypto() {
227
227
  */
228
228
  function uint8ArrayToHex(bytes) {
229
229
  return Array.from(bytes)
230
- .map(b => b.toString(16).padStart(2, '0'))
230
+ .map((b) => b.toString(16).padStart(2, '0'))
231
231
  .join('');
232
232
  }
233
233
  /** Decode a lowercase hex string to bytes. Inverse of {@link uint8ArrayToHex}. */
@@ -337,7 +337,9 @@ class KeyManager {
337
337
  }
338
338
  /** Build private-key write options (device-only accessibility) for a given keychain service. */
339
339
  static _privateWriteOpts(store, service) {
340
- const opts = { keychainAccessible: store.WHEN_UNLOCKED_THIS_DEVICE_ONLY };
340
+ const opts = {
341
+ keychainAccessible: store.WHEN_UNLOCKED_THIS_DEVICE_ONLY,
342
+ };
341
343
  if (service) {
342
344
  opts.keychainService = service;
343
345
  }
@@ -649,7 +651,9 @@ class KeyManager {
649
651
  }
650
652
  try {
651
653
  if (!(await signer.write(privateKey, publicKey))) {
652
- logger_1.logger.warn(`The identity signer store (${signer.name}) did not confirm the write`, { component: 'KeyManager' });
654
+ logger_1.logger.warn(`The identity signer store (${signer.name}) did not confirm the write`, {
655
+ component: 'KeyManager',
656
+ });
653
657
  }
654
658
  }
655
659
  catch (error) {
@@ -865,10 +869,14 @@ class KeyManager {
865
869
  return {
866
870
  primaryPublicKey,
867
871
  sharedPublicKey,
868
- activePublicKey: (0, platform_1.isAndroid)() ? (primaryPublicKey ?? sharedPublicKey) : (sharedPublicKey ?? primaryPublicKey),
872
+ activePublicKey: (0, platform_1.isAndroid)()
873
+ ? (primaryPublicKey ?? sharedPublicKey)
874
+ : (sharedPublicKey ?? primaryPublicKey),
869
875
  // Only a real disagreement is out of sync. A device with just one slot
870
876
  // populated has nothing to contradict.
871
- inSync: primaryPublicKey === null || sharedPublicKey === null || primaryPublicKey === sharedPublicKey,
877
+ inSync: primaryPublicKey === null ||
878
+ sharedPublicKey === null ||
879
+ primaryPublicKey === sharedPublicKey,
872
880
  };
873
881
  }
874
882
  /**
@@ -1121,7 +1129,9 @@ class KeyManager {
1121
1129
  priorPublic = await store.getItemAsync(layout.primaryPublicKeyName, primaryReadOpts);
1122
1130
  }
1123
1131
  catch (error) {
1124
- logger_1.logger.error('Failed to read existing primary before persist', error, { component: 'KeyManager' });
1132
+ logger_1.logger.error('Failed to read existing primary before persist', error, {
1133
+ component: 'KeyManager',
1134
+ });
1125
1135
  throw new IdentityPersistError('Could not read existing identity before writing a new one; refusing to overwrite blind.', error);
1126
1136
  }
1127
1137
  // If we are replacing a DIFFERENT, currently-healthy identity, make sure
@@ -1152,7 +1162,9 @@ class KeyManager {
1152
1162
  await store.setItemAsync(layout.backupTimestampName, Date.now().toString(), backupPubWriteOpts);
1153
1163
  }
1154
1164
  catch (error) {
1155
- logger_1.logger.error('Failed to back up existing identity before overwrite', error, { component: 'KeyManager' });
1165
+ logger_1.logger.error('Failed to back up existing identity before overwrite', error, {
1166
+ component: 'KeyManager',
1167
+ });
1156
1168
  throw new IdentityPersistError('Failed to back up existing identity before overwrite', error);
1157
1169
  }
1158
1170
  }
@@ -1166,7 +1178,9 @@ class KeyManager {
1166
1178
  await store.setItemAsync(layout.primaryPrivateKeyName, canonicalPrivate, primaryPrivWriteOpts);
1167
1179
  }
1168
1180
  catch (error) {
1169
- logger_1.logger.error('Failed to write primary identity to secure store', error, { component: 'KeyManager' });
1181
+ logger_1.logger.error('Failed to write primary identity to secure store', error, {
1182
+ component: 'KeyManager',
1183
+ });
1170
1184
  await KeyManager._rollbackPrimary(store, layout, priorPrivate, priorPublic);
1171
1185
  throw new IdentityPersistError('Failed to write identity to secure store', error);
1172
1186
  }
@@ -1190,7 +1204,9 @@ class KeyManager {
1190
1204
  // trigger a spurious mismatch.
1191
1205
  if (readBackPrivate?.toLowerCase() !== canonicalPrivate ||
1192
1206
  readBackPublic?.toLowerCase() !== canonicalPublic) {
1193
- logger_1.logger.error('Identity round-trip mismatch after write', undefined, { component: 'KeyManager' });
1207
+ logger_1.logger.error('Identity round-trip mismatch after write', undefined, {
1208
+ component: 'KeyManager',
1209
+ });
1194
1210
  await KeyManager._rollbackPrimary(store, layout, priorPrivate, priorPublic);
1195
1211
  throw new IdentityPersistError('Identity write was not persisted correctly (round-trip mismatch).');
1196
1212
  }
@@ -1233,7 +1249,9 @@ class KeyManager {
1233
1249
  priorBackupTimestamp = await store.getItemAsync(layout.backupTimestampName, backupReadOpts);
1234
1250
  }
1235
1251
  catch (error) {
1236
- logger_1.logger.error('Failed to snapshot identity backup before refresh', error, { component: 'KeyManager' });
1252
+ logger_1.logger.error('Failed to snapshot identity backup before refresh', error, {
1253
+ component: 'KeyManager',
1254
+ });
1237
1255
  await KeyManager._rollbackPrimary(store, layout, priorPrivate, priorPublic);
1238
1256
  throw new IdentityPersistError('Failed to snapshot identity backup before refresh', error);
1239
1257
  }
@@ -1243,7 +1261,9 @@ class KeyManager {
1243
1261
  await store.setItemAsync(layout.backupTimestampName, Date.now().toString(), backupPubWriteOpts);
1244
1262
  }
1245
1263
  catch (error) {
1246
- logger_1.logger.error('Failed to refresh identity backup after primary write', error, { component: 'KeyManager' });
1264
+ logger_1.logger.error('Failed to refresh identity backup after primary write', error, {
1265
+ component: 'KeyManager',
1266
+ });
1247
1267
  await KeyManager._rollbackBackup(store, layout, priorBackupPrivate, priorBackupPublic, priorBackupTimestamp);
1248
1268
  await KeyManager._rollbackPrimary(store, layout, priorPrivate, priorPublic);
1249
1269
  throw new IdentityPersistError('Failed to refresh identity backup after primary write', error);
@@ -1293,7 +1313,9 @@ class KeyManager {
1293
1313
  }
1294
1314
  const sameIdentity = existing?.publicKey === publicKey;
1295
1315
  const keptMnemonic = mnemonic ?? (sameIdentity ? existing?.mnemonic : undefined);
1296
- if (sameIdentity && existing?.privateKey === privateKey && existing?.mnemonic === keptMnemonic) {
1316
+ if (sameIdentity &&
1317
+ existing?.privateKey === privateKey &&
1318
+ existing?.mnemonic === keptMnemonic) {
1297
1319
  return true; // Already current; do not churn the store.
1298
1320
  }
1299
1321
  await store.write((0, deviceBackup_1.serializeDeviceBackup)({
@@ -1340,7 +1362,9 @@ class KeyManager {
1340
1362
  static async _readHealthyPrimary() {
1341
1363
  try {
1342
1364
  const direct = await KeyManager._readPrimaryDirect();
1343
- if (KeyManager._isHealthyPair(direct.privateKey, direct.publicKey) && direct.privateKey && direct.publicKey) {
1365
+ if (KeyManager._isHealthyPair(direct.privateKey, direct.publicKey) &&
1366
+ direct.privateKey &&
1367
+ direct.publicKey) {
1344
1368
  return {
1345
1369
  privateKey: KeyManager.canonicalPrivateKey(direct.privateKey),
1346
1370
  publicKey: direct.publicKey.toLowerCase(),
@@ -1437,7 +1461,9 @@ class KeyManager {
1437
1461
  try {
1438
1462
  await store.deleteItemAsync(layout.backupPrivateKeyName, backupReadOpts);
1439
1463
  }
1440
- catch { /* best effort */ }
1464
+ catch {
1465
+ /* best effort */
1466
+ }
1441
1467
  }
1442
1468
  if (priorBackupPublic) {
1443
1469
  await store.setItemAsync(layout.backupPublicKeyName, priorBackupPublic, backupPubWriteOpts);
@@ -1446,7 +1472,9 @@ class KeyManager {
1446
1472
  try {
1447
1473
  await store.deleteItemAsync(layout.backupPublicKeyName, backupReadOpts);
1448
1474
  }
1449
- catch { /* best effort */ }
1475
+ catch {
1476
+ /* best effort */
1477
+ }
1450
1478
  }
1451
1479
  if (priorBackupTimestamp) {
1452
1480
  await store.setItemAsync(layout.backupTimestampName, priorBackupTimestamp, backupPubWriteOpts);
@@ -1455,11 +1483,15 @@ class KeyManager {
1455
1483
  try {
1456
1484
  await store.deleteItemAsync(layout.backupTimestampName, backupReadOpts);
1457
1485
  }
1458
- catch { /* best effort */ }
1486
+ catch {
1487
+ /* best effort */
1488
+ }
1459
1489
  }
1460
1490
  }
1461
1491
  catch (rollbackError) {
1462
- logger_1.logger.error('Failed to roll back identity backup after a failed refresh', rollbackError, { component: 'KeyManager' });
1492
+ logger_1.logger.error('Failed to roll back identity backup after a failed refresh', rollbackError, {
1493
+ component: 'KeyManager',
1494
+ });
1463
1495
  }
1464
1496
  }
1465
1497
  /**
@@ -1487,15 +1519,21 @@ class KeyManager {
1487
1519
  try {
1488
1520
  await store.deleteItemAsync(layout.primaryPublicKeyName, primaryReadOpts);
1489
1521
  }
1490
- catch { /* best effort */ }
1522
+ catch {
1523
+ /* best effort */
1524
+ }
1491
1525
  try {
1492
1526
  await store.deleteItemAsync(layout.primaryPrivateKeyName, primaryReadOpts);
1493
1527
  }
1494
- catch { /* best effort */ }
1528
+ catch {
1529
+ /* best effort */
1530
+ }
1495
1531
  }
1496
1532
  }
1497
1533
  catch (rollbackError) {
1498
- logger_1.logger.error('Failed to roll back primary identity after a failed write', rollbackError, { component: 'KeyManager' });
1534
+ logger_1.logger.error('Failed to roll back primary identity after a failed write', rollbackError, {
1535
+ component: 'KeyManager',
1536
+ });
1499
1537
  }
1500
1538
  finally {
1501
1539
  // Whatever happened, the cached verdict is no longer trustworthy.
@@ -1801,7 +1839,9 @@ class KeyManager {
1801
1839
  // fetch before the device is unlocked). Do NOT cache; throw a TYPED error
1802
1840
  // so callers distinguish "temporarily unavailable" from "genuinely absent"
1803
1841
  // instead of silently treating a locked keystore as a blank device.
1804
- logger_1.logger.error('Failed to read identity from secure storage', error, { component: 'KeyManager' });
1842
+ logger_1.logger.error('Failed to read identity from secure storage', error, {
1843
+ component: 'KeyManager',
1844
+ });
1805
1845
  throw new IdentityUnavailableError('Failed to read identity from secure storage.', error);
1806
1846
  }
1807
1847
  // Storage succeeded. Now classify the result. From here onward, any
@@ -1828,7 +1868,9 @@ class KeyManager {
1828
1868
  }
1829
1869
  }
1830
1870
  else {
1831
- logger_1.logger.warn('KeyManager.hasIdentity: stored key material is malformed', { component: 'KeyManager' });
1871
+ logger_1.logger.warn('KeyManager.hasIdentity: stored key material is malformed', {
1872
+ component: 'KeyManager',
1873
+ });
1832
1874
  }
1833
1875
  }
1834
1876
  // Cache result. Storage succeeded, so this verdict is stable:
@@ -1953,7 +1995,9 @@ class KeyManager {
1953
1995
  try {
1954
1996
  const backupSuccess = await KeyManager.backupIdentity();
1955
1997
  if (!backupSuccess && (0, logger_1.isDev)()) {
1956
- logger_1.logger.warn('Failed to backup identity before deletion - proceeding anyway', { component: 'KeyManager' });
1998
+ logger_1.logger.warn('Failed to backup identity before deletion - proceeding anyway', {
1999
+ component: 'KeyManager',
2000
+ });
1957
2001
  }
1958
2002
  }
1959
2003
  catch (backupError) {
@@ -2081,7 +2125,9 @@ class KeyManager {
2081
2125
  const probeHash = '0'.repeat(64);
2082
2126
  const signature = (0, secp256k1_1.signSecp256k1Digest)(canonicalPrivateKey, probeHash);
2083
2127
  if (!(0, secp256k1_1.verifySecp256k1Digest)(publicKey, probeHash, signature)) {
2084
- logger_1.logger.error('Identity sign/verify probe failed during integrity check', undefined, { component: 'KeyManager' });
2128
+ logger_1.logger.error('Identity sign/verify probe failed during integrity check', undefined, {
2129
+ component: 'KeyManager',
2130
+ });
2085
2131
  return false;
2086
2132
  }
2087
2133
  return true;
@@ -2155,8 +2201,11 @@ class KeyManager {
2155
2201
  if (!backupPrivateKey || !backupPublicKey) {
2156
2202
  return false; // No backup available
2157
2203
  }
2158
- if (!KeyManager.isValidPrivateKey(backupPrivateKey) || !KeyManager.isValidPublicKey(backupPublicKey)) {
2159
- logger_1.logger.warn('Backup identity is malformed; refusing to restore', { component: 'KeyManager' });
2204
+ if (!KeyManager.isValidPrivateKey(backupPrivateKey) ||
2205
+ !KeyManager.isValidPublicKey(backupPublicKey)) {
2206
+ logger_1.logger.warn('Backup identity is malformed; refusing to restore', {
2207
+ component: 'KeyManager',
2208
+ });
2160
2209
  return false;
2161
2210
  }
2162
2211
  // Verify backup keys derive consistently. Hex is case-insensitive so
@@ -2164,7 +2213,9 @@ class KeyManager {
2164
2213
  // be considered valid.
2165
2214
  const derivedPublicKey = KeyManager.derivePublicKey(backupPrivateKey);
2166
2215
  if (derivedPublicKey.toLowerCase() !== backupPublicKey.toLowerCase()) {
2167
- logger_1.logger.warn('Backup public key does not match derived; refusing to restore', { component: 'KeyManager' });
2216
+ logger_1.logger.warn('Backup public key does not match derived; refusing to restore', {
2217
+ component: 'KeyManager',
2218
+ });
2168
2219
  return false;
2169
2220
  }
2170
2221
  // Guard 3: if ANY primary key material is still present and identifies a
@@ -2173,8 +2224,7 @@ class KeyManager {
2173
2224
  // the user. We check the private key too (not just the public): a
2174
2225
  // present private key that derives to a non-backup public means a real,
2175
2226
  // different identity is sitting in the primary slot.
2176
- if (primaryPublic &&
2177
- primaryPublic.toLowerCase() !== backupPublicKey.toLowerCase()) {
2227
+ if (primaryPublic && primaryPublic.toLowerCase() !== backupPublicKey.toLowerCase()) {
2178
2228
  logger_1.logger.error('Primary public key is present, corrupt-or-mismatched, AND differs from the backup. Refusing to restore to avoid switching accounts.', undefined, { component: 'KeyManager' });
2179
2229
  return false;
2180
2230
  }
@@ -2190,7 +2240,9 @@ class KeyManager {
2190
2240
  await KeyManager._persistIdentityAtomic(backupPrivateKey, backupPublicKey, 'restore');
2191
2241
  }
2192
2242
  catch (error) {
2193
- logger_1.logger.error('Failed to persist identity restored from backup', error, { component: 'KeyManager' });
2243
+ logger_1.logger.error('Failed to persist identity restored from backup', error, {
2244
+ component: 'KeyManager',
2245
+ });
2194
2246
  return false;
2195
2247
  }
2196
2248
  await store.setItemAsync(layout.backupTimestampName, Date.now().toString(), backupReadOpts);
@@ -2328,7 +2380,8 @@ class KeyManager {
2328
2380
  if (!(await KeyManager._commitRecovery(record.privateKey, record.publicKey))) {
2329
2381
  return false;
2330
2382
  }
2331
- if (record.mnemonic && (await KeyManager._phraseDerivesPublicKey(record.mnemonic, record.publicKey))) {
2383
+ if (record.mnemonic &&
2384
+ (await KeyManager._phraseDerivesPublicKey(record.mnemonic, record.publicKey))) {
2332
2385
  try {
2333
2386
  await KeyManager.storeRecoveryMnemonic(record.mnemonic);
2334
2387
  }
@@ -2396,7 +2449,9 @@ class KeyManager {
2396
2449
  return true;
2397
2450
  }
2398
2451
  catch (error) {
2399
- logger_1.logger.error('Recovery: failed to persist recovered identity', error, { component: 'KeyManager' });
2452
+ logger_1.logger.error('Recovery: failed to persist recovered identity', error, {
2453
+ component: 'KeyManager',
2454
+ });
2400
2455
  return false;
2401
2456
  }
2402
2457
  }
@@ -27,7 +27,7 @@ function toHex(data) {
27
27
  // Convert to array of numbers if needed
28
28
  const bytes = data instanceof Uint8Array ? data : new Uint8Array(data);
29
29
  return Array.from(bytes)
30
- .map(b => b.toString(16).padStart(2, '0'))
30
+ .map((b) => b.toString(16).padStart(2, '0'))
31
31
  .join('');
32
32
  }
33
33
  /** UTF-8 encode an ASCII label to bytes (for HKDF salt/info). */
@@ -236,7 +236,7 @@ class RecoveryPhraseService {
236
236
  * Convert a word array to a phrase string
237
237
  */
238
238
  static wordsToPhrase(words) {
239
- return words.map(w => w.toLowerCase().trim()).join(' ');
239
+ return words.map((w) => w.toLowerCase().trim()).join(' ');
240
240
  }
241
241
  }
242
242
  exports.RecoveryPhraseService = RecoveryPhraseService;
@@ -42,7 +42,7 @@ class SignatureService {
42
42
  const bytes = new Uint8Array(32);
43
43
  globalThis.crypto.getRandomValues(bytes);
44
44
  return Array.from(bytes)
45
- .map(b => b.toString(16).padStart(2, '0'))
45
+ .map((b) => b.toString(16).padStart(2, '0'))
46
46
  .join('');
47
47
  }
48
48
  /**
@@ -84,8 +84,7 @@ class SignatureService {
84
84
  * Verify a signed message object
85
85
  * Checks both signature validity and timestamp freshness
86
86
  */
87
- static async verifySignedMessage(signedMessage, maxAgeMs = 5 * 60 * 1000 // 5 minutes default
88
- ) {
87
+ static async verifySignedMessage(signedMessage, maxAgeMs = 5 * 60 * 1000) {
89
88
  const { message, signature, publicKey, timestamp } = signedMessage;
90
89
  // Check timestamp freshness
91
90
  const now = Date.now();
@@ -188,7 +187,7 @@ class SignatureService {
188
187
  const timestamp = Date.now();
189
188
  // Create canonical string representation
190
189
  const sortedKeys = Object.keys(data).sort();
191
- const canonicalParts = sortedKeys.map(key => `${key}:${JSON.stringify(data[key])}`);
190
+ const canonicalParts = sortedKeys.map((key) => `${key}:${JSON.stringify(data[key])}`);
192
191
  const canonicalString = canonicalParts.join('|');
193
192
  const message = `request:${publicKey}:${timestamp}:${canonicalString}`;
194
193
  const signature = await SignatureService.sign(message);
@@ -64,8 +64,17 @@ const LOADERS = {
64
64
  };
65
65
  /** Base subtag → the dictionary that serves it. */
66
66
  const ALIASES = {
67
- en: 'en-US', es: 'es-ES', ca: 'ca-ES', fr: 'fr-FR', de: 'de-DE', it: 'it-IT',
68
- pt: 'pt-PT', ja: 'ja-JP', ko: 'ko-KR', zh: 'zh-CN', ar: 'ar-SA',
67
+ en: 'en-US',
68
+ es: 'es-ES',
69
+ ca: 'ca-ES',
70
+ fr: 'fr-FR',
71
+ de: 'de-DE',
72
+ it: 'it-IT',
73
+ pt: 'pt-PT',
74
+ ja: 'ja-JP',
75
+ ko: 'ko-KR',
76
+ zh: 'zh-CN',
77
+ ar: 'ar-SA',
69
78
  };
70
79
  const DICTS = { [FALLBACK]: en_US_1.default };
71
80
  const pending = new Map();
@@ -140,7 +149,11 @@ function resolveLang(locale) {
140
149
  return FALLBACK;
141
150
  }
142
151
  function getNested(obj, path) {
143
- return path.split('.').reduce((acc, key) => (acc && typeof acc === 'object' && acc[key] != null ? acc[key] : undefined), obj);
152
+ return path
153
+ .split('.')
154
+ .reduce((acc, key) => acc && typeof acc === 'object' && acc[key] != null
155
+ ? acc[key]
156
+ : undefined, obj);
144
157
  }
145
158
  function translate(locale, key, vars) {
146
159
  const lang = resolveLang(locale);