@dxos/plugin-client 0.9.0 → 0.9.1-main.c7dcc2e112
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/neutral/{AccountContainer-FZ3IC6H4.mjs → AccountContainer-LIMGLO2Y.mjs} +3 -3
- package/dist/lib/neutral/AccountContainer-LIMGLO2Y.mjs.map +7 -0
- package/dist/lib/neutral/ClientPlugin.node.mjs +477 -370
- package/dist/lib/neutral/ClientPlugin.node.mjs.map +4 -4
- package/dist/lib/neutral/{DevicesContainer-6MWNUC3I.mjs → DevicesContainer-X26OGLFK.mjs} +12 -12
- package/dist/lib/neutral/DevicesContainer-X26OGLFK.mjs.map +7 -0
- package/dist/lib/neutral/{InvitationsContainer-ME722VKS.mjs → InvitationsContainer-OBBCJ7CJ.mjs} +2 -2
- package/dist/lib/neutral/InvitationsContainer-OBBCJ7CJ.mjs.map +7 -0
- package/dist/lib/neutral/{JoinDialog-2NXAKPLP.mjs → JoinDialog-4BWV4CYB.mjs} +2 -2
- package/dist/lib/neutral/JoinDialog-4BWV4CYB.mjs.map +7 -0
- package/dist/lib/neutral/{ProfileContainer-VPX3FPWG.mjs → ProfileContainer-FGS2MVWA.mjs} +2 -2
- package/dist/lib/neutral/ProfileContainer-FGS2MVWA.mjs.map +7 -0
- package/dist/lib/neutral/{RecoveryCodeDialog-EWHB6U5T.mjs → RecoveryCodeDialog-7EPNKCLB.mjs} +2 -2
- package/dist/lib/neutral/RecoveryCodeDialog-7EPNKCLB.mjs.map +7 -0
- package/dist/lib/neutral/{RecoveryCredentialsContainer-IPBGDMIA.mjs → RecoveryCredentialsContainer-SL4LYHBE.mjs} +3 -3
- package/dist/lib/neutral/RecoveryCredentialsContainer-SL4LYHBE.mjs.map +7 -0
- package/dist/lib/neutral/UsageContainer-HBPMLIK7.mjs +226 -0
- package/dist/lib/neutral/UsageContainer-HBPMLIK7.mjs.map +7 -0
- package/dist/lib/neutral/{app-graph-builder-A74W7C36.mjs → app-graph-builder-FTXJNX37.mjs} +28 -14
- package/dist/lib/neutral/app-graph-builder-FTXJNX37.mjs.map +7 -0
- package/dist/lib/neutral/capabilities/index.mjs +5 -5
- package/dist/lib/neutral/capabilities/node.mjs +3 -3
- package/dist/lib/neutral/chunk-54MDDWCV.mjs +8 -0
- package/dist/lib/neutral/{chunk-NTVDGDQ3.mjs.map → chunk-54MDDWCV.mjs.map} +2 -2
- package/dist/lib/neutral/chunk-6G4KZLBG.mjs +28 -0
- package/dist/lib/neutral/chunk-6G4KZLBG.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-D6HPCLTS.mjs → chunk-7DEIKHB7.mjs} +16 -2
- package/dist/lib/neutral/chunk-7DEIKHB7.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-TUK3ELUU.mjs → chunk-DA3LZQSD.mjs} +22 -21
- package/dist/lib/neutral/chunk-DA3LZQSD.mjs.map +7 -0
- package/dist/lib/neutral/chunk-GSKMAS3S.mjs +13 -0
- package/dist/lib/neutral/chunk-GSKMAS3S.mjs.map +7 -0
- package/dist/lib/neutral/containers/index.mjs +10 -8
- package/dist/lib/neutral/containers/index.mjs.map +3 -3
- package/dist/lib/neutral/{create-agent-6HLW4D3A.mjs → create-agent-U567RM7Z.mjs} +3 -3
- package/dist/lib/neutral/{create-identity-JIWAR5GW.mjs → create-identity-IKN2FJ5B.mjs} +3 -3
- package/dist/lib/neutral/{create-passkey-FOXEMXGF.mjs → create-passkey-JAD3ACY7.mjs} +7 -7
- package/dist/lib/neutral/create-passkey-JAD3ACY7.mjs.map +7 -0
- package/dist/lib/neutral/{create-recovery-code-ZWDKLPH4.mjs → create-recovery-code-JZYXR4BY.mjs} +4 -4
- package/dist/lib/neutral/index.mjs +4 -4
- package/dist/lib/neutral/{join-identity-QEQFAE2S.mjs → join-identity-PJCHDNLH.mjs} +3 -3
- package/dist/lib/neutral/{layer-specs-CQLXQBQJ.mjs → layer-specs-VQCJLV33.mjs} +2 -2
- package/dist/lib/neutral/{layer-specs-CQLXQBQJ.mjs.map → layer-specs-VQCJLV33.mjs.map} +2 -2
- package/dist/lib/neutral/meta.json +1 -1
- package/dist/lib/neutral/meta.mjs +1 -1
- package/dist/lib/neutral/{navigation-handler-LU26CDFR.mjs → navigation-handler-MPJAVHWY.mjs} +3 -3
- package/dist/lib/neutral/open-usage-24I7RAFL.mjs +27 -0
- package/dist/lib/neutral/open-usage-24I7RAFL.mjs.map +7 -0
- package/dist/lib/neutral/operations/index.mjs +2 -2
- package/dist/lib/neutral/plugin.mjs +3 -3
- package/dist/lib/neutral/{react-context-B5LXMHVM.mjs → react-context-V74T6JOJ.mjs} +2 -2
- package/dist/lib/neutral/{react-context-B5LXMHVM.mjs.map → react-context-V74T6JOJ.mjs.map} +3 -3
- package/dist/lib/neutral/{react-surface-DEKGWTCD.mjs → react-surface-HPXRA65U.mjs} +8 -3
- package/dist/lib/neutral/react-surface-HPXRA65U.mjs.map +7 -0
- package/dist/lib/neutral/{recover-identity-JNFKLCUD.mjs → recover-identity-B7YM2BR4.mjs} +3 -3
- package/dist/lib/neutral/{redeem-passkey-4SBAI4AG.mjs → redeem-passkey-4DR7GPMU.mjs} +10 -10
- package/dist/lib/neutral/redeem-passkey-4DR7GPMU.mjs.map +7 -0
- package/dist/lib/neutral/{redeem-token-POBD6TMN.mjs → redeem-token-N5MBQG3I.mjs} +3 -3
- package/dist/lib/neutral/{reset-storage-LQKUV5RA.mjs → reset-storage-K47HZTGP.mjs} +3 -3
- package/dist/lib/neutral/{share-identity-KNQ2XNXV.mjs → share-identity-YJIFDIPJ.mjs} +6 -6
- package/dist/lib/neutral/share-identity-YJIFDIPJ.mjs.map +7 -0
- package/dist/lib/neutral/testing/index.mjs +2 -2
- package/dist/lib/neutral/testing/index.mjs.map +3 -3
- package/dist/lib/neutral/translations.mjs +24 -1
- package/dist/lib/neutral/translations.mjs.map +3 -3
- package/dist/lib/neutral/types/index.mjs +1 -1
- package/dist/types/dx.config.d.ts +28 -0
- package/dist/types/dx.config.d.ts.map +1 -0
- package/dist/types/src/capabilities/index.d.ts +9 -43
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/navigation-handler/index.d.ts +1 -1
- package/dist/types/src/capabilities/navigation-handler/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/node.d.ts +6 -6
- package/dist/types/src/capabilities/node.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts +2 -2
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
- package/dist/types/src/commands/account/index.d.ts +3 -0
- package/dist/types/src/commands/account/index.d.ts.map +1 -0
- package/dist/types/src/commands/account/login/index.d.ts +2 -0
- package/dist/types/src/commands/account/login/index.d.ts.map +1 -0
- package/dist/types/src/commands/account/login/login.d.ts +12 -0
- package/dist/types/src/commands/account/login/login.d.ts.map +1 -0
- package/dist/types/src/commands/account/logout/index.d.ts +2 -0
- package/dist/types/src/commands/account/logout/index.d.ts.map +1 -0
- package/dist/types/src/commands/account/logout/logout.d.ts +9 -0
- package/dist/types/src/commands/account/logout/logout.d.ts.map +1 -0
- package/dist/types/src/commands/halo/join/join.d.ts +1 -1
- package/dist/types/src/commands/halo/join/join.d.ts.map +1 -1
- package/dist/types/src/commands/halo/util.d.ts +4 -0
- package/dist/types/src/commands/halo/util.d.ts.map +1 -1
- package/dist/types/src/commands/index.d.ts +1 -0
- package/dist/types/src/commands/index.d.ts.map +1 -1
- package/dist/types/src/constants.d.ts.map +1 -1
- package/dist/types/src/containers/DevicesContainer/DevicesContainer.d.ts.map +1 -1
- package/dist/types/src/containers/RecoveryCredentialsContainer/RecoveryCredentialsContainer.d.ts.map +1 -1
- package/dist/types/src/containers/UsageContainer/UsageContainer.d.ts +7 -0
- package/dist/types/src/containers/UsageContainer/UsageContainer.d.ts.map +1 -0
- package/dist/types/src/containers/UsageContainer/UsageView.d.ts +19 -0
- package/dist/types/src/containers/UsageContainer/UsageView.d.ts.map +1 -0
- package/dist/types/src/containers/UsageContainer/UsageView.stories.d.ts +19 -0
- package/dist/types/src/containers/UsageContainer/UsageView.stories.d.ts.map +1 -0
- package/dist/types/src/containers/UsageContainer/index.d.ts +2 -0
- package/dist/types/src/containers/UsageContainer/index.d.ts.map +1 -0
- package/dist/types/src/containers/index.d.ts +1 -0
- package/dist/types/src/containers/index.d.ts.map +1 -1
- package/dist/types/src/meta.d.ts +28 -2
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/operations/create-passkey.d.ts.map +1 -1
- package/dist/types/src/operations/definitions.d.ts +1 -0
- package/dist/types/src/operations/definitions.d.ts.map +1 -1
- package/dist/types/src/operations/index.d.ts.map +1 -1
- package/dist/types/src/operations/open-usage.d.ts +5 -0
- package/dist/types/src/operations/open-usage.d.ts.map +1 -0
- package/dist/types/src/testing/initializeIdentity.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/capabilities.d.ts.map +1 -1
- package/dist/types/src/types/events.d.ts.map +1 -1
- package/dist/types/src/types/schema.d.ts +1 -0
- package/dist/types/src/types/schema.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/dx.config.ts +19 -0
- package/package.json +37 -35
- package/src/ClientPlugin.node.ts +2 -2
- package/src/ClientPlugin.test.ts +1 -1
- package/src/capabilities/app-graph-builder.ts +22 -13
- package/src/capabilities/layer-specs.ts +1 -1
- package/src/capabilities/react-context.tsx +1 -1
- package/src/capabilities/react-surface.tsx +6 -0
- package/src/commands/account/index.ts +13 -0
- package/src/commands/account/login/index.ts +5 -0
- package/src/commands/account/login/login.ts +147 -0
- package/src/commands/account/logout/index.ts +5 -0
- package/src/commands/account/logout/logout.ts +49 -0
- package/src/commands/halo/create/create.ts +2 -2
- package/src/commands/halo/index.ts +6 -6
- package/src/commands/halo/join/join.ts +2 -13
- package/src/commands/halo/util.ts +24 -0
- package/src/commands/index.ts +1 -0
- package/src/constants.ts +3 -3
- package/src/containers/AccountContainer/AccountContainer.tsx +1 -1
- package/src/containers/DevicesContainer/DevicesContainer.tsx +14 -11
- package/src/containers/InvitationsContainer/InvitationsContainer.tsx +1 -1
- package/src/containers/JoinDialog/JoinDialog.tsx +1 -1
- package/src/containers/ProfileContainer/ProfileContainer.tsx +1 -1
- package/src/containers/RecoveryCodeDialog/RecoveryCodeDialog.tsx +1 -1
- package/src/containers/RecoveryCredentialsContainer/RecoveryCredentialsContainer.tsx +2 -2
- package/src/containers/UsageContainer/UsageContainer.tsx +47 -0
- package/src/containers/UsageContainer/UsageView.stories.tsx +114 -0
- package/src/containers/UsageContainer/UsageView.tsx +238 -0
- package/src/containers/UsageContainer/index.ts +5 -0
- package/src/containers/index.ts +1 -0
- package/src/meta.ts +3 -12
- package/src/operations/create-passkey.ts +6 -4
- package/src/operations/definitions.ts +12 -1
- package/src/operations/index.ts +1 -0
- package/src/operations/open-usage.ts +24 -0
- package/src/operations/redeem-passkey.ts +7 -7
- package/src/operations/share-identity.ts +3 -3
- package/src/testing/initializeIdentity.ts +4 -2
- package/src/translations.ts +25 -1
- package/src/types/capabilities.ts +7 -5
- package/src/types/events.ts +5 -5
- package/src/types/schema.ts +23 -16
- package/dist/lib/neutral/AccountContainer-FZ3IC6H4.mjs.map +0 -7
- package/dist/lib/neutral/DevicesContainer-6MWNUC3I.mjs.map +0 -7
- package/dist/lib/neutral/InvitationsContainer-ME722VKS.mjs.map +0 -7
- package/dist/lib/neutral/JoinDialog-2NXAKPLP.mjs.map +0 -7
- package/dist/lib/neutral/ProfileContainer-VPX3FPWG.mjs.map +0 -7
- package/dist/lib/neutral/RecoveryCodeDialog-EWHB6U5T.mjs.map +0 -7
- package/dist/lib/neutral/RecoveryCredentialsContainer-IPBGDMIA.mjs.map +0 -7
- package/dist/lib/neutral/app-graph-builder-A74W7C36.mjs.map +0 -7
- package/dist/lib/neutral/chunk-D6HPCLTS.mjs.map +0 -7
- package/dist/lib/neutral/chunk-JOCCVODY.mjs +0 -21
- package/dist/lib/neutral/chunk-JOCCVODY.mjs.map +0 -7
- package/dist/lib/neutral/chunk-NTVDGDQ3.mjs +0 -8
- package/dist/lib/neutral/chunk-TUK3ELUU.mjs.map +0 -7
- package/dist/lib/neutral/chunk-WWCVZG3K.mjs +0 -13
- package/dist/lib/neutral/chunk-WWCVZG3K.mjs.map +0 -7
- package/dist/lib/neutral/create-passkey-FOXEMXGF.mjs.map +0 -7
- package/dist/lib/neutral/react-surface-DEKGWTCD.mjs.map +0 -7
- package/dist/lib/neutral/redeem-passkey-4SBAI4AG.mjs.map +0 -7
- package/dist/lib/neutral/share-identity-KNQ2XNXV.mjs.map +0 -7
- /package/dist/lib/neutral/{create-agent-6HLW4D3A.mjs.map → create-agent-U567RM7Z.mjs.map} +0 -0
- /package/dist/lib/neutral/{create-identity-JIWAR5GW.mjs.map → create-identity-IKN2FJ5B.mjs.map} +0 -0
- /package/dist/lib/neutral/{create-recovery-code-ZWDKLPH4.mjs.map → create-recovery-code-JZYXR4BY.mjs.map} +0 -0
- /package/dist/lib/neutral/{join-identity-QEQFAE2S.mjs.map → join-identity-PJCHDNLH.mjs.map} +0 -0
- /package/dist/lib/neutral/{navigation-handler-LU26CDFR.mjs.map → navigation-handler-MPJAVHWY.mjs.map} +0 -0
- /package/dist/lib/neutral/{recover-identity-JNFKLCUD.mjs.map → recover-identity-B7YM2BR4.mjs.map} +0 -0
- /package/dist/lib/neutral/{redeem-token-POBD6TMN.mjs.map → redeem-token-N5MBQG3I.mjs.map} +0 -0
- /package/dist/lib/neutral/{reset-storage-LQKUV5RA.mjs.map → reset-storage-K47HZTGP.mjs.map} +0 -0
|
@@ -6,7 +6,7 @@ import * as Effect from 'effect/Effect';
|
|
|
6
6
|
import * as Match from 'effect/Match';
|
|
7
7
|
|
|
8
8
|
import { Capability } from '@dxos/app-framework';
|
|
9
|
-
import {
|
|
9
|
+
import { NativePasskey } from '@dxos/app-toolkit';
|
|
10
10
|
import { PublicKey } from '@dxos/client';
|
|
11
11
|
import { Operation } from '@dxos/compute';
|
|
12
12
|
import { invariant } from '@dxos/invariant';
|
|
@@ -24,19 +24,19 @@ const handler: Operation.WithHandler<typeof RedeemPasskey> = RedeemPasskey.pipe(
|
|
|
24
24
|
);
|
|
25
25
|
|
|
26
26
|
const { lookupKey, signature, clientDataJson, authenticatorData } = yield* Match.value(
|
|
27
|
-
supportsNativePasskeys(),
|
|
27
|
+
NativePasskey.supportsNativePasskeys(),
|
|
28
28
|
).pipe(
|
|
29
29
|
Match.when(true, () =>
|
|
30
30
|
Effect.gen(function* () {
|
|
31
31
|
const result = yield* Effect.promise(() =>
|
|
32
|
-
loginNativePasskey({ challenge: Uint8Array.from(Buffer.from(challenge, 'base64')) }),
|
|
32
|
+
NativePasskey.loginNativePasskey({ challenge: Uint8Array.from(Buffer.from(challenge, 'base64')) }),
|
|
33
33
|
);
|
|
34
34
|
invariant(result, 'Native passkey login returned no result');
|
|
35
35
|
return {
|
|
36
|
-
lookupKey: PublicKey.from(decodeUrlSafeBase64(result.user_handle)),
|
|
37
|
-
signature: Buffer.from(decodeUrlSafeBase64(result.signature)),
|
|
38
|
-
clientDataJson: Buffer.from(decodeUrlSafeBase64(result.client_data_json)),
|
|
39
|
-
authenticatorData: Buffer.from(decodeUrlSafeBase64(result.authenticator_data)),
|
|
36
|
+
lookupKey: PublicKey.from(NativePasskey.decodeUrlSafeBase64(result.user_handle)),
|
|
37
|
+
signature: Buffer.from(NativePasskey.decodeUrlSafeBase64(result.signature)),
|
|
38
|
+
clientDataJson: Buffer.from(NativePasskey.decodeUrlSafeBase64(result.client_data_json)),
|
|
39
|
+
authenticatorData: Buffer.from(NativePasskey.decodeUrlSafeBase64(result.authenticator_data)),
|
|
40
40
|
};
|
|
41
41
|
}),
|
|
42
42
|
),
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
import * as Effect from 'effect/Effect';
|
|
6
6
|
|
|
7
|
-
import { LayoutOperation,
|
|
7
|
+
import { LayoutOperation, Paths } from '@dxos/app-toolkit';
|
|
8
8
|
import { Operation } from '@dxos/compute';
|
|
9
9
|
import { ObservabilityOperation } from '@dxos/plugin-observability';
|
|
10
10
|
|
|
@@ -14,9 +14,9 @@ import { ShareIdentity } from './definitions';
|
|
|
14
14
|
const handler: Operation.WithHandler<typeof ShareIdentity> = ShareIdentity.pipe(
|
|
15
15
|
Operation.withHandler(
|
|
16
16
|
Effect.fnUntraced(function* () {
|
|
17
|
-
yield* Operation.invoke(LayoutOperation.SwitchWorkspace, { subject: getSpacePath(Account.id) });
|
|
17
|
+
yield* Operation.invoke(LayoutOperation.SwitchWorkspace, { subject: Paths.getSpacePath(Account.id) });
|
|
18
18
|
yield* Operation.invoke(LayoutOperation.Open, {
|
|
19
|
-
subject: [
|
|
19
|
+
subject: [Paths.getSpacePath(Account.id, Account.Profile)],
|
|
20
20
|
});
|
|
21
21
|
yield* Operation.schedule(ObservabilityOperation.SendEvent, { name: 'identity.share' });
|
|
22
22
|
}),
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
import * as Effect from 'effect/Effect';
|
|
6
6
|
|
|
7
|
-
import {
|
|
7
|
+
import { AppSpace } from '@dxos/app-toolkit';
|
|
8
8
|
import { type Client } from '@dxos/client';
|
|
9
9
|
import { type Space } from '@dxos/client-protocol';
|
|
10
10
|
import { type Identity } from '@dxos/protocols/proto/dxos/client/services';
|
|
@@ -21,7 +21,9 @@ export type InitializeIdentityResult = {
|
|
|
21
21
|
export const initializeIdentity = (client: Client): Effect.Effect<InitializeIdentityResult, never, never> =>
|
|
22
22
|
Effect.gen(function* () {
|
|
23
23
|
const identity = yield* Effect.promise(() => client.halo.createIdentity());
|
|
24
|
-
const personalSpace = yield* Effect.promise(() =>
|
|
24
|
+
const personalSpace = yield* Effect.promise(() =>
|
|
25
|
+
client.spaces.create({}, { tags: [AppSpace.PERSONAL_SPACE_TAG] }),
|
|
26
|
+
);
|
|
25
27
|
yield* Effect.promise(() => personalSpace.waitUntilReady());
|
|
26
28
|
return {
|
|
27
29
|
identity,
|
package/src/translations.ts
CHANGED
|
@@ -11,7 +11,7 @@ import { meta } from '#meta';
|
|
|
11
11
|
const pluginTranslations = [
|
|
12
12
|
{
|
|
13
13
|
'en-US': {
|
|
14
|
-
[meta.
|
|
14
|
+
[meta.profile.key]: {
|
|
15
15
|
'account.label': 'User profile',
|
|
16
16
|
'profile.label': 'Profile',
|
|
17
17
|
'profile.description': 'User profile and account settings.',
|
|
@@ -27,6 +27,30 @@ const pluginTranslations = [
|
|
|
27
27
|
'security.label': 'Security',
|
|
28
28
|
'account-panel.label': 'Account',
|
|
29
29
|
'invitations-panel.label': 'Invitations',
|
|
30
|
+
'usage-panel.label': 'Usage',
|
|
31
|
+
'usage-section.title': 'Usage',
|
|
32
|
+
'usage-section.description':
|
|
33
|
+
'Rolling-window consumption against your plan limits for edge services such as AI inference.',
|
|
34
|
+
'usage-unavailable.title': 'Usage unavailable',
|
|
35
|
+
'usage-unavailable.description': 'Hub service is not configured, so usage data cannot be loaded.',
|
|
36
|
+
'usage-offline.title': 'Couldn’t load usage',
|
|
37
|
+
'usage-offline.description': 'Reconnect and reopen this panel to refresh usage and limits.',
|
|
38
|
+
'usage-empty.title': 'No usage recorded',
|
|
39
|
+
'usage-empty.description': 'Usage will appear here once you start using metered edge services.',
|
|
40
|
+
'usage-limit.description': '{{used}} of {{limit}} in the last {{window}}',
|
|
41
|
+
'usage-window-hours.label_one': '{{count}} hour',
|
|
42
|
+
'usage-window-hours.label_other': '{{count}} hours',
|
|
43
|
+
'usage-window-days.label_one': '{{count}} day',
|
|
44
|
+
'usage-window-days.label_other': '{{count}} days',
|
|
45
|
+
'usage-window-months.label_one': '{{count}} month',
|
|
46
|
+
'usage-window-months.label_other': '{{count}} months',
|
|
47
|
+
'usage-percent-used.label': '{{percent}}% used',
|
|
48
|
+
'usage-all-models.label': 'All models',
|
|
49
|
+
'usage-unlimited.label': 'Unlimited',
|
|
50
|
+
'usage-unlimited.description': '{{used}} used in the last {{window}}',
|
|
51
|
+
'usage-last-updated.label': 'Last updated {{time}}',
|
|
52
|
+
'usage-refresh.label': 'Refresh',
|
|
53
|
+
'usage-raw-json.label': 'Raw JSON',
|
|
30
54
|
'account-section.title': 'Account',
|
|
31
55
|
'account-section.description':
|
|
32
56
|
'Your identity on this device is bound to a DXOS account that gates access to edge services like sync, agents, and AI.',
|
|
@@ -15,9 +15,11 @@ import { meta } from '#meta';
|
|
|
15
15
|
import { type AccountCache as AccountCacheType } from '../state/account-cache';
|
|
16
16
|
|
|
17
17
|
export namespace ClientCapabilities {
|
|
18
|
-
export const Client = Capability.make<Client>(`${meta.
|
|
19
|
-
export const Schema = Capability.make<Type.AnyEntity[]>(`${meta.
|
|
20
|
-
export const Migration = Capability.make<ObjectMigration[]>(`${meta.
|
|
21
|
-
export const AccountCache = Capability.make<Atom.Writable<AccountCacheType>>(
|
|
22
|
-
|
|
18
|
+
export const Client = Capability.make<Client>(`${meta.profile.key}.capability.client`);
|
|
19
|
+
export const Schema = Capability.make<Type.AnyEntity[]>(`${meta.profile.key}.capability.schema`);
|
|
20
|
+
export const Migration = Capability.make<ObjectMigration[]>(`${meta.profile.key}.capability.migration`);
|
|
21
|
+
export const AccountCache = Capability.make<Atom.Writable<AccountCacheType>>(
|
|
22
|
+
`${meta.profile.key}.capability.accountCache`,
|
|
23
|
+
);
|
|
24
|
+
export const HubHttpClient = Capability.make<HubHttpClient>(`${meta.profile.key}.capability.hubHttpClient`);
|
|
23
25
|
}
|
package/src/types/events.ts
CHANGED
|
@@ -7,9 +7,9 @@ import { ActivationEvent } from '@dxos/app-framework';
|
|
|
7
7
|
import { meta } from '#meta';
|
|
8
8
|
|
|
9
9
|
export namespace ClientEvents {
|
|
10
|
-
export const ClientReady = ActivationEvent.make(`${meta.
|
|
11
|
-
export const SetupSchema = ActivationEvent.make(`${meta.
|
|
12
|
-
export const SetupMigration = ActivationEvent.make(`${meta.
|
|
13
|
-
export const IdentityCreated = ActivationEvent.make(`${meta.
|
|
14
|
-
export const SpacesReady = ActivationEvent.make(`${meta.
|
|
10
|
+
export const ClientReady = ActivationEvent.make(`${meta.profile.key}.event.clientReady`);
|
|
11
|
+
export const SetupSchema = ActivationEvent.make(`${meta.profile.key}.event.setupSchema`);
|
|
12
|
+
export const SetupMigration = ActivationEvent.make(`${meta.profile.key}.event.setupMigration`);
|
|
13
|
+
export const IdentityCreated = ActivationEvent.make(`${meta.profile.key}.event.identityCreated`);
|
|
14
|
+
export const SpacesReady = ActivationEvent.make(`${meta.profile.key}.event.spacesReady`);
|
|
15
15
|
}
|
package/src/types/schema.ts
CHANGED
|
@@ -31,59 +31,65 @@ export namespace ClientAction {
|
|
|
31
31
|
data: Schema.optional(Schema.Record({ key: Schema.String, value: Schema.Any })),
|
|
32
32
|
});
|
|
33
33
|
|
|
34
|
-
export class CreateIdentity extends Schema.TaggedClass<CreateIdentity>()(
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
34
|
+
export class CreateIdentity extends Schema.TaggedClass<CreateIdentity>()(
|
|
35
|
+
`${meta.profile.key}.action.create-identity`,
|
|
36
|
+
{
|
|
37
|
+
input: ProfileSchema,
|
|
38
|
+
output: IdentitySchema,
|
|
39
|
+
},
|
|
40
|
+
) {}
|
|
38
41
|
|
|
39
|
-
export class JoinIdentity extends Schema.TaggedClass<JoinIdentity>()(`${meta.
|
|
42
|
+
export class JoinIdentity extends Schema.TaggedClass<JoinIdentity>()(`${meta.profile.key}.action.join-identity`, {
|
|
40
43
|
input: Schema.Struct({
|
|
41
44
|
invitationCode: Schema.optional(Schema.String),
|
|
42
45
|
}),
|
|
43
46
|
output: Schema.Void,
|
|
44
47
|
}) {}
|
|
45
48
|
|
|
46
|
-
export class ShareIdentity extends Schema.TaggedClass<ShareIdentity>()(`${meta.
|
|
49
|
+
export class ShareIdentity extends Schema.TaggedClass<ShareIdentity>()(`${meta.profile.key}.action.share-identity`, {
|
|
47
50
|
input: Schema.Void,
|
|
48
51
|
output: Schema.Void,
|
|
49
52
|
}) {}
|
|
50
53
|
|
|
51
|
-
export class RecoverIdentity extends Schema.TaggedClass<RecoverIdentity>()(
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
54
|
+
export class RecoverIdentity extends Schema.TaggedClass<RecoverIdentity>()(
|
|
55
|
+
`${meta.profile.key}.action.recover-identity`,
|
|
56
|
+
{
|
|
57
|
+
input: Schema.Void,
|
|
58
|
+
output: Schema.Void,
|
|
59
|
+
},
|
|
60
|
+
) {}
|
|
55
61
|
|
|
56
|
-
export class ResetStorage extends Schema.TaggedClass<ResetStorage>()(`${meta.
|
|
62
|
+
export class ResetStorage extends Schema.TaggedClass<ResetStorage>()(`${meta.profile.key}.action.reset-storage`, {
|
|
57
63
|
input: Schema.Struct({
|
|
58
64
|
mode: Schema.optional(Schema.String),
|
|
59
65
|
}),
|
|
60
66
|
output: Schema.Void,
|
|
61
67
|
}) {}
|
|
62
68
|
|
|
63
|
-
export class CreateAgent extends Schema.TaggedClass<CreateAgent>()(`${meta.
|
|
69
|
+
export class CreateAgent extends Schema.TaggedClass<CreateAgent>()(`${meta.profile.key}.action.create-agent`, {
|
|
64
70
|
input: Schema.Void,
|
|
65
71
|
output: Schema.Void,
|
|
66
72
|
}) {}
|
|
67
73
|
|
|
68
74
|
export class CreateRecoveryCode extends Schema.TaggedClass<CreateRecoveryCode>()(
|
|
69
|
-
`${meta.
|
|
75
|
+
`${meta.profile.key}.action.create-recovery-code`,
|
|
70
76
|
{
|
|
71
77
|
input: Schema.Void,
|
|
72
78
|
output: Schema.Void,
|
|
73
79
|
},
|
|
74
80
|
) {}
|
|
75
81
|
|
|
76
|
-
export class CreatePasskey extends Schema.TaggedClass<CreatePasskey>()(`${meta.
|
|
82
|
+
export class CreatePasskey extends Schema.TaggedClass<CreatePasskey>()(`${meta.profile.key}.action.create-passkey`, {
|
|
77
83
|
input: Schema.Void,
|
|
78
84
|
output: Schema.Void,
|
|
79
85
|
}) {}
|
|
80
86
|
|
|
81
|
-
export class RedeemPasskey extends Schema.TaggedClass<RedeemPasskey>()(`${meta.
|
|
87
|
+
export class RedeemPasskey extends Schema.TaggedClass<RedeemPasskey>()(`${meta.profile.key}.action.redeem-passkey`, {
|
|
82
88
|
input: Schema.Void,
|
|
83
89
|
output: Schema.Void,
|
|
84
90
|
}) {}
|
|
85
91
|
|
|
86
|
-
export class RedeemToken extends Schema.TaggedClass<RedeemToken>()(`${meta.
|
|
92
|
+
export class RedeemToken extends Schema.TaggedClass<RedeemToken>()(`${meta.profile.key}.action.redeem-token`, {
|
|
87
93
|
input: Schema.Struct({
|
|
88
94
|
token: Schema.String,
|
|
89
95
|
}),
|
|
@@ -138,4 +144,5 @@ export namespace Account {
|
|
|
138
144
|
export const Security = `${_id}.security`;
|
|
139
145
|
export const Account = `${_id}.account`;
|
|
140
146
|
export const Invitations = `${_id}.invitations`;
|
|
147
|
+
export const Usage = `${_id}.usage`;
|
|
141
148
|
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/containers/AccountContainer/AccountContainer.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\nimport { useAtom, useAtomSet } from '@effect-atom/atom-react';\nimport React, { type FormEvent, useCallback, useState } from 'react';\n\nimport { useCapability, useOperationInvoker } from '@dxos/app-framework/ui';\nimport { LayoutOperation } from '@dxos/app-toolkit';\nimport { Context } from '@dxos/context';\nimport { createDidFromIdentityKey } from '@dxos/credentials';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { Button, Icon, IconButton, Input, Message, useAsyncEffect, useTranslation } from '@dxos/react-ui';\nimport { Settings } from '@dxos/react-ui-form';\n\nimport { meta } from '#meta';\nimport { ClientCapabilities } from '#types';\n\nimport { RESET_DIALOG } from '../../constants';\nimport { useHubHttpClient } from '../../state/use-hub-http';\n\ntype AccountState = 'loading' | 'present' | 'missing' | 'error';\n\nexport const AccountContainer = () => {\n const { t } = useTranslation(meta.id);\n const identity = useIdentity();\n const { invokePromise } = useOperationInvoker();\n const accountCacheAtom = useCapability(ClientCapabilities.AccountCache);\n const [cache] = useAtom(accountCacheAtom);\n const setCache = useAtomSet(accountCacheAtom);\n const [resendStatus, setResendStatus] = useState<string | null>(null);\n const [accountState, setAccountState] = useState<AccountState>(cache.account ? 'present' : 'loading');\n const [requestEmail, setRequestEmail] = useState('');\n const [requestSubmitted, setRequestSubmitted] = useState(false);\n\n // Single shared instance keeps the VP-auth handshake (request → 401 → signed\n // retry) at one round-trip per session instead of one per panel.\n const hubHttp = useHubHttpClient();\n\n useAsyncEffect(async () => {\n if (!hubHttp) {\n return;\n }\n try {\n const account = await hubHttp.getAccount(new Context());\n setCache((prev) => ({ ...prev, account, fetchedAt: Date.now() }));\n setAccountState('present');\n } catch (err: any) {\n if (err?.data?.type === 'no_account') {\n setCache((prev) => ({ ...prev, account: undefined, fetchedAt: Date.now() }));\n setAccountState('missing');\n } else {\n setAccountState((prev) => (prev === 'present' ? 'present' : 'error'));\n }\n }\n }, [hubHttp, setCache]);\n\n const handleResend = useCallback(async () => {\n if (!hubHttp) {\n return;\n }\n try {\n const result = await hubHttp.resendVerificationEmail(new Context());\n if (result.sent) {\n setResendStatus(t('verification-sent.message'));\n } else if (result.cooldownSecondsRemaining) {\n setResendStatus(t('verification-cooldown.message', { seconds: result.cooldownSecondsRemaining }));\n } else {\n setResendStatus(t('verification-failed.message'));\n }\n } catch {\n setResendStatus(t('verification-failed.message'));\n }\n }, [hubHttp, t]);\n\n const handleRequestAccess = useCallback(\n async (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n const email = requestEmail.trim();\n if (!email || !hubHttp) {\n return;\n }\n try {\n const identityDid = identity ? await createDidFromIdentityKey(identity.identityKey) : undefined;\n await hubHttp.requestAccess(new Context(), { email, identityDid });\n } catch {\n // Surface a generic confirmation; failure details would leak signal.\n }\n setRequestSubmitted(true);\n },\n [hubHttp, identity, requestEmail],\n );\n\n // Opens the standard reset confirmation dialog. The `onBeforeReset` hook\n // deletes the hub account first; if that fails the reset is aborted so the\n // local identity is not wiped while the server record remains.\n const handleDeleteAccount = useCallback(() => {\n if (!hubHttp) {\n return;\n }\n void invokePromise(LayoutOperation.UpdateDialog, {\n subject: RESET_DIALOG,\n blockAlign: 'start',\n props: {\n mode: 'reset-storage',\n onBeforeReset: async () => {\n await hubHttp.deleteAccount(new Context());\n setCache(() => ({}));\n },\n },\n });\n }, [hubHttp, invokePromise, setCache]);\n\n const account = cache.account;\n\n return (\n <Settings.Viewport>\n <Settings.Section title={t('account-section.title')} description={t('account-section.description')}>\n {accountState === 'loading' ? null : accountState === 'missing' ? (\n <>\n <Message.Root valence='warning'>\n <Message.Title icon='ph--warning--duotone'>{t('no-edge-access.title')}</Message.Title>\n <Message.Content>{t('no-edge-access.description')}</Message.Content>\n </Message.Root>\n <Settings.Item title={t('request-access.label')} description={t('request-access.description')}>\n {requestSubmitted ? (\n <span className='text-sm text-description'>{t('access-request-submitted.message')}</span>\n ) : (\n <form onSubmit={handleRequestAccess} className='flex gap-2 items-center justify-end'>\n <Input.Root>\n <Input.TextInput\n type='email'\n required\n placeholder={t('access-request-email.placeholder')}\n value={requestEmail}\n onChange={(event) => setRequestEmail(event.target.value)}\n classNames='min-w-64'\n />\n </Input.Root>\n <Button type='submit' density='sm'>\n {t('request-access.label')}\n </Button>\n </form>\n )}\n </Settings.Item>\n </>\n ) : accountState === 'error' && !account ? (\n <Message.Root valence='error'>\n <Message.Title icon='ph--cloud-x--duotone'>{t('account-offline.title')}</Message.Title>\n <Message.Content>{t('account-offline.description')}</Message.Content>\n </Message.Root>\n ) : account ? (\n <>\n <Settings.Item title={t('email.label')} description={account.email}>\n {account.emailVerified ? (\n <Icon icon='ph--check-circle--duotone' size={5} classNames='text-success-text justify-self-end' />\n ) : (\n <div className='flex flex-col gap-1 items-end'>\n <IconButton\n icon='ph--paper-plane-tilt--regular'\n label={t('resend-verification.label')}\n onClick={handleResend}\n density='sm'\n />\n {resendStatus ? <span className='text-xs text-description'>{resendStatus}</span> : null}\n </div>\n )}\n </Settings.Item>\n <Settings.Item title={t('delete-account.label')} description={t('delete-account.description')}>\n <Button variant='destructive' density='sm' onClick={handleDeleteAccount}>\n {t('delete-account.label')}\n </Button>\n </Settings.Item>\n </>\n ) : null}\n </Settings.Section>\n </Settings.Viewport>\n );\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["useAtom", "useAtomSet", "React", "useCallback", "useState", "useCapability", "useOperationInvoker", "LayoutOperation", "Context", "createDidFromIdentityKey", "useIdentity", "Button", "Icon", "IconButton", "Input", "Message", "useAsyncEffect", "useTranslation", "Settings", "meta", "ClientCapabilities", "AccountContainer", "identity", "useIdentity", "invokePromise", "useOperationInvoker", "accountCacheAtom", "useCapability", "cache", "useAtom", "setCache", "useAtomSet", "resendStatus", "setResendStatus", "useState", "accountState", "setAccountState", "requestEmail", "setRequestEmail", "requestSubmitted", "setRequestSubmitted", "hubHttp", "account", "fetchedAt", "err", "type", "prev", "undefined", "t", "result", "seconds", "cooldownSecondsRemaining", "email", "identityDid", "blockAlign", "props", "onBeforeReset", "title", "valence", "Message", "icon", "description", "className", "onSubmit", "handleRequestAccess", "required", "placeholder", "value", "onChange", "event", "classNames", "Button", "emailVerified", "IconButton", "onClick", "density", "Settings", "variant", "handleDeleteAccount"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/containers/DevicesContainer/DevicesContainer.tsx"],
|
|
4
|
-
"sourcesContent": ["//\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/ui';\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 { Settings } from '@dxos/react-ui-form';\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 '#operations';\n\nexport type DevicesContainerProps = {\n createInvitationUrl?: (invitationCode: string) => string;\n};\n\nexport const DevicesContainer = ({ createInvitationUrl }: DevicesContainerProps) => {\n const { t } = useTranslation(meta.id);\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 <Settings.Viewport>\n <Settings.Section\n title={t('devices-verbose.label', { ns: meta.id })}\n description={t('devices.description', { ns: meta.id })}\n >\n <Settings.Panel>\n <div role='group' className='min-w-0'>\n <h3 className='text-lg mb-2'>{t('devices.label', { ns: meta.id })}</h3>\n <List>\n {devices.map((device: Device) => (\n <DeviceListItem key={device.deviceKey.toHex()} device={device} connectionState={connectionState} />\n ))}\n </List>\n </div>\n {createInvitationUrl && (\n <div role='group' className='min-w-0'>\n <h3 className='text-lg mb-2'>{t('add-device.label')}</h3>\n <DeviceInvitation createInvitationUrl={createInvitationUrl} />\n </div>\n )}\n </Settings.Panel>\n </Settings.Section>\n <Settings.Section\n title={t('danger-zone.title', { ns: meta.id })}\n description={t('danger-zone.description', { ns: meta.id })}\n >\n <Settings.Item 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 </Settings.Item>\n <Settings.Item\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 </Settings.Item>\n <Settings.Item\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 </Settings.Item>\n </Settings.Section>\n </Settings.Viewport>\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\n return activeView === 'init' ? (\n <>\n <p className='text-description mb-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='w-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]'>\n <div className='flex justify-center py-4'>\n <div className='w-full md:max-w-80 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 </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='mx-auto my-2 text-center' />}\n <p className='text-description'>{t('auth-code.message')}</p>\n <AuthCode code={code} large classNames='mx-auto my-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"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["React", "useCallback", "useEffect", "useState", "QR", "useOperationInvoker", "log", "useClient", "useMulticastObservable", "useDevices", "Invitation", "InvitationEncoder", "useNetworkStatus", "Button", "Clipboard", "Icon", "IconButton", "List", "useId", "useTranslation", "Settings", "AuthCode", "Centered", "DeviceListItem", "Emoji", "Viewport", "osTranslations", "hexToEmoji", "meta", "ClientOperation", "DevicesContainer", "invokePromise", "devices", "swarm", "connectionState", "handleResetStorage", "description", "t", "role", "className", "ns", "key", "device", "createInvitationUrl", "title", "variant", "data-testid", "handleRecover", "handleJoinNewIdentity", "DeviceInvitation", "props", "setInvitation", "onInvitationCreate", "invitation", "halo", "share", "values", "app", "env", "subscription", "subscribe", "invitationCode", "state", "State", "stringify", "authCode", "unsubscribe", "client", "onInvitationDone", "SUCCESS", "url", "CANCELLED", "READY_FOR_AUTHENTICATION", "activeView", "icon", "label", "disabled", "classNames", "onClick", "Views", "id", "InvitationComplete", "statusValue", "InvitationAuthCode", "invitationId", "onCancel", "InvitationQR", "emoji", "div", "rounding", "backgroundColor", "color", "aria-labelledby", "errorCorrectionLevel", "cutout", "text", "span", "qrLabel", "value", "code", "large", "size"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/containers/InvitationsContainer/InvitationsContainer.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\nimport { useAtom, useAtomSet } from '@effect-atom/atom-react';\nimport React, { useCallback, useState } from 'react';\n\nimport { useCapability } from '@dxos/app-framework/ui';\nimport { Context } from '@dxos/context';\nimport { Clipboard, Icon, IconButton, List, ListItem, useAsyncEffect, useTranslation } from '@dxos/react-ui';\nimport { Settings } from '@dxos/react-ui-form';\n\nimport { meta } from '#meta';\nimport { ClientCapabilities } from '#types';\n\nimport { type AccountCacheInvitation } from '../../state/account-cache';\nimport { useHubHttpClient } from '../../state/use-hub-http';\n\nexport const InvitationsContainer = () => {\n const { t } = useTranslation(meta.id);\n const accountCacheAtom = useCapability(ClientCapabilities.AccountCache);\n const [cache] = useAtom(accountCacheAtom);\n const setCache = useAtomSet(accountCacheAtom);\n const [pending, setPending] = useState(false);\n\n // Account/invitation routes live on hub-service, not the edge worker.\n const hubHttp = useHubHttpClient();\n\n useAsyncEffect(async () => {\n if (!hubHttp) {\n return;\n }\n try {\n const result = await hubHttp.listAccountInvitations(new Context());\n setCache((prev) => ({ ...prev, invitations: result.invitations, fetchedAt: Date.now() }));\n } catch {\n // Offline: keep cache.\n }\n }, [hubHttp, setCache]);\n\n const handleIssue = useCallback(async () => {\n if (!hubHttp) {\n return;\n }\n setPending(true);\n try {\n const result = await hubHttp.issueAccountInvitation(new Context());\n // Optimistically push the new code and decrement the remaining quota; the\n // server consumes one slot at issue time. Next refresh reconciles.\n setCache((prev) => ({\n ...prev,\n account: prev.account\n ? { ...prev.account, invitationsRemaining: Math.max(0, prev.account.invitationsRemaining - 1) }\n : prev.account,\n invitations: [{ code: result.code, createdAt: new Date().toISOString() }, ...(prev.invitations ?? [])],\n }));\n } finally {\n setPending(false);\n }\n }, [hubHttp, setCache]);\n\n const remaining = cache.account?.invitationsRemaining ?? 0;\n const list = cache.invitations ?? [];\n const available = list.filter((row) => !row.redeemedByIdentityDid);\n const redeemed = list.filter((row) => Boolean(row.redeemedByIdentityDid));\n\n return (\n <Clipboard.Provider>\n <Settings.Viewport>\n <Settings.Section title={t('invitations-section.title')} description={t('invitations-section.description')}>\n <Settings.Item\n title={t('generate-invitation.label')}\n description={t('generate-invitation.description', { count: remaining })}\n >\n <IconButton\n icon='ph--plus--regular'\n label={t('generate-invitation.label')}\n variant='primary'\n onClick={handleIssue}\n disabled={pending || remaining <= 0}\n />\n </Settings.Item>\n </Settings.Section>\n\n {available.length > 0 ? (\n <Settings.Section title={t('available-invitations.title')}>\n <List>\n {available.map((row) => (\n <AvailableInvitationItem key={row.code} row={row} />\n ))}\n </List>\n </Settings.Section>\n ) : null}\n\n {redeemed.length > 0 ? (\n <Settings.Section title={t('redeemed-invitations.title')}>\n <List>\n {redeemed.map((row) => (\n <RedeemedInvitationItem key={row.code} row={row} />\n ))}\n </List>\n </Settings.Section>\n ) : null}\n </Settings.Viewport>\n </Clipboard.Provider>\n );\n};\n\nconst AvailableInvitationItem = ({ row }: { row: AccountCacheInvitation }) => (\n <ListItem.Root classNames='grid grid-cols-[min-content_1fr_min-content] items-center gap-2'>\n <ListItem.Endcap>\n <Icon icon='ph--paper-plane-tilt--duotone' size={5} classNames='text-description' />\n </ListItem.Endcap>\n <div className='flex flex-col min-w-0'>\n <ListItem.Heading classNames='font-mono truncate'>{row.code}</ListItem.Heading>\n <p className='text-description text-xs'>{new Date(row.createdAt).toLocaleString()}</p>\n </div>\n <ListItem.Endcap>\n <Clipboard.IconButton value={row.code} />\n </ListItem.Endcap>\n </ListItem.Root>\n);\n\nconst RedeemedInvitationItem = ({ row }: { row: AccountCacheInvitation }) => {\n const date = row.redeemedAt ?? row.createdAt;\n return (\n <ListItem.Root classNames='grid grid-cols-[min-content_1fr] items-center gap-2'>\n <ListItem.Endcap>\n <Icon icon='ph--check-circle--duotone' size={5} classNames='text-success-text' />\n </ListItem.Endcap>\n <div className='flex flex-col min-w-0'>\n <ListItem.Heading classNames='font-mono truncate'>{row.code}</ListItem.Heading>\n <p className='text-description text-xs'>{new Date(date).toLocaleString()}</p>\n </div>\n </ListItem.Root>\n );\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["useAtom", "useAtomSet", "React", "useCallback", "useState", "useCapability", "Context", "Clipboard", "Icon", "IconButton", "List", "ListItem", "useAsyncEffect", "useTranslation", "Settings", "meta", "ClientCapabilities", "InvitationsContainer", "accountCacheAtom", "useCapability", "cache", "setCache", "useAtomSet", "pending", "setPending", "hubHttp", "useHubHttpClient", "invitations", "fetchedAt", "result", "account", "prev", "invitationsRemaining", "code", "available", "list", "filter", "row", "redeemedByIdentityDid", "redeemed", "Clipboard", "title", "Settings", "t", "count", "remaining", "icon", "variant", "onClick", "handleIssue", "disabled", "List", "key", "map", "AvailableInvitationItem", "classNames", "className", "ListItem", "Heading", "p", "Date", "toLocaleString", "value", "RedeemedInvitationItem", "Endcap"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/containers/JoinDialog/JoinDialog.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useCallback } from 'react';\n\nimport { useOperationInvoker } from '@dxos/app-framework/ui';\nimport { LayoutOperation } from '@dxos/app-toolkit';\nimport { ObservabilityOperation } from '@dxos/plugin-observability';\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 '#operations';\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(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 // TODO(burdon): Move JoinHeading into Dialog.Heading.\n return (\n <Dialog.Content>\n <Dialog.Header>\n <Dialog.Title classNames='sr-only'>{t('join-space.label', { ns: osTranslations })}</Dialog.Title>\n </Dialog.Header>\n <Dialog.Body>\n <JoinPanel\n {...props}\n mode='halo-only'\n exitActionParent={<Dialog.Close asChild />}\n doneActionParent={<Dialog.Close asChild />}\n onCancelResetStorage={handleCancelResetStorage}\n onDone={handleDone}\n />\n </Dialog.Body>\n </Dialog.Content>\n );\n};\n"],
|
|
5
|
-
"mappings": ";;;AAIA,OAAOA,SAASC,mBAAmB;AAEnC,SAASC,2BAA2B;AACpC,SAASC,uBAAuB;AAChC,SAASC,8BAA8B;AAEvC,SAASC,QAAQC,sBAAsB;AACvC,SAASC,iBAAsC;AAC/C,SAASC,sBAAsB;AAE/B,SAASC,YAAY;AACrB,SAASC,uBAAuB;AAEzB,IAAMC,aAAa,CAACC,UAAAA;AACzB,QAAM,EAAEC,cAAa,IAAKX,oBAAAA;AAC1B,QAAM,EAAEY,EAAC,IAAKR,eAAeG,KAAKM,EAAE;AAEpC,QAAMC,2BAA2Bf,YAAY,MAAMY,cAAcH,gBAAgBO,aAAa,GAAG;IAACJ;GAAc;AAEhH,QAAMK,aAAajB,YACjB,OAAOkB,WAAAA;AACL,QAAIA,QAAQC,aAAa;AACvB,YAAMC,QAAQC,IAAI;QAChBT,cAAcV,gBAAgBoB,cAAc;UAAEC,OAAO;QAAM,CAAA;QAC3DX,cAAcT,uBAAuBqB,WAAW;UAC9CC,MAAMd,MAAMe,uBAAuB,qBAAqB,qBAAqB;QAC/E,CAAA;OACD;IACH;EACF,GACA;IAACd;GAAc;AAIjB,SACE,sBAAA,cAACR,OAAOuB,SAAO,MACb,sBAAA,cAACvB,OAAOwB,QAAM,MACZ,sBAAA,cAACxB,OAAOyB,OAAK;IAACC,YAAW;KAAWjB,EAAE,oBAAoB;IAAEkB,IAAIxB;EAAe,CAAA,CAAA,CAAA,GAEjF,sBAAA,cAACH,OAAO4B,MAAI,MACV,sBAAA,cAAC1B,WAAAA;IACE,GAAGK;IACJsB,MAAK;IACLC,kBAAkB,sBAAA,cAAC9B,OAAO+B,OAAK;MAACC,SAAAA;;IAChCC,kBAAkB,sBAAA,cAACjC,OAAO+B,OAAK;MAACC,SAAAA;;IAChCE,sBAAsBvB;IACtBwB,QAAQtB;;AAKlB;",
|
|
6
|
-
"names": ["React", "useCallback", "useOperationInvoker", "LayoutOperation", "ObservabilityOperation", "Dialog", "useTranslation", "JoinPanel", "osTranslations", "meta", "ClientOperation", "JoinDialog", "props", "invokePromise", "t", "id", "handleCancelResetStorage", "ShareIdentity", "handleDone", "result", "identityKey", "Promise", "all", "UpdateDialog", "state", "SendEvent", "name", "initialDisposition", "Content", "Header", "Title", "classNames", "ns", "Body", "mode", "exitActionParent", "Close", "asChild", "doneActionParent", "onCancelResetStorage", "onDone"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/containers/ProfileContainer/ProfileContainer.tsx"],
|
|
4
|
-
"sourcesContent": ["//\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 { Form, type FormFieldMap, type FormUpdateMeta, Settings } 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 <Settings.Item 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-w-64'\n />\n </Settings.Item>\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 <Settings.Item 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 </Settings.Item>\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 <Settings.Item title={label} description={t('hue.description')}>\n <div className='flex justify-self-end'>\n <HuePicker value={getValue()} onChange={handleChange} onReset={handleHueReset} />\n </div>\n </Settings.Item>\n );\n },\n // TODO(wittjosiah): We need text input annotations for disabled and copyable.\n did: ({ label, getValue }) => {\n return (\n <Settings.Item title={label} description={t('did.description')}>\n <ButtonGroup classNames='w-full'>\n <Input.TextInput value={getValue()} disabled classNames='min-w-64' />\n <Clipboard.IconButton value={getValue() ?? ''} />\n </ButtonGroup>\n </Settings.Item>\n );\n },\n }),\n [t],\n );\n\n return (\n <Clipboard.Provider>\n <Settings.Viewport>\n <Settings.Section title={t('profile.label')} description={t('profile.description')}>\n <Form.Root schema={UserProfile} values={values} fieldMap={fieldMap} onValuesChanged={handleChange}>\n <Form.Content classNames='gap-form-gap'>\n <Form.FieldSet />\n </Form.Content>\n </Form.Root>\n </Settings.Section>\n </Settings.Viewport>\n </Clipboard.Provider>\n );\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["Schema", "React", "useCallback", "useMemo", "useState", "debounce", "useClient", "useIdentity", "ButtonGroup", "Clipboard", "Input", "useTranslation", "Form", "Settings", "EmojiPickerBlock", "HuePicker", "hexToEmoji", "hexToHue", "meta", "UserProfile", "Struct", "did", "String", "annotations", "title", "displayName", "emoji", "hue", "getDefaultHueValue", "identity", "identityKey", "toHex", "getHueValue", "profile", "data", "getDefaultEmojiValue", "getEmojiValue", "ProfileContainer", "t", "id", "client", "setDisplayNameDirectly", "setEmojiDirectly", "setHueDirectly", "updateProfile", "halo", "handleChange", "path", "changed", "Object", "entries", "values", "fieldMap", "type", "label", "getValue", "onValueChange", "target", "value", "Item", "description", "TextInput", "onChange", "placeholder", "classNames", "nextEmoji", "handleEmojiReset", "triggerVariant", "onChangeEmoji", "onClickClear", "nextHue", "handleHueReset", "div", "className", "onReset", "disabled", "IconButton", "Provider", "Viewport", "Section", "Root", "schema", "onValuesChanged", "Content", "FieldSet"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/containers/RecoveryCodeDialog/RecoveryCodeDialog.tsx", "../../../src/containers/RecoveryCodeDialog/index.ts"],
|
|
4
|
-
"sourcesContent": ["//\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\n// TODO(burdon): Should have cancel button.\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 size='md' classNames='min-h-[15rem]'>\n <AlertDialog.Body>\n <AlertDialog.Title>{t('recovery-code-dialog.title')}</AlertDialog.Title>\n <AlertDialog.Description classNames='py-4'>{t('recovery-code-dialog.description')}</AlertDialog.Description>\n <Clipboard.Provider>\n <Code code={code} />\n </Clipboard.Provider>\n <div className='flex flex-col py-4 gap-2'>\n <p>{t('recovery-code-dialog-warning-1.message')}</p>\n <p>{t('recovery-code-dialog-warning-2.message')}</p>\n </div>\n <div className='flex items-center gap-2 pb-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 </AlertDialog.Body>\n <AlertDialog.ActionBar>\n <AlertDialog.Action asChild>\n <Button data-testid='recoveryCode.continue' variant='primary' disabled={!confirmation}>\n {t('continue.label')}\n </Button>\n </AlertDialog.Action>\n </AlertDialog.ActionBar>\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-sm 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='w-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 2025 DXOS.org\n//\n\nimport { RecoveryCodeDialog } from './RecoveryCodeDialog';\n\nexport * from './RecoveryCodeDialog';\nexport default RecoveryCodeDialog;\n"],
|
|
5
|
-
"mappings": ";;;AAIA,OAAOA,SAASC,aAAaC,gBAAgB;AAE7C,SAASC,aAAaC,QAAQC,WAAWC,OAAOC,sBAAsB;AAEtE,SAASC,YAAY;AAOd,IAAMC,qBAAqB,CAAC,EAAEC,KAAI,MAA2B;AAClE,QAAM,EAAEC,EAAC,IAAKJ,eAAeC,KAAKI,EAAE;AACpC,QAAM,CAACC,cAAcC,eAAAA,IAAmBZ,SAAS,KAAA;AAEjD,QAAMa,qBAAqBd,YAAY,CAACe,YAAqBF,gBAAgBE,OAAAA,GAAU,CAAA,CAAE;AAEzF,SACE,sBAAA,cAACb,YAAYc,SAAO;IAACC,MAAK;IAAKC,YAAW;KACxC,sBAAA,cAAChB,YAAYiB,MAAI,MACf,sBAAA,cAACjB,YAAYkB,OAAK,MAAEV,EAAE,4BAAA,CAAA,GACtB,sBAAA,cAACR,YAAYmB,aAAW;IAACH,YAAW;KAAQR,EAAE,kCAAA,CAAA,GAC9C,sBAAA,cAACN,UAAUkB,UAAQ,MACjB,sBAAA,cAACC,MAAAA;IAAKd;OAER,sBAAA,cAACe,OAAAA;IAAIC,WAAU;KACb,sBAAA,cAACC,KAAAA,MAAGhB,EAAE,wCAAA,CAAA,GACN,sBAAA,cAACgB,KAAAA,MAAGhB,EAAE,wCAAA,CAAA,CAAA,GAER,sBAAA,cAACc,OAAAA;IAAIC,WAAU;KACb,sBAAA,cAACpB,MAAMsB,MAAI,MACT,sBAAA,cAACtB,MAAMuB,UAAQ;IACbC,eAAY;IACZd,SAASH;IACTkB,iBAAiBhB;MAEnB,sBAAA,cAACT,MAAM0B,OAAK,MAAErB,EAAE,kCAAA,CAAA,CAAA,CAAA,CAAA,GAItB,sBAAA,cAACR,YAAY8B,WAAS,MACpB,sBAAA,cAAC9B,YAAY+B,QAAM;IAACC,SAAAA;KAClB,sBAAA,cAAC/B,QAAAA;IAAO0B,eAAY;IAAwBM,SAAQ;IAAUC,UAAU,CAACxB;KACtEF,EAAE,gBAAA,CAAA,CAAA,CAAA,CAAA;AAMf;AAEA,IAAMa,OAAO,CAAC,EAAEd,KAAI,MAAoB;AACtC,QAAM4B,QAAQ5B,KAAK6B,MAAM,GAAA;AACzB,SACE,sBAAA,cAACd,OAAAA;IAAIC,WAAU;KACb,sBAAA,cAACrB,UAAUmC,YAAU;IAACC,OAAO/B;IAAMS,YAAW;MAC9C,sBAAA,cAACM,OAAAA;IAAIC,WAAU;KACZY,MAAMI,IAAI,CAACC,MAAMC,MAChB,sBAAA,cAACnB,OAAAA;IAAIoB,KAAKD;IAAGlB,WAAU;KACrB,sBAAA,cAACD,OAAAA;IAAIC,WAAU;KAAwCkB,IAAI,CAAA,GAC3D,sBAAA,cAACnB,OAAAA;IAAIC,WAAU;KAAWiB,IAAAA,CAAAA,CAAAA,CAAAA,CAAAA;AAMtC;;;AC/DA,IAAA,6BAAeG;",
|
|
6
|
-
"names": ["React", "useCallback", "useState", "AlertDialog", "Button", "Clipboard", "Input", "useTranslation", "meta", "RecoveryCodeDialog", "code", "t", "id", "confirmation", "setConfirmation", "handleConfirmation", "checked", "Content", "size", "classNames", "Body", "Title", "Description", "Provider", "Code", "div", "className", "p", "Root", "Checkbox", "data-testid", "onCheckedChange", "Label", "ActionBar", "Action", "asChild", "variant", "disabled", "words", "split", "IconButton", "value", "map", "word", "i", "key", "RecoveryCodeDialog"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/containers/RecoveryCredentialsContainer/RecoveryCredentialsContainer.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport React from 'react';\n\nimport { useOperationInvoker } from '@dxos/app-framework/ui';\nimport { useCredentials } from '@dxos/react-client/halo';\nimport { Icon, IconButton, List, ListItem, Message, useTranslation } from '@dxos/react-ui';\nimport { Settings } from '@dxos/react-ui-form';\n\nimport { meta } from '#meta';\nimport { ClientOperation } from '#operations';\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 <Settings.Viewport>\n <Settings.Section title={t('recovery-setup-dialog.title')} description={t('recovery-setup-dialog.description')}>\n <Settings.Item 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 </Settings.Item>\n <Settings.Item 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 </Settings.Item>\n </Settings.Section>\n <Settings.Section title={t('credentials-list.label')}>\n {recoveryCredentials.length < 1 ? (\n <Message.Root valence='error'>\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>\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 </Settings.Section>\n </Settings.Viewport>\n );\n};\n"],
|
|
5
|
-
"mappings": ";;;AAIA,OAAOA,WAAW;AAElB,SAASC,2BAA2B;AACpC,SAASC,sBAAsB;AAC/B,SAASC,MAAMC,YAAYC,MAAMC,UAAUC,SAASC,sBAAsB;AAC1E,SAASC,gBAAgB;AAEzB,SAASC,YAAY;AACrB,SAASC,uBAAuB;AAEzB,IAAMC,4BAA4B,GAAGF,KAAKG,EAAE;AAE5C,IAAMC,+BAA+B,MAAA;AAC1C,QAAM,EAAEC,EAAC,IAAKP,eAAeE,KAAKG,EAAE;AACpC,QAAM,EAAEG,cAAa,IAAKf,oBAAAA;AAC1B,QAAMgB,cAAcf,eAAAA;AACpB,QAAMgB,sBAAsBD,YAAYE,OACtC,CAACC,eAAeA,WAAWC,QAAQC,UAAU,OAAA,MAAa,wCAAA;AAG5D,SACE,sBAAA,cAACb,SAASc,UAAQ,MAChB,sBAAA,cAACd,SAASe,SAAO;IAACC,OAAOV,EAAE,6BAAA;IAAgCW,aAAaX,EAAE,mCAAA;KACxE,sBAAA,cAACN,SAASkB,MAAI;IAACF,OAAOV,EAAE,sBAAA;IAAyBW,aAAaX,EAAE,4BAAA;KAC9D,sBAAA,cAACX,YAAAA;IACCwB,OAAOb,EAAE,sBAAA;IACTc,MAAK;IACLC,SAAQ;IACRC,SAAS,MAAMf,cAAcL,gBAAgBqB,aAAa;OAG9D,sBAAA,cAACvB,SAASkB,MAAI;IAACF,OAAOV,EAAE,4BAAA;IAA+BW,aAAaX,EAAE,kCAAA;KACpE,sBAAA,cAACX,YAAAA;IACCwB,OAAOb,EAAE,4BAAA;IACTc,MAAK;IACLC,SAAQ;IACRC,SAAS,MAAMf,cAAcL,gBAAgBsB,kBAAkB;QAIrE,sBAAA,cAACxB,SAASe,SAAO;IAACC,OAAOV,EAAE,wBAAA;KACxBG,oBAAoBgB,SAAS,IAC5B,sBAAA,cAAC3B,QAAQ4B,MAAI;IAACC,SAAQ;KACpB,sBAAA,cAAC7B,QAAQ8B,OAAK;IAACR,MAAK;KAA+Bd,EAAE,sBAAA,CAAA,GACrD,sBAAA,cAACR,QAAQ+B,SAAO,MAAEvB,EAAE,wBAAA,CAAA,CAAA,IAGtB,sBAAA,cAACV,MAAAA,MACEa,oBAAoBqB,IAAI,CAACnB,eACxB,sBAAA,cAACd,SAAS6B,MAAI;IAACK,KAAKpB,WAAWP,IAAI4B,MAAAA;KACjC,sBAAA,cAACnC,SAASoC,QAAM,MACd,sBAAA,cAACvC,MAAAA;IAAK0B,MAAK;OAEb,sBAAA,cAACvB,SAASqC,SAAO,MAAEvB,WAAWwB,aAAaC,eAAc,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAQzE;",
|
|
6
|
-
"names": ["React", "useOperationInvoker", "useCredentials", "Icon", "IconButton", "List", "ListItem", "Message", "useTranslation", "Settings", "meta", "ClientOperation", "MANAGE_CREDENTIALS_DIALOG", "id", "RecoveryCredentialsContainer", "t", "invokePromise", "credentials", "recoveryCredentials", "filter", "credential", "subject", "assertion", "Viewport", "Section", "title", "description", "Item", "label", "icon", "variant", "onClick", "CreatePasskey", "CreateRecoveryCode", "length", "Root", "valence", "Title", "Content", "map", "key", "toHex", "Endcap", "Heading", "issuanceDate", "toLocaleString"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/capabilities/app-graph-builder.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability } from '@dxos/app-framework';\nimport { AppCapabilities } from '@dxos/app-toolkit';\nimport { Operation } from '@dxos/compute';\nimport { CreateAtom, GraphBuilder, Node, NodeMatcher } from '@dxos/plugin-graph';\nimport { ConnectionState } from '@dxos/react-client/mesh';\n\nimport { meta } from '#meta';\nimport { ClientOperation } from '#operations';\nimport { Account, ClientCapabilities } from '#types';\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n const extensions = yield* GraphBuilder.createExtension({\n id: 'root',\n match: NodeMatcher.whenRoot,\n actions: () =>\n Effect.succeed([\n {\n id: 'openUserAccount',\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 Node.make({\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 Node.make({\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 Node.make({\n id: Account.Account,\n data: Account.Account,\n type: meta.id,\n properties: {\n label: ['account-panel.label', { ns: meta.id }],\n icon: 'ph--identification-card--regular',\n },\n }),\n Node.make({\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 Node.make({\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 Node.make({\n id: Account.Invitations,\n data: Account.Invitations,\n type: meta.id,\n properties: {\n label: ['invitations-panel.label', { ns: meta.id }],\n icon: 'ph--ticket--regular',\n },\n }),\n ],\n }),\n ];\n }),\n });\n\n return Capability.contributes(AppCapabilities.AppGraphBuilder, extensions);\n }),\n);\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["Effect", "Capability", "AppCapabilities", "Operation", "CreateAtom", "GraphBuilder", "Node", "NodeMatcher", "ConnectionState", "meta", "ClientOperation", "Account", "ClientCapabilities", "makeModule", "fnUntraced", "extensions", "createExtension", "id", "match", "whenRoot", "actions", "succeed", "data", "invoke", "ShareIdentity", "properties", "label", "ns", "icon", "disposition", "keyBinding", "macos", "windows", "linux", "connector", "node", "get", "client", "Client", "identity", "fromObservable", "halo", "status", "mesh", "networkStatus", "make", "type", "testId", "userId", "identityKey", "toHex", "hue", "profile", "emoji", "swarm", "OFFLINE", "nodes", "Profile", "Devices", "Security", "Invitations", "contributes", "AppGraphBuilder"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/operations/definitions.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\nimport { Capability } from '@dxos/app-framework';\nimport { Operation } from '@dxos/compute';\nimport { DXN, IdentityDid, SpaceId } from '@dxos/keys';\n\nimport { meta } from '#meta';\n\nconst makeKey = (name: string) => DXN.make(`${meta.id}.operation.${name}`);\n\nconst IdentitySchema = Schema.Struct({\n identityDid: IdentityDid,\n spaceId: Schema.optional(SpaceId),\n profile: Schema.optional(\n Schema.Struct({\n displayName: Schema.optional(Schema.String),\n avatarCid: Schema.optional(Schema.String),\n data: Schema.optional(Schema.Record({ key: Schema.String, value: Schema.Any })),\n }),\n ),\n});\n\nconst ProfileSchema = Schema.Struct({\n displayName: Schema.optional(Schema.String),\n avatarCid: Schema.optional(Schema.String),\n data: Schema.optional(Schema.Record({ key: Schema.String, value: Schema.Any })),\n});\n\nexport const CreateIdentity = Operation.make({\n meta: { key: makeKey('createIdentity'), name: 'Create Identity', icon: 'ph--user--regular' },\n services: [Capability.Service],\n input: ProfileSchema,\n output: IdentitySchema,\n});\n\nexport const JoinIdentity = Operation.make({\n meta: { key: makeKey('joinIdentity'), name: 'Join Identity', icon: 'ph--sign-in--regular' },\n services: [Capability.Service],\n input: Schema.Struct({\n invitationCode: Schema.optional(Schema.String),\n }),\n output: Schema.Void,\n});\n\nexport const ShareIdentity = Operation.make({\n meta: {\n key: makeKey('shareIdentity'),\n name: 'Share Identity',\n icon: 'ph--share-network--regular',\n },\n services: [Capability.Service],\n input: Schema.Void,\n output: Schema.Void,\n});\n\nexport const RecoverIdentity = Operation.make({\n meta: { key: makeKey('recoverIdentity'), name: 'Recover Identity', icon: 'ph--key--regular' },\n services: [Capability.Service],\n input: Schema.Void,\n output: Schema.Void,\n});\n\nexport const ResetStorage = Operation.make({\n meta: { key: makeKey('resetStorage'), name: 'Reset Storage', icon: 'ph--warning--regular' },\n services: [Capability.Service],\n input: Schema.Struct({\n mode: Schema.optional(Schema.String),\n }),\n output: Schema.Void,\n});\n\nexport const CreateAgent = Operation.make({\n meta: { key: makeKey('createAgent'), name: 'Create Agent', icon: 'ph--brain--regular' },\n services: [Capability.Service],\n input: Schema.Void,\n output: Schema.Void,\n});\n\nexport const CreateRecoveryCode = Operation.make({\n meta: {\n key: makeKey('createRecoveryCode'),\n name: 'Create Recovery Code',\n icon: 'ph--key--regular',\n },\n services: [Capability.Service],\n input: Schema.Void,\n output: Schema.Void,\n});\n\nexport const CreatePasskey = Operation.make({\n meta: { key: makeKey('createPasskey'), name: 'Create Passkey', icon: 'ph--key--regular' },\n services: [Capability.Service],\n input: Schema.Void,\n output: Schema.Void,\n});\n\nexport const RedeemPasskey = Operation.make({\n meta: { key: makeKey('redeemPasskey'), name: 'Redeem Passkey', icon: 'ph--key--regular' },\n services: [Capability.Service],\n input: Schema.Void,\n output: Schema.Void,\n});\n\nexport const RedeemToken = Operation.make({\n meta: { key: makeKey('redeemToken'), name: 'Redeem Token', icon: 'ph--lock--regular' },\n services: [Capability.Service],\n input: Schema.Struct({\n token: Schema.String,\n }),\n output: Schema.Void,\n});\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["Schema", "Capability", "Operation", "DXN", "IdentityDid", "SpaceId", "meta", "makeKey", "name", "make", "id", "IdentitySchema", "Struct", "identityDid", "spaceId", "optional", "profile", "displayName", "String", "avatarCid", "data", "Record", "key", "value", "Any", "ProfileSchema", "CreateIdentity", "icon", "services", "Service", "input", "output", "JoinIdentity", "invitationCode", "Void", "ShareIdentity", "RecoverIdentity", "ResetStorage", "mode", "CreateAgent", "CreateRecoveryCode", "CreatePasskey", "RedeemPasskey", "RedeemToken", "token"]
|
|
7
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
// src/meta.ts
|
|
2
|
-
import { Plugin } from "@dxos/app-framework";
|
|
3
|
-
import { DXN } from "@dxos/keys";
|
|
4
|
-
import { trim } from "@dxos/util";
|
|
5
|
-
var meta = Plugin.makeMeta({
|
|
6
|
-
key: DXN.make("org.dxos.plugin.client"),
|
|
7
|
-
name: "Client",
|
|
8
|
-
author: "DXOS",
|
|
9
|
-
description: trim`
|
|
10
|
-
Core client connectivity and peer-to-peer networking infrastructure.
|
|
11
|
-
Manages identity, authentication, and real-time synchronization across devices.
|
|
12
|
-
`,
|
|
13
|
-
tags: [
|
|
14
|
-
"system"
|
|
15
|
-
]
|
|
16
|
-
});
|
|
17
|
-
|
|
18
|
-
export {
|
|
19
|
-
meta
|
|
20
|
-
};
|
|
21
|
-
//# sourceMappingURL=chunk-JOCCVODY.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 { Plugin } from '@dxos/app-framework';\nimport { DXN } from '@dxos/keys';\nimport { trim } from '@dxos/util';\n\nexport const meta = Plugin.makeMeta({\n key: DXN.make('org.dxos.plugin.client'),\n name: 'Client',\n author: 'DXOS',\n description: trim`\n Core client connectivity and peer-to-peer networking infrastructure.\n Manages identity, authentication, and real-time synchronization across devices.\n `,\n tags: ['system'],\n});\n"],
|
|
5
|
-
"mappings": ";AAIA,SAASA,cAAc;AACvB,SAASC,WAAW;AACpB,SAASC,YAAY;AAEd,IAAMC,OAAOH,OAAOI,SAAS;EAClCC,KAAKJ,IAAIK,KAAK,wBAAA;EACdC,MAAM;EACNC,QAAQ;EACRC,aAAaP;;;;EAIbQ,MAAM;IAAC;;AACT,CAAA;",
|
|
6
|
-
"names": ["Plugin", "DXN", "trim", "meta", "makeMeta", "key", "make", "name", "author", "description", "tags"]
|
|
7
|
-
}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
// src/operations/index.ts
|
|
2
|
-
import { OperationHandlerSet } from "@dxos/compute";
|
|
3
|
-
var ClientOperationHandlerSet = OperationHandlerSet.lazy(() => import("./create-agent-6HLW4D3A.mjs"), () => import("./create-identity-JIWAR5GW.mjs"), () => import("./create-passkey-FOXEMXGF.mjs"), () => import("./create-recovery-code-ZWDKLPH4.mjs"), () => import("./join-identity-QEQFAE2S.mjs"), () => import("./recover-identity-JNFKLCUD.mjs"), () => import("./redeem-passkey-4SBAI4AG.mjs"), () => import("./redeem-token-POBD6TMN.mjs"), () => import("./reset-storage-LQKUV5RA.mjs"), () => import("./share-identity-KNQ2XNXV.mjs"));
|
|
4
|
-
|
|
5
|
-
export {
|
|
6
|
-
ClientOperationHandlerSet
|
|
7
|
-
};
|
|
8
|
-
//# sourceMappingURL=chunk-NTVDGDQ3.mjs.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/types/capabilities.ts", "../../../src/types/events.ts", "../../../src/types/schema.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Atom } from '@effect-atom/atom-react';\n\nimport { Capability } from '@dxos/app-framework';\nimport { type Client } from '@dxos/client';\nimport { type ObjectMigration } from '@dxos/client/echo';\nimport { type Type } from '@dxos/echo';\nimport { type HubHttpClient } from '@dxos/edge-client';\n\nimport { meta } from '#meta';\n\nimport { type AccountCache as AccountCacheType } from '../state/account-cache';\n\nexport namespace ClientCapabilities {\n export const Client = Capability.make<Client>(`${meta.id}.capability.client`);\n export const Schema = Capability.make<Type.AnyEntity[]>(`${meta.id}.capability.schema`);\n export const Migration = Capability.make<ObjectMigration[]>(`${meta.id}.capability.migration`);\n export const AccountCache = Capability.make<Atom.Writable<AccountCacheType>>(`${meta.id}.capability.accountCache`);\n export const HubHttpClient = Capability.make<HubHttpClient>(`${meta.id}.capability.hubHttpClient`);\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { ActivationEvent } from '@dxos/app-framework';\n\nimport { meta } from '#meta';\n\nexport namespace ClientEvents {\n export const ClientReady = ActivationEvent.make(`${meta.id}.event.client-ready`);\n export const SetupSchema = ActivationEvent.make(`${meta.id}.event.setup-schema`);\n export const SetupMigration = ActivationEvent.make(`${meta.id}.event.setup-migration`);\n export const IdentityCreated = ActivationEvent.make(`${meta.id}.event.identity-created`);\n export const SpacesReady = ActivationEvent.make(`${meta.id}.event.spaces-ready`);\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport type * as Effect from 'effect/Effect';\nimport * as Schema from 'effect/Schema';\n\nimport { Capability } from '@dxos/app-framework';\nimport { type Client, type ClientOptions } from '@dxos/client';\nimport { IdentityDid, SpaceId } from '@dxos/keys';\n\nimport { meta } from '#meta';\n\n// TODO(wittjosiah): Factor out. Generate?\nconst IdentitySchema = Schema.Struct({\n identityDid: IdentityDid,\n spaceId: Schema.optional(SpaceId),\n profile: Schema.optional(\n Schema.Struct({\n displayName: Schema.optional(Schema.String),\n avatarCid: Schema.optional(Schema.String),\n data: Schema.optional(Schema.Record({ key: Schema.String, value: Schema.Any })),\n }),\n ),\n});\n\nexport namespace ClientAction {\n const ProfileSchema = Schema.Struct({\n displayName: Schema.optional(Schema.String),\n avatarCid: Schema.optional(Schema.String),\n data: Schema.optional(Schema.Record({ key: Schema.String, value: Schema.Any })),\n });\n\n export class CreateIdentity extends Schema.TaggedClass<CreateIdentity>()(`${meta.id}.action.create-identity`, {\n input: ProfileSchema,\n output: IdentitySchema,\n }) {}\n\n export class JoinIdentity extends Schema.TaggedClass<JoinIdentity>()(`${meta.id}.action.join-identity`, {\n input: Schema.Struct({\n invitationCode: Schema.optional(Schema.String),\n }),\n output: Schema.Void,\n }) {}\n\n export class ShareIdentity extends Schema.TaggedClass<ShareIdentity>()(`${meta.id}.action.share-identity`, {\n input: Schema.Void,\n output: Schema.Void,\n }) {}\n\n export class RecoverIdentity extends Schema.TaggedClass<RecoverIdentity>()(`${meta.id}.action.recover-identity`, {\n input: Schema.Void,\n output: Schema.Void,\n }) {}\n\n export class ResetStorage extends Schema.TaggedClass<ResetStorage>()(`${meta.id}.action.reset-storage`, {\n input: Schema.Struct({\n mode: Schema.optional(Schema.String),\n }),\n output: Schema.Void,\n }) {}\n\n export class CreateAgent extends Schema.TaggedClass<CreateAgent>()(`${meta.id}.action.create-agent`, {\n input: Schema.Void,\n output: Schema.Void,\n }) {}\n\n export class CreateRecoveryCode extends Schema.TaggedClass<CreateRecoveryCode>()(\n `${meta.id}.action.create-recovery-code`,\n {\n input: Schema.Void,\n output: Schema.Void,\n },\n ) {}\n\n export class CreatePasskey extends Schema.TaggedClass<CreatePasskey>()(`${meta.id}.action.create-passkey`, {\n input: Schema.Void,\n output: Schema.Void,\n }) {}\n\n export class RedeemPasskey extends Schema.TaggedClass<RedeemPasskey>()(`${meta.id}.action.redeem-passkey`, {\n input: Schema.Void,\n output: Schema.Void,\n }) {}\n\n export class RedeemToken extends Schema.TaggedClass<RedeemToken>()(`${meta.id}.action.redeem-token`, {\n input: Schema.Struct({\n token: Schema.String,\n }),\n output: Schema.Void,\n }) {}\n}\n\nexport type ClientPluginOptions = ClientOptions & {\n /**\n * Base origin for the invitation link.\n */\n shareableLinkOrigin?: string;\n\n /**\n * Path for the invitation link.\n */\n invitationPath?: string;\n\n /**\n * Query parameter for the invitation code.\n */\n invitationProp?: string;\n\n /**\n * Run after the client has been initialized.\n * Plugin context is provided so capabilities are accessible.\n */\n onClientInitialized?: (params: { client: Client }) => Effect.Effect<void, Error | never, Capability.Service | never>;\n\n /**\n * Called when spaces are ready.\n * Plugin context is provided so capabilities are accessible.\n */\n onSpacesReady?: (params: { client: Client }) => Effect.Effect<void, Error | never, Capability.Service | never>;\n\n /**\n * Called when the client is reset.\n * Plugin context is provided so capabilities are accessible.\n */\n onReset?: (params: { target?: string }) => Effect.Effect<void, Error | never, Capability.Service | never>;\n};\n\nexport namespace Account {\n // TODO(wittjosiah): Cannot use slashes in ids until we have a router which decouples ids from url paths.\n const _id = 'dxos.org.plugin.client.account';\n // TODO(wittjosiah): This is a hack to prevent the previous deck from being set for pinned items.\n // Ideally this should be worked into the data model in a generic way.\n export const id = `!${_id}`;\n\n export const Profile = `${_id}.profile`;\n export const Devices = `${_id}.devices`;\n export const Security = `${_id}.security`;\n export const Account = `${_id}.account`;\n export const Invitations = `${_id}.invitations`;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["Capability", "meta", "ClientCapabilities", "Client", "make", "id", "Schema", "Migration", "AccountCache", "HubHttpClient", "ActivationEvent", "meta", "ClientEvents", "ClientReady", "make", "id", "SetupSchema", "SetupMigration", "IdentityCreated", "SpacesReady", "Schema", "IdentityDid", "SpaceId", "meta", "IdentitySchema", "Struct", "identityDid", "spaceId", "optional", "profile", "displayName", "String", "avatarCid", "data", "Record", "key", "value", "Any", "ClientAction", "ProfileSchema", "CreateIdentity", "TaggedClass", "id", "input", "output", "JoinIdentity", "invitationCode", "Void", "ShareIdentity", "RecoverIdentity", "ResetStorage", "mode", "CreateAgent", "CreateRecoveryCode", "CreatePasskey", "RedeemPasskey", "RedeemToken", "token", "Account", "_id", "Profile", "Devices", "Security", "Invitations"]
|
|
7
|
-
}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
// src/constants.ts
|
|
2
|
-
import { DXN } from "@dxos/keys";
|
|
3
|
-
import { meta } from "#meta";
|
|
4
|
-
var JOIN_DIALOG = DXN.make(`${meta.id}.joinDialog`);
|
|
5
|
-
var RECOVERY_CODE_DIALOG = DXN.make(`${meta.id}.recoveryCodeDialog`);
|
|
6
|
-
var RESET_DIALOG = DXN.make(`${meta.id}.resetDialog`);
|
|
7
|
-
|
|
8
|
-
export {
|
|
9
|
-
JOIN_DIALOG,
|
|
10
|
-
RECOVERY_CODE_DIALOG,
|
|
11
|
-
RESET_DIALOG
|
|
12
|
-
};
|
|
13
|
-
//# sourceMappingURL=chunk-WWCVZG3K.mjs.map
|