@oxy.so/core 1.0.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 (673) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +16 -0
  3. package/README.md +221 -0
  4. package/dist/cjs/.tsbuildinfo +1 -0
  5. package/dist/cjs/HttpService.js +1270 -0
  6. package/dist/cjs/OxyServices.base.js +390 -0
  7. package/dist/cjs/OxyServices.errors.js +95 -0
  8. package/dist/cjs/OxyServices.js +72 -0
  9. package/dist/cjs/boot/sessionColdBoot.js +395 -0
  10. package/dist/cjs/constants/version.js +16 -0
  11. package/dist/cjs/crypto/aead.js +79 -0
  12. package/dist/cjs/crypto/ecdh.js +35 -0
  13. package/dist/cjs/crypto/identityMarker.js +255 -0
  14. package/dist/cjs/crypto/kdf.js +39 -0
  15. package/dist/cjs/crypto/keyManager.js +2234 -0
  16. package/dist/cjs/crypto/polyfill.js +131 -0
  17. package/dist/cjs/crypto/recoveryPhrase.js +242 -0
  18. package/dist/cjs/crypto/signatureService.js +273 -0
  19. package/dist/cjs/i18n/accountCategoryLabels.js +44 -0
  20. package/dist/cjs/i18n/accountRoleLabels.js +27 -0
  21. package/dist/cjs/i18n/index.js +90 -0
  22. package/dist/cjs/i18n/locales/ar-SA.json +282 -0
  23. package/dist/cjs/i18n/locales/ca-ES.json +282 -0
  24. package/dist/cjs/i18n/locales/de-DE.json +282 -0
  25. package/dist/cjs/i18n/locales/en-US.json +2161 -0
  26. package/dist/cjs/i18n/locales/es-ES.json +2161 -0
  27. package/dist/cjs/i18n/locales/fr-FR.json +282 -0
  28. package/dist/cjs/i18n/locales/it-IT.json +282 -0
  29. package/dist/cjs/i18n/locales/ja-JP.json +282 -0
  30. package/dist/cjs/i18n/locales/ko-KR.json +282 -0
  31. package/dist/cjs/i18n/locales/locales/ar-SA.json +282 -0
  32. package/dist/cjs/i18n/locales/locales/ca-ES.json +282 -0
  33. package/dist/cjs/i18n/locales/locales/de-DE.json +282 -0
  34. package/dist/cjs/i18n/locales/locales/en-US.json +2161 -0
  35. package/dist/cjs/i18n/locales/locales/es-ES.json +2161 -0
  36. package/dist/cjs/i18n/locales/locales/fr-FR.json +282 -0
  37. package/dist/cjs/i18n/locales/locales/it-IT.json +282 -0
  38. package/dist/cjs/i18n/locales/locales/ja-JP.json +282 -0
  39. package/dist/cjs/i18n/locales/locales/ko-KR.json +282 -0
  40. package/dist/cjs/i18n/locales/locales/pt-PT.json +282 -0
  41. package/dist/cjs/i18n/locales/locales/zh-CN.json +282 -0
  42. package/dist/cjs/i18n/locales/pt-PT.json +282 -0
  43. package/dist/cjs/i18n/locales/zh-CN.json +282 -0
  44. package/dist/cjs/i18n/reputationCategoryLabels.js +20 -0
  45. package/dist/cjs/i18n/trustTierLabels.js +19 -0
  46. package/dist/cjs/index.js +498 -0
  47. package/dist/cjs/inference/OxyInferenceClient.js +544 -0
  48. package/dist/cjs/logger/index.js +149 -0
  49. package/dist/cjs/mixins/OxyServices.accounts.js +555 -0
  50. package/dist/cjs/mixins/OxyServices.analytics.js +49 -0
  51. package/dist/cjs/mixins/OxyServices.appData.js +108 -0
  52. package/dist/cjs/mixins/OxyServices.assets.js +764 -0
  53. package/dist/cjs/mixins/OxyServices.auth.js +1254 -0
  54. package/dist/cjs/mixins/OxyServices.chains.js +73 -0
  55. package/dist/cjs/mixins/OxyServices.civic.js +611 -0
  56. package/dist/cjs/mixins/OxyServices.connectedApps.js +78 -0
  57. package/dist/cjs/mixins/OxyServices.contacts.js +50 -0
  58. package/dist/cjs/mixins/OxyServices.deviceBoot.js +191 -0
  59. package/dist/cjs/mixins/OxyServices.deviceTransfer.js +314 -0
  60. package/dist/cjs/mixins/OxyServices.devices.js +116 -0
  61. package/dist/cjs/mixins/OxyServices.features.js +335 -0
  62. package/dist/cjs/mixins/OxyServices.followGraph.js +221 -0
  63. package/dist/cjs/mixins/OxyServices.identity.js +461 -0
  64. package/dist/cjs/mixins/OxyServices.identityBackup.js +172 -0
  65. package/dist/cjs/mixins/OxyServices.inference.js +59 -0
  66. package/dist/cjs/mixins/OxyServices.language.js +125 -0
  67. package/dist/cjs/mixins/OxyServices.links.js +72 -0
  68. package/dist/cjs/mixins/OxyServices.location.js +43 -0
  69. package/dist/cjs/mixins/OxyServices.nodes.js +175 -0
  70. package/dist/cjs/mixins/OxyServices.notifications.js +63 -0
  71. package/dist/cjs/mixins/OxyServices.payment.js +158 -0
  72. package/dist/cjs/mixins/OxyServices.privacy.js +199 -0
  73. package/dist/cjs/mixins/OxyServices.reputation.js +289 -0
  74. package/dist/cjs/mixins/OxyServices.security.js +89 -0
  75. package/dist/cjs/mixins/OxyServices.store.js +266 -0
  76. package/dist/cjs/mixins/OxyServices.topics.js +137 -0
  77. package/dist/cjs/mixins/OxyServices.user.js +902 -0
  78. package/dist/cjs/mixins/OxyServices.utility.js +1098 -0
  79. package/dist/cjs/mixins/index.js +135 -0
  80. package/dist/cjs/mixins/mixinHelpers.js +53 -0
  81. package/dist/cjs/models/Topic.js +16 -0
  82. package/dist/cjs/models/interfaces.js +20 -0
  83. package/dist/cjs/models/session.js +2 -0
  84. package/dist/cjs/server/auth.js +167 -0
  85. package/dist/cjs/server/capabilityTicket.js +192 -0
  86. package/dist/cjs/server/cors.js +225 -0
  87. package/dist/cjs/server/index.js +97 -0
  88. package/dist/cjs/server/rateLimit.js +207 -0
  89. package/dist/cjs/server/safeFetch.js +458 -0
  90. package/dist/cjs/server/securityHeaders.js +377 -0
  91. package/dist/cjs/server/userInvalidation.js +156 -0
  92. package/dist/cjs/server/verifySecret.js +50 -0
  93. package/dist/cjs/session/SessionClient.js +865 -0
  94. package/dist/cjs/session/accountDelegationAccess.js +48 -0
  95. package/dist/cjs/session/accountDialogController.js +1131 -0
  96. package/dist/cjs/session/accountSwitchTargets.js +81 -0
  97. package/dist/cjs/session/authStateStore.js +404 -0
  98. package/dist/cjs/session/createSessionClient.js +32 -0
  99. package/dist/cjs/session/deviceDirectory.js +143 -0
  100. package/dist/cjs/session/deviceSwitcherRows.js +76 -0
  101. package/dist/cjs/session/identityPin.js +256 -0
  102. package/dist/cjs/session/identitySession.js +135 -0
  103. package/dist/cjs/session/projectSessionState.js +121 -0
  104. package/dist/cjs/session/refresh.js +398 -0
  105. package/dist/cjs/session/sessionClientHost.js +34 -0
  106. package/dist/cjs/session/sharedDeviceCredential.js +247 -0
  107. package/dist/cjs/session/socketLoader.js +55 -0
  108. package/dist/cjs/shared/utils/colorUtils.js +153 -0
  109. package/dist/cjs/shared/utils/errorUtils.js +183 -0
  110. package/dist/cjs/shared/utils/index.js +49 -0
  111. package/dist/cjs/shared/utils/networkUtils.js +183 -0
  112. package/dist/cjs/shared/utils/themeUtils.js +106 -0
  113. package/dist/cjs/utils/accountCacheSweep.js +80 -0
  114. package/dist/cjs/utils/accountUtils.js +140 -0
  115. package/dist/cjs/utils/activityId.js +6 -0
  116. package/dist/cjs/utils/apiUtils.js +91 -0
  117. package/dist/cjs/utils/asyncUtils.js +222 -0
  118. package/dist/cjs/utils/authHelpers.js +120 -0
  119. package/dist/cjs/utils/authWebUrl.js +19 -0
  120. package/dist/cjs/utils/avatarUtils.js +29 -0
  121. package/dist/cjs/utils/cache.js +235 -0
  122. package/dist/cjs/utils/cacheKey.js +85 -0
  123. package/dist/cjs/utils/coldBoot.js +122 -0
  124. package/dist/cjs/utils/commonsApproval.js +31 -0
  125. package/dist/cjs/utils/commonsDelivery.js +59 -0
  126. package/dist/cjs/utils/deviceManager.js +174 -0
  127. package/dist/cjs/utils/displayNamePolicyRanges.generated.js +60 -0
  128. package/dist/cjs/utils/edgeRegion.js +6 -0
  129. package/dist/cjs/utils/errorUtils.js +243 -0
  130. package/dist/cjs/utils/identityCacheSweep.js +97 -0
  131. package/dist/cjs/utils/languageUtils.js +224 -0
  132. package/dist/cjs/utils/oauthPkce.js +311 -0
  133. package/dist/cjs/utils/officialOrigins.js +64 -0
  134. package/dist/cjs/utils/oxyServiceEnvironment.js +19 -0
  135. package/dist/cjs/utils/platform.js +119 -0
  136. package/dist/cjs/utils/profileLinks.js +63 -0
  137. package/dist/cjs/utils/redactUrl.js +29 -0
  138. package/dist/cjs/utils/registrableApex.js +45 -0
  139. package/dist/cjs/utils/requestUtils.js +209 -0
  140. package/dist/cjs/utils/sessionUtils.js +181 -0
  141. package/dist/cjs/utils/textNormalization.js +158 -0
  142. package/dist/cjs/utils/userHandle.js +37 -0
  143. package/dist/cjs/utils/userIdentity.js +50 -0
  144. package/dist/cjs/utils/validationUtils.js +370 -0
  145. package/dist/cjs/utils/webauthnOrigin.js +51 -0
  146. package/dist/esm/.tsbuildinfo +1 -0
  147. package/dist/esm/HttpService.js +1266 -0
  148. package/dist/esm/OxyServices.base.js +386 -0
  149. package/dist/esm/OxyServices.errors.js +88 -0
  150. package/dist/esm/OxyServices.js +66 -0
  151. package/dist/esm/boot/sessionColdBoot.js +392 -0
  152. package/dist/esm/constants/version.js +13 -0
  153. package/dist/esm/crypto/aead.js +74 -0
  154. package/dist/esm/crypto/ecdh.js +32 -0
  155. package/dist/esm/crypto/identityMarker.js +248 -0
  156. package/dist/esm/crypto/kdf.js +36 -0
  157. package/dist/esm/crypto/keyManager.js +2227 -0
  158. package/dist/esm/crypto/polyfill.js +129 -0
  159. package/dist/esm/crypto/recoveryPhrase.js +238 -0
  160. package/dist/esm/crypto/signatureService.js +269 -0
  161. package/dist/esm/i18n/accountCategoryLabels.js +37 -0
  162. package/dist/esm/i18n/accountRoleLabels.js +20 -0
  163. package/dist/esm/i18n/index.js +83 -0
  164. package/dist/esm/i18n/locales/ar-SA.json +282 -0
  165. package/dist/esm/i18n/locales/ca-ES.json +282 -0
  166. package/dist/esm/i18n/locales/de-DE.json +282 -0
  167. package/dist/esm/i18n/locales/en-US.json +2161 -0
  168. package/dist/esm/i18n/locales/es-ES.json +2161 -0
  169. package/dist/esm/i18n/locales/fr-FR.json +282 -0
  170. package/dist/esm/i18n/locales/it-IT.json +282 -0
  171. package/dist/esm/i18n/locales/ja-JP.json +282 -0
  172. package/dist/esm/i18n/locales/ko-KR.json +282 -0
  173. package/dist/esm/i18n/locales/locales/ar-SA.json +282 -0
  174. package/dist/esm/i18n/locales/locales/ca-ES.json +282 -0
  175. package/dist/esm/i18n/locales/locales/de-DE.json +282 -0
  176. package/dist/esm/i18n/locales/locales/en-US.json +2161 -0
  177. package/dist/esm/i18n/locales/locales/es-ES.json +2161 -0
  178. package/dist/esm/i18n/locales/locales/fr-FR.json +282 -0
  179. package/dist/esm/i18n/locales/locales/it-IT.json +282 -0
  180. package/dist/esm/i18n/locales/locales/ja-JP.json +282 -0
  181. package/dist/esm/i18n/locales/locales/ko-KR.json +282 -0
  182. package/dist/esm/i18n/locales/locales/pt-PT.json +282 -0
  183. package/dist/esm/i18n/locales/locales/zh-CN.json +282 -0
  184. package/dist/esm/i18n/locales/pt-PT.json +282 -0
  185. package/dist/esm/i18n/locales/zh-CN.json +282 -0
  186. package/dist/esm/i18n/reputationCategoryLabels.js +13 -0
  187. package/dist/esm/i18n/trustTierLabels.js +12 -0
  188. package/dist/esm/index.js +254 -0
  189. package/dist/esm/inference/OxyInferenceClient.js +538 -0
  190. package/dist/esm/logger/index.js +140 -0
  191. package/dist/esm/mixins/OxyServices.accounts.js +543 -0
  192. package/dist/esm/mixins/OxyServices.analytics.js +46 -0
  193. package/dist/esm/mixins/OxyServices.appData.js +103 -0
  194. package/dist/esm/mixins/OxyServices.assets.js +761 -0
  195. package/dist/esm/mixins/OxyServices.auth.js +1247 -0
  196. package/dist/esm/mixins/OxyServices.chains.js +70 -0
  197. package/dist/esm/mixins/OxyServices.civic.js +605 -0
  198. package/dist/esm/mixins/OxyServices.connectedApps.js +75 -0
  199. package/dist/esm/mixins/OxyServices.contacts.js +47 -0
  200. package/dist/esm/mixins/OxyServices.deviceBoot.js +186 -0
  201. package/dist/esm/mixins/OxyServices.deviceTransfer.js +311 -0
  202. package/dist/esm/mixins/OxyServices.devices.js +113 -0
  203. package/dist/esm/mixins/OxyServices.features.js +332 -0
  204. package/dist/esm/mixins/OxyServices.followGraph.js +218 -0
  205. package/dist/esm/mixins/OxyServices.identity.js +457 -0
  206. package/dist/esm/mixins/OxyServices.identityBackup.js +169 -0
  207. package/dist/esm/mixins/OxyServices.inference.js +56 -0
  208. package/dist/esm/mixins/OxyServices.language.js +122 -0
  209. package/dist/esm/mixins/OxyServices.links.js +69 -0
  210. package/dist/esm/mixins/OxyServices.location.js +40 -0
  211. package/dist/esm/mixins/OxyServices.nodes.js +172 -0
  212. package/dist/esm/mixins/OxyServices.notifications.js +60 -0
  213. package/dist/esm/mixins/OxyServices.payment.js +155 -0
  214. package/dist/esm/mixins/OxyServices.privacy.js +196 -0
  215. package/dist/esm/mixins/OxyServices.reputation.js +286 -0
  216. package/dist/esm/mixins/OxyServices.security.js +86 -0
  217. package/dist/esm/mixins/OxyServices.store.js +263 -0
  218. package/dist/esm/mixins/OxyServices.topics.js +134 -0
  219. package/dist/esm/mixins/OxyServices.user.js +899 -0
  220. package/dist/esm/mixins/OxyServices.utility.js +1095 -0
  221. package/dist/esm/mixins/index.js +132 -0
  222. package/dist/esm/mixins/mixinHelpers.js +48 -0
  223. package/dist/esm/models/Topic.js +13 -0
  224. package/dist/esm/models/interfaces.js +17 -0
  225. package/dist/esm/models/session.js +1 -0
  226. package/dist/esm/server/auth.js +154 -0
  227. package/dist/esm/server/capabilityTicket.js +183 -0
  228. package/dist/esm/server/cors.js +220 -0
  229. package/dist/esm/server/index.js +47 -0
  230. package/dist/esm/server/rateLimit.js +201 -0
  231. package/dist/esm/server/safeFetch.js +447 -0
  232. package/dist/esm/server/securityHeaders.js +364 -0
  233. package/dist/esm/server/userInvalidation.js +152 -0
  234. package/dist/esm/server/verifySecret.js +47 -0
  235. package/dist/esm/session/SessionClient.js +861 -0
  236. package/dist/esm/session/accountDelegationAccess.js +45 -0
  237. package/dist/esm/session/accountDialogController.js +1126 -0
  238. package/dist/esm/session/accountSwitchTargets.js +77 -0
  239. package/dist/esm/session/authStateStore.js +398 -0
  240. package/dist/esm/session/createSessionClient.js +29 -0
  241. package/dist/esm/session/deviceDirectory.js +135 -0
  242. package/dist/esm/session/deviceSwitcherRows.js +72 -0
  243. package/dist/esm/session/identityPin.js +249 -0
  244. package/dist/esm/session/identitySession.js +131 -0
  245. package/dist/esm/session/projectSessionState.js +114 -0
  246. package/dist/esm/session/refresh.js +390 -0
  247. package/dist/esm/session/sessionClientHost.js +31 -0
  248. package/dist/esm/session/sharedDeviceCredential.js +239 -0
  249. package/dist/esm/session/socketLoader.js +19 -0
  250. package/dist/esm/shared/utils/colorUtils.js +143 -0
  251. package/dist/esm/shared/utils/errorUtils.js +170 -0
  252. package/dist/esm/shared/utils/index.js +15 -0
  253. package/dist/esm/shared/utils/networkUtils.js +173 -0
  254. package/dist/esm/shared/utils/themeUtils.js +98 -0
  255. package/dist/esm/utils/accountCacheSweep.js +75 -0
  256. package/dist/esm/utils/accountUtils.js +131 -0
  257. package/dist/esm/utils/activityId.js +2 -0
  258. package/dist/esm/utils/apiUtils.js +84 -0
  259. package/dist/esm/utils/asyncUtils.js +207 -0
  260. package/dist/esm/utils/authHelpers.js +111 -0
  261. package/dist/esm/utils/authWebUrl.js +16 -0
  262. package/dist/esm/utils/avatarUtils.js +26 -0
  263. package/dist/esm/utils/cache.js +227 -0
  264. package/dist/esm/utils/cacheKey.js +80 -0
  265. package/dist/esm/utils/coldBoot.js +119 -0
  266. package/dist/esm/utils/commonsApproval.js +27 -0
  267. package/dist/esm/utils/commonsDelivery.js +54 -0
  268. package/dist/esm/utils/deviceManager.js +170 -0
  269. package/dist/esm/utils/displayNamePolicyRanges.generated.js +57 -0
  270. package/dist/esm/utils/edgeRegion.js +2 -0
  271. package/dist/esm/utils/errorUtils.js +232 -0
  272. package/dist/esm/utils/identityCacheSweep.js +92 -0
  273. package/dist/esm/utils/languageUtils.js +212 -0
  274. package/dist/esm/utils/oauthPkce.js +297 -0
  275. package/dist/esm/utils/officialOrigins.js +59 -0
  276. package/dist/esm/utils/oxyServiceEnvironment.js +16 -0
  277. package/dist/esm/utils/platform.js +110 -0
  278. package/dist/esm/utils/profileLinks.js +60 -0
  279. package/dist/esm/utils/redactUrl.js +26 -0
  280. package/dist/esm/utils/registrableApex.js +42 -0
  281. package/dist/esm/utils/requestUtils.js +203 -0
  282. package/dist/esm/utils/sessionUtils.js +171 -0
  283. package/dist/esm/utils/textNormalization.js +154 -0
  284. package/dist/esm/utils/userHandle.js +33 -0
  285. package/dist/esm/utils/userIdentity.js +45 -0
  286. package/dist/esm/utils/validationUtils.js +350 -0
  287. package/dist/esm/utils/webauthnOrigin.js +48 -0
  288. package/dist/types/.tsbuildinfo +1 -0
  289. package/dist/types/HttpService.d.ts +413 -0
  290. package/dist/types/OxyServices.base.d.ts +187 -0
  291. package/dist/types/OxyServices.d.ts +139 -0
  292. package/dist/types/OxyServices.errors.d.ts +84 -0
  293. package/dist/types/boot/sessionColdBoot.d.ts +140 -0
  294. package/dist/types/constants/version.d.ts +13 -0
  295. package/dist/types/crypto/aead.d.ts +56 -0
  296. package/dist/types/crypto/ecdh.d.ts +29 -0
  297. package/dist/types/crypto/identityMarker.d.ts +94 -0
  298. package/dist/types/crypto/kdf.d.ts +25 -0
  299. package/dist/types/crypto/keyManager.d.ts +582 -0
  300. package/dist/types/crypto/polyfill.d.ts +25 -0
  301. package/dist/types/crypto/recoveryPhrase.d.ts +173 -0
  302. package/dist/types/crypto/signatureService.d.ts +136 -0
  303. package/dist/types/i18n/accountCategoryLabels.d.ts +34 -0
  304. package/dist/types/i18n/accountRoleLabels.d.ts +10 -0
  305. package/dist/types/i18n/index.d.ts +3 -0
  306. package/dist/types/i18n/reputationCategoryLabels.d.ts +10 -0
  307. package/dist/types/i18n/trustTierLabels.d.ts +9 -0
  308. package/dist/types/index.d.ts +145 -0
  309. package/dist/types/inference/OxyInferenceClient.d.ts +342 -0
  310. package/dist/types/logger/index.d.ts +104 -0
  311. package/dist/types/mixins/OxyServices.accounts.d.ts +868 -0
  312. package/dist/types/mixins/OxyServices.analytics.d.ts +72 -0
  313. package/dist/types/mixins/OxyServices.appData.d.ts +108 -0
  314. package/dist/types/mixins/OxyServices.assets.d.ts +329 -0
  315. package/dist/types/mixins/OxyServices.auth.d.ts +908 -0
  316. package/dist/types/mixins/OxyServices.chains.d.ts +156 -0
  317. package/dist/types/mixins/OxyServices.civic.d.ts +510 -0
  318. package/dist/types/mixins/OxyServices.connectedApps.d.ts +169 -0
  319. package/dist/types/mixins/OxyServices.contacts.d.ts +100 -0
  320. package/dist/types/mixins/OxyServices.deviceBoot.d.ts +185 -0
  321. package/dist/types/mixins/OxyServices.deviceTransfer.d.ts +149 -0
  322. package/dist/types/mixins/OxyServices.devices.d.ts +103 -0
  323. package/dist/types/mixins/OxyServices.features.d.ts +250 -0
  324. package/dist/types/mixins/OxyServices.followGraph.d.ts +223 -0
  325. package/dist/types/mixins/OxyServices.identity.d.ts +351 -0
  326. package/dist/types/mixins/OxyServices.identityBackup.d.ts +129 -0
  327. package/dist/types/mixins/OxyServices.inference.d.ts +95 -0
  328. package/dist/types/mixins/OxyServices.language.d.ts +87 -0
  329. package/dist/types/mixins/OxyServices.links.d.ts +104 -0
  330. package/dist/types/mixins/OxyServices.location.d.ts +70 -0
  331. package/dist/types/mixins/OxyServices.nodes.d.ts +198 -0
  332. package/dist/types/mixins/OxyServices.notifications.d.ts +143 -0
  333. package/dist/types/mixins/OxyServices.payment.d.ts +117 -0
  334. package/dist/types/mixins/OxyServices.privacy.d.ts +146 -0
  335. package/dist/types/mixins/OxyServices.reputation.d.ts +202 -0
  336. package/dist/types/mixins/OxyServices.security.d.ts +84 -0
  337. package/dist/types/mixins/OxyServices.store.d.ts +334 -0
  338. package/dist/types/mixins/OxyServices.topics.d.ts +110 -0
  339. package/dist/types/mixins/OxyServices.user.d.ts +558 -0
  340. package/dist/types/mixins/OxyServices.utility.d.ts +393 -0
  341. package/dist/types/mixins/index.d.ts +87 -0
  342. package/dist/types/mixins/mixinHelpers.d.ts +31 -0
  343. package/dist/types/models/Topic.d.ts +42 -0
  344. package/dist/types/models/interfaces.d.ts +675 -0
  345. package/dist/types/models/session.d.ts +51 -0
  346. package/dist/types/server/auth.d.ts +130 -0
  347. package/dist/types/server/capabilityTicket.d.ts +41 -0
  348. package/dist/types/server/cors.d.ts +98 -0
  349. package/dist/types/server/index.d.ts +35 -0
  350. package/dist/types/server/rateLimit.d.ts +40 -0
  351. package/dist/types/server/safeFetch.d.ts +137 -0
  352. package/dist/types/server/securityHeaders.d.ts +221 -0
  353. package/dist/types/server/userInvalidation.d.ts +114 -0
  354. package/dist/types/server/verifySecret.d.ts +29 -0
  355. package/dist/types/session/SessionClient.d.ts +418 -0
  356. package/dist/types/session/accountDelegationAccess.d.ts +40 -0
  357. package/dist/types/session/accountDialogController.d.ts +648 -0
  358. package/dist/types/session/accountSwitchTargets.d.ts +70 -0
  359. package/dist/types/session/authStateStore.d.ts +153 -0
  360. package/dist/types/session/createSessionClient.d.ts +30 -0
  361. package/dist/types/session/deviceDirectory.d.ts +182 -0
  362. package/dist/types/session/deviceSwitcherRows.d.ts +92 -0
  363. package/dist/types/session/identityPin.d.ts +87 -0
  364. package/dist/types/session/identitySession.d.ts +105 -0
  365. package/dist/types/session/projectSessionState.d.ts +74 -0
  366. package/dist/types/session/refresh.d.ts +179 -0
  367. package/dist/types/session/sessionClientHost.d.ts +18 -0
  368. package/dist/types/session/sharedDeviceCredential.d.ts +202 -0
  369. package/dist/types/session/socketLoader.d.ts +11 -0
  370. package/dist/types/shared/utils/colorUtils.d.ts +104 -0
  371. package/dist/types/shared/utils/errorUtils.d.ts +97 -0
  372. package/dist/types/shared/utils/index.d.ts +13 -0
  373. package/dist/types/shared/utils/networkUtils.d.ts +139 -0
  374. package/dist/types/shared/utils/themeUtils.d.ts +90 -0
  375. package/dist/types/utils/accountCacheSweep.d.ts +75 -0
  376. package/dist/types/utils/accountUtils.d.ts +100 -0
  377. package/dist/types/utils/activityId.d.ts +2 -0
  378. package/dist/types/utils/apiUtils.d.ts +95 -0
  379. package/dist/types/utils/asyncUtils.d.ts +62 -0
  380. package/dist/types/utils/authHelpers.d.ts +58 -0
  381. package/dist/types/utils/authWebUrl.d.ts +16 -0
  382. package/dist/types/utils/avatarUtils.d.ts +16 -0
  383. package/dist/types/utils/cache.d.ts +130 -0
  384. package/dist/types/utils/cacheKey.d.ts +66 -0
  385. package/dist/types/utils/coldBoot.d.ts +131 -0
  386. package/dist/types/utils/commonsApproval.d.ts +13 -0
  387. package/dist/types/utils/commonsDelivery.d.ts +105 -0
  388. package/dist/types/utils/deviceManager.d.ts +65 -0
  389. package/dist/types/utils/displayNamePolicyRanges.generated.d.ts +57 -0
  390. package/dist/types/utils/edgeRegion.d.ts +2 -0
  391. package/dist/types/utils/errorUtils.d.ts +125 -0
  392. package/dist/types/utils/identityCacheSweep.d.ts +80 -0
  393. package/dist/types/utils/languageUtils.d.ts +100 -0
  394. package/dist/types/utils/oauthPkce.d.ts +157 -0
  395. package/dist/types/utils/officialOrigins.d.ts +13 -0
  396. package/dist/types/utils/oxyServiceEnvironment.d.ts +17 -0
  397. package/dist/types/utils/platform.d.ts +49 -0
  398. package/dist/types/utils/profileLinks.d.ts +44 -0
  399. package/dist/types/utils/redactUrl.d.ts +17 -0
  400. package/dist/types/utils/registrableApex.d.ts +27 -0
  401. package/dist/types/utils/requestUtils.d.ts +123 -0
  402. package/dist/types/utils/sessionUtils.d.ts +54 -0
  403. package/dist/types/utils/textNormalization.d.ts +103 -0
  404. package/dist/types/utils/userHandle.d.ts +26 -0
  405. package/dist/types/utils/userIdentity.d.ts +21 -0
  406. package/dist/types/utils/validationUtils.d.ts +268 -0
  407. package/dist/types/utils/webauthnOrigin.d.ts +32 -0
  408. package/package.json +168 -0
  409. package/src/HttpService.ts +1553 -0
  410. package/src/OxyServices.base.ts +478 -0
  411. package/src/OxyServices.errors.ts +122 -0
  412. package/src/OxyServices.ts +172 -0
  413. package/src/__tests__/authSocket.test.ts +96 -0
  414. package/src/__tests__/httpServiceActivityId.test.ts +49 -0
  415. package/src/__tests__/httpServiceAuthSelfAwait.test.ts +108 -0
  416. package/src/__tests__/httpServiceCache.test.ts +318 -0
  417. package/src/__tests__/httpServiceCsrf.test.ts +235 -0
  418. package/src/__tests__/httpServiceFormEncoded.test.ts +142 -0
  419. package/src/__tests__/httpServiceQueueDeadlock.test.ts +128 -0
  420. package/src/__tests__/httpServiceUnwrapEnvelope.test.ts +115 -0
  421. package/src/__tests__/inSessionRefresh.test.ts +260 -0
  422. package/src/__tests__/linkedClient.test.ts +370 -0
  423. package/src/__tests__/parseHttpErrorBody.test.ts +116 -0
  424. package/src/__tests__/serverValueImportsDeclared.test.ts +120 -0
  425. package/src/__tests__/userIdentity.test.ts +143 -0
  426. package/src/boot/__tests__/sessionColdBoot.identity.test.ts +393 -0
  427. package/src/boot/__tests__/sessionColdBoot.sharedDevice.test.ts +325 -0
  428. package/src/boot/__tests__/sessionColdBoot.test.ts +570 -0
  429. package/src/boot/sessionColdBoot.ts +529 -0
  430. package/src/constants/version.ts +15 -0
  431. package/src/crypto/__tests__/backupMaterial.test.ts +86 -0
  432. package/src/crypto/__tests__/cryptoPrimitives.test.ts +226 -0
  433. package/src/crypto/__tests__/identityMocks.ts +125 -0
  434. package/src/crypto/__tests__/keyManager.atomicity.test.ts +272 -0
  435. package/src/crypto/__tests__/keyManager.cacheSafety.test.ts +175 -0
  436. package/src/crypto/__tests__/keyManager.identityStatus.test.ts +217 -0
  437. package/src/crypto/__tests__/keyManager.recoveryLadder.test.ts +179 -0
  438. package/src/crypto/__tests__/keyManager.recoveryMnemonic.test.ts +138 -0
  439. package/src/crypto/__tests__/keyManager.storageMigration.test.ts +227 -0
  440. package/src/crypto/__tests__/keyManager.test.ts +329 -0
  441. package/src/crypto/__tests__/polyfill.test.ts +109 -0
  442. package/src/crypto/__tests__/recoveryPhrase.test.ts +61 -0
  443. package/src/crypto/__tests__/scopedSeed.test.ts +126 -0
  444. package/src/crypto/__tests__/signChallengeShared.test.ts +63 -0
  445. package/src/crypto/__tests__/signedRecord.test.ts +230 -0
  446. package/src/crypto/aead.ts +97 -0
  447. package/src/crypto/ecdh.ts +37 -0
  448. package/src/crypto/identityMarker.ts +291 -0
  449. package/src/crypto/kdf.ts +43 -0
  450. package/src/crypto/keyManager.ts +2607 -0
  451. package/src/crypto/polyfill.ts +143 -0
  452. package/src/crypto/recoveryPhrase.ts +337 -0
  453. package/src/crypto/signatureService.ts +350 -0
  454. package/src/i18n/__tests__/accountCategoryLabels.test.ts +62 -0
  455. package/src/i18n/__tests__/accountRoleLabels.test.ts +54 -0
  456. package/src/i18n/__tests__/reputationCategoryLabels.test.ts +56 -0
  457. package/src/i18n/__tests__/trustTierLabels.test.ts +47 -0
  458. package/src/i18n/accountCategoryLabels.ts +44 -0
  459. package/src/i18n/accountRoleLabels.ts +26 -0
  460. package/src/i18n/index.ts +88 -0
  461. package/src/i18n/locales/ar-SA.json +282 -0
  462. package/src/i18n/locales/ca-ES.json +282 -0
  463. package/src/i18n/locales/de-DE.json +282 -0
  464. package/src/i18n/locales/en-US.json +2161 -0
  465. package/src/i18n/locales/es-ES.json +2161 -0
  466. package/src/i18n/locales/fr-FR.json +282 -0
  467. package/src/i18n/locales/it-IT.json +282 -0
  468. package/src/i18n/locales/ja-JP.json +282 -0
  469. package/src/i18n/locales/ko-KR.json +282 -0
  470. package/src/i18n/locales/pt-PT.json +282 -0
  471. package/src/i18n/locales/zh-CN.json +282 -0
  472. package/src/i18n/reputationCategoryLabels.ts +20 -0
  473. package/src/i18n/trustTierLabels.ts +18 -0
  474. package/src/index.ts +881 -0
  475. package/src/inference/OxyInferenceClient.ts +888 -0
  476. package/src/inference/__tests__/OxyInferenceClient.test.ts +834 -0
  477. package/src/logger/__tests__/logger.test.ts +207 -0
  478. package/src/logger/index.ts +217 -0
  479. package/src/mixins/OxyServices.accounts.ts +1330 -0
  480. package/src/mixins/OxyServices.analytics.ts +53 -0
  481. package/src/mixins/OxyServices.appData.ts +158 -0
  482. package/src/mixins/OxyServices.assets.ts +861 -0
  483. package/src/mixins/OxyServices.auth.ts +1858 -0
  484. package/src/mixins/OxyServices.chains.ts +134 -0
  485. package/src/mixins/OxyServices.civic.ts +945 -0
  486. package/src/mixins/OxyServices.connectedApps.ts +174 -0
  487. package/src/mixins/OxyServices.contacts.ts +73 -0
  488. package/src/mixins/OxyServices.deviceBoot.ts +210 -0
  489. package/src/mixins/OxyServices.deviceTransfer.ts +393 -0
  490. package/src/mixins/OxyServices.devices.ts +120 -0
  491. package/src/mixins/OxyServices.features.ts +454 -0
  492. package/src/mixins/OxyServices.followGraph.ts +293 -0
  493. package/src/mixins/OxyServices.identity.ts +705 -0
  494. package/src/mixins/OxyServices.identityBackup.ts +250 -0
  495. package/src/mixins/OxyServices.inference.ts +57 -0
  496. package/src/mixins/OxyServices.language.ts +144 -0
  497. package/src/mixins/OxyServices.links.ts +107 -0
  498. package/src/mixins/OxyServices.location.ts +46 -0
  499. package/src/mixins/OxyServices.nodes.ts +337 -0
  500. package/src/mixins/OxyServices.notifications.ts +142 -0
  501. package/src/mixins/OxyServices.payment.ts +163 -0
  502. package/src/mixins/OxyServices.privacy.ts +219 -0
  503. package/src/mixins/OxyServices.reputation.ts +436 -0
  504. package/src/mixins/OxyServices.security.ts +110 -0
  505. package/src/mixins/OxyServices.store.ts +585 -0
  506. package/src/mixins/OxyServices.topics.ts +169 -0
  507. package/src/mixins/OxyServices.user.ts +1137 -0
  508. package/src/mixins/OxyServices.utility.ts +1370 -0
  509. package/src/mixins/__tests__/OxyServices.civic.test.ts +1095 -0
  510. package/src/mixins/__tests__/OxyServices.deviceBoot.test.ts +124 -0
  511. package/src/mixins/__tests__/OxyServices.deviceTransfer.test.ts +271 -0
  512. package/src/mixins/__tests__/OxyServices.identity.test.ts +376 -0
  513. package/src/mixins/__tests__/OxyServices.links.test.ts +154 -0
  514. package/src/mixins/__tests__/OxyServices.nodes.test.ts +341 -0
  515. package/src/mixins/__tests__/OxyServices.rotateKey.test.ts +276 -0
  516. package/src/mixins/__tests__/OxyServices.serviceAssetMetadata.test.ts +192 -0
  517. package/src/mixins/__tests__/OxyServices.serviceAssetMetadataBySha.test.ts +135 -0
  518. package/src/mixins/__tests__/accounts.test.ts +727 -0
  519. package/src/mixins/__tests__/appData.test.ts +203 -0
  520. package/src/mixins/__tests__/assetCredentials.test.ts +47 -0
  521. package/src/mixins/__tests__/assetUpload.test.ts +191 -0
  522. package/src/mixins/__tests__/backgroundCredential.httpIntegration.test.ts +135 -0
  523. package/src/mixins/__tests__/chains.test.ts +113 -0
  524. package/src/mixins/__tests__/commonsSignIn.test.ts +1144 -0
  525. package/src/mixins/__tests__/connectedApps.test.ts +123 -0
  526. package/src/mixins/__tests__/deviceTokenMintPinned.test.ts +113 -0
  527. package/src/mixins/__tests__/discoveryErrorHandling.test.ts +266 -0
  528. package/src/mixins/__tests__/followCacheInvalidation.test.ts +173 -0
  529. package/src/mixins/__tests__/followGraph.test.ts +147 -0
  530. package/src/mixins/__tests__/followGraphPagination.test.ts +271 -0
  531. package/src/mixins/__tests__/getFileDownloadUrl.test.ts +346 -0
  532. package/src/mixins/__tests__/getFollowStatuses.test.ts +95 -0
  533. package/src/mixins/__tests__/getUsersByIds.test.ts +149 -0
  534. package/src/mixins/__tests__/identityBackup.test.ts +315 -0
  535. package/src/mixins/__tests__/identityWriteCacheInvalidation.test.ts +407 -0
  536. package/src/mixins/__tests__/inferenceFactory.test.ts +58 -0
  537. package/src/mixins/__tests__/onTokensChanged.test.ts +129 -0
  538. package/src/mixins/__tests__/preSessionSkipAuth.test.ts +284 -0
  539. package/src/mixins/__tests__/privacyCacheInvalidation.test.ts +155 -0
  540. package/src/mixins/__tests__/reputation.test.ts +522 -0
  541. package/src/mixins/__tests__/serviceAuth.test.ts +832 -0
  542. package/src/mixins/__tests__/serviceTokenJwks.test.ts +208 -0
  543. package/src/mixins/__tests__/store.test.ts +304 -0
  544. package/src/mixins/__tests__/topics.test.ts +156 -0
  545. package/src/mixins/__tests__/userReadCacheBypass.test.ts +129 -0
  546. package/src/mixins/__tests__/userTokenAuth.test.ts +746 -0
  547. package/src/mixins/__tests__/verifyChallenge.test.ts +130 -0
  548. package/src/mixins/__tests__/verifyServiceActingAs.test.ts +167 -0
  549. package/src/mixins/__tests__/webauthnAuth.test.ts +205 -0
  550. package/src/mixins/index.ts +201 -0
  551. package/src/mixins/mixinHelpers.ts +69 -0
  552. package/src/models/Topic.ts +46 -0
  553. package/src/models/interfaces.ts +786 -0
  554. package/src/models/session.ts +55 -0
  555. package/src/server/__tests__/auth.test.ts +78 -0
  556. package/src/server/__tests__/capabilityTicket.test.ts +111 -0
  557. package/src/server/__tests__/cors.socket.test.ts +225 -0
  558. package/src/server/__tests__/cors.test.ts +158 -0
  559. package/src/server/__tests__/rateLimit.test.ts +257 -0
  560. package/src/server/__tests__/safeFetch.test.ts +232 -0
  561. package/src/server/__tests__/securityHeaders.test.ts +348 -0
  562. package/src/server/__tests__/serviceTokenAttribution.test.ts +396 -0
  563. package/src/server/__tests__/userInvalidation.test.ts +203 -0
  564. package/src/server/__tests__/verifySecret.test.ts +40 -0
  565. package/src/server/auth.ts +271 -0
  566. package/src/server/capabilityTicket.ts +258 -0
  567. package/src/server/cors.ts +277 -0
  568. package/src/server/index.ts +136 -0
  569. package/src/server/rateLimit.ts +313 -0
  570. package/src/server/safeFetch.ts +586 -0
  571. package/src/server/securityHeaders.ts +467 -0
  572. package/src/server/userInvalidation.ts +199 -0
  573. package/src/server/verifySecret.ts +52 -0
  574. package/src/session/SessionClient.ts +1001 -0
  575. package/src/session/__tests__/SessionClient.additive.test.ts +153 -0
  576. package/src/session/__tests__/SessionClient.broadcastChannel.test.ts +114 -0
  577. package/src/session/__tests__/SessionClient.diagnostics.test.ts +91 -0
  578. package/src/session/__tests__/SessionClient.directory.test.ts +688 -0
  579. package/src/session/__tests__/SessionClient.httpIntegration.test.ts +65 -0
  580. package/src/session/__tests__/SessionClient.identityPin.test.ts +175 -0
  581. package/src/session/__tests__/SessionClient.rest.test.ts +119 -0
  582. package/src/session/__tests__/SessionClient.serverEvents.test.ts +72 -0
  583. package/src/session/__tests__/SessionClient.socket.test.ts +202 -0
  584. package/src/session/__tests__/SessionClient.socketFactory.test.ts +81 -0
  585. package/src/session/__tests__/SessionClient.state.test.ts +78 -0
  586. package/src/session/__tests__/SessionClient.switchTokenOrder.test.ts +170 -0
  587. package/src/session/__tests__/accountDelegationAccess.test.ts +104 -0
  588. package/src/session/__tests__/accountDialogController.test.ts +1969 -0
  589. package/src/session/__tests__/accountDialogShape.test.ts +118 -0
  590. package/src/session/__tests__/accountSwitchTargets.test.ts +137 -0
  591. package/src/session/__tests__/authStateStore.test.ts +451 -0
  592. package/src/session/__tests__/deviceDirectory.test.ts +422 -0
  593. package/src/session/__tests__/deviceSwitcherRows.test.ts +223 -0
  594. package/src/session/__tests__/identityPin.test.ts +131 -0
  595. package/src/session/__tests__/identitySession.test.ts +194 -0
  596. package/src/session/__tests__/projectSessionState.test.ts +105 -0
  597. package/src/session/__tests__/refresh.identityPin.test.ts +307 -0
  598. package/src/session/__tests__/refresh.test.ts +443 -0
  599. package/src/session/__tests__/sessionIntegration.test.ts +209 -0
  600. package/src/session/__tests__/sharedDeviceCredential.test.ts +300 -0
  601. package/src/session/accountDelegationAccess.ts +72 -0
  602. package/src/session/accountDialogController.ts +1494 -0
  603. package/src/session/accountSwitchTargets.ts +93 -0
  604. package/src/session/authStateStore.ts +502 -0
  605. package/src/session/createSessionClient.ts +39 -0
  606. package/src/session/deviceDirectory.ts +269 -0
  607. package/src/session/deviceSwitcherRows.ts +145 -0
  608. package/src/session/identityPin.ts +310 -0
  609. package/src/session/identitySession.ts +206 -0
  610. package/src/session/projectSessionState.ts +137 -0
  611. package/src/session/refresh.ts +517 -0
  612. package/src/session/sessionClientHost.ts +39 -0
  613. package/src/session/sharedDeviceCredential.ts +349 -0
  614. package/src/session/socketLoader.ts +30 -0
  615. package/src/shared/utils/colorUtils.ts +155 -0
  616. package/src/shared/utils/errorUtils.ts +181 -0
  617. package/src/shared/utils/index.ts +59 -0
  618. package/src/shared/utils/networkUtils.ts +248 -0
  619. package/src/shared/utils/themeUtils.ts +115 -0
  620. package/src/types/buffer.d.ts +97 -0
  621. package/src/types/expo-crypto.d.ts +16 -0
  622. package/src/types/expo-secure-store.d.ts +17 -0
  623. package/src/utils/__tests__/accountUtils.test.ts +151 -0
  624. package/src/utils/__tests__/activityId.test.ts +45 -0
  625. package/src/utils/__tests__/asyncUtils.test.ts +187 -0
  626. package/src/utils/__tests__/authWebUrl.test.ts +15 -0
  627. package/src/utils/__tests__/cacheKey.test.ts +0 -0
  628. package/src/utils/__tests__/coldBoot.test.ts +496 -0
  629. package/src/utils/__tests__/commonsApproval.test.ts +60 -0
  630. package/src/utils/__tests__/identityCacheSweep.test.ts +151 -0
  631. package/src/utils/__tests__/languageUtils.test.ts +219 -0
  632. package/src/utils/__tests__/oauthPkce.test.ts +272 -0
  633. package/src/utils/__tests__/officialOrigins.test.ts +31 -0
  634. package/src/utils/__tests__/oxyServiceEnvironment.test.ts +7 -0
  635. package/src/utils/__tests__/profileLinks.test.ts +180 -0
  636. package/src/utils/__tests__/redactUrl.test.ts +33 -0
  637. package/src/utils/__tests__/registrableApex.test.ts +62 -0
  638. package/src/utils/__tests__/textNormalization.test.ts +205 -0
  639. package/src/utils/__tests__/validationUtils.test.ts +703 -0
  640. package/src/utils/__tests__/webauthnOrigin.test.ts +83 -0
  641. package/src/utils/accountCacheSweep.ts +93 -0
  642. package/src/utils/accountUtils.ts +194 -0
  643. package/src/utils/activityId.ts +2 -0
  644. package/src/utils/apiUtils.ts +137 -0
  645. package/src/utils/asyncUtils.ts +280 -0
  646. package/src/utils/authHelpers.ts +148 -0
  647. package/src/utils/authWebUrl.ts +17 -0
  648. package/src/utils/avatarUtils.ts +39 -0
  649. package/src/utils/cache.ts +273 -0
  650. package/src/utils/cacheKey.ts +93 -0
  651. package/src/utils/coldBoot.ts +218 -0
  652. package/src/utils/commonsApproval.ts +39 -0
  653. package/src/utils/commonsDelivery.ts +132 -0
  654. package/src/utils/deviceManager.ts +203 -0
  655. package/src/utils/displayNamePolicyRanges.generated.ts +69 -0
  656. package/src/utils/edgeRegion.ts +2 -0
  657. package/src/utils/errorUtils.ts +352 -0
  658. package/src/utils/identityCacheSweep.ts +104 -0
  659. package/src/utils/languageUtils.ts +256 -0
  660. package/src/utils/oauthPkce.ts +392 -0
  661. package/src/utils/officialOrigins.ts +62 -0
  662. package/src/utils/oxyServiceEnvironment.ts +17 -0
  663. package/src/utils/platform.ts +139 -0
  664. package/src/utils/profileLinks.ts +91 -0
  665. package/src/utils/redactUrl.ts +28 -0
  666. package/src/utils/registrableApex.ts +41 -0
  667. package/src/utils/requestUtils.ts +237 -0
  668. package/src/utils/sessionUtils.ts +206 -0
  669. package/src/utils/textNormalization.ts +162 -0
  670. package/src/utils/userHandle.ts +49 -0
  671. package/src/utils/userIdentity.ts +60 -0
  672. package/src/utils/validationUtils.ts +390 -0
  673. package/src/utils/webauthnOrigin.ts +52 -0
