@oxyhq/core 12.1.1 → 12.2.1

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 (66) hide show
  1. package/dist/cjs/.tsbuildinfo +1 -1
  2. package/dist/cjs/i18n/locales/ar-SA.json +4 -1
  3. package/dist/cjs/i18n/locales/ca-ES.json +4 -1
  4. package/dist/cjs/i18n/locales/de-DE.json +4 -1
  5. package/dist/cjs/i18n/locales/en-US.json +4 -1
  6. package/dist/cjs/i18n/locales/es-ES.json +4 -1
  7. package/dist/cjs/i18n/locales/fr-FR.json +4 -1
  8. package/dist/cjs/i18n/locales/it-IT.json +4 -1
  9. package/dist/cjs/i18n/locales/ja-JP.json +4 -1
  10. package/dist/cjs/i18n/locales/ko-KR.json +4 -1
  11. package/dist/cjs/i18n/locales/locales/ar-SA.json +4 -1
  12. package/dist/cjs/i18n/locales/locales/ca-ES.json +4 -1
  13. package/dist/cjs/i18n/locales/locales/de-DE.json +4 -1
  14. package/dist/cjs/i18n/locales/locales/en-US.json +4 -1
  15. package/dist/cjs/i18n/locales/locales/es-ES.json +4 -1
  16. package/dist/cjs/i18n/locales/locales/fr-FR.json +4 -1
  17. package/dist/cjs/i18n/locales/locales/it-IT.json +4 -1
  18. package/dist/cjs/i18n/locales/locales/ja-JP.json +4 -1
  19. package/dist/cjs/i18n/locales/locales/ko-KR.json +4 -1
  20. package/dist/cjs/i18n/locales/locales/pt-PT.json +4 -1
  21. package/dist/cjs/i18n/locales/locales/zh-CN.json +4 -1
  22. package/dist/cjs/i18n/locales/pt-PT.json +4 -1
  23. package/dist/cjs/i18n/locales/zh-CN.json +4 -1
  24. package/dist/cjs/session/accountDialogController.js +112 -2
  25. package/dist/esm/.tsbuildinfo +1 -1
  26. package/dist/esm/i18n/locales/ar-SA.json +4 -1
  27. package/dist/esm/i18n/locales/ca-ES.json +4 -1
  28. package/dist/esm/i18n/locales/de-DE.json +4 -1
  29. package/dist/esm/i18n/locales/en-US.json +4 -1
  30. package/dist/esm/i18n/locales/es-ES.json +4 -1
  31. package/dist/esm/i18n/locales/fr-FR.json +4 -1
  32. package/dist/esm/i18n/locales/it-IT.json +4 -1
  33. package/dist/esm/i18n/locales/ja-JP.json +4 -1
  34. package/dist/esm/i18n/locales/ko-KR.json +4 -1
  35. package/dist/esm/i18n/locales/locales/ar-SA.json +4 -1
  36. package/dist/esm/i18n/locales/locales/ca-ES.json +4 -1
  37. package/dist/esm/i18n/locales/locales/de-DE.json +4 -1
  38. package/dist/esm/i18n/locales/locales/en-US.json +4 -1
  39. package/dist/esm/i18n/locales/locales/es-ES.json +4 -1
  40. package/dist/esm/i18n/locales/locales/fr-FR.json +4 -1
  41. package/dist/esm/i18n/locales/locales/it-IT.json +4 -1
  42. package/dist/esm/i18n/locales/locales/ja-JP.json +4 -1
  43. package/dist/esm/i18n/locales/locales/ko-KR.json +4 -1
  44. package/dist/esm/i18n/locales/locales/pt-PT.json +4 -1
  45. package/dist/esm/i18n/locales/locales/zh-CN.json +4 -1
  46. package/dist/esm/i18n/locales/pt-PT.json +4 -1
  47. package/dist/esm/i18n/locales/zh-CN.json +4 -1
  48. package/dist/esm/session/accountDialogController.js +112 -2
  49. package/dist/types/.tsbuildinfo +1 -1
  50. package/dist/types/index.d.ts +1 -1
  51. package/dist/types/session/accountDialogController.d.ts +81 -1
  52. package/package.json +4 -4
  53. package/src/i18n/locales/ar-SA.json +4 -1
  54. package/src/i18n/locales/ca-ES.json +4 -1
  55. package/src/i18n/locales/de-DE.json +4 -1
  56. package/src/i18n/locales/en-US.json +4 -1
  57. package/src/i18n/locales/es-ES.json +4 -1
  58. package/src/i18n/locales/fr-FR.json +4 -1
  59. package/src/i18n/locales/it-IT.json +4 -1
  60. package/src/i18n/locales/ja-JP.json +4 -1
  61. package/src/i18n/locales/ko-KR.json +4 -1
  62. package/src/i18n/locales/pt-PT.json +4 -1
  63. package/src/i18n/locales/zh-CN.json +4 -1
  64. package/src/index.ts +1 -0
  65. package/src/session/__tests__/accountDialogController.test.ts +133 -1
  66. package/src/session/accountDialogController.ts +145 -2
@@ -50,6 +50,8 @@
50
50
  }
51
51
  },
