@oxyhq/services 28.0.0 → 29.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 (324) hide show
  1. package/NOTICE +10 -9
  2. package/README.md +65 -2
  3. package/android/src/main/java/so/oxy/devicesession/OxyDeviceSessionModule.kt +178 -0
  4. package/android/src/main/java/so/oxy/devicesession/OxyDeviceSessionProvider.kt +99 -0
  5. package/android/src/main/java/so/oxy/devicesession/OxyDeviceSessionStore.kt +115 -0
  6. package/expo-module.config.json +1 -0
  7. package/lib/commonjs/index.js +60 -16
  8. package/lib/commonjs/index.js.map +1 -1
  9. package/lib/commonjs/ui/boot/runProviderColdBoot.js +7 -0
  10. package/lib/commonjs/ui/boot/runProviderColdBoot.js.map +1 -1
  11. package/lib/commonjs/ui/client.js +12 -7
  12. package/lib/commonjs/ui/client.js.map +1 -1
  13. package/lib/commonjs/ui/components/OxyAccountDialogScreen.js +10 -27
  14. package/lib/commonjs/ui/components/OxyAccountDialogScreen.js.map +1 -1
  15. package/lib/commonjs/ui/components/OxyAuthChooser.js +132 -44
  16. package/lib/commonjs/ui/components/OxyAuthChooser.js.map +1 -1
  17. package/lib/commonjs/ui/components/OxyProvider.js +4 -2
  18. package/lib/commonjs/ui/components/OxyProvider.js.map +1 -1
  19. package/lib/commonjs/ui/components/SurfaceScreen.js +31 -3
  20. package/lib/commonjs/ui/components/SurfaceScreen.js.map +1 -1
  21. package/lib/commonjs/ui/components/authChooser/AccountsMenuView.js +209 -84
  22. package/lib/commonjs/ui/components/authChooser/AccountsMenuView.js.map +1 -1
  23. package/lib/commonjs/ui/components/authChooser/SignInEntryView.js +25 -7
  24. package/lib/commonjs/ui/components/authChooser/SignInEntryView.js.map +1 -1
  25. package/lib/commonjs/ui/components/authChooser/primitives.js +35 -22
  26. package/lib/commonjs/ui/components/authChooser/primitives.js.map +1 -1
  27. package/lib/commonjs/ui/components/authChooser/types.js +11 -0
  28. package/lib/commonjs/ui/components/authChooser/types.js.map +1 -1
  29. package/lib/commonjs/ui/context/OxyContext.js +257 -306
  30. package/lib/commonjs/ui/context/OxyContext.js.map +1 -1
  31. package/lib/commonjs/ui/context/hooks/useAuthOperations.js +27 -37
  32. package/lib/commonjs/ui/context/hooks/useAuthOperations.js.map +1 -1
  33. package/lib/commonjs/ui/context/oxyContextHelpers.js +0 -29
  34. package/lib/commonjs/ui/context/oxyContextHelpers.js.map +1 -1
  35. package/lib/commonjs/ui/context/useOxyAccountGraph.js +6 -17
  36. package/lib/commonjs/ui/context/useOxyAccountGraph.js.map +1 -1
  37. package/lib/commonjs/ui/hooks/accountDialogSnapshot.js +42 -0
  38. package/lib/commonjs/ui/hooks/accountDialogSnapshot.js.map +1 -0
  39. package/lib/commonjs/ui/hooks/mutations/useAccountMutations.js +0 -19
  40. package/lib/commonjs/ui/hooks/mutations/useAccountMutations.js.map +1 -1
  41. package/lib/commonjs/ui/hooks/useDeviceSwitcher.js +57 -0
  42. package/lib/commonjs/ui/hooks/useDeviceSwitcher.js.map +1 -0
  43. package/lib/commonjs/ui/hooks/useI18n.js +22 -3
  44. package/lib/commonjs/ui/hooks/useI18n.js.map +1 -1
  45. package/lib/commonjs/ui/hooks/useSessionManagement.js +46 -153
  46. package/lib/commonjs/ui/hooks/useSessionManagement.js.map +1 -1
  47. package/lib/commonjs/ui/index.js +12 -7
  48. package/lib/commonjs/ui/index.js.map +1 -1
  49. package/lib/commonjs/ui/navigation/routes.js +85 -73
  50. package/lib/commonjs/ui/navigation/routes.js.map +1 -1
  51. package/lib/commonjs/ui/navigation/surfaces.js +8 -7
  52. package/lib/commonjs/ui/navigation/surfaces.js.map +1 -1
  53. package/lib/commonjs/ui/runtime/createOxyRuntime.js +433 -0
  54. package/lib/commonjs/ui/runtime/createOxyRuntime.js.map +1 -0
  55. package/lib/commonjs/ui/runtime/index.js +63 -0
  56. package/lib/commonjs/ui/runtime/index.js.map +1 -0
  57. package/lib/commonjs/ui/runtime/runtimeContext.js +83 -0
  58. package/lib/commonjs/ui/runtime/runtimeContext.js.map +1 -0
  59. package/lib/commonjs/ui/runtime/types.js +6 -0
  60. package/lib/commonjs/ui/runtime/types.js.map +1 -0
  61. package/lib/commonjs/ui/runtime/useRuntimeSnapshot.js +57 -0
  62. package/lib/commonjs/ui/runtime/useRuntimeSnapshot.js.map +1 -0
  63. package/lib/commonjs/ui/server.js +1 -2
  64. package/lib/commonjs/ui/server.js.map +1 -1
  65. package/lib/commonjs/ui/session/authStore.js +45 -9
  66. package/lib/commonjs/ui/session/authStore.js.map +1 -1
  67. package/lib/commonjs/ui/session/sharedDeviceCredentialStore.js +306 -0
  68. package/lib/commonjs/ui/session/sharedDeviceCredentialStore.js.map +1 -0
  69. package/lib/commonjs/ui/stores/authStore.js +154 -55
  70. package/lib/commonjs/ui/stores/authStore.js.map +1 -1
  71. package/lib/commonjs/ui/utils/avatarUtils.js +2 -36
  72. package/lib/commonjs/ui/utils/avatarUtils.js.map +1 -1
  73. package/lib/module/index.js +16 -8
  74. package/lib/module/index.js.map +1 -1
  75. package/lib/module/ui/boot/runProviderColdBoot.js +7 -0
  76. package/lib/module/ui/boot/runProviderColdBoot.js.map +1 -1
  77. package/lib/module/ui/client.js +1 -2
  78. package/lib/module/ui/client.js.map +1 -1
  79. package/lib/module/ui/components/OxyAccountDialogScreen.js +10 -27
  80. package/lib/module/ui/components/OxyAccountDialogScreen.js.map +1 -1
  81. package/lib/module/ui/components/OxyAuthChooser.js +134 -44
  82. package/lib/module/ui/components/OxyAuthChooser.js.map +1 -1
  83. package/lib/module/ui/components/OxyProvider.js +5 -3
  84. package/lib/module/ui/components/OxyProvider.js.map +1 -1
  85. package/lib/module/ui/components/SurfaceScreen.js +33 -5
  86. package/lib/module/ui/components/SurfaceScreen.js.map +1 -1
  87. package/lib/module/ui/components/authChooser/AccountsMenuView.js +210 -85
  88. package/lib/module/ui/components/authChooser/AccountsMenuView.js.map +1 -1
  89. package/lib/module/ui/components/authChooser/SignInEntryView.js +25 -7
  90. package/lib/module/ui/components/authChooser/SignInEntryView.js.map +1 -1
  91. package/lib/module/ui/components/authChooser/primitives.js +35 -22
  92. package/lib/module/ui/components/authChooser/primitives.js.map +1 -1
  93. package/lib/module/ui/components/authChooser/types.js +11 -0
  94. package/lib/module/ui/components/authChooser/types.js.map +1 -1
  95. package/lib/module/ui/context/OxyContext.js +251 -303
  96. package/lib/module/ui/context/OxyContext.js.map +1 -1
  97. package/lib/module/ui/context/hooks/useAuthOperations.js +27 -37
  98. package/lib/module/ui/context/hooks/useAuthOperations.js.map +1 -1
  99. package/lib/module/ui/context/oxyContextHelpers.js +0 -28
  100. package/lib/module/ui/context/oxyContextHelpers.js.map +1 -1
  101. package/lib/module/ui/context/useOxyAccountGraph.js +6 -17
  102. package/lib/module/ui/context/useOxyAccountGraph.js.map +1 -1
  103. package/lib/module/ui/hooks/accountDialogSnapshot.js +38 -0
  104. package/lib/module/ui/hooks/accountDialogSnapshot.js.map +1 -0
  105. package/lib/module/ui/hooks/mutations/useAccountMutations.js +0 -19
  106. package/lib/module/ui/hooks/mutations/useAccountMutations.js.map +1 -1
  107. package/lib/module/ui/hooks/useDeviceSwitcher.js +53 -0
  108. package/lib/module/ui/hooks/useDeviceSwitcher.js.map +1 -0
  109. package/lib/module/ui/hooks/useI18n.js +24 -4
  110. package/lib/module/ui/hooks/useI18n.js.map +1 -1
  111. package/lib/module/ui/hooks/useSessionManagement.js +47 -155
  112. package/lib/module/ui/hooks/useSessionManagement.js.map +1 -1
  113. package/lib/module/ui/index.js +1 -2
  114. package/lib/module/ui/index.js.map +1 -1
  115. package/lib/module/ui/navigation/routes.js +84 -72
  116. package/lib/module/ui/navigation/routes.js.map +1 -1
  117. package/lib/module/ui/navigation/surfaces.js +6 -6
  118. package/lib/module/ui/navigation/surfaces.js.map +1 -1
  119. package/lib/module/ui/runtime/createOxyRuntime.js +430 -0
  120. package/lib/module/ui/runtime/createOxyRuntime.js.map +1 -0
  121. package/lib/module/ui/runtime/index.js +15 -0
  122. package/lib/module/ui/runtime/index.js.map +1 -0
  123. package/lib/module/ui/runtime/runtimeContext.js +75 -0
  124. package/lib/module/ui/runtime/runtimeContext.js.map +1 -0
  125. package/lib/module/ui/runtime/types.js +4 -0
  126. package/lib/module/ui/runtime/types.js.map +1 -0
  127. package/lib/module/ui/runtime/useRuntimeSnapshot.js +52 -0
  128. package/lib/module/ui/runtime/useRuntimeSnapshot.js.map +1 -0
  129. package/lib/module/ui/server.js +0 -1
  130. package/lib/module/ui/server.js.map +1 -1
  131. package/lib/module/ui/session/authStore.js +46 -11
  132. package/lib/module/ui/session/authStore.js.map +1 -1
  133. package/lib/module/ui/session/sharedDeviceCredentialStore.js +302 -0
  134. package/lib/module/ui/session/sharedDeviceCredentialStore.js.map +1 -0
  135. package/lib/module/ui/stores/authStore.js +154 -55
  136. package/lib/module/ui/stores/authStore.js.map +1 -1
  137. package/lib/module/ui/utils/avatarUtils.js +2 -35
  138. package/lib/module/ui/utils/avatarUtils.js.map +1 -1
  139. package/lib/typescript/commonjs/index.d.ts +5 -3
  140. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  141. package/lib/typescript/commonjs/ui/boot/runProviderColdBoot.d.ts.map +1 -1
  142. package/lib/typescript/commonjs/ui/client.d.ts +1 -2
  143. package/lib/typescript/commonjs/ui/client.d.ts.map +1 -1
  144. package/lib/typescript/commonjs/ui/components/OxyAccountDialogScreen.d.ts.map +1 -1
  145. package/lib/typescript/commonjs/ui/components/OxyAuthChooser.d.ts.map +1 -1
  146. package/lib/typescript/commonjs/ui/components/OxyProvider.d.ts.map +1 -1
  147. package/lib/typescript/commonjs/ui/components/SurfaceScreen.d.ts.map +1 -1
  148. package/lib/typescript/commonjs/ui/components/authChooser/AccountsMenuView.d.ts +11 -4
  149. package/lib/typescript/commonjs/ui/components/authChooser/AccountsMenuView.d.ts.map +1 -1
  150. package/lib/typescript/commonjs/ui/components/authChooser/SignInEntryView.d.ts +3 -1
  151. package/lib/typescript/commonjs/ui/components/authChooser/SignInEntryView.d.ts.map +1 -1
  152. package/lib/typescript/commonjs/ui/components/authChooser/primitives.d.ts +18 -6
  153. package/lib/typescript/commonjs/ui/components/authChooser/primitives.d.ts.map +1 -1
  154. package/lib/typescript/commonjs/ui/components/authChooser/types.d.ts +33 -1
  155. package/lib/typescript/commonjs/ui/components/authChooser/types.d.ts.map +1 -1
  156. package/lib/typescript/commonjs/ui/context/OxyContext.d.ts +35 -4
  157. package/lib/typescript/commonjs/ui/context/OxyContext.d.ts.map +1 -1
  158. package/lib/typescript/commonjs/ui/context/hooks/useAuthOperations.d.ts +8 -12
  159. package/lib/typescript/commonjs/ui/context/hooks/useAuthOperations.d.ts.map +1 -1
  160. package/lib/typescript/commonjs/ui/context/oxyContextHelpers.d.ts +0 -2
  161. package/lib/typescript/commonjs/ui/context/oxyContextHelpers.d.ts.map +1 -1
  162. package/lib/typescript/commonjs/ui/context/oxyContextTypes.d.ts +9 -1
  163. package/lib/typescript/commonjs/ui/context/oxyContextTypes.d.ts.map +1 -1
  164. package/lib/typescript/commonjs/ui/context/useOxyAccountGraph.d.ts +1 -3
  165. package/lib/typescript/commonjs/ui/context/useOxyAccountGraph.d.ts.map +1 -1
  166. package/lib/typescript/commonjs/ui/hooks/accountDialogSnapshot.d.ts +15 -0
  167. package/lib/typescript/commonjs/ui/hooks/accountDialogSnapshot.d.ts.map +1 -0
  168. package/lib/typescript/commonjs/ui/hooks/mutations/useAccountMutations.d.ts.map +1 -1
  169. package/lib/typescript/commonjs/ui/hooks/useDeviceSwitcher.d.ts +49 -0
  170. package/lib/typescript/commonjs/ui/hooks/useDeviceSwitcher.d.ts.map +1 -0
  171. package/lib/typescript/commonjs/ui/hooks/useI18n.d.ts +13 -0
  172. package/lib/typescript/commonjs/ui/hooks/useI18n.d.ts.map +1 -1
  173. package/lib/typescript/commonjs/ui/hooks/useSessionManagement.d.ts +23 -18
  174. package/lib/typescript/commonjs/ui/hooks/useSessionManagement.d.ts.map +1 -1
  175. package/lib/typescript/commonjs/ui/index.d.ts +1 -2
  176. package/lib/typescript/commonjs/ui/index.d.ts.map +1 -1
  177. package/lib/typescript/commonjs/ui/navigation/routes.d.ts +15 -1
  178. package/lib/typescript/commonjs/ui/navigation/routes.d.ts.map +1 -1
  179. package/lib/typescript/commonjs/ui/navigation/surfaces.d.ts.map +1 -1
  180. package/lib/typescript/commonjs/ui/runtime/createOxyRuntime.d.ts +144 -0
  181. package/lib/typescript/commonjs/ui/runtime/createOxyRuntime.d.ts.map +1 -0
  182. package/lib/typescript/commonjs/ui/runtime/index.d.ts +16 -0
  183. package/lib/typescript/commonjs/ui/runtime/index.d.ts.map +1 -0
  184. package/lib/typescript/commonjs/ui/runtime/runtimeContext.d.ts +43 -0
  185. package/lib/typescript/commonjs/ui/runtime/runtimeContext.d.ts.map +1 -0
  186. package/lib/typescript/commonjs/ui/runtime/types.d.ts +89 -0
  187. package/lib/typescript/commonjs/ui/runtime/types.d.ts.map +1 -0
  188. package/lib/typescript/commonjs/ui/runtime/useRuntimeSnapshot.d.ts +23 -0
  189. package/lib/typescript/commonjs/ui/runtime/useRuntimeSnapshot.d.ts.map +1 -0
  190. package/lib/typescript/commonjs/ui/server.d.ts +0 -1
  191. package/lib/typescript/commonjs/ui/server.d.ts.map +1 -1
  192. package/lib/typescript/commonjs/ui/session/authStore.d.ts +60 -9
  193. package/lib/typescript/commonjs/ui/session/authStore.d.ts.map +1 -1
  194. package/lib/typescript/commonjs/ui/session/sharedDeviceCredentialStore.d.ts +32 -0
  195. package/lib/typescript/commonjs/ui/session/sharedDeviceCredentialStore.d.ts.map +1 -0
  196. package/lib/typescript/commonjs/ui/stores/authStore.d.ts +49 -5
  197. package/lib/typescript/commonjs/ui/stores/authStore.d.ts.map +1 -1
  198. package/lib/typescript/commonjs/ui/types/navigation.d.ts +26 -0
  199. package/lib/typescript/commonjs/ui/types/navigation.d.ts.map +1 -1
  200. package/lib/typescript/commonjs/ui/utils/avatarUtils.d.ts +2 -10
  201. package/lib/typescript/commonjs/ui/utils/avatarUtils.d.ts.map +1 -1
  202. package/lib/typescript/module/index.d.ts +5 -3
  203. package/lib/typescript/module/index.d.ts.map +1 -1
  204. package/lib/typescript/module/ui/boot/runProviderColdBoot.d.ts.map +1 -1
  205. package/lib/typescript/module/ui/client.d.ts +1 -2
  206. package/lib/typescript/module/ui/client.d.ts.map +1 -1
  207. package/lib/typescript/module/ui/components/OxyAccountDialogScreen.d.ts.map +1 -1
  208. package/lib/typescript/module/ui/components/OxyAuthChooser.d.ts.map +1 -1
  209. package/lib/typescript/module/ui/components/OxyProvider.d.ts.map +1 -1
  210. package/lib/typescript/module/ui/components/SurfaceScreen.d.ts.map +1 -1
  211. package/lib/typescript/module/ui/components/authChooser/AccountsMenuView.d.ts +11 -4
  212. package/lib/typescript/module/ui/components/authChooser/AccountsMenuView.d.ts.map +1 -1
  213. package/lib/typescript/module/ui/components/authChooser/SignInEntryView.d.ts +3 -1
  214. package/lib/typescript/module/ui/components/authChooser/SignInEntryView.d.ts.map +1 -1
  215. package/lib/typescript/module/ui/components/authChooser/primitives.d.ts +18 -6
  216. package/lib/typescript/module/ui/components/authChooser/primitives.d.ts.map +1 -1
  217. package/lib/typescript/module/ui/components/authChooser/types.d.ts +33 -1
  218. package/lib/typescript/module/ui/components/authChooser/types.d.ts.map +1 -1
  219. package/lib/typescript/module/ui/context/OxyContext.d.ts +35 -4
  220. package/lib/typescript/module/ui/context/OxyContext.d.ts.map +1 -1
  221. package/lib/typescript/module/ui/context/hooks/useAuthOperations.d.ts +8 -12
  222. package/lib/typescript/module/ui/context/hooks/useAuthOperations.d.ts.map +1 -1
  223. package/lib/typescript/module/ui/context/oxyContextHelpers.d.ts +0 -2
  224. package/lib/typescript/module/ui/context/oxyContextHelpers.d.ts.map +1 -1
  225. package/lib/typescript/module/ui/context/oxyContextTypes.d.ts +9 -1
  226. package/lib/typescript/module/ui/context/oxyContextTypes.d.ts.map +1 -1
  227. package/lib/typescript/module/ui/context/useOxyAccountGraph.d.ts +1 -3
  228. package/lib/typescript/module/ui/context/useOxyAccountGraph.d.ts.map +1 -1
  229. package/lib/typescript/module/ui/hooks/accountDialogSnapshot.d.ts +15 -0
  230. package/lib/typescript/module/ui/hooks/accountDialogSnapshot.d.ts.map +1 -0
  231. package/lib/typescript/module/ui/hooks/mutations/useAccountMutations.d.ts.map +1 -1
  232. package/lib/typescript/module/ui/hooks/useDeviceSwitcher.d.ts +49 -0
  233. package/lib/typescript/module/ui/hooks/useDeviceSwitcher.d.ts.map +1 -0
  234. package/lib/typescript/module/ui/hooks/useI18n.d.ts +13 -0
  235. package/lib/typescript/module/ui/hooks/useI18n.d.ts.map +1 -1
  236. package/lib/typescript/module/ui/hooks/useSessionManagement.d.ts +23 -18
  237. package/lib/typescript/module/ui/hooks/useSessionManagement.d.ts.map +1 -1
  238. package/lib/typescript/module/ui/index.d.ts +1 -2
  239. package/lib/typescript/module/ui/index.d.ts.map +1 -1
  240. package/lib/typescript/module/ui/navigation/routes.d.ts +15 -1
  241. package/lib/typescript/module/ui/navigation/routes.d.ts.map +1 -1
  242. package/lib/typescript/module/ui/navigation/surfaces.d.ts.map +1 -1
  243. package/lib/typescript/module/ui/runtime/createOxyRuntime.d.ts +144 -0
  244. package/lib/typescript/module/ui/runtime/createOxyRuntime.d.ts.map +1 -0
  245. package/lib/typescript/module/ui/runtime/index.d.ts +16 -0
  246. package/lib/typescript/module/ui/runtime/index.d.ts.map +1 -0
  247. package/lib/typescript/module/ui/runtime/runtimeContext.d.ts +43 -0
  248. package/lib/typescript/module/ui/runtime/runtimeContext.d.ts.map +1 -0
  249. package/lib/typescript/module/ui/runtime/types.d.ts +89 -0
  250. package/lib/typescript/module/ui/runtime/types.d.ts.map +1 -0
  251. package/lib/typescript/module/ui/runtime/useRuntimeSnapshot.d.ts +23 -0
  252. package/lib/typescript/module/ui/runtime/useRuntimeSnapshot.d.ts.map +1 -0
  253. package/lib/typescript/module/ui/server.d.ts +0 -1
  254. package/lib/typescript/module/ui/server.d.ts.map +1 -1
  255. package/lib/typescript/module/ui/session/authStore.d.ts +60 -9
  256. package/lib/typescript/module/ui/session/authStore.d.ts.map +1 -1
  257. package/lib/typescript/module/ui/session/sharedDeviceCredentialStore.d.ts +32 -0
  258. package/lib/typescript/module/ui/session/sharedDeviceCredentialStore.d.ts.map +1 -0
  259. package/lib/typescript/module/ui/stores/authStore.d.ts +49 -5
  260. package/lib/typescript/module/ui/stores/authStore.d.ts.map +1 -1
  261. package/lib/typescript/module/ui/types/navigation.d.ts +26 -0
  262. package/lib/typescript/module/ui/types/navigation.d.ts.map +1 -1
  263. package/lib/typescript/module/ui/utils/avatarUtils.d.ts +2 -10
  264. package/lib/typescript/module/ui/utils/avatarUtils.d.ts.map +1 -1
  265. package/package.json +6 -7
  266. package/plugins/withSharedDeviceSessionProvider.js +102 -0
  267. package/plugins/withSharedDeviceSessionReader.js +57 -0
  268. package/src/__tests__/esmSourcePurity.test.ts +61 -0
  269. package/src/index.ts +31 -9
  270. package/src/ui/boot/runProviderColdBoot.ts +7 -0
  271. package/src/ui/client.ts +1 -2
  272. package/src/ui/components/OxyAccountDialogScreen.tsx +10 -29
  273. package/src/ui/components/OxyAuthChooser.tsx +149 -50
  274. package/src/ui/components/OxyProvider.tsx +7 -5
  275. package/src/ui/components/SurfaceScreen.tsx +28 -4
  276. package/src/ui/components/authChooser/AccountsMenuView.tsx +246 -96
  277. package/src/ui/components/authChooser/SignInEntryView.tsx +31 -8
  278. package/src/ui/components/authChooser/primitives.tsx +37 -23
  279. package/src/ui/components/authChooser/types.ts +34 -1
  280. package/src/ui/context/OxyContext.tsx +269 -324
  281. package/src/ui/context/hooks/useAuthOperations.ts +32 -35
  282. package/src/ui/context/oxyContextHelpers.ts +0 -30
  283. package/src/ui/context/oxyContextTypes.ts +9 -1
  284. package/src/ui/context/useOxyAccountGraph.ts +5 -19
  285. package/src/ui/hooks/accountDialogSnapshot.ts +37 -0
  286. package/src/ui/hooks/mutations/useAccountMutations.ts +0 -19
  287. package/src/ui/hooks/queries/__tests__/userCache.test.ts +12 -1
  288. package/src/ui/hooks/useDeviceSwitcher.ts +110 -0
  289. package/src/ui/hooks/useI18n.ts +23 -3
  290. package/src/ui/hooks/useSessionManagement.ts +62 -211
  291. package/src/ui/index.ts +1 -2
  292. package/src/ui/navigation/routes.ts +85 -75
  293. package/src/ui/navigation/surfaces.ts +6 -9
  294. package/src/ui/runtime/createOxyRuntime.ts +623 -0
  295. package/src/ui/runtime/index.ts +34 -0
  296. package/src/ui/runtime/runtimeContext.tsx +111 -0
  297. package/src/ui/runtime/types.ts +110 -0
  298. package/src/ui/runtime/useRuntimeSnapshot.ts +52 -0
  299. package/src/ui/server.ts +0 -1
  300. package/src/ui/session/__tests__/authStore.test.ts +90 -0
  301. package/src/ui/session/__tests__/sharedDeviceCredentialStore.test.ts +289 -0
  302. package/src/ui/session/authStore.ts +78 -9
  303. package/src/ui/session/sharedDeviceCredentialStore.ts +318 -0
  304. package/src/ui/stores/authStore.ts +171 -43
  305. package/src/ui/types/navigation.ts +26 -0
  306. package/src/ui/utils/avatarUtils.ts +2 -37
  307. package/lib/commonjs/ui/hooks/useSwitchableAccounts.js +0 -64
  308. package/lib/commonjs/ui/hooks/useSwitchableAccounts.js.map +0 -1
  309. package/lib/commonjs/ui/stores/accountStore.js +0 -221
  310. package/lib/commonjs/ui/stores/accountStore.js.map +0 -1
  311. package/lib/module/ui/hooks/useSwitchableAccounts.js +0 -60
  312. package/lib/module/ui/hooks/useSwitchableAccounts.js.map +0 -1
  313. package/lib/module/ui/stores/accountStore.js +0 -213
  314. package/lib/module/ui/stores/accountStore.js.map +0 -1
  315. package/lib/typescript/commonjs/ui/hooks/useSwitchableAccounts.d.ts +0 -23
  316. package/lib/typescript/commonjs/ui/hooks/useSwitchableAccounts.d.ts.map +0 -1
  317. package/lib/typescript/commonjs/ui/stores/accountStore.d.ts +0 -27
  318. package/lib/typescript/commonjs/ui/stores/accountStore.d.ts.map +0 -1
  319. package/lib/typescript/module/ui/hooks/useSwitchableAccounts.d.ts +0 -23
  320. package/lib/typescript/module/ui/hooks/useSwitchableAccounts.d.ts.map +0 -1
  321. package/lib/typescript/module/ui/stores/accountStore.d.ts +0 -27
  322. package/lib/typescript/module/ui/stores/accountStore.d.ts.map +0 -1
  323. package/src/ui/hooks/useSwitchableAccounts.ts +0 -75
  324. package/src/ui/stores/accountStore.ts +0 -264
