@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.
- package/.pi/extensions/android-tools.ts +139 -0
- package/.pi/skills/.gitkeep +0 -0
- package/.pi/skills/ground-mobile-fallback/SKILL.md +50 -0
- package/LICENSE +201 -0
- package/dist/action/handler.d.ts +9 -0
- package/dist/action/handler.js +124 -0
- package/dist/action/handler.js.map +1 -0
- package/dist/adapters/agent-gateway-client.d.ts +256 -0
- package/dist/adapters/agent-gateway-client.js +332 -0
- package/dist/adapters/agent-gateway-client.js.map +1 -0
- package/dist/adapters/agentcore-inner-loop.d.ts +29 -0
- package/dist/adapters/agentcore-inner-loop.js +72 -0
- package/dist/adapters/agentcore-inner-loop.js.map +1 -0
- package/dist/adapters/agentcore-pi.d.ts +215 -0
- package/dist/adapters/agentcore-pi.js +464 -0
- package/dist/adapters/agentcore-pi.js.map +1 -0
- package/dist/adapters/agentcore-runner.d.ts +70 -0
- package/dist/adapters/agentcore-runner.js +255 -0
- package/dist/adapters/agentcore-runner.js.map +1 -0
- package/dist/adapters/device-android-adb.d.ts +41 -0
- package/dist/adapters/device-android-adb.js +279 -0
- package/dist/adapters/device-android-adb.js.map +1 -0
- package/dist/adapters/device-desktop.d.ts +37 -0
- package/dist/adapters/device-desktop.js +101 -0
- package/dist/adapters/device-desktop.js.map +1 -0
- package/dist/adapters/identity-file.d.ts +30 -0
- package/dist/adapters/identity-file.js +50 -0
- package/dist/adapters/identity-file.js.map +1 -0
- package/dist/adapters/transport-bridge-ws.d.ts +39 -0
- package/dist/adapters/transport-bridge-ws.js +49 -0
- package/dist/adapters/transport-bridge-ws.js.map +1 -0
- package/dist/adapters/vlm-inner-loop.d.ts +88 -0
- package/dist/adapters/vlm-inner-loop.js +199 -0
- package/dist/adapters/vlm-inner-loop.js.map +1 -0
- package/dist/agent-runtime/adapters/base.d.ts +145 -0
- package/dist/agent-runtime/adapters/base.js +29 -0
- package/dist/agent-runtime/adapters/base.js.map +1 -0
- package/dist/agent-runtime/adapters/index.d.ts +17 -0
- package/dist/agent-runtime/adapters/index.js +17 -0
- package/dist/agent-runtime/adapters/index.js.map +1 -0
- package/dist/agent-runtime/adapters/mock.d.ts +44 -0
- package/dist/agent-runtime/adapters/mock.js +54 -0
- package/dist/agent-runtime/adapters/mock.js.map +1 -0
- package/dist/agent-runtime/adapters/openai.d.ts +63 -0
- package/dist/agent-runtime/adapters/openai.js +302 -0
- package/dist/agent-runtime/adapters/openai.js.map +1 -0
- package/dist/agent-runtime/adapters/registry.d.ts +49 -0
- package/dist/agent-runtime/adapters/registry.js +129 -0
- package/dist/agent-runtime/adapters/registry.js.map +1 -0
- package/dist/agent-runtime/adapters/ui-tars.d.ts +13 -0
- package/dist/agent-runtime/adapters/ui-tars.js +22 -0
- package/dist/agent-runtime/adapters/ui-tars.js.map +1 -0
- package/dist/agent-runtime/agent-runner.d.ts +149 -0
- package/dist/agent-runtime/agent-runner.js +356 -0
- package/dist/agent-runtime/agent-runner.js.map +1 -0
- package/dist/agent-runtime/core.d.ts +170 -0
- package/dist/agent-runtime/core.js +624 -0
- package/dist/agent-runtime/core.js.map +1 -0
- package/dist/agent-runtime/index.d.ts +16 -0
- package/dist/agent-runtime/index.js +17 -0
- package/dist/agent-runtime/index.js.map +1 -0
- package/dist/agent-runtime/plan-executor.d.ts +118 -0
- package/dist/agent-runtime/plan-executor.js +501 -0
- package/dist/agent-runtime/plan-executor.js.map +1 -0
- package/dist/agent-runtime/planner/base.d.ts +128 -0
- package/dist/agent-runtime/planner/base.js +157 -0
- package/dist/agent-runtime/planner/base.js.map +1 -0
- package/dist/agent-runtime/planner/llm-planner.d.ts +58 -0
- package/dist/agent-runtime/planner/llm-planner.js +112 -0
- package/dist/agent-runtime/planner/llm-planner.js.map +1 -0
- package/dist/agent-runtime/planner/noop-planner.d.ts +13 -0
- package/dist/agent-runtime/planner/noop-planner.js +30 -0
- package/dist/agent-runtime/planner/noop-planner.js.map +1 -0
- package/dist/agent-runtime/planner/prompts.d.ts +33 -0
- package/dist/agent-runtime/planner/prompts.js +165 -0
- package/dist/agent-runtime/planner/prompts.js.map +1 -0
- package/dist/agent-runtime/reflection.d.ts +81 -0
- package/dist/agent-runtime/reflection.js +189 -0
- package/dist/agent-runtime/reflection.js.map +1 -0
- package/dist/agent-runtime/reflectors/action-reflector.d.ts +97 -0
- package/dist/agent-runtime/reflectors/action-reflector.js +233 -0
- package/dist/agent-runtime/reflectors/action-reflector.js.map +1 -0
- package/dist/agent-runtime/reflectors/policy.d.ts +53 -0
- package/dist/agent-runtime/reflectors/policy.js +106 -0
- package/dist/agent-runtime/reflectors/policy.js.map +1 -0
- package/dist/agent-runtime/reflectors/trajectory-reflector.d.ts +94 -0
- package/dist/agent-runtime/reflectors/trajectory-reflector.js +223 -0
- package/dist/agent-runtime/reflectors/trajectory-reflector.js.map +1 -0
- package/dist/agent-runtime/skills/embedding.d.ts +53 -0
- package/dist/agent-runtime/skills/embedding.js +134 -0
- package/dist/agent-runtime/skills/embedding.js.map +1 -0
- package/dist/agent-runtime/skills/fs-store.d.ts +88 -0
- package/dist/agent-runtime/skills/fs-store.js +483 -0
- package/dist/agent-runtime/skills/fs-store.js.map +1 -0
- package/dist/agent-runtime/skills/index.d.ts +10 -0
- package/dist/agent-runtime/skills/index.js +10 -0
- package/dist/agent-runtime/skills/index.js.map +1 -0
- package/dist/agent-runtime/skills/matcher-evolver.d.ts +88 -0
- package/dist/agent-runtime/skills/matcher-evolver.js +110 -0
- package/dist/agent-runtime/skills/matcher-evolver.js.map +1 -0
- package/dist/agent-runtime/skills/memory-store.d.ts +23 -0
- package/dist/agent-runtime/skills/memory-store.js +94 -0
- package/dist/agent-runtime/skills/memory-store.js.map +1 -0
- package/dist/agent-runtime/skills/normalise.d.ts +40 -0
- package/dist/agent-runtime/skills/normalise.js +152 -0
- package/dist/agent-runtime/skills/normalise.js.map +1 -0
- package/dist/agent-runtime/skills/replay.d.ts +46 -0
- package/dist/agent-runtime/skills/replay.js +106 -0
- package/dist/agent-runtime/skills/replay.js.map +1 -0
- package/dist/agent-runtime/skills/sqlite-store.d.ts +60 -0
- package/dist/agent-runtime/skills/sqlite-store.js +234 -0
- package/dist/agent-runtime/skills/sqlite-store.js.map +1 -0
- package/dist/agent-runtime/skills/types.d.ts +99 -0
- package/dist/agent-runtime/skills/types.js +14 -0
- package/dist/agent-runtime/skills/types.js.map +1 -0
- package/dist/agent.d.ts +110 -0
- package/dist/agent.js +162 -0
- package/dist/agent.js.map +1 -0
- package/dist/api.d.ts +27 -0
- package/dist/api.js +48 -0
- package/dist/api.js.map +1 -0
- package/dist/app/agent-host.d.ts +59 -0
- package/dist/app/agent-host.js +263 -0
- package/dist/app/agent-host.js.map +1 -0
- package/dist/app/device-manager.d.ts +28 -0
- package/dist/app/device-manager.js +64 -0
- package/dist/app/device-manager.js.map +1 -0
- package/dist/app/message-store.d.ts +55 -0
- package/dist/app/message-store.js +99 -0
- package/dist/app/message-store.js.map +1 -0
- package/dist/app/session-manager.d.ts +132 -0
- package/dist/app/session-manager.js +350 -0
- package/dist/app/session-manager.js.map +1 -0
- package/dist/bootstrap.d.ts +94 -0
- package/dist/bootstrap.js +459 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/chat.d.ts +16 -0
- package/dist/chat.js +175 -0
- package/dist/chat.js.map +1 -0
- package/dist/config/loader.d.ts +77 -0
- package/dist/config/loader.js +292 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schema.d.ts +162 -0
- package/dist/config/schema.js +243 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/core/actions.d.ts +60 -0
- package/dist/core/actions.js +120 -0
- package/dist/core/actions.js.map +1 -0
- package/dist/core/errors.d.ts +8 -0
- package/dist/core/errors.js +9 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/screen.d.ts +7 -0
- package/dist/core/screen.js +8 -0
- package/dist/core/screen.js.map +1 -0
- package/dist/core/session.d.ts +42 -0
- package/dist/core/session.js +29 -0
- package/dist/core/session.js.map +1 -0
- package/dist/debug/dump-system-prompt.d.ts +1 -0
- package/dist/debug/dump-system-prompt.js +34 -0
- package/dist/debug/dump-system-prompt.js.map +1 -0
- package/dist/device/android.d.ts +25 -0
- package/dist/device/android.js +231 -0
- package/dist/device/android.js.map +1 -0
- package/dist/device/apps.d.ts +3 -0
- package/dist/device/apps.js +77 -0
- package/dist/device/apps.js.map +1 -0
- package/dist/device/base.d.ts +20 -0
- package/dist/device/base.js +2 -0
- package/dist/device/base.js.map +1 -0
- package/dist/device/ui-xml.d.ts +29 -0
- package/dist/device/ui-xml.js +194 -0
- package/dist/device/ui-xml.js.map +1 -0
- package/dist/fleet/adapters/process/node-process-manager.d.ts +157 -0
- package/dist/fleet/adapters/process/node-process-manager.js +664 -0
- package/dist/fleet/adapters/process/node-process-manager.js.map +1 -0
- package/dist/fleet/adapters/sources/local-adb.d.ts +105 -0
- package/dist/fleet/adapters/sources/local-adb.js +353 -0
- package/dist/fleet/adapters/sources/local-adb.js.map +1 -0
- package/dist/fleet/adapters/sources/remote-adb.d.ts +97 -0
- package/dist/fleet/adapters/sources/remote-adb.js +138 -0
- package/dist/fleet/adapters/sources/remote-adb.js.map +1 -0
- package/dist/fleet/adapters/state/beeos-cli-store.d.ts +72 -0
- package/dist/fleet/adapters/state/beeos-cli-store.js +250 -0
- package/dist/fleet/adapters/state/beeos-cli-store.js.map +1 -0
- package/dist/fleet/adapters/state/port-allocator.d.ts +43 -0
- package/dist/fleet/adapters/state/port-allocator.js +173 -0
- package/dist/fleet/adapters/state/port-allocator.js.map +1 -0
- package/dist/fleet/domain/device.d.ts +138 -0
- package/dist/fleet/domain/device.js +49 -0
- package/dist/fleet/domain/device.js.map +1 -0
- package/dist/fleet/domain/events.d.ts +102 -0
- package/dist/fleet/domain/events.js +15 -0
- package/dist/fleet/domain/events.js.map +1 -0
- package/dist/fleet/domain/fsm.d.ts +122 -0
- package/dist/fleet/domain/fsm.js +475 -0
- package/dist/fleet/domain/fsm.js.map +1 -0
- package/dist/fleet/http/status-client.d.ts +31 -0
- package/dist/fleet/http/status-client.js +115 -0
- package/dist/fleet/http/status-client.js.map +1 -0
- package/dist/fleet/http/status-server.d.ts +64 -0
- package/dist/fleet/http/status-server.js +200 -0
- package/dist/fleet/http/status-server.js.map +1 -0
- package/dist/fleet/index.d.ts +27 -0
- package/dist/fleet/index.js +17 -0
- package/dist/fleet/index.js.map +1 -0
- package/dist/fleet/installer/index.d.ts +12 -0
- package/dist/fleet/installer/index.js +13 -0
- package/dist/fleet/installer/index.js.map +1 -0
- package/dist/fleet/installer/launchd-mac.d.ts +73 -0
- package/dist/fleet/installer/launchd-mac.js +291 -0
- package/dist/fleet/installer/launchd-mac.js.map +1 -0
- package/dist/fleet/installer/service-spec.d.ts +70 -0
- package/dist/fleet/installer/service-spec.js +43 -0
- package/dist/fleet/installer/service-spec.js.map +1 -0
- package/dist/fleet/installer/spawn-env.d.ts +45 -0
- package/dist/fleet/installer/spawn-env.js +224 -0
- package/dist/fleet/installer/spawn-env.js.map +1 -0
- package/dist/fleet/ports/clock.d.ts +19 -0
- package/dist/fleet/ports/clock.js +26 -0
- package/dist/fleet/ports/clock.js.map +1 -0
- package/dist/fleet/ports/device-source.d.ts +28 -0
- package/dist/fleet/ports/device-source.js +18 -0
- package/dist/fleet/ports/device-source.js.map +1 -0
- package/dist/fleet/ports/process-manager.d.ts +110 -0
- package/dist/fleet/ports/process-manager.js +27 -0
- package/dist/fleet/ports/process-manager.js.map +1 -0
- package/dist/fleet/ports/state-registry.d.ts +49 -0
- package/dist/fleet/ports/state-registry.js +12 -0
- package/dist/fleet/ports/state-registry.js.map +1 -0
- package/dist/fleet/supervisor.d.ts +107 -0
- package/dist/fleet/supervisor.js +508 -0
- package/dist/fleet/supervisor.js.map +1 -0
- package/dist/grounding/grounder.d.ts +46 -0
- package/dist/grounding/grounder.js +82 -0
- package/dist/grounding/grounder.js.map +1 -0
- package/dist/inbound/acp/handlers/device.d.ts +43 -0
- package/dist/inbound/acp/handlers/device.js +153 -0
- package/dist/inbound/acp/handlers/device.js.map +1 -0
- package/dist/inbound/acp/handlers/initialize.d.ts +71 -0
- package/dist/inbound/acp/handlers/initialize.js +53 -0
- package/dist/inbound/acp/handlers/initialize.js.map +1 -0
- package/dist/inbound/acp/handlers/models.d.ts +16 -0
- package/dist/inbound/acp/handlers/models.js +23 -0
- package/dist/inbound/acp/handlers/models.js.map +1 -0
- package/dist/inbound/acp/handlers/session.d.ts +51 -0
- package/dist/inbound/acp/handlers/session.js +61 -0
- package/dist/inbound/acp/handlers/session.js.map +1 -0
- package/dist/inbound/acp/handlers/skills.d.ts +8 -0
- package/dist/inbound/acp/handlers/skills.js +9 -0
- package/dist/inbound/acp/handlers/skills.js.map +1 -0
- package/dist/inbound/acp/notifier.d.ts +35 -0
- package/dist/inbound/acp/notifier.js +45 -0
- package/dist/inbound/acp/notifier.js.map +1 -0
- package/dist/inbound/acp/router.d.ts +67 -0
- package/dist/inbound/acp/router.js +179 -0
- package/dist/inbound/acp/router.js.map +1 -0
- package/dist/inbound/cli/fleet-command.d.ts +34 -0
- package/dist/inbound/cli/fleet-command.js +792 -0
- package/dist/inbound/cli/fleet-command.js.map +1 -0
- package/dist/inbound/cli/main.d.ts +38 -0
- package/dist/inbound/cli/main.js +364 -0
- package/dist/inbound/cli/main.js.map +1 -0
- package/dist/inbound/cli/run-command.d.ts +101 -0
- package/dist/inbound/cli/run-command.js +405 -0
- package/dist/inbound/cli/run-command.js.map +1 -0
- package/dist/inbound/cli/skills-command.d.ts +39 -0
- package/dist/inbound/cli/skills-command.js +333 -0
- package/dist/inbound/cli/skills-command.js.map +1 -0
- package/dist/inbound/http/server.d.ts +7 -0
- package/dist/inbound/http/server.js +8 -0
- package/dist/inbound/http/server.js.map +1 -0
- package/dist/index.d.ts +66 -0
- package/dist/index.js +48 -0
- package/dist/index.js.map +1 -0
- package/dist/logger/index.d.ts +37 -0
- package/dist/logger/index.js +84 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/mcp-client/autospawn.d.ts +67 -0
- package/dist/mcp-client/autospawn.js +173 -0
- package/dist/mcp-client/autospawn.js.map +1 -0
- package/dist/mcp-client/client.d.ts +78 -0
- package/dist/mcp-client/client.js +168 -0
- package/dist/mcp-client/client.js.map +1 -0
- package/dist/mcp-client/index.d.ts +7 -0
- package/dist/mcp-client/index.js +4 -0
- package/dist/mcp-client/index.js.map +1 -0
- package/dist/mcp-client/inproc.d.ts +47 -0
- package/dist/mcp-client/inproc.js +229 -0
- package/dist/mcp-client/inproc.js.map +1 -0
- package/dist/mcp-client/runtime.d.ts +34 -0
- package/dist/mcp-client/runtime.js +15 -0
- package/dist/mcp-client/runtime.js.map +1 -0
- package/dist/model/adapters/autoglm.d.ts +31 -0
- package/dist/model/adapters/autoglm.js +409 -0
- package/dist/model/adapters/autoglm.js.map +1 -0
- package/dist/model/adapters/base.d.ts +13 -0
- package/dist/model/adapters/base.js +27 -0
- package/dist/model/adapters/base.js.map +1 -0
- package/dist/model/adapters/guiowl.d.ts +1 -0
- package/dist/model/adapters/guiowl.js +253 -0
- package/dist/model/adapters/guiowl.js.map +1 -0
- package/dist/model/adapters/index.d.ts +6 -0
- package/dist/model/adapters/index.js +8 -0
- package/dist/model/adapters/index.js.map +1 -0
- package/dist/model/adapters/maiui.d.ts +1 -0
- package/dist/model/adapters/maiui.js +117 -0
- package/dist/model/adapters/maiui.js.map +1 -0
- package/dist/model/adapters/qwenvl.d.ts +1 -0
- package/dist/model/adapters/qwenvl.js +108 -0
- package/dist/model/adapters/qwenvl.js.map +1 -0
- package/dist/model/adapters/showui.d.ts +1 -0
- package/dist/model/adapters/showui.js +132 -0
- package/dist/model/adapters/showui.js.map +1 -0
- package/dist/model/adapters/tool-call.d.ts +6 -0
- package/dist/model/adapters/tool-call.js +102 -0
- package/dist/model/adapters/tool-call.js.map +1 -0
- package/dist/model/adapters/uitars.d.ts +1 -0
- package/dist/model/adapters/uitars.js +180 -0
- package/dist/model/adapters/uitars.js.map +1 -0
- package/dist/model/base.d.ts +32 -0
- package/dist/model/base.js +2 -0
- package/dist/model/base.js.map +1 -0
- package/dist/model/client.d.ts +26 -0
- package/dist/model/client.js +300 -0
- package/dist/model/client.js.map +1 -0
- package/dist/model/image/compress.d.ts +53 -0
- package/dist/model/image/compress.js +89 -0
- package/dist/model/image/compress.js.map +1 -0
- package/dist/model/image/transport.d.ts +134 -0
- package/dist/model/image/transport.js +154 -0
- package/dist/model/image/transport.js.map +1 -0
- package/dist/orchestrator-system-prompt.d.ts +6 -0
- package/dist/orchestrator-system-prompt.js +81 -0
- package/dist/orchestrator-system-prompt.js.map +1 -0
- package/dist/pi-context.d.ts +82 -0
- package/dist/pi-context.js +62 -0
- package/dist/pi-context.js.map +1 -0
- package/dist/pi-local-skills.d.ts +17 -0
- package/dist/pi-local-skills.js +24 -0
- package/dist/pi-local-skills.js.map +1 -0
- package/dist/plugins/acp/index.d.ts +46 -0
- package/dist/plugins/acp/index.js +111 -0
- package/dist/plugins/acp/index.js.map +1 -0
- package/dist/plugins/agent-sync/index.d.ts +40 -0
- package/dist/plugins/agent-sync/index.js +98 -0
- package/dist/plugins/agent-sync/index.js.map +1 -0
- package/dist/plugins/http-debug/index.d.ts +30 -0
- package/dist/plugins/http-debug/index.js +64 -0
- package/dist/plugins/http-debug/index.js.map +1 -0
- package/dist/plugins/http-debug/server.d.ts +92 -0
- package/dist/plugins/http-debug/server.js +464 -0
- package/dist/plugins/http-debug/server.js.map +1 -0
- package/dist/ports/agent-core.d.ts +158 -0
- package/dist/ports/agent-core.js +2 -0
- package/dist/ports/agent-core.js.map +1 -0
- package/dist/ports/agent-host.d.ts +125 -0
- package/dist/ports/agent-host.js +23 -0
- package/dist/ports/agent-host.js.map +1 -0
- package/dist/ports/device.d.ts +53 -0
- package/dist/ports/device.js +13 -0
- package/dist/ports/device.js.map +1 -0
- package/dist/ports/identity.d.ts +22 -0
- package/dist/ports/identity.js +9 -0
- package/dist/ports/identity.js.map +1 -0
- package/dist/ports/plugin.d.ts +62 -0
- package/dist/ports/plugin.js +35 -0
- package/dist/ports/plugin.js.map +1 -0
- package/dist/ports/transport.d.ts +32 -0
- package/dist/ports/transport.js +12 -0
- package/dist/ports/transport.js.map +1 -0
- package/dist/ports/vlm.d.ts +59 -0
- package/dist/ports/vlm.js +14 -0
- package/dist/ports/vlm.js.map +1 -0
- package/dist/test-lan-autoglm.d.ts +7 -0
- package/dist/test-lan-autoglm.js +46 -0
- package/dist/test-lan-autoglm.js.map +1 -0
- package/dist/test-mem-breakdown.d.ts +1 -0
- package/dist/test-mem-breakdown.js +103 -0
- package/dist/test-mem-breakdown.js.map +1 -0
- package/dist/test-mem.d.ts +1 -0
- package/dist/test-mem.js +60 -0
- package/dist/test-mem.js.map +1 -0
- package/dist/test-mobile-use.d.ts +1 -0
- package/dist/test-mobile-use.js +18 -0
- package/dist/test-mobile-use.js.map +1 -0
- package/dist/test-screenshot-loop.d.ts +1 -0
- package/dist/test-screenshot-loop.js +43 -0
- package/dist/test-screenshot-loop.js.map +1 -0
- package/dist/test-screenshot.d.ts +1 -0
- package/dist/test-screenshot.js +10 -0
- package/dist/test-screenshot.js.map +1 -0
- package/dist/test-ui-xml-dump.d.ts +15 -0
- package/dist/test-ui-xml-dump.js +49 -0
- package/dist/test-ui-xml-dump.js.map +1 -0
- package/dist/types.d.ts +69 -0
- package/dist/types.js +23 -0
- package/dist/types.js.map +1 -0
- package/package.json +94 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Autospawn helper — fork a sibling `device-mcp-server` child process from
|
|
3
|
+
* inside the device-agent boot path, then hand back the URL the MCP client
|
|
4
|
+
* should connect to.
|
|
5
|
+
*
|
|
6
|
+
* The plan calls this `--mcp-autospawn` mode: the operator runs a single
|
|
7
|
+
* `device-agent` binary and we transparently start the MCP sibling as a
|
|
8
|
+
* child process. EdgeAgent / Kubernetes-managed deployments should NOT use
|
|
9
|
+
* this — they manage the two siblings themselves so the supervisor can
|
|
10
|
+
* restart them independently. Autospawn is purely for:
|
|
11
|
+
*
|
|
12
|
+
* - local dev / quick-start (`device-agent --mcp-autospawn --mode desktop`)
|
|
13
|
+
* - single-binary deployments where the user can't or doesn't want to run
|
|
14
|
+
* a second process by hand
|
|
15
|
+
*
|
|
16
|
+
* Implementation notes:
|
|
17
|
+
* - We resolve the MCP binary by package name (`@beeos-ai/device-mcp-server`)
|
|
18
|
+
* so a `pnpm install` either workspace-symlinked or registry-installed
|
|
19
|
+
* "just works". The override `DEVICE_MCP_BIN` env var lets EdgeAgent
|
|
20
|
+
* point at a pre-built binary.
|
|
21
|
+
* - A random ephemeral port is picked by binding a temporary OS socket
|
|
22
|
+
* and immediately closing it; the kernel then leaves that port in
|
|
23
|
+
* `TIME_WAIT` for a few hundred ms which is plenty of time for the
|
|
24
|
+
* spawned MCP server to grab it.
|
|
25
|
+
* - stdout / stderr are piped into the agent's logger so a sidecar log
|
|
26
|
+
* stream is preserved.
|
|
27
|
+
* - On agent shutdown the helper's `stop()` sends SIGTERM and then
|
|
28
|
+
* SIGKILL after `gracePeriodMs` if the child hasn't exited.
|
|
29
|
+
*/
|
|
30
|
+
import { type ChildProcess } from "node:child_process";
|
|
31
|
+
import type { Logger } from "../logger/index.js";
|
|
32
|
+
export interface AutospawnOptions {
|
|
33
|
+
/** Backend family to forward to the MCP server's `--backend` flag. */
|
|
34
|
+
backend: "android" | "desktop" | "ios" | "windows" | "macos";
|
|
35
|
+
/** ADB serial — forwarded only for the `android` backend. */
|
|
36
|
+
adbSerial?: string;
|
|
37
|
+
/** Bind host for the spawned server (default `127.0.0.1`). */
|
|
38
|
+
host?: string;
|
|
39
|
+
/**
|
|
40
|
+
* Override the MCP binary path. Useful when the device-agent runs from a
|
|
41
|
+
* stand-alone `npm install -g` install where the workspace resolution
|
|
42
|
+
* doesn't apply, or in EdgeAgent where we point at a baked-in binary.
|
|
43
|
+
* Defaults to the `dist/cli.js` shipped by `@beeos-ai/device-mcp-server`,
|
|
44
|
+
* resolved via `require.resolve` against the device-agent package.
|
|
45
|
+
*/
|
|
46
|
+
mcpBin?: string;
|
|
47
|
+
/** Extra arguments appended to the spawn command. */
|
|
48
|
+
extraArgs?: string[];
|
|
49
|
+
/** Logger sink — `stdout/stderr` lines are forwarded line-by-line. */
|
|
50
|
+
logger?: Logger;
|
|
51
|
+
/** Time we wait for SIGTERM before escalating to SIGKILL. */
|
|
52
|
+
gracePeriodMs?: number;
|
|
53
|
+
}
|
|
54
|
+
export interface AutospawnHandle {
|
|
55
|
+
/** `http://host:port` — pass to `McpClient` as its `baseUrl`. */
|
|
56
|
+
url: string;
|
|
57
|
+
/** The spawned child process (kept for tests and for log fan-out). */
|
|
58
|
+
child: ChildProcess;
|
|
59
|
+
/** Promise that resolves when the child exits. */
|
|
60
|
+
exited: Promise<{
|
|
61
|
+
code: number | null;
|
|
62
|
+
signal: NodeJS.Signals | null;
|
|
63
|
+
}>;
|
|
64
|
+
/** Terminate the child gracefully (SIGTERM → SIGKILL fallback). */
|
|
65
|
+
stop: () => Promise<void>;
|
|
66
|
+
}
|
|
67
|
+
export declare function autospawnMcpServer(opts: AutospawnOptions): Promise<AutospawnHandle>;
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Autospawn helper — fork a sibling `device-mcp-server` child process from
|
|
3
|
+
* inside the device-agent boot path, then hand back the URL the MCP client
|
|
4
|
+
* should connect to.
|
|
5
|
+
*
|
|
6
|
+
* The plan calls this `--mcp-autospawn` mode: the operator runs a single
|
|
7
|
+
* `device-agent` binary and we transparently start the MCP sibling as a
|
|
8
|
+
* child process. EdgeAgent / Kubernetes-managed deployments should NOT use
|
|
9
|
+
* this — they manage the two siblings themselves so the supervisor can
|
|
10
|
+
* restart them independently. Autospawn is purely for:
|
|
11
|
+
*
|
|
12
|
+
* - local dev / quick-start (`device-agent --mcp-autospawn --mode desktop`)
|
|
13
|
+
* - single-binary deployments where the user can't or doesn't want to run
|
|
14
|
+
* a second process by hand
|
|
15
|
+
*
|
|
16
|
+
* Implementation notes:
|
|
17
|
+
* - We resolve the MCP binary by package name (`@beeos-ai/device-mcp-server`)
|
|
18
|
+
* so a `pnpm install` either workspace-symlinked or registry-installed
|
|
19
|
+
* "just works". The override `DEVICE_MCP_BIN` env var lets EdgeAgent
|
|
20
|
+
* point at a pre-built binary.
|
|
21
|
+
* - A random ephemeral port is picked by binding a temporary OS socket
|
|
22
|
+
* and immediately closing it; the kernel then leaves that port in
|
|
23
|
+
* `TIME_WAIT` for a few hundred ms which is plenty of time for the
|
|
24
|
+
* spawned MCP server to grab it.
|
|
25
|
+
* - stdout / stderr are piped into the agent's logger so a sidecar log
|
|
26
|
+
* stream is preserved.
|
|
27
|
+
* - On agent shutdown the helper's `stop()` sends SIGTERM and then
|
|
28
|
+
* SIGKILL after `gracePeriodMs` if the child hasn't exited.
|
|
29
|
+
*/
|
|
30
|
+
import { spawn } from "node:child_process";
|
|
31
|
+
import { createServer } from "node:net";
|
|
32
|
+
import * as path from "node:path";
|
|
33
|
+
import * as url from "node:url";
|
|
34
|
+
import { createRequire } from "node:module";
|
|
35
|
+
/**
|
|
36
|
+
* Allocate a free TCP port. Binds to port 0 then immediately closes the
|
|
37
|
+
* server, returning the kernel-assigned port.
|
|
38
|
+
*/
|
|
39
|
+
async function allocateFreePort(host) {
|
|
40
|
+
return new Promise((resolve, reject) => {
|
|
41
|
+
const srv = createServer();
|
|
42
|
+
srv.unref();
|
|
43
|
+
srv.on("error", reject);
|
|
44
|
+
srv.listen(0, host, () => {
|
|
45
|
+
const addr = srv.address();
|
|
46
|
+
if (addr === null || typeof addr === "string") {
|
|
47
|
+
srv.close();
|
|
48
|
+
reject(new Error("failed to allocate ephemeral port"));
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
const port = addr.port;
|
|
52
|
+
srv.close(() => resolve(port));
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Resolve the device-mcp-server CLI entry point. Honors `mcpBin` override,
|
|
58
|
+
* then `DEVICE_MCP_BIN` env, then falls back to the workspace package's
|
|
59
|
+
* `bin: device-mcp-server` (`dist/cli.js`).
|
|
60
|
+
*/
|
|
61
|
+
function resolveMcpBin(opts) {
|
|
62
|
+
if (opts.mcpBin)
|
|
63
|
+
return opts.mcpBin;
|
|
64
|
+
if (process.env.DEVICE_MCP_BIN)
|
|
65
|
+
return process.env.DEVICE_MCP_BIN;
|
|
66
|
+
// `import.meta.url` works at runtime for both src/ (tsx) and dist/ (node).
|
|
67
|
+
const here = url.fileURLToPath(import.meta.url);
|
|
68
|
+
const req = createRequire(here);
|
|
69
|
+
try {
|
|
70
|
+
// Resolve the package's `dist/cli.js` directly (relative to its
|
|
71
|
+
// package.json) so we don't depend on the bin shim being on PATH.
|
|
72
|
+
const pkgJson = req.resolve("@beeos-ai/device-mcp-server/package.json");
|
|
73
|
+
return path.join(path.dirname(pkgJson), "dist", "cli.js");
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// Fallback to PATH lookup of the bin shim.
|
|
77
|
+
return "device-mcp-server";
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
export async function autospawnMcpServer(opts) {
|
|
81
|
+
const host = opts.host ?? "127.0.0.1";
|
|
82
|
+
const port = await allocateFreePort(host);
|
|
83
|
+
const bin = resolveMcpBin(opts);
|
|
84
|
+
const args = [
|
|
85
|
+
"--backend", opts.backend,
|
|
86
|
+
"--host", host,
|
|
87
|
+
"--port", String(port),
|
|
88
|
+
];
|
|
89
|
+
if (opts.backend === "android" && opts.adbSerial) {
|
|
90
|
+
args.push("--adb-serial", opts.adbSerial);
|
|
91
|
+
}
|
|
92
|
+
if (opts.extraArgs?.length)
|
|
93
|
+
args.push(...opts.extraArgs);
|
|
94
|
+
const log = opts.logger;
|
|
95
|
+
const isJs = bin.endsWith(".js") || bin.endsWith(".mjs") || bin.endsWith(".cjs");
|
|
96
|
+
const command = isJs ? process.execPath : bin;
|
|
97
|
+
const argv = isJs ? [bin, ...args] : args;
|
|
98
|
+
log?.info({ bin, host, port, backend: opts.backend, isJs }, "mcp: autospawn starting");
|
|
99
|
+
const child = spawn(command, argv, {
|
|
100
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
101
|
+
env: {
|
|
102
|
+
...process.env,
|
|
103
|
+
DEVICEAGENT_BACKEND: opts.backend,
|
|
104
|
+
MCP_HOST: host,
|
|
105
|
+
MCP_PORT: String(port),
|
|
106
|
+
...(opts.adbSerial ? { ANDROID_SERIAL: opts.adbSerial } : {}),
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
pipeLines(child.stdout, (line) => log?.info({ src: "mcp.stdout" }, line));
|
|
110
|
+
pipeLines(child.stderr, (line) => log?.warn({ src: "mcp.stderr" }, line));
|
|
111
|
+
const exited = new Promise((resolve) => {
|
|
112
|
+
child.once("exit", (code, signal) => resolve({ code, signal }));
|
|
113
|
+
});
|
|
114
|
+
exited.then((r) => log?.warn({ ...r }, "mcp: autospawned child exited")).catch(() => undefined);
|
|
115
|
+
const grace = opts.gracePeriodMs ?? 3_000;
|
|
116
|
+
let stopped = false;
|
|
117
|
+
const stop = async () => {
|
|
118
|
+
if (stopped)
|
|
119
|
+
return;
|
|
120
|
+
stopped = true;
|
|
121
|
+
if (child.exitCode !== null)
|
|
122
|
+
return;
|
|
123
|
+
try {
|
|
124
|
+
child.kill("SIGTERM");
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
/* already gone */
|
|
128
|
+
}
|
|
129
|
+
const settled = await Promise.race([
|
|
130
|
+
exited.then(() => "exited"),
|
|
131
|
+
new Promise((res) => setTimeout(() => res("timeout"), grace)),
|
|
132
|
+
]);
|
|
133
|
+
if (settled === "timeout") {
|
|
134
|
+
log?.warn({ pid: child.pid }, "mcp: SIGTERM timed out, sending SIGKILL");
|
|
135
|
+
try {
|
|
136
|
+
child.kill("SIGKILL");
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
/* already gone */
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
return {
|
|
144
|
+
url: `http://${host}:${port}`,
|
|
145
|
+
child,
|
|
146
|
+
exited,
|
|
147
|
+
stop,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
/** Pipe a readable stream of bytes into a per-line callback. */
|
|
151
|
+
function pipeLines(stream, emit) {
|
|
152
|
+
if (!stream)
|
|
153
|
+
return;
|
|
154
|
+
let buf = "";
|
|
155
|
+
stream.setEncoding("utf8");
|
|
156
|
+
stream.on("data", (chunk) => {
|
|
157
|
+
buf += chunk;
|
|
158
|
+
let nl = buf.indexOf("\n");
|
|
159
|
+
while (nl !== -1) {
|
|
160
|
+
const line = buf.slice(0, nl).replace(/\r$/, "");
|
|
161
|
+
if (line.length)
|
|
162
|
+
emit(line);
|
|
163
|
+
buf = buf.slice(nl + 1);
|
|
164
|
+
nl = buf.indexOf("\n");
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
stream.on("end", () => {
|
|
168
|
+
if (buf.length)
|
|
169
|
+
emit(buf);
|
|
170
|
+
buf = "";
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=autospawn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autospawn.js","sourceRoot":"","sources":["../../src/mcp-client/autospawn.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* McpClient — typed HTTP wrapper around `device-mcp-server`.
|
|
3
|
+
*
|
|
4
|
+
* The device-agent never talks to ADB / desktop sandboxes directly any more —
|
|
5
|
+
* everything goes through this client to the sibling MCP HTTP server. The
|
|
6
|
+
* client is intentionally thin: zero LLM / agent semantics, no caching, no
|
|
7
|
+
* retry on tool errors (only on connection-level failures during health
|
|
8
|
+
* probing).
|
|
9
|
+
*
|
|
10
|
+
* Defaults:
|
|
11
|
+
* - baseUrl: http://127.0.0.1:7900 (override via `MCP_URL` env)
|
|
12
|
+
* - timeout: 30s per request
|
|
13
|
+
*
|
|
14
|
+
* Surface mirrors the Python reference's `MCPClient` plus a couple of
|
|
15
|
+
* device-agent–specific conveniences (`act`, `screenshot`, `uiDump`,
|
|
16
|
+
* `health`, `waitUntilReady`).
|
|
17
|
+
*/
|
|
18
|
+
import { type Action, type ActResponse, type DeviceInfo, type ExecuteCommandResult, type HealthResponse, type ScreenshotResult, type ToolListResponse, type UiDumpResult } from "@beeos-ai/device-common";
|
|
19
|
+
import type { ExecuteCommandOptions, IMcpRuntime, UiDumpOptions } from "./runtime.js";
|
|
20
|
+
export interface McpClientOptions {
|
|
21
|
+
/** HTTP base URL of the sibling device-mcp-server. Falls back to MCP_URL env / 127.0.0.1:7900. */
|
|
22
|
+
baseUrl?: string;
|
|
23
|
+
/** Per-request timeout in ms. Defaults to 30s. */
|
|
24
|
+
timeoutMs?: number;
|
|
25
|
+
/** Optional Bearer / shared-secret auth token forwarded as `Authorization: Bearer ...`. */
|
|
26
|
+
authToken?: string;
|
|
27
|
+
/** Optional fetch override (used by tests). */
|
|
28
|
+
fetchImpl?: typeof fetch;
|
|
29
|
+
}
|
|
30
|
+
export interface CallToolResult<T = unknown> {
|
|
31
|
+
ok: boolean;
|
|
32
|
+
raw: T;
|
|
33
|
+
durationMs: number;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Resolve the default MCP base URL (env-aware).
|
|
37
|
+
*/
|
|
38
|
+
export declare function resolveDefaultMcpUrl(): string;
|
|
39
|
+
export declare class McpClient implements IMcpRuntime {
|
|
40
|
+
private readonly baseUrl;
|
|
41
|
+
private readonly timeoutMs;
|
|
42
|
+
private readonly authToken?;
|
|
43
|
+
private readonly fetchImpl;
|
|
44
|
+
constructor(opts?: McpClientOptions);
|
|
45
|
+
/** Backend health probe. Throws `McpUnreachableError` on connection failure. */
|
|
46
|
+
health(): Promise<HealthResponse>;
|
|
47
|
+
/**
|
|
48
|
+
* Wait until the MCP server's `/healthz` returns `ok=true`. Used by
|
|
49
|
+
* bootstrap to gate startup on the sibling process.
|
|
50
|
+
*
|
|
51
|
+
* Strategy: linear retry with `attemptDelayMs` between probes; gives up
|
|
52
|
+
* after `attempts` tries. Default: 10 × 500ms = ~5s.
|
|
53
|
+
*/
|
|
54
|
+
waitUntilReady(opts?: {
|
|
55
|
+
attempts?: number;
|
|
56
|
+
attemptDelayMs?: number;
|
|
57
|
+
}): Promise<HealthResponse>;
|
|
58
|
+
/** List all registered MCP tool descriptors. */
|
|
59
|
+
listTools(): Promise<ToolListResponse>;
|
|
60
|
+
/** Invoke a single MCP tool by name. */
|
|
61
|
+
callTool<T = unknown>(name: string, args?: Record<string, unknown>): Promise<CallToolResult<T>>;
|
|
62
|
+
/** Submit a unified Action — server maps to the right tool internally. */
|
|
63
|
+
act(action: Action): Promise<ActResponse>;
|
|
64
|
+
/** Convenience: take a screenshot via `tool: screenshot`. */
|
|
65
|
+
screenshot(): Promise<ScreenshotResult>;
|
|
66
|
+
/**
|
|
67
|
+
* Convenience: dump UI hierarchy. `format: "compact"` returns the LLM-ready
|
|
68
|
+
* filtered text; `"raw"` returns full uiautomator XML.
|
|
69
|
+
*/
|
|
70
|
+
uiDump(opts?: UiDumpOptions): Promise<UiDumpResult>;
|
|
71
|
+
/** Convenience: backend `device_info` tool — the canonical DeviceInfo descriptor. */
|
|
72
|
+
info(): Promise<DeviceInfo>;
|
|
73
|
+
/** Convenience: install an APK on the (Android) sandbox. */
|
|
74
|
+
installApk(path: string): Promise<void>;
|
|
75
|
+
/** Convenience: run a shell command on the sandbox. */
|
|
76
|
+
executeCommand(body: string, opts?: ExecuteCommandOptions): Promise<ExecuteCommandResult>;
|
|
77
|
+
private request;
|
|
78
|
+
}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* McpClient — typed HTTP wrapper around `device-mcp-server`.
|
|
3
|
+
*
|
|
4
|
+
* The device-agent never talks to ADB / desktop sandboxes directly any more —
|
|
5
|
+
* everything goes through this client to the sibling MCP HTTP server. The
|
|
6
|
+
* client is intentionally thin: zero LLM / agent semantics, no caching, no
|
|
7
|
+
* retry on tool errors (only on connection-level failures during health
|
|
8
|
+
* probing).
|
|
9
|
+
*
|
|
10
|
+
* Defaults:
|
|
11
|
+
* - baseUrl: http://127.0.0.1:7900 (override via `MCP_URL` env)
|
|
12
|
+
* - timeout: 30s per request
|
|
13
|
+
*
|
|
14
|
+
* Surface mirrors the Python reference's `MCPClient` plus a couple of
|
|
15
|
+
* device-agent–specific conveniences (`act`, `screenshot`, `uiDump`,
|
|
16
|
+
* `health`, `waitUntilReady`).
|
|
17
|
+
*/
|
|
18
|
+
import { McpUnreachableError, } from "@beeos-ai/device-common";
|
|
19
|
+
const DEFAULT_BASE_URL = "http://127.0.0.1:7900";
|
|
20
|
+
const DEFAULT_TIMEOUT_MS = 30_000;
|
|
21
|
+
/**
|
|
22
|
+
* Resolve the default MCP base URL (env-aware).
|
|
23
|
+
*/
|
|
24
|
+
export function resolveDefaultMcpUrl() {
|
|
25
|
+
return process.env.MCP_URL ?? DEFAULT_BASE_URL;
|
|
26
|
+
}
|
|
27
|
+
export class McpClient {
|
|
28
|
+
baseUrl;
|
|
29
|
+
timeoutMs;
|
|
30
|
+
authToken;
|
|
31
|
+
fetchImpl;
|
|
32
|
+
constructor(opts = {}) {
|
|
33
|
+
this.baseUrl = trimTrailingSlash(opts.baseUrl ?? resolveDefaultMcpUrl());
|
|
34
|
+
this.timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
35
|
+
this.authToken = opts.authToken;
|
|
36
|
+
this.fetchImpl = opts.fetchImpl ?? fetch;
|
|
37
|
+
}
|
|
38
|
+
/** Backend health probe. Throws `McpUnreachableError` on connection failure. */
|
|
39
|
+
async health() {
|
|
40
|
+
try {
|
|
41
|
+
return await this.request("GET", "/healthz");
|
|
42
|
+
}
|
|
43
|
+
catch (e) {
|
|
44
|
+
throw new McpUnreachableError(`MCP server unreachable at ${this.baseUrl}: ${e.message}`, e);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Wait until the MCP server's `/healthz` returns `ok=true`. Used by
|
|
49
|
+
* bootstrap to gate startup on the sibling process.
|
|
50
|
+
*
|
|
51
|
+
* Strategy: linear retry with `attemptDelayMs` between probes; gives up
|
|
52
|
+
* after `attempts` tries. Default: 10 × 500ms = ~5s.
|
|
53
|
+
*/
|
|
54
|
+
async waitUntilReady(opts = {}) {
|
|
55
|
+
const attempts = opts.attempts ?? 10;
|
|
56
|
+
const delay = opts.attemptDelayMs ?? 500;
|
|
57
|
+
let lastErr;
|
|
58
|
+
for (let i = 0; i < attempts; i++) {
|
|
59
|
+
try {
|
|
60
|
+
const h = await this.health();
|
|
61
|
+
if (h.ok)
|
|
62
|
+
return h;
|
|
63
|
+
}
|
|
64
|
+
catch (e) {
|
|
65
|
+
lastErr = e;
|
|
66
|
+
}
|
|
67
|
+
await new Promise((res) => setTimeout(res, delay));
|
|
68
|
+
}
|
|
69
|
+
throw new McpUnreachableError(`MCP server at ${this.baseUrl} did not become ready after ${attempts} attempts`, lastErr);
|
|
70
|
+
}
|
|
71
|
+
/** List all registered MCP tool descriptors. */
|
|
72
|
+
async listTools() {
|
|
73
|
+
return this.request("POST", "/mcp/tools/list", {});
|
|
74
|
+
}
|
|
75
|
+
/** Invoke a single MCP tool by name. */
|
|
76
|
+
async callTool(name, args = {}) {
|
|
77
|
+
const res = await this.request("POST", "/mcp/tools/call", {
|
|
78
|
+
name,
|
|
79
|
+
arguments: args,
|
|
80
|
+
});
|
|
81
|
+
return { ok: res.ok, raw: res.result, durationMs: res.durationMs };
|
|
82
|
+
}
|
|
83
|
+
/** Submit a unified Action — server maps to the right tool internally. */
|
|
84
|
+
async act(action) {
|
|
85
|
+
return this.request("POST", "/act", { action });
|
|
86
|
+
}
|
|
87
|
+
/** Convenience: take a screenshot via `tool: screenshot`. */
|
|
88
|
+
async screenshot() {
|
|
89
|
+
const r = await this.callTool("screenshot", {});
|
|
90
|
+
return r.raw;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Convenience: dump UI hierarchy. `format: "compact"` returns the LLM-ready
|
|
94
|
+
* filtered text; `"raw"` returns full uiautomator XML.
|
|
95
|
+
*/
|
|
96
|
+
async uiDump(opts = {}) {
|
|
97
|
+
const args = {};
|
|
98
|
+
if (opts.query !== undefined)
|
|
99
|
+
args.query = opts.query;
|
|
100
|
+
if (opts.format !== undefined)
|
|
101
|
+
args.format = opts.format;
|
|
102
|
+
const r = await this.callTool("ui_dump", args);
|
|
103
|
+
return r.raw;
|
|
104
|
+
}
|
|
105
|
+
/** Convenience: backend `device_info` tool — the canonical DeviceInfo descriptor. */
|
|
106
|
+
async info() {
|
|
107
|
+
const r = await this.callTool("device_info", {});
|
|
108
|
+
return r.raw;
|
|
109
|
+
}
|
|
110
|
+
/** Convenience: install an APK on the (Android) sandbox. */
|
|
111
|
+
async installApk(path) {
|
|
112
|
+
await this.callTool("install_apk", { path });
|
|
113
|
+
}
|
|
114
|
+
/** Convenience: run a shell command on the sandbox. */
|
|
115
|
+
async executeCommand(body, opts = {}) {
|
|
116
|
+
const r = await this.callTool("execute_command", {
|
|
117
|
+
body,
|
|
118
|
+
...(opts.timeoutS !== undefined ? { timeoutS: opts.timeoutS } : {}),
|
|
119
|
+
...(opts.cwd !== undefined ? { cwd: opts.cwd } : {}),
|
|
120
|
+
});
|
|
121
|
+
return r.raw;
|
|
122
|
+
}
|
|
123
|
+
/* ------------------------------------------------------------------ */
|
|
124
|
+
/* Internal HTTP plumbing */
|
|
125
|
+
/* ------------------------------------------------------------------ */
|
|
126
|
+
async request(method, path, body) {
|
|
127
|
+
const url = `${this.baseUrl}${path}`;
|
|
128
|
+
const headers = { "content-type": "application/json" };
|
|
129
|
+
if (this.authToken)
|
|
130
|
+
headers.authorization = `Bearer ${this.authToken}`;
|
|
131
|
+
const controller = new AbortController();
|
|
132
|
+
const timeoutHandle = setTimeout(() => controller.abort(), this.timeoutMs);
|
|
133
|
+
try {
|
|
134
|
+
const res = await this.fetchImpl(url, {
|
|
135
|
+
method,
|
|
136
|
+
headers,
|
|
137
|
+
body: body !== undefined ? JSON.stringify(body) : undefined,
|
|
138
|
+
signal: controller.signal,
|
|
139
|
+
});
|
|
140
|
+
const text = await res.text();
|
|
141
|
+
const parsed = text ? safeJson(text) : undefined;
|
|
142
|
+
if (!res.ok) {
|
|
143
|
+
const errMsg = (parsed && typeof parsed === "object" && parsed.error) ||
|
|
144
|
+
`HTTP ${res.status} ${res.statusText}`;
|
|
145
|
+
const err = new Error(`MCP ${method} ${path} failed: ${errMsg}`);
|
|
146
|
+
err.status = res.status;
|
|
147
|
+
err.body = parsed ?? text;
|
|
148
|
+
throw err;
|
|
149
|
+
}
|
|
150
|
+
return parsed;
|
|
151
|
+
}
|
|
152
|
+
finally {
|
|
153
|
+
clearTimeout(timeoutHandle);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
function trimTrailingSlash(s) {
|
|
158
|
+
return s.endsWith("/") ? s.slice(0, -1) : s;
|
|
159
|
+
}
|
|
160
|
+
function safeJson(s) {
|
|
161
|
+
try {
|
|
162
|
+
return JSON.parse(s);
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
return s;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/mcp-client/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { McpClient, resolveDefaultMcpUrl } from "./client.js";
|
|
2
|
+
export type { McpClientOptions, CallToolResult } from "./client.js";
|
|
3
|
+
export type { IMcpRuntime, UiDumpOptions, ExecuteCommandOptions } from "./runtime.js";
|
|
4
|
+
export { InProcMcpClient } from "./inproc.js";
|
|
5
|
+
export type { InProcMcpClientOptions } from "./inproc.js";
|
|
6
|
+
export { autospawnMcpServer } from "./autospawn.js";
|
|
7
|
+
export type { AutospawnOptions, AutospawnHandle } from "./autospawn.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp-client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAG9D,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* InProcMcpClient — legacy `Device` bridge that satisfies the `IMcpRuntime`
|
|
3
|
+
* contract without any HTTP hop.
|
|
4
|
+
*
|
|
5
|
+
* Used internally by the legacy `Agent` shim and by tests / harness scripts
|
|
6
|
+
* that already hold a low-level `Device` and want to drive it via the new
|
|
7
|
+
* `AgentLoop` pipeline. Production paths should always go through the real
|
|
8
|
+
* `McpClient` (sibling device-mcp-server).
|
|
9
|
+
*
|
|
10
|
+
* The translation layer lives here on purpose:
|
|
11
|
+
* - `Action` (new schema) → legacy `Device` method calls
|
|
12
|
+
* - `Device.takeScreenshot()` → `ScreenshotResult` wire shape
|
|
13
|
+
* - `Device.getUiXml()` → `UiDumpResult` wire shape
|
|
14
|
+
*
|
|
15
|
+
* The ACP plugin and the sibling-MCP path additionally need
|
|
16
|
+
* `info / installApk / executeCommand`. When the constructor is also given
|
|
17
|
+
* a high-level `IDevice` (which has `getInfo / install / shell`) those
|
|
18
|
+
* methods are wired through; otherwise they throw a clear error.
|
|
19
|
+
*
|
|
20
|
+
* Coordinates are forwarded as-is — `AgentLoop.scaleAction()` already does
|
|
21
|
+
* its 0-1000 / smart_resize → absolute conversion before calling `act()`.
|
|
22
|
+
*/
|
|
23
|
+
import type { Action, ActResponse, DeviceInfo, ExecuteCommandResult, ScreenshotResult, UiDumpResult } from "@beeos-ai/device-common";
|
|
24
|
+
import type { Device } from "../device/base.js";
|
|
25
|
+
import type { IDevice } from "../ports/device.js";
|
|
26
|
+
import type { ExecuteCommandOptions, IMcpRuntime, UiDumpOptions } from "./runtime.js";
|
|
27
|
+
export interface InProcMcpClientOptions {
|
|
28
|
+
/**
|
|
29
|
+
* High-level device handle — when provided, enables the ACP-only
|
|
30
|
+
* `info / installApk / executeCommand` methods so the legacy in-process
|
|
31
|
+
* single-binary deployment can keep handling `device/info` etc. without
|
|
32
|
+
* a sibling MCP server.
|
|
33
|
+
*/
|
|
34
|
+
idevice?: IDevice;
|
|
35
|
+
}
|
|
36
|
+
export declare class InProcMcpClient implements IMcpRuntime {
|
|
37
|
+
private readonly device;
|
|
38
|
+
private readonly idevice?;
|
|
39
|
+
constructor(device: Device, opts?: InProcMcpClientOptions);
|
|
40
|
+
screenshot(): Promise<ScreenshotResult>;
|
|
41
|
+
uiDump(_opts?: UiDumpOptions): Promise<UiDumpResult>;
|
|
42
|
+
info(): Promise<DeviceInfo>;
|
|
43
|
+
installApk(path: string): Promise<void>;
|
|
44
|
+
executeCommand(body: string, _opts?: ExecuteCommandOptions): Promise<ExecuteCommandResult>;
|
|
45
|
+
act(action: Action): Promise<ActResponse>;
|
|
46
|
+
private dispatch;
|
|
47
|
+
}
|