52
52
  "signup": {
53
+ "title": "أنشئ حسابك",
54
+ "subtitle": "هوية واحدة لكل النظام البيئي.",
53
55
  "commonsHeadline": "أنشئ هويتك في Commons",
54
56
  "commonsExplainer": "‏Commons هي هوية Oxy الخاصة بك بحفظ ذاتي كامل — تطبيق واحد يعمل في كل مكان.",
55
57
  "createInCommons": "أنشئ هويتك في Commons",
@@ -61,7 +63,8 @@
61
63
  "usernameAvailable": "متاح",
62
64
  "usernameTaken": "اسم المستخدم هذا مستخدم بالفعل",
63
65
  "backToSignInLink": "لديك حساب بالفعل؟ سجّل الدخول",
64
- "notAvailableHere": "‏إنشاء الحساب غير متاح في هذا التطبيق بعد أنشئ هويتك باستخدام Commons، أو تفضّل بزيارة oxy.so للتسجيل باستخدام مفتاح مرور.",
66
+ "hubExplainer": "أنشئ هوية Oxy الخاصة بك في نافذة آمنة، ثم عد إلى هنا مباشرة.",
67
+ "continueInWindow": "المتابعة في نافذة جديدة",
65
68
  "welcome": {
66
69
  "title": "مرحبًا بك في Oxy!",
67
70
  "subtitle": "أنشئ حسابك في خطوات قليلة",
@@ -50,6 +50,8 @@
50
50
  }
51
51
  },
52
52
  "signup": {
53
+ "title": "Crea el teu compte",
54
+ "subtitle": "Una identitat per a tot l'ecosistema.",
53
55
  "commonsHeadline": "Crea la teva identitat a Commons",
54
56
  "commonsExplainer": "Commons és la teva identitat d'Oxy amb autocustòdia completa: una app que funciona a tot arreu.",
55
57
  "createInCommons": "Crea la teva identitat a Commons",
@@ -61,7 +63,8 @@
61
63
  "usernameAvailable": "Disponible",
62
64
  "usernameTaken": "Aquest nom d'usuari ja està en ús",
63
65
  "backToSignInLink": "Ja tens compte? Inicia sessió",
64
- "notAvailableHere": "La creació de comptes encara no està disponible en aquesta app: crea la teva identitat amb Commons o visita oxy.so per registrar-te amb una clau d'accés.",
66
+ "hubExplainer": "Crea la teva Oxy ID en una finestra segura i torna de seguida.",
67
+ "continueInWindow": "Continua en una finestra nova",
65
68
  "welcome": {
66
69
  "title": "Benvingut a Oxy!",
67
70
  "subtitle": "Crea el teu compte en pocs passos",
@@ -50,6 +50,8 @@
50
50
  }
51
51
  },
52
52
  "signup": {
53
+ "title": "Erstellen Sie Ihr Konto",
54
+ "subtitle": "Eine Identität für das gesamte Ökosystem.",
53
55
  "commonsHeadline": "Erstellen Sie Ihre Identität in Commons",
54
56
  "commonsExplainer": "Commons ist Ihre vollständig selbstverwaltete Oxy-Identität – eine App, überall einsetzbar.",
55
57
  "createInCommons": "Erstellen Sie Ihre Identität in Commons",
@@ -61,7 +63,8 @@
61
63
  "usernameAvailable": "Verfügbar",
62
64
  "usernameTaken": "Dieser Benutzername ist bereits vergeben",
63
65
  "backToSignInLink": "Sie haben bereits ein Konto? Anmelden",
64
- "notAvailableHere": "Die Kontoerstellung ist in dieser App noch nicht verfügbar – erstellen Sie Ihre Identität mit Commons oder besuchen Sie oxy.so, um sich mit einem Passkey zu registrieren.",
66
+ "hubExplainer": "Erstellen Sie Ihre Oxy-ID in einem sicheren Fenster und kehren Sie dann direkt zurück.",
67
+ "continueInWindow": "In einem neuen Fenster fortfahren",
65
68
  "welcome": {
66
69
  "title": "Willkommen bei Oxy!",
67
70
  "subtitle": "Erstellen Sie Ihr Konto in nur wenigen Schritten",
@@ -57,6 +57,8 @@
57
57
  }
58
58
  },
59
59
  "signup": {
60
+ "title": "Create your account",
61
+ "subtitle": "One identity for the whole ecosystem.",
60
62
  "commonsHeadline": "Create your identity in Commons",
61
63
  "commonsExplainer": "Commons is your full self-custody Oxy identity — one app, works everywhere.",
62
64
  "createInCommons": "Create your identity in Commons",
@@ -68,7 +70,8 @@
68
70
  "usernameAvailable": "Available",
69
71
  "usernameTaken": "This username is taken",
70
72
  "backToSignInLink": "Already have an account? Sign in",
71
- "notAvailableHere": "Account creation isn't available in this app yet — create your identity with Commons, or visit oxy.so to sign up with a passkey.",
73
+ "hubExplainer": "Create your Oxy ID in a secure window, then come right back.",
74
+ "continueInWindow": "Continue in a new window",
72
75
  "welcome": {
73
76
  "title": "Welcome to Oxy!",
74
77
  "subtitle": "Let's create your account in just a few steps",
@@ -57,6 +57,8 @@
57
57
  }
58
58
  },
