@agentdeck/bridge 0.1.0 → 0.2.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 (380) hide show
  1. package/LICENSE +21 -0
  2. package/dist/adapters/claude-code.d.ts +11 -27
  3. package/dist/adapters/claude-code.d.ts.map +1 -1
  4. package/dist/adapters/claude-code.js +29 -123
  5. package/dist/adapters/claude-code.js.map +1 -1
  6. package/dist/adapters/codex-cli.d.ts +21 -0
  7. package/dist/adapters/codex-cli.d.ts.map +1 -0
  8. package/dist/adapters/codex-cli.js +53 -0
  9. package/dist/adapters/codex-cli.js.map +1 -0
  10. package/dist/adapters/index.d.ts +4 -0
  11. package/dist/adapters/index.d.ts.map +1 -1
  12. package/dist/adapters/index.js +13 -0
  13. package/dist/adapters/index.js.map +1 -1
  14. package/dist/adapters/monitor.d.ts +34 -0
  15. package/dist/adapters/monitor.d.ts.map +1 -0
  16. package/dist/adapters/monitor.js +86 -0
  17. package/dist/adapters/monitor.js.map +1 -0
  18. package/dist/adapters/openclaw.d.ts +36 -2
  19. package/dist/adapters/openclaw.d.ts.map +1 -1
  20. package/dist/adapters/openclaw.js +329 -59
  21. package/dist/adapters/openclaw.js.map +1 -1
  22. package/dist/adapters/opencode-adapter.d.ts +48 -0
  23. package/dist/adapters/opencode-adapter.d.ts.map +1 -0
  24. package/dist/adapters/opencode-adapter.js +345 -0
  25. package/dist/adapters/opencode-adapter.js.map +1 -0
  26. package/dist/adapters/pty-adapter.d.ts +56 -0
  27. package/dist/adapters/pty-adapter.d.ts.map +1 -0
  28. package/dist/adapters/pty-adapter.js +143 -0
  29. package/dist/adapters/pty-adapter.js.map +1 -0
  30. package/dist/adb-reverse.d.ts +25 -0
  31. package/dist/adb-reverse.d.ts.map +1 -0
  32. package/dist/adb-reverse.js +129 -0
  33. package/dist/adb-reverse.js.map +1 -0
  34. package/dist/antigravity-local.d.ts +7 -0
  35. package/dist/antigravity-local.d.ts.map +1 -0
  36. package/dist/antigravity-local.js +153 -0
  37. package/dist/antigravity-local.js.map +1 -0
  38. package/dist/apme/adapters/claude-hook.d.ts +15 -0
  39. package/dist/apme/adapters/claude-hook.d.ts.map +1 -0
  40. package/dist/apme/adapters/claude-hook.js +85 -0
  41. package/dist/apme/adapters/claude-hook.js.map +1 -0
  42. package/dist/apme/adapters/claude-pty.d.ts +28 -0
  43. package/dist/apme/adapters/claude-pty.d.ts.map +1 -0
  44. package/dist/apme/adapters/claude-pty.js +88 -0
  45. package/dist/apme/adapters/claude-pty.js.map +1 -0
  46. package/dist/apme/adapters/timeline.d.ts +16 -0
  47. package/dist/apme/adapters/timeline.d.ts.map +1 -0
  48. package/dist/apme/adapters/timeline.js +66 -0
  49. package/dist/apme/adapters/timeline.js.map +1 -0
  50. package/dist/apme/classifier.d.ts +53 -0
  51. package/dist/apme/classifier.d.ts.map +1 -0
  52. package/dist/apme/classifier.js +266 -0
  53. package/dist/apme/classifier.js.map +1 -0
  54. package/dist/apme/claude-transcript-reader.d.ts +38 -0
  55. package/dist/apme/claude-transcript-reader.d.ts.map +1 -0
  56. package/dist/apme/claude-transcript-reader.js +127 -0
  57. package/dist/apme/claude-transcript-reader.js.map +1 -0
  58. package/dist/apme/collector.d.ts +108 -0
  59. package/dist/apme/collector.d.ts.map +1 -0
  60. package/dist/apme/collector.js +659 -0
  61. package/dist/apme/collector.js.map +1 -0
  62. package/dist/apme/dashboard-html.d.ts +9 -0
  63. package/dist/apme/dashboard-html.d.ts.map +1 -0
  64. package/dist/apme/dashboard-html.js +416 -0
  65. package/dist/apme/dashboard-html.js.map +1 -0
  66. package/dist/apme/http.d.ts +19 -0
  67. package/dist/apme/http.d.ts.map +1 -0
  68. package/dist/apme/http.js +210 -0
  69. package/dist/apme/http.js.map +1 -0
  70. package/dist/apme/hw-sampler.d.ts +30 -0
  71. package/dist/apme/hw-sampler.d.ts.map +1 -0
  72. package/dist/apme/hw-sampler.js +106 -0
  73. package/dist/apme/hw-sampler.js.map +1 -0
  74. package/dist/apme/index.d.ts +43 -0
  75. package/dist/apme/index.d.ts.map +1 -0
  76. package/dist/apme/index.js +75 -0
  77. package/dist/apme/index.js.map +1 -0
  78. package/dist/apme/outcome.d.ts +48 -0
  79. package/dist/apme/outcome.d.ts.map +1 -0
  80. package/dist/apme/outcome.js +232 -0
  81. package/dist/apme/outcome.js.map +1 -0
  82. package/dist/apme/recommend.d.ts +32 -0
  83. package/dist/apme/recommend.d.ts.map +1 -0
  84. package/dist/apme/recommend.js +41 -0
  85. package/dist/apme/recommend.js.map +1 -0
  86. package/dist/apme/runner.d.ts +94 -0
  87. package/dist/apme/runner.d.ts.map +1 -0
  88. package/dist/apme/runner.js +812 -0
  89. package/dist/apme/runner.js.map +1 -0
  90. package/dist/apme/settings.d.ts +65 -0
  91. package/dist/apme/settings.d.ts.map +1 -0
  92. package/dist/apme/settings.js +97 -0
  93. package/dist/apme/settings.js.map +1 -0
  94. package/dist/apme/store.d.ts +99 -0
  95. package/dist/apme/store.d.ts.map +1 -0
  96. package/dist/apme/store.js +911 -0
  97. package/dist/apme/store.js.map +1 -0
  98. package/dist/apme/tuner.d.ts +64 -0
  99. package/dist/apme/tuner.d.ts.map +1 -0
  100. package/dist/apme/tuner.js +297 -0
  101. package/dist/apme/tuner.js.map +1 -0
  102. package/dist/apme/types.d.ts +11 -0
  103. package/dist/apme/types.d.ts.map +1 -0
  104. package/dist/apme/types.js +10 -0
  105. package/dist/apme/types.js.map +1 -0
  106. package/dist/auth.d.ts +1 -1
  107. package/dist/auth.d.ts.map +1 -1
  108. package/dist/auth.js +15 -5
  109. package/dist/auth.js.map +1 -1
  110. package/dist/bridge-core.d.ts +162 -0
  111. package/dist/bridge-core.d.ts.map +1 -0
  112. package/dist/bridge-core.js +627 -0
  113. package/dist/bridge-core.js.map +1 -0
  114. package/dist/check-deps.d.ts +3 -1
  115. package/dist/check-deps.d.ts.map +1 -1
  116. package/dist/check-deps.js +34 -13
  117. package/dist/check-deps.js.map +1 -1
  118. package/dist/cli.d.ts +3 -0
  119. package/dist/cli.d.ts.map +1 -0
  120. package/dist/cli.js +1235 -0
  121. package/dist/cli.js.map +1 -0
  122. package/dist/codex-auth.d.ts +10 -0
  123. package/dist/codex-auth.d.ts.map +1 -0
  124. package/dist/codex-auth.js +63 -0
  125. package/dist/codex-auth.js.map +1 -0
  126. package/dist/codex-output-parser.d.ts +21 -0
  127. package/dist/codex-output-parser.d.ts.map +1 -0
  128. package/dist/codex-output-parser.js +253 -0
  129. package/dist/codex-output-parser.js.map +1 -0
  130. package/dist/d200h/hid-protocol.d.ts +62 -0
  131. package/dist/d200h/hid-protocol.d.ts.map +1 -0
  132. package/dist/d200h/hid-protocol.js +124 -0
  133. package/dist/d200h/hid-protocol.js.map +1 -0
  134. package/dist/d200h/image-renderer.d.ts +36 -0
  135. package/dist/d200h/image-renderer.d.ts.map +1 -0
  136. package/dist/d200h/image-renderer.js +487 -0
  137. package/dist/d200h/image-renderer.js.map +1 -0
  138. package/dist/daemon-server.d.ts +19 -0
  139. package/dist/daemon-server.d.ts.map +1 -0
  140. package/dist/daemon-server.js +1168 -0
  141. package/dist/daemon-server.js.map +1 -0
  142. package/dist/daemon-ws-client.d.ts +82 -0
  143. package/dist/daemon-ws-client.d.ts.map +1 -0
  144. package/dist/daemon-ws-client.js +179 -0
  145. package/dist/daemon-ws-client.js.map +1 -0
  146. package/dist/daemon.d.ts +10 -0
  147. package/dist/daemon.d.ts.map +1 -0
  148. package/dist/daemon.js +56 -0
  149. package/dist/daemon.js.map +1 -0
  150. package/dist/display-monitor.d.ts +25 -0
  151. package/dist/display-monitor.d.ts.map +1 -0
  152. package/dist/display-monitor.js +143 -0
  153. package/dist/display-monitor.js.map +1 -0
  154. package/dist/esp32-serial.d.ts +112 -0
  155. package/dist/esp32-serial.d.ts.map +1 -0
  156. package/dist/esp32-serial.js +502 -0
  157. package/dist/esp32-serial.js.map +1 -0
  158. package/dist/gateway-probe.d.ts +12 -0
  159. package/dist/gateway-probe.d.ts.map +1 -0
  160. package/dist/gateway-probe.js +39 -0
  161. package/dist/gateway-probe.js.map +1 -0
  162. package/dist/hook-server.d.ts +29 -0
  163. package/dist/hook-server.d.ts.map +1 -1
  164. package/dist/hook-server.js +366 -8
  165. package/dist/hook-server.js.map +1 -1
  166. package/dist/index.d.ts +20 -2
  167. package/dist/index.d.ts.map +1 -1
  168. package/dist/index.js +1305 -562
  169. package/dist/index.js.map +1 -1
  170. package/dist/log-stream.d.ts +26 -0
  171. package/dist/log-stream.d.ts.map +1 -0
  172. package/dist/log-stream.js +111 -0
  173. package/dist/log-stream.js.map +1 -0
  174. package/dist/logger.d.ts +9 -2
  175. package/dist/logger.d.ts.map +1 -1
  176. package/dist/logger.js +36 -5
  177. package/dist/logger.js.map +1 -1
  178. package/dist/mdns.d.ts +15 -1
  179. package/dist/mdns.d.ts.map +1 -1
  180. package/dist/mdns.js +143 -28
  181. package/dist/mdns.js.map +1 -1
  182. package/dist/mlx-probe.d.ts +14 -0
  183. package/dist/mlx-probe.d.ts.map +1 -0
  184. package/dist/mlx-probe.js +44 -0
  185. package/dist/mlx-probe.js.map +1 -0
  186. package/dist/model-catalog.d.ts +5 -3
  187. package/dist/model-catalog.d.ts.map +1 -1
  188. package/dist/model-catalog.js +45 -29
  189. package/dist/model-catalog.js.map +1 -1
  190. package/dist/modules/adb-module.d.ts +14 -0
  191. package/dist/modules/adb-module.d.ts.map +1 -0
  192. package/dist/modules/adb-module.js +36 -0
  193. package/dist/modules/adb-module.js.map +1 -0
  194. package/dist/modules/d200h-module.d.ts +43 -0
  195. package/dist/modules/d200h-module.d.ts.map +1 -0
  196. package/dist/modules/d200h-module.js +360 -0
  197. package/dist/modules/d200h-module.js.map +1 -0
  198. package/dist/modules/d200h-renderer.d.ts +7 -0
  199. package/dist/modules/d200h-renderer.d.ts.map +1 -0
  200. package/dist/modules/d200h-renderer.js +321 -0
  201. package/dist/modules/d200h-renderer.js.map +1 -0
  202. package/dist/modules/index.d.ts +23 -0
  203. package/dist/modules/index.d.ts.map +1 -0
  204. package/dist/modules/index.js +65 -0
  205. package/dist/modules/index.js.map +1 -0
  206. package/dist/modules/mdns-module.d.ts +12 -0
  207. package/dist/modules/mdns-module.d.ts.map +1 -0
  208. package/dist/modules/mdns-module.js +21 -0
  209. package/dist/modules/mdns-module.js.map +1 -0
  210. package/dist/modules/pixoo-module.d.ts +8 -0
  211. package/dist/modules/pixoo-module.d.ts.map +1 -0
  212. package/dist/modules/pixoo-module.js +24 -0
  213. package/dist/modules/pixoo-module.js.map +1 -0
  214. package/dist/modules/serial-module.d.ts +18 -0
  215. package/dist/modules/serial-module.d.ts.map +1 -0
  216. package/dist/modules/serial-module.js +47 -0
  217. package/dist/modules/serial-module.js.map +1 -0
  218. package/dist/modules/types.d.ts +39 -0
  219. package/dist/modules/types.d.ts.map +1 -0
  220. package/dist/modules/types.js +2 -0
  221. package/dist/modules/types.js.map +1 -0
  222. package/dist/ollama-probe.d.ts +13 -0
  223. package/dist/ollama-probe.d.ts.map +1 -0
  224. package/dist/ollama-probe.js +46 -0
  225. package/dist/ollama-probe.js.map +1 -0
  226. package/dist/opencode-client.d.ts +126 -0
  227. package/dist/opencode-client.d.ts.map +1 -0
  228. package/dist/opencode-client.js +181 -0
  229. package/dist/opencode-client.js.map +1 -0
  230. package/dist/output-parser.d.ts +3 -0
  231. package/dist/output-parser.d.ts.map +1 -1
  232. package/dist/output-parser.js +29 -3
  233. package/dist/output-parser.js.map +1 -1
  234. package/dist/passive-observer.d.ts +38 -0
  235. package/dist/passive-observer.d.ts.map +1 -0
  236. package/dist/passive-observer.js +632 -0
  237. package/dist/passive-observer.js.map +1 -0
  238. package/dist/pixoo/pixoo-bridge.d.ts +50 -0
  239. package/dist/pixoo/pixoo-bridge.d.ts.map +1 -0
  240. package/dist/pixoo/pixoo-bridge.js +280 -0
  241. package/dist/pixoo/pixoo-bridge.js.map +1 -0
  242. package/dist/pixoo/pixoo-camera.d.ts +80 -0
  243. package/dist/pixoo/pixoo-camera.d.ts.map +1 -0
  244. package/dist/pixoo/pixoo-camera.js +271 -0
  245. package/dist/pixoo/pixoo-camera.js.map +1 -0
  246. package/dist/pixoo/pixoo-client.d.ts +67 -0
  247. package/dist/pixoo/pixoo-client.d.ts.map +1 -0
  248. package/dist/pixoo/pixoo-client.js +335 -0
  249. package/dist/pixoo/pixoo-client.js.map +1 -0
  250. package/dist/pixoo/pixoo-font.d.ts +24 -0
  251. package/dist/pixoo/pixoo-font.d.ts.map +1 -0
  252. package/dist/pixoo/pixoo-font.js +121 -0
  253. package/dist/pixoo/pixoo-font.js.map +1 -0
  254. package/dist/pixoo/pixoo-renderer.d.ts +32 -0
  255. package/dist/pixoo/pixoo-renderer.d.ts.map +1 -0
  256. package/dist/pixoo/pixoo-renderer.js +696 -0
  257. package/dist/pixoo/pixoo-renderer.js.map +1 -0
  258. package/dist/pixoo/pixoo-settings.d.ts +10 -0
  259. package/dist/pixoo/pixoo-settings.d.ts.map +1 -0
  260. package/dist/pixoo/pixoo-settings.js +47 -0
  261. package/dist/pixoo/pixoo-settings.js.map +1 -0
  262. package/dist/pixoo/pixoo-sprites.d.ts +187 -0
  263. package/dist/pixoo/pixoo-sprites.d.ts.map +1 -0
  264. package/dist/pixoo/pixoo-sprites.js +926 -0
  265. package/dist/pixoo/pixoo-sprites.js.map +1 -0
  266. package/dist/pty-manager.d.ts +1 -1
  267. package/dist/pty-manager.d.ts.map +1 -1
  268. package/dist/pty-manager.js +36 -15
  269. package/dist/pty-manager.js.map +1 -1
  270. package/dist/session-aggregator.d.ts +41 -0
  271. package/dist/session-aggregator.d.ts.map +1 -0
  272. package/dist/session-aggregator.js +76 -0
  273. package/dist/session-aggregator.js.map +1 -0
  274. package/dist/session-focus-relay.d.ts +35 -0
  275. package/dist/session-focus-relay.d.ts.map +1 -0
  276. package/dist/session-focus-relay.js +127 -0
  277. package/dist/session-focus-relay.js.map +1 -0
  278. package/dist/session-registry.d.ts +88 -1
  279. package/dist/session-registry.d.ts.map +1 -1
  280. package/dist/session-registry.js +222 -15
  281. package/dist/session-registry.js.map +1 -1
  282. package/dist/session-timeline-relay.d.ts +27 -0
  283. package/dist/session-timeline-relay.d.ts.map +1 -0
  284. package/dist/session-timeline-relay.js +124 -0
  285. package/dist/session-timeline-relay.js.map +1 -0
  286. package/dist/state-machine.d.ts +1 -0
  287. package/dist/state-machine.d.ts.map +1 -1
  288. package/dist/state-machine.js +14 -0
  289. package/dist/state-machine.js.map +1 -1
  290. package/dist/terminal-status.d.ts +28 -0
  291. package/dist/terminal-status.d.ts.map +1 -0
  292. package/dist/terminal-status.js +152 -0
  293. package/dist/terminal-status.js.map +1 -0
  294. package/dist/timeline-store.d.ts +22 -0
  295. package/dist/timeline-store.d.ts.map +1 -0
  296. package/dist/timeline-store.js +79 -0
  297. package/dist/timeline-store.js.map +1 -0
  298. package/dist/timeline-summarizer.d.ts +14 -0
  299. package/dist/timeline-summarizer.d.ts.map +1 -0
  300. package/dist/timeline-summarizer.js +154 -0
  301. package/dist/timeline-summarizer.js.map +1 -0
  302. package/dist/tts.d.ts +25 -0
  303. package/dist/tts.d.ts.map +1 -0
  304. package/dist/tts.js +99 -0
  305. package/dist/tts.js.map +1 -0
  306. package/dist/tui/ansi.d.ts +92 -0
  307. package/dist/tui/ansi.d.ts.map +1 -0
  308. package/dist/tui/ansi.js +181 -0
  309. package/dist/tui/ansi.js.map +1 -0
  310. package/dist/tui/dashboard.d.ts +35 -0
  311. package/dist/tui/dashboard.d.ts.map +1 -0
  312. package/dist/tui/dashboard.js +436 -0
  313. package/dist/tui/dashboard.js.map +1 -0
  314. package/dist/tui/gauge.d.ts +15 -0
  315. package/dist/tui/gauge.d.ts.map +1 -0
  316. package/dist/tui/gauge.js +82 -0
  317. package/dist/tui/gauge.js.map +1 -0
  318. package/dist/tui/renderer.d.ts +15 -0
  319. package/dist/tui/renderer.d.ts.map +1 -0
  320. package/dist/tui/renderer.js +758 -0
  321. package/dist/tui/renderer.js.map +1 -0
  322. package/dist/tui/screen.d.ts +27 -0
  323. package/dist/tui/screen.d.ts.map +1 -0
  324. package/dist/tui/screen.js +109 -0
  325. package/dist/tui/screen.js.map +1 -0
  326. package/dist/tui/terrarium.d.ts +96 -0
  327. package/dist/tui/terrarium.d.ts.map +1 -0
  328. package/dist/tui/terrarium.js +912 -0
  329. package/dist/tui/terrarium.js.map +1 -0
  330. package/dist/types.d.ts +4 -2
  331. package/dist/types.d.ts.map +1 -1
  332. package/dist/types.js +3 -2
  333. package/dist/types.js.map +1 -1
  334. package/dist/usage-api.d.ts +9 -2
  335. package/dist/usage-api.d.ts.map +1 -1
  336. package/dist/usage-api.js +224 -42
  337. package/dist/usage-api.js.map +1 -1
  338. package/dist/usage-event.d.ts +12 -0
  339. package/dist/usage-event.d.ts.map +1 -0
  340. package/dist/usage-event.js +78 -0
  341. package/dist/usage-event.js.map +1 -0
  342. package/dist/usage-tracker.d.ts +4 -0
  343. package/dist/usage-tracker.d.ts.map +1 -1
  344. package/dist/usage-tracker.js +17 -0
  345. package/dist/usage-tracker.js.map +1 -1
  346. package/dist/utility-proxy.d.ts +30 -0
  347. package/dist/utility-proxy.d.ts.map +1 -0
  348. package/dist/utility-proxy.js +217 -0
  349. package/dist/utility-proxy.js.map +1 -0
  350. package/dist/utils/project-name.d.ts +22 -0
  351. package/dist/utils/project-name.d.ts.map +1 -0
  352. package/dist/utils/project-name.js +72 -0
  353. package/dist/utils/project-name.js.map +1 -0
  354. package/dist/version-check.d.ts +26 -0
  355. package/dist/version-check.d.ts.map +1 -0
  356. package/dist/version-check.js +225 -0
  357. package/dist/version-check.js.map +1 -0
  358. package/dist/voice-assistant.d.ts +63 -0
  359. package/dist/voice-assistant.d.ts.map +1 -0
  360. package/dist/voice-assistant.js +406 -0
  361. package/dist/voice-assistant.js.map +1 -0
  362. package/dist/voice.d.ts +2 -0
  363. package/dist/voice.d.ts.map +1 -1
  364. package/dist/voice.js +26 -1
  365. package/dist/voice.js.map +1 -1
  366. package/dist/wake-word.d.ts +35 -0
  367. package/dist/wake-word.d.ts.map +1 -0
  368. package/dist/wake-word.js +225 -0
  369. package/dist/wake-word.js.map +1 -0
  370. package/dist/whisper-server-manager.d.ts +1 -1
  371. package/dist/whisper-server-manager.js +1 -1
  372. package/dist/wifi-config.d.ts +24 -0
  373. package/dist/wifi-config.d.ts.map +1 -0
  374. package/dist/wifi-config.js +84 -0
  375. package/dist/wifi-config.js.map +1 -0
  376. package/dist/ws-server.d.ts +12 -0
  377. package/dist/ws-server.d.ts.map +1 -1
  378. package/dist/ws-server.js +81 -3
  379. package/dist/ws-server.js.map +1 -1
  380. package/package.json +22 -13
