@mirasim/computer-use 0.0.0-stage → 0.1.0-rc.2

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 (341) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +16 -0
  3. package/README.md +154 -2
  4. package/THIRD_PARTY_NOTICES +488 -0
  5. package/bin/mirasim-cu.mjs +30 -0
  6. package/dist/entries/cli.d.ts +2 -0
  7. package/dist/entries/cli.js +32 -0
  8. package/dist/entries/commands/approvals.d.ts +1 -0
  9. package/dist/entries/commands/approvals.js +17 -0
  10. package/dist/entries/commands/bridge-host.d.ts +1 -0
  11. package/dist/entries/commands/bridge-host.js +7 -0
  12. package/dist/entries/commands/bridge.d.ts +1 -0
  13. package/dist/entries/commands/bridge.js +16 -0
  14. package/dist/entries/commands/browser-state.d.ts +1 -0
  15. package/dist/entries/commands/browser-state.js +8 -0
  16. package/dist/entries/commands/capture-server.d.ts +1 -0
  17. package/dist/entries/commands/capture-server.js +5 -0
  18. package/dist/entries/commands/help.d.ts +2 -0
  19. package/dist/entries/commands/help.js +1 -0
  20. package/dist/entries/commands/native-host-options.d.ts +32 -0
  21. package/dist/entries/commands/native-host-options.js +7 -0
  22. package/dist/entries/commands/setup-macos.d.ts +1 -0
  23. package/dist/entries/commands/setup-macos.js +4 -0
  24. package/dist/entries/commands/setup.d.ts +1 -0
  25. package/dist/entries/commands/setup.js +15 -0
  26. package/dist/entries/mcp.d.ts +1 -0
  27. package/dist/entries/mcp.js +6 -0
  28. package/dist/entries/version.d.ts +1 -0
  29. package/dist/entries/version.js +1 -0
  30. package/dist/index.d.ts +11 -0
  31. package/dist/index.js +1 -0
  32. package/dist/platform/browser/acquire.d.ts +15 -0
  33. package/dist/platform/browser/acquire.js +1 -0
  34. package/dist/platform/browser/bridge/acquire-bridge.d.ts +7 -0
  35. package/dist/platform/browser/bridge/acquire-bridge.js +3 -0
  36. package/dist/platform/browser/bridge/client.d.ts +69 -0
  37. package/dist/platform/browser/bridge/client.js +1 -0
  38. package/dist/platform/browser/bridge/extension-channel.d.ts +12 -0
  39. package/dist/platform/browser/bridge/extension-channel.js +1 -0
  40. package/dist/platform/browser/bridge/extension-id.d.ts +8 -0
  41. package/dist/platform/browser/bridge/extension-id.js +1 -0
  42. package/dist/platform/browser/bridge/extension-updates.d.ts +37 -0
  43. package/dist/platform/browser/bridge/extension-updates.js +1 -0
  44. package/dist/platform/browser/bridge/model-commands.d.ts +20 -0
  45. package/dist/platform/browser/bridge/model-commands.js +1 -0
  46. package/dist/platform/browser/bridge/model-core.d.ts +59 -0
  47. package/dist/platform/browser/bridge/model-core.js +1 -0
  48. package/dist/platform/browser/bridge/model.d.ts +4 -0
  49. package/dist/platform/browser/bridge/model.js +1 -0
  50. package/dist/platform/browser/bridge/native-frames.d.ts +9 -0
  51. package/dist/platform/browser/bridge/native-frames.js +1 -0
  52. package/dist/platform/browser/bridge/native-host.d.ts +24 -0
  53. package/dist/platform/browser/bridge/native-host.js +5 -0
  54. package/dist/platform/browser/bridge/runtime-contexts.d.ts +12 -0
  55. package/dist/platform/browser/bridge/runtime-contexts.js +1 -0
  56. package/dist/platform/browser/bridge/server-core.d.ts +66 -0
  57. package/dist/platform/browser/bridge/server-core.js +1 -0
  58. package/dist/platform/browser/bridge/server.d.ts +13 -0
  59. package/dist/platform/browser/bridge/server.js +1 -0
  60. package/dist/platform/browser/bridge-tabs.d.ts +22 -0
  61. package/dist/platform/browser/bridge-tabs.js +1 -0
  62. package/dist/platform/browser/cdp-connection.d.ts +3 -0
  63. package/dist/platform/browser/cdp-connection.js +1 -0
  64. package/dist/platform/browser/chrome-binary.d.ts +6 -0
  65. package/dist/platform/browser/chrome-binary.js +1 -0
  66. package/dist/platform/browser/config.d.ts +29 -0
  67. package/dist/platform/browser/config.js +1 -0
  68. package/dist/platform/browser/devtools-port.d.ts +3 -0
  69. package/dist/platform/browser/devtools-port.js +2 -0
  70. package/dist/platform/browser/downloads.d.ts +22 -0
  71. package/dist/platform/browser/downloads.js +1 -0
  72. package/dist/platform/browser/driver-connect.d.ts +13 -0
  73. package/dist/platform/browser/driver-connect.js +1 -0
  74. package/dist/platform/browser/driver-core.d.ts +50 -0
  75. package/dist/platform/browser/driver-core.js +1 -0
  76. package/dist/platform/browser/driver-tabs.d.ts +16 -0
  77. package/dist/platform/browser/driver-tabs.js +1 -0
  78. package/dist/platform/browser/driver-verbs.d.ts +13 -0
  79. package/dist/platform/browser/driver-verbs.js +2 -0
  80. package/dist/platform/browser/driver.d.ts +38 -0
  81. package/dist/platform/browser/driver.js +3 -0
  82. package/dist/platform/browser/focus-guard.d.ts +2 -0
  83. package/dist/platform/browser/focus-guard.js +1 -0
  84. package/dist/platform/browser/journal.d.ts +21 -0
  85. package/dist/platform/browser/journal.js +2 -0
  86. package/dist/platform/browser/keep-in-tab.d.ts +1 -0
  87. package/dist/platform/browser/keep-in-tab.js +1 -0
  88. package/dist/platform/browser/messages.d.ts +25 -0
  89. package/dist/platform/browser/messages.js +8 -0
  90. package/dist/platform/browser/navigate.d.ts +4 -0
  91. package/dist/platform/browser/navigate.js +2 -0
  92. package/dist/platform/browser/occupancy.d.ts +2 -0
  93. package/dist/platform/browser/occupancy.js +2 -0
  94. package/dist/platform/browser/overlay-guard.d.ts +3 -0
  95. package/dist/platform/browser/overlay-guard.js +1 -0
  96. package/dist/platform/browser/save-picker.d.ts +2 -0
  97. package/dist/platform/browser/save-picker.js +1 -0
  98. package/dist/platform/browser/session-files.d.ts +11 -0
  99. package/dist/platform/browser/session-files.js +1 -0
  100. package/dist/platform/browser/state.d.ts +25 -0
  101. package/dist/platform/browser/state.js +2 -0
  102. package/dist/platform/browser/tabs.d.ts +15 -0
  103. package/dist/platform/browser/tabs.js +2 -0
  104. package/dist/platform/browser/window-placement.d.ts +8 -0
  105. package/dist/platform/browser/window-placement.js +1 -0
  106. package/dist/platform/chromium/actions-value.d.ts +11 -0
  107. package/dist/platform/chromium/actions-value.js +5 -0
  108. package/dist/platform/chromium/actions.d.ts +20 -0
  109. package/dist/platform/chromium/actions.js +2 -0
  110. package/dist/platform/chromium/checkable-target.d.ts +1 -0
  111. package/dist/platform/chromium/checkable-target.js +1 -0
  112. package/dist/platform/chromium/collect-viewport.d.ts +1 -0
  113. package/dist/platform/chromium/collect-viewport.js +1 -0
  114. package/dist/platform/chromium/collect.d.ts +11 -0
  115. package/dist/platform/chromium/collect.js +1 -0
  116. package/dist/platform/chromium/coverer-label.d.ts +8 -0
  117. package/dist/platform/chromium/coverer-label.js +1 -0
  118. package/dist/platform/chromium/frames.d.ts +2 -0
  119. package/dist/platform/chromium/frames.js +1 -0
  120. package/dist/platform/chromium/headings.d.ts +1 -0
  121. package/dist/platform/chromium/headings.js +1 -0
  122. package/dist/platform/chromium/locate.d.ts +2 -0
  123. package/dist/platform/chromium/locate.js +1 -0
  124. package/dist/platform/chromium/page-acts.d.ts +9 -0
  125. package/dist/platform/chromium/page-acts.js +1 -0
  126. package/dist/platform/chromium/page-base.d.ts +33 -0
  127. package/dist/platform/chromium/page-base.js +1 -0
  128. package/dist/platform/chromium/page-driver.d.ts +18 -0
  129. package/dist/platform/chromium/page-driver.js +2 -0
  130. package/dist/platform/chromium/page-refs.d.ts +4 -0
  131. package/dist/platform/chromium/page-refs.js +1 -0
  132. package/dist/platform/chromium/page-text.d.ts +15 -0
  133. package/dist/platform/chromium/page-text.js +1 -0
  134. package/dist/platform/chromium/page-waits.d.ts +7 -0
  135. package/dist/platform/chromium/page-waits.js +1 -0
  136. package/dist/platform/chromium/preview-stream.d.ts +37 -0
  137. package/dist/platform/chromium/preview-stream.js +1 -0
  138. package/dist/platform/chromium/preview.d.ts +3 -0
  139. package/dist/platform/chromium/preview.js +1 -0
  140. package/dist/platform/chromium/read-page-script.d.ts +1 -0
  141. package/dist/platform/chromium/read-page-script.js +1 -0
  142. package/dist/platform/chromium/read-page.d.ts +11 -0
  143. package/dist/platform/chromium/read-page.js +6 -0
  144. package/dist/platform/chromium/run-js.d.ts +4 -0
  145. package/dist/platform/chromium/run-js.js +2 -0
  146. package/dist/platform/chromium/scroll-regions.d.ts +1 -0
  147. package/dist/platform/chromium/scroll-regions.js +1 -0
  148. package/dist/platform/chromium/scroll-scripts.d.ts +3 -0
  149. package/dist/platform/chromium/scroll-scripts.js +1 -0
  150. package/dist/platform/chromium/scroll.d.ts +18 -0
  151. package/dist/platform/chromium/scroll.js +5 -0
  152. package/dist/platform/chromium/select-text.d.ts +4 -0
  153. package/dist/platform/chromium/select-text.js +2 -0
  154. package/dist/platform/chromium/shot.d.ts +10 -0
  155. package/dist/platform/chromium/shot.js +2 -0
  156. package/dist/platform/chromium/unreached.d.ts +8 -0
  157. package/dist/platform/chromium/unreached.js +1 -0
  158. package/dist/platform/cli-command.d.ts +1 -0
  159. package/dist/platform/cli-command.js +1 -0
  160. package/dist/platform/driver-base.d.ts +83 -0
  161. package/dist/platform/driver-base.js +1 -0
  162. package/dist/platform/driver-diagnostics.d.ts +30 -0
  163. package/dist/platform/driver-diagnostics.js +4 -0
  164. package/dist/platform/driver-lines.d.ts +15 -0
  165. package/dist/platform/driver-lines.js +2 -0
  166. package/dist/platform/driver-narrate.d.ts +26 -0
  167. package/dist/platform/driver-narrate.js +3 -0
  168. package/dist/platform/driver-refs.d.ts +16 -0
  169. package/dist/platform/driver-refs.js +1 -0
  170. package/dist/platform/driver-render.d.ts +26 -0
  171. package/dist/platform/driver-render.js +4 -0
  172. package/dist/platform/driver-select.d.ts +31 -0
  173. package/dist/platform/driver-select.js +2 -0
  174. package/dist/platform/driver-settle.d.ts +22 -0
  175. package/dist/platform/driver-settle.js +4 -0
  176. package/dist/platform/driver-verdict.d.ts +11 -0
  177. package/dist/platform/driver-verdict.js +5 -0
  178. package/dist/platform/driver-wait.d.ts +9 -0
  179. package/dist/platform/driver-wait.js +1 -0
  180. package/dist/platform/driver-waits.d.ts +10 -0
  181. package/dist/platform/driver-waits.js +1 -0
  182. package/dist/platform/driver.d.ts +39 -0
  183. package/dist/platform/driver.js +15 -0
  184. package/dist/platform/electron/driver.d.ts +30 -0
  185. package/dist/platform/electron/driver.js +7 -0
  186. package/dist/platform/electron/preflight.d.ts +9 -0
  187. package/dist/platform/electron/preflight.js +1 -0
  188. package/dist/platform/electron/verbs.d.ts +3 -0
  189. package/dist/platform/electron/verbs.js +1 -0
  190. package/dist/platform/home.d.ts +2 -0
  191. package/dist/platform/home.js +1 -0
  192. package/dist/platform/macos/act-element.d.ts +27 -0
  193. package/dist/platform/macos/act-element.js +1 -0
  194. package/dist/platform/macos/app-names.d.ts +2 -0
  195. package/dist/platform/macos/app-names.js +2 -0
  196. package/dist/platform/macos/app-notes.d.ts +2 -0
  197. package/dist/platform/macos/app-notes.js +86 -0
  198. package/dist/platform/macos/approvals.d.ts +10 -0
  199. package/dist/platform/macos/approvals.js +2 -0
  200. package/dist/platform/macos/ax-client.d.ts +53 -0
  201. package/dist/platform/macos/ax-client.js +3 -0
  202. package/dist/platform/macos/ax-errors.d.ts +16 -0
  203. package/dist/platform/macos/ax-errors.js +1 -0
  204. package/dist/platform/macos/ax-shapes.d.ts +53 -0
  205. package/dist/platform/macos/ax-shapes.js +1 -0
  206. package/dist/platform/macos/capture-client.d.ts +11 -0
  207. package/dist/platform/macos/capture-client.js +2 -0
  208. package/dist/platform/macos/click-verb.d.ts +4 -0
  209. package/dist/platform/macos/click-verb.js +1 -0
  210. package/dist/platform/macos/driver-apps.d.ts +59 -0
  211. package/dist/platform/macos/driver-apps.js +2 -0
  212. package/dist/platform/macos/driver-read.d.ts +47 -0
  213. package/dist/platform/macos/driver-read.js +1 -0
  214. package/dist/platform/macos/driver-targets.d.ts +9 -0
  215. package/dist/platform/macos/driver-targets.js +1 -0
  216. package/dist/platform/macos/driver.d.ts +65 -0
  217. package/dist/platform/macos/driver.js +2 -0
  218. package/dist/platform/macos/element-lines.d.ts +12 -0
  219. package/dist/platform/macos/element-lines.js +1 -0
  220. package/dist/platform/macos/element-shapes.d.ts +54 -0
  221. package/dist/platform/macos/element-shapes.js +0 -0
  222. package/dist/platform/macos/element-text.d.ts +3 -0
  223. package/dist/platform/macos/element-text.js +2 -0
  224. package/dist/platform/macos/elements.d.ts +26 -0
  225. package/dist/platform/macos/elements.js +1 -0
  226. package/dist/platform/macos/extra-verbs.d.ts +2 -0
  227. package/dist/platform/macos/extra-verbs.js +1 -0
  228. package/dist/platform/macos/interaction-notes.d.ts +2 -0
  229. package/dist/platform/macos/interaction-notes.js +1 -0
  230. package/dist/platform/macos/interaction-policy.d.ts +5 -0
  231. package/dist/platform/macos/interaction-policy.js +1 -0
  232. package/dist/platform/macos/menu-commands.d.ts +22 -0
  233. package/dist/platform/macos/menu-commands.js +5 -0
  234. package/dist/platform/macos/mouse.d.ts +23 -0
  235. package/dist/platform/macos/mouse.js +1 -0
  236. package/dist/platform/macos/narrate.d.ts +20 -0
  237. package/dist/platform/macos/narrate.js +1 -0
  238. package/dist/platform/macos/permissions.d.ts +5 -0
  239. package/dist/platform/macos/permissions.js +1 -0
  240. package/dist/platform/macos/press-rungs.d.ts +49 -0
  241. package/dist/platform/macos/press-rungs.js +5 -0
  242. package/dist/platform/macos/preview-stream.d.ts +15 -0
  243. package/dist/platform/macos/preview-stream.js +1 -0
  244. package/dist/platform/macos/prompt-fragment.d.ts +1 -0
  245. package/dist/platform/macos/prompt-fragment.js +1 -0
  246. package/dist/platform/macos/scroll-pages.d.ts +1 -0
  247. package/dist/platform/macos/scroll-pages.js +1 -0
  248. package/dist/platform/macos/scroll-verb.d.ts +5 -0
  249. package/dist/platform/macos/scroll-verb.js +1 -0
  250. package/dist/platform/macos/select-text-verb.d.ts +8 -0
  251. package/dist/platform/macos/select-text-verb.js +1 -0
  252. package/dist/platform/macos/type-verb.d.ts +5 -0
  253. package/dist/platform/macos/type-verb.js +1 -0
  254. package/dist/platform/ownership.d.ts +20 -0
  255. package/dist/platform/ownership.js +1 -0
  256. package/dist/platform/platform-package.d.ts +1 -0
  257. package/dist/platform/platform-package.js +1 -0
  258. package/dist/platform/preview.d.ts +39 -0
  259. package/dist/platform/preview.js +1 -0
  260. package/dist/platform/profile.d.ts +20 -0
  261. package/dist/platform/profile.js +1 -0
  262. package/dist/platform/registry.d.ts +12 -0
  263. package/dist/platform/registry.js +1 -0
  264. package/dist/platform/tools/api-contract.d.ts +33 -0
  265. package/dist/platform/tools/api-contract.js +3 -0
  266. package/dist/platform/tools/api-expect.d.ts +3 -0
  267. package/dist/platform/tools/api-expect.js +1 -0
  268. package/dist/platform/tools/api-run.d.ts +6 -0
  269. package/dist/platform/tools/api-run.js +1 -0
  270. package/dist/platform/tools/api-target.d.ts +22 -0
  271. package/dist/platform/tools/api-target.js +1 -0
  272. package/dist/platform/tools/api-wait.d.ts +3 -0
  273. package/dist/platform/tools/api-wait.js +1 -0
  274. package/dist/platform/tools/api.d.ts +7 -0
  275. package/dist/platform/tools/api.js +1 -0
  276. package/dist/platform/tools/find-target.d.ts +54 -0
  277. package/dist/platform/tools/find-target.js +1 -0
  278. package/dist/platform/tools/index.d.ts +8 -0
  279. package/dist/platform/tools/index.js +1 -0
  280. package/dist/platform/tools/normalize.d.ts +2 -0
  281. package/dist/platform/tools/normalize.js +1 -0
  282. package/dist/platform/tools/repl-budget.d.ts +8 -0
  283. package/dist/platform/tools/repl-budget.js +4 -0
  284. package/dist/platform/tools/repl-code.d.ts +1 -0
  285. package/dist/platform/tools/repl-code.js +4 -0
  286. package/dist/platform/tools/repl-docs.d.ts +5 -0
  287. package/dist/platform/tools/repl-docs.js +4 -0
  288. package/dist/platform/tools/repl-state.d.ts +21 -0
  289. package/dist/platform/tools/repl-state.js +0 -0
  290. package/dist/platform/tools/repl.d.ts +8 -0
  291. package/dist/platform/tools/repl.js +19 -0
  292. package/dist/platform/tools/shot-file.d.ts +7 -0
  293. package/dist/platform/tools/shot-file.js +1 -0
  294. package/dist/platform/tools/validate.d.ts +2 -0
  295. package/dist/platform/tools/validate.js +1 -0
  296. package/dist/platform/types.d.ts +220 -0
  297. package/dist/platform/types.js +1 -0
  298. package/dist/platform/windows/app-gate.d.ts +24 -0
  299. package/dist/platform/windows/app-gate.js +2 -0
  300. package/dist/platform/windows/background-verb.d.ts +13 -0
  301. package/dist/platform/windows/background-verb.js +1 -0
  302. package/dist/platform/windows/dates.d.ts +2 -0
  303. package/dist/platform/windows/dates.js +1 -0
  304. package/dist/platform/windows/driver-apps.d.ts +9 -0
  305. package/dist/platform/windows/driver-apps.js +1 -0
  306. package/dist/platform/windows/driver-read.d.ts +12 -0
  307. package/dist/platform/windows/driver-read.js +3 -0
  308. package/dist/platform/windows/driver-targets.d.ts +58 -0
  309. package/dist/platform/windows/driver-targets.js +1 -0
  310. package/dist/platform/windows/driver-yield.d.ts +10 -0
  311. package/dist/platform/windows/driver-yield.js +1 -0
  312. package/dist/platform/windows/driver.d.ts +39 -0
  313. package/dist/platform/windows/driver.js +2 -0
  314. package/dist/platform/windows/elements.d.ts +66 -0
  315. package/dist/platform/windows/elements.js +2 -0
  316. package/dist/platform/windows/launch.d.ts +23 -0
  317. package/dist/platform/windows/launch.js +1 -0
  318. package/dist/platform/windows/menu-verb.d.ts +7 -0
  319. package/dist/platform/windows/menu-verb.js +6 -0
  320. package/dist/platform/windows/prompt-fragment.d.ts +2 -0
  321. package/dist/platform/windows/prompt-fragment.js +1 -0
  322. package/dist/platform/windows/text-verbs.d.ts +10 -0
  323. package/dist/platform/windows/text-verbs.js +5 -0
  324. package/dist/platform/windows/uia-client.d.ts +32 -0
  325. package/dist/platform/windows/uia-client.js +3 -0
  326. package/dist/platform/windows/verbs.d.ts +2 -0
  327. package/dist/platform/windows/verbs.js +1 -0
  328. package/extension/background.js +280 -0
  329. package/extension/connect.html +27 -0
  330. package/extension/connect.js +28 -0
  331. package/extension/group.js +283 -0
  332. package/extension/icons/icon-128.png +0 -0
  333. package/extension/icons/icon-16.png +0 -0
  334. package/extension/icons/icon-32.png +0 -0
  335. package/extension/icons/icon-48.png +0 -0
  336. package/extension/manifest.json +36 -0
  337. package/extension/relay.js +361 -0
  338. package/extension/runtime-info.js +9 -0
  339. package/extension/transport.js +81 -0
  340. package/package.json +76 -4
  341. package/scripts/extension.mjs +111 -0
