@dxos/plugin-client 0.8.4-staging.60fe92afc8 → 0.9.1-main.c7dcc2e112

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 (190) hide show
  1. package/dist/lib/neutral/{AccountContainer-FZ3IC6H4.mjs → AccountContainer-LIMGLO2Y.mjs} +3 -3
  2. package/dist/lib/neutral/AccountContainer-LIMGLO2Y.mjs.map +7 -0
  3. package/dist/lib/neutral/ClientPlugin.node.mjs +477 -370
  4. package/dist/lib/neutral/ClientPlugin.node.mjs.map +4 -4
  5. package/dist/lib/neutral/{DevicesContainer-6MWNUC3I.mjs → DevicesContainer-X26OGLFK.mjs} +12 -12
  6. package/dist/lib/neutral/DevicesContainer-X26OGLFK.mjs.map +7 -0
  7. package/dist/lib/neutral/{InvitationsContainer-ME722VKS.mjs → InvitationsContainer-OBBCJ7CJ.mjs} +2 -2
  8. package/dist/lib/neutral/InvitationsContainer-OBBCJ7CJ.mjs.map +7 -0
  9. package/dist/lib/neutral/{JoinDialog-2NXAKPLP.mjs → JoinDialog-4BWV4CYB.mjs} +2 -2
  10. package/dist/lib/neutral/JoinDialog-4BWV4CYB.mjs.map +7 -0
  11. package/dist/lib/neutral/{ProfileContainer-VPX3FPWG.mjs → ProfileContainer-FGS2MVWA.mjs} +2 -2
  12. package/dist/lib/neutral/ProfileContainer-FGS2MVWA.mjs.map +7 -0
  13. package/dist/lib/neutral/{RecoveryCodeDialog-EWHB6U5T.mjs → RecoveryCodeDialog-7EPNKCLB.mjs} +2 -2
  14. package/dist/lib/neutral/RecoveryCodeDialog-7EPNKCLB.mjs.map +7 -0
  15. package/dist/lib/neutral/{RecoveryCredentialsContainer-IPBGDMIA.mjs → RecoveryCredentialsContainer-SL4LYHBE.mjs} +3 -3
  16. package/dist/lib/neutral/RecoveryCredentialsContainer-SL4LYHBE.mjs.map +7 -0
  17. package/dist/lib/neutral/UsageContainer-HBPMLIK7.mjs +226 -0
  18. package/dist/lib/neutral/UsageContainer-HBPMLIK7.mjs.map +7 -0
  19. package/dist/lib/neutral/{app-graph-builder-A74W7C36.mjs → app-graph-builder-FTXJNX37.mjs} +28 -14
  20. package/dist/lib/neutral/app-graph-builder-FTXJNX37.mjs.map +7 -0
  21. package/dist/lib/neutral/capabilities/index.mjs +5 -5
  22. package/dist/lib/neutral/capabilities/node.mjs +3 -3
  23. package/dist/lib/neutral/chunk-54MDDWCV.mjs +8 -0
  24. package/dist/lib/neutral/{chunk-NTVDGDQ3.mjs.map → chunk-54MDDWCV.mjs.map} +2 -2
  25. package/dist/lib/neutral/chunk-6G4KZLBG.mjs +28 -0
  26. package/dist/lib/neutral/chunk-6G4KZLBG.mjs.map +7 -0
  27. package/dist/lib/neutral/{chunk-D6HPCLTS.mjs → chunk-7DEIKHB7.mjs} +16 -2
  28. package/dist/lib/neutral/chunk-7DEIKHB7.mjs.map +7 -0
  29. package/dist/lib/neutral/{chunk-TUK3ELUU.mjs → chunk-DA3LZQSD.mjs} +22 -21
  30. package/dist/lib/neutral/chunk-DA3LZQSD.mjs.map +7 -0
  31. package/dist/lib/neutral/chunk-GSKMAS3S.mjs +13 -0
  32. package/dist/lib/neutral/chunk-GSKMAS3S.mjs.map +7 -0
  33. package/dist/lib/neutral/containers/index.mjs +10 -8
  34. package/dist/lib/neutral/containers/index.mjs.map +3 -3
  35. package/dist/lib/neutral/{create-agent-6HLW4D3A.mjs → create-agent-U567RM7Z.mjs} +3 -3
  36. package/dist/lib/neutral/{create-identity-JIWAR5GW.mjs → create-identity-IKN2FJ5B.mjs} +3 -3
  37. package/dist/lib/neutral/{create-passkey-FOXEMXGF.mjs → create-passkey-JAD3ACY7.mjs} +7 -7
  38. package/dist/lib/neutral/create-passkey-JAD3ACY7.mjs.map +7 -0
  39. package/dist/lib/neutral/{create-recovery-code-ZWDKLPH4.mjs → create-recovery-code-JZYXR4BY.mjs} +4 -4
  40. package/dist/lib/neutral/index.mjs +4 -4
  41. package/dist/lib/neutral/{join-identity-QEQFAE2S.mjs → join-identity-PJCHDNLH.mjs} +3 -3
  42. package/dist/lib/neutral/{layer-specs-CQLXQBQJ.mjs → layer-specs-VQCJLV33.mjs} +2 -2
  43. package/dist/lib/neutral/{layer-specs-CQLXQBQJ.mjs.map → layer-specs-VQCJLV33.mjs.map} +2 -2
  44. package/dist/lib/neutral/meta.json +1 -1
  45. package/dist/lib/neutral/meta.mjs +1 -1
  46. package/dist/lib/neutral/{navigation-handler-LU26CDFR.mjs → navigation-handler-MPJAVHWY.mjs} +3 -3
  47. package/dist/lib/neutral/open-usage-24I7RAFL.mjs +27 -0
  48. package/dist/lib/neutral/open-usage-24I7RAFL.mjs.map +7 -0
  49. package/dist/lib/neutral/operations/index.mjs +2 -2
  50. package/dist/lib/neutral/plugin.mjs +3 -3
  51. package/dist/lib/neutral/{react-context-B5LXMHVM.mjs → react-context-V74T6JOJ.mjs} +2 -2
  52. package/dist/lib/neutral/{react-context-B5LXMHVM.mjs.map → react-context-V74T6JOJ.mjs.map} +3 -3
  53. package/dist/lib/neutral/{react-surface-DEKGWTCD.mjs → react-surface-HPXRA65U.mjs} +8 -3
  54. package/dist/lib/neutral/react-surface-HPXRA65U.mjs.map +7 -0
  55. package/dist/lib/neutral/{recover-identity-JNFKLCUD.mjs → recover-identity-B7YM2BR4.mjs} +3 -3
  56. package/dist/lib/neutral/{redeem-passkey-4SBAI4AG.mjs → redeem-passkey-4DR7GPMU.mjs} +10 -10
  57. package/dist/lib/neutral/redeem-passkey-4DR7GPMU.mjs.map +7 -0
  58. package/dist/lib/neutral/{redeem-token-POBD6TMN.mjs → redeem-token-N5MBQG3I.mjs} +3 -3
  59. package/dist/lib/neutral/{reset-storage-LQKUV5RA.mjs → reset-storage-K47HZTGP.mjs} +3 -3
  60. package/dist/lib/neutral/{share-identity-KNQ2XNXV.mjs → share-identity-YJIFDIPJ.mjs} +6 -6
  61. package/dist/lib/neutral/share-identity-YJIFDIPJ.mjs.map +7 -0
  62. package/dist/lib/neutral/testing/index.mjs +2 -2
  63. package/dist/lib/neutral/testing/index.mjs.map +3 -3
  64. package/dist/lib/neutral/translations.mjs +24 -1
  65. package/dist/lib/neutral/translations.mjs.map +3 -3
  66. package/dist/lib/neutral/types/index.mjs +1 -1
  67. package/dist/types/dx.config.d.ts +28 -0
  68. package/dist/types/dx.config.d.ts.map +1 -0
  69. package/dist/types/src/capabilities/index.d.ts +9 -43
  70. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  71. package/dist/types/src/capabilities/navigation-handler/index.d.ts +1 -1
  72. package/dist/types/src/capabilities/navigation-handler/index.d.ts.map +1 -1
  73. package/dist/types/src/capabilities/node.d.ts +6 -6
  74. package/dist/types/src/capabilities/node.d.ts.map +1 -1
  75. package/dist/types/src/capabilities/react-surface.d.ts +2 -2
  76. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  77. package/dist/types/src/commands/account/index.d.ts +3 -0
  78. package/dist/types/src/commands/account/index.d.ts.map +1 -0
  79. package/dist/types/src/commands/account/login/index.d.ts +2 -0
  80. package/dist/types/src/commands/account/login/index.d.ts.map +1 -0
  81. package/dist/types/src/commands/account/login/login.d.ts +12 -0
  82. package/dist/types/src/commands/account/login/login.d.ts.map +1 -0
  83. package/dist/types/src/commands/account/logout/index.d.ts +2 -0
  84. package/dist/types/src/commands/account/logout/index.d.ts.map +1 -0
  85. package/dist/types/src/commands/account/logout/logout.d.ts +9 -0
  86. package/dist/types/src/commands/account/logout/logout.d.ts.map +1 -0
  87. package/dist/types/src/commands/halo/join/join.d.ts +1 -1
  88. package/dist/types/src/commands/halo/join/join.d.ts.map +1 -1
  89. package/dist/types/src/commands/halo/util.d.ts +4 -0
  90. package/dist/types/src/commands/halo/util.d.ts.map +1 -1
  91. package/dist/types/src/commands/index.d.ts +1 -0
  92. package/dist/types/src/commands/index.d.ts.map +1 -1
  93. package/dist/types/src/constants.d.ts.map +1 -1
  94. package/dist/types/src/containers/DevicesContainer/DevicesContainer.d.ts.map +1 -1
  95. package/dist/types/src/containers/RecoveryCredentialsContainer/RecoveryCredentialsContainer.d.ts.map +1 -1
  96. package/dist/types/src/containers/UsageContainer/UsageContainer.d.ts +7 -0
  97. package/dist/types/src/containers/UsageContainer/UsageContainer.d.ts.map +1 -0
  98. package/dist/types/src/containers/UsageContainer/UsageView.d.ts +19 -0
  99. package/dist/types/src/containers/UsageContainer/UsageView.d.ts.map +1 -0
  100. package/dist/types/src/containers/UsageContainer/UsageView.stories.d.ts +19 -0
  101. package/dist/types/src/containers/UsageContainer/UsageView.stories.d.ts.map +1 -0
  102. package/dist/types/src/containers/UsageContainer/index.d.ts +2 -0
  103. package/dist/types/src/containers/UsageContainer/index.d.ts.map +1 -0
  104. package/dist/types/src/containers/index.d.ts +1 -0
  105. package/dist/types/src/containers/index.d.ts.map +1 -1
  106. package/dist/types/src/meta.d.ts +28 -2
  107. package/dist/types/src/meta.d.ts.map +1 -1
  108. package/dist/types/src/operations/create-passkey.d.ts.map +1 -1
  109. package/dist/types/src/operations/definitions.d.ts +1 -0
  110. package/dist/types/src/operations/definitions.d.ts.map +1 -1
  111. package/dist/types/src/operations/index.d.ts.map +1 -1
  112. package/dist/types/src/operations/open-usage.d.ts +5 -0
  113. package/dist/types/src/operations/open-usage.d.ts.map +1 -0
  114. package/dist/types/src/testing/initializeIdentity.d.ts.map +1 -1
  115. package/dist/types/src/translations.d.ts.map +1 -1
  116. package/dist/types/src/types/capabilities.d.ts.map +1 -1
  117. package/dist/types/src/types/events.d.ts.map +1 -1
  118. package/dist/types/src/types/schema.d.ts +1 -0
  119. package/dist/types/src/types/schema.d.ts.map +1 -1
  120. package/dist/types/tsconfig.tsbuildinfo +1 -1
  121. package/dx.config.ts +19 -0
  122. package/package.json +37 -35
  123. package/src/ClientPlugin.node.ts +2 -2
  124. package/src/ClientPlugin.test.ts +1 -1
  125. package/src/capabilities/app-graph-builder.ts +22 -13
  126. package/src/capabilities/layer-specs.ts +1 -1
  127. package/src/capabilities/react-context.tsx +1 -1
  128. package/src/capabilities/react-surface.tsx +6 -0
  129. package/src/commands/account/index.ts +13 -0
  130. package/src/commands/account/login/index.ts +5 -0
  131. package/src/commands/account/login/login.ts +147 -0
  132. package/src/commands/account/logout/index.ts +5 -0
  133. package/src/commands/account/logout/logout.ts +49 -0
  134. package/src/commands/halo/create/create.ts +2 -2
  135. package/src/commands/halo/index.ts +6 -6
  136. package/src/commands/halo/join/join.ts +2 -13
  137. package/src/commands/halo/util.ts +24 -0
  138. package/src/commands/index.ts +1 -0
  139. package/src/constants.ts +3 -3
  140. package/src/containers/AccountContainer/AccountContainer.tsx +1 -1
  141. package/src/containers/DevicesContainer/DevicesContainer.tsx +14 -11
  142. package/src/containers/InvitationsContainer/InvitationsContainer.tsx +1 -1
  143. package/src/containers/JoinDialog/JoinDialog.tsx +1 -1
  144. package/src/containers/ProfileContainer/ProfileContainer.tsx +1 -1
  145. package/src/containers/RecoveryCodeDialog/RecoveryCodeDialog.tsx +1 -1
  146. package/src/containers/RecoveryCredentialsContainer/RecoveryCredentialsContainer.tsx +2 -2
  147. package/src/containers/UsageContainer/UsageContainer.tsx +47 -0
  148. package/src/containers/UsageContainer/UsageView.stories.tsx +114 -0
  149. package/src/containers/UsageContainer/UsageView.tsx +238 -0
  150. package/src/containers/UsageContainer/index.ts +5 -0
  151. package/src/containers/index.ts +1 -0
  152. package/src/meta.ts +3 -12
  153. package/src/operations/create-passkey.ts +6 -4
  154. package/src/operations/definitions.ts +12 -1
  155. package/src/operations/index.ts +1 -0
  156. package/src/operations/open-usage.ts +24 -0
  157. package/src/operations/redeem-passkey.ts +7 -7
  158. package/src/operations/share-identity.ts +3 -3
  159. package/src/testing/initializeIdentity.ts +4 -2
  160. package/src/translations.ts +25 -1
  161. package/src/types/capabilities.ts +7 -5
  162. package/src/types/events.ts +5 -5
  163. package/src/types/schema.ts +23 -16
  164. package/dist/lib/neutral/AccountContainer-FZ3IC6H4.mjs.map +0 -7
  165. package/dist/lib/neutral/DevicesContainer-6MWNUC3I.mjs.map +0 -7
  166. package/dist/lib/neutral/InvitationsContainer-ME722VKS.mjs.map +0 -7
  167. package/dist/lib/neutral/JoinDialog-2NXAKPLP.mjs.map +0 -7
  168. package/dist/lib/neutral/ProfileContainer-VPX3FPWG.mjs.map +0 -7
  169. package/dist/lib/neutral/RecoveryCodeDialog-EWHB6U5T.mjs.map +0 -7
  170. package/dist/lib/neutral/RecoveryCredentialsContainer-IPBGDMIA.mjs.map +0 -7
  171. package/dist/lib/neutral/app-graph-builder-A74W7C36.mjs.map +0 -7
  172. package/dist/lib/neutral/chunk-D6HPCLTS.mjs.map +0 -7
  173. package/dist/lib/neutral/chunk-JOCCVODY.mjs +0 -21
  174. package/dist/lib/neutral/chunk-JOCCVODY.mjs.map +0 -7
  175. package/dist/lib/neutral/chunk-NTVDGDQ3.mjs +0 -8
  176. package/dist/lib/neutral/chunk-TUK3ELUU.mjs.map +0 -7
  177. package/dist/lib/neutral/chunk-WWCVZG3K.mjs +0 -13
  178. package/dist/lib/neutral/chunk-WWCVZG3K.mjs.map +0 -7
  179. package/dist/lib/neutral/create-passkey-FOXEMXGF.mjs.map +0 -7
  180. package/dist/lib/neutral/react-surface-DEKGWTCD.mjs.map +0 -7
  181. package/dist/lib/neutral/redeem-passkey-4SBAI4AG.mjs.map +0 -7
  182. package/dist/lib/neutral/share-identity-KNQ2XNXV.mjs.map +0 -7
  183. /package/dist/lib/neutral/{create-agent-6HLW4D3A.mjs.map → create-agent-U567RM7Z.mjs.map} +0 -0
  184. /package/dist/lib/neutral/{create-identity-JIWAR5GW.mjs.map → create-identity-IKN2FJ5B.mjs.map} +0 -0
  185. /package/dist/lib/neutral/{create-recovery-code-ZWDKLPH4.mjs.map → create-recovery-code-JZYXR4BY.mjs.map} +0 -0
  186. /package/dist/lib/neutral/{join-identity-QEQFAE2S.mjs.map → join-identity-PJCHDNLH.mjs.map} +0 -0
  187. /package/dist/lib/neutral/{navigation-handler-LU26CDFR.mjs.map → navigation-handler-MPJAVHWY.mjs.map} +0 -0
  188. /package/dist/lib/neutral/{recover-identity-JNFKLCUD.mjs.map → recover-identity-B7YM2BR4.mjs.map} +0 -0
  189. /package/dist/lib/neutral/{redeem-token-POBD6TMN.mjs.map → redeem-token-N5MBQG3I.mjs.map} +0 -0
  190. /package/dist/lib/neutral/{reset-storage-LQKUV5RA.mjs.map → reset-storage-K47HZTGP.mjs.map} +0 -0
