@dxos/plugin-client 0.8.1-staging.5be625a → 0.8.1-staging.9eaf14f

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 (134) 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-VZ5F6WXE.mjs → chunk-AN7FJKIJ.mjs} +20 -3
  4. package/dist/lib/browser/{chunk-VZ5F6WXE.mjs.map → chunk-AN7FJKIJ.mjs.map} +3 -3
  5. package/dist/lib/browser/chunk-XZ4TQC56.mjs +619 -0
  6. package/dist/lib/browser/chunk-XZ4TQC56.mjs.map +7 -0
  7. package/dist/lib/browser/{client-OE5TVJAO.mjs → client-LV67Q3R7.mjs} +2 -2
  8. package/dist/lib/browser/{client-OE5TVJAO.mjs.map → client-LV67Q3R7.mjs.map} +3 -3
  9. package/dist/lib/browser/index.mjs +45 -16
  10. package/dist/lib/browser/index.mjs.map +2 -2
  11. package/dist/lib/browser/{intent-resolver-SC35ILQN.mjs → intent-resolver-NCISOZW4.mjs} +62 -24
  12. package/dist/lib/browser/intent-resolver-NCISOZW4.mjs.map +7 -0
  13. package/dist/lib/browser/meta.json +1 -1
  14. package/dist/lib/browser/react-surface-J7SZR2J6.mjs +66 -0
  15. package/dist/lib/browser/react-surface-J7SZR2J6.mjs.map +7 -0
  16. package/dist/lib/browser/types.mjs +3 -1
  17. package/dist/lib/node/app-graph-builder-PXOJZJO5.cjs +130 -0
  18. package/dist/lib/node/app-graph-builder-PXOJZJO5.cjs.map +7 -0
  19. package/dist/lib/node/chunk-3JE5BFCT.cjs +644 -0
  20. package/dist/lib/node/chunk-3JE5BFCT.cjs.map +7 -0
  21. package/dist/lib/node/{chunk-2MVZ5CAW.cjs → chunk-FROKBEVH.cjs} +23 -5
  22. package/dist/lib/node/chunk-FROKBEVH.cjs.map +7 -0
  23. package/dist/lib/node/{client-4L2EFL2K.cjs → client-BKTGRBYM.cjs} +5 -5
  24. package/dist/lib/node/{client-4L2EFL2K.cjs.map → client-BKTGRBYM.cjs.map} +3 -3
  25. package/dist/lib/node/index.cjs +45 -16
  26. package/dist/lib/node/index.cjs.map +2 -2
  27. package/dist/lib/node/{intent-resolver-HT7A7YJC.cjs → intent-resolver-U2576ALY.cjs} +72 -35
  28. package/dist/lib/node/intent-resolver-U2576ALY.cjs.map +7 -0
  29. package/dist/lib/node/meta.json +1 -1
  30. package/dist/lib/node/{react-surface-UW35ICXB.cjs → react-surface-BSTIXMER.cjs} +33 -25
  31. package/dist/lib/node/react-surface-BSTIXMER.cjs.map +7 -0
  32. package/dist/lib/node/types.cjs +4 -2
  33. package/dist/lib/node/types.cjs.map +2 -2
  34. package/dist/lib/node-esm/app-graph-builder-KIN6NWFI.mjs +120 -0
  35. package/dist/lib/node-esm/app-graph-builder-KIN6NWFI.mjs.map +7 -0
  36. package/dist/lib/node-esm/{chunk-TBU6HCXG.mjs → chunk-AD5W5QCQ.mjs} +20 -3
  37. package/dist/lib/node-esm/{chunk-TBU6HCXG.mjs.map → chunk-AD5W5QCQ.mjs.map} +3 -3
  38. package/dist/lib/node-esm/chunk-LZN2UNN7.mjs +620 -0
  39. package/dist/lib/node-esm/chunk-LZN2UNN7.mjs.map +7 -0
  40. package/dist/lib/node-esm/{client-M52MGTIR.mjs → client-QQD6WFOB.mjs} +2 -2
  41. package/dist/lib/node-esm/{client-M52MGTIR.mjs.map → client-QQD6WFOB.mjs.map} +3 -3
  42. package/dist/lib/node-esm/index.mjs +45 -16
  43. package/dist/lib/node-esm/index.mjs.map +2 -2
  44. package/dist/lib/node-esm/{intent-resolver-JZLW7ZY3.mjs → intent-resolver-G25U4UGI.mjs} +62 -24
  45. package/dist/lib/node-esm/intent-resolver-G25U4UGI.mjs.map +7 -0
  46. package/dist/lib/node-esm/meta.json +1 -1
  47. package/dist/lib/node-esm/react-surface-ZPI7T4EM.mjs +67 -0
  48. package/dist/lib/node-esm/react-surface-ZPI7T4EM.mjs.map +7 -0
  49. package/dist/lib/node-esm/types.mjs +3 -1
  50. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  51. package/dist/types/src/capabilities/index.d.ts +4 -4
  52. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  53. package/dist/types/src/capabilities/intent-resolver.d.ts +2 -3
  54. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  55. package/dist/types/src/capabilities/react-surface.d.ts +3 -2
  56. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  57. package/dist/types/src/components/DevicesContainer.d.ts +5 -0
  58. package/dist/types/src/components/DevicesContainer.d.ts.map +1 -0
  59. package/dist/types/src/components/DevicesContainer.stories.d.ts +8 -0
  60. package/dist/types/src/components/DevicesContainer.stories.d.ts.map +1 -0
  61. package/dist/types/src/components/ProfileContainer.d.ts +3 -0
  62. package/dist/types/src/components/ProfileContainer.d.ts.map +1 -0
  63. package/dist/types/src/components/ProfileContainer.stories.d.ts +8 -0
  64. package/dist/types/src/components/ProfileContainer.stories.d.ts.map +1 -0
  65. package/dist/types/src/components/RecoveryCodeDialog.d.ts +1 -1
  66. package/dist/types/src/components/RecoveryCodeDialog.d.ts.map +1 -1
  67. package/dist/types/src/components/RecoveryCredentialsContainer.d.ts +4 -0
  68. package/dist/types/src/components/RecoveryCredentialsContainer.d.ts.map +1 -0
  69. package/dist/types/src/components/RecoveryCredentialsContainer.stories.d.ts +8 -0
  70. package/dist/types/src/components/RecoveryCredentialsContainer.stories.d.ts.map +1 -0
  71. package/dist/types/src/components/ResetDialog.d.ts +7 -0
  72. package/dist/types/src/components/ResetDialog.d.ts.map +1 -0
  73. package/dist/types/src/components/ResetDialog.stories.d.ts +10 -0
  74. package/dist/types/src/components/ResetDialog.stories.d.ts.map +1 -0
  75. package/dist/types/src/components/index.d.ts +4 -2
  76. package/dist/types/src/components/index.d.ts.map +1 -1
  77. package/dist/types/src/translations.d.ts +28 -1
  78. package/dist/types/src/translations.d.ts.map +1 -1
  79. package/dist/types/src/types.d.ts +17 -1
  80. package/dist/types/src/types.d.ts.map +1 -1
  81. package/package.json +26 -19
  82. package/src/ClientPlugin.ts +2 -2
  83. package/src/capabilities/app-graph-builder.ts +62 -6
  84. package/src/capabilities/client.ts +1 -1
  85. package/src/capabilities/intent-resolver.ts +68 -23
  86. package/src/capabilities/react-surface.tsx +32 -24
  87. package/src/components/DevicesContainer.stories.tsx +45 -0
  88. package/src/components/DevicesContainer.tsx +270 -0
  89. package/src/components/ProfileContainer.stories.tsx +29 -0
  90. package/src/components/ProfileContainer.tsx +163 -0
  91. package/src/components/RecoveryCodeDialog.stories.tsx +2 -2
  92. package/src/components/RecoveryCodeDialog.tsx +1 -2
  93. package/src/components/{ManageCredentialsDialog.stories.tsx → RecoveryCredentialsContainer.stories.tsx} +4 -17
  94. package/src/components/RecoveryCredentialsContainer.tsx +74 -0
  95. package/src/components/ResetDialog.stories.tsx +47 -0
  96. package/src/components/ResetDialog.tsx +49 -0
  97. package/src/components/index.ts +4 -2
  98. package/src/translations.ts +45 -9
  99. package/src/types.ts +20 -1
  100. package/dist/lib/browser/app-graph-builder-AYO4YOHF.mjs +0 -44
  101. package/dist/lib/browser/app-graph-builder-AYO4YOHF.mjs.map +0 -7
  102. package/dist/lib/browser/chunk-RVH34XOH.mjs +0 -281
  103. package/dist/lib/browser/chunk-RVH34XOH.mjs.map +0 -7
  104. package/dist/lib/browser/intent-resolver-SC35ILQN.mjs.map +0 -7
  105. package/dist/lib/browser/react-surface-BSCIKZIB.mjs +0 -57
  106. package/dist/lib/browser/react-surface-BSCIKZIB.mjs.map +0 -7
  107. package/dist/lib/node/app-graph-builder-LYPDRPML.cjs +0 -58
  108. package/dist/lib/node/app-graph-builder-LYPDRPML.cjs.map +0 -7
  109. package/dist/lib/node/chunk-2MVZ5CAW.cjs.map +0 -7
  110. package/dist/lib/node/chunk-BGAW4D7O.cjs +0 -309
  111. package/dist/lib/node/chunk-BGAW4D7O.cjs.map +0 -7
  112. package/dist/lib/node/intent-resolver-HT7A7YJC.cjs.map +0 -7
  113. package/dist/lib/node/react-surface-UW35ICXB.cjs.map +0 -7
  114. package/dist/lib/node-esm/app-graph-builder-RAWYJUPF.mjs +0 -45
  115. package/dist/lib/node-esm/app-graph-builder-RAWYJUPF.mjs.map +0 -7
  116. package/dist/lib/node-esm/chunk-IRS6TBYR.mjs +0 -282
  117. package/dist/lib/node-esm/chunk-IRS6TBYR.mjs.map +0 -7
  118. package/dist/lib/node-esm/intent-resolver-JZLW7ZY3.mjs.map +0 -7
  119. package/dist/lib/node-esm/react-surface-6TPONAIZ.mjs +0 -58
  120. package/dist/lib/node-esm/react-surface-6TPONAIZ.mjs.map +0 -7
  121. package/dist/types/src/components/IdentityDialog.d.ts +0 -5
  122. package/dist/types/src/components/IdentityDialog.d.ts.map +0 -1
  123. package/dist/types/src/components/ManageCredentialsDialog.d.ts +0 -4
  124. package/dist/types/src/components/ManageCredentialsDialog.d.ts.map +0 -1
  125. package/dist/types/src/components/ManageCredentialsDialog.stories.d.ts +0 -8
  126. package/dist/types/src/components/ManageCredentialsDialog.stories.d.ts.map +0 -1
  127. package/dist/types/src/components/RecoverySetupDialog.d.ts +0 -4
  128. package/dist/types/src/components/RecoverySetupDialog.d.ts.map +0 -1
  129. package/dist/types/src/components/RecoverySetupDialog.stories.d.ts +0 -8
  130. package/dist/types/src/components/RecoverySetupDialog.stories.d.ts.map +0 -1
  131. package/src/components/IdentityDialog.tsx +0 -75
  132. package/src/components/ManageCredentialsDialog.tsx +0 -64
  133. package/src/components/RecoverySetupDialog.stories.tsx +0 -77
  134. package/src/components/RecoverySetupDialog.tsx +0 -52
