@dxos/plugin-client 0.12.0-next-73daef452f1464b62efdbca75fb0067c1066f264 → 0.13.0
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/Account.mjs +29 -10
- package/dist/lib/Account.mjs.map +1 -1
- package/dist/lib/CliLogin.mjs +78 -0
- package/dist/lib/CliLogin.mjs.map +1 -0
- package/dist/lib/ClientCapabilities.mjs +25 -1
- package/dist/lib/ClientCapabilities.mjs.map +1 -1
- package/dist/lib/ClientEvents.mjs +7 -3
- package/dist/lib/ClientEvents.mjs.map +1 -1
- package/dist/lib/{chunk-definitions.mjs → ClientOperation.mjs} +11 -7
- package/dist/lib/ClientOperation.mjs.map +1 -0
- package/dist/lib/ClientOptions.mjs.map +1 -1
- package/dist/lib/PasskeyError.mjs +69 -12
- package/dist/lib/PasskeyError.mjs.map +1 -1
- package/dist/lib/capabilities.browser.mjs +134 -0
- package/dist/lib/capabilities.browser.mjs.map +1 -0
- package/dist/lib/capabilities.mjs +47 -10
- package/dist/lib/capabilities.mjs.map +1 -1
- package/dist/lib/capabilities.node.mjs +40 -7
- package/dist/lib/capabilities.node.mjs.map +1 -1
- package/dist/lib/capabilities.tauri.mjs +134 -0
- package/dist/lib/capabilities.tauri.mjs.map +1 -0
- package/dist/lib/capabilities.workerd.mjs +24 -4
- package/dist/lib/capabilities.workerd.mjs.map +1 -1
- package/dist/lib/chunk-AccountContainer.mjs +53 -41
- package/dist/lib/chunk-AccountContainer.mjs.map +1 -1
- package/dist/lib/chunk-CliLoginDialog.mjs +146 -0
- package/dist/lib/chunk-CliLoginDialog.mjs.map +1 -0
- package/dist/lib/chunk-ContactPickerContainer.mjs +120 -0
- package/dist/lib/chunk-ContactPickerContainer.mjs.map +1 -0
- package/dist/lib/chunk-ContactsContainer.mjs +53 -0
- package/dist/lib/chunk-ContactsContainer.mjs.map +1 -0
- package/dist/lib/chunk-DevicesContainer.mjs +48 -112
- package/dist/lib/chunk-DevicesContainer.mjs.map +1 -1
- package/dist/lib/chunk-HaloServices.mjs +28 -0
- package/dist/lib/chunk-HaloServices.mjs.map +1 -0
- package/dist/lib/chunk-InvitationsContainer.mjs +61 -39
- package/dist/lib/chunk-InvitationsContainer.mjs.map +1 -1
- package/dist/lib/chunk-JoinDialog.mjs +10 -9
- package/dist/lib/chunk-JoinDialog.mjs.map +1 -1
- package/dist/lib/chunk-ProfileContainer.mjs +60 -39
- package/dist/lib/chunk-ProfileContainer.mjs.map +1 -1
- package/dist/lib/chunk-RecoveryCodeDialog.mjs +26 -21
- package/dist/lib/chunk-RecoveryCodeDialog.mjs.map +1 -1
- package/dist/lib/chunk-RecoveryCredentialsContainer.mjs +95 -65
- package/dist/lib/chunk-RecoveryCredentialsContainer.mjs.map +1 -1
- package/dist/lib/chunk-ResetDialog.mjs +26 -14
- package/dist/lib/chunk-ResetDialog.mjs.map +1 -1
- package/dist/lib/chunk-SpaceInvitationContainer.mjs +50 -0
- package/dist/lib/chunk-SpaceInvitationContainer.mjs.map +1 -0
- package/dist/lib/chunk-UsageContainer.mjs +22 -20
- package/dist/lib/chunk-UsageContainer.mjs.map +1 -1
- package/dist/lib/chunk-account-cache.mjs +2 -2
- package/dist/lib/chunk-account-cache.mjs.map +1 -1
- package/dist/lib/chunk-app-graph-builder.mjs +159 -60
- package/dist/lib/chunk-app-graph-builder.mjs.map +1 -1
- package/dist/lib/chunk-client-services.mjs +21 -0
- package/dist/lib/chunk-client-services.mjs.map +1 -0
- package/dist/lib/chunk-client.mjs +27 -20
- package/dist/lib/chunk-client.mjs.map +1 -1
- package/dist/lib/chunk-constants.mjs +2 -1
- package/dist/lib/chunk-constants.mjs.map +1 -1
- package/dist/lib/chunk-create-agent.mjs +1 -1
- package/dist/lib/chunk-create-agent.mjs.map +1 -1
- package/dist/lib/chunk-create-identity.mjs +2 -2
- package/dist/lib/chunk-create-identity.mjs.map +1 -1
- package/dist/lib/chunk-create-passkey.mjs +49 -40
- package/dist/lib/chunk-create-passkey.mjs.map +1 -1
- package/dist/lib/chunk-create-recovery-code.mjs +2 -2
- package/dist/lib/chunk-create-recovery-code.mjs.map +1 -1
- package/dist/lib/chunk-grant-service-access.mjs +1 -1
- package/dist/lib/chunk-grant-service-access.mjs.map +1 -1
- package/dist/lib/chunk-halo.mjs +414 -0
- package/dist/lib/chunk-halo.mjs.map +1 -0
- package/dist/lib/chunk-identity-lifecycle.mjs +74 -0
- package/dist/lib/chunk-identity-lifecycle.mjs.map +1 -0
- package/dist/lib/chunk-join-identity.mjs +2 -2
- package/dist/lib/chunk-join-identity.mjs.map +1 -1
- package/dist/lib/chunk-layer-specs.mjs +72 -5
- package/dist/lib/chunk-layer-specs.mjs.map +1 -1
- package/dist/lib/chunk-navigation-handler.mjs +28 -5
- package/dist/lib/chunk-navigation-handler.mjs.map +1 -1
- package/dist/lib/chunk-navigation-target-loader.mjs +8 -9
- package/dist/lib/chunk-navigation-target-loader.mjs.map +1 -1
- package/dist/lib/chunk-open-usage.mjs +3 -3
- package/dist/lib/chunk-open-usage.mjs.map +1 -1
- package/dist/lib/chunk-react-context.mjs +5 -5
- package/dist/lib/chunk-react-context.mjs.map +1 -1
- package/dist/lib/chunk-react-surface.mjs +80 -64
- package/dist/lib/chunk-react-surface.mjs.map +1 -1
- package/dist/lib/chunk-recover-identity.mjs +2 -2
- package/dist/lib/chunk-recover-identity.mjs.map +1 -1
- package/dist/lib/chunk-redeem-passkey.mjs +7 -5
- package/dist/lib/chunk-redeem-passkey.mjs.map +1 -1
- package/dist/lib/chunk-redeem-token.mjs +1 -1
- package/dist/lib/chunk-redeem-token.mjs.map +1 -1
- package/dist/lib/chunk-remote-trace-monitor.mjs +3 -2
- package/dist/lib/chunk-remote-trace-monitor.mjs.map +1 -1
- package/dist/lib/chunk-reset-storage.mjs +6 -3
- package/dist/lib/chunk-reset-storage.mjs.map +1 -1
- package/dist/lib/chunk-resolve-navigation-targets.mjs +3 -3
- package/dist/lib/chunk-resolve-navigation-targets.mjs.map +1 -1
- package/dist/lib/chunk-revoke-recovery-credential.mjs +1 -1
- package/dist/lib/chunk-revoke-recovery-credential.mjs.map +1 -1
- package/dist/lib/chunk-share-identity.mjs +2 -2
- package/dist/lib/chunk-share-identity.mjs.map +1 -1
- package/dist/lib/chunk-space-replication-progress.mjs +49 -7
- package/dist/lib/chunk-space-replication-progress.mjs.map +1 -1
- package/dist/lib/chunk-trace-progress.mjs +5 -5
- package/dist/lib/chunk-trace-progress.mjs.map +1 -1
- package/dist/lib/chunk-update-profile.mjs +1 -1
- package/dist/lib/chunk-update-profile.mjs.map +1 -1
- package/dist/lib/chunk-useAccountUrl.mjs +23 -0
- package/dist/lib/chunk-useAccountUrl.mjs.map +1 -0
- package/dist/lib/chunk-useHubClient.mjs +30 -0
- package/dist/lib/chunk-useHubClient.mjs.map +1 -0
- package/dist/lib/commands.mjs +1 -1
- package/dist/lib/commands.mjs.map +1 -1
- package/dist/lib/commands.node.mjs +771 -1
- package/dist/lib/commands.node.mjs.map +1 -1
- package/dist/lib/components.mjs +91 -0
- package/dist/lib/components.mjs.map +1 -0
- package/dist/lib/containers.mjs +5 -1
- package/dist/lib/containers.mjs.map +1 -1
- package/dist/lib/index.mjs +2 -27
- package/dist/lib/meta.mjs.map +1 -1
- package/dist/lib/ns/HaloServices.mjs +2 -0
- package/dist/lib/operations.mjs +3 -3
- package/dist/lib/operations.mjs.map +1 -1
- package/dist/lib/plugin.mjs +2 -2
- package/dist/lib/plugin.mjs.map +1 -1
- package/dist/lib/testing.mjs +71 -2
- package/dist/lib/testing.mjs.map +1 -1
- package/dist/lib/translations.mjs +26 -5
- package/dist/lib/translations.mjs.map +1 -1
- package/dist/lib/types.mjs +3 -1
- package/dist/types/src/HaloServices.d.ts +2 -0
- package/dist/types/src/HaloServices.d.ts.map +1 -0
- package/dist/types/src/capabilities/client-services.d.ts +9 -0
- package/dist/types/src/capabilities/client-services.d.ts.map +1 -0
- package/dist/types/src/capabilities/client.d.ts +33 -2
- package/dist/types/src/capabilities/client.d.ts.map +1 -1
- package/dist/types/src/capabilities/commands.d.ts +1 -1
- package/dist/types/src/capabilities/commands.d.ts.map +1 -1
- package/dist/types/src/capabilities/commands.node.d.ts +1 -1
- package/dist/types/src/capabilities/commands.node.d.ts.map +1 -1
- package/dist/types/src/capabilities/gen/browser.d.ts +45 -0
- package/dist/types/src/capabilities/gen/browser.d.ts.map +1 -0
- package/dist/types/src/capabilities/gen/node.d.ts +3 -1
- package/dist/types/src/capabilities/gen/node.d.ts.map +1 -1
- package/dist/types/src/capabilities/gen/tauri.d.ts +45 -0
- package/dist/types/src/capabilities/gen/tauri.d.ts.map +1 -0
- package/dist/types/src/capabilities/gen/workerd.d.ts +2 -0
- package/dist/types/src/capabilities/gen/workerd.d.ts.map +1 -1
- package/dist/types/src/capabilities/identity-lifecycle.d.ts +14 -0
- package/dist/types/src/capabilities/identity-lifecycle.d.ts.map +1 -0
- package/dist/types/src/capabilities/index.d.ts +5 -3
- 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/navigation-handler/navigation-handler.d.ts.map +1 -1
- package/dist/types/src/capabilities/navigation-target-loader.d.ts +1 -6
- package/dist/types/src/capabilities/navigation-target-loader.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/capabilities/remote-trace-monitor.d.ts +1 -1
- package/dist/types/src/capabilities/remote-trace-monitor.d.ts.map +1 -1
- package/dist/types/src/capabilities/trace-progress.d.ts +2 -2
- package/dist/types/src/commands/account/index.d.ts +1 -1
- package/dist/types/src/commands/account/index.d.ts.map +1 -1
- package/dist/types/src/commands/account/invitation/create/create.d.ts +4 -3
- package/dist/types/src/commands/account/invitation/create/create.d.ts.map +1 -1
- package/dist/types/src/commands/account/invitation/create/index.d.ts +1 -1
- package/dist/types/src/commands/account/invitation/create/index.d.ts.map +1 -1
- package/dist/types/src/commands/account/invitation/index.d.ts +2 -2
- package/dist/types/src/commands/account/invitation/index.d.ts.map +1 -1
- package/dist/types/src/commands/account/login/index.d.ts +1 -1
- package/dist/types/src/commands/account/login/index.d.ts.map +1 -1
- package/dist/types/src/commands/account/login/login.d.ts +6 -5
- package/dist/types/src/commands/account/login/login.d.ts.map +1 -1
- package/dist/types/src/commands/account/logout/index.d.ts +1 -1
- package/dist/types/src/commands/account/logout/index.d.ts.map +1 -1
- package/dist/types/src/commands/account/logout/logout.d.ts +2 -2
- package/dist/types/src/commands/account/logout/logout.d.ts.map +1 -1
- package/dist/types/src/commands/account/signup/index.d.ts +1 -1
- package/dist/types/src/commands/account/signup/index.d.ts.map +1 -1
- package/dist/types/src/commands/account/signup/signup.d.ts +5 -4
- package/dist/types/src/commands/account/signup/signup.d.ts.map +1 -1
- package/dist/types/src/commands/account/util.d.ts +1 -1
- package/dist/types/src/commands/account/util.d.ts.map +1 -1
- package/dist/types/src/commands/config/index.d.ts +1 -1
- package/dist/types/src/commands/config/index.d.ts.map +1 -1
- package/dist/types/src/commands/config/view.d.ts +1 -1
- package/dist/types/src/commands/config/view.d.ts.map +1 -1
- package/dist/types/src/commands/device/index.d.ts +1 -1
- package/dist/types/src/commands/device/index.d.ts.map +1 -1
- package/dist/types/src/commands/device/info/index.d.ts +1 -1
- package/dist/types/src/commands/device/info/index.d.ts.map +1 -1
- package/dist/types/src/commands/device/info/info.d.ts +1 -1
- package/dist/types/src/commands/device/info/info.d.ts.map +1 -1
- package/dist/types/src/commands/device/list/index.d.ts +1 -1
- package/dist/types/src/commands/device/list/index.d.ts.map +1 -1
- package/dist/types/src/commands/device/list/list.d.ts +1 -1
- package/dist/types/src/commands/device/list/list.d.ts.map +1 -1
- package/dist/types/src/commands/device/update/index.d.ts +1 -1
- package/dist/types/src/commands/device/update/index.d.ts.map +1 -1
- package/dist/types/src/commands/device/update/update.d.ts +1 -1
- package/dist/types/src/commands/device/update/update.d.ts.map +1 -1
- package/dist/types/src/commands/device/util.d.ts +1 -1
- package/dist/types/src/commands/device/util.d.ts.map +1 -1
- package/dist/types/src/commands/edge/index.d.ts +1 -1
- package/dist/types/src/commands/edge/index.d.ts.map +1 -1
- package/dist/types/src/commands/edge/status.d.ts +1 -1
- package/dist/types/src/commands/edge/status.d.ts.map +1 -1
- package/dist/types/src/commands/errors.d.ts +33 -0
- package/dist/types/src/commands/errors.d.ts.map +1 -0
- package/dist/types/src/commands/halo/credential/add/add.d.ts +5 -4
- package/dist/types/src/commands/halo/credential/add/add.d.ts.map +1 -1
- package/dist/types/src/commands/halo/credential/add/index.d.ts +1 -1
- package/dist/types/src/commands/halo/credential/add/index.d.ts.map +1 -1
- package/dist/types/src/commands/halo/credential/index.d.ts +2 -2
- package/dist/types/src/commands/halo/credential/index.d.ts.map +1 -1
- package/dist/types/src/commands/halo/credential/list/index.d.ts +1 -1
- package/dist/types/src/commands/halo/credential/list/index.d.ts.map +1 -1
- package/dist/types/src/commands/halo/credential/list/list.d.ts +1 -1
- package/dist/types/src/commands/halo/credential/list/list.d.ts.map +1 -1
- package/dist/types/src/commands/halo/identity/identity.d.ts +1 -1
- package/dist/types/src/commands/halo/identity/identity.d.ts.map +1 -1
- package/dist/types/src/commands/halo/identity/index.d.ts +1 -1
- package/dist/types/src/commands/halo/identity/index.d.ts.map +1 -1
- package/dist/types/src/commands/halo/index.d.ts +1 -1
- package/dist/types/src/commands/halo/index.d.ts.map +1 -1
- package/dist/types/src/commands/halo/keys/index.d.ts +1 -1
- package/dist/types/src/commands/halo/keys/index.d.ts.map +1 -1
- package/dist/types/src/commands/halo/keys/keys.d.ts +1 -1
- package/dist/types/src/commands/halo/keys/keys.d.ts.map +1 -1
- package/dist/types/src/commands/halo/seed/index.d.ts +1 -1
- package/dist/types/src/commands/halo/seed/index.d.ts.map +1 -1
- package/dist/types/src/commands/halo/seed/seed.d.ts +1 -1
- package/dist/types/src/commands/halo/seed/seed.d.ts.map +1 -1
- package/dist/types/src/commands/halo/share/index.d.ts +1 -1
- package/dist/types/src/commands/halo/share/index.d.ts.map +1 -1
- package/dist/types/src/commands/halo/share/share.d.ts +4 -3
- package/dist/types/src/commands/halo/share/share.d.ts.map +1 -1
- package/dist/types/src/commands/halo/update/index.d.ts +1 -1
- package/dist/types/src/commands/halo/update/index.d.ts.map +1 -1
- package/dist/types/src/commands/halo/update/update.d.ts +1 -1
- package/dist/types/src/commands/halo/update/update.d.ts.map +1 -1
- package/dist/types/src/commands/halo/util.d.ts +2 -2
- package/dist/types/src/commands/halo/util.d.ts.map +1 -1
- package/dist/types/src/commands/index.d.ts +6 -6
- package/dist/types/src/commands/index.d.ts.map +1 -1
- package/dist/types/src/commands/profile/create.d.ts +1 -1
- package/dist/types/src/commands/profile/create.d.ts.map +1 -1
- package/dist/types/src/commands/profile/delete.d.ts +1 -1
- package/dist/types/src/commands/profile/delete.d.ts.map +1 -1
- package/dist/types/src/commands/profile/import.d.ts +5 -4
- package/dist/types/src/commands/profile/import.d.ts.map +1 -1
- package/dist/types/src/commands/profile/index.d.ts +2 -2
- package/dist/types/src/commands/profile/index.d.ts.map +1 -1
- package/dist/types/src/commands/profile/inspect.d.ts +1 -1
- package/dist/types/src/commands/profile/inspect.d.ts.map +1 -1
- package/dist/types/src/commands/profile/list.d.ts +1 -1
- package/dist/types/src/commands/profile/list.d.ts.map +1 -1
- package/dist/types/src/commands/profile/reset.d.ts +2 -2
- package/dist/types/src/commands/profile/reset.d.ts.map +1 -1
- package/dist/types/src/components/DevicesForm/DevicesForm.d.ts +19 -0
- package/dist/types/src/components/DevicesForm/DevicesForm.d.ts.map +1 -0
- package/dist/types/src/components/DevicesForm/DevicesForm.stories.d.ts +207 -0
- package/dist/types/src/components/DevicesForm/DevicesForm.stories.d.ts.map +1 -0
- package/dist/types/src/components/DevicesForm/index.d.ts +2 -0
- package/dist/types/src/components/DevicesForm/index.d.ts.map +1 -0
- package/dist/types/src/components/index.d.ts +1 -0
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/constants.d.ts +1 -0
- package/dist/types/src/constants.d.ts.map +1 -1
- package/dist/types/src/containers/AccountContainer/AccountContainer.stories.d.ts +1 -1
- package/dist/types/src/containers/AccountContainer/AccountContainer.stories.d.ts.map +1 -1
- package/dist/types/src/containers/AccountContainer/index.d.ts +1 -1
- package/dist/types/src/containers/AccountContainer/index.d.ts.map +1 -1
- package/dist/types/src/containers/CliLoginDialog/CliLoginDialog.d.ts +12 -0
- package/dist/types/src/containers/CliLoginDialog/CliLoginDialog.d.ts.map +1 -0
- package/dist/types/src/containers/CliLoginDialog/index.d.ts +4 -0
- package/dist/types/src/containers/CliLoginDialog/index.d.ts.map +1 -0
- package/dist/types/src/containers/ContactPickerContainer/ContactPickerContainer.d.ts +8 -0
- package/dist/types/src/containers/ContactPickerContainer/ContactPickerContainer.d.ts.map +1 -0
- package/dist/types/src/containers/ContactPickerContainer/ContactPickerContainer.stories.d.ts +206 -0
- package/dist/types/src/containers/ContactPickerContainer/ContactPickerContainer.stories.d.ts.map +1 -0
- package/dist/types/src/containers/ContactPickerContainer/index.d.ts +2 -0
- package/dist/types/src/containers/ContactPickerContainer/index.d.ts.map +1 -0
- package/dist/types/src/containers/ContactsContainer/ContactsContainer.d.ts +3 -0
- package/dist/types/src/containers/ContactsContainer/ContactsContainer.d.ts.map +1 -0
- package/dist/types/src/containers/ContactsContainer/ContactsContainer.stories.d.ts +203 -0
- package/dist/types/src/containers/ContactsContainer/ContactsContainer.stories.d.ts.map +1 -0
- package/dist/types/src/containers/ContactsContainer/index.d.ts +2 -0
- package/dist/types/src/containers/ContactsContainer/index.d.ts.map +1 -0
- package/dist/types/src/containers/DevicesContainer/DevicesContainer.d.ts.map +1 -1
- package/dist/types/src/containers/DevicesContainer/DevicesContainer.stories.d.ts +19 -1
- package/dist/types/src/containers/DevicesContainer/DevicesContainer.stories.d.ts.map +1 -1
- package/dist/types/src/containers/DevicesContainer/index.d.ts +1 -1
- package/dist/types/src/containers/DevicesContainer/index.d.ts.map +1 -1
- package/dist/types/src/containers/InvitationsContainer/InvitationsContainer.stories.d.ts +1 -1
- package/dist/types/src/containers/InvitationsContainer/InvitationsContainer.stories.d.ts.map +1 -1
- package/dist/types/src/containers/InvitationsContainer/index.d.ts +1 -1
- package/dist/types/src/containers/InvitationsContainer/index.d.ts.map +1 -1
- package/dist/types/src/containers/JoinDialog/JoinDialog.d.ts.map +1 -1
- package/dist/types/src/containers/JoinDialog/JoinDialog.stories.d.ts +1 -1
- package/dist/types/src/containers/JoinDialog/JoinDialog.stories.d.ts.map +1 -1
- package/dist/types/src/containers/JoinDialog/index.d.ts +1 -1
- package/dist/types/src/containers/JoinDialog/index.d.ts.map +1 -1
- package/dist/types/src/containers/ProfileContainer/ProfileContainer.d.ts.map +1 -1
- package/dist/types/src/containers/ProfileContainer/ProfileContainer.stories.d.ts +1 -1
- package/dist/types/src/containers/ProfileContainer/ProfileContainer.stories.d.ts.map +1 -1
- package/dist/types/src/containers/ProfileContainer/index.d.ts +1 -1
- package/dist/types/src/containers/ProfileContainer/index.d.ts.map +1 -1
- package/dist/types/src/containers/RecoveryCodeDialog/RecoveryCodeDialog.d.ts.map +1 -1
- package/dist/types/src/containers/RecoveryCodeDialog/RecoveryCodeDialog.stories.d.ts.map +1 -1
- package/dist/types/src/containers/RecoveryCodeDialog/index.d.ts +2 -2
- package/dist/types/src/containers/RecoveryCodeDialog/index.d.ts.map +1 -1
- package/dist/types/src/containers/RecoveryCredentialsContainer/RecoveryCredentialsContainer.d.ts.map +1 -1
- package/dist/types/src/containers/RecoveryCredentialsContainer/RecoveryCredentialsContainer.stories.d.ts +1 -1
- package/dist/types/src/containers/RecoveryCredentialsContainer/RecoveryCredentialsContainer.stories.d.ts.map +1 -1
- package/dist/types/src/containers/RecoveryCredentialsContainer/index.d.ts +1 -1
- package/dist/types/src/containers/RecoveryCredentialsContainer/index.d.ts.map +1 -1
- package/dist/types/src/containers/ResetDialog/ResetDialog.d.ts +6 -7
- package/dist/types/src/containers/ResetDialog/ResetDialog.d.ts.map +1 -1
- package/dist/types/src/containers/ResetDialog/ResetDialog.stories.d.ts +2 -2
- package/dist/types/src/containers/ResetDialog/ResetDialog.stories.d.ts.map +1 -1
- package/dist/types/src/containers/ResetDialog/index.d.ts +2 -2
- package/dist/types/src/containers/ResetDialog/index.d.ts.map +1 -1
- package/dist/types/src/containers/SpaceInvitationContainer/SpaceInvitationContainer.d.ts +10 -0
- package/dist/types/src/containers/SpaceInvitationContainer/SpaceInvitationContainer.d.ts.map +1 -0
- package/dist/types/src/containers/SpaceInvitationContainer/index.d.ts +2 -0
- package/dist/types/src/containers/SpaceInvitationContainer/index.d.ts.map +1 -0
- package/dist/types/src/containers/UsageContainer/UsageView.d.ts.map +1 -1
- package/dist/types/src/containers/UsageContainer/UsageView.stories.d.ts +1 -1
- package/dist/types/src/containers/UsageContainer/UsageView.stories.d.ts.map +1 -1
- package/dist/types/src/containers/UsageContainer/index.d.ts +1 -1
- package/dist/types/src/containers/UsageContainer/index.d.ts.map +1 -1
- package/dist/types/src/containers/index.d.ts +9 -3
- package/dist/types/src/containers/index.d.ts.map +1 -1
- package/dist/types/src/hooks/index.d.ts +2 -2
- package/dist/types/src/hooks/index.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +2 -5
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/operations/create-agent.d.ts +2 -2
- package/dist/types/src/operations/create-agent.d.ts.map +1 -1
- package/dist/types/src/operations/create-identity.d.ts +2 -2
- package/dist/types/src/operations/create-identity.d.ts.map +1 -1
- package/dist/types/src/operations/create-passkey.d.ts +2 -2
- package/dist/types/src/operations/create-passkey.d.ts.map +1 -1
- package/dist/types/src/operations/create-recovery-code.d.ts +2 -2
- package/dist/types/src/operations/create-recovery-code.d.ts.map +1 -1
- package/dist/types/src/operations/grant-service-access.d.ts +2 -2
- package/dist/types/src/operations/grant-service-access.d.ts.map +1 -1
- package/dist/types/src/operations/index.d.ts +1 -1
- package/dist/types/src/operations/index.d.ts.map +1 -1
- package/dist/types/src/operations/join-identity.d.ts +2 -2
- package/dist/types/src/operations/join-identity.d.ts.map +1 -1
- package/dist/types/src/operations/open-usage.d.ts +2 -2
- package/dist/types/src/operations/open-usage.d.ts.map +1 -1
- package/dist/types/src/operations/recover-identity.d.ts +2 -2
- package/dist/types/src/operations/recover-identity.d.ts.map +1 -1
- package/dist/types/src/operations/redeem-passkey.d.ts +2 -2
- package/dist/types/src/operations/redeem-passkey.d.ts.map +1 -1
- package/dist/types/src/operations/redeem-token.d.ts +2 -2
- package/dist/types/src/operations/redeem-token.d.ts.map +1 -1
- package/dist/types/src/operations/reset-storage.d.ts +2 -2
- package/dist/types/src/operations/reset-storage.d.ts.map +1 -1
- package/dist/types/src/operations/revoke-recovery-credential.d.ts +2 -2
- package/dist/types/src/operations/revoke-recovery-credential.d.ts.map +1 -1
- package/dist/types/src/operations/share-identity.d.ts +2 -2
- package/dist/types/src/operations/share-identity.d.ts.map +1 -1
- package/dist/types/src/operations/update-profile.d.ts +2 -2
- package/dist/types/src/operations/update-profile.d.ts.map +1 -1
- package/dist/types/src/plugin.d.ts.map +1 -1
- package/dist/types/src/progress/index.d.ts +2 -2
- package/dist/types/src/progress/index.d.ts.map +1 -1
- package/dist/types/src/progress/space-sync-progress.d.ts +10 -1
- package/dist/types/src/progress/space-sync-progress.d.ts.map +1 -1
- package/dist/types/src/testing/ClientPluginManager.d.ts +18 -0
- package/dist/types/src/testing/ClientPluginManager.d.ts.map +1 -0
- package/dist/types/src/testing/createFakeContacts.d.ts +16 -0
- package/dist/types/src/testing/createFakeContacts.d.ts.map +1 -0
- package/dist/types/src/testing/index.d.ts +4 -2
- package/dist/types/src/testing/index.d.ts.map +1 -1
- package/dist/types/src/testing/initializeIdentity.d.ts +1 -1
- package/dist/types/src/testing/initializeIdentity.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +2 -2
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/Account.d.ts +21 -7
- package/dist/types/src/types/Account.d.ts.map +1 -1
- package/dist/types/src/types/CliLogin.d.ts +33 -0
- package/dist/types/src/types/CliLogin.d.ts.map +1 -0
- package/dist/types/src/types/ClientCapabilities.d.ts +32 -3
- package/dist/types/src/types/ClientCapabilities.d.ts.map +1 -1
- package/dist/types/src/types/ClientEvents.d.ts +5 -1
- package/dist/types/src/types/ClientEvents.d.ts.map +1 -1
- package/dist/types/src/{operations/definitions.d.ts → types/ClientOperation.d.ts} +2 -1
- package/dist/types/src/types/ClientOperation.d.ts.map +1 -0
- package/dist/types/src/types/ClientOptions.d.ts +1 -8
- package/dist/types/src/types/ClientOptions.d.ts.map +1 -1
- package/dist/types/src/types/PasskeyError.d.ts +112 -11
- package/dist/types/src/types/PasskeyError.d.ts.map +1 -1
- package/dist/types/src/types/index.d.ts +9 -7
- package/dist/types/src/types/index.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +72 -61
- package/src/HaloServices.ts +7 -0
- package/src/capabilities/account-cache.ts +2 -2
- package/src/capabilities/app-graph-builder.ts +165 -69
- package/src/capabilities/client-services.ts +25 -0
- package/src/capabilities/client.ts +17 -12
- package/src/capabilities/commands.node.ts +1 -1
- package/src/capabilities/commands.ts +1 -1
- package/src/capabilities/gen/browser.ts +192 -0
- package/src/capabilities/gen/node.ts +48 -19
- package/src/capabilities/gen/tauri.ts +192 -0
- package/src/capabilities/gen/workerd.ts +41 -13
- package/src/capabilities/identity-lifecycle.ts +86 -0
- package/src/capabilities/index.ts +57 -26
- package/src/capabilities/layer-specs.ts +107 -4
- package/src/capabilities/navigation-handler/index.ts +2 -2
- package/src/capabilities/navigation-handler/navigation-handler.ts +20 -1
- package/src/capabilities/navigation-target-loader.ts +15 -10
- package/src/capabilities/react-context.tsx +2 -2
- package/src/capabilities/react-surface.ts +43 -18
- package/src/capabilities/remote-trace-monitor.ts +5 -2
- package/src/capabilities/schema-defs.test.ts +2 -2
- package/src/capabilities/space-replication-progress.ts +12 -7
- package/src/capabilities/trace-progress.ts +6 -6
- package/src/commands/account/index.ts +5 -5
- package/src/commands/account/invitation/create/create.ts +9 -5
- package/src/commands/account/invitation/create/index.ts +1 -1
- package/src/commands/account/invitation/index.ts +2 -2
- package/src/commands/account/login/index.ts +1 -1
- package/src/commands/account/login/login.ts +108 -37
- package/src/commands/account/logout/index.ts +1 -1
- package/src/commands/account/logout/logout.ts +8 -5
- package/src/commands/account/signup/index.ts +1 -1
- package/src/commands/account/signup/signup.ts +33 -19
- package/src/commands/account/util.test.ts +1 -1
- package/src/commands/account/util.ts +2 -2
- package/src/commands/config/index.ts +2 -2
- package/src/commands/config/view.ts +1 -1
- package/src/commands/device/index.ts +4 -4
- package/src/commands/device/info/index.ts +1 -1
- package/src/commands/device/info/info.test.ts +4 -3
- package/src/commands/device/info/info.ts +5 -4
- package/src/commands/device/list/index.ts +1 -1
- package/src/commands/device/list/list.test.ts +2 -2
- package/src/commands/device/list/list.ts +2 -2
- package/src/commands/device/update/index.ts +1 -1
- package/src/commands/device/update/update.ts +8 -9
- package/src/commands/device/util.ts +6 -5
- package/src/commands/edge/index.ts +2 -2
- package/src/commands/edge/status.ts +1 -1
- package/src/commands/errors.ts +8 -0
- package/src/commands/halo/credential/add/add.ts +13 -16
- package/src/commands/halo/credential/add/index.ts +1 -1
- package/src/commands/halo/credential/index.ts +3 -3
- package/src/commands/halo/credential/list/index.ts +1 -1
- package/src/commands/halo/credential/list/list.test.ts +2 -2
- package/src/commands/halo/credential/list/list.ts +15 -14
- package/src/commands/halo/identity/identity.test.ts +7 -3
- package/src/commands/halo/identity/identity.ts +2 -2
- package/src/commands/halo/identity/index.ts +1 -1
- package/src/commands/halo/index.ts +7 -7
- package/src/commands/halo/keys/index.ts +1 -1
- package/src/commands/halo/keys/keys.test.ts +5 -4
- package/src/commands/halo/keys/keys.ts +6 -5
- package/src/commands/halo/seed/index.ts +1 -1
- package/src/commands/halo/seed/seed.ts +1 -1
- package/src/commands/halo/share/index.ts +1 -1
- package/src/commands/halo/share/share.ts +15 -10
- package/src/commands/halo/update/index.ts +1 -1
- package/src/commands/halo/update/update.test.ts +2 -2
- package/src/commands/halo/update/update.ts +7 -17
- package/src/commands/halo/util.ts +11 -7
- package/src/commands/index.ts +6 -6
- package/src/commands/profile/create.ts +5 -5
- package/src/commands/profile/delete.ts +4 -4
- package/src/commands/profile/import.ts +17 -14
- package/src/commands/profile/index.ts +7 -7
- package/src/commands/profile/inspect.ts +9 -6
- package/src/commands/profile/list.ts +2 -2
- package/src/commands/profile/reset.ts +9 -6
- package/src/components/DevicesForm/DevicesForm.stories.tsx +62 -0
- package/src/components/DevicesForm/DevicesForm.tsx +100 -0
- package/src/components/DevicesForm/index.ts +5 -0
- package/src/components/index.ts +2 -0
- package/src/constants.ts +1 -0
- package/src/containers/AccountContainer/AccountContainer.stories.tsx +3 -3
- package/src/containers/AccountContainer/AccountContainer.tsx +54 -43
- package/src/containers/AccountContainer/index.ts +1 -1
- package/src/containers/CliLoginDialog/CliLoginDialog.tsx +159 -0
- package/src/containers/CliLoginDialog/index.ts +8 -0
- package/src/containers/ContactPickerContainer/ContactPickerContainer.stories.tsx +66 -0
- package/src/containers/ContactPickerContainer/ContactPickerContainer.tsx +126 -0
- package/src/containers/ContactPickerContainer/index.ts +5 -0
- package/src/containers/ContactsContainer/ContactsContainer.stories.tsx +48 -0
- package/src/containers/ContactsContainer/ContactsContainer.tsx +61 -0
- package/src/containers/ContactsContainer/index.ts +5 -0
- package/src/containers/DevicesContainer/DevicesContainer.stories.tsx +3 -3
- package/src/containers/DevicesContainer/DevicesContainer.tsx +45 -103
- package/src/containers/DevicesContainer/index.ts +1 -1
- package/src/containers/InvitationsContainer/InvitationsContainer.stories.tsx +3 -3
- package/src/containers/InvitationsContainer/InvitationsContainer.tsx +63 -60
- package/src/containers/InvitationsContainer/index.ts +1 -1
- package/src/containers/JoinDialog/JoinDialog.stories.tsx +5 -7
- package/src/containers/JoinDialog/JoinDialog.tsx +10 -9
- package/src/containers/JoinDialog/index.ts +1 -1
- package/src/containers/ProfileContainer/ProfileContainer.stories.tsx +3 -3
- package/src/containers/ProfileContainer/ProfileContainer.tsx +72 -55
- package/src/containers/ProfileContainer/index.ts +1 -1
- package/src/containers/RecoveryCodeDialog/RecoveryCodeDialog.stories.tsx +5 -6
- package/src/containers/RecoveryCodeDialog/RecoveryCodeDialog.tsx +27 -29
- package/src/containers/RecoveryCodeDialog/index.ts +2 -2
- package/src/containers/RecoveryCredentialsContainer/RecoveryCredentialsContainer.stories.tsx +7 -7
- package/src/containers/RecoveryCredentialsContainer/RecoveryCredentialsContainer.tsx +69 -41
- package/src/containers/RecoveryCredentialsContainer/index.ts +1 -1
- package/src/containers/ResetDialog/ResetDialog.stories.tsx +9 -21
- package/src/containers/ResetDialog/ResetDialog.tsx +35 -24
- package/src/containers/ResetDialog/index.ts +2 -2
- package/src/containers/SpaceInvitationContainer/SpaceInvitationContainer.tsx +62 -0
- package/src/containers/SpaceInvitationContainer/index.ts +8 -0
- package/src/containers/UsageContainer/UsageContainer.tsx +4 -4
- package/src/containers/UsageContainer/UsageView.stories.tsx +1 -1
- package/src/containers/UsageContainer/UsageView.tsx +22 -24
- package/src/containers/UsageContainer/index.ts +1 -1
- package/src/containers/index.ts +23 -12
- package/src/hooks/index.ts +2 -2
- package/src/hooks/useAccountUrl.ts +1 -1
- package/src/hooks/useHubClient.ts +3 -3
- package/src/index.ts +2 -5
- package/src/meta.ts +1 -1
- package/src/operations/create-agent.ts +2 -2
- package/src/operations/create-identity.ts +5 -3
- package/src/operations/create-passkey.ts +59 -37
- package/src/operations/create-recovery-code.ts +16 -15
- package/src/operations/grant-service-access.ts +9 -8
- package/src/operations/index.ts +17 -30
- package/src/operations/join-identity.ts +3 -3
- package/src/operations/open-usage.ts +3 -3
- package/src/operations/recover-identity.ts +3 -3
- package/src/operations/redeem-passkey.ts +63 -65
- package/src/operations/redeem-token.ts +2 -2
- package/src/operations/reset-storage.ts +4 -3
- package/src/operations/resolve-navigation-targets.ts +1 -1
- package/src/operations/revoke-recovery-credential.ts +9 -8
- package/src/operations/share-identity.ts +2 -2
- package/src/operations/update-profile.ts +2 -2
- package/src/plugin.test.ts +2 -2
- package/src/plugin.ts +30 -25
- package/src/progress/index.ts +2 -2
- package/src/progress/space-sync-progress.test.ts +36 -13
- package/src/progress/space-sync-progress.ts +21 -6
- package/src/schema-defs.test.ts +2 -2
- package/src/testing/ClientPluginManager.tsx +44 -0
- package/src/testing/createFakeContacts.ts +57 -0
- package/src/testing/index.ts +4 -2
- package/src/testing/initializeIdentity.ts +6 -2
- package/src/translations.ts +33 -9
- package/src/types/Account.ts +27 -11
- package/src/types/CliLogin.ts +78 -0
- package/src/types/ClientCapabilities.ts +38 -4
- package/src/types/ClientEvents.ts +5 -1
- package/src/{operations/definitions.ts → types/ClientOperation.ts} +5 -1
- package/src/types/ClientOptions.ts +3 -7
- package/src/types/PasskeyError.test.ts +96 -1
- package/src/types/PasskeyError.ts +85 -15
- package/src/types/index.ts +9 -7
- package/dist/lib/chunk-commands.mjs +0 -1090
- package/dist/lib/chunk-commands.mjs.map +0 -1
- package/dist/lib/chunk-definitions.mjs.map +0 -1
- package/dist/lib/chunk-hooks.mjs +0 -49
- package/dist/lib/chunk-hooks.mjs.map +0 -1
- package/dist/lib/chunk-progress.mjs +0 -35
- package/dist/lib/chunk-progress.mjs.map +0 -1
- package/dist/lib/index.mjs.map +0 -1
- package/dist/types/src/operations/definitions.d.ts.map +0 -1
|
@@ -9,11 +9,31 @@ import { ClientCapabilities, ClientEvents } from "#types";
|
|
|
9
9
|
var AccountCache = Capability.lazyModule("AccountCache", { provides: [ClientCapabilities.AccountCache] }, () => import("./chunk-account-cache.mjs"));
|
|
10
10
|
var AppGraphBuilder = AppCapability.appGraphBuilder(() => import("./chunk-app-graph-builder.mjs"), { activatesOn: ClientEvents.Initialized });
|
|
11
11
|
var Commands = AppCapability.commands(() => import("#commands"));
|
|
12
|
+
var ClientServices = Capability.lazyModule("ClientServices", {
|
|
13
|
+
requires: [ClientCapabilities.Client],
|
|
14
|
+
provides: [
|
|
15
|
+
ClientCapabilities.Config,
|
|
16
|
+
ClientCapabilities.EdgeHttpClient,
|
|
17
|
+
ClientCapabilities.Hypergraph
|
|
18
|
+
],
|
|
19
|
+
activatesOn: ClientEvents.Initialized
|
|
20
|
+
}, () => import("./chunk-client-services.mjs"));
|
|
12
21
|
var HubHttpClient = Capability.lazyModule("HubHttpClient", {
|
|
13
22
|
requires: [ClientCapabilities.Client],
|
|
14
23
|
provides: [ClientCapabilities.HubHttpClient],
|
|
15
24
|
activatesOn: ClientEvents.Initialized
|
|
16
25
|
}, () => import("./chunk-hub-http-client.mjs"));
|
|
26
|
+
var IdentityLifecycle = Capability.lazyModule("IdentityLifecycle", {
|
|
27
|
+
requires: [
|
|
28
|
+
ClientCapabilities.Client,
|
|
29
|
+
ClientCapabilities.AccountCache,
|
|
30
|
+
Capabilities.AtomRegistry,
|
|
31
|
+
Capabilities.OperationInvoker,
|
|
32
|
+
Capabilities.PluginManager
|
|
33
|
+
],
|
|
34
|
+
provides: [],
|
|
35
|
+
activatesOn: ClientEvents.Initialized
|
|
36
|
+
}, () => import("./chunk-identity-lifecycle.mjs"));
|
|
17
37
|
var LayerSpecs = AppCapability.layerSpec(() => import("./chunk-layer-specs.mjs"), { name: "LayerSpecs" });
|
|
18
38
|
var NavigationTargetLoader = Capability.lazyModule("NavigationTargetLoader", {
|
|
19
39
|
requires: [ClientCapabilities.Client],
|
|
@@ -27,16 +47,16 @@ var RemoteTraceMonitor = Capability.lazyModule("RemoteTraceMonitor", {
|
|
|
27
47
|
var SpaceReplicationProgress = Capability.lazyModule("SpaceReplicationProgress", {
|
|
28
48
|
requires: [ClientCapabilities.Client, Capabilities.ProcessManagerRuntime],
|
|
29
49
|
provides: [],
|
|
30
|
-
activatesOn: ClientEvents.
|
|
50
|
+
activatesOn: ClientEvents.SpacesAvailable
|
|
31
51
|
}, () => import("./chunk-space-replication-progress.mjs"));
|
|
32
52
|
var TraceProgress = Capability.lazyModule("TraceProgress", {
|
|
33
53
|
requires: [
|
|
34
|
-
Capabilities.
|
|
54
|
+
Capabilities.ProcessManager,
|
|
35
55
|
Capabilities.ProcessManagerRuntime,
|
|
36
56
|
Capabilities.ServiceResolver
|
|
37
57
|
],
|
|
38
58
|
provides: [],
|
|
39
|
-
activatesOn: ClientEvents.
|
|
59
|
+
activatesOn: ClientEvents.SpacesAvailable
|
|
40
60
|
}, () => import("./chunk-trace-progress.mjs"));
|
|
41
61
|
var Translations = AppCapability.translations(translations);
|
|
42
62
|
var Client = void 0;
|
|
@@ -46,6 +66,6 @@ var ReactContext = void 0;
|
|
|
46
66
|
var ReactSurface = void 0;
|
|
47
67
|
var SchemaDefs = void 0;
|
|
48
68
|
//#endregion
|
|
49
|
-
export { AccountCache, AppGraphBuilder, Client, Commands, HubHttpClient, LayerSpecs, Migrations, NavigationHandler, NavigationTargetLoader, OperationHandler, ReactContext, ReactSurface, RemoteTraceMonitor, SchemaDefs, SpaceReplicationProgress, TraceProgress, Translations };
|
|
69
|
+
export { AccountCache, AppGraphBuilder, Client, ClientServices, Commands, HubHttpClient, IdentityLifecycle, LayerSpecs, Migrations, NavigationHandler, NavigationTargetLoader, OperationHandler, ReactContext, ReactSurface, RemoteTraceMonitor, SchemaDefs, SpaceReplicationProgress, TraceProgress, Translations };
|
|
50
70
|
|
|
51
71
|
//# sourceMappingURL=capabilities.workerd.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capabilities.workerd.mjs","names":[],"sources":["../../src/capabilities/gen/workerd.ts"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\n// GENERATED by dx-plugin — do not edit. Sliced from ../index.ts for the 'workerd' condition.\n\nimport * as ActivationEvents from '@dxos/app-framework/ActivationEvents';\nimport * as Capabilities from '@dxos/app-framework/Capabilities';\nimport * as Capability from '@dxos/app-framework/Capability';\nimport * as AppCapabilities from '@dxos/app-toolkit/AppCapabilities';\nimport * as AppCapability from '@dxos/app-toolkit/AppCapability';\n\nimport { translations } from '#translations';\nimport { ClientCapabilities, ClientEvents, ClientOptions } from '#types';\n\nexport const AccountCache = Capability.lazyModule(\n 'AccountCache',\n { provides: [ClientCapabilities.AccountCache] },\n () => import('../account-cache'),\n);\n\n// Its connectors read `client.halo`/`client.mesh` inside atom computations (initialized-only,\n// and a pre-init throw is not re-evaluated when initialization lands).\nexport const AppGraphBuilder = AppCapability.appGraphBuilder(() => import('../app-graph-builder'), {\n activatesOn: ClientEvents.Initialized,\n});\n\n// `#commands` resolves per condition: a node host has the OAuth callback server and filesystem the\n// browser command set omits (`account`, `profile`).\nexport const Commands = AppCapability.commands(() => import('#commands'));\n\nexport const HubHttpClient = Capability.lazyModule(\n 'HubHttpClient',\n {\n requires: [ClientCapabilities.Client],\n provides: [ClientCapabilities.HubHttpClient],\n // Reads `client.config` (initialized-only) for the hub URL.\n activatesOn: ClientEvents.Initialized,\n },\n () => import('../hub-http-client'),\n);\n\nexport const LayerSpecs = AppCapability.layerSpec(() => import('../layer-specs'), {\n name: 'LayerSpecs',\n});\n\nexport const NavigationTargetLoader = Capability.lazyModule(\n 'NavigationTargetLoader',\n { requires: [ClientCapabilities.Client], provides: [AppCapabilities.NavigationTargetLoader] },\n () => import('../navigation-target-loader'),\n);\n\nexport const OperationHandler = AppCapability.operationHandler(() => import('../operation-handler'));\n\nexport const RemoteTraceMonitor = Capability.lazyModule(\n 'RemoteTraceMonitor',\n // Startup: the process-manager runtime snapshots this capability once, in the Startup pass, and\n // bakes a no-op remote source if it has not been contributed yet — demand activation always loses\n // that race, silencing remote traces for every
|
|
1
|
+
{"version":3,"file":"capabilities.workerd.mjs","names":[],"sources":["../../src/capabilities/gen/workerd.ts"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\n// GENERATED by dx-plugin — do not edit. Sliced from ../index.ts for the 'workerd' condition.\n\nimport * as ActivationEvents from '@dxos/app-framework/ActivationEvents';\nimport * as Capabilities from '@dxos/app-framework/Capabilities';\nimport * as Capability from '@dxos/app-framework/Capability';\nimport * as AppCapabilities from '@dxos/app-toolkit/AppCapabilities';\nimport * as AppCapability from '@dxos/app-toolkit/AppCapability';\n\nimport { translations } from '#translations';\nimport { ClientCapabilities, ClientEvents, ClientOptions } from '#types';\n\nexport const AccountCache = Capability.lazyModule(\n 'AccountCache',\n { provides: [ClientCapabilities.AccountCache] },\n () => import('../account-cache.ts'),\n);\n\n// Its connectors read `client.halo`/`client.mesh` inside atom computations (initialized-only,\n// and a pre-init throw is not re-evaluated when initialization lands).\nexport const AppGraphBuilder = AppCapability.appGraphBuilder(() => import('../app-graph-builder.ts'), {\n activatesOn: ClientEvents.Initialized,\n});\n\n// `#commands` resolves per condition: a node host has the OAuth callback server and filesystem the\n// browser command set omits (`account`, `profile`).\nexport const Commands = AppCapability.commands(() => import('#commands'));\n\nexport const ClientServices = Capability.lazyModule(\n 'ClientServices',\n {\n requires: [ClientCapabilities.Client],\n provides: [ClientCapabilities.Config, ClientCapabilities.EdgeHttpClient, ClientCapabilities.Hypergraph],\n // `client.config` and `client.edge` are initialized-only.\n activatesOn: ClientEvents.Initialized,\n },\n () => import('../client-services.ts'),\n);\n\nexport const HubHttpClient = Capability.lazyModule(\n 'HubHttpClient',\n {\n requires: [ClientCapabilities.Client],\n provides: [ClientCapabilities.HubHttpClient],\n // Reads `client.config` (initialized-only) for the hub URL.\n activatesOn: ClientEvents.Initialized,\n },\n () => import('../hub-http-client.ts'),\n);\n\nexport const IdentityLifecycle = Capability.lazyModule(\n 'IdentityLifecycle',\n {\n requires: [\n ClientCapabilities.Client,\n ClientCapabilities.AccountCache,\n Capabilities.AtomRegistry,\n Capabilities.OperationInvoker,\n Capabilities.PluginManager,\n ],\n provides: [],\n // Subscribes to `client.halo` (initialized-only).\n activatesOn: ClientEvents.Initialized,\n },\n () => import('../identity-lifecycle.ts'),\n);\n\nexport const LayerSpecs = AppCapability.layerSpec(() => import('../layer-specs.ts'), {\n name: 'LayerSpecs',\n});\n\nexport const NavigationTargetLoader = Capability.lazyModule(\n 'NavigationTargetLoader',\n { requires: [ClientCapabilities.Client], provides: [AppCapabilities.NavigationTargetLoader] },\n () => import('../navigation-target-loader.ts'),\n);\n\nexport const OperationHandler = AppCapability.operationHandler(() => import('../operation-handler.ts'));\n\nexport const RemoteTraceMonitor = Capability.lazyModule(\n 'RemoteTraceMonitor',\n // Startup: the process-manager runtime snapshots this capability once, in the Startup pass, and\n // bakes a no-op remote source if it has not been contributed yet — demand activation always loses\n // that race, silencing remote traces for every Process.Manager consumer.\n { provides: [Capabilities.RemoteTraceMonitor], activatesOn: ActivationEvents.Startup },\n () => import('../remote-trace-monitor.ts'),\n);\n\nexport const SpaceReplicationProgress = Capability.lazyModule(\n 'SpaceReplicationProgress',\n {\n // ProgressRegistry is read optionally in the body, not required: a host that omits\n // plugin-progress should lose the meter, not fail to activate ClientPlugin.\n requires: [ClientCapabilities.Client, Capabilities.ProcessManagerRuntime],\n provides: [],\n // Runtime event: spaces become ready when the client observes them, not at startup.\n activatesOn: ClientEvents.SpacesAvailable,\n },\n () => import('../space-replication-progress.ts'),\n);\n\nexport const TraceProgress = Capability.lazyModule(\n 'TraceProgress',\n {\n // ProgressRegistry is resolved lazily per message (a host without it degrades to a no-op sink).\n requires: [Capabilities.ProcessManager, Capabilities.ProcessManagerRuntime, Capabilities.ServiceResolver],\n provides: [],\n // Same activation as SpaceReplicationProgress: process-manager runtime, monitor, and\n // registry are all available by the time spaces are observed.\n activatesOn: ClientEvents.SpacesAvailable,\n },\n () => import('../trace-progress.ts'),\n);\n\nexport const Translations = AppCapability.translations(translations);\n\nexport const Client = undefined;\nexport const Migrations = undefined;\nexport const NavigationHandler = undefined;\nexport const ReactContext = undefined;\nexport const ReactSurface = undefined;\nexport const SchemaDefs = undefined;\n"],"mappings":";;;;;;;;AAeA,IAAa,eAAe,WAAW,WACrC,gBACA,EAAE,UAAU,CAAC,mBAAmB,YAAY,EAAE,SACxC,OAAO,4BACf;AAIA,IAAa,kBAAkB,cAAc,sBAAsB,OAAO,kCAA4B,EACpG,aAAa,aAAa,YAC5B,CAAC;AAID,IAAa,WAAW,cAAc,eAAe,OAAO,YAAY;AAExE,IAAa,iBAAiB,WAAW,WACvC,kBACA;CACE,UAAU,CAAC,mBAAmB,MAAM;CACpC,UAAU;EAAC,mBAAmB;EAAQ,mBAAmB;EAAgB,mBAAmB;CAAU;CAEtG,aAAa,aAAa;AAC5B,SACM,OAAO,8BACf;AAEA,IAAa,gBAAgB,WAAW,WACtC,iBACA;CACE,UAAU,CAAC,mBAAmB,MAAM;CACpC,UAAU,CAAC,mBAAmB,aAAa;CAE3C,aAAa,aAAa;AAC5B,SACM,OAAO,8BACf;AAEA,IAAa,oBAAoB,WAAW,WAC1C,qBACA;CACE,UAAU;EACR,mBAAmB;EACnB,mBAAmB;EACnB,aAAa;EACb,aAAa;EACb,aAAa;CACf;CACA,UAAU,CAAC;CAEX,aAAa,aAAa;AAC5B,SACM,OAAO,iCACf;AAEA,IAAa,aAAa,cAAc,gBAAgB,OAAO,4BAAsB,EACnF,MAAM,aACR,CAAC;AAED,IAAa,yBAAyB,WAAW,WAC/C,0BACA;CAAE,UAAU,CAAC,mBAAmB,MAAM;CAAG,UAAU,CAAC,gBAAgB,sBAAsB;AAAE,SACtF,OAAO,uCACf;AAEA,IAAa,mBAAmB,cAAc,uBAAuB,OAAO,gCAA0B;AAEtG,IAAa,qBAAqB,WAAW,WAC3C,sBAIA;CAAE,UAAU,CAAC,aAAa,kBAAkB;CAAG,aAAa,iBAAiB;AAAQ,SAC/E,OAAO,mCACf;AAEA,IAAa,2BAA2B,WAAW,WACjD,4BACA;CAGE,UAAU,CAAC,mBAAmB,QAAQ,aAAa,qBAAqB;CACxE,UAAU,CAAC;CAEX,aAAa,aAAa;AAC5B,SACM,OAAO,yCACf;AAEA,IAAa,gBAAgB,WAAW,WACtC,iBACA;CAEE,UAAU;EAAC,aAAa;EAAgB,aAAa;EAAuB,aAAa;CAAe;CACxG,UAAU,CAAC;CAGX,aAAa,aAAa;AAC5B,SACM,OAAO,6BACf;AAEA,IAAa,eAAe,cAAc,aAAa,YAAY;AAEnE,IAAa,SAAS,KAAA;AACtB,IAAa,aAAa,KAAA;AAC1B,IAAa,oBAAoB,KAAA;AACjC,IAAa,eAAe,KAAA;AAC5B,IAAa,eAAe,KAAA;AAC5B,IAAa,aAAa,KAAA"}
|
|
@@ -1,23 +1,30 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { a as RESET_DIALOG } from "./chunk-constants.mjs";
|
|
2
|
+
import { t as useAccountUrl } from "./chunk-useAccountUrl.mjs";
|
|
3
|
+
import { t as useHubHttpClient } from "./chunk-useHubClient.mjs";
|
|
3
4
|
import { ClientCapabilities } from "#types";
|
|
4
5
|
import { Context } from "@dxos/context";
|
|
5
6
|
import { meta } from "#meta";
|
|
6
7
|
import { useCallback, useState } from "react";
|
|
8
|
+
import { Form } from "@dxos/react-ui-form";
|
|
9
|
+
import * as Button from "@dxos/react-ui/Button";
|
|
10
|
+
import * as UiHooks from "@dxos/react-ui/Hooks";
|
|
11
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
7
12
|
import * as LayoutOperation from "@dxos/app-toolkit/LayoutOperation";
|
|
8
|
-
import
|
|
13
|
+
import * as Hooks from "@dxos/app-framework/Hooks";
|
|
9
14
|
import { useIdentity } from "@dxos/halo-react";
|
|
10
|
-
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
11
15
|
import { useAtom, useAtomSet } from "@effect/atom-react/Hooks";
|
|
12
|
-
import
|
|
13
|
-
import
|
|
16
|
+
import * as Banner from "@dxos/react-ui/Banner";
|
|
17
|
+
import * as Field from "@dxos/react-ui/Field";
|
|
18
|
+
import * as Icon from "@dxos/react-ui/Icon";
|
|
19
|
+
import * as Input from "@dxos/react-ui/Input";
|
|
20
|
+
import * as Layout from "@dxos/react-ui/Layout";
|
|
14
21
|
//#region src/containers/AccountContainer/AccountContainer.tsx
|
|
15
22
|
var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-client/src/containers/AccountContainer/AccountContainer.tsx";
|
|
16
23
|
var AccountContainer = () => {
|
|
17
|
-
const { t } = useTranslation(meta.profile.key);
|
|
24
|
+
const { t } = UiHooks.useTranslation(meta.profile.key);
|
|
18
25
|
const identity = useIdentity();
|
|
19
|
-
const { invokePromise } = useOperationInvoker();
|
|
20
|
-
const accountCacheAtom = useCapability(ClientCapabilities.AccountCache);
|
|
26
|
+
const { invokePromise } = Hooks.useOperationInvoker();
|
|
27
|
+
const accountCacheAtom = Hooks.useCapability(ClientCapabilities.AccountCache);
|
|
21
28
|
const [cache] = useAtom(accountCacheAtom);
|
|
22
29
|
const setCache = useAtomSet(accountCacheAtom);
|
|
23
30
|
const [resendStatus, setResendStatus] = useState(null);
|
|
@@ -26,13 +33,13 @@ var AccountContainer = () => {
|
|
|
26
33
|
const [requestSubmitted, setRequestSubmitted] = useState(false);
|
|
27
34
|
const hubHttp = useHubHttpClient();
|
|
28
35
|
const { openAccountPage } = useAccountUrl();
|
|
29
|
-
useAsyncEffect(async () => {
|
|
36
|
+
UiHooks.useAsyncEffect(async () => {
|
|
30
37
|
if (!hubHttp) return;
|
|
31
38
|
try {
|
|
32
39
|
const account = await hubHttp.getAccount(new Context(void 0, {
|
|
33
40
|
"~LogMeta": "~LogMeta",
|
|
34
41
|
F: __dxlog_file,
|
|
35
|
-
L:
|
|
42
|
+
L: 51
|
|
36
43
|
}));
|
|
37
44
|
setCache((prev) => ({
|
|
38
45
|
...prev,
|
|
@@ -57,7 +64,7 @@ var AccountContainer = () => {
|
|
|
57
64
|
const result = await hubHttp.resendVerificationEmail(new Context(void 0, {
|
|
58
65
|
"~LogMeta": "~LogMeta",
|
|
59
66
|
F: __dxlog_file,
|
|
60
|
-
L:
|
|
67
|
+
L: 69
|
|
61
68
|
}));
|
|
62
69
|
if (result.sent) setResendStatus(t("verification-sent.message"));
|
|
63
70
|
else if (result.cooldownSecondsRemaining) setResendStatus(t("verification-cooldown.message", { seconds: result.cooldownSecondsRemaining }));
|
|
@@ -75,7 +82,7 @@ var AccountContainer = () => {
|
|
|
75
82
|
await hubHttp.requestAccess(new Context(void 0, {
|
|
76
83
|
"~LogMeta": "~LogMeta",
|
|
77
84
|
F: __dxlog_file,
|
|
78
|
-
L:
|
|
85
|
+
L: 91
|
|
79
86
|
}), {
|
|
80
87
|
email,
|
|
81
88
|
identityDid
|
|
@@ -98,7 +105,7 @@ var AccountContainer = () => {
|
|
|
98
105
|
await hubHttp.deleteAccount(new Context(void 0, {
|
|
99
106
|
"~LogMeta": "~LogMeta",
|
|
100
107
|
F: __dxlog_file,
|
|
101
|
-
L:
|
|
108
|
+
L: 113
|
|
102
109
|
}));
|
|
103
110
|
setCache(() => ({}));
|
|
104
111
|
}
|
|
@@ -114,80 +121,85 @@ var AccountContainer = () => {
|
|
|
114
121
|
variant: "settings",
|
|
115
122
|
children: /* @__PURE__ */ jsx(Form.Viewport, {
|
|
116
123
|
scroll: true,
|
|
117
|
-
children: /* @__PURE__ */ jsxs(Form.Content, { children: [/* @__PURE__ */ jsx(Form.
|
|
118
|
-
|
|
124
|
+
children: /* @__PURE__ */ jsxs(Form.Content, { children: [/* @__PURE__ */ jsx(Form.FieldSet, {
|
|
125
|
+
label: t("account-section.title"),
|
|
119
126
|
description: t("account-section.description"),
|
|
120
|
-
children: accountState === "loading" ? null : accountState === "missing" ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */
|
|
127
|
+
children: accountState === "loading" ? null : accountState === "missing" ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs(Banner.Root, {
|
|
121
128
|
valence: "warning",
|
|
122
|
-
children:
|
|
129
|
+
children: [/* @__PURE__ */ jsx(Banner.Title, {
|
|
123
130
|
icon: "ph--warning--duotone",
|
|
124
131
|
children: t("no-edge-access.title")
|
|
125
|
-
}), /* @__PURE__ */ jsx(Banner.Body, { children: t("no-edge-access.description") })]
|
|
126
|
-
}), /* @__PURE__ */ jsx(Form.
|
|
132
|
+
}), /* @__PURE__ */ jsx(Banner.Body, { children: t("no-edge-access.description") })]
|
|
133
|
+
}), /* @__PURE__ */ jsx(Form.Field, {
|
|
134
|
+
standalone: true,
|
|
127
135
|
label: t("request-access.label"),
|
|
128
136
|
description: t("request-access.description"),
|
|
129
137
|
children: requestSubmitted ? /* @__PURE__ */ jsx("span", {
|
|
130
|
-
className: "text-sm text-
|
|
138
|
+
className: "text-sm text-fg-muted",
|
|
131
139
|
children: t("access-request-submitted.message")
|
|
132
140
|
}) : /* @__PURE__ */ jsxs("form", {
|
|
133
141
|
onSubmit: handleRequestAccess,
|
|
134
142
|
className: "flex gap-2 items-center justify-end",
|
|
135
|
-
children: [/* @__PURE__ */ jsx(
|
|
143
|
+
children: [/* @__PURE__ */ jsx(Field.Root, { children: /* @__PURE__ */ jsx(Input.Root, {
|
|
136
144
|
type: "email",
|
|
137
145
|
required: true,
|
|
138
146
|
placeholder: t("access-request-email.placeholder"),
|
|
139
147
|
value: requestEmail,
|
|
140
148
|
onChange: (event) => setRequestEmail(event.target.value),
|
|
141
149
|
classNames: "w-64 max-w-full min-w-0"
|
|
142
|
-
}) }), /* @__PURE__ */ jsx(Button, {
|
|
150
|
+
}) }), /* @__PURE__ */ jsx(Button.Root, {
|
|
143
151
|
type: "submit",
|
|
144
|
-
|
|
152
|
+
size: "sm",
|
|
145
153
|
children: t("request-access.label")
|
|
146
154
|
})]
|
|
147
155
|
})
|
|
148
|
-
})] }) : accountState === "error" && !account ? /* @__PURE__ */
|
|
156
|
+
})] }) : accountState === "error" && !account ? /* @__PURE__ */ jsxs(Banner.Root, {
|
|
149
157
|
valence: "error",
|
|
150
|
-
children:
|
|
158
|
+
children: [/* @__PURE__ */ jsx(Banner.Title, {
|
|
151
159
|
icon: "ph--cloud-x--duotone",
|
|
152
160
|
children: t("account-offline.title")
|
|
153
|
-
}), /* @__PURE__ */ jsx(Banner.Body, { children: t("account-offline.description") })]
|
|
154
|
-
}) : account ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(Form.
|
|
161
|
+
}), /* @__PURE__ */ jsx(Banner.Body, { children: t("account-offline.description") })]
|
|
162
|
+
}) : account ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(Form.Field, {
|
|
163
|
+
standalone: true,
|
|
155
164
|
label: t("email.label"),
|
|
156
165
|
description: account.email,
|
|
157
|
-
children: account.emailVerified ? /* @__PURE__ */ jsx(Icon, {
|
|
166
|
+
children: account.emailVerified ? /* @__PURE__ */ jsx(Icon.Icon, {
|
|
158
167
|
icon: "ph--check-circle--duotone",
|
|
159
|
-
size:
|
|
160
|
-
classNames: "
|
|
161
|
-
|
|
168
|
+
size: "lg",
|
|
169
|
+
classNames: "justify-self-end",
|
|
170
|
+
valence: "success"
|
|
171
|
+
}) : /* @__PURE__ */ jsxs(Layout.Flex, {
|
|
162
172
|
column: true,
|
|
163
173
|
gap: "xs",
|
|
164
174
|
align: "end",
|
|
165
|
-
children: [/* @__PURE__ */ jsx(
|
|
175
|
+
children: [/* @__PURE__ */ jsx(Button.Root, {
|
|
166
176
|
icon: "ph--paper-plane-tilt--regular",
|
|
167
177
|
label: t("resend-verification.label"),
|
|
168
178
|
onClick: handleResend,
|
|
169
|
-
|
|
179
|
+
size: "sm"
|
|
170
180
|
}), resendStatus ? /* @__PURE__ */ jsx("span", {
|
|
171
|
-
className: "text-xs text-
|
|
181
|
+
className: "text-xs text-fg-muted",
|
|
172
182
|
children: resendStatus
|
|
173
183
|
}) : null]
|
|
174
184
|
})
|
|
175
|
-
}), /* @__PURE__ */ jsx(Form.
|
|
185
|
+
}), /* @__PURE__ */ jsx(Form.Field, {
|
|
186
|
+
standalone: true,
|
|
176
187
|
label: t("delete-account.label"),
|
|
177
188
|
description: t("delete-account.description"),
|
|
178
|
-
children: /* @__PURE__ */ jsx(Button, {
|
|
189
|
+
children: /* @__PURE__ */ jsx(Button.Root, {
|
|
179
190
|
variant: "destructive",
|
|
180
191
|
onClick: handleDeleteAccount,
|
|
181
192
|
children: t("delete-account.label")
|
|
182
193
|
})
|
|
183
194
|
})] }) : null
|
|
184
|
-
}), account ? /* @__PURE__ */ jsx(Form.
|
|
185
|
-
|
|
195
|
+
}), account ? /* @__PURE__ */ jsx(Form.FieldSet, {
|
|
196
|
+
label: t("account-page-section.title"),
|
|
186
197
|
description: t("account-page-section.description"),
|
|
187
|
-
children: /* @__PURE__ */ jsx(Form.
|
|
198
|
+
children: /* @__PURE__ */ jsx(Form.Field, {
|
|
199
|
+
standalone: true,
|
|
188
200
|
label: t("open-account-page.label"),
|
|
189
201
|
description: t("open-account-page.description"),
|
|
190
|
-
children: /* @__PURE__ */ jsx(
|
|
202
|
+
children: /* @__PURE__ */ jsx(Button.Root, {
|
|
191
203
|
icon: "ph--arrow-square-out--regular",
|
|
192
204
|
label: t("open-account-page.label"),
|
|
193
205
|
variant: "default",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk-AccountContainer.mjs","names":[],"sources":["../../src/containers/AccountContainer/AccountContainer.tsx"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\nimport { useAtom, useAtomSet } from '@effect/atom-react/Hooks';\nimport React, { type FormEvent, useCallback, useState } from 'react';\n\nimport { useCapability, useOperationInvoker } from '@dxos/app-framework/ui';\nimport * as LayoutOperation from '@dxos/app-toolkit/LayoutOperation';\nimport { Context } from '@dxos/context';\nimport { useIdentity } from '@dxos/halo-react';\nimport { Banner, Button, Flex, Icon, IconButton, Input, useAsyncEffect, useTranslation } from '@dxos/react-ui';\nimport { Form } from '@dxos/react-ui-form';\n\nimport { meta } from '#meta';\nimport { ClientCapabilities } from '#types';\n\nimport { RESET_DIALOG } from '../../constants';\nimport { useAccountUrl, useHubHttpClient } from '../../hooks';\n\ntype AccountState = 'loading' | 'present' | 'missing' | 'error';\n\nexport const AccountContainer = () => {\n const { t } = useTranslation(meta.profile.key);\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 const { openAccountPage } = useAccountUrl();\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?.did;\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 <Form.Root variant='settings'>\n <Form.Viewport scroll>\n <Form.Content>\n <Form.Section title={t('account-section.title')} description={t('account-section.description')}>\n {accountState === 'loading' ? null : accountState === 'missing' ? (\n <>\n <Banner.Root valence='warning'>\n <Banner.Content>\n <Banner.Title icon='ph--warning--duotone'>{t('no-edge-access.title')}</Banner.Title>\n <Banner.Body>{t('no-edge-access.description')}</Banner.Body>\n </Banner.Content>\n </Banner.Root>\n <Form.Row label={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='w-64 max-w-full min-w-0'\n />\n </Input.Root>\n <Button type='submit' density='sm'>\n {t('request-access.label')}\n </Button>\n </form>\n )}\n </Form.Row>\n </>\n ) : accountState === 'error' && !account ? (\n <Banner.Root valence='error'>\n <Banner.Content>\n <Banner.Title icon='ph--cloud-x--duotone'>{t('account-offline.title')}</Banner.Title>\n <Banner.Body>{t('account-offline.description')}</Banner.Body>\n </Banner.Content>\n </Banner.Root>\n ) : account ? (\n <>\n <Form.Row label={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 <Flex column gap='xs' align='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 </Flex>\n )}\n </Form.Row>\n <Form.Row label={t('delete-account.label')} description={t('delete-account.description')}>\n <Button variant='destructive' onClick={handleDeleteAccount}>\n {t('delete-account.label')}\n </Button>\n </Form.Row>\n </>\n ) : null}\n </Form.Section>\n {account ? (\n <Form.Section title={t('account-page-section.title')} description={t('account-page-section.description')}>\n <Form.Row label={t('open-account-page.label')} description={t('open-account-page.description')}>\n <IconButton\n icon='ph--arrow-square-out--regular'\n label={t('open-account-page.label')}\n variant='default'\n onClick={openAccountPage}\n />\n </Form.Row>\n </Form.Section>\n ) : null}\n </Form.Content>\n </Form.Viewport>\n </Form.Root>\n );\n};\n\nAccountContainer.displayName = 'AccountContainer';\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chunk-AccountContainer.mjs","names":[],"sources":["../../src/containers/AccountContainer/AccountContainer.tsx"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\nimport { useAtom, useAtomSet } from '@effect/atom-react/Hooks';\nimport React, { type FormEvent, useCallback, useState } from 'react';\n\nimport * as Hooks from '@dxos/app-framework/Hooks';\nimport * as LayoutOperation from '@dxos/app-toolkit/LayoutOperation';\nimport { Context } from '@dxos/context';\nimport { useIdentity } from '@dxos/halo-react';\nimport { Form } from '@dxos/react-ui-form';\nimport * as Banner from '@dxos/react-ui/Banner';\nimport * as Button from '@dxos/react-ui/Button';\nimport * as Field from '@dxos/react-ui/Field';\nimport * as UiHooks from '@dxos/react-ui/Hooks';\nimport * as Icon from '@dxos/react-ui/Icon';\nimport * as Input from '@dxos/react-ui/Input';\nimport * as Layout from '@dxos/react-ui/Layout';\n\nimport { meta } from '#meta';\nimport { ClientCapabilities } from '#types';\n\nimport { RESET_DIALOG } from '../../constants.ts';\nimport { useAccountUrl, useHubHttpClient } from '../../hooks/index.ts';\n\ntype AccountState = 'loading' | 'present' | 'missing' | 'error';\n\nexport const AccountContainer = () => {\n const { t } = UiHooks.useTranslation(meta.profile.key);\n const identity = useIdentity();\n const { invokePromise } = Hooks.useOperationInvoker();\n const accountCacheAtom = Hooks.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 const { openAccountPage } = useAccountUrl();\n\n UiHooks.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?.did;\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 <Form.Root variant='settings'>\n <Form.Viewport scroll>\n <Form.Content>\n <Form.FieldSet label={t('account-section.title')} description={t('account-section.description')}>\n {accountState === 'loading' ? null : accountState === 'missing' ? (\n <>\n <Banner.Root valence='warning'>\n <Banner.Title icon='ph--warning--duotone'>{t('no-edge-access.title')}</Banner.Title>\n <Banner.Body>{t('no-edge-access.description')}</Banner.Body>\n </Banner.Root>\n <Form.Field standalone label={t('request-access.label')} description={t('request-access.description')}>\n {requestSubmitted ? (\n <span className='text-sm text-fg-muted'>{t('access-request-submitted.message')}</span>\n ) : (\n <form onSubmit={handleRequestAccess} className='flex gap-2 items-center justify-end'>\n <Field.Root>\n <Input.Root\n type='email'\n required\n placeholder={t('access-request-email.placeholder')}\n value={requestEmail}\n onChange={(event) => setRequestEmail(event.target.value)}\n classNames='w-64 max-w-full min-w-0'\n />\n </Field.Root>\n <Button.Root type='submit' size='sm'>\n {t('request-access.label')}\n </Button.Root>\n </form>\n )}\n </Form.Field>\n </>\n ) : accountState === 'error' && !account ? (\n <Banner.Root valence='error'>\n <Banner.Title icon='ph--cloud-x--duotone'>{t('account-offline.title')}</Banner.Title>\n <Banner.Body>{t('account-offline.description')}</Banner.Body>\n </Banner.Root>\n ) : account ? (\n <>\n <Form.Field standalone label={t('email.label')} description={account.email}>\n {account.emailVerified ? (\n <Icon.Icon\n icon='ph--check-circle--duotone'\n size='lg'\n classNames='justify-self-end'\n valence='success'\n />\n ) : (\n <Layout.Flex column gap='xs' align='end'>\n <Button.Root\n icon='ph--paper-plane-tilt--regular'\n label={t('resend-verification.label')}\n onClick={handleResend}\n size='sm'\n />\n {resendStatus ? <span className='text-xs text-fg-muted'>{resendStatus}</span> : null}\n </Layout.Flex>\n )}\n </Form.Field>\n <Form.Field standalone label={t('delete-account.label')} description={t('delete-account.description')}>\n <Button.Root variant='destructive' onClick={handleDeleteAccount}>\n {t('delete-account.label')}\n </Button.Root>\n </Form.Field>\n </>\n ) : null}\n </Form.FieldSet>\n {account ? (\n <Form.FieldSet label={t('account-page-section.title')} description={t('account-page-section.description')}>\n <Form.Field\n standalone\n label={t('open-account-page.label')}\n description={t('open-account-page.description')}\n >\n <Button.Root\n icon='ph--arrow-square-out--regular'\n label={t('open-account-page.label')}\n variant='default'\n onClick={openAccountPage}\n />\n </Form.Field>\n </Form.FieldSet>\n ) : null}\n </Form.Content>\n </Form.Viewport>\n </Form.Root>\n );\n};\n\nAccountContainer.displayName = 'AccountContainer';\n"],"mappings":"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"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { CliLogin, ClientCapabilities } from "#types";
|
|
2
|
+
import { log } from "@dxos/log";
|
|
3
|
+
import { meta } from "#meta";
|
|
4
|
+
import { useCallback, useEffect, useRef, useState } from "react";
|
|
5
|
+
import * as Button from "@dxos/react-ui/Button";
|
|
6
|
+
import * as UiHooks from "@dxos/react-ui/Hooks";
|
|
7
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
import * as EffectEx from "@dxos/effect/EffectEx";
|
|
9
|
+
import * as LayoutOperation from "@dxos/app-toolkit/LayoutOperation";
|
|
10
|
+
import * as Hooks from "@dxos/app-framework/Hooks";
|
|
11
|
+
import { useIdentity, useInvitationFlow } from "@dxos/halo-react";
|
|
12
|
+
import * as AlertDialog from "@dxos/react-ui/AlertDialog";
|
|
13
|
+
//#region src/containers/CliLoginDialog/CliLoginDialog.tsx
|
|
14
|
+
var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-client/src/containers/CliLoginDialog/CliLoginDialog.tsx";
|
|
15
|
+
/**
|
|
16
|
+
* Approves a `dx` CLI on this machine as a new device of the current identity.
|
|
17
|
+
*
|
|
18
|
+
* The invitation authenticates with a known public key, whose keypair travels inside the code, so
|
|
19
|
+
* the CLI joins without an auth-code round trip. That makes the code a bearer credential, which is
|
|
20
|
+
* why it is only created on an explicit click and only sent to a loopback callback.
|
|
21
|
+
*/
|
|
22
|
+
var CliLoginDialog = ({ callback, state }) => {
|
|
23
|
+
const { t } = UiHooks.useTranslation(meta.profile.key);
|
|
24
|
+
const { invokePromise } = Hooks.useOperationInvoker();
|
|
25
|
+
const identity = useIdentity();
|
|
26
|
+
const [identityService] = Hooks.useCapabilities(ClientCapabilities.IdentityService);
|
|
27
|
+
const [flow, setFlow] = useState();
|
|
28
|
+
const [status, setStatus] = useState("confirm");
|
|
29
|
+
const [error, setError] = useState();
|
|
30
|
+
const { event } = useInvitationFlow(flow);
|
|
31
|
+
const flowRef = useRef(void 0);
|
|
32
|
+
const closedRef = useRef(false);
|
|
33
|
+
const close = useCallback(() => invokePromise(LayoutOperation.UpdateDialog, { state: false }), [invokePromise]);
|
|
34
|
+
useEffect(() => {
|
|
35
|
+
closedRef.current = false;
|
|
36
|
+
return () => {
|
|
37
|
+
closedRef.current = true;
|
|
38
|
+
if (flowRef.current) EffectEx.runPromise(flowRef.current.cancel()).catch((err) => log.catch(err, void 0, {
|
|
39
|
+
"~LogMeta": "~LogMeta",
|
|
40
|
+
F: __dxlog_file,
|
|
41
|
+
L: 59,
|
|
42
|
+
S: void 0
|
|
43
|
+
}));
|
|
44
|
+
};
|
|
45
|
+
}, []);
|
|
46
|
+
useEffect(() => {
|
|
47
|
+
switch (event?._tag) {
|
|
48
|
+
case "success":
|
|
49
|
+
flowRef.current = void 0;
|
|
50
|
+
setStatus("success");
|
|
51
|
+
break;
|
|
52
|
+
case "cancelled":
|
|
53
|
+
case "error":
|
|
54
|
+
flowRef.current = void 0;
|
|
55
|
+
setError(event._tag === "error" ? event.message : t("cli-login-cancelled.message"));
|
|
56
|
+
setStatus("error");
|
|
57
|
+
}
|
|
58
|
+
}, [event?._tag, t]);
|
|
59
|
+
const handleAuthorize = useCallback(async () => {
|
|
60
|
+
const target = CliLogin.parseCallback(callback);
|
|
61
|
+
if (!identityService || !target) return;
|
|
62
|
+
setStatus("sending");
|
|
63
|
+
try {
|
|
64
|
+
const created = await EffectEx.runPromise(identityService.share({ authMethod: "known-public-key" }));
|
|
65
|
+
if (closedRef.current) {
|
|
66
|
+
await EffectEx.runPromise(created.cancel());
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
flowRef.current = created;
|
|
70
|
+
setFlow(created);
|
|
71
|
+
const code = await EffectEx.runPromise(created.code);
|
|
72
|
+
if (closedRef.current) return;
|
|
73
|
+
await fetch(CliLogin.createCallbackUrl(target, code, state), { mode: "no-cors" });
|
|
74
|
+
setStatus("waiting");
|
|
75
|
+
} catch (err) {
|
|
76
|
+
log.catch(err, void 0, {
|
|
77
|
+
"~LogMeta": "~LogMeta",
|
|
78
|
+
F: __dxlog_file,
|
|
79
|
+
L: 102,
|
|
80
|
+
S: void 0
|
|
81
|
+
});
|
|
82
|
+
setError(err instanceof Error ? err.message : String(err));
|
|
83
|
+
setStatus("error");
|
|
84
|
+
}
|
|
85
|
+
}, [
|
|
86
|
+
identityService,
|
|
87
|
+
callback,
|
|
88
|
+
state
|
|
89
|
+
]);
|
|
90
|
+
return /* @__PURE__ */ jsxs(AlertDialog.Content, {
|
|
91
|
+
size: "md",
|
|
92
|
+
children: [/* @__PURE__ */ jsxs(AlertDialog.Body, { children: [
|
|
93
|
+
/* @__PURE__ */ jsx(AlertDialog.Title, { children: t("cli-login-dialog.title") }),
|
|
94
|
+
/* @__PURE__ */ jsx(AlertDialog.Description, {
|
|
95
|
+
classNames: "py-2",
|
|
96
|
+
children: identity ? t("cli-login-dialog.description") : t("cli-login-no-identity.message")
|
|
97
|
+
}),
|
|
98
|
+
identity && /* @__PURE__ */ jsxs("div", {
|
|
99
|
+
className: "py-2",
|
|
100
|
+
children: [/* @__PURE__ */ jsx("p", {
|
|
101
|
+
className: "text-sm text-fg-subtle",
|
|
102
|
+
children: t("cli-login-code.label")
|
|
103
|
+
}), /* @__PURE__ */ jsx("p", {
|
|
104
|
+
className: "py-2 font-mono text-2xl tracking-widest text-center",
|
|
105
|
+
"data-testid": "cliLogin.state",
|
|
106
|
+
children: state
|
|
107
|
+
})]
|
|
108
|
+
}),
|
|
109
|
+
/* @__PURE__ */ jsxs("p", {
|
|
110
|
+
className: "py-2 text-sm",
|
|
111
|
+
"data-testid": "cliLogin.status",
|
|
112
|
+
"data-status": status,
|
|
113
|
+
children: [
|
|
114
|
+
status === "sending" && t("cli-login-sending.message"),
|
|
115
|
+
status === "waiting" && t("cli-login-waiting.message"),
|
|
116
|
+
status === "success" && t("cli-login-success.message"),
|
|
117
|
+
status === "error" && t("cli-login-error.message", { error })
|
|
118
|
+
]
|
|
119
|
+
})
|
|
120
|
+
] }), /* @__PURE__ */ jsx(AlertDialog.Footer, { children: status === "confirm" || status === "sending" ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(AlertDialog.Cancel, {
|
|
121
|
+
"data-testid": "cliLogin.deny",
|
|
122
|
+
disabled: status === "sending",
|
|
123
|
+
onClick: close,
|
|
124
|
+
children: t("cli-login-deny.label")
|
|
125
|
+
}), /* @__PURE__ */ jsx(Button.Root, {
|
|
126
|
+
"data-testid": "cliLogin.authorize",
|
|
127
|
+
variant: "primary",
|
|
128
|
+
disabled: !identity || status === "sending",
|
|
129
|
+
onClick: handleAuthorize,
|
|
130
|
+
children: t("cli-login-authorize.label")
|
|
131
|
+
})] }) : /* @__PURE__ */ jsx(AlertDialog.Action, {
|
|
132
|
+
"data-testid": "cliLogin.done",
|
|
133
|
+
variant: status === "success" ? "primary" : "default",
|
|
134
|
+
onClick: close,
|
|
135
|
+
children: t(status === "waiting" ? "cli-login-cancel.label" : "cli-login-done.label")
|
|
136
|
+
}) })]
|
|
137
|
+
});
|
|
138
|
+
};
|
|
139
|
+
CliLoginDialog.displayName = "CliLoginDialog";
|
|
140
|
+
//#endregion
|
|
141
|
+
//#region src/containers/CliLoginDialog/index.ts
|
|
142
|
+
var CliLoginDialog_default = CliLoginDialog;
|
|
143
|
+
//#endregion
|
|
144
|
+
export { CliLoginDialog, CliLoginDialog_default as default };
|
|
145
|
+
|
|
146
|
+
//# sourceMappingURL=chunk-CliLoginDialog.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-CliLoginDialog.mjs","names":[],"sources":["../../src/containers/CliLoginDialog/CliLoginDialog.tsx","../../src/containers/CliLoginDialog/index.ts"],"sourcesContent":["//\n// Copyright 2026 DXOS.org\n//\n\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\n\nimport * as Hooks from '@dxos/app-framework/Hooks';\nimport * as LayoutOperation from '@dxos/app-toolkit/LayoutOperation';\nimport * as EffectEx from '@dxos/effect/EffectEx';\nimport { type Invitation } from '@dxos/halo';\nimport { useIdentity, useInvitationFlow } from '@dxos/halo-react';\nimport { log } from '@dxos/log';\nimport * as AlertDialog from '@dxos/react-ui/AlertDialog';\nimport * as Button from '@dxos/react-ui/Button';\nimport * as UiHooks from '@dxos/react-ui/Hooks';\n\nimport { meta } from '#meta';\nimport { ClientCapabilities, CliLogin } from '#types';\n\nexport type CliLoginDialogProps = {\n /** The CLI's loopback callback, already checked by {@link CliLogin.parseCallback}. */\n callback: string;\n /** The CLI's state, which the terminal prints too so the user can match the two. */\n state: string;\n};\n\ntype Status = 'confirm' | 'sending' | 'waiting' | 'success' | 'error';\n\n/**\n * Approves a `dx` CLI on this machine as a new device of the current identity.\n *\n * The invitation authenticates with a known public key, whose keypair travels inside the code, so\n * the CLI joins without an auth-code round trip. That makes the code a bearer credential, which is\n * why it is only created on an explicit click and only sent to a loopback callback.\n */\nexport const CliLoginDialog = ({ callback, state }: CliLoginDialogProps) => {\n const { t } = UiHooks.useTranslation(meta.profile.key);\n const { invokePromise } = Hooks.useOperationInvoker();\n const identity = useIdentity();\n const [identityService] = Hooks.useCapabilities(ClientCapabilities.IdentityService);\n const [flow, setFlow] = useState<Invitation.Flow>();\n const [status, setStatus] = useState<Status>('confirm');\n const [error, setError] = useState<string>();\n const { event } = useInvitationFlow(flow);\n // The flow still to cancel on close: set once created, cleared on any terminal event.\n const flowRef = useRef<Invitation.Flow | undefined>(undefined);\n // Set on unmount, so an authorization still in flight stops before it sends the code.\n const closedRef = useRef(false);\n\n const close = useCallback(() => invokePromise(LayoutOperation.UpdateDialog, { state: false }), [invokePromise]);\n\n // Closing mid-flow must stop the host listening, or the invitation outlives the dialog.\n useEffect(() => {\n // Reset on (re)mount: StrictMode runs this cleanup once before the real mount.\n closedRef.current = false;\n return () => {\n closedRef.current = true;\n if (flowRef.current) {\n void EffectEx.runPromise(flowRef.current.cancel()).catch((err) => log.catch(err));\n }\n };\n }, []);\n\n useEffect(() => {\n switch (event?._tag) {\n case 'success':\n flowRef.current = undefined;\n setStatus('success');\n break;\n case 'cancelled':\n case 'error':\n flowRef.current = undefined;\n setError(event._tag === 'error' ? event.message : t('cli-login-cancelled.message'));\n setStatus('error');\n break;\n }\n }, [event?._tag, t]);\n\n const handleAuthorize = useCallback(async () => {\n const target = CliLogin.parseCallback(callback);\n if (!identityService || !target) {\n return;\n }\n setStatus('sending');\n try {\n const created = await EffectEx.runPromise(identityService.share({ authMethod: 'known-public-key' }));\n if (closedRef.current) {\n await EffectEx.runPromise(created.cancel());\n return;\n }\n flowRef.current = created;\n setFlow(created);\n const code = await EffectEx.runPromise(created.code);\n if (closedRef.current) {\n return;\n }\n // `no-cors`: the loopback server sends no CORS headers and the response carries nothing needed\n // here; the flow's own events report whether the CLI joined.\n await fetch(CliLogin.createCallbackUrl(target, code, state), { mode: 'no-cors' });\n setStatus('waiting');\n } catch (err) {\n log.catch(err);\n setError(err instanceof Error ? err.message : String(err));\n setStatus('error');\n }\n }, [identityService, callback, state]);\n\n return (\n <AlertDialog.Content size='md'>\n <AlertDialog.Body>\n <AlertDialog.Title>{t('cli-login-dialog.title')}</AlertDialog.Title>\n <AlertDialog.Description classNames='py-2'>\n {identity ? t('cli-login-dialog.description') : t('cli-login-no-identity.message')}\n </AlertDialog.Description>\n {identity && (\n <div className='py-2'>\n <p className='text-sm text-fg-subtle'>{t('cli-login-code.label')}</p>\n <p className='py-2 font-mono text-2xl tracking-widest text-center' data-testid='cliLogin.state'>\n {state}\n </p>\n </div>\n )}\n <p className='py-2 text-sm' data-testid='cliLogin.status' data-status={status}>\n {status === 'sending' && t('cli-login-sending.message')}\n {status === 'waiting' && t('cli-login-waiting.message')}\n {status === 'success' && t('cli-login-success.message')}\n {status === 'error' && t('cli-login-error.message', { error })}\n </p>\n </AlertDialog.Body>\n <AlertDialog.Footer>\n {status === 'confirm' || status === 'sending' ? (\n <>\n <AlertDialog.Cancel data-testid='cliLogin.deny' disabled={status === 'sending'} onClick={close}>\n {t('cli-login-deny.label')}\n </AlertDialog.Cancel>\n <Button.Root\n data-testid='cliLogin.authorize'\n variant='primary'\n disabled={!identity || status === 'sending'}\n onClick={handleAuthorize}\n >\n {t('cli-login-authorize.label')}\n </Button.Root>\n </>\n ) : (\n <AlertDialog.Action\n data-testid='cliLogin.done'\n variant={status === 'success' ? 'primary' : 'default'}\n onClick={close}\n >\n {t(status === 'waiting' ? 'cli-login-cancel.label' : 'cli-login-done.label')}\n </AlertDialog.Action>\n )}\n </AlertDialog.Footer>\n </AlertDialog.Content>\n );\n};\n\nCliLoginDialog.displayName = 'CliLoginDialog';\n","//\n// Copyright 2026 DXOS.org\n//\n\nimport { CliLoginDialog } from './CliLoginDialog.tsx';\n\nexport * from './CliLoginDialog.tsx';\nexport default CliLoginDialog;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAmCA,IAAa,kBAAkB,EAAE,UAAU,YAAiC;CAC1E,MAAM,EAAE,MAAM,QAAQ,eAAe,KAAK,QAAQ,GAAG;CACrD,MAAM,EAAE,kBAAkB,MAAM,oBAAoB;CACpD,MAAM,WAAW,YAAY;CAC7B,MAAM,CAAC,mBAAmB,MAAM,gBAAgB,mBAAmB,eAAe;CAClF,MAAM,CAAC,MAAM,WAAW,SAA0B;CAClD,MAAM,CAAC,QAAQ,aAAa,SAAiB,SAAS;CACtD,MAAM,CAAC,OAAO,YAAY,SAAiB;CAC3C,MAAM,EAAE,UAAU,kBAAkB,IAAI;CAExC,MAAM,UAAU,OAAoC,KAAA,CAAS;CAE7D,MAAM,YAAY,OAAO,KAAK;CAE9B,MAAM,QAAQ,kBAAkB,cAAc,gBAAgB,cAAc,EAAE,OAAO,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC;CAG9G,gBAAgB;EAEd,UAAU,UAAU;EACpB,aAAa;GACX,UAAU,UAAU;GACpB,IAAI,QAAQ,SACV,SAAc,WAAW,QAAQ,QAAQ,OAAO,CAAC,CAAC,CAAC,OAAO,QAAQ,IAAI,MAAM,KAAE,KAAA,GAAA;IAAA,YAAA;IAAA,GAAA;IAAA,GAAA;IAAA,GAAA,KAAA;GAAA,CAAC,CAAC;EAEpF;CACF,GAAG,CAAC,CAAC;CAEL,gBAAgB;EACd,QAAQ,OAAO,MAAf;GACE,KAAK;IACH,QAAQ,UAAU,KAAA;IAClB,UAAU,SAAS;IACnB;GACF,KAAK;GACL,KAAK;IACH,QAAQ,UAAU,KAAA;IAClB,SAAS,MAAM,SAAS,UAAU,MAAM,UAAU,EAAE,6BAA6B,CAAC;IAClF,UAAU,OAAO;EAErB;CACF,GAAG,CAAC,OAAO,MAAM,CAAC,CAAC;CAEnB,MAAM,kBAAkB,YAAY,YAAY;EAC9C,MAAM,SAAS,SAAS,cAAc,QAAQ;EAC9C,IAAI,CAAC,mBAAmB,CAAC,QACvB;EAEF,UAAU,SAAS;EACnB,IAAI;GACF,MAAM,UAAU,MAAM,SAAS,WAAW,gBAAgB,MAAM,EAAE,YAAY,mBAAmB,CAAC,CAAC;GACnG,IAAI,UAAU,SAAS;IACrB,MAAM,SAAS,WAAW,QAAQ,OAAO,CAAC;IAC1C;GACF;GACA,QAAQ,UAAU;GAClB,QAAQ,OAAO;GACf,MAAM,OAAO,MAAM,SAAS,WAAW,QAAQ,IAAI;GACnD,IAAI,UAAU,SACZ;GAIF,MAAM,MAAM,SAAS,kBAAkB,QAAQ,MAAM,KAAK,GAAG,EAAE,MAAM,UAAU,CAAC;GAChF,UAAU,SAAS;EACrB,SAAS,KAAK;GACZ,IAAI,MAAM,KAAE,KAAA,GAAA;IAAA,YAAA;IAAA,GAAA;IAAA,GAAA;IAAA,GAAA,KAAA;GAAA,CAAC;GACb,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;GACzD,UAAU,OAAO;EACnB;CACF,GAAG;EAAC;EAAiB;EAAU;CAAK,CAAC;CAErC,OACE,qBAAC,YAAY,SAAb;EAAqB,MAAK;EAA1B,UAAA,CACE,qBAAC,YAAY,MAAb,EAAA,UAAA;GACE,oBAAC,YAAY,OAAb,EAAA,UAAoB,EAAE,wBAAwB,EAAqB,CAAA;GACnE,oBAAC,YAAY,aAAb;IAAyB,YAAW;IACjC,UAAA,WAAW,EAAE,8BAA8B,IAAI,EAAE,+BAA+B;GAC1D,CAAA;GACxB,YACC,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,oBAAC,KAAD;KAAG,WAAU;KAA0B,UAAA,EAAE,sBAAsB;IAAK,CAAA,GACpE,oBAAC,KAAD;KAAG,WAAU;KAAsD,eAAY;KAC5E,UAAA;IACA,CAAA,CACA;;GAEP,qBAAC,KAAD;IAAG,WAAU;IAAe,eAAY;IAAkB,eAAa;IAAvE,UAAA;KACG,WAAW,aAAa,EAAE,2BAA2B;KACrD,WAAW,aAAa,EAAE,2BAA2B;KACrD,WAAW,aAAa,EAAE,2BAA2B;KACrD,WAAW,WAAW,EAAE,2BAA2B,EAAE,MAAM,CAAC;IAC5D;;EACa,EAAA,CAAA,GAClB,oBAAC,YAAY,QAAb,EAAA,UACG,WAAW,aAAa,WAAW,YAClC,qBAAA,UAAA,EAAA,UAAA,CACE,oBAAC,YAAY,QAAb;GAAoB,eAAY;GAAgB,UAAU,WAAW;GAAW,SAAS;GACtF,UAAA,EAAE,sBAAsB;EACP,CAAA,GACpB,oBAAC,OAAO,MAAR;GACE,eAAY;GACZ,SAAQ;GACR,UAAU,CAAC,YAAY,WAAW;GAClC,SAAS;GAER,UAAA,EAAE,2BAA2B;EACnB,CAAA,CACb,EAAA,CAAA,IAEF,oBAAC,YAAY,QAAb;GACE,eAAY;GACZ,SAAS,WAAW,YAAY,YAAY;GAC5C,SAAS;GAER,UAAA,EAAE,WAAW,YAAY,2BAA2B,sBAAsB;EACzD,CAAA,EAEJ,CAAA,CACD;;AAEzB;AAEA,eAAe,cAAc;;;ACvJ7B,IAAA,yBAAe"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { toPublicKey } from "@dxos/protocols/buf";
|
|
2
|
+
import { log } from "@dxos/log";
|
|
3
|
+
import { meta } from "#meta";
|
|
4
|
+
import { useMemo, useState } from "react";
|
|
5
|
+
import * as Hooks from "@dxos/react-ui/Hooks";
|
|
6
|
+
import { ContactPicker } from "@dxos/shell/react";
|
|
7
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
import * as Field from "@dxos/react-ui/Field";
|
|
9
|
+
import * as Input from "@dxos/react-ui/Input";
|
|
10
|
+
import * as Layout from "@dxos/react-ui/Layout";
|
|
11
|
+
import { SpaceMember_Role, useMembers } from "@dxos/react-client/echo";
|
|
12
|
+
import { useContacts, useIdentity } from "@dxos/react-client/halo";
|
|
13
|
+
import * as Select from "@dxos/react-ui/Select";
|
|
14
|
+
import * as SystemButton from "@dxos/react-ui/SystemButton";
|
|
15
|
+
//#region src/containers/ContactPickerContainer/ContactPickerContainer.tsx
|
|
16
|
+
var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-client/src/containers/ContactPickerContainer/ContactPickerContainer.tsx";
|
|
17
|
+
var ROLES = [
|
|
18
|
+
SpaceMember_Role.READER,
|
|
19
|
+
SpaceMember_Role.EDITOR,
|
|
20
|
+
SpaceMember_Role.ADMIN
|
|
21
|
+
];
|
|
22
|
+
var roleLabel = {
|
|
23
|
+
[SpaceMember_Role.EDITOR]: "role-editor.label",
|
|
24
|
+
[SpaceMember_Role.READER]: "role-viewer.label",
|
|
25
|
+
[SpaceMember_Role.ADMIN]: "role-admin.label"
|
|
26
|
+
};
|
|
27
|
+
var ContactPickerContainer = ({ space, onAdd }) => {
|
|
28
|
+
const { t } = Hooks.useTranslation(meta.profile.key);
|
|
29
|
+
const contacts = useContacts();
|
|
30
|
+
const members = useMembers(space.key);
|
|
31
|
+
const identity = useIdentity();
|
|
32
|
+
const [selected, setSelected] = useState();
|
|
33
|
+
const [role, setRole] = useState(SpaceMember_Role.EDITOR);
|
|
34
|
+
const [joinUrl, setJoinUrl] = useState();
|
|
35
|
+
const [pending, setPending] = useState(false);
|
|
36
|
+
const memberKeys = useMemo(() => members.map((member) => toPublicKey(member.identity?.identityKey)?.toHex()).filter((key) => key !== void 0), [members]);
|
|
37
|
+
const selfKey = toPublicKey(identity?.identityKey);
|
|
38
|
+
const selfRole = members.find((member) => selfKey && toPublicKey(member.identity?.identityKey)?.equals(selfKey))?.role;
|
|
39
|
+
const canAdmit = selfRole === SpaceMember_Role.OWNER || selfRole === SpaceMember_Role.ADMIN;
|
|
40
|
+
const handleAdd = async () => {
|
|
41
|
+
if (!selected) return;
|
|
42
|
+
setPending(true);
|
|
43
|
+
try {
|
|
44
|
+
const result = await onAdd([selected], role);
|
|
45
|
+
setJoinUrl(result.joinUrl);
|
|
46
|
+
setSelected(result.failed[0]?.key);
|
|
47
|
+
} catch (err) {
|
|
48
|
+
log.catch(err, void 0, {
|
|
49
|
+
"~LogMeta": "~LogMeta",
|
|
50
|
+
F: __dxlog_file,
|
|
51
|
+
L: 69,
|
|
52
|
+
S: void 0
|
|
53
|
+
});
|
|
54
|
+
} finally {
|
|
55
|
+
setPending(false);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
if (contacts.length === 0) return /* @__PURE__ */ jsx("p", {
|
|
59
|
+
className: "text-fg-muted",
|
|
60
|
+
children: t("contact-picker-empty.message")
|
|
61
|
+
});
|
|
62
|
+
return /* @__PURE__ */ jsxs(Layout.Container, {
|
|
63
|
+
gap: "md",
|
|
64
|
+
role: "group",
|
|
65
|
+
gutter: "none",
|
|
66
|
+
children: [/* @__PURE__ */ jsxs(Layout.Flex, {
|
|
67
|
+
align: "center",
|
|
68
|
+
gap: "sm",
|
|
69
|
+
children: [
|
|
70
|
+
/* @__PURE__ */ jsx(ContactPicker, {
|
|
71
|
+
contacts,
|
|
72
|
+
excludeKeys: memberKeys,
|
|
73
|
+
value: selected,
|
|
74
|
+
onChange: (key) => {
|
|
75
|
+
setSelected(key);
|
|
76
|
+
setJoinUrl(void 0);
|
|
77
|
+
},
|
|
78
|
+
disabled: !canAdmit
|
|
79
|
+
}),
|
|
80
|
+
/* @__PURE__ */ jsxs(Select.Root, {
|
|
81
|
+
value: [String(role)],
|
|
82
|
+
onValueChange: ({ value: [value] }) => setRole(ROLES.find((candidate) => String(candidate) === value) ?? SpaceMember_Role.EDITOR),
|
|
83
|
+
items: ROLES.map((value) => ({
|
|
84
|
+
value: String(value),
|
|
85
|
+
label: t(roleLabel[value])
|
|
86
|
+
})),
|
|
87
|
+
children: [/* @__PURE__ */ jsx(Select.Trigger, {
|
|
88
|
+
classNames: "min-w-[6rem]",
|
|
89
|
+
disabled: !canAdmit
|
|
90
|
+
}), /* @__PURE__ */ jsx(Select.Content, { children: ROLES.map((value) => /* @__PURE__ */ jsx(Select.Item, { item: {
|
|
91
|
+
value: String(value),
|
|
92
|
+
label: t(roleLabel[value])
|
|
93
|
+
} }, value)) })]
|
|
94
|
+
}),
|
|
95
|
+
/* @__PURE__ */ jsx(SystemButton.Add, {
|
|
96
|
+
iconOnly: true,
|
|
97
|
+
label: t("contact-picker-add.label"),
|
|
98
|
+
disabled: !canAdmit || pending || !selected,
|
|
99
|
+
onClick: handleAdd,
|
|
100
|
+
"data-testid": "contactPicker.add"
|
|
101
|
+
})
|
|
102
|
+
]
|
|
103
|
+
}), joinUrl && /* @__PURE__ */ jsxs(Layout.Flex, {
|
|
104
|
+
gap: "sm",
|
|
105
|
+
children: [/* @__PURE__ */ jsx(Field.Root, {
|
|
106
|
+
readOnly: true,
|
|
107
|
+
children: /* @__PURE__ */ jsx(Input.Root, {
|
|
108
|
+
readOnly: true,
|
|
109
|
+
value: joinUrl,
|
|
110
|
+
"data-testid": "contactPicker.joinUrl"
|
|
111
|
+
})
|
|
112
|
+
}), /* @__PURE__ */ jsx(SystemButton.Clipboard, { value: joinUrl })]
|
|
113
|
+
})]
|
|
114
|
+
});
|
|
115
|
+
};
|
|
116
|
+
ContactPickerContainer.displayName = "ContactPickerContainer";
|
|
117
|
+
//#endregion
|
|
118
|
+
export { ContactPickerContainer as default };
|
|
119
|
+
|
|
120
|
+
//# sourceMappingURL=chunk-ContactPickerContainer.mjs.map
|