@oxy.so/core 1.12.1 → 1.16.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.
Files changed (92) hide show
  1. package/dist/cjs/.tsbuildinfo +1 -1
  2. package/dist/cjs/crypto/webIdentityCarrier.js +1 -1
  3. package/dist/cjs/i18n/locales/ar-SA.json +33 -88
  4. package/dist/cjs/i18n/locales/ca-ES.json +35 -90
  5. package/dist/cjs/i18n/locales/de-DE.json +33 -88
  6. package/dist/cjs/i18n/locales/en-US.json +45 -141
  7. package/dist/cjs/i18n/locales/es-ES.json +44 -140
  8. package/dist/cjs/i18n/locales/fr-FR.json +33 -88
  9. package/dist/cjs/i18n/locales/it-IT.json +33 -88
  10. package/dist/cjs/i18n/locales/ja-JP.json +33 -88
  11. package/dist/cjs/i18n/locales/ko-KR.json +33 -88
  12. package/dist/cjs/i18n/locales/locales/ar-SA.json +33 -88
  13. package/dist/cjs/i18n/locales/locales/ca-ES.json +35 -90
  14. package/dist/cjs/i18n/locales/locales/de-DE.json +33 -88
  15. package/dist/cjs/i18n/locales/locales/en-US.json +45 -141
  16. package/dist/cjs/i18n/locales/locales/es-ES.json +44 -140
  17. package/dist/cjs/i18n/locales/locales/fr-FR.json +33 -88
  18. package/dist/cjs/i18n/locales/locales/it-IT.json +33 -88
  19. package/dist/cjs/i18n/locales/locales/ja-JP.json +33 -88
  20. package/dist/cjs/i18n/locales/locales/ko-KR.json +33 -88
  21. package/dist/cjs/i18n/locales/locales/pt-PT.json +33 -88
  22. package/dist/cjs/i18n/locales/locales/zh-CN.json +34 -89
  23. package/dist/cjs/i18n/locales/pt-PT.json +33 -88
  24. package/dist/cjs/i18n/locales/zh-CN.json +34 -89
  25. package/dist/cjs/index.js +10 -7
  26. package/dist/cjs/mixins/OxyServices.utility.js +140 -0
  27. package/dist/cjs/server/securityHeaders.js +19 -1
  28. package/dist/cjs/session/accountDialogController.js +37 -142
  29. package/dist/cjs/utils/authWebUrl.js +7 -6
  30. package/dist/cjs/utils/oauthPkce.js +5 -1
  31. package/dist/esm/.tsbuildinfo +1 -1
  32. package/dist/esm/crypto/webIdentityCarrier.js +1 -1
  33. package/dist/esm/i18n/locales/ar-SA.json +33 -88
  34. package/dist/esm/i18n/locales/ca-ES.json +35 -90
  35. package/dist/esm/i18n/locales/de-DE.json +33 -88
  36. package/dist/esm/i18n/locales/en-US.json +45 -141
  37. package/dist/esm/i18n/locales/es-ES.json +44 -140
  38. package/dist/esm/i18n/locales/fr-FR.json +33 -88
  39. package/dist/esm/i18n/locales/it-IT.json +33 -88
  40. package/dist/esm/i18n/locales/ja-JP.json +33 -88
  41. package/dist/esm/i18n/locales/ko-KR.json +33 -88
  42. package/dist/esm/i18n/locales/locales/ar-SA.json +33 -88
  43. package/dist/esm/i18n/locales/locales/ca-ES.json +35 -90
  44. package/dist/esm/i18n/locales/locales/de-DE.json +33 -88
  45. package/dist/esm/i18n/locales/locales/en-US.json +45 -141
  46. package/dist/esm/i18n/locales/locales/es-ES.json +44 -140
  47. package/dist/esm/i18n/locales/locales/fr-FR.json +33 -88
  48. package/dist/esm/i18n/locales/locales/it-IT.json +33 -88
  49. package/dist/esm/i18n/locales/locales/ja-JP.json +33 -88
  50. package/dist/esm/i18n/locales/locales/ko-KR.json +33 -88
  51. package/dist/esm/i18n/locales/locales/pt-PT.json +33 -88
  52. package/dist/esm/i18n/locales/locales/zh-CN.json +34 -89
  53. package/dist/esm/i18n/locales/pt-PT.json +33 -88
  54. package/dist/esm/i18n/locales/zh-CN.json +34 -89
  55. package/dist/esm/index.js +2 -1
  56. package/dist/esm/mixins/OxyServices.utility.js +138 -0
  57. package/dist/esm/server/securityHeaders.js +19 -1
  58. package/dist/esm/session/accountDialogController.js +37 -142
  59. package/dist/esm/utils/authWebUrl.js +6 -5
  60. package/dist/esm/utils/oauthPkce.js +5 -1
  61. package/dist/types/.tsbuildinfo +1 -1
  62. package/dist/types/crypto/webIdentityCarrier.d.ts +1 -1
  63. package/dist/types/index.d.ts +5 -3
  64. package/dist/types/mixins/OxyServices.utility.d.ts +84 -1
  65. package/dist/types/server/requesterAssertion.d.ts +2 -2
  66. package/dist/types/server/securityHeaders.d.ts +9 -12
  67. package/dist/types/session/accountDialogController.d.ts +29 -98
  68. package/dist/types/utils/authWebUrl.d.ts +6 -5
  69. package/dist/types/utils/oauthPkce.d.ts +10 -0
  70. package/package.json +2 -2
  71. package/src/crypto/webIdentityCarrier.ts +1 -1
  72. package/src/i18n/locales/ar-SA.json +33 -88
  73. package/src/i18n/locales/ca-ES.json +35 -90
  74. package/src/i18n/locales/de-DE.json +33 -88
  75. package/src/i18n/locales/en-US.json +45 -141
  76. package/src/i18n/locales/es-ES.json +44 -140
  77. package/src/i18n/locales/fr-FR.json +33 -88
  78. package/src/i18n/locales/it-IT.json +33 -88
  79. package/src/i18n/locales/ja-JP.json +33 -88
  80. package/src/i18n/locales/ko-KR.json +33 -88
  81. package/src/i18n/locales/pt-PT.json +33 -88
  82. package/src/i18n/locales/zh-CN.json +34 -89
  83. package/src/index.ts +9 -3
  84. package/src/mixins/OxyServices.utility.ts +208 -0
  85. package/src/mixins/__tests__/accountEvents.test.ts +158 -0
  86. package/src/server/__tests__/securityHeaders.test.ts +17 -0
  87. package/src/server/securityHeaders.ts +29 -1
  88. package/src/session/__tests__/accountDialogController.test.ts +42 -184
  89. package/src/session/accountDialogController.ts +50 -185
  90. package/src/utils/__tests__/oauthPkce.test.ts +7 -0
  91. package/src/utils/authWebUrl.ts +6 -5
  92. package/src/utils/oauthPkce.ts +16 -1
