@openmouse/protocol 0.1.0

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 (547) hide show
  1. package/CONTRIBUTING.md +167 -0
  2. package/README.md +89 -0
  3. package/dist/asus/index.d.ts +52 -0
  4. package/dist/asus/index.d.ts.map +1 -0
  5. package/dist/asus/index.js +248 -0
  6. package/dist/asus/index.js.map +1 -0
  7. package/dist/atk/index.d.ts +200 -0
  8. package/dist/atk/index.d.ts.map +1 -0
  9. package/dist/atk/index.js +480 -0
  10. package/dist/atk/index.js.map +1 -0
  11. package/dist/bitmouse/index.d.ts +284 -0
  12. package/dist/bitmouse/index.d.ts.map +1 -0
  13. package/dist/bitmouse/index.js +396 -0
  14. package/dist/bitmouse/index.js.map +1 -0
  15. package/dist/compx/codec.d.ts +31 -0
  16. package/dist/compx/codec.d.ts.map +1 -0
  17. package/dist/compx/codec.js +50 -0
  18. package/dist/compx/codec.js.map +1 -0
  19. package/dist/corsair/index.d.ts +147 -0
  20. package/dist/corsair/index.d.ts.map +1 -0
  21. package/dist/corsair/index.js +223 -0
  22. package/dist/corsair/index.js.map +1 -0
  23. package/dist/dareu/index.d.ts +136 -0
  24. package/dist/dareu/index.d.ts.map +1 -0
  25. package/dist/dareu/index.js +344 -0
  26. package/dist/dareu/index.js.map +1 -0
  27. package/dist/drivers/asus/hid.d.ts +29 -0
  28. package/dist/drivers/asus/hid.d.ts.map +1 -0
  29. package/dist/drivers/asus/hid.js +419 -0
  30. package/dist/drivers/asus/hid.js.map +1 -0
  31. package/dist/drivers/atk/bitmouse-hid.d.ts +80 -0
  32. package/dist/drivers/atk/bitmouse-hid.d.ts.map +1 -0
  33. package/dist/drivers/atk/bitmouse-hid.js +501 -0
  34. package/dist/drivers/atk/bitmouse-hid.js.map +1 -0
  35. package/dist/drivers/atk/hid.d.ts +163 -0
  36. package/dist/drivers/atk/hid.d.ts.map +1 -0
  37. package/dist/drivers/atk/hid.js +1368 -0
  38. package/dist/drivers/atk/hid.js.map +1 -0
  39. package/dist/drivers/atk/products.d.ts +13 -0
  40. package/dist/drivers/atk/products.d.ts.map +1 -0
  41. package/dist/drivers/atk/products.js +13 -0
  42. package/dist/drivers/atk/products.js.map +1 -0
  43. package/dist/drivers/attackshark/dpi.d.ts +41 -0
  44. package/dist/drivers/attackshark/dpi.d.ts.map +1 -0
  45. package/dist/drivers/attackshark/dpi.js +215 -0
  46. package/dist/drivers/attackshark/dpi.js.map +1 -0
  47. package/dist/drivers/attackshark/hid.d.ts +124 -0
  48. package/dist/drivers/attackshark/hid.d.ts.map +1 -0
  49. package/dist/drivers/attackshark/hid.js +728 -0
  50. package/dist/drivers/attackshark/hid.js.map +1 -0
  51. package/dist/drivers/corsair/hid.d.ts +70 -0
  52. package/dist/drivers/corsair/hid.d.ts.map +1 -0
  53. package/dist/drivers/corsair/hid.js +414 -0
  54. package/dist/drivers/corsair/hid.js.map +1 -0
  55. package/dist/drivers/dareu/hid.d.ts +59 -0
  56. package/dist/drivers/dareu/hid.d.ts.map +1 -0
  57. package/dist/drivers/dareu/hid.js +478 -0
  58. package/dist/drivers/dareu/hid.js.map +1 -0
  59. package/dist/drivers/endgame/egg-op1-hid.d.ts +107 -0
  60. package/dist/drivers/endgame/egg-op1-hid.d.ts.map +1 -0
  61. package/dist/drivers/endgame/egg-op1-hid.js +605 -0
  62. package/dist/drivers/endgame/egg-op1-hid.js.map +1 -0
  63. package/dist/drivers/endgame/egg-we-control.d.ts +42 -0
  64. package/dist/drivers/endgame/egg-we-control.d.ts.map +1 -0
  65. package/dist/drivers/endgame/egg-we-control.js +87 -0
  66. package/dist/drivers/endgame/egg-we-control.js.map +1 -0
  67. package/dist/drivers/endgame/egg-we-hid.d.ts +58 -0
  68. package/dist/drivers/endgame/egg-we-hid.d.ts.map +1 -0
  69. package/dist/drivers/endgame/egg-we-hid.js +514 -0
  70. package/dist/drivers/endgame/egg-we-hid.js.map +1 -0
  71. package/dist/drivers/fantech/hid.d.ts +106 -0
  72. package/dist/drivers/fantech/hid.d.ts.map +1 -0
  73. package/dist/drivers/fantech/hid.js +295 -0
  74. package/dist/drivers/fantech/hid.js.map +1 -0
  75. package/dist/drivers/finalmouse/hid.d.ts +31 -0
  76. package/dist/drivers/finalmouse/hid.d.ts.map +1 -0
  77. package/dist/drivers/finalmouse/hid.js +181 -0
  78. package/dist/drivers/finalmouse/hid.js.map +1 -0
  79. package/dist/drivers/gearhub/hid.d.ts +191 -0
  80. package/dist/drivers/gearhub/hid.d.ts.map +1 -0
  81. package/dist/drivers/gearhub/hid.js +542 -0
  82. package/dist/drivers/gearhub/hid.js.map +1 -0
  83. package/dist/drivers/glorious/classic-hid.d.ts +62 -0
  84. package/dist/drivers/glorious/classic-hid.d.ts.map +1 -0
  85. package/dist/drivers/glorious/classic-hid.js +326 -0
  86. package/dist/drivers/glorious/classic-hid.js.map +1 -0
  87. package/dist/drivers/glorious/hid.d.ts +39 -0
  88. package/dist/drivers/glorious/hid.d.ts.map +1 -0
  89. package/dist/drivers/glorious/hid.js +203 -0
  90. package/dist/drivers/glorious/hid.js.map +1 -0
  91. package/dist/drivers/gwolves/hid.d.ts +27 -0
  92. package/dist/drivers/gwolves/hid.d.ts.map +1 -0
  93. package/dist/drivers/gwolves/hid.js +225 -0
  94. package/dist/drivers/gwolves/hid.js.map +1 -0
  95. package/dist/drivers/gwolves/products.d.ts +17 -0
  96. package/dist/drivers/gwolves/products.d.ts.map +1 -0
  97. package/dist/drivers/gwolves/products.js +58 -0
  98. package/dist/drivers/gwolves/products.js.map +1 -0
  99. package/dist/drivers/hyperx/hid.d.ts +59 -0
  100. package/dist/drivers/hyperx/hid.d.ts.map +1 -0
  101. package/dist/drivers/hyperx/hid.js +229 -0
  102. package/dist/drivers/hyperx/hid.js.map +1 -0
  103. package/dist/drivers/incott/hid.d.ts +513 -0
  104. package/dist/drivers/incott/hid.d.ts.map +1 -0
  105. package/dist/drivers/incott/hid.js +1173 -0
  106. package/dist/drivers/incott/hid.js.map +1 -0
  107. package/dist/drivers/index.d.ts +5 -0
  108. package/dist/drivers/index.d.ts.map +1 -0
  109. package/dist/drivers/index.js +5 -0
  110. package/dist/drivers/index.js.map +1 -0
  111. package/dist/drivers/keychron/m6-hid.d.ts +81 -0
  112. package/dist/drivers/keychron/m6-hid.d.ts.map +1 -0
  113. package/dist/drivers/keychron/m6-hid.js +486 -0
  114. package/dist/drivers/keychron/m6-hid.js.map +1 -0
  115. package/dist/drivers/keychron/nape-hid.d.ts +60 -0
  116. package/dist/drivers/keychron/nape-hid.d.ts.map +1 -0
  117. package/dist/drivers/keychron/nape-hid.js +432 -0
  118. package/dist/drivers/keychron/nape-hid.js.map +1 -0
  119. package/dist/drivers/ksnake/hid.d.ts +74 -0
  120. package/dist/drivers/ksnake/hid.d.ts.map +1 -0
  121. package/dist/drivers/ksnake/hid.js +368 -0
  122. package/dist/drivers/ksnake/hid.js.map +1 -0
  123. package/dist/drivers/lamzu/hid.d.ts +58 -0
  124. package/dist/drivers/lamzu/hid.d.ts.map +1 -0
  125. package/dist/drivers/lamzu/hid.js +414 -0
  126. package/dist/drivers/lamzu/hid.js.map +1 -0
  127. package/dist/drivers/lamzu-atlantis/hid.d.ts +148 -0
  128. package/dist/drivers/lamzu-atlantis/hid.d.ts.map +1 -0
  129. package/dist/drivers/lamzu-atlantis/hid.js +587 -0
  130. package/dist/drivers/lamzu-atlantis/hid.js.map +1 -0
  131. package/dist/drivers/logitech/bolt.d.ts +41 -0
  132. package/dist/drivers/logitech/bolt.d.ts.map +1 -0
  133. package/dist/drivers/logitech/bolt.js +105 -0
  134. package/dist/drivers/logitech/bolt.js.map +1 -0
  135. package/dist/drivers/logitech/hidpp.d.ts +525 -0
  136. package/dist/drivers/logitech/hidpp.d.ts.map +1 -0
  137. package/dist/drivers/logitech/hidpp.js +2774 -0
  138. package/dist/drivers/logitech/hidpp.js.map +1 -0
  139. package/dist/drivers/logitech/mode-status.d.ts +53 -0
  140. package/dist/drivers/logitech/mode-status.d.ts.map +1 -0
  141. package/dist/drivers/logitech/mode-status.js +52 -0
  142. package/dist/drivers/logitech/mode-status.js.map +1 -0
  143. package/dist/drivers/logitech/onboard-profiles.d.ts +298 -0
  144. package/dist/drivers/logitech/onboard-profiles.d.ts.map +1 -0
  145. package/dist/drivers/logitech/onboard-profiles.js +965 -0
  146. package/dist/drivers/logitech/onboard-profiles.js.map +1 -0
  147. package/dist/drivers/logitech/rgb-effects.d.ts +20 -0
  148. package/dist/drivers/logitech/rgb-effects.d.ts.map +1 -0
  149. package/dist/drivers/logitech/rgb-effects.js +93 -0
  150. package/dist/drivers/logitech/rgb-effects.js.map +1 -0
  151. package/dist/drivers/mchose/a5-gen1-hid.d.ts +36 -0
  152. package/dist/drivers/mchose/a5-gen1-hid.d.ts.map +1 -0
  153. package/dist/drivers/mchose/a5-gen1-hid.js +219 -0
  154. package/dist/drivers/mchose/a5-gen1-hid.js.map +1 -0
  155. package/dist/drivers/mchose/dock-hid.d.ts +26 -0
  156. package/dist/drivers/mchose/dock-hid.d.ts.map +1 -0
  157. package/dist/drivers/mchose/dock-hid.js +176 -0
  158. package/dist/drivers/mchose/dock-hid.js.map +1 -0
  159. package/dist/drivers/mchose/hid.d.ts +118 -0
  160. package/dist/drivers/mchose/hid.d.ts.map +1 -0
  161. package/dist/drivers/mchose/hid.js +550 -0
  162. package/dist/drivers/mchose/hid.js.map +1 -0
  163. package/dist/drivers/mchose/v3-hid.d.ts +109 -0
  164. package/dist/drivers/mchose/v3-hid.d.ts.map +1 -0
  165. package/dist/drivers/mchose/v3-hid.js +572 -0
  166. package/dist/drivers/mchose/v3-hid.js.map +1 -0
  167. package/dist/drivers/microsoft/hid.d.ts +25 -0
  168. package/dist/drivers/microsoft/hid.d.ts.map +1 -0
  169. package/dist/drivers/microsoft/hid.js +247 -0
  170. package/dist/drivers/microsoft/hid.js.map +1 -0
  171. package/dist/drivers/moddo/hid.d.ts +31 -0
  172. package/dist/drivers/moddo/hid.d.ts.map +1 -0
  173. package/dist/drivers/moddo/hid.js +154 -0
  174. package/dist/drivers/moddo/hid.js.map +1 -0
  175. package/dist/drivers/mouse-types.d.ts +388 -0
  176. package/dist/drivers/mouse-types.d.ts.map +1 -0
  177. package/dist/drivers/mouse-types.js +2 -0
  178. package/dist/drivers/mouse-types.js.map +1 -0
  179. package/dist/drivers/ninjutso/hid.d.ts +62 -0
  180. package/dist/drivers/ninjutso/hid.d.ts.map +1 -0
  181. package/dist/drivers/ninjutso/hid.js +680 -0
  182. package/dist/drivers/ninjutso/hid.js.map +1 -0
  183. package/dist/drivers/orbital/hid.d.ts +24 -0
  184. package/dist/drivers/orbital/hid.d.ts.map +1 -0
  185. package/dist/drivers/orbital/hid.js +85 -0
  186. package/dist/drivers/orbital/hid.js.map +1 -0
  187. package/dist/drivers/orbital/host-protocol.d.ts +59 -0
  188. package/dist/drivers/orbital/host-protocol.d.ts.map +1 -0
  189. package/dist/drivers/orbital/host-protocol.js +884 -0
  190. package/dist/drivers/orbital/host-protocol.js.map +1 -0
  191. package/dist/drivers/pulsar/pulsar-hid.d.ts +63 -0
  192. package/dist/drivers/pulsar/pulsar-hid.d.ts.map +1 -0
  193. package/dist/drivers/pulsar/pulsar-hid.js +381 -0
  194. package/dist/drivers/pulsar/pulsar-hid.js.map +1 -0
  195. package/dist/drivers/pulsar/pulsar-pro-hid.d.ts +46 -0
  196. package/dist/drivers/pulsar/pulsar-pro-hid.d.ts.map +1 -0
  197. package/dist/drivers/pulsar/pulsar-pro-hid.js +343 -0
  198. package/dist/drivers/pulsar/pulsar-pro-hid.js.map +1 -0
  199. package/dist/drivers/pulsar/pulsar-xs1-hid.d.ts +40 -0
  200. package/dist/drivers/pulsar/pulsar-xs1-hid.d.ts.map +1 -0
  201. package/dist/drivers/pulsar/pulsar-xs1-hid.js +251 -0
  202. package/dist/drivers/pulsar/pulsar-xs1-hid.js.map +1 -0
  203. package/dist/drivers/rawm/hid.d.ts +29 -0
  204. package/dist/drivers/rawm/hid.d.ts.map +1 -0
  205. package/dist/drivers/rawm/hid.js +210 -0
  206. package/dist/drivers/rawm/hid.js.map +1 -0
  207. package/dist/drivers/razer/cobra-hid.d.ts +63 -0
  208. package/dist/drivers/razer/cobra-hid.d.ts.map +1 -0
  209. package/dist/drivers/razer/cobra-hid.js +282 -0
  210. package/dist/drivers/razer/cobra-hid.js.map +1 -0
  211. package/dist/drivers/razer/hid-open.d.ts +13 -0
  212. package/dist/drivers/razer/hid-open.d.ts.map +1 -0
  213. package/dist/drivers/razer/hid-open.js +29 -0
  214. package/dist/drivers/razer/hid-open.js.map +1 -0
  215. package/dist/drivers/razer/hid.d.ts +231 -0
  216. package/dist/drivers/razer/hid.d.ts.map +1 -0
  217. package/dist/drivers/razer/hid.js +772 -0
  218. package/dist/drivers/razer/hid.js.map +1 -0
  219. package/dist/drivers/razer/viper-hid.d.ts +33 -0
  220. package/dist/drivers/razer/viper-hid.d.ts.map +1 -0
  221. package/dist/drivers/razer/viper-hid.js +177 -0
  222. package/dist/drivers/razer/viper-hid.js.map +1 -0
  223. package/dist/drivers/razer/viper-mini-hid.d.ts +58 -0
  224. package/dist/drivers/razer/viper-mini-hid.d.ts.map +1 -0
  225. package/dist/drivers/razer/viper-mini-hid.js +273 -0
  226. package/dist/drivers/razer/viper-mini-hid.js.map +1 -0
  227. package/dist/drivers/razer/viper-v4-pro-hid.d.ts +26 -0
  228. package/dist/drivers/razer/viper-v4-pro-hid.d.ts.map +1 -0
  229. package/dist/drivers/razer/viper-v4-pro-hid.js +154 -0
  230. package/dist/drivers/razer/viper-v4-pro-hid.js.map +1 -0
  231. package/dist/drivers/registry.d.ts +70 -0
  232. package/dist/drivers/registry.d.ts.map +1 -0
  233. package/dist/drivers/registry.js +146 -0
  234. package/dist/drivers/registry.js.map +1 -0
  235. package/dist/drivers/steelseries/aerox3-hid.d.ts +53 -0
  236. package/dist/drivers/steelseries/aerox3-hid.d.ts.map +1 -0
  237. package/dist/drivers/steelseries/aerox3-hid.js +172 -0
  238. package/dist/drivers/steelseries/aerox3-hid.js.map +1 -0
  239. package/dist/drivers/steelseries/aerox5-hid.d.ts +54 -0
  240. package/dist/drivers/steelseries/aerox5-hid.d.ts.map +1 -0
  241. package/dist/drivers/steelseries/aerox5-hid.js +173 -0
  242. package/dist/drivers/steelseries/aerox5-hid.js.map +1 -0
  243. package/dist/drivers/steelseries/aerox5-wireless-hid.d.ts +69 -0
  244. package/dist/drivers/steelseries/aerox5-wireless-hid.d.ts.map +1 -0
  245. package/dist/drivers/steelseries/aerox5-wireless-hid.js +234 -0
  246. package/dist/drivers/steelseries/aerox5-wireless-hid.js.map +1 -0
  247. package/dist/drivers/steelseries/aerox9-wireless-hid.d.ts +70 -0
  248. package/dist/drivers/steelseries/aerox9-wireless-hid.d.ts.map +1 -0
  249. package/dist/drivers/steelseries/aerox9-wireless-hid.js +227 -0
  250. package/dist/drivers/steelseries/aerox9-wireless-hid.js.map +1 -0
  251. package/dist/drivers/steelseries/hid.d.ts +48 -0
  252. package/dist/drivers/steelseries/hid.d.ts.map +1 -0
  253. package/dist/drivers/steelseries/hid.js +157 -0
  254. package/dist/drivers/steelseries/hid.js.map +1 -0
  255. package/dist/drivers/steelseries/prime-mini-wireless-hid.d.ts +62 -0
  256. package/dist/drivers/steelseries/prime-mini-wireless-hid.d.ts.map +1 -0
  257. package/dist/drivers/steelseries/prime-mini-wireless-hid.js +215 -0
  258. package/dist/drivers/steelseries/prime-mini-wireless-hid.js.map +1 -0
  259. package/dist/drivers/steelseries/prime-plus-hid.d.ts +51 -0
  260. package/dist/drivers/steelseries/prime-plus-hid.d.ts.map +1 -0
  261. package/dist/drivers/steelseries/prime-plus-hid.js +150 -0
  262. package/dist/drivers/steelseries/prime-plus-hid.js.map +1 -0
  263. package/dist/drivers/steelseries/rival3-wireless-hid.d.ts +61 -0
  264. package/dist/drivers/steelseries/rival3-wireless-hid.d.ts.map +1 -0
  265. package/dist/drivers/steelseries/rival3-wireless-hid.js +185 -0
  266. package/dist/drivers/steelseries/rival3-wireless-hid.js.map +1 -0
  267. package/dist/drivers/steelseries/rival310-hid.d.ts +59 -0
  268. package/dist/drivers/steelseries/rival310-hid.d.ts.map +1 -0
  269. package/dist/drivers/steelseries/rival310-hid.js +182 -0
  270. package/dist/drivers/steelseries/rival310-hid.js.map +1 -0
  271. package/dist/drivers/steelseries/rival650-hid.d.ts +68 -0
  272. package/dist/drivers/steelseries/rival650-hid.d.ts.map +1 -0
  273. package/dist/drivers/steelseries/rival650-hid.js +209 -0
  274. package/dist/drivers/steelseries/rival650-hid.js.map +1 -0
  275. package/dist/drivers/steelseries/sensei-ten-hid.d.ts +62 -0
  276. package/dist/drivers/steelseries/sensei-ten-hid.d.ts.map +1 -0
  277. package/dist/drivers/steelseries/sensei-ten-hid.js +186 -0
  278. package/dist/drivers/steelseries/sensei-ten-hid.js.map +1 -0
  279. package/dist/drivers/teevolution/hid.d.ts +82 -0
  280. package/dist/drivers/teevolution/hid.d.ts.map +1 -0
  281. package/dist/drivers/teevolution/hid.js +607 -0
  282. package/dist/drivers/teevolution/hid.js.map +1 -0
  283. package/dist/drivers/vendors.d.ts +254 -0
  284. package/dist/drivers/vendors.d.ts.map +1 -0
  285. package/dist/drivers/vendors.js +587 -0
  286. package/dist/drivers/vendors.js.map +1 -0
  287. package/dist/drivers/vgn/hid.d.ts +33 -0
  288. package/dist/drivers/vgn/hid.d.ts.map +1 -0
  289. package/dist/drivers/vgn/hid.js +213 -0
  290. package/dist/drivers/vgn/hid.js.map +1 -0
  291. package/dist/drivers/wallhack/keyboard-hid.d.ts +28 -0
  292. package/dist/drivers/wallhack/keyboard-hid.d.ts.map +1 -0
  293. package/dist/drivers/wallhack/keyboard-hid.js +80 -0
  294. package/dist/drivers/wallhack/keyboard-hid.js.map +1 -0
  295. package/dist/drivers/wallhack/mouse-hid.d.ts +45 -0
  296. package/dist/drivers/wallhack/mouse-hid.d.ts.map +1 -0
  297. package/dist/drivers/wallhack/mouse-hid.js +288 -0
  298. package/dist/drivers/wallhack/mouse-hid.js.map +1 -0
  299. package/dist/drivers/webhid.d.ts +59 -0
  300. package/dist/drivers/webhid.d.ts.map +1 -0
  301. package/dist/drivers/webhid.js +2 -0
  302. package/dist/drivers/webhid.js.map +1 -0
  303. package/dist/drivers/wlmouse/hid.d.ts +81 -0
  304. package/dist/drivers/wlmouse/hid.d.ts.map +1 -0
  305. package/dist/drivers/wlmouse/hid.js +576 -0
  306. package/dist/drivers/wlmouse/hid.js.map +1 -0
  307. package/dist/drivers/wooting/hid.d.ts +86 -0
  308. package/dist/drivers/wooting/hid.d.ts.map +1 -0
  309. package/dist/drivers/wooting/hid.js +320 -0
  310. package/dist/drivers/wooting/hid.js.map +1 -0
  311. package/dist/drivers/zaunkoenig/hid.d.ts +31 -0
  312. package/dist/drivers/zaunkoenig/hid.d.ts.map +1 -0
  313. package/dist/drivers/zaunkoenig/hid.js +162 -0
  314. package/dist/drivers/zaunkoenig/hid.js.map +1 -0
  315. package/dist/endgame-gear/op1.d.ts +165 -0
  316. package/dist/endgame-gear/op1.d.ts.map +1 -0
  317. package/dist/endgame-gear/op1.js +384 -0
  318. package/dist/endgame-gear/op1.js.map +1 -0
  319. package/dist/endgame-gear/wireless.d.ts +93 -0
  320. package/dist/endgame-gear/wireless.d.ts.map +1 -0
  321. package/dist/endgame-gear/wireless.js +242 -0
  322. package/dist/endgame-gear/wireless.js.map +1 -0
  323. package/dist/fantech/index.d.ts +9 -0
  324. package/dist/fantech/index.d.ts.map +1 -0
  325. package/dist/fantech/index.js +11 -0
  326. package/dist/fantech/index.js.map +1 -0
  327. package/dist/finalmouse/index.d.ts +41 -0
  328. package/dist/finalmouse/index.d.ts.map +1 -0
  329. package/dist/finalmouse/index.js +106 -0
  330. package/dist/finalmouse/index.js.map +1 -0
  331. package/dist/gearhub/index.d.ts +210 -0
  332. package/dist/gearhub/index.d.ts.map +1 -0
  333. package/dist/gearhub/index.js +282 -0
  334. package/dist/gearhub/index.js.map +1 -0
  335. package/dist/glorious/index.d.ts +89 -0
  336. package/dist/glorious/index.d.ts.map +1 -0
  337. package/dist/glorious/index.js +236 -0
  338. package/dist/glorious/index.js.map +1 -0
  339. package/dist/glorious-classic/index.d.ts +103 -0
  340. package/dist/glorious-classic/index.d.ts.map +1 -0
  341. package/dist/glorious-classic/index.js +304 -0
  342. package/dist/glorious-classic/index.js.map +1 -0
  343. package/dist/gwolves/index.d.ts +82 -0
  344. package/dist/gwolves/index.d.ts.map +1 -0
  345. package/dist/gwolves/index.js +197 -0
  346. package/dist/gwolves/index.js.map +1 -0
  347. package/dist/hyperx/index.d.ts +181 -0
  348. package/dist/hyperx/index.d.ts.map +1 -0
  349. package/dist/hyperx/index.js +303 -0
  350. package/dist/hyperx/index.js.map +1 -0
  351. package/dist/incott/index.d.ts +1067 -0
  352. package/dist/incott/index.d.ts.map +1 -0
  353. package/dist/incott/index.js +1482 -0
  354. package/dist/incott/index.js.map +1 -0
  355. package/dist/index.d.ts +30 -0
  356. package/dist/index.d.ts.map +1 -0
  357. package/dist/index.js +30 -0
  358. package/dist/index.js.map +1 -0
  359. package/dist/keychron/index.d.ts +194 -0
  360. package/dist/keychron/index.d.ts.map +1 -0
  361. package/dist/keychron/index.js +341 -0
  362. package/dist/keychron/index.js.map +1 -0
  363. package/dist/ksnake/index.d.ts +157 -0
  364. package/dist/ksnake/index.d.ts.map +1 -0
  365. package/dist/ksnake/index.js +314 -0
  366. package/dist/ksnake/index.js.map +1 -0
  367. package/dist/lamzu/atlantis.d.ts +237 -0
  368. package/dist/lamzu/atlantis.d.ts.map +1 -0
  369. package/dist/lamzu/atlantis.js +263 -0
  370. package/dist/lamzu/atlantis.js.map +1 -0
  371. package/dist/lamzu/index.d.ts +60 -0
  372. package/dist/lamzu/index.d.ts.map +1 -0
  373. package/dist/lamzu/index.js +86 -0
  374. package/dist/lamzu/index.js.map +1 -0
  375. package/dist/logitech/controls.d.ts +138 -0
  376. package/dist/logitech/controls.d.ts.map +1 -0
  377. package/dist/logitech/controls.js +184 -0
  378. package/dist/logitech/controls.js.map +1 -0
  379. package/dist/logitech/friendly-name.d.ts +50 -0
  380. package/dist/logitech/friendly-name.d.ts.map +1 -0
  381. package/dist/logitech/friendly-name.js +74 -0
  382. package/dist/logitech/friendly-name.js.map +1 -0
  383. package/dist/logitech/haptics.d.ts +97 -0
  384. package/dist/logitech/haptics.d.ts.map +1 -0
  385. package/dist/logitech/haptics.js +116 -0
  386. package/dist/logitech/haptics.js.map +1 -0
  387. package/dist/logitech/hosts.d.ts +55 -0
  388. package/dist/logitech/hosts.d.ts.map +1 -0
  389. package/dist/logitech/hosts.js +80 -0
  390. package/dist/logitech/hosts.js.map +1 -0
  391. package/dist/logitech/index.d.ts +127 -0
  392. package/dist/logitech/index.d.ts.map +1 -0
  393. package/dist/logitech/index.js +233 -0
  394. package/dist/logitech/index.js.map +1 -0
  395. package/dist/logitech/wheel.d.ts +117 -0
  396. package/dist/logitech/wheel.d.ts.map +1 -0
  397. package/dist/logitech/wheel.js +133 -0
  398. package/dist/logitech/wheel.js.map +1 -0
  399. package/dist/mchose/a5-gen1.d.ts +38 -0
  400. package/dist/mchose/a5-gen1.d.ts.map +1 -0
  401. package/dist/mchose/a5-gen1.js +60 -0
  402. package/dist/mchose/a5-gen1.js.map +1 -0
  403. package/dist/mchose/buttons.d.ts +66 -0
  404. package/dist/mchose/buttons.d.ts.map +1 -0
  405. package/dist/mchose/buttons.js +184 -0
  406. package/dist/mchose/buttons.js.map +1 -0
  407. package/dist/mchose/dock.d.ts +77 -0
  408. package/dist/mchose/dock.d.ts.map +1 -0
  409. package/dist/mchose/dock.js +133 -0
  410. package/dist/mchose/dock.js.map +1 -0
  411. package/dist/mchose/index.d.ts +299 -0
  412. package/dist/mchose/index.d.ts.map +1 -0
  413. package/dist/mchose/index.js +429 -0
  414. package/dist/mchose/index.js.map +1 -0
  415. package/dist/mchose/v3-buttons.d.ts +64 -0
  416. package/dist/mchose/v3-buttons.d.ts.map +1 -0
  417. package/dist/mchose/v3-buttons.js +258 -0
  418. package/dist/mchose/v3-buttons.js.map +1 -0
  419. package/dist/mchose/v3.d.ts +380 -0
  420. package/dist/mchose/v3.d.ts.map +1 -0
  421. package/dist/mchose/v3.js +608 -0
  422. package/dist/mchose/v3.js.map +1 -0
  423. package/dist/microsoft/index.d.ts +19 -0
  424. package/dist/microsoft/index.d.ts.map +1 -0
  425. package/dist/microsoft/index.js +22 -0
  426. package/dist/microsoft/index.js.map +1 -0
  427. package/dist/moddo/index.d.ts +72 -0
  428. package/dist/moddo/index.d.ts.map +1 -0
  429. package/dist/moddo/index.js +147 -0
  430. package/dist/moddo/index.js.map +1 -0
  431. package/dist/ninjutso/index.d.ts +74 -0
  432. package/dist/ninjutso/index.d.ts.map +1 -0
  433. package/dist/ninjutso/index.js +133 -0
  434. package/dist/ninjutso/index.js.map +1 -0
  435. package/dist/orbital/index.d.ts +14 -0
  436. package/dist/orbital/index.d.ts.map +1 -0
  437. package/dist/orbital/index.js +19 -0
  438. package/dist/orbital/index.js.map +1 -0
  439. package/dist/pulsar/index.d.ts +81 -0
  440. package/dist/pulsar/index.d.ts.map +1 -0
  441. package/dist/pulsar/index.js +185 -0
  442. package/dist/pulsar/index.js.map +1 -0
  443. package/dist/rawm/index.d.ts +55 -0
  444. package/dist/rawm/index.d.ts.map +1 -0
  445. package/dist/rawm/index.js +229 -0
  446. package/dist/rawm/index.js.map +1 -0
  447. package/dist/razer/codec.d.ts +504 -0
  448. package/dist/razer/codec.d.ts.map +1 -0
  449. package/dist/razer/codec.js +648 -0
  450. package/dist/razer/codec.js.map +1 -0
  451. package/dist/razer/devices.d.ts +156 -0
  452. package/dist/razer/devices.d.ts.map +1 -0
  453. package/dist/razer/devices.js +540 -0
  454. package/dist/razer/devices.js.map +1 -0
  455. package/dist/razer/index.d.ts +2 -0
  456. package/dist/razer/index.d.ts.map +1 -0
  457. package/dist/razer/index.js +2 -0
  458. package/dist/razer/index.js.map +1 -0
  459. package/dist/razer/v4.d.ts +19 -0
  460. package/dist/razer/v4.d.ts.map +1 -0
  461. package/dist/razer/v4.js +51 -0
  462. package/dist/razer/v4.js.map +1 -0
  463. package/dist/steelseries/aerox3.d.ts +236 -0
  464. package/dist/steelseries/aerox3.d.ts.map +1 -0
  465. package/dist/steelseries/aerox3.js +311 -0
  466. package/dist/steelseries/aerox3.js.map +1 -0
  467. package/dist/steelseries/aerox5-wireless.d.ts +300 -0
  468. package/dist/steelseries/aerox5-wireless.d.ts.map +1 -0
  469. package/dist/steelseries/aerox5-wireless.js +389 -0
  470. package/dist/steelseries/aerox5-wireless.js.map +1 -0
  471. package/dist/steelseries/aerox5.d.ts +228 -0
  472. package/dist/steelseries/aerox5.d.ts.map +1 -0
  473. package/dist/steelseries/aerox5.js +294 -0
  474. package/dist/steelseries/aerox5.js.map +1 -0
  475. package/dist/steelseries/aerox9-wireless.d.ts +213 -0
  476. package/dist/steelseries/aerox9-wireless.d.ts.map +1 -0
  477. package/dist/steelseries/aerox9-wireless.js +305 -0
  478. package/dist/steelseries/aerox9-wireless.js.map +1 -0
  479. package/dist/steelseries/devices.d.ts +82 -0
  480. package/dist/steelseries/devices.d.ts.map +1 -0
  481. package/dist/steelseries/devices.js +310 -0
  482. package/dist/steelseries/devices.js.map +1 -0
  483. package/dist/steelseries/index.d.ts +13 -0
  484. package/dist/steelseries/index.d.ts.map +1 -0
  485. package/dist/steelseries/index.js +13 -0
  486. package/dist/steelseries/index.js.map +1 -0
  487. package/dist/steelseries/prime-mini-wireless.d.ts +253 -0
  488. package/dist/steelseries/prime-mini-wireless.d.ts.map +1 -0
  489. package/dist/steelseries/prime-mini-wireless.js +351 -0
  490. package/dist/steelseries/prime-mini-wireless.js.map +1 -0
  491. package/dist/steelseries/prime-plus.d.ts +179 -0
  492. package/dist/steelseries/prime-plus.d.ts.map +1 -0
  493. package/dist/steelseries/prime-plus.js +275 -0
  494. package/dist/steelseries/prime-plus.js.map +1 -0
  495. package/dist/steelseries/rival3-wireless.d.ts +222 -0
  496. package/dist/steelseries/rival3-wireless.d.ts.map +1 -0
  497. package/dist/steelseries/rival3-wireless.js +308 -0
  498. package/dist/steelseries/rival3-wireless.js.map +1 -0
  499. package/dist/steelseries/rival3.d.ts +99 -0
  500. package/dist/steelseries/rival3.d.ts.map +1 -0
  501. package/dist/steelseries/rival3.js +147 -0
  502. package/dist/steelseries/rival3.js.map +1 -0
  503. package/dist/steelseries/rival310.d.ts +230 -0
  504. package/dist/steelseries/rival310.d.ts.map +1 -0
  505. package/dist/steelseries/rival310.js +322 -0
  506. package/dist/steelseries/rival310.js.map +1 -0
  507. package/dist/steelseries/rival650.d.ts +215 -0
  508. package/dist/steelseries/rival650.d.ts.map +1 -0
  509. package/dist/steelseries/rival650.js +284 -0
  510. package/dist/steelseries/rival650.js.map +1 -0
  511. package/dist/steelseries/sensei-ten.d.ts +283 -0
  512. package/dist/steelseries/sensei-ten.d.ts.map +1 -0
  513. package/dist/steelseries/sensei-ten.js +389 -0
  514. package/dist/steelseries/sensei-ten.js.map +1 -0
  515. package/dist/teevolution/index.d.ts +211 -0
  516. package/dist/teevolution/index.d.ts.map +1 -0
  517. package/dist/teevolution/index.js +458 -0
  518. package/dist/teevolution/index.js.map +1 -0
  519. package/dist/valkyrie/index.d.ts +19 -0
  520. package/dist/valkyrie/index.d.ts.map +1 -0
  521. package/dist/valkyrie/index.js +43 -0
  522. package/dist/valkyrie/index.js.map +1 -0
  523. package/dist/valkyrie/settings.d.ts +28 -0
  524. package/dist/valkyrie/settings.d.ts.map +1 -0
  525. package/dist/valkyrie/settings.js +84 -0
  526. package/dist/valkyrie/settings.js.map +1 -0
  527. package/dist/vgn/index.d.ts +59 -0
  528. package/dist/vgn/index.d.ts.map +1 -0
  529. package/dist/vgn/index.js +165 -0
  530. package/dist/vgn/index.js.map +1 -0
  531. package/dist/wallhack/index.d.ts +165 -0
  532. package/dist/wallhack/index.d.ts.map +1 -0
  533. package/dist/wallhack/index.js +226 -0
  534. package/dist/wallhack/index.js.map +1 -0
  535. package/dist/wlmouse/index.d.ts +4 -0
  536. package/dist/wlmouse/index.d.ts.map +1 -0
  537. package/dist/wlmouse/index.js +7 -0
  538. package/dist/wlmouse/index.js.map +1 -0
  539. package/dist/wooting/index.d.ts +225 -0
  540. package/dist/wooting/index.d.ts.map +1 -0
  541. package/dist/wooting/index.js +296 -0
  542. package/dist/wooting/index.js.map +1 -0
  543. package/dist/zaunkoenig/index.d.ts +49 -0
  544. package/dist/zaunkoenig/index.d.ts.map +1 -0
  545. package/dist/zaunkoenig/index.js +127 -0
  546. package/dist/zaunkoenig/index.js.map +1 -0
  547. package/package.json +193 -0