59
59
  "signup": {
60
+ "title": "Crea tu cuenta",
61
+ "subtitle": "Una identidad para todo el ecosistema.",
60
62
  "commonsHeadline": "Crea tu identidad en Commons",
61
63
  "commonsExplainer": "Commons es tu identidad de Oxy con autocustodia completa: una app que funciona en todas partes.",
62
64
  "createInCommons": "Crea tu identidad en Commons",
@@ -68,7 +70,8 @@
68
70
  "usernameAvailable": "Disponible",
69
71
  "usernameTaken": "Este usuario ya está en uso",
70
72
  "backToSignInLink": "¿Ya tienes cuenta? Inicia sesión",
71
- "notAvailableHere": "La creación de cuentas aún no está disponible en esta app: crea tu identidad con Commons o visita oxy.so para registrarte con una clave de acceso.",
73
+ "hubExplainer": "Crea tu Oxy ID en una ventana segura y vuelve enseguida.",
74
+ "continueInWindow": "Continuar en una ventana nueva",
72
75
  "welcome": {
73
76
  "title": "¡Te damos la bienvenida a Oxy!",
74
77
  "subtitle": "Crea tu cuenta en pocos pasos",
@@ -50,6 +50,8 @@
50
50
  }
51
51
  },
52
52
  "signup": {
53
+ "title": "Créez votre compte",
54
+ "subtitle": "Une seule identité pour tout l'écosystème.",
53
55
  "commonsHeadline": "Créez votre identité dans Commons",
54
56
  "commonsExplainer": "Commons est votre identité Oxy en autoconservation complète : une seule app, partout.",
55
57
  "createInCommons": "Créez votre identité dans Commons",
@@ -61,7 +63,8 @@
61
63
  "usernameAvailable": "Disponible",
62
64
  "usernameTaken": "Ce nom d'utilisateur est déjà pris",
63
65
  "backToSignInLink": "Vous avez déjà un compte ? Connectez-vous",
64
- "notAvailableHere": "La création de compte n'est pas encore disponible dans cette app — créez votre identité avec Commons, ou rendez-vous sur oxy.so pour vous inscrire avec une clé d'accès.",
66
+ "hubExplainer": "Créez votre Oxy ID dans une fenêtre sécurisée, puis revenez directement.",
67
+ "continueInWindow": "Continuer dans une nouvelle fenêtre",
65
68
  "welcome": {
66
69
  "title": "Bienvenue sur Oxy !",
67
70
  "subtitle": "Créez votre compte en quelques étapes",
@@ -50,6 +50,8 @@
50
50
  }
51
51
  },
52
52
  "signup": {
53
+ "title": "Crea il tuo account",
54
+ "subtitle": "Un'unica identità per tutto l'ecosistema.",
53
55
  "commonsHeadline": "Crea la tua identità in Commons",
54
56
  "commonsExplainer": "Commons è la tua identità Oxy in piena autocustodia: un'unica app, ovunque.",
55
57
  "createInCommons": "Crea la tua identità in Commons",
@@ -61,7 +63,8 @@
61
63
  "usernameAvailable": "Disponibile",
62
64
  "usernameTaken": "Questo nome utente è già in uso",
63
65
  "backToSignInLink": "Hai già un account? Accedi",
64
- "notAvailableHere": "La creazione dell'account non è ancora disponibile in questa app: crea la tua identità con Commons oppure visita oxy.so per registrarti con una passkey.",
66
+ "hubExplainer": "Crea il tuo Oxy ID in una finestra sicura, poi torna subito qui.",
67
+ "continueInWindow": "Continua in una nuova finestra",
65
68
  "welcome": {
66
69
  "title": "Benvenuto su Oxy!",
67
70
  "subtitle": "Crea il tuo account in pochi passaggi",
@@ -50,6 +50,8 @@
50
50
  }
51
51
  },
52
52
  "signup": {
53
+ "title": "アカウントを作成",
54
+ "subtitle": "エコシステム全体で使える1つのアイデンティティ。",
53
55
  "commonsHeadline": "Commonsであなたのアイデンティティを作成",
54
56
  "commonsExplainer": "Commonsは完全に自己管理できるあなたのOxy IDです。1つのアプリでどこでも使えます。",
55
57
  "createInCommons": "Commonsであなたのアイデンティティを作成",
@@ -61,7 +63,8 @@
61
63
  "usernameAvailable": "利用可能",
62
64
  "usernameTaken": "このユーザー名は既に使用されています",
63
65
  "backToSignInLink": "すでにアカウントをお持ちですか?サインイン",
64
- "notAvailableHere": "このアプリではまだアカウントを作成できません。Commonsでアイデンティティを作成するか、oxy.soにアクセスしてパスキーで登録してください。",
66
+ "hubExplainer": "安全なウィンドウでOxy IDを作成し、すぐに戻ってきてください。",
67
+ "continueInWindow": "新しいウィンドウで続ける",
65
68
  "welcome": {
66
69
  "title": "Oxyへようこそ!",
67
70
  "subtitle": "数ステップでアカウントを作成",
@@ -50,6 +50,8 @@
50
50
  }
51
51
  },