@@ -1,53 +1,48 @@
1
1
  {
2
2
  "signin": {
3
3
  "title": "登录",
4
- "subtitle": "登录以继续",
5
- "addAccountTitle": "添加另一个账户",
4
+ "subtitle": "使用你的 Oxy 账号",
5
+ "addAccountTitle": "添加其他账号",
6
6
  "addAccountSubtitle": "使用另一个账户登录",
7
7
  "username": {
8
8
  "label": "用户名",
9
- "placeholder": "输入您的用户名",
10
- "helper": "3-30个字符,仅字母和数字",
11
- "required": "请输入您的用户名。",
12
- "minLength": "用户名必须至少包含3个字符。"
13
- },
14
- "password": {
15
- "label": "密码",
16
- "placeholder": "输入您的密码",
17
- "required": "请输入您的密码。",
18
- "hint": "输入您的密码以登录"
9
+ "placeholder": "yourname",
10
+ "required": "请输入您的用户名。"
19
11
  },
20
12
  "actions": {
21
13
  "continue": "继续",
22
- "back": "返回",
23
- "signIn": "登录",
24
- "verify": "验证",
25
- "openAccountSwitcher": "切换到另一个账户",
26
- "openAccountSwitcherSubtitle": "{{count}}个其他账户可用",
27
- "openAccountSwitcherSubtitle_singular": "1个其他账户可用",
28
- "openAccountSwitcherSubtitle_zero": "查看您保存的账户",
29
- "manageAccounts": "管理保存的账户",
30
- "manageAccountsSubtitle": "查看会话、删除或登出",
31
- "loadingOtherAccounts": "加载其他账户中…",
32
- "switchAccountFailed": "无法切换账户。请重试。"
33
- },
34
- "forgotPrompt": "忘记密码?",
35
- "security": {
36
- "dataSecure": "您的数据已加密且安全"
14
+ "back": "返回"
37
15
  },
38
- "currentlySignedInAs": "当前登录为",
39
- "alreadySignedInWith": "已登录",
40
- "alreadySignedIn": "已登录",
41
- "alreadySignedInMessage": "此账户已登录。继续使用此账户?",
42
- "continueWithAccount": "继续",
43
- "currentAccount": "当前",
44
- "or": "或",
45
- "viewAllAccounts": "查看更多{{count}}个",
46
16
  "createAccountLink": "初次使用 Oxy?创建账户",
47
17
  "status": {
48
- "accountSwitched": "正在使用{{name}}",
49
18
  "signingIn": "正在登录…"
50
- }
19
+ },
20
+ "subtitleToApp": "以继续前往 {{app}}",
21
+ "orContinueWith": "或使用以下方式继续",
22
+ "qr": {
23
+ "caption": "使用 Commons 扫码登录",
24
+ "renew": "显示新的二维码"
25
+ },
26
+ "methods": {
27
+ "passkey": "使用通行密钥登录"
28
+ },
29
+ "errors": {
30
+ "rateLimited": "尝试次数过多。请在 {{seconds}} 秒后重试。",
31
+ "passkeyCancelled": "通行密钥提示已关闭。准备好后请重试。",
32
+ "passkeyFailed": "无法完成通行密钥验证。请重试。"
33
+ },
34
+ "chooser": {
35
+ "subtitleToApp": "以继续前往 {{app}}"
36
+ },
37
+ "terms": {
38
+ "before": "继续即表示你同意我们的",
39
+ "termsLink": "服务条款",
40
+ "and": "和",
41
+ "privacyLink": "隐私政策"
42
+ },
43
+ "noAccount": "还没有账号?",
44
+ "createAccount": "创建账号",
45
+ "recoverLink": "丢失了通行密钥?恢复你的账号"
51
46
  },
52
47
  "signup": {
53
48
  "title": "创建您的账户",
@@ -55,56 +50,9 @@
55
50
  "createInCommons": "在 Commons 中创建您的身份",
56
51
  "createAccount": "创建账户",
57
52
  "backToSignInLink": "已有账户?登录",
58
- "welcome": {
59
- "title": "欢迎使用Oxy!",
60
- "subtitle": "只需几步即可创建您的账户",
61
- "haveAccount": "已有账户?",
62
- "signInCta": "登录"
63
- },
64
- "identity": {
65
- "title": "您是谁?",
66
- "subtitle": "选择您的用户名并输入您的电子邮件"
67
- },
68
- "username": {
69
- "helper": "3-30个字符,仅字母和数字",
70
- "required": "请输入用户名",
71
- "minLength": "用户名必须至少包含3个字符"
72
- },
73
- "email": {
74
- "required": "请输入电子邮件地址",
75
- "invalid": "请输入有效的电子邮件地址",
76
- "helper": "我们绝不会分享您的电子邮件"
77
- },
78
- "security": {
79
- "title": "保护您的账户",
80
- "subtitle": "创建强密码以保护您的账户"
81
- },
82
- "password": {
83
- "helper": "至少8个字符",
84
- "required": "请输入密码",
85
- "minLength": "密码必须至少包含8个字符",
86
- "confirmRequired": "请确认您的密码",
87
- "mismatch": "密码不匹配",
88
- "confirmHint": "重新输入您的密码以确认"
89
- },
90
- "summary": {
91
- "title": "快完成了!",
92
- "subtitle": "查看您的信息并创建账户",
93
- "sectionTitle": "账户信息",
94
- "fields": {
95
- "username": "用户名",
96
- "email": "电子邮件",
97
- "password": "密码"
98
- },
99
- "notSet": "未设置",
100
- "securityTip": "为了更强的安全性,创建账户后,请在账户设置中启用生物识别身份验证。",
101
- "legalReminder": "创建账户即表示您同意我们的服务条款和隐私政策。"
102
- }
53
+ "webSubtitle": "无需密码。你的设备会创建通行密钥,你的账号会获得一个只有你保管的恢复短语。"
103
54
  },