package/dx.config.ts ADDED
@@ -0,0 +1,19 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { Config2 } from '@dxos/app-framework/config';
6
+ import { trim } from '@dxos/util';
7
+
8
+ export default Config2.make({
9
+ plugin: {
10
+ key: 'org.dxos.plugin.client',
11
+ name: 'Client',
12
+ author: 'DXOS',
13
+ description: trim`
14
+ Core client connectivity and peer-to-peer networking infrastructure.
15
+ Manages identity, authentication, and real-time synchronization across devices.
16
+ `,
17
+ tags: ['system'],
18
+ },
19
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/plugin-client",
3
- "version": "0.8.4-staging.60fe92afc8",
3
+ "version": "0.9.1-main.c7dcc2e112",
4
4
  "description": "DXOS Surface plugin for DXOS Client",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -99,6 +99,7 @@
99
99
  "types": "dist/types/src/index.d.ts",
100
100
  "files": [
101
101
  "dist",
102
+ "dx.config.ts",
102
103
  "src"
103
104
  ],
104
105
  "dependencies": {
@@ -107,34 +108,35 @@
107
108
  "effect": "3.21.3",
108
109
  "react-qr-rounded": "^1.0.0",
109
110
  "yaml": "^2.8.2",
110
- "@dxos/app-framework": "0.8.4-staging.60fe92afc8",
111
- "@dxos/async": "0.8.4-staging.60fe92afc8",
112
- "@dxos/client": "0.8.4-staging.60fe92afc8",
113
- "@dxos/client-services": "0.8.4-staging.60fe92afc8",
114
- "@dxos/client-protocol": "0.8.4-staging.60fe92afc8",
115
- "@dxos/compute": "0.8.4-staging.60fe92afc8",
116
- "@dxos/config": "0.8.4-staging.60fe92afc8",
117
- "@dxos/context": "0.8.4-staging.60fe92afc8",
118
- "@dxos/credentials": "0.8.4-staging.60fe92afc8",
119
- "@dxos/echo": "0.8.4-staging.60fe92afc8",
120
- "@dxos/echo-client": "0.8.4-staging.60fe92afc8",
121
- "@dxos/app-toolkit": "0.8.4-staging.60fe92afc8",
122
- "@dxos/echo-protocol": "0.8.4-staging.60fe92afc8",
123
- "@dxos/edge-client": "0.8.4-staging.60fe92afc8",
124
- "@dxos/cli-util": "0.8.4-staging.60fe92afc8",
125
- "@dxos/invariant": "0.8.4-staging.60fe92afc8",
126
- "@dxos/effect": "0.8.4-staging.60fe92afc8",
127
- "@dxos/keys": "0.8.4-staging.60fe92afc8",
128
- "@dxos/functions": "0.8.4-staging.60fe92afc8",
129
- "@dxos/plugin-observability": "0.8.4-staging.60fe92afc8",
130
- "@dxos/log": "0.8.4-staging.60fe92afc8",
131
- "@dxos/react-client": "0.8.4-staging.60fe92afc8",
132
- "@dxos/protocols": "0.8.4-staging.60fe92afc8",
133
- "@dxos/react-ui-form": "0.8.4-staging.60fe92afc8",
134
- "@dxos/react-ui-pickers": "0.8.4-staging.60fe92afc8",
135
- "@dxos/shell": "0.8.4-staging.60fe92afc8",
136
- "@dxos/util": "0.8.4-staging.60fe92afc8",
137
- "@dxos/plugin-graph": "0.8.4-staging.60fe92afc8"
111
+ "@dxos/async": "0.9.1-main.c7dcc2e112",
112
+ "@dxos/client": "0.9.1-main.c7dcc2e112",
113
+ "@dxos/cli-util": "0.9.1-main.c7dcc2e112",
114
+ "@dxos/client-protocol": "0.9.1-main.c7dcc2e112",
115
+ "@dxos/config": "0.9.1-main.c7dcc2e112",
116
+ "@dxos/client-services": "0.9.1-main.c7dcc2e112",
117
+ "@dxos/compute": "0.9.1-main.c7dcc2e112",
118
+ "@dxos/context": "0.9.1-main.c7dcc2e112",
119
+ "@dxos/credentials": "0.9.1-main.c7dcc2e112",
120
+ "@dxos/app-toolkit": "0.9.1-main.c7dcc2e112",
121
+ "@dxos/echo": "0.9.1-main.c7dcc2e112",
122
+ "@dxos/echo-protocol": "0.9.1-main.c7dcc2e112",
123
+ "@dxos/edge-client": "0.9.1-main.c7dcc2e112",
124
+ "@dxos/effect": "0.9.1-main.c7dcc2e112",
125
+ "@dxos/echo-client": "0.9.1-main.c7dcc2e112",
126
+ "@dxos/functions": "0.9.1-main.c7dcc2e112",
127
+ "@dxos/log": "0.9.1-main.c7dcc2e112",
128
+ "@dxos/app-framework": "0.9.1-main.c7dcc2e112",
129
+ "@dxos/keys": "0.9.1-main.c7dcc2e112",
130
+ "@dxos/invariant": "0.9.1-main.c7dcc2e112",
131
+ "@dxos/plugin-graph": "0.9.1-main.c7dcc2e112",
132
+ "@dxos/protocols": "0.9.1-main.c7dcc2e112",
133
+ "@dxos/plugin-observability": "0.9.1-main.c7dcc2e112",
134
+ "@dxos/react-client": "0.9.1-main.c7dcc2e112",
135
+ "@dxos/react-ui-form": "0.9.1-main.c7dcc2e112",
136
+ "@dxos/react-ui-pickers": "0.9.1-main.c7dcc2e112",
137
+ "@dxos/shell": "0.9.1-main.c7dcc2e112",
138
+ "@dxos/util": "0.9.1-main.c7dcc2e112",
139
+ "@dxos/react-ui-syntax-highlighter": "0.9.1-main.c7dcc2e112"
138
140
  },
139
141
  "devDependencies": {
140
142
  "@effect-atom/atom-react": "^0.5.0",
@@ -145,10 +147,10 @@
145
147
  "react": "~19.2.3",
146
148
  "react-dom": "~19.2.3",
147
149
  "vite": "^8.0.16",
148
- "@dxos/plugin-testing": "0.8.4-staging.60fe92afc8",
149
- "@dxos/react-ui": "0.8.4-staging.60fe92afc8",
150
- "@dxos/ui-theme": "0.8.4-staging.60fe92afc8",
151
- "@dxos/storybook-utils": "0.8.4-staging.60fe92afc8"
150
+ "@dxos/plugin-testing": "0.9.1-main.c7dcc2e112",
151
+ "@dxos/ui-theme": "0.9.1-main.c7dcc2e112",
152
+ "@dxos/storybook-utils": "0.9.1-main.c7dcc2e112",
153
+ "@dxos/react-ui": "0.9.1-main.c7dcc2e112"
152
154
  },
153
155
  "peerDependencies": {
154
156
  "@effect-atom/atom-react": "^0.5.0",
@@ -156,8 +158,8 @@
156
158
  "effect": "3.21.3",
157
159
  "react": "~19.2.3",
158
160
  "react-dom": "~19.2.3",
159
- "@dxos/react-ui": "0.8.4-staging.60fe92afc8",
160
- "@dxos/ui-theme": "0.8.4-staging.60fe92afc8"
161
+ "@dxos/react-ui": "0.9.1-main.c7dcc2e112",
162
+ "@dxos/ui-theme": "0.9.1-main.c7dcc2e112"
161
163
  },
162
164
  "publishConfig": {
163
165
  "access": "public"
@@ -10,11 +10,11 @@ import { meta } from '#meta';
10
10
  import { ClientEvents } from '#types';
11
11
  import { type ClientPluginOptions } from '#types';
12
12
 
13
- import { config, device, edge, halo, profile } from './commands';
13
+ import { account, config, device, edge, halo, profile } from './commands';
14
14
 
15
15
  export const ClientPlugin = Plugin.define<ClientPluginOptions>(meta).pipe(
16
16
  // TODO(wittjosiah): Could some of these commands make use of operations?
17
- AppPlugin.addCommandModule({ commands: [config, device, edge, halo, profile] }),
17
+ AppPlugin.addCommandModule({ commands: [account, config, device, edge, halo, profile] }),
18
18
  AppPlugin.addOperationHandlerModule({ activate: OperationHandler }),
19
19
  Plugin.addModule((options) => ({
20
20
  id: Capability.getModuleTag(Client),
@@ -11,7 +11,7 @@ import { createComposerTestApp } from '@dxos/plugin-testing/harness';
11
11
 
12
12
  import { meta } from './meta';
13
13
 
14
- const moduleId = (name: string) => `${meta.id}.module.${name}`;
14
+ const moduleId = (name: string) => `${meta.profile.key}.module.${name}`;
15
15
 
16
16
  describe('ClientPlugin', () => {
17
17
  test('modules activate on the expected events', async ({ expect }) => {
@@ -25,7 +25,7 @@ export default Capability.makeModule(
25
25
  id: 'openUserAccount',
26
26
  data: () => Operation.invoke(ClientOperation.ShareIdentity),
27
27
  properties: {
28
- label: ['open-user-account.label', { ns: meta.id }],
28
+ label: ['open-user-account.label', { ns: meta.profile.key }],
29
29
  icon: 'ph--user--regular',
30
30
  disposition: 'menu',
31
31
  keyBinding: {
@@ -45,9 +45,9 @@ export default Capability.makeModule(
45
45
  return [
46
46
  Node.make({
47
47
  id: Account.id,
48
- type: meta.id,
48
+ type: meta.profile.key,
49
49
  properties: {
50
- label: ['account.label', { ns: meta.id }],
50
+ label: ['account.label', { ns: meta.profile.key }],
51
51
  icon: 'ph--user--regular',
52
52
  disposition: 'user-account',
53
53
  testId: 'clientPlugin.account',
@@ -61,27 +61,27 @@ export default Capability.makeModule(
61
61
  Node.make({
62
62
  id: Account.Profile,
63
63
  data: Account.Profile,
64
- type: meta.id,
64
+ type: meta.profile.key,
65
65
  properties: {
66
- label: ['profile.label', { ns: meta.id }],
66
+ label: ['profile.label', { ns: meta.profile.key }],
67
67
  icon: 'ph--user--regular',
68
68
  },
69
69
  }),
70
70
  Node.make({
71
71
  id: Account.Account,
72
72
  data: Account.Account,
73
- type: meta.id,
73
+ type: meta.profile.key,
74
74
  properties: {
75
- label: ['account-panel.label', { ns: meta.id }],
75
+ label: ['account-panel.label', { ns: meta.profile.key }],
76
76
  icon: 'ph--identification-card--regular',
77
77
  },
78
78
  }),
79
79
  Node.make({
80
80
  id: Account.Devices,
81
81
  data: Account.Devices,
82
- type: meta.id,
82
+ type: meta.profile.key,
83
83
  properties: {
84
- label: ['devices.label', { ns: meta.id }],
84
+ label: ['devices.label', { ns: meta.profile.key }],
85
85
  icon: 'ph--devices--regular',
86
86
  testId: 'clientPlugin.devices',
87
87
  },
@@ -89,21 +89,30 @@ export default Capability.makeModule(
89
89
  Node.make({
90
90
  id: Account.Security,
91
91
  data: Account.Security,
92
- type: meta.id,
92
+ type: meta.profile.key,
93
93
  properties: {
94
- label: ['security.label', { ns: meta.id }],
94
+ label: ['security.label', { ns: meta.profile.key }],
95
95
  icon: 'ph--key--regular',
96
96
  },
97
97
  }),
98
98
  Node.make({
99
99
  id: Account.Invitations,
100
100
  data: Account.Invitations,
101
- type: meta.id,
101
+ type: meta.profile.key,
102
102
  properties: {
103
- label: ['invitations-panel.label', { ns: meta.id }],
103
+ label: ['invitations-panel.label', { ns: meta.profile.key }],
104
104
  icon: 'ph--ticket--regular',
105
105
  },
106
106
  }),
107
+ Node.make({
108
+ id: Account.Usage,
109
+ data: Account.Usage,
110
+ type: meta.profile.key,
111
+ properties: {
112
+ label: ['usage-panel.label', { ns: meta.profile.key }],
113
+ icon: 'ph--chart-bar--regular',
114
+ },
115
+ }),
107
116
  ],
108
117
  }),
109
118
  ];
@@ -69,7 +69,7 @@ const DatabaseLayerSpec = LayerSpec.make(
69
69
  const space = client.spaces.get(context.space);
70
70
  invariant(space, `space not found on client: ${context.space}`);
71
71
  yield* Effect.promise(() => space.waitUntilReady());
72
- return Layer.mergeAll(Database.layer(space.db), createFeedServiceLayer(space.queues));
72
+ return Layer.mergeAll(Database.layer(space.db), createFeedServiceLayer(space.db));
73
73
  }),
74
74
  ),
75
75
  );
@@ -15,7 +15,7 @@ import { ClientCapabilities } from '#types';
15
15
  export default Capability.makeModule(() =>
16
16
  Effect.succeed(
17
17
  Capability.contributes(Capabilities.ReactContext, {
18
- id: meta.id,
18
+ id: meta.profile.key,
19
19
  context: ({ children }: { children?: ReactNode }) => {
20
20
  const client = useCapability(ClientCapabilities.Client);
21
21
  return <ClientProvider client={client}>{children}</ClientProvider>;
@@ -18,6 +18,7 @@ import {
18
18
  RecoveryCodeDialog,
19
19
  RecoveryCredentialsContainer,
20
20
  ResetDialog,
21
+ UsageContainer,
21
22
  } from '#containers';
22
23
  import { Account, type ClientPluginOptions } from '#types';
23
24
 
@@ -57,6 +58,11 @@ export default Capability.makeModule(
57
58
  filter: AppSurface.literal(AppSurface.Article, Account.Invitations),
58
59
  component: () => <InvitationsContainer />,
59
60
  }),
61
+ Surface.create({
62
+ id: Account.Usage,
63
+ filter: AppSurface.literal(AppSurface.Article, Account.Usage),
64
+ component: () => <UsageContainer />,
65
+ }),
60
66
  Surface.create({
61
67
  id: JOIN_DIALOG,
62
68
  filter: AppSurface.component<ComponentProps<typeof JoinDialog>>(AppSurface.Dialog, JOIN_DIALOG),
@@ -0,0 +1,13 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import * as Command from '@effect/cli/Command';
6
+
7
+ import { login } from './login';
8
+ import { logout } from './logout';
9
+
10
+ export const account: Command.Command<any, any, any, any> = Command.make('account').pipe(
11
+ Command.withDescription('Log in and out of a DXOS identity.'),
12
+ Command.withSubcommands([login, logout]),
13
+ );
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ export * from './login';
@@ -0,0 +1,147 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import * as Args from '@effect/cli/Args';
6
+ import * as Command from '@effect/cli/Command';
7
+ import * as Options from '@effect/cli/Options';
8
+ import * as Prompt from '@effect/cli/Prompt';
9
+ import * as Console from 'effect/Console';
10
+ import * as Effect from 'effect/Effect';
11
+ import * as Match from 'effect/Match';
12
+ import * as Option from 'effect/Option';
13
+
14
+ import { CommandConfig, performRecoveryOAuthFlow, print } from '@dxos/cli-util';
15
+ import { type Client, ClientService } from '@dxos/client';
16
+ import { Invitation, InvitationEncoder } from '@dxos/client/invitations';
17
+ import { Context as DxContext } from '@dxos/context';
18
+ import { HubHttpClient } from '@dxos/edge-client';
19
+ import { invariant } from '@dxos/invariant';
20
+ import { ATPROTO_OAUTH_SCOPES, OAuthProvider } from '@dxos/protocols';
21
+
22
+ import { printIdentity, waitForState } from '../../halo/util';
23
+
24
+ type LoginMethod = 'email' | 'atproto' | 'device-invitation' | 'recovery-code';
25
+
26
+ const LOGIN_METHODS: LoginMethod[] = ['email', 'atproto', 'device-invitation', 'recovery-code'];
27
+
28
+ const METHOD_CHOICES = [
29
+ { title: 'Email', value: 'email' as const },
30
+ { title: 'AT Protocol', value: 'atproto' as const },
31
+ { title: 'Device invitation', value: 'device-invitation' as const },
32
+ { title: 'Recovery code', value: 'recovery-code' as const },
33
+ ];
34
+
35
+ const INPUT_PROMPT: Record<LoginMethod, string> = {
36
+ email: 'Email address',
37
+ atproto: 'atproto handle or DID (e.g. alice.bsky.social)',
38
+ 'device-invitation': 'Invitation code or URL',
39
+ 'recovery-code': 'Recovery code (seed phrase)',
40
+ };
41
+
42
+ export const login = Command.make(
43
+ 'login',
44
+ {
45
+ method: Options.choice('method', LOGIN_METHODS).pipe(
46
+ Options.withDescription(
47
+ 'Login method (email | atproto | device-invitation | recovery-code). Prompted if omitted.',
48
+ ),
49
+ Options.optional,
50
+ ),
51
+ input: Args.text({ name: 'input' }).pipe(
52
+ Args.withDescription('Method input: email address / atproto handle / invitation code / recovery code.'),
53
+ Args.optional,
54
+ ),
55
+ },
56
+ Effect.fn(function* ({ method, input }) {
57
+ const { json } = yield* CommandConfig;
58
+ const client = yield* ClientService;
59
+ // TODO(wittjosiah): How to surface this error to the user cleanly?
60
+ invariant(!client.halo.identity.get(), 'Already logged in. Run `dx account logout` first.');
61
+
62
+ const resolvedMethod: LoginMethod = Option.isSome(method)
63
+ ? method.value
64
+ : yield* Prompt.select({ message: 'Choose a login method:', choices: METHOD_CHOICES }).pipe(Prompt.run);
65
+
66
+ const resolvedInput = Option.isSome(input)
67
+ ? input.value
68
+ : yield* Prompt.text({ message: `${INPUT_PROMPT[resolvedMethod]}:` }).pipe(Prompt.run);
69
+
70
+ const identity = yield* Match.value(resolvedMethod).pipe(
71
+ Match.when('atproto', () => loginWithAtproto(client, resolvedInput)),
72
+ Match.when('email', () => loginWithEmail(client, resolvedInput)),
73
+ Match.when('recovery-code', () => loginWithRecoveryCode(client, resolvedInput)),
74
+ Match.when('device-invitation', () => loginWithDeviceInvitation(client, resolvedInput)),
75
+ Match.exhaustive,
76
+ );
77
+
78
+ if (json) {
79
+ yield* Console.log(
80
+ JSON.stringify({ identityDid: identity.did, displayName: identity.profile?.displayName }, null, 2),
81
+ );
82
+ } else {
83
+ yield* Console.log('Logged in successfully');
84
+ yield* Console.log(print(printIdentity({ identityDid: identity.did, profile: identity.profile })));
85
+ }
86
+ }),
87
+ ).pipe(Command.withDescription('Log in to an existing DXOS identity (same methods as Composer).'));
88
+
89
+ /**
90
+ * atproto / Bluesky OAuth login: runs the gate recovery flow (local server + browser) and redeems
91
+ * the resulting one-time `recoveryProof` to admit this device into the existing identity's HALO.
92
+ */
93
+ const loginWithAtproto = (client: Client, handle: string) =>
94
+ Effect.gen(function* () {
95
+ const edgeBaseUrl = client.config.values.runtime?.services?.edge?.url;
96
+ invariant(edgeBaseUrl, 'Edge services not configured (runtime.services.edge.url).');
97
+ const { recoveryProof } = yield* performRecoveryOAuthFlow({
98
+ edgeBaseUrl,
99
+ provider: OAuthProvider.ATPROTO,
100
+ scopes: ATPROTO_OAUTH_SCOPES,
101
+ loginHint: handle,
102
+ });
103
+ return yield* Effect.tryPromise(() => client.halo.recoverIdentity({ recoveryProof }));
104
+ });
105
+
106
+ /** Recovery-code (seed phrase) login. */
107
+ const loginWithRecoveryCode = (client: Client, recoveryCode: string) =>
108
+ Effect.tryPromise(() => client.halo.recoverIdentity({ recoveryCode }));
109
+
110
+ /**
111
+ * Email login: hub-service inlines a one-time `token` for test emails and emails it out-of-band
112
+ * otherwise. Redeems the token to admit this device into HALO.
113
+ */
114
+ const loginWithEmail = (client: Client, email: string) =>
115
+ Effect.gen(function* () {
116
+ const hubUrl = client.config.values?.runtime?.app?.env?.DX_HUB_URL;
117
+ invariant(hubUrl, 'Hub URL not configured (runtime.app.env.DX_HUB_URL).');
118
+ const hub = new HubHttpClient(hubUrl);
119
+ const { token: inlineToken } = yield* Effect.tryPromise(() => hub.login(DxContext.default(), { email }));
120
+ let token = inlineToken;
121
+ if (!token) {
122
+ yield* Console.log(`A login link was sent to ${email}. Paste the token from the email below.`);
123
+ token = yield* Prompt.text({ message: 'Login token' }).pipe(Prompt.run);
124
+ }
125
+ return yield* Effect.tryPromise(() => client.halo.recoverIdentity({ token }));
126
+ });
127
+
128
+ /**
129
+ * Device-invitation login: joins an existing identity from another authorized device.
130
+ *
131
+ * NOTE: p2p networking does not work in bun — this method will likely hang waiting for the peer.
132
+ */
133
+ const loginWithDeviceInvitation = (client: Client, encoded: string) =>
134
+ Effect.gen(function* () {
135
+ let code = encoded;
136
+ if (code.startsWith('http') || code.startsWith('socket')) {
137
+ code = new URL(code).searchParams.get('deviceInvitationCode') ?? code;
138
+ }
139
+ const invitation = client.halo.join(InvitationEncoder.decode(code));
140
+ yield* waitForState(invitation, Invitation.State.READY_FOR_AUTHENTICATION);
141
+ const authCode = yield* Prompt.text({ message: 'Enter the authentication code' }).pipe(Prompt.run);
142
+ yield* Effect.tryPromise(() => invitation.authenticate(authCode));
143
+ yield* waitForState(invitation, Invitation.State.SUCCESS);
144
+ const identity = client.halo.identity.get();
145
+ invariant(identity, 'Device invitation completed but no identity is present.');
146
+ return identity;
147
+ });
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ export * from './logout';
@@ -0,0 +1,49 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import * as Command from '@effect/cli/Command';
6
+ import * as Options from '@effect/cli/Options';
7
+ import * as Prompt from '@effect/cli/Prompt';
8
+ import * as Error from '@effect/platform/Error';
9
+ import * as FileSystem from '@effect/platform/FileSystem';
10
+ import * as Console from 'effect/Console';
11
+ import * as Effect from 'effect/Effect';
12
+
13
+ import { CommandConfig } from '@dxos/cli-util';
14
+ import { DX_DATA, getProfilePath } from '@dxos/client-protocol';
15
+ import { ConfigService } from '@dxos/config';
16
+
17
+ export const logout = Command.make(
18
+ 'logout',
19
+ {
20
+ force: Options.boolean('force', { ifPresent: true }).pipe(Options.withDescription('Skip confirmation prompt.')),
21
+ },
22
+ Effect.fnUntraced(function* ({ force }) {
23
+ const fs = yield* FileSystem.FileSystem;
24
+ const config = yield* ConfigService;
25
+ const { json, profile } = yield* CommandConfig;
26
+ const path = config.values.runtime?.client?.storage?.dataRoot ?? getProfilePath(DX_DATA, profile);
27
+ if (!force) {
28
+ const confirmed = yield* Prompt.confirm({
29
+ message: `Log out of profile (${profile})? This removes the local identity and data; spaces re-sync on next login.`,
30
+ initial: false,
31
+ }).pipe(Prompt.run);
32
+ if (!confirmed) {
33
+ return;
34
+ }
35
+ }
36
+
37
+ yield* fs.remove(path, { recursive: true }).pipe(
38
+ Effect.catchIf(
39
+ (e): e is Error.SystemError => e._tag === 'SystemError' && e.reason === 'NotFound',
40
+ () => Effect.void,
41
+ ),
42
+ );
43
+ if (json) {
44
+ yield* Console.log(JSON.stringify({ profile, loggedOut: true }, null, 2));
45
+ } else {
46
+ yield* Console.log(`Logged out of profile (${profile}).`);
47
+ }
48
+ }),
49
+ ).pipe(Command.withDescription('Log out of the current profile (clears the local identity and data).'));
@@ -9,7 +9,7 @@ import * as Effect from 'effect/Effect';
9
9
  import * as Option from 'effect/Option';
10
10
 
11
11
  import { Capabilities, Plugin } from '@dxos/app-framework';
12
- import { PERSONAL_SPACE_TAG } from '@dxos/app-toolkit';
12
+ import { AppSpace } from '@dxos/app-toolkit';
13
13
  import { CommandConfig, flushAndSync, spaceLayer } from '@dxos/cli-util';
14
14
  import { print } from '@dxos/cli-util';
15
15
  import { ClientService } from '@dxos/client';
@@ -45,7 +45,7 @@ export const handler = Effect.fn(function* ({
45
45
 
46
46
  // Create personal space for the CLI identity.
47
47
  const space = yield* Effect.promise(() =>
48
- client.spaces.create({}, { tags: [PERSONAL_SPACE_TAG], membershipPolicy: MembershipPolicy.LOCKED }),
48
+ client.spaces.create({}, { tags: [AppSpace.PERSONAL_SPACE_TAG], membershipPolicy: MembershipPolicy.LOCKED }),
49
49
  );
50
50
  yield* Effect.promise(() => space.waitUntilReady());
51
51
  yield* Effect.promise(() => space.internal.setEdgeReplicationPreference(EdgeReplicationSetting.ENABLED));
@@ -4,18 +4,18 @@
4
4
 
5
5
  import * as Command from '@effect/cli/Command';
6
6
 
7
- import { create } from './create';
8
7
  import { credential } from './credential';
9
8
  import { identity } from './identity';
10
- // TODO(wittjosiah): Omitted currently due to p2p networking not working in bun.
11
- // import { join } from './join';
12
9
  import { keys } from './keys';
13
- import { recover } from './recover';
14
10
  import { seed } from './seed';
15
- // import { share } from './share';
16
11
  import { update } from './update';
17
12
 
13
+ // `create`, `join`, and `recover` are superseded by `dx account login`, which logs in to an
14
+ // existing identity via the same methods as Composer (email / atproto / device-invitation /
15
+ // recovery-code). Note: `join` was omitted and the `device-invitation` login method may hang —
16
+ // both rely on p2p networking which does not work in bun.
17
+
18
18
  export const halo: Command.Command<any, any, any, any> = Command.make('halo').pipe(
19
19
  Command.withDescription('Manage HALO identity.'),
20
- Command.withSubcommands([create, credential, identity, keys, recover, seed, update]),
20
+ Command.withSubcommands([credential, identity, keys, seed, update]),
21
21
  );
@@ -7,14 +7,13 @@ import * as Command from '@effect/cli/Command';
7
7
  import * as Prompt from '@effect/cli/Prompt';
8
8
  import * as Console from 'effect/Console';
9
9
  import * as Effect from 'effect/Effect';
10
- import * as Match from 'effect/Match';
11
10
 
12
11
  import { CommandConfig, print } from '@dxos/cli-util';
13
12
  import { type Client, ClientService } from '@dxos/client';
14
- import { type AuthenticatingInvitationObservable, Invitation, InvitationEncoder } from '@dxos/client/invitations';
13
+ import { Invitation, InvitationEncoder } from '@dxos/client/invitations';
15
14
  import { invariant } from '@dxos/invariant';
16
15
 
17
- import { printIdentity } from '../util';
16
+ import { printIdentity, waitForState } from '../util';
18
17
 
19
18
  export const join = Command.make(
20
19
  'join',
@@ -75,13 +74,3 @@ const sendInvitation = Effect.fn(function* ({
75
74
  yield* waitForState(invitation, Invitation.State.SUCCESS);
76
75
  return client.halo.identity.get();
77
76
  });
78
-
79
- const waitForState = (invitation: AuthenticatingInvitationObservable, state: Invitation.State) =>
80
- Effect.gen(function* () {
81
- const latch = yield* Effect.makeLatch();
82
- const subscription = invitation.subscribe((invitation) => {
83
- Match.value(invitation.state).pipe(Match.when(state, () => Effect.runSync(latch.open)));
84
- });
85
- yield* latch.await;
86
- subscription.unsubscribe();
87
- });
@@ -2,7 +2,11 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
+ import * as Duration from 'effect/Duration';
6
+ import * as Effect from 'effect/Effect';
7
+
5
8
  import { FormBuilder } from '@dxos/cli-util';
9
+ import { type AuthenticatingInvitationObservable, Invitation } from '@dxos/client/invitations';
6
10
 
7
11
  /**
8
12
  * Pretty prints an identity with ANSI colors.
@@ -13,3 +17,23 @@ export const printIdentity = (identity: { identityDid: string; profile?: { displ
13
17
  FormBuilder.set('displayName', identity.profile?.displayName ?? '<none>'),
14
18
  FormBuilder.build,
15
19
  );
20
+
21
+ const TERMINAL_FAILURE_STATES = new Set([
22
+ Invitation.State.CANCELLED,
23
+ Invitation.State.TIMEOUT,
24
+ Invitation.State.ERROR,
25
+ Invitation.State.EXPIRED,
26
+ ]);
27
+
28
+ /** Await an authenticating invitation reaching the given state. */
29
+ export const waitForState = (invitation: AuthenticatingInvitationObservable, state: Invitation.State) =>
30
+ Effect.async<void, Error>((resume) => {
31
+ const subscription = invitation.subscribe((inv) => {
32
+ if (inv.state === state) {
33
+ resume(Effect.void);
34
+ } else if (TERMINAL_FAILURE_STATES.has(inv.state!)) {
35
+ resume(Effect.fail(new Error(`Invitation failed with state: ${Invitation.State[inv.state!]}`)));
36
+ }
37
+ });
38
+ return Effect.sync(() => subscription.unsubscribe());
39
+ }).pipe(Effect.timeout(Duration.minutes(3)));
@@ -2,6 +2,7 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
+ export * from './account';
5
6
  export * from './config';
6
7
  export * from './device';
7
8
  export * from './edge';
package/src/constants.ts CHANGED
@@ -6,6 +6,6 @@ import { DXN } from '@dxos/keys';
6
6
 
7
7
  import { meta } from '#meta';
8
8
 
9
- export const JOIN_DIALOG = DXN.make(`${meta.id}.joinDialog`);
10
- export const RECOVERY_CODE_DIALOG = DXN.make(`${meta.id}.recoveryCodeDialog`);
11
- export const RESET_DIALOG = DXN.make(`${meta.id}.resetDialog`);
9
+ export const JOIN_DIALOG = DXN.make(`${meta.profile.key}.joinDialog`);
10
+ export const RECOVERY_CODE_DIALOG = DXN.make(`${meta.profile.key}.recoveryCodeDialog`);
11
+ export const RESET_DIALOG = DXN.make(`${meta.profile.key}.resetDialog`);
@@ -22,7 +22,7 @@ import { useHubHttpClient } from '../../state/use-hub-http';
22
22
  type AccountState = 'loading' | 'present' | 'missing' | 'error';
23
23
 
24
24
  export const AccountContainer = () => {
25
- const { t } = useTranslation(meta.id);
25
+ const { t } = useTranslation(meta.profile.key);
26
26
  const identity = useIdentity();
27
27
  const { invokePromise } = useOperationInvoker();
28
28
  const accountCacheAtom = useCapability(ClientCapabilities.AccountCache);