@dxos/plugin-client 0.8.1-staging.391c573 → 0.8.1-staging.97aedb1

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 (176) hide show
  1. package/dist/lib/browser/app-graph-builder-WAS4YZNA.mjs +119 -0
  2. package/dist/lib/browser/app-graph-builder-WAS4YZNA.mjs.map +7 -0
  3. package/dist/lib/browser/{chunk-OLUST5AO.mjs → chunk-4PLF3BEB.mjs} +2 -2
  4. package/dist/lib/browser/{chunk-7DPLXOMO.mjs → chunk-AN7FJKIJ.mjs} +21 -4
  5. package/dist/lib/browser/{chunk-7DPLXOMO.mjs.map → chunk-AN7FJKIJ.mjs.map} +3 -3
  6. package/dist/lib/browser/{chunk-XK4HM5M7.mjs → chunk-BGY6BSUC.mjs} +3 -2
  7. package/dist/lib/browser/{chunk-XK4HM5M7.mjs.map → chunk-BGY6BSUC.mjs.map} +3 -3
  8. package/dist/lib/browser/{chunk-NHIL4T3L.mjs → chunk-MCEXD5XH.mjs} +1 -1
  9. package/dist/lib/browser/{chunk-NHIL4T3L.mjs.map → chunk-MCEXD5XH.mjs.map} +2 -2
  10. package/dist/lib/browser/chunk-XZ4TQC56.mjs +619 -0
  11. package/dist/lib/browser/chunk-XZ4TQC56.mjs.map +7 -0
  12. package/dist/lib/browser/{client-UUGITHCW.mjs → client-LV67Q3R7.mjs} +5 -5
  13. package/dist/lib/browser/{client-UUGITHCW.mjs.map → client-LV67Q3R7.mjs.map} +3 -3
  14. package/dist/lib/browser/index.mjs +51 -22
  15. package/dist/lib/browser/index.mjs.map +2 -2
  16. package/dist/lib/browser/{intent-resolver-AIUHL34E.mjs → intent-resolver-NCISOZW4.mjs} +65 -27
  17. package/dist/lib/browser/intent-resolver-NCISOZW4.mjs.map +7 -0
  18. package/dist/lib/browser/meta.json +1 -1
  19. package/dist/lib/browser/{migrations-XODC625X.mjs → migrations-3DWFOL5Q.mjs} +3 -3
  20. package/dist/lib/browser/{react-context-JBD7Y3SN.mjs → react-context-WEH7SL4I.mjs} +3 -3
  21. package/dist/lib/browser/react-surface-J7SZR2J6.mjs +66 -0
  22. package/dist/lib/browser/react-surface-J7SZR2J6.mjs.map +7 -0
  23. package/dist/lib/browser/{schema-Y7ZNXYSL.mjs → schema-JQAT6Q7S.mjs} +3 -3
  24. package/dist/lib/browser/types.mjs +4 -2
  25. package/dist/lib/node/app-graph-builder-PXOJZJO5.cjs +130 -0
  26. package/dist/lib/node/app-graph-builder-PXOJZJO5.cjs.map +7 -0
  27. package/dist/lib/node/chunk-3JE5BFCT.cjs +644 -0
  28. package/dist/lib/node/chunk-3JE5BFCT.cjs.map +7 -0
  29. package/dist/lib/node/{chunk-OIFPM5ZW.cjs → chunk-DJKWB5L6.cjs} +4 -4
  30. package/dist/lib/node/{chunk-OIFPM5ZW.cjs.map → chunk-DJKWB5L6.cjs.map} +2 -2
  31. package/dist/lib/node/{chunk-TREVKZCJ.cjs → chunk-FROKBEVH.cjs} +25 -7
  32. package/dist/lib/node/chunk-FROKBEVH.cjs.map +7 -0
  33. package/dist/lib/node/{chunk-FR2K56EV.cjs → chunk-W64EOF2B.cjs} +10 -10
  34. package/dist/lib/node/{chunk-T4K27K2F.cjs → chunk-ZVQIICEN.cjs} +9 -8
  35. package/dist/lib/node/{chunk-T4K27K2F.cjs.map → chunk-ZVQIICEN.cjs.map} +3 -3
  36. package/dist/lib/node/{client-5BHSU35T.cjs → client-BKTGRBYM.cjs} +9 -9
  37. package/dist/lib/node/{client-5BHSU35T.cjs.map → client-BKTGRBYM.cjs.map} +3 -3
  38. package/dist/lib/node/index.cjs +70 -41
  39. package/dist/lib/node/index.cjs.map +2 -2
  40. package/dist/lib/node/{intent-resolver-PWCHHNV3.cjs → intent-resolver-U2576ALY.cjs} +81 -44
  41. package/dist/lib/node/intent-resolver-U2576ALY.cjs.map +7 -0
  42. package/dist/lib/node/meta.json +1 -1
  43. package/dist/lib/node/{migrations-YCBZUPWO.cjs → migrations-TGNI4FVL.cjs} +8 -8
  44. package/dist/lib/node/{react-context-MPHNGZHT.cjs → react-context-SF3M3YLR.cjs} +8 -8
  45. package/dist/lib/node/{react-surface-TPISDIHR.cjs → react-surface-BSTIXMER.cjs} +34 -26
  46. package/dist/lib/node/react-surface-BSTIXMER.cjs.map +7 -0
  47. package/dist/lib/node/{schema-NMMCMK64.cjs → schema-INQ72F54.cjs} +8 -8
  48. package/dist/lib/node/types.cjs +5 -3
  49. package/dist/lib/node/types.cjs.map +2 -2
  50. package/dist/lib/node-esm/app-graph-builder-KIN6NWFI.mjs +120 -0
  51. package/dist/lib/node-esm/app-graph-builder-KIN6NWFI.mjs.map +7 -0
  52. package/dist/lib/node-esm/{chunk-QJMF2MWP.mjs → chunk-AD5W5QCQ.mjs} +21 -4
  53. package/dist/lib/node-esm/{chunk-QJMF2MWP.mjs.map → chunk-AD5W5QCQ.mjs.map} +3 -3
  54. package/dist/lib/node-esm/{chunk-XLLNVLWU.mjs → chunk-BP56BGZR.mjs} +2 -2
  55. package/dist/lib/node-esm/{chunk-HO7WDE7C.mjs → chunk-HM7VB4ZV.mjs} +1 -1
  56. package/dist/lib/node-esm/{chunk-HO7WDE7C.mjs.map → chunk-HM7VB4ZV.mjs.map} +2 -2
  57. package/dist/lib/node-esm/{chunk-3OU2ZXLK.mjs → chunk-K3KGGSJZ.mjs} +3 -2
  58. package/dist/lib/node-esm/{chunk-3OU2ZXLK.mjs.map → chunk-K3KGGSJZ.mjs.map} +3 -3
  59. package/dist/lib/node-esm/chunk-LZN2UNN7.mjs +620 -0
  60. package/dist/lib/node-esm/chunk-LZN2UNN7.mjs.map +7 -0
  61. package/dist/lib/node-esm/{client-ZDGFGLX4.mjs → client-QQD6WFOB.mjs} +5 -5
  62. package/dist/lib/node-esm/{client-ZDGFGLX4.mjs.map → client-QQD6WFOB.mjs.map} +3 -3
  63. package/dist/lib/node-esm/index.mjs +51 -22
  64. package/dist/lib/node-esm/index.mjs.map +2 -2
  65. package/dist/lib/node-esm/{intent-resolver-FIXGPH7C.mjs → intent-resolver-G25U4UGI.mjs} +65 -27
  66. package/dist/lib/node-esm/intent-resolver-G25U4UGI.mjs.map +7 -0
  67. package/dist/lib/node-esm/meta.json +1 -1
  68. package/dist/lib/node-esm/{migrations-VIEIPYJW.mjs → migrations-IVGATGZR.mjs} +3 -3
  69. package/dist/lib/node-esm/{react-context-KUEOXWWK.mjs → react-context-EAKKTE5A.mjs} +3 -3
  70. package/dist/lib/node-esm/react-surface-ZPI7T4EM.mjs +67 -0
  71. package/dist/lib/node-esm/react-surface-ZPI7T4EM.mjs.map +7 -0
  72. package/dist/lib/node-esm/{schema-NE5IYLMD.mjs → schema-OK7HY3JJ.mjs} +3 -3
  73. package/dist/lib/node-esm/types.mjs +4 -2
  74. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  75. package/dist/types/src/capabilities/capabilities.d.ts +1 -0
  76. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  77. package/dist/types/src/capabilities/index.d.ts +4 -4
  78. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  79. package/dist/types/src/capabilities/intent-resolver.d.ts +2 -3
  80. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  81. package/dist/types/src/capabilities/react-surface.d.ts +3 -2
  82. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  83. package/dist/types/src/components/DevicesContainer.d.ts +5 -0
  84. package/dist/types/src/components/DevicesContainer.d.ts.map +1 -0
  85. package/dist/types/src/components/DevicesContainer.stories.d.ts +8 -0
  86. package/dist/types/src/components/DevicesContainer.stories.d.ts.map +1 -0
  87. package/dist/types/src/components/ProfileContainer.d.ts +3 -0
  88. package/dist/types/src/components/ProfileContainer.d.ts.map +1 -0
  89. package/dist/types/src/components/ProfileContainer.stories.d.ts +8 -0
  90. package/dist/types/src/components/ProfileContainer.stories.d.ts.map +1 -0
  91. package/dist/types/src/components/RecoveryCodeDialog.d.ts +1 -1
  92. package/dist/types/src/components/RecoveryCodeDialog.d.ts.map +1 -1
  93. package/dist/types/src/components/RecoveryCredentialsContainer.d.ts +4 -0
  94. package/dist/types/src/components/RecoveryCredentialsContainer.d.ts.map +1 -0
  95. package/dist/types/src/components/RecoveryCredentialsContainer.stories.d.ts +8 -0
  96. package/dist/types/src/components/RecoveryCredentialsContainer.stories.d.ts.map +1 -0
  97. package/dist/types/src/components/ResetDialog.d.ts +7 -0
  98. package/dist/types/src/components/ResetDialog.d.ts.map +1 -0
  99. package/dist/types/src/components/ResetDialog.stories.d.ts +10 -0
  100. package/dist/types/src/components/ResetDialog.stories.d.ts.map +1 -0
  101. package/dist/types/src/components/index.d.ts +4 -2
  102. package/dist/types/src/components/index.d.ts.map +1 -1
  103. package/dist/types/src/meta.d.ts +2 -4
  104. package/dist/types/src/meta.d.ts.map +1 -1
  105. package/dist/types/src/translations.d.ts +28 -1
  106. package/dist/types/src/translations.d.ts.map +1 -1
  107. package/dist/types/src/types.d.ts +17 -1
  108. package/dist/types/src/types.d.ts.map +1 -1
  109. package/package.json +26 -19
  110. package/src/ClientPlugin.ts +2 -2
  111. package/src/capabilities/app-graph-builder.ts +62 -6
  112. package/src/capabilities/capabilities.ts +1 -0
  113. package/src/capabilities/client.ts +1 -1
  114. package/src/capabilities/intent-resolver.ts +68 -23
  115. package/src/capabilities/react-surface.tsx +32 -24
  116. package/src/components/DevicesContainer.stories.tsx +45 -0
  117. package/src/components/DevicesContainer.tsx +270 -0
  118. package/src/components/ProfileContainer.stories.tsx +29 -0
  119. package/src/components/ProfileContainer.tsx +163 -0
  120. package/src/components/RecoveryCodeDialog.stories.tsx +2 -2
  121. package/src/components/RecoveryCodeDialog.tsx +1 -2
  122. package/src/components/{ManageCredentialsDialog.stories.tsx → RecoveryCredentialsContainer.stories.tsx} +4 -17
  123. package/src/components/RecoveryCredentialsContainer.tsx +74 -0
  124. package/src/components/ResetDialog.stories.tsx +47 -0
  125. package/src/components/ResetDialog.tsx +49 -0
  126. package/src/components/index.ts +4 -2
  127. package/src/meta.ts +2 -2
  128. package/src/translations.ts +45 -9
  129. package/src/types.ts +20 -1
  130. package/dist/lib/browser/app-graph-builder-ON64R7SO.mjs +0 -44
  131. package/dist/lib/browser/app-graph-builder-ON64R7SO.mjs.map +0 -7
  132. package/dist/lib/browser/chunk-HNJZ74DZ.mjs +0 -281
  133. package/dist/lib/browser/chunk-HNJZ74DZ.mjs.map +0 -7
  134. package/dist/lib/browser/intent-resolver-AIUHL34E.mjs.map +0 -7
  135. package/dist/lib/browser/react-surface-QGPWIUFR.mjs +0 -57
  136. package/dist/lib/browser/react-surface-QGPWIUFR.mjs.map +0 -7
  137. package/dist/lib/node/app-graph-builder-RW7ESEX3.cjs +0 -58
  138. package/dist/lib/node/app-graph-builder-RW7ESEX3.cjs.map +0 -7
  139. package/dist/lib/node/chunk-TREVKZCJ.cjs.map +0 -7
  140. package/dist/lib/node/chunk-UTG3UR3N.cjs +0 -309
  141. package/dist/lib/node/chunk-UTG3UR3N.cjs.map +0 -7
  142. package/dist/lib/node/intent-resolver-PWCHHNV3.cjs.map +0 -7
  143. package/dist/lib/node/react-surface-TPISDIHR.cjs.map +0 -7
  144. package/dist/lib/node-esm/app-graph-builder-TDYRWNI7.mjs +0 -45
  145. package/dist/lib/node-esm/app-graph-builder-TDYRWNI7.mjs.map +0 -7
  146. package/dist/lib/node-esm/chunk-SHJBU4QR.mjs +0 -282
  147. package/dist/lib/node-esm/chunk-SHJBU4QR.mjs.map +0 -7
  148. package/dist/lib/node-esm/intent-resolver-FIXGPH7C.mjs.map +0 -7
  149. package/dist/lib/node-esm/react-surface-KBROL4VH.mjs +0 -58
  150. package/dist/lib/node-esm/react-surface-KBROL4VH.mjs.map +0 -7
  151. package/dist/types/src/components/IdentityDialog.d.ts +0 -5
  152. package/dist/types/src/components/IdentityDialog.d.ts.map +0 -1
  153. package/dist/types/src/components/ManageCredentialsDialog.d.ts +0 -4
  154. package/dist/types/src/components/ManageCredentialsDialog.d.ts.map +0 -1
  155. package/dist/types/src/components/ManageCredentialsDialog.stories.d.ts +0 -8
  156. package/dist/types/src/components/ManageCredentialsDialog.stories.d.ts.map +0 -1
  157. package/dist/types/src/components/RecoverySetupDialog.d.ts +0 -4
  158. package/dist/types/src/components/RecoverySetupDialog.d.ts.map +0 -1
  159. package/dist/types/src/components/RecoverySetupDialog.stories.d.ts +0 -8
  160. package/dist/types/src/components/RecoverySetupDialog.stories.d.ts.map +0 -1
  161. package/src/components/IdentityDialog.tsx +0 -75
  162. package/src/components/ManageCredentialsDialog.tsx +0 -64
  163. package/src/components/RecoverySetupDialog.stories.tsx +0 -77
  164. package/src/components/RecoverySetupDialog.tsx +0 -52
  165. /package/dist/lib/browser/{chunk-OLUST5AO.mjs.map → chunk-4PLF3BEB.mjs.map} +0 -0
  166. /package/dist/lib/browser/{migrations-XODC625X.mjs.map → migrations-3DWFOL5Q.mjs.map} +0 -0
  167. /package/dist/lib/browser/{react-context-JBD7Y3SN.mjs.map → react-context-WEH7SL4I.mjs.map} +0 -0
  168. /package/dist/lib/browser/{schema-Y7ZNXYSL.mjs.map → schema-JQAT6Q7S.mjs.map} +0 -0
  169. /package/dist/lib/node/{chunk-FR2K56EV.cjs.map → chunk-W64EOF2B.cjs.map} +0 -0
  170. /package/dist/lib/node/{migrations-YCBZUPWO.cjs.map → migrations-TGNI4FVL.cjs.map} +0 -0
  171. /package/dist/lib/node/{react-context-MPHNGZHT.cjs.map → react-context-SF3M3YLR.cjs.map} +0 -0
  172. /package/dist/lib/node/{schema-NMMCMK64.cjs.map → schema-INQ72F54.cjs.map} +0 -0
  173. /package/dist/lib/node-esm/{chunk-XLLNVLWU.mjs.map → chunk-BP56BGZR.mjs.map} +0 -0
  174. /package/dist/lib/node-esm/{migrations-VIEIPYJW.mjs.map → migrations-IVGATGZR.mjs.map} +0 -0
  175. /package/dist/lib/node-esm/{react-context-KUEOXWWK.mjs.map → react-context-EAKKTE5A.mjs.map} +0 -0
  176. /package/dist/lib/node-esm/{schema-NE5IYLMD.mjs.map → schema-OK7HY3JJ.mjs.map} +0 -0