52
52
  "signup": {
53
+ "title": "계정 만들기",
54
+ "subtitle": "생태계 전체를 위한 하나의 아이덴티티.",
53
55
  "commonsHeadline": "Commons에서 나의 아이덴티티 만들기",
54
56
  "commonsExplainer": "Commons는 완전한 자기 보관 방식의 Oxy 아이덴티티입니다. 하나의 앱으로 어디서나 사용하세요.",
55
57
  "createInCommons": "Commons에서 나의 아이덴티티 만들기",
@@ -61,7 +63,8 @@
61
63
  "usernameAvailable": "사용 가능",
62
64
  "usernameTaken": "이미 사용 중인 사용자 이름입니다",
63
65
  "backToSignInLink": "이미 계정이 있으신가요? 로그인",
64
- "notAvailableHere": " 앱에서는 아직 계정을 만들 없습니다. Commons로 아이덴티티를 만들거나 oxy.so에서 패스키로 가입하세요.",
66
+ "hubExplainer": "안전한 창에서 Oxy ID를 만든 바로 돌아오세요.",
67
+ "continueInWindow": "새 창에서 계속하기",
65
68
  "welcome": {
66
69
  "title": "Oxy에 오신 것을 환영합니다!",
67
70
  "subtitle": "몇 단계만으로 계정을 만드세요",
@@ -50,6 +50,8 @@
50
50
  }
51
51
  },
52
52
  "signup": {
53
+ "title": "أنشئ حسابك",
54
+ "subtitle": "هوية واحدة لكل النظام البيئي.",
53
55
  "commonsHeadline": "أنشئ هويتك في Commons",
54
56
  "commonsExplainer": "‏Commons هي هوية Oxy الخاصة بك بحفظ ذاتي كامل — تطبيق واحد يعمل في كل مكان.",
55
57
  "createInCommons": "أنشئ هويتك في Commons",
@@ -61,7 +63,8 @@
61
63
  "usernameAvailable": "متاح",
62
64
  "usernameTaken": "اسم المستخدم هذا مستخدم بالفعل",
63
65
  "backToSignInLink": "لديك حساب بالفعل؟ سجّل الدخول",
64
- "notAvailableHere": "‏إنشاء الحساب غير متاح في هذا التطبيق بعد أنشئ هويتك باستخدام Commons، أو تفضّل بزيارة oxy.so للتسجيل باستخدام مفتاح مرور.",
66
+ "hubExplainer": "أنشئ هوية Oxy الخاصة بك في نافذة آمنة، ثم عد إلى هنا مباشرة.",
67
+ "continueInWindow": "المتابعة في نافذة جديدة",
65
68
  "welcome": {
66
69
  "title": "مرحبًا بك في Oxy!",
67
70
  "subtitle": "أنشئ حسابك في خطوات قليلة",
@@ -50,6 +50,8 @@
50
50
  }
51
51
  },
52
52
  "signup": {
53
+ "title": "Crea el teu compte",
54
+ "subtitle": "Una identitat per a tot l'ecosistema.",
53
55
  "commonsHeadline": "Crea la teva identitat a Commons",
54
56
  "commonsExplainer": "Commons és la teva identitat d'Oxy amb autocustòdia completa: una app que funciona a tot arreu.",
55
57
  "createInCommons": "Crea la teva identitat a Commons",
@@ -61,7 +63,8 @@
61
63
  "usernameAvailable": "Disponible",
62
64
  "usernameTaken": "Aquest nom d'usuari ja està en ús",
63
65
  "backToSignInLink": "Ja tens compte? Inicia sessió",
64
- "notAvailableHere": "La creació de comptes encara no està disponible en aquesta app: crea la teva identitat amb Commons o visita oxy.so per registrar-te amb una clau d'accés.",
66
+ "hubExplainer": "Crea la teva Oxy ID en una finestra segura i torna de seguida.",
67
+ "continueInWindow": "Continua en una finestra nova",
65
68
  "welcome": {
66
69
  "title": "Benvingut a Oxy!",
67
70
  "subtitle": "Crea el teu compte en pocs passos",
@@ -50,6 +50,8 @@
50
50
  }
51
51
  },
52
52
  "signup": {
53
+ "title": "Erstellen Sie Ihr Konto",
54
+ "subtitle": "Eine Identität für das gesamte Ökosystem.",
53
55
  "commonsHeadline": "Erstellen Sie Ihre Identität in Commons",
54
56
  "commonsExplainer": "Commons ist Ihre vollständig selbstverwaltete Oxy-Identität – eine App, überall einsetzbar.",
55
57
  "createInCommons": "Erstellen Sie Ihre Identität in Commons",
@@ -61,7 +63,8 @@
61
63
  "usernameAvailable": "Verfügbar",
62
64
  "usernameTaken": "Dieser Benutzername ist bereits vergeben",
63
65
  "backToSignInLink": "Sie haben bereits ein Konto? Anmelden",
64
- "notAvailableHere": "Die Kontoerstellung ist in dieser App noch nicht verfügbar – erstellen Sie Ihre Identität mit Commons oder besuchen Sie oxy.so, um sich mit einem Passkey zu registrieren.",
66
+ "hubExplainer": "Erstellen Sie Ihre Oxy-ID in einem sicheren Fenster und kehren Sie dann direkt zurück.",
67
+ "continueInWindow": "In einem neuen Fenster fortfahren",
65
68
  "welcome": {
66
69
  "title": "Willkommen bei Oxy!",
67
70
  "subtitle": "Erstellen Sie Ihr Konto in nur wenigen Schritten",
@@ -57,6 +57,8 @@
57
57
  }
58
58
  },
