@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-ContactPickerContainer.mjs","names":[],"sources":["../../src/containers/ContactPickerContainer/ContactPickerContainer.tsx"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\nimport React, { useMemo, useState } from 'react';\n\nimport type * as AppSurface from '@dxos/app-toolkit/AppSurface';\nimport { log } from '@dxos/log';\nimport { toPublicKey } from '@dxos/protocols/buf';\nimport { SpaceMember_Role, useMembers } from '@dxos/react-client/echo';\nimport { useContacts, useIdentity } from '@dxos/react-client/halo';\nimport * as Field from '@dxos/react-ui/Field';\nimport * as Hooks from '@dxos/react-ui/Hooks';\nimport * as Input from '@dxos/react-ui/Input';\nimport * as Layout from '@dxos/react-ui/Layout';\nimport * as Select from '@dxos/react-ui/Select';\nimport * as SystemButton from '@dxos/react-ui/SystemButton';\nimport { ContactPicker } from '@dxos/shell/react';\n\nimport { meta } from '#meta';\n\nconst ROLES = [SpaceMember_Role.READER, SpaceMember_Role.EDITOR, SpaceMember_Role.ADMIN] as const;\n\ntype AdmitRole = (typeof ROLES)[number];\n\nconst roleLabel: Record<AdmitRole, string> = {\n [SpaceMember_Role.EDITOR]: 'role-editor.label',\n [SpaceMember_Role.READER]: 'role-viewer.label',\n [SpaceMember_Role.ADMIN]: 'role-admin.label',\n};\n\nexport type ContactPickerContainerProps = AppSurface.ContactPickerData;\n\nexport const ContactPickerContainer = ({ space, onAdd }: ContactPickerContainerProps) => {\n const { t } = Hooks.useTranslation(meta.profile.key);\n const contacts = useContacts();\n const members = useMembers(space.key);\n const identity = useIdentity();\n const [selected, setSelected] = useState<string>();\n const [role, setRole] = useState<AdmitRole>(SpaceMember_Role.EDITOR);\n const [joinUrl, setJoinUrl] = useState<string>();\n const [pending, setPending] = useState(false);\n\n const memberKeys = useMemo(\n () =>\n members\n .map((member) => toPublicKey(member.identity?.identityKey)?.toHex())\n .filter((key): key is string => key !== undefined),\n [members],\n );\n const selfKey = toPublicKey(identity?.identityKey);\n const selfRole = members.find(\n (member) => selfKey && toPublicKey(member.identity?.identityKey)?.equals(selfKey),\n )?.role;\n const canAdmit = selfRole === SpaceMember_Role.OWNER || selfRole === SpaceMember_Role.ADMIN;\n\n const handleAdd = async () => {\n if (!selected) {\n return;\n }\n\n setPending(true);\n try {\n const result = await onAdd([selected], role);\n setJoinUrl(result.joinUrl);\n setSelected(result.failed[0]?.key);\n } catch (err) {\n // Selection is kept so the user can retry.\n log.catch(err);\n } finally {\n setPending(false);\n }\n };\n\n if (contacts.length === 0) {\n return <p className='text-fg-muted'>{t('contact-picker-empty.message')}</p>;\n }\n\n return (\n <Layout.Container gap='md' role='group' gutter='none'>\n <Layout.Flex align='center' gap='sm'>\n <ContactPicker\n contacts={contacts}\n excludeKeys={memberKeys}\n value={selected}\n onChange={(key) => {\n setSelected(key);\n setJoinUrl(undefined);\n }}\n disabled={!canAdmit}\n />\n <Select.Root\n value={[String(role)]}\n onValueChange={({ value: [value] }) =>\n setRole(ROLES.find((candidate) => String(candidate) === value) ?? SpaceMember_Role.EDITOR)\n }\n items={ROLES.map((value) => ({ value: String(value), label: t(roleLabel[value]) }))}\n >\n <Select.Trigger classNames='min-w-[6rem]' disabled={!canAdmit} />\n <Select.Content>\n {ROLES.map((value) => (\n <Select.Item key={value} item={{ value: String(value), label: t(roleLabel[value]) }} />\n ))}\n </Select.Content>\n </Select.Root>\n <SystemButton.Add\n iconOnly\n label={t('contact-picker-add.label')}\n disabled={!canAdmit || pending || !selected}\n onClick={handleAdd}\n data-testid='contactPicker.add'\n />\n </Layout.Flex>\n {joinUrl && (\n <Layout.Flex gap='sm'>\n <Field.Root readOnly>\n <Input.Root readOnly value={joinUrl} data-testid='contactPicker.joinUrl' />\n </Field.Root>\n <SystemButton.Clipboard value={joinUrl} />\n </Layout.Flex>\n )}\n </Layout.Container>\n );\n};\n\nContactPickerContainer.displayName = 'ContactPickerContainer';\n"],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import { meta } from "#meta";
2
+ import { useMemo, useState } from "react";
3
+ import { Form } from "@dxos/react-ui-form";
4
+ import * as UiHooks from "@dxos/react-ui/Hooks";
5
+ import { ContactList } from "@dxos/shell/react";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+ import * as GraphPath from "@dxos/app-toolkit/GraphPath";
8
+ import * as LayoutOperation from "@dxos/app-toolkit/LayoutOperation";
9
+ import * as Hooks from "@dxos/app-framework/Hooks";
10
+ import * as Field from "@dxos/react-ui/Field";
11
+ import * as Input from "@dxos/react-ui/Input";
12
+ import { useSpaces } from "@dxos/react-client/echo";
13
+ import { useContacts } from "@dxos/react-client/halo";
14
+ //#region src/containers/ContactsContainer/ContactsContainer.tsx
15
+ var ContactsContainer = () => {
16
+ const { t } = UiHooks.useTranslation(meta.profile.key);
17
+ const { invokePromise } = Hooks.useOperationInvoker();
18
+ const contacts = useContacts();
19
+ const spaces = useSpaces();
20
+ const [filter, setFilter] = useState("");
21
+ const contactSpaces = useMemo(() => spaces.map((space) => ({
22
+ id: space.id,
23
+ key: space.key,
24
+ name: space.properties.name
25
+ })), [spaces]);
26
+ const handleSelectSpace = (selected) => void invokePromise(LayoutOperation.SwitchWorkspace, { subject: GraphPath.getSpacePath(selected.id) });
27
+ return /* @__PURE__ */ jsx(Form.Root, {
28
+ variant: "settings",
29
+ children: /* @__PURE__ */ jsx(Form.Viewport, {
30
+ scroll: true,
31
+ children: /* @__PURE__ */ jsx(Form.Content, { children: /* @__PURE__ */ jsxs(Form.FieldSet, {
32
+ label: t("contacts.label"),
33
+ description: t("contacts.description"),
34
+ children: [(contacts.length > 1 || filter !== "") && /* @__PURE__ */ jsx(Field.Root, { children: /* @__PURE__ */ jsx(Input.Root, {
35
+ placeholder: t("contacts-search.placeholder"),
36
+ value: filter,
37
+ onChange: (event) => setFilter(event.target.value),
38
+ "data-testid": "contacts.search"
39
+ }) }), /* @__PURE__ */ jsx(ContactList, {
40
+ classNames: "mt-3",
41
+ contacts,
42
+ spaces: contactSpaces,
43
+ filter,
44
+ onSelectSpace: handleSelectSpace
45
+ })]
46
+ }) })
47
+ })
48
+ });
49
+ };
50
+ //#endregion
51
+ export { ContactsContainer as default };
52
+
53
+ //# sourceMappingURL=chunk-ContactsContainer.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-ContactsContainer.mjs","names":[],"sources":["../../src/containers/ContactsContainer/ContactsContainer.tsx"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\nimport React, { useMemo, useState } from 'react';\n\nimport * as Hooks from '@dxos/app-framework/Hooks';\nimport * as GraphPath from '@dxos/app-toolkit/GraphPath';\nimport * as LayoutOperation from '@dxos/app-toolkit/LayoutOperation';\nimport { useSpaces } from '@dxos/react-client/echo';\nimport { useContacts } from '@dxos/react-client/halo';\nimport { Form } from '@dxos/react-ui-form';\nimport * as Field from '@dxos/react-ui/Field';\nimport * as UiHooks from '@dxos/react-ui/Hooks';\nimport * as Input from '@dxos/react-ui/Input';\nimport { ContactList, type ContactSpace } from '@dxos/shell/react';\n\nimport { meta } from '#meta';\n\nexport const ContactsContainer = () => {\n const { t } = UiHooks.useTranslation(meta.profile.key);\n const { invokePromise } = Hooks.useOperationInvoker();\n const contacts = useContacts();\n const spaces = useSpaces();\n const [filter, setFilter] = useState('');\n const contactSpaces = useMemo(\n (): ContactSpace[] => spaces.map((space) => ({ id: space.id, key: space.key, name: space.properties.name })),\n [spaces],\n );\n\n const handleSelectSpace = (selected: ContactSpace) =>\n void invokePromise(LayoutOperation.SwitchWorkspace, { subject: GraphPath.getSpacePath(selected.id) });\n\n return (\n <Form.Root variant='settings'>\n <Form.Viewport scroll>\n <Form.Content>\n <Form.FieldSet label={t('contacts.label')} description={t('contacts.description')}>\n {(contacts.length > 1 || filter !== '') && (\n <Field.Root>\n <Input.Root\n placeholder={t('contacts-search.placeholder')}\n value={filter}\n onChange={(event) => setFilter(event.target.value)}\n data-testid='contacts.search'\n />\n </Field.Root>\n )}\n <ContactList\n classNames='mt-3'\n contacts={contacts}\n spaces={contactSpaces}\n filter={filter}\n onSelectSpace={handleSelectSpace}\n />\n </Form.FieldSet>\n </Form.Content>\n </Form.Viewport>\n </Form.Root>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;AAmBA,IAAa,0BAA0B;CACrC,MAAM,EAAE,MAAM,QAAQ,eAAe,KAAK,QAAQ,GAAG;CACrD,MAAM,EAAE,kBAAkB,MAAM,oBAAoB;CACpD,MAAM,WAAW,YAAY;CAC7B,MAAM,SAAS,UAAU;CACzB,MAAM,CAAC,QAAQ,aAAa,SAAS,EAAE;CACvC,MAAM,gBAAgB,cACE,OAAO,KAAK,WAAW;EAAE,IAAI,MAAM;EAAI,KAAK,MAAM;EAAK,MAAM,MAAM,WAAW;CAAK,EAAE,GAC3G,CAAC,MAAM,CACT;CAEA,MAAM,qBAAqB,aACzB,KAAK,cAAc,gBAAgB,iBAAiB,EAAE,SAAS,UAAU,aAAa,SAAS,EAAE,EAAE,CAAC;CAEtG,OACE,oBAAC,KAAK,MAAN;EAAW,SAAQ;EACjB,UAAA,oBAAC,KAAK,UAAN;GAAe,QAAA;GACb,UAAA,oBAAC,KAAK,SAAN,EAAA,UACE,qBAAC,KAAK,UAAN;IAAe,OAAO,EAAE,gBAAgB;IAAG,aAAa,EAAE,sBAAsB;IAAhF,UAAA,EACI,SAAS,SAAS,KAAK,WAAW,OAClC,oBAAC,MAAM,MAAP,EAAA,UACE,oBAAC,MAAM,MAAP;KACE,aAAa,EAAE,6BAA6B;KAC5C,OAAO;KACP,WAAW,UAAU,UAAU,MAAM,OAAO,KAAK;KACjD,eAAY;IACb,CAAA,EACS,CAAA,GAEd,oBAAC,aAAD;KACE,YAAW;KACD;KACV,QAAQ;KACA;KACR,eAAe;IAChB,CAAA,CACY;GACH,CAAA,EAAA,CAAA;EACD,CAAA;CACN,CAAA;AAEf"}
@@ -4,102 +4,42 @@ import { hexToEmoji } from "@dxos/util";
4
4
  import { log } from "@dxos/log";
