@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,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter — desktop mock device.
|
|
3
|
+
*
|
|
4
|
+
* Equivalent to the Python `mode=desktop` runtime: returns a fixed canvas,
|
|
5
|
+
* records every action into an in-memory log, and never touches the host.
|
|
6
|
+
*
|
|
7
|
+
* Used for:
|
|
8
|
+
* - local UI development without ADB
|
|
9
|
+
* - unit testing the application/inbound layers
|
|
10
|
+
* - smoke-testing CI without a real device
|
|
11
|
+
*/
|
|
12
|
+
import { randomBytes } from "node:crypto";
|
|
13
|
+
export class DesktopAdapter {
|
|
14
|
+
actions = [];
|
|
15
|
+
width;
|
|
16
|
+
height;
|
|
17
|
+
name;
|
|
18
|
+
osType;
|
|
19
|
+
connected = false;
|
|
20
|
+
constructor(opts = {}) {
|
|
21
|
+
this.width = opts.width ?? 1920;
|
|
22
|
+
this.height = opts.height ?? 1080;
|
|
23
|
+
this.name = opts.name ?? "Desktop (mock)";
|
|
24
|
+
this.osType = opts.os ?? defaultDesktopOs();
|
|
25
|
+
}
|
|
26
|
+
async connect() {
|
|
27
|
+
this.connected = true;
|
|
28
|
+
}
|
|
29
|
+
async disconnect() {
|
|
30
|
+
this.connected = false;
|
|
31
|
+
}
|
|
32
|
+
async getInfo() {
|
|
33
|
+
// ACP wire v2: per-action capability vocabulary. Desktop mock supports
|
|
34
|
+
// visual capture + tap/swipe/type but no Android-specific keys/install.
|
|
35
|
+
const capabilities = [
|
|
36
|
+
"screenshot",
|
|
37
|
+
"tap",
|
|
38
|
+
"swipe",
|
|
39
|
+
"type",
|
|
40
|
+
"shell",
|
|
41
|
+
];
|
|
42
|
+
return {
|
|
43
|
+
type: this.osType,
|
|
44
|
+
name: this.name,
|
|
45
|
+
os: prettyOsName(this.osType),
|
|
46
|
+
width: this.width,
|
|
47
|
+
height: this.height,
|
|
48
|
+
capabilities,
|
|
49
|
+
osVersion: "mock",
|
|
50
|
+
density: 96,
|
|
51
|
+
metadata: { currentApp: "Mock", connected: String(this.connected) },
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
async capture() {
|
|
55
|
+
return {
|
|
56
|
+
width: this.width,
|
|
57
|
+
height: this.height,
|
|
58
|
+
imageBase64: TINY_PNG_BASE64,
|
|
59
|
+
imageFormat: "png",
|
|
60
|
+
uiXml: null,
|
|
61
|
+
currentApp: "Mock",
|
|
62
|
+
capturedAt: Date.now(),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
async getUiTree() {
|
|
66
|
+
return [];
|
|
67
|
+
}
|
|
68
|
+
async apply(action) {
|
|
69
|
+
this.actions.push(action);
|
|
70
|
+
}
|
|
71
|
+
async install(_path) {
|
|
72
|
+
this.actions.push({ kind: "shell", command: `install:${_path}` });
|
|
73
|
+
}
|
|
74
|
+
async shell(command) {
|
|
75
|
+
this.actions.push({ kind: "shell", command });
|
|
76
|
+
return `mock-stdout:${randomBytes(4).toString("hex")}`;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function defaultDesktopOs() {
|
|
80
|
+
switch (process.platform) {
|
|
81
|
+
case "darwin":
|
|
82
|
+
return "desktop-macos";
|
|
83
|
+
case "win32":
|
|
84
|
+
return "desktop-windows";
|
|
85
|
+
default:
|
|
86
|
+
return "desktop-linux";
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
function prettyOsName(t) {
|
|
90
|
+
switch (t) {
|
|
91
|
+
case "desktop-macos":
|
|
92
|
+
return "macOS";
|
|
93
|
+
case "desktop-windows":
|
|
94
|
+
return "Windows";
|
|
95
|
+
case "desktop-linux":
|
|
96
|
+
return "Linux";
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// A 1x1 transparent PNG. Constant so unit tests get deterministic output.
|
|
100
|
+
const TINY_PNG_BASE64 = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=";
|
|
101
|
+
//# sourceMappingURL=device-desktop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device-desktop.js","sourceRoot":"","sources":["../../src/adapters/device-desktop.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAgB1C,MAAM,OAAO,cAAc;IAChB,OAAO,GAAa,EAAE,CAAC;IACf,KAAK,CAAS;IACd,MAAM,CAAS;IACf,IAAI,CAAS;IACb,MAAM,CAA2C;IAC1D,SAAS,GAAG,KAAK,CAAC;IAE1B,YAAY,OAA8B,EAAE;QAC1C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC;QAChC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,gBAAgB,CAAC;QAC1C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,IAAI,gBAAgB,EAAE,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,OAAO;QACX,uEAAuE;QACvE,wEAAwE;QACxE,MAAM,YAAY,GAAuB;YACvC,YAAY;YACZ,KAAK;YACL,OAAO;YACP,MAAM;YACN,OAAO;SACR,CAAC;QACF,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,MAAM;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,EAAE,EAAE,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC;YAC7B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,YAAY;YACZ,SAAS,EAAE,MAAM;YACjB,OAAO,EAAE,EAAE;YACX,QAAQ,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;SACpE,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAO;QACX,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,WAAW,EAAE,eAAe;YAC5B,WAAW,EAAE,KAAK;YAClB,KAAK,EAAE,IAAI;YACX,UAAU,EAAE,MAAM;YAClB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;SACvB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,SAAS;QACb,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,MAAc;QACxB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,KAAa;QACzB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,KAAK,EAAE,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,OAAe;QACzB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAC9C,OAAO,eAAe,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;IACzD,CAAC;CACF;AAED,SAAS,gBAAgB;IACvB,QAAQ,OAAO,CAAC,QAAQ,EAAE,CAAC;QACzB,KAAK,QAAQ;YACX,OAAO,eAAe,CAAC;QACzB,KAAK,OAAO;YACV,OAAO,iBAAiB,CAAC;QAC3B;YACE,OAAO,eAAe,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,CAA2C;IAC/D,QAAQ,CAAC,EAAE,CAAC;QACV,KAAK,eAAe;YAClB,OAAO,OAAO,CAAC;QACjB,KAAK,iBAAiB;YACpB,OAAO,SAAS,CAAC;QACnB,KAAK,eAAe;YAClB,OAAO,OAAO,CAAC;IACnB,CAAC;AACH,CAAC;AAED,0EAA0E;AAC1E,MAAM,eAAe,GACnB,8FAA8F,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter — file-backed device identity (Ed25519).
|
|
3
|
+
*
|
|
4
|
+
* On-disk format follows the SDK convention used by `@beeos-ai/bridge-client`:
|
|
5
|
+
* { "publicKey": "<base64>", "privateKey": "<base64>" }
|
|
6
|
+
*
|
|
7
|
+
* Default location: `~/.beeos/<id>.key`. The SDK's `loadKeyPair` is also
|
|
8
|
+
* permissive about a raw base64 32-byte private-key seed (the format used by
|
|
9
|
+
* K8s Secret mounts in production), so existing identity files keep working.
|
|
10
|
+
*/
|
|
11
|
+
import type { IDeviceIdentity, KeyPair } from "../ports/identity.js";
|
|
12
|
+
export interface FileIdentityOptions {
|
|
13
|
+
/**
|
|
14
|
+
* Absolute path to the key file.
|
|
15
|
+
* If undefined, defaults to `~/.beeos/<id ?? "device-agent">.key`.
|
|
16
|
+
*/
|
|
17
|
+
keyFile?: string;
|
|
18
|
+
/** Used to compute the default file name when `keyFile` is undefined. */
|
|
19
|
+
id?: string;
|
|
20
|
+
}
|
|
21
|
+
export declare class FileIdentity implements IDeviceIdentity {
|
|
22
|
+
private readonly keyFile;
|
|
23
|
+
private cached;
|
|
24
|
+
constructor(opts?: FileIdentityOptions);
|
|
25
|
+
/** Path of the underlying file (useful for diagnostics). */
|
|
26
|
+
get path(): string;
|
|
27
|
+
ensure(): Promise<KeyPair>;
|
|
28
|
+
publicKeyBase64(): Promise<string>;
|
|
29
|
+
fingerprint(): Promise<string>;
|
|
30
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter — file-backed device identity (Ed25519).
|
|
3
|
+
*
|
|
4
|
+
* On-disk format follows the SDK convention used by `@beeos-ai/bridge-client`:
|
|
5
|
+
* { "publicKey": "<base64>", "privateKey": "<base64>" }
|
|
6
|
+
*
|
|
7
|
+
* Default location: `~/.beeos/<id>.key`. The SDK's `loadKeyPair` is also
|
|
8
|
+
* permissive about a raw base64 32-byte private-key seed (the format used by
|
|
9
|
+
* K8s Secret mounts in production), so existing identity files keep working.
|
|
10
|
+
*/
|
|
11
|
+
import * as fs from "node:fs";
|
|
12
|
+
import * as os from "node:os";
|
|
13
|
+
import * as path from "node:path";
|
|
14
|
+
import { fingerprint, loadKeyPair, publicKeyFromPrivate, } from "@beeos-ai/bridge-client";
|
|
15
|
+
export class FileIdentity {
|
|
16
|
+
keyFile;
|
|
17
|
+
cached = null;
|
|
18
|
+
constructor(opts = {}) {
|
|
19
|
+
this.keyFile =
|
|
20
|
+
opts.keyFile ??
|
|
21
|
+
path.join(os.homedir(), ".beeos", `${opts.id ?? "device-agent"}.key`);
|
|
22
|
+
}
|
|
23
|
+
/** Path of the underlying file (useful for diagnostics). */
|
|
24
|
+
get path() {
|
|
25
|
+
return this.keyFile;
|
|
26
|
+
}
|
|
27
|
+
async ensure() {
|
|
28
|
+
if (this.cached)
|
|
29
|
+
return this.cached;
|
|
30
|
+
const dir = path.dirname(this.keyFile);
|
|
31
|
+
if (!fs.existsSync(dir))
|
|
32
|
+
fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
33
|
+
// loadKeyPair generates + persists a fresh keypair when the file is missing.
|
|
34
|
+
const kp = loadKeyPair(this.keyFile);
|
|
35
|
+
if (!kp.publicKey || kp.publicKey.length === 0) {
|
|
36
|
+
kp.publicKey = publicKeyFromPrivate(kp.privateKey);
|
|
37
|
+
}
|
|
38
|
+
this.cached = kp;
|
|
39
|
+
return kp;
|
|
40
|
+
}
|
|
41
|
+
async publicKeyBase64() {
|
|
42
|
+
const kp = await this.ensure();
|
|
43
|
+
return Buffer.from(kp.publicKey).toString("base64");
|
|
44
|
+
}
|
|
45
|
+
async fingerprint() {
|
|
46
|
+
const kp = await this.ensure();
|
|
47
|
+
return fingerprint(kp.publicKey);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=identity-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity-file.js","sourceRoot":"","sources":["../../src/adapters/identity-file.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EACL,WAAW,EACX,WAAW,EACX,oBAAoB,GACrB,MAAM,yBAAyB,CAAC;AAajC,MAAM,OAAO,YAAY;IACN,OAAO,CAAS;IACzB,MAAM,GAAmB,IAAI,CAAC;IAEtC,YAAY,OAA4B,EAAE;QACxC,IAAI,CAAC,OAAO;YACV,IAAI,CAAC,OAAO;gBACZ,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,cAAc,MAAM,CAAC,CAAC;IAC1E,CAAC;IAED,4DAA4D;IAC5D,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,MAAM;QACV,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC;QACpC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7E,6EAA6E;QAC7E,MAAM,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,CAAC,EAAE,CAAC,SAAS,IAAI,EAAE,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/C,EAAE,CAAC,SAAS,GAAG,oBAAoB,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QAC/B,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,WAAW;QACf,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QAC/B,OAAO,WAAW,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC;CACF"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter — Bridge WebSocket transport.
|
|
3
|
+
*
|
|
4
|
+
* Wraps `@beeos-ai/bridge-client` (Ed25519 `agent_auth` handshake +
|
|
5
|
+
* auto-reconnect + heartbeat) and exposes the slim `IBridgeTransport` port
|
|
6
|
+
* the inbound ACP layer needs (raw string send + 4 events).
|
|
7
|
+
*
|
|
8
|
+
* Why a thin wrapper rather than re-using BridgeClient directly?
|
|
9
|
+
* - keeps the application/inbound layers free from `events.EventEmitter`
|
|
10
|
+
* typing leaks and lets us swap in an in-memory transport for tests
|
|
11
|
+
* - exposes a stable surface even if the SDK adds new events
|
|
12
|
+
*/
|
|
13
|
+
import { type BridgeClientOptions } from "@beeos-ai/bridge-client";
|
|
14
|
+
import type { IBridgeTransport } from "../ports/transport.js";
|
|
15
|
+
export interface BridgeWsTransportOptions {
|
|
16
|
+
/** Bridge base URL, e.g. `wss://bridge.beeos.ai:18443`. */
|
|
17
|
+
bridgeUrl: string;
|
|
18
|
+
/** ACP service name registered on Bridge (default `acp`). */
|
|
19
|
+
service?: string;
|
|
20
|
+
/** Path to identity key file or pre-loaded keys. */
|
|
21
|
+
keyFile?: string;
|
|
22
|
+
privateKey?: Uint8Array;
|
|
23
|
+
publicKey?: Uint8Array;
|
|
24
|
+
/** Override reconnect / heartbeat policy. */
|
|
25
|
+
reconnect?: BridgeClientOptions["reconnect"];
|
|
26
|
+
heartbeat?: BridgeClientOptions["heartbeat"];
|
|
27
|
+
proxy?: string;
|
|
28
|
+
}
|
|
29
|
+
export declare class BridgeWsTransport implements IBridgeTransport {
|
|
30
|
+
private readonly client;
|
|
31
|
+
constructor(opts: BridgeWsTransportOptions);
|
|
32
|
+
connect(): Promise<void>;
|
|
33
|
+
send(data: string): Promise<void>;
|
|
34
|
+
close(): Promise<void>;
|
|
35
|
+
on(event: "connected", handler: () => void): void;
|
|
36
|
+
on(event: "disconnected", handler: (reason: string) => void): void;
|
|
37
|
+
on(event: "message", handler: (data: string) => void | Promise<void>): void;
|
|
38
|
+
on(event: "error", handler: (err: Error) => void): void;
|
|
39
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter — Bridge WebSocket transport.
|
|
3
|
+
*
|
|
4
|
+
* Wraps `@beeos-ai/bridge-client` (Ed25519 `agent_auth` handshake +
|
|
5
|
+
* auto-reconnect + heartbeat) and exposes the slim `IBridgeTransport` port
|
|
6
|
+
* the inbound ACP layer needs (raw string send + 4 events).
|
|
7
|
+
*
|
|
8
|
+
* Why a thin wrapper rather than re-using BridgeClient directly?
|
|
9
|
+
* - keeps the application/inbound layers free from `events.EventEmitter`
|
|
10
|
+
* typing leaks and lets us swap in an in-memory transport for tests
|
|
11
|
+
* - exposes a stable surface even if the SDK adds new events
|
|
12
|
+
*/
|
|
13
|
+
import { BridgeClient } from "@beeos-ai/bridge-client";
|
|
14
|
+
export class BridgeWsTransport {
|
|
15
|
+
client;
|
|
16
|
+
constructor(opts) {
|
|
17
|
+
this.client = new BridgeClient({
|
|
18
|
+
bridgeUrl: opts.bridgeUrl,
|
|
19
|
+
service: opts.service ?? "acp",
|
|
20
|
+
keyFile: opts.keyFile,
|
|
21
|
+
privateKey: opts.privateKey,
|
|
22
|
+
publicKey: opts.publicKey,
|
|
23
|
+
reconnect: opts.reconnect,
|
|
24
|
+
heartbeat: opts.heartbeat,
|
|
25
|
+
proxy: opts.proxy,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
async connect() {
|
|
29
|
+
await this.client.connect();
|
|
30
|
+
}
|
|
31
|
+
async send(data) {
|
|
32
|
+
await this.client.send(data);
|
|
33
|
+
}
|
|
34
|
+
async close() {
|
|
35
|
+
await this.client.close(true);
|
|
36
|
+
}
|
|
37
|
+
on(event, handler) {
|
|
38
|
+
if (event === "message") {
|
|
39
|
+
this.client.on("message", (data) => {
|
|
40
|
+
const str = typeof data === "string" ? data : Buffer.from(data).toString();
|
|
41
|
+
return handler(str);
|
|
42
|
+
});
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
46
|
+
this.client.on(event, handler);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=transport-bridge-ws.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport-bridge-ws.js","sourceRoot":"","sources":["../../src/adapters/transport-bridge-ws.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,YAAY,EAA4B,MAAM,yBAAyB,CAAC;AAkBjF,MAAM,OAAO,iBAAiB;IACX,MAAM,CAAe;IAEtC,YAAY,IAA8B;QACxC,IAAI,CAAC,MAAM,GAAG,IAAI,YAAY,CAAC;YAC7B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,KAAK;YAC9B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAY;QACrB,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAMD,EAAE,CAAC,KAAa,EAAE,OAAmD;QACnE,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE;gBACjC,MAAM,GAAG,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;gBAC3E,OAAQ,OAA+C,CAAC,GAAG,CAAC,CAAC;YAC/D,CAAC,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD,8DAA8D;QAC9D,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAY,EAAE,OAAc,CAAC,CAAC;IAC/C,CAAC;CACF"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter — IVlm implementation backed by the existing inner VLM loop.
|
|
3
|
+
*
|
|
4
|
+
* The repo already ships a battle-tested screenshot→reason→act loop in
|
|
5
|
+
* `src/agent.ts` (`Agent`) plus a configurable `OpenAIClient` that picks the
|
|
6
|
+
* right `ModelAdapter` based on the model name (`gpt-4o`, `qwen-vl`,
|
|
7
|
+
* `ui-tars`, `gui-owl`, `mai-ui`, …).
|
|
8
|
+
*
|
|
9
|
+
* This file exposes that loop through the `IVlm` port. We do NOT re-implement
|
|
10
|
+
* the per-model parsing — instead we delegate, so the rich existing parsers /
|
|
11
|
+
* grounders / coordinate-system handling stay intact.
|
|
12
|
+
*
|
|
13
|
+
* The application layer therefore only sees one stable interface (`IVlm`) and
|
|
14
|
+
* stays decoupled from the OpenAI SDK and from per-model peculiarities.
|
|
15
|
+
*/
|
|
16
|
+
import type { ModelClient } from "../model/base.js";
|
|
17
|
+
import type { IDevice } from "../ports/device.js";
|
|
18
|
+
import type { IVlm } from "../ports/vlm.js";
|
|
19
|
+
import type { VlmStep } from "../ports/agent-core.js";
|
|
20
|
+
import type { Device } from "../device/base.js";
|
|
21
|
+
export interface InnerLoopVlmOptions {
|
|
22
|
+
/** Model name forwarded to OpenAIClient (e.g. `gpt-4o`, `ui-tars-7b`). */
|
|
23
|
+
modelName?: string;
|
|
24
|
+
baseUrl?: string;
|
|
25
|
+
apiKey?: string;
|
|
26
|
+
maxSteps?: number;
|
|
27
|
+
lang?: "cn" | "en";
|
|
28
|
+
verbose?: boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Caller can pre-construct a ModelClient for fully custom config; otherwise
|
|
31
|
+
* we instantiate a default OpenAIClient with adapter auto-detection.
|
|
32
|
+
*/
|
|
33
|
+
modelClient?: ModelClient;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Wraps Agent + OpenAIClient as an IVlm. The IDevice **must** be one of the
|
|
37
|
+
* adapters in this package because the legacy Agent expects the old `Device`
|
|
38
|
+
* interface — we expose `.raw` on production adapters for that.
|
|
39
|
+
*/
|
|
40
|
+
export declare class InnerLoopVlm implements IVlm {
|
|
41
|
+
private agent;
|
|
42
|
+
private client;
|
|
43
|
+
private readonly inner;
|
|
44
|
+
private readonly cfg;
|
|
45
|
+
private readonly baseUrl?;
|
|
46
|
+
private readonly apiKey?;
|
|
47
|
+
private provider;
|
|
48
|
+
constructor(device: IDevice, opts?: InnerLoopVlmOptions);
|
|
49
|
+
get modelName(): string;
|
|
50
|
+
get providerName(): string;
|
|
51
|
+
/**
|
|
52
|
+
* Rebuild the underlying OpenAIClient + Agent with a new provider/model.
|
|
53
|
+
*
|
|
54
|
+
* `provider` is forwarded as the explicit adapter selector, so callers can
|
|
55
|
+
* force e.g. the `qwen-vl` adapter even when the model id alone would not
|
|
56
|
+
* disambiguate. Any in-flight `runTask` call keeps using the old client; the
|
|
57
|
+
* new client takes over from the next task.
|
|
58
|
+
*/
|
|
59
|
+
setProvider(provider: string, model: string): Promise<void>;
|
|
60
|
+
runTask(opts: {
|
|
61
|
+
task: string;
|
|
62
|
+
maxSteps: number;
|
|
63
|
+
onText?: (text: string) => void | Promise<void>;
|
|
64
|
+
onStep?: (step: VlmStep & {
|
|
65
|
+
stepIndex: number;
|
|
66
|
+
}) => void | Promise<void>;
|
|
67
|
+
abortSignal?: AbortSignal;
|
|
68
|
+
}): Promise<{
|
|
69
|
+
finalMessage: string;
|
|
70
|
+
steps: number;
|
|
71
|
+
cancelled: boolean;
|
|
72
|
+
}>;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Best-effort `IDevice` → legacy `Device` unwrap.
|
|
76
|
+
*
|
|
77
|
+
* Production adapters expose a `.raw` of the legacy `Device` shape:
|
|
78
|
+
* - `AndroidAdbAdapter.raw` → real `AndroidDevice` (full UI XML, etc.)
|
|
79
|
+
* - `DesktopAdapter` → no `.raw`; we synthesise an inline shim
|
|
80
|
+
*
|
|
81
|
+
* Tests / harness scripts that pass arbitrary `IDevice` stubs may also
|
|
82
|
+
* supply a `.raw` matching the legacy shape — that path is honoured too.
|
|
83
|
+
*
|
|
84
|
+
* Exported so callers (bootstrap, harness scripts) that build an
|
|
85
|
+
* `InProcMcpClient` from an `IDevice` get exactly the same behaviour the
|
|
86
|
+
* legacy `Agent` had with the same input.
|
|
87
|
+
*/
|
|
88
|
+
export declare function unwrapInnerDevice(d: IDevice): Device;
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter — IVlm implementation backed by the existing inner VLM loop.
|
|
3
|
+
*
|
|
4
|
+
* The repo already ships a battle-tested screenshot→reason→act loop in
|
|
5
|
+
* `src/agent.ts` (`Agent`) plus a configurable `OpenAIClient` that picks the
|
|
6
|
+
* right `ModelAdapter` based on the model name (`gpt-4o`, `qwen-vl`,
|
|
7
|
+
* `ui-tars`, `gui-owl`, `mai-ui`, …).
|
|
8
|
+
*
|
|
9
|
+
* This file exposes that loop through the `IVlm` port. We do NOT re-implement
|
|
10
|
+
* the per-model parsing — instead we delegate, so the rich existing parsers /
|
|
11
|
+
* grounders / coordinate-system handling stay intact.
|
|
12
|
+
*
|
|
13
|
+
* The application layer therefore only sees one stable interface (`IVlm`) and
|
|
14
|
+
* stays decoupled from the OpenAI SDK and from per-model peculiarities.
|
|
15
|
+
*/
|
|
16
|
+
import { Agent } from "../agent.js";
|
|
17
|
+
import { OpenAIClient } from "../model/client.js";
|
|
18
|
+
import { VlmError } from "../core/errors.js";
|
|
19
|
+
import { AndroidAdbAdapter } from "./device-android-adb.js";
|
|
20
|
+
import { DesktopAdapter } from "./device-desktop.js";
|
|
21
|
+
/**
|
|
22
|
+
* Wraps Agent + OpenAIClient as an IVlm. The IDevice **must** be one of the
|
|
23
|
+
* adapters in this package because the legacy Agent expects the old `Device`
|
|
24
|
+
* interface — we expose `.raw` on production adapters for that.
|
|
25
|
+
*/
|
|
26
|
+
export class InnerLoopVlm {
|
|
27
|
+
agent;
|
|
28
|
+
client;
|
|
29
|
+
inner;
|
|
30
|
+
cfg;
|
|
31
|
+
baseUrl;
|
|
32
|
+
apiKey;
|
|
33
|
+
provider = "";
|
|
34
|
+
constructor(device, opts = {}) {
|
|
35
|
+
this.inner = unwrapInnerDevice(device);
|
|
36
|
+
this.cfg = {
|
|
37
|
+
maxSteps: opts.maxSteps,
|
|
38
|
+
lang: opts.lang,
|
|
39
|
+
verbose: opts.verbose,
|
|
40
|
+
};
|
|
41
|
+
this.baseUrl = opts.baseUrl;
|
|
42
|
+
this.apiKey = opts.apiKey;
|
|
43
|
+
this.client = opts.modelClient ?? new OpenAIClient({
|
|
44
|
+
modelName: opts.modelName,
|
|
45
|
+
baseUrl: opts.baseUrl,
|
|
46
|
+
apiKey: opts.apiKey,
|
|
47
|
+
});
|
|
48
|
+
this.agent = new Agent(this.client, this.inner, this.cfg);
|
|
49
|
+
}
|
|
50
|
+
get modelName() {
|
|
51
|
+
return this.client.modelName;
|
|
52
|
+
}
|
|
53
|
+
get providerName() {
|
|
54
|
+
return this.provider;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Rebuild the underlying OpenAIClient + Agent with a new provider/model.
|
|
58
|
+
*
|
|
59
|
+
* `provider` is forwarded as the explicit adapter selector, so callers can
|
|
60
|
+
* force e.g. the `qwen-vl` adapter even when the model id alone would not
|
|
61
|
+
* disambiguate. Any in-flight `runTask` call keeps using the old client; the
|
|
62
|
+
* new client takes over from the next task.
|
|
63
|
+
*/
|
|
64
|
+
async setProvider(provider, model) {
|
|
65
|
+
if (!model)
|
|
66
|
+
throw new VlmError("setProvider: model is required");
|
|
67
|
+
const adapter = (provider || "").trim() || undefined;
|
|
68
|
+
this.client = new OpenAIClient({
|
|
69
|
+
modelName: model,
|
|
70
|
+
baseUrl: this.baseUrl,
|
|
71
|
+
apiKey: this.apiKey,
|
|
72
|
+
adapter,
|
|
73
|
+
});
|
|
74
|
+
this.agent = new Agent(this.client, this.inner, this.cfg);
|
|
75
|
+
this.provider = adapter ?? "";
|
|
76
|
+
}
|
|
77
|
+
async runTask(opts) {
|
|
78
|
+
if (opts.abortSignal?.aborted) {
|
|
79
|
+
return { finalMessage: "Cancelled before start.", steps: 0, cancelled: true };
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
const result = await this.agent.run(opts.task, {
|
|
83
|
+
signal: opts.abortSignal,
|
|
84
|
+
maxSteps: opts.maxSteps,
|
|
85
|
+
onText: opts.onText,
|
|
86
|
+
onStep: opts.onStep
|
|
87
|
+
? async (step) => {
|
|
88
|
+
await opts.onStep({ ...mapStep(step), stepIndex: step.index });
|
|
89
|
+
}
|
|
90
|
+
: undefined,
|
|
91
|
+
});
|
|
92
|
+
return {
|
|
93
|
+
finalMessage: result.finalText,
|
|
94
|
+
steps: result.steps,
|
|
95
|
+
cancelled: result.cancelled,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
catch (e) {
|
|
99
|
+
if (opts.abortSignal?.aborted) {
|
|
100
|
+
return { finalMessage: "Cancelled.", steps: 0, cancelled: true };
|
|
101
|
+
}
|
|
102
|
+
throw new VlmError(`VLM task failed: ${e.message}`, e);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Project an internal `AgentStepRecord` (action shape: `{ actionType,
|
|
108
|
+
* params }`) onto the public `VlmStep` shape (action shape: discriminated
|
|
109
|
+
* `Action` union). The IVlm port treats `action` as opaque to the host —
|
|
110
|
+
* so a best-effort mapping that preserves `actionType` as `kind` and
|
|
111
|
+
* spreads params is enough for downstream consumers.
|
|
112
|
+
*/
|
|
113
|
+
function mapStep(step) {
|
|
114
|
+
const action = step.action
|
|
115
|
+
? { kind: step.action.actionType, ...step.action.params }
|
|
116
|
+
: null;
|
|
117
|
+
return {
|
|
118
|
+
thinking: step.thinking,
|
|
119
|
+
action,
|
|
120
|
+
finished: step.finished,
|
|
121
|
+
message: step.message,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Best-effort `IDevice` → legacy `Device` unwrap.
|
|
126
|
+
*
|
|
127
|
+
* Production adapters expose a `.raw` of the legacy `Device` shape:
|
|
128
|
+
* - `AndroidAdbAdapter.raw` → real `AndroidDevice` (full UI XML, etc.)
|
|
129
|
+
* - `DesktopAdapter` → no `.raw`; we synthesise an inline shim
|
|
130
|
+
*
|
|
131
|
+
* Tests / harness scripts that pass arbitrary `IDevice` stubs may also
|
|
132
|
+
* supply a `.raw` matching the legacy shape — that path is honoured too.
|
|
133
|
+
*
|
|
134
|
+
* Exported so callers (bootstrap, harness scripts) that build an
|
|
135
|
+
* `InProcMcpClient` from an `IDevice` get exactly the same behaviour the
|
|
136
|
+
* legacy `Agent` had with the same input.
|
|
137
|
+
*/
|
|
138
|
+
export function unwrapInnerDevice(d) {
|
|
139
|
+
if (d instanceof AndroidAdbAdapter)
|
|
140
|
+
return d.raw;
|
|
141
|
+
if (d instanceof DesktopAdapter)
|
|
142
|
+
return innerDesktopShim(d);
|
|
143
|
+
// Fallback: any IDevice with a public `.raw` of the legacy Device shape.
|
|
144
|
+
const raw = d.raw;
|
|
145
|
+
if (raw && typeof raw.takeScreenshot === "function")
|
|
146
|
+
return raw;
|
|
147
|
+
throw new VlmError("unwrapInnerDevice requires an IDevice that exposes a legacy `Device` driver via .raw (AndroidAdbAdapter / DesktopAdapter).");
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Build a minimal legacy `Device` shim for the desktop mock so the inner Agent
|
|
151
|
+
* loop can still run end-to-end against it (tests, demos).
|
|
152
|
+
*/
|
|
153
|
+
function innerDesktopShim(d) {
|
|
154
|
+
return {
|
|
155
|
+
async takeScreenshot() {
|
|
156
|
+
const o = await d.capture();
|
|
157
|
+
return { base64Data: o.imageBase64, width: o.width, height: o.height };
|
|
158
|
+
},
|
|
159
|
+
async getCurrentApp() {
|
|
160
|
+
const i = await d.getInfo();
|
|
161
|
+
return i.metadata.currentApp ?? "Mock";
|
|
162
|
+
},
|
|
163
|
+
async getUiXml() {
|
|
164
|
+
return null;
|
|
165
|
+
},
|
|
166
|
+
async tap(x, y) {
|
|
167
|
+
await d.apply({ kind: "tap", x, y });
|
|
168
|
+
},
|
|
169
|
+
async doubleTap(x, y) {
|
|
170
|
+
await d.apply({ kind: "double_tap", x, y });
|
|
171
|
+
},
|
|
172
|
+
async longPress(x, y, durationMs) {
|
|
173
|
+
await d.apply({ kind: "long_press", x, y, durationMs });
|
|
174
|
+
},
|
|
175
|
+
async swipe(x1, y1, x2, y2, durationMs) {
|
|
176
|
+
await d.apply({ kind: "swipe", x1, y1, x2, y2, durationMs });
|
|
177
|
+
},
|
|
178
|
+
async inputText(text) {
|
|
179
|
+
await d.apply({ kind: "type", text });
|
|
180
|
+
},
|
|
181
|
+
async pressKey(keycode) {
|
|
182
|
+
await d.apply({ kind: "press_key", keycode });
|
|
183
|
+
},
|
|
184
|
+
async launchApp(name) {
|
|
185
|
+
await d.apply({ kind: "open_app", packageOrName: name });
|
|
186
|
+
return true;
|
|
187
|
+
},
|
|
188
|
+
async pressBack() {
|
|
189
|
+
await d.apply({ kind: "press_back" });
|
|
190
|
+
},
|
|
191
|
+
async pressHome() {
|
|
192
|
+
await d.apply({ kind: "press_home" });
|
|
193
|
+
},
|
|
194
|
+
async clearText() {
|
|
195
|
+
// no-op in mock
|
|
196
|
+
},
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=vlm-inner-loop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vlm-inner-loop.js","sourceRoot":"","sources":["../../src/adapters/vlm-inner-loop.ts"],"names":[],"mappings":"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"}
|