@@ -0,0 +1,430 @@
1
+ "use strict";
2
+
3
+ import { accountIdsOf, activeSessionIdOf, activeUserOf, deviceStateToClientSessions, mergeSessions as mergeSessionLists, normalizeAndSortSessions, normalizeUserIdentity, resolveActiveContext, sessionsArraysEqual } from '@oxyhq/core';
4
+
5
+ /**
6
+ * A change of SUBJECT — the account the session acts as.
7
+ *
8
+ * `previous === null` is an initial sign-in (nothing account-scoped is cached
9
+ * yet); `next === null` is a sign-out; both non-null and different is a switch,
10
+ * the only case that must invalidate a warm cache.
11
+ */
12
+
13
+ /**
14
+ * The three seams the runtime reads, declared STRUCTURALLY rather than as the
15
+ * concrete `OxyServices` / `SessionClient` / `SessionClientHost` types.
16
+ *
17
+ * The real classes satisfy them, so nothing changes at the call site — but a
18
+ * test can hand the runtime three plain objects instead of casting a stub
19
+ * through `unknown`, which is how a stub silently drifts from the interface it
20
+ * pretends to implement.
21
+ */
22
+
23
+ /**
24
+ * The headless session runtime (ADR 0004).
25
+ *
26
+ * It owns the session facts and the ORDER in which they become visible. React
27
+ * is an adapter: the provider hands components this object and they subscribe
28
+ * with selectors, so an unrelated change (a locale, a dialog opening) cannot
29
+ * rebuild an auth consumer's view.
30
+ */
31
+
32
+ const EMPTY_SESSIONS = [];
33
+ function deriveStatus(facts) {
34
+ if (!facts.authResolved) {
35
+ return 'booting';
36
+ }
37
+ if (facts.account !== null) {
38
+ return 'authenticated';
39
+ }
40
+ return facts.error !== null ? 'error' : 'signed_out';
41
+ }
42
+ function deriveTokenStatus(facts) {
43
+ if (facts.hasAccessToken && facts.tokenReady) {
44
+ return 'ready';
45
+ }
46
+ if (facts.account !== null || facts.hasAccessToken) {
47
+ return 'refreshing';
48
+ }
49
+ return 'missing';
50
+ }
51
+
52
+ /**
53
+ * The actor behind the active context, resolved to a full `User`.
54
+ *
55
+ * Falls back to the subject: on a device with no directory, and on any
56
+ * non-delegated context, the two ARE the same person, and saying so is more
57
+ * useful than a `null` every caller would have to special-case.
58
+ */
59
+ function derivePrincipal(activeContext, profiles, account) {
60
+ if (activeContext === null) {
61
+ return account;
62
+ }
63
+ return profiles.get(activeContext.actor.userId) ?? account;
64
+ }
65
+ export function createOxyRuntime(config) {
66
+ const {
67
+ oxyServices,
68
+ sessionClient,
69
+ sessionClientHost,
70
+ identity,
71
+ onSubjectChange,
72
+ onDeviceEmpty,
73
+ onSessionsProjected,
74
+ onIdentityUnbound,
75
+ logger
76
+ } = config;
77
+ const facts = {
78
+ deviceState: null,
79
+ directory: null,
80
+ profiles: new Map(),
81
+ sessions: EMPTY_SESSIONS,
82
+ activeSessionId: null,
83
+ account: null,
84
+ pinnedAccountId: null,
85
+ isLoading: false,
86
+ error: null,
87
+ storageReady: false,
88
+ tokenReady: true,
89
+ hasAccessToken: Boolean(oxyServices.getAccessToken()),
90
+ authResolved: false,
91
+ switching: false
92
+ };
93
+ const listeners = new Set();
94
+ let snapshot = buildSnapshot();
95
+ /**
96
+ * Depth of the current transition. Nested mutations publish ONCE, at the
97
+ * outermost boundary — a projection that sets sessions, the active id and the
98
+ * account must not wake React three times with two of them half-applied.
99
+ */
100
+ let depth = 0;
101
+ let dirty = false;
102
+ /** The subject as it stood when the OUTERMOST transition opened. */
103
+ let subjectAtEntry = null;
104
+ function buildSnapshot() {
105
+ const activeContext = resolveActiveContext(facts.directory);
106
+ return Object.freeze({
107
+ status: deriveStatus(facts),
108
+ device: facts.directory,
109
+ deviceState: facts.deviceState,
110
+ activeContext,
111
+ principal: derivePrincipal(activeContext, facts.profiles, facts.account),
112
+ account: facts.account,
113
+ tokenStatus: deriveTokenStatus(facts),
114
+ authResolved: facts.authResolved,
115
+ switching: facts.switching,
116
+ error: facts.error === null ? null : {
117
+ message: facts.error,
118
+ code: 'oxy_runtime_error'
119
+ },
120
+ sessions: facts.sessions,
121
+ activeSessionId: facts.activeSessionId,
122
+ isLoading: facts.isLoading,
123
+ storageReady: facts.storageReady,
124
+ hasAccessToken: facts.hasAccessToken,
125
+ tokenReady: facts.tokenReady
126
+ });
127
+ }
128
+ function notify() {
129
+ for (const listener of [...listeners]) {
130
+ try {
131
+ listener();
132
+ } catch (error) {
133
+ logger('An OxyRuntime subscriber threw', error);
134
+ }
135
+ }
136
+ }
137
+
138
+ /**
139
+ * The ONE ordered transition. Every fact change goes through here, so the
140
+ * sequence ADR 0002 mandates holds for a local switch, a socket push, a cold
141
+ * boot and a cross-tab wake alike:
142
+ *
143
+ * the bearer is already committed (SessionClient awaits its mint before it
144
+ * calls us) → reset account-scoped caches → publish the snapshot → notify.
145
+ *
146
+ * Publishing before the reset would let a woken component read a cache entry
147
+ * belonging to the previous subject while holding the new subject's bearer,
148
+ * which is the account-switch race in its quietest form: no error, just the
149
+ * wrong person's data.
150
+ */
151
+ function transition(mutate) {
152
+ if (depth === 0) {
153
+ subjectAtEntry = facts.account?.id ?? null;
154
+ }
155
+ depth += 1;
156
+ try {
157
+ mutate();
158
+ } finally {
159
+ depth -= 1;
160
+ }
161
+ if (depth > 0) {
162
+ // A nested transition publishes nothing and fires no reset: the subject
163
+ // is compared once, at the outermost boundary, so a projection that
164
+ // touches the account twice cannot reset the caches twice.
165
+ return;
166
+ }
167
+ const nextSubject = facts.account?.id ?? null;
168
+ if (nextSubject !== subjectAtEntry) {
169
+ dirty = true;
170
+ onSubjectChange?.({
171
+ previous: subjectAtEntry,
172
+ next: nextSubject
173
+ });
174
+ }
175
+ if (!dirty) {
176
+ return;
177
+ }
178
+ dirty = false;
179
+ snapshot = buildSnapshot();
180
+ notify();
181
+ }
182
+
183
+ /** Mark the snapshot stale from inside a transition. */
184
+ function touch() {
185
+ dirty = true;
186
+ }
187
+ function setSessions(next) {
188
+ if (sessionsArraysEqual(facts.sessions, next)) {
189
+ return;
190
+ }
191
+ facts.sessions = next;
192
+ touch();
193
+ }
194
+ function setActiveSessionIdFact(sessionId) {
195
+ if (facts.activeSessionId === sessionId) {
196
+ return;
197
+ }
198
+ facts.activeSessionId = sessionId;
199
+ touch();
200
+ }
201
+
202
+ /**
203
+ * The one place a `User` becomes THE subject — and the one place identity is
204
+ * normalised, so a profile arriving as `_id` from one lane and `id` from
205
+ * another can never produce two accounts that are the same person.
206
+ */
207
+ function setAccountFact(user) {
208
+ if (user === null) {
209
+ if (facts.account === null) {
210
+ return;
211
+ }
212
+ facts.account = null;
213
+ touch();
214
+ return;
215
+ }
216
+ if (facts.account === user) {
217
+ return;
218
+ }
219
+ facts.account = normalizeUserIdentity(user);
220
+ touch();
221
+ }
222
+
223
+ // ── Projection ───────────────────────────────────────────────────────────
224
+
225
+ async function reconcileFromClient() {
226
+ const state = sessionClient.getState();
227
+ if (state === null) {
228
+ return;
229
+ }
230
+ if (state.accounts.length === 0) {
231
+ sessionClientHost.setCurrentAccountId(null);
232
+ await onDeviceEmpty();
233
+ return;
234
+ }
235
+ // Capture the revision this projection is for, then bail after the async
236
+ // profile fetch if a fresher state has landed — last-writer-wins, so two
237
+ // overlapping projections can never publish in the wrong order.
238
+ const capturedRevision = state.revision;
239
+ // Resolve the pin BEFORE the fetch (memoised: one storage + keychain read
240
+ // per boot) so the first pass over a freshly applied state is already bound.
241
+ // Deferring it would let a sibling app's switch render once as this
242
+ // client's user before the pin corrected it.
243
+ const pinnedAccountId = identity ? await identity.ensurePinnedAccountId() : null;
244
+ const ids = accountIdsOf(state);
245
+ let users = [];
246
+ try {
247
+ users = ids.length > 0 ? await oxyServices.getUsersByIds(ids) : [];
248
+ } catch (fetchError) {
249
+ logger('Failed to resolve account profiles during the device projection', fetchError);
250
+ return;
251
+ }
252
+ const latest = sessionClient.getState();
253
+ if (!latest || latest.revision !== capturedRevision) {
254
+ return;
255
+ }
256
+ if (identity && (pinnedAccountId === null || activeSessionIdOf(latest, pinnedAccountId) === null)) {
257
+ // Either no verified pin, or the pinned account left this device's session
258
+ // set. Leave the current projection untouched and re-derive from the key.
259
+ onIdentityUnbound?.(identity, latest.revision);
260
+ return;
261
+ }
262
+ const directory = sessionClient.getDirectory();
263
+ transition(() => {
264
+ facts.pinnedAccountId = pinnedAccountId;
265
+ if (facts.deviceState !== latest) {
266
+ facts.deviceState = latest;
267
+ touch();
268
+ }
269
+ if (facts.directory !== directory) {
270
+ facts.directory = directory;
271
+ touch();
272
+ }
273
+ for (const resolved of users) {
274
+ facts.profiles.set(resolved.id, resolved);
275
+ }
276
+ const projected = normalizeAndSortSessions(deviceStateToClientSessions(latest, facts.profiles, pinnedAccountId), facts.activeSessionId, false);
277
+ setSessions(projected);
278
+ onSessionsProjected?.(projected.map(session => session.sessionId));
279
+ setActiveSessionIdFact(activeSessionIdOf(latest, pinnedAccountId));
280
+ const activeUser = activeUserOf(latest, facts.profiles, pinnedAccountId);
281
+ if (activeUser) {
282
+ setAccountFact(activeUser);
283
+ }
284
+ });
285
+ // The host's current account feeds the socket handshake and the bearer's
286
+ // token-account comparisons, so it tracks the PIN — never the account
287
+ // another app switched the device to.
288
+ sessionClientHost.setCurrentAccountId(pinnedAccountId ?? latest.activeAccountId);
289
+ }
290
+ return {
291
+ getSnapshot: () => snapshot,
292
+ subscribe(listener) {
293
+ listeners.add(listener);
294
+ return () => {
295
+ listeners.delete(listener);
296
+ };
297
+ },
298
+ start() {
299
+ return sessionClient.subscribe(() => {
300
+ void reconcileFromClient().catch(error => {
301
+ logger('Failed to project a device-state transition', error);
302
+ });
303
+ });
304
+ },
305
+ reconcileFromClient,
306
+ batch(mutate) {
307
+ transition(mutate);
308
+ },
309
+ async activateContext(contextId) {
310
+ // `switching` is published BEFORE the request so a switcher can disable
311
+ // its rows for the whole round trip, and cleared in `finally` so a
312
+ // refused activation does not strand it on.
313
+ this.setSwitching(true);
314
+ try {
315
+ await sessionClient.activateContext(contextId);
316
+ await reconcileFromClient();
317
+ } finally {
318
+ this.setSwitching(false);
319
+ }
320
+ },
321
+ async signOutContext(contextId) {
322
+ await sessionClient.signOutContext(contextId);
323
+ await reconcileFromClient();
324
+ },
325
+ async signOutPrincipal(principalId) {
326
+ await sessionClient.signOutPrincipal(principalId);
327
+ await reconcileFromClient();
328
+ },
329
+ async refreshDirectory() {
330
+ await sessionClient.refreshDirectory();
331
+ const directory = sessionClient.getDirectory();
332
+ transition(() => {
333
+ if (facts.directory === directory) {
334
+ return;
335
+ }
336
+ facts.directory = directory;
337
+ touch();
338
+ });
339
+ },
340
+ setAccount(user) {
341
+ transition(() => {
342
+ setAccountFact(user);
343
+ if (facts.isLoading) {
344
+ facts.isLoading = false;
345
+ touch();
346
+ }
347
+ if (facts.error !== null) {
348
+ facts.error = null;
349
+ touch();
350
+ }
351
+ facts.profiles.set(user.id, user);
352
+ });
353
+ },
354
+ setLoading(loading) {
355
+ transition(() => {
356
+ if (facts.isLoading === loading) return;
357
+ facts.isLoading = loading;
358
+ touch();
359
+ });
360
+ },
361
+ setError(error) {
362
+ transition(() => {
363
+ if (facts.error === error) return;
364
+ facts.error = error;
365
+ touch();
366
+ });
367
+ },
368
+ setStorageReady(ready) {
369
+ transition(() => {
370
+ if (facts.storageReady === ready) return;
371
+ facts.storageReady = ready;
372
+ touch();
373
+ });
374
+ },
375
+ setTokenReady(ready) {
376
+ transition(() => {
377
+ if (facts.tokenReady === ready) return;
378
+ facts.tokenReady = ready;
379
+ touch();
380
+ });
381
+ },
382
+ setHasAccessToken(has) {
383
+ transition(() => {
384
+ if (facts.hasAccessToken === has) return;
385
+ facts.hasAccessToken = has;
386
+ touch();
387
+ });
388
+ },
389
+ setSwitching(switching) {
390
+ transition(() => {
391
+ if (facts.switching === switching) return;
392
+ facts.switching = switching;
393
+ touch();
394
+ });
395
+ },
396
+ markAuthResolved() {
397
+ transition(() => {
398
+ if (facts.authResolved) return;
399
+ facts.authResolved = true;
400
+ facts.tokenReady = true;
401
+ touch();
402
+ });
403
+ },
404
+ mergeSessions(incoming, options = {}) {
405
+ transition(() => {
406
+ const processed = options.merge ? mergeSessionLists(facts.sessions, incoming, facts.activeSessionId, false) : normalizeAndSortSessions(incoming, facts.activeSessionId, false);
407
+ onSessionsProjected?.([...processed.map(session => session.sessionId), ...(options.preserveSessionIds ?? [])]);
408
+ setSessions(processed);
409
+ });
410
+ },
411
+ setActiveSessionId(sessionId) {
412
+ transition(() => {
413
+ setActiveSessionIdFact(sessionId);
414
+ });
415
+ },
416
+ clearSession() {
417
+ transition(() => {
418
+ setSessions(EMPTY_SESSIONS);
419
+ setActiveSessionIdFact(null);
420
+ setAccountFact(null);
421
+ facts.deviceState = null;
422
+ facts.directory = null;
423
+ facts.profiles = new Map();
424
+ facts.pinnedAccountId = null;
425
+ touch();
426
+ });
427
+ }
428
+ };
429
+ }
430
+ //# sourceMappingURL=createOxyRuntime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["accountIdsOf","activeSessionIdOf","activeUserOf","deviceStateToClientSessions","mergeSessions","mergeSessionLists","normalizeAndSortSessions","normalizeUserIdentity","resolveActiveContext","sessionsArraysEqual","EMPTY_SESSIONS","deriveStatus","facts","authResolved","account","error","deriveTokenStatus","hasAccessToken","tokenReady","derivePrincipal","activeContext","profiles","get","actor","userId","createOxyRuntime","config","oxyServices","sessionClient","sessionClientHost","identity","onSubjectChange","onDeviceEmpty","onSessionsProjected","onIdentityUnbound","logger","deviceState","directory","Map","sessions","activeSessionId","pinnedAccountId","isLoading","storageReady","Boolean","getAccessToken","switching","listeners","Set","snapshot","buildSnapshot","depth","dirty","subjectAtEntry","Object","freeze","status","device","principal","tokenStatus","message","code","notify","listener","transition","mutate","id","nextSubject","previous","next","touch","setSessions","setActiveSessionIdFact","sessionId","setAccountFact","user","reconcileFromClient","state","getState","accounts","length","setCurrentAccountId","capturedRevision","revision","ensurePinnedAccountId","ids","users","getUsersByIds","fetchError","latest","getDirectory","resolved","set","projected","map","session","activeUser","activeAccountId","getSnapshot","subscribe","add","delete","start","catch","batch","activateContext","contextId","setSwitching","signOutContext","signOutPrincipal","principalId","refreshDirectory","setAccount","setLoading","loading","setError","setStorageReady","ready","setTokenReady","setHasAccessToken","has","markAuthResolved","incoming","options","processed","merge","preserveSessionIds","setActiveSessionId","clearSession"],"sourceRoot":"../../../../src","sources":["ui/runtime/createOxyRuntime.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * The headless session runtime (ADR 0004).
5
+ *
6
+ * `createOxyRuntime` owns the session facts and the order in which they become
7
+ * visible; `useRuntimeSnapshot` / `useRuntimeSelector` are the React adapter
8
+ * over it. Nothing here imports React except the adapter, and nothing in the
9
+ * runtime reads React state — which is what lets the provider hold ONE stable
10
+ * reference and stop rebuilding a 58-field context value on every keystroke.
11
+ */
12
+ export { createOxyRuntime } from "./createOxyRuntime.js";
13
+ export { useRuntimeSnapshot, useRuntimeSelector } from "./useRuntimeSnapshot.js";
14
+ export { OxyRuntimeHandleProvider, OxyRuntimeMissingError, useActiveAccount, useDeviceDirectory, useOxyRuntime, useOxySnapshot } from "./runtimeContext.js";
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createOxyRuntime","useRuntimeSnapshot","useRuntimeSelector","OxyRuntimeHandleProvider","OxyRuntimeMissingError","useActiveAccount","useDeviceDirectory","useOxyRuntime","useOxySnapshot"],"sourceRoot":"../../../../src","sources":["ui/runtime/index.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASA,gBAAgB,QAAQ,uBAAoB;AASrD,SAASC,kBAAkB,EAAEC,kBAAkB,QAAQ,yBAAsB;AAC7E,SACEC,wBAAwB,EACxBC,sBAAsB,EACtBC,gBAAgB,EAChBC,kBAAkB,EAClBC,aAAa,EACbC,cAAc,QACT,qBAAkB","ignoreList":[]}
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+
3
+ import { createContext, useContext } from 'react';
4
+ import { useRuntimeSelector, useRuntimeSnapshot } from "./useRuntimeSnapshot.js";
5
+
6
+ /**
7
+ * The runtime reference itself, as a context value that NEVER changes identity
8
+ * (ADR 0004).
9
+ *
10
+ * It is deliberately a second context beside the big `OxyContextState` one.
11
+ * That value is rebuilt whenever any of its fifty-odd members moves — a locale,
12
+ * a dialog opening — and every hook reading it re-renders with it. Hooks
13
+ * hanging off this one subscribe to the runtime with a selector instead, so
14
+ * only a change to what they actually selected wakes them. Retiring the wide
15
+ * context is Phase 8; this is what its replacements are built on.
16
+ */
17
+ const OxyRuntimeHandleContext = /*#__PURE__*/createContext(null);
18
+ export const OxyRuntimeHandleProvider = OxyRuntimeHandleContext.Provider;
19
+ const RUNTIME_MISSING_MESSAGE = 'useOxyRuntime() was called outside <OxyProvider>. Mount <OxyProvider clientId="…"> above this component.';
20
+ export class OxyRuntimeMissingError extends Error {
21
+ code = 'oxy_runtime_missing';
22
+ constructor() {
23
+ super(RUNTIME_MISSING_MESSAGE);
24
+ this.name = 'OxyRuntimeMissingError';
25
+ }
26
+ }
27
+
28
+ /** The runtime this provider owns. THROWS when no `<OxyProvider>` is mounted. */
29
+ export function useOxyRuntime() {
30
+ const runtime = useContext(OxyRuntimeHandleContext);
31
+ if (runtime === null) {
32
+ throw new OxyRuntimeMissingError();
33
+ }
34
+ return runtime;
35
+ }
36
+ function selectActiveAccount(snapshot) {
37
+ return {
38
+ principal: snapshot.principal,
39
+ account: snapshot.account,
40
+ context: snapshot.activeContext,
41
+ isDelegated: snapshot.activeContext?.isDelegated ?? false,
42
+ status: snapshot.status
43
+ };
44
+ }
45
+ function activeAccountsEqual(a, b) {
46
+ return a.principal === b.principal && a.account === b.account && a.context === b.context && a.isDelegated === b.isDelegated && a.status === b.status;
47
+ }
48
+
49
+ /**
50
+ * Who this app is running as, with the actor and the subject kept apart.
51
+ *
52
+ * Unlike `useOxy()`, this re-renders only when one of those five facts moves —
53
+ * a locale change, a dialog opening or a session-list refresh does not reach it.
54
+ */
55
+ export function useActiveAccount() {
56
+ return useRuntimeSelector(useOxyRuntime(), selectActiveAccount, activeAccountsEqual);
57
+ }
58
+ const selectDirectory = snapshot => snapshot.device;
59
+
60
+ /**
61
+ * The device directory — every principal on this device and the contexts each
62
+ * may act as (ADR 0002).
63
+ *
64
+ * `null` until something calls `runtime.refreshDirectory()`. A client that
65
+ * never asks for one never pays for the round trip.
66
+ */
67
+ export function useDeviceDirectory() {
68
+ return useRuntimeSelector(useOxyRuntime(), selectDirectory);
69
+ }
70
+
71
+ /** The whole runtime snapshot. Prefer a narrower hook where one exists. */
72
+ export function useOxySnapshot() {
73
+ return useRuntimeSnapshot(useOxyRuntime());
74
+ }
75
+ //# sourceMappingURL=runtimeContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createContext","useContext","useRuntimeSelector","useRuntimeSnapshot","OxyRuntimeHandleContext","OxyRuntimeHandleProvider","Provider","RUNTIME_MISSING_MESSAGE","OxyRuntimeMissingError","Error","code","constructor","name","useOxyRuntime","runtime","selectActiveAccount","snapshot","principal","account","context","activeContext","isDelegated","status","activeAccountsEqual","a","b","useActiveAccount","selectDirectory","device","useDeviceDirectory","useOxySnapshot"],"sourceRoot":"../../../../src","sources":["ui/runtime/runtimeContext.tsx"],"mappings":";;AAAA,SAASA,aAAa,EAAEC,UAAU,QAAQ,OAAO;AAKjD,SAASC,kBAAkB,EAAEC,kBAAkB,QAAQ,yBAAsB;;AAE7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,uBAAuB,gBAAGJ,aAAa,CAAoB,IAAI,CAAC;AAEtE,OAAO,MAAMK,wBAAwB,GAAGD,uBAAuB,CAACE,QAAQ;AAExE,MAAMC,uBAAuB,GAC3B,0GAA0G;AAE5G,OAAO,MAAMC,sBAAsB,SAASC,KAAK,CAAC;EACvCC,IAAI,GAAG,qBAAqB;EAErCC,WAAWA,CAAA,EAAG;IACZ,KAAK,CAACJ,uBAAuB,CAAC;IAC9B,IAAI,CAACK,IAAI,GAAG,wBAAwB;EACtC;AACF;;AAEA;AACA,OAAO,SAASC,aAAaA,CAAA,EAAe;EAC1C,MAAMC,OAAO,GAAGb,UAAU,CAACG,uBAAuB,CAAC;EACnD,IAAIU,OAAO,KAAK,IAAI,EAAE;IACpB,MAAM,IAAIN,sBAAsB,CAAC,CAAC;EACpC;EACA,OAAOM,OAAO;AAChB;AAiBA,SAASC,mBAAmBA,CAACC,QAK5B,EAAiB;EAChB,OAAO;IACLC,SAAS,EAAED,QAAQ,CAACC,SAAS;IAC7BC,OAAO,EAAEF,QAAQ,CAACE,OAAO;IACzBC,OAAO,EAAEH,QAAQ,CAACI,aAAa;IAC/BC,WAAW,EAAEL,QAAQ,CAACI,aAAa,EAAEC,WAAW,IAAI,KAAK;IACzDC,MAAM,EAAEN,QAAQ,CAACM;EACnB,CAAC;AACH;AAEA,SAASC,mBAAmBA,CAACC,CAAgB,EAAEC,CAAgB,EAAW;EACxE,OACED,CAAC,CAACP,SAAS,KAAKQ,CAAC,CAACR,SAAS,IAC3BO,CAAC,CAACN,OAAO,KAAKO,CAAC,CAACP,OAAO,IACvBM,CAAC,CAACL,OAAO,KAAKM,CAAC,CAACN,OAAO,IACvBK,CAAC,CAACH,WAAW,KAAKI,CAAC,CAACJ,WAAW,IAC/BG,CAAC,CAACF,MAAM,KAAKG,CAAC,CAACH,MAAM;AAEzB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASI,gBAAgBA,CAAA,EAAkB;EAChD,OAAOxB,kBAAkB,CAACW,aAAa,CAAC,CAAC,EAAEE,mBAAmB,EAAEQ,mBAAmB,CAAC;AACtF;AAEA,MAAMI,eAAe,GAAIX,QAA4C,IACnEA,QAAQ,CAACY,MAAM;;AAEjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,kBAAkBA,CAAA,EAA2B;EAC3D,OAAO3B,kBAAkB,CAACW,aAAa,CAAC,CAAC,EAAEc,eAAe,CAAC;AAC7D;;AAEA;AACA,OAAO,SAASG,cAAcA,CAAA,EAA0C;EACtE,OAAO3B,kBAAkB,CAACU,aAAa,CAAC,CAAC,CAAC;AAC5C","ignoreList":[]}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+
3
+ export {};
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../../../src","sources":["ui/runtime/types.ts"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+
3
+ import { useCallback, useRef, useSyncExternalStore } from 'react';
4
+ /**
5
+ * Subscribe to the whole runtime snapshot.
6
+ *
7
+ * The runtime publishes a frozen object only when a fact actually changed, so
8
+ * identity comparison is exact: a locale change, a dialog opening or an
9
+ * unrelated query settling does not wake anything subscribed here.
10
+ */
11
+ export function useRuntimeSnapshot(runtime) {
12
+ return useSyncExternalStore(runtime.subscribe, runtime.getSnapshot, runtime.getSnapshot);
13
+ }
14
+
15
+ /**
16
+ * Subscribe to one derived value of the runtime snapshot.
17
+ *
18
+ * The selection is cached against the snapshot it was computed from, which is
19
+ * what makes a selector returning a fresh object (`{user, isAuthenticated}`)
20
+ * safe here: `useSyncExternalStore` calls `getSnapshot` several times per
21
+ * commit and would otherwise see a new object every call and loop.
22
+ *
23
+ * `selector` must be stable — hoist it to module scope or wrap it in
24
+ * `useCallback`. An inline arrow re-subscribes on every render.
25
+ */
26
+ export function useRuntimeSelector(runtime, selector, isEqual) {
27
+ const cache = useRef(null);
28
+ const getSelection = useCallback(() => {
29
+ const snapshot = runtime.getSnapshot();
30
+ const cached = cache.current;
31
+ if (cached !== null && cached.snapshot === snapshot) {
32
+ return cached.value;
33
+ }
34
+ const value = selector(snapshot);
35
+ if (cached !== null && isEqual?.(cached.value, value) === true) {
36
+ // Same value under the caller's equality: keep the PREVIOUS reference so a
37
+ // structurally-equal recomputation does not read as a change.
38
+ cache.current = {
39
+ snapshot,
40
+ value: cached.value
41
+ };
42
+ return cached.value;
43
+ }
44
+ cache.current = {
45
+ snapshot,
46
+ value
47
+ };
48
+ return value;
49
+ }, [runtime, selector, isEqual]);
50
+ return useSyncExternalStore(runtime.subscribe, getSelection, getSelection);
51
+ }
52
+ //# sourceMappingURL=useRuntimeSnapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useCallback","useRef","useSyncExternalStore","useRuntimeSnapshot","runtime","subscribe","getSnapshot","useRuntimeSelector","selector","isEqual","cache","getSelection","snapshot","cached","current","value"],"sourceRoot":"../../../../src","sources":["ui/runtime/useRuntimeSnapshot.ts"],"mappings":";;AAAA,SAASA,WAAW,EAAEC,MAAM,EAAEC,oBAAoB,QAAQ,OAAO;AAIjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,kBAAkBA,CAACC,OAAmB,EAAsB;EAC1E,OAAOF,oBAAoB,CAACE,OAAO,CAACC,SAAS,EAAED,OAAO,CAACE,WAAW,EAAEF,OAAO,CAACE,WAAW,CAAC;AAC1F;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,kBAAkBA,CAChCH,OAAmB,EACnBI,QAA6C,EAC7CC,OAAiC,EAC9B;EACH,MAAMC,KAAK,GAAGT,MAAM,CAAoD,IAAI,CAAC;EAE7E,MAAMU,YAAY,GAAGX,WAAW,CAAC,MAAS;IACxC,MAAMY,QAAQ,GAAGR,OAAO,CAACE,WAAW,CAAC,CAAC;IACtC,MAAMO,MAAM,GAAGH,KAAK,CAACI,OAAO;IAC5B,IAAID,MAAM,KAAK,IAAI,IAAIA,MAAM,CAACD,QAAQ,KAAKA,QAAQ,EAAE;MACnD,OAAOC,MAAM,CAACE,KAAK;IACrB;IACA,MAAMA,KAAK,GAAGP,QAAQ,CAACI,QAAQ,CAAC;IAChC,IAAIC,MAAM,KAAK,IAAI,IAAIJ,OAAO,GAAGI,MAAM,CAACE,KAAK,EAAEA,KAAK,CAAC,KAAK,IAAI,EAAE;MAC9D;MACA;MACAL,KAAK,CAACI,OAAO,GAAG;QAAEF,QAAQ;QAAEG,KAAK,EAAEF,MAAM,CAACE;MAAM,CAAC;MACjD,OAAOF,MAAM,CAACE,KAAK;IACrB;IACAL,KAAK,CAACI,OAAO,GAAG;MAAEF,QAAQ;MAAEG;IAAM,CAAC;IACnC,OAAOA,KAAK;EACd,CAAC,EAAE,CAACX,OAAO,EAAEI,QAAQ,EAAEC,OAAO,CAAC,CAAC;EAEhC,OAAOP,oBAAoB,CAACE,OAAO,CAACC,SAAS,EAAEM,YAAY,EAAEA,YAAY,CAAC;AAC5E","ignoreList":[]}
@@ -39,7 +39,6 @@ export const ProfileScreen = noopComponent;
39
39
 
