@dxos/plugin-client 0.7.4 → 0.7.5-feature-compute.4d9d99a

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 (132) hide show
  1. package/dist/lib/browser/app-graph-builder-6LOTDB4T.mjs +44 -0
  2. package/dist/lib/browser/app-graph-builder-6LOTDB4T.mjs.map +7 -0
  3. package/dist/lib/browser/chunk-6IF6PREG.mjs +158 -0
  4. package/dist/lib/browser/chunk-6IF6PREG.mjs.map +7 -0
  5. package/dist/lib/browser/chunk-E3OUNOEL.mjs +76 -0
  6. package/dist/lib/browser/chunk-E3OUNOEL.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-NHIL4T3L.mjs +12 -0
  8. package/dist/lib/browser/chunk-NHIL4T3L.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-R4Q6H7RD.mjs +18 -0
  10. package/dist/lib/browser/chunk-R4Q6H7RD.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-SVBQRT7I.mjs +17 -0
  12. package/dist/lib/browser/chunk-SVBQRT7I.mjs.map +7 -0
  13. package/dist/lib/browser/client-25GYH6TN.mjs +45 -0
  14. package/dist/lib/browser/client-25GYH6TN.mjs.map +7 -0
  15. package/dist/lib/browser/index.mjs +70 -428
  16. package/dist/lib/browser/index.mjs.map +4 -4
  17. package/dist/lib/browser/intent-resolver-IWWLWOZD.mjs +132 -0
  18. package/dist/lib/browser/intent-resolver-IWWLWOZD.mjs.map +7 -0
  19. package/dist/lib/browser/meta.json +1 -1
  20. package/dist/lib/browser/react-context-M3RT6SSG.mjs +24 -0
  21. package/dist/lib/browser/react-context-M3RT6SSG.mjs.map +7 -0
  22. package/dist/lib/browser/react-surface-XXONPG5T.mjs +41 -0
  23. package/dist/lib/browser/react-surface-XXONPG5T.mjs.map +7 -0
  24. package/dist/lib/browser/types.mjs +8 -0
  25. package/dist/lib/node/app-graph-builder-JCND3P6G.cjs +58 -0
  26. package/dist/lib/node/app-graph-builder-JCND3P6G.cjs.map +7 -0
  27. package/dist/lib/node/chunk-3OB25QN2.cjs +36 -0
  28. package/dist/lib/node/chunk-3OB25QN2.cjs.map +7 -0
  29. package/dist/lib/node/chunk-IXVWJCYB.cjs +37 -0
  30. package/dist/lib/node/chunk-IXVWJCYB.cjs.map +7 -0
  31. package/dist/lib/node/chunk-N3U7KVO3.cjs +186 -0
  32. package/dist/lib/node/chunk-N3U7KVO3.cjs.map +7 -0
  33. package/dist/lib/node/chunk-NVYWMDF3.cjs +95 -0
  34. package/dist/lib/node/chunk-NVYWMDF3.cjs.map +7 -0
  35. package/dist/lib/node/{meta.cjs → chunk-OIFPM5ZW.cjs} +12 -11
  36. package/dist/lib/node/chunk-OIFPM5ZW.cjs.map +7 -0
  37. package/dist/lib/node/client-52L4TUYU.cjs +59 -0
  38. package/dist/lib/node/client-52L4TUYU.cjs.map +7 -0
  39. package/dist/lib/node/index.cjs +65 -416
  40. package/dist/lib/node/index.cjs.map +4 -4
  41. package/dist/lib/node/intent-resolver-H3Y64MIP.cjs +140 -0
  42. package/dist/lib/node/intent-resolver-H3Y64MIP.cjs.map +7 -0
  43. package/dist/lib/node/meta.json +1 -1
  44. package/dist/lib/node/react-context-B2DNULH4.cjs +48 -0
  45. package/dist/lib/node/react-context-B2DNULH4.cjs.map +7 -0
  46. package/dist/lib/node/react-surface-7USN5NOO.cjs +62 -0
  47. package/dist/lib/node/react-surface-7USN5NOO.cjs.map +7 -0
  48. package/dist/lib/node/types.cjs +30 -0
  49. package/dist/lib/node/types.cjs.map +7 -0
  50. package/dist/lib/node-esm/app-graph-builder-ZLGKFBLY.mjs +45 -0
  51. package/dist/lib/node-esm/app-graph-builder-ZLGKFBLY.mjs.map +7 -0
  52. package/dist/lib/node-esm/chunk-73M5MK5Q.mjs +19 -0
  53. package/dist/lib/node-esm/chunk-73M5MK5Q.mjs.map +7 -0
  54. package/dist/lib/node-esm/chunk-74T33KTB.mjs +77 -0
  55. package/dist/lib/node-esm/chunk-74T33KTB.mjs.map +7 -0
  56. package/dist/lib/node-esm/chunk-EHGD3UJH.mjs +159 -0
  57. package/dist/lib/node-esm/chunk-EHGD3UJH.mjs.map +7 -0
  58. package/dist/lib/node-esm/chunk-HO7WDE7C.mjs +14 -0
  59. package/dist/lib/node-esm/chunk-HO7WDE7C.mjs.map +7 -0
  60. package/dist/lib/node-esm/chunk-OBGRL3DF.mjs +18 -0
  61. package/dist/lib/node-esm/chunk-OBGRL3DF.mjs.map +7 -0
  62. package/dist/lib/node-esm/client-K52NWOUN.mjs +46 -0
  63. package/dist/lib/node-esm/client-K52NWOUN.mjs.map +7 -0
  64. package/dist/lib/node-esm/index.mjs +70 -428
  65. package/dist/lib/node-esm/index.mjs.map +4 -4
  66. package/dist/lib/node-esm/intent-resolver-JCKD6R6L.mjs +133 -0
  67. package/dist/lib/node-esm/intent-resolver-JCKD6R6L.mjs.map +7 -0
  68. package/dist/lib/node-esm/meta.json +1 -1
  69. package/dist/lib/node-esm/react-context-IGEHJQK5.mjs +25 -0
  70. package/dist/lib/node-esm/react-context-IGEHJQK5.mjs.map +7 -0
  71. package/dist/lib/node-esm/react-surface-CXLBCMPN.mjs +42 -0
  72. package/dist/lib/node-esm/react-surface-CXLBCMPN.mjs.map +7 -0
  73. package/dist/lib/node-esm/types.mjs +9 -0
  74. package/dist/types/src/ClientPlugin.d.ts +2 -36
  75. package/dist/types/src/ClientPlugin.d.ts.map +1 -1
  76. package/dist/types/src/capabilities/app-graph-builder.d.ts +181 -0
  77. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -0
  78. package/dist/types/src/capabilities/capabilities.d.ts +8 -0
  79. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -0
  80. package/dist/types/src/capabilities/client.d.ts +9 -0
  81. package/dist/types/src/capabilities/client.d.ts.map +1 -0
  82. package/dist/types/src/capabilities/index.d.ts +193 -0
  83. package/dist/types/src/capabilities/index.d.ts.map +1 -0
  84. package/dist/types/src/capabilities/intent-resolver.d.ts +8 -0
  85. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -0
  86. package/dist/types/src/capabilities/react-context.d.ts +8 -0
  87. package/dist/types/src/capabilities/react-context.d.ts.map +1 -0
  88. package/dist/types/src/capabilities/react-surface.d.ts +7 -0
  89. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -0
  90. package/dist/types/src/components/IdentityDialog.d.ts +1 -0
  91. package/dist/types/src/components/IdentityDialog.d.ts.map +1 -1
  92. package/dist/types/src/components/JoinDialog.d.ts +1 -0
  93. package/dist/types/src/components/JoinDialog.d.ts.map +1 -1
  94. package/dist/types/src/components/RecoveryCodeDialog.d.ts +1 -0
  95. package/dist/types/src/components/RecoveryCodeDialog.d.ts.map +1 -1
  96. package/dist/types/src/events.d.ts +7 -0
  97. package/dist/types/src/events.d.ts.map +1 -0
  98. package/dist/types/src/index.d.ts +3 -2
  99. package/dist/types/src/index.d.ts.map +1 -1
  100. package/dist/types/src/meta.d.ts +1 -12
  101. package/dist/types/src/meta.d.ts.map +1 -1
  102. package/dist/types/src/types.d.ts +98 -0
  103. package/dist/types/src/types.d.ts.map +1 -0
  104. package/dist/types/tsconfig.tsbuildinfo +1 -0
  105. package/package.json +21 -19
  106. package/src/ClientPlugin.ts +59 -0
  107. package/src/capabilities/app-graph-builder.ts +39 -0
  108. package/src/capabilities/capabilities.ts +15 -0
  109. package/src/capabilities/client.ts +48 -0
  110. package/src/capabilities/index.ts +13 -0
  111. package/src/capabilities/intent-resolver.ts +101 -0
  112. package/src/capabilities/react-context.tsx +20 -0
  113. package/src/capabilities/react-surface.tsx +44 -0
  114. package/src/components/IdentityDialog.tsx +13 -11
  115. package/src/components/JoinDialog.tsx +13 -19
  116. package/src/components/RecoveryCodeDialog.tsx +3 -1
  117. package/src/events.ts +14 -0
  118. package/src/index.ts +4 -4
  119. package/src/meta.ts +1 -15
  120. package/src/types.ts +89 -0
  121. package/dist/lib/browser/chunk-FGUXUNOK.mjs +0 -26
  122. package/dist/lib/browser/chunk-FGUXUNOK.mjs.map +0 -7
  123. package/dist/lib/browser/meta.mjs +0 -13
  124. package/dist/lib/node/chunk-XYLDQWFV.cjs +0 -51
  125. package/dist/lib/node/chunk-XYLDQWFV.cjs.map +0 -7
  126. package/dist/lib/node/meta.cjs.map +0 -7
  127. package/dist/lib/node-esm/chunk-C6X363FK.mjs +0 -28
  128. package/dist/lib/node-esm/chunk-C6X363FK.mjs.map +0 -7
  129. package/dist/lib/node-esm/meta.mjs +0 -14
  130. package/src/ClientPlugin.tsx +0 -316
  131. /package/dist/lib/browser/{meta.mjs.map → types.mjs.map} +0 -0
  132. /package/dist/lib/node-esm/{meta.mjs.map → types.mjs.map} +0 -0
