@beeos-ai/device-agent 0.4.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 (398) hide show
  1. package/.pi/extensions/android-tools.ts +139 -0
  2. package/.pi/skills/.gitkeep +0 -0
  3. package/.pi/skills/ground-mobile-fallback/SKILL.md +50 -0
  4. package/LICENSE +201 -0
  5. package/dist/action/handler.d.ts +9 -0
  6. package/dist/action/handler.js +124 -0
  7. package/dist/action/handler.js.map +1 -0
  8. package/dist/adapters/agent-gateway-client.d.ts +256 -0
  9. package/dist/adapters/agent-gateway-client.js +332 -0
  10. package/dist/adapters/agent-gateway-client.js.map +1 -0
  11. package/dist/adapters/agentcore-inner-loop.d.ts +29 -0
  12. package/dist/adapters/agentcore-inner-loop.js +72 -0
  13. package/dist/adapters/agentcore-inner-loop.js.map +1 -0
  14. package/dist/adapters/agentcore-pi.d.ts +215 -0
  15. package/dist/adapters/agentcore-pi.js +464 -0
  16. package/dist/adapters/agentcore-pi.js.map +1 -0
  17. package/dist/adapters/agentcore-runner.d.ts +70 -0
  18. package/dist/adapters/agentcore-runner.js +255 -0
  19. package/dist/adapters/agentcore-runner.js.map +1 -0
  20. package/dist/adapters/device-android-adb.d.ts +41 -0
  21. package/dist/adapters/device-android-adb.js +279 -0
  22. package/dist/adapters/device-android-adb.js.map +1 -0
  23. package/dist/adapters/device-desktop.d.ts +37 -0
  24. package/dist/adapters/device-desktop.js +101 -0
  25. package/dist/adapters/device-desktop.js.map +1 -0
  26. package/dist/adapters/identity-file.d.ts +30 -0
  27. package/dist/adapters/identity-file.js +50 -0
  28. package/dist/adapters/identity-file.js.map +1 -0
  29. package/dist/adapters/transport-bridge-ws.d.ts +39 -0
  30. package/dist/adapters/transport-bridge-ws.js +49 -0
  31. package/dist/adapters/transport-bridge-ws.js.map +1 -0
  32. package/dist/adapters/vlm-inner-loop.d.ts +88 -0
  33. package/dist/adapters/vlm-inner-loop.js +199 -0
  34. package/dist/adapters/vlm-inner-loop.js.map +1 -0
  35. package/dist/agent-runtime/adapters/base.d.ts +145 -0
  36. package/dist/agent-runtime/adapters/base.js +29 -0
  37. package/dist/agent-runtime/adapters/base.js.map +1 -0
  38. package/dist/agent-runtime/adapters/index.d.ts +17 -0
  39. package/dist/agent-runtime/adapters/index.js +17 -0
  40. package/dist/agent-runtime/adapters/index.js.map +1 -0
  41. package/dist/agent-runtime/adapters/mock.d.ts +44 -0
  42. package/dist/agent-runtime/adapters/mock.js +54 -0
  43. package/dist/agent-runtime/adapters/mock.js.map +1 -0
  44. package/dist/agent-runtime/adapters/openai.d.ts +63 -0
  45. package/dist/agent-runtime/adapters/openai.js +302 -0
  46. package/dist/agent-runtime/adapters/openai.js.map +1 -0
  47. package/dist/agent-runtime/adapters/registry.d.ts +49 -0
  48. package/dist/agent-runtime/adapters/registry.js +129 -0
  49. package/dist/agent-runtime/adapters/registry.js.map +1 -0
  50. package/dist/agent-runtime/adapters/ui-tars.d.ts +13 -0
  51. package/dist/agent-runtime/adapters/ui-tars.js +22 -0
  52. package/dist/agent-runtime/adapters/ui-tars.js.map +1 -0
  53. package/dist/agent-runtime/agent-runner.d.ts +149 -0
  54. package/dist/agent-runtime/agent-runner.js +356 -0
  55. package/dist/agent-runtime/agent-runner.js.map +1 -0
  56. package/dist/agent-runtime/core.d.ts +170 -0
  57. package/dist/agent-runtime/core.js +624 -0
  58. package/dist/agent-runtime/core.js.map +1 -0
  59. package/dist/agent-runtime/index.d.ts +16 -0
  60. package/dist/agent-runtime/index.js +17 -0
  61. package/dist/agent-runtime/index.js.map +1 -0
  62. package/dist/agent-runtime/plan-executor.d.ts +118 -0
  63. package/dist/agent-runtime/plan-executor.js +501 -0
  64. package/dist/agent-runtime/plan-executor.js.map +1 -0
  65. package/dist/agent-runtime/planner/base.d.ts +128 -0
  66. package/dist/agent-runtime/planner/base.js +157 -0
  67. package/dist/agent-runtime/planner/base.js.map +1 -0
  68. package/dist/agent-runtime/planner/llm-planner.d.ts +58 -0
  69. package/dist/agent-runtime/planner/llm-planner.js +112 -0
  70. package/dist/agent-runtime/planner/llm-planner.js.map +1 -0
  71. package/dist/agent-runtime/planner/noop-planner.d.ts +13 -0
  72. package/dist/agent-runtime/planner/noop-planner.js +30 -0
  73. package/dist/agent-runtime/planner/noop-planner.js.map +1 -0
  74. package/dist/agent-runtime/planner/prompts.d.ts +33 -0
  75. package/dist/agent-runtime/planner/prompts.js +165 -0
  76. package/dist/agent-runtime/planner/prompts.js.map +1 -0
  77. package/dist/agent-runtime/reflection.d.ts +81 -0
  78. package/dist/agent-runtime/reflection.js +189 -0
  79. package/dist/agent-runtime/reflection.js.map +1 -0
  80. package/dist/agent-runtime/reflectors/action-reflector.d.ts +97 -0
  81. package/dist/agent-runtime/reflectors/action-reflector.js +233 -0
  82. package/dist/agent-runtime/reflectors/action-reflector.js.map +1 -0
  83. package/dist/agent-runtime/reflectors/policy.d.ts +53 -0
  84. package/dist/agent-runtime/reflectors/policy.js +106 -0
  85. package/dist/agent-runtime/reflectors/policy.js.map +1 -0
  86. package/dist/agent-runtime/reflectors/trajectory-reflector.d.ts +94 -0
  87. package/dist/agent-runtime/reflectors/trajectory-reflector.js +223 -0
  88. package/dist/agent-runtime/reflectors/trajectory-reflector.js.map +1 -0
  89. package/dist/agent-runtime/skills/embedding.d.ts +53 -0
  90. package/dist/agent-runtime/skills/embedding.js +134 -0
  91. package/dist/agent-runtime/skills/embedding.js.map +1 -0
  92. package/dist/agent-runtime/skills/fs-store.d.ts +88 -0
  93. package/dist/agent-runtime/skills/fs-store.js +483 -0
  94. package/dist/agent-runtime/skills/fs-store.js.map +1 -0
  95. package/dist/agent-runtime/skills/index.d.ts +10 -0
  96. package/dist/agent-runtime/skills/index.js +10 -0
  97. package/dist/agent-runtime/skills/index.js.map +1 -0
  98. package/dist/agent-runtime/skills/matcher-evolver.d.ts +88 -0
  99. package/dist/agent-runtime/skills/matcher-evolver.js +110 -0
  100. package/dist/agent-runtime/skills/matcher-evolver.js.map +1 -0
  101. package/dist/agent-runtime/skills/memory-store.d.ts +23 -0
  102. package/dist/agent-runtime/skills/memory-store.js +94 -0
  103. package/dist/agent-runtime/skills/memory-store.js.map +1 -0
  104. package/dist/agent-runtime/skills/normalise.d.ts +40 -0
  105. package/dist/agent-runtime/skills/normalise.js +152 -0
  106. package/dist/agent-runtime/skills/normalise.js.map +1 -0
  107. package/dist/agent-runtime/skills/replay.d.ts +46 -0
  108. package/dist/agent-runtime/skills/replay.js +106 -0
  109. package/dist/agent-runtime/skills/replay.js.map +1 -0
  110. package/dist/agent-runtime/skills/sqlite-store.d.ts +60 -0
  111. package/dist/agent-runtime/skills/sqlite-store.js +234 -0
  112. package/dist/agent-runtime/skills/sqlite-store.js.map +1 -0
  113. package/dist/agent-runtime/skills/types.d.ts +99 -0
  114. package/dist/agent-runtime/skills/types.js +14 -0
  115. package/dist/agent-runtime/skills/types.js.map +1 -0
  116. package/dist/agent.d.ts +110 -0
  117. package/dist/agent.js +162 -0
  118. package/dist/agent.js.map +1 -0
  119. package/dist/api.d.ts +27 -0
  120. package/dist/api.js +48 -0
  121. package/dist/api.js.map +1 -0
  122. package/dist/app/agent-host.d.ts +59 -0
  123. package/dist/app/agent-host.js +263 -0
  124. package/dist/app/agent-host.js.map +1 -0
  125. package/dist/app/device-manager.d.ts +28 -0
  126. package/dist/app/device-manager.js +64 -0
  127. package/dist/app/device-manager.js.map +1 -0
  128. package/dist/app/message-store.d.ts +55 -0
  129. package/dist/app/message-store.js +99 -0
  130. package/dist/app/message-store.js.map +1 -0
  131. package/dist/app/session-manager.d.ts +132 -0
  132. package/dist/app/session-manager.js +350 -0
  133. package/dist/app/session-manager.js.map +1 -0
  134. package/dist/bootstrap.d.ts +94 -0
  135. package/dist/bootstrap.js +459 -0
  136. package/dist/bootstrap.js.map +1 -0
  137. package/dist/chat.d.ts +16 -0
  138. package/dist/chat.js +175 -0
  139. package/dist/chat.js.map +1 -0
  140. package/dist/config/loader.d.ts +77 -0
  141. package/dist/config/loader.js +292 -0
  142. package/dist/config/loader.js.map +1 -0
  143. package/dist/config/schema.d.ts +162 -0
  144. package/dist/config/schema.js +243 -0
  145. package/dist/config/schema.js.map +1 -0
  146. package/dist/core/actions.d.ts +60 -0
  147. package/dist/core/actions.js +120 -0
  148. package/dist/core/actions.js.map +1 -0
  149. package/dist/core/errors.d.ts +8 -0
  150. package/dist/core/errors.js +9 -0
  151. package/dist/core/errors.js.map +1 -0
  152. package/dist/core/screen.d.ts +7 -0
  153. package/dist/core/screen.js +8 -0
  154. package/dist/core/screen.js.map +1 -0
  155. package/dist/core/session.d.ts +42 -0
  156. package/dist/core/session.js +29 -0
  157. package/dist/core/session.js.map +1 -0
  158. package/dist/debug/dump-system-prompt.d.ts +1 -0
  159. package/dist/debug/dump-system-prompt.js +34 -0
  160. package/dist/debug/dump-system-prompt.js.map +1 -0
  161. package/dist/device/android.d.ts +25 -0
  162. package/dist/device/android.js +231 -0
  163. package/dist/device/android.js.map +1 -0
  164. package/dist/device/apps.d.ts +3 -0
  165. package/dist/device/apps.js +77 -0
  166. package/dist/device/apps.js.map +1 -0
  167. package/dist/device/base.d.ts +20 -0
  168. package/dist/device/base.js +2 -0
  169. package/dist/device/base.js.map +1 -0
  170. package/dist/device/ui-xml.d.ts +29 -0
  171. package/dist/device/ui-xml.js +194 -0
  172. package/dist/device/ui-xml.js.map +1 -0
  173. package/dist/fleet/adapters/process/node-process-manager.d.ts +157 -0
  174. package/dist/fleet/adapters/process/node-process-manager.js +664 -0
  175. package/dist/fleet/adapters/process/node-process-manager.js.map +1 -0
  176. package/dist/fleet/adapters/sources/local-adb.d.ts +105 -0
  177. package/dist/fleet/adapters/sources/local-adb.js +353 -0
  178. package/dist/fleet/adapters/sources/local-adb.js.map +1 -0
  179. package/dist/fleet/adapters/sources/remote-adb.d.ts +97 -0
  180. package/dist/fleet/adapters/sources/remote-adb.js +138 -0
  181. package/dist/fleet/adapters/sources/remote-adb.js.map +1 -0
  182. package/dist/fleet/adapters/state/beeos-cli-store.d.ts +72 -0
  183. package/dist/fleet/adapters/state/beeos-cli-store.js +250 -0
  184. package/dist/fleet/adapters/state/beeos-cli-store.js.map +1 -0
  185. package/dist/fleet/adapters/state/port-allocator.d.ts +43 -0
  186. package/dist/fleet/adapters/state/port-allocator.js +173 -0
  187. package/dist/fleet/adapters/state/port-allocator.js.map +1 -0
  188. package/dist/fleet/domain/device.d.ts +138 -0
  189. package/dist/fleet/domain/device.js +49 -0
  190. package/dist/fleet/domain/device.js.map +1 -0
  191. package/dist/fleet/domain/events.d.ts +102 -0
  192. package/dist/fleet/domain/events.js +15 -0
  193. package/dist/fleet/domain/events.js.map +1 -0
  194. package/dist/fleet/domain/fsm.d.ts +122 -0
  195. package/dist/fleet/domain/fsm.js +475 -0
  196. package/dist/fleet/domain/fsm.js.map +1 -0
  197. package/dist/fleet/http/status-client.d.ts +31 -0
  198. package/dist/fleet/http/status-client.js +115 -0
  199. package/dist/fleet/http/status-client.js.map +1 -0
  200. package/dist/fleet/http/status-server.d.ts +64 -0
  201. package/dist/fleet/http/status-server.js +200 -0
  202. package/dist/fleet/http/status-server.js.map +1 -0
  203. package/dist/fleet/index.d.ts +27 -0
  204. package/dist/fleet/index.js +17 -0
  205. package/dist/fleet/index.js.map +1 -0
  206. package/dist/fleet/installer/index.d.ts +12 -0
  207. package/dist/fleet/installer/index.js +13 -0
  208. package/dist/fleet/installer/index.js.map +1 -0
  209. package/dist/fleet/installer/launchd-mac.d.ts +73 -0
  210. package/dist/fleet/installer/launchd-mac.js +291 -0
  211. package/dist/fleet/installer/launchd-mac.js.map +1 -0
  212. package/dist/fleet/installer/service-spec.d.ts +70 -0
  213. package/dist/fleet/installer/service-spec.js +43 -0
  214. package/dist/fleet/installer/service-spec.js.map +1 -0
  215. package/dist/fleet/installer/spawn-env.d.ts +45 -0
  216. package/dist/fleet/installer/spawn-env.js +224 -0
  217. package/dist/fleet/installer/spawn-env.js.map +1 -0
  218. package/dist/fleet/ports/clock.d.ts +19 -0
  219. package/dist/fleet/ports/clock.js +26 -0
  220. package/dist/fleet/ports/clock.js.map +1 -0
  221. package/dist/fleet/ports/device-source.d.ts +28 -0
  222. package/dist/fleet/ports/device-source.js +18 -0
  223. package/dist/fleet/ports/device-source.js.map +1 -0
  224. package/dist/fleet/ports/process-manager.d.ts +110 -0
  225. package/dist/fleet/ports/process-manager.js +27 -0
  226. package/dist/fleet/ports/process-manager.js.map +1 -0
  227. package/dist/fleet/ports/state-registry.d.ts +49 -0
  228. package/dist/fleet/ports/state-registry.js +12 -0
  229. package/dist/fleet/ports/state-registry.js.map +1 -0
  230. package/dist/fleet/supervisor.d.ts +107 -0
  231. package/dist/fleet/supervisor.js +508 -0
  232. package/dist/fleet/supervisor.js.map +1 -0
  233. package/dist/grounding/grounder.d.ts +46 -0
  234. package/dist/grounding/grounder.js +82 -0
  235. package/dist/grounding/grounder.js.map +1 -0
  236. package/dist/inbound/acp/handlers/device.d.ts +43 -0
  237. package/dist/inbound/acp/handlers/device.js +153 -0
  238. package/dist/inbound/acp/handlers/device.js.map +1 -0
  239. package/dist/inbound/acp/handlers/initialize.d.ts +71 -0
  240. package/dist/inbound/acp/handlers/initialize.js +53 -0
  241. package/dist/inbound/acp/handlers/initialize.js.map +1 -0
  242. package/dist/inbound/acp/handlers/models.d.ts +16 -0
  243. package/dist/inbound/acp/handlers/models.js +23 -0
  244. package/dist/inbound/acp/handlers/models.js.map +1 -0
  245. package/dist/inbound/acp/handlers/session.d.ts +51 -0
  246. package/dist/inbound/acp/handlers/session.js +61 -0
  247. package/dist/inbound/acp/handlers/session.js.map +1 -0
  248. package/dist/inbound/acp/handlers/skills.d.ts +8 -0
  249. package/dist/inbound/acp/handlers/skills.js +9 -0
  250. package/dist/inbound/acp/handlers/skills.js.map +1 -0
  251. package/dist/inbound/acp/notifier.d.ts +35 -0
  252. package/dist/inbound/acp/notifier.js +45 -0
  253. package/dist/inbound/acp/notifier.js.map +1 -0
  254. package/dist/inbound/acp/router.d.ts +67 -0
  255. package/dist/inbound/acp/router.js +179 -0
  256. package/dist/inbound/acp/router.js.map +1 -0
  257. package/dist/inbound/cli/fleet-command.d.ts +34 -0
  258. package/dist/inbound/cli/fleet-command.js +792 -0
  259. package/dist/inbound/cli/fleet-command.js.map +1 -0
  260. package/dist/inbound/cli/main.d.ts +38 -0
  261. package/dist/inbound/cli/main.js +364 -0
  262. package/dist/inbound/cli/main.js.map +1 -0
  263. package/dist/inbound/cli/run-command.d.ts +101 -0
  264. package/dist/inbound/cli/run-command.js +405 -0
  265. package/dist/inbound/cli/run-command.js.map +1 -0
  266. package/dist/inbound/cli/skills-command.d.ts +39 -0
  267. package/dist/inbound/cli/skills-command.js +333 -0
  268. package/dist/inbound/cli/skills-command.js.map +1 -0
  269. package/dist/inbound/http/server.d.ts +7 -0
  270. package/dist/inbound/http/server.js +8 -0
  271. package/dist/inbound/http/server.js.map +1 -0
  272. package/dist/index.d.ts +66 -0
  273. package/dist/index.js +48 -0
  274. package/dist/index.js.map +1 -0
  275. package/dist/logger/index.d.ts +37 -0
  276. package/dist/logger/index.js +84 -0
  277. package/dist/logger/index.js.map +1 -0
  278. package/dist/mcp-client/autospawn.d.ts +67 -0
  279. package/dist/mcp-client/autospawn.js +173 -0
  280. package/dist/mcp-client/autospawn.js.map +1 -0
  281. package/dist/mcp-client/client.d.ts +78 -0
  282. package/dist/mcp-client/client.js +168 -0
  283. package/dist/mcp-client/client.js.map +1 -0
  284. package/dist/mcp-client/index.d.ts +7 -0
  285. package/dist/mcp-client/index.js +4 -0
  286. package/dist/mcp-client/index.js.map +1 -0
  287. package/dist/mcp-client/inproc.d.ts +47 -0
  288. package/dist/mcp-client/inproc.js +229 -0
  289. package/dist/mcp-client/inproc.js.map +1 -0
  290. package/dist/mcp-client/runtime.d.ts +34 -0
  291. package/dist/mcp-client/runtime.js +15 -0
  292. package/dist/mcp-client/runtime.js.map +1 -0
  293. package/dist/model/adapters/autoglm.d.ts +31 -0
  294. package/dist/model/adapters/autoglm.js +409 -0
  295. package/dist/model/adapters/autoglm.js.map +1 -0
  296. package/dist/model/adapters/base.d.ts +13 -0
  297. package/dist/model/adapters/base.js +27 -0
  298. package/dist/model/adapters/base.js.map +1 -0
  299. package/dist/model/adapters/guiowl.d.ts +1 -0
  300. package/dist/model/adapters/guiowl.js +253 -0
  301. package/dist/model/adapters/guiowl.js.map +1 -0
  302. package/dist/model/adapters/index.d.ts +6 -0
  303. package/dist/model/adapters/index.js +8 -0
  304. package/dist/model/adapters/index.js.map +1 -0
  305. package/dist/model/adapters/maiui.d.ts +1 -0
  306. package/dist/model/adapters/maiui.js +117 -0
  307. package/dist/model/adapters/maiui.js.map +1 -0
  308. package/dist/model/adapters/qwenvl.d.ts +1 -0
  309. package/dist/model/adapters/qwenvl.js +108 -0
  310. package/dist/model/adapters/qwenvl.js.map +1 -0
  311. package/dist/model/adapters/showui.d.ts +1 -0
  312. package/dist/model/adapters/showui.js +132 -0
  313. package/dist/model/adapters/showui.js.map +1 -0
  314. package/dist/model/adapters/tool-call.d.ts +6 -0
  315. package/dist/model/adapters/tool-call.js +102 -0
  316. package/dist/model/adapters/tool-call.js.map +1 -0
  317. package/dist/model/adapters/uitars.d.ts +1 -0
  318. package/dist/model/adapters/uitars.js +180 -0
  319. package/dist/model/adapters/uitars.js.map +1 -0
  320. package/dist/model/base.d.ts +32 -0
  321. package/dist/model/base.js +2 -0
  322. package/dist/model/base.js.map +1 -0
  323. package/dist/model/client.d.ts +26 -0
  324. package/dist/model/client.js +300 -0
  325. package/dist/model/client.js.map +1 -0
  326. package/dist/model/image/compress.d.ts +53 -0
  327. package/dist/model/image/compress.js +89 -0
  328. package/dist/model/image/compress.js.map +1 -0
  329. package/dist/model/image/transport.d.ts +134 -0
  330. package/dist/model/image/transport.js +154 -0
  331. package/dist/model/image/transport.js.map +1 -0
  332. package/dist/orchestrator-system-prompt.d.ts +6 -0
  333. package/dist/orchestrator-system-prompt.js +81 -0
  334. package/dist/orchestrator-system-prompt.js.map +1 -0
  335. package/dist/pi-context.d.ts +82 -0
  336. package/dist/pi-context.js +62 -0
  337. package/dist/pi-context.js.map +1 -0
  338. package/dist/pi-local-skills.d.ts +17 -0
  339. package/dist/pi-local-skills.js +24 -0
  340. package/dist/pi-local-skills.js.map +1 -0
  341. package/dist/plugins/acp/index.d.ts +46 -0
  342. package/dist/plugins/acp/index.js +111 -0
  343. package/dist/plugins/acp/index.js.map +1 -0
  344. package/dist/plugins/agent-sync/index.d.ts +40 -0
  345. package/dist/plugins/agent-sync/index.js +98 -0
  346. package/dist/plugins/agent-sync/index.js.map +1 -0
  347. package/dist/plugins/http-debug/index.d.ts +30 -0
  348. package/dist/plugins/http-debug/index.js +64 -0
  349. package/dist/plugins/http-debug/index.js.map +1 -0
  350. package/dist/plugins/http-debug/server.d.ts +92 -0
  351. package/dist/plugins/http-debug/server.js +464 -0
  352. package/dist/plugins/http-debug/server.js.map +1 -0
  353. package/dist/ports/agent-core.d.ts +158 -0
  354. package/dist/ports/agent-core.js +2 -0
  355. package/dist/ports/agent-core.js.map +1 -0
  356. package/dist/ports/agent-host.d.ts +125 -0
  357. package/dist/ports/agent-host.js +23 -0
  358. package/dist/ports/agent-host.js.map +1 -0
  359. package/dist/ports/device.d.ts +53 -0
  360. package/dist/ports/device.js +13 -0
  361. package/dist/ports/device.js.map +1 -0
  362. package/dist/ports/identity.d.ts +22 -0
  363. package/dist/ports/identity.js +9 -0
  364. package/dist/ports/identity.js.map +1 -0
  365. package/dist/ports/plugin.d.ts +62 -0
  366. package/dist/ports/plugin.js +35 -0
  367. package/dist/ports/plugin.js.map +1 -0
  368. package/dist/ports/transport.d.ts +32 -0
  369. package/dist/ports/transport.js +12 -0
  370. package/dist/ports/transport.js.map +1 -0
  371. package/dist/ports/vlm.d.ts +59 -0
  372. package/dist/ports/vlm.js +14 -0
  373. package/dist/ports/vlm.js.map +1 -0
  374. package/dist/test-lan-autoglm.d.ts +7 -0
  375. package/dist/test-lan-autoglm.js +46 -0
  376. package/dist/test-lan-autoglm.js.map +1 -0
  377. package/dist/test-mem-breakdown.d.ts +1 -0
  378. package/dist/test-mem-breakdown.js +103 -0
  379. package/dist/test-mem-breakdown.js.map +1 -0
  380. package/dist/test-mem.d.ts +1 -0
  381. package/dist/test-mem.js +60 -0
  382. package/dist/test-mem.js.map +1 -0
  383. package/dist/test-mobile-use.d.ts +1 -0
  384. package/dist/test-mobile-use.js +18 -0
  385. package/dist/test-mobile-use.js.map +1 -0
  386. package/dist/test-screenshot-loop.d.ts +1 -0
  387. package/dist/test-screenshot-loop.js +43 -0
  388. package/dist/test-screenshot-loop.js.map +1 -0
  389. package/dist/test-screenshot.d.ts +1 -0
  390. package/dist/test-screenshot.js +10 -0
  391. package/dist/test-screenshot.js.map +1 -0
  392. package/dist/test-ui-xml-dump.d.ts +15 -0
  393. package/dist/test-ui-xml-dump.js +49 -0
  394. package/dist/test-ui-xml-dump.js.map +1 -0
  395. package/dist/types.d.ts +69 -0
  396. package/dist/types.js +23 -0
  397. package/dist/types.js.map +1 -0
  398. package/package.json +94 -0
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Adapter — `IDeviceSource` implementation that exposes a fixed list of
3
+ * remote ADB endpoints as if they were local devices.
4
+ *
5
+ * Use cases:
6
+ *
7
+ * - Local ReDroid containers (e.g. `127.0.0.1:5555`). The Docker /
8
+ * k8s pod publishes ADB on a TCP port; running `adb connect host:port`
9
+ * once is enough to make `adb track-devices` pick it up, but that
10
+ * extra step is fragile (manual connect, atomic-detach when the
11
+ * container restarts). With `RemoteAdbSource`, the supervisor treats
12
+ * each `(host, port)` as a logical "device with serial" without
13
+ * needing real `adb track-devices` to see it.
14
+ *
15
+ * - Edge sites where a remote `adb server -a -P 5037` exposes USB
16
+ * devices over TCP. Static config is more deterministic than auto
17
+ * discovery.
18
+ *
19
+ * Lifecycle:
20
+ *
21
+ * - On `start()`: for every configured endpoint, optionally run `adb
22
+ * connect host:port` (best-effort; non-fatal on failure) then emit
23
+ * `adb_online` for each known serial. The optional `serial` override
24
+ * in the config is what gets emitted; if absent, the canonical
25
+ * `host:port` form (which is what `adb` itself would report) is
26
+ * used. The serial used here is what flows into `devices.json` for
27
+ * binding lookup, so users should keep them stable.
28
+ *
29
+ * - During run: the source is otherwise quiescent. `RemoteAdbSource`
30
+ * does NOT itself probe whether the remote ADB is alive — that's
31
+ * the spawned `device-mcp-server`'s problem (and the fleet FSM will
32
+ * enter `degraded` if the mcp child can't reach the device).
33
+ *
34
+ * - On `stop()`: best-effort `adb disconnect host:port` for each
35
+ * endpoint that was connected.
36
+ */
37
+ import { spawn } from "node:child_process";
38
+ const noopLogger = {
39
+ debug: () => { },
40
+ info: () => { },
41
+ warn: () => { },
42
+ error: () => { },
43
+ };
44
+ export function resolveEndpoint(ep) {
45
+ const port = ep.port ?? 5555;
46
+ const serial = ep.serial && ep.serial.length > 0 ? ep.serial : `${ep.host}:${port}`;
47
+ return { serial, host: ep.host, port, name: ep.name };
48
+ }
49
+ export class RemoteAdbSource {
50
+ endpoints;
51
+ adb;
52
+ autoConnect;
53
+ logger;
54
+ listeners = new Set();
55
+ online = new Set();
56
+ started = false;
57
+ constructor(opts) {
58
+ this.endpoints = opts.endpoints.map(resolveEndpoint);
59
+ this.adb = opts.adb ?? process.env.BEEOS_ADB_BIN ?? process.env.ADB_PATH ?? "adb";
60
+ this.autoConnect = opts.autoConnect ?? true;
61
+ this.logger = opts.logger ?? noopLogger;
62
+ }
63
+ async start() {
64
+ if (this.started)
65
+ return;
66
+ this.started = true;
67
+ if (this.autoConnect) {
68
+ await Promise.all(this.endpoints.map((ep) => this.connectOne(ep)));
69
+ }
70
+ for (const ep of this.endpoints) {
71
+ this.online.add(ep.serial);
72
+ this.emit({ kind: "adb_online", serial: ep.serial });
73
+ }
74
+ }
75
+ async stop() {
76
+ this.started = false;
77
+ if (this.autoConnect) {
78
+ await Promise.all(this.endpoints.map((ep) => this.disconnectOne(ep)));
79
+ }
80
+ this.online.clear();
81
+ }
82
+ on(listener) {
83
+ this.listeners.add(listener);
84
+ return () => this.listeners.delete(listener);
85
+ }
86
+ snapshot() {
87
+ return [...this.online];
88
+ }
89
+ // ── Internals ────────────────────────────────────────────────────────────
90
+ connectOne(ep) {
91
+ return runAdb(this.adb, ["connect", `${ep.host}:${ep.port}`]).then((r) => {
92
+ if (r.code === 0) {
93
+ this.logger.info("adb connect ok", { endpoint: `${ep.host}:${ep.port}` });
94
+ }
95
+ else {
96
+ this.logger.warn("adb connect failed", {
97
+ endpoint: `${ep.host}:${ep.port}`,
98
+ code: r.code,
99
+ stderr: r.stderr.trim(),
100
+ });
101
+ }
102
+ }, (e) => {
103
+ this.logger.warn("adb connect threw", {
104
+ endpoint: `${ep.host}:${ep.port}`,
105
+ error: String(e),
106
+ });
107
+ });
108
+ }
109
+ disconnectOne(ep) {
110
+ return runAdb(this.adb, ["disconnect", `${ep.host}:${ep.port}`]).then(() => undefined, () => undefined);
111
+ }
112
+ emit(event) {
113
+ for (const l of this.listeners) {
114
+ try {
115
+ l(event);
116
+ }
117
+ catch {
118
+ /* listener faults must not break the source */
119
+ }
120
+ }
121
+ }
122
+ }
123
+ function runAdb(bin, args) {
124
+ return new Promise((resolve, reject) => {
125
+ const child = spawn(bin, args, { stdio: ["ignore", "pipe", "pipe"] });
126
+ let stdout = "";
127
+ let stderr = "";
128
+ child.stdout.on("data", (c) => {
129
+ stdout += c.toString();
130
+ });
131
+ child.stderr.on("data", (c) => {
132
+ stderr += c.toString();
133
+ });
134
+ child.on("error", reject);
135
+ child.on("close", (code) => resolve({ code: code ?? -1, stdout, stderr }));
136
+ });
137
+ }
138
+ //# sourceMappingURL=remote-adb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-adb.js","sourceRoot":"","sources":["../../../../src/fleet/adapters/sources/remote-adb.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AA+C3C,MAAM,UAAU,GAAc;IAC5B,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;IACf,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;IACd,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;IACd,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;CAChB,CAAC;AASF,MAAM,UAAU,eAAe,CAAC,EAAqB;IACnD,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,CAAC;IAC7B,MAAM,MAAM,GAAG,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;IACpF,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;AACxD,CAAC;AAED,MAAM,OAAO,eAAe;IACT,SAAS,CAAqB;IAC9B,GAAG,CAAS;IACZ,WAAW,CAAU;IACrB,MAAM,CAAY;IAClB,SAAS,GAAG,IAAI,GAAG,EAAoB,CAAC;IACxC,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,OAAO,GAAG,KAAK,CAAC;IAExB,YAAY,IAA4B;QACtC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QACrD,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,KAAK,CAAC;QAClF,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC;QAC5C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,UAAU,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QAEpB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACrE,CAAC;QACD,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAChC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACxE,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;IAED,EAAE,CAAC,QAA0B;QAC3B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAED,QAAQ;QACN,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IAED,4EAA4E;IAEpE,UAAU,CAAC,EAAoB;QACrC,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAChE,CAAC,CAAC,EAAE,EAAE;YACJ,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACjB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC5E,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE;oBACrC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,EAAE;oBACjC,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE;iBACxB,CAAC,CAAC;YACL,CAAC;QACH,CAAC,EACD,CAAC,CAAC,EAAE,EAAE;YACJ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE;gBACpC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,EAAE;gBACjC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;aACjB,CAAC,CAAC;QACL,CAAC,CACF,CAAC;IACJ,CAAC;IAEO,aAAa,CAAC,EAAoB;QACxC,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CACnE,GAAG,EAAE,CAAC,SAAS,EACf,GAAG,EAAE,CAAC,SAAS,CAChB,CAAC;IACJ,CAAC;IAEO,IAAI,CAAC,KAAe;QAC1B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACH,CAAC,CAAC,KAAK,CAAC,CAAC;YACX,CAAC;YAAC,MAAM,CAAC;gBACP,+CAA+C;YACjD,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAQD,SAAS,MAAM,CAAC,GAAW,EAAE,IAAc;IACzC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QACtE,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE;YACpC,MAAM,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;QACzB,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE;YACpC,MAAM,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;QACzB,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Adapter — `IStateRegistry` over `~/.beeos/devices.json`.
3
+ *
4
+ * `web/packages/cli` `attach.ts` / `detach.ts` is the sole writer. Fleet only
5
+ * reads. The schema (`{ devices: DeviceEntry[] }`) is documented in
6
+ * `web/packages/cli/src/commands/device/state.ts`; the relevant fields for
7
+ * fleet are: `serial`, `name`, `instance_id`, `key_file`, `http_port`, plus
8
+ * the optional fleet-specific overrides `grace_ms` and `keep_ms`.
9
+ *
10
+ * Watching strategy: `fs.watch` on the file directly is fragile across editors
11
+ * (atomic-rename creates a new inode and the old watcher dies). We instead
12
+ * watch the parent directory and filter for the file name; this also catches
13
+ * the file being created the first time `beeos device attach` runs.
14
+ */
15
+ import type { DeviceBinding, FleetBackend } from "../../domain/device.js";
16
+ import type { IStateRegistry, BindingEventListener } from "../../ports/state-registry.js";
17
+ interface RawDeviceEntry {
18
+ serial: string;
19
+ name: string;
20
+ instance_id: string | null;
21
+ key_file: string;
22
+ http_port: number;
23
+ /** Video backend selection (`scrcpy`/`vnc`/`none`); written by `web/packages/cli`. */
24
+ video_mode?: "scrcpy" | "vnc" | "none";
25
+ /**
26
+ * `device-mcp-server --backend` selection. Canonical: `adb` | `macos` |
27
+ * `linux` | `windows` | `desktop` | `mock-desktop`. Aliases (`android`,
28
+ * `mac`, `win`, `desktop-{linux,windows,macos}`) are also accepted.
29
+ */
30
+ backend?: string;
31
+ /** Fleet-specific overrides (per-device, optional). */
32
+ grace_ms?: number;
33
+ keep_ms?: number;
34
+ }
35
+ export interface BeeosCliStoreOptions {
36
+ /** Path to `devices.json` — defaults to `~/.beeos/devices.json`. */
37
+ filePath?: string;
38
+ /** Polling fallback interval (ms); only used when `fs.watch` is unsupported. */
39
+ pollIntervalMs?: number;
40
+ }
41
+ export declare class BeeosCliStore implements IStateRegistry {
42
+ private readonly filePath;
43
+ private readonly pollIntervalMs;
44
+ private listeners;
45
+ private bindings;
46
+ private watcher;
47
+ private pollHandle;
48
+ private started;
49
+ private debounce;
50
+ constructor(opts?: BeeosCliStoreOptions);
51
+ start(): Promise<void>;
52
+ stop(): Promise<void>;
53
+ reload(): Promise<void>;
54
+ list(): readonly DeviceBinding[];
55
+ get(serial: string): DeviceBinding | null;
56
+ on(listener: BindingEventListener): () => void;
57
+ private beginWatching;
58
+ /** Coalesce rapid bursts of writes (atomic-rename = create + rename). */
59
+ private scheduleReload;
60
+ private applyDiff;
61
+ private emit;
62
+ }
63
+ export declare function defaultDevicesPath(): string;
64
+ export declare function readBindings(filePath: string): Promise<Map<string, DeviceBinding>>;
65
+ export declare function toBinding(entry: RawDeviceEntry): DeviceBinding;
66
+ /**
67
+ * Normalize a raw `backend` string to a canonical `FleetBackend`.
68
+ * Returns `undefined` for missing / unknown values so the fleet
69
+ * supervisor can fall back to its default (`adb`).
70
+ */
71
+ export declare function normalizeBackend(value: unknown): FleetBackend | undefined;
72
+ export {};
@@ -0,0 +1,250 @@
1
+ /**
2
+ * Adapter — `IStateRegistry` over `~/.beeos/devices.json`.
3
+ *
4
+ * `web/packages/cli` `attach.ts` / `detach.ts` is the sole writer. Fleet only
5
+ * reads. The schema (`{ devices: DeviceEntry[] }`) is documented in
6
+ * `web/packages/cli/src/commands/device/state.ts`; the relevant fields for
7
+ * fleet are: `serial`, `name`, `instance_id`, `key_file`, `http_port`, plus
8
+ * the optional fleet-specific overrides `grace_ms` and `keep_ms`.
9
+ *
10
+ * Watching strategy: `fs.watch` on the file directly is fragile across editors
11
+ * (atomic-rename creates a new inode and the old watcher dies). We instead
12
+ * watch the parent directory and filter for the file name; this also catches
13
+ * the file being created the first time `beeos device attach` runs.
14
+ */
15
+ import * as fs from "node:fs";
16
+ import * as path from "node:path";
17
+ import * as os from "node:os";
18
+ export class BeeosCliStore {
19
+ filePath;
20
+ pollIntervalMs;
21
+ listeners = new Set();
22
+ bindings = new Map();
23
+ watcher = null;
24
+ pollHandle = null;
25
+ started = false;
26
+ debounce = null;
27
+ constructor(opts = {}) {
28
+ this.filePath = opts.filePath ?? defaultDevicesPath();
29
+ this.pollIntervalMs = opts.pollIntervalMs ?? 1_500;
30
+ }
31
+ async start() {
32
+ if (this.started)
33
+ return;
34
+ this.started = true;
35
+ await this.reload();
36
+ this.beginWatching();
37
+ }
38
+ async stop() {
39
+ this.started = false;
40
+ if (this.watcher) {
41
+ try {
42
+ this.watcher.close();
43
+ }
44
+ catch {
45
+ /* ignore */
46
+ }
47
+ this.watcher = null;
48
+ }
49
+ if (this.pollHandle) {
50
+ clearInterval(this.pollHandle);
51
+ this.pollHandle = null;
52
+ }
53
+ if (this.debounce) {
54
+ clearTimeout(this.debounce);
55
+ this.debounce = null;
56
+ }
57
+ }
58
+ async reload() {
59
+ const next = await readBindings(this.filePath);
60
+ this.applyDiff(next);
61
+ }
62
+ list() {
63
+ return Array.from(this.bindings.values());
64
+ }
65
+ get(serial) {
66
+ return this.bindings.get(serial) ?? null;
67
+ }
68
+ on(listener) {
69
+ this.listeners.add(listener);
70
+ return () => this.listeners.delete(listener);
71
+ }
72
+ // ── Internals ────────────────────────────────────────────────────────────
73
+ beginWatching() {
74
+ const dir = path.dirname(this.filePath);
75
+ const name = path.basename(this.filePath);
76
+ try {
77
+ fs.mkdirSync(dir, { recursive: true });
78
+ }
79
+ catch {
80
+ /* ignore — likely permission, falls back to polling */
81
+ }
82
+ try {
83
+ this.watcher = fs.watch(dir, (_event, changed) => {
84
+ if (!changed)
85
+ return;
86
+ if (changed.toString() !== name)
87
+ return;
88
+ this.scheduleReload();
89
+ });
90
+ }
91
+ catch {
92
+ // fs.watch may be unsupported (e.g. some FUSE / NFS); fall back to
93
+ // a low-frequency poll. We compare mtime to avoid re-parsing on every
94
+ // tick when nothing changed.
95
+ let lastMtimeMs = 0;
96
+ this.pollHandle = setInterval(() => {
97
+ fs.stat(this.filePath, (err, st) => {
98
+ if (err)
99
+ return;
100
+ if (st.mtimeMs === lastMtimeMs)
101
+ return;
102
+ lastMtimeMs = st.mtimeMs;
103
+ this.scheduleReload();
104
+ });
105
+ }, this.pollIntervalMs);
106
+ if (typeof this.pollHandle === "object" && this.pollHandle?.unref) {
107
+ this.pollHandle.unref();
108
+ }
109
+ }
110
+ }
111
+ /** Coalesce rapid bursts of writes (atomic-rename = create + rename). */
112
+ scheduleReload() {
113
+ if (this.debounce)
114
+ return;
115
+ this.debounce = setTimeout(() => {
116
+ this.debounce = null;
117
+ void this.reload().catch(() => {
118
+ /* swallowed: next event will retry */
119
+ });
120
+ }, 80);
121
+ if (typeof this.debounce === "object" && this.debounce?.unref) {
122
+ this.debounce.unref();
123
+ }
124
+ }
125
+ applyDiff(next) {
126
+ const prev = this.bindings;
127
+ this.bindings = next;
128
+ if (this.listeners.size === 0)
129
+ return;
130
+ for (const [serial, b] of next) {
131
+ const old = prev.get(serial);
132
+ if (!old) {
133
+ this.emit({ kind: "binding_added", serial });
134
+ }
135
+ else if (!shallowEqual(old, b)) {
136
+ this.emit({ kind: "binding_changed", serial });
137
+ }
138
+ }
139
+ for (const serial of prev.keys()) {
140
+ if (!next.has(serial)) {
141
+ this.emit({ kind: "binding_removed", serial });
142
+ }
143
+ }
144
+ }
145
+ emit(event) {
146
+ for (const l of this.listeners) {
147
+ try {
148
+ l(event);
149
+ }
150
+ catch {
151
+ /* listener faults must not break the store */
152
+ }
153
+ }
154
+ }
155
+ }
156
+ // ── Pure helpers (exported for tests) ────────────────────────────────────────
157
+ export function defaultDevicesPath() {
158
+ const override = process.env.BEEOS_HOME;
159
+ const base = override && override.length > 0
160
+ ? override
161
+ : path.join(os.homedir(), ".beeos");
162
+ return path.join(base, "devices.json");
163
+ }
164
+ export async function readBindings(filePath) {
165
+ const out = new Map();
166
+ let raw;
167
+ try {
168
+ raw = await fs.promises.readFile(filePath, "utf8");
169
+ }
170
+ catch {
171
+ return out;
172
+ }
173
+ let parsed;
174
+ try {
175
+ parsed = JSON.parse(raw);
176
+ }
177
+ catch {
178
+ return out;
179
+ }
180
+ if (!parsed || !Array.isArray(parsed.devices))
181
+ return out;
182
+ for (const entry of parsed.devices) {
183
+ if (!entry || typeof entry.serial !== "string" || entry.serial.length === 0)
184
+ continue;
185
+ out.set(entry.serial, toBinding(entry));
186
+ }
187
+ return out;
188
+ }
189
+ export function toBinding(entry) {
190
+ return {
191
+ serial: entry.serial,
192
+ name: entry.name ?? entry.serial,
193
+ instanceId: typeof entry.instance_id === "string" && entry.instance_id.length > 0
194
+ ? entry.instance_id
195
+ : null,
196
+ keyFile: entry.key_file ?? "",
197
+ httpPort: typeof entry.http_port === "number" ? entry.http_port : undefined,
198
+ videoMode: entry.video_mode === "scrcpy" ||
199
+ entry.video_mode === "vnc" ||
200
+ entry.video_mode === "none"
201
+ ? entry.video_mode
202
+ : undefined,
203
+ backend: normalizeBackend(entry.backend),
204
+ graceMs: typeof entry.grace_ms === "number" ? entry.grace_ms : undefined,
205
+ keepMs: typeof entry.keep_ms === "number" ? entry.keep_ms : undefined,
206
+ };
207
+ }
208
+ /**
209
+ * Normalize a raw `backend` string to a canonical `FleetBackend`.
210
+ * Returns `undefined` for missing / unknown values so the fleet
211
+ * supervisor can fall back to its default (`adb`).
212
+ */
213
+ export function normalizeBackend(value) {
214
+ if (typeof value !== "string")
215
+ return undefined;
216
+ switch (value) {
217
+ case "adb":
218
+ case "android":
219
+ return "adb";
220
+ case "macos":
221
+ case "mac":
222
+ case "desktop-macos":
223
+ return "macos";
224
+ case "linux":
225
+ case "desktop-linux":
226
+ return "linux";
227
+ case "windows":
228
+ case "win":
229
+ case "desktop-windows":
230
+ return "windows";
231
+ case "desktop":
232
+ return "desktop";
233
+ case "mock-desktop":
234
+ return "mock-desktop";
235
+ default:
236
+ return undefined;
237
+ }
238
+ }
239
+ function shallowEqual(a, b) {
240
+ return (a.serial === b.serial &&
241
+ a.name === b.name &&
242
+ a.instanceId === b.instanceId &&
243
+ a.keyFile === b.keyFile &&
244
+ a.httpPort === b.httpPort &&
245
+ a.videoMode === b.videoMode &&
246
+ a.backend === b.backend &&
247
+ a.graceMs === b.graceMs &&
248
+ a.keepMs === b.keepMs);
249
+ }
250
+ //# sourceMappingURL=beeos-cli-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"beeos-cli-store.js","sourceRoot":"","sources":["../../../../src/fleet/adapters/state/beeos-cli-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Adapter — sticky port allocator backed by `~/.beeos/fleet.json`.
3
+ *
4
+ * Sticky semantics: once a serial is mapped to a port, that mapping is kept
5
+ * indefinitely so users can bookmark / paste the URL. The allocator only
6
+ * forgets a mapping if the persisted port collides with another listener at
7
+ * acquire time — then we probe the next free port within the configured
8
+ * range.
9
+ *
10
+ * Range: configurable, defaults to `[7900, 7999]` (matches the historical
11
+ * device-mcp-server default of 7900). 100 slots × per-laptop scale is plenty
12
+ * even for power users running 30 devices.
13
+ */
14
+ import type { IPortAllocator } from "../../ports/state-registry.js";
15
+ export interface PortAllocatorOptions {
16
+ filePath?: string;
17
+ basePort?: number;
18
+ rangeSize?: number;
19
+ /** Probe-port helper override (tests). */
20
+ probe?: (port: number) => Promise<boolean>;
21
+ }
22
+ export declare class StickyPortAllocator implements IPortAllocator {
23
+ private readonly filePath;
24
+ private readonly basePort;
25
+ private readonly rangeSize;
26
+ private readonly probe;
27
+ private map;
28
+ private writeQueue;
29
+ private started;
30
+ constructor(opts?: PortAllocatorOptions);
31
+ start(): Promise<void>;
32
+ stop(): Promise<void>;
33
+ acquire(serial: string): Promise<number>;
34
+ release(serial: string): Promise<void>;
35
+ /** Test/maintenance helper: drop the persisted mapping for a serial. */
36
+ forget(serial: string): void;
37
+ snapshot(): ReadonlyMap<string, number>;
38
+ private hintFor;
39
+ private findAvailable;
40
+ private load;
41
+ private flush;
42
+ }
43
+ export declare function defaultFleetStatePath(): string;