package/dist/mdns.js CHANGED
@@ -1,44 +1,159 @@
1
1
  import { Bonjour } from 'bonjour-service';
2
- import { debug } from './logger.js';
2
+ import { networkInterfaces } from 'os';
3
+ import { debug, log } from './logger.js';
3
4
  let instance = null;
5
+ /** Find the first routable (non-link-local, non-loopback) IPv4 address. */
6
+ function getLanIp() {
7
+ const nets = networkInterfaces();
8
+ for (const addrs of Object.values(nets)) {
9
+ if (!addrs)
10
+ continue;
11
+ for (const a of addrs) {
12
+ if (a.family === 'IPv4' && !a.internal && !a.address.startsWith('169.254.')) {
13
+ return a.address;
14
+ }
15
+ }
16
+ }
17
+ return undefined;
18
+ }
19
+ const MDNS_RECOVERY_INTERVAL = 5_000; // 5s — tightens WiFi-change discovery gap (was 30s)
20
+ /**
21
+ * Called from uncaughtException handler when mDNS socket fails.
22
+ * Nulls the instance so the recovery timer knows to re-publish.
23
+ */
24
+ export function invalidateMdnsInstance() {
25
+ if (instance) {
26
+ try {
27
+ instance.destroy();
28
+ }
29
+ catch { /* ignore */ }
30
+ instance = null;
31
+ debug('mDNS', 'Instance invalidated — recovery timer will re-publish');
32
+ }
33
+ }
34
+ /** Trigger function, set by advertiseBridge() for immediate wake recovery. */
35
+ let _triggerRecovery = null;
36
+ /**
37
+ * Force immediate mDNS re-publish (wake recovery).
38
+ * Bypasses the 30s recovery timer interval.
39
+ */
40
+ export function triggerMdnsRecovery() {
41
+ _triggerRecovery?.();
42
+ }
4
43
  /**
5
44
  * Advertise this bridge session via mDNS/Bonjour so Android/LAN clients
6
45
  * can discover it automatically.
7
46
  *
47
+ * Includes automatic recovery: if the underlying mDNS socket fails (e.g. after
48
+ * sleep/wake or WiFi reconnect), a periodic check detects the broken state and
49
+ * re-publishes the service.
50
+ *
8
51
  * @returns cleanup function to call on shutdown
9
52
  */
