@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.
Files changed (51) hide show
  1. package/README.md +20 -1
  2. package/dist/platform/browser/bridge/client.d.ts +2 -0
  3. package/dist/platform/browser/bridge/client.js +1 -1
  4. package/dist/platform/browser/bridge/model-commands.d.ts +1 -1
  5. package/dist/platform/browser/bridge/model-commands.js +1 -1
  6. package/dist/platform/browser/bridge/model-core.d.ts +15 -1
  7. package/dist/platform/browser/bridge/model-core.js +1 -1
  8. package/dist/platform/browser/bridge/server.js +1 -1
  9. package/dist/platform/browser/bridge-tabs.d.ts +12 -1
  10. package/dist/platform/browser/bridge-tabs.js +1 -1
  11. package/dist/platform/browser/cdp-connection.js +1 -1
  12. package/dist/platform/browser/driver-verbs.d.ts +1 -0
  13. package/dist/platform/browser/driver-verbs.js +2 -2
  14. package/dist/platform/browser/driver.d.ts +13 -1
  15. package/dist/platform/browser/driver.js +3 -2
  16. package/dist/platform/browser/messages.d.ts +6 -0
  17. package/dist/platform/browser/messages.js +2 -2
  18. package/dist/platform/chromium/actions.js +2 -2
  19. package/dist/platform/chromium/run-js.d.ts +5 -1
  20. package/dist/platform/chromium/run-js.js +2 -2
  21. package/dist/platform/chromium/scroll.js +5 -5
  22. package/dist/platform/driver-base.d.ts +1 -0
  23. package/dist/platform/driver-base.js +1 -1
  24. package/dist/platform/driver.d.ts +1 -0
  25. package/dist/platform/driver.js +4 -4
  26. package/dist/platform/electron/driver.js +1 -1
  27. package/dist/platform/electron/verbs.js +1 -1
  28. package/dist/platform/macos/type-verb.js +1 -1
  29. package/dist/platform/tools/api-contract.d.ts +1 -0
  30. package/dist/platform/tools/api.js +1 -1
  31. package/dist/platform/tools/repl-docs.js +1 -1
  32. package/dist/platform/tools/repl.js +17 -17
  33. package/extension/_locales/en/messages.json +179 -0
  34. package/extension/_locales/zh_CN/messages.json +179 -0
  35. package/extension/access.js +245 -0
  36. package/extension/ask.html +26 -0
  37. package/extension/ask.js +20 -0
  38. package/extension/background.js +79 -3
  39. package/extension/group.js +347 -80
  40. package/extension/icons/icon-128.png +0 -0
  41. package/extension/icons/icon-16.png +0 -0
  42. package/extension/icons/icon-32.png +0 -0
  43. package/extension/icons/icon-48.png +0 -0
  44. package/extension/manifest.json +8 -2
  45. package/extension/panel.css +86 -0
  46. package/extension/panel.html +86 -0
  47. package/extension/panel.js +192 -0
  48. package/extension/relay.js +268 -4
  49. package/extension/toolbar.js +172 -0
  50. package/package.json +5 -5
  51. package/scripts/extension.mjs +4 -2
@@ -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
- return false;
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
  }