@@ -0,0 +1,9 @@
1
+ /** Captured from the loaded manifest, never fetched from files that an app update can replace. */
2
+ const manifest = chrome.runtime.getManifest();
3
+ export const RUNTIME_INFO = Object.freeze({
4
+ id: chrome.runtime.id,
5
+ version: manifest.version,
6
+ build: manifest.version_name ?? null,
7
+ protocol: 1,
8
+ capabilities: ["discarded-tabs", "safe-reload"],
9
+ });
@@ -0,0 +1,81 @@
1
+ /**
2
+ * The two ways this worker reaches the local mirasim bridge, behind one shape.
3
+ *
4
+ * `RelayConnection` speaks JSON objects; which pipe carries them is this file's business:
5
+ *
6
+ * - **native** — `chrome.runtime.connectNative`: Chrome spawns `mirasim-cu
7
+ * bridge-host`, which pumps the frames into mirasim's own socket. The product path.
8
+ * - **ws** — the one-shot relay a connect page handed over; only the end-to-end test seam
9
+ * (see background.js).
10
+ *
11
+ * A transport is `{kind, send(obj), close(reason), onmessage, onclose}` — assign the two
12
+ * handlers, then send. Both call `onclose` exactly once.
13
+ */
14
+
15
+ /** @typedef {{kind: 'native'|'ws', send: (msg: any) => void, close: (reason: string) => void, onmessage?: (msg: any) => void, onclose?: () => void}} Transport */
16
+
17
+ /** @param {chrome.runtime.Port} port @returns {Transport} */
18
+ export function nativeTransport(port) {
19
+ let closed = false;
20
+ /** @type {Transport} */
21
+ const transport = {
22
+ kind: "native",
23
+ // Ports carry structured values — no stringify, and no 1 MB blind spot of our own: the
24
+ // limit lives in Chrome and surfaces as a disconnect, which the reconnect loop handles.
25
+ send: (msg) => {
26
+ if (!closed) port.postMessage(msg);
27
+ },
28
+ close: () => {
29
+ if (closed) return;
30
+ closed = true;
31
+ try {
32
+ port.disconnect();
33
+ } catch {
34
+ /* already gone */
35
+ }
36
+ },
37
+ };
38
+ port.onMessage.addListener((msg) => transport.onmessage?.(msg));
39
+ port.onDisconnect.addListener(() => {
40
+ if (closed) return;
41
+ closed = true;
42
+ transport.onclose?.();
43
+ });
44
+ return transport;
45
+ }
46
+
47
+ /** @param {WebSocket} ws @returns {Transport} */
48
+ export function webSocketTransport(ws) {
49
+ /** @type {Transport} */
50
+ const transport = {
51
+ kind: "ws",
52
+ send: (msg) => {
53
+ if (ws.readyState === WebSocket.OPEN) ws.send(JSON.stringify(msg));
54
+ },
55
+ close: (reason) => {
56
+ try {
57
+ ws.close(1000, reason);
58
+ } catch {
59
+ /* already closing */
60
+ }
61
+ },
62
+ };
63
+ ws.onmessage = (event) => {
64
+ let msg;
65
+ try {
66
+ msg = JSON.parse(event.data);
67
+ } catch {
68
+ return; // a malformed frame is the bridge's bug; dropping it keeps the line up
69
+ }
70
+ transport.onmessage?.(msg);
71
+ };
72
+ let closed = false;
73
+ const shut = () => {
74
+ if (closed) return;
75
+ closed = true;
76
+ transport.onclose?.();
77
+ };
78
+ ws.onclose = shut;
79
+ ws.onerror = shut;
80
+ return transport;
81
+ }
package/package.json CHANGED
@@ -1,6 +1,78 @@
1
1
  {
2
2
  "name": "@mirasim/computer-use",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.0-rc.2",
4
+ "description": "Computer use for any agent: an MCP server that drives browsers, macOS apps, Windows apps and Electron apps through their accessibility trees.",
5
+ "type": "module",
6
+ "keywords": [
7
+ "computer-use",
8
+ "mcp",
9
+ "browser",
10
+ "macos",
11
+ "windows",
12
+ "accessibility",
13
+ "agent"
14
+ ],
15
+ "license": "Apache-2.0",
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "git+https://github.com/mirasim-ai/computer-use.git"
19
+ },
20
+ "homepage": "https://github.com/mirasim-ai/computer-use#readme",
21
+ "bugs": {
22
+ "url": "https://github.com/mirasim-ai/computer-use/issues"
23
+ },
24
+ "engines": {
25
+ "node": ">=22.19.0"
26
+ },
27
+ "bin": {
28
+ "mirasim-cu": "bin/mirasim-cu.mjs"
29
+ },
30
+ "files": [
31
+ "bin",
32
+ "dist",
33
+ "extension",
34
+ "NOTICE",
35
+ "THIRD_PARTY_NOTICES",
36
+ "scripts/extension.mjs"
37
+ ],
38
+ "main": "./dist/index.js",
39
+ "types": "./dist/index.d.ts",
40
+ "exports": {
41
+ ".": {
42
+ "types": "./dist/index.d.ts",
43
+ "default": "./dist/index.js"
44
+ }
45
+ },
46
+ "scripts": {
47
+ "build": "node scripts/build.mjs",
48
+ "prepack": "npm run build",
49
+ "dev": "tsx src/entries/cli.ts",
50
+ "typecheck": "tsc -p tsconfig.json",
51
+ "test": "npm run typecheck && node scripts/test.mjs unit",
52
+ "test:browser": "node scripts/test.mjs browser",
53
+ "test:all": "npm run typecheck && node scripts/test.mjs all"
54
+ },
55
+ "dependencies": {
56
+ "@modelcontextprotocol/sdk": "^1.30.0",
57
+ "acorn": "^8.16.0",
58
+ "playwright-core": "^1.62.1",
59
+ "typebox": "^1.3.9",
60
+ "ws": "^8.18.0"
61
+ },
62
+ "devDependencies": {
63
+ "@types/node": "24.13.3",
64
+ "@types/ws": "^8.18.1",
65
+ "esbuild": "0.28.2",
66
+ "tsx": "^4.19.2",
67
+ "typescript": "7.0.2"
68
+ },
69
+ "publishConfig": {
70
+ "access": "public"
71
+ },
72
+ "optionalDependencies": {
73
+ "@mirasim/computer-use-darwin-arm64": "0.1.0-rc.2",
74
+ "@mirasim/computer-use-darwin-x64": "0.1.0-rc.2",
75
+ "@mirasim/computer-use-win32-x64": "0.1.0-rc.2",
76
+ "@mirasim/computer-use-win32-arm64": "0.1.0-rc.2"
77
+ }
78
+ }
@@ -0,0 +1,111 @@
1
+ /**
2
+ * The browser extension, packaged two ways from one identity and one readable file set:
3
+ *
4
+ * - `stageExtension(dir)` lays out the unpacked copy a host ships beside its bundle (imported by
5
+ * hosts that bundle computer-use);
6
+ * - `node scripts/extension.mjs --version <v> --out <dir> [--public-key <pem>]` also writes the
7
+ * deterministic, uncompressed Chrome Web Store ZIP, with Node alone (including on Windows).
8
+ */
9
+ import { createHash, createPublicKey } from 'node:crypto';
10
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
11
+ import path from 'node:path';
12
+ import { fileURLToPath, pathToFileURL } from 'node:url';
13
+ import { parseArgs } from 'node:util';
14
+ import { crc32 } from 'node:zlib';
15
+
16
+ export const extensionSource = fileURLToPath(new URL('../extension/', import.meta.url));
17
+ const files = ['background.js', 'group.js', 'relay.js', 'runtime-info.js', 'transport.js',
18
+ 'connect.html', 'connect.js', ...[16, 32, 48, 128].map((size) => `icons/icon-${size}.png`)];
19
+
20
+ export function extensionId(key) {
21
+ return [...createHash('sha256').update(Buffer.from(key, 'base64')).digest().subarray(0, 16)]
22
+ .map((b) => 'abcdefghijklmnop'[b >> 4] + 'abcdefghijklmnop'[b & 15]).join('');
23
+ }
24
+
25
+ export function stageExtension(destination, options = {}) {
26
+ const source = options.sourceDir ?? extensionSource;
27
+ const manifest = JSON.parse(readFileSync(path.join(source, 'manifest.json'), 'utf8'));
28
+ manifest.version = options.version ?? manifest.version;
29
+ if (!/^(0|[1-9]\d*)(\.(0|[1-9]\d*)){0,3}$/.test(manifest.version)
30
+ || manifest.version.split('.').some((n) => Number(n) > 65535)
31
+ || !manifest.version.split('.').some(Number)) throw new Error('Extension version must contain 1–4 integers from 0 to 65535 and cannot be all zero.');
32
+ if (manifest.description.length > 132) throw new Error('Extension description exceeds the Web Store 132-character limit.');
33
+ const keyFile = options.publicKeyFile;
34
+ if (keyFile) {
35
+ const input = readFileSync(keyFile, 'utf8').trim();
36
+ if (input.includes('PRIVATE KEY')) throw new Error('Provide the Web Store PUBLIC key, never a private key.');
37
+ const key = input.includes('BEGIN PUBLIC KEY') ? createPublicKey(input)
38
+ : createPublicKey({ key: Buffer.from(input.replace(/\s/g, ''), 'base64'), format: 'der', type: 'spki' });
39
+ if (key.asymmetricKeyType !== 'rsa') throw new Error('Expected an RSA public key from the Web Store Package tab.');
40
+ manifest.key = key.export({ format: 'der', type: 'spki' }).toString('base64');
41
+ }
42
+ // Stable across machines and output paths. The loaded manifest identifies the running code,
43
+ // even when an app update has already replaced the unpacked files on disk.
44
+ delete manifest.version_name;
45
+ const payload = files.map((name) => [name, readFileSync(path.join(source, name))]);
46
+ const { key: _identity, ...behavior } = manifest;
47
+ const hash = createHash('sha256').update(JSON.stringify(behavior));
48
+ for (const [name, content] of payload) hash.update(name).update(content);
49
+ manifest.version_name = `${manifest.version} (${hash.digest('hex').slice(0, 16)})`;
50
+ payload.push(['manifest.json', Buffer.from(`${JSON.stringify(manifest, null, 2)}\n`)]);
51
+ // The license and its notices travel with every copy of the code (Apache-2.0 §4). They are not
52
+ // behavior, so they stay out of the fingerprint: changing them never reads as a new extension.
53
+ for (const name of ['LICENSE', 'NOTICE']) payload.push([name, readFileSync(path.join(source, '..', name))]);
54
+ for (const [name, content] of payload) {
55
+ const target = path.join(destination, name);
56
+ mkdirSync(path.dirname(target), { recursive: true });
57
+ writeFileSync(target, content);
58
+ }
59
+ return { manifest, extensionId: extensionId(manifest.key), files: payload };
60
+ }
61
+
62
+ /** The Web Store ZIP and its receipt (the command line above). */
63
+ function packageForStore() {
64
+ const { values } = parseArgs({ options: {
65
+ version: { type: 'string' }, out: { type: 'string' }, 'public-key': { type: 'string' }, help: { type: 'boolean' },
66
+ } });
67
+ if (values.help || !values.version || !values.out) {
68
+ console.log('Usage: node scripts/extension.mjs --version 0.1.1 --out /path/to/new-output [--public-key /path/to/store-public-key.pem]');
69
+ process.exit(values.help ? 0 : 1);
70
+ }
71
+ const out = path.resolve(values.out);
72
+ if (existsSync(out)) throw new Error('Output already exists; choose a new directory so an earlier package is preserved.');
73
+ const staged = stageExtension(path.join(out, 'extension'), { version: values.version, publicKeyFile: values['public-key'] });
74
+ // The Web Store refuses an uploaded manifest that carries `key`: the store assigns the item's
75
+ // identity itself. Only the ZIP drops it — the unpacked copy keeps it, so loading that locally
76
+ // runs under the same ID, and the build fingerprint never covered `key` (stageExtension above).
77
+ const { key: _identity, ...storeManifest } = staged.manifest;
78
+ const zipFiles = staged.files.map(([name, content]) => name === 'manifest.json'
79
+ ? [name, Buffer.from(`${JSON.stringify(storeManifest, null, 2)}\n`)] : [name, content]);
80
+ const local = [], central = [];
81
+ let offset = 0;
82
+ for (const [name, content] of zipFiles.sort(([a], [b]) => a.localeCompare(b, 'en'))) {
83
+ const filename = Buffer.from(name), checksum = crc32(content);
84
+ const header = Buffer.alloc(30);
85
+ header.writeUInt32LE(0x04034b50); header.writeUInt16LE(20, 4);
86
+ header.writeUInt16LE(0x21, 12); // fixed DOS date: 1980-01-01
87
+ header.writeUInt32LE(checksum, 14); header.writeUInt32LE(content.length, 18);
88
+ header.writeUInt32LE(content.length, 22); header.writeUInt16LE(filename.length, 26);
89
+ local.push(header, filename, content);
90
+ const entry = Buffer.alloc(46);
91
+ entry.writeUInt32LE(0x02014b50); entry.writeUInt16LE(20, 4); entry.writeUInt16LE(20, 6);
92
+ entry.writeUInt16LE(0x21, 14); entry.writeUInt32LE(checksum, 16);
93
+ entry.writeUInt32LE(content.length, 20); entry.writeUInt32LE(content.length, 24);
94
+ entry.writeUInt16LE(filename.length, 28); entry.writeUInt32LE(offset, 42);
95
+ central.push(entry, filename);
96
+ offset += header.length + filename.length + content.length;
97
+ }
98
+ const directory = Buffer.concat(central), end = Buffer.alloc(22);
99
+ end.writeUInt32LE(0x06054b50); end.writeUInt16LE(zipFiles.length, 8); end.writeUInt16LE(zipFiles.length, 10);
100
+ end.writeUInt32LE(directory.length, 12); end.writeUInt32LE(offset, 16);
101
+ const zip = Buffer.concat([...local, directory, end]);
102
+ const filename = `mirasim-browser-bridge-${staged.manifest.version}.zip`;
103
+ mkdirSync(out, { recursive: true });
104
+ writeFileSync(path.join(out, filename), zip);
105
+ const receipt = { file: filename, version: staged.manifest.version, build: staged.manifest.version_name,
106
+ extensionId: staged.extensionId, sha256: createHash('sha256').update(zip).digest('hex') };
107
+ writeFileSync(path.join(out, 'package.json'), `${JSON.stringify(receipt, null, 2)}\n`);
108
+ console.log(JSON.stringify(receipt, null, 2));
109
+ }
110
+
111
+ if (process.argv[1] && import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href) packageForStore();