59
59
  "signup": {
60
+ "title": "Create your account",
61
+ "subtitle": "One identity for the whole ecosystem.",
60
62
  "commonsHeadline": "Create your identity in Commons",
61
63
  "commonsExplainer": "Commons is your full self-custody Oxy identity — one app, works everywhere.",
62
64
  "createInCommons": "Create your identity in Commons",
@@ -68,7 +70,8 @@
68
70
  "usernameAvailable": "Available",
69
71
  "usernameTaken": "This username is taken",
70
72
  "backToSignInLink": "Already have an account? Sign in",
71
- "notAvailableHere": "Account creation isn't available in this app yet — create your identity with Commons, or visit oxy.so to sign up with a passkey.",
73
+ "hubExplainer": "Create your Oxy ID in a secure window, then come right back.",
74
+ "continueInWindow": "Continue in a new window",
72
75
  "welcome": {
73
76
  "title": "Welcome to Oxy!",
74
77
  "subtitle": "Let's create your account in just a few steps",
@@ -57,6 +57,8 @@
57
57
  }
58
58
  },
59
59
  "signup": {
60
+ "title": "Crea tu cuenta",
61
+ "subtitle": "Una identidad para todo el ecosistema.",
60
62
  "commonsHeadline": "Crea tu identidad en Commons",
61
63
  "commonsExplainer": "Commons es tu identidad de Oxy con autocustodia completa: una app que funciona en todas partes.",
62
64
  "createInCommons": "Crea tu identidad en Commons",
@@ -68,7 +70,8 @@
68
70
  "usernameAvailable": "Disponible",
69
71
  "usernameTaken": "Este usuario ya está en uso",
70
72
  "backToSignInLink": "¿Ya tienes cuenta? Inicia sesión",
71
- "notAvailableHere": "La creación de cuentas aún no está disponible en esta app: crea tu identidad con Commons o visita oxy.so para registrarte con una clave de acceso.",
73
+ "hubExplainer": "Crea tu Oxy ID en una ventana segura y vuelve enseguida.",
74
+ "continueInWindow": "Continuar en una ventana nueva",
72
75
  "welcome": {
73
76
  "title": "¡Te damos la bienvenida a Oxy!",
74
77
  "subtitle": "Crea tu cuenta en pocos pasos",
@@ -50,6 +50,8 @@
50
50
  }
51
51
  },
52
52
  "signup": {
53
+ "title": "Créez votre compte",
54
+ "subtitle": "Une seule identité pour tout l'écosystème.",
53
55
  "commonsHeadline": "Créez votre identité dans Commons",
54
56
  "commonsExplainer": "Commons est votre identité Oxy en autoconservation complète : une seule app, partout.",
55
57
  "createInCommons": "Créez votre identité dans Commons",
@@ -61,7 +63,8 @@
61
63
  "usernameAvailable": "Disponible",
62
64
  "usernameTaken": "Ce nom d'utilisateur est déjà pris",
63
65
  "backToSignInLink": "Vous avez déjà un compte ? Connectez-vous",
64
- "notAvailableHere": "La création de compte n'est pas encore disponible dans cette app — créez votre identité avec Commons, ou rendez-vous sur oxy.so pour vous inscrire avec une clé d'accès.",
66
+ "hubExplainer": "Créez votre Oxy ID dans une fenêtre sécurisée, puis revenez directement.",
67
+ "continueInWindow": "Continuer dans une nouvelle fenêtre",
65
68
  "welcome": {
66
69
  "title": "Bienvenue sur Oxy !",
67
70
  "subtitle": "Créez votre compte en quelques étapes",
@@ -50,6 +50,8 @@
50
50
  }
51
51
  },
52
52
  "signup": {
53
+ "title": "Crea il tuo account",
54
+ "subtitle": "Un'unica identità per tutto l'ecosistema.",
53
55
  "commonsHeadline": "Crea la tua identità in Commons",
54
56
  "commonsExplainer": "Commons è la tua identità Oxy in piena autocustodia: un'unica app, ovunque.",
55
57
  "createInCommons": "Crea la tua identità in Commons",
@@ -61,7 +63,8 @@
61
63
  "usernameAvailable": "Disponibile",
62
64
  "usernameTaken": "Questo nome utente è già in uso",
63
65
  "backToSignInLink": "Hai già un account? Accedi",
64
- "notAvailableHere": "La creazione dell'account non è ancora disponibile in questa app: crea la tua identità con Commons oppure visita oxy.so per registrarti con una passkey.",
66
+ "hubExplainer": "Crea il tuo Oxy ID in una finestra sicura, poi torna subito qui.",
67
+ "continueInWindow": "Continua in una nuova finestra",
65
68
  "welcome": {
66
69
  "title": "Benvenuto su Oxy!",
67
70
  "subtitle": "Crea il tuo account in pochi passaggi",
@@ -50,6 +50,8 @@
50
50
  }
51
51
  },
52
52
  "signup": {
53
+ "title": "アカウントを作成",
54
+ "subtitle": "エコシステム全体で使える1つのアイデンティティ。",
53
55
  "commonsHeadline": "Commonsであなたのアイデンティティを作成",
54
56
  "commonsExplainer": "Commonsは完全に自己管理できるあなたのOxy IDです。1つのアプリでどこでも使えます。",
55
57
  "createInCommons": "Commonsであなたのアイデンティティを作成",
@@ -61,7 +63,8 @@
61
63
  "usernameAvailable": "利用可能",
62
64
  "usernameTaken": "このユーザー名は既に使用されています",
63
65
  "backToSignInLink": "すでにアカウントをお持ちですか?サインイン",
64
- "notAvailableHere": "このアプリではまだアカウントを作成できません。Commonsでアイデンティティを作成するか、oxy.soにアクセスしてパスキーで登録してください。",
66
+ "hubExplainer": "安全なウィンドウでOxy IDを作成し、すぐに戻ってきてください。",
67
+ "continueInWindow": "新しいウィンドウで続ける",
65
68
  "welcome": {
66
69
  "title": "Oxyへようこそ!",
67
70
  "subtitle": "数ステップでアカウントを作成",
@@ -50,6 +50,8 @@
50
50
  }
51
51
  },
