@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,233 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agent-runtime/reflectors/action-reflector — model-based action reflection.
|
|
3
|
+
*
|
|
4
|
+
* Phase 1.4 of the device-agent reflector upgrade plan
|
|
5
|
+
* ([../../../../../../.cursor/plans/device-agent-reflector-skills_d5599350.plan.md]).
|
|
6
|
+
*
|
|
7
|
+
* Goal: catch *the same step* the grounder just emitted when it's likely
|
|
8
|
+
* wrong (low confidence, or the MCP `act` failed) and feed back a textual
|
|
9
|
+
* verdict the next predict call can read. Concretely:
|
|
10
|
+
* - heuristic veto (`HierarchicalReflector.maybeVeto`) runs first and
|
|
11
|
+
* terminates the loop with a hard stop on stalls;
|
|
12
|
+
* - if the heuristics are quiet, we ask the action reflector whether to
|
|
13
|
+
* take a closer look. The default {@link LLMActionReflector} fires on
|
|
14
|
+
* `actionResult === "act_failed"` OR on low-confidence predictions
|
|
15
|
+
* OR (as a defensive fallback) on a small whitelist of high-risk verbs
|
|
16
|
+
* so we still help even when the adapter doesn't expose logprobs.
|
|
17
|
+
* - the reflector verdict is **advisory**: a `passed: false` result is
|
|
18
|
+
* spliced into the next StepHistory rationale ("act_failed: …") so the
|
|
19
|
+
* grounder retries with that context. We do NOT terminate the loop —
|
|
20
|
+
* stalls are still the heuristic layer's job.
|
|
21
|
+
*
|
|
22
|
+
* The cost model is documented in
|
|
23
|
+
* `agents/device-agent/docs/reflectors.md` (Phase 2.4). Per-task budget
|
|
24
|
+
* with default config is ≤ 4 cheap text glm-4-flash calls / task, ~600-1200
|
|
25
|
+
* input tokens / 50 output tokens each.
|
|
26
|
+
*/
|
|
27
|
+
import OpenAI from "openai";
|
|
28
|
+
import { getLogger } from "../../logger/index.js";
|
|
29
|
+
/** Verbs that warrant a reflection on Branch C of the logprobs spike. */
|
|
30
|
+
export const HIGH_RISK_VERBS = new Set([
|
|
31
|
+
"type",
|
|
32
|
+
"swipe",
|
|
33
|
+
"launch_app",
|
|
34
|
+
]);
|
|
35
|
+
const DEFAULT_MODEL = "glm-4-flash";
|
|
36
|
+
const HISTORY_TAIL = 4;
|
|
37
|
+
const RATIONALE_MAX = 200;
|
|
38
|
+
export class LLMActionReflector {
|
|
39
|
+
name = "llm-action-reflector";
|
|
40
|
+
client;
|
|
41
|
+
modelName;
|
|
42
|
+
confidenceThreshold;
|
|
43
|
+
gating;
|
|
44
|
+
maxTokens;
|
|
45
|
+
temperature;
|
|
46
|
+
constructor(opts = {}) {
|
|
47
|
+
this.modelName = opts.modelName ?? process.env.ACTION_REFLECTOR_MODEL ?? DEFAULT_MODEL;
|
|
48
|
+
this.confidenceThreshold = clamp01(opts.confidenceThreshold ??
|
|
49
|
+
readFloat(process.env.ACTION_REFLECTOR_CONFIDENCE_THRESHOLD, 0.6));
|
|
50
|
+
this.gating =
|
|
51
|
+
opts.gating ??
|
|
52
|
+
(parseGating(process.env.ACTION_REFLECTOR_GATING) ?? "whitelist");
|
|
53
|
+
this.maxTokens = opts.maxTokens ?? 80;
|
|
54
|
+
this.temperature = opts.temperature ?? 0;
|
|
55
|
+
const baseUrl = opts.baseUrl ??
|
|
56
|
+
process.env.ACTION_REFLECTOR_BASE_URL ??
|
|
57
|
+
process.env.PLANNER_BASE_URL ??
|
|
58
|
+
process.env.GUI_AGENT_BASE_URL ??
|
|
59
|
+
"https://api.openai.com/v1";
|
|
60
|
+
const apiKey = opts.apiKey ??
|
|
61
|
+
process.env.ACTION_REFLECTOR_API_KEY ??
|
|
62
|
+
process.env.PLANNER_API_KEY ??
|
|
63
|
+
process.env.GUI_AGENT_API_KEY ??
|
|
64
|
+
"EMPTY";
|
|
65
|
+
this.client =
|
|
66
|
+
opts.client ?? new OpenAI({ baseURL: baseUrl, apiKey, timeout: 30_000, maxRetries: 1 });
|
|
67
|
+
}
|
|
68
|
+
shouldReflect(_history, lastPrediction, actionResult) {
|
|
69
|
+
if (actionResult === "act_failed")
|
|
70
|
+
return true;
|
|
71
|
+
// confidence-gated branches use the prediction's confidence (which the
|
|
72
|
+
// adapter populates from logprobs when supported).
|
|
73
|
+
if (this.gating === "logprob" || this.gating === "logprob-degraded") {
|
|
74
|
+
if (typeof lastPrediction.confidence === "number" &&
|
|
75
|
+
lastPrediction.confidence < this.confidenceThreshold) {
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// whitelist branch — always a fallback so even without logprobs we
|
|
80
|
+
// catch the highest-risk verbs.
|
|
81
|
+
if (HIGH_RISK_VERBS.has(lastPrediction.action.type))
|
|
82
|
+
return true;
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
async reflect(ctx, signal) {
|
|
86
|
+
const startedAt = Date.now();
|
|
87
|
+
const messages = [
|
|
88
|
+
{ role: "system", content: SYSTEM_PROMPT },
|
|
89
|
+
{ role: "user", content: renderUserPrompt(ctx) },
|
|
90
|
+
];
|
|
91
|
+
try {
|
|
92
|
+
const resp = await this.client.chat.completions.create({
|
|
93
|
+
model: this.modelName,
|
|
94
|
+
messages,
|
|
95
|
+
temperature: this.temperature,
|
|
96
|
+
max_tokens: this.maxTokens,
|
|
97
|
+
response_format: { type: "json_object" },
|
|
98
|
+
}, { signal });
|
|
99
|
+
const raw = resp.choices?.[0]?.message?.content ?? "";
|
|
100
|
+
const usage = {
|
|
101
|
+
inputTokens: resp.usage?.prompt_tokens ?? 0,
|
|
102
|
+
outputTokens: resp.usage?.completion_tokens ?? 0,
|
|
103
|
+
durationMs: Date.now() - startedAt,
|
|
104
|
+
costUsd: estimateCostUsd(this.modelName, resp.usage?.prompt_tokens ?? 0, resp.usage?.completion_tokens ?? 0),
|
|
105
|
+
};
|
|
106
|
+
const parsed = parseVerdict(raw);
|
|
107
|
+
return { ...parsed, usage };
|
|
108
|
+
}
|
|
109
|
+
catch (e) {
|
|
110
|
+
// Reflector failures must NOT abort the run — log and pass.
|
|
111
|
+
getLogger().warn({ component: "action-reflector", err: errMsg(e) }, "action-reflector.failed");
|
|
112
|
+
return {
|
|
113
|
+
passed: true,
|
|
114
|
+
reason: `reflector unavailable: ${errMsg(e)}`,
|
|
115
|
+
usage: { inputTokens: 0, outputTokens: 0, durationMs: Date.now() - startedAt, costUsd: 0 },
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/* -------------------------------------------------------------------------- */
|
|
121
|
+
/* Prompts */
|
|
122
|
+
/* -------------------------------------------------------------------------- */
|
|
123
|
+
const SYSTEM_PROMPT = `You are an action sanity checker for a mobile agent.
|
|
124
|
+
The grounder (a vision model) just emitted ONE next action. Your job is to
|
|
125
|
+
decide whether that action is *plausible* given the recent step history and
|
|
126
|
+
the most recent screen summary. You DO NOT see screenshots — only text.
|
|
127
|
+
|
|
128
|
+
Output STRICT JSON: {"passed": <bool>, "reason": "<<=80 chars>"}.
|
|
129
|
+
|
|
130
|
+
Mark passed=false ONLY when the action is clearly wrong (wrong app, wrong
|
|
131
|
+
verb, contradicts the history, or the previous attempt of the same action
|
|
132
|
+
just failed and re-trying without a change won't help). Be conservative —
|
|
133
|
+
when uncertain, set passed=true and put the doubt in "reason".`;
|
|
134
|
+
function renderUserPrompt(ctx) {
|
|
135
|
+
const tail = ctx.history.slice(-HISTORY_TAIL).map((h) => ({
|
|
136
|
+
step: h.stepIdx,
|
|
137
|
+
action: h.action ? actionToOneLiner(h.action) : null,
|
|
138
|
+
rationale: truncate(h.rationale, RATIONALE_MAX),
|
|
139
|
+
actionResult: h.actionResult ?? null,
|
|
140
|
+
actError: h.actErrorMessage ?? null,
|
|
141
|
+
obsSummary: truncate(h.observationSummary, RATIONALE_MAX),
|
|
142
|
+
}));
|
|
143
|
+
return JSON.stringify({
|
|
144
|
+
goal: truncate(ctx.goal, RATIONALE_MAX * 2),
|
|
145
|
+
recentHistory: tail,
|
|
146
|
+
proposedAction: actionToOneLiner(ctx.prediction.action),
|
|
147
|
+
proposedRationale: truncate(ctx.prediction.rationale ?? "", RATIONALE_MAX),
|
|
148
|
+
proposedConfidence: ctx.prediction.confidence ?? null,
|
|
149
|
+
latestScreenSummary: truncate(ctx.observationSummary, RATIONALE_MAX),
|
|
150
|
+
}, null, 2);
|
|
151
|
+
}
|
|
152
|
+
function actionToOneLiner(a) {
|
|
153
|
+
const target = a.target ? ` ${JSON.stringify(a.target)}` : "";
|
|
154
|
+
const payload = a.payload && Object.keys(a.payload).length > 0 ? ` ${JSON.stringify(a.payload)}` : "";
|
|
155
|
+
return `${a.type}${target}${payload}`;
|
|
156
|
+
}
|
|
157
|
+
function truncate(s, max) {
|
|
158
|
+
if (!s)
|
|
159
|
+
return "";
|
|
160
|
+
return s.length > max ? `${s.slice(0, max - 1)}…` : s;
|
|
161
|
+
}
|
|
162
|
+
/* -------------------------------------------------------------------------- */
|
|
163
|
+
/* Verdict parsing */
|
|
164
|
+
/* -------------------------------------------------------------------------- */
|
|
165
|
+
function parseVerdict(raw) {
|
|
166
|
+
if (!raw)
|
|
167
|
+
return { passed: true, reason: "empty reflector response" };
|
|
168
|
+
try {
|
|
169
|
+
const obj = JSON.parse(raw);
|
|
170
|
+
if (obj && typeof obj === "object") {
|
|
171
|
+
const passed = "passed" in obj ? Boolean(obj.passed) : true;
|
|
172
|
+
const reason = typeof obj.reason === "string"
|
|
173
|
+
? obj.reason.trim()
|
|
174
|
+
: passed
|
|
175
|
+
? "ok"
|
|
176
|
+
: "reflector flagged action";
|
|
177
|
+
return { passed, reason };
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
/* fall through */
|
|
182
|
+
}
|
|
183
|
+
return { passed: true, reason: `unparseable reflector response: ${truncate(raw, 80)}` };
|
|
184
|
+
}
|
|
185
|
+
const PRICING_PER_KTOK_USD = {
|
|
186
|
+
// Z.ai pricing as of 2025-Q1 — keep this list short / overridable via env.
|
|
187
|
+
"glm-4-flash": { input: 0.0001, output: 0.0001 },
|
|
188
|
+
"glm-4-air": { input: 0.0014, output: 0.0014 },
|
|
189
|
+
"glm-4-plus": { input: 0.007, output: 0.007 },
|
|
190
|
+
};
|
|
191
|
+
function estimateCostUsd(model, inputTokens, outputTokens) {
|
|
192
|
+
const p = PRICING_PER_KTOK_USD[model.toLowerCase()];
|
|
193
|
+
if (!p)
|
|
194
|
+
return 0;
|
|
195
|
+
return (inputTokens / 1000) * p.input + (outputTokens / 1000) * p.output;
|
|
196
|
+
}
|
|
197
|
+
/* -------------------------------------------------------------------------- */
|
|
198
|
+
/* Misc helpers */
|
|
199
|
+
/* -------------------------------------------------------------------------- */
|
|
200
|
+
function clamp01(n) {
|
|
201
|
+
if (!Number.isFinite(n))
|
|
202
|
+
return 0.5;
|
|
203
|
+
return Math.max(0, Math.min(1, n));
|
|
204
|
+
}
|
|
205
|
+
function readFloat(raw, fallback) {
|
|
206
|
+
if (!raw)
|
|
207
|
+
return fallback;
|
|
208
|
+
const n = Number(raw);
|
|
209
|
+
return Number.isFinite(n) ? n : fallback;
|
|
210
|
+
}
|
|
211
|
+
function parseGating(raw) {
|
|
212
|
+
if (!raw)
|
|
213
|
+
return undefined;
|
|
214
|
+
switch (raw.trim().toLowerCase()) {
|
|
215
|
+
case "logprob":
|
|
216
|
+
return "logprob";
|
|
217
|
+
case "logprob-degraded":
|
|
218
|
+
case "logprob_degraded":
|
|
219
|
+
return "logprob-degraded";
|
|
220
|
+
case "whitelist":
|
|
221
|
+
case "fallback":
|
|
222
|
+
case "default":
|
|
223
|
+
return "whitelist";
|
|
224
|
+
default:
|
|
225
|
+
return undefined;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
function errMsg(e) {
|
|
229
|
+
if (e instanceof Error)
|
|
230
|
+
return e.message;
|
|
231
|
+
return String(e);
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=action-reflector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-reflector.js","sourceRoot":"","sources":["../../../src/agent-runtime/reflectors/action-reflector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agent-runtime/reflectors/policy — env-driven factory for the Phase 1+2
|
|
3
|
+
* reflector stack.
|
|
4
|
+
*
|
|
5
|
+
* The runtime resolves a single {@link ReflectorPolicy} object from
|
|
6
|
+
* environment variables and threads it through `AgentRunner` →
|
|
7
|
+
* `PlanExecutor` → `AgentLoop` → `HierarchicalReflector`. Every reflector
|
|
8
|
+
* is **off by default**; switching one on never widens the surface area
|
|
9
|
+
* of the existing heuristics — those continue to fire.
|
|
10
|
+
*
|
|
11
|
+
* Env vars (see also `agents/device-agent/docs/reflectors.md`):
|
|
12
|
+
* ACTION_REFLECTOR = "off" | "llm" (default "off")
|
|
13
|
+
* ACTION_REFLECTOR_MODEL = chat model name (default "glm-4-flash")
|
|
14
|
+
* ACTION_REFLECTOR_GATING = "logprob" | "logprob-degraded" | "whitelist"
|
|
15
|
+
* (default "whitelist")
|
|
16
|
+
* ACTION_REFLECTOR_CONFIDENCE_THRESHOLD = 0..1 (default 0.6)
|
|
17
|
+
* TRAJECTORY_REFLECTOR = "off" | "every:N" (default "off")
|
|
18
|
+
* NOTE_TAKER = "off" | "on" (default "off")
|
|
19
|
+
*
|
|
20
|
+
* Phase 2.4 also exposes a `ReflectorPolicy` type that callers can build
|
|
21
|
+
* programmatically (CLI flags, integration tests).
|
|
22
|
+
*/
|
|
23
|
+
import type { IActionReflector, LLMActionReflectorOptions } from "./action-reflector.js";
|
|
24
|
+
import type { ITrajectoryReflector, LLMTrajectoryReflectorOptions } from "./trajectory-reflector.js";
|
|
25
|
+
export type ActionReflectorMode = "off" | "llm";
|
|
26
|
+
export type TrajectoryReflectorMode = "off" | {
|
|
27
|
+
kind: "every";
|
|
28
|
+
everyNSteps: number;
|
|
29
|
+
};
|
|
30
|
+
export type NoteTakerMode = "off" | "on";
|
|
31
|
+
export interface ReflectorPolicy {
|
|
32
|
+
actionReflector: ActionReflectorMode;
|
|
33
|
+
/** Optional pre-built reflector (test injection). */
|
|
34
|
+
actionReflectorInstance?: IActionReflector;
|
|
35
|
+
actionReflectorOptions?: LLMActionReflectorOptions;
|
|
36
|
+
trajectoryReflector: TrajectoryReflectorMode;
|
|
37
|
+
/** Optional pre-built trajectory reflector (test injection). */
|
|
38
|
+
trajectoryReflectorInstance?: ITrajectoryReflector;
|
|
39
|
+
trajectoryReflectorOptions?: LLMTrajectoryReflectorOptions;
|
|
40
|
+
noteTaker: NoteTakerMode;
|
|
41
|
+
}
|
|
42
|
+
/** Build a `ReflectorPolicy` from process.env. */
|
|
43
|
+
export declare function buildReflectorPolicyFromEnv(env?: NodeJS.ProcessEnv): ReflectorPolicy;
|
|
44
|
+
/**
|
|
45
|
+
* Resolve the configured action reflector instance, or `undefined` when
|
|
46
|
+
* disabled. Re-exported so tests can opt out of env-based config.
|
|
47
|
+
*/
|
|
48
|
+
export declare function resolveActionReflector(policy: ReflectorPolicy): IActionReflector | undefined;
|
|
49
|
+
/**
|
|
50
|
+
* Resolve the configured trajectory reflector, or `undefined` when off.
|
|
51
|
+
* Mirrors {@link resolveActionReflector}.
|
|
52
|
+
*/
|
|
53
|
+
export declare function resolveTrajectoryReflector(policy: ReflectorPolicy): ITrajectoryReflector | undefined;
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agent-runtime/reflectors/policy — env-driven factory for the Phase 1+2
|
|
3
|
+
* reflector stack.
|
|
4
|
+
*
|
|
5
|
+
* The runtime resolves a single {@link ReflectorPolicy} object from
|
|
6
|
+
* environment variables and threads it through `AgentRunner` →
|
|
7
|
+
* `PlanExecutor` → `AgentLoop` → `HierarchicalReflector`. Every reflector
|
|
8
|
+
* is **off by default**; switching one on never widens the surface area
|
|
9
|
+
* of the existing heuristics — those continue to fire.
|
|
10
|
+
*
|
|
11
|
+
* Env vars (see also `agents/device-agent/docs/reflectors.md`):
|
|
12
|
+
* ACTION_REFLECTOR = "off" | "llm" (default "off")
|
|
13
|
+
* ACTION_REFLECTOR_MODEL = chat model name (default "glm-4-flash")
|
|
14
|
+
* ACTION_REFLECTOR_GATING = "logprob" | "logprob-degraded" | "whitelist"
|
|
15
|
+
* (default "whitelist")
|
|
16
|
+
* ACTION_REFLECTOR_CONFIDENCE_THRESHOLD = 0..1 (default 0.6)
|
|
17
|
+
* TRAJECTORY_REFLECTOR = "off" | "every:N" (default "off")
|
|
18
|
+
* NOTE_TAKER = "off" | "on" (default "off")
|
|
19
|
+
*
|
|
20
|
+
* Phase 2.4 also exposes a `ReflectorPolicy` type that callers can build
|
|
21
|
+
* programmatically (CLI flags, integration tests).
|
|
22
|
+
*/
|
|
23
|
+
import { LLMActionReflector } from "./action-reflector.js";
|
|
24
|
+
import { LLMTrajectoryReflector } from "./trajectory-reflector.js";
|
|
25
|
+
const DEFAULT_TRAJECTORY_EVERY_N = 5;
|
|
26
|
+
/** Build a `ReflectorPolicy` from process.env. */
|
|
27
|
+
export function buildReflectorPolicyFromEnv(env = process.env) {
|
|
28
|
+
return {
|
|
29
|
+
actionReflector: parseActionReflectorMode(env.ACTION_REFLECTOR),
|
|
30
|
+
trajectoryReflector: parseTrajectoryMode(env.TRAJECTORY_REFLECTOR),
|
|
31
|
+
noteTaker: parseNoteTakerMode(env.NOTE_TAKER),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Resolve the configured action reflector instance, or `undefined` when
|
|
36
|
+
* disabled. Re-exported so tests can opt out of env-based config.
|
|
37
|
+
*/
|
|
38
|
+
export function resolveActionReflector(policy) {
|
|
39
|
+
if (policy.actionReflectorInstance)
|
|
40
|
+
return policy.actionReflectorInstance;
|
|
41
|
+
switch (policy.actionReflector) {
|
|
42
|
+
case "llm":
|
|
43
|
+
return new LLMActionReflector(policy.actionReflectorOptions);
|
|
44
|
+
case "off":
|
|
45
|
+
default:
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Resolve the configured trajectory reflector, or `undefined` when off.
|
|
51
|
+
* Mirrors {@link resolveActionReflector}.
|
|
52
|
+
*/
|
|
53
|
+
export function resolveTrajectoryReflector(policy) {
|
|
54
|
+
if (policy.trajectoryReflectorInstance)
|
|
55
|
+
return policy.trajectoryReflectorInstance;
|
|
56
|
+
if (policy.trajectoryReflector === "off")
|
|
57
|
+
return undefined;
|
|
58
|
+
const everyNSteps = policy.trajectoryReflector.everyNSteps;
|
|
59
|
+
const opts = {
|
|
60
|
+
...(policy.trajectoryReflectorOptions ?? {}),
|
|
61
|
+
everyNSteps,
|
|
62
|
+
};
|
|
63
|
+
return new LLMTrajectoryReflector(opts);
|
|
64
|
+
}
|
|
65
|
+
/* -------------------------------------------------------------------------- */
|
|
66
|
+
/* env parsers */
|
|
67
|
+
/* -------------------------------------------------------------------------- */
|
|
68
|
+
function parseActionReflectorMode(raw) {
|
|
69
|
+
switch ((raw ?? "").trim().toLowerCase()) {
|
|
70
|
+
case "llm":
|
|
71
|
+
case "on":
|
|
72
|
+
return "llm";
|
|
73
|
+
case "off":
|
|
74
|
+
case "":
|
|
75
|
+
default:
|
|
76
|
+
return "off";
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function parseTrajectoryMode(raw) {
|
|
80
|
+
const v = (raw ?? "").trim().toLowerCase();
|
|
81
|
+
if (!v || v === "off")
|
|
82
|
+
return "off";
|
|
83
|
+
if (v === "on")
|
|
84
|
+
return { kind: "every", everyNSteps: DEFAULT_TRAJECTORY_EVERY_N };
|
|
85
|
+
// every:N
|
|
86
|
+
const m = v.match(/^every:(\d+)$/);
|
|
87
|
+
if (m) {
|
|
88
|
+
const n = Number(m[1]);
|
|
89
|
+
if (Number.isFinite(n) && n > 0)
|
|
90
|
+
return { kind: "every", everyNSteps: Math.floor(n) };
|
|
91
|
+
}
|
|
92
|
+
return "off";
|
|
93
|
+
}
|
|
94
|
+
function parseNoteTakerMode(raw) {
|
|
95
|
+
switch ((raw ?? "").trim().toLowerCase()) {
|
|
96
|
+
case "on":
|
|
97
|
+
case "true":
|
|
98
|
+
case "1":
|
|
99
|
+
return "on";
|
|
100
|
+
case "off":
|
|
101
|
+
case "":
|
|
102
|
+
default:
|
|
103
|
+
return "off";
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../../src/agent-runtime/reflectors/policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agent-runtime/reflectors/trajectory-reflector — periodic global progress
|
|
3
|
+
* assessment.
|
|
4
|
+
*
|
|
5
|
+
* Phase 2.2 of the device-agent reflector upgrade plan
|
|
6
|
+
* ([../../../../../../.cursor/plans/device-agent-reflector-skills_d5599350.plan.md]).
|
|
7
|
+
*
|
|
8
|
+
* Where the {@link IActionReflector} (Phase 1.4) is *step-local* — does THIS
|
|
9
|
+
* one prediction look right? — the trajectory reflector is *task-global*:
|
|
10
|
+
* every N steps it inspects the rolling history + accumulated notes + the
|
|
11
|
+
* current goal and decides whether the agent is making progress, drifting
|
|
12
|
+
* onto a wrong sub-task, or stuck altogether.
|
|
13
|
+
*
|
|
14
|
+
* The default {@link LLMTrajectoryReflector} talks to a cheap text-only
|
|
15
|
+
* chat model (`glm-4-flash` by default, the same family the planner uses)
|
|
16
|
+
* and emits a strict `{ verdict, reason, suggestion? }` JSON payload.
|
|
17
|
+
*
|
|
18
|
+
* Cost model:
|
|
19
|
+
* - One ~600-1000 input token / ≤80 output token request per N steps.
|
|
20
|
+
* With N=5 and a 30-step task budget that's ≤ 6 calls / task, ~ ¥0.001
|
|
21
|
+
* in incremental cost.
|
|
22
|
+
* - Reflector failures are non-fatal: a transient 5xx logs a warning and
|
|
23
|
+
* returns `verdict: "on_track"` so the executor keeps going.
|
|
24
|
+
*/
|
|
25
|
+
import OpenAI from "openai";
|
|
26
|
+
import type { ModelUsage, StepHistory } from "../adapters/base.js";
|
|
27
|
+
export type TrajectoryVerdict = "on_track" | "off_track" | "stuck";
|
|
28
|
+
export interface TrajectoryReflectCtx {
|
|
29
|
+
/** Goal of the surrounding task (agent root goal). */
|
|
30
|
+
goal: string;
|
|
31
|
+
/** Inner-loop step counter — first call is at `step === everyNSteps`. */
|
|
32
|
+
step: number;
|
|
33
|
+
/** Maximum steps the loop is allowed to take (informational). */
|
|
34
|
+
maxSteps: number;
|
|
35
|
+
/**
|
|
36
|
+
* Rolling step history (most recent last). The reflector trims to the
|
|
37
|
+
* tail itself; pass the full history.
|
|
38
|
+
*/
|
|
39
|
+
history: StepHistory[];
|
|
40
|
+
/** Notes the agent has captured so far via `take_note`. */
|
|
41
|
+
notes: string[];
|
|
42
|
+
/** Last observation summary (no base64 — text only). */
|
|
43
|
+
observationSummary: string;
|
|
44
|
+
}
|
|
45
|
+
export interface TrajectoryReflectVerdict {
|
|
46
|
+
/** What the reflector thinks of the trajectory so far. */
|
|
47
|
+
verdict: TrajectoryVerdict;
|
|
48
|
+
/** ≤ 200-char rationale, surfaced to the planner on `replan()`. */
|
|
49
|
+
reason: string;
|
|
50
|
+
/**
|
|
51
|
+
* Optional concrete next-step suggestion. Surfaced to the planner so it
|
|
52
|
+
* can pivot the plan rather than re-deriving the failure mode.
|
|
53
|
+
*/
|
|
54
|
+
suggestion?: string;
|
|
55
|
+
/** Cost / latency accounting for the reflector call. */
|
|
56
|
+
usage: ModelUsage;
|
|
57
|
+
}
|
|
58
|
+
export interface ITrajectoryReflector {
|
|
59
|
+
/**
|
|
60
|
+
* Should the loop invoke {@link reflect} now? Default implementations
|
|
61
|
+
* gate on `step % everyNSteps === 0`.
|
|
62
|
+
*/
|
|
63
|
+
shouldReflect(step: number, history: StepHistory[]): boolean;
|
|
64
|
+
/** Run the actual reflection. */
|
|
65
|
+
reflect(ctx: TrajectoryReflectCtx, signal?: AbortSignal): Promise<TrajectoryReflectVerdict>;
|
|
66
|
+
/** Optional cleanup. */
|
|
67
|
+
close?(): Promise<void>;
|
|
68
|
+
}
|
|
69
|
+
export interface LLMTrajectoryReflectorOptions {
|
|
70
|
+
/** Override `process.env.PLANNER_BASE_URL` (planner endpoint reused). */
|
|
71
|
+
baseUrl?: string;
|
|
72
|
+
apiKey?: string;
|
|
73
|
+
/** Defaults to `glm-4-flash`. */
|
|
74
|
+
modelName?: string;
|
|
75
|
+
/** Fire every N inner-loop steps. Defaults to 5. */
|
|
76
|
+
everyNSteps?: number;
|
|
77
|
+
/** Sampling temperature. Defaults to 0. */
|
|
78
|
+
temperature?: number;
|
|
79
|
+
/** Max output tokens. Defaults to 160 (room for `suggestion`). */
|
|
80
|
+
maxTokens?: number;
|
|
81
|
+
/** Reused OpenAI client for tests. */
|
|
82
|
+
client?: OpenAI;
|
|
83
|
+
}
|
|
84
|
+
export declare class LLMTrajectoryReflector implements ITrajectoryReflector {
|
|
85
|
+
readonly name = "llm-trajectory-reflector";
|
|
86
|
+
private readonly client;
|
|
87
|
+
private readonly modelName;
|
|
88
|
+
private readonly everyNSteps;
|
|
89
|
+
private readonly maxTokens;
|
|
90
|
+
private readonly temperature;
|
|
91
|
+
constructor(opts?: LLMTrajectoryReflectorOptions);
|
|
92
|
+
shouldReflect(step: number, history: StepHistory[]): boolean;
|
|
93
|
+
reflect(ctx: TrajectoryReflectCtx, signal?: AbortSignal): Promise<TrajectoryReflectVerdict>;
|
|
94
|
+
}
|