@mirasim/computer-use 0.1.0-rc.5 → 0.1.0-rc.7
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 +20 -1
- package/dist/platform/browser/bridge/client.d.ts +2 -0
- package/dist/platform/browser/bridge/client.js +1 -1
- package/dist/platform/browser/bridge/model-commands.d.ts +1 -1
- package/dist/platform/browser/bridge/model-commands.js +1 -1
- package/dist/platform/browser/bridge/model-core.d.ts +15 -1
- package/dist/platform/browser/bridge/model-core.js +1 -1
- package/dist/platform/browser/bridge/server.js +1 -1
- package/dist/platform/browser/bridge-tabs.d.ts +12 -1
- package/dist/platform/browser/bridge-tabs.js +1 -1
- package/dist/platform/browser/cdp-connection.js +1 -1
- package/dist/platform/browser/driver-verbs.d.ts +1 -0
- package/dist/platform/browser/driver-verbs.js +2 -2
- package/dist/platform/browser/driver.d.ts +13 -1
- package/dist/platform/browser/driver.js +3 -2
- package/dist/platform/browser/messages.d.ts +6 -0
- package/dist/platform/browser/messages.js +2 -2
- package/dist/platform/chromium/actions.js +2 -2
- package/dist/platform/chromium/run-js.d.ts +5 -1
- package/dist/platform/chromium/run-js.js +2 -2
- package/dist/platform/chromium/scroll.js +5 -5
- package/dist/platform/driver-base.d.ts +1 -0
- package/dist/platform/driver-base.js +1 -1
- package/dist/platform/driver.d.ts +1 -0
- package/dist/platform/driver.js +4 -4
- package/dist/platform/electron/driver.js +1 -1
- package/dist/platform/electron/verbs.js +1 -1
- package/dist/platform/macos/type-verb.js +1 -1
- package/dist/platform/tools/api-contract.d.ts +1 -0
- package/dist/platform/tools/api.js +1 -1
- package/dist/platform/tools/repl-docs.js +1 -1
- package/dist/platform/tools/repl.js +17 -17
- package/extension/_locales/en/messages.json +179 -0
- package/extension/_locales/zh_CN/messages.json +179 -0
- package/extension/access.js +245 -0
- package/extension/ask.html +26 -0
- package/extension/ask.js +20 -0
- package/extension/background.js +79 -3
- package/extension/group.js +347 -80
- package/extension/icons/icon-128.png +0 -0
- package/extension/icons/icon-16.png +0 -0
- package/extension/icons/icon-32.png +0 -0
- package/extension/icons/icon-48.png +0 -0
- package/extension/manifest.json +8 -2
- package/extension/panel.css +86 -0
- package/extension/panel.html +86 -0
- package/extension/panel.js +192 -0
- package/extension/relay.js +268 -4
- package/extension/toolbar.js +172 -0
- package/package.json +5 -5
- package/scripts/extension.mjs +4 -2
package/extension/background.js
CHANGED
|
@@ -19,8 +19,10 @@
|
|
|
19
19
|
*/
|
|
20
20
|
|
|
21
21
|
import { RelayConnection, debugLog } from "./relay.js";
|
|
22
|
-
import { MirasimTabGroup } from "./group.js";
|
|
22
|
+
import { MirasimTabGroup, addToMirasimGroup } from "./group.js";
|
|
23
23
|
import { nativeTransport, webSocketTransport } from "./transport.js";
|
|
24
|
+
import { AccessPolicy, PANEL_SEEN_KEY } from "./access.js";
|
|
25
|
+
import { Toolbar } from "./toolbar.js";
|
|
24
26
|
|
|
25
27
|
const CONNECT_TIMEOUT_MS = 10_000;
|
|
26
28
|
/** How long the native probe waits for `pong` before calling the route dead. */
|
|
@@ -65,6 +67,9 @@ class BridgeExtension {
|
|
|
65
67
|
this._timer = null;
|
|
66
68
|
this._lastError = null;
|
|
67
69
|
this._updateVersion = null;
|
|
70
|
+
/** The user's access settings, held by every connection (access.js). */
|
|
71
|
+
this._policy = new AccessPolicy();
|
|
72
|
+
this._toolbar = new Toolbar(this._policy, () => this._activeGroup);
|
|
68
73
|
chrome.runtime.onUpdateAvailable.addListener(({ version }) => {
|
|
69
74
|
this._updateVersion = version;
|
|
70
75
|
if (this._activeGroup) this._activeGroup.updateAvailable(version);
|
|
@@ -91,7 +96,14 @@ class BridgeExtension {
|
|
|
91
96
|
});
|
|
92
97
|
return false;
|
|
93
98
|
default:
|
|
94
|
-
|
|
99
|
+
// The panel and the ask window: this extension's own pages, nothing else.
|
|
100
|
+
if (sender?.id !== chrome.runtime.id || !sender.url?.startsWith(chrome.runtime.getURL(""))) return false;
|
|
101
|
+
if (!String(message?.type).startsWith("panel.") && message?.type !== "access.answer") return false;
|
|
102
|
+
this._onPageMessage(message).then(
|
|
103
|
+
(result) => sendResponse({ ok: true, result }),
|
|
104
|
+
(e) => sendResponse({ ok: false, error: e?.message ?? String(e) }),
|
|
105
|
+
);
|
|
106
|
+
return true;
|
|
95
107
|
}
|
|
96
108
|
});
|
|
97
109
|
|
|
@@ -109,6 +121,67 @@ class BridgeExtension {
|
|
|
109
121
|
void this._connectNative();
|
|
110
122
|
}
|
|
111
123
|
|
|
124
|
+
// ─── the panel and the ask window ────────────────────────────────────────
|
|
125
|
+
|
|
126
|
+
async _onPageMessage(message) {
|
|
127
|
+
await this._policy.ready;
|
|
128
|
+
const group = this._activeGroup;
|
|
129
|
+
switch (message.type) {
|
|
130
|
+
case "panel.state":
|
|
131
|
+
return await this._panelState(message.tabId);
|
|
132
|
+
case "panel.seen":
|
|
133
|
+
await chrome.storage.local.set({ [PANEL_SEEN_KEY]: true });
|
|
134
|
+
return {};
|
|
135
|
+
case "panel.settings":
|
|
136
|
+
return await this._policy.saveSettings(message.settings);
|
|
137
|
+
case "panel.pause":
|
|
138
|
+
await this._policy.setPaused(message.paused === true);
|
|
139
|
+
return {};
|
|
140
|
+
case "panel.handOver":
|
|
141
|
+
await addToMirasimGroup(message.tabId);
|
|
142
|
+
await this._toolbar.refresh(message.tabId);
|
|
143
|
+
return {};
|
|
144
|
+
case "panel.takeBack":
|
|
145
|
+
if (group) await group.takeBack(message.tabId);
|
|
146
|
+
else await chrome.tabs.ungroup(message.tabId).catch(() => {});
|
|
147
|
+
await this._toolbar.refresh(message.tabId);
|
|
148
|
+
return {};
|
|
149
|
+
case "panel.focusTab": {
|
|
150
|
+
const tab = await chrome.tabs.update(message.tabId, { active: true });
|
|
151
|
+
if (tab?.windowId !== undefined) await chrome.windows.update(tab.windowId, { focused: true });
|
|
152
|
+
return {};
|
|
153
|
+
}
|
|
154
|
+
case "access.answer":
|
|
155
|
+
group?.answerAsk(message.tabId, message.allow === true);
|
|
156
|
+
return {};
|
|
157
|
+
default:
|
|
158
|
+
throw new Error(`Unknown message: ${message.type}`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/** Everything the panel shows, in one answer. */
|
|
163
|
+
async _panelState(tabId) {
|
|
164
|
+
const group = this._activeGroup;
|
|
165
|
+
const tab = Number.isInteger(tabId) ? await chrome.tabs.get(tabId).catch(() => null) : null;
|
|
166
|
+
const using = [];
|
|
167
|
+
for (const id of group?.connectedTabIds() ?? []) {
|
|
168
|
+
const t = await chrome.tabs.get(id).catch(() => null);
|
|
169
|
+
if (t) using.push({ id, title: t.title ?? "", url: t.url ?? "" });
|
|
170
|
+
}
|
|
171
|
+
return {
|
|
172
|
+
connected: !!group,
|
|
173
|
+
transport: this._transport,
|
|
174
|
+
error: group ? null : this._lastError,
|
|
175
|
+
extension: chrome.runtime.getManifest().version,
|
|
176
|
+
bridge: group?.bridgeInfo ?? null,
|
|
177
|
+
paused: this._policy.paused,
|
|
178
|
+
settings: this._policy.settings,
|
|
179
|
+
tab: tab ? { id: tab.id, title: tab.title ?? "", url: tab.url ?? "", ...(await this._toolbar.stateOf(tab)) } : null,
|
|
180
|
+
using,
|
|
181
|
+
log: this._policy.log,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
|
|
112
185
|
// ─── native messaging ────────────────────────────────────────────────────
|
|
113
186
|
|
|
114
187
|
/** Try each host in turn; keep the first that answers `pong`. */
|
|
@@ -257,11 +330,13 @@ class BridgeExtension {
|
|
|
257
330
|
async _adopt(connection, transport) {
|
|
258
331
|
this._activeGroup?.close("Replaced by a new bridge connection");
|
|
259
332
|
this._activeGroup = null;
|
|
260
|
-
const group = new MirasimTabGroup(connection);
|
|
333
|
+
const group = new MirasimTabGroup(connection, this._policy);
|
|
334
|
+
group.ontabstate = (tabId) => void this._toolbar.refresh(tabId);
|
|
261
335
|
group.onclose = () => {
|
|
262
336
|
if (this._activeGroup !== group) return;
|
|
263
337
|
this._activeGroup = null;
|
|
264
338
|
this._transport = null;
|
|
339
|
+
void this._toolbar.refreshAll();
|
|
265
340
|
// Native reconnects on its own; the ws path needs a new hand-over.
|
|
266
341
|
if (transport === "native") this._scheduleRetry();
|
|
267
342
|
};
|
|
@@ -273,6 +348,7 @@ class BridgeExtension {
|
|
|
273
348
|
// Armed WHILE connected, deliberately — see HEARTBEAT_MINUTES.
|
|
274
349
|
this._armAlarm(HEARTBEAT_MINUTES);
|
|
275
350
|
await group.ready;
|
|
351
|
+
void this._toolbar.refreshAll();
|
|
276
352
|
if (this._updateVersion) group.updateAvailable(this._updateVersion);
|
|
277
353
|
}
|
|
278
354
|
}
|