@dxos/plugin-client 0.12.0-next-73daef452f1464b62efdbca75fb0067c1066f264 → 0.13.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 (580) hide show
  1. package/dist/lib/Account.mjs +29 -10
  2. package/dist/lib/Account.mjs.map +1 -1
  3. package/dist/lib/CliLogin.mjs +78 -0
  4. package/dist/lib/CliLogin.mjs.map +1 -0
  5. package/dist/lib/ClientCapabilities.mjs +25 -1
  6. package/dist/lib/ClientCapabilities.mjs.map +1 -1
  7. package/dist/lib/ClientEvents.mjs +7 -3
  8. package/dist/lib/ClientEvents.mjs.map +1 -1
  9. package/dist/lib/{chunk-definitions.mjs → ClientOperation.mjs} +11 -7
  10. package/dist/lib/ClientOperation.mjs.map +1 -0
  11. package/dist/lib/ClientOptions.mjs.map +1 -1
  12. package/dist/lib/PasskeyError.mjs +69 -12
  13. package/dist/lib/PasskeyError.mjs.map +1 -1
  14. package/dist/lib/capabilities.browser.mjs +134 -0
  15. package/dist/lib/capabilities.browser.mjs.map +1 -0
  16. package/dist/lib/capabilities.mjs +47 -10
  17. package/dist/lib/capabilities.mjs.map +1 -1
  18. package/dist/lib/capabilities.node.mjs +40 -7
  19. package/dist/lib/capabilities.node.mjs.map +1 -1
  20. package/dist/lib/capabilities.tauri.mjs +134 -0
  21. package/dist/lib/capabilities.tauri.mjs.map +1 -0
  22. package/dist/lib/capabilities.workerd.mjs +24 -4
  23. package/dist/lib/capabilities.workerd.mjs.map +1 -1
  24. package/dist/lib/chunk-AccountContainer.mjs +53 -41
  25. package/dist/lib/chunk-AccountContainer.mjs.map +1 -1
  26. package/dist/lib/chunk-CliLoginDialog.mjs +146 -0
  27. package/dist/lib/chunk-CliLoginDialog.mjs.map +1 -0
  28. package/dist/lib/chunk-ContactPickerContainer.mjs +120 -0
  29. package/dist/lib/chunk-ContactPickerContainer.mjs.map +1 -0
  30. package/dist/lib/chunk-ContactsContainer.mjs +53 -0
  31. package/dist/lib/chunk-ContactsContainer.mjs.map +1 -0
  32. package/dist/lib/chunk-DevicesContainer.mjs +48 -112
  33. package/dist/lib/chunk-DevicesContainer.mjs.map +1 -1
  34. package/dist/lib/chunk-HaloServices.mjs +28 -0
  35. package/dist/lib/chunk-HaloServices.mjs.map +1 -0
  36. package/dist/lib/chunk-InvitationsContainer.mjs +61 -39
  37. package/dist/lib/chunk-InvitationsContainer.mjs.map +1 -1
  38. package/dist/lib/chunk-JoinDialog.mjs +10 -9
  39. package/dist/lib/chunk-JoinDialog.mjs.map +1 -1
  40. package/dist/lib/chunk-ProfileContainer.mjs +60 -39
  41. package/dist/lib/chunk-ProfileContainer.mjs.map +1 -1
  42. package/dist/lib/chunk-RecoveryCodeDialog.mjs +26 -21
  43. package/dist/lib/chunk-RecoveryCodeDialog.mjs.map +1 -1
  44. package/dist/lib/chunk-RecoveryCredentialsContainer.mjs +95 -65
  45. package/dist/lib/chunk-RecoveryCredentialsContainer.mjs.map +1 -1
  46. package/dist/lib/chunk-ResetDialog.mjs +26 -14
  47. package/dist/lib/chunk-ResetDialog.mjs.map +1 -1
  48. package/dist/lib/chunk-SpaceInvitationContainer.mjs +50 -0
  49. package/dist/lib/chunk-SpaceInvitationContainer.mjs.map +1 -0
  50. package/dist/lib/chunk-UsageContainer.mjs +22 -20
  51. package/dist/lib/chunk-UsageContainer.mjs.map +1 -1
  52. package/dist/lib/chunk-account-cache.mjs +2 -2
  53. package/dist/lib/chunk-account-cache.mjs.map +1 -1
  54. package/dist/lib/chunk-app-graph-builder.mjs +159 -60
  55. package/dist/lib/chunk-app-graph-builder.mjs.map +1 -1
  56. package/dist/lib/chunk-client-services.mjs +21 -0
  57. package/dist/lib/chunk-client-services.mjs.map +1 -0
  58. package/dist/lib/chunk-client.mjs +27 -20
  59. package/dist/lib/chunk-client.mjs.map +1 -1
  60. package/dist/lib/chunk-constants.mjs +2 -1
  61. package/dist/lib/chunk-constants.mjs.map +1 -1
  62. package/dist/lib/chunk-create-agent.mjs +1 -1
  63. package/dist/lib/chunk-create-agent.mjs.map +1 -1
  64. package/dist/lib/chunk-create-identity.mjs +2 -2
  65. package/dist/lib/chunk-create-identity.mjs.map +1 -1
  66. package/dist/lib/chunk-create-passkey.mjs +49 -40
  67. package/dist/lib/chunk-create-passkey.mjs.map +1 -1
  68. package/dist/lib/chunk-create-recovery-code.mjs +2 -2
  69. package/dist/lib/chunk-create-recovery-code.mjs.map +1 -1
  70. package/dist/lib/chunk-grant-service-access.mjs +1 -1
  71. package/dist/lib/chunk-grant-service-access.mjs.map +1 -1
  72. package/dist/lib/chunk-halo.mjs +414 -0
  73. package/dist/lib/chunk-halo.mjs.map +1 -0
  74. package/dist/lib/chunk-identity-lifecycle.mjs +74 -0
  75. package/dist/lib/chunk-identity-lifecycle.mjs.map +1 -0
  76. package/dist/lib/chunk-join-identity.mjs +2 -2
  77. package/dist/lib/chunk-join-identity.mjs.map +1 -1
  78. package/dist/lib/chunk-layer-specs.mjs +72 -5
  79. package/dist/lib/chunk-layer-specs.mjs.map +1 -1
  80. package/dist/lib/chunk-navigation-handler.mjs +28 -5
  81. package/dist/lib/chunk-navigation-handler.mjs.map +1 -1
  82. package/dist/lib/chunk-navigation-target-loader.mjs +8 -9
  83. package/dist/lib/chunk-navigation-target-loader.mjs.map +1 -1
  84. package/dist/lib/chunk-open-usage.mjs +3 -3
  85. package/dist/lib/chunk-open-usage.mjs.map +1 -1
  86. package/dist/lib/chunk-react-context.mjs +5 -5
  87. package/dist/lib/chunk-react-context.mjs.map +1 -1
  88. package/dist/lib/chunk-react-surface.mjs +80 -64
  89. package/dist/lib/chunk-react-surface.mjs.map +1 -1
  90. package/dist/lib/chunk-recover-identity.mjs +2 -2
  91. package/dist/lib/chunk-recover-identity.mjs.map +1 -1
  92. package/dist/lib/chunk-redeem-passkey.mjs +7 -5
  93. package/dist/lib/chunk-redeem-passkey.mjs.map +1 -1
  94. package/dist/lib/chunk-redeem-token.mjs +1 -1
  95. package/dist/lib/chunk-redeem-token.mjs.map +1 -1
  96. package/dist/lib/chunk-remote-trace-monitor.mjs +3 -2
  97. package/dist/lib/chunk-remote-trace-monitor.mjs.map +1 -1
  98. package/dist/lib/chunk-reset-storage.mjs +6 -3
  99. package/dist/lib/chunk-reset-storage.mjs.map +1 -1
  100. package/dist/lib/chunk-resolve-navigation-targets.mjs +3 -3
  101. package/dist/lib/chunk-resolve-navigation-targets.mjs.map +1 -1
  102. package/dist/lib/chunk-revoke-recovery-credential.mjs +1 -1
  103. package/dist/lib/chunk-revoke-recovery-credential.mjs.map +1 -1
  104. package/dist/lib/chunk-share-identity.mjs +2 -2
  105. package/dist/lib/chunk-share-identity.mjs.map +1 -1
  106. package/dist/lib/chunk-space-replication-progress.mjs +49 -7
  107. package/dist/lib/chunk-space-replication-progress.mjs.map +1 -1
  108. package/dist/lib/chunk-trace-progress.mjs +5 -5
  109. package/dist/lib/chunk-trace-progress.mjs.map +1 -1
  110. package/dist/lib/chunk-update-profile.mjs +1 -1
  111. package/dist/lib/chunk-update-profile.mjs.map +1 -1
  112. package/dist/lib/chunk-useAccountUrl.mjs +23 -0
  113. package/dist/lib/chunk-useAccountUrl.mjs.map +1 -0
  114. package/dist/lib/chunk-useHubClient.mjs +30 -0
  115. package/dist/lib/chunk-useHubClient.mjs.map +1 -0
  116. package/dist/lib/commands.mjs +1 -1
  117. package/dist/lib/commands.mjs.map +1 -1
  118. package/dist/lib/commands.node.mjs +771 -1
  119. package/dist/lib/commands.node.mjs.map +1 -1
  120. package/dist/lib/components.mjs +91 -0
  121. package/dist/lib/components.mjs.map +1 -0
  122. package/dist/lib/containers.mjs +5 -1
  123. package/dist/lib/containers.mjs.map +1 -1
  124. package/dist/lib/index.mjs +2 -27
  125. package/dist/lib/meta.mjs.map +1 -1
  126. package/dist/lib/ns/HaloServices.mjs +2 -0
  127. package/dist/lib/operations.mjs +3 -3
  128. package/dist/lib/operations.mjs.map +1 -1
  129. package/dist/lib/plugin.mjs +2 -2
  130. package/dist/lib/plugin.mjs.map +1 -1
  131. package/dist/lib/testing.mjs +71 -2
  132. package/dist/lib/testing.mjs.map +1 -1
  133. package/dist/lib/translations.mjs +26 -5
  134. package/dist/lib/translations.mjs.map +1 -1
  135. package/dist/lib/types.mjs +3 -1
  136. package/dist/types/src/HaloServices.d.ts +2 -0
  137. package/dist/types/src/HaloServices.d.ts.map +1 -0
  138. package/dist/types/src/capabilities/client-services.d.ts +9 -0
  139. package/dist/types/src/capabilities/client-services.d.ts.map +1 -0
  140. package/dist/types/src/capabilities/client.d.ts +33 -2
  141. package/dist/types/src/capabilities/client.d.ts.map +1 -1
  142. package/dist/types/src/capabilities/commands.d.ts +1 -1
  143. package/dist/types/src/capabilities/commands.d.ts.map +1 -1
  144. package/dist/types/src/capabilities/commands.node.d.ts +1 -1
  145. package/dist/types/src/capabilities/commands.node.d.ts.map +1 -1
  146. package/dist/types/src/capabilities/gen/browser.d.ts +45 -0
  147. package/dist/types/src/capabilities/gen/browser.d.ts.map +1 -0
  148. package/dist/types/src/capabilities/gen/node.d.ts +3 -1
  149. package/dist/types/src/capabilities/gen/node.d.ts.map +1 -1
  150. package/dist/types/src/capabilities/gen/tauri.d.ts +45 -0
  151. package/dist/types/src/capabilities/gen/tauri.d.ts.map +1 -0
  152. package/dist/types/src/capabilities/gen/workerd.d.ts +2 -0
  153. package/dist/types/src/capabilities/gen/workerd.d.ts.map +1 -1
  154. package/dist/types/src/capabilities/identity-lifecycle.d.ts +14 -0
  155. package/dist/types/src/capabilities/identity-lifecycle.d.ts.map +1 -0
  156. package/dist/types/src/capabilities/index.d.ts +5 -3
  157. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  158. package/dist/types/src/capabilities/navigation-handler/index.d.ts +1 -1
  159. package/dist/types/src/capabilities/navigation-handler/index.d.ts.map +1 -1
  160. package/dist/types/src/capabilities/navigation-handler/navigation-handler.d.ts.map +1 -1
  161. package/dist/types/src/capabilities/navigation-target-loader.d.ts +1 -6
  162. package/dist/types/src/capabilities/navigation-target-loader.d.ts.map +1 -1
  163. package/dist/types/src/capabilities/react-surface.d.ts +2 -2
  164. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  165. package/dist/types/src/capabilities/remote-trace-monitor.d.ts +1 -1
  166. package/dist/types/src/capabilities/remote-trace-monitor.d.ts.map +1 -1
  167. package/dist/types/src/capabilities/trace-progress.d.ts +2 -2
  168. package/dist/types/src/commands/account/index.d.ts +1 -1
  169. package/dist/types/src/commands/account/index.d.ts.map +1 -1
  170. package/dist/types/src/commands/account/invitation/create/create.d.ts +4 -3
  171. package/dist/types/src/commands/account/invitation/create/create.d.ts.map +1 -1
  172. package/dist/types/src/commands/account/invitation/create/index.d.ts +1 -1
  173. package/dist/types/src/commands/account/invitation/create/index.d.ts.map +1 -1
  174. package/dist/types/src/commands/account/invitation/index.d.ts +2 -2
  175. package/dist/types/src/commands/account/invitation/index.d.ts.map +1 -1
  176. package/dist/types/src/commands/account/login/index.d.ts +1 -1
  177. package/dist/types/src/commands/account/login/index.d.ts.map +1 -1
  178. package/dist/types/src/commands/account/login/login.d.ts +6 -5
  179. package/dist/types/src/commands/account/login/login.d.ts.map +1 -1
  180. package/dist/types/src/commands/account/logout/index.d.ts +1 -1
  181. package/dist/types/src/commands/account/logout/index.d.ts.map +1 -1
  182. package/dist/types/src/commands/account/logout/logout.d.ts +2 -2
  183. package/dist/types/src/commands/account/logout/logout.d.ts.map +1 -1
  184. package/dist/types/src/commands/account/signup/index.d.ts +1 -1
  185. package/dist/types/src/commands/account/signup/index.d.ts.map +1 -1
  186. package/dist/types/src/commands/account/signup/signup.d.ts +5 -4
  187. package/dist/types/src/commands/account/signup/signup.d.ts.map +1 -1
  188. package/dist/types/src/commands/account/util.d.ts +1 -1
  189. package/dist/types/src/commands/account/util.d.ts.map +1 -1
  190. package/dist/types/src/commands/config/index.d.ts +1 -1
  191. package/dist/types/src/commands/config/index.d.ts.map +1 -1
  192. package/dist/types/src/commands/config/view.d.ts +1 -1
  193. package/dist/types/src/commands/config/view.d.ts.map +1 -1
  194. package/dist/types/src/commands/device/index.d.ts +1 -1
  195. package/dist/types/src/commands/device/index.d.ts.map +1 -1
  196. package/dist/types/src/commands/device/info/index.d.ts +1 -1
  197. package/dist/types/src/commands/device/info/index.d.ts.map +1 -1
  198. package/dist/types/src/commands/device/info/info.d.ts +1 -1
  199. package/dist/types/src/commands/device/info/info.d.ts.map +1 -1
  200. package/dist/types/src/commands/device/list/index.d.ts +1 -1
  201. package/dist/types/src/commands/device/list/index.d.ts.map +1 -1
  202. package/dist/types/src/commands/device/list/list.d.ts +1 -1
  203. package/dist/types/src/commands/device/list/list.d.ts.map +1 -1
  204. package/dist/types/src/commands/device/update/index.d.ts +1 -1
  205. package/dist/types/src/commands/device/update/index.d.ts.map +1 -1
  206. package/dist/types/src/commands/device/update/update.d.ts +1 -1
  207. package/dist/types/src/commands/device/update/update.d.ts.map +1 -1
  208. package/dist/types/src/commands/device/util.d.ts +1 -1
  209. package/dist/types/src/commands/device/util.d.ts.map +1 -1
  210. package/dist/types/src/commands/edge/index.d.ts +1 -1
  211. package/dist/types/src/commands/edge/index.d.ts.map +1 -1
  212. package/dist/types/src/commands/edge/status.d.ts +1 -1
  213. package/dist/types/src/commands/edge/status.d.ts.map +1 -1
  214. package/dist/types/src/commands/errors.d.ts +33 -0
  215. package/dist/types/src/commands/errors.d.ts.map +1 -0
  216. package/dist/types/src/commands/halo/credential/add/add.d.ts +5 -4
  217. package/dist/types/src/commands/halo/credential/add/add.d.ts.map +1 -1
  218. package/dist/types/src/commands/halo/credential/add/index.d.ts +1 -1
  219. package/dist/types/src/commands/halo/credential/add/index.d.ts.map +1 -1
  220. package/dist/types/src/commands/halo/credential/index.d.ts +2 -2
  221. package/dist/types/src/commands/halo/credential/index.d.ts.map +1 -1
  222. package/dist/types/src/commands/halo/credential/list/index.d.ts +1 -1
  223. package/dist/types/src/commands/halo/credential/list/index.d.ts.map +1 -1
  224. package/dist/types/src/commands/halo/credential/list/list.d.ts +1 -1
  225. package/dist/types/src/commands/halo/credential/list/list.d.ts.map +1 -1
  226. package/dist/types/src/commands/halo/identity/identity.d.ts +1 -1
  227. package/dist/types/src/commands/halo/identity/identity.d.ts.map +1 -1
  228. package/dist/types/src/commands/halo/identity/index.d.ts +1 -1
  229. package/dist/types/src/commands/halo/identity/index.d.ts.map +1 -1
  230. package/dist/types/src/commands/halo/index.d.ts +1 -1
  231. package/dist/types/src/commands/halo/index.d.ts.map +1 -1
  232. package/dist/types/src/commands/halo/keys/index.d.ts +1 -1
  233. package/dist/types/src/commands/halo/keys/index.d.ts.map +1 -1
  234. package/dist/types/src/commands/halo/keys/keys.d.ts +1 -1
  235. package/dist/types/src/commands/halo/keys/keys.d.ts.map +1 -1
  236. package/dist/types/src/commands/halo/seed/index.d.ts +1 -1
  237. package/dist/types/src/commands/halo/seed/index.d.ts.map +1 -1
  238. package/dist/types/src/commands/halo/seed/seed.d.ts +1 -1
  239. package/dist/types/src/commands/halo/seed/seed.d.ts.map +1 -1
  240. package/dist/types/src/commands/halo/share/index.d.ts +1 -1
  241. package/dist/types/src/commands/halo/share/index.d.ts.map +1 -1
  242. package/dist/types/src/commands/halo/share/share.d.ts +4 -3
  243. package/dist/types/src/commands/halo/share/share.d.ts.map +1 -1
  244. package/dist/types/src/commands/halo/update/index.d.ts +1 -1
  245. package/dist/types/src/commands/halo/update/index.d.ts.map +1 -1
  246. package/dist/types/src/commands/halo/update/update.d.ts +1 -1
  247. package/dist/types/src/commands/halo/update/update.d.ts.map +1 -1
  248. package/dist/types/src/commands/halo/util.d.ts +2 -2
  249. package/dist/types/src/commands/halo/util.d.ts.map +1 -1
  250. package/dist/types/src/commands/index.d.ts +6 -6
  251. package/dist/types/src/commands/index.d.ts.map +1 -1
  252. package/dist/types/src/commands/profile/create.d.ts +1 -1
  253. package/dist/types/src/commands/profile/create.d.ts.map +1 -1
  254. package/dist/types/src/commands/profile/delete.d.ts +1 -1
  255. package/dist/types/src/commands/profile/delete.d.ts.map +1 -1
  256. package/dist/types/src/commands/profile/import.d.ts +5 -4
  257. package/dist/types/src/commands/profile/import.d.ts.map +1 -1
  258. package/dist/types/src/commands/profile/index.d.ts +2 -2
  259. package/dist/types/src/commands/profile/index.d.ts.map +1 -1
  260. package/dist/types/src/commands/profile/inspect.d.ts +1 -1
  261. package/dist/types/src/commands/profile/inspect.d.ts.map +1 -1
  262. package/dist/types/src/commands/profile/list.d.ts +1 -1
  263. package/dist/types/src/commands/profile/list.d.ts.map +1 -1
  264. package/dist/types/src/commands/profile/reset.d.ts +2 -2
  265. package/dist/types/src/commands/profile/reset.d.ts.map +1 -1
  266. package/dist/types/src/components/DevicesForm/DevicesForm.d.ts +19 -0
  267. package/dist/types/src/components/DevicesForm/DevicesForm.d.ts.map +1 -0
  268. package/dist/types/src/components/DevicesForm/DevicesForm.stories.d.ts +207 -0
  269. package/dist/types/src/components/DevicesForm/DevicesForm.stories.d.ts.map +1 -0
  270. package/dist/types/src/components/DevicesForm/index.d.ts +2 -0
  271. package/dist/types/src/components/DevicesForm/index.d.ts.map +1 -0
  272. package/dist/types/src/components/index.d.ts +1 -0
  273. package/dist/types/src/components/index.d.ts.map +1 -1
  274. package/dist/types/src/constants.d.ts +1 -0
  275. package/dist/types/src/constants.d.ts.map +1 -1
  276. package/dist/types/src/containers/AccountContainer/AccountContainer.stories.d.ts +1 -1
  277. package/dist/types/src/containers/AccountContainer/AccountContainer.stories.d.ts.map +1 -1
  278. package/dist/types/src/containers/AccountContainer/index.d.ts +1 -1
  279. package/dist/types/src/containers/AccountContainer/index.d.ts.map +1 -1
  280. package/dist/types/src/containers/CliLoginDialog/CliLoginDialog.d.ts +12 -0
  281. package/dist/types/src/containers/CliLoginDialog/CliLoginDialog.d.ts.map +1 -0
  282. package/dist/types/src/containers/CliLoginDialog/index.d.ts +4 -0
  283. package/dist/types/src/containers/CliLoginDialog/index.d.ts.map +1 -0
  284. package/dist/types/src/containers/ContactPickerContainer/ContactPickerContainer.d.ts +8 -0
  285. package/dist/types/src/containers/ContactPickerContainer/ContactPickerContainer.d.ts.map +1 -0
  286. package/dist/types/src/containers/ContactPickerContainer/ContactPickerContainer.stories.d.ts +206 -0
  287. package/dist/types/src/containers/ContactPickerContainer/ContactPickerContainer.stories.d.ts.map +1 -0
  288. package/dist/types/src/containers/ContactPickerContainer/index.d.ts +2 -0
  289. package/dist/types/src/containers/ContactPickerContainer/index.d.ts.map +1 -0
  290. package/dist/types/src/containers/ContactsContainer/ContactsContainer.d.ts +3 -0
  291. package/dist/types/src/containers/ContactsContainer/ContactsContainer.d.ts.map +1 -0
  292. package/dist/types/src/containers/ContactsContainer/ContactsContainer.stories.d.ts +203 -0
  293. package/dist/types/src/containers/ContactsContainer/ContactsContainer.stories.d.ts.map +1 -0
  294. package/dist/types/src/containers/ContactsContainer/index.d.ts +2 -0
  295. package/dist/types/src/containers/ContactsContainer/index.d.ts.map +1 -0
  296. package/dist/types/src/containers/DevicesContainer/DevicesContainer.d.ts.map +1 -1
  297. package/dist/types/src/containers/DevicesContainer/DevicesContainer.stories.d.ts +19 -1
  298. package/dist/types/src/containers/DevicesContainer/DevicesContainer.stories.d.ts.map +1 -1
  299. package/dist/types/src/containers/DevicesContainer/index.d.ts +1 -1
  300. package/dist/types/src/containers/DevicesContainer/index.d.ts.map +1 -1
  301. package/dist/types/src/containers/InvitationsContainer/InvitationsContainer.stories.d.ts +1 -1
  302. package/dist/types/src/containers/InvitationsContainer/InvitationsContainer.stories.d.ts.map +1 -1
  303. package/dist/types/src/containers/InvitationsContainer/index.d.ts +1 -1
  304. package/dist/types/src/containers/InvitationsContainer/index.d.ts.map +1 -1
  305. package/dist/types/src/containers/JoinDialog/JoinDialog.d.ts.map +1 -1
  306. package/dist/types/src/containers/JoinDialog/JoinDialog.stories.d.ts +1 -1
  307. package/dist/types/src/containers/JoinDialog/JoinDialog.stories.d.ts.map +1 -1
  308. package/dist/types/src/containers/JoinDialog/index.d.ts +1 -1
  309. package/dist/types/src/containers/JoinDialog/index.d.ts.map +1 -1
  310. package/dist/types/src/containers/ProfileContainer/ProfileContainer.d.ts.map +1 -1
  311. package/dist/types/src/containers/ProfileContainer/ProfileContainer.stories.d.ts +1 -1
  312. package/dist/types/src/containers/ProfileContainer/ProfileContainer.stories.d.ts.map +1 -1
  313. package/dist/types/src/containers/ProfileContainer/index.d.ts +1 -1
  314. package/dist/types/src/containers/ProfileContainer/index.d.ts.map +1 -1
  315. package/dist/types/src/containers/RecoveryCodeDialog/RecoveryCodeDialog.d.ts.map +1 -1
  316. package/dist/types/src/containers/RecoveryCodeDialog/RecoveryCodeDialog.stories.d.ts.map +1 -1
  317. package/dist/types/src/containers/RecoveryCodeDialog/index.d.ts +2 -2
  318. package/dist/types/src/containers/RecoveryCodeDialog/index.d.ts.map +1 -1
  319. package/dist/types/src/containers/RecoveryCredentialsContainer/RecoveryCredentialsContainer.d.ts.map +1 -1
  320. package/dist/types/src/containers/RecoveryCredentialsContainer/RecoveryCredentialsContainer.stories.d.ts +1 -1
  321. package/dist/types/src/containers/RecoveryCredentialsContainer/RecoveryCredentialsContainer.stories.d.ts.map +1 -1
  322. package/dist/types/src/containers/RecoveryCredentialsContainer/index.d.ts +1 -1
  323. package/dist/types/src/containers/RecoveryCredentialsContainer/index.d.ts.map +1 -1
  324. package/dist/types/src/containers/ResetDialog/ResetDialog.d.ts +6 -7
  325. package/dist/types/src/containers/ResetDialog/ResetDialog.d.ts.map +1 -1
  326. package/dist/types/src/containers/ResetDialog/ResetDialog.stories.d.ts +2 -2
  327. package/dist/types/src/containers/ResetDialog/ResetDialog.stories.d.ts.map +1 -1
  328. package/dist/types/src/containers/ResetDialog/index.d.ts +2 -2
  329. package/dist/types/src/containers/ResetDialog/index.d.ts.map +1 -1
  330. package/dist/types/src/containers/SpaceInvitationContainer/SpaceInvitationContainer.d.ts +10 -0
  331. package/dist/types/src/containers/SpaceInvitationContainer/SpaceInvitationContainer.d.ts.map +1 -0
  332. package/dist/types/src/containers/SpaceInvitationContainer/index.d.ts +2 -0
  333. package/dist/types/src/containers/SpaceInvitationContainer/index.d.ts.map +1 -0
  334. package/dist/types/src/containers/UsageContainer/UsageView.d.ts.map +1 -1
  335. package/dist/types/src/containers/UsageContainer/UsageView.stories.d.ts +1 -1
  336. package/dist/types/src/containers/UsageContainer/UsageView.stories.d.ts.map +1 -1
  337. package/dist/types/src/containers/UsageContainer/index.d.ts +1 -1
  338. package/dist/types/src/containers/UsageContainer/index.d.ts.map +1 -1
  339. package/dist/types/src/containers/index.d.ts +9 -3
  340. package/dist/types/src/containers/index.d.ts.map +1 -1
  341. package/dist/types/src/hooks/index.d.ts +2 -2
  342. package/dist/types/src/hooks/index.d.ts.map +1 -1
  343. package/dist/types/src/index.d.ts +2 -5
  344. package/dist/types/src/index.d.ts.map +1 -1
  345. package/dist/types/src/operations/create-agent.d.ts +2 -2
  346. package/dist/types/src/operations/create-agent.d.ts.map +1 -1
  347. package/dist/types/src/operations/create-identity.d.ts +2 -2
  348. package/dist/types/src/operations/create-identity.d.ts.map +1 -1
  349. package/dist/types/src/operations/create-passkey.d.ts +2 -2
  350. package/dist/types/src/operations/create-passkey.d.ts.map +1 -1
  351. package/dist/types/src/operations/create-recovery-code.d.ts +2 -2
  352. package/dist/types/src/operations/create-recovery-code.d.ts.map +1 -1
  353. package/dist/types/src/operations/grant-service-access.d.ts +2 -2
  354. package/dist/types/src/operations/grant-service-access.d.ts.map +1 -1
  355. package/dist/types/src/operations/index.d.ts +1 -1
  356. package/dist/types/src/operations/index.d.ts.map +1 -1
  357. package/dist/types/src/operations/join-identity.d.ts +2 -2
  358. package/dist/types/src/operations/join-identity.d.ts.map +1 -1
  359. package/dist/types/src/operations/open-usage.d.ts +2 -2
  360. package/dist/types/src/operations/open-usage.d.ts.map +1 -1
  361. package/dist/types/src/operations/recover-identity.d.ts +2 -2
  362. package/dist/types/src/operations/recover-identity.d.ts.map +1 -1
  363. package/dist/types/src/operations/redeem-passkey.d.ts +2 -2
  364. package/dist/types/src/operations/redeem-passkey.d.ts.map +1 -1
  365. package/dist/types/src/operations/redeem-token.d.ts +2 -2
  366. package/dist/types/src/operations/redeem-token.d.ts.map +1 -1
  367. package/dist/types/src/operations/reset-storage.d.ts +2 -2
  368. package/dist/types/src/operations/reset-storage.d.ts.map +1 -1
  369. package/dist/types/src/operations/revoke-recovery-credential.d.ts +2 -2
  370. package/dist/types/src/operations/revoke-recovery-credential.d.ts.map +1 -1
  371. package/dist/types/src/operations/share-identity.d.ts +2 -2
  372. package/dist/types/src/operations/share-identity.d.ts.map +1 -1
  373. package/dist/types/src/operations/update-profile.d.ts +2 -2
  374. package/dist/types/src/operations/update-profile.d.ts.map +1 -1
  375. package/dist/types/src/plugin.d.ts.map +1 -1
  376. package/dist/types/src/progress/index.d.ts +2 -2
  377. package/dist/types/src/progress/index.d.ts.map +1 -1
  378. package/dist/types/src/progress/space-sync-progress.d.ts +10 -1
  379. package/dist/types/src/progress/space-sync-progress.d.ts.map +1 -1
  380. package/dist/types/src/testing/ClientPluginManager.d.ts +18 -0
  381. package/dist/types/src/testing/ClientPluginManager.d.ts.map +1 -0
  382. package/dist/types/src/testing/createFakeContacts.d.ts +16 -0
  383. package/dist/types/src/testing/createFakeContacts.d.ts.map +1 -0
  384. package/dist/types/src/testing/index.d.ts +4 -2
  385. package/dist/types/src/testing/index.d.ts.map +1 -1
  386. package/dist/types/src/testing/initializeIdentity.d.ts +1 -1
  387. package/dist/types/src/testing/initializeIdentity.d.ts.map +1 -1
  388. package/dist/types/src/translations.d.ts +2 -2
  389. package/dist/types/src/translations.d.ts.map +1 -1
  390. package/dist/types/src/types/Account.d.ts +21 -7
  391. package/dist/types/src/types/Account.d.ts.map +1 -1
  392. package/dist/types/src/types/CliLogin.d.ts +33 -0
  393. package/dist/types/src/types/CliLogin.d.ts.map +1 -0
  394. package/dist/types/src/types/ClientCapabilities.d.ts +32 -3
  395. package/dist/types/src/types/ClientCapabilities.d.ts.map +1 -1
  396. package/dist/types/src/types/ClientEvents.d.ts +5 -1
  397. package/dist/types/src/types/ClientEvents.d.ts.map +1 -1
  398. package/dist/types/src/{operations/definitions.d.ts → types/ClientOperation.d.ts} +2 -1
  399. package/dist/types/src/types/ClientOperation.d.ts.map +1 -0
  400. package/dist/types/src/types/ClientOptions.d.ts +1 -8
  401. package/dist/types/src/types/ClientOptions.d.ts.map +1 -1
  402. package/dist/types/src/types/PasskeyError.d.ts +112 -11
  403. package/dist/types/src/types/PasskeyError.d.ts.map +1 -1
  404. package/dist/types/src/types/index.d.ts +9 -7
  405. package/dist/types/src/types/index.d.ts.map +1 -1
  406. package/dist/types/tsconfig.tsbuildinfo +1 -1
  407. package/package.json +72 -61
  408. package/src/HaloServices.ts +7 -0
  409. package/src/capabilities/account-cache.ts +2 -2
  410. package/src/capabilities/app-graph-builder.ts +165 -69
  411. package/src/capabilities/client-services.ts +25 -0
  412. package/src/capabilities/client.ts +17 -12
  413. package/src/capabilities/commands.node.ts +1 -1
  414. package/src/capabilities/commands.ts +1 -1
  415. package/src/capabilities/gen/browser.ts +192 -0
  416. package/src/capabilities/gen/node.ts +48 -19
  417. package/src/capabilities/gen/tauri.ts +192 -0
  418. package/src/capabilities/gen/workerd.ts +41 -13
  419. package/src/capabilities/identity-lifecycle.ts +86 -0
  420. package/src/capabilities/index.ts +57 -26
  421. package/src/capabilities/layer-specs.ts +107 -4
  422. package/src/capabilities/navigation-handler/index.ts +2 -2
  423. package/src/capabilities/navigation-handler/navigation-handler.ts +20 -1
  424. package/src/capabilities/navigation-target-loader.ts +15 -10
  425. package/src/capabilities/react-context.tsx +2 -2
  426. package/src/capabilities/react-surface.ts +43 -18
  427. package/src/capabilities/remote-trace-monitor.ts +5 -2
  428. package/src/capabilities/schema-defs.test.ts +2 -2
  429. package/src/capabilities/space-replication-progress.ts +12 -7
  430. package/src/capabilities/trace-progress.ts +6 -6
  431. package/src/commands/account/index.ts +5 -5
  432. package/src/commands/account/invitation/create/create.ts +9 -5
  433. package/src/commands/account/invitation/create/index.ts +1 -1
  434. package/src/commands/account/invitation/index.ts +2 -2
  435. package/src/commands/account/login/index.ts +1 -1
  436. package/src/commands/account/login/login.ts +108 -37
  437. package/src/commands/account/logout/index.ts +1 -1
  438. package/src/commands/account/logout/logout.ts +8 -5
  439. package/src/commands/account/signup/index.ts +1 -1
  440. package/src/commands/account/signup/signup.ts +33 -19
  441. package/src/commands/account/util.test.ts +1 -1
  442. package/src/commands/account/util.ts +2 -2
  443. package/src/commands/config/index.ts +2 -2
  444. package/src/commands/config/view.ts +1 -1
  445. package/src/commands/device/index.ts +4 -4
  446. package/src/commands/device/info/index.ts +1 -1
  447. package/src/commands/device/info/info.test.ts +4 -3
  448. package/src/commands/device/info/info.ts +5 -4
  449. package/src/commands/device/list/index.ts +1 -1
  450. package/src/commands/device/list/list.test.ts +2 -2
  451. package/src/commands/device/list/list.ts +2 -2
  452. package/src/commands/device/update/index.ts +1 -1
  453. package/src/commands/device/update/update.ts +8 -9
  454. package/src/commands/device/util.ts +6 -5
  455. package/src/commands/edge/index.ts +2 -2
  456. package/src/commands/edge/status.ts +1 -1
  457. package/src/commands/errors.ts +8 -0
  458. package/src/commands/halo/credential/add/add.ts +13 -16
  459. package/src/commands/halo/credential/add/index.ts +1 -1
  460. package/src/commands/halo/credential/index.ts +3 -3
  461. package/src/commands/halo/credential/list/index.ts +1 -1
  462. package/src/commands/halo/credential/list/list.test.ts +2 -2
  463. package/src/commands/halo/credential/list/list.ts +15 -14
  464. package/src/commands/halo/identity/identity.test.ts +7 -3
  465. package/src/commands/halo/identity/identity.ts +2 -2
  466. package/src/commands/halo/identity/index.ts +1 -1
  467. package/src/commands/halo/index.ts +7 -7
  468. package/src/commands/halo/keys/index.ts +1 -1
  469. package/src/commands/halo/keys/keys.test.ts +5 -4
  470. package/src/commands/halo/keys/keys.ts +6 -5
  471. package/src/commands/halo/seed/index.ts +1 -1
  472. package/src/commands/halo/seed/seed.ts +1 -1
  473. package/src/commands/halo/share/index.ts +1 -1
  474. package/src/commands/halo/share/share.ts +15 -10
  475. package/src/commands/halo/update/index.ts +1 -1
  476. package/src/commands/halo/update/update.test.ts +2 -2
  477. package/src/commands/halo/update/update.ts +7 -17
  478. package/src/commands/halo/util.ts +11 -7
  479. package/src/commands/index.ts +6 -6
  480. package/src/commands/profile/create.ts +5 -5
  481. package/src/commands/profile/delete.ts +4 -4
  482. package/src/commands/profile/import.ts +17 -14
  483. package/src/commands/profile/index.ts +7 -7
  484. package/src/commands/profile/inspect.ts +9 -6
  485. package/src/commands/profile/list.ts +2 -2
  486. package/src/commands/profile/reset.ts +9 -6
  487. package/src/components/DevicesForm/DevicesForm.stories.tsx +62 -0
  488. package/src/components/DevicesForm/DevicesForm.tsx +100 -0
  489. package/src/components/DevicesForm/index.ts +5 -0
  490. package/src/components/index.ts +2 -0
  491. package/src/constants.ts +1 -0
  492. package/src/containers/AccountContainer/AccountContainer.stories.tsx +3 -3
  493. package/src/containers/AccountContainer/AccountContainer.tsx +54 -43
  494. package/src/containers/AccountContainer/index.ts +1 -1
  495. package/src/containers/CliLoginDialog/CliLoginDialog.tsx +159 -0
  496. package/src/containers/CliLoginDialog/index.ts +8 -0
  497. package/src/containers/ContactPickerContainer/ContactPickerContainer.stories.tsx +66 -0
  498. package/src/containers/ContactPickerContainer/ContactPickerContainer.tsx +126 -0
  499. package/src/containers/ContactPickerContainer/index.ts +5 -0
  500. package/src/containers/ContactsContainer/ContactsContainer.stories.tsx +48 -0
  501. package/src/containers/ContactsContainer/ContactsContainer.tsx +61 -0
  502. package/src/containers/ContactsContainer/index.ts +5 -0
  503. package/src/containers/DevicesContainer/DevicesContainer.stories.tsx +3 -3
  504. package/src/containers/DevicesContainer/DevicesContainer.tsx +45 -103
  505. package/src/containers/DevicesContainer/index.ts +1 -1
  506. package/src/containers/InvitationsContainer/InvitationsContainer.stories.tsx +3 -3
  507. package/src/containers/InvitationsContainer/InvitationsContainer.tsx +63 -60
  508. package/src/containers/InvitationsContainer/index.ts +1 -1
  509. package/src/containers/JoinDialog/JoinDialog.stories.tsx +5 -7
  510. package/src/containers/JoinDialog/JoinDialog.tsx +10 -9
  511. package/src/containers/JoinDialog/index.ts +1 -1
  512. package/src/containers/ProfileContainer/ProfileContainer.stories.tsx +3 -3
  513. package/src/containers/ProfileContainer/ProfileContainer.tsx +72 -55
  514. package/src/containers/ProfileContainer/index.ts +1 -1
  515. package/src/containers/RecoveryCodeDialog/RecoveryCodeDialog.stories.tsx +5 -6
  516. package/src/containers/RecoveryCodeDialog/RecoveryCodeDialog.tsx +27 -29
  517. package/src/containers/RecoveryCodeDialog/index.ts +2 -2
  518. package/src/containers/RecoveryCredentialsContainer/RecoveryCredentialsContainer.stories.tsx +7 -7
  519. package/src/containers/RecoveryCredentialsContainer/RecoveryCredentialsContainer.tsx +69 -41
  520. package/src/containers/RecoveryCredentialsContainer/index.ts +1 -1
  521. package/src/containers/ResetDialog/ResetDialog.stories.tsx +9 -21
  522. package/src/containers/ResetDialog/ResetDialog.tsx +35 -24
  523. package/src/containers/ResetDialog/index.ts +2 -2
  524. package/src/containers/SpaceInvitationContainer/SpaceInvitationContainer.tsx +62 -0
  525. package/src/containers/SpaceInvitationContainer/index.ts +8 -0
  526. package/src/containers/UsageContainer/UsageContainer.tsx +4 -4
  527. package/src/containers/UsageContainer/UsageView.stories.tsx +1 -1
  528. package/src/containers/UsageContainer/UsageView.tsx +22 -24
  529. package/src/containers/UsageContainer/index.ts +1 -1
  530. package/src/containers/index.ts +23 -12
  531. package/src/hooks/index.ts +2 -2
  532. package/src/hooks/useAccountUrl.ts +1 -1
  533. package/src/hooks/useHubClient.ts +3 -3
  534. package/src/index.ts +2 -5
  535. package/src/meta.ts +1 -1
  536. package/src/operations/create-agent.ts +2 -2
  537. package/src/operations/create-identity.ts +5 -3
  538. package/src/operations/create-passkey.ts +59 -37
  539. package/src/operations/create-recovery-code.ts +16 -15
  540. package/src/operations/grant-service-access.ts +9 -8
  541. package/src/operations/index.ts +17 -30
  542. package/src/operations/join-identity.ts +3 -3
  543. package/src/operations/open-usage.ts +3 -3
  544. package/src/operations/recover-identity.ts +3 -3
  545. package/src/operations/redeem-passkey.ts +63 -65
  546. package/src/operations/redeem-token.ts +2 -2
  547. package/src/operations/reset-storage.ts +4 -3
  548. package/src/operations/resolve-navigation-targets.ts +1 -1
  549. package/src/operations/revoke-recovery-credential.ts +9 -8
  550. package/src/operations/share-identity.ts +2 -2
  551. package/src/operations/update-profile.ts +2 -2
  552. package/src/plugin.test.ts +2 -2
  553. package/src/plugin.ts +30 -25
  554. package/src/progress/index.ts +2 -2
  555. package/src/progress/space-sync-progress.test.ts +36 -13
  556. package/src/progress/space-sync-progress.ts +21 -6
  557. package/src/schema-defs.test.ts +2 -2
  558. package/src/testing/ClientPluginManager.tsx +44 -0
  559. package/src/testing/createFakeContacts.ts +57 -0
  560. package/src/testing/index.ts +4 -2
  561. package/src/testing/initializeIdentity.ts +6 -2
  562. package/src/translations.ts +33 -9
  563. package/src/types/Account.ts +27 -11
  564. package/src/types/CliLogin.ts +78 -0
  565. package/src/types/ClientCapabilities.ts +38 -4
  566. package/src/types/ClientEvents.ts +5 -1
  567. package/src/{operations/definitions.ts → types/ClientOperation.ts} +5 -1
  568. package/src/types/ClientOptions.ts +3 -7
  569. package/src/types/PasskeyError.test.ts +96 -1
  570. package/src/types/PasskeyError.ts +85 -15
  571. package/src/types/index.ts +9 -7
  572. package/dist/lib/chunk-commands.mjs +0 -1090
  573. package/dist/lib/chunk-commands.mjs.map +0 -1
  574. package/dist/lib/chunk-definitions.mjs.map +0 -1
  575. package/dist/lib/chunk-hooks.mjs +0 -49
  576. package/dist/lib/chunk-hooks.mjs.map +0 -1
  577. package/dist/lib/chunk-progress.mjs +0 -35
  578. package/dist/lib/chunk-progress.mjs.map +0 -1
  579. package/dist/lib/index.mjs.map +0 -1
  580. package/dist/types/src/operations/definitions.d.ts.map +0 -1