52
52
  "signup": {
53
+ "title": "계정 만들기",
54
+ "subtitle": "생태계 전체를 위한 하나의 아이덴티티.",
53
55
  "commonsHeadline": "Commons에서 나의 아이덴티티 만들기",
54
56
  "commonsExplainer": "Commons는 완전한 자기 보관 방식의 Oxy 아이덴티티입니다. 하나의 앱으로 어디서나 사용하세요.",
55
57
  "createInCommons": "Commons에서 나의 아이덴티티 만들기",
@@ -61,7 +63,8 @@
61
63
  "usernameAvailable": "사용 가능",
62
64
  "usernameTaken": "이미 사용 중인 사용자 이름입니다",
63
65
  "backToSignInLink": "이미 계정이 있으신가요? 로그인",
64
- "notAvailableHere": " 앱에서는 아직 계정을 만들 없습니다. Commons로 아이덴티티를 만들거나 oxy.so에서 패스키로 가입하세요.",
66
+ "hubExplainer": "안전한 창에서 Oxy ID를 만든 바로 돌아오세요.",
67
+ "continueInWindow": "새 창에서 계속하기",
65
68
  "welcome": {
66
69
  "title": "Oxy에 오신 것을 환영합니다!",
67
70
  "subtitle": "몇 단계만으로 계정을 만드세요",
@@ -50,6 +50,8 @@
50
50
  }
51
51
  },
52
52
  "signup": {
53
+ "title": "Crie a sua conta",
54
+ "subtitle": "Uma identidade para todo o ecossistema.",
53
55
  "commonsHeadline": "Crie a sua identidade no Commons",
54
56
  "commonsExplainer": "O Commons é a sua identidade Oxy com autocustódia total: uma app que funciona em todo o lado.",
55
57
  "createInCommons": "Crie a sua identidade no Commons",
@@ -61,7 +63,8 @@
61
63
  "usernameAvailable": "Disponível",
62
64
  "usernameTaken": "Este nome de utilizador já está em uso",
63
65
  "backToSignInLink": "Já tem uma conta? Inicie sessão",
64
- "notAvailableHere": "A criação de conta ainda não está disponível nesta app: crie a sua identidade com o Commons ou visite oxy.so para se registar com uma chave de acesso.",
66
+ "hubExplainer": "Crie a sua Oxy ID numa janela segura e volte de seguida.",
67
+ "continueInWindow": "Continuar numa nova janela",
65
68
  "welcome": {
66
69
  "title": "Bem-vindo ao Oxy!",
67
70
  "subtitle": "Crie a sua conta em poucos passos",
@@ -50,6 +50,8 @@
50
50
  }
51
51
  },
52
52
  "signup": {
53
+ "title": "创建您的账户",
54
+ "subtitle": "一个身份,畅行整个生态系统。",
53
55
  "commonsHeadline": "在 Commons 中创建您的身份",
54
56
  "commonsExplainer": "Commons 是您完全自主保管的 Oxy 身份——一个应用,随处可用。",
55
57
  "createInCommons": "在 Commons 中创建您的身份",
@@ -61,7 +63,8 @@
61
63
  "usernameAvailable": "可用",
62
64
  "usernameTaken": "该用户名已被占用",
63
65
  "backToSignInLink": "已有账户?登录",
64
- "notAvailableHere": "此应用暂不支持创建账户——请使用 Commons 创建您的身份,或访问 oxy.so 使用通行密钥注册。",
66
+ "hubExplainer": "在安全窗口中创建您的 Oxy ID,然后立即返回。",
67
+ "continueInWindow": "在新窗口中继续",
65
68
  "welcome": {
66
69
  "title": "欢迎使用Oxy!",
67
70
  "subtitle": "只需几步即可创建您的账户",
@@ -50,6 +50,8 @@
50
50
  }
51
51
  },
52
52
  "signup": {
53
+ "title": "Crie a sua conta",
54
+ "subtitle": "Uma identidade para todo o ecossistema.",
53
55
  "commonsHeadline": "Crie a sua identidade no Commons",
54
56
  "commonsExplainer": "O Commons é a sua identidade Oxy com autocustódia total: uma app que funciona em todo o lado.",
55
57
  "createInCommons": "Crie a sua identidade no Commons",
@@ -61,7 +63,8 @@
61
63
  "usernameAvailable": "Disponível",
62
64
  "usernameTaken": "Este nome de utilizador já está em uso",
63
65
  "backToSignInLink": "Já tem uma conta? Inicie sessão",
64
- "notAvailableHere": "A criação de conta ainda não está disponível nesta app: crie a sua identidade com o Commons ou visite oxy.so para se registar com uma chave de acesso.",
66
+ "hubExplainer": "Crie a sua Oxy ID numa janela segura e volte de seguida.",
67
+ "continueInWindow": "Continuar numa nova janela",
65
68
  "welcome": {
66
69
  "title": "Bem-vindo ao Oxy!",
67
70
  "subtitle": "Crie a sua conta em poucos passos",
@@ -50,6 +50,8 @@
50
50
  }
51
51
  },
