Problem
session start / session open compute the connection-page URL from the harness's pinned EXTENSION_KEY (src/core/session/chrome.ts:8-15, src/core/session/protocol.ts:16). That id only exists for an unpacked build of tabbrew-cli/extension/. A user who installed TabBrew from the Chrome Web Store (id ikmpmkkcmhhnjmdiooekbhfmomcbefkf) gets a chrome-extension:// error tab, listening never turns true, and session start exits 1 even though the session itself is up.
The product extension is gaining the connection page and operator channel in colevels/tabbrew#100. Once that ships, the CLI must open the Store extension by default.
Proposal
- Add
PRODUCT_EXTENSION_ID = 'ikmpmkkcmhhnjmdiooekbhfmomcbefkf' to protocol.ts next to CONNECTION_PAGE. It is a public identifier; safe to commit.
connectionUrl() uses it by default.
- Add
TABBREW_EXTENSION_ID as an env override, resolved the same way TABBREW_CHROME is, so the harness and e2e keep working: the e2e suite sets it to extensionId(EXTENSION_KEY). Document it in the README env table alongside TABBREW_CHROME.
- The harness keeps its pinned
key so its id stays deterministic for Load unpacked; nothing changes in extension/wxt.config.ts.
- Fix the stale README line that says
wxt.config.ts derives optional_host_permissions; the code derives required host_permissions and the reason is in extension/README.md.
Rejected alternative
Putting the Store's public key into the harness manifest so both builds share the id. That would let an unpacked harness load as the product in a user's Chrome, and the harness README is explicit that it is not the product.
Sequencing
Ship after colevels/tabbrew#100 lands and the Store build is live, otherwise every session start opens an error tab. Note the pairing (minimum extension version) in the changelog and in the session start failure hint.
Acceptance
Problem
session start/session opencompute the connection-page URL from the harness's pinnedEXTENSION_KEY(src/core/session/chrome.ts:8-15,src/core/session/protocol.ts:16). That id only exists for an unpacked build oftabbrew-cli/extension/. A user who installed TabBrew from the Chrome Web Store (idikmpmkkcmhhnjmdiooekbhfmomcbefkf) gets achrome-extension://error tab,listeningnever turns true, andsession startexits 1 even though the session itself is up.The product extension is gaining the connection page and operator channel in colevels/tabbrew#100. Once that ships, the CLI must open the Store extension by default.
Proposal
PRODUCT_EXTENSION_ID = 'ikmpmkkcmhhnjmdiooekbhfmomcbefkf'toprotocol.tsnext toCONNECTION_PAGE. It is a public identifier; safe to commit.connectionUrl()uses it by default.TABBREW_EXTENSION_IDas an env override, resolved the same wayTABBREW_CHROMEis, so the harness and e2e keep working: the e2e suite sets it toextensionId(EXTENSION_KEY). Document it in the README env table alongsideTABBREW_CHROME.keyso its id stays deterministic forLoad unpacked; nothing changes inextension/wxt.config.ts.wxt.config.tsderivesoptional_host_permissions; the code derives requiredhost_permissionsand the reason is inextension/README.md.Rejected alternative
Putting the Store's public key into the harness manifest so both builds share the id. That would let an unpacked harness load as the product in a user's Chrome, and the harness README is explicit that it is not the product.
Sequencing
Ship after colevels/tabbrew#100 lands and the Store build is live, otherwise every
session startopens an error tab. Note the pairing (minimum extension version) in the changelog and in thesession startfailure hint.Acceptance
tabbrew session starton a machine with only the Store extension openschrome-extension://ikmpmkkcmhhnjmdiooekbhfmomcbefkf/connection.htmland reportslisteningTABBREW_EXTENSION_ID=<harness id> tabbrew session startstill opens the harness page;bun run test:e2epassesTABBREW_EXTENSION_ID; theoptional_host_permissionsline is corrected