@@ -9,11 +9,31 @@ import { ClientCapabilities, ClientEvents } from "#types";
9
9
  var AccountCache = Capability.lazyModule("AccountCache", { provides: [ClientCapabilities.AccountCache] }, () => import("./chunk-account-cache.mjs"));
10
10
  var AppGraphBuilder = AppCapability.appGraphBuilder(() => import("./chunk-app-graph-builder.mjs"), { activatesOn: ClientEvents.Initialized });
11
11
  var Commands = AppCapability.commands(() => import("#commands"));
12
+ var ClientServices = Capability.lazyModule("ClientServices", {
13
+ requires: [ClientCapabilities.Client],
14
+ provides: [
15
+ ClientCapabilities.Config,
16
+ ClientCapabilities.EdgeHttpClient,
17
+ ClientCapabilities.Hypergraph
18
+ ],
19
+ activatesOn: ClientEvents.Initialized
20
+ }, () => import("./chunk-client-services.mjs"));
12
21
  var HubHttpClient = Capability.lazyModule("HubHttpClient", {
13
22
  requires: [ClientCapabilities.Client],
14
23
  provides: [ClientCapabilities.HubHttpClient],
15
24
  activatesOn: ClientEvents.Initialized
16
25
  }, () => import("./chunk-hub-http-client.mjs"));