40
40
  // Stores (return empty objects)
41
41
  export const useAuthStore = noopHook;
42
- export const useAccountStore = noopHook;
43
42
 
44
43
  // Toast (noop)
45
44
  export const toast = Object.assign(() => {}, {
@@ -1 +1 @@
1
- {"version":3,"names":["noopComponent","noopHook","noopStorageResult","storage","isReady","OxyProvider","OxySignInButton","LogoIcon","LogoText","FollowButton","OxyPayButton","useOxy","useAuth","useFollow","useStorage","ProfileScreen","useAuthStore","useAccountStore","toast","Object","assign","success","error","info","warning","loading","dismiss","handleAuthError","isInvalidSessionError","isTimeoutOrNetworkError","extractErrorMessage"],"sourceRoot":"../../../src","sources":["ui/server.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,MAAMA,aAAa,GAAGA,CAAA,KAAM,IAAI;AAChC,MAAMC,QAAQ,GAAGA,CAAA,MAAO,CAAC,CAAC,CAAC;AAC3B,MAAMC,iBAAiB,GAAG;EAAEC,OAAO,EAAE,IAAI;EAAEC,OAAO,EAAE;AAAM,CAAC;;AAE3D;AACA,OAAO,MAAMC,WAAW,GAAGL,aAAa;AACxC,OAAO,MAAMM,eAAe,GAAGN,aAAa;AAC5C,OAAO,MAAMO,QAAQ,GAAGP,aAAa;AACrC,OAAO,MAAMQ,QAAQ,GAAGR,aAAa;AACrC,OAAO,MAAMS,YAAY,GAAGT,aAAa;AACzC,OAAO,MAAMU,YAAY,GAAGV,aAAa;;AAEzC;AACA,OAAO,MAAMW,MAAM,GAAGV,QAAQ;;AAE9B;AACA,OAAO,MAAMW,OAAO,GAAGX,QAAQ;AAC/B,OAAO,MAAMY,SAAS,GAAGZ,QAAQ;AACjC,OAAO,MAAMa,UAAU,GAAGA,CAAA,KAAMZ,iBAAiB;;AAEjD;AACA,OAAO,MAAMa,aAAa,GAAGf,aAAa;;AAE1C;AACA,OAAO,MAAMgB,YAAY,GAAGf,QAAQ;AACpC,OAAO,MAAMgB,eAAe,GAAGhB,QAAQ;;AAEvC;AACA,OAAO,MAAMiB,KAAK,GAAGC,MAAM,CAACC,MAAM,CAC9B,MAAM,CAAC,CAAC,EACR;EACIC,OAAO,EAAEA,CAAA,KAAM,CAAC,CAAC;EACjBC,KAAK,EAAEA,CAAA,KAAM,CAAC,CAAC;EACfC,IAAI,EAAEA,CAAA,KAAM,CAAC,CAAC;EACdC,OAAO,EAAEA,CAAA,KAAM,CAAC,CAAC;EACjBC,OAAO,EAAEA,CAAA,KAAM,CAAC,CAAC;EACjBC,OAAO,EAAEA,CAAA,KAAM,CAAC;AACpB,CACJ,CAAC;;AAED;AACA,SACIC,eAAe,EACfC,qBAAqB,EACrBC,uBAAuB,EACvBC,mBAAmB,QAChB,0BAAuB","ignoreList":[]}
1
+ {"version":3,"names":["noopComponent","noopHook","noopStorageResult","storage","isReady","OxyProvider","OxySignInButton","LogoIcon","LogoText","FollowButton","OxyPayButton","useOxy","useAuth","useFollow","useStorage","ProfileScreen","useAuthStore","toast","Object","assign","success","error","info","warning","loading","dismiss","handleAuthError","isInvalidSessionError","isTimeoutOrNetworkError","extractErrorMessage"],"sourceRoot":"../../../src","sources":["ui/server.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,MAAMA,aAAa,GAAGA,CAAA,KAAM,IAAI;AAChC,MAAMC,QAAQ,GAAGA,CAAA,MAAO,CAAC,CAAC,CAAC;AAC3B,MAAMC,iBAAiB,GAAG;EAAEC,OAAO,EAAE,IAAI;EAAEC,OAAO,EAAE;AAAM,CAAC;;AAE3D;AACA,OAAO,MAAMC,WAAW,GAAGL,aAAa;AACxC,OAAO,MAAMM,eAAe,GAAGN,aAAa;AAC5C,OAAO,MAAMO,QAAQ,GAAGP,aAAa;AACrC,OAAO,MAAMQ,QAAQ,GAAGR,aAAa;AACrC,OAAO,MAAMS,YAAY,GAAGT,aAAa;AACzC,OAAO,MAAMU,YAAY,GAAGV,aAAa;;AAEzC;AACA,OAAO,MAAMW,MAAM,GAAGV,QAAQ;;AAE9B;AACA,OAAO,MAAMW,OAAO,GAAGX,QAAQ;AAC/B,OAAO,MAAMY,SAAS,GAAGZ,QAAQ;AACjC,OAAO,MAAMa,UAAU,GAAGA,CAAA,KAAMZ,iBAAiB;;AAEjD;AACA,OAAO,MAAMa,aAAa,GAAGf,aAAa;;AAE1C;AACA,OAAO,MAAMgB,YAAY,GAAGf,QAAQ;;AAEpC;AACA,OAAO,MAAMgB,KAAK,GAAGC,MAAM,CAACC,MAAM,CAC9B,MAAM,CAAC,CAAC,EACR;EACIC,OAAO,EAAEA,CAAA,KAAM,CAAC,CAAC;EACjBC,KAAK,EAAEA,CAAA,KAAM,CAAC,CAAC;EACfC,IAAI,EAAEA,CAAA,KAAM,CAAC,CAAC;EACdC,OAAO,EAAEA,CAAA,KAAM,CAAC,CAAC;EACjBC,OAAO,EAAEA,CAAA,KAAM,CAAC,CAAC;EACjBC,OAAO,EAAEA,CAAA,KAAM,CAAC;AACpB,CACJ,CAAC;;AAED;AACA,SACIC,eAAe,EACfC,qBAAqB,EACrBC,uBAAuB,EACvBC,mBAAmB,QAChB,0BAAuB","ignoreList":[]}