52
52
  "signup": {
53
+ "title": "创建您的账户",
54
+ "subtitle": "一个身份,畅行整个生态系统。",
53
55
  "commonsHeadline": "在 Commons 中创建您的身份",
54
56
  "commonsExplainer": "Commons 是您完全自主保管的 Oxy 身份——一个应用,随处可用。",
55
57
  "createInCommons": "在 Commons 中创建您的身份",
@@ -61,7 +63,8 @@
61
63
  "usernameAvailable": "可用",
62
64
  "usernameTaken": "该用户名已被占用",
63
65
  "backToSignInLink": "已有账户?登录",
64
- "notAvailableHere": "此应用暂不支持创建账户——请使用 Commons 创建您的身份,或访问 oxy.so 使用通行密钥注册。",
66
+ "hubExplainer": "在安全窗口中创建您的 Oxy ID,然后立即返回。",
67
+ "continueInWindow": "在新窗口中继续",
65
68
  "welcome": {
66
69
  "title": "欢迎使用Oxy!",
67
70
  "subtitle": "只需几步即可创建您的账户",
@@ -25,6 +25,12 @@
25
25
  * - `commonsAvailability` — whether Commons is installed on this device
26
26
  * (native only, via the injected `canOpenApp` probe), so the QR view can
27
27
  * offer a "Get Commons" fallback instead of a same-device dead end.
28
+ * - `startPasskeyHubSignIn` — on a non-Oxy web origin (where a WebAuthn
29
+ * ceremony can't run locally, the RP-ID is bound to oxy.so), open a popup
30
+ * at the auth.oxy.so passkey hub instead, scoped to the SAME device-flow
31
+ * session `showQr` creates, and complete it via the SAME poll/socket/claim
32
+ * engine. Falls back to `showQr`'s plain QR rendering if the popup is
33
+ * blocked.
28
34
  *
29
35
  * Sign-in is passkey (WebAuthn) or the Commons QR / shared-keychain handoff —
30
36
  * password, social login, and 2FA were removed ecosystem-wide. Account
@@ -36,6 +42,7 @@ exports.AccountDialogController = void 0;
36
42
  exports.createAccountDialogController = createAccountDialogController;
37
43
  const logger_1 = require("../logger");
38
44
  const errorUtils_1 = require("../utils/errorUtils");
45
+ const authWebUrl_1 = require("../utils/authWebUrl");
39
46
  const accountProjection_1 = require("./accountProjection");
40
47
  /**
41
48
  * Slow FALLBACK poll cadence for the QR flow. The `/auth-session` socket delivers
@@ -90,6 +97,10 @@ class AccountDialogController {
90
97
  * single-use token concurrently.
91
98
  */
92
99
  this.pollInFlight = false;
100
+ /** The popup opened by {@link startPasskeyHubSignIn}, or `null`. */
101
+ this.activePopup = null;
102
+ /** Watches {@link activePopup}'s `closed` state; see {@link watchPopup}. */
103
+ this.popupWatchTimer = null;
93
104
  // --- Store plumbing ---
94
105
  this.unsubscribeSession = null;
95
106
  this.unsubscribeTokens = null;
@@ -108,6 +119,8 @@ class AccountDialogController {
108
119
  this.openUrl = options.openUrl;
109
120
  this.canOpenApp = options.canOpenApp;
110
121
  this.socketFactory = options.socketFactory;
122
+ this.openPopup = options.openPopup;
123
+ this.hubBaseUrl = options.hubBaseUrl ?? `https://auth.${authWebUrl_1.CENTRAL_IDP_APEX}`;
111
124
  this.snapshot = this.computeSnapshot();
112
125
  }
113
126
  // =========================================================================
@@ -181,6 +194,7 @@ class AccountDialogController {
181
194
  }
182
195
  this.clearPollTimer();
183
196
  this.closeAuthSessionSocket();
197
+ this.closeActivePopup();
184
198
  this.signInToken = null;
185
199
  this.listeners.clear();
186
200
  }
@@ -448,9 +462,62 @@ class AccountDialogController {
448
462
  async showQr() {
449
463
  this.cancelSignIn();
450
464
  this.setView('qr');
465
+ await this.startDeviceFlowSession();
466
+ }
467
+ /**
468
+ * Web-only: "Sign in with a passkey" on a non-Oxy origin cannot run the
469
+ * WebAuthn ceremony locally — a credential minted with `WEBAUTHN_RP_ID=oxy.so`
470
+ * can only be asserted from `oxy.so`/a subdomain/loopback, a browser-enforced
471
+ * boundary `isOxyRpOrigin()` (consumer-side) already gates on. Instead, open
472
+ * a popup at the auth.oxy.so passkey hub, scoped to the SAME device-flow
473
+ * session {@link showQr} would create (same `authorizeCode`/`sessionToken`
474
+ * pair), and let the SAME poll/socket/claim engine complete it once the hub
475
+ * authorizes the session (`POST /auth/session/authorize-code/:authorizeCode`,
476
+ * bearer-authed, server-side — this method never sees or transmits the
477
+ * secret `sessionToken`).
478
+ *
479
+ * The popup MUST be opened synchronously, before any `await`, or the
480
+ * browser's popup blocker loses the click-gesture attribution and silently
481
+ * blocks it — so {@link openPopup} is invoked as the very first step, before
482
+ * the device-flow session (which needs an async call) even exists. If the
483
+ * popup is blocked (or no `openPopup` was injected), this falls back to
484
+ * `showQr`'s plain QR rendering — no dead end.
485
+ */
486
+ async startPasskeyHubSignIn() {
487
+ this.cancelSignIn();
488
+ this.setView('qr');
489
+ const popup = this.openPopup?.() ?? null;
490
+ if (!popup) {
491
+ await this.startDeviceFlowSession();
492
+ return;
493
+ }
494
+ const handle = await this.startDeviceFlowSession();
495
+ if (!handle) {
496
+ popup.close();
497
+ return;
498
+ }
499
+ // The user may have closed the popup during the async session creation
500
+ // above, before any watcher was attached to catch it — guard rather than
501
+ // navigate a dead window (browsers vary on whether that throws).
502
+ if (popup.closed) {
503
+ this.failSignIn('Sign-in was cancelled.');
504
+ return;
505
+ }
506
+ this.activePopup = popup;
507
+ popup.location.href = `${this.hubBaseUrl}/hub-passkey?code=${encodeURIComponent(handle.authorizeCode)}`;
508
+ this.watchPopup(popup);
509
+ }
510
+ /**
511
+ * Shared device-flow session creation for both {@link showQr} (renders the
512
+ * QR) and {@link startPasskeyHubSignIn} (also opens the hub popup) — the
513
+ * same `startCommonsSignIn` → poll/socket wiring either way. Returns the
514
+ * handle on success (already reflected in `signIn`), or `null` on failure
515
+ * (already set as `signIn.error`).
516
+ */
517
+ async startDeviceFlowSession() {
451
518
  if (!this.clientId) {
452
519
  this.setSignIn({ ...IDLE_SIGN_IN, phase: 'error', error: 'This app is not configured for sign-in (missing clientId).' });
453
- return;
520
+ return null;
454
521
  }
455
522
  this.setSignIn({ ...IDLE_SIGN_IN, phase: 'starting' });
456
523
  try {
@@ -475,9 +542,49 @@ class AccountDialogController {
475
542
  // stay live as the fallback, so a user who dismisses the app-open still
476
543
  // completes the sign-in by scanning.
477
544
  void this.deepLinkIntoCommonsIfAvailable(handle.qrPayload);
545
+ return handle;
478
546
  }
479
547
  catch (error) {
480
548
  this.setSignIn({ ...IDLE_SIGN_IN, phase: 'error', error: errorMessage(error) });
549
+ return null;
550
+ }
551
+ }
552
+ /**
553
+ * Poll {@link PopupWindowHandle.closed} so a user who dismisses the hub
554
+ * popup without completing sign-in gets prompt feedback (there is no DOM
555
+ * event for a cross-origin popup closing — polling is the only mechanism).
556
+ * Cleared by {@link closeActivePopup}, which every sign-in exit path already
557
+ * calls.
558
+ */
559
+ watchPopup(popup) {
560
+ this.clearPopupWatchTimer();
561
+ this.popupWatchTimer = setInterval(() => {
562
+ if (!popup.closed)
563
+ return;
564
+ this.clearPopupWatchTimer();
565
+ if (this.signIn.phase === 'starting' || this.signIn.phase === 'waiting') {
566
+ this.failSignIn('Sign-in was cancelled.');
567
+ }
568
+ }, 1000);
569
+ }
570
+ clearPopupWatchTimer() {
571
+ if (this.popupWatchTimer !== null) {
572
+ clearInterval(this.popupWatchTimer);
573
+ this.popupWatchTimer = null;
574
+ }
575
+ }
576
+ /** Tear down the popup watch timer and close the popup, if any. Idempotent. */
577
+ closeActivePopup() {
578
+ this.clearPopupWatchTimer();
579
+ const popup = this.activePopup;
580
+ this.activePopup = null;
581
+ if (!popup || popup.closed)
582
+ return;
583
+ try {
584
+ popup.close();
585
+ }
586
+ catch (error) {
587
+ logger_1.logger.debug('[AccountDialogController] popup close failed', { component: 'AccountDialogController' }, error);
481
588
  }
482
589
  }
483
590
  /**
@@ -527,10 +634,11 @@ class AccountDialogController {
527
634
  this.openUrl(qrPayload);
528
635
  }
529
636
  }
530
- /** Tear down the active sign-in device flow (timers + socket + token) and reset to idle. */
637
+ /** Tear down the active sign-in device flow (timers + socket + popup + token) and reset to idle. */
531
638
  cancelSignIn() {
532
639
  this.clearPollTimer();
533
640
  this.closeAuthSessionSocket();
641
+ this.closeActivePopup();
534
642
  this.signInToken = null;
535
643
  if (this.signIn !== IDLE_SIGN_IN) {
536
644
  this.setSignIn(IDLE_SIGN_IN);
@@ -639,6 +747,7 @@ class AccountDialogController {
639
747
  this.signInToken = null;
640
748
  this.clearPollTimer();
641
749
  this.closeAuthSessionSocket();
750
+ this.closeActivePopup();
642
751
  this.signIn = IDLE_SIGN_IN;
643
752
  this.view = 'accounts';
644
753
  this.emit();
@@ -670,6 +779,7 @@ class AccountDialogController {
670
779
  failSignIn(message) {
671
780
  this.clearPollTimer();
672
781
  this.closeAuthSessionSocket();
782
+ this.closeActivePopup();
673
783
  this.signInToken = null;
674
784
  this.setSignIn({ ...IDLE_SIGN_IN, phase: 'error', error: message });
675
785
  }