From b9805ec2fa252ea2b5442b40ff532d5579cc857e Mon Sep 17 00:00:00 2001 From: CorsenAI <272485939+CorsenAI@users.noreply.github.com> Date: Mon, 3 Aug 2026 02:03:41 +0100 Subject: [PATCH 1/4] fix: harden connector routing and ship verified 0.2.2 --- PRIVACY.md | 4 +- PUBLISHING.md | 9 +- README.md | 16 +- docs/ACCEPTANCE.md | 2 +- docs/ARCHITECTURE-V2.md | 2 +- docs/TEST-EVIDENCE.md | 82 +- docs/index.html | 22 +- docs/privacy/index.html | 2 +- docs/sitemap.xml | 6 +- docs/support/index.html | 8 +- extension/manifest.json | 2 +- extension/src/background.js | 291 +++++- extension/src/sidepanel.html | 103 +- extension/src/sidepanel.js | 498 ++++++++-- hermes-plugin/__init__.py | 19 +- hermes-plugin/bridge_client.py | 18 +- hermes-plugin/broker.py | 67 +- hermes-plugin/plugin.yaml | 2 +- marketing/video/.gitignore | 1 + marketing/video/STORYBOARD.md | 87 +- marketing/video/captions-en.srt | 27 - marketing/video/hermes-connector-demo.gif | Bin 840421 -> 0 bytes .../video/hermes-connector-real-e2e-1080p.mp4 | Bin 0 -> 716975 bytes .../hermes-connector-thumbnail-1280x720.png | Bin 220122 -> 0 bytes marketing/video/overlay-horizontal.ass | 39 - marketing/video/overlay-vertical.ass | 37 - marketing/video/render.ps1 | 259 ----- marketing/video/thumbnail.ass | 21 - scripts/build_release.py | 13 + scripts/install_companion.py | 15 + store/ASSETS.md | 40 +- store/LISTING.md | 16 +- store/privacy.html | 2 +- store/screenshot-product-1280x800.png | Bin 185343 -> 91315 bytes tests/background-bindings.test.mjs | 15 +- tests/background-session.test.mjs | 25 +- tests/background-tabs.test.mjs | 322 +++++++ tests/capture_store_screenshot.py | 54 +- tests/e2e_chromium.py | 201 +++- tests/e2e_installer_posix.sh | 4 +- tests/e2e_multi_browser.py | 2 +- tests/e2e_packaged_release.py | 37 +- tests/e2e_real_hermes.py | 886 ++++++++++++++++++ tests/fixtures/store-demo.html | 2 +- tests/test_broker.py | 108 +++ tests/test_installer.py | 162 ++++ tests/test_plugin_routing.py | 24 + 47 files changed, 2839 insertions(+), 713 deletions(-) delete mode 100644 marketing/video/captions-en.srt delete mode 100644 marketing/video/hermes-connector-demo.gif create mode 100644 marketing/video/hermes-connector-real-e2e-1080p.mp4 delete mode 100644 marketing/video/hermes-connector-thumbnail-1280x720.png delete mode 100644 marketing/video/overlay-horizontal.ass delete mode 100644 marketing/video/overlay-vertical.ass delete mode 100644 marketing/video/render.ps1 delete mode 100644 marketing/video/thumbnail.ass create mode 100644 tests/background-tabs.test.mjs create mode 100644 tests/e2e_real_hermes.py diff --git a/PRIVACY.md b/PRIVACY.md index 18bcac2..61761e7 100644 --- a/PRIVACY.md +++ b/PRIVACY.md @@ -1,6 +1,6 @@ # Privacy Policy — Hermes Connector (unofficial · by Corsen AI) -_Last updated: 2026-08-02_ +_Last updated: 2026-08-03_ Hermes Connector lets a Hermes agent running on your computer read and control Chrome tabs that you explicitly attach. Corsen AI does not operate a relay, @@ -13,7 +13,7 @@ To provide its single browser-control purpose, the extension can handle: - website content from attached tabs, including visible text, accessibility structure, element labels, and screenshots you request; - browsing activity for attached tabs, including their URL and title; when you - open **Choose tabs**, current tab titles and URLs are displayed locally so you + open **Tabs**, current tab titles and URLs are displayed locally so you can choose which tabs to attach; - text and navigation instructions sent by your locally configured Hermes agent; - Hermes profile and session identifiers and titles read from your local Hermes diff --git a/PUBLISHING.md b/PUBLISHING.md index 69705cc..4603ef0 100644 --- a/PUBLISHING.md +++ b/PUBLISHING.md @@ -28,7 +28,7 @@ separately under the same release version. - Privacy: `https://corsenai.github.io/hermes-connector/privacy/` - Support and installation: `https://corsenai.github.io/hermes-connector/support/` -- Companion 0.2.1: `https://github.com/CorsenAI/hermes-connector/releases/download/v0.2.1/hermes-connector-0.2.1-companion.zip` +- Companion 0.2.2: `https://github.com/CorsenAI/hermes-connector/releases/download/v0.2.2/hermes-connector-0.2.2-companion.zip` - Source: `https://github.com/CorsenAI/hermes-connector` - Support email: `hello@corsen.ai` @@ -58,7 +58,8 @@ Prepared assets: - `store/store-icon-128.png` — 128×128; - `store/promo-small-440x280.png` — 440×280; - `store/screenshot-product-1280x800.png` — 1280×800 real headed-Chrome - capture with isolated test data. + capture with an isolated real Hermes model, exact attached `example.com` tab, + and verified `bridge_status` → `bridge_current_url` → `bridge_read` calls. Generation/capture provenance and the reproducible screenshot command are in `store/ASSETS.md`. @@ -76,7 +77,7 @@ Declare the data the extension handles even though processing is local: - **Website content**: visible text, accessibility structure, element labels, and requested screenshots from attached tabs. - **Web history**: URLs and titles of attached tabs; current tab titles/URLs are - shown locally only after the user opens Choose tabs. + shown locally only after the user opens Tabs. - **Authentication information**: the persistent local Connector pairing credential stored in Chrome local storage, plus the ephemeral Hermes dashboard session token read into memory. Only HMAC proofs—not the pairing credential—go @@ -149,7 +150,7 @@ so use deferred publishing and answer reviewer questions promptly. ## 8. Post-publication verification -- [ ] Confirm the public Store endpoint serves version 0.2.1 for the existing +- [ ] Confirm the public Store endpoint serves version 0.2.2 for the existing extension ID. - [ ] Smoke-test the Store-installed build in the intended signed-in Chrome profile and confirm an upgraded 0.2.0 profile receives the companion diff --git a/README.md b/README.md index da3f69c..44c128f 100644 --- a/README.md +++ b/README.md @@ -7,16 +7,18 @@ automation browser or guessing which tab belongs to which task. ![Hermes Connector — local AI, your tabs](store/promo-marquee-1400x560.png) +![Hermes Connector reading an explicitly attached Example Domain tab through a real Hermes session](store/screenshot-product-1280x800.png) + +[**Watch the verified 9-second real-product demo**](marketing/video/hermes-connector-real-e2e-1080p.mp4) + [**Install from the Chrome Web Store**](https://chromewebstore.google.com/detail/hermes-connector-%E2%80%94-by-cor/cdhaldcgafmkcnpanlmmpaebabnlledm) · [Setup guide](https://corsenai.github.io/hermes-connector/) -· [Download companion 0.2.1](https://github.com/CorsenAI/hermes-connector/releases/download/v0.2.1/hermes-connector-0.2.1-companion.zip) +· [Download companion 0.2.2](https://github.com/CorsenAI/hermes-connector/releases/download/v0.2.2/hermes-connector-0.2.2-companion.zip) · [Get support](https://corsenai.github.io/hermes-connector/support/) > Unofficial community project by Corsen AI. Not affiliated with or endorsed > by Nous Research or Google. -![Hermes Connector demo showing explicit tab scope and browser actions](marketing/video/hermes-connector-demo.gif) - ## Your Hermes session, inside the Chrome you already use Hermes Connector embeds the real local Hermes dashboard in Chrome's side panel. @@ -24,8 +26,6 @@ You decide which tabs each Hermes session may access, and the connector keeps that scope exact even when several projects, sessions, or Chrome profiles are running at the same time. -![Hermes Connector controlling an explicitly attached Chrome tab from the side panel](store/screenshot-product-1280x800.png) - With an attached tab, Hermes can: - inspect and read the visible page; @@ -73,7 +73,7 @@ It does not send this check to the internet. - Otherwise, use the panel's **Download companion** button and extract the ZIP. The current matching download is -[`hermes-connector-0.2.1-companion.zip`](https://github.com/CorsenAI/hermes-connector/releases/download/v0.2.1/hermes-connector-0.2.1-companion.zip). +[`hermes-connector-0.2.2-companion.zip`](https://github.com/CorsenAI/hermes-connector/releases/download/v0.2.2/hermes-connector-0.2.2-companion.zip). ### 3. Install the companion once @@ -97,7 +97,7 @@ In the Hermes Connector side panel: 1. Give this Chrome profile a recognizable name. 2. Paste the pairing code printed by the installer and save. 3. Select the Hermes profile and session you want to use. -4. Choose **Attach active tab** or **Choose tabs**. +4. Choose **Attach current** or open **Tabs**. 5. Ask Hermes to work with the selected page. For example: @@ -112,7 +112,7 @@ or: Click the requested action in my attached tab, then explain what changed. ``` -Tab titles and URLs are displayed locally when you open **Choose tabs** so that +Tab titles and URLs are displayed locally when you open **Tabs** so that you can make the selection yourself. ## Why a companion is required diff --git a/docs/ACCEPTANCE.md b/docs/ACCEPTANCE.md index bc2b056..9c66c81 100644 --- a/docs/ACCEPTANCE.md +++ b/docs/ACCEPTANCE.md @@ -53,7 +53,7 @@ the final packaged bits. - [x] End-to-end runs are completed in one and two isolated Chrome profiles. - [ ] A pre-submit end-to-end run loads the exact packaged ZIP in the intended signed-in Google Chrome profile. -- [ ] After publication, the existing Store ID serves 0.2.1 and its installed +- [ ] After publication, the existing Store ID serves 0.2.2 and its installed build passes a signed-in-profile smoke test. Evidence for checked gates is recorded in `TEST-EVIDENCE.md`. diff --git a/docs/ARCHITECTURE-V2.md b/docs/ARCHITECTURE-V2.md index d1a5940..d091b61 100644 --- a/docs/ARCHITECTURE-V2.md +++ b/docs/ARCHITECTURE-V2.md @@ -89,7 +89,7 @@ last-used, or first controllable tab. - A full Chrome restart preserves browser identity and session preference. Any tab that cannot be proven to be the same restored tab must be attached again. - Broker or Hermes restarts do not rotate the pairing code. -- When Chrome updates an older build to 0.2.1, it migrates only the legacy +- When Chrome updates an older build to a protocol-4 release (0.2.1+), it migrates only the legacy default 8765 address to 8766 and keeps a local notice visible until the user confirms the separately downloaded companion was reinstalled. The new port prevents a detached 0.2.0 broker from silently serving the hardened build. diff --git a/docs/TEST-EVIDENCE.md b/docs/TEST-EVIDENCE.md index 7caeb12..147f930 100644 --- a/docs/TEST-EVIDENCE.md +++ b/docs/TEST-EVIDENCE.md @@ -1,6 +1,37 @@ -# Test evidence — 2026-08-02 — 0.2.1 hotfix - -## Why 0.2.1 was required +# Test evidence — 2026-08-03 — 0.2.2 release candidate + +## Why 0.2.2 was required + +The public Store endpoint still served 0.2.0 while the 0.2.1 submission was +being evaluated. A deeper audit found that 0.2.1 was not ready to be treated as +the final corrective release: + +- the side panel called the browser "paired" when only Chrome and the local + broker were authenticated; it did not prove that the selected Hermes profile + had loaded the Connector tools; +- successful Connector responses included `"error": null`, which Hermes' generic + tool-result detector could misclassify as a failed browser call; +- switching Chrome tabs did not change the deliberately fixed Hermes target, + but the panel did not explain that distinction and could leave users looking + at a different page from the one Hermes controlled; +- internal, blank, loading, local-file, and Chrome Web Store pages did not all + produce an early, plain-language refusal; +- the tab/session controls consumed too much side-panel height and reduced the + actual Hermes chat; +- the first promotional video combined real extension chrome with a fixture + page and a prewritten Hermes result. It was rejected and removed from public + presentation rather than represented as live evidence. + +0.2.2 makes readiness depend on pairing, the selected profile appearing in the +broker's authenticated `agentProfiles`, and a real active tab binding; removes +false `error` keys from successful tool +results, reports and refreshes the real active Chrome tab without silently +changing authorization, blocks restricted/pending pages before execution, and +moves secondary controls into compact accessible overlays. The installer now +verifies every installed companion file byte-for-byte and rolls back on any +post-publication verification failure. + +## Why 0.2.1 was required (historical) The public 0.2.0 package was installable, but final use exposed production paths that the isolated release tests had not covered: @@ -90,10 +121,10 @@ exact broker process owning its random test port, kept the same `BridgeClient` alive, and observed a distinct replacement broker plus a restored authenticated connection. All temporary processes and data were removed afterward. -The 0.2.1 broker uses protocol 4 on the new default port 8766. Extension tests +The 0.2.2 broker uses protocol 4 on the default port 8766. Extension tests verify a one-shot migration of all legacy default 8765 URL forms before the first connection, while preserving a genuinely custom port. This prevents the -detached 0.2.0 broker from silently serving 0.2.1 after a normal Hermes restart; +detached 0.2.0 broker from silently serving a protocol-4 release after a normal Hermes restart; an incompatible protocol is rejected rather than used as a fallback. Broker persistence tests also verify that protocol 4 imports a validated legacy owner only once, ignores a late write from a still-running protocol-3 @@ -102,9 +133,9 @@ complete temporary files for concurrent atomic saves. ## Multi-profile installation -The 0.2.1 source installer was run locally without printing the pairing secret. +The 0.2.2 source installer is tested without printing the pairing secret. The shared home and every discovered named profile report -`hermes-connector` 0.2.1 enabled. The known conflicting legacy +`hermes-connector` 0.2.2 enabled. The known conflicting legacy `agent-bridge` payload is preserved but disabled only where its exact legacy signature is detected. @@ -115,19 +146,36 @@ named `hermes` cannot break Python discovery. The same Windows gate executes the normal-user `Install Hermes Connector.cmd` double-click path. Users must re-run the companion installer after creating a new named profile. -## Store artwork - -`store/screenshot-product-1280x800.png` was recaptured from the real 0.2.1 -extension panel at exactly 1280×800 with isolated fixture data. The icon, -440×280 tile, 1400×560 marquee, and screenshot pass the metadata and leakage -gates. +## Store artwork and verified live capture + +`store/screenshot-product-1280x800.png` is an exact 1280×800 OS-window capture +from the real 0.2.2 candidate. In an isolated profile, a real Hermes model called +`bridge_status`, `bridge_current_url`, and `bridge_read` against the exact +attached `https://example.com/` Chrome tab. The acceptance required +session-scoped `INFO … tool … completed` records for all three calls, +independently verified the exact Chrome URL/title and binding, then opened the +real side panel and captured only after that proven transcript was visible with +`Ready · Hermes + Chrome`. SHA-256: +`8F5DEAA207A2F513D5D9B6C5EF9E88CEBC44C9344209670095A71953AC7D3585`. + +The icon, 440×280 tile, 1400×560 marquee, and live capture pass the metadata and +leakage gates. The old prewritten fixture renderer now writes only under +`tests/artifacts/` by default and cannot overwrite the public product capture. + +The accepted 9.30-second 1920×1080 product video is generated from the same +proof-gated run after the transcript becomes visible. It shows the exact target, +the three real Connector tool calls, the real result, and the single authorized +tab popup without any marketing overlay or fake UI. Three decoded frames are +checked for valid contrast, the real Tabs open/close transition, and agreement +with the unobstructed final OS-window capture. SHA-256: +`DE91F39FC9E5CE225097F255CB620D324B47A436BD9BA034D1C608A4F01F239D`. ## Remaining external release evidence -- build the exact clean 0.2.1 archives and record their SHA-256 values; -- publish the matching GitHub 0.2.1 companion before changing the Store item; -- upload the 0.2.1 Chrome ZIP and updated screenshot to the Store; +- build the exact clean 0.2.2 archives and record their SHA-256 values; +- publish the matching GitHub 0.2.2 companion before changing the Store item; +- upload the 0.2.2 Chrome ZIP and verified replacement screenshot to the Store; - complete a pre-submit pass from the exact extracted ZIP in the intended signed-in Chrome profile; -- after publication, confirm the existing Store ID serves 0.2.1 and smoke-test +- after publication, confirm the existing Store ID serves 0.2.2 and smoke-test that Store-installed build. diff --git a/docs/index.html b/docs/index.html index aeca4a9..43c8286 100644 --- a/docs/index.html +++ b/docs/index.html @@ -34,12 +34,12 @@ "alternateName": "Hermes Connector", "url": "https://corsenai.github.io/hermes-connector/", "installUrl": "https://chromewebstore.google.com/detail/hermes-connector-%E2%80%94-by-cor/cdhaldcgafmkcnpanlmmpaebabnlledm", - "downloadUrl": "https://github.com/CorsenAI/hermes-connector/releases/download/v0.2.1/hermes-connector-0.2.1-companion.zip", + "downloadUrl": "https://github.com/CorsenAI/hermes-connector/releases/download/v0.2.2/hermes-connector-0.2.2-companion.zip", "applicationCategory": "BrowserApplication", "operatingSystem": "Google Chrome 120+ on Windows, macOS, and Linux", - "softwareVersion": "0.2.1", + "softwareVersion": "0.2.2", "description": "An unofficial Chrome browser extension that connects exact local Hermes Agent sessions to user-selected tabs in a real signed-in Chrome profile.", - "image": "https://raw.githubusercontent.com/CorsenAI/hermes-connector/main/store/store-icon-128.png", + "image": "https://raw.githubusercontent.com/CorsenAI/hermes-connector/main/store/screenshot-product-1280x800.png", "softwareRequirements": "Google Chrome 120 or later, a local Hermes installation, and the Hermes Connector companion", "publisher": { "@type": "Organization", @@ -113,7 +113,7 @@ .nav-links a:hover { color: #fff; } .hero { padding: 86px 0 54px; } - .hero-grid { display: grid; grid-template-columns: 1.02fr .98fr; align-items: center; gap: clamp(38px, 7vw, 88px); } + .hero-grid { display: grid; grid-template-columns: minmax(0, .82fr) minmax(520px, 1.18fr); gap: 48px; align-items: center; } .eyebrow { display: inline-flex; align-items: center; gap: 9px; margin: 0 0 18px; color: #8ce8fb; font-size: 13px; font-weight: 850; letter-spacing: .13em; text-transform: uppercase; } .eyebrow::before { content: ""; width: 8px; height: 8px; border-radius: 999px; background: var(--green); box-shadow: 0 0 17px var(--green); } h1 { max-width: 790px; margin: 0; font-size: clamp(43px, 6.2vw, 76px); line-height: .98; letter-spacing: -.057em; } @@ -247,14 +247,18 @@

Your Hermes session. Your chosen tabs.Hermes Connector links exact local Hermes Agent sessions to only the Chrome tabs you attach—inside the signed-in browser profile you already use.

Add to Chrome - Download companion 0.2.1 + Download companion 0.2.2 + Watch verified demo

Local companion required · Chrome 120+ · Windows, macOS, and Linux

- -
- Hermes Connector side panel attached to the Project Atlas tab in Chrome -
Hermes Connector routes the selected Hermes session to its explicitly attached tab.
+
+
+ Hermes Connector side panel showing a real Hermes model reading the explicitly attached Example Domain tab +
Verified live E2E · exact attached tab · real Hermes tool calls
+
diff --git a/docs/privacy/index.html b/docs/privacy/index.html index 5f6dbd7..395e94e 100644 --- a/docs/privacy/index.html +++ b/docs/privacy/index.html @@ -27,7 +27,7 @@

Privacy Policy

Hermes Connector lets a Hermes agent running on your computer read and control Chrome tabs that you explicitly attach. Corsen AI does not operate a relay, analytics service, account system, or telemetry endpoint for the extension.

Data the extension handles