@@ -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.5be625a",
3
+ "version": "0.8.1-staging.9eaf14f",
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.5be625a",
38
- "@dxos/config": "0.8.1-staging.5be625a",
39
- "@dxos/echo-schema": "0.8.1-staging.5be625a",
40
- "@dxos/echo-signals": "0.8.1-staging.5be625a",
41
- "@dxos/invariant": "0.8.1-staging.5be625a",
42
- "@dxos/local-storage": "0.8.1-staging.5be625a",
43
- "@dxos/log": "0.8.1-staging.5be625a",
44
- "@dxos/plugin-graph": "0.8.1-staging.5be625a",
45
- "@dxos/plugin-observability": "0.8.1-staging.5be625a",
46
- "@dxos/shell": "0.8.1-staging.5be625a",
47
- "@dxos/react-client": "0.8.1-staging.5be625a",
48
- "@dxos/util": "0.8.1-staging.5be625a"
37
+ "react-qr-rounded": "^1.0.0",
38
+ "@dxos/app-framework": "0.8.1-staging.9eaf14f",
39
+ "@dxos/async": "0.8.1-staging.9eaf14f",
40
+ "@dxos/config": "0.8.1-staging.9eaf14f",
41
+ "@dxos/echo-schema": "0.8.1-staging.9eaf14f",
42
+ "@dxos/echo-signals": "0.8.1-staging.9eaf14f",
43
+ "@dxos/invariant": "0.8.1-staging.9eaf14f",
44
+ "@dxos/local-storage": "0.8.1-staging.9eaf14f",
45
+ "@dxos/log": "0.8.1-staging.9eaf14f",
46
+ "@dxos/plugin-graph": "0.8.1-staging.9eaf14f",
47
+ "@dxos/plugin-observability": "0.8.1-staging.9eaf14f",
48
+ "@dxos/react-client": "0.8.1-staging.9eaf14f",
49
+ "@dxos/react-ui-form": "0.8.1-staging.9eaf14f",
50
+ "@dxos/react-ui-pickers": "0.8.1-staging.9eaf14f",
51
+ "@dxos/react-ui-stack": "0.8.1-staging.9eaf14f",
52
+ "@dxos/shell": "0.8.1-staging.9eaf14f",
53
+ "@dxos/util": "0.8.1-staging.9eaf14f"
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.5be625a",
58
- "@dxos/react-ui": "0.8.1-staging.5be625a",
59
- "@dxos/react-ui-theme": "0.8.1-staging.5be625a",
60
- "@dxos/storybook-utils": "0.8.1-staging.5be625a"
63
+ "@dxos/live-object": "0.8.1-staging.9eaf14f",
64
+ "@dxos/react-ui": "0.8.1-staging.9eaf14f",
65
+ "@dxos/react-ui-theme": "0.8.1-staging.9eaf14f",
66
+ "@dxos/storybook-utils": "0.8.1-staging.9eaf14f"
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.5be625a",
67
- "@dxos/react-ui-theme": "0.8.1-staging.5be625a"
73
+ "@dxos/react-ui": "0.8.1-staging.9eaf14f",
74
+ "@dxos/react-ui-theme": "0.8.1-staging.9eaf14f"
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
  );
@@ -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 = {};