@@ -0,0 +1,48 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { contributes, type PluginsContext } from '@dxos/app-framework';
6
+ import { Config, Defaults, Envs, Local, Storage } from '@dxos/config';
7
+ import { Client } from '@dxos/react-client';
8
+
9
+ import { ClientCapabilities } from './capabilities';
10
+ import { ClientEvents } from '../events';
11
+ import { type ClientPluginOptions } from '../types';
12
+
13
+ type ClientCapabilityOptions = Omit<ClientPluginOptions, 'appKey' | 'invitationUrl' | 'invitationParam' | 'onReset'> & {
14
+ context: PluginsContext;
15
+ };
16
+
17
+ export default async ({ context, onClientInitialized, ...options }: ClientCapabilityOptions) => {
18
+ const config = new Config(await Storage(), Envs(), Local(), Defaults());
19
+ const client = new Client({ config, ...options });
20
+
21
+ await client.initialize();
22
+ await onClientInitialized?.(context, client);
23
+
24
+ const systemSchemas = Array.from(new Set(context.requestCapabilities(ClientCapabilities.SystemSchema).flat()));
25
+ const schemas = Array.from(new Set(context.requestCapabilities(ClientCapabilities.Schema).flat()));
26
+ client.addTypes(systemSchemas);
27
+ client.addTypes(schemas);
28
+
29
+ // TODO(wittjosiah): Remove. This is a hack to get the app to boot with the new identity after a reset.
30
+ client.reloaded.on(() => {
31
+ client.halo.identity.subscribe(async (identity) => {
32
+ if (identity) {
33
+ window.location.href = window.location.origin;
34
+ }
35
+ });
36
+ });
37
+
38
+ const subscription = client.spaces.isReady.subscribe(async (ready) => {
39
+ if (ready) {
40
+ await context.activate(ClientEvents.SpacesReady);
41
+ }
42
+ });
43
+
44
+ return contributes(ClientCapabilities.Client, client, async () => {
45
+ subscription.unsubscribe();
46
+ await client.destroy();
47
+ });
48
+ };
@@ -0,0 +1,13 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { lazy } from '@dxos/app-framework';
6
+
7
+ export const AppGraphBuilder = lazy(async () => import('./app-graph-builder'));
8
+ export const Client = lazy(async () => import('./client'));
9
+ export const IntentResolver = lazy(async () => import('./intent-resolver'));
10
+ export const ReactContext = lazy(async () => import('./react-context'));
11
+ export const ReactSurface = lazy(async () => import('./react-surface'));
12
+
13
+ export * from './capabilities';
@@ -0,0 +1,101 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import {
6
+ Capabilities,
7
+ contributes,
8
+ createIntent,
9
+ createResolver,
10
+ LayoutAction,
11
+ type PluginsContext,
12
+ } from '@dxos/app-framework';
13
+ import { invariant } from '@dxos/invariant';
14
+ import { ObservabilityAction } from '@dxos/plugin-observability/types';
15
+ import { type JoinPanelProps } from '@dxos/shell/react';
16
+
17
+ import { ClientCapabilities } from './capabilities';
18
+ import { IDENTITY_DIALOG, JOIN_DIALOG, RECOVER_CODE_DIALOG } from '../components';
19
+ import { ClientEvents } from '../events';
20
+ import { ClientAction, type ClientPluginOptions } from '../types';
21
+
22
+ type IntentResolverOptions = Pick<ClientPluginOptions, 'onReset'> & {
23
+ context: PluginsContext;
24
+ };
25
+
26
+ export default ({ context, onReset }: IntentResolverOptions) =>
27
+ contributes(Capabilities.IntentResolver, [
28
+ createResolver(ClientAction.CreateIdentity, async () => {
29
+ const manager = context.requestCapability(Capabilities.PluginManager);
30
+ const client = context.requestCapability(ClientCapabilities.Client);
31
+ const data = await client.halo.createIdentity();
32
+ await manager.activate(ClientEvents.IdentityCreated);
33
+ return { data, intents: [createIntent(ObservabilityAction.SendEvent, { name: 'identity.create' })] };
34
+ }),
35
+ createResolver(ClientAction.JoinIdentity, async (data) => {
36
+ return {
37
+ intents: [
38
+ createIntent(LayoutAction.SetLayout, {
39
+ element: 'dialog',
40
+ component: JOIN_DIALOG,
41
+ dialogBlockAlign: 'start',
42
+ subject: {
43
+ initialInvitationCode: data.invitationCode,
44
+ initialDisposition: 'accept-halo-invitation',
45
+ } satisfies Partial<JoinPanelProps>,
46
+ }),
47
+ ],
48
+ };
49
+ }),
50
+ createResolver(ClientAction.ShareIdentity, async () => {
51
+ return {
52
+ intents: [
53
+ createIntent(LayoutAction.SetLayout, {
54
+ element: 'dialog',
55
+ component: IDENTITY_DIALOG,
56
+ dialogBlockAlign: 'start',
57
+ }),
58
+ createIntent(ObservabilityAction.SendEvent, { name: 'identity.share' }),
59
+ ],
60
+ };
61
+ }),
62
+ createResolver(ClientAction.RecoverIdentity, async () => {
63
+ return {
64
+ intents: [
65
+ createIntent(LayoutAction.SetLayout, {
66
+ element: 'dialog',
67
+ component: JOIN_DIALOG,
68
+ dialogBlockAlign: 'start',
69
+ subject: { initialDisposition: 'recover-identity' } satisfies Partial<JoinPanelProps>,
70
+ }),
71
+ ],
72
+ };
73
+ }),
74
+ createResolver(ClientAction.ResetStorage, async (data) => {
75
+ await onReset?.({ target: data.target });
76
+ return {};
77
+ }),
78
+ createResolver(ClientAction.CreateAgent, async () => {
79
+ const client = context.requestCapability(ClientCapabilities.Client);
80
+ invariant(client.services.services.EdgeAgentService, 'Missing EdgeAgentService');
81
+ await client.services.services.EdgeAgentService.createAgent(null as any, { timeout: 10_000 });
82
+ }),
83
+ createResolver(ClientAction.CreateRecoveryCode, async () => {
84
+ const client = context.requestCapability(ClientCapabilities.Client);
85
+ invariant(client.services.services.IdentityService, 'IdentityService not available');
86
+ // TODO(wittjosiah): This needs a proper api. Rename property.
87
+ const { seedphrase } = await client.services.services.IdentityService.createRecoveryPhrase();
88
+ return {
89
+ intents: [
90
+ createIntent(LayoutAction.SetLayout, {
91
+ element: 'dialog',
92
+ dialogBlockAlign: 'start',
93
+ dialogType: 'alert',
94
+ state: true,
95
+ component: RECOVER_CODE_DIALOG,
96
+ subject: { code: seedphrase },
97
+ }),
98
+ ],
99
+ };
100
+ }),
101
+ ]);
@@ -0,0 +1,20 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import React from 'react';
6
+
7
+ import { Capabilities, contributes, useCapability } from '@dxos/app-framework';
8
+ import { ClientProvider } from '@dxos/react-client';
9
+
10
+ import { ClientCapabilities } from './capabilities';
11
+ import { CLIENT_PLUGIN } from '../meta';
12
+
13
+ export default () =>
14
+ contributes(Capabilities.ReactContext, {
15
+ id: CLIENT_PLUGIN,
16
+ context: ({ children }) => {
17
+ const client = useCapability(ClientCapabilities.Client);
18
+ return <ClientProvider client={client}>{children}</ClientProvider>;
19
+ },
20
+ });
@@ -0,0 +1,44 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import React from 'react';
6
+
7
+ import { createSurface, Capabilities, contributes } from '@dxos/app-framework';
8
+ import { type IdentityPanelProps, type JoinPanelProps } from '@dxos/shell/react';
9
+
10
+ import {
11
+ IDENTITY_DIALOG,
12
+ IdentityDialog,
13
+ JOIN_DIALOG,
14
+ JoinDialog,
15
+ RECOVER_CODE_DIALOG,
16
+ RecoveryCodeDialog,
17
+ type RecoveryCodeDialogProps,
18
+ } from '../components';
19
+
20
+ type ReactSurfaceOptions = {
21
+ createInvitationUrl: (invitationCode: string) => string;
22
+ };
23
+
24
+ export default ({ createInvitationUrl }: ReactSurfaceOptions) =>
25
+ contributes(Capabilities.ReactSurface, [
26
+ createSurface({
27
+ id: IDENTITY_DIALOG,
28
+ role: 'dialog',
29
+ filter: (data): data is { subject: IdentityPanelProps } => data.component === IDENTITY_DIALOG,
30
+ component: ({ data }) => <IdentityDialog {...data.subject} createInvitationUrl={createInvitationUrl} />,
31
+ }),
32
+ createSurface({
33
+ id: JOIN_DIALOG,
34
+ role: 'dialog',
35
+ filter: (data): data is { subject: JoinPanelProps } => data.component === JOIN_DIALOG,
36
+ component: ({ data }) => <JoinDialog {...data.subject} />,
37
+ }),
38
+ createSurface({
39
+ id: RECOVER_CODE_DIALOG,
40
+ role: 'dialog',
41
+ filter: (data): data is { subject: RecoveryCodeDialogProps } => data.component === RECOVER_CODE_DIALOG,
42
+ component: ({ data }) => <RecoveryCodeDialog {...data.subject} />,
43
+ }),
44
+ ]);
@@ -4,42 +4,44 @@
4
4
 