5
5
  import { meta } from "#meta";
6
6
  import { useCallback, useEffect, useState } from "react";
7
- import { EffectEx } from "@dxos/effect";
8
- import { useCapabilities, useOperationInvoker } from "@dxos/app-framework/ui";
9
- import { useDevices, useInvitationFlow } from "@dxos/halo-react";
10
- import { useClient } from "@dxos/react-client";
7
+ import * as Button from "@dxos/react-ui/Button";
8
+ import * as UiHooks from "@dxos/react-ui/Hooks";
9
+ import { AuthCode, Centered, Emoji, Viewport } from "@dxos/shell/react";
11
10
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
12
- import { Button, Clipboard, Flex, Icon, IconButton, useId, useTranslation } from "@dxos/react-ui";
13
- import { Form } from "@dxos/react-ui-form";
14
- import { QR } from "react-qr-rounded";
11
+ import { useClient } from "@dxos/react-client";
12
+ import * as EffectEx from "@dxos/effect/EffectEx";
13
+ import * as Hooks from "@dxos/app-framework/Hooks";
14
+ import { useDevices, useInvitationFlow } from "@dxos/halo-react";
15
+ import * as Icon from "@dxos/react-ui/Icon";
16
+ import * as Layout from "@dxos/react-ui/Layout";
17
+ import * as SystemButton from "@dxos/react-ui/SystemButton";
15
18
  import { useNetworkStatus } from "@dxos/react-client/mesh";
16
- import { Listbox } from "@dxos/react-ui-list";
17
- import { AuthCode, Centered, DeviceListItem, Emoji, Viewport } from "@dxos/shell/react";
19
+ import * as QrCode from "@dxos/react-ui/QrCode";
18
20
  import { osTranslations } from "@dxos/ui-theme";
21
+ import { DevicesForm } from "#components";
19
22
  //#region src/containers/DevicesContainer/DevicesContainer.tsx
20
23
  var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-client/src/containers/DevicesContainer/DevicesContainer.tsx";