26
+ var IdentityLifecycle = Capability.lazyModule("IdentityLifecycle", {
27
+ requires: [
28
+ ClientCapabilities.Client,
29
+ ClientCapabilities.AccountCache,
30
+ Capabilities.AtomRegistry,
31
+ Capabilities.OperationInvoker,
32
+ Capabilities.PluginManager
33
+ ],
34
+ provides: [],
35
+ activatesOn: ClientEvents.Initialized
36
+ }, () => import("./chunk-identity-lifecycle.mjs"));
17
37
  var LayerSpecs = AppCapability.layerSpec(() => import("./chunk-layer-specs.mjs"), { name: "LayerSpecs" });
18
38
  var NavigationTargetLoader = Capability.lazyModule("NavigationTargetLoader", {
19
39
  requires: [ClientCapabilities.Client],
@@ -27,16 +47,16 @@ var RemoteTraceMonitor = Capability.lazyModule("RemoteTraceMonitor", {
27
47
  var SpaceReplicationProgress = Capability.lazyModule("SpaceReplicationProgress", {
28
48
  requires: [ClientCapabilities.Client, Capabilities.ProcessManagerRuntime],
29
49
  provides: [],
30
- activatesOn: ClientEvents.SpacesReady
50
+ activatesOn: ClientEvents.SpacesAvailable
31
51
  }, () => import("./chunk-space-replication-progress.mjs"));
32
52
  var TraceProgress = Capability.lazyModule("TraceProgress", {
33
53
  requires: [
34
- Capabilities.ProcessMonitor,
54
+ Capabilities.ProcessManager,
35
55
  Capabilities.ProcessManagerRuntime,
36
56
  Capabilities.ServiceResolver
37
57
  ],
38
58
  provides: [],
39
- activatesOn: ClientEvents.SpacesReady
59
+ activatesOn: ClientEvents.SpacesAvailable
40
60
  }, () => import("./chunk-trace-progress.mjs"));
41
61
  var Translations = AppCapability.translations(translations);
42
62
  var Client = void 0;
@@ -46,6 +66,6 @@ var ReactContext = void 0;
46
66
  var ReactSurface = void 0;
47
67
  var SchemaDefs = void 0;
48
68
  //#endregion
49
- export { AccountCache, AppGraphBuilder, Client, Commands, HubHttpClient, LayerSpecs, Migrations, NavigationHandler, NavigationTargetLoader, OperationHandler, ReactContext, ReactSurface, RemoteTraceMonitor, SchemaDefs, SpaceReplicationProgress, TraceProgress, Translations };
69
+ export { AccountCache, AppGraphBuilder, Client, ClientServices, Commands, HubHttpClient, IdentityLifecycle, LayerSpecs, Migrations, NavigationHandler, NavigationTargetLoader, OperationHandler, ReactContext, ReactSurface, RemoteTraceMonitor, SchemaDefs, SpaceReplicationProgress, TraceProgress, Translations };
50
70
 
51
71
  //# sourceMappingURL=capabilities.workerd.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"capabilities.workerd.mjs","names":[],"sources":["../../src/capabilities/gen/workerd.ts"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\n// GENERATED by dx-plugin — do not edit. Sliced from ../index.ts for the 'workerd' condition.\n\nimport * as ActivationEvents from '@dxos/app-framework/ActivationEvents';\nimport * as Capabilities from '@dxos/app-framework/Capabilities';\nimport * as Capability from '@dxos/app-framework/Capability';\nimport * as AppCapabilities from '@dxos/app-toolkit/AppCapabilities';\nimport * as AppCapability from '@dxos/app-toolkit/AppCapability';\n\nimport { translations } from '#translations';\nimport { ClientCapabilities, ClientEvents, ClientOptions } from '#types';\n\nexport const AccountCache = Capability.lazyModule(\n 'AccountCache',\n { provides: [ClientCapabilities.AccountCache] },\n () => import('../account-cache'),\n);\n\n// Its connectors read `client.halo`/`client.mesh` inside atom computations (initialized-only,\n// and a pre-init throw is not re-evaluated when initialization lands).\nexport const AppGraphBuilder = AppCapability.appGraphBuilder(() => import('../app-graph-builder'), {\n activatesOn: ClientEvents.Initialized,\n});\n\n// `#commands` resolves per condition: a node host has the OAuth callback server and filesystem the\n// browser command set omits (`account`, `profile`).\nexport const Commands = AppCapability.commands(() => import('#commands'));\n\nexport const HubHttpClient = Capability.lazyModule(\n 'HubHttpClient',\n {\n requires: [ClientCapabilities.Client],\n provides: [ClientCapabilities.HubHttpClient],\n // Reads `client.config` (initialized-only) for the hub URL.\n activatesOn: ClientEvents.Initialized,\n },\n () => import('../hub-http-client'),\n);\n\nexport const LayerSpecs = AppCapability.layerSpec(() => import('../layer-specs'), {\n name: 'LayerSpecs',\n});\n\nexport const NavigationTargetLoader = Capability.lazyModule(\n 'NavigationTargetLoader',\n { requires: [ClientCapabilities.Client], provides: [AppCapabilities.NavigationTargetLoader] },\n () => import('../navigation-target-loader'),\n);\n\nexport const OperationHandler = AppCapability.operationHandler(() => import('../operation-handler'));\n\nexport const RemoteTraceMonitor = Capability.lazyModule(\n 'RemoteTraceMonitor',\n // Startup: the process-manager runtime snapshots this capability once, in the Startup pass, and\n // bakes a no-op remote source if it has not been contributed yet — demand activation always loses\n // that race, silencing remote traces for every ProcessMonitor consumer.\n { provides: [Capabilities.RemoteTraceMonitor], activatesOn: ActivationEvents.Startup },\n () => import('../remote-trace-monitor'),\n);\n\nexport const SpaceReplicationProgress = Capability.lazyModule(\n 'SpaceReplicationProgress',\n {\n // ProgressRegistry is read optionally in the body, not required: a host that omits\n // plugin-progress should lose the meter, not fail to activate ClientPlugin.\n requires: [ClientCapabilities.Client, Capabilities.ProcessManagerRuntime],\n provides: [],\n // Runtime event: spaces become ready when the client observes them, not at startup.\n activatesOn: ClientEvents.SpacesReady,\n },\n () => import('../space-replication-progress'),\n);\n\nexport const TraceProgress = Capability.lazyModule(\n 'TraceProgress',\n {\n // ProgressRegistry is resolved lazily per message (a host without it degrades to a no-op sink).\n requires: [Capabilities.ProcessMonitor, Capabilities.ProcessManagerRuntime, Capabilities.ServiceResolver],\n provides: [],\n // Same activation as SpaceReplicationProgress: process-manager runtime, monitor, and\n // registry are all available by the time spaces are observed.\n activatesOn: ClientEvents.SpacesReady,\n },\n () => import('../trace-progress'),\n);\n\nexport const Translations = AppCapability.translations(translations);\n\nexport const Client = undefined;\nexport const Migrations = undefined;\nexport const NavigationHandler = undefined;\nexport const ReactContext = undefined;\nexport const ReactSurface = undefined;\nexport const SchemaDefs = undefined;\n"],"mappings":";;;;;;;;AAeA,IAAa,eAAe,WAAW,WACrC,gBACA,EAAE,UAAU,CAAC,mBAAmB,YAAY,EAAE,SACxC,OAAO,4BACf;AAIA,IAAa,kBAAkB,cAAc,sBAAsB,OAAO,kCAAyB,EACjG,aAAa,aAAa,YAC5B,CAAC;AAID,IAAa,WAAW,cAAc,eAAe,OAAO,YAAY;AAExE,IAAa,gBAAgB,WAAW,WACtC,iBACA;CACE,UAAU,CAAC,mBAAmB,MAAM;CACpC,UAAU,CAAC,mBAAmB,aAAa;CAE3C,aAAa,aAAa;AAC5B,SACM,OAAO,8BACf;AAEA,IAAa,aAAa,cAAc,gBAAgB,OAAO,4BAAmB,EAChF,MAAM,aACR,CAAC;AAED,IAAa,yBAAyB,WAAW,WAC/C,0BACA;CAAE,UAAU,CAAC,mBAAmB,MAAM;CAAG,UAAU,CAAC,gBAAgB,sBAAsB;AAAE,SACtF,OAAO,uCACf;AAEA,IAAa,mBAAmB,cAAc,uBAAuB,OAAO,gCAAuB;AAEnG,IAAa,qBAAqB,WAAW,WAC3C,sBAIA;CAAE,UAAU,CAAC,aAAa,kBAAkB;CAAG,aAAa,iBAAiB;AAAQ,SAC/E,OAAO,mCACf;AAEA,IAAa,2BAA2B,WAAW,WACjD,4BACA;CAGE,UAAU,CAAC,mBAAmB,QAAQ,aAAa,qBAAqB;CACxE,UAAU,CAAC;CAEX,aAAa,aAAa;AAC5B,SACM,OAAO,yCACf;AAEA,IAAa,gBAAgB,WAAW,WACtC,iBACA;CAEE,UAAU;EAAC,aAAa;EAAgB,aAAa;EAAuB,aAAa;CAAe;CACxG,UAAU,CAAC;CAGX,aAAa,aAAa;AAC5B,SACM,OAAO,6BACf;AAEA,IAAa,eAAe,cAAc,aAAa,YAAY;AAEnE,IAAa,SAAS,KAAA;AACtB,IAAa,aAAa,KAAA;AAC1B,IAAa,oBAAoB,KAAA;AACjC,IAAa,eAAe,KAAA;AAC5B,IAAa,eAAe,KAAA;AAC5B,IAAa,aAAa,KAAA"}
1
+ {"version":3,"file":"capabilities.workerd.mjs","names":[],"sources":["../../src/capabilities/gen/workerd.ts"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\n// GENERATED by dx-plugin — do not edit. Sliced from ../index.ts for the 'workerd' condition.\n\nimport * as ActivationEvents from '@dxos/app-framework/ActivationEvents';\nimport * as Capabilities from '@dxos/app-framework/Capabilities';\nimport * as Capability from '@dxos/app-framework/Capability';\nimport * as AppCapabilities from '@dxos/app-toolkit/AppCapabilities';\nimport * as AppCapability from '@dxos/app-toolkit/AppCapability';\n\nimport { translations } from '#translations';\nimport { ClientCapabilities, ClientEvents, ClientOptions } from '#types';\n\nexport const AccountCache = Capability.lazyModule(\n 'AccountCache',\n { provides: [ClientCapabilities.AccountCache] },\n () => import('../account-cache.ts'),\n);\n\n// Its connectors read `client.halo`/`client.mesh` inside atom computations (initialized-only,\n// and a pre-init throw is not re-evaluated when initialization lands).\nexport const AppGraphBuilder = AppCapability.appGraphBuilder(() => import('../app-graph-builder.ts'), {\n activatesOn: ClientEvents.Initialized,\n});\n\n// `#commands` resolves per condition: a node host has the OAuth callback server and filesystem the\n// browser command set omits (`account`, `profile`).\nexport const Commands = AppCapability.commands(() => import('#commands'));\n\nexport const ClientServices = Capability.lazyModule(\n 'ClientServices',\n {\n requires: [ClientCapabilities.Client],\n provides: [ClientCapabilities.Config, ClientCapabilities.EdgeHttpClient, ClientCapabilities.Hypergraph],\n // `client.config` and `client.edge` are initialized-only.\n activatesOn: ClientEvents.Initialized,\n },\n () => import('../client-services.ts'),\n);\n\nexport const HubHttpClient = Capability.lazyModule(\n 'HubHttpClient',\n {\n requires: [ClientCapabilities.Client],\n provides: [ClientCapabilities.HubHttpClient],\n // Reads `client.config` (initialized-only) for the hub URL.\n activatesOn: ClientEvents.Initialized,\n },\n () => import('../hub-http-client.ts'),\n);\n\nexport const IdentityLifecycle = Capability.lazyModule(\n 'IdentityLifecycle',\n {\n requires: [\n ClientCapabilities.Client,\n ClientCapabilities.AccountCache,\n Capabilities.AtomRegistry,\n Capabilities.OperationInvoker,\n Capabilities.PluginManager,\n ],\n provides: [],\n // Subscribes to `client.halo` (initialized-only).\n activatesOn: ClientEvents.Initialized,\n },\n () => import('../identity-lifecycle.ts'),\n);\n\nexport const LayerSpecs = AppCapability.layerSpec(() => import('../layer-specs.ts'), {\n name: 'LayerSpecs',\n});\n\nexport const NavigationTargetLoader = Capability.lazyModule(\n 'NavigationTargetLoader',\n { requires: [ClientCapabilities.Client], provides: [AppCapabilities.NavigationTargetLoader] },\n () => import('../navigation-target-loader.ts'),\n);\n\nexport const OperationHandler = AppCapability.operationHandler(() => import('../operation-handler.ts'));\n\nexport const RemoteTraceMonitor = Capability.lazyModule(\n 'RemoteTraceMonitor',\n // Startup: the process-manager runtime snapshots this capability once, in the Startup pass, and\n // bakes a no-op remote source if it has not been contributed yet — demand activation always loses\n // that race, silencing remote traces for every Process.Manager consumer.\n { provides: [Capabilities.RemoteTraceMonitor], activatesOn: ActivationEvents.Startup },\n () => import('../remote-trace-monitor.ts'),\n);\n\nexport const SpaceReplicationProgress = Capability.lazyModule(\n 'SpaceReplicationProgress',\n {\n // ProgressRegistry is read optionally in the body, not required: a host that omits\n // plugin-progress should lose the meter, not fail to activate ClientPlugin.\n requires: [ClientCapabilities.Client, Capabilities.ProcessManagerRuntime],\n provides: [],\n // Runtime event: spaces become ready when the client observes them, not at startup.\n activatesOn: ClientEvents.SpacesAvailable,\n },\n () => import('../space-replication-progress.ts'),\n);\n\nexport const TraceProgress = Capability.lazyModule(\n 'TraceProgress',\n {\n // ProgressRegistry is resolved lazily per message (a host without it degrades to a no-op sink).\n requires: [Capabilities.ProcessManager, Capabilities.ProcessManagerRuntime, Capabilities.ServiceResolver],\n provides: [],\n // Same activation as SpaceReplicationProgress: process-manager runtime, monitor, and\n // registry are all available by the time spaces are observed.\n activatesOn: ClientEvents.SpacesAvailable,\n },\n () => import('../trace-progress.ts'),\n);\n\nexport const Translations = AppCapability.translations(translations);\n\nexport const Client = undefined;\nexport const Migrations = undefined;\nexport const NavigationHandler = undefined;\nexport const ReactContext = undefined;\nexport const ReactSurface = undefined;\nexport const SchemaDefs = undefined;\n"],"mappings":";;;;;;;;AAeA,IAAa,eAAe,WAAW,WACrC,gBACA,EAAE,UAAU,CAAC,mBAAmB,YAAY,EAAE,SACxC,OAAO,4BACf;AAIA,IAAa,kBAAkB,cAAc,sBAAsB,OAAO,kCAA4B,EACpG,aAAa,aAAa,YAC5B,CAAC;AAID,IAAa,WAAW,cAAc,eAAe,OAAO,YAAY;AAExE,IAAa,iBAAiB,WAAW,WACvC,kBACA;CACE,UAAU,CAAC,mBAAmB,MAAM;CACpC,UAAU;EAAC,mBAAmB;EAAQ,mBAAmB;EAAgB,mBAAmB;CAAU;CAEtG,aAAa,aAAa;AAC5B,SACM,OAAO,8BACf;AAEA,IAAa,gBAAgB,WAAW,WACtC,iBACA;CACE,UAAU,CAAC,mBAAmB,MAAM;CACpC,UAAU,CAAC,mBAAmB,aAAa;CAE3C,aAAa,aAAa;AAC5B,SACM,OAAO,8BACf;AAEA,IAAa,oBAAoB,WAAW,WAC1C,qBACA;CACE,UAAU;EACR,mBAAmB;EACnB,mBAAmB;EACnB,aAAa;EACb,aAAa;EACb,aAAa;CACf;CACA,UAAU,CAAC;CAEX,aAAa,aAAa;AAC5B,SACM,OAAO,iCACf;AAEA,IAAa,aAAa,cAAc,gBAAgB,OAAO,4BAAsB,EACnF,MAAM,aACR,CAAC;AAED,IAAa,yBAAyB,WAAW,WAC/C,0BACA;CAAE,UAAU,CAAC,mBAAmB,MAAM;CAAG,UAAU,CAAC,gBAAgB,sBAAsB;AAAE,SACtF,OAAO,uCACf;AAEA,IAAa,mBAAmB,cAAc,uBAAuB,OAAO,gCAA0B;AAEtG,IAAa,qBAAqB,WAAW,WAC3C,sBAIA;CAAE,UAAU,CAAC,aAAa,kBAAkB;CAAG,aAAa,iBAAiB;AAAQ,SAC/E,OAAO,mCACf;AAEA,IAAa,2BAA2B,WAAW,WACjD,4BACA;CAGE,UAAU,CAAC,mBAAmB,QAAQ,aAAa,qBAAqB;CACxE,UAAU,CAAC;CAEX,aAAa,aAAa;AAC5B,SACM,OAAO,yCACf;AAEA,IAAa,gBAAgB,WAAW,WACtC,iBACA;CAEE,UAAU;EAAC,aAAa;EAAgB,aAAa;EAAuB,aAAa;CAAe;CACxG,UAAU,CAAC;CAGX,aAAa,aAAa;AAC5B,SACM,OAAO,6BACf;AAEA,IAAa,eAAe,cAAc,aAAa,YAAY;AAEnE,IAAa,SAAS,KAAA;AACtB,IAAa,aAAa,KAAA;AAC1B,IAAa,oBAAoB,KAAA;AACjC,IAAa,eAAe,KAAA;AAC5B,IAAa,eAAe,KAAA;AAC5B,IAAa,aAAa,KAAA"}
@@ -1,23 +1,30 @@
1
- import { i as RESET_DIALOG } from "./chunk-constants.mjs";
2
- import { n as useAccountUrl, t as useHubHttpClient } from "./chunk-hooks.mjs";
1
+ import { a as RESET_DIALOG } from "./chunk-constants.mjs";
2
+ import { t as useAccountUrl } from "./chunk-useAccountUrl.mjs";
3
+ import { t as useHubHttpClient } from "./chunk-useHubClient.mjs";
3
4
  import { ClientCapabilities } from "#types";
4
5
  import { Context } from "@dxos/context";
5
6
  import { meta } from "#meta";
6
7
  import { useCallback, useState } from "react";
8
+ import { Form } from "@dxos/react-ui-form";
9
+ import * as Button from "@dxos/react-ui/Button";
10
+ import * as UiHooks from "@dxos/react-ui/Hooks";
11
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
7
12
  import * as LayoutOperation from "@dxos/app-toolkit/LayoutOperation";
8
- import { useCapability, useOperationInvoker } from "@dxos/app-framework/ui";
13
+ import * as Hooks from "@dxos/app-framework/Hooks";
9
14
  import { useIdentity } from "@dxos/halo-react";
10
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
11
15
  import { useAtom, useAtomSet } from "@effect/atom-react/Hooks";
12
- import { Banner, Button, Flex, Icon, IconButton, Input, useAsyncEffect, useTranslation } from "@dxos/react-ui";
13
- import { Form } from "@dxos/react-ui-form";
16
+ import * as Banner from "@dxos/react-ui/Banner";
17
+ import * as Field from "@dxos/react-ui/Field";
18
+ import * as Icon from "@dxos/react-ui/Icon";
19
+ import * as Input from "@dxos/react-ui/Input";
20
+ import * as Layout from "@dxos/react-ui/Layout";
14
21
  //#region src/containers/AccountContainer/AccountContainer.tsx
15
22
  var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-client/src/containers/AccountContainer/AccountContainer.tsx";
16
23
  var AccountContainer = () => {
17
- const { t } = useTranslation(meta.profile.key);
24
+ const { t } = UiHooks.useTranslation(meta.profile.key);
18
25
  const identity = useIdentity();
19
- const { invokePromise } = useOperationInvoker();
20
- const accountCacheAtom = useCapability(ClientCapabilities.AccountCache);
26
+ const { invokePromise } = Hooks.useOperationInvoker();
27
+ const accountCacheAtom = Hooks.useCapability(ClientCapabilities.AccountCache);
21
28
  const [cache] = useAtom(accountCacheAtom);
22
29
  const setCache = useAtomSet(accountCacheAtom);
23
30
  const [resendStatus, setResendStatus] = useState(null);
@@ -26,13 +33,13 @@ var AccountContainer = () => {
26
33
  const [requestSubmitted, setRequestSubmitted] = useState(false);
27
34
  const hubHttp = useHubHttpClient();
28
35
  const { openAccountPage } = useAccountUrl();
29
- useAsyncEffect(async () => {
36
+ UiHooks.useAsyncEffect(async () => {
30
37
  if (!hubHttp) return;
31
38
  try {
32
39
  const account = await hubHttp.getAccount(new Context(void 0, {
33
40
  "~LogMeta": "~LogMeta",
34
41
  F: __dxlog_file,
35
- L: 45
42
+ L: 51
36
43
  }));
37
44
  setCache((prev) => ({
38
45
  ...prev,
@@ -57,7 +64,7 @@ var AccountContainer = () => {
57
64
  const result = await hubHttp.resendVerificationEmail(new Context(void 0, {
58
65
  "~LogMeta": "~LogMeta",
59
66
  F: __dxlog_file,
60
- L: 63
67
+ L: 69
61
68
  }));
62
69
  if (result.sent) setResendStatus(t("verification-sent.message"));
63
70
  else if (result.cooldownSecondsRemaining) setResendStatus(t("verification-cooldown.message", { seconds: result.cooldownSecondsRemaining }));
@@ -75,7 +82,7 @@ var AccountContainer = () => {
75
82
  await hubHttp.requestAccess(new Context(void 0, {
76
83
  "~LogMeta": "~LogMeta",
77
84
  F: __dxlog_file,
78
- L: 85
85
+ L: 91
79
86
  }), {
80
87
  email,
81
88
  identityDid
@@ -98,7 +105,7 @@ var AccountContainer = () => {
98
105
  await hubHttp.deleteAccount(new Context(void 0, {
99
106
  "~LogMeta": "~LogMeta",
100
107
  F: __dxlog_file,
101
- L: 107
108
+ L: 113
102
109
  }));
103
110
  setCache(() => ({}));
104
111
  }
@@ -114,80 +121,85 @@ var AccountContainer = () => {
114
121
  variant: "settings",
115
122
  children: /* @__PURE__ */ jsx(Form.Viewport, {
116
123
  scroll: true,
117
- children: /* @__PURE__ */ jsxs(Form.Content, { children: [/* @__PURE__ */ jsx(Form.Section, {
118
- title: t("account-section.title"),
124
+ children: /* @__PURE__ */ jsxs(Form.Content, { children: [/* @__PURE__ */ jsx(Form.FieldSet, {
125
+ label: t("account-section.title"),
119
126
  description: t("account-section.description"),
120
- children: accountState === "loading" ? null : accountState === "missing" ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(Banner.Root, {
127
+ children: accountState === "loading" ? null : accountState === "missing" ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs(Banner.Root, {
121
128
  valence: "warning",
122
- children: /* @__PURE__ */ jsxs(Banner.Content, { children: [/* @__PURE__ */ jsx(Banner.Title, {
129
+ children: [/* @__PURE__ */ jsx(Banner.Title, {
123
130
  icon: "ph--warning--duotone",
124
131
  children: t("no-edge-access.title")
125
- }), /* @__PURE__ */ jsx(Banner.Body, { children: t("no-edge-access.description") })] })
126
- }), /* @__PURE__ */ jsx(Form.Row, {
132
+ }), /* @__PURE__ */ jsx(Banner.Body, { children: t("no-edge-access.description") })]
133
+ }), /* @__PURE__ */ jsx(Form.Field, {
134
+ standalone: true,
127
135
  label: t("request-access.label"),
128
136
  description: t("request-access.description"),
129
137
  children: requestSubmitted ? /* @__PURE__ */ jsx("span", {
130
- className: "text-sm text-description",
138
+ className: "text-sm text-fg-muted",
131
139
  children: t("access-request-submitted.message")
132
140
  }) : /* @__PURE__ */ jsxs("form", {
133
141
  onSubmit: handleRequestAccess,
134
142
  className: "flex gap-2 items-center justify-end",
135
- children: [/* @__PURE__ */ jsx(Input.Root, { children: /* @__PURE__ */ jsx(Input.TextInput, {
143
+ children: [/* @__PURE__ */ jsx(Field.Root, { children: /* @__PURE__ */ jsx(Input.Root, {
136
144
  type: "email",
137
145
  required: true,
138
146
  placeholder: t("access-request-email.placeholder"),
139
147
  value: requestEmail,
140
148
  onChange: (event) => setRequestEmail(event.target.value),
141
149
  classNames: "w-64 max-w-full min-w-0"
142
- }) }), /* @__PURE__ */ jsx(Button, {
150
+ }) }), /* @__PURE__ */ jsx(Button.Root, {
143
151
  type: "submit",
144
- density: "sm",
152
+ size: "sm",
145
153
  children: t("request-access.label")
146
154
  })]
147
155
  })
148
- })] }) : accountState === "error" && !account ? /* @__PURE__ */ jsx(Banner.Root, {
156
+ })] }) : accountState === "error" && !account ? /* @__PURE__ */ jsxs(Banner.Root, {
149
157
  valence: "error",
150
- children: /* @__PURE__ */ jsxs(Banner.Content, { children: [/* @__PURE__ */ jsx(Banner.Title, {
158
+ children: [/* @__PURE__ */ jsx(Banner.Title, {
151
159
  icon: "ph--cloud-x--duotone",
152
160
  children: t("account-offline.title")
153
- }), /* @__PURE__ */ jsx(Banner.Body, { children: t("account-offline.description") })] })
154
- }) : account ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(Form.Row, {
161
+ }), /* @__PURE__ */ jsx(Banner.Body, { children: t("account-offline.description") })]
162
+ }) : account ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(Form.Field, {
163
+ standalone: true,
155
164
  label: t("email.label"),
156
165
  description: account.email,
157
- children: account.emailVerified ? /* @__PURE__ */ jsx(Icon, {
166
+ children: account.emailVerified ? /* @__PURE__ */ jsx(Icon.Icon, {
158
167
  icon: "ph--check-circle--duotone",
159
- size: 5,
160
- classNames: "text-success-text justify-self-end"
161
- }) : /* @__PURE__ */ jsxs(Flex, {
168
+ size: "lg",
169
+ classNames: "justify-self-end",
170
+ valence: "success"
171
+ }) : /* @__PURE__ */ jsxs(Layout.Flex, {
162
172
  column: true,
163
173
  gap: "xs",
164
174
  align: "end",
165
- children: [/* @__PURE__ */ jsx(IconButton, {
175
+ children: [/* @__PURE__ */ jsx(Button.Root, {
166
176
  icon: "ph--paper-plane-tilt--regular",
167
177
  label: t("resend-verification.label"),
168
178
  onClick: handleResend,
169
- density: "sm"
179
+ size: "sm"
170
180
  }), resendStatus ? /* @__PURE__ */ jsx("span", {
171
- className: "text-xs text-description",
181
+ className: "text-xs text-fg-muted",
172
182
  children: resendStatus
173
183
  }) : null]
174
184
  })
175
- }), /* @__PURE__ */ jsx(Form.Row, {
185
+ }), /* @__PURE__ */ jsx(Form.Field, {
186
+ standalone: true,
176
187
  label: t("delete-account.label"),
177
188
  description: t("delete-account.description"),
178
- children: /* @__PURE__ */ jsx(Button, {
189
+ children: /* @__PURE__ */ jsx(Button.Root, {
179
190
  variant: "destructive",
180
191
  onClick: handleDeleteAccount,
181
192
  children: t("delete-account.label")
182
193
  })
183
194
  })] }) : null
184
- }), account ? /* @__PURE__ */ jsx(Form.Section, {
185
- title: t("account-page-section.title"),
195
+ }), account ? /* @__PURE__ */ jsx(Form.FieldSet, {
196
+ label: t("account-page-section.title"),
186
197
  description: t("account-page-section.description"),
187
- children: /* @__PURE__ */ jsx(Form.Row, {
198
+ children: /* @__PURE__ */ jsx(Form.Field, {
199
+ standalone: true,
188
200
  label: t("open-account-page.label"),
189
201
  description: t("open-account-page.description"),
190
- children: /* @__PURE__ */ jsx(IconButton, {
202
+ children: /* @__PURE__ */ jsx(Button.Root, {
191
203
  icon: "ph--arrow-square-out--regular",
192
204
  label: t("open-account-page.label"),
193
205
  variant: "default",
@@ -1 +1 @@
1
- {"version":3,"file":"chunk-AccountContainer.mjs","names":[],"sources":["../../src/containers/AccountContainer/AccountContainer.tsx"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\nimport { useAtom, useAtomSet } from '@effect/atom-react/Hooks';\nimport React, { type FormEvent, useCallback, useState } from 'react';\n\nimport { useCapability, useOperationInvoker } from '@dxos/app-framework/ui';\nimport * as LayoutOperation from '@dxos/app-toolkit/LayoutOperation';\nimport { Context } from '@dxos/context';\nimport { useIdentity } from '@dxos/halo-react';\nimport { Banner, Button, Flex, Icon, IconButton, Input, useAsyncEffect, useTranslation } from '@dxos/react-ui';\nimport { Form } from '@dxos/react-ui-form';\n\nimport { meta } from '#meta';\nimport { ClientCapabilities } from '#types';\n\nimport { RESET_DIALOG } from '../../constants';\nimport { useAccountUrl, useHubHttpClient } from '../../hooks';\n\ntype AccountState = 'loading' | 'present' | 'missing' | 'error';\n\nexport const AccountContainer = () => {\n const { t } = useTranslation(meta.profile.key);\n const identity = useIdentity();\n const { invokePromise } = useOperationInvoker();\n const accountCacheAtom = useCapability(ClientCapabilities.AccountCache);\n const [cache] = useAtom(accountCacheAtom);\n const setCache = useAtomSet(accountCacheAtom);\n const [resendStatus, setResendStatus] = useState<string | null>(null);\n const [accountState, setAccountState] = useState<AccountState>(cache.account ? 'present' : 'loading');\n const [requestEmail, setRequestEmail] = useState('');\n const [requestSubmitted, setRequestSubmitted] = useState(false);\n\n // Single shared instance keeps the VP-auth handshake (request → 401 → signed\n // retry) at one round-trip per session instead of one per panel.\n const hubHttp = useHubHttpClient();\n const { openAccountPage } = useAccountUrl();\n\n useAsyncEffect(async () => {\n if (!hubHttp) {\n return;\n }\n try {\n const account = await hubHttp.getAccount(new Context());\n setCache((prev) => ({ ...prev, account, fetchedAt: Date.now() }));\n setAccountState('present');\n } catch (err: any) {\n if (err?.data?.type === 'no_account') {\n setCache((prev) => ({ ...prev, account: undefined, fetchedAt: Date.now() }));\n setAccountState('missing');\n } else {\n setAccountState((prev) => (prev === 'present' ? 'present' : 'error'));\n }\n }\n }, [hubHttp, setCache]);\n\n const handleResend = useCallback(async () => {\n if (!hubHttp) {\n return;\n }\n try {\n const result = await hubHttp.resendVerificationEmail(new Context());\n if (result.sent) {\n setResendStatus(t('verification-sent.message'));\n } else if (result.cooldownSecondsRemaining) {\n setResendStatus(t('verification-cooldown.message', { seconds: result.cooldownSecondsRemaining }));\n } else {\n setResendStatus(t('verification-failed.message'));\n }\n } catch {\n setResendStatus(t('verification-failed.message'));\n }\n }, [hubHttp, t]);\n\n const handleRequestAccess = useCallback(\n async (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n const email = requestEmail.trim();\n if (!email || !hubHttp) {\n return;\n }\n try {\n const identityDid = identity?.did;\n await hubHttp.requestAccess(new Context(), { email, identityDid });\n } catch {\n // Surface a generic confirmation; failure details would leak signal.\n }\n setRequestSubmitted(true);\n },\n [hubHttp, identity, requestEmail],\n );\n\n // Opens the standard reset confirmation dialog. The `onBeforeReset` hook\n // deletes the hub account first; if that fails the reset is aborted so the\n // local identity is not wiped while the server record remains.\n const handleDeleteAccount = useCallback(() => {\n if (!hubHttp) {\n return;\n }\n void invokePromise(LayoutOperation.UpdateDialog, {\n subject: RESET_DIALOG,\n blockAlign: 'start',\n props: {\n mode: 'reset-storage',\n onBeforeReset: async () => {\n await hubHttp.deleteAccount(new Context());\n setCache(() => ({}));\n },\n },\n });\n }, [hubHttp, invokePromise, setCache]);\n\n const account = cache.account;\n\n return (\n <Form.Root variant='settings'>\n <Form.Viewport scroll>\n <Form.Content>\n <Form.Section title={t('account-section.title')} description={t('account-section.description')}>\n {accountState === 'loading' ? null : accountState === 'missing' ? (\n <>\n <Banner.Root valence='warning'>\n <Banner.Content>\n <Banner.Title icon='ph--warning--duotone'>{t('no-edge-access.title')}</Banner.Title>\n <Banner.Body>{t('no-edge-access.description')}</Banner.Body>\n </Banner.Content>\n </Banner.Root>\n <Form.Row label={t('request-access.label')} description={t('request-access.description')}>\n {requestSubmitted ? (\n <span className='text-sm text-description'>{t('access-request-submitted.message')}</span>\n ) : (\n <form onSubmit={handleRequestAccess} className='flex gap-2 items-center justify-end'>\n <Input.Root>\n <Input.TextInput\n type='email'\n required\n placeholder={t('access-request-email.placeholder')}\n value={requestEmail}\n onChange={(event) => setRequestEmail(event.target.value)}\n classNames='w-64 max-w-full min-w-0'\n />\n </Input.Root>\n <Button type='submit' density='sm'>\n {t('request-access.label')}\n </Button>\n </form>\n )}\n </Form.Row>\n </>\n ) : accountState === 'error' && !account ? (\n <Banner.Root valence='error'>\n <Banner.Content>\n <Banner.Title icon='ph--cloud-x--duotone'>{t('account-offline.title')}</Banner.Title>\n <Banner.Body>{t('account-offline.description')}</Banner.Body>\n </Banner.Content>\n </Banner.Root>\n ) : account ? (\n <>\n <Form.Row label={t('email.label')} description={account.email}>\n {account.emailVerified ? (\n <Icon icon='ph--check-circle--duotone' size={5} classNames='text-success-text justify-self-end' />\n ) : (\n <Flex column gap='xs' align='end'>\n <IconButton\n icon='ph--paper-plane-tilt--regular'\n label={t('resend-verification.label')}\n onClick={handleResend}\n density='sm'\n />\n {resendStatus ? <span className='text-xs text-description'>{resendStatus}</span> : null}\n </Flex>\n )}\n </Form.Row>\n <Form.Row label={t('delete-account.label')} description={t('delete-account.description')}>\n <Button variant='destructive' onClick={handleDeleteAccount}>\n {t('delete-account.label')}\n </Button>\n </Form.Row>\n </>\n ) : null}\n </Form.Section>\n {account ? (\n <Form.Section title={t('account-page-section.title')} description={t('account-page-section.description')}>\n <Form.Row label={t('open-account-page.label')} description={t('open-account-page.description')}>\n <IconButton\n icon='ph--arrow-square-out--regular'\n label={t('open-account-page.label')}\n variant='default'\n onClick={openAccountPage}\n />\n </Form.Row>\n </Form.Section>\n ) : null}\n </Form.Content>\n </Form.Viewport>\n </Form.Root>\n );\n};\n\nAccountContainer.displayName = 'AccountContainer';\n"],"mappings":"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"}
1
+ {"version":3,"file":"chunk-AccountContainer.mjs","names":[],"sources":["../../src/containers/AccountContainer/AccountContainer.tsx"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\nimport { useAtom, useAtomSet } from '@effect/atom-react/Hooks';\nimport React, { type FormEvent, useCallback, useState } from 'react';\n\nimport * as Hooks from '@dxos/app-framework/Hooks';\nimport * as LayoutOperation from '@dxos/app-toolkit/LayoutOperation';\nimport { Context } from '@dxos/context';\nimport { useIdentity } from '@dxos/halo-react';\nimport { Form } from '@dxos/react-ui-form';\nimport * as Banner from '@dxos/react-ui/Banner';\nimport * as Button from '@dxos/react-ui/Button';\nimport * as Field from '@dxos/react-ui/Field';\nimport * as UiHooks from '@dxos/react-ui/Hooks';\nimport * as Icon from '@dxos/react-ui/Icon';\nimport * as Input from '@dxos/react-ui/Input';\nimport * as Layout from '@dxos/react-ui/Layout';\n\nimport { meta } from '#meta';\nimport { ClientCapabilities } from '#types';\n\nimport { RESET_DIALOG } from '../../constants.ts';\nimport { useAccountUrl, useHubHttpClient } from '../../hooks/index.ts';\n\ntype AccountState = 'loading' | 'present' | 'missing' | 'error';\n\nexport const AccountContainer = () => {\n const { t } = UiHooks.useTranslation(meta.profile.key);\n const identity = useIdentity();\n const { invokePromise } = Hooks.useOperationInvoker();\n const accountCacheAtom = Hooks.useCapability(ClientCapabilities.AccountCache);\n const [cache] = useAtom(accountCacheAtom);\n const setCache = useAtomSet(accountCacheAtom);\n const [resendStatus, setResendStatus] = useState<string | null>(null);\n const [accountState, setAccountState] = useState<AccountState>(cache.account ? 'present' : 'loading');\n const [requestEmail, setRequestEmail] = useState('');\n const [requestSubmitted, setRequestSubmitted] = useState(false);\n\n // Single shared instance keeps the VP-auth handshake (request → 401 → signed\n // retry) at one round-trip per session instead of one per panel.\n const hubHttp = useHubHttpClient();\n const { openAccountPage } = useAccountUrl();\n\n UiHooks.useAsyncEffect(async () => {\n if (!hubHttp) {\n return;\n }\n try {\n const account = await hubHttp.getAccount(new Context());\n setCache((prev) => ({ ...prev, account, fetchedAt: Date.now() }));\n setAccountState('present');\n } catch (err: any) {\n if (err?.data?.type === 'no_account') {\n setCache((prev) => ({ ...prev, account: undefined, fetchedAt: Date.now() }));\n setAccountState('missing');\n } else {\n setAccountState((prev) => (prev === 'present' ? 'present' : 'error'));\n }\n }\n }, [hubHttp, setCache]);\n\n const handleResend = useCallback(async () => {\n if (!hubHttp) {\n return;\n }\n try {\n const result = await hubHttp.resendVerificationEmail(new Context());\n if (result.sent) {\n setResendStatus(t('verification-sent.message'));\n } else if (result.cooldownSecondsRemaining) {\n setResendStatus(t('verification-cooldown.message', { seconds: result.cooldownSecondsRemaining }));\n } else {\n setResendStatus(t('verification-failed.message'));\n }\n } catch {\n setResendStatus(t('verification-failed.message'));\n }\n }, [hubHttp, t]);\n\n const handleRequestAccess = useCallback(\n async (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n const email = requestEmail.trim();\n if (!email || !hubHttp) {\n return;\n }\n try {\n const identityDid = identity?.did;\n await hubHttp.requestAccess(new Context(), { email, identityDid });\n } catch {\n // Surface a generic confirmation; failure details would leak signal.\n }\n setRequestSubmitted(true);\n },\n [hubHttp, identity, requestEmail],\n );\n\n // Opens the standard reset confirmation dialog. The `onBeforeReset` hook\n // deletes the hub account first; if that fails the reset is aborted so the\n // local identity is not wiped while the server record remains.\n const handleDeleteAccount = useCallback(() => {\n if (!hubHttp) {\n return;\n }\n void invokePromise(LayoutOperation.UpdateDialog, {\n subject: RESET_DIALOG,\n blockAlign: 'start',\n props: {\n mode: 'reset-storage',\n onBeforeReset: async () => {\n await hubHttp.deleteAccount(new Context());\n setCache(() => ({}));\n },\n },\n });\n }, [hubHttp, invokePromise, setCache]);\n\n const account = cache.account;\n\n return (\n <Form.Root variant='settings'>\n <Form.Viewport scroll>\n <Form.Content>\n <Form.FieldSet label={t('account-section.title')} description={t('account-section.description')}>\n {accountState === 'loading' ? null : accountState === 'missing' ? (\n <>\n <Banner.Root valence='warning'>\n <Banner.Title icon='ph--warning--duotone'>{t('no-edge-access.title')}</Banner.Title>\n <Banner.Body>{t('no-edge-access.description')}</Banner.Body>\n </Banner.Root>\n <Form.Field standalone label={t('request-access.label')} description={t('request-access.description')}>\n {requestSubmitted ? (\n <span className='text-sm text-fg-muted'>{t('access-request-submitted.message')}</span>\n ) : (\n <form onSubmit={handleRequestAccess} className='flex gap-2 items-center justify-end'>\n <Field.Root>\n <Input.Root\n type='email'\n required\n placeholder={t('access-request-email.placeholder')}\n value={requestEmail}\n onChange={(event) => setRequestEmail(event.target.value)}\n classNames='w-64 max-w-full min-w-0'\n />\n </Field.Root>\n <Button.Root type='submit' size='sm'>\n {t('request-access.label')}\n </Button.Root>\n </form>\n )}\n </Form.Field>\n </>\n ) : accountState === 'error' && !account ? (\n <Banner.Root valence='error'>\n <Banner.Title icon='ph--cloud-x--duotone'>{t('account-offline.title')}</Banner.Title>\n <Banner.Body>{t('account-offline.description')}</Banner.Body>\n </Banner.Root>\n ) : account ? (\n <>\n <Form.Field standalone label={t('email.label')} description={account.email}>\n {account.emailVerified ? (\n <Icon.Icon\n icon='ph--check-circle--duotone'\n size='lg'\n classNames='justify-self-end'\n valence='success'\n />\n ) : (\n <Layout.Flex column gap='xs' align='end'>\n <Button.Root\n icon='ph--paper-plane-tilt--regular'\n label={t('resend-verification.label')}\n onClick={handleResend}\n size='sm'\n />\n {resendStatus ? <span className='text-xs text-fg-muted'>{resendStatus}</span> : null}\n </Layout.Flex>\n )}\n </Form.Field>\n <Form.Field standalone label={t('delete-account.label')} description={t('delete-account.description')}>\n <Button.Root variant='destructive' onClick={handleDeleteAccount}>\n {t('delete-account.label')}\n </Button.Root>\n </Form.Field>\n </>\n ) : null}\n </Form.FieldSet>\n {account ? (\n <Form.FieldSet label={t('account-page-section.title')} description={t('account-page-section.description')}>\n <Form.Field\n standalone\n label={t('open-account-page.label')}\n description={t('open-account-page.description')}\n >\n <Button.Root\n icon='ph--arrow-square-out--regular'\n label={t('open-account-page.label')}\n variant='default'\n onClick={openAccountPage}\n />\n </Form.Field>\n </Form.FieldSet>\n ) : null}\n </Form.Content>\n </Form.Viewport>\n </Form.Root>\n );\n};\n\nAccountContainer.displayName = 'AccountContainer';\n"],"mappings":"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"}
@@ -0,0 +1,146 @@
1
+ import { CliLogin, ClientCapabilities } from "#types";
2
+ import { log } from "@dxos/log";
3
+ import { meta } from "#meta";
4
+ import { useCallback, useEffect, useRef, useState } from "react";
5
+ import * as Button from "@dxos/react-ui/Button";
6
+ import * as UiHooks from "@dxos/react-ui/Hooks";
7
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
8
+ import * as EffectEx from "@dxos/effect/EffectEx";
9
+ import * as LayoutOperation from "@dxos/app-toolkit/LayoutOperation";
10
+ import * as Hooks from "@dxos/app-framework/Hooks";
11
+ import { useIdentity, useInvitationFlow } from "@dxos/halo-react";
12
+ import * as AlertDialog from "@dxos/react-ui/AlertDialog";
13
+ //#region src/containers/CliLoginDialog/CliLoginDialog.tsx
14
+ var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-client/src/containers/CliLoginDialog/CliLoginDialog.tsx";
15
+ /**
16
+ * Approves a `dx` CLI on this machine as a new device of the current identity.
17
+ *
18
+ * The invitation authenticates with a known public key, whose keypair travels inside the code, so
19
+ * the CLI joins without an auth-code round trip. That makes the code a bearer credential, which is
20
+ * why it is only created on an explicit click and only sent to a loopback callback.
21
+ */
22
+ var CliLoginDialog = ({ callback, state }) => {
23
+ const { t } = UiHooks.useTranslation(meta.profile.key);
24
+ const { invokePromise } = Hooks.useOperationInvoker();
25
+ const identity = useIdentity();
26
+ const [identityService] = Hooks.useCapabilities(ClientCapabilities.IdentityService);
27
+ const [flow, setFlow] = useState();
28
+ const [status, setStatus] = useState("confirm");
29
+ const [error, setError] = useState();
30
+ const { event } = useInvitationFlow(flow);
31
+ const flowRef = useRef(void 0);
32
+ const closedRef = useRef(false);
33
+ const close = useCallback(() => invokePromise(LayoutOperation.UpdateDialog, { state: false }), [invokePromise]);
34
+ useEffect(() => {
35
+ closedRef.current = false;
36
+ return () => {
37
+ closedRef.current = true;
38
+ if (flowRef.current) EffectEx.runPromise(flowRef.current.cancel()).catch((err) => log.catch(err, void 0, {
39
+ "~LogMeta": "~LogMeta",
40
+ F: __dxlog_file,
41
+ L: 59,
42
+ S: void 0
43
+ }));
44
+ };
45
+ }, []);
46
+ useEffect(() => {
47
+ switch (event?._tag) {
48
+ case "success":
49
+ flowRef.current = void 0;
50
+ setStatus("success");
51
+ break;
52
+ case "cancelled":
53
+ case "error":
54
+ flowRef.current = void 0;
55
+ setError(event._tag === "error" ? event.message : t("cli-login-cancelled.message"));
56
+ setStatus("error");
57
+ }
58
+ }, [event?._tag, t]);
59
+ const handleAuthorize = useCallback(async () => {
60
+ const target = CliLogin.parseCallback(callback);
61
+ if (!identityService || !target) return;
62
+ setStatus("sending");
63
+ try {
64
+ const created = await EffectEx.runPromise(identityService.share({ authMethod: "known-public-key" }));
65
+ if (closedRef.current) {
66
+ await EffectEx.runPromise(created.cancel());
67
+ return;
68
+ }
69
+ flowRef.current = created;
70
+ setFlow(created);
71
+ const code = await EffectEx.runPromise(created.code);
72
+ if (closedRef.current) return;
73
+ await fetch(CliLogin.createCallbackUrl(target, code, state), { mode: "no-cors" });
74
+ setStatus("waiting");
75
+ } catch (err) {
76
+ log.catch(err, void 0, {
77
+ "~LogMeta": "~LogMeta",
78
+ F: __dxlog_file,
79
+ L: 102,
80
+ S: void 0
81
+ });
82
+ setError(err instanceof Error ? err.message : String(err));
83
+ setStatus("error");
84
+ }
85
+ }, [
86
+ identityService,
87
+ callback,
88
+ state
89
+ ]);
90
+ return /* @__PURE__ */ jsxs(AlertDialog.Content, {
91
+ size: "md",
92
+ children: [/* @__PURE__ */ jsxs(AlertDialog.Body, { children: [
93
+ /* @__PURE__ */ jsx(AlertDialog.Title, { children: t("cli-login-dialog.title") }),
94
+ /* @__PURE__ */ jsx(AlertDialog.Description, {
95
+ classNames: "py-2",
96
+ children: identity ? t("cli-login-dialog.description") : t("cli-login-no-identity.message")
97
+ }),
98
+ identity && /* @__PURE__ */ jsxs("div", {
99
+ className: "py-2",
100
+ children: [/* @__PURE__ */ jsx("p", {
101
+ className: "text-sm text-fg-subtle",
102
+ children: t("cli-login-code.label")
103
+ }), /* @__PURE__ */ jsx("p", {
104
+ className: "py-2 font-mono text-2xl tracking-widest text-center",
105
+ "data-testid": "cliLogin.state",
106
+ children: state
107
+ })]
108
+ }),
109
+ /* @__PURE__ */ jsxs("p", {
110
+ className: "py-2 text-sm",
111
+ "data-testid": "cliLogin.status",
112
+ "data-status": status,
113
+ children: [
114
+ status === "sending" && t("cli-login-sending.message"),
115
+ status === "waiting" && t("cli-login-waiting.message"),
116
+ status === "success" && t("cli-login-success.message"),
117
+ status === "error" && t("cli-login-error.message", { error })
118
+ ]
119
+ })
120
+ ] }), /* @__PURE__ */ jsx(AlertDialog.Footer, { children: status === "confirm" || status === "sending" ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(AlertDialog.Cancel, {
121
+ "data-testid": "cliLogin.deny",
122
+ disabled: status === "sending",
123
+ onClick: close,
124
+ children: t("cli-login-deny.label")
125
+ }), /* @__PURE__ */ jsx(Button.Root, {
126
+ "data-testid": "cliLogin.authorize",
127
+ variant: "primary",
128
+ disabled: !identity || status === "sending",
129
+ onClick: handleAuthorize,
130
+ children: t("cli-login-authorize.label")
131
+ })] }) : /* @__PURE__ */ jsx(AlertDialog.Action, {
132
+ "data-testid": "cliLogin.done",
133
+ variant: status === "success" ? "primary" : "default",
134
+ onClick: close,
135
+ children: t(status === "waiting" ? "cli-login-cancel.label" : "cli-login-done.label")
136
+ }) })]
137
+ });
138
+ };
139
+ CliLoginDialog.displayName = "CliLoginDialog";
140
+ //#endregion
141
+ //#region src/containers/CliLoginDialog/index.ts
142
+ var CliLoginDialog_default = CliLoginDialog;
143
+ //#endregion
144
+ export { CliLoginDialog, CliLoginDialog_default as default };
145
+
146
+ //# sourceMappingURL=chunk-CliLoginDialog.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-CliLoginDialog.mjs","names":[],"sources":["../../src/containers/CliLoginDialog/CliLoginDialog.tsx","../../src/containers/CliLoginDialog/index.ts"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\n\nimport * as Hooks from '@dxos/app-framework/Hooks';\nimport * as LayoutOperation from '@dxos/app-toolkit/LayoutOperation';\nimport * as EffectEx from '@dxos/effect/EffectEx';\nimport { type Invitation } from '@dxos/halo';\nimport { useIdentity, useInvitationFlow } from '@dxos/halo-react';\nimport { log } from '@dxos/log';\nimport * as AlertDialog from '@dxos/react-ui/AlertDialog';\nimport * as Button from '@dxos/react-ui/Button';\nimport * as UiHooks from '@dxos/react-ui/Hooks';\n\nimport { meta } from '#meta';\nimport { ClientCapabilities, CliLogin } from '#types';\n\nexport type CliLoginDialogProps = {\n /** The CLI's loopback callback, already checked by {@link CliLogin.parseCallback}. */\n callback: string;\n /** The CLI's state, which the terminal prints too so the user can match the two. */\n state: string;\n};\n\ntype Status = 'confirm' | 'sending' | 'waiting' | 'success' | 'error';\n\n/**\n * Approves a `dx` CLI on this machine as a new device of the current identity.\n *\n * The invitation authenticates with a known public key, whose keypair travels inside the code, so\n * the CLI joins without an auth-code round trip. That makes the code a bearer credential, which is\n * why it is only created on an explicit click and only sent to a loopback callback.\n */\nexport const CliLoginDialog = ({ callback, state }: CliLoginDialogProps) => {\n const { t } = UiHooks.useTranslation(meta.profile.key);\n const { invokePromise } = Hooks.useOperationInvoker();\n const identity = useIdentity();\n const [identityService] = Hooks.useCapabilities(ClientCapabilities.IdentityService);\n const [flow, setFlow] = useState<Invitation.Flow>();\n const [status, setStatus] = useState<Status>('confirm');\n const [error, setError] = useState<string>();\n const { event } = useInvitationFlow(flow);\n // The flow still to cancel on close: set once created, cleared on any terminal event.\n const flowRef = useRef<Invitation.Flow | undefined>(undefined);\n // Set on unmount, so an authorization still in flight stops before it sends the code.\n const closedRef = useRef(false);\n\n const close = useCallback(() => invokePromise(LayoutOperation.UpdateDialog, { state: false }), [invokePromise]);\n\n // Closing mid-flow must stop the host listening, or the invitation outlives the dialog.\n useEffect(() => {\n // Reset on (re)mount: StrictMode runs this cleanup once before the real mount.\n closedRef.current = false;\n return () => {\n closedRef.current = true;\n if (flowRef.current) {\n void EffectEx.runPromise(flowRef.current.cancel()).catch((err) => log.catch(err));\n }\n };\n }, []);\n\n useEffect(() => {\n switch (event?._tag) {\n case 'success':\n flowRef.current = undefined;\n setStatus('success');\n break;\n case 'cancelled':\n case 'error':\n flowRef.current = undefined;\n setError(event._tag === 'error' ? event.message : t('cli-login-cancelled.message'));\n setStatus('error');\n break;\n }\n }, [event?._tag, t]);\n\n const handleAuthorize = useCallback(async () => {\n const target = CliLogin.parseCallback(callback);\n if (!identityService || !target) {\n return;\n }\n setStatus('sending');\n try {\n const created = await EffectEx.runPromise(identityService.share({ authMethod: 'known-public-key' }));\n if (closedRef.current) {\n await EffectEx.runPromise(created.cancel());\n return;\n }\n flowRef.current = created;\n setFlow(created);\n const code = await EffectEx.runPromise(created.code);\n if (closedRef.current) {\n return;\n }\n // `no-cors`: the loopback server sends no CORS headers and the response carries nothing needed\n // here; the flow's own events report whether the CLI joined.\n await fetch(CliLogin.createCallbackUrl(target, code, state), { mode: 'no-cors' });\n setStatus('waiting');\n } catch (err) {\n log.catch(err);\n setError(err instanceof Error ? err.message : String(err));\n setStatus('error');\n }\n }, [identityService, callback, state]);\n\n return (\n <AlertDialog.Content size='md'>\n <AlertDialog.Body>\n <AlertDialog.Title>{t('cli-login-dialog.title')}</AlertDialog.Title>\n <AlertDialog.Description classNames='py-2'>\n {identity ? t('cli-login-dialog.description') : t('cli-login-no-identity.message')}\n </AlertDialog.Description>\n {identity && (\n <div className='py-2'>\n <p className='text-sm text-fg-subtle'>{t('cli-login-code.label')}</p>\n <p className='py-2 font-mono text-2xl tracking-widest text-center' data-testid='cliLogin.state'>\n {state}\n </p>\n </div>\n )}\n <p className='py-2 text-sm' data-testid='cliLogin.status' data-status={status}>\n {status === 'sending' && t('cli-login-sending.message')}\n {status === 'waiting' && t('cli-login-waiting.message')}\n {status === 'success' && t('cli-login-success.message')}\n {status === 'error' && t('cli-login-error.message', { error })}\n </p>\n </AlertDialog.Body>\n <AlertDialog.Footer>\n {status === 'confirm' || status === 'sending' ? (\n <>\n <AlertDialog.Cancel data-testid='cliLogin.deny' disabled={status === 'sending'} onClick={close}>\n {t('cli-login-deny.label')}\n </AlertDialog.Cancel>\n <Button.Root\n data-testid='cliLogin.authorize'\n variant='primary'\n disabled={!identity || status === 'sending'}\n onClick={handleAuthorize}\n >\n {t('cli-login-authorize.label')}\n </Button.Root>\n </>\n ) : (\n <AlertDialog.Action\n data-testid='cliLogin.done'\n variant={status === 'success' ? 'primary' : 'default'}\n onClick={close}\n >\n {t(status === 'waiting' ? 'cli-login-cancel.label' : 'cli-login-done.label')}\n </AlertDialog.Action>\n )}\n </AlertDialog.Footer>\n </AlertDialog.Content>\n );\n};\n\nCliLoginDialog.displayName = 'CliLoginDialog';\n","//\n// Copyright 2026 DXOS.org\n//\n\nimport { CliLoginDialog } from './CliLoginDialog.tsx';\n\nexport * from './CliLoginDialog.tsx';\nexport default CliLoginDialog;\n"],"mappings":"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"}
@@ -0,0 +1,120 @@
1
+ import { toPublicKey } from "@dxos/protocols/buf";
2
+ import { log } from "@dxos/log";
3
+ import { meta } from "#meta";
4
+ import { useMemo, useState } from "react";
5
+ import * as Hooks from "@dxos/react-ui/Hooks";
6
+ import { ContactPicker } from "@dxos/shell/react";
7
+ import { jsx, jsxs } from "react/jsx-runtime";
8
+ import * as Field from "@dxos/react-ui/Field";
9
+ import * as Input from "@dxos/react-ui/Input";
10
+ import * as Layout from "@dxos/react-ui/Layout";
11
+ import { SpaceMember_Role, useMembers } from "@dxos/react-client/echo";
12
+ import { useContacts, useIdentity } from "@dxos/react-client/halo";
13
+ import * as Select from "@dxos/react-ui/Select";
14
+ import * as SystemButton from "@dxos/react-ui/SystemButton";
15
+ //#region src/containers/ContactPickerContainer/ContactPickerContainer.tsx
16
+ var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-client/src/containers/ContactPickerContainer/ContactPickerContainer.tsx";
17
+ var ROLES = [
18
+ SpaceMember_Role.READER,
19
+ SpaceMember_Role.EDITOR,
20
+ SpaceMember_Role.ADMIN
21
+ ];
22
+ var roleLabel = {
23
+ [SpaceMember_Role.EDITOR]: "role-editor.label",
24
+ [SpaceMember_Role.READER]: "role-viewer.label",
25
+ [SpaceMember_Role.ADMIN]: "role-admin.label"
26
+ };
27
+ var ContactPickerContainer = ({ space, onAdd }) => {
28
+ const { t } = Hooks.useTranslation(meta.profile.key);
29
+ const contacts = useContacts();
30
+ const members = useMembers(space.key);
31
+ const identity = useIdentity();
32
+ const [selected, setSelected] = useState();
33
+ const [role, setRole] = useState(SpaceMember_Role.EDITOR);
34
+ const [joinUrl, setJoinUrl] = useState();
35
+ const [pending, setPending] = useState(false);
36
+ const memberKeys = useMemo(() => members.map((member) => toPublicKey(member.identity?.identityKey)?.toHex()).filter((key) => key !== void 0), [members]);
37
+ const selfKey = toPublicKey(identity?.identityKey);
38
+ const selfRole = members.find((member) => selfKey && toPublicKey(member.identity?.identityKey)?.equals(selfKey))?.role;
39
+ const canAdmit = selfRole === SpaceMember_Role.OWNER || selfRole === SpaceMember_Role.ADMIN;
40
+ const handleAdd = async () => {
41
+ if (!selected) return;
42
+ setPending(true);
43
+ try {
44
+ const result = await onAdd([selected], role);
45
+ setJoinUrl(result.joinUrl);
46
+ setSelected(result.failed[0]?.key);
47
+ } catch (err) {
48
+ log.catch(err, void 0, {
49
+ "~LogMeta": "~LogMeta",
50
+ F: __dxlog_file,
51
+ L: 69,
52
+ S: void 0
53
+ });
54
+ } finally {
55
+ setPending(false);
56
+ }
57
+ };
58
+ if (contacts.length === 0) return /* @__PURE__ */ jsx("p", {
59
+ className: "text-fg-muted",
60
+ children: t("contact-picker-empty.message")
61
+ });
62
+ return /* @__PURE__ */ jsxs(Layout.Container, {
63
+ gap: "md",
64
+ role: "group",
65
+ gutter: "none",
66
+ children: [/* @__PURE__ */ jsxs(Layout.Flex, {
67
+ align: "center",
68
+ gap: "sm",
69
+ children: [
70
+ /* @__PURE__ */ jsx(ContactPicker, {
71
+ contacts,
72
+ excludeKeys: memberKeys,
73
+ value: selected,
74
+ onChange: (key) => {
75
+ setSelected(key);
76
+ setJoinUrl(void 0);
77
+ },
78
+ disabled: !canAdmit
79
+ }),
80
+ /* @__PURE__ */ jsxs(Select.Root, {
81
+ value: [String(role)],
82
+ onValueChange: ({ value: [value] }) => setRole(ROLES.find((candidate) => String(candidate) === value) ?? SpaceMember_Role.EDITOR),
83
+ items: ROLES.map((value) => ({
84
+ value: String(value),
85
+ label: t(roleLabel[value])
86
+ })),
87
+ children: [/* @__PURE__ */ jsx(Select.Trigger, {
88
+ classNames: "min-w-[6rem]",
89
+ disabled: !canAdmit
90
+ }), /* @__PURE__ */ jsx(Select.Content, { children: ROLES.map((value) => /* @__PURE__ */ jsx(Select.Item, { item: {
91
+ value: String(value),
92
+ label: t(roleLabel[value])
93
+ } }, value)) })]
94
+ }),
95
+ /* @__PURE__ */ jsx(SystemButton.Add, {
96
+ iconOnly: true,
97
+ label: t("contact-picker-add.label"),
98
+ disabled: !canAdmit || pending || !selected,
99
+ onClick: handleAdd,
100
+ "data-testid": "contactPicker.add"
101
+ })
102
+ ]
103
+ }), joinUrl && /* @__PURE__ */ jsxs(Layout.Flex, {
104
+ gap: "sm",
105
+ children: [/* @__PURE__ */ jsx(Field.Root, {
106
+ readOnly: true,
107
+ children: /* @__PURE__ */ jsx(Input.Root, {
108
+ readOnly: true,
109
+ value: joinUrl,
110
+ "data-testid": "contactPicker.joinUrl"
111
+ })
112
+ }), /* @__PURE__ */ jsx(SystemButton.Clipboard, { value: joinUrl })]
113
+ })]
114
+ });
115
+ };
116
+ ContactPickerContainer.displayName = "ContactPickerContainer";
117
+ //#endregion
118
+ export { ContactPickerContainer as default };
119
+
120
+ //# sourceMappingURL=chunk-ContactPickerContainer.mjs.map