@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,101 @@
1
+ /**
2
+ * Adapter — desktop mock device.
3
+ *
4
+ * Equivalent to the Python `mode=desktop` runtime: returns a fixed canvas,
5
+ * records every action into an in-memory log, and never touches the host.
6
+ *
7
+ * Used for:
8
+ * - local UI development without ADB
9
+ * - unit testing the application/inbound layers
10
+ * - smoke-testing CI without a real device
11
+ */
12
+ import { randomBytes } from "node:crypto";
13
+ export class DesktopAdapter {
14
+ actions = [];
15
+ width;
16
+ height;
17
+ name;
18
+ osType;
19
+ connected = false;
20
+ constructor(opts = {}) {
21
+ this.width = opts.width ?? 1920;
22
+ this.height = opts.height ?? 1080;
23
+ this.name = opts.name ?? "Desktop (mock)";
24
+ this.osType = opts.os ?? defaultDesktopOs();
25
+ }
26
+ async connect() {
27
+ this.connected = true;
28
+ }
29
+ async disconnect() {
30
+ this.connected = false;
31
+ }
32
+ async getInfo() {
33
+ // ACP wire v2: per-action capability vocabulary. Desktop mock supports
34
+ // visual capture + tap/swipe/type but no Android-specific keys/install.
35
+ const capabilities = [
36
+ "screenshot",
37
+ "tap",
38
+ "swipe",
39
+ "type",
40
+ "shell",
41
+ ];
42
+ return {
43
+ type: this.osType,
44
+ name: this.name,
45
+ os: prettyOsName(this.osType),
46
+ width: this.width,
47
+ height: this.height,
48
+ capabilities,
49
+ osVersion: "mock",
50
+ density: 96,
51
+ metadata: { currentApp: "Mock", connected: String(this.connected) },
52
+ };
53
+ }
54
+ async capture() {
55
+ return {
56
+ width: this.width,
57
+ height: this.height,
58
+ imageBase64: TINY_PNG_BASE64,
59
+ imageFormat: "png",
60
+ uiXml: null,
61
+ currentApp: "Mock",
62
+ capturedAt: Date.now(),
63
+ };
64
+ }
65
+ async getUiTree() {
66
+ return [];
67
+ }
68
+ async apply(action) {
69
+ this.actions.push(action);
70
+ }
71
+ async install(_path) {
72
+ this.actions.push({ kind: "shell", command: `install:${_path}` });
73
+ }
74
+ async shell(command) {
75
+ this.actions.push({ kind: "shell", command });
76
+ return `mock-stdout:${randomBytes(4).toString("hex")}`;
77
+ }
78
+ }
79
+ function defaultDesktopOs() {
80
+ switch (process.platform) {
81
+ case "darwin":
82
+ return "desktop-macos";
83
+ case "win32":
84
+ return "desktop-windows";
85
+ default:
86
+ return "desktop-linux";
87
+ }
88
+ }
89
+ function prettyOsName(t) {
90
+ switch (t) {
91
+ case "desktop-macos":
92
+ return "macOS";
93
+ case "desktop-windows":
94
+ return "Windows";
95
+ case "desktop-linux":
96
+ return "Linux";
97
+ }
98
+ }
99
+ // A 1x1 transparent PNG. Constant so unit tests get deterministic output.
100
+ const TINY_PNG_BASE64 = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=";
101
+ //# sourceMappingURL=device-desktop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-desktop.js","sourceRoot":"","sources":["../../src/adapters/device-desktop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Adapter — file-backed device identity (Ed25519).
3
+ *
4
+ * On-disk format follows the SDK convention used by `@beeos-ai/bridge-client`:
5
+ * { "publicKey": "<base64>", "privateKey": "<base64>" }
6
+ *
7
+ * Default location: `~/.beeos/<id>.key`. The SDK's `loadKeyPair` is also
8
+ * permissive about a raw base64 32-byte private-key seed (the format used by
9
+ * K8s Secret mounts in production), so existing identity files keep working.
10
+ */
11
+ import type { IDeviceIdentity, KeyPair } from "../ports/identity.js";
12
+ export interface FileIdentityOptions {
13
+ /**
14
+ * Absolute path to the key file.
15
+ * If undefined, defaults to `~/.beeos/<id ?? "device-agent">.key`.
16
+ */
17
+ keyFile?: string;
18
+ /** Used to compute the default file name when `keyFile` is undefined. */
19
+ id?: string;
20
+ }
21
+ export declare class FileIdentity implements IDeviceIdentity {
22
+ private readonly keyFile;
23
+ private cached;
24
+ constructor(opts?: FileIdentityOptions);
25
+ /** Path of the underlying file (useful for diagnostics). */
26
+ get path(): string;
27
+ ensure(): Promise<KeyPair>;
28
+ publicKeyBase64(): Promise<string>;
29
+ fingerprint(): Promise<string>;
30
+ }
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Adapter — file-backed device identity (Ed25519).
3
+ *
4
+ * On-disk format follows the SDK convention used by `@beeos-ai/bridge-client`:
5
+ * { "publicKey": "<base64>", "privateKey": "<base64>" }
6
+ *
7
+ * Default location: `~/.beeos/<id>.key`. The SDK's `loadKeyPair` is also
8
+ * permissive about a raw base64 32-byte private-key seed (the format used by
9
+ * K8s Secret mounts in production), so existing identity files keep working.
10
+ */
11
+ import * as fs from "node:fs";
12
+ import * as os from "node:os";
13
+ import * as path from "node:path";
14
+ import { fingerprint, loadKeyPair, publicKeyFromPrivate, } from "@beeos-ai/bridge-client";
15
+ export class FileIdentity {
16
+ keyFile;
17
+ cached = null;
18
+ constructor(opts = {}) {
19
+ this.keyFile =
20
+ opts.keyFile ??
21
+ path.join(os.homedir(), ".beeos", `${opts.id ?? "device-agent"}.key`);
22
+ }
23
+ /** Path of the underlying file (useful for diagnostics). */
24
+ get path() {
25
+ return this.keyFile;
26
+ }
27
+ async ensure() {
28
+ if (this.cached)
29
+ return this.cached;
30
+ const dir = path.dirname(this.keyFile);
31
+ if (!fs.existsSync(dir))
32
+ fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
33
+ // loadKeyPair generates + persists a fresh keypair when the file is missing.
34
+ const kp = loadKeyPair(this.keyFile);
35
+ if (!kp.publicKey || kp.publicKey.length === 0) {
36
+ kp.publicKey = publicKeyFromPrivate(kp.privateKey);
37
+ }
38
+ this.cached = kp;
39
+ return kp;
40
+ }
41
+ async publicKeyBase64() {
42
+ const kp = await this.ensure();
43
+ return Buffer.from(kp.publicKey).toString("base64");
44
+ }
45
+ async fingerprint() {
46
+ const kp = await this.ensure();
47
+ return fingerprint(kp.publicKey);
48
+ }
49
+ }
50
+ //# sourceMappingURL=identity-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity-file.js","sourceRoot":"","sources":["../../src/adapters/identity-file.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EACL,WAAW,EACX,WAAW,EACX,oBAAoB,GACrB,MAAM,yBAAyB,CAAC;AAajC,MAAM,OAAO,YAAY;IACN,OAAO,CAAS;IACzB,MAAM,GAAmB,IAAI,CAAC;IAEtC,YAAY,OAA4B,EAAE;QACxC,IAAI,CAAC,OAAO;YACV,IAAI,CAAC,OAAO;gBACZ,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,cAAc,MAAM,CAAC,CAAC;IAC1E,CAAC;IAED,4DAA4D;IAC5D,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,MAAM;QACV,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC;QACpC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7E,6EAA6E;QAC7E,MAAM,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,CAAC,EAAE,CAAC,SAAS,IAAI,EAAE,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/C,EAAE,CAAC,SAAS,GAAG,oBAAoB,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QAC/B,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,WAAW;QACf,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QAC/B,OAAO,WAAW,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC;CACF"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Adapter — Bridge WebSocket transport.
3
+ *
4
+ * Wraps `@beeos-ai/bridge-client` (Ed25519 `agent_auth` handshake +
5
+ * auto-reconnect + heartbeat) and exposes the slim `IBridgeTransport` port
6
+ * the inbound ACP layer needs (raw string send + 4 events).
7
+ *
8
+ * Why a thin wrapper rather than re-using BridgeClient directly?
9
+ * - keeps the application/inbound layers free from `events.EventEmitter`
10
+ * typing leaks and lets us swap in an in-memory transport for tests
11
+ * - exposes a stable surface even if the SDK adds new events
12
+ */
13
+ import { type BridgeClientOptions } from "@beeos-ai/bridge-client";
14
+ import type { IBridgeTransport } from "../ports/transport.js";
15
+ export interface BridgeWsTransportOptions {
16
+ /** Bridge base URL, e.g. `wss://bridge.beeos.ai:18443`. */
17
+ bridgeUrl: string;
18
+ /** ACP service name registered on Bridge (default `acp`). */
19
+ service?: string;
20
+ /** Path to identity key file or pre-loaded keys. */
21
+ keyFile?: string;
22
+ privateKey?: Uint8Array;
23
+ publicKey?: Uint8Array;
24
+ /** Override reconnect / heartbeat policy. */
25
+ reconnect?: BridgeClientOptions["reconnect"];
26
+ heartbeat?: BridgeClientOptions["heartbeat"];
27
+ proxy?: string;
28
+ }
29
+ export declare class BridgeWsTransport implements IBridgeTransport {
30
+ private readonly client;
31
+ constructor(opts: BridgeWsTransportOptions);
32
+ connect(): Promise<void>;
33
+ send(data: string): Promise<void>;
34
+ close(): Promise<void>;
35
+ on(event: "connected", handler: () => void): void;
36
+ on(event: "disconnected", handler: (reason: string) => void): void;
37
+ on(event: "message", handler: (data: string) => void | Promise<void>): void;
38
+ on(event: "error", handler: (err: Error) => void): void;
39
+ }
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Adapter — Bridge WebSocket transport.
3
+ *
4
+ * Wraps `@beeos-ai/bridge-client` (Ed25519 `agent_auth` handshake +
5
+ * auto-reconnect + heartbeat) and exposes the slim `IBridgeTransport` port
6
+ * the inbound ACP layer needs (raw string send + 4 events).
7
+ *
8
+ * Why a thin wrapper rather than re-using BridgeClient directly?
9
+ * - keeps the application/inbound layers free from `events.EventEmitter`
10
+ * typing leaks and lets us swap in an in-memory transport for tests
11
+ * - exposes a stable surface even if the SDK adds new events
12
+ */
13
+ import { BridgeClient } from "@beeos-ai/bridge-client";
14
+ export class BridgeWsTransport {
15
+ client;
16
+ constructor(opts) {
17
+ this.client = new BridgeClient({
18
+ bridgeUrl: opts.bridgeUrl,
19
+ service: opts.service ?? "acp",
20
+ keyFile: opts.keyFile,
21
+ privateKey: opts.privateKey,
22
+ publicKey: opts.publicKey,
23
+ reconnect: opts.reconnect,
24
+ heartbeat: opts.heartbeat,
25
+ proxy: opts.proxy,
26
+ });
27
+ }
28
+ async connect() {
29
+ await this.client.connect();
30
+ }
31
+ async send(data) {
32
+ await this.client.send(data);
33
+ }
34
+ async close() {
35
+ await this.client.close(true);
36
+ }
37
+ on(event, handler) {
38
+ if (event === "message") {
39
+ this.client.on("message", (data) => {
40
+ const str = typeof data === "string" ? data : Buffer.from(data).toString();
41
+ return handler(str);
42
+ });
43
+ return;
44
+ }
45
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
46
+ this.client.on(event, handler);
47
+ }
48
+ }
49
+ //# sourceMappingURL=transport-bridge-ws.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport-bridge-ws.js","sourceRoot":"","sources":["../../src/adapters/transport-bridge-ws.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,YAAY,EAA4B,MAAM,yBAAyB,CAAC;AAkBjF,MAAM,OAAO,iBAAiB;IACX,MAAM,CAAe;IAEtC,YAAY,IAA8B;QACxC,IAAI,CAAC,MAAM,GAAG,IAAI,YAAY,CAAC;YAC7B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,KAAK;YAC9B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAY;QACrB,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAMD,EAAE,CAAC,KAAa,EAAE,OAAmD;QACnE,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE;gBACjC,MAAM,GAAG,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;gBAC3E,OAAQ,OAA+C,CAAC,GAAG,CAAC,CAAC;YAC/D,CAAC,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD,8DAA8D;QAC9D,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAY,EAAE,OAAc,CAAC,CAAC;IAC/C,CAAC;CACF"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Adapter — IVlm implementation backed by the existing inner VLM loop.
3
+ *
4
+ * The repo already ships a battle-tested screenshot→reason→act loop in
5
+ * `src/agent.ts` (`Agent`) plus a configurable `OpenAIClient` that picks the
6
+ * right `ModelAdapter` based on the model name (`gpt-4o`, `qwen-vl`,
7
+ * `ui-tars`, `gui-owl`, `mai-ui`, …).
8
+ *
9
+ * This file exposes that loop through the `IVlm` port. We do NOT re-implement
10
+ * the per-model parsing — instead we delegate, so the rich existing parsers /
11
+ * grounders / coordinate-system handling stay intact.
12
+ *
13
+ * The application layer therefore only sees one stable interface (`IVlm`) and
14
+ * stays decoupled from the OpenAI SDK and from per-model peculiarities.
15
+ */
16
+ import type { ModelClient } from "../model/base.js";
17
+ import type { IDevice } from "../ports/device.js";
18
+ import type { IVlm } from "../ports/vlm.js";
19
+ import type { VlmStep } from "../ports/agent-core.js";
20
+ import type { Device } from "../device/base.js";
21
+ export interface InnerLoopVlmOptions {
22
+ /** Model name forwarded to OpenAIClient (e.g. `gpt-4o`, `ui-tars-7b`). */
23
+ modelName?: string;
24
+ baseUrl?: string;
25
+ apiKey?: string;
26
+ maxSteps?: number;
27
+ lang?: "cn" | "en";
28
+ verbose?: boolean;
29
+ /**
30
+ * Caller can pre-construct a ModelClient for fully custom config; otherwise
31
+ * we instantiate a default OpenAIClient with adapter auto-detection.
32
+ */
33
+ modelClient?: ModelClient;
34
+ }
35
+ /**
36
+ * Wraps Agent + OpenAIClient as an IVlm. The IDevice **must** be one of the
37
+ * adapters in this package because the legacy Agent expects the old `Device`
38
+ * interface — we expose `.raw` on production adapters for that.
39
+ */
40
+ export declare class InnerLoopVlm implements IVlm {
41
+ private agent;
42
+ private client;
43
+ private readonly inner;
44
+ private readonly cfg;
45
+ private readonly baseUrl?;
46
+ private readonly apiKey?;
47
+ private provider;
48
+ constructor(device: IDevice, opts?: InnerLoopVlmOptions);
49
+ get modelName(): string;
50
+ get providerName(): string;
51
+ /**
52
+ * Rebuild the underlying OpenAIClient + Agent with a new provider/model.
53
+ *
54
+ * `provider` is forwarded as the explicit adapter selector, so callers can
55
+ * force e.g. the `qwen-vl` adapter even when the model id alone would not
56
+ * disambiguate. Any in-flight `runTask` call keeps using the old client; the
57
+ * new client takes over from the next task.
58
+ */
59
+ setProvider(provider: string, model: string): Promise<void>;
60
+ runTask(opts: {
61
+ task: string;
62
+ maxSteps: number;
63
+ onText?: (text: string) => void | Promise<void>;
64
+ onStep?: (step: VlmStep & {
65
+ stepIndex: number;
66
+ }) => void | Promise<void>;
67
+ abortSignal?: AbortSignal;
68
+ }): Promise<{
69
+ finalMessage: string;
70
+ steps: number;
71
+ cancelled: boolean;
72
+ }>;
73
+ }
74
+ /**
75
+ * Best-effort `IDevice` → legacy `Device` unwrap.
76
+ *
77
+ * Production adapters expose a `.raw` of the legacy `Device` shape:
78
+ * - `AndroidAdbAdapter.raw` → real `AndroidDevice` (full UI XML, etc.)
79
+ * - `DesktopAdapter` → no `.raw`; we synthesise an inline shim
80
+ *
81
+ * Tests / harness scripts that pass arbitrary `IDevice` stubs may also
82
+ * supply a `.raw` matching the legacy shape — that path is honoured too.
83
+ *
84
+ * Exported so callers (bootstrap, harness scripts) that build an
85
+ * `InProcMcpClient` from an `IDevice` get exactly the same behaviour the
86
+ * legacy `Agent` had with the same input.
87
+ */
88
+ export declare function unwrapInnerDevice(d: IDevice): Device;
@@ -0,0 +1,199 @@
1
+ /**
2
+ * Adapter — IVlm implementation backed by the existing inner VLM loop.
3
+ *
4
+ * The repo already ships a battle-tested screenshot→reason→act loop in
5
+ * `src/agent.ts` (`Agent`) plus a configurable `OpenAIClient` that picks the
6
+ * right `ModelAdapter` based on the model name (`gpt-4o`, `qwen-vl`,
7
+ * `ui-tars`, `gui-owl`, `mai-ui`, …).
8
+ *
9
+ * This file exposes that loop through the `IVlm` port. We do NOT re-implement
10
+ * the per-model parsing — instead we delegate, so the rich existing parsers /
11
+ * grounders / coordinate-system handling stay intact.
12
+ *
13
+ * The application layer therefore only sees one stable interface (`IVlm`) and
14
+ * stays decoupled from the OpenAI SDK and from per-model peculiarities.
15
+ */
16
+ import { Agent } from "../agent.js";
17
+ import { OpenAIClient } from "../model/client.js";
18
+ import { VlmError } from "../core/errors.js";
19
+ import { AndroidAdbAdapter } from "./device-android-adb.js";
20
+ import { DesktopAdapter } from "./device-desktop.js";
21
+ /**
22
+ * Wraps Agent + OpenAIClient as an IVlm. The IDevice **must** be one of the
23
+ * adapters in this package because the legacy Agent expects the old `Device`
24
+ * interface — we expose `.raw` on production adapters for that.
25
+ */
26
+ export class InnerLoopVlm {
27
+ agent;
28
+ client;
29
+ inner;
30
+ cfg;
31
+ baseUrl;
32
+ apiKey;
33
+ provider = "";
34
+ constructor(device, opts = {}) {
35
+ this.inner = unwrapInnerDevice(device);
36
+ this.cfg = {
37
+ maxSteps: opts.maxSteps,
38
+ lang: opts.lang,
39
+ verbose: opts.verbose,
40
+ };
41
+ this.baseUrl = opts.baseUrl;
42
+ this.apiKey = opts.apiKey;
43
+ this.client = opts.modelClient ?? new OpenAIClient({
44
+ modelName: opts.modelName,
45
+ baseUrl: opts.baseUrl,
46
+ apiKey: opts.apiKey,
47
+ });
48
+ this.agent = new Agent(this.client, this.inner, this.cfg);
49
+ }
50
+ get modelName() {
51
+ return this.client.modelName;
52
+ }
53
+ get providerName() {
54
+ return this.provider;
55
+ }
56
+ /**
57
+ * Rebuild the underlying OpenAIClient + Agent with a new provider/model.
58
+ *
59
+ * `provider` is forwarded as the explicit adapter selector, so callers can
60
+ * force e.g. the `qwen-vl` adapter even when the model id alone would not
61
+ * disambiguate. Any in-flight `runTask` call keeps using the old client; the
62
+ * new client takes over from the next task.
63
+ */
64
+ async setProvider(provider, model) {
65
+ if (!model)
66
+ throw new VlmError("setProvider: model is required");
67
+ const adapter = (provider || "").trim() || undefined;
68
+ this.client = new OpenAIClient({
69
+ modelName: model,
70
+ baseUrl: this.baseUrl,
71
+ apiKey: this.apiKey,
72
+ adapter,
73
+ });
74
+ this.agent = new Agent(this.client, this.inner, this.cfg);
75
+ this.provider = adapter ?? "";
76
+ }
77
+ async runTask(opts) {
78
+ if (opts.abortSignal?.aborted) {
79
+ return { finalMessage: "Cancelled before start.", steps: 0, cancelled: true };
80
+ }
81
+ try {
82
+ const result = await this.agent.run(opts.task, {
83
+ signal: opts.abortSignal,
84
+ maxSteps: opts.maxSteps,
85
+ onText: opts.onText,
86
+ onStep: opts.onStep
87
+ ? async (step) => {
88
+ await opts.onStep({ ...mapStep(step), stepIndex: step.index });
89
+ }
90
+ : undefined,
91
+ });
92
+ return {
93
+ finalMessage: result.finalText,
94
+ steps: result.steps,
95
+ cancelled: result.cancelled,
96
+ };
97
+ }
98
+ catch (e) {
99
+ if (opts.abortSignal?.aborted) {
100
+ return { finalMessage: "Cancelled.", steps: 0, cancelled: true };
101
+ }
102
+ throw new VlmError(`VLM task failed: ${e.message}`, e);
103
+ }
104
+ }
105
+ }
106
+ /**
107
+ * Project an internal `AgentStepRecord` (action shape: `{ actionType,
108
+ * params }`) onto the public `VlmStep` shape (action shape: discriminated
109
+ * `Action` union). The IVlm port treats `action` as opaque to the host —
110
+ * so a best-effort mapping that preserves `actionType` as `kind` and
111
+ * spreads params is enough for downstream consumers.
112
+ */
113
+ function mapStep(step) {
114
+ const action = step.action
115
+ ? { kind: step.action.actionType, ...step.action.params }
116
+ : null;
117
+ return {
118
+ thinking: step.thinking,
119
+ action,
120
+ finished: step.finished,
121
+ message: step.message,
122
+ };
123
+ }
124
+ /**
125
+ * Best-effort `IDevice` → legacy `Device` unwrap.
126
+ *
127
+ * Production adapters expose a `.raw` of the legacy `Device` shape:
128
+ * - `AndroidAdbAdapter.raw` → real `AndroidDevice` (full UI XML, etc.)
129
+ * - `DesktopAdapter` → no `.raw`; we synthesise an inline shim
130
+ *
131
+ * Tests / harness scripts that pass arbitrary `IDevice` stubs may also
132
+ * supply a `.raw` matching the legacy shape — that path is honoured too.
133
+ *
134
+ * Exported so callers (bootstrap, harness scripts) that build an
135
+ * `InProcMcpClient` from an `IDevice` get exactly the same behaviour the
136
+ * legacy `Agent` had with the same input.
137
+ */
138
+ export function unwrapInnerDevice(d) {
139
+ if (d instanceof AndroidAdbAdapter)
140
+ return d.raw;
141
+ if (d instanceof DesktopAdapter)
142
+ return innerDesktopShim(d);
143
+ // Fallback: any IDevice with a public `.raw` of the legacy Device shape.
144
+ const raw = d.raw;
145
+ if (raw && typeof raw.takeScreenshot === "function")
146
+ return raw;
147
+ throw new VlmError("unwrapInnerDevice requires an IDevice that exposes a legacy `Device` driver via .raw (AndroidAdbAdapter / DesktopAdapter).");
148
+ }
149
+ /**
150
+ * Build a minimal legacy `Device` shim for the desktop mock so the inner Agent
151
+ * loop can still run end-to-end against it (tests, demos).
152
+ */
153
+ function innerDesktopShim(d) {
154
+ return {
155
+ async takeScreenshot() {
156
+ const o = await d.capture();
157
+ return { base64Data: o.imageBase64, width: o.width, height: o.height };
158
+ },
159
+ async getCurrentApp() {
160
+ const i = await d.getInfo();
161
+ return i.metadata.currentApp ?? "Mock";
162
+ },
163
+ async getUiXml() {
164
+ return null;
165
+ },
166
+ async tap(x, y) {
167
+ await d.apply({ kind: "tap", x, y });
168
+ },
169
+ async doubleTap(x, y) {
170
+ await d.apply({ kind: "double_tap", x, y });
171
+ },
172
+ async longPress(x, y, durationMs) {
173
+ await d.apply({ kind: "long_press", x, y, durationMs });
174
+ },
175
+ async swipe(x1, y1, x2, y2, durationMs) {
176
+ await d.apply({ kind: "swipe", x1, y1, x2, y2, durationMs });
177
+ },
178
+ async inputText(text) {
179
+ await d.apply({ kind: "type", text });
180
+ },
181
+ async pressKey(keycode) {
182
+ await d.apply({ kind: "press_key", keycode });
183
+ },
184
+ async launchApp(name) {
185
+ await d.apply({ kind: "open_app", packageOrName: name });
186
+ return true;
187
+ },
188
+ async pressBack() {
189
+ await d.apply({ kind: "press_back" });
190
+ },
191
+ async pressHome() {
192
+ await d.apply({ kind: "press_home" });
193
+ },
194
+ async clearText() {
195
+ // no-op in mock
196
+ },
197
+ };
198
+ }
199
+ //# sourceMappingURL=vlm-inner-loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vlm-inner-loop.js","sourceRoot":"","sources":["../../src/adapters/vlm-inner-loop.ts"],"names":[],"mappings":"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"}