21
24
  var DevicesContainer = ({ createInvitationUrl, identityTestActions }) => {
22
- const { t } = useTranslation(meta.profile.key);
23
- const { invokePromise } = useOperationInvoker();
25
+ const { invokePromise } = Hooks.useOperationInvoker();
24
26
  const devices = useDevices();
25
27
  const { swarm: connectionState } = useNetworkStatus();
26
28
  const handleLogout = useCallback(() => invokePromise(ClientOperation.ResetStorage, {}), [invokePromise]);
27
29
  const handleRecover = useCallback(() => invokePromise(ClientOperation.ResetStorage, { mode: "recover" }), [invokePromise]);
28
30
  const handleJoinNewIdentity = useCallback(() => invokePromise(ClientOperation.ResetStorage, { mode: "join-new-identity" }), [invokePromise]);
29
- return /* @__PURE__ */ jsx(Clipboard.Provider, { children: /* @__PURE__ */ jsx(Form.Root, {
30
- variant: "settings",
31
- children: /* @__PURE__ */ jsx(Form.Viewport, {
32
- scroll: true,
33
- children: /* @__PURE__ */ jsxs(Form.Content, { children: [
34
- /* @__PURE__ */ jsx(Form.Section, {
35
- title: t("devices-verbose.label", { ns: meta.profile.key }),
36
- description: t("devices.description", { ns: meta.profile.key }),
37
- children: /* @__PURE__ */ jsxs(Form.Group, { children: [/* @__PURE__ */ jsxs("div", {
38
- role: "group",
39
- className: "min-w-0",
40
- children: [/* @__PURE__ */ jsx("h3", {
41
- className: "text-lg mb-2",
42
- children: t("devices.label", { ns: meta.profile.key })
43
- }), /* @__PURE__ */ jsx(Listbox.Root, { children: /* @__PURE__ */ jsx(Listbox.Content, {
44
- "aria-label": t("devices.label", { ns: meta.profile.key }),
45
- children: devices.map((device) => /* @__PURE__ */ jsx(DeviceListItem, {
46
- device,
47
- connectionState
48
- }, device.key))
49
- }) })]
50
- }), createInvitationUrl && /* @__PURE__ */ jsxs("div", {
51
- role: "group",
52
- className: "min-w-0",
53
- children: [/* @__PURE__ */ jsx("h3", {
54
- className: "text-lg mb-2",
55
- children: t("add-device.label")
56
- }), /* @__PURE__ */ jsx(DeviceInvitation, { createInvitationUrl })]
57
- })] })
58
- }),
59
- /* @__PURE__ */ jsx(Form.Section, {
60
- title: t("logout-section.title"),
61
- description: t("logout-section.description"),
62
- children: /* @__PURE__ */ jsx(Form.Row, {
63
- label: t("logout.label"),
64
- description: t("logout.description"),
65
- children: /* @__PURE__ */ jsx(Button, {
66
- variant: "destructive",
67
- onClick: handleLogout,
68
- "data-testid": "devicesContainer.logout",
69
- children: t("logout.label")
70
- })
71
- })
72
- }),
73
- identityTestActions && /* @__PURE__ */ jsxs(Form.Section, {
74
- title: t("identity-test-section.title"),
75
- description: t("identity-test-section.description"),
76
- children: [/* @__PURE__ */ jsx(Form.Row, {
77
- label: t("recover-identity.label"),
78
- description: t("recover-identity.description"),
79
- children: /* @__PURE__ */ jsx(Button, {
80
- variant: "destructive",
81
- onClick: handleRecover,
82
- "data-testid": "devicesContainer.recover",
83
- children: t("recover-identity.label")
84
- })
85
- }), /* @__PURE__ */ jsx(Form.Row, {
86
- label: t("join-new-identity.label"),
87
- description: t("join-new-identity.description"),
88
- children: /* @__PURE__ */ jsx(Button, {
89
- variant: "destructive",
90
- onClick: handleJoinNewIdentity,
91
- "data-testid": "devicesContainer.joinExisting",
92
- children: t("join-new-identity.label")
93
- })
94
- })]
95
- })
96
- ] })
97
- })
98
- }) });
31
+ return /* @__PURE__ */ jsx(DevicesForm, {
32
+ devices,
33
+ connectionState,
34
+ invitation: createInvitationUrl && /* @__PURE__ */ jsx(DeviceInvitation, { createInvitationUrl }),
35
+ onLogout: handleLogout,
36
+ onRecover: identityTestActions ? handleRecover : void 0,
37
+ onJoinNewIdentity: identityTestActions ? handleJoinNewIdentity : void 0
38
+ });
99
39
  };
