@jobshimo/browser-link 0.18.3 → 0.19.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/bridge/ipc-client.d.ts +17 -0
- package/dist/bridge/ipc-client.js +42 -0
- package/dist/bridge/ipc-client.js.map +1 -1
- package/dist/bridge/protocol.d.ts +28 -1
- package/dist/bridge/protocol.js +17 -0
- package/dist/bridge/protocol.js.map +1 -1
- package/dist/bridge/server.d.ts +13 -0
- package/dist/bridge/server.js +10 -0
- package/dist/bridge/server.js.map +1 -1
- package/dist/bridge/ws-bridge.d.ts +32 -0
- package/dist/bridge/ws-bridge.js +52 -1
- package/dist/bridge/ws-bridge.js.map +1 -1
- package/dist/cli.js +23 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/about.js +64 -43
- package/dist/commands/about.js.map +1 -1
- package/dist/commands/config.d.ts +17 -0
- package/dist/commands/config.js +158 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/extension.js +2 -2
- package/dist/commands/extension.js.map +1 -1
- package/dist/commands/welcome.js +5 -5
- package/dist/commands/welcome.js.map +1 -1
- package/dist/config.d.ts +38 -0
- package/dist/config.js +25 -0
- package/dist/config.js.map +1 -1
- package/dist/extension/background.js +126 -29
- package/dist/extension/background.js.map +1 -1
- package/dist/extension/idle-policy.d.ts +106 -0
- package/dist/extension/idle-policy.js +132 -0
- package/dist/extension/idle-policy.js.map +1 -0
- package/dist/extension/manifest.json +1 -1
- package/dist/extension/popup.d.ts +1 -38
- package/dist/extension/popup.html +45 -0
- package/dist/extension/popup.js +87 -5
- package/dist/extension/popup.js.map +1 -1
- package/dist/messages.d.ts +26 -1
- package/dist/server.js +7 -2
- package/dist/server.js.map +1 -1
- package/dist/ui/screens/extension.js +2 -2
- package/dist/ui/screens/extension.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure decision logic for the WS-idle sweep's user-configurable timeout.
|
|
3
|
+
*
|
|
4
|
+
* Deliberately kept free of chrome.* — background.ts owns the
|
|
5
|
+
* `chrome.storage` I/O and the `setInterval` loop that drives the actual
|
|
6
|
+
* sweep, popup.ts owns the settings control that writes the value; both
|
|
7
|
+
* import the constants and pure functions here so the disconnect decision
|
|
8
|
+
* itself is unit-tested without mocking timers or storage. Same separation
|
|
9
|
+
* `settle.ts` already established for the click/type/press settle wait.
|
|
10
|
+
*/
|
|
11
|
+
/** chrome.storage key the setting is persisted under, in `chrome.storage.local`
|
|
12
|
+
* (a per-device preference, not something that should sync across machines
|
|
13
|
+
* the way a bookmark would — mirrors the local-only intent of the existing
|
|
14
|
+
* `prevTabId:*` session keys, just in a persistent area instead of
|
|
15
|
+
* `chrome.storage.session`). */
|
|
16
|
+
export const IDLE_TTL_STORAGE_KEY = 'idleTtlMinutes';
|
|
17
|
+
/**
|
|
18
|
+
* chrome.storage key for the epoch-ms timestamp of the last LOCAL write to
|
|
19
|
+
* `IDLE_TTL_STORAGE_KEY` — i.e. from the popup's own control, not from an
|
|
20
|
+
* incoming `settings.update` (see `shouldAcceptIncomingSettings`). Mirrors
|
|
21
|
+
* the server-side `idleTtlUpdatedAt` config field (`packages/server/src/
|
|
22
|
+
* config.ts`) by name, since both sides compare one against the other.
|
|
23
|
+
*/
|
|
24
|
+
export const IDLE_TTL_UPDATED_AT_STORAGE_KEY = 'idleTtlUpdatedAt';
|
|
25
|
+
/** Sentinel value for "auto-disconnect disabled" — surfaced in the popup as
|
|
26
|
+
* "Never". Stored and compared as a plain number so the setting round-trips
|
|
27
|
+
* through `chrome.storage` and a `<select>` value without a union type. */
|
|
28
|
+
export const IDLE_TTL_NEVER = 0;
|
|
29
|
+
/** Default TTL for new installs and any malformed stored value. Matches the
|
|
30
|
+
* fixed 30-minute constant this feature replaces, so existing users see no
|
|
31
|
+
* behavior change until they open the popup and pick something else. */
|
|
32
|
+
export const DEFAULT_IDLE_TTL_MINUTES = 30;
|
|
33
|
+
/** Safety-rail bounds for any non-"never" value — see `clampIdleTtlMinutes`. */
|
|
34
|
+
export const MIN_IDLE_TTL_MINUTES = 1;
|
|
35
|
+
export const MAX_IDLE_TTL_MINUTES = 1440; // 24h — generous ceiling, still a same-day bound.
|
|
36
|
+
/**
|
|
37
|
+
* Clamp an arbitrary stored or incoming value into a safe `idleTtlMinutes`.
|
|
38
|
+
*
|
|
39
|
+
* `IDLE_TTL_NEVER` (0) passes through untouched — "never" is a valid,
|
|
40
|
+
* intentional choice, not an out-of-range one to be corrected. Anything
|
|
41
|
+
* else that isn't a finite integer, or falls outside
|
|
42
|
+
* `[MIN_IDLE_TTL_MINUTES, MAX_IDLE_TTL_MINUTES]`, falls back to
|
|
43
|
+
* `DEFAULT_IDLE_TTL_MINUTES` rather than being clamped to the nearest
|
|
44
|
+
* boundary — a malformed value (corrupted storage, a hand-edited value, a
|
|
45
|
+
* future downgrade) should not silently turn into a surprising 1440-minute
|
|
46
|
+
* timeout.
|
|
47
|
+
*/
|
|
48
|
+
export function clampIdleTtlMinutes(value) {
|
|
49
|
+
if (value === IDLE_TTL_NEVER)
|
|
50
|
+
return IDLE_TTL_NEVER;
|
|
51
|
+
if (typeof value !== 'number' || !Number.isFinite(value) || !Number.isInteger(value)) {
|
|
52
|
+
return DEFAULT_IDLE_TTL_MINUTES;
|
|
53
|
+
}
|
|
54
|
+
if (value < MIN_IDLE_TTL_MINUTES || value > MAX_IDLE_TTL_MINUTES) {
|
|
55
|
+
return DEFAULT_IDLE_TTL_MINUTES;
|
|
56
|
+
}
|
|
57
|
+
return value;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Decide whether a tab whose last activity landed at `lastActivityAt`
|
|
61
|
+
* should be disconnected by the idle sweep, given the user's
|
|
62
|
+
* `idleTtlMinutes` setting and the current time `now`. Pure — no timers,
|
|
63
|
+
* no `chrome.*` — background.ts's sweep loop calls this once per connected
|
|
64
|
+
* tab on every tick.
|
|
65
|
+
*
|
|
66
|
+
* The comparison is against the ABSOLUTE last-activity time, not the
|
|
67
|
+
* moment the setting last changed: lowering the TTL (e.g. never → 5 min)
|
|
68
|
+
* immediately puts any tab that has already been idle longer than the new
|
|
69
|
+
* value past the threshold, so it disconnects on the next sweep tick.
|
|
70
|
+
*/
|
|
71
|
+
export function shouldDisconnectForIdle(lastActivityAt, now, idleTtlMinutes) {
|
|
72
|
+
if (idleTtlMinutes === IDLE_TTL_NEVER)
|
|
73
|
+
return false;
|
|
74
|
+
const ttlMs = idleTtlMinutes * 60_000;
|
|
75
|
+
return now - lastActivityAt >= ttlMs;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Whether the sweep tick is worth doing any work for. When the setting is
|
|
79
|
+
* "never", `shouldDisconnectForIdle` returns `false` for every tab
|
|
80
|
+
* regardless, so the sweep loop can skip walking `tabStates` entirely
|
|
81
|
+
* instead of iterating it for nothing every `WS_IDLE_SWEEP_MS`.
|
|
82
|
+
*/
|
|
83
|
+
export function shouldScheduleIdleSweep(idleTtlMinutes) {
|
|
84
|
+
return idleTtlMinutes !== IDLE_TTL_NEVER;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Precedence rule for an incoming `settings.update` WS message (see
|
|
88
|
+
* `@browser-link/shared`'s `SettingsUpdatePayload`) against the value
|
|
89
|
+
* already stored locally (edited from the popup, or a previous
|
|
90
|
+
* `settings.update`): NEWEST WRITE WINS, decided purely by comparing
|
|
91
|
+
* epoch-ms timestamps.
|
|
92
|
+
*
|
|
93
|
+
* `localUpdatedAt` is `undefined` exactly once per install — before the
|
|
94
|
+
* popup has ever been used to change the setting. In that case there is no
|
|
95
|
+
* local intent to protect, so the incoming value is always accepted
|
|
96
|
+
* (this is what lets a value set via `browser-link config set idle-ttl`
|
|
97
|
+
* before the extension was ever configured actually take effect on first
|
|
98
|
+
* connect, instead of losing to a "local wins by default" rule).
|
|
99
|
+
*
|
|
100
|
+
* Comparing raw wall-clock timestamps across the server (Node) and browser
|
|
101
|
+
* processes is safe specifically because browser-link is a loopback-only
|
|
102
|
+
* bridge — both always run on the SAME machine and therefore share one
|
|
103
|
+
* clock. This would NOT be a safe pattern for a distributed, multi-host
|
|
104
|
+
* system.
|
|
105
|
+
*/
|
|
106
|
+
export function shouldAcceptIncomingSettings(localUpdatedAt, incomingUpdatedAt) {
|
|
107
|
+
if (localUpdatedAt === undefined)
|
|
108
|
+
return true;
|
|
109
|
+
return incomingUpdatedAt > localUpdatedAt;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Runtime shape guard for the `settings` field of an incoming
|
|
113
|
+
* `settings.update` WS message. The message arrives as untrusted JSON —
|
|
114
|
+
* background.ts's `safeParse` is only a cast, not a validation — so a
|
|
115
|
+
* malformed payload (missing or mistyped fields) must be rejected HERE, at
|
|
116
|
+
* the wire boundary, instead of throwing inside the async apply path where
|
|
117
|
+
* the error would be silently swallowed as a dropped sync. Mirrors the
|
|
118
|
+
* rigor the IPC `settings.push` frame already gets in the server's
|
|
119
|
+
* protocol.ts parser. Returns the narrowed payload, or `null` when the
|
|
120
|
+
* shape is wrong.
|
|
121
|
+
*/
|
|
122
|
+
export function parseIncomingSettings(value) {
|
|
123
|
+
if (!value || typeof value !== 'object')
|
|
124
|
+
return null;
|
|
125
|
+
const s = value;
|
|
126
|
+
if (typeof s.idleTtlMinutes !== 'number' || !Number.isFinite(s.idleTtlMinutes))
|
|
127
|
+
return null;
|
|
128
|
+
if (typeof s.updatedAt !== 'number' || !Number.isFinite(s.updatedAt))
|
|
129
|
+
return null;
|
|
130
|
+
return { idleTtlMinutes: s.idleTtlMinutes, updatedAt: s.updatedAt };
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=idle-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idle-policy.js","sourceRoot":"","sources":["../src/idle-policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;gCAIgC;AAChC,MAAM,CAAC,MAAM,oBAAoB,GAAG,gBAAgB,CAAC;AAErD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG,kBAAkB,CAAC;AAElE;;2EAE2E;AAC3E,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC;AAEhC;;wEAEwE;AACxE,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,CAAC;AAE3C,gFAAgF;AAChF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AACtC,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC,CAAC,kDAAkD;AAE5F;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,IAAI,KAAK,KAAK,cAAc;QAAE,OAAO,cAAc,CAAC;IACpD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QACrF,OAAO,wBAAwB,CAAC;IAClC,CAAC;IACD,IAAI,KAAK,GAAG,oBAAoB,IAAI,KAAK,GAAG,oBAAoB,EAAE,CAAC;QACjE,OAAO,wBAAwB,CAAC;IAClC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,uBAAuB,CACrC,cAAsB,EACtB,GAAW,EACX,cAAsB;IAEtB,IAAI,cAAc,KAAK,cAAc;QAAE,OAAO,KAAK,CAAC;IACpD,MAAM,KAAK,GAAG,cAAc,GAAG,MAAM,CAAC;IACtC,OAAO,GAAG,GAAG,cAAc,IAAI,KAAK,CAAC;AACvC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CAAC,cAAsB;IAC5D,OAAO,cAAc,KAAK,cAAc,CAAC;AAC3C,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,4BAA4B,CAC1C,cAAkC,EAClC,iBAAyB;IAEzB,IAAI,cAAc,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAC9C,OAAO,iBAAiB,GAAG,cAAc,CAAC;AAC5C,CAAC;AAQD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACrD,MAAM,CAAC,GAAG,KAAgC,CAAC;IAC3C,IAAI,OAAO,CAAC,CAAC,cAAc,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5F,IAAI,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IAClF,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC,cAAc,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC;AACtE,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"manifest_version": 3,
|
|
3
3
|
"name": "browser-link",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.19.1",
|
|
5
5
|
"description": "Bridge between Chrome and an MCP client (Claude Code, OpenCode, GitHub Copilot CLI, …). Per-tab manual activation.",
|
|
6
6
|
"permissions": [
|
|
7
7
|
"debugger",
|
|
@@ -1,38 +1 @@
|
|
|
1
|
-
|
|
2
|
-
ok: boolean;
|
|
3
|
-
error?: string;
|
|
4
|
-
serverTabId?: string;
|
|
5
|
-
}
|
|
6
|
-
interface StatusResult {
|
|
7
|
-
connected: boolean;
|
|
8
|
-
serverTabId?: string;
|
|
9
|
-
}
|
|
10
|
-
interface PendingDialogInfo {
|
|
11
|
-
type: string;
|
|
12
|
-
message: string;
|
|
13
|
-
default_prompt?: string;
|
|
14
|
-
url?: string;
|
|
15
|
-
}
|
|
16
|
-
interface PendingDialogResult {
|
|
17
|
-
pending: PendingDialogInfo | null;
|
|
18
|
-
}
|
|
19
|
-
interface VersionCheckResult {
|
|
20
|
-
extension: string;
|
|
21
|
-
server: string | null;
|
|
22
|
-
aligned: boolean | null;
|
|
23
|
-
}
|
|
24
|
-
type CardState = 'idle' | 'connecting' | 'connected' | 'error' | 'portCollision';
|
|
25
|
-
declare function getCurrentTab(): Promise<chrome.tabs.Tab | undefined>;
|
|
26
|
-
declare function send<T>(payload: unknown): Promise<T>;
|
|
27
|
-
declare function $(id: string): HTMLElement;
|
|
28
|
-
declare function setCardState(state: CardState): void;
|
|
29
|
-
declare function setStatus(state: CardState, label: string, tabId?: string): void;
|
|
30
|
-
declare function setExplanation(html: string | null): void;
|
|
31
|
-
declare function setAction(label: string, variant: 'primary' | 'danger', disabled?: boolean): void;
|
|
32
|
-
declare function renderVersionBanner(check: VersionCheckResult): void;
|
|
33
|
-
declare function refreshVersionBanner(): Promise<void>;
|
|
34
|
-
declare function renderPendingDialog(pending: PendingDialogInfo | null): void;
|
|
35
|
-
declare function refreshPendingDialog(tabId: number): Promise<void>;
|
|
36
|
-
declare function refresh(): Promise<void>;
|
|
37
|
-
declare function respondToDialog(accept: boolean): Promise<void>;
|
|
38
|
-
declare function onAction(): Promise<void>;
|
|
1
|
+
export {};
|
|
@@ -425,6 +425,34 @@
|
|
|
425
425
|
.version-banner button {
|
|
426
426
|
margin-top: 0;
|
|
427
427
|
}
|
|
428
|
+
|
|
429
|
+
/* Idle-disconnect TTL setting — a small, always-visible control
|
|
430
|
+
* (not tied to card state) that lets the user override the fixed
|
|
431
|
+
* 30-minute auto-disconnect. Sits below the primary action, in its
|
|
432
|
+
* own thin row echoing .explanation's divider treatment. */
|
|
433
|
+
.settings-row {
|
|
434
|
+
margin-top: 12px;
|
|
435
|
+
padding-top: 10px;
|
|
436
|
+
border-top: 1px solid rgba(15, 23, 42, 0.06);
|
|
437
|
+
display: flex;
|
|
438
|
+
align-items: center;
|
|
439
|
+
justify-content: space-between;
|
|
440
|
+
gap: 8px;
|
|
441
|
+
font-size: 11.5px;
|
|
442
|
+
color: var(--text-muted);
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
.settings-row select {
|
|
446
|
+
font-family: inherit;
|
|
447
|
+
font-size: 11.5px;
|
|
448
|
+
font-weight: 500;
|
|
449
|
+
color: var(--text);
|
|
450
|
+
background: var(--bg);
|
|
451
|
+
border: 1px solid var(--border);
|
|
452
|
+
border-radius: 6px;
|
|
453
|
+
padding: 4px 6px;
|
|
454
|
+
cursor: pointer;
|
|
455
|
+
}
|
|
428
456
|
</style>
|
|
429
457
|
</head>
|
|
430
458
|
<body>
|
|
@@ -508,6 +536,23 @@
|
|
|
508
536
|
</div>
|
|
509
537
|
</div>
|
|
510
538
|
|
|
539
|
+
<!-- Idle-disconnect TTL. Not tied to card/connection state — visible
|
|
540
|
+
and editable whether or not a tab is currently connected.
|
|
541
|
+
Changes apply immediately, no extension reload needed (popup.ts
|
|
542
|
+
writes straight to chrome.storage.local; background.ts's sweep
|
|
543
|
+
reads the live value via chrome.storage.onChanged). -->
|
|
544
|
+
<div class="settings-row">
|
|
545
|
+
<label for="idle-ttl-select">Auto-disconnect idle tabs</label>
|
|
546
|
+
<select id="idle-ttl-select">
|
|
547
|
+
<option value="5">5 min</option>
|
|
548
|
+
<option value="15">15 min</option>
|
|
549
|
+
<option value="30">30 min</option>
|
|
550
|
+
<option value="60">60 min</option>
|
|
551
|
+
<option value="120">120 min</option>
|
|
552
|
+
<option value="0">Never</option>
|
|
553
|
+
</select>
|
|
554
|
+
</div>
|
|
555
|
+
|
|
511
556
|
<div class="footer">manual · per-tab · loopback only</div>
|
|
512
557
|
</div>
|
|
513
558
|
|
package/dist/extension/popup.js
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
// idle-policy.ts IS shared with popup.ts (unlike the runtime-message shapes
|
|
2
|
+
// mirrored below) — both entrypoints compile to sibling files under dist/,
|
|
3
|
+
// so a plain relative import works the same way background.ts already
|
|
4
|
+
// imports settle.js/keymap.js.
|
|
5
|
+
import { IDLE_TTL_STORAGE_KEY, IDLE_TTL_UPDATED_AT_STORAGE_KEY, clampIdleTtlMinutes, } from './idle-policy.js';
|
|
2
6
|
async function getCurrentTab() {
|
|
3
7
|
const [tab] = await chrome.tabs.query({ active: true, currentWindow: true });
|
|
4
8
|
return tab;
|
|
@@ -70,6 +74,74 @@ async function refreshVersionBanner() {
|
|
|
70
74
|
const check = await send({ action: 'versionCheck' });
|
|
71
75
|
renderVersionBanner(check);
|
|
72
76
|
}
|
|
77
|
+
/**
|
|
78
|
+
* Idle-disconnect TTL control. Reads/writes `chrome.storage.local`
|
|
79
|
+
* directly — no round trip through background.ts's runtime-message
|
|
80
|
+
* protocol is needed, since the popup already holds the "storage"
|
|
81
|
+
* permission and background.ts independently reacts to the same key via
|
|
82
|
+
* `chrome.storage.onChanged` (see background.ts's `idleTtlMinutesCache`).
|
|
83
|
+
*
|
|
84
|
+
* Refreshed on the same periodic timer as the version banner / pending
|
|
85
|
+
* dialog (see the `setInterval` near the bottom of this file), so a value
|
|
86
|
+
* pushed by the server (`browser-link config set idle-ttl` while this
|
|
87
|
+
* popup happens to be open) shows up within one tick instead of only on
|
|
88
|
+
* the next popup open.
|
|
89
|
+
*/
|
|
90
|
+
/** DOM id of the synthetic <option> injected for out-of-preset values. */
|
|
91
|
+
const IDLE_TTL_CUSTOM_OPTION_ID = 'idle-ttl-custom';
|
|
92
|
+
/**
|
|
93
|
+
* Make sure the select can actually DISPLAY `minutes`. The popup only
|
|
94
|
+
* ships a curated preset list (5/15/30/60/120/Never), but the CLI accepts
|
|
95
|
+
* any 1-1440 — so `browser-link config set idle-ttl 45` is a perfectly
|
|
96
|
+
* valid effective value with no matching <option>, which would otherwise
|
|
97
|
+
* leave the control rendering BLANK (selectedIndex -1) while the policy
|
|
98
|
+
* correctly enforces 45. Inject a synthetic "45 min (custom)" option in
|
|
99
|
+
* that case (kept just before "Never" so the preset order stays intact),
|
|
100
|
+
* and remove it again once the effective value is back on a preset.
|
|
101
|
+
*/
|
|
102
|
+
function ensureIdleTtlOption(select, minutes) {
|
|
103
|
+
const value = String(minutes);
|
|
104
|
+
const custom = document.getElementById(IDLE_TTL_CUSTOM_OPTION_ID);
|
|
105
|
+
const hasPreset = Array.from(select.options).some((opt) => opt.id !== IDLE_TTL_CUSTOM_OPTION_ID && opt.value === value);
|
|
106
|
+
if (hasPreset) {
|
|
107
|
+
custom?.remove();
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
const option = custom ?? document.createElement('option');
|
|
111
|
+
option.id = IDLE_TTL_CUSTOM_OPTION_ID;
|
|
112
|
+
option.value = value;
|
|
113
|
+
option.textContent = `${minutes} min (custom)`;
|
|
114
|
+
if (!custom) {
|
|
115
|
+
const neverOption = Array.from(select.options).find((opt) => opt.value === '0') ?? null;
|
|
116
|
+
select.insertBefore(option, neverOption);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
async function refreshIdleTtlSetting() {
|
|
120
|
+
const select = $('idle-ttl-select');
|
|
121
|
+
// Never clobber a selection while the user has the dropdown focused —
|
|
122
|
+
// an incoming settings.update mid-edit should not yank the control out
|
|
123
|
+
// from under them.
|
|
124
|
+
if (document.activeElement === select)
|
|
125
|
+
return;
|
|
126
|
+
const data = await chrome.storage.local.get(IDLE_TTL_STORAGE_KEY);
|
|
127
|
+
const minutes = clampIdleTtlMinutes(data[IDLE_TTL_STORAGE_KEY]);
|
|
128
|
+
ensureIdleTtlOption(select, minutes);
|
|
129
|
+
select.value = String(minutes);
|
|
130
|
+
}
|
|
131
|
+
async function onIdleTtlChange() {
|
|
132
|
+
const select = $('idle-ttl-select');
|
|
133
|
+
const minutes = clampIdleTtlMinutes(Number(select.value));
|
|
134
|
+
// Reflect the clamped value back into the control immediately in case
|
|
135
|
+
// Number(select.value) ever disagreed with it (it won't, in practice —
|
|
136
|
+
// every <option> is a safe preset or a clamped CLI value the synthetic
|
|
137
|
+
// custom entry mirrors — but this keeps the displayed value truthful to
|
|
138
|
+
// what was actually persisted).
|
|
139
|
+
select.value = String(minutes);
|
|
140
|
+
await chrome.storage.local.set({
|
|
141
|
+
[IDLE_TTL_STORAGE_KEY]: minutes,
|
|
142
|
+
[IDLE_TTL_UPDATED_AT_STORAGE_KEY]: Date.now(),
|
|
143
|
+
});
|
|
144
|
+
}
|
|
73
145
|
function renderPendingDialog(pending) {
|
|
74
146
|
const box = $('dialog-box');
|
|
75
147
|
if (pending === null) {
|
|
@@ -193,13 +265,20 @@ $('version-open-extensions').addEventListener('click', () => {
|
|
|
193
265
|
// it does NOT re-read the filesystem).
|
|
194
266
|
void chrome.tabs.create({ url: `chrome://extensions/?id=${chrome.runtime.id}` });
|
|
195
267
|
});
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
//
|
|
199
|
-
//
|
|
268
|
+
$('idle-ttl-select').addEventListener('change', () => {
|
|
269
|
+
onIdleTtlChange().catch(() => {
|
|
270
|
+
// Best effort — the next refreshIdleTtlSetting tick re-syncs the
|
|
271
|
+
// control to whatever actually made it into storage.
|
|
272
|
+
});
|
|
273
|
+
});
|
|
274
|
+
// Poll for pending dialogs, version drift, AND the idle-ttl setting while
|
|
275
|
+
// the popup is open. Cheap (one round trip per concern, fast paths return
|
|
276
|
+
// null/aligned/unchanged) and only runs while the popup window is visible
|
|
277
|
+
// — Chrome unloads the popup on close.
|
|
200
278
|
setInterval(() => {
|
|
201
279
|
void (async () => {
|
|
202
280
|
await refreshVersionBanner();
|
|
281
|
+
await refreshIdleTtlSetting();
|
|
203
282
|
const tab = await getCurrentTab();
|
|
204
283
|
if (!tab?.id)
|
|
205
284
|
return;
|
|
@@ -209,4 +288,7 @@ setInterval(() => {
|
|
|
209
288
|
refresh().catch((err) => {
|
|
210
289
|
setStatus('error', err instanceof Error ? err.message : String(err));
|
|
211
290
|
});
|
|
291
|
+
refreshIdleTtlSetting().catch(() => {
|
|
292
|
+
// Best effort — the periodic timer above retries every 800ms regardless.
|
|
293
|
+
});
|
|
212
294
|
//# sourceMappingURL=popup.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"popup.js","sourceRoot":"","sources":["../src/popup.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"popup.js","sourceRoot":"","sources":["../src/popup.ts"],"names":[],"mappings":"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"}
|
package/dist/messages.d.ts
CHANGED
|
@@ -69,5 +69,30 @@ export interface BridgeEventMessage {
|
|
|
69
69
|
tabId?: TabId;
|
|
70
70
|
data: Record<string, unknown>;
|
|
71
71
|
}
|
|
72
|
+
/**
|
|
73
|
+
* Server-pushed settings, currently just the idle-disconnect TTL
|
|
74
|
+
* (`browser-link config get/set idle-ttl`). The same logical setting is
|
|
75
|
+
* also editable from the extension's own popup, so both sides need a
|
|
76
|
+
* precedence rule for "who wins" when they disagree:
|
|
77
|
+
*
|
|
78
|
+
* `updatedAt` is the epoch-ms timestamp of when THIS value was written on
|
|
79
|
+
* the server side. The extension compares it against the `updatedAt` it
|
|
80
|
+
* stamped on its own last LOCAL write (from the popup) and only applies
|
|
81
|
+
* the incoming value when it is newer — see the extension's
|
|
82
|
+
* `idle-policy.ts` (`shouldAcceptIncomingSettings`) and the README's
|
|
83
|
+
* "Idle disconnect" section for the full precedence writeup. Comparing raw
|
|
84
|
+
* wall-clock timestamps across processes is safe here specifically because
|
|
85
|
+
* the server and the browser always run on the same machine (loopback-only
|
|
86
|
+
* bridge) and therefore share one clock — this would NOT be a safe pattern
|
|
87
|
+
* for a distributed, multi-host system.
|
|
88
|
+
*/
|
|
89
|
+
export interface SettingsUpdatePayload {
|
|
90
|
+
idleTtlMinutes: number;
|
|
91
|
+
updatedAt: number;
|
|
92
|
+
}
|
|
93
|
+
export interface SettingsUpdateMessage {
|
|
94
|
+
kind: 'settings.update';
|
|
95
|
+
settings: SettingsUpdatePayload;
|
|
96
|
+
}
|
|
72
97
|
export type ExtensionToServer = TabRegisterMessage | ToolResponseMessage | BridgeEventMessage;
|
|
73
|
-
export type ServerToExtension = TabRegisteredMessage | ToolRequestMessage;
|
|
98
|
+
export type ServerToExtension = TabRegisteredMessage | ToolRequestMessage | SettingsUpdateMessage;
|
package/dist/server.js
CHANGED
|
@@ -11,7 +11,7 @@ import { IpcServer } from './bridge/server.js';
|
|
|
11
11
|
import { runProxy } from './bridge/proxy.js';
|
|
12
12
|
import { BridgeEventLog } from './bridge/events.js';
|
|
13
13
|
import { TabClaimRegistry } from './tools/tab-claims.js';
|
|
14
|
-
import { WS_HOST, WS_PORT, isAddrInUse, sendToolRequest, startWsBridge, } from './bridge/ws-bridge.js';
|
|
14
|
+
import { WS_HOST, WS_PORT, isAddrInUse, pushSettingsToAllTabs, sendToolRequest, startWsBridge, } from './bridge/ws-bridge.js';
|
|
15
15
|
export { WS_HOST, WS_PORT };
|
|
16
16
|
const DEFAULT_TIMEOUT_MS = 15_000;
|
|
17
17
|
function log(msg) {
|
|
@@ -219,7 +219,12 @@ async function runPrimary(cfg) {
|
|
|
219
219
|
// behaviour identical for users who never enable the feature.
|
|
220
220
|
let ipcServer = null;
|
|
221
221
|
if (cfg.multiAgent === true) {
|
|
222
|
-
ipcServer = new IpcServer(dispatchDeps
|
|
222
|
+
ipcServer = new IpcServer(dispatchDeps, {
|
|
223
|
+
// Lets `browser-link config set idle-ttl` reach already-connected
|
|
224
|
+
// tabs immediately instead of waiting for their next reconnect — see
|
|
225
|
+
// ws-bridge.ts's pushSettingsToAllTabs and cli.ts's config command.
|
|
226
|
+
pushSettings: (settings) => pushSettingsToAllTabs(tabs, settings),
|
|
227
|
+
});
|
|
223
228
|
try {
|
|
224
229
|
await ipcServer.start();
|
|
225
230
|
}
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,7 +19,7 @@ const EXT_I18N = {
|
|
|
19
19
|
title: 'Chrome extension — install steps',
|
|
20
20
|
pathLabel: 'Extension assets are at',
|
|
21
21
|
stepsLabel: 'Steps',
|
|
22
|
-
afterLoading: 'After loading, open the extension popup on any tab and click "
|
|
22
|
+
afterLoading: 'After loading, open the extension popup on any tab and click "Connect this tab" to bridge it.',
|
|
23
23
|
notFound: 'Extension assets not found. Run `npm run build:extension` (dev) or reinstall the package.',
|
|
24
24
|
footerBack: 'back to menu',
|
|
25
25
|
footerBackKey: 'back',
|
|
@@ -28,7 +28,7 @@ const EXT_I18N = {
|
|
|
28
28
|
title: 'Extensión de Chrome — pasos de instalación',
|
|
29
29
|
pathLabel: 'Los assets de la extensión están en',
|
|
30
30
|
stepsLabel: 'Pasos',
|
|
31
|
-
afterLoading: 'Después de cargarla, abrí el popup de la extensión en cualquier pestaña y hacé click en "
|
|
31
|
+
afterLoading: 'Después de cargarla, abrí el popup de la extensión en cualquier pestaña y hacé click en "Connect this tab" para puentearla.',
|
|
32
32
|
notFound: 'No se encontraron los assets. Corré `npm run build:extension` (dev) o reinstalá el paquete.',
|
|
33
33
|
footerBack: 'volver al menú',
|
|
34
34
|
footerBackKey: 'volver',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension.js","sourceRoot":"","sources":["../../../src/ui/screens/extension.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAEjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAG/D;;;;;;;;;GASG;AACH,MAAM,QAAQ,GAWV;IACF,EAAE,EAAE;QACF,KAAK,EAAE,kCAAkC;QACzC,SAAS,EAAE,yBAAyB;QACpC,UAAU,EAAE,OAAO;QACnB,YAAY,EACV
|
|
1
|
+
{"version":3,"file":"extension.js","sourceRoot":"","sources":["../../../src/ui/screens/extension.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAEjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAG/D;;;;;;;;;GASG;AACH,MAAM,QAAQ,GAWV;IACF,EAAE,EAAE;QACF,KAAK,EAAE,kCAAkC;QACzC,SAAS,EAAE,yBAAyB;QACpC,UAAU,EAAE,OAAO;QACnB,YAAY,EACV,+FAA+F;QACjG,QAAQ,EACN,2FAA2F;QAC7F,UAAU,EAAE,cAAc;QAC1B,aAAa,EAAE,MAAM;KACtB;IACD,EAAE,EAAE;QACF,KAAK,EAAE,4CAA4C;QACnD,SAAS,EAAE,qCAAqC;QAChD,UAAU,EAAE,OAAO;QACnB,YAAY,EACV,6HAA6H;QAC/H,QAAQ,EACN,6FAA6F;QAC/F,UAAU,EAAE,gBAAgB;QAC5B,aAAa,EAAE,QAAQ;KACxB;CACF,CAAC;AAMF,MAAM,UAAU,aAAa,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAsB;IACpE,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC7B,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAC;IAChC,QAAQ,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;QACvB,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM;YAAE,MAAM,EAAE,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,OAAO,CACL,KAAC,KAAK,IACJ,KAAK,EAAE,CAAC,CAAC,KAAK,EACd,MAAM,EACJ,KAAC,UAAU,IACT,KAAK,EAAE;gBACL,EAAE,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,UAAU,EAAE;gBACxC,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,aAAa,EAAE;aACrC,GACD,YAGH,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CACX,8BACE,KAAC,IAAI,IAAC,IAAI,kBAAE,CAAC,CAAC,SAAS,GAAQ,EAC/B,KAAC,GAAG,IAAC,WAAW,EAAE,CAAC,YACjB,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,YAAG,IAAI,CAAC,IAAI,GAAQ,GAC3C,EACN,KAAC,WAAW,cAAE,CAAC,CAAC,UAAU,GAAe,EACzC,KAAC,IAAI,cAAE,IAAI,CAAC,KAAK,GAAQ,EACzB,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,IAAI,IAAC,MAAM,QAAC,QAAQ,kBAClB,CAAC,CAAC,YAAY,GACV,GACH,IACL,CACJ,CAAC,CAAC,CAAC,CACF,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,IAAI,YAAG,CAAC,CAAC,QAAQ,GAAQ,CAC9C,GACK,CACT,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jobshimo/browser-link",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.19.1",
|
|
4
4
|
"description": "MCP server that bridges Claude Code, OpenCode, GitHub Copilot CLI and other MCP clients to a Chrome tab. Per-tool permissions, multi-agent mode (multiple MCP clients sharing one bridge), persistent UI map across sessions.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"mcp",
|