@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,125 @@
1
+ /**
2
+ * Port — AgentHost.
3
+ *
4
+ * The host is the in-process event bus that sits between an `IAgentCore`
5
+ * and any number of `AgentPlugin`s (ACP, HTTP debug, agent-sync, custom).
6
+ *
7
+ * Plugins call `host.submitTask(...)` to ask the agent to do something
8
+ * and `host.on(...)` to subscribe to lifecycle / streaming events.
9
+ * The host:
10
+ *
11
+ * - assigns a stable `taskId`
12
+ * - propagates `taskId` to the logging correlation context
13
+ * - translates `IAgentCore` callbacks (onText / onReasoning / onTool /
14
+ * onStep) into a typed `AgentEvent` union
15
+ * - tracks abort controllers for `cancel(taskId)`
16
+ * - exposes `host.agent` for plugins that need to call `setModel`
17
+ *
18
+ * Plugins MUST NOT call `IAgentCore.run` directly — go through
19
+ * `host.submitTask` so cancellation, correlation, and event fan-out
20
+ * remain in one place.
21
+ */
22
+ import type { AgentCoreRunResult, IAgentCore, ToolCallEvent, VlmStep } from "./agent-core.js";
23
+ import type { DeviceManager } from "../app/device-manager.js";
24
+ import type { IDeviceIdentity } from "./identity.js";
25
+ /**
26
+ * Every AgentEvent carries:
27
+ *
28
+ * - `taskId` — `host.submitTask` allocated id (legacy correlation)
29
+ * - `turnId` — ACP `_turnId`. Right now we mirror `taskId` 1:1 so a
30
+ * single `session/prompt` => one logical turn; downstream
31
+ * plugins should NEVER assume `turnId === taskId` (mobile
32
+ * may want to fan one task into multiple visual turns).
33
+ *
34
+ * Events that translate into ACP `session/update` envelopes also carry
35
+ * `messageId` — the **per-task authoritative message id** that all of
36
+ * `agent_message_chunk` / `agent_thought_chunk` / `tool_call` /
37
+ * `tool_call_update` / `task:notice` share so chat-store's sidecar
38
+ * resolver can pin them to the same assistant bubble.
39
+ */
40
+ export type AgentEvent = {
41
+ type: "task:start";
42
+ taskId: string;
43
+ turnId: string;
44
+ prompt: string;
45
+ createdAt: number;
46
+ } | {
47
+ type: "task:text";
48
+ taskId: string;
49
+ turnId: string;
50
+ messageId: string;
51
+ text: string;
52
+ } | {
53
+ type: "task:reasoning";
54
+ taskId: string;
55
+ turnId: string;
56
+ messageId: string;
57
+ text: string;
58
+ } | {
59
+ type: "task:tool";
60
+ taskId: string;
61
+ turnId: string;
62
+ messageId: string;
63
+ tool: ToolCallEvent;
64
+ } | {
65
+ type: "task:step";
66
+ taskId: string;
67
+ turnId: string;
68
+ messageId: string;
69
+ step: VlmStep & {
70
+ stepIndex: number;
71
+ };
72
+ } | {
73
+ type: "task:notice";
74
+ taskId: string;
75
+ turnId: string;
76
+ messageId: string;
77
+ level: "warn" | "error";
78
+ text: string;
79
+ } | {
80
+ type: "task:end";
81
+ taskId: string;
82
+ turnId: string;
83
+ result: AgentCoreRunResult;
84
+ error?: string;
85
+ completedAt: number;
86
+ };
87
+ export type AgentEventListener = (event: AgentEvent) => void | Promise<void>;
88
+ export interface SubmitTaskOptions {
89
+ /** Free-form per-task tag forwarded to logs (e.g. ACP sessionId). */
90
+ correlationTag?: string;
91
+ /** Optional caller-supplied AbortSignal merged with the host's controller. */
92
+ abortSignal?: AbortSignal;
93
+ /** Soft cap on inner steps (forwarded to `IAgentCore.run`). */
94
+ maxSteps?: number;
95
+ }
96
+ export interface SubmittedTask {
97
+ taskId: string;
98
+ /** Resolves when the task settles (success or failure). Never rejects. */
99
+ done: Promise<AgentCoreRunResult>;
100
+ /** Cancel this specific task. Returns true if a cancel was actually issued. */
101
+ cancel: () => boolean;
102
+ }
103
+ /**
104
+ * AgentHost — the runtime container plugins are wired against.
105
+ *
106
+ * Implementations live in `app/agent-host.ts`. Tests construct the host
107
+ * with mocked `IAgentCore` / `DeviceManager` to drive plugins without
108
+ * spinning up a real model.
109
+ */
110
+ export interface AgentHost {
111
+ /** The agent core (rare direct use — `setModel`, etc.). */
112
+ readonly agent: IAgentCore;
113
+ /** Device registry (plugins like HTTP debug surface device info). */
114
+ readonly devices: DeviceManager;
115
+ /** Optional Ed25519 identity (agent-sync / future signed plugins). */
116
+ readonly identity?: IDeviceIdentity;
117
+ /** Submit a task; returns the task handle synchronously. */
118
+ submitTask(prompt: string, opts?: SubmitTaskOptions): SubmittedTask;
119
+ /** Subscribe to all events. Returns an `unsubscribe` function. */
120
+ on(listener: AgentEventListener): () => void;
121
+ /** Cancel by `taskId`. Returns true if the task was running. */
122
+ cancel(taskId: string): boolean;
123
+ /** Cancel every running task (used during shutdown). */
124
+ cancelAll(): Promise<void>;
125
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Port — AgentHost.
3
+ *
4
+ * The host is the in-process event bus that sits between an `IAgentCore`
5
+ * and any number of `AgentPlugin`s (ACP, HTTP debug, agent-sync, custom).
6
+ *
7
+ * Plugins call `host.submitTask(...)` to ask the agent to do something
8
+ * and `host.on(...)` to subscribe to lifecycle / streaming events.
9
+ * The host:
10
+ *
11
+ * - assigns a stable `taskId`
12
+ * - propagates `taskId` to the logging correlation context
13
+ * - translates `IAgentCore` callbacks (onText / onReasoning / onTool /
14
+ * onStep) into a typed `AgentEvent` union
15
+ * - tracks abort controllers for `cancel(taskId)`
16
+ * - exposes `host.agent` for plugins that need to call `setModel`
17
+ *
18
+ * Plugins MUST NOT call `IAgentCore.run` directly — go through
19
+ * `host.submitTask` so cancellation, correlation, and event fan-out
20
+ * remain in one place.
21
+ */
22
+ export {};
23
+ //# sourceMappingURL=agent-host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-host.js","sourceRoot":"","sources":["../../src/ports/agent-host.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Port — abstract device adapter.
3
+ *
4
+ * Implementations:
5
+ * - adapters/device-android-adb.ts (production)
6
+ * - adapters/device-desktop.ts (mock / desktop runtime)
7
+ * - tests/unit/adapters/... (in-memory test doubles)
8
+ *
9
+ * The application layer depends ONLY on this interface; concrete child_process /
10
+ * sharp / OS-native calls live entirely in adapters.
11
+ */
12
+ import type { Action } from "../core/actions.js";
13
+ import type { ScreenObservation, UiNode } from "../core/screen.js";
14
+ export type DeviceType = "android" | "chromeos" | "desktop-linux" | "desktop-windows" | "desktop-macos";
15
+ /**
16
+ * ACP wire v2 capability vocabulary — per-action verbs that callers can probe
17
+ * with `device/info` to decide whether to attempt a feature. New capabilities
18
+ * MUST be added to the union before adapters can advertise them.
19
+ */
20
+ export type DeviceCapability = "screenshot" | "ui-tree" | "tap" | "swipe" | "type" | "press_key" | "install" | "shell";
21
+ export interface DeviceInfo {
22
+ type: DeviceType;
23
+ name: string;
24
+ os: string;
25
+ width: number;
26
+ height: number;
27
+ capabilities: DeviceCapability[];
28
+ osVersion: string;
29
+ density: number;
30
+ metadata: Record<string, string>;
31
+ }
32
+ export interface IDevice {
33
+ /** Connect / warm up the underlying transport. */
34
+ connect(): Promise<void>;
35
+ /** Cleanly disconnect; safe to call multiple times. */
36
+ disconnect(): Promise<void>;
37
+ getInfo(): Promise<DeviceInfo>;
38
+ /**
39
+ * Capture screen as raw PNG bytes when *raw* is true; otherwise return a
40
+ * compressed JPEG suitable for VLM inputs.
41
+ */
42
+ capture(opts?: {
43
+ raw?: boolean;
44
+ }): Promise<ScreenObservation>;
45
+ /** Dump the accessibility / uiautomator hierarchy. */
46
+ getUiTree(): Promise<UiNode[]>;
47
+ /** Apply a typed action. */
48
+ apply(action: Action): Promise<void>;
49
+ /** Install an APK / package from a local file path. */
50
+ install(path: string): Promise<void>;
51
+ /** Run an arbitrary shell command and return stdout. */
52
+ shell(command: string): Promise<string>;
53
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Port — abstract device adapter.
3
+ *
4
+ * Implementations:
5
+ * - adapters/device-android-adb.ts (production)
6
+ * - adapters/device-desktop.ts (mock / desktop runtime)
7
+ * - tests/unit/adapters/... (in-memory test doubles)
8
+ *
9
+ * The application layer depends ONLY on this interface; concrete child_process /
10
+ * sharp / OS-native calls live entirely in adapters.
11
+ */
12
+ export {};
13
+ //# sourceMappingURL=device.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device.js","sourceRoot":"","sources":["../../src/ports/device.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Port — device identity (Ed25519 keypair).
3
+ *
4
+ * Production adapter `identity-file.ts` reads / writes JSON files in
5
+ * `~/.beeos/identity/` using the `@beeos-ai/bridge-client` keys helpers.
6
+ * Tests use an in-memory adapter.
7
+ */
8
+ export interface KeyPair {
9
+ publicKey: Uint8Array;
10
+ privateKey: Uint8Array;
11
+ }
12
+ export interface IDeviceIdentity {
13
+ /**
14
+ * Return the existing keypair, or create one and persist it on first call.
15
+ * Idempotent.
16
+ */
17
+ ensure(): Promise<KeyPair>;
18
+ /** Base64 of the public key. */
19
+ publicKeyBase64(): Promise<string>;
20
+ /** SHA-256 hex fingerprint of the public key. */
21
+ fingerprint(): Promise<string>;
22
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Port — device identity (Ed25519 keypair).
3
+ *
4
+ * Production adapter `identity-file.ts` reads / writes JSON files in
5
+ * `~/.beeos/identity/` using the `@beeos-ai/bridge-client` keys helpers.
6
+ * Tests use an in-memory adapter.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/ports/identity.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Port — AgentPlugin.
3
+ *
4
+ * Plugins are modular extensions wired by `bootstrap()` after the
5
+ * `AgentHost` has been constructed. Built-in plugins:
6
+ *
7
+ * - `plugins/acp/` — Bridge WS + ACP JSON-RPC (default)
8
+ * - `plugins/http-debug/` — local HTTP REST API for debugging
9
+ * - `plugins/agent-sync/` — registers the agent with Agent Identity
10
+ *
11
+ * Authoring a custom plugin:
12
+ *
13
+ * ```ts
14
+ * import type { AgentPlugin } from "@beeos-ai/device-agent/ports/plugin.js";
15
+ *
16
+ * export const myPlugin: AgentPlugin = {
17
+ * name: "my-plugin",
18
+ * async init(ctx) {
19
+ * ctx.host.on((ev) => {
20
+ * if (ev.type === "task:end") ctx.log.info({ ev }, "task done");
21
+ * });
22
+ * },
23
+ * async start() { ... },
24
+ * async stop() { ... },
25
+ * };
26
+ * ```
27
+ *
28
+ * Lifecycle ordering:
29
+ * - bootstrap() registers plugins in declaration order
30
+ * - init(ctx) runs sequentially (subscriptions / handler registration)
31
+ * - start() runs sequentially (long-lived loops, transports, listeners)
32
+ * - stop() runs in REVERSE order on shutdown
33
+ */
34
+ import type { Logger } from "pino";
35
+ import type { Config } from "../config/schema.js";
36
+ import type { AgentHost } from "./agent-host.js";
37
+ export interface PluginContext {
38
+ host: AgentHost;
39
+ config: Config;
40
+ log: Logger;
41
+ }
42
+ export interface AgentPlugin {
43
+ /** Unique, stable plugin name (used for logging / disable filters). */
44
+ readonly name: string;
45
+ /**
46
+ * Wire up listeners / register handlers / open file descriptors that
47
+ * MUST be ready before any other plugin starts. Called once,
48
+ * sequentially, in registration order.
49
+ */
50
+ init?(ctx: PluginContext): void | Promise<void>;
51
+ /**
52
+ * Open long-lived resources — transports, network listeners, timers.
53
+ * Called sequentially after every plugin's `init` has resolved.
54
+ */
55
+ start?(): void | Promise<void>;
56
+ /**
57
+ * Tear down resources. Called in REVERSE registration order during
58
+ * `bootstrap`'s returned `stop()` function. Implementations should be
59
+ * idempotent and swallow their own errors.
60
+ */
61
+ stop?(): void | Promise<void>;
62
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Port — AgentPlugin.
3
+ *
4
+ * Plugins are modular extensions wired by `bootstrap()` after the
5
+ * `AgentHost` has been constructed. Built-in plugins:
6
+ *
7
+ * - `plugins/acp/` — Bridge WS + ACP JSON-RPC (default)
8
+ * - `plugins/http-debug/` — local HTTP REST API for debugging
9
+ * - `plugins/agent-sync/` — registers the agent with Agent Identity
10
+ *
11
+ * Authoring a custom plugin:
12
+ *
13
+ * ```ts
14
+ * import type { AgentPlugin } from "@beeos-ai/device-agent/ports/plugin.js";
15
+ *
16
+ * export const myPlugin: AgentPlugin = {
17
+ * name: "my-plugin",
18
+ * async init(ctx) {
19
+ * ctx.host.on((ev) => {
20
+ * if (ev.type === "task:end") ctx.log.info({ ev }, "task done");
21
+ * });
22
+ * },
23
+ * async start() { ... },
24
+ * async stop() { ... },
25
+ * };
26
+ * ```
27
+ *
28
+ * Lifecycle ordering:
29
+ * - bootstrap() registers plugins in declaration order
30
+ * - init(ctx) runs sequentially (subscriptions / handler registration)
31
+ * - start() runs sequentially (long-lived loops, transports, listeners)
32
+ * - stop() runs in REVERSE order on shutdown
33
+ */
34
+ export {};
35
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/ports/plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Port — Bridge transport for ACP messages.
3
+ *
4
+ * Production adapter: `adapters/transport-bridge-ws.ts` wraps
5
+ * `@beeos-ai/bridge-client` (WebSocket + Ed25519 `agent_auth` handshake +
6
+ * automatic reconnect).
7
+ *
8
+ * Tests can plug an in-memory fake that captures sent messages and replays
9
+ * canned ones to drive ACP roundtrip tests.
10
+ */
11
+ export type TransportEventHandler = {
12
+ kind: "connected";
13
+ handler: () => void;
14
+ } | {
15
+ kind: "disconnected";
16
+ handler: (reason: string) => void;
17
+ } | {
18
+ kind: "message";
19
+ handler: (data: string) => void | Promise<void>;
20
+ } | {
21
+ kind: "error";
22
+ handler: (err: Error) => void;
23
+ };
24
+ export interface IBridgeTransport {
25
+ connect(): Promise<void>;
26
+ send(data: string): Promise<void>;
27
+ close(): Promise<void>;
28
+ on(event: "connected", handler: () => void): void;
29
+ on(event: "disconnected", handler: (reason: string) => void): void;
30
+ on(event: "message", handler: (data: string) => void | Promise<void>): void;
31
+ on(event: "error", handler: (err: Error) => void): void;
32
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Port — Bridge transport for ACP messages.
3
+ *
4
+ * Production adapter: `adapters/transport-bridge-ws.ts` wraps
5
+ * `@beeos-ai/bridge-client` (WebSocket + Ed25519 `agent_auth` handshake +
6
+ * automatic reconnect).
7
+ *
8
+ * Tests can plug an in-memory fake that captures sent messages and replays
9
+ * canned ones to drive ACP roundtrip tests.
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/ports/transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Port — Vision-Language Model client.
3
+ *
4
+ * The inner `Agent` (legacy `src/agent.ts`) consumes a richer `ModelClient`
5
+ * surface (buildMessages / request / parseResponse / updateContext). This port
6
+ * exposes the **outer** semantic the application layer needs: "given an
7
+ * instruction and a screen observation, return one parsed Action plus
8
+ * thinking text, or signal completion".
9
+ *
10
+ * The default adapter delegates straight to the existing `Agent` so the inner
11
+ * VLM loop stays untouched and battle-tested.
12
+ */
13
+ import type { VlmStep as AgentCoreVlmStep } from "./agent-core.js";
14
+ /**
15
+ * @deprecated since the IAgentCore introduction — re-exported from
16
+ * `ports/agent-core.ts` so existing imports keep compiling. New code should
17
+ * import `VlmStep` from `ports/agent-core.js` directly.
18
+ */
19
+ export type VlmStep = AgentCoreVlmStep;
20
+ export interface IVlm {
21
+ /** Identifier the agent reports back to BeeOS (e.g. `gpt-4o`). */
22
+ readonly modelName: string;
23
+ /**
24
+ * Provider hint last applied via `setProvider`. Empty when the implementation
25
+ * was constructed with provider auto-detection.
26
+ */
27
+ readonly providerName?: string;
28
+ /**
29
+ * Run a single instruction to completion using the model's own
30
+ * screenshot→reason→act loop. The implementation is responsible for
31
+ * calling `device.capture()` / `device.apply()` as needed.
32
+ *
33
+ * @param onStep Called once per step (after each VLM round-trip).
34
+ */
35
+ runTask(opts: {
36
+ task: string;
37
+ maxSteps: number;
38
+ /** Streaming text delta from the model (newer adapters). */
39
+ onText?: (text: string) => void | Promise<void>;
40
+ onStep?: (step: VlmStep & {
41
+ stepIndex: number;
42
+ }) => void | Promise<void>;
43
+ abortSignal?: AbortSignal;
44
+ }): Promise<{
45
+ finalMessage: string;
46
+ steps: number;
47
+ cancelled: boolean;
48
+ }>;
49
+ /**
50
+ * Hot-swap provider+model at runtime. `provider` is the human-friendly tag
51
+ * (e.g. "openai", "qwen", "uitars") and is used to select the correct
52
+ * adapter; `model` is the upstream model id passed straight through to the
53
+ * provider API.
54
+ *
55
+ * Implementations should be safe to call between tasks — concurrent in-flight
56
+ * tasks may continue with the previous client until they settle.
57
+ */
58
+ setProvider(provider: string, model: string): Promise<void>;
59
+ }
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Port — Vision-Language Model client.
3
+ *
4
+ * The inner `Agent` (legacy `src/agent.ts`) consumes a richer `ModelClient`
5
+ * surface (buildMessages / request / parseResponse / updateContext). This port
6
+ * exposes the **outer** semantic the application layer needs: "given an
7
+ * instruction and a screen observation, return one parsed Action plus
8
+ * thinking text, or signal completion".
9
+ *
10
+ * The default adapter delegates straight to the existing `Agent` so the inner
11
+ * VLM loop stays untouched and battle-tested.
12
+ */
13
+ export {};
14
+ //# sourceMappingURL=vlm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vlm.js","sourceRoot":"","sources":["../../src/ports/vlm.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * 验证局域网 OpenAI 兼容 AutoGLM 与 device-agent-ts 内层链路(adapter=autoglm + OpenAIClient)。
3
+ * 需要:adb 已连机、本机可访问 GUI_AGENT_BASE_URL、.env 已配置。
4
+ *
5
+ * npx tsx src/test-lan-autoglm.ts
6
+ */
7
+ import "dotenv/config";
@@ -0,0 +1,46 @@
1
+ /**
2
+ * 验证局域网 OpenAI 兼容 AutoGLM 与 device-agent-ts 内层链路(adapter=autoglm + OpenAIClient)。
3
+ * 需要:adb 已连机、本机可访问 GUI_AGENT_BASE_URL、.env 已配置。
4
+ *
5
+ * npx tsx src/test-lan-autoglm.ts
6
+ */
7
+ import "dotenv/config";
8
+ import { AndroidDevice } from "./device/android.js";
9
+ import { OpenAIClient } from "./model/client.js";
10
+ const TASK = process.env.LAN_VLM_SMOKE_TASK ??
11
+ "看当前截图,只输出一行下一步操作(不要复述用户原话里的示例代码):用 do(action=\"Tap\", element=[x,y]) 点击你认为该点的位置,坐标 0–1000。";
12
+ async function main() {
13
+ const base = process.env.GUI_AGENT_BASE_URL ?? "";
14
+ const model = process.env.GUI_AGENT_MODEL ?? "";
15
+ if (!base || !model) {
16
+ console.error("请设置 GUI_AGENT_BASE_URL、GUI_AGENT_MODEL(及 API_KEY)");
17
+ process.exit(1);
18
+ }
19
+ console.log(`[lan-autoglm] base=${base} model=${model} adapter=${process.env.GUI_AGENT_ADAPTER ?? "(auto)"} stream=${process.env.GUI_AGENT_STREAM ?? "1"}`);
20
+ const device = new AndroidDevice(process.env.GUI_AGENT_DEVICE_ID ?? undefined);
21
+ const ss = await device.takeScreenshot();
22
+ const currentApp = await device.getCurrentApp();
23
+ const client = new OpenAIClient({
24
+ adapter: process.env.GUI_AGENT_ADAPTER ?? "autoglm",
25
+ });
26
+ const screenInfo = {
27
+ screenshotB64: ss.base64Data,
28
+ width: ss.width,
29
+ height: ss.height,
30
+ currentApp,
31
+ uiXml: null,
32
+ };
33
+ const messages = client.buildMessages(TASK, screenInfo, [], true, (process.env.GUI_AGENT_LANG ?? "cn"));
34
+ console.log(`[lan-autoglm] requesting… (${messages.length} messages, jpeg b64 ~${Math.round(ss.base64Data.length / 1024)} KB)`);
35
+ const t0 = Date.now();
36
+ const resp = await client.request(messages, true);
37
+ const ms = Date.now() - t0;
38
+ console.log("\n--- raw (prefix) ---\n", resp.rawContent.slice(0, 1500), resp.rawContent.length > 1500 ? "\n…" : "");
39
+ console.log("\n--- parsed ---\n", JSON.stringify(client.parseResponse(resp.rawContent), null, 2));
40
+ console.log(`\n[lan-autoglm] ok in ${ms} ms`);
41
+ }
42
+ main().catch((e) => {
43
+ console.error(e);
44
+ process.exit(1);
45
+ });
46
+ //# sourceMappingURL=test-lan-autoglm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-lan-autoglm.js","sourceRoot":"","sources":["../src/test-lan-autoglm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ import "dotenv/config";
@@ -0,0 +1,103 @@
1
+ import "dotenv/config";
2
+ // Memory diagnostic: peel back each layer to see where the 200MB goes.
3
+ // Run with: npx tsx --expose-gc src/test-mem-breakdown.ts
4
+ function mb(n) { return (n / 1024 / 1024).toFixed(1); }
5
+ function rss() { return process.memoryUsage().rss; }
6
+ function heap() { return process.memoryUsage().heapUsed; }
7
+ function ext() { return process.memoryUsage().external; }
8
+ function snap(label, baseline) {
9
+ const m = process.memoryUsage();
10
+ const delta = baseline !== undefined ? ` (Δrss=${mb(m.rss - baseline)}MB)` : "";
11
+ console.log(`[${label.padEnd(28)}] rss=${mb(m.rss)}MB heap=${mb(m.heapUsed)}MB ext=${mb(m.external)}MB${delta}`);
12
+ return m.rss;
13
+ }
14
+ async function waitGc() {
15
+ if (global.gc) {
16
+ global.gc();
17
+ global.gc();
18
+ }
19
+ await new Promise(r => setTimeout(r, 50));
20
+ }
21
+ console.log("=".repeat(78));
22
+ console.log("Memory Breakdown Diagnostic");
23
+ console.log("=".repeat(78));
24
+ // ── Layer 0: bare node ──────────────────────────────────────────────────────
25
+ const bare = snap("0. bare node (tsx loader)");
26
+ // ── Layer 1: dotenv + types (already loaded at top, but measure current) ────
27
+ const l1 = snap("1. + dotenv", bare);
28
+ // ── Layer 2: load openai SDK ────────────────────────────────────────────────
29
+ await import("openai");
30
+ const l2 = snap("2. + openai sdk", l1);
31
+ // ── Layer 3: load sharp (triggers libvips mmap) ─────────────────────────────
32
+ const sharpMod = await import("sharp");
33
+ const l3 = snap("3. + sharp (libvips mmap)", l2);
34
+ // ── Layer 4: load our Device layer ──────────────────────────────────────────
35
+ const { AndroidDevice } = await import("./device/android.js");
36
+ const l4 = snap("4. + device/android", l3);
37
+ // ── Layer 5: instantiate device + check adb exists ──────────────────────────
38
+ const dev = new AndroidDevice(process.env.GUI_AGENT_DEVICE_ID);
39
+ const l5 = snap("5. + new AndroidDevice()", l4);
40
+ // ── Layer 6: load agent + model adapters ────────────────────────────────────
41
+ const { Agent } = await import("./agent.js");
42
+ const { OpenAIClient } = await import("./model/client.js");
43
+ await import("./model/adapters/index.js");
44
+ const l6 = snap("6. + agent + all adapters", l5);
45
+ // ── Layer 7: instantiate model client (openai client w/ keep-alive) ─────────
46
+ const client = new OpenAIClient({ adapter: process.env.GUI_AGENT_ADAPTER });
47
+ const l7 = snap("7. + new OpenAIClient()", l6);
48
+ // ── Layer 8: take one screenshot (triggers sharp pipeline + buffer) ─────────
49
+ await dev.takeScreenshot();
50
+ await waitGc();
51
+ const l8 = snap("8. + 1 screenshot (post-gc)", l7);
52
+ // ── Layer 9: take 5 screenshots back-to-back ────────────────────────────────
53
+ let peak9 = l8;
54
+ for (let i = 0; i < 5; i++) {
55
+ await dev.takeScreenshot();
56
+ peak9 = Math.max(peak9, rss());
57
+ }
58
+ await waitGc();
59
+ const l9 = snap("9. + 5 screenshots (post-gc)", l8);
60
+ console.log(` └─ intra-loop peak rss=${mb(peak9)}MB`);
61
+ // ── Layer 10: instantiate agent ─────────────────────────────────────────────
62
+ const agent = new Agent(client, dev, { maxSteps: 3, verbose: false });
63
+ const l10 = snap("10. + new Agent()", l9);
64
+ // ── Layer 11: run 1 full agent step (includes API call if connected) ────────
65
+ let peak11 = l10;
66
+ const before = rss();
67
+ try {
68
+ await agent.run("打开系统设置");
69
+ peak11 = Math.max(peak11, rss());
70
+ }
71
+ catch (e) {
72
+ // ignore — we just want memory delta
73
+ }
74
+ await waitGc();
75
+ const l11 = snap("11. + agent.run() (post-gc)", l10);
76
+ console.log(` └─ intra-run peak rss=${mb(peak11)}MB (Δ from pre-run=${mb(peak11 - before)}MB)`);
77
+ // ── Summary ─────────────────────────────────────────────────────────────────
78
+ console.log("=".repeat(78));
79
+ console.log("Component Breakdown (incremental RSS additions, MB)");
80
+ console.log("=".repeat(78));
81
+ const rows = [
82
+ ["Node.js + tsx loader baseline", bare],
83
+ ["+ dotenv", l1 - bare],
84
+ ["+ openai SDK", l2 - l1],
85
+ ["+ sharp (libvips native mmap)", l3 - l2],
86
+ ["+ device layer (adb client)", l4 - l3],
87
+ ["+ AndroidDevice instance", l5 - l4],
88
+ ["+ agent + all model adapters", l6 - l5],
89
+ ["+ OpenAI client (keep-alive pool)", l7 - l6],
90
+ ["+ first screenshot (warm cache)", l8 - l7],
91
+ ["+ 4 more screenshots", l9 - l8],
92
+ ["+ Agent instance", l10 - l9],
93
+ ["+ agent.run() full cycle", l11 - l10],
94
+ ];
95
+ for (const [label, delta] of rows) {
96
+ console.log(` ${label.padEnd(42)} ${(delta / 1024 / 1024).toFixed(1).padStart(6)} MB`);
97
+ }
98
+ console.log("-".repeat(78));
99
+ console.log(` TOTAL steady-state RSS: ${mb(l11).padStart(6)} MB`);
100
+ console.log(` Peak RSS during run: ${mb(peak11).padStart(6)} MB (transient request buffer)`);
101
+ console.log("=".repeat(78));
102
+ process.exit(0);
103
+ //# sourceMappingURL=test-mem-breakdown.js.map