@@ -0,0 +1,648 @@
1
+ /**
2
+ * Headless controller for the unified Oxy account dialog.
3
+ *
4
+ * A framework-agnostic state machine + subscribe/getSnapshot store (the same
5
+ * pattern {@link SessionClient} uses — no React, no RN) that both
6
+ * every `OxyProvider` platform variant (Expo/RN and RN-Web)
7
+ * bind to via `useSyncExternalStore`, so the account chooser is ONE
8
+ * implementation across the ecosystem instead of the five drifting copies it
9
+ * replaces.
10
+ *
11
+ * The controller owns:
12
+ * - the device DIRECTORY (ADR 0002) — the server-authoritative read model of
13
+ * who is on this device and what each of them may act as, read through
14
+ * `SessionClient.refreshDirectory()`. It is not assembled here: the client
15
+ * holds one caller's account graph and cannot enumerate another principal's,
16
+ * so switchability is the server's answer and the controller only reads it;
17
+ * - the dialog `view` state machine (`accounts` | `signin` | `qr` | `add` |
18
+ * `signup`);
19
+ * - `activateContext` (the ADR 0002 switch, keyed on the `principal acting as
20
+ * account` pair) and the two removals an account id cannot name —
21
+ * `signOutContext` and `signOutPrincipal`;
22
+ * - the "Sign in with Oxy" device flow (same-device shared-keychain via
23
+ * `oxyServices.signInWithSharedIdentity`, else the cross-device QR handoff
24
+ * via `startCommonsSignIn` → poll → `claimSessionByToken`);
25
+ * - AUTOMATIC delivery selection for that flow (issue #691): the user presses
26
+ * ONE primary action and the controller — not the user — picks how the
27
+ * request reaches their Commons identity, by gathering the facts
28
+ * (`platform`, `commonsAvailability`, and the `targets` a bearer-authorized
29
+ * `deliverCommonsSignIn` reached) and handing them to the pure
30
+ * `selectCommonsDelivery`. Exactly one route is primary; alternatives are
31
+ * never chained behind it, they are state (`signIn.route`,
32
+ * `signIn.routeFailed`) the UI reveals on its own terms;
33
+ * - honest, non-sensitive PROGRESS for that flow (`signIn.progress`), derived
34
+ * only from real signals — the chosen route, `pushSentAt`, `openedAt`,
35
+ * `authorized`, and the commit — never from an optimistic timeline;
36
+ * - `commonsAvailability` — whether Commons is installed on this device
37
+ * (native only, via the injected `canOpenApp` probe), so the QR view can
38
+ * offer a "Get Commons" fallback instead of a same-device dead end.
39
+ * - `startPasskeyHubSignIn` — on a non-Oxy web origin (where a WebAuthn
40
+ * ceremony can't run locally, the RP-ID is bound to oxy.so), open a popup
41
+ * at the auth.oxy.so passkey hub instead, scoped to the SAME device-flow
42
+ * session `showQr` creates, and complete it via the SAME poll/socket/claim
43
+ * engine. Falls back to `showQr`'s plain QR rendering if the popup is
44
+ * blocked.
45
+ *
46
+ * Sign-in is passkey (WebAuthn) or the Commons QR / shared-keychain handoff —
47
+ * password, social login, and 2FA were removed ecosystem-wide. Account
48
+ * creation (`signup` view) is the same two identity backends: a passkey
49
+ * ceremony on web, or a Commons-created identity.
50
+ *
51
+ * The controller owns NO surface PRESENTATION: whether the account dialog is
52
+ * mounted, visible, or dismissed is the job of the shared surface stack
53
+ * (`@oxy.so/services` presents the `AccountDialog` surface into `@oxy.so/bloom`'s
54
+ * stack). This is a headless state machine only — it exposes `setView` /
55
+ * `add` / `startSignup` (the view axis) and `cancelSignIn` (device-flow
56
+ * teardown), never an `open` / `close` / `visible`.
57
+ */
58
+ import type { DeviceDirectory } from '@oxy.so/contracts';
59
+ import type { OxyServices } from '../OxyServices';
60
+ import type { SessionLoginResponse, MinimalUserData } from '../models/session';
61
+ import type { SessionClient } from './SessionClient';
62
+ import { type SocketIOFactory } from './socketLoader';
63
+ import { type DeviceContext } from './deviceDirectory';
64
+ import { type CommonsDeliveryPlatform, type CommonsDeliveryRoute } from '../utils/commonsDelivery';
65
+ /** The dialog's top-level view. */
66
+ export type AccountDialogView = 'accounts' | 'signin' | 'qr' | 'add' | 'signup';
67
+ /**
68
+ * Whether Commons is installed on this device, as resolved by the injected
69
+ * `canOpenApp` probe:
70
+ * - `'unknown'` — not yet probed, OR no probe was injected (web — there is
71
+ * no API to ask a browser whether a custom URL scheme is registered, so
72
+ * this stays `'unknown'` forever there and the QR view renders
73
+ * unconditionally, no gating).
74
+ * - `'checking'` — the probe is in flight.
75
+ * - `'available'` / `'unavailable'` — the probe's resolved terminal answer
76
+ * (native only). A probe error is treated as `'unavailable'` (fail-closed).
77
+ */
78
+ export type CommonsAvailability = 'unknown' | 'checking' | 'available' | 'unavailable';
79
+ /**
80
+ * Lifecycle phase of the "Sign in with Oxy" device flow — the RESOURCE state
81
+ * (is there a live request, a claim in flight, a terminal outcome), as opposed
82
+ * to {@link SignInProgress}, which is what the user is told.
83
+ *
84
+ * `'completed'` is terminal-but-successful: the session was claimed and
85
+ * committed, nothing is in flight, and the surface may show "Identity
86
+ * confirmed" before it goes away. It is cleared back to `'idle'` the moment the
87
+ * dialog moves to another view (a new intention), so a later sign-in entry can
88
+ * never inherit the previous flow's terminal state.
89
+ */
90
+ export type SignInFlowPhase = 'idle' | 'starting' | 'waiting' | 'authorized' | 'completed' | 'error';
91
+ /**
92
+ * Ordered, non-sensitive progress of the active request — the ONE thing the
93
+ * sign-in surface renders its status line from (issue #691, Phase 5).
94
+ *
95
+ * Every step is DERIVED from a real fact the controller observed; there is no
96
+ * optimistic sequence and no timer that advances it. The mapping the UI is
97
+ * expected to render (copy lives in the UI layer, never here):
98
+ *
99
+ * | value | shown as | advanced by |
100
+ * |------------------------|--------------------------------|-------------|
101
+ * | `idle` | (nothing) | no live request, or a terminal error |
102
+ * | `preparing` | "Preparing request" | the request is being created / its route is still being resolved |
103
+ * | `awaiting-approval` | route-specific waiting copy | the primary route is known (`qr` → the QR itself, `open-commons` → "Continue in Commons") |
104
+ * | `delivered-to-commons` | "Check Commons on your phone" | the server confirmed a push to ≥1 known Commons install (`await-push`, or `pushSentAt`) |
105
+ * | `opened-in-commons` | "Opened in Commons" | the approver reported `openedAt` |
106
+ * | `confirming-identity` | "Confirming identity" | the request reported `authorized`; the claim/commit is running |
107
+ * | `identity-confirmed` | "Identity confirmed" | the session was claimed and committed |
108
+ *
109
+ * `opened-in-commons` and `delivered-to-commons` are PROGRESS only — neither is
110
+ * evidence of an approval. Only `authorized` moves the flow forward.
111
+ */
112
+ export type SignInProgress = 'idle' | 'preparing' | 'awaiting-approval' | 'delivered-to-commons' | 'opened-in-commons' | 'confirming-identity' | 'identity-confirmed';
113
+ /**
114
+ * Minimal structural handle over a popup `Window` — just enough for the
115
+ * cross-origin passkey hub flow ({@link AccountDialogController.startPasskeyHubSignIn}):
116
+ * navigate it once the device-flow session's `authorizeCode` is known, detect
117
+ * the user closing it early (`closed`), and close it programmatically on
118
+ * completion/failure. Satisfied directly by `window.open()`'s return value on
119
+ * web; native has no popup concept and never injects an opener.
120
+ */
121
+ export interface PopupWindowHandle {
122
+ readonly closed: boolean;
123
+ close(): void;
124
+ location: {
125
+ href: string;
126
+ };
127
+ }
128
+ /**
129
+ * State of the "Sign in with Oxy" (shared-key / QR) device flow.
130
+ *
131
+ * Everything here is safe to render. The flow's SECRET credential (the
132
+ * device-flow `sessionToken`) is deliberately absent — it never leaves the
133
+ * controller's private field, so no surface, log, or serialized snapshot can
134
+ * leak it.
135
+ */
136
+ export interface SignInFlowState {
137
+ phase: SignInFlowPhase;
138
+ /**
139
+ * The PUBLIC, single-use authorize code (safe to display), or `null`. NOT the
140
+ * secret `sessionToken` — the approver resolves the app identity from this.
141
+ */
142
+ authorizeCode: string | null;
143
+ /**
144
+ * The structured deep-link / QR payload (`oxycommons://approve?...`) to render
145
+ * as a QR (cross-device) and open as a deep link (same-device), or `null`.
146
+ */
147
+ qrPayload: string | null;
148
+ /** Server-authoritative expiry (epoch ms), or `null`. */
149
+ expiresAt: number | null;
150
+ /** Human-readable error for the retry UI, or `null`. */
151
+ error: string | null;
152
+ /**
153
+ * The ONE primary delivery route the controller chose for this request
154
+ * ({@link selectCommonsDelivery}), or `null` while it is still being resolved.
155
+ *
156
+ * There is no chain: exactly one route is primary, and the UI renders exactly
157
+ * one action for it. Alternatives stay behind a "Having trouble?" affordance
158
+ * that the UI reveals on its own terms — see {@link routeFailed}.
159
+ */
160
+ route: CommonsDeliveryRoute | null;
161
+ /**
162
+ * `true` when the chosen primary route could NOT be carried out on this
163
+ * device — today only `'open-commons'` can fail this way (no URL opener was
164
+ * injected, or opening the verified Commons link threw). It is the signal the
165
+ * UI needs to reveal its alternatives; the controller never cascades to
166
+ * another route by itself.
167
+ *
168
+ * A push that reached zero installations is NOT a failure: no capable Commons
169
+ * install is a normal outcome that simply resolves the primary route to
170
+ * `'qr'`.
171
+ */
172
+ routeFailed: boolean;
173
+ /**
174
+ * Server-reported ISO-8601 timestamp of when the request was pushed to a
175
+ * known Commons installation, or `null`. Progress only — never evidence of an
176
+ * approval. Monotone: once observed it is never cleared by a later, emptier
177
+ * poll response.
178
+ */
179
+ pushSentAt: string | null;
180
+ /**
181
+ * Server-reported ISO-8601 timestamp of when the approval route was OPENED in
182
+ * Commons, or `null`. Progress only — never evidence of an approval. Monotone,
183
+ * like {@link pushSentAt}.
184
+ */
185
+ openedAt: string | null;
186
+ /**
187
+ * The derived, ordered progress the surface renders. Always computed from the
188
+ * facts above by {@link deriveSignInProgress} — never assigned directly, so it
189
+ * cannot drift from them or run ahead of a real signal.
190
+ */
191
+ progress: SignInProgress;
192
+ }
193
+ /** Immutable snapshot consumed by `useSyncExternalStore`. */
194
+ export interface AccountDialogSnapshot {
195
+ /** The current view. */
196
+ view: AccountDialogView;
197
+ /**
198
+ * The server-authoritative device directory — principals and the contexts
199
+ * each may act as (ADR 0002) — or `null` before the first read.
200
+ *
201
+ * The ONE read model a switcher renders. The flat list this replaced was
202
+ * keyed by account id, so on a device holding two people it could show one
203
+ * route to a shared organization and never both.
204
+ */
205
+ directory: DeviceDirectory | null;
206
+ /** The active `principal acting as account` pair, actor and subject apart. */
207
+ activeContext: DeviceContext | null;
208
+ /** `true` while the first directory read is in flight with nothing to show. */
209
+ loading: boolean;
210
+ /** A human-readable directory error, or `null`. */
211
+ error: string | null;
212
+ /** The `contextId` of an in-flight activation, or `null`. */
213
+ activatingContextId: string | null;
214
+ /** The `contextId` of an in-flight context removal, or `null`. */
215
+ removingContextId: string | null;
216
+ /** The `principalId` of an in-flight principal removal, or `null`. */
217
+ removingPrincipalId: string | null;
218
+ /** The "Sign in with Oxy" device-flow state. */
219
+ signIn: SignInFlowState;
220
+ /** Whether Commons is installed on this device. See {@link CommonsAvailability}. */
221
+ commonsAvailability: CommonsAvailability;
222
+ }
223
+ /** Construction options for {@link AccountDialogController}. */
224
+ export interface AccountDialogControllerOptions {
225
+ /** The API client. Source of graph accounts, profiles, and the sign-in methods. */
226
+ oxyServices: OxyServices;
227
+ /** The device-first session authority. Source of device rows + the switch path. */
228
+ sessionClient: SessionClient;
229
+ /**
230
+ * The RP's registered OAuth client id (ApplicationCredential publicKey).
231
+ * Required for the QR handoff (`startCommonsSignIn`); when absent, `showQr`
232
+ * fails with a clear configuration error instead of creating a session the
233
+ * server would reject.
234
+ */
235
+ clientId?: string | null;
236
+ /**
237
+ * Commit a freshly-authorized SIGN-IN session (device flow / shared identity)
238
+ * into the host's session set — device-first registration + durable persist +
239
+ * profile hydration. The consumer supplies its provider's commit path
240
+ * (`useOxy().handleWebSession` / the auth-sdk equivalent). Called AFTER the SDK
241
+ * has planted the access token. When omitted the controller falls back to
242
+ * `SessionClient.registerAndActivate` (registration + activation only — no
243
+ * provider-side durable persist/hydration).
244
+ *
245
+ * Sign-in is the only thing that commits a session here. An account SWITCH
246
+ * used to mint one too, on first entry into a graph account; activation mints
247
+ * the delegated session SERVER-side and hands back a bearer, so there is no
248
+ * second commit funnel to keep in step with this one.
249
+ */
250
+ commitSession?: (session: SessionLoginResponse) => Promise<void>;
251
+ /** Notified after a completed sign-in (bearer planted + session committed). */
252
+ onSignedIn?: (user: MinimalUserData) => void;
253
+ /**
254
+ * QR device-flow FALLBACK poll interval in ms (default 12000). The primary
255
+ * approval signal is the `/auth-session` socket's `auth_update` event (instant);
256
+ * this slow poll is only the safety net for when the socket can't connect.
257
+ */
258
+ pollIntervalMs?: number;
259
+ /**
260
+ * Optional injected `socket.io-client` factory, primarily for tests. Without
261
+ * one, the optional transport loads only when QR sign-in starts. The flow subscribes to the
262
+ * `/auth-session` namespace for an INSTANT `auth_update` wake instead of relying
263
+ * on the slow fallback poll. If the package is unavailable, the controller
264
+ * silently degrades to poll-only.
265
+ */
266
+ socketFactory?: SocketIOFactory;
267
+ /**
268
+ * Optional URL opener. When provided, the controller invokes it to deep-link
269
+ * the Commons app for the QR handoff (web: `location.assign`; native:
270
+ * `Linking.openURL`). Headless core never touches `window`/`Linking` itself.
271
+ */
272
+ openUrl?: (url: string) => void;
273
+ /**
274
+ * Optional "can this app open this URL scheme?" probe, symmetric to
275
+ * {@link openUrl}. When provided, `showQr` uses it to detect an installed
276
+ * Commons (`oxycommons://`) and, if present, deep-links straight into its
277
+ * approve screen via {@link openUrl} — while KEEPING the QR/polling active as
278
+ * the fallback. Injected by the provider (native: `Linking.canOpenURL`; web:
279
+ * absent/false). Headless core never touches `Linking` itself; when absent
280
+ * `showQr` behaves exactly as before (render QR only).
281
+ */
282
+ canOpenApp?: (url: string) => Promise<boolean>;
283
+ /**
284
+ * Open a new, empty popup window SYNCHRONOUSLY (before any `await`) so the
285
+ * browser attributes it to the click gesture that triggered it, returning a
286
+ * handle to navigate once the device-flow session is known — or `null` if
287
+ * the popup was blocked. Injected by the provider (web only:
288
+ * `window.open('', ...)`; absent on native, where the hub-popup flow does
289
+ * not apply). Used by {@link AccountDialogController.startPasskeyHubSignIn}.
290
+ */
291
+ openPopup?: () => PopupWindowHandle | null;
292
+ /**
293
+ * Base origin of the auth.oxy.so passkey hub (defaults to
294
+ * `https://auth.${CENTRAL_IDP_APEX}`). Overridable for local/staging testing.
295
+ */
296
+ hubBaseUrl?: string;
297
+ /**
298
+ * Which surface the sign-in is initiated from — a FACT supplied by the
299
+ * consumer, because only the consumer can classify its own environment
300
+ * (native → `'mobile'`; web → `'mobile'` for a mobile browser, `'desktop'`
301
+ * otherwise). Headless core never sniffs a user agent or a platform global.
302
+ *
303
+ * Feeds {@link selectCommonsDelivery} verbatim. Defaults to `'unknown'`,
304
+ * which is a first-class value there: an unclassified surface never opts into
305
+ * the deep-link route, because a custom-scheme navigation that does not
306
+ * resolve is a dead end with no automatic way back.
307
+ */
308
+ platform?: CommonsDeliveryPlatform;
309
+ }
310
+ type SnapshotListener = (snapshot: AccountDialogSnapshot) => void;
311
+ export declare class AccountDialogController {
312
+ private readonly oxyServices;
313
+ private readonly sessionClient;
314
+ private readonly clientId;
315
+ private readonly commitSession?;
316
+ private readonly onSignedIn?;
317
+ private readonly pollIntervalMs;
318
+ private readonly openUrl?;
319
+ private readonly canOpenApp?;
320
+ private readonly socketFactory?;
321
+ private readonly openPopup?;
322
+ private readonly hubBaseUrl;
323
+ private readonly platform;
324
+ private readonly listeners;
325
+ private view;
326
+ private loading;
327
+ private error;
328
+ private activatingContextId;
329
+ private removingContextId;
330
+ private removingPrincipalId;
331
+ private signIn;
332
+ private commonsAvailability;
333
+ /** The secret device-flow token of the active QR flow (never surfaced). */
334
+ private signInToken;
335
+ private pollTimer;
336
+ /**
337
+ * The `/auth-session` socket for the active QR flow, or null (poll-only). Its
338
+ * `auth_update` event wakes {@link pollOnce} instantly instead of waiting for the
339
+ * slow fallback timer.
340
+ */
341
+ private authSessionSocket;
342
+ /**
343
+ * Guards {@link pollOnce} against re-entrancy: the fallback timer and a socket
344
+ * `auth_update` wake can fire together — without this both could claim the
345
+ * single-use token concurrently.
346
+ */
347
+ private pollInFlight;
348
+ /** The popup opened by {@link startPasskeyHubSignIn}, or `null`. */
349
+ private activePopup;
350
+ /** Watches {@link activePopup}'s `closed` state; see {@link watchPopup}. */
351
+ private popupWatchTimer;
352
+ private unsubscribeSession;
353
+ private unsubscribeTokens;
354
+ /** Last-observed SDK auth readiness (a planted bearer). Drives the fetch edge. */
355
+ private authed;
356
+ private started;
357
+ private refreshSeq;
358
+ private snapshot;
359
+ constructor(options: AccountDialogControllerOptions);
360
+ /** Returns the current immutable snapshot (stable reference between changes). */
361
+ getSnapshot(): AccountDialogSnapshot;
362
+ /** Subscribe to snapshot changes. Returns an unsubscribe function. */
363
+ subscribe(listener: SnapshotListener): () => void;
364
+ /**
365
+ * Begin driving the dialog: subscribe to `SessionClient` state and load the
366
+ * account list. Idempotent — a second `start()` is a no-op. Pair with
367
+ * {@link destroy}.
368
+ */
369
+ start(): void;
370
+ /**
371
+ * Stop driving the dialog: unsubscribe from `SessionClient` and tear down the
372
+ * active sign-in flow (timers). Idempotent.
373
+ */
374
+ destroy(): void;
375
+ /**
376
+ * Whether a PRIVATE endpoint may be called right now. Mirrors the
377
+ * `hasAccessToken` term of `OxyContext.canUsePrivateApi`
378
+ * (`authResolved && isAuthenticated && tokenReady && hasAccessToken`, where
379
+ * `hasAccessToken = Boolean(oxyServices.getAccessToken())`): a planted bearer
380
+ * is the only term that decides whether a request carries auth — the other
381
+ * three are provider render-lifecycle gates with no headless equivalent.
382
+ *
383
+ * `listAccounts()` (`GET /accounts`) and `getUsersByIds()`
384
+ * (`POST /users/by-ids`) are private; calling either before cold-boot restore
385
+ * plants the token 401s → `HttpService` clears the bearer + emits
386
+ * `onTokensChanged(null)` → the app signs out. Every graph/profile fetch gates
387
+ * on this.
388
+ */
389
+ private isAuthenticated;
390
+ /**
391
+ * Reconcile the account graph against the current auth-readiness edge. On the
392
+ * signed-out → signed-in edge fetch the graph ONCE; on signed-in → signed-out
393
+ * drop it and re-project device-only. A no-op when readiness is unchanged, so
394
+ * a burst of token events / device pushes cannot restart the fetch — and a
395
+ * failed `listAccounts()` never flips the edge, so it cannot re-trigger itself
396
+ * (no retry storm).
397
+ */
398
+ private reconcileAuth;
399
+ /** Set the dialog view directly. */
400
+ setView(view: AccountDialogView): void;
401
+ /** Switch to the "add account" view (the sign-in entry chooser). */
402
+ add(): void;
403
+ /** Switch to the "create account" view (passkey / Commons signup entry). */
404
+ startSignup(): void;
405
+ /**
406
+ * Re-read `GET /session/device/directory`. Safe to call repeatedly;
407
+ * concurrent calls are reconciled by a sequence guard so a slow earlier read
408
+ * never overwrites a newer result.
409
+ *
410
+ * This is ONE request. It used to be three — the directory, plus
411
+ * `listAccounts()` and `getUsersByIds()` to rebuild the same tree client-side
412
+ * — and the reconstruction was not merely redundant: it enumerated the
413
+ * CALLER's account graph, which on a device holding two people is one
414
+ * person's answer presented as the device's.
415
+ */
416
+ refresh(): Promise<void>;
417
+ /**
418
+ * Activate one `principal acting as account` context — the ADR 0002 switch,
419
+ * and the one that can express what an account id cannot: WHICH person's
420
+ * route to a shared organization to become.
421
+ *
422
+ * There is no on-device/graph fork. The directory has a row for a context the
423
+ * principal may act as but has never entered, and `POST /session/device/
424
+ * activate` reuses or mints the delegated session server-side, so one call
425
+ * covers both cases.
426
+ *
427
+ * A context id is not stable across a removal, so a stale one is an ordinary
428
+ * outcome rather than a bug: the server answers 404 or 403, heals the row, and
429
+ * the refresh below re-reads a directory that no longer offers it.
430
+ */
431
+ activateContext(contextId: string): Promise<boolean>;
432
+ /**
433
+ * Remove ONE `principal → account` pair, and only that pair.
434
+ *
435
+ * Not the account across the device: the same organization reached through a
436
+ * second person is a different session with a different audit actor, and it
437
+ * stays. Routing this through `signOut({accountId})` would revoke that second
438
+ * person's access as a side effect of one person tidying their own list.
439
+ *
440
+ * The removed pair is not gone for good while the membership lives — the
441
+ * server offers it again on the next read, under a NEW id and at an unchanged
442
+ * revision — so nothing may hold a context id across this call.
443
+ */
444
+ signOutContext(contextId: string): Promise<boolean>;
445
+ /**
446
+ * Remove ONE PERSON and every context they reach — and nobody else's,
447
+ * including when another principal independently operates the same account.
448
+ *
449
+ * A separate call from {@link signOutContext} because it is a separate
450
+ * question, not a loop over the first one: the server removes the principal
451
+ * and elects a replacement active context in one transition.
452
+ */
453
+ signOutPrincipal(principalId: string): Promise<boolean>;
454
+ /**
455
+ * Start "Sign in with Oxy". Native devices with a shared identity mint a
456
+ * session silently (`signInWithSharedIdentity`); everything else (web, or a
457
+ * native device without a shared identity) falls through to the cross-device
458
+ * QR handoff.
459
+ */
460
+ signInWithOxy(): Promise<void>;
461
+ /**
462
+ * Begin (or restart) the cross-device QR handoff: create a device-flow
463
+ * session, surface its `authorizeCode` + `qrPayload`, and poll for approval.
464
+ * On approval the secret token is exchanged (`claimSessionByToken`) and the
465
+ * session committed. Requires `clientId`.
466
+ */
467
+ showQr(): Promise<void>;
468
+ /**
469
+ * Web-only: "Sign in with a passkey" on a non-Oxy origin cannot run the
470
+ * WebAuthn ceremony locally — a credential minted with `WEBAUTHN_RP_ID=oxy.so`
471
+ * can only be asserted from `oxy.so`/a subdomain/loopback, a browser-enforced
472
+ * boundary `isOxyRpOrigin()` (consumer-side) already gates on. Instead, open
473
+ * a popup at the auth.oxy.so passkey hub, scoped to the SAME device-flow
474
+ * session {@link showQr} would create (same `authorizeCode`/`sessionToken`
475
+ * pair), and let the SAME poll/socket/claim engine complete it once the hub
476
+ * authorizes the session (`POST /auth/session/authorize-code/:authorizeCode`,
477
+ * bearer-authed, server-side — this method never sees or transmits the
478
+ * secret `sessionToken`).
479
+ *
480
+ * The popup MUST be opened synchronously, before any `await`, or the
481
+ * browser's popup blocker loses the click-gesture attribution and silently
482
+ * blocks it — so {@link openPopup} is invoked as the very first step, before
483
+ * the device-flow session (which needs an async call) even exists. If the
484
+ * popup is blocked (or no `openPopup` was injected), this falls back to
485
+ * `showQr`'s plain QR rendering — no dead end.
486
+ */
487
+ startPasskeyHubSignIn(): Promise<void>;
488
+ /**
489
+ * Shared device-flow session creation for both {@link showQr} (renders the
490
+ * QR) and {@link startPasskeyHubSignIn} (also opens the hub popup) — the
491
+ * same `startCommonsSignIn` → poll/socket wiring either way. Returns the
492
+ * handle on success (already reflected in `signIn`), or `null` on failure
493
+ * (already set as `signIn.error`).
494
+ *
495
+ * @param opts.deliver - Whether to run automatic Commons delivery selection
496
+ * ({@link resolveDeliveryRoute}). `true` for the normal one-primary-action
497
+ * entry; `false` when the caller already owns the primary surface (the
498
+ * passkey hub popup), where the request's Commons route is simply the QR.
499
+ */
500
+ private startDeviceFlowSession;
501
+ /**
502
+ * Choose and carry out the ONE primary delivery route for the active request
503
+ * (issue #691, "Automatic delivery selection").
504
+ *
505
+ * The controller gathers the facts — is a verified Commons link openable on
506
+ * THIS device, and how many known Commons installations did Oxy actually push
507
+ * to — and hands them to the pure {@link selectCommonsDelivery}. The selector
508
+ * owns the decision; this method owns only the observations and the single
509
+ * action the chosen route implies. It never cascades: a route that yields
510
+ * nothing resolves to QR *before* a route is chosen, never after.
511
+ */
512
+ private resolveDeliveryRoute;
513
+ /**
514
+ * Whether `sessionToken` is still THE request this surface is waiting on.
515
+ *
516
+ * Guards every step of the asynchronous route resolution: a cancelled,
517
+ * superseded, failed, or already-approved flow must neither open Commons nor
518
+ * mutate the surface — an approval that lands mid-resolution would otherwise
519
+ * be followed by a pointless app switch.
520
+ */
521
+ private isAwaitingApproval;
522
+ /**
523
+ * Ask Oxy to deliver the pending request to the identity's known Commons
524
+ * installations, returning how many it reached (`0` when delivery is not
525
+ * applicable, not permitted, or reached nobody).
526
+ *
527
+ * Two hard rules, both from the issue:
528
+ * - **Never push from an unauthenticated surface.** `deliverCommonsSignIn`
529
+ * is bearer-required precisely because a request that merely carries a
530
+ * typed-in username must never be able to ring somebody's phone. Without a
531
+ * planted bearer the call is not made AT ALL — not made-and-failed.
532
+ * - **Zero targets and a failed delivery are the same normal outcome.** Both
533
+ * return `0`, which resolves the primary route to QR silently. Neither is
534
+ * surfaced as an error: there is nothing the user did wrong and nothing for
535
+ * them to fix.
536
+ */
537
+ private deliverToKnownCommons;
538
+ /**
539
+ * Open the verified Commons link for the `'open-commons'` route. Returns
540
+ * whether the navigation was actually handed off, so a missing opener or a
541
+ * throwing one becomes an observable `routeFailed` instead of a silent dead
542
+ * end the user stares at.
543
+ */
544
+ private openCommonsLink;
545
+ /**
546
+ * Poll {@link PopupWindowHandle.closed} so a user who dismisses the hub
547
+ * popup without completing sign-in gets prompt feedback (there is no DOM
548
+ * event for a cross-origin popup closing — polling is the only mechanism).
549
+ * Cleared by {@link closeActivePopup}, which every sign-in exit path already
550
+ * calls.
551
+ */
552
+ private watchPopup;
553
+ private clearPopupWatchTimer;
554
+ /** Tear down the popup watch timer and close the popup, if any. Idempotent. */
555
+ private closeActivePopup;
556
+ /**
557
+ * Resolve whether Commons is installed on this device via the injected
558
+ * `canOpenApp` probe, updating {@link commonsAvailability} as durable,
559
+ * observable snapshot state. Native only — a no-op when `canOpenApp` was
560
+ * not injected (web), where `commonsAvailability` stays `'unknown'` forever
561
+ * and the QR view renders unconditionally (no gating).
562
+ *
563
+ * Replaces the old `maybeOpenCommons` fire-and-forget probe, whose outcome
564
+ * was only ever reflected by whether Commons silently opened — a probe
565
+ * failure or "not installed" answer was swallowed into a debug log with no
566
+ * way for the UI to react. `commonsAvailability` fixes that.
567
+ */
568
+ private resolveCommonsAvailability;
569
+ /**
570
+ * Tear down the active sign-in device flow (timers + socket + popup + token),
571
+ * WITHDRAW the request server-side, and reset to idle.
572
+ *
573
+ * Cancellation has to converge in both directions: the surface closing must
574
+ * cancel the request, not just stop listening to it. Without the withdrawal a
575
+ * dismissed QR would stay approvable until it expired, so a later scan of a
576
+ * stale code could authorize a session nobody is waiting for.
577
+ */
578
+ cancelSignIn(): void;
579
+ /**
580
+ * Best-effort server-side withdrawal of a request this surface abandoned
581
+ * (`POST /auth/session/deny/:authorizeCode`). Fire-and-forget by design: the
582
+ * local teardown already happened, and a race with an approval that just
583
+ * landed legitimately rejects here — neither outcome is worth surfacing.
584
+ */
585
+ private withdrawRequest;
586
+ private scheduleNextPoll;
587
+ /**
588
+ * Run one status check + (on approval) claim. Triggered by the fallback timer
589
+ * AND by the `/auth-session` socket's `auth_update` wake, so it is guarded
590
+ * against concurrent entry: whichever fires first claims the single-use token;
591
+ * the other no-ops. The `auth_update` payload is never trusted — this always
592
+ * re-checks the authoritative status via `pollCommonsSignIn`.
593
+ */
594
+ private pollOnce;
595
+ /**
596
+ * Record server-reported delivery progress on the active flow.
597
+ *
598
+ * Monotone and additive: a timestamp is only ever adopted, never replaced or
599
+ * cleared, so an older API build (or a partial payload) that omits a field can
600
+ * at most fail to advance the surface — it can never walk it backwards.
601
+ * Emits only on a real change, so a steady poll does not churn the snapshot.
602
+ */
603
+ private recordDeliveryProgress;
604
+ private claimAndComplete;
605
+ /**
606
+ * Commit an authorized session, notify, and return to the account list. Shared
607
+ * by the shared-key, QR, and mint-switch paths so they cannot drift.
608
+ */
609
+ private completeSignIn;
610
+ /**
611
+ * Register a token-planted session into the device set. Prefers the
612
+ * consumer's commit funnel (durable persist + hydration); falls back to
613
+ * `SessionClient.registerAndActivate` (registration + activation only).
614
+ */
615
+ private commitAuthorizedSession;
616
+ private failSignIn;
617
+ private clearPollTimer;
618
+ /**
619
+ * Subscribe the active QR flow to the `/auth-session` namespace so the API's
620
+ * `auth_update` event wakes {@link pollOnce} the instant the approval lands.
621
+ *
622
+ * The join is keyed by the secret `sessionToken` (the server's `auth:<token>`
623
+ * room, joined by emitting `join`) and re-issued on every (re)connect so it
624
+ * survives socket drops. `auth_update` is treated as a pure SIGNAL — the payload
625
+ * is never trusted; `pollOnce` re-checks the authoritative status and claims.
626
+ *
627
+ * No-op (poll-only) when the optional socket transport is unavailable. The
628
+ * namespace needs no auth.
629
+ */
630
+ private openAuthSessionSocket;
631
+ /** Tear down the `/auth-session` socket, if any. Idempotent. */
632
+ private closeAuthSessionSocket;
633
+ /**
634
+ * Replace the device-flow state from its FACTS, re-deriving `progress`. The
635
+ * only writer of `this.signIn` besides the two terminal constants — which is
636
+ * what keeps `progress` impossible to set by hand, and therefore impossible
637
+ * to advance without a fact behind it.
638
+ */
639
+ private setSignIn;
640
+ /** Update a subset of the device-flow facts, re-deriving `progress`. */
641
+ private patchSignIn;
642
+ private computeSnapshot;
643
+ /** Recompute the snapshot and notify subscribers. */
644
+ private emit;
645
+ }
646
+ /** Factory mirroring `createSessionClient`, for ergonomic wiring by consumers. */
647
+ export declare function createAccountDialogController(options: AccountDialogControllerOptions): AccountDialogController;
648
+ export {};