5
5
  import React, { useCallback } from 'react';
6
6
 
7
- import { LayoutAction, useIntentDispatcher } from '@dxos/app-framework';
7
+ import { createIntent, LayoutAction, useIntentDispatcher } from '@dxos/app-framework';
8
8
  import { useClient } from '@dxos/react-client';
9
9
  import { Clipboard, Dialog } from '@dxos/react-ui';
10
10
  import { IdentityPanel, type IdentityPanelProps } from '@dxos/shell/react';
11
11
 
12
- import { ClientAction } from '../meta';
12
+ import { CLIENT_PLUGIN } from '../meta';
13
+ import { ClientAction } from '../types';
14
+
15
+ export const IDENTITY_DIALOG = `${CLIENT_PLUGIN}/IdentityDialog`;
13
16
 
14
17
  export const IdentityDialog = (props: IdentityPanelProps) => {
15
- const dispatch = useIntentDispatcher();
18
+ const { dispatchPromise: dispatch } = useIntentDispatcher();
16
19
  const client = useClient();
17
20
 
18
21
  const handleDone = useCallback(
19
22
  () =>
20
- dispatch({
21
- action: LayoutAction.SET_LAYOUT,
22
- data: {
23
+ dispatch(
24
+ createIntent(LayoutAction.SetLayout, {
23
25
  element: 'dialog',
24
26
  state: false,
25
- },
26
- }),
27
+ }),
28
+ ),
27
29
  [dispatch],
28
30
  );
29
31
 
30
32
  const handleResetStorage = useCallback(async () => {
31
33
  await client.reset();
32
- await dispatch({ action: ClientAction.RESET_STORAGE });
34
+ await dispatch(createIntent(ClientAction.ResetStorage));
33
35
  }, [dispatch]);
34
36
 
35
37
  const handleRecover = useCallback(async () => {
36
38
  await client.reset();
37
- await dispatch({ action: ClientAction.RESET_STORAGE, data: { target: 'recoverIdentity' } });
39
+ await dispatch(createIntent(ClientAction.ResetStorage, { target: 'recoverIdentity' }));
38
40
  }, [dispatch]);
39
41
 
40
42
  const handleJoinNewIdentity = useCallback(async () => {
41
43
  await client.reset();
42
- await dispatch({ action: ClientAction.RESET_STORAGE, data: { target: 'deviceInvitation' } });
44
+ await dispatch(createIntent(ClientAction.ResetStorage, { target: 'deviceInvitation' }));
43
45
  }, [dispatch]);
44
46
 
45
47
  return (
@@ -4,38 +4,32 @@
4
4
 
5
5
  import React, { useCallback } from 'react';
6
6
 
7
- import { LayoutAction, useIntentDispatcher } from '@dxos/app-framework';
7
+ import { createIntent, LayoutAction, useIntentDispatcher } from '@dxos/app-framework';
8
+ import { ObservabilityAction } from '@dxos/plugin-observability/types';
8
9
  import { type InvitationResult } from '@dxos/react-client/invitations';
9
10
  import { Dialog } from '@dxos/react-ui';
10
11
  import { JoinPanel, type JoinPanelProps } from '@dxos/shell/react';
11
12
 
12
- import { CLIENT_PLUGIN, ClientAction, OBSERVABILITY_ACTION } from '../meta';
13
+ import { CLIENT_PLUGIN } from '../meta';
14
+ import { ClientAction } from '../types';
15
+
16
+ export const JOIN_DIALOG = `${CLIENT_PLUGIN}/JoinDialog`;
13
17
 
14
18
  export const JoinDialog = (props: JoinPanelProps) => {
15
- const dispatch = useIntentDispatcher();
19
+ const { dispatchPromise: dispatch } = useIntentDispatcher();
16
20
 
17
- const handleCancelResetStorage = useCallback(
18
- () => dispatch({ plugin: CLIENT_PLUGIN, action: ClientAction.SHARE_IDENTITY }),
19
- [dispatch],
20
- );
21
+ const handleCancelResetStorage = useCallback(() => dispatch(createIntent(ClientAction.ShareIdentity)), [dispatch]);
21
22
 
22
23
  const handleDone = useCallback(
23
24
  async (result: InvitationResult | null) => {
24
25
  if (result?.identityKey) {
25
26
  await Promise.all([
26
- dispatch({
27
- action: LayoutAction.SET_LAYOUT,
28
- data: {
29
- element: 'dialog',
30
- state: false,
31
- },
32
- }),
33
- dispatch({
34
- action: OBSERVABILITY_ACTION,
35
- data: {
27
+ dispatch(createIntent(LayoutAction.SetLayout, { element: 'dialog', state: false })),
28
+ dispatch(
29
+ createIntent(ObservabilityAction.SendEvent, {
36
30
  name: props.initialDisposition === 'recover-identity' ? 'identity.recover' : 'identity.join',
37
- },
38
- }),
31
+ }),
32
+ ),
39
33
  ]);
40
34
  }
41
35
  },
@@ -8,6 +8,8 @@ import { AlertDialog, Button, Clipboard, Input, useTranslation } from '@dxos/rea
8
8
 
9
9
  import { CLIENT_PLUGIN } from '../meta';
10
10
 
11
+ export const RECOVER_CODE_DIALOG = `${CLIENT_PLUGIN}/RecoveryCodeDialog`;
12
+
11
13
  export type RecoveryCodeDialogProps = {
12
14
  code: string;
13
15
  };
@@ -20,7 +22,7 @@ export const RecoveryCodeDialog = ({ code }: RecoveryCodeDialogProps) => {
20
22
 
21
23
  return (
22
24
  <AlertDialog.Content classNames='bs-content min-bs-[15rem] max-bs-full md:max-is-[40rem] overflow-hidden'>
23
- <AlertDialog.Title classNames=''>{t('recovery code dialog title')}</AlertDialog.Title>
25
+ <AlertDialog.Title>{t('recovery code dialog title')}</AlertDialog.Title>
24
26
  <p className='py-4'>{t('recovery code dialog description')}</p>
25
27
  <Clipboard.Provider>
26
28
  <Code code={code} />
package/src/events.ts ADDED
@@ -0,0 +1,14 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { defineEvent } from '@dxos/app-framework';
6
+
7
+ import { CLIENT_PLUGIN } from './meta';
8
+
9
+ export namespace ClientEvents {
10
+ export const SetupClient = defineEvent(`${CLIENT_PLUGIN}/event/setup-client`);
11
+ export const ClientReady = defineEvent(`${CLIENT_PLUGIN}/event/client-ready`);
12
+ export const IdentityCreated = defineEvent(`${CLIENT_PLUGIN}/event/identity-created`);
13
+ export const SpacesReady = defineEvent(`${CLIENT_PLUGIN}/event/spaces-ready`);
14
+ }
package/src/index.ts CHANGED
@@ -2,8 +2,8 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { ClientPlugin } from './ClientPlugin';
6
-
7
- export default ClientPlugin;
8
-
9
5
  export * from './ClientPlugin';
6
+ export * from './meta';
7
+
8
+ export { ClientCapabilities } from './capabilities';
9
+ export { ClientEvents } from './events';
package/src/meta.ts CHANGED
@@ -6,21 +6,7 @@ import { type PluginMeta } from '@dxos/app-framework';
6
6
 
7
7
  export const CLIENT_PLUGIN = 'dxos.org/plugin/client';
8
8
 
9
- export default {
9
+ export const meta = {
10
10
  id: CLIENT_PLUGIN,
11
11
  name: 'Client',
12
12
  } satisfies PluginMeta;
13
-
14
- const CLIENT_ACTION = `${CLIENT_PLUGIN}/action`;
15
- export enum ClientAction {
16
- CREATE_IDENTITY = `${CLIENT_ACTION}/CREATE_IDENTITY`,
17
- JOIN_IDENTITY = `${CLIENT_ACTION}/JOIN_IDENTITY`,
18
- SHARE_IDENTITY = `${CLIENT_ACTION}/SHARE_IDENTITY`,
19
- RECOVER_IDENTITY = `${CLIENT_ACTION}/RECOVER_IDENTITY`,
20
- RESET_STORAGE = `${CLIENT_ACTION}/RESET_STORAGE`,
21
- CREATE_AGENT = `${CLIENT_ACTION}/CREATE_AGENT`,
22
- CREATE_RECOVERY_CODE = `${CLIENT_ACTION}/CREATE_RECOVERY_CODE`,
23
- }
24
-
25
- // NOTE: This action is hardcoded to avoid circular dependency with observability plugin.
26
- export const OBSERVABILITY_ACTION = 'dxos.org/plugin/observability/send-event';
package/src/types.ts ADDED
@@ -0,0 +1,89 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import { type PluginsContext } from '@dxos/app-framework';
6
+ import { S } from '@dxos/echo-schema';
7
+ import { type Client, PublicKey, type ClientOptions } from '@dxos/react-client';
8
+ import { type MaybePromise } from '@dxos/util';
9
+
10
+ import { CLIENT_PLUGIN } from './meta';
11
+
12
+ // TODO(wittjosiah): Factor out. Generate?
13
+ const IdentitySchema = S.Struct({
14
+ identityKey: S.instanceOf(PublicKey),
15
+ spaceKey: S.optional(S.instanceOf(PublicKey)),
16
+ profile: S.optional(
17
+ S.Struct({
18
+ displayName: S.optional(S.String),
19
+ avatarCid: S.optional(S.String),
20
+ data: S.optional(S.Record({ key: S.String, value: S.Any })),
21
+ }),
22
+ ),
23
+ });
24
+
25
+ const CLIENT_ACTION = `${CLIENT_PLUGIN}/action`;
26
+ export namespace ClientAction {
27
+ export class CreateIdentity extends S.TaggedClass<CreateIdentity>()(`${CLIENT_ACTION}/create-identity`, {
28
+ input: S.Struct({
29
+ displayName: S.optional(S.String),
30
+ }),
31
+ output: IdentitySchema,
32
+ }) {}
33
+
34
+ export class JoinIdentity extends S.TaggedClass<JoinIdentity>()(`${CLIENT_ACTION}/join-identity`, {
35
+ input: S.Struct({
36
+ invitationCode: S.String,
37
+ }),
38
+ output: S.Void,
39
+ }) {}
40
+
41
+ export class ShareIdentity extends S.TaggedClass<ShareIdentity>()(`${CLIENT_ACTION}/share-identity`, {
42
+ input: S.Void,
43
+ output: S.Void,
44
+ }) {}
45
+
46
+ export class RecoverIdentity extends S.TaggedClass<RecoverIdentity>()(`${CLIENT_ACTION}/recover-identity`, {
47
+ input: S.Void,
48
+ output: S.Void,
49
+ }) {}
50
+
51
+ export class ResetStorage extends S.TaggedClass<ResetStorage>()(`${CLIENT_ACTION}/reset-storage`, {
52
+ input: S.Struct({
53
+ target: S.optional(S.String),
54
+ }),
55
+ output: S.Void,
56
+ }) {}
57
+
58
+ export class CreateAgent extends S.TaggedClass<CreateAgent>()(`${CLIENT_ACTION}/create-agent`, {
59
+ input: S.Void,
60
+ output: S.Void,
61
+ }) {}
62
+
63
+ export class CreateRecoveryCode extends S.TaggedClass<CreateRecoveryCode>()(`${CLIENT_ACTION}/create-recovery-code`, {
64
+ input: S.Void,
65
+ output: S.Void,
66
+ }) {}
67
+ }
68
+
69
+ export type ClientPluginOptions = ClientOptions & {
70
+ /**
71
+ * Base URL for the invitation link.
72
+ */
73
+ invitationUrl?: string;
74
+
75
+ /**
76
+ * Query parameter for the invitation code.
77
+ */
78
+ invitationParam?: string;
79
+
80
+ /**
81
+ * Run after the client has been initialized.
82
+ */
83
+ onClientInitialized?: (context: PluginsContext, client: Client) => MaybePromise<void>;
84
+
85
+ /**
86
+ * Called when the client is reset.
87
+ */
88
+ onReset?: (params: { target?: string }) => MaybePromise<void>;
89
+ };
@@ -1,26 +0,0 @@
1
- // packages/plugins/plugin-client/src/meta.ts
2
- var CLIENT_PLUGIN = "dxos.org/plugin/client";
3
- var meta_default = {
4
- id: CLIENT_PLUGIN,
5
- name: "Client"
6
- };
7
- var CLIENT_ACTION = `${CLIENT_PLUGIN}/action`;
8
- var ClientAction;
9
- (function(ClientAction2) {
10
- ClientAction2[ClientAction2["CREATE_IDENTITY"] = `${CLIENT_ACTION}/CREATE_IDENTITY`] = "CREATE_IDENTITY";
11
- ClientAction2[ClientAction2["JOIN_IDENTITY"] = `${CLIENT_ACTION}/JOIN_IDENTITY`] = "JOIN_IDENTITY";
12
- ClientAction2[ClientAction2["SHARE_IDENTITY"] = `${CLIENT_ACTION}/SHARE_IDENTITY`] = "SHARE_IDENTITY";
13
- ClientAction2[ClientAction2["RECOVER_IDENTITY"] = `${CLIENT_ACTION}/RECOVER_IDENTITY`] = "RECOVER_IDENTITY";
14
- ClientAction2[ClientAction2["RESET_STORAGE"] = `${CLIENT_ACTION}/RESET_STORAGE`] = "RESET_STORAGE";
15
- ClientAction2[ClientAction2["CREATE_AGENT"] = `${CLIENT_ACTION}/CREATE_AGENT`] = "CREATE_AGENT";
16
- ClientAction2[ClientAction2["CREATE_RECOVERY_CODE"] = `${CLIENT_ACTION}/CREATE_RECOVERY_CODE`] = "CREATE_RECOVERY_CODE";
17
- })(ClientAction || (ClientAction = {}));
18
- var OBSERVABILITY_ACTION = "dxos.org/plugin/observability/send-event";
19
-
20
- export {
21
- CLIENT_PLUGIN,
22
- meta_default,
23
- ClientAction,
24
- OBSERVABILITY_ACTION
25
- };
26
- //# sourceMappingURL=chunk-FGUXUNOK.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/meta.ts"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type PluginMeta } from '@dxos/app-framework';\n\nexport const CLIENT_PLUGIN = 'dxos.org/plugin/client';\n\nexport default {\n id: CLIENT_PLUGIN,\n name: 'Client',\n} satisfies PluginMeta;\n\nconst CLIENT_ACTION = `${CLIENT_PLUGIN}/action`;\nexport enum ClientAction {\n CREATE_IDENTITY = `${CLIENT_ACTION}/CREATE_IDENTITY`,\n JOIN_IDENTITY = `${CLIENT_ACTION}/JOIN_IDENTITY`,\n SHARE_IDENTITY = `${CLIENT_ACTION}/SHARE_IDENTITY`,\n RECOVER_IDENTITY = `${CLIENT_ACTION}/RECOVER_IDENTITY`,\n RESET_STORAGE = `${CLIENT_ACTION}/RESET_STORAGE`,\n CREATE_AGENT = `${CLIENT_ACTION}/CREATE_AGENT`,\n CREATE_RECOVERY_CODE = `${CLIENT_ACTION}/CREATE_RECOVERY_CODE`,\n}\n\n// NOTE: This action is hardcoded to avoid circular dependency with observability plugin.\nexport const OBSERVABILITY_ACTION = 'dxos.org/plugin/observability/send-event';\n"],
5
- "mappings": ";AAMO,IAAMA,gBAAgB;AAE7B,IAAA,eAAe;EACbC,IAAID;EACJE,MAAM;AACR;AAEA,IAAMC,gBAAgB,GAAGH,aAAAA;;UACbI,eAAAA;mDACQ,GAAGD,aAAAA,kBAA+B,IAAA;iDACpC,GAAGA,aAAAA,gBAA6B,IAAA;kDAC/B,GAAGA,aAAAA,iBAA8B,IAAA;oDAC/B,GAAGA,aAAAA,mBAAgC,IAAA;iDACtC,GAAGA,aAAAA,gBAA6B,IAAA;gDACjC,GAAGA,aAAAA,eAA4B,IAAA;wDACvB,GAAGA,aAAAA,uBAAoC,IAAA;GAPpDC,iBAAAA,eAAAA,CAAAA,EAAAA;AAWL,IAAMC,uBAAuB;",
6
- "names": ["CLIENT_PLUGIN", "id", "name", "CLIENT_ACTION", "ClientAction", "OBSERVABILITY_ACTION"]
7
- }
@@ -1,13 +0,0 @@
1
- import {
2
- CLIENT_PLUGIN,
3
- ClientAction,
4
- OBSERVABILITY_ACTION,
5
- meta_default
6
- } from "./chunk-FGUXUNOK.mjs";
7
- export {
8
- CLIENT_PLUGIN,
9
- ClientAction,
10
- OBSERVABILITY_ACTION,
11
- meta_default as default
12
- };
13
- //# sourceMappingURL=meta.mjs.map
@@ -1,51 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var chunk_XYLDQWFV_exports = {};
20
- __export(chunk_XYLDQWFV_exports, {
21
- CLIENT_PLUGIN: () => CLIENT_PLUGIN,
22
- ClientAction: () => ClientAction,
23
- OBSERVABILITY_ACTION: () => OBSERVABILITY_ACTION,
24
- meta_default: () => meta_default
25
- });
26
- module.exports = __toCommonJS(chunk_XYLDQWFV_exports);
27
- var CLIENT_PLUGIN = "dxos.org/plugin/client";
28
- var meta_default = {
29
- id: CLIENT_PLUGIN,
30
- name: "Client"
31
- };
32
- var CLIENT_ACTION = `${CLIENT_PLUGIN}/action`;
33
- var ClientAction;
34
- (function(ClientAction2) {
35
- ClientAction2[ClientAction2["CREATE_IDENTITY"] = `${CLIENT_ACTION}/CREATE_IDENTITY`] = "CREATE_IDENTITY";
36
- ClientAction2[ClientAction2["JOIN_IDENTITY"] = `${CLIENT_ACTION}/JOIN_IDENTITY`] = "JOIN_IDENTITY";
37
- ClientAction2[ClientAction2["SHARE_IDENTITY"] = `${CLIENT_ACTION}/SHARE_IDENTITY`] = "SHARE_IDENTITY";
38
- ClientAction2[ClientAction2["RECOVER_IDENTITY"] = `${CLIENT_ACTION}/RECOVER_IDENTITY`] = "RECOVER_IDENTITY";
39
- ClientAction2[ClientAction2["RESET_STORAGE"] = `${CLIENT_ACTION}/RESET_STORAGE`] = "RESET_STORAGE";
40
- ClientAction2[ClientAction2["CREATE_AGENT"] = `${CLIENT_ACTION}/CREATE_AGENT`] = "CREATE_AGENT";
41
- ClientAction2[ClientAction2["CREATE_RECOVERY_CODE"] = `${CLIENT_ACTION}/CREATE_RECOVERY_CODE`] = "CREATE_RECOVERY_CODE";
42
- })(ClientAction || (ClientAction = {}));
43
- var OBSERVABILITY_ACTION = "dxos.org/plugin/observability/send-event";
44
- // Annotate the CommonJS export names for ESM import in node:
45
- 0 && (module.exports = {
46
- CLIENT_PLUGIN,
47
- ClientAction,
48
- OBSERVABILITY_ACTION,
49
- meta_default
50
- });
51
- //# sourceMappingURL=chunk-XYLDQWFV.cjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/meta.ts"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type PluginMeta } from '@dxos/app-framework';\n\nexport const CLIENT_PLUGIN = 'dxos.org/plugin/client';\n\nexport default {\n id: CLIENT_PLUGIN,\n name: 'Client',\n} satisfies PluginMeta;\n\nconst CLIENT_ACTION = `${CLIENT_PLUGIN}/action`;\nexport enum ClientAction {\n CREATE_IDENTITY = `${CLIENT_ACTION}/CREATE_IDENTITY`,\n JOIN_IDENTITY = `${CLIENT_ACTION}/JOIN_IDENTITY`,\n SHARE_IDENTITY = `${CLIENT_ACTION}/SHARE_IDENTITY`,\n RECOVER_IDENTITY = `${CLIENT_ACTION}/RECOVER_IDENTITY`,\n RESET_STORAGE = `${CLIENT_ACTION}/RESET_STORAGE`,\n CREATE_AGENT = `${CLIENT_ACTION}/CREATE_AGENT`,\n CREATE_RECOVERY_CODE = `${CLIENT_ACTION}/CREATE_RECOVERY_CODE`,\n}\n\n// NOTE: This action is hardcoded to avoid circular dependency with observability plugin.\nexport const OBSERVABILITY_ACTION = 'dxos.org/plugin/observability/send-event';\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;AAMO,IAAMA,gBAAgB;AAE7B,IAAA,eAAe;EACbC,IAAID;EACJE,MAAM;AACR;AAEA,IAAMC,gBAAgB,GAAGH,aAAAA;;UACbI,eAAAA;mDACQ,GAAGD,aAAAA,kBAA+B,IAAA;iDACpC,GAAGA,aAAAA,gBAA6B,IAAA;kDAC/B,GAAGA,aAAAA,iBAA8B,IAAA;oDAC/B,GAAGA,aAAAA,mBAAgC,IAAA;iDACtC,GAAGA,aAAAA,gBAA6B,IAAA;gDACjC,GAAGA,aAAAA,eAA4B,IAAA;wDACvB,GAAGA,aAAAA,uBAAoC,IAAA;GAPpDC,iBAAAA,eAAAA,CAAAA,EAAAA;AAWL,IAAMC,uBAAuB;",
6
- "names": ["CLIENT_PLUGIN", "id", "name", "CLIENT_ACTION", "ClientAction", "OBSERVABILITY_ACTION"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["meta.cjs"],
4
- "sourcesContent": ["import {\n CLIENT_PLUGIN,\n ClientAction,\n OBSERVABILITY_ACTION,\n meta_default\n} from \"./chunk-XYLDQWFV.cjs\";\nexport {\n CLIENT_PLUGIN,\n ClientAction,\n OBSERVABILITY_ACTION,\n meta_default as default\n};\n//# sourceMappingURL=meta.cjs.map\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAKO;",
6
- "names": []
7
- }
@@ -1,28 +0,0 @@
1
- import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
-
3
- // packages/plugins/plugin-client/src/meta.ts
4
- var CLIENT_PLUGIN = "dxos.org/plugin/client";
5
- var meta_default = {
6
- id: CLIENT_PLUGIN,
7
- name: "Client"
8
- };
9
- var CLIENT_ACTION = `${CLIENT_PLUGIN}/action`;
10
- var ClientAction;
11
- (function(ClientAction2) {
12
- ClientAction2[ClientAction2["CREATE_IDENTITY"] = `${CLIENT_ACTION}/CREATE_IDENTITY`] = "CREATE_IDENTITY";
13
- ClientAction2[ClientAction2["JOIN_IDENTITY"] = `${CLIENT_ACTION}/JOIN_IDENTITY`] = "JOIN_IDENTITY";
14
- ClientAction2[ClientAction2["SHARE_IDENTITY"] = `${CLIENT_ACTION}/SHARE_IDENTITY`] = "SHARE_IDENTITY";
15
- ClientAction2[ClientAction2["RECOVER_IDENTITY"] = `${CLIENT_ACTION}/RECOVER_IDENTITY`] = "RECOVER_IDENTITY";
16
- ClientAction2[ClientAction2["RESET_STORAGE"] = `${CLIENT_ACTION}/RESET_STORAGE`] = "RESET_STORAGE";
17
- ClientAction2[ClientAction2["CREATE_AGENT"] = `${CLIENT_ACTION}/CREATE_AGENT`] = "CREATE_AGENT";
18
- ClientAction2[ClientAction2["CREATE_RECOVERY_CODE"] = `${CLIENT_ACTION}/CREATE_RECOVERY_CODE`] = "CREATE_RECOVERY_CODE";
19
- })(ClientAction || (ClientAction = {}));
20
- var OBSERVABILITY_ACTION = "dxos.org/plugin/observability/send-event";
21
-
22
- export {
23
- CLIENT_PLUGIN,
24
- meta_default,
25
- ClientAction,
26
- OBSERVABILITY_ACTION
27
- };
28
- //# sourceMappingURL=chunk-C6X363FK.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/meta.ts"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type PluginMeta } from '@dxos/app-framework';\n\nexport const CLIENT_PLUGIN = 'dxos.org/plugin/client';\n\nexport default {\n id: CLIENT_PLUGIN,\n name: 'Client',\n} satisfies PluginMeta;\n\nconst CLIENT_ACTION = `${CLIENT_PLUGIN}/action`;\nexport enum ClientAction {\n CREATE_IDENTITY = `${CLIENT_ACTION}/CREATE_IDENTITY`,\n JOIN_IDENTITY = `${CLIENT_ACTION}/JOIN_IDENTITY`,\n SHARE_IDENTITY = `${CLIENT_ACTION}/SHARE_IDENTITY`,\n RECOVER_IDENTITY = `${CLIENT_ACTION}/RECOVER_IDENTITY`,\n RESET_STORAGE = `${CLIENT_ACTION}/RESET_STORAGE`,\n CREATE_AGENT = `${CLIENT_ACTION}/CREATE_AGENT`,\n CREATE_RECOVERY_CODE = `${CLIENT_ACTION}/CREATE_RECOVERY_CODE`,\n}\n\n// NOTE: This action is hardcoded to avoid circular dependency with observability plugin.\nexport const OBSERVABILITY_ACTION = 'dxos.org/plugin/observability/send-event';\n"],
5
- "mappings": ";;;AAMO,IAAMA,gBAAgB;AAE7B,IAAA,eAAe;EACbC,IAAID;EACJE,MAAM;AACR;AAEA,IAAMC,gBAAgB,GAAGH,aAAAA;;UACbI,eAAAA;mDACQ,GAAGD,aAAAA,kBAA+B,IAAA;iDACpC,GAAGA,aAAAA,gBAA6B,IAAA;kDAC/B,GAAGA,aAAAA,iBAA8B,IAAA;oDAC/B,GAAGA,aAAAA,mBAAgC,IAAA;iDACtC,GAAGA,aAAAA,gBAA6B,IAAA;gDACjC,GAAGA,aAAAA,eAA4B,IAAA;wDACvB,GAAGA,aAAAA,uBAAoC,IAAA;GAPpDC,iBAAAA,eAAAA,CAAAA,EAAAA;AAWL,IAAMC,uBAAuB;",
6
- "names": ["CLIENT_PLUGIN", "id", "name", "CLIENT_ACTION", "ClientAction", "OBSERVABILITY_ACTION"]
7
- }