@@ -0,0 +1,41 @@
1
+ /** Index probe on empty Bolt slots should fail fast; feature I/O keeps longer. */
2
+ export declare const BOLT_INDEX_PROBE_TIMEOUT_MS = 800;
3
+ /** Short-report HID++ collection (Lightspeed, Bolt receiver registers). */
4
+ export declare function hasHidppShortCollection(device: HIDDevice): boolean;
5
+ /** Long-report HID++ collection (required for Bolt device feature traffic). */
6
+ export declare function hasHidppLongCollection(device: HIDDevice): boolean;
7
+ /**
8
+ * HID++ over Bluetooth, which lives on its own vendor page instead of the
9
+ * 0xFF00 short/long pair. Kept separate from those two so Bolt peer collapsing
10
+ * and report-device selection keep reasoning only about 0xFF00 interfaces.
11
+ *
12
+ * @see HIDPP_BLUETOOTH_USAGE_PAGE
13
+ */
14
+ export declare function hasHidppBluetoothCollection(device: HIDDevice): boolean;
15
+ /**
16
+ * Prefer Bolt's long-report collection when both HID++ endpoints are present
17
+ * so feature traffic lands on the interface that can carry it.
18
+ */
19
+ export declare function boltSupportScore(device: HIDDevice, supported: boolean): number;
20
+ /**
21
+ * Collapse Bolt short+long peers to one sidebar entry (the long collection
22
+ * when both are authorized).
23
+ */
24
+ export declare function collapseBoltPeers(devices: readonly HIDDevice[]): HIDDevice[];
25
+ /**
26
+ * HID++ device-index probe order. Bolt may place the mouse on any of six
27
+ * pairing slots; Lightspeed stays 0x01 then 0xFF; unknown endpoints try self
28
+ * first so wired mice are not addressed as receivers.
29
+ */
30
+ export declare function hidppIndexCandidates(productId: number, knownReceiverIds: ReadonlySet<number>): number[];
31
+ /**
32
+ * Classify a root getFeature probe: only HID++ 2.0 replies mean a mouse is on
33
+ * that index. Bolt receivers answer HID++ 1.0 errors on empty slots / 0xFF.
34
+ */
35
+ export declare function classifyHidpp20Probe(error: unknown, isTimeout: boolean): "hidpp20" | "absent";
36
+ /**
37
+ * Bolt device features answer on the long-report collection (usage 2). The
38
+ * picker may hand us the short collection; use an already-authorized peer.
39
+ */
40
+ export declare function resolveBoltReportDevice(device: HIDDevice, peers: readonly HIDDevice[]): HIDDevice;
41
+ //# sourceMappingURL=bolt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bolt.d.ts","sourceRoot":"","sources":["../../../src/drivers/logitech/bolt.ts"],"names":[],"mappings":"AAeA,kFAAkF;AAClF,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAW/C,2EAA2E;AAC3E,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAGlE;AAED,+EAA+E;AAC/E,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAGjE;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAGtE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,GAAG,MAAM,CAI9E;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,SAAS,SAAS,EAAE,GAAG,SAAS,EAAE,CAY5E;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAC,GACpC,MAAM,EAAE,CAIV;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,GAAG,SAAS,GAAG,QAAQ,CAI7F;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,SAAS,SAAS,EAAE,GAC1B,SAAS,CAgBX"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Logi Bolt transport helpers.
3
+ *
4
+ * Kept out of hidpp.ts so Bolt/MX work can land without rewriting the shared
5
+ * Lightspeed / direct-connect driver paths that other PRs touch often.
6
+ */
7
+ import { BOLT_PAIRING_SLOTS, DEVICE_INDEX_DIRECT, DEVICE_INDEX_RECEIVER, HIDPP_BLUETOOTH_USAGE_PAGE, HIDPP_USAGE_PAGE, isBoltReceiverProduct, } from "@openmouse/protocol/logitech";
8
+ /** Index probe on empty Bolt slots should fail fast; feature I/O keeps longer. */
9
+ export const BOLT_INDEX_PROBE_TIMEOUT_MS = 800;
10
+ /** True when a collection, or any nested child, matches. */
11
+ function anyCollection(collections, matches) {
12
+ return collections.some((collection) => matches(collection) || anyCollection(collection.children, matches));
13
+ }
14
+ /** Short-report HID++ collection (Lightspeed, Bolt receiver registers). */
15
+ export function hasHidppShortCollection(device) {
16
+ return anyCollection(device.collections, (collection) => collection.usagePage === HIDPP_USAGE_PAGE && collection.usage === 0x0001);
17
+ }
18
+ /** Long-report HID++ collection (required for Bolt device feature traffic). */
19
+ export function hasHidppLongCollection(device) {
20
+ return anyCollection(device.collections, (collection) => collection.usagePage === HIDPP_USAGE_PAGE && collection.usage === 0x0002);
21
+ }
22
+ /**
23
+ * HID++ over Bluetooth, which lives on its own vendor page instead of the
24
+ * 0xFF00 short/long pair. Kept separate from those two so Bolt peer collapsing
25
+ * and report-device selection keep reasoning only about 0xFF00 interfaces.
26
+ *
27
+ * @see HIDPP_BLUETOOTH_USAGE_PAGE
28
+ */
29
+ export function hasHidppBluetoothCollection(device) {
30
+ return anyCollection(device.collections, (collection) => collection.usagePage === HIDPP_BLUETOOTH_USAGE_PAGE);
31
+ }
32
+ /**
33
+ * Prefer Bolt's long-report collection when both HID++ endpoints are present
34
+ * so feature traffic lands on the interface that can carry it.
35
+ */
36
+ export function boltSupportScore(device, supported) {
37
+ if (!supported)
38
+ return 0;
39
+ if (isBoltReceiverProduct(device.productId) && hasHidppLongCollection(device))
40
+ return 8;
41
+ return 6;
42
+ }
43
+ /**
44
+ * Collapse Bolt short+long peers to one sidebar entry (the long collection
45
+ * when both are authorized).
46
+ */
47
+ export function collapseBoltPeers(devices) {
48
+ const boltLongPresent = new Set();
49
+ for (const device of devices) {
50
+ if (isBoltReceiverProduct(device.productId) && hasHidppLongCollection(device)) {
51
+ boltLongPresent.add(device.productId);
52
+ }
53
+ }
54
+ return devices.filter((device) => {
55
+ if (!isBoltReceiverProduct(device.productId) || !hasHidppShortCollection(device))
56
+ return true;
57
+ if (hasHidppLongCollection(device))
58
+ return true;
59
+ return !boltLongPresent.has(device.productId);
60
+ });
61
+ }
62
+ /**
63
+ * HID++ device-index probe order. Bolt may place the mouse on any of six
64
+ * pairing slots; Lightspeed stays 0x01 then 0xFF; unknown endpoints try self
65
+ * first so wired mice are not addressed as receivers.
66
+ */
67
+ export function hidppIndexCandidates(productId, knownReceiverIds) {
68
+ if (isBoltReceiverProduct(productId))
69
+ return [...BOLT_PAIRING_SLOTS];
70
+ if (knownReceiverIds.has(productId))
71
+ return [DEVICE_INDEX_RECEIVER, DEVICE_INDEX_DIRECT];
72
+ return [DEVICE_INDEX_DIRECT, DEVICE_INDEX_RECEIVER];
73
+ }
74
+ /**
75
+ * Classify a root getFeature probe: only HID++ 2.0 replies mean a mouse is on
76
+ * that index. Bolt receivers answer HID++ 1.0 errors on empty slots / 0xFF.
77
+ */
78
+ export function classifyHidpp20Probe(error, isTimeout) {
79
+ if (isTimeout)
80
+ return "absent";
81
+ if (error instanceof Error && /HID\+\+ 1\.0/.test(error.message))
82
+ return "absent";
83
+ return "hidpp20";
84
+ }
85
+ /**
86
+ * Bolt device features answer on the long-report collection (usage 2). The
87
+ * picker may hand us the short collection; use an already-authorized peer.
88
+ */
89
+ export function resolveBoltReportDevice(device, peers) {
90
+ if (!isBoltReceiverProduct(device.productId))
91
+ return device;
92
+ if (hasHidppLongCollection(device))
93
+ return device;
94
+ const longPeer = peers.find((candidate) => candidate !== device
95
+ && candidate.vendorId === device.vendorId
96
+ && candidate.productId === device.productId
97
+ && hasHidppLongCollection(candidate));
98
+ if (!longPeer) {
99
+ throw new Error("Logi Bolt needs the HID++ long-report interface (usage 2). "
100
+ + "Reconnect and authorize both Bolt HID++ collections, or pick the usage-2 interface. "
101
+ + "Close Logi Options+ if the browser cannot open the device.");
102
+ }
103
+ return longPeer;
104
+ }
105
+ //# sourceMappingURL=bolt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bolt.js","sourceRoot":"","sources":["../../../src/drivers/logitech/bolt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,525 @@
1
+ import type { MouseLighting, MouseStatus } from "../mouse-types.ts";
2
+ import { type LogitechReprogrammableControl, type LogitechWheelMode } from "@openmouse/protocol/logitech";
3
+ export { collapseBoltPeers, hasHidppBluetoothCollection, hasHidppLongCollection, hasHidppShortCollection, } from "./bolt.ts";
4
+ import { type GamingSurfaceMode, type LightforceSwitchMode } from "./mode-status.ts";
5
+ import { type DpiStagePlan, type LogitechButtonAction, type LogitechButtonBinding, type LogitechMacroStep, parseProfilesInfo, type OnboardProfile } from "./onboard-profiles.ts";
6
+ export type { OnboardProfile };
7
+ /** Raw, read-only evidence used to confirm an onboard-profile format. */
8
+ export interface OnboardProfileVerification {
9
+ info: ReturnType<typeof parseProfilesInfo>;
10
+ infoReply: Uint8Array;
11
+ mode: "Onboard" | "Host" | "Unknown";
12
+ modeValue: number;
13
+ modeReply: Uint8Array;
14
+ currentSector: number;
15
+ currentProfileReply: Uint8Array;
16
+ directory: Uint8Array;
17
+ directoryCrcValid: boolean;
18
+ profiles: OnboardProfile[];
19
+ dpiCapabilities: VerificationCapability | null;
20
+ reportRateCapabilities: VerificationCapability | null;
21
+ }
22
+ export interface VerificationCapability {
23
+ featureId: number;
24
+ featureIndex: number;
25
+ featureVersion: number;
26
+ kind: "legacy" | "extended";
27
+ replies: Array<{
28
+ name: string;
29
+ bytes: Uint8Array;
30
+ }>;
31
+ decodedValues: number[];
32
+ error: string | null;
33
+ }
34
+ /**
35
+ * Master switch for writing DPI slots into profile flash.
36
+ *
37
+ * Enabled after probeProfileWriteSequence passed on a Pro X Superlight 2
38
+ * (format 7): writing a changed byte to sector 0x0002 appeared on read-back,
39
+ * and restoring it appeared too, both with valid checksums. That proves the
40
+ * memoryAddrWrite/memoryWrite/memoryWriteEnd sequence lands rather than being
41
+ * silently dropped. Run the probe again before trusting a new format.
42
+ */
43
+ export declare const PROFILE_DPI_WRITES_ENABLED = true;
44
+ export interface ProfileWriteProbeMismatch {
45
+ offset: number;
46
+ expected: number;
47
+ actual: number;
48
+ }
49
+ export interface ProfileWriteProbeStep {
50
+ name: string;
51
+ ok: boolean;
52
+ checksumValid: boolean;
53
+ mismatches: ProfileWriteProbeMismatch[];
54
+ }
55
+ export interface ProfileWriteProbe {
56
+ sector: number;
57
+ sectorSize: number;
58
+ offset: number;
59
+ originalByte: number;
60
+ probeByte: number;
61
+ steps: ProfileWriteProbeStep[];
62
+ ok: boolean;
63
+ restored: boolean;
64
+ }
65
+ export interface ProfileContentWriteProbeBackup {
66
+ formatId: number;
67
+ sector: number;
68
+ sectorSize: number;
69
+ originalMode: "Onboard" | "Host";
70
+ originalCurrentSector: number;
71
+ directory: Uint8Array;
72
+ profile: Uint8Array;
73
+ dpiOptions: number[];
74
+ reportRates: number[];
75
+ }
76
+ export interface ProfileContentWriteProbeStep {
77
+ setting: "name" | "dpi" | "polling";
78
+ intended: string;
79
+ storedExactly: boolean;
80
+ liveConfirmed: boolean | null;
81
+ restored: boolean;
82
+ error: string | null;
83
+ }
84
+ export interface ProfileContentWriteProbeReport {
85
+ backup: ProfileContentWriteProbeBackup;
86
+ steps: ProfileContentWriteProbeStep[];
87
+ restored: boolean;
88
+ modeRestored: boolean;
89
+ ok: boolean;
90
+ }
91
+ export declare class NotAMouseError extends Error {
92
+ constructor(name: string);
93
+ }
94
+ /** Whether 0x8090 on this model is the power-mode-only variant. */
95
+ export declare function isPowerOnlyModeStatus(modelId: string | null | undefined): boolean;
96
+ /**
97
+ * Whether the mouse exposes lift-off levels it can drive: only extended DPI
98
+ * (0x2202) carries one, and its byte 0 is the "no lift-off control" value, so
99
+ * a legacy-DPI mouse or a sensor reporting 0 advertises no levels.
100
+ */
101
+ export declare function hasLiftOffControl(legacyDpi: boolean, lodByte: number | null): boolean;
102
+ export type LogitechMouseStatus = MouseStatus;
103
+ /**
104
+ * Extended DPI alone does not imply adjustable lift-off distance. Some mice,
105
+ * including the G309, expose 0x2202 but return the protocol's "no LOD control"
106
+ * value. Legacy DPI never carries LOD either.
107
+ */
108
+ export declare function supportsLiveLiftOffControl(legacyDpi: boolean, liftOffDistance: LogitechMouseStatus["liftOffDistance"]): boolean;
109
+ /**
110
+ * Resolves the active physical link from HID++ identity transport IDs. A
111
+ * receiver's USB PID does not match the paired mouse's Wireless transport ID;
112
+ * a mouse connected by cable matches its own USB transport ID. Direct-index
113
+ * probing remains the fallback for older devices that omit identity data.
114
+ */
115
+ export declare function isWiredHidppConnection(productId: number, transportIds: Record<string, string>, directIndex: boolean): boolean;
116
+ export declare class LogitechHidppClient {
117
+ private dpiOptionsCache;
118
+ private dpiFeatureResolved;
119
+ private rateFeatureResolved;
120
+ private reportRateFeatureIndex;
121
+ private supportedPollingRatesCache;
122
+ private livePollingRateHz;
123
+ /** Discovered by resolveDeviceIndex; null until the mouse has answered. */
124
+ private resolvedDeviceIndex;
125
+ /** Last format read from 0x8100, so a refusal can name it. */
126
+ private profileFormatId;
127
+ private wiredConnection;
128
+ /** Lift-off levels this device advertised; the single source of truth for both UI and validation. */
129
+ private lodCapabilities;
130
+ private supportedLods;
131
+ private rgbZone;
132
+ private colorLedZones;
133
+ private rgbLighting;
134
+ private rgbClaimed;
135
+ private rgbOriginalMode;
136
+ private readonly rateChangeWaiters;
137
+ /**
138
+ * Device used for HID++ feature sendReport. On Bolt this is the long-report
139
+ * collection (usage 2); elsewhere it is `device` itself.
140
+ */
141
+ private ioDevice;
142
+ private listeningDevices;
143
+ private readonly onInputReport;
144
+ private readonly waiters;
145
+ readonly device: HIDDevice;
146
+ constructor(device: HIDDevice);
147
+ /**
148
+ * True when the vendor interface belongs to the mouse itself instead of a
149
+ * receiver. Written as a getter because `useDefineForClassFields` runs
150
+ * field initializers before the `device` parameter property is assigned.
151
+ */
152
+ private get isDirectConnect();
153
+ private get isBoltReceiver();
154
+ /** @see hasHidppBluetoothCollection */
155
+ private get isBluetooth();
156
+ /** HID++ device index: a receiver pairing slot, or the mouse itself. */
157
+ private get deviceIndex();
158
+ private get reportDevice();
159
+ /**
160
+ * Finds which HID++ device index this connection answers on.
161
+ *
162
+ * A mouse reached through its receiver answers on a pairing slot (usually
163
+ * 0x01 on Lightspeed; any of 1..6 on Bolt). The same mouse plugged in by
164
+ * cable answers as itself (0xFF). That cannot be read from the descriptors.
165
+ *
166
+ * Only a HID++ 2.0 reply (success or 2.0 error) counts. Bolt receivers answer
167
+ * HID++ 1.0 errors on empty slots and on 0xFF; treating those as "answered"
168
+ * made OpenMouse lock onto the receiver and report "invalid command".
169
+ * A G HUB merge can also push the mouse off slot 0x01, so receivers probe
170
+ * every pairing slot, not just the first.
171
+ *
172
+ * So ask. The root feature query is the cheapest request there is, and the
173
+ * wrong index simply times out.
174
+ */
175
+ private resolveDeviceIndex;
176
+ /** Root getFeature(firmware) distinguishes HID++ 2.0 from receiver noise. */
177
+ private probeHidpp20Root;
178
+ /**
179
+ * Whether the slot currently probed exposes a DPI feature — the same sensor
180
+ * check readStatus uses, so a keyboard paired to a merged receiver is never
181
+ * mistaken for the mouse.
182
+ */
183
+ private hasDpiFeature;
184
+ /**
185
+ * Any Logitech device speaking HID++, not just the receivers we happen to
186
+ * have listed. Whether it is a *mouse* cannot be told from descriptors —
187
+ * keyboards and headsets use the same transport — so that is decided after
188
+ * connecting, by asking for a DPI feature. See readStatus.
189
+ */
190
+ static isSupported(device: HIDDevice): boolean;
191
+ /**
192
+ * Prefer Bolt's long-report collection when both HID++ endpoints are present
193
+ * so feature traffic lands on the interface that can carry it.
194
+ */
195
+ static supportScore(device: HIDDevice): number;
196
+ /** @see collapseBoltPeers */
197
+ static collapseBoltPeers(devices: readonly HIDDevice[]): HIDDevice[];
198
+ /** Known receivers, kept as the fast path for the WebHID picker's filters. */
199
+ static isKnownReceiver(device: HIDDevice): boolean;
200
+ static requestReceiver(): Promise<LogitechHidppClient | null>;
201
+ static reconnectAuthorizedReceiver(): Promise<LogitechHidppClient | null>;
202
+ readStatus(): Promise<LogitechMouseStatus>;
203
+ close(): Promise<void>;
204
+ setLighting(lighting: MouseLighting): Promise<MouseLighting>;
205
+ private readColorLedLighting;
206
+ setPollingRate(pollingRateHz: number): Promise<number>;
207
+ private setExtendedReportRate;
208
+ getDpiOptions(): Promise<number[]>;
209
+ setDpi(dpi: number, dpiY?: number): Promise<number>;
210
+ setLiftOffDistance(liftOffDistance: NonNullable<LogitechMouseStatus["liftOffDistance"]>): Promise<NonNullable<LogitechMouseStatus["liftOffDistance"]>>;
211
+ setAnalogButtonTuning(button: 0 | 1, tuning: {
212
+ actuation: number;
213
+ rapidTrigger: number;
214
+ haptics: number;
215
+ }): Promise<void>;
216
+ /**
217
+ * Switches the mouse between running from profile flash and being driven live
218
+ * by software. This is what G HUB's "Onboard Memory Mode" toggle does.
219
+ */
220
+ setOnboardMode(mode: "Onboard" | "Host"): Promise<"Onboard" | "Host">;
221
+ /** Switches which stored profile the mouse runs. Volatile — no flash write. */
222
+ setCurrentProfile(sector: number): Promise<void>;
223
+ /**
224
+ * Enables or disables a profile slot.
225
+ *
226
+ * WRITES FLASH. The directory sector is read, one flag byte changed, the
227
+ * checksum recomputed and the whole sector written back — one erase/write
228
+ * cycle per call. See docs/logitech-onboard-profiles.md. The write sequence
229
+ * itself has not been verified on hardware; callers should confirm with the
230
+ * user first.
231
+ */
232
+ setProfileEnabled(sector: number, enabled: boolean): Promise<void>;
233
+ /**
234
+ * Restores every onboard profile byte-for-byte to the vendor's captured
235
+ * defaults, then leaves only the first profile enabled and running.
236
+ *
237
+ * WRITES FLASH. Support is deliberately limited to a profile format and
238
+ * sector geometry for which a complete vendor reset was captured. Using a
239
+ * decoded subset here would leave unknown button or lighting settings behind.
240
+ */
241
+ resetAllOnboardProfiles(): Promise<void>;
242
+ /**
243
+ * Sets the bunny-hop timeout on the active profile.
244
+ *
245
+ * WRITES FLASH — one erase/write cycle. Stored as ms / 10, with 0 meaning
246
+ * off; G HUB's range is 100-1000 ms. The encoding is confirmed on hardware,
247
+ * but the write sequence itself is not, so callers should confirm first.
248
+ */
249
+ /**
250
+ * Reads the active profile and the context needed to write it back. Every
251
+ * profile write starts here so the format check, the checksum check and the
252
+ * sector-size fallback cannot drift apart between settings.
253
+ */
254
+ private openActiveProfile;
255
+ /**
256
+ * Writes every changed setting of the active profile in one sector write.
257
+ *
258
+ * Flash is erased a whole sector at a time, so settings that share the sector
259
+ * must be applied together: writing them one at a time would cost an erase
260
+ * cycle each, and each write would be built from a read the previous one had
261
+ * already invalidated.
262
+ */
263
+ writeActiveProfile(values: {
264
+ bunnyHoppingMs?: number | null;
265
+ dpiStages?: DpiStagePlan | null;
266
+ reportRateWirelessHz?: number | null;
267
+ reportRateWiredHz?: number | null;
268
+ name?: string | null;
269
+ buttonAssignments?: Array<{
270
+ layer: "primary" | "g-shift";
271
+ button: number;
272
+ binding: LogitechButtonAction | LogitechButtonBinding;
273
+ }>;
274
+ buttonMacros?: Array<{
275
+ layer: "primary" | "g-shift";
276
+ button: number;
277
+ steps: LogitechMacroStep[];
278
+ }>;
279
+ /** Defaults to the running profile when omitted. */
280
+ sector?: number;
281
+ }): Promise<void>;
282
+ setBunnyHoppingMs(milliseconds: number): Promise<void>;
283
+ setProfileDpiStages(plan: DpiStagePlan): Promise<void>;
284
+ /**
285
+ * memoryAddrWrite declares the destination and length, memoryWrite streams
286
+ * 16 bytes at a time, memoryWriteEnd commits and validates the checksum.
287
+ */
288
+ private writeProfileSector;
289
+ /**
290
+ * Proves the profile write sequence on hardware.
291
+ *
292
+ * A no-op rewrite would be useless: writing a sector's own bytes back reads
293
+ * identical whether the write landed or was silently ignored. So this flips
294
+ * one byte, checks the change actually appears, then restores it and checks
295
+ * the restore appears too. Both halves must pass.
296
+ *
297
+ * The target is an unused sector — disabled, and never the active profile —
298
+ * so nothing the user relies on is at risk, and the original bytes are held
299
+ * in memory for restore if a step fails midway. Cost is two erase cycles of
300
+ * roughly 100,000, on a sector that is not in use.
301
+ */
302
+ probeProfileWriteSequence(): Promise<ProfileWriteProbe>;
303
+ /**
304
+ * Reads and retains everything required to recover a legacy format-2/3/4 profile before
305
+ * the semantic write probe starts. The UI copies this object first.
306
+ */
307
+ prepareProfileContentWriteProbe(): Promise<ProfileContentWriteProbeBackup>;
308
+ /**
309
+ * Applies temporary format-2/3/4 name, DPI and rate values, confirms each sector
310
+ * read-back, confirms live DPI/rate, and restores the original after every
311
+ * step. The caller must copy the backup before invoking this method.
312
+ */
313
+ runProfileContentWriteProbe(backup: ProfileContentWriteProbeBackup): Promise<ProfileContentWriteProbeReport>;
314
+ /**
315
+ * Reads and decodes every onboard profile. Deliberately not part of
316
+ * readStatus: a full pass is ~80 HID++ round trips, far too slow for the
317
+ * refresh loop, so the UI loads it on demand.
318
+ */
319
+ readOnboardProfiles(): Promise<OnboardProfile[]>;
320
+ /**
321
+ * Collects a self-contained, read-only dump for validating any profile
322
+ * format. Unlike readOnboardProfiles, this keeps the full directory and the
323
+ * raw protocol replies so a maintainer can verify geometry and parsing rather
324
+ * than trusting OpenMouse's current assumptions.
325
+ */
326
+ readOnboardProfileVerification(): Promise<OnboardProfileVerification>;
327
+ private verificationFeature;
328
+ private readDpiVerificationCapability;
329
+ private readReportRateVerificationCapability;
330
+ /**
331
+ * memoryRead returns 16 bytes per call and rejects a read running past the
332
+ * end of the sector, so a sector length that is not a multiple of 16 needs its
333
+ * tail fetched from `length - 16`, overlapping the previous chunk.
334
+ */
335
+ private readProfileSector;
336
+ /**
337
+ * Haptic configuration, or null on a device without feature 0x19B0. Only the
338
+ * MX Master 4 is known to carry it.
339
+ */
340
+ private readHapticConfig;
341
+ /**
342
+ * Read-modify-write of the two-byte pair, then verify. Both fields share the
343
+ * write, so a caller changing one has to supply the other exactly as the
344
+ * device reports it, and bits 2-7 of the flag byte ride through untouched.
345
+ */
346
+ private writeHapticConfig;
347
+ /**
348
+ * Scroll-wheel state across 0x2111, 0x2121 and 0x2150. Every field stays
349
+ * absent rather than guessed when its feature is missing, so a mouse
350
+ * without a thumb wheel does not get a control that can only fail.
351
+ */
352
+ private readWheelState;
353
+ private readThumbWheelState;
354
+ /** 0x2111 carries all three bytes, so each setter changes only its field. */
355
+ private writeRatchetControl;
356
+ setWheelMode(mode: LogitechWheelMode): Promise<LogitechWheelMode>;
357
+ /** Passing null disables SmartShift; the ratchet mode is preserved either way. */
358
+ setSmartShiftThreshold(threshold: number | null): Promise<number>;
359
+ /**
360
+ * Flips one bit of the 0x2121 mode byte. Diversion is read and carried
361
+ * through: setting it routes the wheel to HID++ and stops it scrolling, and
362
+ * clearing it would take that away from whatever set it.
363
+ */
364
+ private writeWheelModeBit;
365
+ setHiResScroll(enabled: boolean): Promise<boolean>;
366
+ setInvertScroll(inverted: boolean): Promise<boolean>;
367
+ /**
368
+ * Inverts the thumb wheel. Logi Options+ sets the diversion bit to implement
369
+ * horizontal scrolling, so it is read and preserved rather than rewritten.
370
+ */
371
+ setThumbWheelInverted(inverted: boolean): Promise<boolean>;
372
+ /** The editable name, or null on a device without feature 0x0007. */
373
+ private readFriendlyName;
374
+ /**
375
+ * Renames the device, then reads the name back. The read-back is not
376
+ * ceremony: firmware that acknowledges a write and quietly keeps its old
377
+ * value would otherwise look like a successful rename.
378
+ */
379
+ setFriendlyName(name: string): Promise<string>;
380
+ /**
381
+ * Easy-Switch slots, or null without feature 0x1815. Slot indices are
382
+ * zero-based here as they are on the wire; the button under the mouse counts
383
+ * from one, so anything user-facing has to add one.
384
+ */
385
+ private readHostState;
386
+ /**
387
+ * Asks the mouse to move to another Easy-Switch slot.
388
+ *
389
+ * Named for what it can prove. A successful switch disconnects this host, so
390
+ * there is no state left to read back and no way to confirm the mouse
391
+ * arrived — disconnection IS the expected success path, not a failure.
392
+ * Resolving means the command reached the device: either it acknowledged, or
393
+ * it left before an acknowledgement could be observed and the report was
394
+ * accepted by the transport.
395
+ *
396
+ * An empty slot is refused outright. Switching there leaves the mouse
397
+ * unreachable until someone presses the button on its underside.
398
+ */
399
+ requestHostSwitch(slot: number): Promise<void>;
400
+ /**
401
+ * Reads every reprogrammable control, what it currently does, and where it
402
+ * may legally be pointed.
403
+ *
404
+ * Two round-trips per control, which is why this is not part of readStatus:
405
+ * on an MX Master 4 that is eighteen more exchanges, enough on a wireless
406
+ * link to start timing other reads out. Call it on connect and after a
407
+ * write, not on a poll.
408
+ *
409
+ * The control table itself never changes for a given device, so it is read
410
+ * once per connection; only the reporting is re-read.
411
+ */
412
+ readButtons(): Promise<LogitechReprogrammableControl[]>;
413
+ /**
414
+ * Points one button at another control's action.
415
+ *
416
+ * The device is asked what is legal before anything is written, and the
417
+ * result is read back afterwards — firmware that acknowledges a remap and
418
+ * keeps its old mapping would otherwise look like a success.
419
+ */
420
+ setButtonMapping(controlId: number, targetControlId: number): Promise<LogitechReprogrammableControl[]>;
421
+ /**
422
+ * Hands every diverted button back to the hardware.
423
+ *
424
+ * A diverted button sends HID++ notifications instead of acting, which is
425
+ * how a vendor application implements behaviours of its own. Logi Options+
426
+ * uses the temporary flag and the mouse clears that itself once Options+
427
+ * stops — but the persistent flag survives, so a button left that way stays
428
+ * dead until something clears it. That something has to exist somewhere.
429
+ */
430
+ clearButtonDiversion(): Promise<LogitechReprogrammableControl[]>;
431
+ /** Sets haptic strength, leaving the flag byte as the device reports it. */
432
+ setHapticIntensity(intensity: number): Promise<number>;
433
+ setHapticEnabled(enabled: boolean): Promise<boolean>;
434
+ setHapticBatterySaving(enabled: boolean): Promise<boolean>;
435
+ /**
436
+ * Fires the motor once at whatever strength is set. Nothing persists, so
437
+ * this is safe to use as feedback. The reply reports whether the motor was
438
+ * already running, which says nothing about the effect itself.
439
+ */
440
+ playHapticEffect(effect?: number): Promise<void>;
441
+ setGamingSurfaceMode(mode: GamingSurfaceMode): Promise<GamingSurfaceMode>;
442
+ setLightforceSwitchMode(mode: LightforceSwitchMode): Promise<LightforceSwitchMode>;
443
+ /**
444
+ * Read-modify-write of modeStatus1, then verify. Both fields share the byte,
445
+ * so passing them together writes once instead of twice; the change mask
446
+ * stops the firmware touching bits neither field names.
447
+ * Reading first keeps this correct if a future field spans bits we do not know about.
448
+ */
449
+ setModeStatus(values: {
450
+ gamingSurface?: GamingSurfaceMode | null;
451
+ lightforce?: LightforceSwitchMode | null;
452
+ }): Promise<void>;
453
+ /** Byte 4 of getModeStatus, carrying both the surface and LightForce fields. */
454
+ private readModeStatus;
455
+ private open;
456
+ private bindBoltIoDevice;
457
+ /** Prefer extended DPI (0x2202); fall back to legacy Adjustable DPI (0x2201). */
458
+ private resolveDpiFeature;
459
+ /** Prefer extended report rate (0x8061); fall back to legacy Report Rate (0x8060). */
460
+ private resolveReportRateFeature;
461
+ private readLegacyDpi;
462
+ private readLegacyDpiList;
463
+ private setLegacyDpi;
464
+ private readLegacyReportRates;
465
+ private getSupportedPollingRateOptions;
466
+ private readLegacyReportRate;
467
+ private setLegacyReportRate;
468
+ /**
469
+ * Values that cannot change while a connection is open. Easy-Switch is the
470
+ * clearest case: the slot count is fixed and the current slot changing IS
471
+ * the connection ending, because that is what switching host does. The
472
+ * friendly name only moves when something renames it, and this client drops
473
+ * the entry after its own write.
474
+ *
475
+ * Re-reading these was costing six round-trips of radio every refresh, on
476
+ * top of a feature lookup per read. On a wireless mouse that is enough for
477
+ * some reads to time out, which surfaces as controls vanishing and coming
478
+ * back a few seconds later.
479
+ */
480
+ private hostStateCache;
481
+ private controlInfoCache;
482
+ private friendlyNameCache;
483
+ private wheelCapabilityCache;
484
+ private getFeature;
485
+ private readName;
486
+ /**
487
+ * 0x1004 UNIFIED_BATTERY getStatus: [stateOfCharge, batteryLevel,
488
+ * chargingStatus, externalPower].
489
+ *
490
+ * The charging enum here is NOT the one 0x1000 uses, which is what this
491
+ * previously decoded: on 0x1004, 2 means charging slowly and 4 means a
492
+ * charging fault, where on 0x1000 those are "almost full" and "charging
493
+ * slowly". A slow charge was therefore reported as almost full.
494
+ */
495
+ private readBattery;
496
+ /**
497
+ * 0x1000 BATTERY_LEVEL_STATUS getBatteryLevelStatus:
498
+ * [dischargeLevel, nextLevel, batteryStatus].
499
+ *
500
+ * Older mice expose only this. Without it they reported no battery at all,
501
+ * because the driver probed 0x1004, 0x1001 and 0x1f20 and nothing else.
502
+ */
503
+ private readBatteryLevelStatus;
504
+ private readBatteryVoltage;
505
+ private readAdcMeasurement;
506
+ private estimateBatteryPercent;
507
+ private readDpi;
508
+ private readAnalogButtonTuning;
509
+ private readDpiCapabilities;
510
+ private readRgbLighting;
511
+ private readPerLedLighting;
512
+ private readDpiConfiguration;
513
+ private readSupportedPollingRates;
514
+ private readPollingRate;
515
+ private waitForRateChange;
516
+ private readProfileState;
517
+ private readIdentity;
518
+ private ensureHostControl;
519
+ private readFirmware;
520
+ private request;
521
+ private requestWithOptions;
522
+ private requestLong;
523
+ private waitForResponse;
524
+ }
525
+ //# sourceMappingURL=hidpp.d.ts.map