343f605f656a

deep-link detached popup to codex-restore on ?codex=pdf — App.tsx routes past onboarding/lock straight into the restore flow (v3.6.73)

time
2026-05-21 01:57 UTC · 5 months ago
machine
koh2
parent
3d870e4370eb
4 files manifest.firefox.json+1 −1manifest.json+1 −1package.json+1 −1src/popup/App.tsx+13 −0
manifest.firefox.json+1 −1
@@ -2,7 +2,7 @@22   "_comment_audio_capture": "Firefox does not honor the Chrome 'audioCapture' optional_permission — getUserMedia in WebExtensions is gated solely by the runtime permission prompt. Microphone access for chirp pairing works from the popup under the existing '<all_urls>' host permission; no manifest entry is required or accepted here.",33   "manifest_version": 3,44   "name": "Peach",5-  "version": "3.6.72",5+  "version": "3.6.73",66   "description": "Zero-knowledge password manager",77   "browser_specific_settings": {88     "gecko": {

view file

manifest.json+1 −1
@@ -1,7 +1,7 @@11 {22   "manifest_version": 3,33   "name": "Peach",4-  "version": "3.6.72",4+  "version": "3.6.73",55   "description": "Zero-knowledge password manager",66   "action": {77     "default_popup": "src/popup/index.html",

view file

package.json+1 −1
@@ -1,6 +1,6 @@11 {22   "name": "peach",3-  "version": "3.6.72",3+  "version": "3.6.73",44   "description": "Zero-knowledge password manager",55   "type": "module",66   "scripts": {

view file

src/popup/App.tsx+13 −0
@@ -394,6 +394,19 @@394394     setBootState("ready");395395     document.getElementById("pre-lock")?.setAttribute("hidden", "true");396396 397+    // Deep-link: ?codex=pdf opens a detached window straight into the398+    // Codex restore flow with auto-picked PDF. The action popup can't host399+    // a file dialog without dismissing itself, so this is the only way the400+    // PDF import path survives. See CodexRestoreView.openPdfPicker().401+    try {402+      const route = new URLSearchParams(window.location.search).get("codex");403+      if (route === "pdf" || route === "restore") {404+        setView("codex-restore");405+      }406+    } catch {407+      // location.search unavailable — ignore.408+    }409+397410     // Check for pending session-storage notices from the background.398411     if (chrome.storage.session) {399412       const session = await chrome.storage.session.get(["pendingProGate", "pendingProNotice"]) as

view file