first dated version. plugins were all sitting on 1.0.0, which said nothing about when a build was made or which of two copies is newer — the platform already uses YYYY.MM.DD.NN and this follows it. the version lives in manifest.ts because a plugin has no package.json; that is the field the marketplace publishes and the installer compares. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
51 lines
2.5 KiB
TypeScript
51 lines
2.5 KiB
TypeScript
import type { PluginManifest } from '@@/plugins/manifest';
|
|
|
|
// Browser — your own Chrome, driven from Officer, through an extension you install yourself.
|
|
//
|
|
// Extracted 2026-08-21, having been switched off since 2026-08-13. It was never a scraper: it attaches to
|
|
// the browser the person is already using, with their sessions, their logins and their tabs. That is the
|
|
// whole difference from `/scrape`, which stays in the platform and launches a headless chromium that
|
|
// knows nobody.
|
|
//
|
|
// extension/ the Chrome extension — the half that runs in the browser
|
|
// sidecar/ the relay it connects to, on a FIXED port, plus the CDP bridge
|
|
// api/ pairing, status, and the target verbs
|
|
// db/ one table: the salt each pairing's token is derived from
|
|
// web/ the tab list and preview panels
|
|
//
|
|
// ── Why the relay is a sidecar ──
|
|
//
|
|
// It listens on its own port, which is why it was switched off: the platform serves one. A sidecar is a
|
|
// process with its own listeners, so the objection disappears rather than being argued with.
|
|
export const manifest: PluginManifest = {
|
|
publisher: 'officerdev',
|
|
version: '2026.08.27.01',
|
|
platform: '>=1.0.0',
|
|
|
|
label: 'Browser',
|
|
summary: 'Drive your own browser from Officer — your tabs, your sessions, your logins',
|
|
/** your own sessions; also how agents drive a page. */
|
|
tags: ['Personal', 'Development'],
|
|
icon: 'Globe',
|
|
color: '#38bdf8',
|
|
|
|
permissions: [
|
|
{
|
|
key: 'browser-relay',
|
|
label: 'Browser',
|
|
description: 'Pair a browser and drive its tabs — screenshots, navigation, evaluated scripts',
|
|
// NOT owner-only, unlike desktop, and the difference is real: every route here is scoped by the
|
|
// caller's own pairing. A member pairs THEIR browser, and the relay resolves an extension's token
|
|
// to the account that minted it — so two accounts on one server drive two different browsers.
|
|
//
|
|
// That is also why this is not the platform's `browser` permission, which is `kind: 'execution'`
|
|
// and covers `/scrape`. Those are different things wearing the same word: one runs a headless
|
|
// chromium as the owner, this one attaches to whoever is holding the keyboard.
|
|
},
|
|
],
|
|
|
|
// Nothing to declare. The extension is installed by the person, into their own browser, and the relay
|
|
// is Bun — there is no host binary in the path at all. Chrome itself is deliberately NOT declared: it
|
|
// does not have to be on this machine, and on a remote pairing it is not.
|
|
};
|