@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
@@ -0,0 +1,271 @@
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
+ const W = 64;
14
+ export const CAMERA_WIDE = { cx: 0.5, cy: 0.5, zoom: 1.0 };
15
+ export const ZONES = {
16
+ wide: { name: 'wide', cx: 0.5, cy: 0.5, zoom: 1.0, duration: 10 },
17
+ 'pan-left': { name: 'pan-left', cx: 0.35, cy: 0.52, zoom: 1.15, duration: 8 },
18
+ 'pan-right': { name: 'pan-right', cx: 0.65, cy: 0.52, zoom: 1.15, duration: 8 },
19
+ octopus: { name: 'octopus', cx: 0.38, cy: 0.45, zoom: 3.2, duration: 15 },
20
+ crayfish: { name: 'crayfish', cx: 0.72, cy: 0.55, zoom: 3.2, duration: 15 },
21
+ school: { name: 'school', cx: 0.5, cy: 0.40, zoom: 1.6, duration: 10 },
22
+ 'full-tank': { name: 'full-tank', cx: 0.5, cy: 0.5, zoom: 1.0, duration: 8 },
23
+ };
24
+ // ===== Coordinate Transforms =====
25
+ /** World (0~1) → screen pixel (0~63). */
26
+ export function worldToScreen(wx, wy, cam) {
27
+ return [
28
+ (wx - cam.cx) * W * cam.zoom + W / 2,
29
+ (wy - cam.cy) * W * cam.zoom + W / 2,
30
+ ];
31
+ }
32
+ /** Screen pixel → world (0~1). */
33
+ export function screenToWorld(sx, sy, cam) {
34
+ return [
35
+ (sx - W / 2) / (W * cam.zoom) + cam.cx,
36
+ (sy - W / 2) / (W * cam.zoom) + cam.cy,
37
+ ];
38
+ }
39
+ /** Check if a world-space point is within the camera viewport. */
40
+ export function isVisible(wx, wy, cam, padding = 0.05) {
41
+ const halfView = 0.5 / cam.zoom + padding;
42
+ return Math.abs(wx - cam.cx) <= halfView && Math.abs(wy - cam.cy) <= halfView;
43
+ }
44
+ /** Clamp camera so the viewport stays within world bounds. */
45
+ export function clampCamera(cam) {
46
+ const halfView = 0.5 / cam.zoom;
47
+ return {
48
+ cx: Math.max(halfView, Math.min(1 - halfView, cam.cx)),
49
+ cy: Math.max(halfView, Math.min(1 - halfView, cam.cy)),
50
+ zoom: cam.zoom,
51
+ };
52
+ }
53
+ /** Linearly interpolate between two cameras. */
54
+ export function lerpCamera(a, b, t) {
55
+ const s = Math.max(0, Math.min(1, t));
56
+ return {
57
+ cx: a.cx + (b.cx - a.cx) * s,
58
+ cy: a.cy + (b.cy - a.cy) * s,
59
+ zoom: a.zoom + (b.zoom - a.zoom) * s,
60
+ };
61
+ }
62
+ /** Smoothstep ease-in-out. */
63
+ export function easeInOut(t) {
64
+ const s = Math.max(0, Math.min(1, t));
65
+ return s * s * (3 - 2 * s);
66
+ }
67
+ // ===== Blit: world buffer → output with camera transform =====
68
+ /**
69
+ * Crop + nearest-neighbor scale from a 64×64 world buffer into a 64×64 output.
70
+ * At zoom 1.0: 1:1 copy. At zoom 2.0: center 32×32 upscaled to fill output.
71
+ */
72
+ export function blitWithCamera(world, output, cam) {
73
+ const cxPx = cam.cx * W;
74
+ const cyPx = cam.cy * W;
75
+ const viewSize = W / cam.zoom;
76
+ const left = cxPx - viewSize / 2;
77
+ const top = cyPx - viewSize / 2;
78
+ for (let sy = 0; sy < W; sy++) {
79
+ for (let sx = 0; sx < W; sx++) {
80
+ const wx = Math.floor(left + sx / cam.zoom);
81
+ const wy = Math.floor(top + sy / cam.zoom);
82
+ const dstIdx = (sy * W + sx) * 3;
83
+ if (wx >= 0 && wx < W && wy >= 0 && wy < W) {
84
+ const srcIdx = (wy * W + wx) * 3;
85
+ output[dstIdx] = world[srcIdx];
86
+ output[dstIdx + 1] = world[srcIdx + 1];
87
+ output[dstIdx + 2] = world[srcIdx + 2];
88
+ }
89
+ // out-of-bounds stays black (Uint8Array zero-init)
90
+ }
91
+ }
92
+ }
93
+ const TRANSITION_SEC = 8; // ease-in-out zone transition (8s for smooth camera at ~1fps)
94
+ const ACTIVE_DWELL_SEC = 6; // seconds per creature in cycling-active mode
95
+ let ds = null;
96
+ // Idle cycle: wide overview → left pan (octopus area) → wide → right pan (crayfish area)
97
+ const IDLE_CYCLE = [
98
+ ZONES.wide, ZONES['pan-left'], ZONES.wide, ZONES['pan-right'],
99
+ ];
100
+ /**
101
+ * Advance the camera director by `dt` seconds and return the current camera.
102
+ *
103
+ * 3-mode state machine:
104
+ * idle-cycle: No active creatures → wide(12s) → school(10s) → full-tank(8s)
105
+ * tracking: Single active creature → zoom 2.0 tracking
106
+ * cycling-active: 2+ active creatures → priority-sorted, 6s per creature
107
+ *
108
+ * @param dt seconds since last call (~1.2s at Pixoo push rate)
109
+ * @param activeCreatures creatures with state != idle (octopus PROCESSING/AWAITING, crayfish ROUTING)
110
+ * @param crayfishRouting whether crayfish is actively routing (for legacy compat)
111
+ * @param crayfishPos crayfish world position (if visible)
112
+ * @param schoolPos dynamic tetra school center for idle tracking
113
+ */
114
+ export function updateDirector(dt, activeCreatures, crayfishRouting, crayfishPos, schoolPos) {
115
+ if (!ds) {
116
+ ds = {
117
+ mode: 'idle-cycle',
118
+ camera: { ...CAMERA_WIDE },
119
+ idleCycle: IDLE_CYCLE,
120
+ idleIndex: 0,
121
+ currentZone: ZONES.wide,
122
+ targetZone: ZONES.wide,
123
+ zoneTimer: 0,
124
+ transitionT: 0,
125
+ transitioning: false,
126
+ activeIndex: 0,
127
+ activeDwell: 0,
128
+ };
129
+ }
130
+ // Sort active creatures by priority (lower = more important)
131
+ const sorted = [...activeCreatures].sort((a, b) => a.priority - b.priority);
132
+ // --- Determine mode ---
133
+ const prevMode = ds.mode;
134
+ if (sorted.length === 0) {
135
+ ds.mode = 'idle-cycle';
136
+ }
137
+ else if (sorted.length === 1) {
138
+ ds.mode = 'tracking';
139
+ }
140
+ else {
141
+ ds.mode = 'cycling-active';
142
+ }
143
+ // Reset on mode transition
144
+ if (prevMode !== ds.mode) {
145
+ if (ds.mode === 'idle-cycle') {
146
+ ds.idleIndex = 0;
147
+ ds.currentZone = ZONES.wide;
148
+ ds.targetZone = ZONES.wide;
149
+ ds.zoneTimer = 0;
150
+ ds.transitionT = 0;
151
+ ds.transitioning = false;
152
+ }
153
+ else if (ds.mode === 'cycling-active') {
154
+ ds.activeIndex = 0;
155
+ ds.activeDwell = 0;
156
+ }
157
+ }
158
+ // --- Priority interrupt: AWAITING (priority 0) jumps to front ---
159
+ if (ds.mode === 'cycling-active' && sorted.length > 0 && sorted[0].priority === 0) {
160
+ // If current target isn't the highest-priority creature, snap to it
161
+ if (ds.activeIndex !== 0) {
162
+ ds.activeIndex = 0;
163
+ ds.activeDwell = 0;
164
+ }
165
+ }
166
+ // --- Execute mode ---
167
+ switch (ds.mode) {
168
+ case 'idle-cycle': {
169
+ const cycle = IDLE_CYCLE;
170
+ if (ds.transitioning) {
171
+ ds.transitionT += dt / TRANSITION_SEC;
172
+ if (ds.transitionT >= 1) {
173
+ ds.transitionT = 1;
174
+ ds.transitioning = false;
175
+ ds.currentZone = ds.targetZone;
176
+ ds.zoneTimer = 0;
177
+ }
178
+ const t = easeInOut(ds.transitionT);
179
+ const fromCam = resolveIdleZoneCamera(ds.currentZone, schoolPos);
180
+ const toCam = resolveIdleZoneCamera(ds.targetZone, schoolPos);
181
+ ds.camera = lerpCamera(fromCam, toCam, t);
182
+ }
183
+ else {
184
+ ds.zoneTimer += dt;
185
+ const zoneCam = resolveIdleZoneCamera(ds.currentZone, schoolPos);
186
+ ds.camera = lerpCamera(ds.camera, zoneCam, Math.min(1, dt * 2));
187
+ if (ds.zoneTimer >= ds.currentZone.duration) {
188
+ ds.idleIndex = (ds.idleIndex + 1) % cycle.length;
189
+ ds.targetZone = cycle[ds.idleIndex];
190
+ ds.transitioning = true;
191
+ ds.transitionT = 0;
192
+ }
193
+ }
194
+ break;
195
+ }
196
+ case 'tracking': {
197
+ const c = sorted[0];
198
+ const yOff = c.priority === 0 ? -0.05 : 0; // AWAITING: shift up for "?" bubble
199
+ const target = { cx: c.x, cy: c.y + yOff, zoom: 3.2 };
200
+ ds.camera = lerpCamera(ds.camera, target, Math.min(1, dt * 0.8));
201
+ break;
202
+ }
203
+ case 'cycling-active': {
204
+ ds.activeDwell += dt;
205
+ if (ds.activeDwell >= ACTIVE_DWELL_SEC) {
206
+ ds.activeIndex = (ds.activeIndex + 1) % sorted.length;
207
+ ds.activeDwell = 0;
208
+ }
209
+ const c = sorted[ds.activeIndex % sorted.length];
210
+ const yOff = c.priority === 0 ? -0.05 : 0;
211
+ const target = { cx: c.x, cy: c.y + yOff, zoom: 3.2 };
212
+ ds.camera = lerpCamera(ds.camera, target, Math.min(1, dt * 0.8));
213
+ break;
214
+ }
215
+ }
216
+ return clampCamera(ds.camera);
217
+ }
218
+ function resolveIdleZoneCamera(zone, schoolPos) {
219
+ if (zone.name === 'school' && schoolPos) {
220
+ return { cx: schoolPos.x, cy: schoolPos.y, zoom: zone.zoom };
221
+ }
222
+ return { cx: zone.cx, cy: zone.cy, zoom: zone.zoom };
223
+ }
224
+ /** Jump to a specific zone immediately (for preview). */
225
+ export function setZone(zoneName) {
226
+ const zone = ZONES[zoneName];
227
+ if (!zone)
228
+ return;
229
+ ds = {
230
+ mode: 'idle-cycle',
231
+ camera: { cx: zone.cx, cy: zone.cy, zoom: zone.zoom },
232
+ idleCycle: IDLE_CYCLE,
233
+ idleIndex: IDLE_CYCLE.findIndex(z => z.name === zoneName) ?? 0,
234
+ currentZone: zone,
235
+ targetZone: zone,
236
+ zoneTimer: 0,
237
+ transitionT: 0,
238
+ transitioning: false,
239
+ activeIndex: 0,
240
+ activeDwell: 0,
241
+ };
242
+ }
243
+ /** Override camera directly (for preview --zoom). */
244
+ export function setOverride(cam) {
245
+ ds = {
246
+ mode: 'idle-cycle',
247
+ camera: { ...cam },
248
+ idleCycle: IDLE_CYCLE,
249
+ idleIndex: 0,
250
+ currentZone: ZONES.wide,
251
+ targetZone: ZONES.wide,
252
+ zoneTimer: 0,
253
+ transitionT: 0,
254
+ transitioning: false,
255
+ activeIndex: 0,
256
+ activeDwell: 0,
257
+ };
258
+ }
259
+ /** Reset director state (e.g. on reconnect). */
260
+ export function resetDirector() {
261
+ ds = null;
262
+ }
263
+ /** Get the name of the current camera zone (for change detection). */
264
+ export function getCurrentZoneName() {
265
+ if (!ds)
266
+ return 'wide';
267
+ return ds.transitioning
268
+ ? `${ds.currentZone.name}→${ds.targetZone.name}`
269
+ : ds.currentZone.name;
270
+ }
271
+ //# sourceMappingURL=pixoo-camera.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pixoo-camera.js","sourceRoot":"","sources":["../../src/pixoo/pixoo-camera.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Pixoo64 HTTP Client — direct REST API for Divoom Pixoo64 LED matrix.
3
+ *
4
+ * Zero dependencies: uses Node 18+ native fetch().
5
+ * All requests have 2s timeout and fail silently (display is non-critical).
6
+ *
7
+ * Frame format: 64×64 RGB = 12,288 bytes → base64 encoded.
8
+ *
9
+ * CRITICAL: PicID must be strictly incrementing — device silently ignores
10
+ * frames with non-sequential IDs (returns error_code:0 but doesn't update display).
11
+ * GetHttpGifId syncs counter; ResetHttpGifId resets to 0 (use sparingly — may crash firmware).
12
+ */
13
+ /** Clear cached static PicID for a device (call when device reboots to re-sync). */
14
+ export declare function clearStaticPicId(ip: string): void;
15
+ /** Register a callback for device online/offline transitions. */
16
+ export declare function onDeviceStatusChange(cb: (ip: string, online: boolean) => void): void;
17
+ /** Clean up probe timer. Call on shutdown. */
18
+ export declare function stopProbeTimer(): void;
19
+ /**
20
+ * Wake recovery — clear all PicID caches and circuit breaker state.
21
+ * Devices may have rebooted during sleep, so all cached state is stale.
22
+ */
23
+ export declare function handlePixooWake(): void;
24
+ /** Get circuit breaker status for a device. */
25
+ export declare function getDeviceBackoffStatus(ip: string): {
26
+ failures: number;
27
+ backedOff: boolean;
28
+ nextProbeMs: number;
29
+ };
30
+ /**
31
+ * Push a single 64×64 RGB frame to the device.
32
+ * PicID increments per frame so the device renders each new image.
33
+ * @param buffer - 12,288 bytes (64 * 64 * 3) raw RGB
34
+ */
35
+ export declare function pushFrame(ip: string, buffer: Uint8Array): Promise<boolean>;
36
+ /**
37
+ * Send scrolling text overlay (device-native font, supports long text).
38
+ * Up to 20 simultaneous text items supported by device.
39
+ * @param textId - 0-19, used to update/remove specific text
40
+ * @param color - hex color string e.g. "#22c55e"
41
+ * @param speed - scroll speed 0-100 (default 50)
42
+ */
43
+ export declare function sendScrollText(ip: string, textId: number, text: string, color: string, speed?: number): Promise<boolean>;
44
+ /** Clear all text overlays. */
45
+ export declare function clearText(ip: string): Promise<boolean>;
46
+ /** Set display brightness (0-100). */
47
+ export declare function setBrightness(ip: string, value: number): Promise<boolean>;
48
+ /** Query the device's current PicID counter. Returns 0 on failure. */
49
+ export declare function getHttpGifId(ip: string): Promise<number>;
50
+ /** Reset the PicID counter to prevent device lockup. */
51
+ export declare function resetPicId(ip: string): Promise<boolean>;
52
+ /** Switch device to the custom channel that shows SendHttpGif content. */
53
+ export declare function switchToCustomChannel(ip: string): Promise<boolean>;
54
+ /**
55
+ * Get device configuration (also serves as a connectivity test).
56
+ * Returns null on failure.
57
+ */
58
+ export declare function getDeviceConfig(ip: string): Promise<Record<string, unknown> | null>;
59
+ /**
60
+ * Discover Pixoo devices via Divoom cloud API.
61
+ * Falls back gracefully if cloud is unreachable.
62
+ */
63
+ export declare function discoverDevices(): Promise<Array<{
64
+ name: string;
65
+ ip: string;
66
+ }>>;
67
+ //# sourceMappingURL=pixoo-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pixoo-client.d.ts","sourceRoot":"","sources":["../../src/pixoo/pixoo-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAgBH,oFAAoF;AACpF,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAGjD;AAmBD,iEAAiE;AACjE,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,CAEpF;AAoED,8CAA8C;AAC9C,wBAAgB,cAAc,IAAI,IAAI,CAKrC;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAUtC;AAED,+CAA+C;AAC/C,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAUhH;AA8DD;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CA0ChF;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,SAAK,GAClE,OAAO,CAAC,OAAO,CAAC,CAkBlB;AAED,+BAA+B;AAC/B,wBAAsB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE5D;AAED,sCAAsC;AACtC,wBAAsB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAK/E;AAED,sEAAsE;AACtE,wBAAsB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAO9D;AAED,wDAAwD;AACxD,wBAAsB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE7D;AAED,0EAA0E;AAC1E,wBAAsB,qBAAqB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGxE;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAMzF;AAED;;;GAGG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAkBpF"}