10
- export function advertiseBridge(port, projectName, agentType) {
11
- try {
12
- instance = new Bonjour();
13
- const service = instance.publish({
14
- name: `AgentDeck-${projectName}`,
15
- type: 'agentdeck',
16
- port,
17
- txt: {
53
+ export function advertiseBridge(port, projectName, agentType, token) {
54
+ let stopped = false;
55
+ let recoveryTimer = null;
56
+ let currentCleanup = null;
57
+ function publish() {
58
+ try {
59
+ // Tear down previous instance if any
60
+ if (instance) {
61
+ try {
62
+ instance.unpublishAll();
63
+ instance.destroy();
64
+ }
65
+ catch { /* ignore cleanup errors */ }
66
+ instance = null;
67
+ }
68
+ instance = new Bonjour();
69
+ const lanIp = getLanIp();
70
+ const txt = {
18
71
  project: projectName,
19
72
  agent: agentType,
20
73
  v: '1',
21
74
  port: String(port),
22
- },
23
- });
24
- debug('mDNS', `Published _agentdeck._tcp on port ${port} (project: ${projectName})`);
25
- return () => {
26
- try {
27
- service.stop?.();
28
- instance?.unpublishAll();
29
- instance?.destroy();
30
- instance = null;
31
- debug('mDNS', 'Service unpublished and destroyed');
32
- }
33
- catch (err) {
34
- debug('mDNS', `Cleanup error: ${err}`);
35
- }
36
- };
75
+ };
76
+ if (token)
77
+ txt.token = token;
78
+ if (lanIp)
79
+ txt.ip = lanIp;
80
+ const service = instance.publish({
81
+ name: `${projectName}-${port}`,
82
+ type: 'agentdeck',
83
+ port,
84
+ txt,
85
+ });
86
+ // Catch async publish errors — mDNS is non-critical
87
+ service.on?.('error', (err) => {
88
+ debug('mDNS', `Service error (ignored): ${err.message}`);
89
+ });
90
+ debug('mDNS', `Published _agentdeck._tcp on port ${port} (project: ${projectName})`);
91
+ currentCleanup = () => {
92
+ try {
93
+ service.stop?.();
94
+ instance?.unpublishAll();
95
+ instance?.destroy();
96
+ instance = null;
97
+ }
98
+ catch (err) {
99
+ debug('mDNS', `Cleanup error: ${err}`);
100
+ }
101
+ };
102
+ return true;
103
+ }
104
+ catch (err) {
105
+ debug('mDNS', `Failed to advertise: ${err}`);
106
+ instance = null;
107
+ currentCleanup = null;
108
+ return false;
109
+ }
37
110
  }
38
- catch (err) {
39
- debug('mDNS', `Failed to advertise: ${err}`);
40
- // Return no-op cleanup if mDNS fails (non-critical)
41
- return () => { };
111
+ // Track published IP to detect changes (DHCP renewal, interface switch)
112
+ let publishedIp;
113
+ function publishAndTrackIp() {
114
+ publishedIp = getLanIp();
115
+ return publish();
42
116
  }
117
+ // Initial publish
118
+ publishAndTrackIp();
119
+ // Wire immediate recovery for wake handler
120
+ _triggerRecovery = () => {
121
+ if (stopped)
122
+ return;
123
+ const lanIp = getLanIp();
124
+ if (!lanIp)
125
+ return;
126
+ log('[mDNS] Wake recovery — immediate re-publish');
127
+ invalidateMdnsInstance();
128
+ publishAndTrackIp();
129
+ };
130
+ // Periodic recovery: re-publish if instance lost OR IP changed
131
+ recoveryTimer = setInterval(() => {
132
+ if (stopped)
133
+ return;
134
+ const lanIp = getLanIp();
135
+ if (!lanIp) {
136
+ debug('mDNS', 'Recovery check: no LAN IP available');
137
+ return;
138
+ }
139
+ if (!instance) {
140
+ log('[mDNS] Network recovered — re-publishing service');
141
+ publishAndTrackIp();
142
+ }
143
+ else if (lanIp !== publishedIp) {
144
+ log(`[mDNS] IP changed (${publishedIp} → ${lanIp}) — re-publishing service`);
145
+ publishAndTrackIp();
146
+ }
147
+ }, MDNS_RECOVERY_INTERVAL);
148
+ return () => {
149
+ stopped = true;
150
+ _triggerRecovery = null;
151
+ if (recoveryTimer) {
152
+ clearInterval(recoveryTimer);
153
+ recoveryTimer = null;
154
+ }
155
+ currentCleanup?.();
156
+ currentCleanup = null;
157
+ };
43
158
  }
44
159
  //# sourceMappingURL=mdns.js.map
package/dist/mdns.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"mdns.js","sourceRoot":"","sources":["../src/mdns.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,IAAI,QAAQ,GAAmB,IAAI,CAAC;AAEpC;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAY,EACZ,WAAmB,EACnB,SAAoB;IAEpB,IAAI,CAAC;QACH,QAAQ,GAAG,IAAI,OAAO,EAAE,CAAC;QAEzB,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;YAC/B,IAAI,EAAE,aAAa,WAAW,EAAE;YAChC,IAAI,EAAE,WAAW;YACjB,IAAI;YACJ,GAAG,EAAE;gBACH,OAAO,EAAE,WAAW;gBACpB,KAAK,EAAE,SAAS;gBAChB,CAAC,EAAE,GAAG;gBACN,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC;aACnB;SACF,CAAC,CAAC;QAEH,KAAK,CAAC,MAAM,EAAE,qCAAqC,IAAI,cAAc,WAAW,GAAG,CAAC,CAAC;QAErF,OAAO,GAAG,EAAE;YACV,IAAI,CAAC;gBACH,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;gBACjB,QAAQ,EAAE,YAAY,EAAE,CAAC;gBACzB,QAAQ,EAAE,OAAO,EAAE,CAAC;gBACpB,QAAQ,GAAG,IAAI,CAAC;gBAChB,KAAK,CAAC,MAAM,EAAE,mCAAmC,CAAC,CAAC;YACrD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,KAAK,CAAC,MAAM,EAAE,kBAAkB,GAAG,EAAE,CAAC,CAAC;YACzC,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,KAAK,CAAC,MAAM,EAAE,wBAAwB,GAAG,EAAE,CAAC,CAAC;QAC7C,oDAAoD;QACpD,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"mdns.js","sourceRoot":"","sources":["../src/mdns.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Probe the MLX server's model catalog and pick the best single model id.
3
+ * Returns `[model]` on success, `null` when the server is unreachable.
4
+ *
5
+ * `null` vs `[]` matters downstream: null means "MLX not detected, render
6
+ * the empty-state in the dashboard and skip summarize calls entirely",
7
+ * while the old `[]` return was ambiguous with "server up but no models".
8
+ *
9
+ * `nanollava` variants are filtered out — they load for vision tasks but
10
+ * are poor judges/summarizers. Model pick priority is delegated to
11
+ * `pickMlxModel` (pin → fallback in catalog → first entry).
12
+ */
13
+ export declare function fetchMlxModels(pin?: string | null): Promise<string[] | null>;
14
+ //# sourceMappingURL=mlx-probe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mlx-probe.d.ts","sourceRoot":"","sources":["../src/mlx-probe.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;GAWG;AACH,wBAAsB,cAAc,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CA2BlF"}
@@ -0,0 +1,44 @@
1
+ import { pickMlxModel } from '@agentdeck/shared';
2
+ let preferredMlxModelsUrl = null;
3
+ /**
4
+ * Probe the MLX server's model catalog and pick the best single model id.
5
+ * Returns `[model]` on success, `null` when the server is unreachable.
6
+ *
7
+ * `null` vs `[]` matters downstream: null means "MLX not detected, render
8
+ * the empty-state in the dashboard and skip summarize calls entirely",
9
+ * while the old `[]` return was ambiguous with "server up but no models".
10
+ *
11
+ * `nanollava` variants are filtered out — they load for vision tasks but
12
+ * are poor judges/summarizers. Model pick priority is delegated to
13
+ * `pickMlxModel` (pin → fallback in catalog → first entry).
14
+ */
15
+ export async function fetchMlxModels(pin) {
16
+ const candidates = preferredMlxModelsUrl
17
+ ? [preferredMlxModelsUrl, 'http://127.0.0.1:8800/v1/models', 'http://127.0.0.1:8800/models']
18
+ : ['http://127.0.0.1:8800/v1/models', 'http://127.0.0.1:8800/models'];
19
+ for (const url of Array.from(new Set(candidates))) {
20
+ try {
21
+ const resp = await fetch(url, {
22
+ signal: AbortSignal.timeout(2000),
23
+ });
24
+ if (!resp.ok)
25
+ continue;
26
+ const json = await resp.json();
27
+ const models = (json.data ?? [])
28
+ .map((m) => (typeof m.id === 'string' && m.id.trim().length > 0 ? m.id.trim()
29
+ : typeof m.name === 'string' && m.name.trim().length > 0 ? m.name.trim()
30
+ : null))
31
+ .filter((m) => m != null)
32
+ .filter((m) => !m.toLowerCase().includes('nanollava'));
33
+ preferredMlxModelsUrl = url;
34
+ const deduped = Array.from(new Set(models));
35
+ const picked = pickMlxModel(deduped, pin);
36
+ return picked ? [picked] : [];
37
+ }
38
+ catch {
39
+ // try next endpoint
40
+ }
41
+ }
42
+ return null;
43
+ }
44
+ //# sourceMappingURL=mlx-probe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mlx-probe.js","sourceRoot":"","sources":["../src/mlx-probe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,IAAI,qBAAqB,GAAkB,IAAI,CAAC;AAEhD;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAmB;IACtD,MAAM,UAAU,GAAG,qBAAqB;QACtC,CAAC,CAAC,CAAC,qBAAqB,EAAE,iCAAiC,EAAE,8BAA8B,CAAC;QAC5F,CAAC,CAAC,CAAC,iCAAiC,EAAE,8BAA8B,CAAC,CAAC;IAExE,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QAClD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAC5B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;aAClC,CAAC,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,EAAE;gBAAE,SAAS;YACvB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAsD,CAAC;YACnF,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;iBAC7B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE;gBAC3E,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE;oBACxE,CAAC,CAAC,IAAI,CAAC,CAAC;iBACT,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC;iBACrC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;YACzD,qBAAqB,GAAG,GAAG,CAAC;YAC5B,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;YAC5C,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC1C,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,oBAAoB;QACtB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -14,14 +14,16 @@ export interface OpenClawModel {
14
14
  * Returns cached entries if within TTL.
15
15
  * Returns null if openclaw is not installed or the command fails.
16
16
  */
17
- export declare function fetchModelCatalog(): {
17
+ export declare function fetchModelCatalog(): Promise<{
18
18
  entries: ModelCatalogEntry[];
19
19
  raw: OpenClawModel[];
20
- } | null;
20
+ } | null>;
21
21
  /**
22
22
  * Get the default model name from the catalog, or null.
23
+ * Returns the display name (e.g., "Claude Haiku 4.5"), not the API key.
24
+ * Falls back to first available model if no default is marked.
23
25
  */
24
- export declare function getDefaultModelName(): string | null;
26
+ export declare function getDefaultModelName(): Promise<string | null>;
25
27
  /**
26
28
  * Invalidate the cache (e.g., on reconnect).
27
29
  */
@@ -1 +1 @@
1
- {"version":3,"file":"model-catalog.d.ts","sourceRoot":"","sources":["../src/model-catalog.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAGpD,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAuCD;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI;IAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAAC,GAAG,EAAE,aAAa,EAAE,CAAA;CAAE,GAAG,IAAI,CA8BjG;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,GAAG,IAAI,CAKnD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAI3C"}
1
+ {"version":3,"file":"model-catalog.d.ts","sourceRoot":"","sources":["../src/model-catalog.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAGpD,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AA0CD;;;;GAIG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC;IAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAAC,GAAG,EAAE,aAAa,EAAE,CAAA;CAAE,GAAG,IAAI,CAAC,CA6ChH;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAQlE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAI3C"}
@@ -1,9 +1,4 @@
1
- /**
2
- * OpenClaw model catalog — fetches configured models via `openclaw models list --json`.
3
- *
4
- * Results are cached for 60 seconds to avoid repeated CLI invocations.
5
- */
6
- import { execSync } from 'child_process';
1
+ import { execFile } from 'child_process';
7
2
  import { debug } from './logger.js';
8
3
  import { augmentedPath } from '@agentdeck/shared';
9
4
  // Cache
@@ -11,6 +6,7 @@ let cachedEntries = null;
11
6
  let cachedRaw = null;
12
7
  let cacheTime = 0;
13
8
  const CACHE_TTL_MS = 60_000;
9
+ let fetchPromise = null;
14
10
  /**
15
11
  * Parse role from model tags.
16
12
  * - "default" → "default"
@@ -32,6 +28,7 @@ function parseRole(tags) {
32
28
  */
33
29
  function toEntries(models) {
34
30
  return models.map((m) => ({
31
+ key: m.key,
35
32
  name: m.name,
36
33
  role: parseRole(m.tags ?? []),
37
34
  available: m.available !== false,
@@ -42,43 +39,62 @@ function toEntries(models) {
42
39
  * Returns cached entries if within TTL.
43
40
  * Returns null if openclaw is not installed or the command fails.
44
41
  */
45
- export function fetchModelCatalog() {
42
+ export async function fetchModelCatalog() {
46
43
  const now = Date.now();
47
44
  if (cachedEntries && cachedRaw && now - cacheTime < CACHE_TTL_MS) {
48
45
  return { entries: cachedEntries, raw: cachedRaw };
49
46
  }
50
- try {
51
- const output = execSync('openclaw models list --json', {
47
+ if (fetchPromise) {
48
+ return fetchPromise;
49
+ }
50
+ fetchPromise = new Promise((resolve) => {
51
+ execFile('openclaw', ['models', 'list', '--json'], {
52
52
  timeout: 5000,
53
53
  encoding: 'utf-8',
54
- stdio: ['ignore', 'pipe', 'ignore'],
55
54
  env: { ...process.env, PATH: augmentedPath() },
56
- }).trim();
57
- const result = JSON.parse(output);
58
- if (!result.models || !Array.isArray(result.models)) {
59
- debug('model-catalog', 'Unexpected CLI output format');
60
- return null;
61
- }
62
- cachedRaw = result.models;
63
- cachedEntries = toEntries(result.models);
64
- cacheTime = now;
65
- debug('model-catalog', `Fetched ${cachedEntries.length} models (default: ${cachedEntries.find((e) => e.role === 'default')?.name ?? 'none'})`);
66
- return { entries: cachedEntries, raw: cachedRaw };
67
- }
68
- catch (err) {
69
- debug('model-catalog', `CLI call failed: ${err}`);
70
- return null;
71
- }
55
+ }, (err, stdout) => {
56
+ fetchPromise = null;
57
+ if (err) {
58
+ debug('model-catalog', `CLI call failed: ${err}`);
59
+ resolve(null);
60
+ return;
61
+ }
62
+ try {
63
+ const result = JSON.parse(stdout.trim());
64
+ if (!result.models || !Array.isArray(result.models)) {
65
+ debug('model-catalog', 'Unexpected CLI output format');
66
+ resolve(null);
67
+ return;
68
+ }
69
+ cachedRaw = result.models;
70
+ cachedEntries = toEntries(result.models);
71
+ cacheTime = Date.now();
72
+ debug('model-catalog', `Fetched ${cachedEntries.length} models (default: ${cachedEntries.find((e) => e.role === 'default')?.name ?? 'none'})`);
73
+ resolve({ entries: cachedEntries, raw: cachedRaw });
74
+ }
75
+ catch (parseErr) {
76
+ debug('model-catalog', `CLI output parse failed: ${parseErr}`);
77
+ resolve(null);
78
+ }
79
+ });
80
+ });
81
+ return fetchPromise;
72
82
  }
73
83
  /**
74
84
  * Get the default model name from the catalog, or null.
85
+ * Returns the display name (e.g., "Claude Haiku 4.5"), not the API key.
86
+ * Falls back to first available model if no default is marked.
75
87
  */
76
- export function getDefaultModelName() {
77
- const catalog = fetchModelCatalog();
88
+ export async function getDefaultModelName() {
89
+ const catalog = await fetchModelCatalog();
78
90
  if (!catalog)
79
91
  return null;
80
92
  const defaultEntry = catalog.entries.find((e) => e.role === 'default');
81
- return defaultEntry?.name ?? null;
93
+ if (defaultEntry)
94
+ return defaultEntry.name ?? null;
95
+ // Fallback: first available model if no "default" tag
96
+ const fallback = catalog.entries.find((e) => e.available !== false);
97
+ return fallback?.name ?? null;
82
98
  }
83
99
  /**
84
100
  * Invalidate the cache (e.g., on reconnect).
@@ -1 +1 @@
1
- {"version":3,"file":"model-catalog.js","sourceRoot":"","sources":["../src/model-catalog.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"model-catalog.js","sourceRoot":"","sources":["../src/model-catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { DeviceModule, BridgeContext } from './types.js';
2
+ /**
3
+ * ADB reverse tunnel module for Android dashboard clients.
4
+ * D200H Deck Dock is now handled by D200hModule (HID protocol).
5
+ */
6
+ export declare class AdbModule implements DeviceModule {
7
+ readonly name = "adb";
8
+ private port;
9
+ private stopPolling;
10
+ shouldActivate(config: 'auto' | boolean): Promise<boolean>;
11
+ start(ctx: BridgeContext): Promise<void>;
12
+ stop(): Promise<void>;
13
+ }
14
+ //# sourceMappingURL=adb-module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adb-module.d.ts","sourceRoot":"","sources":["../../src/modules/adb-module.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAI9D;;;GAGG;AACH,qBAAa,SAAU,YAAW,YAAY;IAC5C,QAAQ,CAAC,IAAI,SAAS;IACtB,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,WAAW,CAA6B;IAE1C,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAY1D,KAAK,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAMxC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAK5B"}
@@ -0,0 +1,36 @@
1
+ import { setupAdbReverse, cleanupAdbReverse, startAdbReversePolling } from '../adb-reverse.js';
2
+ import { execSync } from 'child_process';
3
+ /**
4
+ * ADB reverse tunnel module for Android dashboard clients.
5
+ * D200H Deck Dock is now handled by D200hModule (HID protocol).
6
+ */
7
+ export class AdbModule {
8
+ name = 'adb';
9
+ port = 0;
10
+ stopPolling = null;
11
+ async shouldActivate(config) {
12
+ if (config === false)
13
+ return false;
14
+ if (config === true)
15
+ return true;
16
+ // auto: check if adb is available
17
+ try {
18
+ execSync('which adb', { stdio: 'pipe' });
19
+ return true;
20
+ }
21
+ catch {
22
+ return false;
23
+ }
24
+ }
25
+ async start(ctx) {
26
+ this.port = ctx.port;
27
+ setupAdbReverse(ctx.port);
28
+ this.stopPolling = startAdbReversePolling(ctx.port);
29
+ }
30
+ async stop() {
31
+ this.stopPolling?.();
32
+ this.stopPolling = null;
33
+ cleanupAdbReverse(this.port);
34
+ }
35
+ }
36
+ //# sourceMappingURL=adb-module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adb-module.js","sourceRoot":"","sources":["../../src/modules/adb-module.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC/F,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC;;;GAGG;AACH,MAAM,OAAO,SAAS;IACX,IAAI,GAAG,KAAK,CAAC;IACd,IAAI,GAAG,CAAC,CAAC;IACT,WAAW,GAAwB,IAAI,CAAC;IAEhD,KAAK,CAAC,cAAc,CAAC,MAAwB;QAC3C,IAAI,MAAM,KAAK,KAAK;YAAE,OAAO,KAAK,CAAC;QACnC,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QACjC,kCAAkC;QAClC,IAAI,CAAC;YACH,QAAQ,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YACzC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,GAAkB;QAC5B,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;QACrB,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,WAAW,GAAG,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACrB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;CACF"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * D200H HID Device Module — communicates with Ulanzi D200H via stock HID protocol.
3
+ *
4
+ * The D200H boots into HID mode (VID 0x2207, PID 0x0019) after 4 seconds.
5
+ * This module:
6
+ * - Detects the device via node-hid enumeration
7
+ * - Sends dashboard images via SET_BUTTONS (ZIP with manifest.json + PNGs)
8
+ * - Receives button press events and dispatches commands
9
+ * - Manages brightness and keep-alive
10
+ *
11
+ * No ADB, no firmware modification, no on-device agent needed.
12
+ */
13
+ import type { DeviceModule, BridgeContext } from './types.js';
14
+ export declare class D200hModule implements DeviceModule {
15
+ readonly name = "d200h";
16
+ private hidModule;
17
+ private consumerDevice;
18
+ private keyboardDevice;
19
+ private pollTimer;
20
+ private readTimer;
21
+ private keepAliveTimer;
22
+ private commandHandler;
23
+ private lastStateHash;
24
+ private lastState;
25
+ private lastSessions;
26
+ private connected;
27
+ private isUpdating;
28
+ private pendingUpdate;
29
+ shouldActivate(config: 'auto' | boolean): Promise<boolean>;
30
+ start(ctx: BridgeContext): Promise<void>;
31
+ stop(): Promise<void>;
32
+ statusSnapshot(): Record<string, unknown>;
33
+ private loadHidModule;
34
+ private findDevice;
35
+ private tryConnect;
36
+ private disconnect;
37
+ private startReading;
38
+ private readFrom;
39
+ private updateDisplay;
40
+ private sendKeepAlive;
41
+ private writeToDevice;
42
+ }
43
+ //# sourceMappingURL=d200h-module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"d200h-module.d.ts","sourceRoot":"","sources":["../../src/modules/d200h-module.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAmE9D,qBAAa,WAAY,YAAW,YAAY;IAC9C,QAAQ,CAAC,IAAI,WAAW;IAExB,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,cAAc,CAA0B;IAChD,OAAO,CAAC,cAAc,CAA0B;IAChD,OAAO,CAAC,SAAS,CAA+C;IAChE,OAAO,CAAC,SAAS,CAA+C;IAChE,OAAO,CAAC,cAAc,CAA+C;IACrE,OAAO,CAAC,cAAc,CAAqC;IAC3D,OAAO,CAAC,aAAa,CAAM;IAC3B,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,aAAa,CAAa;IAE5B,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAgB1D,KAAK,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IA+BxC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB3B,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;YAe3B,aAAa;IAU3B,OAAO,CAAC,UAAU;IAyBlB,OAAO,CAAC,UAAU;IA0ClB,OAAO,CAAC,UAAU;IAWlB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,QAAQ;YA8CF,aAAa;IAoC3B,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,aAAa;CAetB"}