@agentdeck/bridge 0.1.0 → 0.2.1

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 (384) 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-migration.d.ts +2 -0
  163. package/dist/hook-migration.d.ts.map +1 -0
  164. package/dist/hook-migration.js +104 -0
  165. package/dist/hook-migration.js.map +1 -0
  166. package/dist/hook-server.d.ts +29 -0
  167. package/dist/hook-server.d.ts.map +1 -1
  168. package/dist/hook-server.js +366 -8
  169. package/dist/hook-server.js.map +1 -1
  170. package/dist/index.d.ts +20 -2
  171. package/dist/index.d.ts.map +1 -1
  172. package/dist/index.js +1304 -562
  173. package/dist/index.js.map +1 -1
  174. package/dist/log-stream.d.ts +26 -0
  175. package/dist/log-stream.d.ts.map +1 -0
  176. package/dist/log-stream.js +111 -0
  177. package/dist/log-stream.js.map +1 -0
  178. package/dist/logger.d.ts +9 -2
  179. package/dist/logger.d.ts.map +1 -1
  180. package/dist/logger.js +36 -5
  181. package/dist/logger.js.map +1 -1
  182. package/dist/mdns.d.ts +15 -1
  183. package/dist/mdns.d.ts.map +1 -1
  184. package/dist/mdns.js +143 -28
  185. package/dist/mdns.js.map +1 -1
  186. package/dist/mlx-probe.d.ts +14 -0
  187. package/dist/mlx-probe.d.ts.map +1 -0
  188. package/dist/mlx-probe.js +44 -0
  189. package/dist/mlx-probe.js.map +1 -0
  190. package/dist/model-catalog.d.ts +5 -3
  191. package/dist/model-catalog.d.ts.map +1 -1
  192. package/dist/model-catalog.js +45 -29
  193. package/dist/model-catalog.js.map +1 -1
  194. package/dist/modules/adb-module.d.ts +14 -0
  195. package/dist/modules/adb-module.d.ts.map +1 -0
  196. package/dist/modules/adb-module.js +36 -0
  197. package/dist/modules/adb-module.js.map +1 -0
  198. package/dist/modules/d200h-module.d.ts +43 -0
  199. package/dist/modules/d200h-module.d.ts.map +1 -0
  200. package/dist/modules/d200h-module.js +360 -0
  201. package/dist/modules/d200h-module.js.map +1 -0
  202. package/dist/modules/d200h-renderer.d.ts +7 -0
  203. package/dist/modules/d200h-renderer.d.ts.map +1 -0
  204. package/dist/modules/d200h-renderer.js +321 -0
  205. package/dist/modules/d200h-renderer.js.map +1 -0
  206. package/dist/modules/index.d.ts +23 -0
  207. package/dist/modules/index.d.ts.map +1 -0
  208. package/dist/modules/index.js +65 -0
  209. package/dist/modules/index.js.map +1 -0
  210. package/dist/modules/mdns-module.d.ts +12 -0
  211. package/dist/modules/mdns-module.d.ts.map +1 -0
  212. package/dist/modules/mdns-module.js +21 -0
  213. package/dist/modules/mdns-module.js.map +1 -0
  214. package/dist/modules/pixoo-module.d.ts +8 -0
  215. package/dist/modules/pixoo-module.d.ts.map +1 -0
  216. package/dist/modules/pixoo-module.js +24 -0
  217. package/dist/modules/pixoo-module.js.map +1 -0
  218. package/dist/modules/serial-module.d.ts +18 -0
  219. package/dist/modules/serial-module.d.ts.map +1 -0
  220. package/dist/modules/serial-module.js +47 -0
  221. package/dist/modules/serial-module.js.map +1 -0
  222. package/dist/modules/types.d.ts +39 -0
  223. package/dist/modules/types.d.ts.map +1 -0
  224. package/dist/modules/types.js +2 -0
  225. package/dist/modules/types.js.map +1 -0
  226. package/dist/ollama-probe.d.ts +13 -0
  227. package/dist/ollama-probe.d.ts.map +1 -0
  228. package/dist/ollama-probe.js +46 -0
  229. package/dist/ollama-probe.js.map +1 -0
  230. package/dist/opencode-client.d.ts +126 -0
  231. package/dist/opencode-client.d.ts.map +1 -0
  232. package/dist/opencode-client.js +181 -0
  233. package/dist/opencode-client.js.map +1 -0
  234. package/dist/output-parser.d.ts +3 -0
  235. package/dist/output-parser.d.ts.map +1 -1
  236. package/dist/output-parser.js +29 -3
  237. package/dist/output-parser.js.map +1 -1
  238. package/dist/passive-observer.d.ts +38 -0
  239. package/dist/passive-observer.d.ts.map +1 -0
  240. package/dist/passive-observer.js +632 -0
  241. package/dist/passive-observer.js.map +1 -0
  242. package/dist/pixoo/pixoo-bridge.d.ts +50 -0
  243. package/dist/pixoo/pixoo-bridge.d.ts.map +1 -0
  244. package/dist/pixoo/pixoo-bridge.js +280 -0
  245. package/dist/pixoo/pixoo-bridge.js.map +1 -0
  246. package/dist/pixoo/pixoo-camera.d.ts +80 -0
  247. package/dist/pixoo/pixoo-camera.d.ts.map +1 -0
  248. package/dist/pixoo/pixoo-camera.js +271 -0
  249. package/dist/pixoo/pixoo-camera.js.map +1 -0
  250. package/dist/pixoo/pixoo-client.d.ts +67 -0
  251. package/dist/pixoo/pixoo-client.d.ts.map +1 -0
  252. package/dist/pixoo/pixoo-client.js +335 -0
  253. package/dist/pixoo/pixoo-client.js.map +1 -0
  254. package/dist/pixoo/pixoo-font.d.ts +24 -0
  255. package/dist/pixoo/pixoo-font.d.ts.map +1 -0
  256. package/dist/pixoo/pixoo-font.js +121 -0
  257. package/dist/pixoo/pixoo-font.js.map +1 -0
  258. package/dist/pixoo/pixoo-renderer.d.ts +32 -0
  259. package/dist/pixoo/pixoo-renderer.d.ts.map +1 -0
  260. package/dist/pixoo/pixoo-renderer.js +696 -0
  261. package/dist/pixoo/pixoo-renderer.js.map +1 -0
  262. package/dist/pixoo/pixoo-settings.d.ts +10 -0
  263. package/dist/pixoo/pixoo-settings.d.ts.map +1 -0
  264. package/dist/pixoo/pixoo-settings.js +47 -0
  265. package/dist/pixoo/pixoo-settings.js.map +1 -0
  266. package/dist/pixoo/pixoo-sprites.d.ts +187 -0
  267. package/dist/pixoo/pixoo-sprites.d.ts.map +1 -0
  268. package/dist/pixoo/pixoo-sprites.js +926 -0
  269. package/dist/pixoo/pixoo-sprites.js.map +1 -0
  270. package/dist/pty-manager.d.ts +1 -1
  271. package/dist/pty-manager.d.ts.map +1 -1
  272. package/dist/pty-manager.js +36 -15
  273. package/dist/pty-manager.js.map +1 -1
  274. package/dist/session-aggregator.d.ts +41 -0
  275. package/dist/session-aggregator.d.ts.map +1 -0
  276. package/dist/session-aggregator.js +76 -0
  277. package/dist/session-aggregator.js.map +1 -0
  278. package/dist/session-focus-relay.d.ts +35 -0
  279. package/dist/session-focus-relay.d.ts.map +1 -0
  280. package/dist/session-focus-relay.js +127 -0
  281. package/dist/session-focus-relay.js.map +1 -0
  282. package/dist/session-registry.d.ts +88 -1
  283. package/dist/session-registry.d.ts.map +1 -1
  284. package/dist/session-registry.js +222 -15
  285. package/dist/session-registry.js.map +1 -1
  286. package/dist/session-timeline-relay.d.ts +27 -0
  287. package/dist/session-timeline-relay.d.ts.map +1 -0
  288. package/dist/session-timeline-relay.js +124 -0
  289. package/dist/session-timeline-relay.js.map +1 -0
  290. package/dist/state-machine.d.ts +1 -0
  291. package/dist/state-machine.d.ts.map +1 -1
  292. package/dist/state-machine.js +14 -0
  293. package/dist/state-machine.js.map +1 -1
  294. package/dist/terminal-status.d.ts +28 -0
  295. package/dist/terminal-status.d.ts.map +1 -0
  296. package/dist/terminal-status.js +152 -0
  297. package/dist/terminal-status.js.map +1 -0
  298. package/dist/timeline-store.d.ts +22 -0
  299. package/dist/timeline-store.d.ts.map +1 -0
  300. package/dist/timeline-store.js +79 -0
  301. package/dist/timeline-store.js.map +1 -0
  302. package/dist/timeline-summarizer.d.ts +14 -0
  303. package/dist/timeline-summarizer.d.ts.map +1 -0
  304. package/dist/timeline-summarizer.js +154 -0
  305. package/dist/timeline-summarizer.js.map +1 -0
  306. package/dist/tts.d.ts +25 -0
  307. package/dist/tts.d.ts.map +1 -0
  308. package/dist/tts.js +99 -0
  309. package/dist/tts.js.map +1 -0
  310. package/dist/tui/ansi.d.ts +92 -0
  311. package/dist/tui/ansi.d.ts.map +1 -0
  312. package/dist/tui/ansi.js +181 -0
  313. package/dist/tui/ansi.js.map +1 -0
  314. package/dist/tui/dashboard.d.ts +35 -0
  315. package/dist/tui/dashboard.d.ts.map +1 -0
  316. package/dist/tui/dashboard.js +436 -0
  317. package/dist/tui/dashboard.js.map +1 -0
  318. package/dist/tui/gauge.d.ts +15 -0
  319. package/dist/tui/gauge.d.ts.map +1 -0
  320. package/dist/tui/gauge.js +82 -0
  321. package/dist/tui/gauge.js.map +1 -0
  322. package/dist/tui/renderer.d.ts +15 -0
  323. package/dist/tui/renderer.d.ts.map +1 -0
  324. package/dist/tui/renderer.js +758 -0
  325. package/dist/tui/renderer.js.map +1 -0
  326. package/dist/tui/screen.d.ts +27 -0
  327. package/dist/tui/screen.d.ts.map +1 -0
  328. package/dist/tui/screen.js +109 -0
  329. package/dist/tui/screen.js.map +1 -0
  330. package/dist/tui/terrarium.d.ts +96 -0
  331. package/dist/tui/terrarium.d.ts.map +1 -0
  332. package/dist/tui/terrarium.js +912 -0
  333. package/dist/tui/terrarium.js.map +1 -0
  334. package/dist/types.d.ts +4 -2
  335. package/dist/types.d.ts.map +1 -1
  336. package/dist/types.js +3 -2
  337. package/dist/types.js.map +1 -1
  338. package/dist/usage-api.d.ts +9 -2
  339. package/dist/usage-api.d.ts.map +1 -1
  340. package/dist/usage-api.js +224 -42
  341. package/dist/usage-api.js.map +1 -1
  342. package/dist/usage-event.d.ts +12 -0
  343. package/dist/usage-event.d.ts.map +1 -0
  344. package/dist/usage-event.js +78 -0
  345. package/dist/usage-event.js.map +1 -0
  346. package/dist/usage-tracker.d.ts +4 -0
  347. package/dist/usage-tracker.d.ts.map +1 -1
  348. package/dist/usage-tracker.js +17 -0
  349. package/dist/usage-tracker.js.map +1 -1
  350. package/dist/utility-proxy.d.ts +30 -0
  351. package/dist/utility-proxy.d.ts.map +1 -0
  352. package/dist/utility-proxy.js +217 -0
  353. package/dist/utility-proxy.js.map +1 -0
  354. package/dist/utils/project-name.d.ts +22 -0
  355. package/dist/utils/project-name.d.ts.map +1 -0
  356. package/dist/utils/project-name.js +72 -0
  357. package/dist/utils/project-name.js.map +1 -0
  358. package/dist/version-check.d.ts +26 -0
  359. package/dist/version-check.d.ts.map +1 -0
  360. package/dist/version-check.js +225 -0
  361. package/dist/version-check.js.map +1 -0
  362. package/dist/voice-assistant.d.ts +63 -0
  363. package/dist/voice-assistant.d.ts.map +1 -0
  364. package/dist/voice-assistant.js +406 -0
  365. package/dist/voice-assistant.js.map +1 -0
  366. package/dist/voice.d.ts +2 -0
  367. package/dist/voice.d.ts.map +1 -1
  368. package/dist/voice.js +26 -1
  369. package/dist/voice.js.map +1 -1
  370. package/dist/wake-word.d.ts +35 -0
  371. package/dist/wake-word.d.ts.map +1 -0
  372. package/dist/wake-word.js +225 -0
  373. package/dist/wake-word.js.map +1 -0
  374. package/dist/whisper-server-manager.d.ts +1 -1
  375. package/dist/whisper-server-manager.js +1 -1
  376. package/dist/wifi-config.d.ts +24 -0
  377. package/dist/wifi-config.d.ts.map +1 -0
  378. package/dist/wifi-config.js +84 -0
  379. package/dist/wifi-config.js.map +1 -0
  380. package/dist/ws-server.d.ts +12 -0
  381. package/dist/ws-server.d.ts.map +1 -1
  382. package/dist/ws-server.js +81 -3
  383. package/dist/ws-server.js.map +1 -1
  384. package/package.json +21 -13
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Pixoo64 Bridge — event listener + HTTP realtime 2FPS streamer.
3
+ *
4
+ * Real-time continuous streaming approach:
5
+ * - The device cannot handle real-time HTTP single-frame pushes faster than ~4 FPS.
6
+ * - Multi-frame loops trigger an unavoidable hardware loading screen.
7
+ * - Solution: Constantly push `PicNum: 1` with a **static PicId** every 333ms (3 FPS).
8
+ * - The device will smoothly overwrite its buffer without stalling.
9
+ */
10
+ import type { BridgeEvent } from '../types.js';
11
+ export interface PixooDevice {
12
+ ip: string;
13
+ name?: string;
14
+ brightness?: number;
15
+ }
16
+ /** Set broadcast function for pushing Pixoo status events to WS clients. */
17
+ export declare function setPixooBroadcast(fn: (event: BridgeEvent) => void): void;
18
+ export declare function startPixooBridge(pixooDevices?: PixooDevice[]): void;
19
+ export declare function broadcastPixoo(event: BridgeEvent): void;
20
+ export declare function stopPixooBridge(): Promise<void>;
21
+ /** Register a listener called whenever a new frame is rendered. */
22
+ export declare function onFrameRendered(listener: (frame: Uint8Array) => void): void;
23
+ /** Remove a frame listener. */
24
+ export declare function offFrameRendered(listener: (frame: Uint8Array) => void): void;
25
+ /**
26
+ * Set the live preview frame rate (1–10 FPS).
27
+ * Takes effect immediately by restarting the preview timer.
28
+ */
29
+ export declare function setPreviewFps(fps: number): void;
30
+ /** Get current preview FPS setting. */
31
+ export declare function getPreviewFps(): number;
32
+ export declare function pixooDeviceCount(): number;
33
+ export declare function getPixooDeviceDetails(): Array<{
34
+ ip: string;
35
+ name: string;
36
+ backedOff: boolean;
37
+ failures: number;
38
+ nextProbeMs: number;
39
+ lastPushAgo: number;
40
+ }>;
41
+ /**
42
+ * Render a fresh frame using current cached state.
43
+ * Used by the live preview endpoint when no Pixoo device is connected.
44
+ */
45
+ export declare function renderPreviewFrame(): Uint8Array;
46
+ /**
47
+ * Get the last calculated frame.
48
+ */
49
+ export declare function getLastFrame(): Uint8Array | null;
50
+ //# sourceMappingURL=pixoo-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pixoo-bridge.d.ts","sourceRoot":"","sources":["../../src/pixoo/pixoo-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAgC,MAAM,aAAa,CAAC;AAW7E,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAiCD,4EAA4E;AAC5E,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,GAAG,IAAI,CAExE;AAED,wBAAgB,gBAAgB,CAAC,YAAY,CAAC,EAAE,WAAW,EAAE,GAAG,IAAI,CAwCnE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAwDvD;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CA6BrD;AAED,mEAAmE;AACnE,wBAAgB,eAAe,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI,CAG3E;AAED,+BAA+B;AAC/B,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI,CAG5E;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAO/C;AAED,uCAAuC;AACvC,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,qBAAqB,IAAI,KAAK,CAAC;IAC7C,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC,CAYD;AAsCD;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,UAAU,CAE/C;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,UAAU,GAAG,IAAI,CAEhD"}
@@ -0,0 +1,280 @@
1
+ /**
2
+ * Pixoo64 Bridge — event listener + HTTP realtime 2FPS streamer.
3
+ *
4
+ * Real-time continuous streaming approach:
5
+ * - The device cannot handle real-time HTTP single-frame pushes faster than ~4 FPS.
6
+ * - Multi-frame loops trigger an unavoidable hardware loading screen.
7
+ * - Solution: Constantly push `PicNum: 1` with a **static PicId** every 333ms (3 FPS).
8
+ * - The device will smoothly overwrite its buffer without stalling.
9
+ */
10
+ import { DISPLAY_FORWARDED_EVENTS } from '@agentdeck/shared/protocol';
11
+ import { pushFrame, setBrightness, clearText, getDeviceBackoffStatus, switchToCustomChannel, onDeviceStatusChange, stopProbeTimer } from './pixoo-client.js';
12
+ import { renderFrame, renderDisconnectedFrame } from './pixoo-renderer.js';
13
+ import { debug } from '../logger.js';
14
+ const TAG = 'Pixoo';
15
+ // ===== Internal State =====
16
+ let devices = [];
17
+ let streamTimer = null;
18
+ let lastPushTime = 0;
19
+ let pushing = false; // guard against overlapping pushes
20
+ // Cached latest events
21
+ let lastStateEvent = null;
22
+ let lastUsageEvent = null;
23
+ let lastSessions = null;
24
+ // Display sleep state — when Mac display is off, dim Pixoo and pause stream
25
+ let displayDimmed = false;
26
+ // Frame listeners for SSE streaming
27
+ let frameListeners = [];
28
+ let previewTimer = null;
29
+ let previewFps = 10; // Adjustable 1–10 FPS for /pixoo live preview
30
+ const HTTP_STREAM_INTERVAL_MS = 250; // 4 FPS hardware push (near hardware limit of Pixoo64)
31
+ const CHANNEL_REASSERT_MS = 30_000; // Re-assert custom channel every 30s (fast recovery after reboots)
32
+ const DEFAULT_BRIGHTNESS = 100;
33
+ const FORWARDED_EVENTS = DISPLAY_FORWARDED_EVENTS;
34
+ // Broadcast function injected by module for sending status notifications
35
+ let broadcastFn = null;
36
+ // ===== Public API =====
37
+ /** Set broadcast function for pushing Pixoo status events to WS clients. */
38
+ export function setPixooBroadcast(fn) {
39
+ broadcastFn = fn;
40
+ }
41
+ export function startPixooBridge(pixooDevices) {
42
+ if (!pixooDevices || pixooDevices.length === 0) {
43
+ debug(TAG, 'No Pixoo devices configured, skipping');
44
+ return;
45
+ }
46
+ devices = pixooDevices;
47
+ debug(TAG, `Starting with ${devices.length} device(s): ${devices.map(d => d.name || d.ip).join(', ')}`);
48
+ // Switch to custom channel + set brightness (fire-and-forget, one-time only)
49
+ // Do NOT repeat this call — it resets the HTTP GIF buffer, clearing the display.
50
+ for (const dev of devices) {
51
+ switchToCustomChannel(dev.ip).catch(() => { });
52
+ setBrightness(dev.ip, dev.brightness ?? DEFAULT_BRIGHTNESS).catch(() => { });
53
+ }
54
+ // Wire device status change → WS notification
55
+ onDeviceStatusChange((ip, online) => {
56
+ const dev = devices.find(d => d.ip === ip);
57
+ const name = dev?.name || 'Pixoo64';
58
+ if (broadcastFn) {
59
+ broadcastFn({
60
+ type: 'device_status',
61
+ device: 'pixoo',
62
+ name,
63
+ ip,
64
+ online,
65
+ message: online
66
+ ? `${name} reconnected`
67
+ : `${name} offline — power cycle may be needed`,
68
+ });
69
+ }
70
+ debug(TAG, online ? `${name} (${ip}) back online` : `${name} (${ip}) went offline`);
71
+ });
72
+ // Start continuous 3 FPS stream — no repeated channel switches
73
+ if (streamTimer)
74
+ clearInterval(streamTimer);
75
+ streamTimer = setInterval(doStreamPush, HTTP_STREAM_INTERVAL_MS);
76
+ debug(TAG, 'Bridge started (Continuous 3 FPS stream)');
77
+ }
78
+ export function broadcastPixoo(event) {
79
+ if (!FORWARDED_EVENTS.has(event.type))
80
+ return;
81
+ // Always cache state for live preview (even without Pixoo devices)
82
+ switch (event.type) {
83
+ case 'state_update':
84
+ lastStateEvent = event;
85
+ break;
86
+ case 'usage_update':
87
+ lastUsageEvent = event;
88
+ break;
89
+ case 'sessions_list':
90
+ lastSessions = event.sessions;
91
+ break;
92
+ case 'connection':
93
+ if (event.status === 'disconnected') {
94
+ lastStateEvent = null;
95
+ lastUsageEvent = null;
96
+ }
97
+ break;
98
+ case 'display_state': {
99
+ const displayOn = event.displayOn;
100
+ if (!displayOn && !displayDimmed) {
101
+ // Mac display off → dim Pixoo and pause stream
102
+ displayDimmed = true;
103
+ for (const dev of devices) {
104
+ setBrightness(dev.ip, 0).catch(() => { });
105
+ }
106
+ if (streamTimer) {
107
+ clearInterval(streamTimer);
108
+ streamTimer = null;
109
+ }
110
+ debug(TAG, 'Display sleep — brightness 0, stream paused');
111
+ }
112
+ else if (displayOn && displayDimmed) {
113
+ // Mac display on → restore brightness and resume stream
114
+ displayDimmed = false;
115
+ for (const dev of devices) {
116
+ setBrightness(dev.ip, dev.brightness ?? DEFAULT_BRIGHTNESS).catch(() => { });
117
+ }
118
+ // Resume stream after brief delay (let brightness restore first)
119
+ setTimeout(() => {
120
+ if (!displayDimmed && !streamTimer && devices.length > 0) {
121
+ streamTimer = setInterval(doStreamPush, HTTP_STREAM_INTERVAL_MS);
122
+ doStreamPush(); // Immediate first frame
123
+ }
124
+ }, 100);
125
+ debug(TAG, 'Display wake — brightness restored, stream resumed');
126
+ }
127
+ break;
128
+ }
129
+ }
130
+ // Immediate push on major disconnections to feel snappy
131
+ if (event.type === 'connection' && devices.length > 0) {
132
+ if (!pushing)
133
+ doStreamPush();
134
+ }
135
+ }
136
+ export async function stopPixooBridge() {
137
+ if (streamTimer) {
138
+ clearInterval(streamTimer);
139
+ streamTimer = null;
140
+ }
141
+ stopProbeTimer();
142
+ // Push disconnected frame to all devices (best-effort, 2s cap)
143
+ if (devices.length > 0) {
144
+ const frame = renderDisconnectedFrame();
145
+ await Promise.race([
146
+ Promise.all(devices.map(dev => pushFrame(dev.ip, frame).catch(() => { }))),
147
+ new Promise(resolve => setTimeout(resolve, 2000)),
148
+ ]);
149
+ }
150
+ for (const dev of devices) {
151
+ clearText(dev.ip).catch(() => { });
152
+ }
153
+ stopPreviewTimer();
154
+ devices = [];
155
+ lastStateEvent = null;
156
+ lastUsageEvent = null;
157
+ lastSessions = null;
158
+ displayDimmed = false;
159
+ broadcastFn = null;
160
+ frameListeners = [];
161
+ debug(TAG, 'Bridge stopped');
162
+ }
163
+ /** Register a listener called whenever a new frame is rendered. */
164
+ export function onFrameRendered(listener) {
165
+ frameListeners.push(listener);
166
+ startPreviewTimer();
167
+ }
168
+ /** Remove a frame listener. */
169
+ export function offFrameRendered(listener) {
170
+ frameListeners = frameListeners.filter(l => l !== listener);
171
+ if (frameListeners.length === 0)
172
+ stopPreviewTimer();
173
+ }
174
+ /**
175
+ * Set the live preview frame rate (1–10 FPS).
176
+ * Takes effect immediately by restarting the preview timer.
177
+ */
178
+ export function setPreviewFps(fps) {
179
+ previewFps = Math.max(1, Math.min(10, Math.round(fps)));
180
+ if (frameListeners.length > 0) {
181
+ stopPreviewTimer();
182
+ startPreviewTimer();
183
+ }
184
+ debug(TAG, `Preview FPS set to ${previewFps}`);
185
+ }
186
+ /** Get current preview FPS setting. */
187
+ export function getPreviewFps() {
188
+ return previewFps;
189
+ }
190
+ export function pixooDeviceCount() {
191
+ return devices.length;
192
+ }
193
+ export function getPixooDeviceDetails() {
194
+ return devices.map(dev => {
195
+ const backoff = getDeviceBackoffStatus(dev.ip);
196
+ return {
197
+ ip: dev.ip,
198
+ name: dev.name || 'Pixoo64',
199
+ backedOff: backoff.backedOff,
200
+ failures: backoff.failures,
201
+ nextProbeMs: backoff.nextProbeMs,
202
+ lastPushAgo: lastPushTime > 0 ? Date.now() - lastPushTime : -1,
203
+ };
204
+ });
205
+ }
206
+ // ===== Internal =====
207
+ /**
208
+ * Main Continuous Stream tick: 3 FPS push to all hardware devices (333ms interval).
209
+ */
210
+ function doStreamPush() {
211
+ if (devices.length === 0)
212
+ return;
213
+ if (pushing)
214
+ return;
215
+ if (displayDimmed)
216
+ return;
217
+ const elapsed = Date.now() - lastPushTime;
218
+ if (elapsed < HTTP_STREAM_INTERVAL_MS * 0.8)
219
+ return;
220
+ pushing = true;
221
+ lastPushTime = Date.now();
222
+ try {
223
+ const frame = renderFrame(lastStateEvent, lastUsageEvent, lastSessions);
224
+ const ts = new Date().toISOString().slice(11, 19);
225
+ debug('Pixoo', `${ts} pushing to ${devices.length} dev(s)`);
226
+ const promises = devices.map(dev => pushFrame(dev.ip, frame).then(ok => {
227
+ debug('Pixoo', `${ts} → ${dev.ip}: ${ok ? 'OK' : 'FAIL'}`);
228
+ }).catch((err) => {
229
+ debug('Pixoo', `${ts} → ${dev.ip}: ERROR ${err?.message}`);
230
+ }));
231
+ Promise.all(promises).finally(() => { pushing = false; });
232
+ }
233
+ catch (err) {
234
+ pushing = false;
235
+ debug('Pixoo', `renderFrame error: ${err?.message}`);
236
+ }
237
+ }
238
+ /**
239
+ * Render a fresh frame using current cached state.
240
+ * Used by the live preview endpoint when no Pixoo device is connected.
241
+ */
242
+ export function renderPreviewFrame() {
243
+ return renderFrame(lastStateEvent, lastUsageEvent, lastSessions);
244
+ }
245
+ /**
246
+ * Get the last calculated frame.
247
+ */
248
+ export function getLastFrame() {
249
+ return renderFrame(lastStateEvent, lastUsageEvent, lastSessions);
250
+ }
251
+ /** Notify all SSE frame listeners. */
252
+ function notifyFrameListeners(frame) {
253
+ for (const listener of frameListeners) {
254
+ try {
255
+ listener(frame);
256
+ }
257
+ catch { /* best-effort */ }
258
+ }
259
+ }
260
+ /** Preview timer: Generates frames at previewFps for the Web UI stream. */
261
+ function startPreviewTimer() {
262
+ if (previewTimer)
263
+ return;
264
+ const intervalMs = Math.round(1000 / previewFps);
265
+ previewTimer = setInterval(() => {
266
+ if (frameListeners.length === 0) {
267
+ stopPreviewTimer();
268
+ return;
269
+ }
270
+ const frame = renderFrame(lastStateEvent, lastUsageEvent, lastSessions);
271
+ notifyFrameListeners(frame);
272
+ }, intervalMs);
273
+ }
274
+ function stopPreviewTimer() {
275
+ if (previewTimer) {
276
+ clearInterval(previewTimer);
277
+ previewTimer = null;
278
+ }
279
+ }
280
+ //# sourceMappingURL=pixoo-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pixoo-bridge.js","sourceRoot":"","sources":["../../src/pixoo/pixoo-bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Pixoo64 Camera System — zoom/pan coordinate transform + zone director.
3
+ *
4
+ * Virtual world is normalized 0~1 in both axes. Camera defines a viewport
5
+ * with center (cx, cy) and zoom level. At zoom=1.0 the full world is visible;
6
+ * at zoom=2.0 only the center quarter is visible but everything is 2× larger.
7
+ *
8
+ * Rendering pipeline:
9
+ * 1. Environment → 64×64 world buffer (pixel coords 0~63)
10
+ * 2. blitWithCamera() → 64×64 output buffer (crop + nearest-neighbor scale)
11
+ * 3. Scaled creatures → output buffer (high-detail grid, camera-aware sizing)
12
+ */
13
+ export interface Camera {
14
+ cx: number;
15
+ cy: number;
16
+ zoom: number;
17
+ }
18
+ export declare const CAMERA_WIDE: Camera;
19
+ export interface CameraZone {
20
+ name: string;
21
+ cx: number;
22
+ cy: number;
23
+ zoom: number;
24
+ duration: number;
25
+ }
26
+ export declare const ZONES: Record<string, CameraZone>;
27
+ /** World (0~1) → screen pixel (0~63). */
28
+ export declare function worldToScreen(wx: number, wy: number, cam: Camera): [number, number];
29
+ /** Screen pixel → world (0~1). */
30
+ export declare function screenToWorld(sx: number, sy: number, cam: Camera): [number, number];
31
+ /** Check if a world-space point is within the camera viewport. */
32
+ export declare function isVisible(wx: number, wy: number, cam: Camera, padding?: number): boolean;
33
+ /** Clamp camera so the viewport stays within world bounds. */
34
+ export declare function clampCamera(cam: Camera): Camera;
35
+ /** Linearly interpolate between two cameras. */
36
+ export declare function lerpCamera(a: Camera, b: Camera, t: number): Camera;
37
+ /** Smoothstep ease-in-out. */
38
+ export declare function easeInOut(t: number): number;
39
+ /**
40
+ * Crop + nearest-neighbor scale from a 64×64 world buffer into a 64×64 output.
41
+ * At zoom 1.0: 1:1 copy. At zoom 2.0: center 32×32 upscaled to fill output.
42
+ */
43
+ export declare function blitWithCamera(world: Uint8Array, output: Uint8Array, cam: Camera): void;
44
+ /** Active creature descriptor for camera targeting. */
45
+ export interface ActiveCreature {
46
+ x: number;
47
+ y: number;
48
+ /** Lower = higher priority. AWAITING=0, PROCESSING=1, ROUTING=2. */
49
+ priority: number;
50
+ }
51
+ /**
52
+ * Advance the camera director by `dt` seconds and return the current camera.
53
+ *
54
+ * 3-mode state machine:
55
+ * idle-cycle: No active creatures → wide(12s) → school(10s) → full-tank(8s)
56
+ * tracking: Single active creature → zoom 2.0 tracking
57
+ * cycling-active: 2+ active creatures → priority-sorted, 6s per creature
58
+ *
59
+ * @param dt seconds since last call (~1.2s at Pixoo push rate)
60
+ * @param activeCreatures creatures with state != idle (octopus PROCESSING/AWAITING, crayfish ROUTING)
61
+ * @param crayfishRouting whether crayfish is actively routing (for legacy compat)
62
+ * @param crayfishPos crayfish world position (if visible)
63
+ * @param schoolPos dynamic tetra school center for idle tracking
64
+ */
65
+ export declare function updateDirector(dt: number, activeCreatures: ActiveCreature[], crayfishRouting: boolean, crayfishPos: {
66
+ x: number;
67
+ y: number;
68
+ } | null, schoolPos: {
69
+ x: number;
70
+ y: number;
71
+ }): Camera;
72
+ /** Jump to a specific zone immediately (for preview). */
73
+ export declare function setZone(zoneName: string): void;
74
+ /** Override camera directly (for preview --zoom). */
75
+ export declare function setOverride(cam: Camera): void;
76
+ /** Reset director state (e.g. on reconnect). */
77
+ export declare function resetDirector(): void;
78
+ /** Get the name of the current camera zone (for change detection). */
79
+ export declare function getCurrentZoneName(): string;
80
+ //# sourceMappingURL=pixoo-camera.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pixoo-camera.d.ts","sourceRoot":"","sources":["../../src/pixoo/pixoo-camera.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,eAAO,MAAM,WAAW,EAAE,MAAwC,CAAC;AAInE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAQ5C,CAAC;AAIF,yCAAyC;AACzC,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAKnF;AAED,kCAAkC;AAClC,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAKnF;AAED,kEAAkE;AAClE,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,SAAO,GAAG,OAAO,CAGtF;AAED,8DAA8D;AAC9D,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAO/C;AAED,gDAAgD;AAChD,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAOlE;AAED,8BAA8B;AAC9B,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAG3C;AAID;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAqBvF;AAID,uDAAuD;AACvD,MAAM,WAAW,cAAc;IAC7B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,oEAAoE;IACpE,QAAQ,EAAE,MAAM,CAAC;CAClB;AAgCD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAC5B,EAAE,EAAE,MAAM,EACV,eAAe,EAAE,cAAc,EAAE,EACjC,eAAe,EAAE,OAAO,EACxB,WAAW,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,EAC5C,SAAS,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAClC,MAAM,CA6GR;AAYD,yDAAyD;AACzD,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAgB9C;AAED,qDAAqD;AACrD,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAc7C;AAED,gDAAgD;AAChD,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAED,sEAAsE;AACtE,wBAAgB,kBAAkB,IAAI,MAAM,CAK3C"}