@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,464 @@
1
+ /**
2
+ * HTTP debug server (Fastify) — backed by AgentHost.
3
+ *
4
+ * Mirrors the Python `DeviceAgentAPI` route table 1:1. Used for local testing,
5
+ * `curl`-friendly debugging, and the device-viewer web client. Production
6
+ * traffic flows through ACP — HTTP is opt-in.
7
+ *
8
+ * Tasks submitted via `POST /tasks` are forwarded to `AgentHost.submitTask`.
9
+ * The server keeps a private `HttpTaskStore` populated from `host.on(...)`
10
+ * events to back the legacy `/tasks/*` polling routes.
11
+ *
12
+ * adb-proxy routes are stubbed: they respond `404 not active` until the proxy
13
+ * is implemented.
14
+ */
15
+ import Fastify from "fastify";
16
+ import cors from "@fastify/cors";
17
+ import multipart from "@fastify/multipart";
18
+ import { randomUUID } from "node:crypto";
19
+ import * as fs from "node:fs";
20
+ import * as os from "node:os";
21
+ import * as path from "node:path";
22
+ import { pipeline } from "node:stream/promises";
23
+ import { parseAcpAction } from "../../core/actions.js";
24
+ import { AcpError, DeviceError, VlmError } from "../../core/errors.js";
25
+ import { enterCorrelation, getLogger } from "../../logger/index.js";
26
+ /**
27
+ * Minimal task store driven by `AgentHost` events. Owned by the HTTP
28
+ * debug plugin so it can serve `/tasks` polling routes without reaching
29
+ * into the ACP plugin's session state.
30
+ */
31
+ export class HttpTaskStore {
32
+ tasks = new Map();
33
+ submitted = new Map();
34
+ detach = null;
35
+ attach(host) {
36
+ if (this.detach)
37
+ return;
38
+ this.detach = host.on((ev) => this.onEvent(ev));
39
+ }
40
+ stop() {
41
+ if (this.detach) {
42
+ this.detach();
43
+ this.detach = null;
44
+ }
45
+ }
46
+ /**
47
+ * Track a task that this store submitted. Tasks submitted by other
48
+ * plugins (e.g. ACP `prompt`) will not appear in `/tasks` listings —
49
+ * the debug HTTP API only shows what was submitted through it.
50
+ */
51
+ track(task, prompt) {
52
+ const rec = {
53
+ id: task.taskId,
54
+ prompt,
55
+ status: "pending",
56
+ createdAt: Date.now(),
57
+ startedAt: null,
58
+ completedAt: null,
59
+ result: null,
60
+ error: null,
61
+ steps: [],
62
+ };
63
+ this.tasks.set(task.taskId, rec);
64
+ this.submitted.set(task.taskId, task);
65
+ return rec;
66
+ }
67
+ list() {
68
+ return Array.from(this.tasks.values()).sort((a, b) => b.createdAt - a.createdAt);
69
+ }
70
+ get(id) {
71
+ return this.tasks.get(id);
72
+ }
73
+ cancel(id) {
74
+ const t = this.submitted.get(id);
75
+ if (!t)
76
+ return false;
77
+ return t.cancel();
78
+ }
79
+ pruneCompleted(olderThanMs = 60 * 60 * 1000) {
80
+ const cutoff = Date.now() - olderThanMs;
81
+ let removed = 0;
82
+ for (const [id, t] of this.tasks) {
83
+ if (t.status !== "completed" && t.status !== "failed" && t.status !== "cancelled")
84
+ continue;
85
+ const ts = t.completedAt ?? t.createdAt;
86
+ if (ts < cutoff) {
87
+ this.tasks.delete(id);
88
+ this.submitted.delete(id);
89
+ removed += 1;
90
+ }
91
+ }
92
+ return removed;
93
+ }
94
+ // ── Internal ───────────────────────────────────────────────────────────────
95
+ onEvent(ev) {
96
+ const rec = this.tasks.get(ev.taskId);
97
+ if (!rec)
98
+ return;
99
+ if (ev.type === "task:start") {
100
+ rec.status = "running";
101
+ rec.startedAt = ev.createdAt;
102
+ return;
103
+ }
104
+ if (ev.type === "task:step") {
105
+ const step = ev.step;
106
+ const action = step.action ? step.action.kind : step.finished ? "done" : "wait";
107
+ const parameters = step.action ? extractActionParams(step.action) : {};
108
+ rec.steps.push({
109
+ index: step.stepIndex,
110
+ action,
111
+ parameters,
112
+ status: step.finished ? "completed" : "running",
113
+ reasoning: step.thinking,
114
+ });
115
+ return;
116
+ }
117
+ if (ev.type === "task:end") {
118
+ rec.completedAt = ev.completedAt;
119
+ if (ev.error) {
120
+ rec.status = "failed";
121
+ rec.error = ev.error;
122
+ }
123
+ else if (ev.result.cancelled) {
124
+ rec.status = "cancelled";
125
+ }
126
+ else {
127
+ rec.status = "completed";
128
+ rec.result = ev.result.finalMessage;
129
+ }
130
+ return;
131
+ }
132
+ // task:text / task:tool: ignored — HTTP debug API surfaces VlmStep records
133
+ }
134
+ }
135
+ export class HttpServer {
136
+ opts;
137
+ app = null;
138
+ tasks = new HttpTaskStore();
139
+ constructor(opts) {
140
+ this.opts = {
141
+ devices: opts.devices,
142
+ host: opts.host,
143
+ bindHost: opts.bindHost ?? "127.0.0.1",
144
+ port: opts.port ?? 9090,
145
+ log: opts.log ?? false,
146
+ corsOrigins: opts.corsOrigins ?? "",
147
+ };
148
+ }
149
+ async start() {
150
+ this.tasks.attach(this.opts.host);
151
+ const app = Fastify({ logger: this.opts.log });
152
+ await app.register(cors, {
153
+ origin: parseCorsOrigins(this.opts.corsOrigins),
154
+ methods: ["GET", "POST", "PUT", "DELETE", "OPTIONS"],
155
+ allowedHeaders: ["Content-Type", "Authorization"],
156
+ maxAge: 86400,
157
+ });
158
+ await app.register(multipart, { limits: { fileSize: 200 * 1024 * 1024 } });
159
+ app.addHook("onRequest", (req, _reply, done) => {
160
+ const incoming = req.headers["x-request-id"] ??
161
+ req.headers["x-correlation-id"];
162
+ const requestId = incoming || randomUUID();
163
+ req.requestId = requestId;
164
+ enterCorrelation({ requestId });
165
+ done();
166
+ });
167
+ app.setErrorHandler(buildErrorHandler);
168
+ this.registerRoutes(app);
169
+ await app.listen({ host: this.opts.bindHost, port: this.opts.port });
170
+ this.app = app;
171
+ }
172
+ async stop() {
173
+ if (this.app)
174
+ await this.app.close();
175
+ this.app = null;
176
+ this.tasks.stop();
177
+ }
178
+ /** For tests: returns the underlying Fastify instance for `inject()` calls. */
179
+ get instance() {
180
+ return this.app;
181
+ }
182
+ registerRoutes(app) {
183
+ const { devices, host } = this.opts;
184
+ const tasks = this.tasks;
185
+ app.get("/health", async () => {
186
+ const reg = devices.get();
187
+ if (!reg)
188
+ return { status: "ok", device: null, connected: false };
189
+ const info = await reg.device.getInfo().catch(() => null);
190
+ return {
191
+ status: "ok",
192
+ device: info?.name ?? reg.id,
193
+ connected: !!info,
194
+ };
195
+ });
196
+ app.get("/device/info", async () => {
197
+ const info = await devices.active().getInfo();
198
+ return {
199
+ type: info.type,
200
+ name: info.name,
201
+ os: info.os,
202
+ version: info.osVersion,
203
+ screen: { width: info.width, height: info.height, density: info.density },
204
+ capabilities: info.capabilities,
205
+ };
206
+ });
207
+ app.get("/device/screenshot", async () => {
208
+ const ss = await devices.active().capture({ raw: true });
209
+ return { image: ss.imageBase64, format: ss.imageFormat };
210
+ });
211
+ app.get("/device/ui-tree", async () => {
212
+ const nodes = await devices.active().getUiTree();
213
+ return { nodes };
214
+ });
215
+ app.get("/device/screenshot.png", async (_req, reply) => {
216
+ const ss = await devices.active().capture({ raw: true });
217
+ const buf = Buffer.from(ss.imageBase64, "base64");
218
+ reply.header("Content-Type", "image/png");
219
+ return reply.send(buf);
220
+ });
221
+ app.post("/device/action", async (req) => {
222
+ const body = (req.body ?? {});
223
+ const action = body.action ?? "";
224
+ const params = body.parameters ?? {};
225
+ if (!action)
226
+ throw new DeviceError("action is required", { subtype: "invalid_args" });
227
+ if (action === "shell") {
228
+ if (process.env.BEEOS_SHELL_ALLOW !== "true") {
229
+ throw new AcpError("shell command execution is disabled — set BEEOS_SHELL_ALLOW=true to opt in", -32603, { category: "shell-disabled" });
230
+ }
231
+ const out = await devices.active().shell(params.command ?? "");
232
+ return { output: out };
233
+ }
234
+ const a = parseAcpAction(action, params);
235
+ await devices.active().apply(a);
236
+ return { ok: true };
237
+ });
238
+ app.post("/tasks", async (req, reply) => {
239
+ const body = (req.body ?? {});
240
+ const instruction = body.instruction ?? "";
241
+ if (!instruction) {
242
+ throw new AcpError("instruction is required", -32602);
243
+ }
244
+ const submitted = host.submitTask(instruction);
245
+ const rec = tasks.track(submitted, instruction);
246
+ return reply.status(201).send({
247
+ task_id: rec.id,
248
+ status: rec.status,
249
+ instruction: rec.prompt,
250
+ });
251
+ });
252
+ app.get("/tasks", async (req) => {
253
+ const limit = Number((req.query?.limit) ?? 50);
254
+ const list = tasks.list().slice(0, limit);
255
+ return {
256
+ tasks: list.map((t) => ({
257
+ id: t.id,
258
+ instruction: t.prompt,
259
+ status: t.status,
260
+ steps: t.steps.length,
261
+ elapsed: t.completedAt && t.startedAt ? Math.round((t.completedAt - t.startedAt) / 100) / 10 : 0,
262
+ created_at: t.createdAt,
263
+ })),
264
+ };
265
+ });
266
+ app.get("/tasks/:task_id", async (req) => {
267
+ const t = tasks.get(req.params.task_id);
268
+ if (!t)
269
+ throw new AcpError("Task not found", -32004);
270
+ return {
271
+ id: t.id,
272
+ instruction: t.prompt,
273
+ status: t.status,
274
+ steps: t.steps,
275
+ result: t.result,
276
+ error: t.error,
277
+ elapsed: t.completedAt && t.startedAt ? Math.round((t.completedAt - t.startedAt) / 100) / 10 : 0,
278
+ };
279
+ });
280
+ app.post("/tasks/:task_id/cancel", async (req) => {
281
+ const ok = tasks.cancel(req.params.task_id);
282
+ if (!ok)
283
+ throw new AcpError("Task not found or already done", -32004);
284
+ return { ok: true };
285
+ });
286
+ app.post("/prompt", async (req, reply) => {
287
+ const body = (req.body ?? {});
288
+ const instruction = body.instruction ?? body.prompt ?? "";
289
+ const timeoutMs = (body.timeout ?? 120) * 1000;
290
+ if (!instruction)
291
+ throw new AcpError("instruction is required", -32602);
292
+ const submitted = host.submitTask(instruction);
293
+ const rec = tasks.track(submitted, instruction);
294
+ const deadline = Date.now() + timeoutMs;
295
+ while (Date.now() < deadline) {
296
+ const cur = tasks.get(rec.id);
297
+ if (cur && (cur.status === "completed" || cur.status === "failed" || cur.status === "cancelled")) {
298
+ return {
299
+ task_id: cur.id,
300
+ status: cur.status,
301
+ result: cur.result,
302
+ error: cur.error,
303
+ steps: cur.steps,
304
+ elapsed: cur.completedAt && cur.startedAt ? Math.round((cur.completedAt - cur.startedAt) / 100) / 10 : 0,
305
+ };
306
+ }
307
+ await sleep(1000);
308
+ }
309
+ return reply.status(202).send({
310
+ task_id: rec.id,
311
+ status: "running",
312
+ message: "Task still running, check /tasks/{task_id} for updates",
313
+ });
314
+ });
315
+ app.post("/device/install-apk", async (req) => {
316
+ const data = await req.file({ limits: { fileSize: 200 * 1024 * 1024 } });
317
+ // Accept either `file` (web frontend convention) or `apk` (legacy)
318
+ // multipart field name.
319
+ if (!data || (data.fieldname !== "file" && data.fieldname !== "apk")) {
320
+ throw new DeviceError("multipart field 'file' or 'apk' required", {
321
+ subtype: "invalid_args",
322
+ });
323
+ }
324
+ const filename = path.basename(data.filename ?? "upload.apk");
325
+ if (!filename.endsWith(".apk")) {
326
+ throw new DeviceError("only .apk files accepted", { subtype: "invalid_args" });
327
+ }
328
+ const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "beeos_apk_"));
329
+ const tmpPath = path.join(tmpDir, filename);
330
+ let size = 0;
331
+ try {
332
+ await pipeline(data.file, fs.createWriteStream(tmpPath).on("drain", () => undefined));
333
+ size = fs.statSync(tmpPath).size;
334
+ await devices.active().install(tmpPath);
335
+ return { ok: true, filename, size };
336
+ }
337
+ finally {
338
+ try {
339
+ fs.unlinkSync(tmpPath);
340
+ }
341
+ catch { /* ignore */ }
342
+ try {
343
+ fs.rmdirSync(tmpDir);
344
+ }
345
+ catch { /* ignore */ }
346
+ }
347
+ });
348
+ // ── adb-proxy routes — stub-only until the proxy lands ─────────────────
349
+ const adbStubResp = (reply) => reply.status(404).send({ error: "ADB proxy not active" });
350
+ app.post("/adb-proxy/keys", async (_req, reply) => adbStubResp(reply));
351
+ app.delete("/adb-proxy/keys", async (_req, reply) => adbStubResp(reply));
352
+ app.get("/adb-proxy/status", async () => ({ active: false }));
353
+ }
354
+ }
355
+ function sleep(ms) {
356
+ return new Promise((res) => setTimeout(res, ms));
357
+ }
358
+ function extractActionParams(a) {
359
+ const { kind: _kind, ...rest } = a;
360
+ return rest;
361
+ }
362
+ const DEFAULT_LOCAL_ORIGINS = [
363
+ "http://localhost:3000",
364
+ "http://127.0.0.1:3000",
365
+ "http://localhost:5173",
366
+ "http://127.0.0.1:5173",
367
+ "http://localhost:5174",
368
+ "http://127.0.0.1:5174",
369
+ ];
370
+ /** Parse the `corsOrigins` config value into the shape `@fastify/cors` wants. */
371
+ function parseCorsOrigins(raw) {
372
+ const trimmed = (raw ?? "").trim();
373
+ if (trimmed === "*")
374
+ return true;
375
+ if (!trimmed)
376
+ return DEFAULT_LOCAL_ORIGINS;
377
+ const list = trimmed
378
+ .split(",")
379
+ .map((s) => s.trim())
380
+ .filter((s) => s.length > 0);
381
+ return list.length > 0 ? list : DEFAULT_LOCAL_ORIGINS;
382
+ }
383
+ /**
384
+ * Global Fastify error handler — every thrown error funnels through here.
385
+ *
386
+ * Response envelope: `{ error: { code, message, requestId, category?, subtype?, retriable? } }`.
387
+ * The handler also emits a structured log entry that includes the full stack
388
+ * (filtered through pino redact in production via the shared logger).
389
+ */
390
+ export function buildErrorHandler(err, request, reply) {
391
+ const requestId = request.requestId ?? randomUUID();
392
+ const log = getLogger().child({ component: "http" });
393
+ if (err instanceof AcpError) {
394
+ const status = mapJsonRpcStatus(err.code);
395
+ log.warn({ requestId, route: request.url, code: err.code, err }, "acp error");
396
+ return reply.status(status).send({
397
+ error: {
398
+ code: err.code,
399
+ message: err.message,
400
+ requestId,
401
+ category: "acp",
402
+ ...(err.data && typeof err.data === "object" ? { data: err.data } : {}),
403
+ },
404
+ });
405
+ }
406
+ if (err instanceof DeviceError) {
407
+ const status = err.subtype === "invalid_args" ? 400 : err.subtype === "not_ready" ? 409 : 502;
408
+ log.warn({ requestId, route: request.url, subtype: err.subtype, retriable: err.retriable, err }, "device error");
409
+ return reply.status(status).send({
410
+ error: {
411
+ code: -32001,
412
+ message: err.message,
413
+ requestId,
414
+ category: "device",
415
+ subtype: err.subtype,
416
+ retriable: err.retriable,
417
+ },
418
+ });
419
+ }
420
+ if (err instanceof VlmError) {
421
+ log.warn({ requestId, route: request.url, retriable: err.retriable, err }, "vlm error");
422
+ return reply.status(502).send({
423
+ error: {
424
+ code: -32002,
425
+ message: err.message,
426
+ requestId,
427
+ category: "vlm",
428
+ retriable: err.retriable,
429
+ },
430
+ });
431
+ }
432
+ // Fastify validation / 4xx errors carry a `statusCode`.
433
+ const fastifyErr = err;
434
+ if (fastifyErr.statusCode && fastifyErr.statusCode >= 400 && fastifyErr.statusCode < 500) {
435
+ log.warn({ requestId, route: request.url, statusCode: fastifyErr.statusCode, err }, "client error");
436
+ return reply.status(fastifyErr.statusCode).send({
437
+ error: {
438
+ code: -32602,
439
+ message: err.message,
440
+ requestId,
441
+ category: "client",
442
+ },
443
+ });
444
+ }
445
+ log.error({ requestId, route: request.url, err }, "unhandled error");
446
+ return reply.status(500).send({
447
+ error: {
448
+ code: -32000,
449
+ message: "internal server error",
450
+ requestId,
451
+ category: "internal",
452
+ },
453
+ });
454
+ }
455
+ function mapJsonRpcStatus(code) {
456
+ if (code === -32700 || code === -32600 || code === -32602)
457
+ return 400;
458
+ if (code === -32601 || code === -32004)
459
+ return 404;
460
+ if (code === -32603)
461
+ return 500;
462
+ return 400;
463
+ }
464
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/plugins/http-debug/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,158 @@
1
+ /**
2
+ * Port — IAgentCore.
3
+ *
4
+ * Represents the *entire* agent brain (potentially two-layered:
5
+ * outer orchestrator + inner mobile_use VLM loop) as a single black box
6
+ * that the rest of the process talks to. The core is intentionally
7
+ * **unaware** of:
8
+ *
9
+ * - ACP / Bridge / HTTP transports
10
+ * - SessionManager / TaskRunner accounting
11
+ * - the pi-coding-agent vs single-layer details
12
+ *
13
+ * Plugins (ACP, HTTP debug, agent-sync, ...) interact with the core
14
+ * indirectly through `AgentHost`. The host owns the IAgentCore instance
15
+ * and dispatches events; plugins never call `IAgentCore.run` directly.
16
+ *
17
+ * Implementations:
18
+ * - `adapters/agentcore-pi.ts` — pi-coding-agent two-layer orchestrator
19
+ * (default; outer = arouter/kimi-k2.6, inner = autoglm-9b via mobile_use)
20
+ * - `adapters/agentcore-inner-loop.ts` — single-layer fallback that wraps
21
+ * `vlm-inner-loop.ts` (selected by `--legacy-inner`)
22
+ */
23
+ import type { Action } from "../core/actions.js";
24
+ /**
25
+ * Tool / action event surfaced by the agent core. Mirrors what an outer
26
+ * orchestrator would emit when calling a tool like `mobile_use`, `ground`,
27
+ * or `ui_xml`. For the legacy single-layer adapter, every step's
28
+ * `Action` is also reported as a synthetic `ToolCallEvent` (`name = action.kind`)
29
+ * so consumers can keep one code path.
30
+ */
31
+ export interface ToolCallEvent {
32
+ /** Stable id local to this run (orchestrator-assigned). */
33
+ id: string;
34
+ /** Tool name, e.g. `mobile_use`, `ground`, or for the legacy adapter: `tap`, `swipe`, ... */
35
+ name: string;
36
+ /** JSON-serializable arguments passed to the tool. */
37
+ args: Record<string, unknown>;
38
+ /**
39
+ * Lifecycle phase:
40
+ * - `start` — tool was invoked
41
+ * - `update` — partial result or progress
42
+ * - `end` — tool finished (`isError` and `result` populated)
43
+ */
44
+ status: "start" | "update" | "end";
45
+ /** Free-form result blob (string output, structured JSON, …). */
46
+ result?: unknown;
47
+ /** Whether `end` represents a failure. */
48
+ isError?: boolean;
49
+ }
50
+ /**
51
+ * Per-step record kept for backward compatibility with the legacy
52
+ * `IVlm.runTask` shape. The host translates `ToolCallEvent`s into
53
+ * `VlmStep`-style records for the ACP `tool_call_update` envelope.
54
+ *
55
+ * Re-exported under the `VlmStep` alias from `ports/vlm.ts` so existing
56
+ * imports keep working.
57
+ */
58
+ export interface VlmStep {
59
+ /** Free-form thinking/commentary, rendered as `agent_message_chunk`. */
60
+ thinking: string;
61
+ /** The action the model wants the device to perform, or null when finished. */
62
+ action: Action | null;
63
+ /** True iff the model declared the task done. */
64
+ finished: boolean;
65
+ /** Final user-facing message (only meaningful when `finished`). */
66
+ message: string | null;
67
+ }
68
+ /**
69
+ * Structured error surfaced by the agent runtime mid-run. Mirrors the
70
+ * `agent-runtime` `AgentRunHooks.onError` payload one-for-one so the
71
+ * adapter can forward it without re-shaping.
72
+ *
73
+ * `fatal=true` — the runtime gave up (e.g. exhausted retry budget); a
74
+ * `task:end` with an `error` field is about to follow. UI should show
75
+ * a terminal failure notice.
76
+ * `fatal=false` — transient, the runtime will keep retrying. UI should
77
+ * surface a soft "still trying…" hint, throttled by AgentHost so a
78
+ * long retry storm doesn't spam the chat.
79
+ */
80
+ export interface AgentCoreRunError {
81
+ code: string;
82
+ message: string;
83
+ fatal: boolean;
84
+ }
85
+ /** Optional callbacks an `IAgentCore` may invoke during `run()`. */
86
+ export interface AgentCoreRunCallbacks {
87
+ /** Streaming text delta — surfaced by ACP as `agent_message_chunk`. */
88
+ onText?: (text: string) => void | Promise<void>;
89
+ /**
90
+ * Streaming "thinking" delta — surfaced by ACP as `agent_thought_chunk`
91
+ * (a separate reasoning channel from the user-visible reply). Sources:
92
+ * VLM rationale per step (`AgentLoop`), planner `makePlan` / `replan`
93
+ * descriptions (`PlanExecutor.firePlan`), and any future o1-style
94
+ * reasoning tokens. Distinct from `onText` so the web UI can render
95
+ * thoughts in the reasoning side panel without polluting the main
96
+ * conversation stream.
97
+ */
98
+ onReasoning?: (text: string) => void | Promise<void>;
99
+ /** Tool call lifecycle — start / update / end. */
100
+ onTool?: (event: ToolCallEvent) => void | Promise<void>;
101
+ /**
102
+ * Per-step record (legacy compatibility). Mainly used by the
103
+ * single-layer `InnerLoopAgent`.
104
+ */
105
+ onStep?: (step: VlmStep & {
106
+ stepIndex: number;
107
+ }) => void | Promise<void>;
108
+ /**
109
+ * Mid-run error — typically a transient model 5xx that the runner is
110
+ * retrying. AgentHost translates this into a throttled `task:notice`
111
+ * so the UI shows "Model temporarily unavailable, retrying…" instead
112
+ * of going silent for the duration of the retry storm. The runtime
113
+ * adapter MAY also synthesise an `isError=true` `tool_call` for
114
+ * structured audit; the two are independent and complementary.
115
+ */
116
+ onError?: (err: AgentCoreRunError) => void | Promise<void>;
117
+ }
118
+ /** Result of a single `run()` call. */
119
+ export interface AgentCoreRunResult {
120
+ /** Final user-facing reply. */
121
+ finalMessage: string;
122
+ /** Number of inner steps observed (0 for the pi adapter — opaque tools). */
123
+ steps: number;
124
+ /** True iff the run terminated due to abort / timeout. */
125
+ cancelled: boolean;
126
+ }
127
+ /** Options passed to `IAgentCore.run`. */
128
+ export interface AgentCoreRunOptions extends AgentCoreRunCallbacks {
129
+ /** Natural language task / prompt. */
130
+ task: string;
131
+ /** Soft cap on inner steps (legacy adapter); pi adapter may ignore. */
132
+ maxSteps?: number;
133
+ abortSignal?: AbortSignal;
134
+ }
135
+ /**
136
+ * IAgentCore — the protocol-agnostic agent brain.
137
+ *
138
+ * Implementations MUST:
139
+ * - be safe to call concurrently with `setModel`; new tasks pick up the
140
+ * new model, in-flight tasks may keep the previous client.
141
+ * - report progress via the supplied callbacks.
142
+ * - honor `abortSignal` and reflect cancellation in the returned
143
+ * `AgentCoreRunResult.cancelled` flag.
144
+ */
145
+ export interface IAgentCore {
146
+ /** Currently active model id (informational only — e.g. for logs). */
147
+ readonly modelName: string;
148
+ /** Optional human-friendly tag for the active provider/adapter. */
149
+ readonly providerName?: string;
150
+ /** Run a single task to completion. */
151
+ run(opts: AgentCoreRunOptions): Promise<AgentCoreRunResult>;
152
+ /**
153
+ * Hot-swap the underlying model. `provider` is a free-form tag
154
+ * ("openai", "openrouter", "arouter", …) used by the implementation
155
+ * to pick the right adapter; `model` is the upstream id.
156
+ */
157
+ setModel(provider: string, model: string): Promise<void>;
158
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=agent-core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-core.js","sourceRoot":"","sources":["../../src/ports/agent-core.ts"],"names":[],"mappings":""}