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