Repository navigation
Conversation
Changes: - Popup redesign: restyled interface set in Geist and Geist Mono, bundled with the extension - Popup preloads both fonts so it does not paint in a fallback typeface first - In-page notifications use a dark translucent surface, muted status colours and Geist when it is installed - Chrome, Firefox and source packages include the assets/ directory (fonts and particle halo)
Changes: - README is restructured as a guided start page: what it is, build and load steps, then a contents list and reference sections - Privacy and permissions are now one section that lists every network call and every manifest permission - Credits and license name the original LLMFeeder project and the bundled libraries
Changes: - Build Validation fails when a package is missing a file from extension/: the source package must hold every file, the Chrome and Firefox packages every script, page and stylesheet - Expected to fail on this commit alone: the source package lacks discord.js, github.js, telegram.js and youtube.js
Changes:
- Tests for Copy Chat and Copy page on Google AI Mode, written from the requirements before the fix. The fixtures are reconstructed from the extractor's model and two exporters' class names, not captured from a live page
- Expected to fail on this commit, R1 (both tests): a question asked twice ("continue") is kept once, because turns are keyed by their question text; the scroll-walk test gets three exchanges instead of four
- Expected to fail, R2 (both tests): a heading with no label, "Python: which library reads TOML?", loses "Python:", because anything before a colon in the first 24 characters is taken for the label
- Expected to fail, R3: formulas come out as base64 images (block) or not at all (inline, hidden from screen readers) instead of LaTeX
- Expected to fail, R4 (both tests): the empty AI Mode home /search?udm=50 is offered as a conversation, and /ai?q= and /aimode?q= are not
- Expected to fail, R5 (four extractor tests): a thread URL with nothing readable returns null, so Copy Chat scrapes the page with the generic chat reader, copying the page returns null, and a question with no answer is copied as a lone question
- Expected to fail, R5 (three content-script tests): the popup is shown "An error occurred during conversion." instead of the extractor's sentence, and an ordinary Google search page is refused with "No AI Mode answer could be extracted from this page" instead of being converted
- Expected to fail, R6: a saved thread is cited as https://www.google.com/search?udm=50&q= with an empty q
- Expected to pass on this commit: the four R7 guards (answer sections stay in their answer, a chip becomes its label, the rail, feedback, disclaimer and prompt box are left out, the copy holds every exchange and names Google AI Mode)
Changes:
- Copy Chat on Google AI Mode keeps a question asked twice ("continue", then "continue" again) as two exchanges with their own answers, in order, including while the thread is scrolled and turns are unmounted
- Google's "You said:" label is cut only where the page proves it is one, so a question such as "Python: which library reads TOML?" keeps its "Python:" with or without the label
- Formulas are copied as LaTeX: $…$ inline and a $$ block on its own lines, written verbatim, including a formula that ends the answer
- The Copy Chat button appears on a saved AI Mode thread and on the /ai and /aimode entry points, and no longer on the empty AI Mode home
- An AI Mode thread that cannot be read stops with a sentence naming Google AI Mode and what was missing (no question or answer column, or no answer text), in the popup itself, instead of copying whatever the generic reader found or showing "An error occurred during conversion."
- Copying an ordinary Google search page, or any other page on a Google host that is not an AI Mode thread, converts it as a page again instead of failing with "No AI Mode answer could be extracted from this page"
- A saved thread is cited by its thread id (mtid), never as a search with an empty q=, and the mstk session token is left out of the citation
Changes: - AGENTS.md describes the reconciled Google AI Mode extractor: the route guard (udm=50 plus q or mtid, /ai and /aimode), the label rule, turns matched on question and answer, formulas as LaTeX, the errors it throws, and what the cited address keeps - AGENTS.md says how an extractor's own error message reaches the popup (an Error with verbatim: true); the popup otherwise shows the generic failure
Changes: - Tests: Gemini is read as Gemini, and only Google Search hosts count as AI Mode - Tests: an AI Mode answer that ends in a numbered list, a bulleted list or a code block keeps all of it, while the disclaimer after it is still dropped - Expected to fail on this commit, R8: the AI Mode host pattern matches every google.com subdomain and is listed before Gemini, so gemini.google.com, Docs and Gmail all resolve to google-ai - Expected to fail, R9 (all three): the closing-label trim removes the last item of a short list in the page, and the line trim removes numbered items and every line of a closing code block
Changes: - Gemini conversations are copied by the Gemini reader again: the AI Mode entry now claims Google Search hosts only, not every google.com subdomain - Docs, Gmail and other Google products are no longer taken for AI Mode - An AI Mode answer that ends in a list keeps its last item, and one that ends in a code block or a numbered list keeps all of it; the closing disclaimer is still dropped
# Conflicts: # .github/workflows/pr-validation.yml
Changes: - Popup restructured around the page being copied: a card at the top names the host, the title and the mode (page, chat, Telegram, merged tabs), and the outcome of a copy lands on its foot with the token count - One heavy key copies the page; Save .md, the opposite scope (Full page or Main content) and Selection are a row of equal keys under it instead of a hidden caret menu - Links, Images, Tables and Metadata are switches on the card, the same settings as in Formatting, one tap away - The Telegram limits sit on the card, and several selected tabs are listed by name before they are merged - The particle halo and its empty field are gone; a spectrum line runs along the card while a copy is being made - Settings are grouped into Copy, Sites, Research, Interface and About instead of one list in the order features shipped - The header shows the Unshell mark and name, readable in the dark theme
Changes: - Settings are rows on one card per section: the name on the left, a switch, a segmented choice or a menu on the right, the explanation under the name - A site's own options (Reddit sort, GitHub tree, YouTube comments, Discord and X limits) open under its row only while that site's mode is on - Research: Research & download is the heavy ink key and the go arrow in the field steps aside while the plan is up, so there is one way to start instead of two; the plan names DuckDuckGo as where the question goes - Research result is a card: an MD tile, the file name, its tokens and how many sources made it - The glow under the sheet's key is gone: it was the field's scroll fade lying over the sheet
Changes: - The page card shows the site's own icon instead of its initial: in Chrome from the browser's favicon cache, with no request; in Firefox from the icon Firefox reports for the tab - A browser page, or a tab with no icon, keeps the initial - Chrome asks for the favicon permission; the Firefox package leaves it out, and the README lists it
Changes: - Chat: how many exchanges to copy is a row of segments on the page card (1, 3, 5, 10, 25, All) instead of a menu that had more items than the popup had room for and ran under the research bar - Chat: Copy page is a key beside Save .md - No native tooltips: buttons no longer carry a title that repeated their label over them; icon-only buttons are named for screen readers instead
Changes: - Test: when the browser has no icon for the tab, or its icon will not draw, the icon the page declares is tried next: rel=icon, then apple-touch-icon, then /favicon.ico at the page origin - Expected to fail on this commit alone: page-icon.js has no candidates() or declaredIcon() yet
Changes: - The site icon shows up in Firefox when Firefox has no icon for the tab (its favIconUrl is intermittently empty): the popup asks the page which icon it declares, rel=icon, then apple-touch-icon, then /favicon.ico, and tries that next - An icon that fails to draw falls through to the next one before the tile keeps the initial
Changes: - The site icon shows: its tile follows the browser's colour scheme, because the browser hands over the icon variant drawn for its own tab strip (a white ChatGPT logo on a dark system), which vanished on the white tile in both popup themes - The page card is a plain current-page lockup: the icon, then the title over the address (host and path); the PAGE / CHAT badge is gone, since the key below already says what is copied - On a chat the card keeps the Links, Images, Tables and Metadata switches beside the exchange limit
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
dekrezz/Unshell. Internal identifiers (JS globals, storage keys, port names, the add-on ID) are unchanged, so saved settings survive.:rootkept their light values inside.dark-theme(ink-on-dark Telegram segments and settings hints).faviconpermission, Chrome package only), the tab's reported icon in Firefox; the initial when there is none.titleattributes that repeated a button's label are gone; icon-only buttons carryaria-label.favIconUrlis intermittently empty (bug 1417721), so the popup also asks the page which icon it declares (getPageIcon) and tries that.This branch starts from the 2.3.0 build (
v2.3.0=e58e799), which merges #2–#7. Merging this PR merges those too.Test first
c4f7f5eunshell-research-…scrapllm-research-)4e39f2d856b17a:rootalias of a dark-overridden token is declared on.dark-theme17df224436cd84page-icon.jsmissing)708cc57page-icon.jsand the page card's icon1e6e51fcandidates,declaredIconmissing)44776e4CI
Actions jobs on this account are not starting (billing), so none of these runs has executed. Re-run them in order once billing is fixed.
Not verified
The popup was checked by rendering
popup.htmlheadless in Firefox against a stubbed extension API, in every mode and both themes. It has not been checked as an installed extension against live pages, and keyboard focus rings could not be captured headless.