@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,43 @@
1
+ /**
2
+ * ACP `device/*` handlers (6 methods).
3
+ *
4
+ * Wire format is preserved byte-for-byte (matches the Python reference and
5
+ * existing ACP clients):
6
+ * - device/info → DeviceInfo dataclass shape
7
+ * - device/screenshot → { image: <base64>, format: "png"|"jpeg" }
8
+ * - device/ui-tree → { nodes: UiNode[] }
9
+ * - device/action → { status: "ok", action: <verb> }
10
+ * - device/install → { status: "ok" }
11
+ * - device/shell → { output: <stdout> }
12
+ *
13
+ * Internally the handlers route through an `IMcpRuntime` provider — either
14
+ * the sibling `device-mcp-server` (HTTP) or the legacy in-process bridge.
15
+ * The `parseAcpAction()` translator (in `@beeos-ai/device-common`) maps the
16
+ * ACP wire vocabulary onto the unified `Action` schema, which the MCP
17
+ * runtime then dispatches.
18
+ */
19
+ import type { IMcpRuntime } from "../../../mcp-client/runtime.js";
20
+ export interface AcpDeviceHandlersOptions {
21
+ /**
22
+ * Lazy resolver for the MCP runtime — invoked per request so callers can
23
+ * swap the underlying runtime (autospawn restart, ACP device switch) at
24
+ * runtime without recreating the handlers.
25
+ */
26
+ mcpProvider: () => IMcpRuntime;
27
+ }
28
+ export declare class AcpDeviceHandlers {
29
+ private readonly mcpProvider;
30
+ constructor(provider: AcpDeviceHandlersOptions | (() => IMcpRuntime));
31
+ info(_msg: AcpMessage): Promise<Record<string, unknown>>;
32
+ screenshot(_msg: AcpMessage): Promise<Record<string, unknown>>;
33
+ uiTree(_msg: AcpMessage): Promise<Record<string, unknown>>;
34
+ action(msg: AcpMessage): Promise<Record<string, unknown>>;
35
+ install(msg: AcpMessage): Promise<Record<string, unknown>>;
36
+ shell(msg: AcpMessage): Promise<Record<string, unknown>>;
37
+ }
38
+ export interface AcpMessage {
39
+ jsonrpc?: string;
40
+ id?: string | number | null;
41
+ method?: string;
42
+ params?: Record<string, unknown>;
43
+ }
@@ -0,0 +1,153 @@
1
+ /**
2
+ * ACP `device/*` handlers (6 methods).
3
+ *
4
+ * Wire format is preserved byte-for-byte (matches the Python reference and
5
+ * existing ACP clients):
6
+ * - device/info → DeviceInfo dataclass shape
7
+ * - device/screenshot → { image: <base64>, format: "png"|"jpeg" }
8
+ * - device/ui-tree → { nodes: UiNode[] }
9
+ * - device/action → { status: "ok", action: <verb> }
10
+ * - device/install → { status: "ok" }
11
+ * - device/shell → { output: <stdout> }
12
+ *
13
+ * Internally the handlers route through an `IMcpRuntime` provider — either
14
+ * the sibling `device-mcp-server` (HTTP) or the legacy in-process bridge.
15
+ * The `parseAcpAction()` translator (in `@beeos-ai/device-common`) maps the
16
+ * ACP wire vocabulary onto the unified `Action` schema, which the MCP
17
+ * runtime then dispatches.
18
+ */
19
+ import * as os from "node:os";
20
+ import * as path from "node:path";
21
+ import { parseAcpAction } from "@beeos-ai/device-common";
22
+ import { searchUiXmlNodes } from "../../../device/ui-xml.js";
23
+ import { AcpError, DeviceError } from "../../../core/errors.js";
24
+ export class AcpDeviceHandlers {
25
+ mcpProvider;
26
+ constructor(provider) {
27
+ this.mcpProvider =
28
+ typeof provider === "function" ? provider : provider.mcpProvider;
29
+ }
30
+ async info(_msg) {
31
+ const mcp = this.mcpProvider();
32
+ if (!mcp.info) {
33
+ throw new DeviceError("device/info is not supported on this MCP runtime", { subtype: "internal_error" });
34
+ }
35
+ const info = await mcp.info();
36
+ return serializeDeviceInfo(info);
37
+ }
38
+ async screenshot(_msg) {
39
+ const mcp = this.mcpProvider();
40
+ const ss = await mcp.screenshot();
41
+ return { image: ss.b64, format: ss.format };
42
+ }
43
+ async uiTree(_msg) {
44
+ const mcp = this.mcpProvider();
45
+ // Always pull the raw uiautomator XML — searchUiXmlNodes turns it into
46
+ // the legacy `UiNode[]` ACP wire shape that existing clients expect.
47
+ const dump = await mcp.uiDump({ format: "raw" });
48
+ if (!dump.supported)
49
+ return { nodes: [] };
50
+ const nodes = searchUiXmlNodes(dump.content ?? "", "");
51
+ return { nodes };
52
+ }
53
+ async action(msg) {
54
+ const params = msg.params ?? {};
55
+ const action = params.action ?? "";
56
+ if (!action)
57
+ throw new DeviceError("'action' is required", { subtype: "invalid_args" });
58
+ // ACP wire: action args MAY arrive nested under `parameters` (HTTP-style)
59
+ // or flattened alongside `action` (legacy / convenience). Accept both.
60
+ const args = params.parameters && typeof params.parameters === "object"
61
+ ? params.parameters
62
+ : params;
63
+ const a = parseAcpAction(action, args);
64
+ const mcp = this.mcpProvider();
65
+ const r = await mcp.act(a);
66
+ if (!r.ok) {
67
+ throw new DeviceError(r.error?.message ?? `device/action ${action} failed`, {
68
+ subtype: "device_error",
69
+ cause: { code: r.error?.code, action: r.action, durationMs: r.durationMs },
70
+ });
71
+ }
72
+ return { status: "ok", action };
73
+ }
74
+ async install(msg) {
75
+ // ACP wire v2 prefers `apkPath` (camelCase); accept `apk_path` for
76
+ // backward compatibility with the Python implementation.
77
+ const params = msg.params ?? {};
78
+ const apkPath = params.apkPath ??
79
+ params.apk_path ??
80
+ "";
81
+ if (!apkPath) {
82
+ throw new DeviceError("apkPath is required", { subtype: "invalid_args" });
83
+ }
84
+ const sanitized = sanitizeApkPath(apkPath);
85
+ const mcp = this.mcpProvider();
86
+ if (!mcp.installApk) {
87
+ throw new DeviceError("device/install is not supported on this MCP runtime", { subtype: "internal_error" });
88
+ }
89
+ await mcp.installApk(sanitized);
90
+ return { status: "ok" };
91
+ }
92
+ async shell(msg) {
93
+ if (process.env.BEEOS_SHELL_ALLOW !== "true") {
94
+ throw new AcpError("shell command execution is disabled — set BEEOS_SHELL_ALLOW=true to opt in", -32603, { category: "shell-disabled" });
95
+ }
96
+ const command = msg.params?.command ?? "";
97
+ if (!command)
98
+ throw new DeviceError("command is required", { subtype: "invalid_args" });
99
+ const mcp = this.mcpProvider();
100
+ if (!mcp.executeCommand) {
101
+ throw new DeviceError("device/shell is not supported on this MCP runtime", { subtype: "internal_error" });
102
+ }
103
+ const r = await mcp.executeCommand(command);
104
+ return { output: r.stdout };
105
+ }
106
+ }
107
+ /**
108
+ * Validate `apk_path` against an install-root whitelist.
109
+ *
110
+ * Rules:
111
+ * - Must be absolute.
112
+ * - May not contain `..` segments.
113
+ * - Must reside under one of the allowed roots:
114
+ * • `~/.beeos/uploads/`
115
+ * • `BEEOS_INSTALL_ROOT` env (if set)
116
+ *
117
+ * Returns a normalized absolute path on success; throws DeviceError on failure.
118
+ */
119
+ function sanitizeApkPath(input) {
120
+ if (!path.isAbsolute(input)) {
121
+ throw new DeviceError(`apk_path must be absolute: ${input}`, { subtype: "invalid_args" });
122
+ }
123
+ if (input.split(path.sep).some((seg) => seg === "..")) {
124
+ throw new DeviceError("apk_path may not contain '..' segments", { subtype: "invalid_args" });
125
+ }
126
+ const normalized = path.normalize(input);
127
+ const roots = [path.join(os.homedir(), ".beeos", "uploads")];
128
+ if (process.env.BEEOS_INSTALL_ROOT) {
129
+ roots.push(path.normalize(process.env.BEEOS_INSTALL_ROOT));
130
+ }
131
+ const allowed = roots.some((root) => {
132
+ const rel = path.relative(root, normalized);
133
+ return rel !== "" && !rel.startsWith("..") && !path.isAbsolute(rel);
134
+ });
135
+ if (!allowed) {
136
+ throw new DeviceError(`apk_path must reside under ${roots.join(" or ")} (got ${normalized})`, { subtype: "invalid_args" });
137
+ }
138
+ return normalized;
139
+ }
140
+ function serializeDeviceInfo(info) {
141
+ return {
142
+ type: info.type,
143
+ name: info.name,
144
+ os: info.os,
145
+ width: info.width,
146
+ height: info.height,
147
+ capabilities: info.capabilities,
148
+ osVersion: info.osVersion,
149
+ density: info.density,
150
+ metadata: info.metadata,
151
+ };
152
+ }
153
+ //# sourceMappingURL=device.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device.js","sourceRoot":"","sources":["../../../../src/inbound/acp/handlers/device.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * ACP `initialize` handler.
3
+ *
4
+ * Response shape MUST match the beeos-claw / web SDK contract:
5
+ *
6
+ * - `protocolVersion` is sourced from `@beeos-ai/beeos-types/acp`
7
+ * (`ACP_PROTOCOL_VERSION`) so a future bump propagates without an
8
+ * edit here.
9
+ * - `agentCapabilities.promptCapabilities.image` / `embeddedContext`
10
+ * are TRUE because the device agent forwards screenshots + base64
11
+ * image blocks straight into the inner mobile-use VLM. Audio stays
12
+ * false (we have no audio capture path).
13
+ * - `terminal` / `skills` / `mcp` / `sessionCapabilities` stay false
14
+ * / empty — this agent intentionally does NOT implement those
15
+ * business surfaces (skills/, canvas/, cron/, terminal/, mcp/),
16
+ * and `Method not found` (-32601) is the documented response for
17
+ * such probes.
18
+ * - `forwardThinking` / `forwardToolCalls` from the client are
19
+ * surfaced on the returned options so callers can wire transport
20
+ * filtering (mirrors beeos-claw `transport.ts.forwardControl`).
21
+ */
22
+ import { ACP_PROTOCOL_VERSION } from "@beeos-ai/beeos-types/acp";
23
+ export interface InitializeRequestParams {
24
+ /** Server should suppress `agent_thought_chunk` notifications when false. */
25
+ forwardThinking?: boolean;
26
+ /** Server should suppress `tool_call` / `tool_call_update` notifications when false. */
27
+ forwardToolCalls?: boolean;
28
+ /** Echoed back to allow the client to verify identity binding. */
29
+ clientName?: string;
30
+ /** Tolerated forward-compat fields. */
31
+ [key: string]: unknown;
32
+ }
33
+ export interface InitializeOptions {
34
+ agentName?: string;
35
+ agentTitle?: string;
36
+ version?: string;
37
+ /**
38
+ * Optional hook invoked with the resolved forward-control flags so the
39
+ * caller can apply them to its transport (mirrors beeos-claw's
40
+ * forwardControl). Pure read-side: the handler still returns the same
41
+ * response shape regardless of whether the hook is set.
42
+ */
43
+ onForwardControl?: (control: {
44
+ forwardThinking: boolean;
45
+ forwardToolCalls: boolean;
46
+ }) => void;
47
+ }
48
+ export interface InitializeResponse {
49
+ protocolVersion: typeof ACP_PROTOCOL_VERSION;
50
+ agentCapabilities: {
51
+ loadSession: boolean;
52
+ terminal: boolean;
53
+ skills: boolean;
54
+ multipleSessions: boolean;
55
+ mcp: Record<string, never>;
56
+ sessionCapabilities: Record<string, never>;
57
+ promptCapabilities: {
58
+ image: boolean;
59
+ audio: boolean;
60
+ embeddedContext: boolean;
61
+ };
62
+ };
63
+ agentInfo: {
64
+ name: string;
65
+ title: string;
66
+ version: string;
67
+ };
68
+ _meta: Record<string, never>;
69
+ authMethods: string[];
70
+ }
71
+ export declare function buildInitializeResponse(opts?: InitializeOptions, params?: InitializeRequestParams): InitializeResponse;
@@ -0,0 +1,53 @@
1
+ /**
2
+ * ACP `initialize` handler.
3
+ *
4
+ * Response shape MUST match the beeos-claw / web SDK contract:
5
+ *
6
+ * - `protocolVersion` is sourced from `@beeos-ai/beeos-types/acp`
7
+ * (`ACP_PROTOCOL_VERSION`) so a future bump propagates without an
8
+ * edit here.
9
+ * - `agentCapabilities.promptCapabilities.image` / `embeddedContext`
10
+ * are TRUE because the device agent forwards screenshots + base64
11
+ * image blocks straight into the inner mobile-use VLM. Audio stays
12
+ * false (we have no audio capture path).
13
+ * - `terminal` / `skills` / `mcp` / `sessionCapabilities` stay false
14
+ * / empty — this agent intentionally does NOT implement those
15
+ * business surfaces (skills/, canvas/, cron/, terminal/, mcp/),
16
+ * and `Method not found` (-32601) is the documented response for
17
+ * such probes.
18
+ * - `forwardThinking` / `forwardToolCalls` from the client are
19
+ * surfaced on the returned options so callers can wire transport
20
+ * filtering (mirrors beeos-claw `transport.ts.forwardControl`).
21
+ */
22
+ import { ACP_PROTOCOL_VERSION } from "@beeos-ai/beeos-types/acp";
23
+ export function buildInitializeResponse(opts = {}, params = {}) {
24
+ // Default to true so legacy clients (which don't send the flags at all)
25
+ // keep receiving the full stream — same default beeos-claw applies.
26
+ const forwardThinking = params.forwardThinking ?? true;
27
+ const forwardToolCalls = params.forwardToolCalls ?? true;
28
+ opts.onForwardControl?.({ forwardThinking, forwardToolCalls });
29
+ return {
30
+ protocolVersion: ACP_PROTOCOL_VERSION,
31
+ agentCapabilities: {
32
+ loadSession: true,
33
+ terminal: false,
34
+ skills: false,
35
+ multipleSessions: true,
36
+ mcp: {},
37
+ sessionCapabilities: {},
38
+ promptCapabilities: {
39
+ image: true,
40
+ audio: false,
41
+ embeddedContext: true,
42
+ },
43
+ },
44
+ agentInfo: {
45
+ name: opts.agentName ?? "device-agent",
46
+ title: opts.agentTitle ?? "BeeOS Device Agent",
47
+ version: opts.version ?? "0.1.0",
48
+ },
49
+ _meta: {},
50
+ authMethods: [],
51
+ };
52
+ }
53
+ //# sourceMappingURL=initialize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initialize.js","sourceRoot":"","sources":["../../../../src/inbound/acp/handlers/initialize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAkDjE,MAAM,UAAU,uBAAuB,CACrC,OAA0B,EAAE,EAC5B,SAAkC,EAAE;IAEpC,wEAAwE;IACxE,oEAAoE;IACpE,MAAM,eAAe,GAAG,MAAM,CAAC,eAAe,IAAI,IAAI,CAAC;IACvD,MAAM,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,IAAI,IAAI,CAAC;IACzD,IAAI,CAAC,gBAAgB,EAAE,CAAC,EAAE,eAAe,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAE/D,OAAO;QACL,eAAe,EAAE,oBAAoB;QACrC,iBAAiB,EAAE;YACjB,WAAW,EAAE,IAAI;YACjB,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE,KAAK;YACb,gBAAgB,EAAE,IAAI;YACtB,GAAG,EAAE,EAAE;YACP,mBAAmB,EAAE,EAAE;YACvB,kBAAkB,EAAE;gBAClB,KAAK,EAAE,IAAI;gBACX,KAAK,EAAE,KAAK;gBACZ,eAAe,EAAE,IAAI;aACtB;SACF;QACD,SAAS,EAAE;YACT,IAAI,EAAE,IAAI,CAAC,SAAS,IAAI,cAAc;YACtC,KAAK,EAAE,IAAI,CAAC,UAAU,IAAI,oBAAoB;YAC9C,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,OAAO;SACjC;QACD,KAAK,EAAE,EAAE;QACT,WAAW,EAAE,EAAE;KAChB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * ACP `models/list` handler.
3
+ */
4
+ export interface ModelEntry {
5
+ id: string;
6
+ name: string;
7
+ provider: string;
8
+ }
9
+ export type ModelListProvider = () => ModelEntry[] | Promise<ModelEntry[]>;
10
+ export declare class AcpModelHandlers {
11
+ private readonly getModels?;
12
+ constructor(getModels?: ModelListProvider | undefined);
13
+ list(): Promise<{
14
+ models: ModelEntry[];
15
+ }>;
16
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * ACP `models/list` handler.
3
+ */
4
+ const DEFAULT_MODELS = [
5
+ { id: "openrouter/bytedance/ui-tars-1.5-7b", name: "UI-TARS 1.5 7B", provider: "openrouter" },
6
+ { id: "openrouter/qwen/qwen2.5-vl-72b-instruct", name: "Qwen 2.5 VL 72B", provider: "openrouter" },
7
+ { id: "openrouter/anthropic/claude-sonnet-4.6", name: "Claude Sonnet 4.6", provider: "openrouter" },
8
+ { id: "openrouter/anthropic/claude-haiku-4.5", name: "Claude Haiku 4.5", provider: "openrouter" },
9
+ { id: "openrouter/openai/gpt-5.4", name: "GPT-5.4", provider: "openrouter" },
10
+ { id: "openrouter/openai/gpt-5.4-mini", name: "GPT-5.4 Mini", provider: "openrouter" },
11
+ { id: "openrouter/google/gemini-3-flash-preview", name: "Gemini 3 Flash", provider: "openrouter" },
12
+ ];
13
+ export class AcpModelHandlers {
14
+ getModels;
15
+ constructor(getModels) {
16
+ this.getModels = getModels;
17
+ }
18
+ async list() {
19
+ const models = this.getModels ? await this.getModels() : DEFAULT_MODELS;
20
+ return { models };
21
+ }
22
+ }
23
+ //# sourceMappingURL=models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../../../../src/inbound/acp/handlers/models.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,MAAM,cAAc,GAAiB;IACnC,EAAE,EAAE,EAAE,qCAAqC,EAAE,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,YAAY,EAAE;IAC7F,EAAE,EAAE,EAAE,yCAAyC,EAAE,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,YAAY,EAAE;IAClG,EAAE,EAAE,EAAE,wCAAwC,EAAE,IAAI,EAAE,mBAAmB,EAAE,QAAQ,EAAE,YAAY,EAAE;IACnG,EAAE,EAAE,EAAE,uCAAuC,EAAE,IAAI,EAAE,kBAAkB,EAAE,QAAQ,EAAE,YAAY,EAAE;IACjG,EAAE,EAAE,EAAE,2BAA2B,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE;IAC5E,EAAE,EAAE,EAAE,gCAAgC,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,YAAY,EAAE;IACtF,EAAE,EAAE,EAAE,0CAA0C,EAAE,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,YAAY,EAAE;CACnG,CAAC;AAIF,MAAM,OAAO,gBAAgB;IACE;IAA7B,YAA6B,SAA6B;QAA7B,cAAS,GAAT,SAAS,CAAoB;IAAG,CAAC;IAE9D,KAAK,CAAC,IAAI;QACR,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC;QACxE,OAAO,EAAE,MAAM,EAAE,CAAC;IACpB,CAAC;CACF"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * ACP `session/*` handlers (10 methods).
3
+ *
4
+ * Thin pass-through to `SessionManager`. Field names use camelCase to match
5
+ * the web SDK (`acp-client.ts`).
6
+ */
7
+ import type { SessionManager } from "../../../app/session-manager.js";
8
+ import type { AcpMessage } from "./device.js";
9
+ export declare class AcpSessionHandlers {
10
+ private readonly sessions;
11
+ constructor(sessions: SessionManager);
12
+ new(_msg: AcpMessage): Promise<{
13
+ sessionId: string;
14
+ }>;
15
+ load(msg: AcpMessage): Promise<{
16
+ sessionId: string;
17
+ history: import("../../../app/message-store.js").MessageHistoryEntry[];
18
+ }>;
19
+ list(_msg: AcpMessage): Promise<{
20
+ sessions: {
21
+ sessionId: string;
22
+ title: string;
23
+ updatedAt: number;
24
+ }[];
25
+ }>;
26
+ prompt(msg: AcpMessage): Promise<{
27
+ stopReason: string;
28
+ }>;
29
+ rename(msg: AcpMessage): Promise<{
30
+ sessionId: string;
31
+ title: string;
32
+ }>;
33
+ delete(msg: AcpMessage): Promise<{
34
+ deleted: boolean;
35
+ }>;
36
+ clear(msg: AcpMessage): Promise<{
37
+ cleared: boolean;
38
+ }>;
39
+ cancel(_msg: AcpMessage): Promise<{
40
+ cancelled: boolean;
41
+ }>;
42
+ setMode(msg: AcpMessage): Promise<{
43
+ sessionId: string;
44
+ mode: string;
45
+ }>;
46
+ setModel(msg: AcpMessage): Promise<{
47
+ sessionId: string;
48
+ provider: string;
49
+ model: string;
50
+ }>;
51
+ }
@@ -0,0 +1,61 @@
1
+ /**
2
+ * ACP `session/*` handlers (10 methods).
3
+ *
4
+ * Thin pass-through to `SessionManager`. Field names use camelCase to match
5
+ * the web SDK (`acp-client.ts`).
6
+ */
7
+ export class AcpSessionHandlers {
8
+ sessions;
9
+ constructor(sessions) {
10
+ this.sessions = sessions;
11
+ }
12
+ async new(_msg) {
13
+ return this.sessions.newSession();
14
+ }
15
+ async load(msg) {
16
+ const params = msg.params ?? {};
17
+ const id = params.sessionId || params.session_id || "";
18
+ return this.sessions.loadSession(id);
19
+ }
20
+ async list(_msg) {
21
+ return this.sessions.listSessions();
22
+ }
23
+ async prompt(msg) {
24
+ const params = msg.params ?? {};
25
+ const sessionId = params.sessionId || params.session_id || undefined;
26
+ const prompt = params.prompt;
27
+ return this.sessions.prompt(prompt, sessionId);
28
+ }
29
+ async rename(msg) {
30
+ const params = msg.params ?? {};
31
+ const id = params.sessionId ?? "";
32
+ const title = params.title ?? "";
33
+ return this.sessions.renameSession(id, title);
34
+ }
35
+ async delete(msg) {
36
+ const id = msg.params?.sessionId ?? "";
37
+ return this.sessions.deleteSession(id);
38
+ }
39
+ async clear(msg) {
40
+ const id = msg.params?.sessionId ?? "";
41
+ return this.sessions.clearSession(id);
42
+ }
43
+ async cancel(_msg) {
44
+ const cancelled = await this.sessions.cancel();
45
+ return { cancelled };
46
+ }
47
+ async setMode(msg) {
48
+ const params = msg.params ?? {};
49
+ const id = params.sessionId ?? "";
50
+ const mode = params.mode ?? "agent";
51
+ return this.sessions.setMode(id, mode);
52
+ }
53
+ async setModel(msg) {
54
+ const params = msg.params ?? {};
55
+ const id = params.sessionId ?? "";
56
+ const model = params.model ?? "";
57
+ const provider = params.provider ?? "";
58
+ return this.sessions.setModel(id, model, provider);
59
+ }
60
+ }
61
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../../src/inbound/acp/handlers/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * ACP `skills/list` handler. The Python agent currently exposes an empty list.
3
+ */
4
+ export declare class AcpSkillsHandlers {
5
+ list(): Promise<{
6
+ skills: never[];
7
+ }>;
8
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * ACP `skills/list` handler. The Python agent currently exposes an empty list.
3
+ */
4
+ export class AcpSkillsHandlers {
5
+ async list() {
6
+ return { skills: [] };
7
+ }
8
+ }
9
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../../../src/inbound/acp/handlers/skills.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,OAAO,iBAAiB;IAC5B,KAAK,CAAC,IAAI;QACR,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACxB,CAAC;CACF"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Adapter — push `session/update` notifications onto the Bridge transport.
3
+ *
4
+ * Used by SessionManager to stream agent_message_chunk / tool_call /
5
+ * tool_call_update / agent_status events back to the connected client.
6
+ *
7
+ * Wire-shape contract (mirrors beeos-claw `acp-gateway/transport.ts`
8
+ * `sendNotification`):
9
+ *
10
+ * {
11
+ * jsonrpc: "2.0",
12
+ * method: "session/update",
13
+ * params: { sessionId, update },
14
+ * _debug_index: <process-monotonic uint>,
15
+ * _ts: <Date.now() in ms>,
16
+ * }
17
+ *
18
+ * `_debug_index` lets the client deterministically order chunks even when
19
+ * transport reorders, and `_ts` carries server-wall-clock ms for timeline
20
+ * debugging. Clients ignore unknown envelope keys — both fields are
21
+ * additive, never load-bearing.
22
+ */
23
+ import type { IBridgeTransport } from "../../ports/transport.js";
24
+ import type { SessionUpdateNotifier } from "../../app/session-manager.js";
25
+ export declare class TransportSessionNotifier implements SessionUpdateNotifier {
26
+ private readonly transport;
27
+ /**
28
+ * Process-monotonic counter shared across every notification on a
29
+ * given transport instance. Wraps cleanly via JS number safety bounds
30
+ * (>1e15 events before precision loss).
31
+ */
32
+ private debugIndex;
33
+ constructor(transport: IBridgeTransport);
34
+ send(sessionId: string, update: Record<string, unknown>): void;
35
+ }
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Adapter — push `session/update` notifications onto the Bridge transport.
3
+ *
4
+ * Used by SessionManager to stream agent_message_chunk / tool_call /
5
+ * tool_call_update / agent_status events back to the connected client.
6
+ *
7
+ * Wire-shape contract (mirrors beeos-claw `acp-gateway/transport.ts`
8
+ * `sendNotification`):
9
+ *
10
+ * {
11
+ * jsonrpc: "2.0",
12
+ * method: "session/update",
13
+ * params: { sessionId, update },
14
+ * _debug_index: <process-monotonic uint>,
15
+ * _ts: <Date.now() in ms>,
16
+ * }
17
+ *
18
+ * `_debug_index` lets the client deterministically order chunks even when
19
+ * transport reorders, and `_ts` carries server-wall-clock ms for timeline
20
+ * debugging. Clients ignore unknown envelope keys — both fields are
21
+ * additive, never load-bearing.
22
+ */
23
+ export class TransportSessionNotifier {
24
+ transport;
25
+ /**
26
+ * Process-monotonic counter shared across every notification on a
27
+ * given transport instance. Wraps cleanly via JS number safety bounds
28
+ * (>1e15 events before precision loss).
29
+ */
30
+ debugIndex = 0;
31
+ constructor(transport) {
32
+ this.transport = transport;
33
+ }
34
+ send(sessionId, update) {
35
+ const msg = JSON.stringify({
36
+ jsonrpc: "2.0",
37
+ method: "session/update",
38
+ params: { sessionId, update },
39
+ _debug_index: this.debugIndex++,
40
+ _ts: Date.now(),
41
+ });
42
+ void this.transport.send(msg).catch(() => undefined);
43
+ }
44
+ }
45
+ //# sourceMappingURL=notifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifier.js","sourceRoot":"","sources":["../../../src/inbound/acp/notifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAKH,MAAM,OAAO,wBAAwB;IAQN;IAP7B;;;;OAIG;IACK,UAAU,GAAG,CAAC,CAAC;IAEvB,YAA6B,SAA2B;QAA3B,cAAS,GAAT,SAAS,CAAkB;IAAG,CAAC;IAE5D,IAAI,CAAC,SAAiB,EAAE,MAA+B;QACrD,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC;YACzB,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,gBAAgB;YACxB,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE;YAC7B,YAAY,EAAE,IAAI,CAAC,UAAU,EAAE;YAC/B,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE;SAChB,CAAC,CAAC;QACH,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACvD,CAAC;CACF"}