@@ -1,6 +1,4 @@
1
+ import { type PluginMeta } from '@dxos/app-framework';
1
2
  export declare const CLIENT_PLUGIN = "dxos.org/plugin/client";
2
- export declare const meta: {
3
- id: string;
4
- name: string;
5
- };
3
+ export declare const meta: PluginMeta;
6
4
  //# sourceMappingURL=meta.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"meta.d.ts","sourceRoot":"","sources":["../../../src/meta.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,aAAa,2BAA2B,CAAC;AAEtD,eAAO,MAAM,IAAI;;;CAGK,CAAC"}
1
+ {"version":3,"file":"meta.d.ts","sourceRoot":"","sources":["../../../src/meta.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,eAAO,MAAM,aAAa,2BAA2B,CAAC;AAEtD,eAAO,MAAM,IAAI,EAAE,UAGlB,CAAC"}
@@ -1,8 +1,35 @@
1
1
  declare const _default: {
2
2
  'en-US': {
3
3
  "dxos.org/plugin/client": {
4
- 'open shell label': string;
4
+ 'account label': string;
5
+ 'profile label': string;
6
+ 'profile description': string;
7
+ 'devices label': string;
8
+ 'devices verbose label': string;
9
+ 'add device description': string;
10
+ 'devices description': string;
11
+ 'create device invitation label': string;
12
+ 'qr code description': string;
13
+ 'security label': string;
14
+ 'reset device description': string;
15
+ 'join new identity description': string;
16
+ 'recover identity description': string;
17
+ 'danger zone title': string;
18
+ 'danger zone description': string;
19
+ 'display name label': string;
20
+ 'display name description': string;
21
+ 'display name input placeholder': string;
22
+ 'icon label': string;
23
+ 'icon description': string;
24
+ 'hue label': string;
25
+ 'hue description': string;
26
+ 'did label': string;
27
+ 'did description': string;
28
+ 'open user account label': string;
5
29
  'manage credentials dialog title': string;
30
+ 'credentials list label': string;
31
+ 'no credentials title': string;
32
+ 'no credentials message': string;
6
33
  'recovery setup dialog title': string;
7
34
  'recovery setup dialog description': string;
8
35
  'create passkey label': string;
@@ -1 +1 @@
1
- {"version":3,"file":"translations.d.ts","sourceRoot":"","sources":["../../../src/translations.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAMA,wBAyBE"}
1
+ {"version":3,"file":"translations.d.ts","sourceRoot":"","sources":["../../../src/translations.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,wBA6DE"}
@@ -51,7 +51,7 @@ export declare namespace ClientAction {
51
51
  readonly _tag: S.tag<"dxos.org/plugin/client/action/reset-storage">;
52
52
  } & {
53
53
  input: S.Struct<{
54
- target: S.optional<typeof S.String>;
54
+ mode: S.optional<typeof S.String>;
55
55
  }>;
56
56
  output: typeof S.Void;
57
57
  }>;
@@ -89,6 +89,16 @@ export declare namespace ClientAction {
89
89
  }>;
90
90
  export class RedeemPasskey extends RedeemPasskey_base {
91
91
  }
92
+ const RedeemToken_base: S.TaggedClass<RedeemToken, "dxos.org/plugin/client/action/redeem-token", {
93
+ readonly _tag: S.tag<"dxos.org/plugin/client/action/redeem-token">;
94
+ } & {
95
+ input: S.Struct<{
96
+ token: typeof S.String;
97
+ }>;
98
+ output: typeof S.Void;
99
+ }>;
100
+ export class RedeemToken extends RedeemToken_base {
101
+ }
92
102
  export {};
93
103
  }
94
104
  export type ClientPluginOptions = ClientOptions & {
@@ -111,4 +121,10 @@ export type ClientPluginOptions = ClientOptions & {
111
121
  target?: string;
112
122
  }) => MaybePromise<void>;
113
123
  };
124
+ export declare namespace Account {
125
+ const id = "!dxos.org.plugin.client.account";
126
+ const Profile = "dxos.org.plugin.client.account.profile";
127
+ const Devices = "dxos.org.plugin.client.account.devices";
128
+ const Security = "dxos.org.plugin.client.account.security";
129
+ }
114
130
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,CAAC,EAAE,MAAM,mBAAmB,CAAC;AACtC,OAAO,EAAE,KAAK,MAAM,EAAE,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAkB/C,yBAAiB,YAAY,CAAC;;;;;;;;;;;;;;;;;IAC5B,MAAM,OAAO,cAAe,SAAQ,mBAKlC;KAAG;;;;;;;;;IAEL,MAAM,OAAO,YAAa,SAAQ,iBAKhC;KAAG;;;;;;;IAEL,MAAM,OAAO,aAAc,SAAQ,kBAGjC;KAAG;;;;;;;IAEL,MAAM,OAAO,eAAgB,SAAQ,oBAGnC;KAAG;;;;;;;;;IAEL,MAAM,OAAO,YAAa,SAAQ,iBAKhC;KAAG;;;;;;;IAEL,MAAM,OAAO,WAAY,SAAQ,gBAG/B;KAAG;;;;;;;IAEL,MAAM,OAAO,kBAAmB,SAAQ,uBAGtC;KAAG;;;;;;;IAEL,MAAM,OAAO,aAAc,SAAQ,kBAGjC;KAAG;;;;;;;IAEL,MAAM,OAAO,aAAc,SAAQ,kBAGjC;KAAG;;CACN;AAED,MAAM,MAAM,mBAAmB,GAAG,aAAa,GAAG;IAChD;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;OAEG;IACH,mBAAmB,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC;IAEtF;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC;CAC/D,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,CAAC,EAAE,MAAM,mBAAmB,CAAC;AACtC,OAAO,EAAE,KAAK,MAAM,EAAE,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAkB/C,yBAAiB,YAAY,CAAC;;;;;;;;;;;;;;;;;IAC5B,MAAM,OAAO,cAAe,SAAQ,mBAKlC;KAAG;;;;;;;;;IAEL,MAAM,OAAO,YAAa,SAAQ,iBAKhC;KAAG;;;;;;;IAEL,MAAM,OAAO,aAAc,SAAQ,kBAGjC;KAAG;;;;;;;IAEL,MAAM,OAAO,eAAgB,SAAQ,oBAGnC;KAAG;;;;;;;;;IAEL,MAAM,OAAO,YAAa,SAAQ,iBAKhC;KAAG;;;;;;;IAEL,MAAM,OAAO,WAAY,SAAQ,gBAG/B;KAAG;;;;;;;IAEL,MAAM,OAAO,kBAAmB,SAAQ,uBAGtC;KAAG;;;;;;;IAEL,MAAM,OAAO,aAAc,SAAQ,kBAGjC;KAAG;;;;;;;IAEL,MAAM,OAAO,aAAc,SAAQ,kBAGjC;KAAG;;;;;;;;;IAEL,MAAM,OAAO,WAAY,SAAQ,gBAK/B;KAAG;;CACN;AAED,MAAM,MAAM,mBAAmB,GAAG,aAAa,GAAG;IAChD;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;OAEG;IACH,mBAAmB,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC;IAEtF;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC;CAC/D,CAAC;AAEF,yBAAiB,OAAO,CAAC;IAKhB,MAAM,EAAE,oCAAY,CAAC;IAErB,MAAM,OAAO,2CAAmB,CAAC;IACjC,MAAM,OAAO,2CAAmB,CAAC;IACjC,MAAM,QAAQ,4CAAoB,CAAC;CAC3C"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/plugin-client",
3
- "version": "0.8.1-staging.391c573",
3
+ "version": "0.8.1-staging.97aedb1",
4
4
  "description": "DXOS Surface plugin for DXOS Client",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -34,37 +34,44 @@
34
34
  ],
35
35
  "dependencies": {
36
36
  "@preact/signals-core": "^1.6.0",
37
- "@dxos/app-framework": "0.8.1-staging.391c573",
38
- "@dxos/config": "0.8.1-staging.391c573",
39
- "@dxos/echo-signals": "0.8.1-staging.391c573",
40
- "@dxos/invariant": "0.8.1-staging.391c573",
41
- "@dxos/echo-schema": "0.8.1-staging.391c573",
42
- "@dxos/local-storage": "0.8.1-staging.391c573",
43
- "@dxos/plugin-graph": "0.8.1-staging.391c573",
44
- "@dxos/plugin-observability": "0.8.1-staging.391c573",
45
- "@dxos/log": "0.8.1-staging.391c573",
46
- "@dxos/react-client": "0.8.1-staging.391c573",
47
- "@dxos/shell": "0.8.1-staging.391c573",
48
- "@dxos/util": "0.8.1-staging.391c573"
37
+ "react-qr-rounded": "^1.0.0",
38
+ "@dxos/app-framework": "0.8.1-staging.97aedb1",
39
+ "@dxos/async": "0.8.1-staging.97aedb1",
40
+ "@dxos/config": "0.8.1-staging.97aedb1",
41
+ "@dxos/echo-signals": "0.8.1-staging.97aedb1",
42
+ "@dxos/invariant": "0.8.1-staging.97aedb1",
43
+ "@dxos/local-storage": "0.8.1-staging.97aedb1",
44
+ "@dxos/log": "0.8.1-staging.97aedb1",
45
+ "@dxos/plugin-graph": "0.8.1-staging.97aedb1",
46
+ "@dxos/echo-schema": "0.8.1-staging.97aedb1",
47
+ "@dxos/plugin-observability": "0.8.1-staging.97aedb1",
48
+ "@dxos/react-client": "0.8.1-staging.97aedb1",
49
+ "@dxos/react-ui-form": "0.8.1-staging.97aedb1",
50
+ "@dxos/react-ui-pickers": "0.8.1-staging.97aedb1",
51
+ "@dxos/react-ui-stack": "0.8.1-staging.97aedb1",
52
+ "@dxos/shell": "0.8.1-staging.97aedb1",
53
+ "@dxos/util": "0.8.1-staging.97aedb1"
49
54
  },
50
55
  "devDependencies": {
51
56
  "@phosphor-icons/react": "^2.1.5",
52
57
  "@types/react": "~18.2.0",
53
58
  "@types/react-dom": "~18.2.0",
59
+ "effect": "3.13.3",
54
60
  "react": "~18.2.0",
55
61
  "react-dom": "~18.2.0",
56
62
  "vite": "5.4.7",
57
- "@dxos/live-object": "0.8.1-staging.391c573",
58
- "@dxos/react-ui": "0.8.1-staging.391c573",
59
- "@dxos/react-ui-theme": "0.8.1-staging.391c573",
60
- "@dxos/storybook-utils": "0.8.1-staging.391c573"
63
+ "@dxos/live-object": "0.8.1-staging.97aedb1",
64
+ "@dxos/react-ui-theme": "0.8.1-staging.97aedb1",
65
+ "@dxos/react-ui": "0.8.1-staging.97aedb1",
66
+ "@dxos/storybook-utils": "0.8.1-staging.97aedb1"
61
67
  },
62
68
  "peerDependencies": {
63
69
  "@phosphor-icons/react": "^2.1.5",
70
+ "effect": "3.13.3",
64
71
  "react": "~18.2.0",
65
72
  "react-dom": "~18.2.0",
66
- "@dxos/react-ui": "0.8.1-staging.391c573",
67
- "@dxos/react-ui-theme": "0.8.1-staging.391c573"
73
+ "@dxos/react-ui": "0.8.1-staging.97aedb1",
74
+ "@dxos/react-ui-theme": "0.8.1-staging.97aedb1"
68
75
  },
69
76
  "publishConfig": {
70
77
  "access": "public"
@@ -57,7 +57,7 @@ export const ClientPlugin = ({
57
57
  defineModule({
58
58
  id: `${meta.id}/module/react-surface`,
59
59
  activatesOn: Events.SetupReactSurface,
60
- activate: () => ReactSurface({ createInvitationUrl }),
60
+ activate: () => ReactSurface({ createInvitationUrl, onReset }),
61
61
  }),
62
62
  defineModule({
63
63
  id: `${meta.id}/module/app-graph-builder`,
@@ -67,7 +67,7 @@ export const ClientPlugin = ({
67
67
  defineModule({
68
68
  id: `${meta.id}/module/intent-resolver`,
69
69
  activatesOn: Events.SetupIntentResolver,
70
- activate: (context) => IntentResolver({ context, onReset }),
70
+ activate: (context) => IntentResolver({ context }),
71
71
  }),
72
72
  defineModule({
73
73
  id: `${meta.id}/module/translations`,
@@ -4,10 +4,12 @@
4
4
 
5
5
  import { createIntent } from '@dxos/app-framework';
6
6
  import { Capabilities, contributes, type PluginsContext } from '@dxos/app-framework';
7
- import { createExtension, type Node } from '@dxos/plugin-graph';
7
+ import { createExtension, toSignal, type Node } from '@dxos/plugin-graph';
8
+ import { ConnectionState } from '@dxos/react-client/mesh';
8
9
 
10
+ import { ClientCapabilities } from './capabilities';
9
11
  import { CLIENT_PLUGIN } from '../meta';
10
- import { ClientAction } from '../types';
12
+ import { Account, ClientAction } from '../types';
11
13
 
12
14
  export default (context: PluginsContext) =>
13
15
  contributes(
@@ -17,23 +19,77 @@ export default (context: PluginsContext) =>
17
19
  filter: (node): node is Node<null> => node.id === 'root',
18
20
  actions: () => [
19
21
  {
20
- id: `${CLIENT_PLUGIN}/open-shell`,
22
+ id: `${CLIENT_PLUGIN}/open-user-account`,
21
23
  data: async () => {
22
24
  const { dispatchPromise: dispatch } = context.requestCapability(Capabilities.IntentDispatcher);
23
25
  await dispatch(createIntent(ClientAction.ShareIdentity));
24
26
  },
25
27
  properties: {
26
- label: ['open shell label', { ns: CLIENT_PLUGIN }],
27
- icon: 'ph--address-book--regular',
28
+ label: ['open user account label', { ns: CLIENT_PLUGIN }],
29
+ icon: 'ph--user--regular',
28
30
  keyBinding: {
29
31
  macos: 'meta+shift+.',
30
32
  // TODO(wittjosiah): Test on windows to see if it behaves the same as linux.
31
33
  windows: 'alt+shift+.',
32
34
  linux: 'alt+shift+>',
33
35
  },
34
- testId: 'clientPlugin.openShell',
35
36
  },
36
37
  },
37
38
  ],
39
+ connector: () => {
40
+ const client = context.requestCapability(ClientCapabilities.Client);
41
+ const identity = client.halo.identity.get();
42
+ const status = toSignal(
43
+ (onChange) => client.mesh.networkStatus.subscribe(() => onChange()).unsubscribe,
44
+ () => client.mesh.networkStatus.get(),
45
+ );
46
+
47
+ return [
48
+ {
49
+ id: Account.id,
50
+ type: CLIENT_PLUGIN,
51
+ properties: {
52
+ label: ['account label', { ns: CLIENT_PLUGIN }],
53
+ icon: 'ph--user--regular',
54
+ disposition: 'user-account',
55
+ // NOTE: This currently needs to be the identity key because the fallback is generated from hex.
56
+ userId: identity?.identityKey.toHex(),
57
+ hue: identity?.profile?.data?.hue,
58
+ emoji: identity?.profile?.data?.emoji,
59
+ status: status?.swarm === ConnectionState.OFFLINE ? 'error' : 'active',
60
+ },
61
+ nodes: [
62
+ {
63
+ id: Account.Profile,
64
+ data: Account.Profile,
65
+ type: CLIENT_PLUGIN,
66
+ properties: {
67
+ label: ['profile label', { ns: CLIENT_PLUGIN }],
68
+ icon: 'ph--user--regular',
69
+ },
70
+ },
71
+ {
72
+ id: Account.Devices,
73
+ data: Account.Devices,
74
+ type: CLIENT_PLUGIN,
75
+ properties: {
76
+ label: ['devices label', { ns: CLIENT_PLUGIN }],
77
+ icon: 'ph--devices--regular',
78
+ testId: 'clientPlugin.devices',
79
+ },
80
+ },
81
+ {
82
+ id: Account.Security,
83
+ data: Account.Security,
84
+ type: CLIENT_PLUGIN,
85
+ properties: {
86
+ label: ['security label', { ns: CLIENT_PLUGIN }],
87
+ icon: 'ph--key--regular',
88
+ },
89
+ },
90
+ ],
91
+ },
92
+ ];
93
+ },
38
94
  }),
39
95
  );
@@ -12,5 +12,6 @@ import { CLIENT_PLUGIN } from '../meta';
12
12
  export namespace ClientCapabilities {
13
13
  export const Client = defineCapability<Client>(`${CLIENT_PLUGIN}/capability/client`);
14
14
  export const Schema = defineCapability<TypedObject[]>(`${CLIENT_PLUGIN}/capability/schema`);
15
+ export const SchemaWhiteList = defineCapability<TypedObject[]>(`${CLIENT_PLUGIN}/capability/schema-whitelist`);
15
16
  export const Migration = defineCapability<ObjectMigration[]>(`${CLIENT_PLUGIN}/capability/migration`);
16
17
  }
@@ -29,7 +29,7 @@ export default async ({ context, onClientInitialized, ...options }: ClientCapabi
29
29
 
30
30
  const subscription = client.spaces.isReady.subscribe(async (ready) => {
31
31
  if (ready) {
32
- await context.activate(ClientEvents.SpacesReady);
32
+ await context.activatePromise(ClientEvents.SpacesReady);
33
33
  }
34
34
  });
35
35
 
@@ -2,8 +2,11 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
+ import { pipe } from 'effect';
6
+
5
7
  import {
6
8
  Capabilities,
9
+ chain,
7
10
  contributes,
8
11
  createIntent,
9
12
  createResolver,
@@ -16,16 +19,18 @@ import { PublicKey } from '@dxos/react-client';
16
19
  import { type JoinPanelProps } from '@dxos/shell/react';
17
20
 
18
21
  import { ClientCapabilities } from './capabilities';
19
- import { IDENTITY_DIALOG, JOIN_DIALOG, RECOVER_CODE_DIALOG } from '../components';
22
+ import { JOIN_DIALOG, RECOVERY_CODE_DIALOG, RESET_DIALOG } from '../components';
20
23
  import { ClientEvents } from '../events';
21
- import { ClientAction, type ClientPluginOptions } from '../types';
24
+ import { Account, ClientAction } from '../types';
22
25
 
23
- type IntentResolverOptions = Pick<ClientPluginOptions, 'onReset'> & {
26
+ type IntentResolverOptions = {
24
27
  context: PluginsContext;
25
28
  appName?: string;
26
29
  };
27
30
 
28
- export default ({ context, appName = 'Composer', onReset }: IntentResolverOptions) =>
31
+ const RECOVER_IDENTITY_RPC_TIMEOUT = 20_000;
32
+
33
+ export default ({ context, appName = 'Composer' }: IntentResolverOptions) =>
29
34
  contributes(Capabilities.IntentResolver, [
30
35
  createResolver({
31
36
  intent: ClientAction.CreateIdentity,
@@ -34,7 +39,14 @@ export default ({ context, appName = 'Composer', onReset }: IntentResolverOption
34
39
  const client = context.requestCapability(ClientCapabilities.Client);
35
40
  const data = await client.halo.createIdentity();
36
41
  await manager.activate(ClientEvents.IdentityCreated);
37
- return { data, intents: [createIntent(ObservabilityAction.SendEvent, { name: 'identity.create' })] };
42
+ return {
43
+ data,
44
+ intents: [
45
+ createIntent(ObservabilityAction.SendEvent, {
46
+ name: 'identity.create',
47
+ }),
48
+ ],
49
+ };
38
50
  },
39
51
  }),
40
52
  createResolver({
@@ -62,14 +74,19 @@ export default ({ context, appName = 'Composer', onReset }: IntentResolverOption
62
74
  resolve: async () => {
63
75
  return {
64
76
  intents: [
65
- createIntent(LayoutAction.UpdateDialog, {
66
- part: 'dialog',
67
- subject: IDENTITY_DIALOG,
68
- options: {
69
- blockAlign: 'start',
70
- },
77
+ pipe(
78
+ createIntent(LayoutAction.SwitchWorkspace, {
79
+ part: 'workspace',
80
+ subject: Account.id,
81
+ }),
82
+ chain(LayoutAction.Open, {
83
+ part: 'main',
84
+ subject: [Account.Profile],
85
+ }),
86
+ ),
87
+ createIntent(ObservabilityAction.SendEvent, {
88
+ name: 'identity.share',
71
89
  }),
72
- createIntent(ObservabilityAction.SendEvent, { name: 'identity.share' }),
73
90
  ],
74
91
  };
75
92
  },
@@ -96,7 +113,20 @@ export default ({ context, appName = 'Composer', onReset }: IntentResolverOption
96
113
  createResolver({
97
114
  intent: ClientAction.ResetStorage,
98
115
  resolve: async (data) => {
99
- await onReset?.({ target: data.target });
116
+ return {
117
+ intents: [
118
+ createIntent(LayoutAction.UpdateDialog, {
119
+ part: 'dialog',
120
+ subject: RESET_DIALOG,
121
+ options: {
122
+ blockAlign: 'start',
123
+ props: {
124
+ mode: data.mode ?? 'reset storage',
125
+ },
126
+ },
127
+ }),
128
+ ],
129
+ };
100
130
  },
101
131
  }),
102
132
  createResolver({
@@ -118,7 +148,7 @@ export default ({ context, appName = 'Composer', onReset }: IntentResolverOption
118
148
  intents: [
119
149
  createIntent(LayoutAction.UpdateDialog, {
120
150
  part: 'dialog',
121
- subject: RECOVER_CODE_DIALOG,
151
+ subject: RECOVERY_CODE_DIALOG,
122
152
  options: {
123
153
  blockAlign: 'start',
124
154
  type: 'alert',
@@ -190,16 +220,31 @@ export default ({ context, appName = 'Composer', onReset }: IntentResolverOption
190
220
  },
191
221
  });
192
222
  const lookupKey = PublicKey.from(new Uint8Array((credential as any).response.userHandle));
193
- await client.services.services.IdentityService.recoverIdentity({
194
- external: {
195
- lookupKey,
196
- deviceKey,
197
- controlFeedKey,
198
- signature: Buffer.from((credential as any).response.signature),
199
- clientDataJson: Buffer.from((credential as any).response.clientDataJSON),
200
- authenticatorData: Buffer.from((credential as any).response.authenticatorData),
223
+ await client.services.services.IdentityService.recoverIdentity(
224
+ {
225
+ external: {
226
+ lookupKey,
227
+ deviceKey,
228
+ controlFeedKey,
229
+ signature: Buffer.from((credential as any).response.signature),
230
+ clientDataJson: Buffer.from((credential as any).response.clientDataJSON),
231
+ authenticatorData: Buffer.from((credential as any).response.authenticatorData),
232
+ },
201
233
  },
202
- });
234
+ { timeout: RECOVER_IDENTITY_RPC_TIMEOUT },
235
+ );
236
+ },
237
+ }),
238
+ createResolver({
239
+ intent: ClientAction.RedeemToken,
240
+ resolve: async (data) => {
241
+ const client = context.requestCapability(ClientCapabilities.Client);
242
+ // TODO(wittjosiah): This needs a proper api.
243
+ invariant(client.services.services.IdentityService, 'IdentityService not available');
244
+ await client.services.services.IdentityService.recoverIdentity(
245
+ { token: data.token },
246
+ { timeout: RECOVER_IDENTITY_RPC_TIMEOUT },
247
+ );
203
248
  },
204
249
  }),
205
250
  ]);
@@ -5,32 +5,46 @@
5
5
  import React from 'react';
6
6
 
7
7
  import { createSurface, Capabilities, contributes } from '@dxos/app-framework';
8
- import { type IdentityPanelProps, type JoinPanelProps } from '@dxos/shell/react';
8
+ import { type JoinPanelProps } from '@dxos/shell/react';
9
9
 
10
10
  import {
11
- IDENTITY_DIALOG,
12
- IdentityDialog,
11
+ DevicesContainer,
13
12
  JOIN_DIALOG,
14
13
  JoinDialog,
15
- RECOVER_CODE_DIALOG,
16
- RECOVER_SETUP_DIALOG,
14
+ ProfileContainer,
15
+ RECOVERY_CODE_DIALOG,
17
16
  RecoveryCodeDialog,
18
- RecoverySetupDialog,
17
+ RecoveryCredentialsContainer,
18
+ RESET_DIALOG,
19
+ ResetDialog,
20
+ type ResetDialogProps,
19
21
  type RecoveryCodeDialogProps,
20
22
  } from '../components';
21
- import { MANAGE_CREDENTIALS_DIALOG, ManageCredentialsDialog } from '../components/ManageCredentialsDialog';
23
+ import { Account, type ClientPluginOptions } from '../types';
22
24
 
23
- type ReactSurfaceOptions = {
25
+ type ReactSurfaceOptions = Pick<ClientPluginOptions, 'onReset'> & {
24
26
  createInvitationUrl: (invitationCode: string) => string;
25
27
  };
26
28
 
27
- export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
29
+ export default ({ createInvitationUrl, onReset }: ReactSurfaceOptions) =>
28
30
  contributes(Capabilities.ReactSurface, [
29
31
  createSurface({
30
- id: IDENTITY_DIALOG,
31
- role: 'dialog',
32
- filter: (data): data is { props: IdentityPanelProps } => data.component === IDENTITY_DIALOG,
33
- component: ({ data }) => <IdentityDialog {...data.props} createInvitationUrl={createInvitationUrl} />,
32
+ id: Account.Profile,
33
+ role: 'article',
34
+ filter: (data): data is any => data.subject === Account.Profile,
35
+ component: () => <ProfileContainer />,
36
+ }),
37
+ createSurface({
38
+ id: Account.Devices,
39
+ role: 'article',
40
+ filter: (data): data is any => data.subject === Account.Devices,
41
+ component: ({ data }) => <DevicesContainer createInvitationUrl={createInvitationUrl} />,
42
+ }),
43
+ createSurface({
44
+ id: Account.Security,
45
+ role: 'article',
46
+ filter: (data): data is any => data.subject === Account.Security,
47
+ component: () => <RecoveryCredentialsContainer />,
34
48
  }),
35
49
  createSurface({
36
50
  id: JOIN_DIALOG,
@@ -39,21 +53,15 @@ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
39
53
  component: ({ data }) => <JoinDialog {...data.props} />,
40
54
  }),
41
55
  createSurface({
42
- id: RECOVER_CODE_DIALOG,
56
+ id: RECOVERY_CODE_DIALOG,
43
57
  role: 'dialog',
44
- filter: (data): data is { props: RecoveryCodeDialogProps } => data.component === RECOVER_CODE_DIALOG,
58
+ filter: (data): data is { props: RecoveryCodeDialogProps } => data.component === RECOVERY_CODE_DIALOG,
45
59
  component: ({ data }) => <RecoveryCodeDialog {...data.props} />,
46
60
  }),
47
61
  createSurface({
48
- id: RECOVER_SETUP_DIALOG,
49
- role: 'dialog',
50
- filter: (data): data is any => data.component === RECOVER_SETUP_DIALOG,
51
- component: () => <RecoverySetupDialog />,
52
- }),
53
- createSurface({
54
- id: MANAGE_CREDENTIALS_DIALOG,
62
+ id: RESET_DIALOG,
55
63
  role: 'dialog',
56
- filter: (data): data is any => data.component === MANAGE_CREDENTIALS_DIALOG,
57
- component: () => <ManageCredentialsDialog />,
64
+ filter: (data): data is { props: ResetDialogProps } => data.component === RESET_DIALOG,
65
+ component: ({ data }) => <ResetDialog {...data.props} onReset={onReset} />,
58
66
  }),
59
67
  ]);
@@ -0,0 +1,45 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import '@dxos-theme';
6
+
7
+ import { type StoryObj, type Meta } from '@storybook/react';
8
+
9
+ import { IntentPlugin } from '@dxos/app-framework';
10
+ import { withPluginManager } from '@dxos/app-framework/testing';
11
+ import { osTranslations } from '@dxos/shell/react';
12
+ import { withTheme, withLayout } from '@dxos/storybook-utils';
13
+
14
+ import { DevicesContainer } from './DevicesContainer';
15
+ import { ClientPlugin } from '../ClientPlugin';
16
+ import translations from '../translations';
17
+
18
+ const meta: Meta = {
19
+ title: 'plugins/plugin-client/DevicesContainer',
20
+ component: DevicesContainer,
21
+ decorators: [
22
+ withPluginManager({
23
+ plugins: [
24
+ IntentPlugin(),
25
+ ClientPlugin({
26
+ onClientInitialized: async (_, client) => {
27
+ await client.halo.createIdentity();
28
+ },
29
+ }),
30
+ ],
31
+ }),
32
+ withTheme,
33
+ withLayout({ tooltips: true }),
34
+ ],
35
+ parameters: {
36
+ layout: 'fullscreen',
37
+ translations: [...translations, osTranslations],
38
+ },
39
+ };
40
+
41
+ export default meta;
42
+
43
+ type Story = StoryObj<typeof DevicesContainer>;
44
+
45
+ export const Default: Story = {};