@dxos/plugin-client 0.8.4-main.b97322e → 0.8.4-main.bc674ce

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 (400) hide show
  1. package/dist/lib/browser/app-graph-builder-3FGBMLTF.mjs +118 -0
  2. package/dist/lib/browser/app-graph-builder-3FGBMLTF.mjs.map +7 -0
  3. package/dist/lib/browser/chunk-4BZGRIFS.mjs +293 -0
  4. package/dist/lib/browser/chunk-4BZGRIFS.mjs.map +7 -0
  5. package/dist/lib/browser/chunk-F7H2Y3Z2.mjs +18 -0
  6. package/dist/lib/browser/chunk-F7H2Y3Z2.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-G7C3S2BE.mjs +15 -0
  8. package/dist/lib/browser/chunk-G7C3S2BE.mjs.map +7 -0
  9. package/dist/lib/browser/cli/index.mjs +1048 -0
  10. package/dist/lib/browser/cli/index.mjs.map +7 -0
  11. package/dist/lib/browser/client-IX5LMWV4.mjs +86 -0
  12. package/dist/lib/browser/client-IX5LMWV4.mjs.map +7 -0
  13. package/dist/lib/browser/index.mjs +75 -81
  14. package/dist/lib/browser/index.mjs.map +4 -4
  15. package/dist/lib/browser/meta.json +1 -1
  16. package/dist/lib/browser/migrations-3EBTAW3N.mjs +24 -0
  17. package/dist/lib/browser/migrations-3EBTAW3N.mjs.map +7 -0
  18. package/dist/lib/browser/operation-resolver-2NT3ISVP.mjs +298 -0
  19. package/dist/lib/browser/operation-resolver-2NT3ISVP.mjs.map +7 -0
  20. package/dist/lib/browser/react-context-4UABG3GP.mjs +24 -0
  21. package/dist/lib/browser/react-context-4UABG3GP.mjs.map +7 -0
  22. package/dist/lib/browser/react-surface-RSQ74XCT.mjs +675 -0
  23. package/dist/lib/browser/react-surface-RSQ74XCT.mjs.map +7 -0
  24. package/dist/lib/browser/schema-defs-O7VLP745.mjs +26 -0
  25. package/dist/lib/browser/schema-defs-O7VLP745.mjs.map +7 -0
  26. package/dist/lib/browser/types/index.mjs +9 -4
  27. package/dist/lib/node-esm/app-graph-builder-2PIYVUNC.mjs +119 -0
  28. package/dist/lib/node-esm/app-graph-builder-2PIYVUNC.mjs.map +7 -0
  29. package/dist/lib/node-esm/chunk-BCELGXRI.mjs +20 -0
  30. package/dist/lib/node-esm/chunk-BCELGXRI.mjs.map +7 -0
  31. package/dist/lib/node-esm/chunk-JAF64TFQ.mjs +295 -0
  32. package/dist/lib/node-esm/chunk-JAF64TFQ.mjs.map +7 -0
  33. package/dist/lib/node-esm/chunk-PRAFFO54.mjs +16 -0
  34. package/dist/lib/node-esm/chunk-PRAFFO54.mjs.map +7 -0
  35. package/dist/lib/node-esm/cli/index.mjs +1049 -0
  36. package/dist/lib/node-esm/cli/index.mjs.map +7 -0
  37. package/dist/lib/node-esm/client-FFPK5UFP.mjs +87 -0
  38. package/dist/lib/node-esm/client-FFPK5UFP.mjs.map +7 -0
  39. package/dist/lib/node-esm/index.mjs +75 -81
  40. package/dist/lib/node-esm/index.mjs.map +4 -4
  41. package/dist/lib/node-esm/meta.json +1 -1
  42. package/dist/lib/node-esm/migrations-WSZSFGDK.mjs +25 -0
  43. package/dist/lib/node-esm/migrations-WSZSFGDK.mjs.map +7 -0
  44. package/dist/lib/node-esm/operation-resolver-VW5R2BE4.mjs +299 -0
  45. package/dist/lib/node-esm/operation-resolver-VW5R2BE4.mjs.map +7 -0
  46. package/dist/lib/node-esm/react-context-UVXMGPW4.mjs +25 -0
  47. package/dist/lib/node-esm/react-context-UVXMGPW4.mjs.map +7 -0
  48. package/dist/lib/node-esm/react-surface-KBHANGGC.mjs +676 -0
  49. package/dist/lib/node-esm/react-surface-KBHANGGC.mjs.map +7 -0
  50. package/dist/lib/node-esm/schema-defs-QLRGBIKY.mjs +27 -0
  51. package/dist/lib/node-esm/schema-defs-QLRGBIKY.mjs.map +7 -0
  52. package/dist/lib/node-esm/types/index.mjs +9 -4
  53. package/dist/types/src/ClientPlugin.d.ts +2 -1
  54. package/dist/types/src/ClientPlugin.d.ts.map +1 -1
  55. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts +6 -0
  56. package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +1 -0
  57. package/dist/types/src/capabilities/app-graph-builder/index.d.ts +3 -0
  58. package/dist/types/src/capabilities/app-graph-builder/index.d.ts.map +1 -0
  59. package/dist/types/src/capabilities/client/client.d.ts +8 -0
  60. package/dist/types/src/capabilities/client/client.d.ts.map +1 -0
  61. package/dist/types/src/capabilities/client/index.d.ts +17 -0
  62. package/dist/types/src/capabilities/client/index.d.ts.map +1 -0
  63. package/dist/types/src/capabilities/index.d.ts +7 -19
  64. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  65. package/dist/types/src/capabilities/migrations/index.d.ts +3 -0
  66. package/dist/types/src/capabilities/migrations/index.d.ts.map +1 -0
  67. package/dist/types/src/capabilities/migrations/migrations.d.ts +5 -0
  68. package/dist/types/src/capabilities/migrations/migrations.d.ts.map +1 -0
  69. package/dist/types/src/capabilities/operation-resolver/index.d.ts +5 -0
  70. package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +1 -0
  71. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +8 -0
  72. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -0
  73. package/dist/types/src/capabilities/react-context/index.d.ts +7 -0
  74. package/dist/types/src/capabilities/react-context/index.d.ts.map +1 -0
  75. package/dist/types/src/capabilities/react-context/react-context.d.ts +10 -0
  76. package/dist/types/src/capabilities/react-context/react-context.d.ts.map +1 -0
  77. package/dist/types/src/capabilities/react-surface/index.d.ts +5 -0
  78. package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -0
  79. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +9 -0
  80. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -0
  81. package/dist/types/src/capabilities/schema-defs/index.d.ts +3 -0
  82. package/dist/types/src/capabilities/schema-defs/index.d.ts.map +1 -0
  83. package/dist/types/src/capabilities/schema-defs/schema-defs.d.ts +5 -0
  84. package/dist/types/src/capabilities/schema-defs/schema-defs.d.ts.map +1 -0
  85. package/dist/types/src/cli/commands/config/index.d.ts +5 -0
  86. package/dist/types/src/cli/commands/config/index.d.ts.map +1 -0
  87. package/dist/types/src/cli/commands/config/view.d.ts +5 -0
  88. package/dist/types/src/cli/commands/config/view.d.ts.map +1 -0
  89. package/dist/types/src/cli/commands/device/index.d.ts +7 -0
  90. package/dist/types/src/cli/commands/device/index.d.ts.map +1 -0
  91. package/dist/types/src/cli/commands/device/info/index.d.ts +2 -0
  92. package/dist/types/src/cli/commands/device/info/index.d.ts.map +1 -0
  93. package/dist/types/src/cli/commands/device/info/info.d.ts +7 -0
  94. package/dist/types/src/cli/commands/device/info/info.d.ts.map +1 -0
  95. package/dist/types/src/cli/commands/device/info/info.test.d.ts +2 -0
  96. package/dist/types/src/cli/commands/device/info/info.test.d.ts.map +1 -0
  97. package/dist/types/src/cli/commands/device/list/index.d.ts +2 -0
  98. package/dist/types/src/cli/commands/device/list/index.d.ts.map +1 -0
  99. package/dist/types/src/cli/commands/device/list/list.d.ts +7 -0
  100. package/dist/types/src/cli/commands/device/list/list.d.ts.map +1 -0
  101. package/dist/types/src/cli/commands/device/list/list.test.d.ts +2 -0
  102. package/dist/types/src/cli/commands/device/list/list.test.d.ts.map +1 -0
  103. package/dist/types/src/cli/commands/device/update/index.d.ts +2 -0
  104. package/dist/types/src/cli/commands/device/update/index.d.ts.map +1 -0
  105. package/dist/types/src/cli/commands/device/update/update.d.ts +11 -0
  106. package/dist/types/src/cli/commands/device/update/update.d.ts.map +1 -0
  107. package/dist/types/src/cli/commands/device/util.d.ts +16 -0
  108. package/dist/types/src/cli/commands/device/util.d.ts.map +1 -0
  109. package/dist/types/src/cli/commands/edge/index.d.ts +5 -0
  110. package/dist/types/src/cli/commands/edge/index.d.ts.map +1 -0
  111. package/dist/types/src/cli/commands/edge/status.d.ts +7 -0
  112. package/dist/types/src/cli/commands/edge/status.d.ts.map +1 -0
  113. package/dist/types/src/cli/commands/halo/create/create.d.ts +15 -0
  114. package/dist/types/src/cli/commands/halo/create/create.d.ts.map +1 -0
  115. package/dist/types/src/cli/commands/halo/create/create.test.d.ts +2 -0
  116. package/dist/types/src/cli/commands/halo/create/create.test.d.ts.map +1 -0
  117. package/dist/types/src/cli/commands/halo/create/index.d.ts +2 -0
  118. package/dist/types/src/cli/commands/halo/create/index.d.ts.map +1 -0
  119. package/dist/types/src/cli/commands/halo/credential/add/add.d.ts +13 -0
  120. package/dist/types/src/cli/commands/halo/credential/add/add.d.ts.map +1 -0
  121. package/dist/types/src/cli/commands/halo/credential/add/index.d.ts +2 -0
  122. package/dist/types/src/cli/commands/halo/credential/add/index.d.ts.map +1 -0
  123. package/dist/types/src/cli/commands/halo/credential/index.d.ts +12 -0
  124. package/dist/types/src/cli/commands/halo/credential/index.d.ts.map +1 -0
  125. package/dist/types/src/cli/commands/halo/credential/list/index.d.ts +2 -0
  126. package/dist/types/src/cli/commands/halo/credential/list/index.d.ts.map +1 -0
  127. package/dist/types/src/cli/commands/halo/credential/list/list.d.ts +19 -0
  128. package/dist/types/src/cli/commands/halo/credential/list/list.d.ts.map +1 -0
  129. package/dist/types/src/cli/commands/halo/credential/list/list.test.d.ts +2 -0
  130. package/dist/types/src/cli/commands/halo/credential/list/list.test.d.ts.map +1 -0
  131. package/dist/types/src/cli/commands/halo/identity/identity.d.ts +7 -0
  132. package/dist/types/src/cli/commands/halo/identity/identity.d.ts.map +1 -0
  133. package/dist/types/src/cli/commands/halo/identity/identity.test.d.ts +2 -0
  134. package/dist/types/src/cli/commands/halo/identity/identity.test.d.ts.map +1 -0
  135. package/dist/types/src/cli/commands/halo/identity/index.d.ts +2 -0
  136. package/dist/types/src/cli/commands/halo/identity/index.d.ts.map +1 -0
  137. package/dist/types/src/cli/commands/halo/index.d.ts +3 -0
  138. package/dist/types/src/cli/commands/halo/index.d.ts.map +1 -0
  139. package/dist/types/src/cli/commands/halo/join/index.d.ts +2 -0
  140. package/dist/types/src/cli/commands/halo/join/index.d.ts.map +1 -0
  141. package/dist/types/src/cli/commands/halo/join/join.d.ts +8 -0
  142. package/dist/types/src/cli/commands/halo/join/join.d.ts.map +1 -0
  143. package/dist/types/src/cli/commands/halo/join/join.test.d.ts +2 -0
  144. package/dist/types/src/cli/commands/halo/join/join.test.d.ts.map +1 -0
  145. package/dist/types/src/cli/commands/halo/keys/index.d.ts +2 -0
  146. package/dist/types/src/cli/commands/halo/keys/index.d.ts.map +1 -0
  147. package/dist/types/src/cli/commands/halo/keys/keys.d.ts +7 -0
  148. package/dist/types/src/cli/commands/halo/keys/keys.d.ts.map +1 -0
  149. package/dist/types/src/cli/commands/halo/keys/keys.test.d.ts +2 -0
  150. package/dist/types/src/cli/commands/halo/keys/keys.test.d.ts.map +1 -0
  151. package/dist/types/src/cli/commands/halo/recover/index.d.ts +2 -0
  152. package/dist/types/src/cli/commands/halo/recover/index.d.ts.map +1 -0
  153. package/dist/types/src/cli/commands/halo/recover/recover.d.ts +7 -0
  154. package/dist/types/src/cli/commands/halo/recover/recover.d.ts.map +1 -0
  155. package/dist/types/src/cli/commands/halo/recover/recover.test.d.ts +2 -0
  156. package/dist/types/src/cli/commands/halo/recover/recover.test.d.ts.map +1 -0
  157. package/dist/types/src/cli/commands/halo/seed/index.d.ts +2 -0
  158. package/dist/types/src/cli/commands/halo/seed/index.d.ts.map +1 -0
  159. package/dist/types/src/cli/commands/halo/seed/seed.d.ts +7 -0
  160. package/dist/types/src/cli/commands/halo/seed/seed.d.ts.map +1 -0
  161. package/dist/types/src/cli/commands/halo/share/index.d.ts +2 -0
  162. package/dist/types/src/cli/commands/halo/share/index.d.ts.map +1 -0
  163. package/dist/types/src/cli/commands/halo/share/share.d.ts +15 -0
  164. package/dist/types/src/cli/commands/halo/share/share.d.ts.map +1 -0
  165. package/dist/types/src/cli/commands/halo/update/index.d.ts +2 -0
  166. package/dist/types/src/cli/commands/halo/update/index.d.ts.map +1 -0
  167. package/dist/types/src/cli/commands/halo/update/update.d.ts +11 -0
  168. package/dist/types/src/cli/commands/halo/update/update.d.ts.map +1 -0
  169. package/dist/types/src/cli/commands/halo/update/update.test.d.ts +2 -0
  170. package/dist/types/src/cli/commands/halo/update/update.test.d.ts.map +1 -0
  171. package/dist/types/src/cli/commands/halo/util.d.ts +13 -0
  172. package/dist/types/src/cli/commands/halo/util.d.ts.map +1 -0
  173. package/dist/types/src/cli/commands/index.d.ts +6 -0
  174. package/dist/types/src/cli/commands/index.d.ts.map +1 -0
  175. package/dist/types/src/cli/commands/profile/create.d.ts +9 -0
  176. package/dist/types/src/cli/commands/profile/create.d.ts.map +1 -0
  177. package/dist/types/src/cli/commands/profile/delete.d.ts +8 -0
  178. package/dist/types/src/cli/commands/profile/delete.d.ts.map +1 -0
  179. package/dist/types/src/cli/commands/profile/import.d.ts +17 -0
  180. package/dist/types/src/cli/commands/profile/import.d.ts.map +1 -0
  181. package/dist/types/src/cli/commands/profile/index.d.ts +19 -0
  182. package/dist/types/src/cli/commands/profile/index.d.ts.map +1 -0
  183. package/dist/types/src/cli/commands/profile/inspect.d.ts +13 -0
  184. package/dist/types/src/cli/commands/profile/inspect.d.ts.map +1 -0
  185. package/dist/types/src/cli/commands/profile/list.d.ts +6 -0
  186. package/dist/types/src/cli/commands/profile/list.d.ts.map +1 -0
  187. package/dist/types/src/cli/commands/profile/reset.d.ts +8 -0
  188. package/dist/types/src/cli/commands/profile/reset.d.ts.map +1 -0
  189. package/dist/types/src/cli/commands/profile/util.d.ts +24 -0
  190. package/dist/types/src/cli/commands/profile/util.d.ts.map +1 -0
  191. package/dist/types/src/cli/index.d.ts +2 -0
  192. package/dist/types/src/cli/index.d.ts.map +1 -0
  193. package/dist/types/src/cli/plugin.d.ts +4 -0
  194. package/dist/types/src/cli/plugin.d.ts.map +1 -0
  195. package/dist/types/src/cli/testing/test-console.d.ts +37 -0
  196. package/dist/types/src/cli/testing/test-console.d.ts.map +1 -0
  197. package/dist/types/src/components/DevicesContainer.d.ts.map +1 -1
  198. package/dist/types/src/components/DevicesContainer.stories.d.ts +178 -5
  199. package/dist/types/src/components/DevicesContainer.stories.d.ts.map +1 -1
  200. package/dist/types/src/components/JoinDialog.d.ts +0 -1
  201. package/dist/types/src/components/JoinDialog.d.ts.map +1 -1
  202. package/dist/types/src/components/ProfileContainer.d.ts.map +1 -1
  203. package/dist/types/src/components/ProfileContainer.stories.d.ts +11 -5
  204. package/dist/types/src/components/ProfileContainer.stories.d.ts.map +1 -1
  205. package/dist/types/src/components/RecoveryCodeDialog.d.ts +0 -1
  206. package/dist/types/src/components/RecoveryCodeDialog.d.ts.map +1 -1
  207. package/dist/types/src/components/RecoveryCodeDialog.stories.d.ts +13 -5
  208. package/dist/types/src/components/RecoveryCodeDialog.stories.d.ts.map +1 -1
  209. package/dist/types/src/components/RecoveryCredentialsContainer.d.ts +1 -1
  210. package/dist/types/src/components/RecoveryCredentialsContainer.d.ts.map +1 -1
  211. package/dist/types/src/components/RecoveryCredentialsContainer.stories.d.ts +11 -5
  212. package/dist/types/src/components/RecoveryCredentialsContainer.stories.d.ts.map +1 -1
  213. package/dist/types/src/components/ResetDialog.d.ts +5 -3
  214. package/dist/types/src/components/ResetDialog.d.ts.map +1 -1
  215. package/dist/types/src/components/ResetDialog.stories.d.ts +13 -4
  216. package/dist/types/src/components/ResetDialog.stories.d.ts.map +1 -1
  217. package/dist/types/src/constants.d.ts +4 -0
  218. package/dist/types/src/constants.d.ts.map +1 -0
  219. package/dist/types/src/index.d.ts +3 -3
  220. package/dist/types/src/index.d.ts.map +1 -1
  221. package/dist/types/src/meta.d.ts +2 -3
  222. package/dist/types/src/meta.d.ts.map +1 -1
  223. package/dist/types/src/translations.d.ts +2 -48
  224. package/dist/types/src/translations.d.ts.map +1 -1
  225. package/dist/types/src/types/capabilities.d.ts +10 -0
  226. package/dist/types/src/types/capabilities.d.ts.map +1 -0
  227. package/dist/types/src/types/events.d.ts +9 -0
  228. package/dist/types/src/types/events.d.ts.map +1 -0
  229. package/dist/types/src/types/index.d.ts +2 -0
  230. package/dist/types/src/types/index.d.ts.map +1 -1
  231. package/dist/types/src/types/schema.d.ts +168 -8
  232. package/dist/types/src/types/schema.d.ts.map +1 -1
  233. package/dist/types/tsconfig.tsbuildinfo +1 -1
  234. package/package.json +55 -39
  235. package/src/ClientPlugin.ts +40 -60
  236. package/src/capabilities/app-graph-builder/app-graph-builder.ts +95 -0
  237. package/src/capabilities/app-graph-builder/index.ts +7 -0
  238. package/src/capabilities/client/client.ts +75 -0
  239. package/src/capabilities/client/index.ts +7 -0
  240. package/src/capabilities/index.ts +7 -11
  241. package/src/capabilities/migrations/index.ts +7 -0
  242. package/src/capabilities/migrations/migrations.ts +30 -0
  243. package/src/capabilities/operation-resolver/index.ts +7 -0
  244. package/src/capabilities/operation-resolver/operation-resolver.ts +248 -0
  245. package/src/capabilities/react-context/index.ts +7 -0
  246. package/src/capabilities/react-context/react-context.tsx +25 -0
  247. package/src/capabilities/react-surface/index.ts +7 -0
  248. package/src/capabilities/react-surface/react-surface.tsx +74 -0
  249. package/src/capabilities/schema-defs/index.ts +7 -0
  250. package/src/capabilities/schema-defs/schema-defs.ts +35 -0
  251. package/src/cli/commands/config/index.ts +12 -0
  252. package/src/cli/commands/config/view.ts +26 -0
  253. package/src/cli/commands/device/index.ts +14 -0
  254. package/src/cli/commands/device/info/index.ts +5 -0
  255. package/src/cli/commands/device/info/info.test.ts +29 -0
  256. package/src/cli/commands/device/info/info.ts +50 -0
  257. package/src/cli/commands/device/list/index.ts +5 -0
  258. package/src/cli/commands/device/list/list.test.ts +31 -0
  259. package/src/cli/commands/device/list/list.ts +30 -0
  260. package/src/cli/commands/device/update/index.ts +5 -0
  261. package/src/cli/commands/device/update/update.ts +70 -0
  262. package/src/cli/commands/device/util.ts +55 -0
  263. package/src/cli/commands/edge/index.ts +12 -0
  264. package/src/cli/commands/edge/status.ts +45 -0
  265. package/src/cli/commands/halo/create/create.test.ts +52 -0
  266. package/src/cli/commands/halo/create/create.ts +75 -0
  267. package/src/cli/commands/halo/create/index.ts +5 -0
  268. package/src/cli/commands/halo/credential/add/add.ts +97 -0
  269. package/src/cli/commands/halo/credential/add/index.ts +5 -0
  270. package/src/cli/commands/halo/credential/index.ts +13 -0
  271. package/src/cli/commands/halo/credential/list/index.ts +5 -0
  272. package/src/cli/commands/halo/credential/list/list.test.ts +28 -0
  273. package/src/cli/commands/halo/credential/list/list.ts +118 -0
  274. package/src/cli/commands/halo/identity/identity.test.ts +40 -0
  275. package/src/cli/commands/halo/identity/identity.ts +46 -0
  276. package/src/cli/commands/halo/identity/index.ts +5 -0
  277. package/src/cli/commands/halo/index.ts +21 -0
  278. package/src/cli/commands/halo/join/index.ts +5 -0
  279. package/src/cli/commands/halo/join/join.test.ts +10 -0
  280. package/src/cli/commands/halo/join/join.ts +87 -0
  281. package/src/cli/commands/halo/keys/index.ts +5 -0
  282. package/src/cli/commands/halo/keys/keys.test.ts +29 -0
  283. package/src/cli/commands/halo/keys/keys.ts +42 -0
  284. package/src/cli/commands/halo/recover/index.ts +5 -0
  285. package/src/cli/commands/halo/recover/recover.test.ts +10 -0
  286. package/src/cli/commands/halo/recover/recover.ts +44 -0
  287. package/src/cli/commands/halo/seed/index.ts +5 -0
  288. package/src/cli/commands/halo/seed/seed.ts +38 -0
  289. package/src/cli/commands/halo/share/index.ts +5 -0
  290. package/src/cli/commands/halo/share/share.ts +97 -0
  291. package/src/cli/commands/halo/update/index.ts +5 -0
  292. package/src/cli/commands/halo/update/update.test.ts +29 -0
  293. package/src/cli/commands/halo/update/update.ts +69 -0
  294. package/src/cli/commands/halo/util.ts +18 -0
  295. package/src/cli/commands/index.ts +9 -0
  296. package/src/cli/commands/profile/create.ts +87 -0
  297. package/src/cli/commands/profile/delete.ts +33 -0
  298. package/src/cli/commands/profile/import.ts +101 -0
  299. package/src/cli/commands/profile/index.ts +17 -0
  300. package/src/cli/commands/profile/inspect.ts +64 -0
  301. package/src/cli/commands/profile/list.ts +54 -0
  302. package/src/cli/commands/profile/reset.ts +45 -0
  303. package/src/cli/commands/profile/util.ts +48 -0
  304. package/src/cli/index.ts +5 -0
  305. package/src/cli/plugin.ts +33 -0
  306. package/src/cli/testing/test-console.ts +88 -0
  307. package/src/components/DevicesContainer.stories.tsx +15 -15
  308. package/src/components/DevicesContainer.tsx +67 -79
  309. package/src/components/JoinDialog.tsx +15 -17
  310. package/src/components/ProfileContainer.stories.tsx +8 -9
  311. package/src/components/ProfileContainer.tsx +60 -49
  312. package/src/components/RecoveryCodeDialog.stories.tsx +9 -10
  313. package/src/components/RecoveryCodeDialog.tsx +5 -7
  314. package/src/components/RecoveryCredentialsContainer.stories.tsx +15 -15
  315. package/src/components/RecoveryCredentialsContainer.tsx +48 -53
  316. package/src/components/ResetDialog.stories.tsx +25 -18
  317. package/src/components/ResetDialog.tsx +19 -18
  318. package/src/constants.ts +9 -0
  319. package/src/index.ts +3 -3
  320. package/src/meta.ts +8 -5
  321. package/src/translations.ts +5 -2
  322. package/src/types/capabilities.ts +16 -0
  323. package/src/types/events.ts +15 -0
  324. package/src/types/index.ts +2 -0
  325. package/src/types/schema.ts +121 -8
  326. package/dist/lib/browser/app-graph-builder-JNIES5L4.mjs +0 -123
  327. package/dist/lib/browser/app-graph-builder-JNIES5L4.mjs.map +0 -7
  328. package/dist/lib/browser/chunk-3F2Q2RKC.mjs +0 -18
  329. package/dist/lib/browser/chunk-3F2Q2RKC.mjs.map +0 -7
  330. package/dist/lib/browser/chunk-CAF2COXW.mjs +0 -19
  331. package/dist/lib/browser/chunk-CAF2COXW.mjs.map +0 -7
  332. package/dist/lib/browser/chunk-GS3LDHYD.mjs +0 -12
  333. package/dist/lib/browser/chunk-GS3LDHYD.mjs.map +0 -7
  334. package/dist/lib/browser/chunk-RMHBOY3Y.mjs +0 -110
  335. package/dist/lib/browser/chunk-RMHBOY3Y.mjs.map +0 -7
  336. package/dist/lib/browser/chunk-SV3MHIKI.mjs +0 -695
  337. package/dist/lib/browser/chunk-SV3MHIKI.mjs.map +0 -7
  338. package/dist/lib/browser/client-SKVKXPLY.mjs +0 -37
  339. package/dist/lib/browser/client-SKVKXPLY.mjs.map +0 -7
  340. package/dist/lib/browser/intent-resolver-LNPLD5CA.mjs +0 -305
  341. package/dist/lib/browser/intent-resolver-LNPLD5CA.mjs.map +0 -7
  342. package/dist/lib/browser/migrations-D76RCG72.mjs +0 -23
  343. package/dist/lib/browser/migrations-D76RCG72.mjs.map +0 -7
  344. package/dist/lib/browser/react-context-YWVPZUMU.mjs +0 -24
  345. package/dist/lib/browser/react-context-YWVPZUMU.mjs.map +0 -7
  346. package/dist/lib/browser/react-surface-QFZTDNLS.mjs +0 -66
  347. package/dist/lib/browser/react-surface-QFZTDNLS.mjs.map +0 -7
  348. package/dist/lib/browser/schema-defs-HKW6VNZB.mjs +0 -25
  349. package/dist/lib/browser/schema-defs-HKW6VNZB.mjs.map +0 -7
  350. package/dist/lib/node-esm/app-graph-builder-SWFB4FID.mjs +0 -124
  351. package/dist/lib/node-esm/app-graph-builder-SWFB4FID.mjs.map +0 -7
  352. package/dist/lib/node-esm/chunk-5V3RCXZV.mjs +0 -111
  353. package/dist/lib/node-esm/chunk-5V3RCXZV.mjs.map +0 -7
  354. package/dist/lib/node-esm/chunk-FBYODKEL.mjs +0 -696
  355. package/dist/lib/node-esm/chunk-FBYODKEL.mjs.map +0 -7
  356. package/dist/lib/node-esm/chunk-IOGTQFLM.mjs +0 -19
  357. package/dist/lib/node-esm/chunk-IOGTQFLM.mjs.map +0 -7
  358. package/dist/lib/node-esm/chunk-SZLX4BVJ.mjs +0 -14
  359. package/dist/lib/node-esm/chunk-SZLX4BVJ.mjs.map +0 -7
  360. package/dist/lib/node-esm/chunk-UMO3ETDV.mjs +0 -20
  361. package/dist/lib/node-esm/chunk-UMO3ETDV.mjs.map +0 -7
  362. package/dist/lib/node-esm/client-SLL6GDC2.mjs +0 -38
  363. package/dist/lib/node-esm/client-SLL6GDC2.mjs.map +0 -7
  364. package/dist/lib/node-esm/intent-resolver-L7C6YRWV.mjs +0 -306
  365. package/dist/lib/node-esm/intent-resolver-L7C6YRWV.mjs.map +0 -7
  366. package/dist/lib/node-esm/migrations-YISDI7LF.mjs +0 -24
  367. package/dist/lib/node-esm/migrations-YISDI7LF.mjs.map +0 -7
  368. package/dist/lib/node-esm/react-context-EEHS4S3L.mjs +0 -25
  369. package/dist/lib/node-esm/react-context-EEHS4S3L.mjs.map +0 -7
  370. package/dist/lib/node-esm/react-surface-2K6W37R4.mjs +0 -67
  371. package/dist/lib/node-esm/react-surface-2K6W37R4.mjs.map +0 -7
  372. package/dist/lib/node-esm/schema-defs-5ZNI63RW.mjs +0 -26
  373. package/dist/lib/node-esm/schema-defs-5ZNI63RW.mjs.map +0 -7
  374. package/dist/types/src/capabilities/app-graph-builder.d.ts +0 -4
  375. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +0 -1
  376. package/dist/types/src/capabilities/capabilities.d.ts +0 -9
  377. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  378. package/dist/types/src/capabilities/client.d.ts +0 -9
  379. package/dist/types/src/capabilities/client.d.ts.map +0 -1
  380. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -8
  381. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  382. package/dist/types/src/capabilities/migrations.d.ts +0 -4
  383. package/dist/types/src/capabilities/migrations.d.ts.map +0 -1
  384. package/dist/types/src/capabilities/react-context.d.ts +0 -8
  385. package/dist/types/src/capabilities/react-context.d.ts.map +0 -1
  386. package/dist/types/src/capabilities/react-surface.d.ts +0 -8
  387. package/dist/types/src/capabilities/react-surface.d.ts.map +0 -1
  388. package/dist/types/src/capabilities/schema-defs.d.ts +0 -4
  389. package/dist/types/src/capabilities/schema-defs.d.ts.map +0 -1
  390. package/dist/types/src/events.d.ts +0 -8
  391. package/dist/types/src/events.d.ts.map +0 -1
  392. package/src/capabilities/app-graph-builder.ts +0 -113
  393. package/src/capabilities/capabilities.ts +0 -18
  394. package/src/capabilities/client.ts +0 -41
  395. package/src/capabilities/intent-resolver.ts +0 -250
  396. package/src/capabilities/migrations.ts +0 -25
  397. package/src/capabilities/react-context.tsx +0 -20
  398. package/src/capabilities/react-surface.tsx +0 -67
  399. package/src/capabilities/schema-defs.ts +0 -29
  400. package/src/events.ts +0 -15