104
55
  "accountSwitcher": {
105
- "sections": {
106
- "yourAccounts": "你的账户"
107
- },
108
56
  "loading": "正在加载账户...",
109
57
  "qrHeadline": "使用您的 Oxy 身份登录",
110
58
  "signInWithOxy": "使用 Oxy 登录",
@@ -136,10 +84,7 @@
136
84
  "claimFailed": "登录已获批准,但未能完成。请重试。",
137
85
  "generic": "登录失败,请重试。"
138
86
  },
139
- "linkOpenFailed": "无法打开链接,请重试。",
140
- "continueWithPasskey": "继续",
141
- "passkeyHint": "使用指纹、面容或设备 PIN 码。",
142
- "otherDeviceCommons": "账号在其他设备上?用 Commons 扫码"
87
+ "linkOpenFailed": "无法打开链接,请重试。"
143
88
  },
144
89
  "common": {
145
90
  "actions": {
@@ -1,53 +1,48 @@
1
1
  {
2
2
  "signin": {
3
3
  "title": "Iniciar sessão",
4
- "subtitle": "Inicie sessão para continuar",
4
+ "subtitle": "Usa a tua conta Oxy",
5
5
  "addAccountTitle": "Adicionar outra conta",
6
6
  "addAccountSubtitle": "Iniciar sessão com outra conta",
7
7
  "username": {
8
8
  "label": "Nome de utilizador",
9
- "placeholder": "Introduza o seu nome de utilizador",
10
- "helper": "3-30 caracteres, apenas letras e números",
11
- "required": "Por favor, introduza o seu nome de utilizador.",
12
- "minLength": "O nome de utilizador deve ter pelo menos 3 caracteres."
13
- },
14
- "password": {
15
- "label": "Palavra-passe",
16
- "placeholder": "Introduza a sua palavra-passe",
17
- "required": "Por favor, introduza a sua palavra-passe.",
18
- "hint": "Introduza a sua palavra-passe para iniciar sessão"
9
+ "placeholder": "oteunome",
10
+ "required": "Por favor, introduza o seu nome de utilizador."
19
11
  },
20
12
  "actions": {
21
13
  "continue": "Continuar",
22
- "back": "Voltar",
23
- "signIn": "Iniciar sessão",
24
- "verify": "Verificar",
25
- "openAccountSwitcher": "Mudar para outra conta",
26
- "openAccountSwitcherSubtitle": "{{count}} outras contas disponíveis",
27
- "openAccountSwitcherSubtitle_singular": "1 outra conta disponível",
28
- "openAccountSwitcherSubtitle_zero": "Revise as suas contas guardadas",
29
- "manageAccounts": "Gerir contas guardadas",
30
- "manageAccountsSubtitle": "Rever sessões, remover ou terminar sessão",
31
- "loadingOtherAccounts": "A carregar outras contas…",
32
- "switchAccountFailed": "Não foi possível mudar de conta. Por favor, tente novamente."
14
+ "back": "Voltar"
33
15
  },
34
- "forgotPrompt": "Esqueceu-se da palavra-passe?",
35
- "security": {
36
- "dataSecure": "Os seus dados estão encriptados e seguros"
37
- },
38
- "currentlySignedInAs": "Atualmente com sessão iniciada como",
39
- "alreadySignedInWith": "Já tem sessão iniciada com",
40
- "alreadySignedIn": "Já tem sessão iniciada",
41
- "alreadySignedInMessage": "Esta conta já tem sessão iniciada. Continuar com esta conta?",
42
- "continueWithAccount": "Continuar",
43
- "currentAccount": "Atual",
44
- "or": "ou",
45
- "viewAllAccounts": "Ver mais {{count}}",
46
16
  "createAccountLink": "Novo no Oxy? Crie uma conta",
47
17
  "status": {
48
- "accountSwitched": "Agora a usar {{name}}",
49
18
  "signingIn": "A iniciar sessão…"
50
- }
19
+ },
20
+ "subtitleToApp": "para continuar para {{app}}",
21
+ "orContinueWith": "ou continua com",
22
+ "qr": {
23
+ "caption": "Lê com o Commons para entrar",
24
+ "renew": "Mostrar um código novo"
25
+ },
26
+ "methods": {
27
+ "passkey": "Entrar com uma chave de acesso"
28
+ },
29
+ "errors": {
30
+ "rateLimited": "Demasiadas tentativas. Tenta novamente dentro de {{seconds}} s.",
31
+ "passkeyCancelled": "Fechaste o pedido da chave de acesso. Tenta novamente quando quiseres.",
32
+ "passkeyFailed": "Não foi possível concluir a chave de acesso. Tenta novamente."
33
+ },
34
+ "chooser": {
35
+ "subtitleToApp": "para continuar para {{app}}"
36
+ },
37
+ "terms": {
38
+ "before": "Ao continuar, aceitas os nossos",
39
+ "termsLink": "Termos de serviço",
40
+ "and": "e a",
41
+ "privacyLink": "Política de privacidade"
42
+ },
43
+ "noAccount": "Não tens conta?",
44
+ "createAccount": "Criar conta",
45
+ "recoverLink": "Perdeste a chave de acesso? Recupera a tua conta"
51
46
  },
52
47
  "signup": {
53
48
  "title": "Crie a sua conta",
@@ -55,56 +50,9 @@
55
50
  "createInCommons": "Crie a sua identidade no Commons",
56
51
  "createAccount": "Criar conta",
57
52
  "backToSignInLink": "Já tem uma conta? Inicie sessão",
58
- "welcome": {
59
- "title": "Bem-vindo ao Oxy!",
60
- "subtitle": "Crie a sua conta em poucos passos",
61
- "haveAccount": "Já tem uma conta?",
62
- "signInCta": "Iniciar sessão"
63
- },
64
- "identity": {
65
- "title": "Quem é?",
66
- "subtitle": "Escolha o seu nome de utilizador e introduza o seu email"
67
- },
68
- "username": {
69
- "helper": "3-30 caracteres, apenas letras e números",
70
- "required": "Por favor, introduza um nome de utilizador",
71
- "minLength": "O nome de utilizador deve ter pelo menos 3 caracteres"
72
- },
73
- "email": {
74
- "required": "Por favor, introduza um endereço de email",
75
- "invalid": "Por favor, introduza um endereço de email válido",
76
- "helper": "Nunca partilharemos o seu email"
77
- },
78
- "security": {
79
- "title": "Proteja a sua conta",
80
- "subtitle": "Crie uma palavra-passe forte para proteger a sua conta"
81
- },
82
- "password": {
83
- "helper": "Pelo menos 8 caracteres",
84
- "required": "Por favor, introduza uma palavra-passe",
85
- "minLength": "A palavra-passe deve ter pelo menos 8 caracteres",
86
- "confirmRequired": "Por favor, confirme a sua palavra-passe",
87
- "mismatch": "As palavras-passe não coincidem",
88
- "confirmHint": "Reintroduza a sua palavra-passe para confirmar"
89
- },
90
- "summary": {
91
- "title": "Quase lá!",
92
- "subtitle": "Revise as suas informações e crie a sua conta",
93
- "sectionTitle": "Informações da conta",
94
- "fields": {
95
- "username": "Nome de utilizador",
96
- "email": "Email",
97
- "password": "Palavra-passe"
98
- },
99
- "notSet": "Não definido",
100
- "securityTip": "Para maior segurança, ative a autenticação biométrica nas Definições da conta após criar a sua conta.",
101
- "legalReminder": "Ao criar uma conta, concorda com os nossos Termos de Serviço e Política de Privacidade."
102
- }
53
+ "webSubtitle": "Sem palavra-passe. O teu dispositivo cria uma chave de acesso e a tua conta recebe uma frase de recuperação que só tu guardas."
103
54
  },
104
55
  "accountSwitcher": {
105
- "sections": {
106
- "yourAccounts": "As suas contas"
107
- },
108
56
  "loading": "A carregar contas...",
109
57
  "qrHeadline": "Inicie sessão com a sua identidade Oxy",
110
58
  "signInWithOxy": "Iniciar sessão com Oxy",
@@ -136,10 +84,7 @@
136
84
  "claimFailed": "O início de sessão foi aprovado, mas não conseguimos concluí-lo. Tente novamente.",
137
85
  "generic": "Não foi possível iniciar sessão. Tente novamente."
138
86
  },
139
- "linkOpenFailed": "Não foi possível abrir a ligação. Tente novamente.",
140
- "continueWithPasskey": "Continuar",
141
- "passkeyHint": "Use a impressão digital, o rosto ou o PIN do dispositivo.",
142
- "otherDeviceCommons": "Conta noutro dispositivo? Digitalize com o Commons"
87
+ "linkOpenFailed": "Não foi possível abrir a ligação. Tente novamente."
143
88
  },
144
89
  "common": {
145
90
  "actions": {
@@ -1,53 +1,48 @@
1
1
  {
2
2
  "signin": {
3
3
  "title": "登录",
4
- "subtitle": "登录以继续",
5
- "addAccountTitle": "添加另一个账户",
4
+ "subtitle": "使用你的 Oxy 账号",
5
+ "addAccountTitle": "添加其他账号",
6
6
  "addAccountSubtitle": "使用另一个账户登录",
7
7
  "username": {
8
8
  "label": "用户名",
9
- "placeholder": "输入您的用户名",
10
- "helper": "3-30个字符,仅字母和数字",
11
- "required": "请输入您的用户名。",
12
- "minLength": "用户名必须至少包含3个字符。"
13
- },
14
- "password": {
15
- "label": "密码",
16
- "placeholder": "输入您的密码",
17
- "required": "请输入您的密码。",
18
- "hint": "输入您的密码以登录"
9
+ "placeholder": "yourname",
10
+ "required": "请输入您的用户名。"
19
11
  },
20
12
  "actions": {
21
13
  "continue": "继续",
22
- "back": "返回",
23
- "signIn": "登录",
24
- "verify": "验证",
25
- "openAccountSwitcher": "切换到另一个账户",
26
- "openAccountSwitcherSubtitle": "{{count}}个其他账户可用",
27
- "openAccountSwitcherSubtitle_singular": "1个其他账户可用",
28
- "openAccountSwitcherSubtitle_zero": "查看您保存的账户",
29
- "manageAccounts": "管理保存的账户",
30
- "manageAccountsSubtitle": "查看会话、删除或登出",
31
- "loadingOtherAccounts": "加载其他账户中…",
32
- "switchAccountFailed": "无法切换账户。请重试。"
33
- },
34
- "forgotPrompt": "忘记密码?",
35
- "security": {
36
- "dataSecure": "您的数据已加密且安全"
14
+ "back": "返回"
37
15
  },
38
- "currentlySignedInAs": "当前登录为",
39
- "alreadySignedInWith": "已登录",
40
- "alreadySignedIn": "已登录",
41
- "alreadySignedInMessage": "此账户已登录。继续使用此账户?",
42
- "continueWithAccount": "继续",
43
- "currentAccount": "当前",
44
- "or": "或",
45
- "viewAllAccounts": "查看更多{{count}}个",
46
16
  "createAccountLink": "初次使用 Oxy?创建账户",
47
17
  "status": {
48
- "accountSwitched": "正在使用{{name}}",
49
18
  "signingIn": "正在登录…"
50
- }
19
+ },
20
+ "subtitleToApp": "以继续前往 {{app}}",
21
+ "orContinueWith": "或使用以下方式继续",
22
+ "qr": {
23
+ "caption": "使用 Commons 扫码登录",
24
+ "renew": "显示新的二维码"
25
+ },
26
+ "methods": {
27
+ "passkey": "使用通行密钥登录"
28
+ },
29
+ "errors": {
30
+ "rateLimited": "尝试次数过多。请在 {{seconds}} 秒后重试。",
31
+ "passkeyCancelled": "通行密钥提示已关闭。准备好后请重试。",
32
+ "passkeyFailed": "无法完成通行密钥验证。请重试。"
33
+ },
34
+ "chooser": {
35
+ "subtitleToApp": "以继续前往 {{app}}"
36
+ },
37
+ "terms": {
38
+ "before": "继续即表示你同意我们的",
39
+ "termsLink": "服务条款",
40
+ "and": "和",
41
+ "privacyLink": "隐私政策"
42
+ },
43
+ "noAccount": "还没有账号?",
44
+ "createAccount": "创建账号",
45
+ "recoverLink": "丢失了通行密钥?恢复你的账号"
51
46
  },
52
47
  "signup": {
53
48
  "title": "创建您的账户",
@@ -55,56 +50,9 @@
55
50
  "createInCommons": "在 Commons 中创建您的身份",
56
51
  "createAccount": "创建账户",
57
52
  "backToSignInLink": "已有账户?登录",
58
- "welcome": {
59
- "title": "欢迎使用Oxy!",
60
- "subtitle": "只需几步即可创建您的账户",
61
- "haveAccount": "已有账户?",
62
- "signInCta": "登录"
63
- },
64
- "identity": {
65
- "title": "您是谁?",
66
- "subtitle": "选择您的用户名并输入您的电子邮件"
67
- },
68
- "username": {
69
- "helper": "3-30个字符,仅字母和数字",
70
- "required": "请输入用户名",
71
- "minLength": "用户名必须至少包含3个字符"
72
- },
73
- "email": {
74
- "required": "请输入电子邮件地址",
75
- "invalid": "请输入有效的电子邮件地址",
76
- "helper": "我们绝不会分享您的电子邮件"
77
- },
78
- "security": {
79
- "title": "保护您的账户",
80
- "subtitle": "创建强密码以保护您的账户"
81
- },
82
- "password": {
83
- "helper": "至少8个字符",
84
- "required": "请输入密码",
85
- "minLength": "密码必须至少包含8个字符",
86
- "confirmRequired": "请确认您的密码",
87
- "mismatch": "密码不匹配",
88
- "confirmHint": "重新输入您的密码以确认"
89
- },
90
- "summary": {
91
- "title": "快完成了!",
92
- "subtitle": "查看您的信息并创建账户",
93
- "sectionTitle": "账户信息",
94
- "fields": {
95
- "username": "用户名",
96
- "email": "电子邮件",
97
- "password": "密码"
98
- },
99
- "notSet": "未设置",
100
- "securityTip": "为了更强的安全性,创建账户后,请在账户设置中启用生物识别身份验证。",
101
- "legalReminder": "创建账户即表示您同意我们的服务条款和隐私政策。"
102
- }
53
+ "webSubtitle": "无需密码。你的设备会创建通行密钥,你的账号会获得一个只有你保管的恢复短语。"
103
54
  },
104
55
  "accountSwitcher": {
105
- "sections": {
106
- "yourAccounts": "你的账户"
107
- },
108
56
  "loading": "正在加载账户...",
109
57
  "qrHeadline": "使用您的 Oxy 身份登录",
110
58
  "signInWithOxy": "使用 Oxy 登录",
@@ -136,10 +84,7 @@
136
84
  "claimFailed": "登录已获批准,但未能完成。请重试。",
137
85
  "generic": "登录失败,请重试。"
138
86
  },
139
- "linkOpenFailed": "无法打开链接,请重试。",
140
- "continueWithPasskey": "继续",
141
- "passkeyHint": "使用指纹、面容或设备 PIN 码。",
142
- "otherDeviceCommons": "账号在其他设备上?用 Commons 扫码"
87
+ "linkOpenFailed": "无法打开链接,请重试。"
143
88
  },
144
89
  "common": {
145
90
  "actions": {
package/dist/cjs/index.js CHANGED
@@ -18,12 +18,12 @@
18
18
  * If a symbol does not appear here, it is NOT part of the public API.
19
19
  */
20
20
  Object.defineProperty(exports, "__esModule", { value: true });
21
- exports.AEAD_KEY_LENGTH = exports.decryptAead = exports.encryptAead = exports.hkdfSha256 = exports.RecoveryPhraseService = exports.SignatureService = exports.updateIdentityMarker = exports.readIdentityMarker = exports.IdentityUnavailableError = exports.IdentityPersistError = exports.IdentityAlreadyExistsError = exports.KeyManager = exports.sessionsArraysEqual = exports.normalizeAndSortSessions = exports.mergeSessions = exports.authenticatedApiCall = exports.withAuthErrorHandling = exports.isAuthenticationError = exports.ensureValidToken = exports.AuthenticationFailedError = exports.SessionSyncRequiredError = exports.verifyPublicCardAttestation = exports.parseAttestPayload = exports.parseIdPayload = exports.buildUserDid = exports.kindAcceptsAccountCategories = exports.isSelectableAccountCategoryId = exports.SELECTABLE_ACCOUNT_CATEGORY_IDS = exports.MAX_ACCOUNT_CATEGORIES = exports.ACCOUNT_CATEGORY_IDS = exports.normalizeProfileLinks = exports.getNormalizedUserHandle = exports.getCanonicalUserHandle = exports.normalizeUserIdentityOrNull = exports.normalizeUserIdentity = exports.getNormalizedUserId = exports.OxyAppDataIdentifierError = exports.commonsDeliveryPlatform = exports.pushTargetsFromDelivery = exports.selectCommonsDelivery = exports.parseCommonsApprovalExpiresAt = exports.getCommonsApprovalBlockingReason = exports.ServiceCredentialMismatchError = exports.oxyClient = exports.OXY_CLOUD_URL = exports.ServiceAssetMetadataError = exports.OxyAuthenticationTimeoutError = exports.OxyAuthenticationError = exports.AssetUrlResolutionError = exports.OxyServices = void 0;
22
- exports.isRTLLocale = exports.getNativeLanguageName = exports.getLanguageName = exports.getLanguageMetadata = exports.isSupportedLocale = exports.normalizeLocale = exports.getBaseLanguage = exports.FALLBACK_LOCALE = exports.SUPPORTED_LANGUAGES = exports.TopicSource = exports.TopicType = exports.SECURITY_EVENT_SEVERITY_MAP = exports.DeviceManager = exports.verifyMoveReceipt = exports.verifyMoveCommitment = exports.signMoveReceipt = exports.sealIdentityForMove = exports.parseMoveQrPayload = exports.openMovedIdentity = exports.generateMoveEphemeralKeyPair = exports.digestMoveCiphertext = exports.deriveMoveSas = exports.deriveMoveKey = exports.createMoveCommitment = exports.buildMoveQrPayload = exports.signIdentityProof = exports.digestIdentityPayload = exports.wipeOpenedIdentity = exports.wipeBytes = exports.unwrapDataKey = exports.unlockWebIdentity = exports.sealWebIdentity = exports.removeWrap = exports.parseRecoveryMaterial = exports.openWebIdentity = exports.normalizeMnemonic = exports.markWrapVerified = exports.isUsablePrfOutput = exports.generateWebIdentity = exports.generateDataKey = exports.deriveKeyEncryptionKey = exports.deriveIdentityFromRecoveryMaterial = exports.deriveIdentityFromPrivateKey = exports.deriveIdentityFromMnemonic = exports.addWrap = exports.WEB_IDENTITY_PRF_OUTPUT_LENGTH = exports.WebIdentityUnlockError = exports.WEB_IDENTITY_PRF_INPUT = exports.deriveSharedSecret = exports.AEAD_NONCE_LENGTH = void 0;
23
- exports.buildPaginationParams = exports.buildUrl = exports.buildSearchParams = exports.buildQueryParams = exports.trustTierLabel = exports.reputationCategoryLabel = exports.accountRoleLabel = exports.accountCategoryLabel = exports.translate = exports.withRetry = exports.delay = exports.shouldAllowRequest = exports.recordSuccess = exports.recordFailure = exports.calculateBackoffInterval = exports.createCircuitBreakerState = exports.DEFAULT_CIRCUIT_BREAKER_CONFIG = exports.isRetryableError = exports.isNetworkError = exports.isServerError = exports.isRateLimitError = exports.isNotFoundError = exports.isForbiddenError = exports.isUnauthorizedError = exports.isAlreadyRegisteredError = exports.getErrorMessage = exports.getErrorStatus = exports.HttpStatus = exports.getSystemColorScheme = exports.systemPrefersDarkMode = exports.getOppositeTheme = exports.normalizeColorScheme = exports.normalizeTheme = exports.getContrastTextColor = exports.isLightColor = exports.withOpacity = exports.rgbToHex = exports.hexToRgb = exports.lightenColor = exports.darkenColor = exports.isWebBrowser = exports.isAndroid = exports.isIOS = exports.isNative = exports.isWeb = exports.setPlatformOS = exports.getPlatformOS = exports.coerceToSupportedLocale = exports.getPrimaryLanguage = exports.getUserLanguages = void 0;
24
- exports.registrableApex = exports.getAccountColor = exports.formatPublicKeyHandle = exports.getAccountFallbackHandle = exports.getAccountDisplayName = exports.createQuickAccount = exports.buildAccountsArray = exports.updateAvatarVisibility = exports.isDev = exports.consoleSink = exports.resetLoggerConfig = exports.getLoggerConfig = exports.configureLogger = exports.createLogger = exports.logger = exports.normalizeMultilineText = exports.normalizeInlineText = exports.validateAndSanitizeUserInput = exports.isValidObjectId = exports.sanitizeHTML = exports.sanitizeString = exports.isValidFileType = exports.isValidFileSize = exports.isValidDate = exports.isValidURL = exports.isValidUUID = exports.isValidObject = exports.isValidArray = exports.isRequiredBoolean = exports.isRequiredNumber = exports.isRequiredString = exports.DISPLAY_NAME_UNFLANKED_SEPARATOR_SOURCE = exports.DISPLAY_NAME_ORPHANED_MARK_SOURCE = exports.DISPLAY_NAME_DISALLOWED_SOURCE = exports.DISPLAY_NAME_ALLOWED_SCRIPTS = exports.isValidDisplayName = exports.isValidPassword = exports.isValidEmail = exports.DISPLAY_NAME_INVALID_MESSAGE = exports.MAX_DISPLAY_NAME_LENGTH = exports.PASSWORD_REGEX = exports.EMAIL_REGEX = exports.retryAsync = exports.validateRequiredFields = exports.parseHttpErrorBody = exports.isHttpRequestError = exports.handleHttpError = exports.createApiError = exports.ErrorCodes = exports.safeJsonParse = void 0;
25
- exports.decideSharedDeviceJoin = exports.createSharedMirroringAuthStateStore = exports.AUTH_STATE_STORAGE_KEY = exports.createMemoryAuthStateStore = exports.createNativeAuthStateStore = exports.createWebAuthStateStore = exports.createAccountDialogController = exports.AccountDialogController = exports.resolveAccountDelegationAccess = exports.canSwitchIntoAccount = exports.isSwitchTargetAccount = exports.showsPrincipalHeaders = exports.buildSwitcherRows = exports.resolveDeviceContext = exports.resolveActiveContext = exports.projectDevicePrincipals = exports.directoryHandle = exports.directoryDisplayName = exports.canActivateContext = exports.accountIdsOf = exports.activeUserOf = exports.activeSessionIdOf = exports.deviceStateToClientSessions = exports.createSessionClient = exports.createSessionClientHost = exports.SessionClient = exports.isAllowedDeviceJoinOrigin = exports.isOfficialWebOrigin = exports.isLoopbackOrigin = exports.consumeOAuthReturnPath = exports.persistOAuthReturnPath = exports.clearOAuthHandshake = exports.readOAuthHandshake = exports.persistOAuthHandshake = exports.canonicalizeOAuthRedirectUri = exports.normalizeOAuthRedirectUri = exports.OXY_OAUTH_RETURN_PATH_STORAGE_KEY = exports.OXY_OAUTH_REDIRECT_URI_STORAGE_KEY = exports.OXY_OAUTH_CODE_VERIFIER_STORAGE_KEY = exports.OXY_OAUTH_STATE_STORAGE_KEY = exports.OXY_AUTHORIZE_URL = exports.DEFAULT_OAUTH_SCOPE = exports.generatePkcePair = exports.generateOAuthState = exports.computeCodeChallenge = exports.buildOAuthAuthorizeUrl = exports.runColdBoot = exports.isOxyRpOrigin = exports.IDENTITY_WEB_ORIGIN = exports.CENTRAL_IDP_APEX = void 0;
26
- exports.packageInfo = exports.runSessionColdBoot = exports.OXY_INFERENCE_BASE_URL = exports.OxyInferenceProtocolError = exports.OxyInferenceError = exports.OxyInferenceClient = exports.TOKEN_REFRESH_LEAD_MS = exports.startTokenRefreshScheduler = exports.installAuthRefreshHandler = exports.createAuthRefreshHandler = exports.refreshDeviceSecretArm = exports.refreshPersistedSession = exports.AccountNotOnDeviceError = exports.establishIdentitySession = exports.resolveIdentityPin = exports.IDENTITY_PIN_STORAGE_KEY = exports.identityPinMatches = exports.createMemoryIdentityPinStore = exports.createNativeIdentityPinStore = exports.createWebIdentityPinStore = exports.readLocalDeviceCredential = exports.publishProvenDeviceCredential = exports.normalizeSharedDeviceSessionRead = exports.decideSharedDevicePublish = void 0;
21
+ exports.encryptAead = exports.hkdfSha256 = exports.RecoveryPhraseService = exports.SignatureService = exports.updateIdentityMarker = exports.readIdentityMarker = exports.IdentityUnavailableError = exports.IdentityPersistError = exports.IdentityAlreadyExistsError = exports.KeyManager = exports.sessionsArraysEqual = exports.normalizeAndSortSessions = exports.mergeSessions = exports.authenticatedApiCall = exports.withAuthErrorHandling = exports.isAuthenticationError = exports.ensureValidToken = exports.AuthenticationFailedError = exports.SessionSyncRequiredError = exports.verifyPublicCardAttestation = exports.parseAttestPayload = exports.parseIdPayload = exports.buildUserDid = exports.kindAcceptsAccountCategories = exports.isSelectableAccountCategoryId = exports.SELECTABLE_ACCOUNT_CATEGORY_IDS = exports.MAX_ACCOUNT_CATEGORIES = exports.ACCOUNT_CATEGORY_IDS = exports.normalizeProfileLinks = exports.getNormalizedUserHandle = exports.getCanonicalUserHandle = exports.normalizeUserIdentityOrNull = exports.normalizeUserIdentity = exports.getNormalizedUserId = exports.OxyAppDataIdentifierError = exports.OXY_ACCOUNT_DELETED_EVENT_URI = exports.OxyAccountEventError = exports.commonsDeliveryPlatform = exports.pushTargetsFromDelivery = exports.selectCommonsDelivery = exports.parseCommonsApprovalExpiresAt = exports.getCommonsApprovalBlockingReason = exports.ServiceCredentialMismatchError = exports.oxyClient = exports.OXY_CLOUD_URL = exports.ServiceAssetMetadataError = exports.OxyAuthenticationTimeoutError = exports.OxyAuthenticationError = exports.AssetUrlResolutionError = exports.OxyServices = void 0;
22
+ exports.getLanguageName = exports.getLanguageMetadata = exports.isSupportedLocale = exports.normalizeLocale = exports.getBaseLanguage = exports.FALLBACK_LOCALE = exports.SUPPORTED_LANGUAGES = exports.TopicSource = exports.TopicType = exports.SECURITY_EVENT_SEVERITY_MAP = exports.DeviceManager = exports.verifyMoveReceipt = exports.verifyMoveCommitment = exports.signMoveReceipt = exports.sealIdentityForMove = exports.parseMoveQrPayload = exports.openMovedIdentity = exports.generateMoveEphemeralKeyPair = exports.digestMoveCiphertext = exports.deriveMoveSas = exports.deriveMoveKey = exports.createMoveCommitment = exports.buildMoveQrPayload = exports.signIdentityProof = exports.digestIdentityPayload = exports.wipeOpenedIdentity = exports.wipeBytes = exports.unwrapDataKey = exports.unlockWebIdentity = exports.sealWebIdentity = exports.removeWrap = exports.parseRecoveryMaterial = exports.openWebIdentity = exports.normalizeMnemonic = exports.markWrapVerified = exports.isUsablePrfOutput = exports.generateWebIdentity = exports.generateDataKey = exports.deriveKeyEncryptionKey = exports.deriveIdentityFromRecoveryMaterial = exports.deriveIdentityFromPrivateKey = exports.deriveIdentityFromMnemonic = exports.addWrap = exports.WEB_IDENTITY_PRF_OUTPUT_LENGTH = exports.WebIdentityUnlockError = exports.WEB_IDENTITY_PRF_INPUT = exports.deriveSharedSecret = exports.AEAD_NONCE_LENGTH = exports.AEAD_KEY_LENGTH = exports.decryptAead = void 0;
23
+ exports.buildSearchParams = exports.buildQueryParams = exports.trustTierLabel = exports.reputationCategoryLabel = exports.accountRoleLabel = exports.accountCategoryLabel = exports.translate = exports.withRetry = exports.delay = exports.shouldAllowRequest = exports.recordSuccess = exports.recordFailure = exports.calculateBackoffInterval = exports.createCircuitBreakerState = exports.DEFAULT_CIRCUIT_BREAKER_CONFIG = exports.isRetryableError = exports.isNetworkError = exports.isServerError = exports.isRateLimitError = exports.isNotFoundError = exports.isForbiddenError = exports.isUnauthorizedError = exports.isAlreadyRegisteredError = exports.getErrorMessage = exports.getErrorStatus = exports.HttpStatus = exports.getSystemColorScheme = exports.systemPrefersDarkMode = exports.getOppositeTheme = exports.normalizeColorScheme = exports.normalizeTheme = exports.getContrastTextColor = exports.isLightColor = exports.withOpacity = exports.rgbToHex = exports.hexToRgb = exports.lightenColor = exports.darkenColor = exports.isWebBrowser = exports.isAndroid = exports.isIOS = exports.isNative = exports.isWeb = exports.setPlatformOS = exports.getPlatformOS = exports.coerceToSupportedLocale = exports.getPrimaryLanguage = exports.getUserLanguages = exports.isRTLLocale = exports.getNativeLanguageName = void 0;
24
+ exports.formatPublicKeyHandle = exports.getAccountFallbackHandle = exports.getAccountDisplayName = exports.createQuickAccount = exports.buildAccountsArray = exports.updateAvatarVisibility = exports.isDev = exports.consoleSink = exports.resetLoggerConfig = exports.getLoggerConfig = exports.configureLogger = exports.createLogger = exports.logger = exports.normalizeMultilineText = exports.normalizeInlineText = exports.validateAndSanitizeUserInput = exports.isValidObjectId = exports.sanitizeHTML = exports.sanitizeString = exports.isValidFileType = exports.isValidFileSize = exports.isValidDate = exports.isValidURL = exports.isValidUUID = exports.isValidObject = exports.isValidArray = exports.isRequiredBoolean = exports.isRequiredNumber = exports.isRequiredString = exports.DISPLAY_NAME_UNFLANKED_SEPARATOR_SOURCE = exports.DISPLAY_NAME_ORPHANED_MARK_SOURCE = exports.DISPLAY_NAME_DISALLOWED_SOURCE = exports.DISPLAY_NAME_ALLOWED_SCRIPTS = exports.isValidDisplayName = exports.isValidPassword = exports.isValidEmail = exports.DISPLAY_NAME_INVALID_MESSAGE = exports.MAX_DISPLAY_NAME_LENGTH = exports.PASSWORD_REGEX = exports.EMAIL_REGEX = exports.retryAsync = exports.validateRequiredFields = exports.parseHttpErrorBody = exports.isHttpRequestError = exports.handleHttpError = exports.createApiError = exports.ErrorCodes = exports.safeJsonParse = exports.buildPaginationParams = exports.buildUrl = void 0;
25
+ exports.AUTH_STATE_STORAGE_KEY = exports.createMemoryAuthStateStore = exports.createNativeAuthStateStore = exports.createWebAuthStateStore = exports.createAccountDialogController = exports.AccountDialogController = exports.resolveAccountDelegationAccess = exports.canSwitchIntoAccount = exports.isSwitchTargetAccount = exports.showsPrincipalHeaders = exports.buildSwitcherRows = exports.resolveDeviceContext = exports.resolveActiveContext = exports.projectDevicePrincipals = exports.directoryHandle = exports.directoryDisplayName = exports.canActivateContext = exports.accountIdsOf = exports.activeUserOf = exports.activeSessionIdOf = exports.deviceStateToClientSessions = exports.createSessionClient = exports.createSessionClientHost = exports.SessionClient = exports.isAllowedDeviceJoinOrigin = exports.isOfficialWebOrigin = exports.isLoopbackOrigin = exports.consumeOAuthReturnPath = exports.persistOAuthReturnPath = exports.clearOAuthHandshake = exports.readOAuthHandshake = exports.persistOAuthHandshake = exports.canonicalizeOAuthRedirectUri = exports.normalizeOAuthRedirectUri = exports.OXY_OAUTH_RETURN_PATH_STORAGE_KEY = exports.OXY_OAUTH_REDIRECT_URI_STORAGE_KEY = exports.OXY_OAUTH_CODE_VERIFIER_STORAGE_KEY = exports.OXY_OAUTH_STATE_STORAGE_KEY = exports.OXY_AUTHORIZE_URL = exports.DEFAULT_OAUTH_SCOPE = exports.generatePkcePair = exports.generateOAuthState = exports.computeCodeChallenge = exports.buildOAuthAuthorizeUrl = exports.runColdBoot = exports.isOxyRpOrigin = exports.CENTRAL_IDP_APEX = exports.AUTH_WEB_ORIGIN = exports.registrableApex = exports.getAccountColor = void 0;
26
+ exports.packageInfo = exports.runSessionColdBoot = exports.OXY_INFERENCE_BASE_URL = exports.OxyInferenceProtocolError = exports.OxyInferenceError = exports.OxyInferenceClient = exports.TOKEN_REFRESH_LEAD_MS = exports.startTokenRefreshScheduler = exports.installAuthRefreshHandler = exports.createAuthRefreshHandler = exports.refreshDeviceSecretArm = exports.refreshPersistedSession = exports.AccountNotOnDeviceError = exports.establishIdentitySession = exports.resolveIdentityPin = exports.IDENTITY_PIN_STORAGE_KEY = exports.identityPinMatches = exports.createMemoryIdentityPinStore = exports.createNativeIdentityPinStore = exports.createWebIdentityPinStore = exports.readLocalDeviceCredential = exports.publishProvenDeviceCredential = exports.normalizeSharedDeviceSessionRead = exports.decideSharedDevicePublish = exports.decideSharedDeviceJoin = exports.createSharedMirroringAuthStateStore = void 0;
27
27
  // Ensure crypto polyfills are loaded before anything else. This MUST stay the
28
28
  // first import: `@noble/hashes` captures `globalThis.crypto` when it is
29
29
  // evaluated, so the shim has to exist before any module below reaches it (see
@@ -55,6 +55,9 @@ var commonsDelivery_1 = require("./utils/commonsDelivery");
55
55
  Object.defineProperty(exports, "selectCommonsDelivery", { enumerable: true, get: function () { return commonsDelivery_1.selectCommonsDelivery; } });
56
56
  Object.defineProperty(exports, "pushTargetsFromDelivery", { enumerable: true, get: function () { return commonsDelivery_1.pushTargetsFromDelivery; } });
57
57
  Object.defineProperty(exports, "commonsDeliveryPlatform", { enumerable: true, get: function () { return commonsDelivery_1.commonsDeliveryPlatform; } });
58
+ var OxyServices_utility_1 = require("./mixins/OxyServices.utility");
59
+ Object.defineProperty(exports, "OxyAccountEventError", { enumerable: true, get: function () { return OxyServices_utility_1.OxyAccountEventError; } });
60
+ Object.defineProperty(exports, "OXY_ACCOUNT_DELETED_EVENT_URI", { enumerable: true, get: function () { return OxyServices_utility_1.OXY_ACCOUNT_DELETED_EVENT_URI; } });
58
61
  var OxyServices_appData_1 = require("./mixins/OxyServices.appData");
59
62
  Object.defineProperty(exports, "OxyAppDataIdentifierError", { enumerable: true, get: function () { return OxyServices_appData_1.OxyAppDataIdentifierError; } });
60
63
  // ---------------------------------------------------------------------------
@@ -366,8 +369,8 @@ Object.defineProperty(exports, "getAccountColor", { enumerable: true, get: funct
366
369
  var registrableApex_1 = require("./utils/registrableApex");
367
370
  Object.defineProperty(exports, "registrableApex", { enumerable: true, get: function () { return registrableApex_1.registrableApex; } });
368
371
  var authWebUrl_1 = require("./utils/authWebUrl");
372
+ Object.defineProperty(exports, "AUTH_WEB_ORIGIN", { enumerable: true, get: function () { return authWebUrl_1.AUTH_WEB_ORIGIN; } });
369
373
  Object.defineProperty(exports, "CENTRAL_IDP_APEX", { enumerable: true, get: function () { return authWebUrl_1.CENTRAL_IDP_APEX; } });
370
- Object.defineProperty(exports, "IDENTITY_WEB_ORIGIN", { enumerable: true, get: function () { return authWebUrl_1.IDENTITY_WEB_ORIGIN; } });
371
374
  // WebAuthn relying-party origin guard (client side). Mirrors the server's
372
375
  // `isOxyApexOrigin` so consumers can decide whether to offer passkey UI on the
373
376
  // current page (first-party Oxy origin / loopback only).