@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
package/dist/agent.js ADDED
@@ -0,0 +1,162 @@
1
+ /**
2
+ * @deprecated since v0.3.0 — use `AgentRunner` from `agent-runtime/agent-runner.ts`
3
+ * (or the `AgentRunnerCore` adapter at `adapters/agentcore-runner.ts` for
4
+ * embedders that need an `IAgentCore`). This shim only exists so that
5
+ * `InnerLoopVlm`, the legacy `api.ts` HTTP debug server, and external
6
+ * test embedders keep working without changes — new call sites must NOT
7
+ * reach for this class.
8
+ *
9
+ * Migration sketch:
10
+ *
11
+ * ```typescript
12
+ * // Before (v0.2.x)
13
+ * const a = new Agent(modelClient, device);
14
+ * const r = await a.run(task, { onStep, signal });
15
+ *
16
+ * // After (v0.3.0+)
17
+ * const adapter = new OpenAIAdapter({ client: modelClient, lang: "cn" });
18
+ * const mcp = new InProcMcpClient(device);
19
+ * const runner = new AgentRunner({ task, env: "mobile", mcp, adapter });
20
+ * const r = await runner.run();
21
+ * ```
22
+ *
23
+ * Legacy `Agent` — backwards-compatible shim around the new `AgentLoop`.
24
+ *
25
+ * Pre-monorepo this class hosted a hand-rolled screenshot → reason → act
26
+ * loop. The loop has now moved into `agent-runtime/core.AgentLoop`, which is
27
+ * Plan-Act-Reflect-aware, drives any `IMcpRuntime`, and wires every model
28
+ * through an `IModelAdapter`. This file keeps the original constructor
29
+ * signature, public methods, hook payload shapes, and termination strings so
30
+ * that `InnerLoopVlm`, `api.ts`, the `agent-hooks` test suite, and any
31
+ * external embedder continue to work without changes.
32
+ *
33
+ * Internally a fresh `AgentLoop` is constructed for each `run()` call. The
34
+ * device handed to the constructor is wrapped in `InProcMcpClient` (no HTTP
35
+ * hop), and the `ModelClient` is wrapped in `OpenAIAdapter` (the adapter
36
+ * that already translates legacy `ParsedAction` outputs onto the new unified
37
+ * `Action` schema, preserving coordinate-system metadata for AgentLoop's
38
+ * scaling layer).
39
+ *
40
+ * The shim is intentionally thin — anything new (waitForUser, reflection
41
+ * hooks, custom adapters, alternate envs) should go straight to `AgentLoop`
42
+ * (or `AgentRunner` for the Hybrid Plan-Act path).
43
+ */
44
+ import { InProcMcpClient } from "./mcp-client/inproc.js";
45
+ import { OpenAIAdapter } from "./agent-runtime/adapters/openai.js";
46
+ import { AgentLoop } from "./agent-runtime/core.js";
47
+ /** @deprecated since v0.3.0 — use `AgentRunner` instead. */
48
+ export class Agent {
49
+ modelClient;
50
+ cfg;
51
+ mcp;
52
+ adapter;
53
+ constructor(modelClient, device, config = {}) {
54
+ this.modelClient = modelClient;
55
+ this.cfg = {
56
+ maxSteps: config.maxSteps ?? 30,
57
+ lang: config.lang ?? "cn",
58
+ verbose: config.verbose ?? true,
59
+ };
60
+ this.mcp = new InProcMcpClient(device);
61
+ this.adapter = new OpenAIAdapter({
62
+ client: modelClient,
63
+ lang: this.cfg.lang,
64
+ });
65
+ if (this.cfg.verbose) {
66
+ console.log(`[Agent] model=${modelClient.modelName} adapter=${modelClient.adapterName} lang=${this.cfg.lang}`);
67
+ }
68
+ }
69
+ async run(task, opts = {}) {
70
+ const stepCap = opts.maxSteps ?? this.cfg.maxSteps;
71
+ if (opts.signal?.aborted) {
72
+ return { finalText: "Task cancelled", steps: 0, cancelled: true };
73
+ }
74
+ const loop = new AgentLoop({
75
+ task,
76
+ env: "mobile",
77
+ mcp: this.mcp,
78
+ adapter: this.adapter,
79
+ maxSteps: stepCap,
80
+ signal: opts.signal,
81
+ hooks: {
82
+ onText: opts.onText,
83
+ onStep: opts.onStep
84
+ ? async (event) => {
85
+ await opts.onStep(legacyStepRecord(event));
86
+ }
87
+ : undefined,
88
+ },
89
+ });
90
+ const result = await loop.run();
91
+ let finalText = result.finalText;
92
+ if (result.terminator === "step_budget") {
93
+ finalText = "Max steps reached";
94
+ }
95
+ else if (result.terminator === "cancelled") {
96
+ finalText = result.finalText || "Task cancelled";
97
+ }
98
+ return {
99
+ finalText,
100
+ steps: result.steps,
101
+ cancelled: result.cancelled,
102
+ };
103
+ }
104
+ /**
105
+ * Legacy hook — clears any rolling adapter context so the next `run()`
106
+ * starts fresh. The new `AgentLoop` already isolates state per run, so
107
+ * this only matters if callers reach into the adapter directly.
108
+ */
109
+ reset() {
110
+ void this.adapter.close?.();
111
+ }
112
+ /** Internal — kept for backwards compatibility with embedders that peek. */
113
+ get model() {
114
+ return this.modelClient;
115
+ }
116
+ }
117
+ /* -------------------------------------------------------------------------- */
118
+ /* Translation: AgentStepEvent → legacy AgentStepRecord */
119
+ /* -------------------------------------------------------------------------- */
120
+ function legacyStepRecord(event) {
121
+ const action = event.action;
122
+ const legacyType = action.payload?._legacyType ?? action.type;
123
+ return {
124
+ index: event.index,
125
+ thinking: event.rationale,
126
+ action: action ? { actionType: legacyType, params: paramsFromAction(action) } : null,
127
+ finished: event.finished,
128
+ message: event.finished ? extractFinalMessage(action) : null,
129
+ };
130
+ }
131
+ function paramsFromAction(action) {
132
+ const out = {};
133
+ if (action.target?.kind === "point") {
134
+ out.x = action.target.x;
135
+ out.y = action.target.y;
136
+ }
137
+ else if (action.target?.kind === "box") {
138
+ out.start_x = action.target.x1;
139
+ out.start_y = action.target.y1;
140
+ out.end_x = action.target.x2;
141
+ out.end_y = action.target.y2;
142
+ }
143
+ else if (action.target?.kind === "text") {
144
+ out.text = action.target.value;
145
+ }
146
+ else if (action.target?.kind === "selector") {
147
+ out.selector = action.target.value;
148
+ }
149
+ for (const [k, v] of Object.entries(action.payload ?? {})) {
150
+ if (k.startsWith("_"))
151
+ continue;
152
+ out[k] = v;
153
+ }
154
+ return out;
155
+ }
156
+ function extractFinalMessage(action) {
157
+ const msg = action.payload?.message;
158
+ if (typeof msg === "string" && msg.length > 0)
159
+ return msg;
160
+ return null;
161
+ }
162
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
package/dist/api.d.ts ADDED
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Public API — `mobileUse` (legacy, harness-only).
3
+ *
4
+ * **NOT exported from `index.ts`.** This entry point predates the
5
+ * `IAgentCore` / `AgentHost` plugin architecture and is kept on disk
6
+ * solely so the existing one-shot harness scripts (`test-mobile-use.ts`,
7
+ * `test-mem.ts`) keep compiling. Production paths reach the same inner
8
+ * VLM through `InnerLoopVlm` (single-layer / `legacyInner`) or the
9
+ * `mobile_use` pi extension via `PiOrchestratorAgent` (two-layer default).
10
+ *
11
+ * Internally we go through `InnerLoopVlm` so this file no longer
12
+ * duplicates the OpenAIClient construction logic — the loader resolves
13
+ * `config.mobileUse` from the same env / CLI flags / config-file source
14
+ * the rest of the agent uses.
15
+ */
16
+ import type { AgentConfig } from "./agent.js";
17
+ export type { AgentConfig };
18
+ /**
19
+ * Drive the connected Android phone to complete a natural-language task.
20
+ *
21
+ * @param max_steps Maximum VLM steps for this call. When omitted, uses DEFAULT_MAX_STEPS (30).
22
+ * Callers (including outer agents) should explicitly pass this value;
23
+ * only test:mobile reads GUI_AGENT_MAX_STEPS from env as a convenience.
24
+ *
25
+ * @internal — use `bootstrap()` or `InnerLoopVlm` directly in production code.
26
+ */
27
+ export declare function mobileUse(task: string, max_steps?: number): Promise<string>;
package/dist/api.js ADDED
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Public API — `mobileUse` (legacy, harness-only).
3
+ *
4
+ * **NOT exported from `index.ts`.** This entry point predates the
5
+ * `IAgentCore` / `AgentHost` plugin architecture and is kept on disk
6
+ * solely so the existing one-shot harness scripts (`test-mobile-use.ts`,
7
+ * `test-mem.ts`) keep compiling. Production paths reach the same inner
8
+ * VLM through `InnerLoopVlm` (single-layer / `legacyInner`) or the
9
+ * `mobile_use` pi extension via `PiOrchestratorAgent` (two-layer default).
10
+ *
11
+ * Internally we go through `InnerLoopVlm` so this file no longer
12
+ * duplicates the OpenAIClient construction logic — the loader resolves
13
+ * `config.mobileUse` from the same env / CLI flags / config-file source
14
+ * the rest of the agent uses.
15
+ */
16
+ import { AndroidAdbAdapter } from "./adapters/device-android-adb.js";
17
+ import { InnerLoopVlm } from "./adapters/vlm-inner-loop.js";
18
+ import { loadConfig } from "./config/loader.js";
19
+ const DEFAULT_MAX_STEPS = 30;
20
+ /**
21
+ * Drive the connected Android phone to complete a natural-language task.
22
+ *
23
+ * @param max_steps Maximum VLM steps for this call. When omitted, uses DEFAULT_MAX_STEPS (30).
24
+ * Callers (including outer agents) should explicitly pass this value;
25
+ * only test:mobile reads GUI_AGENT_MAX_STEPS from env as a convenience.
26
+ *
27
+ * @internal — use `bootstrap()` or `InnerLoopVlm` directly in production code.
28
+ */
29
+ export async function mobileUse(task, max_steps) {
30
+ const cfg = loadConfig({});
31
+ const max = max_steps ?? cfg.maxSteps ?? DEFAULT_MAX_STEPS;
32
+ const device = new AndroidAdbAdapter({
33
+ serial: cfg.adbSerial ?? process.env.GUI_AGENT_DEVICE_ID ?? undefined,
34
+ skipConnectValidation: true,
35
+ });
36
+ const opts = {
37
+ apiKey: cfg.mobileUse.apiKey || cfg.vlmApiKey || undefined,
38
+ baseUrl: cfg.mobileUse.baseUrl || cfg.vlmBaseUrl || undefined,
39
+ modelName: cfg.mobileUse.model || cfg.vlmModel || undefined,
40
+ maxSteps: max,
41
+ lang: (process.env.GUI_AGENT_LANG ?? "cn"),
42
+ verbose: process.env.GUI_AGENT_VERBOSE !== "0",
43
+ };
44
+ const vlm = new InnerLoopVlm(device, opts);
45
+ const result = await vlm.runTask({ task, maxSteps: max });
46
+ return result.finalMessage;
47
+ }
48
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,YAAY,EAA4B,MAAM,8BAA8B,CAAC;AACtF,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAKhD,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAE7B;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAY,EAAE,SAAkB;IAC9D,MAAM,GAAG,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;IAC3B,MAAM,GAAG,GAAG,SAAS,IAAI,GAAG,CAAC,QAAQ,IAAI,iBAAiB,CAAC;IAE3D,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAC;QACnC,MAAM,EAAE,GAAG,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,SAAS;QACrE,qBAAqB,EAAE,IAAI;KAC5B,CAAC,CAAC;IAEH,MAAM,IAAI,GAAwB;QAChC,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,MAAM,IAAI,GAAG,CAAC,SAAS,IAAI,SAAS;QAC1D,OAAO,EAAE,GAAG,CAAC,SAAS,CAAC,OAAO,IAAI,GAAG,CAAC,UAAU,IAAI,SAAS;QAC7D,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,KAAK,IAAI,GAAG,CAAC,QAAQ,IAAI,SAAS;QAC3D,QAAQ,EAAE,GAAG;QACb,IAAI,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,IAAI,CAAgB;QACzD,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,GAAG;KAC/C,CAAC;IACF,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1D,OAAO,MAAM,CAAC,YAAY,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Application — AgentHostImpl.
3
+ *
4
+ * Concrete implementation of the `AgentHost` port. Sits between an
5
+ * `IAgentCore` (the agent brain) and an arbitrary number of
6
+ * `AgentPlugin`s (ACP, HTTP debug, agent-sync, custom).
7
+ *
8
+ * Responsibilities:
9
+ * - assign stable `taskId`s
10
+ * - propagate `taskId` (and optional `correlationTag`) into the
11
+ * pino correlation context so every log line during a task carries it
12
+ * - translate `IAgentCore` callbacks (onText / onReasoning / onTool /
13
+ * onStep) into a typed `AgentEvent` union dispatched to all listeners
14
+ * - track per-task AbortControllers for `cancel(taskId)`
15
+ *
16
+ * The host is intentionally protocol-agnostic: it knows nothing about
17
+ * ACP `session/update` envelopes, HTTP REST shapes, or A2A. Plugins
18
+ * own those translations.
19
+ */
20
+ import { type Logger } from "../logger/index.js";
21
+ import type { IAgentCore } from "../ports/agent-core.js";
22
+ import type { AgentEventListener, AgentHost, SubmitTaskOptions, SubmittedTask } from "../ports/agent-host.js";
23
+ import type { IDeviceIdentity } from "../ports/identity.js";
24
+ import type { DeviceManager } from "./device-manager.js";
25
+ export interface AgentHostOptions {
26
+ agent: IAgentCore;
27
+ devices: DeviceManager;
28
+ identity?: IDeviceIdentity;
29
+ logger?: Logger;
30
+ /** Soft cap on inner steps when callers don't provide their own. */
31
+ defaultMaxSteps?: number;
32
+ /** Override notice throttle (ms). Tests pin this to 0 to disable. */
33
+ noticeWarnThrottleMs?: number;
34
+ }
35
+ export declare class AgentHostImpl implements AgentHost {
36
+ readonly agent: IAgentCore;
37
+ readonly devices: DeviceManager;
38
+ readonly identity?: IDeviceIdentity;
39
+ private readonly log;
40
+ private readonly defaultMaxSteps;
41
+ private readonly noticeWarnThrottleMs;
42
+ private readonly listeners;
43
+ private readonly tasks;
44
+ constructor(opts: AgentHostOptions);
45
+ on(listener: AgentEventListener): () => void;
46
+ submitTask(prompt: string, opts?: SubmitTaskOptions): SubmittedTask;
47
+ cancel(taskId: string): boolean;
48
+ cancelAll(): Promise<void>;
49
+ private runOne;
50
+ /**
51
+ * Translate a structured runtime error into a `task:notice` for the
52
+ * UI, throttling non-fatal warnings so a 5xx retry storm doesn't
53
+ * spam the chat. Fatal errors bypass the throttle entirely (the user
54
+ * needs to see them immediately) and are also injected by the
55
+ * `task:end with error` branch above as a safety net.
56
+ */
57
+ private handleAgentError;
58
+ private dispatch;
59
+ }
@@ -0,0 +1,263 @@
1
+ /**
2
+ * Application — AgentHostImpl.
3
+ *
4
+ * Concrete implementation of the `AgentHost` port. Sits between an
5
+ * `IAgentCore` (the agent brain) and an arbitrary number of
6
+ * `AgentPlugin`s (ACP, HTTP debug, agent-sync, custom).
7
+ *
8
+ * Responsibilities:
9
+ * - assign stable `taskId`s
10
+ * - propagate `taskId` (and optional `correlationTag`) into the
11
+ * pino correlation context so every log line during a task carries it
12
+ * - translate `IAgentCore` callbacks (onText / onReasoning / onTool /
13
+ * onStep) into a typed `AgentEvent` union dispatched to all listeners
14
+ * - track per-task AbortControllers for `cancel(taskId)`
15
+ *
16
+ * The host is intentionally protocol-agnostic: it knows nothing about
17
+ * ACP `session/update` envelopes, HTTP REST shapes, or A2A. Plugins
18
+ * own those translations.
19
+ */
20
+ import { randomUUID } from "node:crypto";
21
+ import { getLogger, runWithCorrelation } from "../logger/index.js";
22
+ /**
23
+ * Minimum gap between consecutive `task:notice` (level=warn) events for a
24
+ * single task. ARouter / VLM 5xx storms can trigger `onError` dozens of
25
+ * times per second; without this throttle the chat would fill up with
26
+ * "Model temporarily unavailable…" lines. Fatal errors and the final
27
+ * `task:end` notice bypass this throttle.
28
+ */
29
+ const NOTICE_WARN_THROTTLE_MS = 5_000;
30
+ export class AgentHostImpl {
31
+ agent;
32
+ devices;
33
+ identity;
34
+ log;
35
+ defaultMaxSteps;
36
+ noticeWarnThrottleMs;
37
+ listeners = new Set();
38
+ tasks = new Map();
39
+ constructor(opts) {
40
+ this.agent = opts.agent;
41
+ this.devices = opts.devices;
42
+ this.identity = opts.identity;
43
+ this.log = opts.logger ?? getLogger();
44
+ this.defaultMaxSteps = opts.defaultMaxSteps ?? 30;
45
+ this.noticeWarnThrottleMs = opts.noticeWarnThrottleMs ?? NOTICE_WARN_THROTTLE_MS;
46
+ }
47
+ on(listener) {
48
+ this.listeners.add(listener);
49
+ return () => this.listeners.delete(listener);
50
+ }
51
+ submitTask(prompt, opts = {}) {
52
+ const taskId = randomUUID();
53
+ // We deliberately keep `turnId` distinct from `taskId` at the type
54
+ // level even though we mirror them 1:1 today — see AgentEvent docs.
55
+ const turnId = taskId;
56
+ // One task = one logical agent message. All chunk / thought / tool /
57
+ // notice events stamp this id onto the envelope so chat-store's
58
+ // sidecar resolver pins them to the same assistant bubble.
59
+ const messageId = randomUUID();
60
+ const controller = new AbortController();
61
+ if (opts.abortSignal) {
62
+ if (opts.abortSignal.aborted)
63
+ controller.abort();
64
+ else
65
+ opts.abortSignal.addEventListener("abort", () => controller.abort(), { once: true });
66
+ }
67
+ const correlation = {
68
+ taskId,
69
+ ...(opts.correlationTag ? { sessionId: opts.correlationTag } : {}),
70
+ };
71
+ const done = runWithCorrelation(correlation, () => this.runOne(taskId, turnId, messageId, prompt, controller.signal, opts.maxSteps));
72
+ this.tasks.set(taskId, {
73
+ taskId,
74
+ turnId,
75
+ messageId,
76
+ controller,
77
+ done,
78
+ lastWarnNoticeAt: 0,
79
+ fatalNoticeDispatched: false,
80
+ });
81
+ void done.finally(() => {
82
+ this.tasks.delete(taskId);
83
+ });
84
+ return {
85
+ taskId,
86
+ done,
87
+ cancel: () => this.cancel(taskId),
88
+ };
89
+ }
90
+ cancel(taskId) {
91
+ const t = this.tasks.get(taskId);
92
+ if (!t)
93
+ return false;
94
+ if (t.controller.signal.aborted)
95
+ return false;
96
+ t.controller.abort();
97
+ return true;
98
+ }
99
+ async cancelAll() {
100
+ for (const t of this.tasks.values()) {
101
+ if (!t.controller.signal.aborted)
102
+ t.controller.abort();
103
+ }
104
+ await Promise.allSettled(Array.from(this.tasks.values()).map((t) => t.done));
105
+ }
106
+ // ── Internal ───────────────────────────────────────────────────────────────
107
+ async runOne(taskId, turnId, messageId, prompt, signal, maxSteps) {
108
+ const createdAt = Date.now();
109
+ await this.dispatch({ type: "task:start", taskId, turnId, prompt, createdAt });
110
+ let result;
111
+ let error;
112
+ try {
113
+ result = await this.agent.run({
114
+ task: prompt,
115
+ maxSteps: maxSteps ?? this.defaultMaxSteps,
116
+ abortSignal: signal,
117
+ onText: async (text) => {
118
+ if (!text)
119
+ return;
120
+ await this.dispatch({ type: "task:text", taskId, turnId, messageId, text });
121
+ },
122
+ onReasoning: async (text) => {
123
+ if (!text)
124
+ return;
125
+ await this.dispatch({ type: "task:reasoning", taskId, turnId, messageId, text });
126
+ },
127
+ onTool: async (tool) => {
128
+ await this.dispatch({ type: "task:tool", taskId, turnId, messageId, tool });
129
+ },
130
+ onStep: async (step) => {
131
+ await this.dispatch({ type: "task:step", taskId, turnId, messageId, step });
132
+ },
133
+ onError: async (err) => {
134
+ await this.handleAgentError(taskId, err);
135
+ },
136
+ });
137
+ }
138
+ catch (e) {
139
+ error = e;
140
+ this.log.warn({ err: error.message, taskId }, "agent-host: task failed");
141
+ result = {
142
+ finalMessage: error.message ?? String(error),
143
+ steps: 0,
144
+ cancelled: signal.aborted,
145
+ };
146
+ }
147
+ // Surface terminal failure to the user *before* `task:end` so the
148
+ // chat shows "Task failed: …" instead of going silent. Cancellation
149
+ // is intentionally NOT translated into a notice — the UI already
150
+ // shows the cancel acknowledgement, and a duplicated error bubble
151
+ // there feels punitive.
152
+ //
153
+ // Dedup safety net: when the agent's own `onError` already routed a
154
+ // fatal notice through `handleAgentError` (e.g. inner `AgentLoop`
155
+ // fired `STEP_BUDGET` / `TIMEOUT` / `MODEL_FAIL` with `fatal=true`),
156
+ // skip the redundant emission here. Without this guard the UI shows
157
+ // BOTH "Task failed: agent exceeded 94220ms budget" (from onError)
158
+ // AND a second "Task failed: …" capsule (from this fallback) — which
159
+ // is exactly the double-TIMEOUT + double-error-text mess the user
160
+ // hit on the calculator session.
161
+ const tInfo = this.tasks.get(taskId);
162
+ if (error && !signal.aborted && !tInfo?.fatalNoticeDispatched) {
163
+ if (tInfo)
164
+ tInfo.fatalNoticeDispatched = true;
165
+ await this.dispatch({
166
+ type: "task:notice",
167
+ taskId,
168
+ turnId,
169
+ messageId,
170
+ level: "error",
171
+ text: `Task failed: ${error.message ?? String(error)}`,
172
+ });
173
+ }
174
+ const ev = {
175
+ type: "task:end",
176
+ taskId,
177
+ turnId,
178
+ result,
179
+ completedAt: Date.now(),
180
+ ...(error ? { error: error.message ?? String(error) } : {}),
181
+ };
182
+ await this.dispatch(ev);
183
+ return result;
184
+ }
185
+ /**
186
+ * Translate a structured runtime error into a `task:notice` for the
187
+ * UI, throttling non-fatal warnings so a 5xx retry storm doesn't
188
+ * spam the chat. Fatal errors bypass the throttle entirely (the user
189
+ * needs to see them immediately) and are also injected by the
190
+ * `task:end with error` branch above as a safety net.
191
+ */
192
+ async handleAgentError(taskId, err) {
193
+ const t = this.tasks.get(taskId);
194
+ if (!t)
195
+ return;
196
+ const level = err.fatal ? "error" : "warn";
197
+ if (level === "warn" && this.noticeWarnThrottleMs > 0) {
198
+ const now = Date.now();
199
+ if (now - t.lastWarnNoticeAt < this.noticeWarnThrottleMs)
200
+ return;
201
+ t.lastWarnNoticeAt = now;
202
+ }
203
+ // Fatal-notice dedup: at most one error-level notice per task. The
204
+ // first wins (typically the structured `STEP_BUDGET` / `TIMEOUT` /
205
+ // `MODEL_FAIL` from the inner AgentLoop). Subsequent fatal errors
206
+ // for the same task collapse silently — the `task:end` envelope
207
+ // still carries the final error string for log / audit consumers.
208
+ if (level === "error") {
209
+ if (t.fatalNoticeDispatched)
210
+ return;
211
+ t.fatalNoticeDispatched = true;
212
+ }
213
+ const text = err.fatal
214
+ ? formatFatalNoticeText(err)
215
+ : `Model temporarily unavailable, retrying… (${err.code})`;
216
+ await this.dispatch({
217
+ type: "task:notice",
218
+ taskId,
219
+ turnId: t.turnId,
220
+ messageId: t.messageId,
221
+ level,
222
+ text,
223
+ });
224
+ }
225
+ async dispatch(event) {
226
+ if (this.listeners.size === 0)
227
+ return;
228
+ for (const listener of Array.from(this.listeners)) {
229
+ try {
230
+ await listener(event);
231
+ }
232
+ catch (e) {
233
+ this.log.warn({ err: e.message, eventType: event.type }, "agent-host: listener threw");
234
+ }
235
+ }
236
+ }
237
+ }
238
+ /**
239
+ * Pick a user-friendly notice string for a fatal `AgentCoreRunError`.
240
+ *
241
+ * Some structured codes carry awkward / contradictory wording when shown
242
+ * after a successful-looking final reply. In particular `STEP_BUDGET`'s
243
+ * raw message is `hit step budget 20`, which paired with the agent's own
244
+ * "任务已经完成" line reads as "all done — also failed". The user-visible
245
+ * footer benefits from a calmer, more descriptive phrasing.
246
+ *
247
+ * Mapping:
248
+ * - `STEP_BUDGET` → `Reached max steps (N)` (extracts N from message)
249
+ * - `TIMEOUT` → `Task timed out`
250
+ * - any other code → falls back to `Task failed: …` (preserves the
251
+ * structured message for debugging-style codes
252
+ * like `MODEL_FAIL` / `MCP_ACT_FAILED`).
253
+ */
254
+ function formatFatalNoticeText(err) {
255
+ if (err.code === "STEP_BUDGET") {
256
+ const m = /(\d+)/.exec(err.message ?? "");
257
+ return m ? `Reached max steps (${m[1]})` : "Reached max steps";
258
+ }
259
+ if (err.code === "TIMEOUT")
260
+ return "Task timed out";
261
+ return `Task failed: ${err.message || err.code}`;
262
+ }
263
+ //# sourceMappingURL=agent-host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-host.js","sourceRoot":"","sources":["../../src/app/agent-host.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Application use case — DeviceManager.
3
+ *
4
+ * MVP keeps a single active IDevice (parity with the Python agent which is
5
+ * 1 device = 1 process). The class is structured to support multi-device
6
+ * fan-out later — the inbound layer never has to be rewritten when that day
7
+ * comes.
8
+ */
9
+ import type { IDevice, DeviceInfo } from "../ports/device.js";
10
+ export interface DeviceRegistration {
11
+ /** Stable id for the device — defaults to `info.name` or `default`. */
12
+ id: string;
13
+ device: IDevice;
14
+ info?: DeviceInfo;
15
+ }
16
+ export declare class DeviceManager {
17
+ private readonly devices;
18
+ private activeId;
19
+ /** Register and connect a device. Returns the canonical id used. */
20
+ register(device: IDevice, id?: string): Promise<DeviceRegistration>;
21
+ list(): DeviceRegistration[];
22
+ get(id?: string): DeviceRegistration | undefined;
23
+ active(): IDevice;
24
+ setActive(id: string): void;
25
+ disconnectAll(): Promise<void>;
26
+ /** Quick liveness probe; returns true iff device.getInfo() resolves. */
27
+ healthCheck(id?: string): Promise<boolean>;
28
+ }