@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,624 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agent-runtime/core — Plan-Act-Reflect loop.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the Python reference at
|
|
5
|
+
* /Users/heat/workspace/deviceagent_research/deviceagent/agent_runtime/loop/core.py
|
|
6
|
+
*
|
|
7
|
+
* Each iteration:
|
|
8
|
+
* 1. **Observe** — pull a fresh screenshot from the MCP server via
|
|
9
|
+
* `McpClient`. The uiautomator dump is fetched only when the active
|
|
10
|
+
* `IModelAdapter.consumesUiDump === true` (e.g. GUI-Owl); the default
|
|
11
|
+
* pure-vision flow (Open-AutoGLM, UI-TARS, Qwen-VL, ShowUI) skips it
|
|
12
|
+
* to save ~1–3 s per step on Android.
|
|
13
|
+
* 2. **Predict** — ask the registered `IModelAdapter` for the next
|
|
14
|
+
* `Action`, given the observation and rolling step history.
|
|
15
|
+
* 3. **Act** — terminal verbs (`done` / `fail` / `call_for_user`) short-
|
|
16
|
+
* circuit the loop. Everything else is dispatched to the MCP `/act`
|
|
17
|
+
* route. Action payloads carrying `_coordSystem: "0-1000" |
|
|
18
|
+
* "smart_resize"` are scaled to absolute screen pixels before
|
|
19
|
+
* dispatch.
|
|
20
|
+
* 4. **Reflect** — heuristic stall detection. A non-null veto string
|
|
21
|
+
* ends the run with `terminator: "reflection_veto"`.
|
|
22
|
+
*
|
|
23
|
+
* Termination conditions:
|
|
24
|
+
* - `done` action → success
|
|
25
|
+
* - `fail` action → failure
|
|
26
|
+
* - `call_for_user` action → handled per `waitForUser` flag
|
|
27
|
+
* - step budget exceeded
|
|
28
|
+
* - wall-clock timeout exceeded
|
|
29
|
+
* - reflection veto
|
|
30
|
+
* - external `AbortSignal` aborted
|
|
31
|
+
*/
|
|
32
|
+
import { isTerminal } from "@beeos-ai/device-common";
|
|
33
|
+
import { HierarchicalReflector } from "./reflection.js";
|
|
34
|
+
/* ──────────────────────────────────────────────────────────────────────── */
|
|
35
|
+
/* AgentLoop */
|
|
36
|
+
/* ──────────────────────────────────────────────────────────────────────── */
|
|
37
|
+
export class AgentLoop {
|
|
38
|
+
opts;
|
|
39
|
+
static DEFAULT_MAX_STEPS = 30;
|
|
40
|
+
static DEFAULT_TIMEOUT_MS = 5 * 60 * 1000;
|
|
41
|
+
history = [];
|
|
42
|
+
reflector;
|
|
43
|
+
notes = [];
|
|
44
|
+
trajectoryVerdict;
|
|
45
|
+
constructor(opts) {
|
|
46
|
+
this.opts = opts;
|
|
47
|
+
this.reflector = opts.reflector ?? new HierarchicalReflector(opts.adapter);
|
|
48
|
+
}
|
|
49
|
+
async run() {
|
|
50
|
+
const maxSteps = this.opts.maxSteps ?? AgentLoop.DEFAULT_MAX_STEPS;
|
|
51
|
+
const timeoutMs = this.opts.timeoutMs ?? AgentLoop.DEFAULT_TIMEOUT_MS;
|
|
52
|
+
const deadline = Date.now() + timeoutMs;
|
|
53
|
+
const usage = { inputTokens: 0, outputTokens: 0 };
|
|
54
|
+
let step = 0;
|
|
55
|
+
let lastError;
|
|
56
|
+
let finalText = "";
|
|
57
|
+
while (step < maxSteps) {
|
|
58
|
+
if (this.opts.signal?.aborted) {
|
|
59
|
+
return this.finish("cancelled", step, "Task cancelled", usage, lastError);
|
|
60
|
+
}
|
|
61
|
+
if (Date.now() > deadline) {
|
|
62
|
+
const err = {
|
|
63
|
+
code: "TIMEOUT",
|
|
64
|
+
message: `agent exceeded ${timeoutMs}ms budget`,
|
|
65
|
+
fatal: true,
|
|
66
|
+
};
|
|
67
|
+
await this.fire("onError", err);
|
|
68
|
+
return this.finish("timeout", step, err.message, usage, err);
|
|
69
|
+
}
|
|
70
|
+
step += 1;
|
|
71
|
+
// ── 1. Observe ─────────────────────────────────────────────────
|
|
72
|
+
let obs;
|
|
73
|
+
try {
|
|
74
|
+
obs = await this.observe();
|
|
75
|
+
}
|
|
76
|
+
catch (e) {
|
|
77
|
+
const err = {
|
|
78
|
+
code: "MCP_OBSERVE_FAILED",
|
|
79
|
+
message: errMsg(e),
|
|
80
|
+
fatal: true,
|
|
81
|
+
cause: e,
|
|
82
|
+
};
|
|
83
|
+
await this.fire("onError", err);
|
|
84
|
+
return this.finish("error", step, err.message, usage, err);
|
|
85
|
+
}
|
|
86
|
+
// ── Phase 1.5 — derive a text-only observation summary. Prefer
|
|
87
|
+
// uiDump's top text/content-desc nodes (already fetched when the
|
|
88
|
+
// adapter sets `consumesUiDump`); otherwise we fall back to the
|
|
89
|
+
// grounder's rationale once predict() returns. This is what
|
|
90
|
+
// downstream reflectors read so they don't need the screenshot.
|
|
91
|
+
let observationSummary = summarizeUiDump(obs.uiDump);
|
|
92
|
+
// ── 2. Predict ────────────────────────────────────────────────
|
|
93
|
+
let prediction;
|
|
94
|
+
try {
|
|
95
|
+
prediction = await this.opts.adapter.predictAction(obs, this.history, {
|
|
96
|
+
signal: this.opts.signal,
|
|
97
|
+
hooks: { onText: this.opts.hooks?.onText, onReasoning: this.opts.hooks?.onReasoning },
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
catch (e) {
|
|
101
|
+
if (this.opts.signal?.aborted) {
|
|
102
|
+
return this.finish("cancelled", step, "Task cancelled", usage, lastError);
|
|
103
|
+
}
|
|
104
|
+
const err = {
|
|
105
|
+
code: "MODEL_PREDICT_FAILED",
|
|
106
|
+
message: errMsg(e),
|
|
107
|
+
fatal: false,
|
|
108
|
+
cause: e,
|
|
109
|
+
};
|
|
110
|
+
lastError = err;
|
|
111
|
+
await this.fire("onError", err);
|
|
112
|
+
// Skip this step, try again (matches the Python reference).
|
|
113
|
+
this.history.push({
|
|
114
|
+
stepIdx: step,
|
|
115
|
+
action: null,
|
|
116
|
+
rationale: `model predict failed: ${err.message}`,
|
|
117
|
+
observationSummary: "",
|
|
118
|
+
actionResult: "predict_failed",
|
|
119
|
+
actErrorMessage: err.message,
|
|
120
|
+
});
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
usage.inputTokens += prediction.usage.inputTokens;
|
|
124
|
+
usage.outputTokens += prediction.usage.outputTokens;
|
|
125
|
+
if (prediction.usage.cachedInputTokens) {
|
|
126
|
+
usage.cachedInputTokens =
|
|
127
|
+
(usage.cachedInputTokens ?? 0) + prediction.usage.cachedInputTokens;
|
|
128
|
+
}
|
|
129
|
+
if (prediction.usage.costUsd) {
|
|
130
|
+
usage.costUsd = (usage.costUsd ?? 0) + prediction.usage.costUsd;
|
|
131
|
+
}
|
|
132
|
+
if (!observationSummary) {
|
|
133
|
+
observationSummary = summarizeRationale(prediction.rationale);
|
|
134
|
+
}
|
|
135
|
+
// Reasoning event before the action is dispatched.
|
|
136
|
+
if (prediction.rationale)
|
|
137
|
+
await this.fire("onReasoning", prediction.rationale);
|
|
138
|
+
// ── 3. Act ─────────────────────────────────────────────────────
|
|
139
|
+
const action = prediction.action;
|
|
140
|
+
// Phase 2.1 — `take_note` is a *local* book-keeping verb. It does
|
|
141
|
+
// NOT hit MCP, does NOT consume act / pre-sanity budget on the
|
|
142
|
+
// grounder side, and is recorded in history so reflectors / replan
|
|
143
|
+
// can see it. Step counter still ticks (we already incremented
|
|
144
|
+
// above) so a runaway grounder that only emits notes still hits
|
|
145
|
+
// the heuristic veto.
|
|
146
|
+
if (action.type === "take_note") {
|
|
147
|
+
const note = stringFromPayload(action.payload, "note") ?? prediction.rationale ?? "";
|
|
148
|
+
if (note.trim().length > 0) {
|
|
149
|
+
this.notes.push(note.trim());
|
|
150
|
+
}
|
|
151
|
+
this.recordHistory(step, prediction, observationSummary, "ok");
|
|
152
|
+
await this.fireStep(step, prediction, false);
|
|
153
|
+
// Heuristic veto still applies (4 identical take_note in a row =
|
|
154
|
+
// stalled grounder), so fall through to the bottom check.
|
|
155
|
+
const veto = this.reflector.maybeVeto(this.history, step, maxSteps);
|
|
156
|
+
if (veto) {
|
|
157
|
+
const err = {
|
|
158
|
+
code: "REFLECTION_VETO",
|
|
159
|
+
message: veto,
|
|
160
|
+
fatal: true,
|
|
161
|
+
};
|
|
162
|
+
await this.fire("onError", err);
|
|
163
|
+
return this.finish("reflection_veto", step, veto, usage, err);
|
|
164
|
+
}
|
|
165
|
+
// Trajectory check still applies — a runaway grounder that only
|
|
166
|
+
// emits notes is exactly the "stuck" case we want to bail on.
|
|
167
|
+
const trajVeto = await this.maybeRunTrajectoryReflector(step, maxSteps, usage);
|
|
168
|
+
if (trajVeto) {
|
|
169
|
+
const err = {
|
|
170
|
+
code: "REFLECTION_VETO",
|
|
171
|
+
message: trajVeto,
|
|
172
|
+
fatal: true,
|
|
173
|
+
};
|
|
174
|
+
await this.fire("onError", err);
|
|
175
|
+
return this.finish("reflection_veto", step, trajVeto, usage, err);
|
|
176
|
+
}
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
// Pre-action sanity (Phase 1.3) — block obviously-broken candidates
|
|
180
|
+
// before dispatch. Terminal verbs are short-circuited below so they
|
|
181
|
+
// are never blocked.
|
|
182
|
+
if (!isTerminal(action)) {
|
|
183
|
+
const veto = this.reflector.maybeBlockAction(this.history, action);
|
|
184
|
+
if (veto) {
|
|
185
|
+
const note = `pre-sanity blocked: ${veto.code} — ${veto.reason}`;
|
|
186
|
+
this.recordHistory(step, prediction, note, "skipped", veto.reason);
|
|
187
|
+
await this.fireStep(step, prediction, false);
|
|
188
|
+
// Surface as a non-fatal error event so the orchestrator can log it.
|
|
189
|
+
await this.fire("onError", {
|
|
190
|
+
code: "REFLECTION_VETO",
|
|
191
|
+
message: note,
|
|
192
|
+
fatal: false,
|
|
193
|
+
});
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
if (action.type === "done") {
|
|
198
|
+
finalText =
|
|
199
|
+
stringFromPayload(action.payload, "message") ??
|
|
200
|
+
stringFromPayload(action.payload, "finalText") ??
|
|
201
|
+
"task complete";
|
|
202
|
+
await this.fireStep(step, prediction, true);
|
|
203
|
+
this.recordHistory(step, prediction, observationSummary, "terminal");
|
|
204
|
+
return this.finish("done", step, finalText, usage, lastError);
|
|
205
|
+
}
|
|
206
|
+
if (action.type === "fail") {
|
|
207
|
+
finalText =
|
|
208
|
+
stringFromPayload(action.payload, "reason") ??
|
|
209
|
+
stringFromPayload(action.payload, "message") ??
|
|
210
|
+
"model gave up";
|
|
211
|
+
const err = {
|
|
212
|
+
code: "MODEL_FAIL",
|
|
213
|
+
message: finalText,
|
|
214
|
+
fatal: true,
|
|
215
|
+
};
|
|
216
|
+
await this.fire("onError", err);
|
|
217
|
+
await this.fireStep(step, prediction, true);
|
|
218
|
+
this.recordHistory(step, prediction, observationSummary, "terminal", finalText);
|
|
219
|
+
return this.finish("fail", step, finalText, usage, err);
|
|
220
|
+
}
|
|
221
|
+
if (action.type === "call_for_user") {
|
|
222
|
+
finalText =
|
|
223
|
+
stringFromPayload(action.payload, "message") ??
|
|
224
|
+
stringFromPayload(action.payload, "reason") ??
|
|
225
|
+
"operator takeover requested";
|
|
226
|
+
await this.fireStep(step, prediction, true);
|
|
227
|
+
this.recordHistory(step, prediction, observationSummary, "terminal");
|
|
228
|
+
if (!this.opts.waitForUser) {
|
|
229
|
+
return this.finish("call_for_user", step, finalText, usage, lastError);
|
|
230
|
+
}
|
|
231
|
+
// Phase-1: surfacing the event is enough — wait-for-user is
|
|
232
|
+
// implemented by the orchestrator layer (PiOrchestratorAgent).
|
|
233
|
+
return this.finish("call_for_user", step, finalText, usage, lastError);
|
|
234
|
+
}
|
|
235
|
+
const t0 = Date.now();
|
|
236
|
+
let actResult;
|
|
237
|
+
try {
|
|
238
|
+
const r = await this.opts.mcp.act(this.scaleAction(action, obs));
|
|
239
|
+
actResult = r.result ?? r;
|
|
240
|
+
}
|
|
241
|
+
catch (e) {
|
|
242
|
+
const err = {
|
|
243
|
+
code: "MCP_ACT_FAILED",
|
|
244
|
+
message: errMsg(e),
|
|
245
|
+
fatal: false,
|
|
246
|
+
cause: e,
|
|
247
|
+
};
|
|
248
|
+
lastError = err;
|
|
249
|
+
await this.fire("onError", err);
|
|
250
|
+
// Record the failed step, then keep going so the model can recover.
|
|
251
|
+
this.recordHistory(step, prediction, observationSummary, "act_failed", err.message);
|
|
252
|
+
await this.fireStep(step, prediction, false);
|
|
253
|
+
// Action reflector is most useful exactly here — fire it before
|
|
254
|
+
// the next predict so the grounder sees the verdict in history.
|
|
255
|
+
await this.maybeRunActionReflector(prediction, "act_failed", usage);
|
|
256
|
+
continue;
|
|
257
|
+
}
|
|
258
|
+
const durationMs = Date.now() - t0;
|
|
259
|
+
await this.fire("onTool", {
|
|
260
|
+
name: action.type,
|
|
261
|
+
args: actionToToolArgs(action),
|
|
262
|
+
result: actResult,
|
|
263
|
+
durationMs,
|
|
264
|
+
});
|
|
265
|
+
this.recordHistory(step, prediction, observationSummary, "ok");
|
|
266
|
+
await this.fireStep(step, prediction, false);
|
|
267
|
+
// ── 4. Reflect (model-based action reflector — Phase 1.4) ──────
|
|
268
|
+
await this.maybeRunActionReflector(prediction, "ok", usage);
|
|
269
|
+
// ── 5. Heuristic veto ─────────────────────────────────────────
|
|
270
|
+
const veto = this.reflector.maybeVeto(this.history, step, maxSteps);
|
|
271
|
+
if (veto) {
|
|
272
|
+
const err = {
|
|
273
|
+
code: "REFLECTION_VETO",
|
|
274
|
+
message: veto,
|
|
275
|
+
fatal: true,
|
|
276
|
+
};
|
|
277
|
+
await this.fire("onError", err);
|
|
278
|
+
return this.finish("reflection_veto", step, veto, usage, err);
|
|
279
|
+
}
|
|
280
|
+
// ── 6. Trajectory reflector (Phase 2.2) ───────────────────────
|
|
281
|
+
const trajVeto = await this.maybeRunTrajectoryReflector(step, maxSteps, usage);
|
|
282
|
+
if (trajVeto) {
|
|
283
|
+
const err = {
|
|
284
|
+
code: "REFLECTION_VETO",
|
|
285
|
+
message: trajVeto,
|
|
286
|
+
fatal: true,
|
|
287
|
+
};
|
|
288
|
+
await this.fire("onError", err);
|
|
289
|
+
return this.finish("reflection_veto", step, trajVeto, usage, err);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
const err = {
|
|
293
|
+
code: "STEP_BUDGET",
|
|
294
|
+
message: `hit step budget ${maxSteps}`,
|
|
295
|
+
fatal: true,
|
|
296
|
+
};
|
|
297
|
+
await this.fire("onError", err);
|
|
298
|
+
return this.finish("step_budget", step, err.message, usage, err);
|
|
299
|
+
}
|
|
300
|
+
/* ─────────────────────────────────────────────────────────────────── */
|
|
301
|
+
/* internals */
|
|
302
|
+
/* ─────────────────────────────────────────────────────────────────── */
|
|
303
|
+
async observe() {
|
|
304
|
+
const ss = await this.opts.mcp.screenshot();
|
|
305
|
+
// Skip the uiautomator round-trip (1–3 s on Android) when the active
|
|
306
|
+
// adapter does NOT splice the UI hierarchy XML into its prompt — this
|
|
307
|
+
// matches the Open-AutoGLM upstream pure-vision flow (see
|
|
308
|
+
// `phone_agent/agent.py:142-169` + `model/client.py:277-290`). Adapters
|
|
309
|
+
// that genuinely consume `Observation.uiDump` opt in via the
|
|
310
|
+
// `consumesUiDump` capability flag (e.g. `guiowl`).
|
|
311
|
+
let uiDump;
|
|
312
|
+
if (this.opts.adapter.consumesUiDump) {
|
|
313
|
+
try {
|
|
314
|
+
const dump = await this.opts.mcp.uiDump();
|
|
315
|
+
if (dump.supported && dump.content)
|
|
316
|
+
uiDump = dump.content;
|
|
317
|
+
}
|
|
318
|
+
catch {
|
|
319
|
+
// ui_dump is best-effort — desktop / iOS backends can't produce it.
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
// Use the *click coordinate system* (deviceWidth/Height) for scaling —
|
|
323
|
+
// not the raw image dimensions. They typically match on Android (`wm
|
|
324
|
+
// size` ≡ rendered bytes) but diverge on macOS Retina (downscaled to
|
|
325
|
+
// logical points) and iOS (logical vs. physical pixels). Falling back
|
|
326
|
+
// to width/height keeps older mcp-server builds working — see
|
|
327
|
+
// `ScreenshotResult` docstring in `@beeos-ai/device-common`.
|
|
328
|
+
return {
|
|
329
|
+
task: this.opts.task,
|
|
330
|
+
env: this.opts.env,
|
|
331
|
+
screenW: ss.deviceWidth ?? ss.width ?? 0,
|
|
332
|
+
screenH: ss.deviceHeight ?? ss.height ?? 0,
|
|
333
|
+
screenshotB64: ss.b64,
|
|
334
|
+
uiDump,
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Translate a model-frame action into an MCP-frame action by scaling
|
|
339
|
+
* coordinates to the absolute screen size, depending on the
|
|
340
|
+
* `_coordSystem` payload hint that `parsedToAction` plants.
|
|
341
|
+
*/
|
|
342
|
+
scaleAction(action, obs) {
|
|
343
|
+
const cs = action.payload?._coordSystem ?? "absolute";
|
|
344
|
+
if (cs === "absolute" || cs === undefined)
|
|
345
|
+
return action;
|
|
346
|
+
const scaled = { ...action };
|
|
347
|
+
if (action.target?.kind === "point") {
|
|
348
|
+
scaled.target = {
|
|
349
|
+
kind: "point",
|
|
350
|
+
x: scaleCoord(action.target.x, cs, obs.screenW, "x"),
|
|
351
|
+
y: scaleCoord(action.target.y, cs, obs.screenH, "y"),
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
else if (action.target?.kind === "box") {
|
|
355
|
+
scaled.target = {
|
|
356
|
+
kind: "box",
|
|
357
|
+
x1: scaleCoord(action.target.x1, cs, obs.screenW, "x"),
|
|
358
|
+
y1: scaleCoord(action.target.y1, cs, obs.screenH, "y"),
|
|
359
|
+
x2: scaleCoord(action.target.x2, cs, obs.screenW, "x"),
|
|
360
|
+
y2: scaleCoord(action.target.y2, cs, obs.screenH, "y"),
|
|
361
|
+
};
|
|
362
|
+
}
|
|
363
|
+
return scaled;
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Phase 1.4 — invoke the optional model-based action reflector. Verdicts
|
|
367
|
+
* are advisory: a `passed: false` result is appended to the just-pushed
|
|
368
|
+
* StepHistory entry's `rationale` (so the next `predict` sees it), and
|
|
369
|
+
* the entry's `actionResult` is upgraded from `ok` → `act_failed` so
|
|
370
|
+
* downstream code (skill evolver, trajectory reflector) treats it as a
|
|
371
|
+
* miss.
|
|
372
|
+
*
|
|
373
|
+
* The reflector itself is responsible for {@link IActionReflector.shouldReflect}
|
|
374
|
+
* gating; this helper just composes the wiring. Cost is rolled into the
|
|
375
|
+
* surrounding {@link AgentLoop.run} `usage` aggregator.
|
|
376
|
+
*/
|
|
377
|
+
async maybeRunActionReflector(prediction, actionResult, usage) {
|
|
378
|
+
const reflector = this.reflector.actionReflector;
|
|
379
|
+
if (!reflector)
|
|
380
|
+
return;
|
|
381
|
+
if (!reflector.shouldReflect(this.history, prediction, actionResult))
|
|
382
|
+
return;
|
|
383
|
+
const last = this.history[this.history.length - 1];
|
|
384
|
+
if (!last)
|
|
385
|
+
return;
|
|
386
|
+
try {
|
|
387
|
+
const verdict = await reflector.reflect({
|
|
388
|
+
goal: this.opts.task,
|
|
389
|
+
history: this.history,
|
|
390
|
+
prediction,
|
|
391
|
+
observationSummary: last.observationSummary ?? "",
|
|
392
|
+
}, this.opts.signal);
|
|
393
|
+
// Roll usage in — even passing reflections cost tokens.
|
|
394
|
+
usage.inputTokens += verdict.usage.inputTokens;
|
|
395
|
+
usage.outputTokens += verdict.usage.outputTokens;
|
|
396
|
+
if (verdict.usage.costUsd) {
|
|
397
|
+
usage.costUsd = (usage.costUsd ?? 0) + verdict.usage.costUsd;
|
|
398
|
+
}
|
|
399
|
+
if (!verdict.passed) {
|
|
400
|
+
// Splice the verdict into the just-recorded step so the grounder's
|
|
401
|
+
// next predict reads it. Upgrade outcome to act_failed so reflectors
|
|
402
|
+
// / evolver downstream treat the step as a miss even if MCP succeeded.
|
|
403
|
+
last.rationale =
|
|
404
|
+
(last.rationale ? last.rationale + "\n" : "") +
|
|
405
|
+
`[action_reflector] ${verdict.reason}`;
|
|
406
|
+
last.actionResult = "act_failed";
|
|
407
|
+
last.actErrorMessage =
|
|
408
|
+
last.actErrorMessage ?? `action reflector flagged: ${verdict.reason}`;
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
catch {
|
|
412
|
+
// Reflector failures must NOT abort the loop. The reflector
|
|
413
|
+
// implementation is expected to swallow its own errors and return a
|
|
414
|
+
// `passed: true` verdict — but if it doesn't, the catch-all here is
|
|
415
|
+
// the final safety net.
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
/**
|
|
419
|
+
* Phase 2.2 — periodic global progress assessment. The reflector decides
|
|
420
|
+
* its own gating (default: every 5 steps); we just compose the wiring.
|
|
421
|
+
*
|
|
422
|
+
* Returns a non-empty veto string only on `stuck`. `off_track` injects an
|
|
423
|
+
* advisory line into the most recent history entry's rationale so the
|
|
424
|
+
* grounder sees it next predict, but the loop keeps running. The verdict
|
|
425
|
+
* itself is stashed on `this.trajectoryVerdict` so the PlanExecutor can
|
|
426
|
+
* thread it into `PlanContext.trajectoryVerdict` on replan.
|
|
427
|
+
*/
|
|
428
|
+
async maybeRunTrajectoryReflector(step, maxSteps, usage) {
|
|
429
|
+
const reflector = this.reflector.trajectoryReflector;
|
|
430
|
+
if (!reflector)
|
|
431
|
+
return undefined;
|
|
432
|
+
if (!reflector.shouldReflect(step, this.history))
|
|
433
|
+
return undefined;
|
|
434
|
+
const last = this.history[this.history.length - 1];
|
|
435
|
+
const observationSummary = last?.observationSummary ?? "";
|
|
436
|
+
try {
|
|
437
|
+
const verdict = await reflector.reflect({
|
|
438
|
+
goal: this.opts.task,
|
|
439
|
+
step,
|
|
440
|
+
maxSteps,
|
|
441
|
+
history: this.history,
|
|
442
|
+
notes: this.notes,
|
|
443
|
+
observationSummary,
|
|
444
|
+
}, this.opts.signal);
|
|
445
|
+
usage.inputTokens += verdict.usage.inputTokens;
|
|
446
|
+
usage.outputTokens += verdict.usage.outputTokens;
|
|
447
|
+
if (verdict.usage.costUsd) {
|
|
448
|
+
usage.costUsd = (usage.costUsd ?? 0) + verdict.usage.costUsd;
|
|
449
|
+
}
|
|
450
|
+
if (verdict.verdict === "on_track")
|
|
451
|
+
return undefined;
|
|
452
|
+
// off_track / stuck — annotate history so grounder sees it.
|
|
453
|
+
const tag = `[trajectory_reflector:${verdict.verdict}] ${verdict.reason}${verdict.suggestion ? ` (suggestion: ${verdict.suggestion})` : ""}`;
|
|
454
|
+
if (last) {
|
|
455
|
+
last.rationale = (last.rationale ? last.rationale + "\n" : "") + tag;
|
|
456
|
+
}
|
|
457
|
+
this.trajectoryVerdict = { verdict: verdict.verdict, reason: verdict.reason };
|
|
458
|
+
if (verdict.verdict === "stuck") {
|
|
459
|
+
return `trajectory stuck: ${verdict.reason}`;
|
|
460
|
+
}
|
|
461
|
+
// off_track is non-fatal — keep going, planner will see the verdict
|
|
462
|
+
// on the *next* replan if the loop later bails for another reason.
|
|
463
|
+
return undefined;
|
|
464
|
+
}
|
|
465
|
+
catch {
|
|
466
|
+
// Trajectory reflector failures must not abort the loop.
|
|
467
|
+
return undefined;
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
recordHistory(step, p, summary, actionResult, actErrorMessage) {
|
|
471
|
+
this.history.push({
|
|
472
|
+
stepIdx: step,
|
|
473
|
+
action: p.action,
|
|
474
|
+
rationale: p.rationale,
|
|
475
|
+
observationSummary: summary,
|
|
476
|
+
actionResult,
|
|
477
|
+
confidence: p.confidence,
|
|
478
|
+
actErrorMessage,
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
async fireStep(step, prediction, finished) {
|
|
482
|
+
if (!this.opts.hooks?.onStep)
|
|
483
|
+
return;
|
|
484
|
+
try {
|
|
485
|
+
await this.opts.hooks.onStep({
|
|
486
|
+
index: step,
|
|
487
|
+
rationale: prediction.rationale,
|
|
488
|
+
action: prediction.action,
|
|
489
|
+
prediction,
|
|
490
|
+
finished: finished || isTerminal(prediction.action),
|
|
491
|
+
});
|
|
492
|
+
}
|
|
493
|
+
catch {
|
|
494
|
+
// hook failures must never derail the loop
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
async fire(name, payload) {
|
|
498
|
+
const h = this.opts.hooks?.[name];
|
|
499
|
+
if (!h)
|
|
500
|
+
return;
|
|
501
|
+
try {
|
|
502
|
+
await h(payload);
|
|
503
|
+
}
|
|
504
|
+
catch {
|
|
505
|
+
// hook failures must never derail the loop
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
finish(terminator, steps, finalText, usage, lastError) {
|
|
509
|
+
return {
|
|
510
|
+
terminator,
|
|
511
|
+
steps,
|
|
512
|
+
finalText,
|
|
513
|
+
cancelled: terminator === "cancelled",
|
|
514
|
+
history: [...this.history],
|
|
515
|
+
usage,
|
|
516
|
+
lastError,
|
|
517
|
+
notes: [...this.notes],
|
|
518
|
+
trajectoryVerdict: this.trajectoryVerdict,
|
|
519
|
+
};
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
/* ──────────────────────────────────────────────────────────────────────── */
|
|
523
|
+
/* helpers */
|
|
524
|
+
/* ──────────────────────────────────────────────────────────────────────── */
|
|
525
|
+
function errMsg(e) {
|
|
526
|
+
if (e == null)
|
|
527
|
+
return String(e);
|
|
528
|
+
// OpenAI SDK v4 APIError carries status / body / response details that the
|
|
529
|
+
// bare `.message` field elides — preserve them so MODEL_PREDICT_FAILED
|
|
530
|
+
// notices surface the actual upstream failure (e.g. "502 from upstream",
|
|
531
|
+
// "context_length_exceeded", "invalid_image_url") instead of a generic
|
|
532
|
+
// "Connection error".
|
|
533
|
+
if (typeof e === "object") {
|
|
534
|
+
const anyE = e;
|
|
535
|
+
const parts = [];
|
|
536
|
+
if (typeof anyE.status === "number")
|
|
537
|
+
parts.push(`HTTP ${anyE.status}`);
|
|
538
|
+
const upstream = anyE.error?.message ??
|
|
539
|
+
(typeof anyE.code === "string" ? anyE.code : undefined) ??
|
|
540
|
+
anyE.type;
|
|
541
|
+
if (upstream && upstream !== anyE.message)
|
|
542
|
+
parts.push(upstream);
|
|
543
|
+
if (anyE.message)
|
|
544
|
+
parts.push(anyE.message);
|
|
545
|
+
if (parts.length)
|
|
546
|
+
return parts.join(" | ");
|
|
547
|
+
}
|
|
548
|
+
return e instanceof Error ? e.message : String(e);
|
|
549
|
+
}
|
|
550
|
+
function stringFromPayload(p, key) {
|
|
551
|
+
const v = p?.[key];
|
|
552
|
+
return typeof v === "string" ? v : undefined;
|
|
553
|
+
}
|
|
554
|
+
function actionToToolArgs(action) {
|
|
555
|
+
const out = { type: action.type };
|
|
556
|
+
if (action.target)
|
|
557
|
+
out.target = action.target;
|
|
558
|
+
if (action.payload && Object.keys(action.payload).length > 0)
|
|
559
|
+
out.payload = action.payload;
|
|
560
|
+
return out;
|
|
561
|
+
}
|
|
562
|
+
/**
|
|
563
|
+
* Phase 1.5 — derive a ≤200-char text summary from a uiautomator XML dump.
|
|
564
|
+
* Strategy: pull `text="…"` and `content-desc="…"` attributes (top 8 unique,
|
|
565
|
+
* trimmed) and join with " | ". Returns "" when the dump is empty or
|
|
566
|
+
* contains no useful text — caller is expected to fall back to
|
|
567
|
+
* {@link summarizeRationale}. The regex is intentionally permissive (the
|
|
568
|
+
* Android dump is XML but malformed in some edge cases — `xmldom` wouldn't
|
|
569
|
+
* buy us much over a single regex sweep).
|
|
570
|
+
*/
|
|
571
|
+
function summarizeUiDump(uiDump) {
|
|
572
|
+
if (!uiDump)
|
|
573
|
+
return "";
|
|
574
|
+
const re = /(?:text|content-desc)="([^"]+)"/g;
|
|
575
|
+
const seen = new Set();
|
|
576
|
+
const items = [];
|
|
577
|
+
let m;
|
|
578
|
+
while ((m = re.exec(uiDump)) !== null) {
|
|
579
|
+
const v = m[1].trim();
|
|
580
|
+
if (!v || seen.has(v))
|
|
581
|
+
continue;
|
|
582
|
+
seen.add(v);
|
|
583
|
+
items.push(v);
|
|
584
|
+
if (items.length >= 8)
|
|
585
|
+
break;
|
|
586
|
+
}
|
|
587
|
+
if (items.length === 0)
|
|
588
|
+
return "";
|
|
589
|
+
return truncateForSummary(items.join(" | "));
|
|
590
|
+
}
|
|
591
|
+
/**
|
|
592
|
+
* Phase 1.5 — fall-back summary when no uiDump is available. We pull the
|
|
593
|
+
* first sentence of the grounder's rationale (Open-AutoGLM tends to prefix
|
|
594
|
+
* the actual UI description, e.g. "Blue Submit button on the bottom-right
|
|
595
|
+
* — tapping it will…"). Truncates to 200 chars.
|
|
596
|
+
*/
|
|
597
|
+
function summarizeRationale(rationale) {
|
|
598
|
+
if (!rationale)
|
|
599
|
+
return "";
|
|
600
|
+
const trimmed = rationale.trim();
|
|
601
|
+
if (!trimmed)
|
|
602
|
+
return "";
|
|
603
|
+
// First sentence (CJK and Latin punctuation), or full string if no
|
|
604
|
+
// sentence terminator within 200 chars.
|
|
605
|
+
const m = trimmed.match(/^[^.!?。!?\n]+[.!?。!?]/);
|
|
606
|
+
const first = m ? m[0] : trimmed;
|
|
607
|
+
return truncateForSummary(first);
|
|
608
|
+
}
|
|
609
|
+
function truncateForSummary(s) {
|
|
610
|
+
return s.length > 200 ? `${s.slice(0, 199)}…` : s;
|
|
611
|
+
}
|
|
612
|
+
function scaleCoord(v, system, screen, _axis) {
|
|
613
|
+
if (system === "0-1000")
|
|
614
|
+
return Math.round((v / 1000) * screen);
|
|
615
|
+
if (system === "smart_resize") {
|
|
616
|
+
// smart_resize coordinates are pre-scaled to a 28-px grid relative to the
|
|
617
|
+
// resized image; in the absence of the resize transform we approximate by
|
|
618
|
+
// treating them as already-absolute (the legacy AndroidAdb adapter does
|
|
619
|
+
// the same — see action/handler.ts).
|
|
620
|
+
return Math.round(v);
|
|
621
|
+
}
|
|
622
|
+
return v;
|
|
623
|
+
}
|
|
624
|
+
//# sourceMappingURL=core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../src/agent-runtime/core.ts"],"names":[],"mappings":"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"}
|