100
40
  var DeviceInvitation = (props) => {
101
41
  const client = useClient();
102
- const [identityService] = useCapabilities(ClientCapabilities.IdentityService);
42
+ const [identityService] = Hooks.useCapabilities(ClientCapabilities.IdentityService);
103
43
  const [flow, setFlow] = useState();
104
44
  const [pending, setPending] = useState(false);
105
45
  const onInvitationCreate = useCallback(() => {
@@ -109,14 +49,14 @@ var DeviceInvitation = (props) => {
109
49
  if (client.config.values.runtime?.app?.env?.DX_ENVIRONMENT !== "production") log.info(JSON.stringify({ invitationCode: await EffectEx.runPromise(created.code) }), void 0, {
110
50
  "~LogMeta": "~LogMeta",
111
51
  F: __dxlog_file,
112
- L: 138,
52
+ L: 89,
113
53
  S: void 0
114
54
  });
115
55
  setFlow(created);
116
56
  }).catch((err) => log.catch(err, void 0, {
117
57
  "~LogMeta": "~LogMeta",
118
58
  F: __dxlog_file,
119
- L: 142,
59
+ L: 93,
120
60
  S: void 0
121
61
  })).finally(() => setPending(false));
122
62
  }, [
@@ -129,7 +69,7 @@ var DeviceInvitation = (props) => {
129
69
  if (flow) EffectEx.runPromise(flow.cancel()).catch((err) => log.catch(err, void 0, {
130
70
  "~LogMeta": "~LogMeta",
131
71
  F: __dxlog_file,
132
- L: 149,
72
+ L: 100,
133
73
  S: void 0
134
74
  }));
135
75
  setFlow(void 0);
@@ -154,7 +94,7 @@ var DeviceInvitationImpl = ({ flow, createInvitationUrl, onInvitationDone, onInv
154
94
  if (event?._tag === "readyForAuthentication" && client.config.values.runtime?.app?.env?.DX_ENVIRONMENT !== "production") log.info(JSON.stringify({ authCode: event.authCode }), void 0, {
155
95
  "~LogMeta": "~LogMeta",
156
96
  F: __dxlog_file,
157
- L: 178,
97
+ L: 129,
158
98
  S: void 0
159
99
  });
160
100
  }, [event?._tag]);
@@ -170,13 +110,13 @@ var DeviceInvitationImpl = ({ flow, createInvitationUrl, onInvitationDone, onInv
170
110
  });
171
111
  };
172
112
  var InvitationSection = ({ event, invitationId = "never", url = "never", onInvitationDone = () => {}, onInvitationCreate = () => {} }) => {
173
- const { t } = useTranslation(meta.profile.key);
113
+ const { t } = UiHooks.useTranslation(meta.profile.key);
174
114
  const authCode = event?._tag === "readyForAuthentication" ? event.authCode : void 0;
175
115
  const activeView = !event ? "init" : event._tag === "cancelled" || event._tag === "error" || event._tag === "success" ? "complete" : authCode ? "auth-code" : "qr-code";
176
116
  return activeView === "init" ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("p", {
177
- className: "text-description mb-2",
117
+ className: "text-fg-muted mb-2",
178
118
  children: t("add-device.description")
179
- }), /* @__PURE__ */ jsx(IconButton, {
119
+ }), /* @__PURE__ */ jsx(Button.Root, {
180
120
  icon: "ph--plus--regular",
181
121
  label: t("create-device-invitation.label"),
182
122
  disabled: !!event,
@@ -211,30 +151,26 @@ var InvitationSection = ({ event, invitationId = "never", url = "never", onInvit
211
151
  });
212
152
  };
213
153
  var InvitationQR = ({ id, url, onCancel }) => {
214
- const { t } = useTranslation(osTranslations);
215
- const qrLabel = useId("devices-container__qr-code");
154
+ const { t } = UiHooks.useTranslation(osTranslations);
155
+ const qrLabel = UiHooks.useId("devices-container__qr-code");
216
156
  const emoji = hexToEmoji(id);
217
157
  return /* @__PURE__ */ jsxs(Fragment, { children: [
218
158
  /* @__PURE__ */ jsx("p", {
219
- className: "text-description",
159
+ className: "text-fg-muted",
220
160
  children: t("qr-code.description", { ns: meta.profile.key })
221
161
  }),
222
162
  /* @__PURE__ */ jsxs("div", {
223
163
  role: "group",
224
164
  className: "grid grid-cols-[1fr_min-content]",
225
- children: [/* @__PURE__ */ jsx(Flex, {
165
+ children: [/* @__PURE__ */ jsx(Layout.Flex, {
226
166
  justify: "center",
227
167
  classNames: "py-4",
228
168
  children: /* @__PURE__ */ jsxs("div", {
229
- className: "w-full md:max-w-80 aspect-square relative text-description",
230
- children: [/* @__PURE__ */ jsx(QR, {
231
- rounding: 100,
232
- backgroundColor: "transparent",
233
- color: "currentColor",
169
+ className: "w-full md:max-w-80 aspect-square relative text-fg-muted",
170
+ children: [/* @__PURE__ */ jsx(QrCode.QrCode, {
234
171
  "aria-labelledby": qrLabel,
235
- errorCorrectionLevel: "Q",
236
- cutout: true,
237
- children: url ?? "never"
172
+ errorCorrection: "Q",
173
+ value: url ?? "never"
238
174
  }), /* @__PURE__ */ jsx(Centered, { children: /* @__PURE__ */ jsx(Emoji, { text: emoji }) })]
239
175
  })
240
176
  }), /* @__PURE__ */ jsx("span", {
@@ -243,11 +179,11 @@ var InvitationQR = ({ id, url, onCancel }) => {
243
179
  children: t("qr.label")
244
180
  })]
245
181
  }),
246
- /* @__PURE__ */ jsx(Flex, {
182
+ /* @__PURE__ */ jsx(Layout.Flex, {
247
183
  justify: "center",
248
- children: /* @__PURE__ */ jsxs(Flex, {
184
+ children: /* @__PURE__ */ jsxs(Layout.Flex, {
249
185
  gap: "sm",
250
- children: [/* @__PURE__ */ jsx(Clipboard.Button, { value: url ?? "never" }), /* @__PURE__ */ jsx(Button, {
186
+ children: [/* @__PURE__ */ jsx(SystemButton.Clipboard, { value: url ?? "never" }), /* @__PURE__ */ jsx(Button.Root, {
251
187
  variant: "ghost",
252
188
  onClick: onCancel,
253
189
  children: t("cancel.label")
@@ -257,11 +193,11 @@ var InvitationQR = ({ id, url, onCancel }) => {
257
193
  ] });
258
194
  };
259
195
  var InvitationAuthCode = ({ id, code, onCancel }) => {
260
- const { t } = useTranslation(osTranslations);
196
+ const { t } = UiHooks.useTranslation(osTranslations);
261
197
  const emoji = hexToEmoji(id);
262
198
  return /* @__PURE__ */ jsxs(Fragment, { children: [
263
199
  /* @__PURE__ */ jsx("p", {
264
- className: "text-description",
200
+ className: "text-fg-muted",
265
201
  children: t("auth-other-device-emoji.message")
266
202
  }),
267
203
  emoji && /* @__PURE__ */ jsx(Emoji, {
@@ -269,7 +205,7 @@ var InvitationAuthCode = ({ id, code, onCancel }) => {
269
205
  className: "mx-auto my-2 text-center"
270
206
  }),
271
207
  /* @__PURE__ */ jsx("p", {
272
- className: "text-description",
208
+ className: "text-fg-muted",
273
209
  children: t("auth-code.message")
274
210
  }),
275
211
  /* @__PURE__ */ jsx(AuthCode, {
@@ -277,7 +213,7 @@ var InvitationAuthCode = ({ id, code, onCancel }) => {
277
213
  large: true,
278
214
  classNames: "mx-auto my-2 text-center grow"
279
215
  }),
280
- /* @__PURE__ */ jsx(Button, {
216
+ /* @__PURE__ */ jsx(Button.Root, {
281
217
  variant: "ghost",
282
218
  onClick: onCancel,
283
219
  children: t("cancel.label")
@@ -285,13 +221,13 @@ var InvitationAuthCode = ({ id, code, onCancel }) => {
285
221
  ] });
286
222
  };
287
223
  var InvitationComplete = ({ succeeded }) => {
288
- return succeeded ? /* @__PURE__ */ jsx(Icon, {
224
+ return succeeded ? /* @__PURE__ */ jsx(Icon.Icon, {
289
225
  icon: "ph--check--regular",
290
- size: 6,
226
+ size: "xl",
291
227
  classNames: "m-trim-xs"
292
- }) : /* @__PURE__ */ jsx(Icon, {
228
+ }) : /* @__PURE__ */ jsx(Icon.Icon, {
293
229
  icon: "ph--x--regular",
294
- size: 6,
230
+ size: "xl",
295
231
  classNames: "m-trim-xs"
296
232
  });
297
233
  };
@@ -1 +1 @@
1
- {"version":3,"file":"chunk-DevicesContainer.mjs","names":[],"sources":["../../src/containers/DevicesContainer/DevicesContainer.tsx"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { QR } from 'react-qr-rounded';\n\nimport { useCapabilities, useOperationInvoker } from '@dxos/app-framework/ui';\nimport { EffectEx } from '@dxos/effect';\nimport { type Identity, type Invitation } from '@dxos/halo';\nimport { useDevices, useInvitationFlow } from '@dxos/halo-react';\nimport { log } from '@dxos/log';\nimport { useClient } from '@dxos/react-client';\nimport { useNetworkStatus } from '@dxos/react-client/mesh';\nimport { Button, Clipboard, Flex, Icon, IconButton, useId, useTranslation } from '@dxos/react-ui';\nimport { Form } from '@dxos/react-ui-form';\nimport { Listbox } from '@dxos/react-ui-list';\nimport { AuthCode, Centered, DeviceListItem, Emoji, Viewport } from '@dxos/shell/react';\nimport { osTranslations } from '@dxos/ui-theme';\nimport { hexToEmoji } from '@dxos/util';\n\nimport { meta } from '#meta';\nimport { ClientOperation } from '#operations';\nimport { ClientCapabilities, ClientOptions } from '#types';\n\nexport type DevicesContainerProps = Pick<ClientOptions.ClientPluginOptions, 'identityTestActions'> & {\n createInvitationUrl?: (invitationCode: string) => string;\n};\n\nexport const DevicesContainer = ({ createInvitationUrl, identityTestActions }: DevicesContainerProps) => {\n const { t } = useTranslation(meta.profile.key);\n const { invokePromise } = useOperationInvoker();\n const devices = useDevices();\n const { swarm: connectionState } = useNetworkStatus();\n\n const handleLogout = useCallback(() => invokePromise(ClientOperation.ResetStorage, {}), [invokePromise]);\n\n const handleRecover = useCallback(\n () => invokePromise(ClientOperation.ResetStorage, { mode: 'recover' }),\n [invokePromise],\n );\n\n const handleJoinNewIdentity = useCallback(\n () => invokePromise(ClientOperation.ResetStorage, { mode: 'join-new-identity' }),\n [invokePromise],\n );\n\n return (\n <Clipboard.Provider>\n <Form.Root variant='settings'>\n <Form.Viewport scroll>\n <Form.Content>\n <Form.Section\n title={t('devices-verbose.label', { ns: meta.profile.key })}\n description={t('devices.description', { ns: meta.profile.key })}\n >\n <Form.Group>\n <div role='group' className='min-w-0'>\n <h3 className='text-lg mb-2'>{t('devices.label', { ns: meta.profile.key })}</h3>\n <Listbox.Root>\n <Listbox.Content aria-label={t('devices.label', { ns: meta.profile.key })}>\n {devices.map((device: Identity.DeviceInfo) => (\n <DeviceListItem key={device.key} device={device} connectionState={connectionState} />\n ))}\n </Listbox.Content>\n </Listbox.Root>\n </div>\n {createInvitationUrl && (\n <div role='group' className='min-w-0'>\n <h3 className='text-lg mb-2'>{t('add-device.label')}</h3>\n <DeviceInvitation createInvitationUrl={createInvitationUrl} />\n </div>\n )}\n </Form.Group>\n </Form.Section>\n <Form.Section title={t('logout-section.title')} description={t('logout-section.description')}>\n <Form.Row label={t('logout.label')} description={t('logout.description')}>\n <Button variant='destructive' onClick={handleLogout} data-testid='devicesContainer.logout'>\n {t('logout.label')}\n </Button>\n </Form.Row>\n </Form.Section>\n {identityTestActions && (\n <Form.Section\n title={t('identity-test-section.title')}\n description={t('identity-test-section.description')}\n >\n <Form.Row label={t('recover-identity.label')} description={t('recover-identity.description')}>\n <Button variant='destructive' onClick={handleRecover} data-testid='devicesContainer.recover'>\n {t('recover-identity.label')}\n </Button>\n </Form.Row>\n <Form.Row label={t('join-new-identity.label')} description={t('join-new-identity.description')}>\n <Button\n variant='destructive'\n onClick={handleJoinNewIdentity}\n data-testid='devicesContainer.joinExisting'\n >\n {t('join-new-identity.label')}\n </Button>\n </Form.Row>\n </Form.Section>\n )}\n </Form.Content>\n </Form.Viewport>\n </Form.Root>\n </Clipboard.Provider>\n );\n};\n\ntype DeviceInvitationProps = {\n flow?: Invitation.Flow;\n createInvitationUrl: (invitationCode: string) => string;\n onInvitationDone: () => void;\n onInvitationCreate: () => void;\n};\n\nconst DeviceInvitation = (props: Pick<DeviceInvitationProps, 'createInvitationUrl'>) => {\n // `client.config` only — the network status above keeps this container on the client regardless\n // (Missing API 9). The gate matters: an invitation code in a production console is a live secret.\n const client = useClient();\n const [identityService] = useCapabilities(ClientCapabilities.IdentityService);\n const [flow, setFlow] = useState<Invitation.Flow>();\n // Latched before the share resolves, so a second click cannot open a second live invitation.\n const [pending, setPending] = useState(false);\n\n const onInvitationCreate = useCallback(() => {\n if (!identityService || pending || flow) {\n return;\n }\n setPending(true);\n // Requested explicitly because `share()` defaults to no authentication, which would leave the\n // invitation code as the only factor guarding an identity.\n void EffectEx.runPromise(identityService.share({ authMethod: 'shared-secret' }))\n .then(async (created) => {\n // Playwright reads this line off the console to drive the device-invitation flows.\n if (client.config.values.runtime?.app?.env?.DX_ENVIRONMENT !== 'production') {\n log.info(JSON.stringify({ invitationCode: await EffectEx.runPromise(created.code) }));\n }\n setFlow(created);\n })\n .catch((err) => log.catch(err))\n .finally(() => setPending(false));\n }, [client, identityService, pending, flow]);\n\n const onInvitationDone = useCallback(() => {\n // Cancel before dropping the handle: clearing local state alone leaves the host side listening.\n if (flow) {\n void EffectEx.runPromise(flow.cancel()).catch((err) => log.catch(err));\n }\n setFlow(undefined);\n }, [flow]);\n\n if (flow) {\n return <DeviceInvitationImpl {...props} {...{ flow, onInvitationCreate, onInvitationDone }} />;\n } else {\n return <InvitationSection {...props} {...{ onInvitationCreate, onInvitationDone }} />;\n }\n};\n\nconst DeviceInvitationImpl = ({\n flow,\n createInvitationUrl,\n onInvitationDone,\n onInvitationCreate,\n}: DeviceInvitationProps) => {\n const client = useClient();\n const { event, code } = useInvitationFlow(flow);\n const url = code && createInvitationUrl(code);\n\n // Logged separately from the invitation code Playwright reads on creation, because the host only\n // learns the auth code once a guest has connected.\n useEffect(() => {\n if (\n event?._tag === 'readyForAuthentication' &&\n client.config.values.runtime?.app?.env?.DX_ENVIRONMENT !== 'production'\n ) {\n log.info(JSON.stringify({ authCode: event.authCode }));\n }\n }, [event?._tag]);\n\n // Every terminal event returns to the creation view; parking on the completion icon would strand\n // a failed or cancelled invitation with no way to retry.\n useEffect(() => {\n if (event && (event._tag === 'success' || event._tag === 'cancelled' || event._tag === 'error')) {\n onInvitationDone();\n }\n }, [event?._tag]);\n\n return <InvitationSection {...{ event, invitationId: flow?.id, url, onInvitationDone, onInvitationCreate }} />;\n};\n\ntype InvitationComponentProps = Partial<\n Pick<DeviceInvitationProps, 'onInvitationDone' | 'onInvitationCreate'> & {\n event: Invitation.Event;\n invitationId: string;\n url: string;\n }\n>;\n\nconst InvitationSection = ({\n event,\n invitationId = 'never',\n url = 'never',\n onInvitationDone = () => {},\n onInvitationCreate = () => {},\n}: InvitationComponentProps) => {\n const { t } = useTranslation(meta.profile.key);\n const authCode = event?._tag === 'readyForAuthentication' ? event.authCode : undefined;\n const activeView = !event\n ? 'init'\n : event._tag === 'cancelled' || event._tag === 'error' || event._tag === 'success'\n ? 'complete'\n : authCode\n ? 'auth-code'\n : 'qr-code';\n\n return activeView === 'init' ? (\n <>\n <p className='text-description mb-2'>{t('add-device.description')}</p>\n <IconButton\n icon='ph--plus--regular'\n label={t('create-device-invitation.label')}\n disabled={!!event}\n classNames='w-full'\n data-testid='devicesContainer.createInvitation'\n onClick={onInvitationCreate}\n />\n </>\n ) : (\n <Viewport.Root activeView={activeView}>\n <Viewport.Views>\n <Viewport.View id='init'>\n {/* This view intentionally left blank while conditionally rendering the viewport. */}\n </Viewport.View>\n <Viewport.View id='complete'>\n <InvitationComplete succeeded={event?._tag === 'success'} />\n </Viewport.View>\n <Viewport.View id='auth-code'>\n <InvitationAuthCode id={invitationId} code={authCode ?? 'never'} onCancel={onInvitationDone} />\n </Viewport.View>\n <Viewport.View id='qr-code'>\n <InvitationQR id={invitationId} url={url} onCancel={onInvitationDone} />\n </Viewport.View>\n </Viewport.Views>\n </Viewport.Root>\n );\n};\n\nconst InvitationQR = ({ id, url, onCancel }: { id: string; url: string; onCancel: () => void }) => {\n const { t } = useTranslation(osTranslations);\n const qrLabel = useId('devices-container__qr-code');\n const emoji = hexToEmoji(id);\n return (\n <>\n <p className='text-description'>{t('qr-code.description', { ns: meta.profile.key })}</p>\n <div role='group' className='grid grid-cols-[1fr_min-content]'>\n <Flex justify='center' classNames='py-4'>\n <div className='w-full md:max-w-80 aspect-square relative text-description'>\n <QR\n rounding={100}\n backgroundColor='transparent'\n color='currentColor'\n aria-labelledby={qrLabel}\n errorCorrectionLevel='Q'\n cutout={true}\n >\n {url ?? 'never'}\n </QR>\n <Centered>\n <Emoji text={emoji} />\n </Centered>\n </div>\n </Flex>\n <span id={qrLabel} className='sr-only'>\n {t('qr.label')}\n </span>\n </div>\n {/* TODO(burdon): Factor out button bar */}\n <Flex justify='center'>\n <Flex gap='sm'>\n <Clipboard.Button value={url ?? 'never'} />\n <Button variant='ghost' onClick={onCancel}>\n {t('cancel.label')}\n </Button>\n </Flex>\n </Flex>\n </>\n );\n};\n\nconst InvitationAuthCode = ({ id, code, onCancel }: { id: string; code: string; onCancel: () => void }) => {\n const { t } = useTranslation(osTranslations);\n const emoji = hexToEmoji(id);\n\n return (\n <>\n <p className='text-description'>{t('auth-other-device-emoji.message')}</p>\n {emoji && <Emoji text={emoji} className='mx-auto my-2 text-center' />}\n <p className='text-description'>{t('auth-code.message')}</p>\n <AuthCode code={code} large classNames='mx-auto my-2 text-center grow' />\n <Button variant='ghost' onClick={onCancel}>\n {t('cancel.label')}\n </Button>\n </>\n );\n};\n\nconst InvitationComplete = ({ succeeded }: { succeeded: boolean }) => {\n return succeeded ? (\n <Icon icon='ph--check--regular' size={6} classNames='m-trim-xs' />\n ) : (\n <Icon icon='ph--x--regular' size={6} classNames='m-trim-xs' />\n );\n};\n\nDevicesContainer.displayName = 'DevicesContainer';\n"],"mappings":"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"}
1
+ {"version":3,"file":"chunk-DevicesContainer.mjs","names":[],"sources":["../../src/containers/DevicesContainer/DevicesContainer.tsx"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback, useEffect, useState } from 'react';\n\nimport * as Hooks from '@dxos/app-framework/Hooks';\nimport * as EffectEx from '@dxos/effect/EffectEx';\nimport { type Invitation } from '@dxos/halo';\nimport { useDevices, useInvitationFlow } from '@dxos/halo-react';\nimport { log } from '@dxos/log';\nimport { useClient } from '@dxos/react-client';\nimport { useNetworkStatus } from '@dxos/react-client/mesh';\nimport * as Button from '@dxos/react-ui/Button';\nimport * as UiHooks from '@dxos/react-ui/Hooks';\nimport * as Icon from '@dxos/react-ui/Icon';\nimport * as Layout from '@dxos/react-ui/Layout';\nimport * as QrCode from '@dxos/react-ui/QrCode';\nimport * as SystemButton from '@dxos/react-ui/SystemButton';\nimport { AuthCode, Centered, Emoji, Viewport } from '@dxos/shell/react';\nimport { osTranslations } from '@dxos/ui-theme';\nimport { hexToEmoji } from '@dxos/util';\n\nimport { DevicesForm } from '#components';\nimport { meta } from '#meta';\nimport { ClientOperation } from '#operations';\nimport { ClientCapabilities, ClientOptions } from '#types';\n\nexport type DevicesContainerProps = Pick<ClientOptions.ClientPluginOptions, 'identityTestActions'> & {\n createInvitationUrl?: (invitationCode: string) => string;\n};\n\nexport const DevicesContainer = ({ createInvitationUrl, identityTestActions }: DevicesContainerProps) => {\n const { invokePromise } = Hooks.useOperationInvoker();\n const devices = useDevices();\n const { swarm: connectionState } = useNetworkStatus();\n\n const handleLogout = useCallback(() => invokePromise(ClientOperation.ResetStorage, {}), [invokePromise]);\n\n const handleRecover = useCallback(\n () => invokePromise(ClientOperation.ResetStorage, { mode: 'recover' }),\n [invokePromise],\n );\n\n const handleJoinNewIdentity = useCallback(\n () => invokePromise(ClientOperation.ResetStorage, { mode: 'join-new-identity' }),\n [invokePromise],\n );\n\n return (\n <DevicesForm\n devices={devices}\n connectionState={connectionState}\n invitation={createInvitationUrl && <DeviceInvitation createInvitationUrl={createInvitationUrl} />}\n onLogout={handleLogout}\n onRecover={identityTestActions ? handleRecover : undefined}\n onJoinNewIdentity={identityTestActions ? handleJoinNewIdentity : undefined}\n />\n );\n};\n\ntype DeviceInvitationProps = {\n flow?: Invitation.Flow;\n createInvitationUrl: (invitationCode: string) => string;\n onInvitationDone: () => void;\n onInvitationCreate: () => void;\n};\n\nconst DeviceInvitation = (props: Pick<DeviceInvitationProps, 'createInvitationUrl'>) => {\n // `client.config` only — the network status above keeps this container on the client regardless\n // (Missing API 9). The gate matters: an invitation code in a production console is a live secret.\n const client = useClient();\n const [identityService] = Hooks.useCapabilities(ClientCapabilities.IdentityService);\n const [flow, setFlow] = useState<Invitation.Flow>();\n // Latched before the share resolves, so a second click cannot open a second live invitation.\n const [pending, setPending] = useState(false);\n\n const onInvitationCreate = useCallback(() => {\n if (!identityService || pending || flow) {\n return;\n }\n setPending(true);\n // Requested explicitly because `share()` defaults to no authentication, which would leave the\n // invitation code as the only factor guarding an identity.\n void EffectEx.runPromise(identityService.share({ authMethod: 'shared-secret' }))\n .then(async (created) => {\n // Playwright reads this line off the console to drive the device-invitation flows.\n if (client.config.values.runtime?.app?.env?.DX_ENVIRONMENT !== 'production') {\n log.info(JSON.stringify({ invitationCode: await EffectEx.runPromise(created.code) }));\n }\n setFlow(created);\n })\n .catch((err) => log.catch(err))\n .finally(() => setPending(false));\n }, [client, identityService, pending, flow]);\n\n const onInvitationDone = useCallback(() => {\n // Cancel before dropping the handle: clearing local state alone leaves the host side listening.\n if (flow) {\n void EffectEx.runPromise(flow.cancel()).catch((err) => log.catch(err));\n }\n setFlow(undefined);\n }, [flow]);\n\n if (flow) {\n return <DeviceInvitationImpl {...props} {...{ flow, onInvitationCreate, onInvitationDone }} />;\n } else {\n return <InvitationSection {...props} {...{ onInvitationCreate, onInvitationDone }} />;\n }\n};\n\nconst DeviceInvitationImpl = ({\n flow,\n createInvitationUrl,\n onInvitationDone,\n onInvitationCreate,\n}: DeviceInvitationProps) => {\n const client = useClient();\n const { event, code } = useInvitationFlow(flow);\n const url = code && createInvitationUrl(code);\n\n // Logged separately from the invitation code Playwright reads on creation, because the host only\n // learns the auth code once a guest has connected.\n useEffect(() => {\n if (\n event?._tag === 'readyForAuthentication' &&\n client.config.values.runtime?.app?.env?.DX_ENVIRONMENT !== 'production'\n ) {\n log.info(JSON.stringify({ authCode: event.authCode }));\n }\n }, [event?._tag]);\n\n // Every terminal event returns to the creation view; parking on the completion icon would strand\n // a failed or cancelled invitation with no way to retry.\n useEffect(() => {\n if (event && (event._tag === 'success' || event._tag === 'cancelled' || event._tag === 'error')) {\n onInvitationDone();\n }\n }, [event?._tag]);\n\n return <InvitationSection {...{ event, invitationId: flow?.id, url, onInvitationDone, onInvitationCreate }} />;\n};\n\ntype InvitationComponentProps = Partial<\n Pick<DeviceInvitationProps, 'onInvitationDone' | 'onInvitationCreate'> & {\n event: Invitation.Event;\n invitationId: string;\n url: string;\n }\n>;\n\nconst InvitationSection = ({\n event,\n invitationId = 'never',\n url = 'never',\n onInvitationDone = () => {},\n onInvitationCreate = () => {},\n}: InvitationComponentProps) => {\n const { t } = UiHooks.useTranslation(meta.profile.key);\n const authCode = event?._tag === 'readyForAuthentication' ? event.authCode : undefined;\n const activeView = !event\n ? 'init'\n : event._tag === 'cancelled' || event._tag === 'error' || event._tag === 'success'\n ? 'complete'\n : authCode\n ? 'auth-code'\n : 'qr-code';\n\n return activeView === 'init' ? (\n <>\n <p className='text-fg-muted mb-2'>{t('add-device.description')}</p>\n <Button.Root\n icon='ph--plus--regular'\n label={t('create-device-invitation.label')}\n disabled={!!event}\n classNames='w-full'\n data-testid='devicesContainer.createInvitation'\n onClick={onInvitationCreate}\n />\n </>\n ) : (\n <Viewport.Root activeView={activeView}>\n <Viewport.Views>\n <Viewport.View id='init'>\n {/* This view intentionally left blank while conditionally rendering the viewport. */}\n </Viewport.View>\n <Viewport.View id='complete'>\n <InvitationComplete succeeded={event?._tag === 'success'} />\n </Viewport.View>\n <Viewport.View id='auth-code'>\n <InvitationAuthCode id={invitationId} code={authCode ?? 'never'} onCancel={onInvitationDone} />\n </Viewport.View>\n <Viewport.View id='qr-code'>\n <InvitationQR id={invitationId} url={url} onCancel={onInvitationDone} />\n </Viewport.View>\n </Viewport.Views>\n </Viewport.Root>\n );\n};\n\nconst InvitationQR = ({ id, url, onCancel }: { id: string; url: string; onCancel: () => void }) => {\n const { t } = UiHooks.useTranslation(osTranslations);\n const qrLabel = UiHooks.useId('devices-container__qr-code');\n const emoji = hexToEmoji(id);\n return (\n <>\n <p className='text-fg-muted'>{t('qr-code.description', { ns: meta.profile.key })}</p>\n <div role='group' className='grid grid-cols-[1fr_min-content]'>\n <Layout.Flex justify='center' classNames='py-4'>\n <div className='w-full md:max-w-80 aspect-square relative text-fg-muted'>\n <QrCode.QrCode aria-labelledby={qrLabel} errorCorrection='Q' value={url ?? 'never'} />\n <Centered>\n <Emoji text={emoji} />\n </Centered>\n </div>\n </Layout.Flex>\n <span id={qrLabel} className='sr-only'>\n {t('qr.label')}\n </span>\n </div>\n {/* TODO(burdon): Factor out button bar */}\n <Layout.Flex justify='center'>\n <Layout.Flex gap='sm'>\n <SystemButton.Clipboard value={url ?? 'never'} />\n <Button.Root variant='ghost' onClick={onCancel}>\n {t('cancel.label')}\n </Button.Root>\n </Layout.Flex>\n </Layout.Flex>\n </>\n );\n};\n\nconst InvitationAuthCode = ({ id, code, onCancel }: { id: string; code: string; onCancel: () => void }) => {\n const { t } = UiHooks.useTranslation(osTranslations);\n const emoji = hexToEmoji(id);\n\n return (\n <>\n <p className='text-fg-muted'>{t('auth-other-device-emoji.message')}</p>\n {emoji && <Emoji text={emoji} className='mx-auto my-2 text-center' />}\n <p className='text-fg-muted'>{t('auth-code.message')}</p>\n <AuthCode code={code} large classNames='mx-auto my-2 text-center grow' />\n <Button.Root variant='ghost' onClick={onCancel}>\n {t('cancel.label')}\n </Button.Root>\n </>\n );\n};\n\nconst InvitationComplete = ({ succeeded }: { succeeded: boolean }) => {\n return succeeded ? (\n <Icon.Icon icon='ph--check--regular' size='xl' classNames='m-trim-xs' />\n ) : (\n <Icon.Icon icon='ph--x--regular' size='xl' classNames='m-trim-xs' />\n );\n};\n\nDevicesContainer.displayName = 'DevicesContainer';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAgCA,IAAa,oBAAoB,EAAE,qBAAqB,0BAAiD;CACvG,MAAM,EAAE,kBAAkB,MAAM,oBAAoB;CACpD,MAAM,UAAU,WAAW;CAC3B,MAAM,EAAE,OAAO,oBAAoB,iBAAiB;CAEpD,MAAM,eAAe,kBAAkB,cAAc,gBAAgB,cAAc,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC;CAEvG,MAAM,gBAAgB,kBACd,cAAc,gBAAgB,cAAc,EAAE,MAAM,UAAU,CAAC,GACrE,CAAC,aAAa,CAChB;CAEA,MAAM,wBAAwB,kBACtB,cAAc,gBAAgB,cAAc,EAAE,MAAM,oBAAoB,CAAC,GAC/E,CAAC,aAAa,CAChB;CAEA,OACE,oBAAC,aAAD;EACW;EACQ;EACjB,YAAY,uBAAuB,oBAAC,kBAAD,EAAuC,oBAAsB,CAAA;EAChG,UAAU;EACV,WAAW,sBAAsB,gBAAgB,KAAA;EACjD,mBAAmB,sBAAsB,wBAAwB,KAAA;CAClE,CAAA;AAEL;AASA,IAAM,oBAAoB,UAA8D;CAGtF,MAAM,SAAS,UAAU;CACzB,MAAM,CAAC,mBAAmB,MAAM,gBAAgB,mBAAmB,eAAe;CAClF,MAAM,CAAC,MAAM,WAAW,SAA0B;CAElD,MAAM,CAAC,SAAS,cAAc,SAAS,KAAK;CAE5C,MAAM,qBAAqB,kBAAkB;EAC3C,IAAI,CAAC,mBAAmB,WAAW,MACjC;EAEF,WAAW,IAAI;EAGf,SAAc,WAAW,gBAAgB,MAAM,EAAE,YAAY,gBAAgB,CAAC,CAAC,CAAA,CAC5E,KAAK,OAAO,YAAY;GAEvB,IAAI,OAAO,OAAO,OAAO,SAAS,KAAK,KAAK,mBAAmB,cAC7D,IAAI,KAAK,KAAK,UAAU,EAAE,gBAAgB,MAAM,SAAS,WAAW,QAAQ,IAAI,EAAE,CAAC,GAAA,KAAA,GAAA;IAAA,YAAA;IAAA,GAAA;IAAA,GAAA;IAAA,GAAA,KAAA;GAAA,CAAC;GAEtF,QAAQ,OAAO;EACjB,CAAC,CAAA,CACA,OAAO,QAAQ,IAAI,MAAM,KAAE,KAAA,GAAA;GAAA,YAAA;GAAA,GAAA;GAAA,GAAA;GAAA,GAAA,KAAA;EAAA,CAAC,CAAC,CAAA,CAC7B,cAAc,WAAW,KAAK,CAAC;CACpC,GAAG;EAAC;EAAQ;EAAiB;EAAS;CAAI,CAAC;CAE3C,MAAM,mBAAmB,kBAAkB;EAEzC,IAAI,MACF,SAAc,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,QAAQ,IAAI,MAAM,KAAE,KAAA,GAAA;GAAA,YAAA;GAAA,GAAA;GAAA,GAAA;GAAA,GAAA,KAAA;EAAA,CAAC,CAAC;EAEvE,QAAQ,KAAA,CAAS;CACnB,GAAG,CAAC,IAAI,CAAC;CAET,IAAI,MACF,OAAO,oBAAC,sBAAD;EAAsB,GAAI;EAAa;EAAM;EAAoB;CAAqB,CAAA;MAE7F,OAAO,oBAAC,mBAAD;EAAmB,GAAI;EAAa;EAAoB;CAAqB,CAAA;AAExF;AAEA,IAAM,wBAAwB,EAC5B,MACA,qBACA,kBACA,yBAC2B;CAC3B,MAAM,SAAS,UAAU;CACzB,MAAM,EAAE,OAAO,SAAS,kBAAkB,IAAI;CAC9C,MAAM,MAAM,QAAQ,oBAAoB,IAAI;CAI5C,gBAAgB;EACd,IACE,OAAO,SAAS,4BAChB,OAAO,OAAO,OAAO,SAAS,KAAK,KAAK,mBAAmB,cAE3D,IAAI,KAAK,KAAK,UAAU,EAAE,UAAU,MAAM,SAAS,CAAC,GAAA,KAAA,GAAA;GAAA,YAAA;GAAA,GAAA;GAAA,GAAA;GAAA,GAAA,KAAA;EAAA,CAAC;CAEzD,GAAG,CAAC,OAAO,IAAI,CAAC;CAIhB,gBAAgB;EACd,IAAI,UAAU,MAAM,SAAS,aAAa,MAAM,SAAS,eAAe,MAAM,SAAS,UACrF,iBAAiB;CAErB,GAAG,CAAC,OAAO,IAAI,CAAC;CAEhB,OAAO,oBAAC,mBAAD;EAAyB;EAAO,cAAc,MAAM;EAAI;EAAK;EAAkB;CAAuB,CAAA;AAC/G;AAUA,IAAM,qBAAqB,EACzB,OACA,eAAe,SACf,MAAM,SACN,yBAAyB,CAAC,GAC1B,2BAA2B,CAAC,QACE;CAC9B,MAAM,EAAE,MAAM,QAAQ,eAAe,KAAK,QAAQ,GAAG;CACrD,MAAM,WAAW,OAAO,SAAS,2BAA2B,MAAM,WAAW,KAAA;CAC7E,MAAM,aAAa,CAAC,QAChB,SACA,MAAM,SAAS,eAAe,MAAM,SAAS,WAAW,MAAM,SAAS,YACrE,aACA,WACE,cACA;CAER,OAAO,eAAe,SACpB,qBAAA,UAAA,EAAA,UAAA,CACE,oBAAC,KAAD;EAAG,WAAU;EAAsB,UAAA,EAAE,wBAAwB;CAAK,CAAA,GAClE,oBAAC,OAAO,MAAR;EACE,MAAK;EACL,OAAO,EAAE,gCAAgC;EACzC,UAAU,CAAC,CAAC;EACZ,YAAW;EACX,eAAY;EACZ,SAAS;CACV,CAAA,CACD,EAAA,CAAA,IAEF,oBAAC,SAAS,MAAV;EAA2B;EACzB,UAAA,qBAAC,SAAS,OAAV,EAAA,UAAA;GACE,oBAAC,SAAS,MAAV,EAAe,IAAG,OAEH,CAAA;GACf,oBAAC,SAAS,MAAV;IAAe,IAAG;IAChB,UAAA,oBAAC,oBAAD,EAAoB,WAAW,OAAO,SAAS,UAAY,CAAA;GAC9C,CAAA;GACf,oBAAC,SAAS,MAAV;IAAe,IAAG;IAChB,UAAA,oBAAC,oBAAD;KAAoB,IAAI;KAAc,MAAM,YAAY;KAAS,UAAU;IAAmB,CAAA;GACjF,CAAA;GACf,oBAAC,SAAS,MAAV;IAAe,IAAG;IAChB,UAAA,oBAAC,cAAD;KAAc,IAAI;KAAmB;KAAK,UAAU;IAAmB,CAAA;GAC1D,CAAA;EACD,EAAA,CAAA;CACH,CAAA;AAEnB;AAEA,IAAM,gBAAgB,EAAE,IAAI,KAAK,eAAkE;CACjG,MAAM,EAAE,MAAM,QAAQ,eAAe,cAAc;CACnD,MAAM,UAAU,QAAQ,MAAM,4BAA4B;CAC1D,MAAM,QAAQ,WAAW,EAAE;CAC3B,OACE,qBAAA,UAAA,EAAA,UAAA;EACE,oBAAC,KAAD;GAAG,WAAU;GAAiB,UAAA,EAAE,uBAAuB,EAAE,IAAI,KAAK,QAAQ,IAAI,CAAC;EAAK,CAAA;EACpF,qBAAC,OAAD;GAAK,MAAK;GAAQ,WAAU;GAA5B,UAAA,CACE,oBAAC,OAAO,MAAR;IAAa,SAAQ;IAAS,YAAW;IACvC,UAAA,qBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,oBAAC,OAAO,QAAR;MAAe,mBAAiB;MAAS,iBAAgB;MAAI,OAAO,OAAO;KAAU,CAAA,GACrF,oBAAC,UAAD,EAAA,UACE,oBAAC,OAAD,EAAO,MAAM,MAAQ,CAAA,EACb,CAAA,CACP;;GACM,CAAA,GACb,oBAAC,QAAD;IAAM,IAAI;IAAS,WAAU;IAC1B,UAAA,EAAE,UAAU;GACT,CAAA,CACH;;EAEL,oBAAC,OAAO,MAAR;GAAa,SAAQ;GACnB,UAAA,qBAAC,OAAO,MAAR;IAAa,KAAI;IAAjB,UAAA,CACE,oBAAC,aAAa,WAAd,EAAwB,OAAO,OAAO,QAAU,CAAA,GAChD,oBAAC,OAAO,MAAR;KAAa,SAAQ;KAAQ,SAAS;KACnC,UAAA,EAAE,cAAc;IACN,CAAA,CACF;;EACF,CAAA;CACb,EAAA,CAAA;AAEN;AAEA,IAAM,sBAAsB,EAAE,IAAI,MAAM,eAAmE;CACzG,MAAM,EAAE,MAAM,QAAQ,eAAe,cAAc;CACnD,MAAM,QAAQ,WAAW,EAAE;CAE3B,OACE,qBAAA,UAAA,EAAA,UAAA;EACE,oBAAC,KAAD;GAAG,WAAU;GAAiB,UAAA,EAAE,iCAAiC;EAAK,CAAA;EACrE,SAAS,oBAAC,OAAD;GAAO,MAAM;GAAO,WAAU;EAA4B,CAAA;EACpE,oBAAC,KAAD;GAAG,WAAU;GAAiB,UAAA,EAAE,mBAAmB;EAAK,CAAA;EACxD,oBAAC,UAAD;GAAgB;GAAM,OAAA;GAAM,YAAW;EAAiC,CAAA;EACxE,oBAAC,OAAO,MAAR;GAAa,SAAQ;GAAQ,SAAS;GACnC,UAAA,EAAE,cAAc;EACN,CAAA;CACb,EAAA,CAAA;AAEN;AAEA,IAAM,sBAAsB,EAAE,gBAAwC;CACpE,OAAO,YACL,oBAAC,KAAK,MAAN;EAAW,MAAK;EAAqB,MAAK;EAAK,YAAW;CAAa,CAAA,IAEvE,oBAAC,KAAK,MAAN;EAAW,MAAK;EAAiB,MAAK;EAAK,YAAW;CAAa,CAAA;AAEvE;AAEA,iBAAiB,cAAc"}
@@ -0,0 +1,28 @@
1
+ import { t as __exportAll } from "./chunk-rolldown-runtime.mjs";
2
+ import * as Capability from "@dxos/app-framework/Capability";
3
+ import { ClientCapabilities } from "#types";
4
+ import * as Layer from "effect/Layer";
5
+ import { Identity, Space } from "@dxos/halo";
6
+ //#region src/halo-services-layer.ts
7
+ /**
8
+ * Provides the canonical `@dxos/halo` services (`Identity.Service` / `Space.Service`) from the
9
+ * client-backed capabilities contributed by this plugin. Consumers depend on the halo services
10
+ * directly and provide this layer, rather than reaching for the capability instances:
11
+ *
12
+ * ```ts
13
+ * yield* Identity.getSnapshot; // requires Identity.Service
14
+ * // provided by:
15
+ * effect.pipe(Effect.provide(HaloServicesLayer));
16
+ * ```
17
+ *
18
+ * The layer itself requires `Capability.Service` (the capability manager), which is in scope inside
19
+ * capability modules and operation handlers.
20
+ */
21
+ var HaloServicesLayer = Layer.merge(Capability.layerWith(ClientCapabilities.IdentityService, (service) => Layer.succeed(Identity.Service, service)), Capability.layerWith(ClientCapabilities.SpaceService, (service) => Layer.succeed(Space.Service, service)));
22
+ //#endregion
23
+ //#region src/HaloServices.ts
24
+ var HaloServices_exports = /* @__PURE__ */ __exportAll({ layer: () => HaloServicesLayer });
25
+ //#endregion
26
+ export { HaloServicesLayer as n, HaloServices_exports as t };
27
+
28
+ //# sourceMappingURL=chunk-HaloServices.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-HaloServices.mjs","names":[],"sources":["../../src/halo-services-layer.ts","../../src/HaloServices.ts"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Layer from 'effect/Layer';\n\nimport * as Capability from '@dxos/app-framework/Capability';\nimport { Identity, Space } from '@dxos/halo';\n\nimport { ClientCapabilities } from '#types';\n\n/**\n * Provides the canonical `@dxos/halo` services (`Identity.Service` / `Space.Service`) from the\n * client-backed capabilities contributed by this plugin. Consumers depend on the halo services\n * directly and provide this layer, rather than reaching for the capability instances:\n *\n * ```ts\n * yield* Identity.getSnapshot; // requires Identity.Service\n * // provided by:\n * effect.pipe(Effect.provide(HaloServicesLayer));\n * ```\n *\n * The layer itself requires `Capability.Service` (the capability manager), which is in scope inside\n * capability modules and operation handlers.\n */\nexport const HaloServicesLayer: Layer.Layer<Identity.Service | Space.Service, never, Capability.Service> = Layer.merge(\n Capability.layerWith(ClientCapabilities.IdentityService, (service) => Layer.succeed(Identity.Service, service)),\n Capability.layerWith(ClientCapabilities.SpaceService, (service) => Layer.succeed(Space.Service, service)),\n);\n","//\n// Copyright 2026 DXOS.org\n//\n\n// @import-as-namespace\n\nexport { HaloServicesLayer as layer } from './halo-services-layer.ts';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAyBA,IAAa,oBAA8F,MAAM,MAC/G,WAAW,UAAU,mBAAmB,kBAAkB,YAAY,MAAM,QAAQ,SAAS,SAAS,OAAO,CAAC,GAC9G,WAAW,UAAU,mBAAmB,eAAe,YAAY,MAAM,QAAQ,MAAM,SAAS,OAAO,CAAC,CAC1G"}