@dxos/plugin-client 0.8.4-main.21d9917 → 0.8.4-main.2244d791bb
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.
- package/dist/lib/browser/{app-graph-builder-3FGBMLTF.mjs → app-graph-builder-DTETNB5U.mjs} +4 -3
- package/dist/lib/browser/app-graph-builder-DTETNB5U.mjs.map +7 -0
- package/dist/lib/browser/{chunk-F7H2Y3Z2.mjs → chunk-MY6BJCB6.mjs} +4 -4
- package/dist/lib/browser/cli/index.mjs +22 -21
- package/dist/lib/browser/cli/index.mjs.map +3 -3
- package/dist/lib/browser/{client-IX5LMWV4.mjs → client-XOQQ5POJ.mjs} +3 -3
- package/dist/lib/browser/client-XOQQ5POJ.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +20 -19
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/{migrations-3EBTAW3N.mjs → migrations-YNQ7L5GT.mjs} +4 -4
- package/dist/lib/browser/migrations-YNQ7L5GT.mjs.map +7 -0
- package/dist/lib/browser/{operation-resolver-2NT3ISVP.mjs → operation-resolver-N4YCJ4KS.mjs} +18 -17
- package/dist/lib/browser/operation-resolver-N4YCJ4KS.mjs.map +7 -0
- package/dist/lib/browser/{react-context-4UABG3GP.mjs → react-context-FDXHIBZL.mjs} +4 -4
- package/dist/lib/browser/react-context-FDXHIBZL.mjs.map +7 -0
- package/dist/lib/browser/{react-surface-RSQ74XCT.mjs → react-surface-ZP3FLVRS.mjs} +50 -49
- package/dist/lib/browser/react-surface-ZP3FLVRS.mjs.map +7 -0
- package/dist/lib/browser/{schema-defs-O7VLP745.mjs → schema-defs-AYXOYD2M.mjs} +6 -5
- package/dist/lib/browser/schema-defs-AYXOYD2M.mjs.map +7 -0
- package/dist/lib/node-esm/{app-graph-builder-2PIYVUNC.mjs → app-graph-builder-PFKVFRXI.mjs} +4 -3
- package/dist/lib/node-esm/app-graph-builder-PFKVFRXI.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-BCELGXRI.mjs → chunk-MUOMX53G.mjs} +4 -4
- package/dist/lib/node-esm/cli/index.mjs +22 -21
- package/dist/lib/node-esm/cli/index.mjs.map +3 -3
- package/dist/lib/node-esm/{client-FFPK5UFP.mjs → client-3YIMWKR7.mjs} +3 -3
- package/dist/lib/node-esm/client-3YIMWKR7.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +20 -19
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/{migrations-WSZSFGDK.mjs → migrations-ZH5GNG4U.mjs} +4 -4
- package/dist/lib/node-esm/migrations-ZH5GNG4U.mjs.map +7 -0
- package/dist/lib/node-esm/{operation-resolver-VW5R2BE4.mjs → operation-resolver-CHGWI5P2.mjs} +18 -17
- package/dist/lib/node-esm/operation-resolver-CHGWI5P2.mjs.map +7 -0
- package/dist/lib/node-esm/{react-context-UVXMGPW4.mjs → react-context-7Z2TVUTV.mjs} +4 -4
- package/dist/lib/node-esm/react-context-7Z2TVUTV.mjs.map +7 -0
- package/dist/lib/node-esm/{react-surface-KBHANGGC.mjs → react-surface-BHJMHIMH.mjs} +50 -49
- package/dist/lib/node-esm/react-surface-BHJMHIMH.mjs.map +7 -0
- package/dist/lib/node-esm/{schema-defs-QLRGBIKY.mjs → schema-defs-TV2SCKSH.mjs} +6 -5
- package/dist/lib/node-esm/schema-defs-TV2SCKSH.mjs.map +7 -0
- package/dist/types/src/ClientPlugin.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +1 -1
- package/dist/types/src/capabilities/client/client.d.ts.map +1 -1
- package/dist/types/src/capabilities/client/index.d.ts +1 -0
- package/dist/types/src/capabilities/client/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/migrations/migrations.d.ts.map +1 -1
- package/dist/types/src/capabilities/operation-resolver/index.d.ts +1 -1
- package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +2 -2
- package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-context/react-context.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface/index.d.ts +1 -1
- package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface/react-surface.d.ts +2 -2
- package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -1
- package/dist/types/src/capabilities/schema-defs/schema-defs.d.ts.map +1 -1
- package/dist/types/src/cli/commands/halo/create/create.d.ts.map +1 -1
- package/dist/types/src/cli/plugin.d.ts.map +1 -1
- package/dist/types/src/components/DevicesContainer.d.ts.map +1 -1
- package/dist/types/src/components/DevicesContainer.stories.d.ts +1 -1
- package/dist/types/src/components/DevicesContainer.stories.d.ts.map +1 -1
- package/dist/types/src/components/ProfileContainer.d.ts.map +1 -1
- package/dist/types/src/components/ResetDialog.d.ts.map +1 -1
- package/dist/types/src/components/ResetDialog.stories.d.ts +1 -1
- package/dist/types/src/components/ResetDialog.stories.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +35 -34
- package/src/ClientPlugin.ts +9 -8
- package/src/capabilities/app-graph-builder/app-graph-builder.ts +3 -2
- package/src/capabilities/client/client.ts +2 -2
- package/src/capabilities/migrations/migrations.ts +3 -3
- package/src/capabilities/operation-resolver/operation-resolver.ts +10 -9
- package/src/capabilities/react-context/react-context.tsx +3 -3
- package/src/capabilities/react-surface/react-surface.tsx +9 -8
- package/src/capabilities/schema-defs/schema-defs.ts +5 -4
- package/src/cli/commands/halo/create/create.ts +2 -2
- package/src/cli/plugin.ts +7 -6
- package/src/components/DevicesContainer.stories.tsx +3 -2
- package/src/components/DevicesContainer.tsx +26 -36
- package/src/components/JoinDialog.tsx +3 -3
- package/src/components/ProfileContainer.stories.tsx +1 -1
- package/src/components/ProfileContainer.tsx +17 -25
- package/src/components/RecoveryCodeDialog.stories.tsx +1 -1
- package/src/components/RecoveryCredentialsContainer.stories.tsx +1 -1
- package/src/components/RecoveryCredentialsContainer.tsx +14 -14
- package/src/components/ResetDialog.stories.tsx +22 -10
- package/src/components/ResetDialog.tsx +11 -8
- package/src/translations.ts +1 -1
- package/dist/lib/browser/app-graph-builder-3FGBMLTF.mjs.map +0 -7
- package/dist/lib/browser/client-IX5LMWV4.mjs.map +0 -7
- package/dist/lib/browser/migrations-3EBTAW3N.mjs.map +0 -7
- package/dist/lib/browser/operation-resolver-2NT3ISVP.mjs.map +0 -7
- package/dist/lib/browser/react-context-4UABG3GP.mjs.map +0 -7
- package/dist/lib/browser/react-surface-RSQ74XCT.mjs.map +0 -7
- package/dist/lib/browser/schema-defs-O7VLP745.mjs.map +0 -7
- package/dist/lib/node-esm/app-graph-builder-2PIYVUNC.mjs.map +0 -7
- package/dist/lib/node-esm/client-FFPK5UFP.mjs.map +0 -7
- package/dist/lib/node-esm/migrations-WSZSFGDK.mjs.map +0 -7
- package/dist/lib/node-esm/operation-resolver-VW5R2BE4.mjs.map +0 -7
- package/dist/lib/node-esm/react-context-UVXMGPW4.mjs.map +0 -7
- package/dist/lib/node-esm/react-surface-KBHANGGC.mjs.map +0 -7
- package/dist/lib/node-esm/schema-defs-QLRGBIKY.mjs.map +0 -7
- /package/dist/lib/browser/{chunk-F7H2Y3Z2.mjs.map → chunk-MY6BJCB6.mjs.map} +0 -0
- /package/dist/lib/node-esm/{chunk-BCELGXRI.mjs.map → chunk-MUOMX53G.mjs.map} +0 -0
|
@@ -9,15 +9,7 @@ import { debounce } from '@dxos/async';
|
|
|
9
9
|
import { useClient } from '@dxos/react-client';
|
|
10
10
|
import { type Identity, useIdentity } from '@dxos/react-client/halo';
|
|
11
11
|
import { ButtonGroup, Clipboard, Input, useTranslation } from '@dxos/react-ui';
|
|
12
|
-
import {
|
|
13
|
-
ControlItem,
|
|
14
|
-
ControlItemInput,
|
|
15
|
-
ControlPage,
|
|
16
|
-
ControlSection,
|
|
17
|
-
Form,
|
|
18
|
-
type FormFieldMap,
|
|
19
|
-
type FormUpdateMeta,
|
|
20
|
-
} from '@dxos/react-ui-form';
|
|
12
|
+
import { Form, type FormFieldMap, type FormUpdateMeta, Settings } from '@dxos/react-ui-form';
|
|
21
13
|
import { EmojiPickerBlock, HuePicker } from '@dxos/react-ui-pickers';
|
|
22
14
|
import { hexToEmoji, hexToHue } from '@dxos/util';
|
|
23
15
|
|
|
@@ -109,14 +101,14 @@ export const ProfileContainer = () => {
|
|
|
109
101
|
);
|
|
110
102
|
|
|
111
103
|
return (
|
|
112
|
-
<
|
|
104
|
+
<Settings.ItemInput title={label} description={t('display name description')}>
|
|
113
105
|
<Input.TextInput
|
|
114
106
|
value={getValue()}
|
|
115
107
|
onChange={handleChange}
|
|
116
108
|
placeholder={t('display name input placeholder')}
|
|
117
109
|
classNames='min-is-64'
|
|
118
110
|
/>
|
|
119
|
-
</
|
|
111
|
+
</Settings.ItemInput>
|
|
120
112
|
);
|
|
121
113
|
},
|
|
122
114
|
emoji: ({ type, label, getValue, onValueChange }) => {
|
|
@@ -127,7 +119,7 @@ export const ProfileContainer = () => {
|
|
|
127
119
|
);
|
|
128
120
|
|
|
129
121
|
return (
|
|
130
|
-
<
|
|
122
|
+
<Settings.Item title={label} description={t('icon description')}>
|
|
131
123
|
<EmojiPickerBlock
|
|
132
124
|
triggerVariant='default'
|
|
133
125
|
emoji={getValue()}
|
|
@@ -135,7 +127,7 @@ export const ProfileContainer = () => {
|
|
|
135
127
|
onClickClear={handleEmojiReset}
|
|
136
128
|
classNames='justify-self-end'
|
|
137
129
|
/>
|
|
138
|
-
</
|
|
130
|
+
</Settings.Item>
|
|
139
131
|
);
|
|
140
132
|
},
|
|
141
133
|
hue: ({ type, label, getValue, onValueChange }) => {
|
|
@@ -146,22 +138,22 @@ export const ProfileContainer = () => {
|
|
|
146
138
|
);
|
|
147
139
|
|
|
148
140
|
return (
|
|
149
|
-
<
|
|
141
|
+
<Settings.Item title={label} description={t('hue description')}>
|
|
150
142
|
<div role='none' className='flex justify-self-end'>
|
|
151
143
|
<HuePicker value={getValue()} onChange={handleChange} onReset={handleHueReset} />
|
|
152
144
|
</div>
|
|
153
|
-
</
|
|
145
|
+
</Settings.Item>
|
|
154
146
|
);
|
|
155
147
|
},
|
|
156
148
|
// TODO(wittjosiah): We need text input annotations for disabled and copyable.
|
|
157
149
|
did: ({ label, getValue }) => {
|
|
158
150
|
return (
|
|
159
|
-
<
|
|
160
|
-
<ButtonGroup>
|
|
151
|
+
<Settings.ItemInput title={label} description={t('did description')}>
|
|
152
|
+
<ButtonGroup classNames='is-full'>
|
|
161
153
|
<Input.TextInput value={getValue()} disabled classNames='min-is-64' />
|
|
162
154
|
<Clipboard.IconButton value={getValue() ?? ''} />
|
|
163
155
|
</ButtonGroup>
|
|
164
|
-
</
|
|
156
|
+
</Settings.ItemInput>
|
|
165
157
|
);
|
|
166
158
|
},
|
|
167
159
|
}),
|
|
@@ -169,16 +161,16 @@ export const ProfileContainer = () => {
|
|
|
169
161
|
);
|
|
170
162
|
|
|
171
163
|
return (
|
|
172
|
-
<
|
|
173
|
-
<
|
|
174
|
-
<
|
|
164
|
+
<Clipboard.Provider>
|
|
165
|
+
<Settings.Root>
|
|
166
|
+
<Settings.Section title={t('profile label')} description={t('profile description')}>
|
|
175
167
|
<Form.Root schema={UserProfile} values={values} fieldMap={fieldMap} onValuesChanged={handleChange}>
|
|
176
168
|
<Form.Content>
|
|
177
|
-
<Form.FieldSet classNames='
|
|
169
|
+
<Form.FieldSet classNames='space-y-trimMd' />
|
|
178
170
|
</Form.Content>
|
|
179
171
|
</Form.Root>
|
|
180
|
-
</
|
|
181
|
-
</
|
|
182
|
-
</
|
|
172
|
+
</Settings.Section>
|
|
173
|
+
</Settings.Root>
|
|
174
|
+
</Clipboard.Provider>
|
|
183
175
|
);
|
|
184
176
|
};
|
|
@@ -35,7 +35,7 @@ const meta = {
|
|
|
35
35
|
title: 'plugins/plugin-client/RecoveryCodeDialog',
|
|
36
36
|
component: RecoveryCodeDialog as any,
|
|
37
37
|
render: DefaultStory,
|
|
38
|
-
decorators: [withTheme, withClientProvider({ createIdentity: true })],
|
|
38
|
+
decorators: [withTheme(), withClientProvider({ createIdentity: true })],
|
|
39
39
|
parameters: {
|
|
40
40
|
layout: 'fullscreen',
|
|
41
41
|
translations,
|
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
|
|
5
5
|
import React from 'react';
|
|
6
6
|
|
|
7
|
-
import { useOperationInvoker } from '@dxos/app-framework/
|
|
7
|
+
import { useOperationInvoker } from '@dxos/app-framework/ui';
|
|
8
8
|
import { useCredentials } from '@dxos/react-client/halo';
|
|
9
9
|
import { Icon, IconButton, List, ListItem, Message, useTranslation } from '@dxos/react-ui';
|
|
10
|
-
import {
|
|
10
|
+
import { Settings } from '@dxos/react-ui-form';
|
|
11
11
|
|
|
12
12
|
import { meta } from '../meta';
|
|
13
13
|
import { ClientOperation } from '../types';
|
|
@@ -23,28 +23,28 @@ export const RecoveryCredentialsContainer = () => {
|
|
|
23
23
|
);
|
|
24
24
|
|
|
25
25
|
return (
|
|
26
|
-
<
|
|
27
|
-
<
|
|
28
|
-
<
|
|
29
|
-
<
|
|
26
|
+
<Settings.Root>
|
|
27
|
+
<Settings.Section title={t('recovery setup dialog title')} description={t('recovery setup dialog description')}>
|
|
28
|
+
<Settings.Group>
|
|
29
|
+
<Settings.Item title={t('create passkey label')} description={t('create passkey description')}>
|
|
30
30
|
<IconButton
|
|
31
31
|
label={t('create passkey label')}
|
|
32
32
|
icon='ph--key--duotone'
|
|
33
33
|
variant='primary'
|
|
34
34
|
onClick={() => invokePromise(ClientOperation.CreatePasskey)}
|
|
35
35
|
/>
|
|
36
|
-
</
|
|
37
|
-
<
|
|
36
|
+
</Settings.Item>
|
|
37
|
+
<Settings.Item title={t('create recovery code label')} description={t('create recovery code description')}>
|
|
38
38
|
<IconButton
|
|
39
39
|
label={t('create recovery code label')}
|
|
40
40
|
icon='ph--receipt--duotone'
|
|
41
41
|
variant='default'
|
|
42
42
|
onClick={() => invokePromise(ClientOperation.CreateRecoveryCode)}
|
|
43
43
|
/>
|
|
44
|
-
</
|
|
45
|
-
</
|
|
46
|
-
</
|
|
47
|
-
<
|
|
44
|
+
</Settings.Item>
|
|
45
|
+
</Settings.Group>
|
|
46
|
+
</Settings.Section>
|
|
47
|
+
<Settings.Section title={t('credentials list label')}>
|
|
48
48
|
{recoveryCredentials.length < 1 ? (
|
|
49
49
|
<Message.Root valence='error' classNames='container-max-width'>
|
|
50
50
|
<Message.Title icon='ph--shield-warning--duotone'>{t('no credentials title')}</Message.Title>
|
|
@@ -62,7 +62,7 @@ export const RecoveryCredentialsContainer = () => {
|
|
|
62
62
|
))}
|
|
63
63
|
</List>
|
|
64
64
|
)}
|
|
65
|
-
</
|
|
66
|
-
</
|
|
65
|
+
</Settings.Section>
|
|
66
|
+
</Settings.Root>
|
|
67
67
|
);
|
|
68
68
|
};
|
|
@@ -6,9 +6,9 @@ import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
|
6
6
|
import * as Effect from 'effect/Effect';
|
|
7
7
|
import React from 'react';
|
|
8
8
|
|
|
9
|
-
import { OperationPlugin } from '@dxos/app-framework';
|
|
10
|
-
import { usePluginManager } from '@dxos/app-framework/react';
|
|
9
|
+
import { OperationPlugin, RuntimePlugin } from '@dxos/app-framework';
|
|
11
10
|
import { withPluginManager } from '@dxos/app-framework/testing';
|
|
11
|
+
import { usePluginManager } from '@dxos/app-framework/ui';
|
|
12
12
|
import { Dialog } from '@dxos/react-ui';
|
|
13
13
|
import { withTheme } from '@dxos/react-ui/testing';
|
|
14
14
|
|
|
@@ -17,15 +17,15 @@ import { translations } from '../translations';
|
|
|
17
17
|
|
|
18
18
|
import { ResetDialog, type ResetDialogProps } from './ResetDialog';
|
|
19
19
|
|
|
20
|
-
const
|
|
20
|
+
const DefaultStory = (props: Omit<ResetDialogProps, 'capabilityManager'>) => {
|
|
21
21
|
const manager = usePluginManager();
|
|
22
22
|
|
|
23
23
|
return (
|
|
24
24
|
<Dialog.Root open>
|
|
25
25
|
<Dialog.Overlay>
|
|
26
26
|
<ResetDialog
|
|
27
|
-
onReset={() => Effect.sync(() => console.log('reset'))}
|
|
28
27
|
capabilityManager={manager.capabilities}
|
|
28
|
+
onReset={() => Effect.sync(() => console.log('reset'))}
|
|
29
29
|
{...props}
|
|
30
30
|
/>
|
|
31
31
|
</Dialog.Overlay>
|
|
@@ -36,11 +36,11 @@ const Render = (props: Omit<ResetDialogProps, 'capabilityManager'>) => {
|
|
|
36
36
|
const meta = {
|
|
37
37
|
title: 'plugins/plugin-client/ResetDialog',
|
|
38
38
|
component: ResetDialog,
|
|
39
|
-
render:
|
|
39
|
+
render: DefaultStory,
|
|
40
40
|
decorators: [
|
|
41
|
-
withTheme,
|
|
41
|
+
withTheme(),
|
|
42
42
|
withPluginManager({
|
|
43
|
-
plugins: [OperationPlugin(), ClientPlugin({})],
|
|
43
|
+
plugins: [RuntimePlugin(), OperationPlugin(), ClientPlugin({})],
|
|
44
44
|
}),
|
|
45
45
|
],
|
|
46
46
|
parameters: {
|
|
@@ -53,8 +53,20 @@ export default meta;
|
|
|
53
53
|
|
|
54
54
|
type Story = StoryObj<typeof meta>;
|
|
55
55
|
|
|
56
|
-
export const Default: Story = {
|
|
56
|
+
export const Default: Story = {
|
|
57
|
+
args: {
|
|
58
|
+
mode: 'reset storage' as const,
|
|
59
|
+
} as any,
|
|
60
|
+
};
|
|
57
61
|
|
|
58
|
-
export const JoinNewIdentity: Story = {
|
|
62
|
+
export const JoinNewIdentity: Story = {
|
|
63
|
+
args: {
|
|
64
|
+
mode: 'join new identity' as const,
|
|
65
|
+
} as any,
|
|
66
|
+
};
|
|
59
67
|
|
|
60
|
-
export const Recover: Story = {
|
|
68
|
+
export const Recover: Story = {
|
|
69
|
+
args: {
|
|
70
|
+
mode: 'recover' as const,
|
|
71
|
+
} as any,
|
|
72
|
+
};
|
|
@@ -5,8 +5,9 @@
|
|
|
5
5
|
import * as Effect from 'effect/Effect';
|
|
6
6
|
import React, { useCallback } from 'react';
|
|
7
7
|
|
|
8
|
-
import { Capability, type CapabilityManager
|
|
9
|
-
import { useOperationInvoker } from '@dxos/app-framework/
|
|
8
|
+
import { Capability, type CapabilityManager } from '@dxos/app-framework';
|
|
9
|
+
import { useOperationInvoker } from '@dxos/app-framework/ui';
|
|
10
|
+
import { LayoutOperation } from '@dxos/app-toolkit';
|
|
10
11
|
import { runAndForwardErrors } from '@dxos/effect';
|
|
11
12
|
import { useClient } from '@dxos/react-client';
|
|
12
13
|
import { Dialog, useTranslation } from '@dxos/react-ui';
|
|
@@ -35,16 +36,18 @@ export const ResetDialog = ({ mode, onReset, capabilityManager }: ResetDialogPro
|
|
|
35
36
|
}, [client, mode, onReset, capabilityManager]);
|
|
36
37
|
|
|
37
38
|
const handleCancel = useCallback(() => {
|
|
38
|
-
void invokePromise(
|
|
39
|
+
void invokePromise(LayoutOperation.UpdateDialog, { state: false });
|
|
39
40
|
}, [invokePromise]);
|
|
40
41
|
|
|
41
42
|
// TODO(wittjosiah): Add the sr-only translations.
|
|
42
43
|
// TODO(wittjosiah): Add missing descriptions to other dialogs.
|
|
43
44
|
return (
|
|
44
|
-
|
|
45
|
-
<Dialog.
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
45
|
+
<>
|
|
46
|
+
<Dialog.Content>
|
|
47
|
+
<Dialog.Title classNames='sr-only'>{t('reset dialog title')}</Dialog.Title>
|
|
48
|
+
<Dialog.Description classNames='sr-only'>{t('reset dialog description')}</Dialog.Description>
|
|
49
|
+
<ConfirmReset active mode={mode} onConfirm={handleReset} onCancel={handleCancel} />
|
|
50
|
+
</Dialog.Content>
|
|
51
|
+
</>
|
|
49
52
|
);
|
|
50
53
|
};
|
package/src/translations.ts
CHANGED
|
@@ -36,7 +36,7 @@ const pluginTranslations = [
|
|
|
36
36
|
'display name description': 'Your name as it appears in the app.',
|
|
37
37
|
'display name input placeholder': 'Enter a name',
|
|
38
38
|
'icon label': 'Avatar',
|
|
39
|
-
'icon description': 'The emoji used to represent
|
|
39
|
+
'icon description': 'The emoji used to represent the user.',
|
|
40
40
|
'hue label': 'Color',
|
|
41
41
|
'hue description':
|
|
42
42
|
'The color used to represent you in the app, including as your avatar’s background, your cursor as it appears to others, and the messages you send in group threads.',
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/capabilities/app-graph-builder/app-graph-builder.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability, Common } from '@dxos/app-framework';\nimport { Operation } from '@dxos/operation';\nimport { CreateAtom, GraphBuilder, NodeMatcher } from '@dxos/plugin-graph';\nimport { ConnectionState } from '@dxos/react-client/mesh';\n\nimport { meta } from '../../meta';\nimport { Account, ClientCapabilities, ClientOperation } from '../../types';\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n const extensions = yield* GraphBuilder.createExtension({\n id: meta.id,\n match: NodeMatcher.whenRoot,\n actions: () =>\n Effect.succeed([\n {\n id: `${meta.id}/open-user-account`,\n data: () => Operation.invoke(ClientOperation.ShareIdentity),\n properties: {\n label: ['open user account label', { ns: meta.id }],\n icon: 'ph--user--regular',\n disposition: 'menu',\n keyBinding: {\n macos: 'meta+shift+.',\n // TODO(wittjosiah): Test on windows to see if it behaves the same as linux.\n windows: 'alt+shift+.',\n linux: 'alt+shift+>',\n },\n },\n },\n ]),\n connector: Effect.fnUntraced(function* (node, get) {\n const client = yield* Capability.get(ClientCapabilities.Client);\n const identity = get(CreateAtom.fromObservable(client.halo.identity));\n const status = get(CreateAtom.fromObservable(client.mesh.networkStatus));\n\n return [\n {\n id: Account.id,\n type: meta.id,\n properties: {\n label: ['account label', { ns: meta.id }],\n icon: 'ph--user--regular',\n disposition: 'user-account',\n testId: 'clientPlugin.account',\n // NOTE: This currently needs to be the identity key because the fallback is generated from hex.\n userId: identity?.identityKey.toHex(),\n hue: identity?.profile?.data?.hue,\n emoji: identity?.profile?.data?.emoji,\n status: status.swarm === ConnectionState.OFFLINE ? 'error' : 'active',\n },\n nodes: [\n {\n id: Account.Profile,\n data: Account.Profile,\n type: meta.id,\n properties: {\n label: ['profile label', { ns: meta.id }],\n icon: 'ph--user--regular',\n },\n },\n {\n id: Account.Devices,\n data: Account.Devices,\n type: meta.id,\n properties: {\n label: ['devices label', { ns: meta.id }],\n icon: 'ph--devices--regular',\n testId: 'clientPlugin.devices',\n },\n },\n {\n id: Account.Security,\n data: Account.Security,\n type: meta.id,\n properties: {\n label: ['security label', { ns: meta.id }],\n icon: 'ph--key--regular',\n },\n },\n ],\n },\n ];\n }),\n });\n\n return Capability.contributes(Common.Capability.AppGraphBuilder, extensions);\n }),\n);\n"],
|
|
5
|
-
"mappings": ";;;;;;;;AAIA,YAAYA,YAAY;AAExB,SAASC,YAAYC,cAAc;AACnC,SAASC,iBAAiB;AAC1B,SAASC,YAAYC,cAAcC,mBAAmB;AACtD,SAASC,uBAAuB;AAKhC,IAAA,4BAAeC,WAAWC,WACjBC,kBAAW,aAAA;AAChB,QAAMC,aAAa,OAAOC,aAAaC,gBAAgB;IACrDC,IAAIC,KAAKD;IACTE,OAAOC,YAAYC;IACnBC,SAAS,MACAC,eAAQ;MACb;QACEN,IAAI,GAAGC,KAAKD,EAAE;QACdO,MAAM,MAAMC,UAAUC,OAAOC,gBAAgBC,aAAa;QAC1DC,YAAY;UACVC,OAAO;YAAC;YAA2B;cAAEC,IAAIb,KAAKD;YAAG;;UACjDe,MAAM;UACNC,aAAa;UACbC,YAAY;YACVC,OAAO;;YAEPC,SAAS;YACTC,OAAO;UACT;QACF;MACF;KACD;IACHC,WAAkBzB,kBAAW,WAAW0B,MAAMC,KAAG;AAC/C,YAAMC,SAAS,OAAO9B,WAAW6B,IAAIE,mBAAmBC,MAAM;AAC9D,YAAMC,WAAWJ,IAAIK,WAAWC,eAAeL,OAAOM,KAAKH,QAAQ,CAAA;AACnE,YAAMI,SAASR,IAAIK,WAAWC,eAAeL,OAAOQ,KAAKC,aAAa,CAAA;AAEtE,aAAO;QACL;UACEjC,IAAIkC,QAAQlC;UACZmC,MAAMlC,KAAKD;UACXY,YAAY;YACVC,OAAO;cAAC;cAAiB;gBAAEC,IAAIb,KAAKD;cAAG;;YACvCe,MAAM;YACNC,aAAa;YACboB,QAAQ;;YAERC,QAAQV,UAAUW,YAAYC,MAAAA;YAC9BC,KAAKb,UAAUc,SAASlC,MAAMiC;YAC9BE,OAAOf,UAAUc,SAASlC,MAAMmC;YAChCX,QAAQA,OAAOY,UAAUC,gBAAgBC,UAAU,UAAU;UAC/D;UACAC,OAAO;YACL;cACE9C,IAAIkC,QAAQa;cACZxC,MAAM2B,QAAQa;cACdZ,MAAMlC,KAAKD;cACXY,YAAY;gBACVC,OAAO;kBAAC;kBAAiB;oBAAEC,IAAIb,KAAKD;kBAAG;;gBACvCe,MAAM;cACR;YACF;YACA;cACEf,IAAIkC,QAAQc;cACZzC,MAAM2B,QAAQc;cACdb,MAAMlC,KAAKD;cACXY,YAAY;gBACVC,OAAO;kBAAC;kBAAiB;oBAAEC,IAAIb,KAAKD;kBAAG;;gBACvCe,MAAM;gBACNqB,QAAQ;cACV;YACF;YACA;cACEpC,IAAIkC,QAAQe;cACZ1C,MAAM2B,QAAQe;cACdd,MAAMlC,KAAKD;cACXY,YAAY;gBACVC,OAAO;kBAAC;kBAAkB;oBAAEC,IAAIb,KAAKD;kBAAG;;gBACxCe,MAAM;cACR;YACF;;QAEJ;;IAEJ,CAAA;EACF,CAAA;AAEA,SAAOrB,WAAWwD,YAAYC,OAAOzD,WAAW0D,iBAAiBvD,UAAAA;AACnE,CAAA,CAAA;",
|
|
6
|
-
"names": ["Effect", "Capability", "Common", "Operation", "CreateAtom", "GraphBuilder", "NodeMatcher", "ConnectionState", "Capability", "makeModule", "fnUntraced", "extensions", "GraphBuilder", "createExtension", "id", "meta", "match", "NodeMatcher", "whenRoot", "actions", "succeed", "data", "Operation", "invoke", "ClientOperation", "ShareIdentity", "properties", "label", "ns", "icon", "disposition", "keyBinding", "macos", "windows", "linux", "connector", "node", "get", "client", "ClientCapabilities", "Client", "identity", "CreateAtom", "fromObservable", "halo", "status", "mesh", "networkStatus", "Account", "type", "testId", "userId", "identityKey", "toHex", "hue", "profile", "emoji", "swarm", "ConnectionState", "OFFLINE", "nodes", "Profile", "Devices", "Security", "contributes", "Common", "AppGraphBuilder"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/capabilities/client/client.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability, Common, Plugin } from '@dxos/app-framework';\nimport { Client, ClientService } from '@dxos/client';\nimport { runAndForwardErrors } from '@dxos/effect';\nimport { log } from '@dxos/log';\n\nimport { ClientEvents } from '../../types';\nimport { ClientCapabilities, type ClientPluginOptions } from '../../types';\n\ntype ClientCapabilityOptions = Omit<ClientPluginOptions, 'appKey' | 'invitationUrl' | 'invitationParam' | 'onReset'>;\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* (props?: ClientCapabilityOptions) {\n const { onClientInitialized, onSpacesReady, ...options } = props!;\n const capabilityManager = yield* Capability.Service;\n const pluginManager = yield* Plugin.Service;\n\n log('creating client');\n const client = new Client(options);\n log('initializing client');\n yield* Effect.tryPromise(() => client.initialize());\n log('initialized client');\n if (onClientInitialized) {\n yield* onClientInitialized({ client }).pipe(\n Effect.provideService(Capability.Service, capabilityManager),\n Effect.provideService(Plugin.Service, pluginManager),\n );\n }\n log('called client initialized callback');\n\n // TODO(wittjosiah): Remove. This is a hack to get the app to boot with the new identity after a reset.\n client.reloaded.on(() => {\n client.halo.identity.subscribe(async (identity) => {\n if (identity) {\n window.location.href = window.location.origin;\n }\n });\n });\n\n // TODO(burdon): The callback isn't called?\n const subscription = client.spaces.isReady.subscribe(async (ready) => {\n if (ready) {\n await Effect.gen(function* () {\n yield* Plugin.activate(ClientEvents.SpacesReady);\n if (onSpacesReady) {\n yield* onSpacesReady({ client });\n }\n }).pipe(\n Effect.provideService(Capability.Service, capabilityManager),\n Effect.provideService(Plugin.Service, pluginManager),\n runAndForwardErrors,\n );\n }\n });\n\n log('client capability ready');\n\n return [\n // TODO(wittjosiah): Try to remove and prefer layer?\n // Perhaps move to using layer has source of truth and add a getter capability for the client.\n Capability.contributes(ClientCapabilities.Client, client, () =>\n Effect.gen(function* () {\n subscription.unsubscribe();\n yield* Effect.tryPromise(() => client.destroy());\n }),\n ),\n Capability.contributes(Common.Capability.Layer, ClientService.fromClient(client)),\n ];\n }),\n);\n"],
|
|
5
|
-
"mappings": ";;;;;;AAIA,YAAYA,YAAY;AAExB,SAASC,YAAYC,QAAQC,cAAc;AAC3C,SAASC,QAAQC,qBAAqB;AACtC,SAASC,2BAA2B;AACpC,SAASC,WAAW;;AAOpB,IAAA,iBAAeC,WAAWC,WACjBC,kBAAW,WAAWC,OAA+B;AAC1D,QAAM,EAAEC,qBAAqBC,eAAe,GAAGC,QAAAA,IAAYH;AAC3D,QAAMI,oBAAoB,OAAOP,WAAWQ;AAC5C,QAAMC,gBAAgB,OAAOC,OAAOF;AAEpCG,MAAI,mBAAA,QAAA;;;;;;AACJ,QAAMC,SAAS,IAAIC,OAAOP,OAAAA;AAC1BK,MAAI,uBAAA,QAAA;;;;;;AACJ,SAAcG,kBAAW,MAAMF,OAAOG,WAAU,CAAA;AAChDJ,MAAI,sBAAA,QAAA;;;;;;AACJ,MAAIP,qBAAqB;AACvB,WAAOA,oBAAoB;MAAEQ;IAAO,CAAA,EAAGI,KAC9BC,sBAAejB,WAAWQ,SAASD,iBAAAA,GACnCU,sBAAeP,OAAOF,SAASC,aAAAA,CAAAA;EAE1C;AACAE,MAAI,sCAAA,QAAA;;;;;;AAGJC,SAAOM,SAASC,GAAG,MAAA;AACjBP,WAAOQ,KAAKC,SAASC,UAAU,OAAOD,aAAAA;AACpC,UAAIA,UAAU;AACZE,eAAOC,SAASC,OAAOF,OAAOC,SAASE;MACzC;IACF,CAAA;EACF,CAAA;AAGA,QAAMC,eAAef,OAAOgB,OAAOC,QAAQP,UAAU,OAAOQ,UAAAA;AAC1D,QAAIA,OAAO;AACT,YAAaC,WAAI,aAAA;AACf,eAAOrB,OAAOsB,SAASC,aAAaC,WAAW;AAC/C,YAAI7B,eAAe;AACjB,iBAAOA,cAAc;YAAEO;UAAO,CAAA;QAChC;MACF,CAAA,EAAGI,KACMC,sBAAejB,WAAWQ,SAASD,iBAAAA,GACnCU,sBAAeP,OAAOF,SAASC,aAAAA,GACtC0B,mBAAAA;IAEJ;EACF,CAAA;AAEAxB,MAAI,2BAAA,QAAA;;;;;;AAEJ,SAAO;;;IAGLX,WAAWoC,YAAYC,mBAAmBxB,QAAQD,QAAQ,MACjDmB,WAAI,aAAA;AACTJ,mBAAaW,YAAW;AACxB,aAAcxB,kBAAW,MAAMF,OAAO2B,QAAO,CAAA;IAC/C,CAAA,CAAA;IAEFvC,WAAWoC,YAAYI,OAAOxC,WAAWyC,OAAOC,cAAcC,WAAW/B,MAAAA,CAAAA;;AAE7E,CAAA,CAAA;",
|
|
6
|
-
"names": ["Effect", "Capability", "Common", "Plugin", "Client", "ClientService", "runAndForwardErrors", "log", "Capability", "makeModule", "fnUntraced", "props", "onClientInitialized", "onSpacesReady", "options", "capabilityManager", "Service", "pluginManager", "Plugin", "log", "client", "Client", "tryPromise", "initialize", "pipe", "provideService", "reloaded", "on", "halo", "identity", "subscribe", "window", "location", "href", "origin", "subscription", "spaces", "isReady", "ready", "gen", "activate", "ClientEvents", "SpacesReady", "runAndForwardErrors", "contributes", "ClientCapabilities", "unsubscribe", "destroy", "Common", "Layer", "ClientService", "fromClient"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/capabilities/migrations/migrations.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability, Common } from '@dxos/app-framework';\n\nimport { ClientCapabilities } from '../../types';\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n const registry = yield* Capability.get(Common.Capability.AtomRegistry);\n const client = yield* Capability.get(ClientCapabilities.Client);\n const migrationsAtom = yield* Capability.atom(ClientCapabilities.Migration);\n\n // NOTE: Migrations are currently unidirectional and idempotent.\n const cancel = registry.subscribe(\n migrationsAtom,\n (_migrations: any[]) => {\n const migrations = Array.from(new Set(_migrations.flat()));\n const spaces = client.spaces.get();\n void Promise.all(spaces.map((space: any) => space.internal.db.runMigrations(migrations)));\n },\n { immediate: true },\n );\n\n return Capability.contributes(Common.Capability.Null, null, () => Effect.sync(() => cancel()));\n }),\n);\n"],
|
|
5
|
-
"mappings": ";;;;;AAIA,YAAYA,YAAY;AAExB,SAASC,YAAYC,cAAc;AAInC,IAAA,qBAAeC,WAAWC,WACjBC,kBAAW,aAAA;AAChB,QAAMC,WAAW,OAAOH,WAAWI,IAAIC,OAAOL,WAAWM,YAAY;AACrE,QAAMC,SAAS,OAAOP,WAAWI,IAAII,mBAAmBC,MAAM;AAC9D,QAAMC,iBAAiB,OAAOV,WAAWW,KAAKH,mBAAmBI,SAAS;AAG1E,QAAMC,SAASV,SAASW,UACtBJ,gBACA,CAACK,gBAAAA;AACC,UAAMC,aAAaC,MAAMC,KAAK,IAAIC,IAAIJ,YAAYK,KAAI,CAAA,CAAA;AACtD,UAAMC,SAASd,OAAOc,OAAOjB,IAAG;AAChC,SAAKkB,QAAQC,IAAIF,OAAOG,IAAI,CAACC,UAAeA,MAAMC,SAASC,GAAGC,cAAcZ,UAAAA,CAAAA,CAAAA;EAC9E,GACA;IAAEa,WAAW;EAAK,CAAA;AAGpB,SAAO7B,WAAW8B,YAAYzB,OAAOL,WAAW+B,MAAM,MAAM,MAAaC,YAAK,MAAMnB,OAAAA,CAAAA,CAAAA;AACtF,CAAA,CAAA;",
|
|
6
|
-
"names": ["Effect", "Capability", "Common", "Capability", "makeModule", "fnUntraced", "registry", "get", "Common", "AtomRegistry", "client", "ClientCapabilities", "Client", "migrationsAtom", "atom", "Migration", "cancel", "subscribe", "_migrations", "migrations", "Array", "from", "Set", "flat", "spaces", "Promise", "all", "map", "space", "internal", "db", "runMigrations", "immediate", "contributes", "Null", "sync"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/capabilities/operation-resolver/operation-resolver.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability, Common } from '@dxos/app-framework';\nimport { PublicKey } from '@dxos/client';\nimport { runAndForwardErrors } from '@dxos/effect';\nimport { invariant } from '@dxos/invariant';\nimport { OperationResolver } from '@dxos/operation';\nimport { Operation } from '@dxos/operation';\nimport { ObservabilityOperation } from '@dxos/plugin-observability/types';\nimport { type JoinPanelProps } from '@dxos/shell/react';\n\nimport { JOIN_DIALOG, RECOVERY_CODE_DIALOG, RESET_DIALOG } from '../../constants';\nimport { ClientEvents } from '../../types';\nimport { Account, ClientCapabilities, ClientOperation } from '../../types';\n\ntype OperationResolverOptions = {\n appName?: string;\n};\n\nconst RECOVER_IDENTITY_RPC_TIMEOUT = 20_000;\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* (props?: OperationResolverOptions) {\n const { appName = 'Composer' } = props ?? {};\n\n return Capability.contributes(Common.Capability.OperationResolver, [\n //\n // CreateIdentity\n //\n OperationResolver.make({\n operation: ClientOperation.CreateIdentity,\n handler: Effect.fnUntraced(function* (profile) {\n const manager = yield* Capability.get(Common.Capability.PluginManager);\n const client = yield* Capability.get(ClientCapabilities.Client);\n const data = yield* Effect.promise(() => client.halo.createIdentity(profile));\n yield* Effect.promise(() => runAndForwardErrors(manager.activate(ClientEvents.IdentityCreated)));\n yield* Operation.schedule(ObservabilityOperation.SendEvent, { name: 'identity.create' });\n return data;\n }),\n }),\n\n //\n // JoinIdentity\n //\n OperationResolver.make({\n operation: ClientOperation.JoinIdentity,\n handler: Effect.fnUntraced(function* (data) {\n yield* Operation.invoke(Common.LayoutOperation.UpdateDialog, {\n subject: JOIN_DIALOG,\n blockAlign: 'start',\n props: {\n initialInvitationCode: data.invitationCode,\n initialDisposition: 'accept-halo-invitation',\n },\n });\n }),\n }),\n\n //\n // ShareIdentity\n //\n OperationResolver.make({\n operation: ClientOperation.ShareIdentity,\n handler: Effect.fnUntraced(function* () {\n yield* Operation.invoke(Common.LayoutOperation.SwitchWorkspace, { subject: Account.id });\n yield* Operation.invoke(Common.LayoutOperation.Open, { subject: [Account.Profile] });\n yield* Operation.schedule(ObservabilityOperation.SendEvent, { name: 'identity.share' });\n }),\n }),\n\n //\n // RecoverIdentity\n //\n OperationResolver.make({\n operation: ClientOperation.RecoverIdentity,\n handler: Effect.fnUntraced(function* () {\n yield* Operation.invoke(Common.LayoutOperation.UpdateDialog, {\n subject: JOIN_DIALOG,\n blockAlign: 'start',\n props: {\n initialDisposition: 'recover-identity',\n } satisfies Partial<JoinPanelProps>,\n });\n }),\n }),\n\n //\n // ResetStorage\n //\n OperationResolver.make({\n operation: ClientOperation.ResetStorage,\n handler: Effect.fnUntraced(function* (data) {\n yield* Operation.invoke(Common.LayoutOperation.UpdateDialog, {\n subject: RESET_DIALOG,\n blockAlign: 'start',\n props: {\n mode: data.mode ?? 'reset storage',\n },\n });\n }),\n }),\n\n //\n // CreateAgent\n //\n OperationResolver.make({\n operation: ClientOperation.CreateAgent,\n handler: Effect.fnUntraced(function* () {\n const client = yield* Capability.get(ClientCapabilities.Client);\n invariant(client.services.services.EdgeAgentService, 'Missing EdgeAgentService');\n yield* Effect.promise(() =>\n client.services.services.EdgeAgentService!.createAgent(undefined, { timeout: 10_000 }),\n );\n }),\n }),\n\n //\n // CreateRecoveryCode\n //\n OperationResolver.make({\n operation: ClientOperation.CreateRecoveryCode,\n handler: Effect.fnUntraced(function* () {\n const client = yield* Capability.get(ClientCapabilities.Client);\n invariant(client.services.services.IdentityService, 'IdentityService not available');\n const { recoveryCode } = yield* Effect.promise(() =>\n client.services.services.IdentityService!.createRecoveryCredential({}),\n );\n yield* Operation.invoke(Common.LayoutOperation.UpdateDialog, {\n subject: RECOVERY_CODE_DIALOG,\n blockAlign: 'start',\n type: 'alert',\n props: { code: recoveryCode },\n });\n }),\n }),\n\n //\n // CreatePasskey\n //\n OperationResolver.make({\n operation: ClientOperation.CreatePasskey,\n handler: Effect.fnUntraced(function* () {\n const client = yield* Capability.get(ClientCapabilities.Client);\n const identity = client.halo.identity.get();\n invariant(identity, 'Identity not available');\n\n const lookupKey = PublicKey.random();\n const credential = yield* Effect.promise(() =>\n navigator.credentials.create({\n publicKey: {\n challenge: new Uint8Array(),\n rp: { id: location.hostname, name: appName },\n user: {\n id: lookupKey.asUint8Array() as Uint8Array<ArrayBuffer>,\n name: identity.did,\n displayName: identity.profile?.displayName ?? '',\n },\n pubKeyCredParams: [\n { type: 'public-key', alg: -8 }, // Ed25519 (not yet supported across all browsers)\n { type: 'public-key', alg: -7 }, // ES256\n ],\n authenticatorSelection: {\n residentKey: 'required',\n requireResidentKey: true,\n },\n },\n }),\n );\n\n invariant(credential, 'Credential not available');\n const recoveryKey = PublicKey.from(new Uint8Array((credential as any).response.getPublicKey()));\n const algorithm = (credential as any).response.getPublicKeyAlgorithm() === -7 ? 'ES256' : 'ED25519';\n\n invariant(client.services.services.IdentityService, 'IdentityService not available');\n yield* Effect.promise(() =>\n client.services.services.IdentityService!.createRecoveryCredential({\n data: {\n recoveryKey,\n algorithm,\n lookupKey,\n },\n }),\n );\n }),\n }),\n\n //\n // RedeemPasskey\n //\n OperationResolver.make({\n operation: ClientOperation.RedeemPasskey,\n handler: Effect.fnUntraced(function* () {\n const client = yield* Capability.get(ClientCapabilities.Client);\n invariant(client.services.services.IdentityService, 'IdentityService not available');\n const { deviceKey, controlFeedKey, challenge } = yield* Effect.promise(() =>\n client.services.services.IdentityService!.requestRecoveryChallenge(),\n );\n const credential = yield* Effect.promise(() =>\n navigator.credentials.get({\n publicKey: {\n challenge: Buffer.from(challenge, 'base64'),\n rpId: location.hostname,\n userVerification: 'required',\n },\n }),\n );\n const lookupKey = PublicKey.from(new Uint8Array((credential as any).response.userHandle));\n yield* Effect.promise(() =>\n client.services.services.IdentityService!.recoverIdentity(\n {\n external: {\n lookupKey,\n deviceKey,\n controlFeedKey,\n signature: Buffer.from((credential as any).response.signature),\n clientDataJson: Buffer.from((credential as any).response.clientDataJSON),\n authenticatorData: Buffer.from((credential as any).response.authenticatorData),\n },\n },\n { timeout: RECOVER_IDENTITY_RPC_TIMEOUT },\n ),\n );\n }),\n }),\n\n //\n // RedeemToken\n //\n OperationResolver.make({\n operation: ClientOperation.RedeemToken,\n handler: Effect.fnUntraced(function* (data) {\n const client = yield* Capability.get(ClientCapabilities.Client);\n invariant(client.services.services.IdentityService, 'IdentityService not available');\n yield* Effect.promise(() =>\n client.services.services.IdentityService!.recoverIdentity(\n { token: data.token },\n { timeout: RECOVER_IDENTITY_RPC_TIMEOUT },\n ),\n );\n }),\n }),\n ]);\n }),\n);\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["Effect", "Capability", "Common", "PublicKey", "runAndForwardErrors", "invariant", "OperationResolver", "Operation", "ObservabilityOperation", "RECOVER_IDENTITY_RPC_TIMEOUT", "Capability", "makeModule", "fnUntraced", "props", "appName", "contributes", "Common", "OperationResolver", "make", "operation", "ClientOperation", "CreateIdentity", "handler", "profile", "manager", "get", "PluginManager", "client", "ClientCapabilities", "Client", "data", "promise", "halo", "createIdentity", "runAndForwardErrors", "activate", "ClientEvents", "IdentityCreated", "Operation", "schedule", "ObservabilityOperation", "SendEvent", "name", "JoinIdentity", "invoke", "LayoutOperation", "UpdateDialog", "subject", "JOIN_DIALOG", "blockAlign", "initialInvitationCode", "invitationCode", "initialDisposition", "ShareIdentity", "SwitchWorkspace", "Account", "id", "Open", "Profile", "RecoverIdentity", "ResetStorage", "RESET_DIALOG", "mode", "CreateAgent", "invariant", "services", "EdgeAgentService", "createAgent", "undefined", "timeout", "CreateRecoveryCode", "IdentityService", "recoveryCode", "createRecoveryCredential", "RECOVERY_CODE_DIALOG", "type", "code", "CreatePasskey", "identity", "lookupKey", "PublicKey", "random", "credential", "navigator", "credentials", "create", "publicKey", "challenge", "Uint8Array", "rp", "location", "hostname", "user", "asUint8Array", "did", "displayName", "pubKeyCredParams", "alg", "authenticatorSelection", "residentKey", "requireResidentKey", "recoveryKey", "from", "response", "getPublicKey", "algorithm", "getPublicKeyAlgorithm", "RedeemPasskey", "deviceKey", "controlFeedKey", "requestRecoveryChallenge", "Buffer", "rpId", "userVerification", "userHandle", "recoverIdentity", "external", "signature", "clientDataJson", "clientDataJSON", "authenticatorData", "RedeemToken", "token"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/capabilities/react-context/react-context.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\nimport React from 'react';\n\nimport { Capability, Common } from '@dxos/app-framework';\nimport { useCapability } from '@dxos/app-framework/react';\nimport { ClientProvider } from '@dxos/react-client';\n\nimport { meta } from '../../meta';\nimport { ClientCapabilities } from '../../types';\n\nexport default Capability.makeModule(() =>\n Effect.succeed(\n Capability.contributes(Common.Capability.ReactContext, {\n id: meta.id,\n context: ({ children }: { children?: React.ReactNode }) => {\n const client = useCapability(ClientCapabilities.Client);\n return <ClientProvider client={client}>{children}</ClientProvider>;\n },\n }),\n ),\n);\n"],
|
|
5
|
-
"mappings": ";;;;;;AAIA,YAAYA,YAAY;AACxB,OAAOC,WAAW;AAElB,SAASC,YAAYC,cAAc;AACnC,SAASC,qBAAqB;AAC9B,SAASC,sBAAsB;AAK/B,IAAA,wBAAeC,WAAWC,WAAW,MAC5BC,eACLF,WAAWG,YAAYC,OAAOJ,WAAWK,cAAc;EACrDC,IAAIC,KAAKD;EACTE,SAAS,CAAC,EAAEC,SAAQ,MAAkC;AACpD,UAAMC,SAASC,cAAcC,mBAAmBC,MAAM;AACtD,WAAO,sBAAA,cAACC,gBAAAA;MAAeJ;OAAiBD,QAAAA;EAC1C;AACF,CAAA,CAAA,CAAA;",
|
|
6
|
-
"names": ["Effect", "React", "Capability", "Common", "useCapability", "ClientProvider", "Capability", "makeModule", "succeed", "contributes", "Common", "ReactContext", "id", "meta", "context", "children", "client", "useCapability", "ClientCapabilities", "Client", "ClientProvider"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/capabilities/react-surface/react-surface.tsx", "../../../src/components/DevicesContainer.tsx", "../../../src/components/JoinDialog.tsx", "../../../src/components/ProfileContainer.tsx", "../../../src/components/RecoveryCodeDialog.tsx", "../../../src/components/RecoveryCredentialsContainer.tsx", "../../../src/components/ResetDialog.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\nimport React from 'react';\n\nimport { Capability, Common } from '@dxos/app-framework';\nimport { type JoinPanelProps } from '@dxos/shell/react';\n\nimport {\n DevicesContainer,\n JoinDialog,\n ProfileContainer,\n RecoveryCodeDialog,\n type RecoveryCodeDialogProps,\n RecoveryCredentialsContainer,\n ResetDialog,\n type ResetDialogProps,\n} from '../../components';\nimport { JOIN_DIALOG, RECOVERY_CODE_DIALOG, RESET_DIALOG } from '../../constants';\nimport { Account, type ClientPluginOptions } from '../../types';\n\ntype ReactSurfaceOptions = Pick<ClientPluginOptions, 'onReset'> & {\n createInvitationUrl: (invitationCode: string) => string;\n};\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* (props?: ReactSurfaceOptions) {\n const { createInvitationUrl, onReset } = props!;\n const capabilityManager = yield* Capability.Service;\n\n return Capability.contributes(Common.Capability.ReactSurface, [\n Common.createSurface({\n id: Account.Profile,\n role: 'article',\n filter: (data): data is any => data.subject === Account.Profile,\n component: () => <ProfileContainer />,\n }),\n Common.createSurface({\n id: Account.Devices,\n role: 'article',\n filter: (data): data is any => data.subject === Account.Devices,\n component: () => <DevicesContainer createInvitationUrl={createInvitationUrl} />,\n }),\n Common.createSurface({\n id: Account.Security,\n role: 'article',\n filter: (data): data is any => data.subject === Account.Security,\n component: () => <RecoveryCredentialsContainer />,\n }),\n Common.createSurface({\n id: JOIN_DIALOG,\n role: 'dialog',\n filter: (data): data is { props: JoinPanelProps } => data.component === JOIN_DIALOG,\n component: ({ data }: { data: any }) => <JoinDialog {...data.props} />,\n }),\n Common.createSurface({\n id: RECOVERY_CODE_DIALOG,\n role: 'dialog',\n filter: (data): data is { props: RecoveryCodeDialogProps } => data.component === RECOVERY_CODE_DIALOG,\n component: ({ data }: { data: any }) => <RecoveryCodeDialog {...data.props} />,\n }),\n Common.createSurface({\n id: RESET_DIALOG,\n role: 'dialog',\n filter: (data): data is { props: ResetDialogProps } => data.component === RESET_DIALOG,\n component: ({ data }: { data: any }) => (\n <ResetDialog {...data.props} onReset={onReset} capabilityManager={capabilityManager} />\n ),\n }),\n ]);\n }),\n);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { QR } from 'react-qr-rounded';\n\nimport { useOperationInvoker } from '@dxos/app-framework/react';\nimport { log } from '@dxos/log';\nimport { useClient, useMulticastObservable } from '@dxos/react-client';\nimport { type Device, useDevices } from '@dxos/react-client/halo';\nimport { type CancellableInvitationObservable, Invitation, InvitationEncoder } from '@dxos/react-client/invitations';\nimport { useNetworkStatus } from '@dxos/react-client/mesh';\nimport { Button, Clipboard, Icon, IconButton, List, useId, useTranslation } from '@dxos/react-ui';\nimport {\n ControlFrame,\n ControlFrameItem,\n ControlGroup,\n ControlItem,\n ControlPage,\n ControlSection,\n} from '@dxos/react-ui-form';\nimport { translationKey } from '@dxos/shell/react';\nimport { AuthCode, Centered, DeviceListItem, Emoji, Viewport } from '@dxos/shell/react';\nimport { osTranslations } from '@dxos/ui-theme';\nimport { hexToEmoji } from '@dxos/util';\n\nimport { meta } from '../meta';\nimport { ClientOperation } from '../types';\n\nexport type DevicesContainerProps = {\n createInvitationUrl?: (invitationCode: string) => string;\n};\n\nexport const DevicesContainer = ({ createInvitationUrl }: DevicesContainerProps) => {\n const { t } = useTranslation(translationKey);\n const { invokePromise } = useOperationInvoker();\n const devices = useDevices();\n const { swarm: connectionState } = useNetworkStatus();\n\n const handleResetStorage = useCallback(() => invokePromise(ClientOperation.ResetStorage, {}), [invokePromise]);\n\n const handleRecover = useCallback(\n () => invokePromise(ClientOperation.ResetStorage, { mode: 'recover' }),\n [invokePromise],\n );\n\n const handleJoinNewIdentity = useCallback(\n () => invokePromise(ClientOperation.ResetStorage, { mode: 'join new identity' }),\n [invokePromise],\n );\n\n return (\n <Clipboard.Provider>\n <ControlPage>\n <ControlSection\n title={t('devices verbose label', { ns: meta.id })}\n description={t('devices description', { ns: meta.id })}\n >\n <ControlFrame>\n <ControlFrameItem title={t('devices label', { ns: meta.id })}>\n <List>\n {devices.map((device: Device) => {\n return (\n <DeviceListItem key={device.deviceKey.toHex()} device={device} connectionState={connectionState} />\n );\n })}\n </List>\n </ControlFrameItem>\n {createInvitationUrl && (\n <ControlFrameItem title='Add device'>\n <DeviceInvitation createInvitationUrl={createInvitationUrl} />\n </ControlFrameItem>\n )}\n </ControlFrame>\n </ControlSection>\n <ControlSection\n title={t('danger zone title', { ns: meta.id })}\n description={t('danger zone description', { ns: meta.id })}\n >\n <ControlGroup>\n <ControlItem title={t('reset device label')} description={t('reset device description', { ns: meta.id })}>\n <Button variant='destructive' onClick={handleResetStorage} data-testid='devicesContainer.reset'>\n {t('reset device label')}\n </Button>\n </ControlItem>\n <ControlItem\n title={t('recover identity label')}\n description={t('recover identity description', { ns: meta.id })}\n >\n <Button variant='destructive' onClick={handleRecover} data-testid='devicesContainer.recover'>\n {t('recover identity label')}\n </Button>\n </ControlItem>\n <ControlItem\n title={t('join new identity label')}\n description={t('join new identity description', { ns: meta.id })}\n >\n <Button variant='destructive' onClick={handleJoinNewIdentity} data-testid='devicesContainer.joinExisting'>\n {t('join new identity label')}\n </Button>\n </ControlItem>\n </ControlGroup>\n </ControlSection>\n </ControlPage>\n </Clipboard.Provider>\n );\n};\n\ntype DeviceInvitationProps = {\n invitation?: CancellableInvitationObservable;\n createInvitationUrl: (invitationCode: string) => string;\n onInvitationDone: () => void;\n onInvitationCreate: () => void;\n};\n\nconst DeviceInvitation = (props: Pick<DeviceInvitationProps, 'createInvitationUrl'>) => {\n const client = useClient();\n const [invitation, setInvitation] = useState<CancellableInvitationObservable>();\n\n const onInvitationCreate = useCallback(() => {\n const invitation = client.halo.share();\n if (client.config.values.runtime?.app?.env?.DX_ENVIRONMENT !== 'production') {\n const subscription = invitation.subscribe((invitation: Invitation) => {\n const invitationCode = InvitationEncoder.encode(invitation);\n if (invitation.state === Invitation.State.CONNECTING) {\n log.info(JSON.stringify({ invitationCode, authCode: invitation.authCode }));\n subscription.unsubscribe();\n }\n });\n }\n setInvitation(invitation);\n }, [client]);\n\n const onInvitationDone = useCallback(() => {\n setInvitation(undefined);\n }, []);\n\n if (invitation) {\n return <DeviceInvitationImpl {...props} {...{ invitation, onInvitationCreate, onInvitationDone }} />;\n } else {\n return <InvitationSection {...props} {...{ onInvitationCreate, onInvitationDone }} />;\n }\n};\n\nconst DeviceInvitationImpl = ({\n invitation: invitationObservable,\n createInvitationUrl,\n onInvitationDone,\n onInvitationCreate,\n}: DeviceInvitationProps) => {\n const invitation = useMulticastObservable(invitationObservable!);\n const url = createInvitationUrl(InvitationEncoder.encode(invitation));\n\n useEffect(() => {\n if (invitation.state >= Invitation.State.SUCCESS) {\n onInvitationDone();\n }\n }, [invitation.state]);\n\n return <InvitationSection {...invitation} {...{ url, onInvitationDone, onInvitationCreate }} />;\n};\n\ntype InvitationComponentProps = Partial<\n Pick<Invitation, 'authCode' | 'invitationId'> &\n Pick<DeviceInvitationProps, 'onInvitationDone' | 'onInvitationCreate'> & {\n state: number;\n url: string;\n }\n>;\n\nconst InvitationSection = ({\n state = -1,\n authCode,\n invitationId = 'never',\n url = 'never',\n onInvitationDone = () => {},\n onInvitationCreate = () => {},\n}: InvitationComponentProps) => {\n const { t } = useTranslation(meta.id);\n const activeView =\n state < 0\n ? 'init'\n : state >= Invitation.State.CANCELLED\n ? 'complete'\n : state >= Invitation.State.READY_FOR_AUTHENTICATION && authCode\n ? 'auth-code'\n : 'qr-code';\n return activeView === 'init' ? (\n <>\n <p className='text-description mbe-2'>{t('add device description')}</p>\n <IconButton\n icon='ph--plus--regular'\n label={t('create device invitation label')}\n disabled={state >= 0}\n classNames='is-full'\n data-testid='devicesContainer.createInvitation'\n onClick={onInvitationCreate}\n />\n </>\n ) : (\n <Viewport.Root activeView={activeView}>\n <Viewport.Views>\n <Viewport.View id='init'>\n {/* This view intentionally left blank while conditionally rendering the viewport. */}\n </Viewport.View>\n <Viewport.View id='complete'>\n <InvitationComplete statusValue={state} />\n </Viewport.View>\n <Viewport.View id='auth-code'>\n <InvitationAuthCode id={invitationId} code={authCode ?? 'never'} onCancel={onInvitationDone} />\n </Viewport.View>\n <Viewport.View id='qr-code'>\n <InvitationQR id={invitationId} url={url} onCancel={onInvitationDone} />\n </Viewport.View>\n </Viewport.Views>\n </Viewport.Root>\n );\n};\n\nconst InvitationQR = ({ id, url, onCancel }: { id: string; url: string; onCancel: () => void }) => {\n const { t } = useTranslation(osTranslations);\n const qrLabel = useId('devices-container__qr-code');\n const emoji = hexToEmoji(id);\n return (\n <>\n <p className='text-description'>{t('qr code description', { ns: meta.id })}</p>\n <div role='group' className='grid grid-cols-[1fr_min-content] mlb-2 gap-2'>\n <div role='none' className='is-full aspect-square relative text-description'>\n <QR\n rounding={100}\n backgroundColor='transparent'\n color='currentColor'\n aria-labelledby={qrLabel}\n errorCorrectionLevel='Q'\n cutout={true}\n >\n {url ?? 'never'}\n </QR>\n <Centered>\n <Emoji text={emoji} />\n </Centered>\n </div>\n <span id={qrLabel} className='sr-only'>\n {t('qr label')}\n </span>\n </div>\n {/* TODO(burdon): Factor out button bar */}\n <div className='flex justify-center'>\n <div className='flex gap-2'>\n <Clipboard.Button value={url ?? 'never'} />\n <Button variant='ghost' onClick={onCancel}>\n {t('cancel label')}\n </Button>\n </div>\n </div>\n </>\n );\n};\n\nconst InvitationAuthCode = ({ id, code, onCancel }: { id: string; code: string; onCancel: () => void }) => {\n const { t } = useTranslation(osTranslations);\n const emoji = hexToEmoji(id);\n\n return (\n <>\n <p className='text-description'>{t('auth other device emoji message')}</p>\n {emoji && <Emoji text={emoji} className='mli-auto mlb-2 text-center' />}\n <p className='text-description'>{t('auth code message')}</p>\n <AuthCode code={code} large classNames='mli-auto mlb-2 text-center grow' />\n <Button variant='ghost' onClick={onCancel}>\n {t('cancel label')}\n </Button>\n </>\n );\n};\n\nconst InvitationComplete = ({ statusValue }: { statusValue: number }) => {\n return statusValue > 0 ? (\n <Icon icon='ph--check--regular' size={6} classNames='m-1.5' />\n ) : (\n <Icon icon='ph--x--regular' size={6} classNames='m-1.5' />\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useCallback } from 'react';\n\nimport { Common } from '@dxos/app-framework';\nimport { useOperationInvoker } from '@dxos/app-framework/react';\nimport { ObservabilityOperation } from '@dxos/plugin-observability/types';\nimport { type InvitationResult } from '@dxos/react-client/invitations';\nimport { Dialog, useTranslation } from '@dxos/react-ui';\nimport { JoinPanel, type JoinPanelProps } from '@dxos/shell/react';\nimport { osTranslations } from '@dxos/ui-theme';\n\nimport { meta } from '../meta';\nimport { ClientOperation } from '../types';\n\nexport const JoinDialog = (props: JoinPanelProps) => {\n const { invokePromise } = useOperationInvoker();\n const { t } = useTranslation(meta.id);\n\n const handleCancelResetStorage = useCallback(() => invokePromise(ClientOperation.ShareIdentity), [invokePromise]);\n\n const handleDone = useCallback(\n async (result: InvitationResult | null) => {\n if (result?.identityKey) {\n await Promise.all([\n invokePromise(Common.LayoutOperation.UpdateDialog, { state: false }),\n invokePromise(ObservabilityOperation.SendEvent, {\n name: props.initialDisposition === 'recover-identity' ? 'identity.recover' : 'identity.join',\n }),\n ]);\n }\n },\n [invokePromise],\n );\n\n return (\n <Dialog.Content>\n <Dialog.Title classNames='sr-only'>{t('join space label', { ns: osTranslations })}</Dialog.Title>\n <JoinPanel\n mode='halo-only'\n {...props}\n exitActionParent={<Dialog.Close asChild />}\n doneActionParent={<Dialog.Close asChild />}\n onCancelResetStorage={handleCancelResetStorage}\n onDone={handleDone}\n />\n </Dialog.Content>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\nimport React, { type ChangeEvent, useCallback, useMemo, useState } from 'react';\n\nimport { debounce } from '@dxos/async';\nimport { useClient } from '@dxos/react-client';\nimport { type Identity, useIdentity } from '@dxos/react-client/halo';\nimport { ButtonGroup, Clipboard, Input, useTranslation } from '@dxos/react-ui';\nimport {\n ControlItem,\n ControlItemInput,\n ControlPage,\n ControlSection,\n Form,\n type FormFieldMap,\n type FormUpdateMeta,\n} from '@dxos/react-ui-form';\nimport { EmojiPickerBlock, HuePicker } from '@dxos/react-ui-pickers';\nimport { hexToEmoji, hexToHue } from '@dxos/util';\n\nimport { meta } from '../meta';\n\n// TOOD(burdon): Factor out?\n// TODO(wittjosiah): Integrate annotations with translations.\nconst UserProfile = Schema.Struct({\n did: Schema.String.annotations({ title: 'DID' }),\n displayName: Schema.String.annotations({ title: 'Display name' }),\n emoji: Schema.String.annotations({ title: 'Avatar' }),\n hue: Schema.String.annotations({ title: 'Color' }),\n});\n\ntype UserProfile = Schema.Schema.Type<typeof UserProfile>;\n\n// TODO(thure): Factor out?\nconst getDefaultHueValue = (identity: Identity | null) => hexToHue(identity?.identityKey.toHex() ?? '0');\nconst getHueValue = (identity: Identity | null) => identity?.profile?.data?.hue || getDefaultHueValue(identity);\nconst getDefaultEmojiValue = (identity: Identity | null) => hexToEmoji(identity?.identityKey.toHex() ?? '0');\nconst getEmojiValue = (identity: Identity | null) => identity?.profile?.data?.emoji || getDefaultEmojiValue(identity);\n\nexport const ProfileContainer = () => {\n const { t } = useTranslation(meta.id);\n const client = useClient();\n const identity = useIdentity();\n const [displayName, setDisplayNameDirectly] = useState(identity?.profile?.displayName ?? '');\n const [emoji, setEmojiDirectly] = useState<string>(getEmojiValue(identity));\n const [hue, setHueDirectly] = useState<string>(getHueValue(identity));\n\n const updateProfile = useMemo(\n () =>\n debounce(\n (profile: Partial<UserProfile>) =>\n client.halo.updateProfile({\n displayName: profile.displayName,\n data: {\n emoji: profile.emoji,\n hue: profile.hue,\n },\n }),\n 2_000,\n ),\n [],\n );\n\n const handleChange = useCallback(\n (profile: Partial<UserProfile>, meta: FormUpdateMeta<UserProfile>) => {\n for (const [path, changed] of Object.entries(meta.changed)) {\n if (changed) {\n switch (path) {\n case 'displayName':\n setDisplayNameDirectly(profile.displayName ?? '');\n break;\n case 'emoji':\n setEmojiDirectly(profile.emoji ?? getDefaultEmojiValue(identity));\n break;\n case 'hue':\n setHueDirectly(profile.hue ?? getDefaultHueValue(identity));\n break;\n default:\n break;\n }\n }\n }\n\n void updateProfile(profile);\n },\n [identity],\n );\n\n const values = useMemo(\n () => ({\n did: identity?.did,\n displayName,\n emoji,\n hue,\n }),\n [identity, displayName, emoji, hue],\n );\n\n // TODO(wittjosiah): Integrate descriptions with the form schema.\n const fieldMap = useMemo<FormFieldMap>(\n () => ({\n displayName: ({ type, label, getValue, onValueChange }) => {\n const handleChange = useCallback(\n ({ target: { value } }: ChangeEvent<HTMLInputElement>) => onValueChange(type, value),\n [onValueChange, type],\n );\n\n return (\n <ControlItemInput title={label} description={t('display name description')}>\n <Input.TextInput\n value={getValue()}\n onChange={handleChange}\n placeholder={t('display name input placeholder')}\n classNames='min-is-64'\n />\n </ControlItemInput>\n );\n },\n emoji: ({ type, label, getValue, onValueChange }) => {\n const handleChange = useCallback((nextEmoji: string) => onValueChange(type, nextEmoji), [onValueChange, type]);\n const handleEmojiReset = useCallback(\n () => onValueChange(type, getDefaultEmojiValue(identity)),\n [onValueChange, type],\n );\n\n return (\n <ControlItem title={label} description={t('icon description')}>\n <EmojiPickerBlock\n triggerVariant='default'\n emoji={getValue()}\n onChangeEmoji={handleChange}\n onClickClear={handleEmojiReset}\n classNames='justify-self-end'\n />\n </ControlItem>\n );\n },\n hue: ({ type, label, getValue, onValueChange }) => {\n const handleChange = useCallback((nextHue: string) => onValueChange(type, nextHue), [onValueChange, type]);\n const handleHueReset = useCallback(\n () => onValueChange(type, getDefaultHueValue(identity)),\n [onValueChange, type],\n );\n\n return (\n <ControlItem title={label} description={t('hue description')}>\n <div role='none' className='flex justify-self-end'>\n <HuePicker value={getValue()} onChange={handleChange} onReset={handleHueReset} />\n </div>\n </ControlItem>\n );\n },\n // TODO(wittjosiah): We need text input annotations for disabled and copyable.\n did: ({ label, getValue }) => {\n return (\n <ControlItemInput title={label} description={t('did description')}>\n <ButtonGroup>\n <Input.TextInput value={getValue()} disabled classNames='min-is-64' />\n <Clipboard.IconButton value={getValue() ?? ''} />\n </ButtonGroup>\n </ControlItemInput>\n );\n },\n }),\n [t],\n );\n\n return (\n <ControlPage>\n <Clipboard.Provider>\n <ControlSection title={t('profile label')} description={t('profile description')}>\n <Form.Root schema={UserProfile} values={values} fieldMap={fieldMap} onValuesChanged={handleChange}>\n <Form.Content>\n <Form.FieldSet classNames='container-max-width grid grid-cols-1 md:grid-cols-[1fr_min-content]' />\n </Form.Content>\n </Form.Root>\n </ControlSection>\n </Clipboard.Provider>\n </ControlPage>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useCallback, useState } from 'react';\n\nimport { AlertDialog, Button, Clipboard, Input, useTranslation } from '@dxos/react-ui';\n\nimport { meta } from '../meta';\n\nexport type RecoveryCodeDialogProps = {\n code: string;\n};\n\nexport const RecoveryCodeDialog = ({ code }: RecoveryCodeDialogProps) => {\n const { t } = useTranslation(meta.id);\n const [confirmation, setConfirmation] = useState(false);\n\n const handleConfirmation = useCallback((checked: boolean) => setConfirmation(checked), []);\n\n return (\n <AlertDialog.Content classNames='bs-content min-bs-[15rem] max-bs-full md:max-is-[40rem] overflow-hidden'>\n <AlertDialog.Title>{t('recovery code dialog title')}</AlertDialog.Title>\n <p className='plb-4'>{t('recovery code dialog description')}</p>\n <Clipboard.Provider>\n <Code code={code} />\n </Clipboard.Provider>\n <div className='flex flex-col plb-4 gap-2'>\n <p>{t('recovery code dialog warning 1')}</p>\n <p>{t('recovery code dialog warning 2')}</p>\n </div>\n <div className='flex items-center gap-2 pbe-4'>\n <Input.Root>\n <Input.Checkbox\n data-testid='recoveryCode.confirm'\n checked={confirmation}\n onCheckedChange={handleConfirmation}\n />\n <Input.Label>{t('recovery code confirmation label')}</Input.Label>\n </Input.Root>\n </div>\n <div className='flex justify-end'>\n <AlertDialog.Action asChild>\n <Button data-testid='recoveryCode.continue' variant='primary' disabled={!confirmation}>\n {t('continue label')}\n </Button>\n </AlertDialog.Action>\n </div>\n </AlertDialog.Content>\n );\n};\n\nconst Code = ({ code }: { code: string }) => {\n const words = code.split(' ');\n return (\n <div className='relative p-2 border border-separator rounded group'>\n <Clipboard.IconButton value={code} classNames='absolute top-2 right-2 invisible group-hover:visible' />\n <div className='grid grid-cols-4'>\n {words.map((word, i) => (\n <div key={i} className='flex items-center p-2 gap-2'>\n <div className='is-4 text-xs text-center text-subdued'>{i + 1}</div>\n <div className='text-sm'>{word}</div>\n </div>\n ))}\n </div>\n </div>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React from 'react';\n\nimport { useOperationInvoker } from '@dxos/app-framework/react';\nimport { useCredentials } from '@dxos/react-client/halo';\nimport { Icon, IconButton, List, ListItem, Message, useTranslation } from '@dxos/react-ui';\nimport { ControlGroup, ControlItem, ControlPage, ControlSection } from '@dxos/react-ui-form';\n\nimport { meta } from '../meta';\nimport { ClientOperation } from '../types';\n\nexport const MANAGE_CREDENTIALS_DIALOG = `${meta.id}/ManageCredentialsDialog`;\n\nexport const RecoveryCredentialsContainer = () => {\n const { t } = useTranslation(meta.id);\n const { invokePromise } = useOperationInvoker();\n const credentials = useCredentials();\n const recoveryCredentials = credentials.filter(\n (credential) => credential.subject.assertion['@type'] === 'dxos.halo.credentials.IdentityRecovery',\n );\n\n return (\n <ControlPage>\n <ControlSection title={t('recovery setup dialog title')} description={t('recovery setup dialog description')}>\n <ControlGroup>\n <ControlItem title={t('create passkey label')} description={t('create passkey description')}>\n <IconButton\n label={t('create passkey label')}\n icon='ph--key--duotone'\n variant='primary'\n onClick={() => invokePromise(ClientOperation.CreatePasskey)}\n />\n </ControlItem>\n <ControlItem title={t('create recovery code label')} description={t('create recovery code description')}>\n <IconButton\n label={t('create recovery code label')}\n icon='ph--receipt--duotone'\n variant='default'\n onClick={() => invokePromise(ClientOperation.CreateRecoveryCode)}\n />\n </ControlItem>\n </ControlGroup>\n </ControlSection>\n <ControlSection title={t('credentials list label')}>\n {recoveryCredentials.length < 1 ? (\n <Message.Root valence='error' classNames='container-max-width'>\n <Message.Title icon='ph--shield-warning--duotone'>{t('no credentials title')}</Message.Title>\n <Message.Content>{t('no credentials message')}</Message.Content>\n </Message.Root>\n ) : (\n <List classNames='container-max-width pli-2'>\n {recoveryCredentials.map((credential) => (\n <ListItem.Root key={credential.id?.toHex()}>\n <ListItem.Endcap>\n <Icon icon='ph--key--regular' />\n </ListItem.Endcap>\n <ListItem.Heading>{credential.issuanceDate.toLocaleString()}</ListItem.Heading>\n </ListItem.Root>\n ))}\n </List>\n )}\n </ControlSection>\n </ControlPage>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\nimport React, { useCallback } from 'react';\n\nimport { Capability, type CapabilityManager, Common } from '@dxos/app-framework';\nimport { useOperationInvoker } from '@dxos/app-framework/react';\nimport { runAndForwardErrors } from '@dxos/effect';\nimport { useClient } from '@dxos/react-client';\nimport { Dialog, useTranslation } from '@dxos/react-ui';\nimport { ConfirmReset, type ConfirmResetProps } from '@dxos/shell/react';\n\nimport { meta } from '../meta';\nimport { type ClientPluginOptions } from '../types';\n\nexport type ResetDialogProps = Pick<ConfirmResetProps, 'mode'> &\n Pick<ClientPluginOptions, 'onReset'> & {\n capabilityManager: CapabilityManager.CapabilityManager;\n };\n\nexport const ResetDialog = ({ mode, onReset, capabilityManager }: ResetDialogProps) => {\n const { t } = useTranslation(meta.id);\n const { invokePromise } = useOperationInvoker();\n const client = useClient();\n\n const handleReset = useCallback(async () => {\n await client.reset();\n const target =\n mode === 'join new identity' ? 'deviceInvitation' : mode === 'recover' ? 'recoverIdentity' : undefined;\n if (onReset) {\n await runAndForwardErrors(onReset({ target }).pipe(Effect.provideService(Capability.Service, capabilityManager)));\n }\n }, [client, mode, onReset, capabilityManager]);\n\n const handleCancel = useCallback(() => {\n void invokePromise(Common.LayoutOperation.UpdateDialog, { state: false });\n }, [invokePromise]);\n\n // TODO(wittjosiah): Add the sr-only translations.\n // TODO(wittjosiah): Add missing descriptions to other dialogs.\n return (\n <Dialog.Content>\n <Dialog.Title classNames='sr-only'>{t('reset dialog title')}</Dialog.Title>\n <Dialog.Description classNames='sr-only'>{t('reset dialog description')}</Dialog.Description>\n <ConfirmReset active mode={mode} onConfirm={handleReset} onCancel={handleCancel} />\n </Dialog.Content>\n );\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["Effect", "React", "Capability", "Common", "React", "useCallback", "useEffect", "useState", "QR", "useOperationInvoker", "log", "useClient", "useMulticastObservable", "useDevices", "Invitation", "InvitationEncoder", "useNetworkStatus", "Button", "Clipboard", "Icon", "IconButton", "List", "useId", "useTranslation", "ControlFrame", "ControlFrameItem", "ControlGroup", "ControlItem", "ControlPage", "ControlSection", "translationKey", "AuthCode", "Centered", "DeviceListItem", "Emoji", "Viewport", "osTranslations", "hexToEmoji", "DevicesContainer", "createInvitationUrl", "t", "useTranslation", "translationKey", "invokePromise", "useOperationInvoker", "devices", "useDevices", "swarm", "connectionState", "useNetworkStatus", "handleResetStorage", "useCallback", "ClientOperation", "ResetStorage", "handleRecover", "mode", "handleJoinNewIdentity", "Clipboard", "Provider", "ControlPage", "ControlSection", "title", "ns", "meta", "id", "description", "ControlFrame", "ControlFrameItem", "List", "map", "device", "DeviceListItem", "key", "deviceKey", "toHex", "DeviceInvitation", "ControlGroup", "ControlItem", "Button", "variant", "onClick", "data-testid", "props", "client", "useClient", "invitation", "setInvitation", "useState", "onInvitationCreate", "halo", "share", "config", "values", "runtime", "app", "env", "DX_ENVIRONMENT", "subscription", "subscribe", "invitationCode", "InvitationEncoder", "encode", "state", "Invitation", "State", "CONNECTING", "log", "info", "JSON", "stringify", "authCode", "unsubscribe", "onInvitationDone", "undefined", "DeviceInvitationImpl", "InvitationSection", "invitationObservable", "useMulticastObservable", "url", "useEffect", "SUCCESS", "invitationId", "activeView", "CANCELLED", "READY_FOR_AUTHENTICATION", "p", "className", "IconButton", "icon", "label", "disabled", "classNames", "Viewport", "Root", "Views", "View", "InvitationComplete", "statusValue", "InvitationAuthCode", "code", "onCancel", "InvitationQR", "osTranslations", "qrLabel", "useId", "emoji", "hexToEmoji", "div", "role", "QR", "rounding", "backgroundColor", "color", "aria-labelledby", "errorCorrectionLevel", "cutout", "Centered", "Emoji", "text", "span", "value", "AuthCode", "large", "Icon", "size", "React", "useCallback", "Common", "useOperationInvoker", "ObservabilityOperation", "Dialog", "useTranslation", "JoinPanel", "osTranslations", "JoinDialog", "props", "invokePromise", "useOperationInvoker", "t", "useTranslation", "meta", "id", "handleCancelResetStorage", "useCallback", "ClientOperation", "ShareIdentity", "handleDone", "result", "identityKey", "Promise", "all", "Common", "LayoutOperation", "UpdateDialog", "state", "ObservabilityOperation", "SendEvent", "name", "initialDisposition", "React", "Dialog", "Content", "Title", "classNames", "ns", "osTranslations", "JoinPanel", "mode", "exitActionParent", "Close", "asChild", "doneActionParent", "onCancelResetStorage", "onDone", "Schema", "React", "useCallback", "useMemo", "useState", "debounce", "useClient", "useIdentity", "ButtonGroup", "Clipboard", "Input", "useTranslation", "ControlItem", "ControlItemInput", "ControlPage", "ControlSection", "Form", "EmojiPickerBlock", "HuePicker", "hexToEmoji", "hexToHue", "UserProfile", "Struct", "did", "String", "annotations", "title", "displayName", "emoji", "hue", "getDefaultHueValue", "identity", "hexToHue", "identityKey", "toHex", "getHueValue", "profile", "data", "getDefaultEmojiValue", "hexToEmoji", "getEmojiValue", "ProfileContainer", "t", "useTranslation", "meta", "id", "client", "useClient", "useIdentity", "setDisplayNameDirectly", "useState", "setEmojiDirectly", "setHueDirectly", "updateProfile", "useMemo", "debounce", "halo", "handleChange", "useCallback", "path", "changed", "Object", "entries", "values", "fieldMap", "type", "label", "getValue", "onValueChange", "target", "value", "React", "ControlItemInput", "description", "Input", "TextInput", "onChange", "placeholder", "classNames", "nextEmoji", "handleEmojiReset", "ControlItem", "EmojiPickerBlock", "triggerVariant", "onChangeEmoji", "onClickClear", "nextHue", "handleHueReset", "div", "role", "className", "HuePicker", "onReset", "ButtonGroup", "disabled", "Clipboard", "IconButton", "ControlPage", "Provider", "ControlSection", "Form", "Root", "schema", "onValuesChanged", "Content", "FieldSet", "React", "useCallback", "useState", "AlertDialog", "Button", "Clipboard", "Input", "useTranslation", "RecoveryCodeDialog", "code", "t", "useTranslation", "meta", "id", "confirmation", "setConfirmation", "useState", "handleConfirmation", "useCallback", "checked", "React", "AlertDialog", "Content", "classNames", "Title", "p", "className", "Clipboard", "Provider", "Code", "div", "Input", "Root", "Checkbox", "data-testid", "onCheckedChange", "Label", "Action", "asChild", "Button", "variant", "disabled", "words", "split", "IconButton", "value", "map", "word", "i", "key", "React", "useOperationInvoker", "useCredentials", "Icon", "IconButton", "List", "ListItem", "Message", "useTranslation", "ControlGroup", "ControlItem", "ControlPage", "ControlSection", "MANAGE_CREDENTIALS_DIALOG", "meta", "id", "RecoveryCredentialsContainer", "t", "useTranslation", "invokePromise", "useOperationInvoker", "credentials", "useCredentials", "recoveryCredentials", "filter", "credential", "subject", "assertion", "React", "ControlPage", "ControlSection", "title", "description", "ControlGroup", "ControlItem", "IconButton", "label", "icon", "variant", "onClick", "ClientOperation", "CreatePasskey", "CreateRecoveryCode", "length", "Message", "Root", "valence", "classNames", "Title", "Content", "List", "map", "ListItem", "key", "toHex", "Endcap", "Icon", "Heading", "issuanceDate", "toLocaleString", "Effect", "React", "useCallback", "Capability", "Common", "useOperationInvoker", "runAndForwardErrors", "useClient", "Dialog", "useTranslation", "ConfirmReset", "ResetDialog", "mode", "onReset", "capabilityManager", "t", "useTranslation", "meta", "id", "invokePromise", "useOperationInvoker", "client", "useClient", "handleReset", "useCallback", "reset", "target", "undefined", "runAndForwardErrors", "pipe", "provideService", "Capability", "Service", "handleCancel", "Common", "LayoutOperation", "UpdateDialog", "state", "React", "Dialog", "Content", "Title", "classNames", "Description", "ConfirmReset", "active", "onConfirm", "onCancel", "Capability", "makeModule", "fnUntraced", "props", "createInvitationUrl", "onReset", "capabilityManager", "Service", "contributes", "Common", "ReactSurface", "createSurface", "id", "Account", "Profile", "role", "filter", "data", "subject", "component", "React", "ProfileContainer", "Devices", "DevicesContainer", "Security", "RecoveryCredentialsContainer", "JOIN_DIALOG", "JoinDialog", "RECOVERY_CODE_DIALOG", "RecoveryCodeDialog", "RESET_DIALOG", "ResetDialog"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/capabilities/schema-defs/schema-defs.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability, Common } from '@dxos/app-framework';\nimport { type Type } from '@dxos/echo';\n\nimport { ClientCapabilities } from '../../types';\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n const registry = yield* Capability.get(Common.Capability.AtomRegistry);\n const client = yield* Capability.get(ClientCapabilities.Client);\n const schemasAtom = yield* Capability.atom(Common.Capability.Schema);\n\n // TODO(wittjosiah): Unregister schemas when they are disabled.\n let previous: Type.Entity.Any[] = [];\n const cancel = registry.subscribe(\n schemasAtom,\n async (_schemas: any[]) => {\n // TODO(wittjosiah): This doesn't seem to de-dupe schemas as expected.\n const schemas = Array.from(new Set(_schemas.flat())) as Type.Entity.Any[];\n // TODO(wittjosiah): Filter out schemas which the client has already registered.\n const newSchemas = schemas.filter((schema) => !previous.includes(schema));\n previous = schemas;\n await client.addTypes(newSchemas);\n },\n { immediate: true },\n );\n\n return Capability.contributes(Common.Capability.Null, null, () => Effect.sync(() => cancel()));\n }),\n);\n"],
|
|
5
|
-
"mappings": ";;;;;AAIA,YAAYA,YAAY;AAExB,SAASC,YAAYC,cAAc;AAKnC,IAAA,sBAAeC,WAAWC,WACjBC,kBAAW,aAAA;AAChB,QAAMC,WAAW,OAAOH,WAAWI,IAAIC,OAAOL,WAAWM,YAAY;AACrE,QAAMC,SAAS,OAAOP,WAAWI,IAAII,mBAAmBC,MAAM;AAC9D,QAAMC,cAAc,OAAOV,WAAWW,KAAKN,OAAOL,WAAWY,MAAM;AAGnE,MAAIC,WAA8B,CAAA;AAClC,QAAMC,SAASX,SAASY,UACtBL,aACA,OAAOM,aAAAA;AAEL,UAAMC,UAAUC,MAAMC,KAAK,IAAIC,IAAIJ,SAASK,KAAI,CAAA,CAAA;AAEhD,UAAMC,aAAaL,QAAQM,OAAO,CAACC,WAAW,CAACX,SAASY,SAASD,MAAAA,CAAAA;AACjEX,eAAWI;AACX,UAAMV,OAAOmB,SAASJ,UAAAA;EACxB,GACA;IAAEK,WAAW;EAAK,CAAA;AAGpB,SAAO3B,WAAW4B,YAAYvB,OAAOL,WAAW6B,MAAM,MAAM,MAAaC,YAAK,MAAMhB,OAAAA,CAAAA,CAAAA;AACtF,CAAA,CAAA;",
|
|
6
|
-
"names": ["Effect", "Capability", "Common", "Capability", "makeModule", "fnUntraced", "registry", "get", "Common", "AtomRegistry", "client", "ClientCapabilities", "Client", "schemasAtom", "atom", "Schema", "previous", "cancel", "subscribe", "_schemas", "schemas", "Array", "from", "Set", "flat", "newSchemas", "filter", "schema", "includes", "addTypes", "immediate", "contributes", "Null", "sync"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/capabilities/app-graph-builder/app-graph-builder.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability, Common } from '@dxos/app-framework';\nimport { Operation } from '@dxos/operation';\nimport { CreateAtom, GraphBuilder, NodeMatcher } from '@dxos/plugin-graph';\nimport { ConnectionState } from '@dxos/react-client/mesh';\n\nimport { meta } from '../../meta';\nimport { Account, ClientCapabilities, ClientOperation } from '../../types';\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n const extensions = yield* GraphBuilder.createExtension({\n id: meta.id,\n match: NodeMatcher.whenRoot,\n actions: () =>\n Effect.succeed([\n {\n id: `${meta.id}/open-user-account`,\n data: () => Operation.invoke(ClientOperation.ShareIdentity),\n properties: {\n label: ['open user account label', { ns: meta.id }],\n icon: 'ph--user--regular',\n disposition: 'menu',\n keyBinding: {\n macos: 'meta+shift+.',\n // TODO(wittjosiah): Test on windows to see if it behaves the same as linux.\n windows: 'alt+shift+.',\n linux: 'alt+shift+>',\n },\n },\n },\n ]),\n connector: Effect.fnUntraced(function* (node, get) {\n const client = yield* Capability.get(ClientCapabilities.Client);\n const identity = get(CreateAtom.fromObservable(client.halo.identity));\n const status = get(CreateAtom.fromObservable(client.mesh.networkStatus));\n\n return [\n {\n id: Account.id,\n type: meta.id,\n properties: {\n label: ['account label', { ns: meta.id }],\n icon: 'ph--user--regular',\n disposition: 'user-account',\n testId: 'clientPlugin.account',\n // NOTE: This currently needs to be the identity key because the fallback is generated from hex.\n userId: identity?.identityKey.toHex(),\n hue: identity?.profile?.data?.hue,\n emoji: identity?.profile?.data?.emoji,\n status: status.swarm === ConnectionState.OFFLINE ? 'error' : 'active',\n },\n nodes: [\n {\n id: Account.Profile,\n data: Account.Profile,\n type: meta.id,\n properties: {\n label: ['profile label', { ns: meta.id }],\n icon: 'ph--user--regular',\n },\n },\n {\n id: Account.Devices,\n data: Account.Devices,\n type: meta.id,\n properties: {\n label: ['devices label', { ns: meta.id }],\n icon: 'ph--devices--regular',\n testId: 'clientPlugin.devices',\n },\n },\n {\n id: Account.Security,\n data: Account.Security,\n type: meta.id,\n properties: {\n label: ['security label', { ns: meta.id }],\n icon: 'ph--key--regular',\n },\n },\n ],\n },\n ];\n }),\n });\n\n return Capability.contributes(Common.Capability.AppGraphBuilder, extensions);\n }),\n);\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;AAIA,YAAYA,YAAY;AAExB,SAASC,YAAYC,cAAc;AACnC,SAASC,iBAAiB;AAC1B,SAASC,YAAYC,cAAcC,mBAAmB;AACtD,SAASC,uBAAuB;AAKhC,IAAA,4BAAeC,WAAWC,WACjBC,kBAAW,aAAA;AAChB,QAAMC,aAAa,OAAOC,aAAaC,gBAAgB;IACrDC,IAAIC,KAAKD;IACTE,OAAOC,YAAYC;IACnBC,SAAS,MACAC,eAAQ;MACb;QACEN,IAAI,GAAGC,KAAKD,EAAE;QACdO,MAAM,MAAMC,UAAUC,OAAOC,gBAAgBC,aAAa;QAC1DC,YAAY;UACVC,OAAO;YAAC;YAA2B;cAAEC,IAAIb,KAAKD;YAAG;;UACjDe,MAAM;UACNC,aAAa;UACbC,YAAY;YACVC,OAAO;;YAEPC,SAAS;YACTC,OAAO;UACT;QACF;MACF;KACD;IACHC,WAAkBzB,kBAAW,WAAW0B,MAAMC,KAAG;AAC/C,YAAMC,SAAS,OAAO9B,WAAW6B,IAAIE,mBAAmBC,MAAM;AAC9D,YAAMC,WAAWJ,IAAIK,WAAWC,eAAeL,OAAOM,KAAKH,QAAQ,CAAA;AACnE,YAAMI,SAASR,IAAIK,WAAWC,eAAeL,OAAOQ,KAAKC,aAAa,CAAA;AAEtE,aAAO;QACL;UACEjC,IAAIkC,QAAQlC;UACZmC,MAAMlC,KAAKD;UACXY,YAAY;YACVC,OAAO;cAAC;cAAiB;gBAAEC,IAAIb,KAAKD;cAAG;;YACvCe,MAAM;YACNC,aAAa;YACboB,QAAQ;;YAERC,QAAQV,UAAUW,YAAYC,MAAAA;YAC9BC,KAAKb,UAAUc,SAASlC,MAAMiC;YAC9BE,OAAOf,UAAUc,SAASlC,MAAMmC;YAChCX,QAAQA,OAAOY,UAAUC,gBAAgBC,UAAU,UAAU;UAC/D;UACAC,OAAO;YACL;cACE9C,IAAIkC,QAAQa;cACZxC,MAAM2B,QAAQa;cACdZ,MAAMlC,KAAKD;cACXY,YAAY;gBACVC,OAAO;kBAAC;kBAAiB;oBAAEC,IAAIb,KAAKD;kBAAG;;gBACvCe,MAAM;cACR;YACF;YACA;cACEf,IAAIkC,QAAQc;cACZzC,MAAM2B,QAAQc;cACdb,MAAMlC,KAAKD;cACXY,YAAY;gBACVC,OAAO;kBAAC;kBAAiB;oBAAEC,IAAIb,KAAKD;kBAAG;;gBACvCe,MAAM;gBACNqB,QAAQ;cACV;YACF;YACA;cACEpC,IAAIkC,QAAQe;cACZ1C,MAAM2B,QAAQe;cACdd,MAAMlC,KAAKD;cACXY,YAAY;gBACVC,OAAO;kBAAC;kBAAkB;oBAAEC,IAAIb,KAAKD;kBAAG;;gBACxCe,MAAM;cACR;YACF;;QAEJ;;IAEJ,CAAA;EACF,CAAA;AAEA,SAAOrB,WAAWwD,YAAYC,OAAOzD,WAAW0D,iBAAiBvD,UAAAA;AACnE,CAAA,CAAA;",
|
|
6
|
-
"names": ["Effect", "Capability", "Common", "Operation", "CreateAtom", "GraphBuilder", "NodeMatcher", "ConnectionState", "Capability", "makeModule", "fnUntraced", "extensions", "GraphBuilder", "createExtension", "id", "meta", "match", "NodeMatcher", "whenRoot", "actions", "succeed", "data", "Operation", "invoke", "ClientOperation", "ShareIdentity", "properties", "label", "ns", "icon", "disposition", "keyBinding", "macos", "windows", "linux", "connector", "node", "get", "client", "ClientCapabilities", "Client", "identity", "CreateAtom", "fromObservable", "halo", "status", "mesh", "networkStatus", "Account", "type", "testId", "userId", "identityKey", "toHex", "hue", "profile", "emoji", "swarm", "ConnectionState", "OFFLINE", "nodes", "Profile", "Devices", "Security", "contributes", "Common", "AppGraphBuilder"]
|
|
7
|
-
}
|