@opentabs-dev/browser-extension 0.0.52 → 0.0.53
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/dist/background-message-handlers.d.ts +24 -3
- package/dist/background-message-handlers.d.ts.map +1 -1
- package/dist/background-message-handlers.js +251 -9
- package/dist/background-message-handlers.js.map +1 -1
- package/dist/background.js +593 -117
- package/dist/background.js.map +1 -1
- package/dist/confirmation-badge.d.ts +2 -2
- package/dist/confirmation-badge.d.ts.map +1 -1
- package/dist/confirmation-badge.js +49 -17
- package/dist/confirmation-badge.js.map +1 -1
- package/dist/constants.d.ts +8 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +8 -0
- package/dist/constants.js.map +1 -1
- package/dist/extension-messages.d.ts +49 -6
- package/dist/extension-messages.d.ts.map +1 -1
- package/dist/known-methods.d.ts +2 -2
- package/dist/known-methods.d.ts.map +1 -1
- package/dist/known-methods.js +1 -0
- package/dist/known-methods.js.map +1 -1
- package/dist/message-router.d.ts.map +1 -1
- package/dist/message-router.js +119 -11
- package/dist/message-router.js.map +1 -1
- package/dist/offscreen/index.js +11 -2
- package/dist/offscreen/index.js.map +1 -1
- package/dist/server-request.d.ts +19 -0
- package/dist/server-request.d.ts.map +1 -0
- package/dist/server-request.js +79 -0
- package/dist/server-request.js.map +1 -0
- package/dist/server-state-cache.d.ts +41 -0
- package/dist/server-state-cache.d.ts.map +1 -0
- package/dist/server-state-cache.js +75 -0
- package/dist/server-state-cache.js.map +1 -0
- package/dist/side-panel/App.d.ts.map +1 -1
- package/dist/side-panel/App.js +28 -59
- package/dist/side-panel/App.js.map +1 -1
- package/dist/side-panel/bridge.d.ts +19 -33
- package/dist/side-panel/bridge.d.ts.map +1 -1
- package/dist/side-panel/bridge.js +27 -91
- package/dist/side-panel/bridge.js.map +1 -1
- package/dist/side-panel/components/BrowserToolsCard.d.ts.map +1 -1
- package/dist/side-panel/components/BrowserToolsCard.js +2 -1
- package/dist/side-panel/components/BrowserToolsCard.js.map +1 -1
- package/dist/side-panel/components/PluginCard.d.ts.map +1 -1
- package/dist/side-panel/components/PluginCard.js +2 -1
- package/dist/side-panel/components/PluginCard.js.map +1 -1
- package/dist/side-panel/components/PluginIcon.d.ts +2 -1
- package/dist/side-panel/components/PluginIcon.d.ts.map +1 -1
- package/dist/side-panel/components/PluginIcon.js +23 -5
- package/dist/side-panel/components/PluginIcon.js.map +1 -1
- package/dist/side-panel/components/ToolIcon.d.ts +2 -1
- package/dist/side-panel/components/ToolIcon.d.ts.map +1 -1
- package/dist/side-panel/components/ToolIcon.js +17 -3
- package/dist/side-panel/components/ToolIcon.js.map +1 -1
- package/dist/side-panel/components/ToolRow.d.ts.map +1 -1
- package/dist/side-panel/components/ToolRow.js +1 -2
- package/dist/side-panel/components/ToolRow.js.map +1 -1
- package/dist/side-panel/components/retro/Button.d.ts +1 -1
- package/dist/side-panel/hooks/useServerNotifications.d.ts +1 -3
- package/dist/side-panel/hooks/useServerNotifications.d.ts.map +1 -1
- package/dist/side-panel/hooks/useServerNotifications.js +2 -8
- package/dist/side-panel/hooks/useServerNotifications.js.map +1 -1
- package/dist/side-panel/side-panel.js +1201 -1210
- package/dist/side-panel/styles.css +1 -1
- package/dist/side-panel-toggle.d.ts +6 -0
- package/dist/side-panel-toggle.d.ts.map +1 -1
- package/dist/side-panel-toggle.js +6 -0
- package/dist/side-panel-toggle.js.map +1 -1
- package/dist/tab-state.d.ts +19 -1
- package/dist/tab-state.d.ts.map +1 -1
- package/dist/tab-state.js +128 -3
- package/dist/tab-state.js.map +1 -1
- package/manifest.json +1 -1
- package/package.json +1 -1
package/dist/background.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"background.js","sourceRoot":"","sources":["../src/background.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAC1G,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EACL,UAAU,EACV,eAAe,EACf,0BAA0B,EAC1B,gBAAgB,EAChB,eAAe,GAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGlE,4BAA4B;AAE5B,mBAAmB,EAAE,CAAC;AAEtB,qCAAqC;AAErC,uBAAuB,EAAE,CAAC;AAE1B,wCAAwC;AAExC,IAAI,iBAAiB,GAAyB,IAAI,CAAC;AAEnD,MAAM,uBAAuB,GAAG,KAAK,IAAmB,EAAE;IACxD,IAAI,iBAAiB;QAAE,OAAO,iBAAiB,CAAC;IAEhD,iBAAiB,GAAG,CAAC,KAAK,IAAI,EAAE;QAC9B,oEAAoE;QACpE,mEAAmE;QACnE,iEAAiE;QACjE,gEAAgE;QAChE,mEAAmE;QACnE,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC;gBACpC,GAAG,EAAE,0BAA0B;gBAC/B,OAAO,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC;gBAC1C,aAAa,EAAE,wDAAwD;aACxE,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,uDAAuD;YACvD,2DAA2D;YAC3D,yDAAyD;QAC3D,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;IAEL,MAAM,iBAAiB,CAAC;IACxB,iBAAiB,GAAG,IAAI,CAAC;AAC3B,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,KAAK,IAAmB,EAAE;IACpD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC1D,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE;YAC1C,eAAe,EAAE,0BAA0B;SAC5C,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC;AAEF,8BAA8B;AAE9B,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE;IAC3D,IAAI,UAAU,CAAC,MAAM,KAAK,
|
|
1
|
+
{"version":3,"file":"background.js","sourceRoot":"","sources":["../src/background.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
declare const notifyConfirmationRequest: (params: Record<string, unknown>) => void;
|
|
8
8
|
/**
|
|
9
|
-
* Decrement pending confirmation count, update badge, and
|
|
9
|
+
* Decrement pending confirmation count, update badge, and sync the Chrome
|
|
10
10
|
* notification for the resolved confirmation.
|
|
11
11
|
*
|
|
12
12
|
* When an id is provided, this function is idempotent — calling it twice with
|
|
@@ -27,7 +27,7 @@ declare const clearConfirmationBadge: (id?: string) => void;
|
|
|
27
27
|
* timeout does not double-clear the badge.
|
|
28
28
|
*/
|
|
29
29
|
declare const clearConfirmationBackgroundTimeout: (id: string) => void;
|
|
30
|
-
/** Reset all pending confirmation tracking and clear
|
|
30
|
+
/** Reset all pending confirmation tracking and clear the notification (e.g., on disconnect) */
|
|
31
31
|
declare const clearAllConfirmationBadges: () => void;
|
|
32
32
|
/**
|
|
33
33
|
* Register the chrome.notifications.onClicked listener that opens the side
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"confirmation-badge.d.ts","sourceRoot":"","sources":["../src/confirmation-badge.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"confirmation-badge.d.ts","sourceRoot":"","sources":["../src/confirmation-badge.ts"],"names":[],"mappings":"AAqFA;;;;;GAKG;AACH,QAAA,MAAM,yBAAyB,GAAI,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,IAoCpE,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,QAAA,MAAM,sBAAsB,GAAI,KAAK,MAAM,KAAG,IAgB7C,CAAC;AAEF;;;;;GAKG;AACH,QAAA,MAAM,kCAAkC,GAAI,IAAI,MAAM,KAAG,IASxD,CAAC;AAEF,+FAA+F;AAC/F,QAAA,MAAM,0BAA0B,QAAO,IAUtC,CAAC;AAEF;;;;GAIG;AACH,QAAA,MAAM,qBAAqB,QAAO,IAcjC,CAAC;AAEF,OAAO,EACL,yBAAyB,EACzB,sBAAsB,EACtB,kCAAkC,EAClC,0BAA0B,EAC1B,qBAAqB,GACtB,CAAC"}
|
|
@@ -1,5 +1,10 @@
|
|
|
1
|
+
import { isSidePanelOpen } from './side-panel-toggle.js';
|
|
1
2
|
/** Pending confirmation count for badge tracking */
|
|
2
3
|
let pendingConfirmationCount = 0;
|
|
4
|
+
/** Single notification ID for the consolidated confirmation notification */
|
|
5
|
+
const NOTIFICATION_ID = 'opentabs-confirmation';
|
|
6
|
+
/** Tool/domain info for each pending confirmation, used for notification content */
|
|
7
|
+
const pendingConfirmationInfo = new Map();
|
|
3
8
|
/**
|
|
4
9
|
* Background-side timeouts keyed by confirmation id. When the side panel is
|
|
5
10
|
* closed, it never sends sp:confirmationResponse or sp:confirmationTimeout, so
|
|
@@ -36,6 +41,39 @@ const updateConfirmationBadge = () => {
|
|
|
36
41
|
chrome.action.setBadgeText({ text: '' }).catch(() => { });
|
|
37
42
|
}
|
|
38
43
|
};
|
|
44
|
+
/**
|
|
45
|
+
* Sync the Chrome desktop notification with the current confirmation state.
|
|
46
|
+
* Shows a single consolidated notification — tool info for 1 pending, count
|
|
47
|
+
* for multiple. Clears the notification when no confirmations are pending or
|
|
48
|
+
* the side panel is open (the dialog is already visible).
|
|
49
|
+
*/
|
|
50
|
+
const syncConfirmationNotification = () => {
|
|
51
|
+
if (pendingConfirmationCount <= 0 || isSidePanelOpen()) {
|
|
52
|
+
chrome.notifications.clear(NOTIFICATION_ID).catch(() => { });
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
let message;
|
|
56
|
+
if (pendingConfirmationCount === 1 && pendingConfirmationInfo.size === 1) {
|
|
57
|
+
const info = pendingConfirmationInfo.values().next().value;
|
|
58
|
+
message = info.domain ? `${info.tool} on ${info.domain}` : info.tool;
|
|
59
|
+
}
|
|
60
|
+
else if (pendingConfirmationCount > 1) {
|
|
61
|
+
message = `${pendingConfirmationCount} tools awaiting approval`;
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
message = '1 tool awaiting approval';
|
|
65
|
+
}
|
|
66
|
+
chrome.notifications
|
|
67
|
+
.create(NOTIFICATION_ID, {
|
|
68
|
+
type: 'basic',
|
|
69
|
+
iconUrl: chrome.runtime.getURL('icons/icon-128.png'),
|
|
70
|
+
title: 'OpenTabs \u2014 Approval Required',
|
|
71
|
+
message,
|
|
72
|
+
priority: 2,
|
|
73
|
+
requireInteraction: true,
|
|
74
|
+
})
|
|
75
|
+
.catch(() => { });
|
|
76
|
+
};
|
|
39
77
|
/**
|
|
40
78
|
* Show badge and Chrome notification when a confirmation request arrives.
|
|
41
79
|
* The badge count persists until confirmations are resolved via clearConfirmationBadge().
|
|
@@ -44,7 +82,7 @@ const updateConfirmationBadge = () => {
|
|
|
44
82
|
*/
|
|
45
83
|
const notifyConfirmationRequest = (params) => {
|
|
46
84
|
const tool = typeof params.tool === 'string' ? params.tool : 'unknown tool';
|
|
47
|
-
const domain = typeof params.domain === 'string' ? params.domain :
|
|
85
|
+
const domain = typeof params.domain === 'string' ? params.domain : null;
|
|
48
86
|
const id = typeof params.id === 'string' ? params.id : String(Date.now());
|
|
49
87
|
const timeoutMs = typeof params.timeoutMs === 'number' ? params.timeoutMs : 0;
|
|
50
88
|
// If this id already has a pending timeout, clear it and don't increment the
|
|
@@ -60,6 +98,7 @@ const notifyConfirmationRequest = (params) => {
|
|
|
60
98
|
pendingConfirmationCount++;
|
|
61
99
|
updateConfirmationBadge();
|
|
62
100
|
}
|
|
101
|
+
pendingConfirmationInfo.set(id, { tool, domain });
|
|
63
102
|
// Set a background timeout slightly longer than the server-side timeout so
|
|
64
103
|
// the badge clears automatically when the side panel is closed and cannot
|
|
65
104
|
// send sp:confirmationResponse or sp:confirmationTimeout. Uses a fallback
|
|
@@ -73,19 +112,10 @@ const notifyConfirmationRequest = (params) => {
|
|
|
73
112
|
clearedConfirmationIds.delete(id);
|
|
74
113
|
}, effectiveTimeoutMs + CONFIRMATION_BACKGROUND_TIMEOUT_BUFFER_MS);
|
|
75
114
|
confirmationTimeouts.set(id, bgTimeoutId);
|
|
76
|
-
|
|
77
|
-
.create(`opentabs-confirm-${id}`, {
|
|
78
|
-
type: 'basic',
|
|
79
|
-
iconUrl: chrome.runtime.getURL('icons/icon-128.png'),
|
|
80
|
-
title: 'OpenTabs: Approval Required',
|
|
81
|
-
message: `${tool} on ${domain} — Click to open side panel`,
|
|
82
|
-
priority: 2,
|
|
83
|
-
requireInteraction: true,
|
|
84
|
-
})
|
|
85
|
-
.catch(() => { });
|
|
115
|
+
syncConfirmationNotification();
|
|
86
116
|
};
|
|
87
117
|
/**
|
|
88
|
-
* Decrement pending confirmation count, update badge, and
|
|
118
|
+
* Decrement pending confirmation count, update badge, and sync the Chrome
|
|
89
119
|
* notification for the resolved confirmation.
|
|
90
120
|
*
|
|
91
121
|
* When an id is provided, this function is idempotent — calling it twice with
|
|
@@ -104,10 +134,11 @@ const clearConfirmationBadge = (id) => {
|
|
|
104
134
|
return;
|
|
105
135
|
}
|
|
106
136
|
clearedConfirmationIds.add(id);
|
|
107
|
-
|
|
137
|
+
pendingConfirmationInfo.delete(id);
|
|
108
138
|
}
|
|
109
139
|
pendingConfirmationCount = Math.max(0, pendingConfirmationCount - 1);
|
|
110
140
|
updateConfirmationBadge();
|
|
141
|
+
syncConfirmationNotification();
|
|
111
142
|
// Prune the id when no background timeout is pending — without a pending
|
|
112
143
|
// timeout, no timeout callback can race, so the entry is no longer needed.
|
|
113
144
|
if (id !== undefined && !confirmationTimeouts.has(id)) {
|
|
@@ -130,16 +161,17 @@ const clearConfirmationBackgroundTimeout = (id) => {
|
|
|
130
161
|
clearedConfirmationIds.delete(id);
|
|
131
162
|
}
|
|
132
163
|
};
|
|
133
|
-
/** Reset all pending confirmation tracking and clear
|
|
164
|
+
/** Reset all pending confirmation tracking and clear the notification (e.g., on disconnect) */
|
|
134
165
|
const clearAllConfirmationBadges = () => {
|
|
135
|
-
for (const [
|
|
166
|
+
for (const [, timeoutId] of confirmationTimeouts.entries()) {
|
|
136
167
|
clearTimeout(timeoutId);
|
|
137
|
-
chrome.notifications.clear(`opentabs-confirm-${id}`).catch(() => { });
|
|
138
168
|
}
|
|
139
169
|
confirmationTimeouts.clear();
|
|
140
170
|
clearedConfirmationIds.clear();
|
|
171
|
+
pendingConfirmationInfo.clear();
|
|
141
172
|
pendingConfirmationCount = 0;
|
|
142
173
|
updateConfirmationBadge();
|
|
174
|
+
chrome.notifications.clear(NOTIFICATION_ID).catch(() => { });
|
|
143
175
|
};
|
|
144
176
|
/**
|
|
145
177
|
* Register the chrome.notifications.onClicked listener that opens the side
|
|
@@ -148,7 +180,7 @@ const clearAllConfirmationBadges = () => {
|
|
|
148
180
|
*/
|
|
149
181
|
const initConfirmationBadge = () => {
|
|
150
182
|
chrome.notifications.onClicked.addListener(notificationId => {
|
|
151
|
-
if (notificationId
|
|
183
|
+
if (notificationId === NOTIFICATION_ID) {
|
|
152
184
|
chrome.windows
|
|
153
185
|
.getCurrent()
|
|
154
186
|
.then(w => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"confirmation-badge.js","sourceRoot":"","sources":["../src/confirmation-badge.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,IAAI,wBAAwB,GAAG,CAAC,CAAC;AAEjC;;;;;GAKG;AACH,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAyC,CAAC;AAE9E;;;;;GAKG;AACH,MAAM,sBAAsB,GAAG,IAAI,GAAG,EAAU,CAAC;AAEjD;;;;;GAKG;AACH,MAAM,yCAAyC,GAAG,IAAI,CAAC;AAEvD;;;GAGG;AACH,MAAM,gCAAgC,GAAG,MAAM,CAAC;AAEhD,oEAAoE;AACpE,MAAM,uBAAuB,GAAG,GAAS,EAAE;IACzC,IAAI,wBAAwB,GAAG,CAAC,EAAE,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,wBAAwB,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACvF,MAAM,CAAC,MAAM,CAAC,uBAAuB,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC9E,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,yBAAyB,GAAG,CAAC,MAA+B,EAAQ,EAAE;IAC1E,MAAM,IAAI,GAAG,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC;IAC5E,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"confirmation-badge.js","sourceRoot":"","sources":["../src/confirmation-badge.ts"],"names":[],"mappings":"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"}
|
package/dist/constants.d.ts
CHANGED
|
@@ -31,6 +31,14 @@ export declare const MAX_SCRIPT_TIMEOUT_MS = 295000;
|
|
|
31
31
|
* reported as "unavailable" rather than blocking state computation.
|
|
32
32
|
*/
|
|
33
33
|
export declare const IS_READY_TIMEOUT_MS = 5000;
|
|
34
|
+
/**
|
|
35
|
+
* Interval for periodic isReady() re-evaluation (ms).
|
|
36
|
+
*
|
|
37
|
+
* While connected to the MCP server, the extension periodically re-probes
|
|
38
|
+
* all non-closed plugin tabs to detect auth token expiration, SPA logouts,
|
|
39
|
+
* or other readiness changes that occur without a page navigation.
|
|
40
|
+
*/
|
|
41
|
+
export declare const READINESS_POLL_INTERVAL_MS = 30000;
|
|
34
42
|
/** Delay before chrome.runtime.reload() to allow the WebSocket response to flush */
|
|
35
43
|
export declare const RELOAD_FLUSH_DELAY_MS = 100;
|
|
36
44
|
/** Delay (ms) before retrying adapter injection after a hash verification failure */
|
package/dist/constants.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,uBAAuB,CAAC;AACpD,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAC9C,eAAO,MAAM,gBAAgB,iBAAiB,CAAC;AAC/C,eAAO,MAAM,gBAAgB,gBAAgB,CAAC;AAC9C,eAAO,MAAM,2BAA2B,yBAAyB,CAAC;AAClE;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,iBAAiB,QAAS,CAAC;AACxC;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,SAAU,CAAC;AAC7C;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,OAAQ,CAAC;AACzC,oFAAoF;AACpF,eAAO,MAAM,qBAAqB,MAAM,CAAC;AACzC,qFAAqF;AACrF,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAC5C,+EAA+E;AAC/E,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAC9C,gFAAgF;AAChF,eAAO,MAAM,iBAAiB,KAAK,CAAC;AACpC,kEAAkE;AAClE,eAAO,MAAM,eAAe,eAAe,CAAC;AAC5C,gEAAgE;AAChE,eAAO,MAAM,mBAAmB,OAAO,CAAC;AACxC,kFAAkF;AAClF,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAC3C,0FAA0F;AAC1F,eAAO,MAAM,uBAAuB,QAAS,CAAC;AAC9C,0EAA0E;AAC1E,eAAO,MAAM,gBAAgB,MAAM,CAAC;AACpC,uFAAuF;AACvF,eAAO,MAAM,mBAAmB,MAAM,CAAC;AACvC,4EAA4E;AAC5E,eAAO,MAAM,cAAc,QAAmB,CAAC;AAC/C,+EAA+E;AAC/E,eAAO,MAAM,qBAAqB,OAAQ,CAAC;AAC3C,sEAAsE;AACtE,eAAO,MAAM,WAAW,QAAQ,CAAC;AACjC,mFAAmF;AACnF,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAC1C,4EAA4E;AAC5E,eAAO,MAAM,oBAAoB,OAAO,CAAC;AACzC,8EAA8E;AAC9E,eAAO,MAAM,kBAAkB,OAAQ,CAAC;AACxC,gFAAgF;AAChF,eAAO,MAAM,sBAAsB,QAAS,CAAC;AAC7C,wFAAwF;AACxF,eAAO,MAAM,qBAAqB,KAAK,CAAC;AACxC,qFAAqF;AACrF,eAAO,MAAM,4BAA4B,QAAS,CAAC;AACnD,+EAA+E;AAC/E,eAAO,MAAM,iBAAiB,MAAM,CAAC;AACrC;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,kBAAkB,CAAC;AAEjD,8GAA8G;AAC9G,eAAO,MAAM,iBAAiB,QAA6B,CAAC;AAC5D,yDAAyD;AACzD,eAAO,MAAM,iBAAiB,GAAI,MAAM,MAAM,KAAG,OAAuC,CAAC;AACzF,mEAAmE;AACnE,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,KAAG,MAAqC,CAAC"}
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,uBAAuB,CAAC;AACpD,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAC9C,eAAO,MAAM,gBAAgB,iBAAiB,CAAC;AAC/C,eAAO,MAAM,gBAAgB,gBAAgB,CAAC;AAC9C,eAAO,MAAM,2BAA2B,yBAAyB,CAAC;AAClE;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,iBAAiB,QAAS,CAAC;AACxC;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,SAAU,CAAC;AAC7C;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,OAAQ,CAAC;AACzC;;;;;;GAMG;AACH,eAAO,MAAM,0BAA0B,QAAS,CAAC;AACjD,oFAAoF;AACpF,eAAO,MAAM,qBAAqB,MAAM,CAAC;AACzC,qFAAqF;AACrF,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAC5C,+EAA+E;AAC/E,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAC9C,gFAAgF;AAChF,eAAO,MAAM,iBAAiB,KAAK,CAAC;AACpC,kEAAkE;AAClE,eAAO,MAAM,eAAe,eAAe,CAAC;AAC5C,gEAAgE;AAChE,eAAO,MAAM,mBAAmB,OAAO,CAAC;AACxC,kFAAkF;AAClF,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAC3C,0FAA0F;AAC1F,eAAO,MAAM,uBAAuB,QAAS,CAAC;AAC9C,0EAA0E;AAC1E,eAAO,MAAM,gBAAgB,MAAM,CAAC;AACpC,uFAAuF;AACvF,eAAO,MAAM,mBAAmB,MAAM,CAAC;AACvC,4EAA4E;AAC5E,eAAO,MAAM,cAAc,QAAmB,CAAC;AAC/C,+EAA+E;AAC/E,eAAO,MAAM,qBAAqB,OAAQ,CAAC;AAC3C,sEAAsE;AACtE,eAAO,MAAM,WAAW,QAAQ,CAAC;AACjC,mFAAmF;AACnF,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAC1C,4EAA4E;AAC5E,eAAO,MAAM,oBAAoB,OAAO,CAAC;AACzC,8EAA8E;AAC9E,eAAO,MAAM,kBAAkB,OAAQ,CAAC;AACxC,gFAAgF;AAChF,eAAO,MAAM,sBAAsB,QAAS,CAAC;AAC7C,wFAAwF;AACxF,eAAO,MAAM,qBAAqB,KAAK,CAAC;AACxC,qFAAqF;AACrF,eAAO,MAAM,4BAA4B,QAAS,CAAC;AACnD,+EAA+E;AAC/E,eAAO,MAAM,iBAAiB,MAAM,CAAC;AACrC;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,kBAAkB,CAAC;AAEjD,8GAA8G;AAC9G,eAAO,MAAM,iBAAiB,QAA6B,CAAC;AAC5D,yDAAyD;AACzD,eAAO,MAAM,iBAAiB,GAAI,MAAM,MAAM,KAAG,OAAuC,CAAC;AACzF,mEAAmE;AACnE,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,KAAG,MAAqC,CAAC"}
|
package/dist/constants.js
CHANGED
|
@@ -31,6 +31,14 @@ export const MAX_SCRIPT_TIMEOUT_MS = 295_000;
|
|
|
31
31
|
* reported as "unavailable" rather than blocking state computation.
|
|
32
32
|
*/
|
|
33
33
|
export const IS_READY_TIMEOUT_MS = 5_000;
|
|
34
|
+
/**
|
|
35
|
+
* Interval for periodic isReady() re-evaluation (ms).
|
|
36
|
+
*
|
|
37
|
+
* While connected to the MCP server, the extension periodically re-probes
|
|
38
|
+
* all non-closed plugin tabs to detect auth token expiration, SPA logouts,
|
|
39
|
+
* or other readiness changes that occur without a page navigation.
|
|
40
|
+
*/
|
|
41
|
+
export const READINESS_POLL_INTERVAL_MS = 30_000;
|
|
34
42
|
/** Delay before chrome.runtime.reload() to allow the WebSocket response to flush */
|
|
35
43
|
export const RELOAD_FLUSH_DELAY_MS = 100;
|
|
36
44
|
/** Delay (ms) before retrying adapter injection after a hash verification failure */
|
package/dist/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG,oBAAoB,CAAC;AACpD,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAG,CAAC,CAAC,wFAAwF;AACvI,MAAM,CAAC,MAAM,gBAAgB,GAAG,cAAc,CAAC;AAC/C,MAAM,CAAC,MAAM,gBAAgB,GAAG,aAAa,CAAC;AAC9C,MAAM,CAAC,MAAM,2BAA2B,GAAG,sBAAsB,CAAC;AAClE;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC;AACxC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,OAAO,CAAC;AAC7C;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,CAAC;AACzC,oFAAoF;AACpF,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,CAAC;AACzC,qFAAqF;AACrF,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAG,CAAC;AAC5C,+EAA+E;AAC/E,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAG,CAAC;AAC9C,gFAAgF;AAChF,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AACpC,kEAAkE;AAClE,MAAM,CAAC,MAAM,eAAe,GAAG,YAAY,CAAC;AAC5C,gEAAgE;AAChE,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC;AACxC,kFAAkF;AAClF,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAC3C,0FAA0F;AAC1F,MAAM,CAAC,MAAM,uBAAuB,GAAG,MAAM,CAAC;AAC9C,0EAA0E;AAC1E,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AACpC,uFAAuF;AACvF,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,CAAC;AACvC,4EAA4E;AAC5E,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAC/C,+EAA+E;AAC/E,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,CAAC;AAC3C,sEAAsE;AACtE,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC;AACjC,mFAAmF;AACnF,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAC1C,4EAA4E;AAC5E,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC;AACzC,8EAA8E;AAC9E,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,CAAC;AACxC,gFAAgF;AAChF,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC;AAC7C,wFAAwF;AACxF,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,CAAC;AACxC,qFAAqF;AACrF,MAAM,CAAC,MAAM,4BAA4B,GAAG,MAAM,CAAC;AACnD,+EAA+E;AAC/E,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AACrC;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,eAAe,CAAC;AAEjD,8GAA8G;AAC9G,MAAM,CAAC,MAAM,iBAAiB,GAAG,0BAA0B,CAAC;AAC5D,yDAAyD;AACzD,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,IAAY,EAAW,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzF,mEAAmE;AACnE,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,kBAAkB,IAAI,KAAK,CAAC"}
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG,oBAAoB,CAAC;AACpD,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAG,CAAC,CAAC,wFAAwF;AACvI,MAAM,CAAC,MAAM,gBAAgB,GAAG,cAAc,CAAC;AAC/C,MAAM,CAAC,MAAM,gBAAgB,GAAG,aAAa,CAAC;AAC9C,MAAM,CAAC,MAAM,2BAA2B,GAAG,sBAAsB,CAAC;AAClE;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC;AACxC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,OAAO,CAAC;AAC7C;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,CAAC;AACzC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,MAAM,CAAC;AACjD,oFAAoF;AACpF,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,CAAC;AACzC,qFAAqF;AACrF,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAG,CAAC;AAC5C,+EAA+E;AAC/E,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAG,CAAC;AAC9C,gFAAgF;AAChF,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AACpC,kEAAkE;AAClE,MAAM,CAAC,MAAM,eAAe,GAAG,YAAY,CAAC;AAC5C,gEAAgE;AAChE,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC;AACxC,kFAAkF;AAClF,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAC3C,0FAA0F;AAC1F,MAAM,CAAC,MAAM,uBAAuB,GAAG,MAAM,CAAC;AAC9C,0EAA0E;AAC1E,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AACpC,uFAAuF;AACvF,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,CAAC;AACvC,4EAA4E;AAC5E,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAC/C,+EAA+E;AAC/E,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,CAAC;AAC3C,sEAAsE;AACtE,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC;AACjC,mFAAmF;AACnF,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAC1C,4EAA4E;AAC5E,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC;AACzC,8EAA8E;AAC9E,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,CAAC;AACxC,gFAAgF;AAChF,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC;AAC7C,wFAAwF;AACxF,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,CAAC;AACxC,qFAAqF;AACrF,MAAM,CAAC,MAAM,4BAA4B,GAAG,MAAM,CAAC;AACnD,+EAA+E;AAC/E,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AACrC;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,eAAe,CAAC;AAEjD,8GAA8G;AAC9G,MAAM,CAAC,MAAM,iBAAiB,GAAG,0BAA0B,CAAC;AAC5D,yDAAyD;AACzD,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,IAAY,EAAW,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzF,mEAAmE;AACnE,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,kBAAkB,IAAI,KAAK,CAAC"}
|
|
@@ -31,15 +31,14 @@ export interface WsSetUrlMessage {
|
|
|
31
31
|
type: 'ws:setUrl';
|
|
32
32
|
url: string;
|
|
33
33
|
}
|
|
34
|
-
/** Side panel → Background: send a JSON-RPC message to the MCP server */
|
|
35
|
-
export interface BgSendMessage {
|
|
36
|
-
type: 'bg:send';
|
|
37
|
-
data: unknown;
|
|
38
|
-
}
|
|
39
34
|
/** Side panel → Background: query WebSocket connection state */
|
|
40
35
|
export interface BgGetConnectionStateMessage {
|
|
41
36
|
type: 'bg:getConnectionState';
|
|
42
37
|
}
|
|
38
|
+
/** Side panel → Background: request full merged state for initial render */
|
|
39
|
+
export interface BgGetFullStateMessage {
|
|
40
|
+
type: 'bg:getFullState';
|
|
41
|
+
}
|
|
43
42
|
/** Background → Offscreen: request log entries from the offscreen LogCollector */
|
|
44
43
|
export interface OffscreenGetLogsMessage {
|
|
45
44
|
type: 'offscreen:getLogs';
|
|
@@ -116,13 +115,57 @@ export interface SpConfirmationTimeoutMessage {
|
|
|
116
115
|
type: 'sp:confirmationTimeout';
|
|
117
116
|
id: string;
|
|
118
117
|
}
|
|
118
|
+
/** Side panel → Background: toggle a single tool's enabled state */
|
|
119
|
+
export interface BgSetToolEnabledMessage {
|
|
120
|
+
type: 'bg:setToolEnabled';
|
|
121
|
+
plugin: string;
|
|
122
|
+
tool: string;
|
|
123
|
+
enabled: boolean;
|
|
124
|
+
}
|
|
125
|
+
/** Side panel → Background: toggle all tools for a plugin */
|
|
126
|
+
export interface BgSetAllToolsEnabledMessage {
|
|
127
|
+
type: 'bg:setAllToolsEnabled';
|
|
128
|
+
plugin: string;
|
|
129
|
+
enabled: boolean;
|
|
130
|
+
}
|
|
131
|
+
/** Side panel → Background: toggle a browser tool's enabled state */
|
|
132
|
+
export interface BgSetBrowserToolEnabledMessage {
|
|
133
|
+
type: 'bg:setBrowserToolEnabled';
|
|
134
|
+
tool: string;
|
|
135
|
+
enabled: boolean;
|
|
136
|
+
}
|
|
137
|
+
/** Side panel → Background: toggle all browser tools' enabled state */
|
|
138
|
+
export interface BgSetAllBrowserToolsEnabledMessage {
|
|
139
|
+
type: 'bg:setAllBrowserToolsEnabled';
|
|
140
|
+
enabled: boolean;
|
|
141
|
+
}
|
|
142
|
+
/** Side panel → Background: search npm registry for plugins */
|
|
143
|
+
export interface BgSearchPluginsMessage {
|
|
144
|
+
type: 'bg:searchPlugins';
|
|
145
|
+
query: string;
|
|
146
|
+
}
|
|
147
|
+
/** Side panel → Background: install a plugin by package name */
|
|
148
|
+
export interface BgInstallPluginMessage {
|
|
149
|
+
type: 'bg:installPlugin';
|
|
150
|
+
name: string;
|
|
151
|
+
}
|
|
152
|
+
/** Side panel → Background: remove an installed plugin */
|
|
153
|
+
export interface BgRemovePluginMessage {
|
|
154
|
+
type: 'bg:removePlugin';
|
|
155
|
+
name: string;
|
|
156
|
+
}
|
|
157
|
+
/** Side panel → Background: update a plugin to the latest registry version */
|
|
158
|
+
export interface BgUpdatePluginMessage {
|
|
159
|
+
type: 'bg:updatePlugin';
|
|
160
|
+
name: string;
|
|
161
|
+
}
|
|
119
162
|
/** Side panel → Background → Offscreen: MCP server port changed */
|
|
120
163
|
export interface PortChangedMessage {
|
|
121
164
|
type: 'port-changed';
|
|
122
165
|
port: number;
|
|
123
166
|
}
|
|
124
167
|
/** All internal message types flowing through chrome.runtime.sendMessage */
|
|
125
|
-
export type InternalMessage = OffscreenGetUrlMessage | WsStateMessage | WsDataMessage | WsSendMessage | WsGetStateMessage | WsSetUrlMessage |
|
|
168
|
+
export type InternalMessage = OffscreenGetUrlMessage | WsStateMessage | WsDataMessage | WsSendMessage | WsGetStateMessage | WsSetUrlMessage | BgGetConnectionStateMessage | BgGetFullStateMessage | BgSetToolEnabledMessage | BgSetAllToolsEnabledMessage | BgSetBrowserToolEnabledMessage | BgSetAllBrowserToolsEnabledMessage | BgSearchPluginsMessage | BgInstallPluginMessage | BgRemovePluginMessage | BgUpdatePluginMessage | OffscreenGetLogsMessage | BgForceReconnectMessage | PluginLogsMessage | ToolProgressMessage | SpGetStateMessage | SpConnectionStateMessage | SpRelayMessage | SpConfirmationRequestMessage | SpConfirmationResponseMessage | SpConfirmationTimeoutMessage | PortChangedMessage;
|
|
126
169
|
/** Tab state info for a single plugin — shared shape used by tab.stateChanged payloads */
|
|
127
170
|
export interface PluginTabStateInfo {
|
|
128
171
|
state: TabState;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension-messages.d.ts","sourceRoot":"","sources":["../src/extension-messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAU5F,mEAAmE;AACnE,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,kBAAkB,CAAC;CAC1B;AAED,0FAA0F;AAC1F,MAAM,MAAM,gBAAgB,GAAG,oBAAoB,GAAG,aAAa,GAAG,SAAS,CAAC;AAEhF,iEAAiE;AACjE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,iFAAiF;IACjF,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACrC;AAED,yEAAyE;AACzE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,+FAA+F;AAC/F,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,+DAA+D;AAC/D,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,aAAa,CAAC;CACrB;AAED,kEAAkE;AAClE,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,WAAW,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,
|
|
1
|
+
{"version":3,"file":"extension-messages.d.ts","sourceRoot":"","sources":["../src/extension-messages.ts"],"names":[],"mappings":"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"}
|
package/dist/known-methods.d.ts
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* they stay in sync. A unit test verifies the invariant.
|
|
7
7
|
*/
|
|
8
8
|
/** Methods routed to handlers in the background script's dispatch table */
|
|
9
|
-
export declare const DISPATCH_METHODS: readonly ["sync.full", "plugin.update", "plugin.uninstall", "tool.dispatch", "resource.read", "prompt.get", "browser.listTabs", "browser.openTab", "browser.closeTab", "browser.navigateTab", "browser.focusTab", "browser.getTabInfo", "browser.screenshotTab", "browser.getTabContent", "browser.getPageHtml", "browser.getStorage", "browser.clickElement", "browser.typeText", "browser.selectOption", "browser.waitForElement", "browser.queryElements", "browser.getCookies", "browser.setCookie", "browser.deleteCookies", "browser.enableNetworkCapture", "browser.getNetworkRequests", "browser.getWebSocketFrames", "browser.disableNetworkCapture", "browser.getConsoleLogs", "browser.clearConsoleLogs", "browser.executeScript", "browser.listResources", "browser.getResourceContent", "browser.pressKey", "browser.scroll", "browser.hoverElement", "browser.handleDialog", "extension.reload", "extension.getState", "extension.getLogs", "extension.getSidePanel", "extension.checkAdapter", "extension.forceReconnect"];
|
|
9
|
+
export declare const DISPATCH_METHODS: readonly ["sync.full", "plugin.update", "plugin.uninstall", "tool.dispatch", "resource.read", "prompt.get", "browser.listTabs", "browser.openTab", "browser.closeTab", "browser.navigateTab", "browser.focusTab", "browser.getTabInfo", "browser.screenshotTab", "browser.getTabContent", "browser.getPageHtml", "browser.getStorage", "browser.clickElement", "browser.typeText", "browser.selectOption", "browser.waitForElement", "browser.queryElements", "browser.getCookies", "browser.setCookie", "browser.deleteCookies", "browser.enableNetworkCapture", "browser.getNetworkRequests", "browser.getWebSocketFrames", "browser.disableNetworkCapture", "browser.getConsoleLogs", "browser.clearConsoleLogs", "browser.executeScript", "browser.listResources", "browser.getResourceContent", "browser.pressKey", "browser.scroll", "browser.hoverElement", "browser.handleDialog", "extension.reload", "extension.getState", "extension.getLogs", "extension.getSidePanel", "extension.checkAdapter", "extension.forceReconnect", "extension.getTabState"];
|
|
10
10
|
/**
|
|
11
11
|
* Methods allowed through the offscreen WebSocket filter but NOT routed to
|
|
12
12
|
* a handler in methodHandlers. These are either:
|
|
@@ -15,5 +15,5 @@ export declare const DISPATCH_METHODS: readonly ["sync.full", "plugin.update", "
|
|
|
15
15
|
*/
|
|
16
16
|
export declare const PASSTHROUGH_METHODS: readonly ["pong", "tool.invocationStart", "tool.invocationEnd", "confirmation.request", "plugins.changed"];
|
|
17
17
|
/** All methods the offscreen document allows through the WebSocket filter */
|
|
18
|
-
export declare const ALL_ALLOWED_METHODS: readonly ["sync.full", "plugin.update", "plugin.uninstall", "tool.dispatch", "resource.read", "prompt.get", "browser.listTabs", "browser.openTab", "browser.closeTab", "browser.navigateTab", "browser.focusTab", "browser.getTabInfo", "browser.screenshotTab", "browser.getTabContent", "browser.getPageHtml", "browser.getStorage", "browser.clickElement", "browser.typeText", "browser.selectOption", "browser.waitForElement", "browser.queryElements", "browser.getCookies", "browser.setCookie", "browser.deleteCookies", "browser.enableNetworkCapture", "browser.getNetworkRequests", "browser.getWebSocketFrames", "browser.disableNetworkCapture", "browser.getConsoleLogs", "browser.clearConsoleLogs", "browser.executeScript", "browser.listResources", "browser.getResourceContent", "browser.pressKey", "browser.scroll", "browser.hoverElement", "browser.handleDialog", "extension.reload", "extension.getState", "extension.getLogs", "extension.getSidePanel", "extension.checkAdapter", "extension.forceReconnect", "pong", "tool.invocationStart", "tool.invocationEnd", "confirmation.request", "plugins.changed"];
|
|
18
|
+
export declare const ALL_ALLOWED_METHODS: readonly ["sync.full", "plugin.update", "plugin.uninstall", "tool.dispatch", "resource.read", "prompt.get", "browser.listTabs", "browser.openTab", "browser.closeTab", "browser.navigateTab", "browser.focusTab", "browser.getTabInfo", "browser.screenshotTab", "browser.getTabContent", "browser.getPageHtml", "browser.getStorage", "browser.clickElement", "browser.typeText", "browser.selectOption", "browser.waitForElement", "browser.queryElements", "browser.getCookies", "browser.setCookie", "browser.deleteCookies", "browser.enableNetworkCapture", "browser.getNetworkRequests", "browser.getWebSocketFrames", "browser.disableNetworkCapture", "browser.getConsoleLogs", "browser.clearConsoleLogs", "browser.executeScript", "browser.listResources", "browser.getResourceContent", "browser.pressKey", "browser.scroll", "browser.hoverElement", "browser.handleDialog", "extension.reload", "extension.getState", "extension.getLogs", "extension.getSidePanel", "extension.checkAdapter", "extension.forceReconnect", "extension.getTabState", "pong", "tool.invocationStart", "tool.invocationEnd", "confirmation.request", "plugins.changed"];
|
|
19
19
|
//# sourceMappingURL=known-methods.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"known-methods.d.ts","sourceRoot":"","sources":["../src/known-methods.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,2EAA2E;AAC3E,eAAO,MAAM,gBAAgB,
|
|
1
|
+
{"version":3,"file":"known-methods.d.ts","sourceRoot":"","sources":["../src/known-methods.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,2EAA2E;AAC3E,eAAO,MAAM,gBAAgB,ogCA6CnB,CAAC;AAEX;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,4GAMtB,CAAC;AAEX,6EAA6E;AAC7E,eAAO,MAAM,mBAAmB,qmCAAyD,CAAC"}
|
package/dist/known-methods.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"known-methods.js","sourceRoot":"","sources":["../src/known-methods.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,2EAA2E;AAC3E,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,WAAW;IACX,eAAe;IACf,kBAAkB;IAClB,eAAe;IACf,eAAe;IACf,YAAY;IACZ,kBAAkB;IAClB,iBAAiB;IACjB,kBAAkB;IAClB,qBAAqB;IACrB,kBAAkB;IAClB,oBAAoB;IACpB,uBAAuB;IACvB,uBAAuB;IACvB,qBAAqB;IACrB,oBAAoB;IACpB,sBAAsB;IACtB,kBAAkB;IAClB,sBAAsB;IACtB,wBAAwB;IACxB,uBAAuB;IACvB,oBAAoB;IACpB,mBAAmB;IACnB,uBAAuB;IACvB,8BAA8B;IAC9B,4BAA4B;IAC5B,4BAA4B;IAC5B,+BAA+B;IAC/B,wBAAwB;IACxB,0BAA0B;IAC1B,uBAAuB;IACvB,uBAAuB;IACvB,4BAA4B;IAC5B,kBAAkB;IAClB,gBAAgB;IAChB,sBAAsB;IACtB,sBAAsB;IACtB,kBAAkB;IAClB,oBAAoB;IACpB,mBAAmB;IACnB,wBAAwB;IACxB,wBAAwB;IACxB,0BAA0B;
|
|
1
|
+
{"version":3,"file":"known-methods.js","sourceRoot":"","sources":["../src/known-methods.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,2EAA2E;AAC3E,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,WAAW;IACX,eAAe;IACf,kBAAkB;IAClB,eAAe;IACf,eAAe;IACf,YAAY;IACZ,kBAAkB;IAClB,iBAAiB;IACjB,kBAAkB;IAClB,qBAAqB;IACrB,kBAAkB;IAClB,oBAAoB;IACpB,uBAAuB;IACvB,uBAAuB;IACvB,qBAAqB;IACrB,oBAAoB;IACpB,sBAAsB;IACtB,kBAAkB;IAClB,sBAAsB;IACtB,wBAAwB;IACxB,uBAAuB;IACvB,oBAAoB;IACpB,mBAAmB;IACnB,uBAAuB;IACvB,8BAA8B;IAC9B,4BAA4B;IAC5B,4BAA4B;IAC5B,+BAA+B;IAC/B,wBAAwB;IACxB,0BAA0B;IAC1B,uBAAuB;IACvB,uBAAuB;IACvB,4BAA4B;IAC5B,kBAAkB;IAClB,gBAAgB;IAChB,sBAAsB;IACtB,sBAAsB;IACtB,kBAAkB;IAClB,oBAAoB;IACpB,mBAAmB;IACnB,wBAAwB;IACxB,wBAAwB;IACxB,0BAA0B;IAC1B,uBAAuB;CACf,CAAC;AAEX;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,MAAM;IACN,sBAAsB;IACtB,oBAAoB;IACpB,sBAAsB;IACtB,iBAAiB;CACT,CAAC;AAEX,6EAA6E;AAC7E,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,GAAG,gBAAgB,EAAE,GAAG,mBAAmB,CAAU,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-router.d.ts","sourceRoot":"","sources":["../src/message-router.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"message-router.d.ts","sourceRoot":"","sources":["../src/message-router.ts"],"names":[],"mappings":"AA0DA,OAAO,KAAK,EAKV,SAAS,EACT,WAAW,EACZ,MAAM,sBAAsB,CAAC;AAoD9B,2EAA2E;AAC3E,UAAU,sBAAsB;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB;AAiBD;;;;GAIG;AACH,QAAA,MAAM,qBAAqB,GAAI,KAAK,OAAO,KAAG,sBAAsB,GAAG,IA+DtE,CAAC;AA+UF,6DAA6D;AAC7D,QAAA,MAAM,mBAAmB,GAAI,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,IAiE/D,CAAC;AAEF,oFAAoF;AACpF,QAAA,MAAM,kBAAkB,UAAoC,CAAC;AAE7D,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,CAAC;AAC1E,YAAY,EAAE,sBAAsB,EAAE,CAAC"}
|
package/dist/message-router.js
CHANGED
|
@@ -7,7 +7,9 @@ import { forwardToSidePanel, sendTabStateNotification, sendToServer } from './me
|
|
|
7
7
|
import { getAllPluginMeta, removePlugin, removePluginsBatch, storePluginsBatch } from './plugin-storage.js';
|
|
8
8
|
import { checkRateLimit } from './rate-limiter.js';
|
|
9
9
|
import { handleResourceRead, handlePromptGet } from './resource-prompt-dispatch.js';
|
|
10
|
-
import {
|
|
10
|
+
import { consumeServerResponse } from './server-request.js';
|
|
11
|
+
import { getServerStateCache, updateServerStateCache } from './server-state-cache.js';
|
|
12
|
+
import { clearPluginTabState, computePluginTabState, getLastKnownStates, sendTabSyncAll, startReadinessPoll, updateLastKnownState, } from './tab-state.js';
|
|
11
13
|
import { handleToolDispatch } from './tool-dispatch.js';
|
|
12
14
|
/** Wraps an async request handler with the id !== undefined guard and .catch logging */
|
|
13
15
|
const wrapAsync = (method, fn) => (params, id) => {
|
|
@@ -198,14 +200,64 @@ const handleSyncFull = async (params) => {
|
|
|
198
200
|
console.warn('[opentabs] Plugin injection failed during sync.full:', result.reason);
|
|
199
201
|
}
|
|
200
202
|
}
|
|
201
|
-
//
|
|
202
|
-
//
|
|
203
|
-
|
|
204
|
-
//
|
|
203
|
+
// Populate the server state cache with the full state payload from sync.full
|
|
204
|
+
// so the side panel can read it locally via bg:getFullState without a round-trip.
|
|
205
|
+
// Build a map from plugin name to raw object for extracting config-specific
|
|
206
|
+
// fields (source, sdkVersion, update) that the server now includes in sync.full.
|
|
207
|
+
const rawPluginMap = new Map();
|
|
208
|
+
for (const raw of rawPlugins) {
|
|
209
|
+
if (typeof raw === 'object' && raw !== null && typeof raw.name === 'string') {
|
|
210
|
+
rawPluginMap.set(raw.name, raw);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
const cachePlugins = uniquePlugins.map(p => {
|
|
214
|
+
const raw = rawPluginMap.get(p.name);
|
|
215
|
+
return {
|
|
216
|
+
name: p.name,
|
|
217
|
+
displayName: p.displayName,
|
|
218
|
+
version: p.version,
|
|
219
|
+
trustTier: p.trustTier,
|
|
220
|
+
source: raw?.source === 'npm' || raw?.source === 'local' ? raw.source : 'local',
|
|
221
|
+
tabState: 'closed',
|
|
222
|
+
urlPatterns: p.urlPatterns,
|
|
223
|
+
tools: p.tools,
|
|
224
|
+
iconSvg: p.iconSvg,
|
|
225
|
+
iconInactiveSvg: p.iconInactiveSvg,
|
|
226
|
+
...(typeof raw?.sdkVersion === 'string' ? { sdkVersion: raw.sdkVersion } : {}),
|
|
227
|
+
...(raw?.update && typeof raw.update === 'object'
|
|
228
|
+
? { update: raw.update }
|
|
229
|
+
: {}),
|
|
230
|
+
};
|
|
231
|
+
});
|
|
232
|
+
// Extract server-owned fields from the enriched sync.full payload
|
|
233
|
+
const rawFailedPlugins = Array.isArray(params.failedPlugins)
|
|
234
|
+
? params.failedPlugins
|
|
235
|
+
: undefined;
|
|
236
|
+
const rawBrowserTools = Array.isArray(params.browserTools)
|
|
237
|
+
? params.browserTools
|
|
238
|
+
: undefined;
|
|
239
|
+
const rawServerVersion = typeof params.serverVersion === 'string' ? params.serverVersion : undefined;
|
|
240
|
+
updateServerStateCache({
|
|
241
|
+
plugins: cachePlugins,
|
|
242
|
+
...(rawFailedPlugins ? { failedPlugins: rawFailedPlugins } : {}),
|
|
243
|
+
...(rawBrowserTools ? { browserTools: rawBrowserTools } : {}),
|
|
244
|
+
...(rawServerVersion !== undefined ? { serverVersion: rawServerVersion } : {}),
|
|
245
|
+
});
|
|
246
|
+
// Notify the side panel immediately so it renders plugin cards from the
|
|
247
|
+
// background cache (metaCache + serverStateCache) without waiting for
|
|
248
|
+
// sendTabSyncAll to probe every plugin's isReady(). Tab states stream
|
|
249
|
+
// in progressively via tab.stateChanged as each probe completes.
|
|
205
250
|
forwardToSidePanel({
|
|
206
251
|
type: 'sp:serverMessage',
|
|
207
252
|
data: { jsonrpc: '2.0', method: 'plugins.changed' },
|
|
208
253
|
});
|
|
254
|
+
// Fire-and-forget: send tab.syncAll after all plugins are stored and
|
|
255
|
+
// injected, then start the readiness poll once probes complete. This
|
|
256
|
+
// runs after the side panel notification so the UI is not blocked by
|
|
257
|
+
// the O(N × round-trip) latency of probing every matching tab.
|
|
258
|
+
void sendTabSyncAll().then(() => {
|
|
259
|
+
startReadinessPoll();
|
|
260
|
+
});
|
|
209
261
|
};
|
|
210
262
|
const handlePluginUpdate = async (params) => {
|
|
211
263
|
const validated = validatePluginPayload(params);
|
|
@@ -224,6 +276,28 @@ const handlePluginUpdate = async (params) => {
|
|
|
224
276
|
const newState = await computePluginTabState(meta);
|
|
225
277
|
await updateLastKnownState(meta.name, newState);
|
|
226
278
|
sendTabStateNotification(meta.name, newState);
|
|
279
|
+
// Update the server state cache with the updated plugin's data so the
|
|
280
|
+
// side panel reads fresh tool enabled states and metadata from bg:getFullState.
|
|
281
|
+
// Merge the updated plugin into the existing cache's plugin list.
|
|
282
|
+
const existingCache = getServerStateCache();
|
|
283
|
+
const updatedPlugin = {
|
|
284
|
+
name: validated.name,
|
|
285
|
+
displayName: validated.displayName,
|
|
286
|
+
version: validated.version,
|
|
287
|
+
trustTier: validated.trustTier,
|
|
288
|
+
source: params.source === 'npm' || params.source === 'local' ? params.source : 'local',
|
|
289
|
+
tabState: newState.state,
|
|
290
|
+
urlPatterns: validated.urlPatterns,
|
|
291
|
+
tools: validated.tools,
|
|
292
|
+
iconSvg: validated.iconSvg,
|
|
293
|
+
iconInactiveSvg: validated.iconInactiveSvg,
|
|
294
|
+
...(typeof params.sdkVersion === 'string' ? { sdkVersion: params.sdkVersion } : {}),
|
|
295
|
+
...(params.update && typeof params.update === 'object'
|
|
296
|
+
? { update: params.update }
|
|
297
|
+
: {}),
|
|
298
|
+
};
|
|
299
|
+
const otherPlugins = existingCache.plugins.filter(p => p.name !== validated.name);
|
|
300
|
+
updateServerStateCache({ plugins: [...otherPlugins, updatedPlugin] });
|
|
227
301
|
// Notify the side panel so it refreshes its plugin list without user interaction
|
|
228
302
|
forwardToSidePanel({
|
|
229
303
|
type: 'sp:serverMessage',
|
|
@@ -270,6 +344,23 @@ const handlePluginUninstall = async (params, id) => {
|
|
|
270
344
|
id,
|
|
271
345
|
});
|
|
272
346
|
};
|
|
347
|
+
/**
|
|
348
|
+
* Handle extension.getTabState: return the last-known tab state for all plugins.
|
|
349
|
+
* The MCP server sends this request to get live tab state for the /health endpoint.
|
|
350
|
+
*/
|
|
351
|
+
const handleExtensionGetTabState = (_params, id) => {
|
|
352
|
+
const states = getLastKnownStates();
|
|
353
|
+
const tabStates = {};
|
|
354
|
+
for (const [pluginName, serialized] of states) {
|
|
355
|
+
try {
|
|
356
|
+
tabStates[pluginName] = JSON.parse(serialized);
|
|
357
|
+
}
|
|
358
|
+
catch {
|
|
359
|
+
tabStates[pluginName] = { state: 'closed', tabs: [] };
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
sendToServer({ jsonrpc: '2.0', result: { tabStates }, id });
|
|
363
|
+
};
|
|
273
364
|
// ---------------------------------------------------------------------------
|
|
274
365
|
// Dispatch table
|
|
275
366
|
// ---------------------------------------------------------------------------
|
|
@@ -321,18 +412,35 @@ const methodHandlers = new Map([
|
|
|
321
412
|
'extension.forceReconnect',
|
|
322
413
|
wrapAsync('extension.forceReconnect', (_params, id) => handleExtensionForceReconnect(id)),
|
|
323
414
|
],
|
|
415
|
+
['extension.getTabState', wrapSync('extension.getTabState', handleExtensionGetTabState)],
|
|
324
416
|
]);
|
|
325
417
|
/** Handle a JSON-RPC message received from the MCP server */
|
|
326
418
|
const handleServerMessage = (message) => {
|
|
327
419
|
const method = message.method;
|
|
328
420
|
const id = message.id;
|
|
329
421
|
const params = (message.params ?? {});
|
|
330
|
-
//
|
|
331
|
-
//
|
|
332
|
-
//
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
422
|
+
// Consume responses to pending server requests (sent via sendServerRequest
|
|
423
|
+
// in background mutation handlers). If consumed, the response resolves
|
|
424
|
+
// the corresponding promise — no further processing needed.
|
|
425
|
+
if (!method && consumeServerResponse(message)) {
|
|
426
|
+
return;
|
|
427
|
+
}
|
|
428
|
+
// Update the server state cache from plugins.changed push notifications
|
|
429
|
+
// BEFORE forwarding to the side panel so the side panel reads fresh data.
|
|
430
|
+
if (method === 'plugins.changed') {
|
|
431
|
+
const payload = params;
|
|
432
|
+
updateServerStateCache({
|
|
433
|
+
...(payload.plugins ? { plugins: payload.plugins } : {}),
|
|
434
|
+
...(payload.failedPlugins ? { failedPlugins: payload.failedPlugins } : {}),
|
|
435
|
+
...(payload.browserTools ? { browserTools: payload.browserTools } : {}),
|
|
436
|
+
...(payload.serverVersion !== undefined ? { serverVersion: payload.serverVersion } : {}),
|
|
437
|
+
});
|
|
438
|
+
}
|
|
439
|
+
// Forward notifications to the side panel only if the method is in the
|
|
440
|
+
// allowed set. Responses (id without method) are NOT forwarded — the side
|
|
441
|
+
// panel no longer sends JSON-RPC requests through the background relay.
|
|
442
|
+
// Unclaimed responses (not consumed above) are discarded.
|
|
443
|
+
if (method && SIDE_PANEL_METHODS.has(method)) {
|
|
336
444
|
forwardToSidePanel({ type: 'sp:serverMessage', data: message });
|
|
337
445
|
}
|
|
338
446
|
// Badge and notification for confirmation requests — alerts the user when a
|