@@ -5,13 +5,13 @@
5
5
  import React, { useCallback, useEffect, useState } from 'react';
6
6
  import { QR } from 'react-qr-rounded';
7
7
 
8
- import { createIntent, useIntentDispatcher } from '@dxos/app-framework';
8
+ import { useOperationInvoker } from '@dxos/app-framework/react';
9
9
  import { log } from '@dxos/log';
10
10
  import { useClient, useMulticastObservable } from '@dxos/react-client';
11
11
  import { type Device, useDevices } from '@dxos/react-client/halo';
12
12
  import { type CancellableInvitationObservable, Invitation, InvitationEncoder } from '@dxos/react-client/invitations';
13
13
  import { useNetworkStatus } from '@dxos/react-client/mesh';
14
- import { Button, Clipboard, IconButton, List, useId, useTranslation, Icon } from '@dxos/react-ui';
14
+ import { Button, Clipboard, Icon, IconButton, List, useId, useTranslation } from '@dxos/react-ui';
15
15
  import {
16
16
  ControlFrame,
17
17
  ControlFrameItem,
@@ -20,101 +20,89 @@ import {
20
20
  ControlPage,
21
21
  ControlSection,
22
22
  } from '@dxos/react-ui-form';
23
- import { StackItem } from '@dxos/react-ui-stack';
23
+ import { translationKey } from '@dxos/shell/react';
24
24
  import { AuthCode, Centered, DeviceListItem, Emoji, Viewport } from '@dxos/shell/react';
25
+ import { osTranslations } from '@dxos/ui-theme';
25
26
  import { hexToEmoji } from '@dxos/util';
26
27
 
27
- import { CLIENT_PLUGIN } from '../meta';
28
- import { ClientAction } from '../types';
28
+ import { meta } from '../meta';
29
+ import { ClientOperation } from '../types';
29
30
 
30
31
  export type DevicesContainerProps = {
31
32
  createInvitationUrl?: (invitationCode: string) => string;
32
33
  };
33
34
 
34
35
  export const DevicesContainer = ({ createInvitationUrl }: DevicesContainerProps) => {
35
- const { t } = useTranslation('os');
36
- const { dispatchPromise: dispatch } = useIntentDispatcher();
36
+ const { t } = useTranslation(translationKey);
37
+ const { invokePromise } = useOperationInvoker();
37
38
  const devices = useDevices();
38
39
  const { swarm: connectionState } = useNetworkStatus();
39
40
 
40
- const handleResetStorage = useCallback(() => dispatch(createIntent(ClientAction.ResetStorage)), [dispatch]);
41
+ const handleResetStorage = useCallback(() => invokePromise(ClientOperation.ResetStorage, {}), [invokePromise]);
41
42
 
42
43
  const handleRecover = useCallback(
43
- () => dispatch(createIntent(ClientAction.ResetStorage, { mode: 'recover' })),
44
- [dispatch],
44
+ () => invokePromise(ClientOperation.ResetStorage, { mode: 'recover' }),
45
+ [invokePromise],
45
46
  );
46
47
 
47
48
  const handleJoinNewIdentity = useCallback(
48
- () => dispatch(createIntent(ClientAction.ResetStorage, { mode: 'join new identity' })),
49
- [dispatch],
49
+ () => invokePromise(ClientOperation.ResetStorage, { mode: 'join new identity' }),
50
+ [invokePromise],
50
51
  );
51
52
 
52
53
  return (
53
54
  <Clipboard.Provider>
54
- <StackItem.Content classNames='block overflow-y-auto'>
55
- <ControlPage>
56
- <ControlSection
57
- title={t('devices verbose label', { ns: CLIENT_PLUGIN })}
58
- description={t('devices description', { ns: CLIENT_PLUGIN })}
59
- >
60
- <ControlFrame>
61
- <ControlFrameItem title={t('devices label', { ns: CLIENT_PLUGIN })}>
62
- <List>
63
- {devices.map((device: Device) => {
64
- return (
65
- <DeviceListItem
66
- key={device.deviceKey.toHex()}
67
- device={device}
68
- connectionState={connectionState}
69
- />
70
- );
71
- })}
72
- </List>
55
+ <ControlPage>
56
+ <ControlSection
57
+ title={t('devices verbose label', { ns: meta.id })}
58
+ description={t('devices description', { ns: meta.id })}
59
+ >
60
+ <ControlFrame>
61
+ <ControlFrameItem title={t('devices label', { ns: meta.id })}>
62
+ <List>
63
+ {devices.map((device: Device) => {
64
+ return (
65
+ <DeviceListItem key={device.deviceKey.toHex()} device={device} connectionState={connectionState} />
66
+ );
67
+ })}
68
+ </List>
69
+ </ControlFrameItem>
70
+ {createInvitationUrl && (
71
+ <ControlFrameItem title='Add device'>
72
+ <DeviceInvitation createInvitationUrl={createInvitationUrl} />
73
73
  </ControlFrameItem>
74
- {createInvitationUrl && (
75
- <ControlFrameItem title='Add device'>
76
- <DeviceInvitation createInvitationUrl={createInvitationUrl} />
77
- </ControlFrameItem>
78
- )}
79
- </ControlFrame>
80
- </ControlSection>
81
- <ControlSection
82
- title={t('danger zone title', { ns: CLIENT_PLUGIN })}
83
- description={t('danger zone description', { ns: CLIENT_PLUGIN })}
84
- >
85
- <ControlGroup>
86
- <ControlItem
87
- title={t('reset device label')}
88
- description={t('reset device description', { ns: CLIENT_PLUGIN })}
89
- >
90
- <Button variant='destructive' onClick={handleResetStorage} data-testid='devicesContainer.reset'>
91
- {t('reset device label')}
92
- </Button>
93
- </ControlItem>
94
- <ControlItem
95
- title={t('recover identity label')}
96
- description={t('recover identity description', { ns: CLIENT_PLUGIN })}
97
- >
98
- <Button variant='destructive' onClick={handleRecover} data-testid='devicesContainer.recover'>
99
- {t('recover identity label')}
100
- </Button>
101
- </ControlItem>
102
- <ControlItem
103
- title={t('join new identity label')}
104
- description={t('join new identity description', { ns: CLIENT_PLUGIN })}
105
- >
106
- <Button
107
- variant='destructive'
108
- onClick={handleJoinNewIdentity}
109
- data-testid='devicesContainer.joinExisting'
110
- >
111
- {t('join new identity label')}
112
- </Button>
113
- </ControlItem>
114
- </ControlGroup>
115
- </ControlSection>
116
- </ControlPage>
117
- </StackItem.Content>
74
+ )}
75
+ </ControlFrame>
76
+ </ControlSection>
77
+ <ControlSection
78
+ title={t('danger zone title', { ns: meta.id })}
79
+ description={t('danger zone description', { ns: meta.id })}
80
+ >
81
+ <ControlGroup>
82
+ <ControlItem title={t('reset device label')} description={t('reset device description', { ns: meta.id })}>
83
+ <Button variant='destructive' onClick={handleResetStorage} data-testid='devicesContainer.reset'>
84
+ {t('reset device label')}
85
+ </Button>
86
+ </ControlItem>
87
+ <ControlItem
88
+ title={t('recover identity label')}
89
+ description={t('recover identity description', { ns: meta.id })}
90
+ >
91
+ <Button variant='destructive' onClick={handleRecover} data-testid='devicesContainer.recover'>
92
+ {t('recover identity label')}
93
+ </Button>
94
+ </ControlItem>
95
+ <ControlItem
96
+ title={t('join new identity label')}
97
+ description={t('join new identity description', { ns: meta.id })}
98
+ >
99
+ <Button variant='destructive' onClick={handleJoinNewIdentity} data-testid='devicesContainer.joinExisting'>
100
+ {t('join new identity label')}
101
+ </Button>
102
+ </ControlItem>
103
+ </ControlGroup>
104
+ </ControlSection>
105
+ </ControlPage>
118
106
  </Clipboard.Provider>
119
107
  );
120
108
  };
@@ -189,7 +177,7 @@ const InvitationSection = ({
189
177
  onInvitationDone = () => {},
190
178
  onInvitationCreate = () => {},
191
179
  }: InvitationComponentProps) => {
192
- const { t } = useTranslation(CLIENT_PLUGIN);
180
+ const { t } = useTranslation(meta.id);
193
181
  const activeView =
194
182
  state < 0
195
183
  ? 'init'
@@ -231,12 +219,12 @@ const InvitationSection = ({
231
219
  };
232
220
 
233
221
  const InvitationQR = ({ id, url, onCancel }: { id: string; url: string; onCancel: () => void }) => {
234
- const { t } = useTranslation('os');
222
+ const { t } = useTranslation(osTranslations);
235
223
  const qrLabel = useId('devices-container__qr-code');
236
224
  const emoji = hexToEmoji(id);
237
225
  return (
238
226
  <>
239
- <p className='text-description'>{t('qr code description', { ns: CLIENT_PLUGIN })}</p>
227
+ <p className='text-description'>{t('qr code description', { ns: meta.id })}</p>
240
228
  <div role='group' className='grid grid-cols-[1fr_min-content] mlb-2 gap-2'>
241
229
  <div role='none' className='is-full aspect-square relative text-description'>
242
230
  <QR
@@ -271,7 +259,7 @@ const InvitationQR = ({ id, url, onCancel }: { id: string; url: string; onCancel
271
259
  };
272
260
 
273
261
  const InvitationAuthCode = ({ id, code, onCancel }: { id: string; code: string; onCancel: () => void }) => {
274
- const { t } = useTranslation('os');
262
+ const { t } = useTranslation(osTranslations);
275
263
  const emoji = hexToEmoji(id);
276
264
 
277
265
  return (
@@ -4,42 +4,40 @@
4
4
 
5
5
  import React, { useCallback } from 'react';
6
6
 
7
- import { createIntent, LayoutAction, useIntentDispatcher } from '@dxos/app-framework';
8
- import { ObservabilityAction } from '@dxos/plugin-observability/types';
7
+ import { Common } from '@dxos/app-framework';
8
+ import { useOperationInvoker } from '@dxos/app-framework/react';
9
+ import { ObservabilityOperation } from '@dxos/plugin-observability/types';
9
10
  import { type InvitationResult } from '@dxos/react-client/invitations';
10
11
  import { Dialog, useTranslation } from '@dxos/react-ui';
11
12
  import { JoinPanel, type JoinPanelProps } from '@dxos/shell/react';
13
+ import { osTranslations } from '@dxos/ui-theme';
12
14
 
13
- import { CLIENT_PLUGIN } from '../meta';
14
- import { ClientAction } from '../types';
15
-
16
- export const JOIN_DIALOG = `${CLIENT_PLUGIN}/JoinDialog`;
15
+ import { meta } from '../meta';
16
+ import { ClientOperation } from '../types';
17
17
 
18
18
  export const JoinDialog = (props: JoinPanelProps) => {
19
- const { dispatchPromise: dispatch } = useIntentDispatcher();
20
- const { t } = useTranslation(CLIENT_PLUGIN);
19
+ const { invokePromise } = useOperationInvoker();
20
+ const { t } = useTranslation(meta.id);
21
21
 
22
- const handleCancelResetStorage = useCallback(() => dispatch(createIntent(ClientAction.ShareIdentity)), [dispatch]);
22
+ const handleCancelResetStorage = useCallback(() => invokePromise(ClientOperation.ShareIdentity), [invokePromise]);
23
23
 
24
24
  const handleDone = useCallback(
25
25
  async (result: InvitationResult | null) => {
26
26
  if (result?.identityKey) {
27
27
  await Promise.all([
28
- dispatch(createIntent(LayoutAction.UpdateDialog, { part: 'dialog', options: { state: false } })),
29
- dispatch(
30
- createIntent(ObservabilityAction.SendEvent, {
31
- name: props.initialDisposition === 'recover-identity' ? 'identity.recover' : 'identity.join',
32
- }),
33
- ),
28
+ invokePromise(Common.LayoutOperation.UpdateDialog, { state: false }),
29
+ invokePromise(ObservabilityOperation.SendEvent, {
30
+ name: props.initialDisposition === 'recover-identity' ? 'identity.recover' : 'identity.join',
31
+ }),
34
32
  ]);
35
33
  }
36
34
  },
37
- [dispatch],
35
+ [invokePromise],
38
36
  );
39
37
 
40
38
  return (
41
39
  <Dialog.Content>
42
- <Dialog.Title classNames='sr-only'>{t('join space label', { ns: 'os' })}</Dialog.Title>
40
+ <Dialog.Title classNames='sr-only'>{t('join space label', { ns: osTranslations })}</Dialog.Title>
43
41
  <JoinPanel
44
42
  mode='halo-only'
45
43
  {...props}
@@ -2,28 +2,27 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
- import { type StoryObj, type Meta } from '@storybook/react-vite';
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
8
6
 
9
7
  import { withClientProvider } from '@dxos/react-client/testing';
10
- import { withTheme, withLayout } from '@dxos/storybook-utils';
8
+ import { withTheme } from '@dxos/react-ui/testing';
11
9
 
12
- import { ProfileContainer } from './ProfileContainer';
13
10
  import { translations } from '../translations';
14
11
 
15
- const meta: Meta = {
12
+ import { ProfileContainer } from './ProfileContainer';
13
+
14
+ const meta = {
16
15
  title: 'plugins/plugin-client/ProfileContainer',
17
16
  component: ProfileContainer,
18
- decorators: [withClientProvider({ createIdentity: true }), withTheme, withLayout()],
17
+ decorators: [withTheme, withClientProvider({ createIdentity: true })],
19
18
  parameters: {
20
19
  layout: 'fullscreen',
21
20
  translations,
22
21
  },
23
- };
22
+ } satisfies Meta<typeof ProfileContainer>;
24
23
 
25
24
  export default meta;
26
25
 
27
- type Story = StoryObj<typeof ProfileContainer>;
26
+ type Story = StoryObj<typeof meta>;
28
27
 
29
28
  export const Default: Story = {};
@@ -2,7 +2,7 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { Schema } from 'effect';
5
+ import * as Schema from 'effect/Schema';
6
6
  import React, { type ChangeEvent, useCallback, useMemo, useState } from 'react';
7
7
 
8
8
  import { debounce } from '@dxos/async';
@@ -10,27 +10,38 @@ import { useClient } from '@dxos/react-client';
10
10
  import { type Identity, useIdentity } from '@dxos/react-client/halo';
11
11
  import { ButtonGroup, Clipboard, Input, useTranslation } from '@dxos/react-ui';
12
12
  import {
13
- Form,
14
- type InputComponent,
15
13
  ControlItem,
16
14
  ControlItemInput,
17
- ControlSection,
18
15
  ControlPage,
16
+ ControlSection,
17
+ Form,
18
+ type FormFieldMap,
19
+ type FormUpdateMeta,
19
20
  } from '@dxos/react-ui-form';
20
21
  import { EmojiPickerBlock, HuePicker } from '@dxos/react-ui-pickers';
21
- import { StackItem } from '@dxos/react-ui-stack';
22
- import { hexToHue, hexToEmoji } from '@dxos/util';
22
+ import { hexToEmoji, hexToHue } from '@dxos/util';
23
+
24
+ import { meta } from '../meta';
25
+
26
+ // TOOD(burdon): Factor out?
27
+ // TODO(wittjosiah): Integrate annotations with translations.
28
+ const UserProfile = Schema.Struct({
29
+ did: Schema.String.annotations({ title: 'DID' }),
30
+ displayName: Schema.String.annotations({ title: 'Display name' }),
31
+ emoji: Schema.String.annotations({ title: 'Avatar' }),
32
+ hue: Schema.String.annotations({ title: 'Color' }),
33
+ });
23
34
 
24
- import { CLIENT_PLUGIN } from '../meta';
35
+ type UserProfile = Schema.Schema.Type<typeof UserProfile>;
25
36
 
26
37
  // TODO(thure): Factor out?
27
38
  const getDefaultHueValue = (identity: Identity | null) => hexToHue(identity?.identityKey.toHex() ?? '0');
28
- const getDefaultEmojiValue = (identity: Identity | null) => hexToEmoji(identity?.identityKey.toHex() ?? '0');
29
39
  const getHueValue = (identity: Identity | null) => identity?.profile?.data?.hue || getDefaultHueValue(identity);
40
+ const getDefaultEmojiValue = (identity: Identity | null) => hexToEmoji(identity?.identityKey.toHex() ?? '0');
30
41
  const getEmojiValue = (identity: Identity | null) => identity?.profile?.data?.emoji || getDefaultEmojiValue(identity);
31
42
 
32
43
  export const ProfileContainer = () => {
33
- const { t } = useTranslation(CLIENT_PLUGIN);
44
+ const { t } = useTranslation(meta.id);
34
45
  const client = useClient();
35
46
  const identity = useIdentity();
36
47
  const [displayName, setDisplayNameDirectly] = useState(identity?.profile?.displayName ?? '');
@@ -40,7 +51,7 @@ export const ProfileContainer = () => {
40
51
  const updateProfile = useMemo(
41
52
  () =>
42
53
  debounce(
43
- (profile: Partial<Profile>) =>
54
+ (profile: Partial<UserProfile>) =>
44
55
  client.halo.updateProfile({
45
56
  displayName: profile.displayName,
46
57
  data: {
@@ -53,11 +64,26 @@ export const ProfileContainer = () => {
53
64
  [],
54
65
  );
55
66
 
56
- const handleSave = useCallback(
57
- (profile: Profile) => {
58
- setDisplayNameDirectly(profile.displayName);
59
- setEmojiDirectly(profile.emoji);
60
- setHueDirectly(profile.hue);
67
+ const handleChange = useCallback(
68
+ (profile: Partial<UserProfile>, meta: FormUpdateMeta<UserProfile>) => {
69
+ for (const [path, changed] of Object.entries(meta.changed)) {
70
+ if (changed) {
71
+ switch (path) {
72
+ case 'displayName':
73
+ setDisplayNameDirectly(profile.displayName ?? '');
74
+ break;
75
+ case 'emoji':
76
+ setEmojiDirectly(profile.emoji ?? getDefaultEmojiValue(identity));
77
+ break;
78
+ case 'hue':
79
+ setHueDirectly(profile.hue ?? getDefaultHueValue(identity));
80
+ break;
81
+ default:
82
+ break;
83
+ }
84
+ }
85
+ }
86
+
61
87
  void updateProfile(profile);
62
88
  },
63
89
  [identity],
@@ -65,22 +91,23 @@ export const ProfileContainer = () => {
65
91
 
66
92
  const values = useMemo(
67
93
  () => ({
94
+ did: identity?.did,
68
95
  displayName,
69
96
  emoji,
70
97
  hue,
71
- did: identity?.did,
72
98
  }),
73
99
  [identity, displayName, emoji, hue],
74
100
  );
75
101
 
76
102
  // TODO(wittjosiah): Integrate descriptions with the form schema.
77
- const customElements: Partial<Record<string, InputComponent>> = useMemo(
103
+ const fieldMap = useMemo<FormFieldMap>(
78
104
  () => ({
79
105
  displayName: ({ type, label, getValue, onValueChange }) => {
80
106
  const handleChange = useCallback(
81
107
  ({ target: { value } }: ChangeEvent<HTMLInputElement>) => onValueChange(type, value),
82
108
  [onValueChange, type],
83
109
  );
110
+
84
111
  return (
85
112
  <ControlItemInput title={label} description={t('display name description')}>
86
113
  <Input.TextInput
@@ -98,6 +125,7 @@ export const ProfileContainer = () => {
98
125
  () => onValueChange(type, getDefaultEmojiValue(identity)),
99
126
  [onValueChange, type],
100
127
  );
128
+
101
129
  return (
102
130
  <ControlItem title={label} description={t('icon description')}>
103
131
  <EmojiPickerBlock
@@ -116,14 +144,12 @@ export const ProfileContainer = () => {
116
144
  () => onValueChange(type, getDefaultHueValue(identity)),
117
145
  [onValueChange, type],
118
146
  );
147
+
119
148
  return (
120
149
  <ControlItem title={label} description={t('hue description')}>
121
- <HuePicker
122
- value={getValue()}
123
- onChange={handleChange}
124
- onReset={handleHueReset}
125
- classNames='[--hue-preview-size:1.5rem] justify-self-end'
126
- />
150
+ <div role='none' className='flex justify-self-end'>
151
+ <HuePicker value={getValue()} onChange={handleChange} onReset={handleHueReset} />
152
+ </div>
127
153
  </ControlItem>
128
154
  );
129
155
  },
@@ -143,31 +169,16 @@ export const ProfileContainer = () => {
143
169
  );
144
170
 
145
171
  return (
146
- <StackItem.Content classNames='block overflow-y-auto'>
147
- <ControlPage>
148
- <Clipboard.Provider>
149
- <ControlSection title={t('profile label')} description={t('profile description')}>
150
- <Form
151
- schema={ProfileSchema}
152
- values={values}
153
- autoSave
154
- onSave={handleSave}
155
- Custom={customElements}
156
- classNames='container-max-width grid grid-cols-1 md:grid-cols-[1fr_min-content] gap-4'
157
- outerSpacing={false}
158
- />
159
- </ControlSection>
160
- </Clipboard.Provider>
161
- </ControlPage>
162
- </StackItem.Content>
172
+ <ControlPage>
173
+ <Clipboard.Provider>
174
+ <ControlSection title={t('profile label')} description={t('profile description')}>
175
+ <Form.Root schema={UserProfile} values={values} fieldMap={fieldMap} onValuesChanged={handleChange}>
176
+ <Form.Content>
177
+ <Form.FieldSet classNames='container-max-width grid grid-cols-1 md:grid-cols-[1fr_min-content]' />
178
+ </Form.Content>
179
+ </Form.Root>
180
+ </ControlSection>
181
+ </Clipboard.Provider>
182
+ </ControlPage>
163
183
  );
164
184
  };
165
-
166
- // TODO(wittjosiah): Integrate annotations with translations.
167
- const ProfileSchema = Schema.Struct({
168
- displayName: Schema.String.annotations({ title: 'Display name' }),
169
- emoji: Schema.String.annotations({ title: 'Avatar' }),
170
- hue: Schema.String.annotations({ title: 'Color' }),
171
- did: Schema.String.annotations({ title: 'DID' }),
172
- });
173
- type Profile = Schema.Schema.Type<typeof ProfileSchema>;
@@ -2,19 +2,18 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
- import { type StoryObj, type Meta } from '@storybook/react-vite';
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
8
6
  import React, { useState } from 'react';
9
7
 
10
8
  import { useClient } from '@dxos/react-client';
11
9
  import { withClientProvider } from '@dxos/react-client/testing';
12
10
  import { AlertDialog, useAsyncEffect } from '@dxos/react-ui';
13
- import { withTheme, withLayout } from '@dxos/storybook-utils';
11
+ import { withTheme } from '@dxos/react-ui/testing';
14
12
 
15
- import { RecoveryCodeDialog, type RecoveryCodeDialogProps } from './RecoveryCodeDialog';
16
13
  import { translations } from '../translations';
17
14
 
15
+ import { RecoveryCodeDialog } from './RecoveryCodeDialog';
16
+
18
17
  const DefaultStory = () => {
19
18
  const client = useClient();
20
19
  const [recoveryCode, setRecoveryCode] = useState<string>();
@@ -32,19 +31,19 @@ const DefaultStory = () => {
32
31
  );
33
32
  };
34
33
 
35
- const meta: Meta<RecoveryCodeDialogProps> = {
34
+ const meta = {
36
35
  title: 'plugins/plugin-client/RecoveryCodeDialog',
37
- component: RecoveryCodeDialog,
36
+ component: RecoveryCodeDialog as any,
38
37
  render: DefaultStory,
39
- decorators: [withClientProvider({ createIdentity: true }), withTheme, withLayout()],
38
+ decorators: [withTheme, withClientProvider({ createIdentity: true })],
40
39
  parameters: {
41
40
  layout: 'fullscreen',
42
41
  translations,
43
42
  },
44
- };
43
+ } satisfies Meta<typeof DefaultStory>;
45
44
 
46
45
  export default meta;
47
46
 
48
- type Story = StoryObj<RecoveryCodeDialogProps>;
47
+ type Story = StoryObj<typeof meta>;
49
48
 
50
49
  export const Default: Story = {};
@@ -6,16 +6,14 @@ import React, { useCallback, useState } from 'react';
6
6
 
7
7
  import { AlertDialog, Button, Clipboard, Input, useTranslation } from '@dxos/react-ui';
8
8
 
9
- import { CLIENT_PLUGIN } from '../meta';
10
-
11
- export const RECOVERY_CODE_DIALOG = `${CLIENT_PLUGIN}/RecoveryCodeDialog`;
9
+ import { meta } from '../meta';
12
10
 
13
11
  export type RecoveryCodeDialogProps = {
14
12
  code: string;
15
13
  };
16
14
 
17
15
  export const RecoveryCodeDialog = ({ code }: RecoveryCodeDialogProps) => {
18
- const { t } = useTranslation(CLIENT_PLUGIN);
16
+ const { t } = useTranslation(meta.id);
19
17
  const [confirmation, setConfirmation] = useState(false);
20
18
 
21
19
  const handleConfirmation = useCallback((checked: boolean) => setConfirmation(checked), []);
@@ -23,11 +21,11 @@ export const RecoveryCodeDialog = ({ code }: RecoveryCodeDialogProps) => {
23
21
  return (
24
22
  <AlertDialog.Content classNames='bs-content min-bs-[15rem] max-bs-full md:max-is-[40rem] overflow-hidden'>
25
23
  <AlertDialog.Title>{t('recovery code dialog title')}</AlertDialog.Title>
26
- <p className='py-4'>{t('recovery code dialog description')}</p>
24
+ <p className='plb-4'>{t('recovery code dialog description')}</p>
27
25
  <Clipboard.Provider>
28
26
  <Code code={code} />
29
27
  </Clipboard.Provider>
30
- <div className='flex flex-col py-4 gap-2'>
28
+ <div className='flex flex-col plb-4 gap-2'>
31
29
  <p>{t('recovery code dialog warning 1')}</p>
32
30
  <p>{t('recovery code dialog warning 2')}</p>
33
31
  </div>
@@ -60,7 +58,7 @@ const Code = ({ code }: { code: string }) => {
60
58
  <div className='grid grid-cols-4'>
61
59
  {words.map((word, i) => (
62
60
  <div key={i} className='flex items-center p-2 gap-2'>
63
- <div className='w-4 text-xs text-center text-subdued'>{i + 1}</div>
61
+ <div className='is-4 text-xs text-center text-subdued'>{i + 1}</div>
64
62
  <div className='text-sm'>{word}</div>
65
63
  </div>
66
64
  ))}
@@ -2,43 +2,43 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import * as Effect from 'effect/Effect';
6
7
 
7
- import { type StoryObj, type Meta } from '@storybook/react-vite';
8
-
9
- import { IntentPlugin } from '@dxos/app-framework';
8
+ import { OperationPlugin } from '@dxos/app-framework';
10
9
  import { withPluginManager } from '@dxos/app-framework/testing';
11
- import { withTheme, withLayout } from '@dxos/storybook-utils';
10
+ import { withTheme } from '@dxos/react-ui/testing';
12
11
 
13
- import { RecoveryCredentialsContainer } from './RecoveryCredentialsContainer';
14
12
  import { ClientPlugin } from '../ClientPlugin';
15
13
  import { translations } from '../translations';
16
14
 
17
- const meta: Meta = {
15
+ import { RecoveryCredentialsContainer } from './RecoveryCredentialsContainer';
16
+
17
+ const meta = {
18
18
  title: 'plugins/plugin-client/RecoveryCredentialsContainer',
19
19
  component: RecoveryCredentialsContainer,
20
20
  decorators: [
21
+ withTheme,
21
22
  withPluginManager({
22
23
  plugins: [
23
24
  ClientPlugin({
24
- onClientInitialized: async (_, client) => {
25
- await client.halo.createIdentity();
26
- },
25
+ onClientInitialized: ({ client }) =>
26
+ Effect.gen(function* () {
27
+ yield* Effect.promise(() => client.halo.createIdentity());
28
+ }),
27
29
  }),
28
- IntentPlugin(),
30
+ OperationPlugin(),
29
31
  ],
30
32
  }),
31
- withTheme,
32
- withLayout(),
33
33
  ],
34
34
  parameters: {
35
35
  layout: 'fullscreen',
36
36
  translations,
37
37
  },
38
- };
38
+ } satisfies Meta<typeof RecoveryCredentialsContainer>;
39
39
 
40
40
  export default meta;
41
41
 
42
- type Story = StoryObj<typeof RecoveryCredentialsContainer>;
42
+ type Story = StoryObj<typeof meta>;
43
43
 
44
44
  export const Default: Story = {};