@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,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agent-runtime/skills/matcher-evolver — Phase 3.2 / 3.3.
|
|
3
|
+
*
|
|
4
|
+
* Provides:
|
|
5
|
+
* - {@link matchSkill}: cosine + success-rate gated lookup that the
|
|
6
|
+
* `AgentRunner` consults at task entry. Returns either a confident
|
|
7
|
+
* hit ({@link SkillMatchOutcome} with `replay: true`) or a miss
|
|
8
|
+
* that still surfaces the top candidate so callers can log telemetry.
|
|
9
|
+
* - {@link evolveSkill}: post-task hook that updates counters or
|
|
10
|
+
* persists a new skill row from a successful run.
|
|
11
|
+
*
|
|
12
|
+
* Both functions are pure data-transformations over a
|
|
13
|
+
* {@link SkillCacheStore} — no IO outside the store and no awareness
|
|
14
|
+
* of the executor. That keeps Phase 3.4 (CLI) and Phase 3.5 (bench)
|
|
15
|
+
* decoupled.
|
|
16
|
+
*/
|
|
17
|
+
import { HashEmbeddingProvider, } from "./embedding.js";
|
|
18
|
+
import { normaliseActionSequence, similarityRatio, } from "./normalise.js";
|
|
19
|
+
const DEFAULT_COSINE = 0.85;
|
|
20
|
+
const DEFAULT_SUCCESS_RATE = 0.7;
|
|
21
|
+
const DEFAULT_MIN_INVOCATIONS = 2;
|
|
22
|
+
const DEFAULT_TOP_K = 3;
|
|
23
|
+
export async function matchSkill(args) {
|
|
24
|
+
const cosineThreshold = args.options?.cosineThreshold ?? DEFAULT_COSINE;
|
|
25
|
+
const successRateThreshold = args.options?.successRateThreshold ?? DEFAULT_SUCCESS_RATE;
|
|
26
|
+
const minInvocations = args.options?.minInvocations ?? DEFAULT_MIN_INVOCATIONS;
|
|
27
|
+
const topK = args.options?.topK ?? DEFAULT_TOP_K;
|
|
28
|
+
const provider = args.embedding ?? new HashEmbeddingProvider();
|
|
29
|
+
const v = await Promise.resolve(provider.embed(args.taskSummary));
|
|
30
|
+
const candidates = args.store.search(args.appPackage, v, topK);
|
|
31
|
+
if (candidates.length === 0) {
|
|
32
|
+
return { replay: false, candidates, declineReason: "no_candidates" };
|
|
33
|
+
}
|
|
34
|
+
const best = candidates[0];
|
|
35
|
+
if (best.score < cosineThreshold) {
|
|
36
|
+
return { replay: false, best, candidates, declineReason: "score_too_low" };
|
|
37
|
+
}
|
|
38
|
+
// success-rate gate
|
|
39
|
+
const total = best.skill.successCount + best.skill.failCount;
|
|
40
|
+
if (total >= minInvocations) {
|
|
41
|
+
const rate = best.skill.successCount / Math.max(1, total);
|
|
42
|
+
if (rate < successRateThreshold) {
|
|
43
|
+
return {
|
|
44
|
+
replay: false,
|
|
45
|
+
best,
|
|
46
|
+
candidates,
|
|
47
|
+
declineReason: "success_rate_too_low",
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return { replay: true, best, candidates };
|
|
52
|
+
}
|
|
53
|
+
const DEFAULT_MIN_STEPS_TO_CACHE = 2;
|
|
54
|
+
const DEFAULT_MERGE_RATIO = 0.8;
|
|
55
|
+
export async function evolveSkill(args) {
|
|
56
|
+
const merge = args.options?.mergeRatio ?? DEFAULT_MERGE_RATIO;
|
|
57
|
+
const minSteps = args.options?.minStepsToCache ?? DEFAULT_MIN_STEPS_TO_CACHE;
|
|
58
|
+
// ── replay path ────────────────────────────────────────────────────
|
|
59
|
+
if (args.replayedSkillId) {
|
|
60
|
+
if (args.success) {
|
|
61
|
+
args.store.recordSuccess(args.replayedSkillId);
|
|
62
|
+
return { action: "incremented_success", skillId: args.replayedSkillId };
|
|
63
|
+
}
|
|
64
|
+
args.store.recordFailure(args.replayedSkillId);
|
|
65
|
+
return { action: "incremented_failure", skillId: args.replayedSkillId };
|
|
66
|
+
}
|
|
67
|
+
// ── new-skill path ─────────────────────────────────────────────────
|
|
68
|
+
// Failed plan runs do NOT seed the cache (plan §3.3).
|
|
69
|
+
if (!args.success)
|
|
70
|
+
return { action: "skipped" };
|
|
71
|
+
const normalised = normaliseActionSequence(args.rawSequence);
|
|
72
|
+
if (normalised.length < minSteps) {
|
|
73
|
+
return { action: "skipped" };
|
|
74
|
+
}
|
|
75
|
+
// ── merge into an existing skill if it's "the same thing" ──────────
|
|
76
|
+
const existing = args.store.listByApp(args.appPackage, 100);
|
|
77
|
+
for (const s of existing) {
|
|
78
|
+
if (similarityRatio(normalised, s.actionSequence) >= merge) {
|
|
79
|
+
args.store.recordSuccess(s.id);
|
|
80
|
+
return { action: "merged", skillId: s.id };
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// ── otherwise persist as a new row ─────────────────────────────────
|
|
84
|
+
const provider = args.embedding ?? new HashEmbeddingProvider();
|
|
85
|
+
const v = await Promise.resolve(provider.embed(args.taskSummary));
|
|
86
|
+
const inserted = args.store.insert(toNew({
|
|
87
|
+
appPackage: args.appPackage,
|
|
88
|
+
taskSummary: args.taskSummary,
|
|
89
|
+
actionSequence: normalised,
|
|
90
|
+
taskEmbedding: v,
|
|
91
|
+
}));
|
|
92
|
+
return { action: "inserted", skillId: inserted.id };
|
|
93
|
+
}
|
|
94
|
+
function toNew(input) {
|
|
95
|
+
return {
|
|
96
|
+
appPackage: input.appPackage,
|
|
97
|
+
taskSummary: input.taskSummary,
|
|
98
|
+
actionSequence: input.actionSequence,
|
|
99
|
+
taskEmbedding: input.taskEmbedding,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/** Helper used by tests + CLI to summarise a skill row. */
|
|
103
|
+
export function summariseSkill(skill) {
|
|
104
|
+
const total = skill.successCount + skill.failCount;
|
|
105
|
+
const rate = total === 0 ? 0 : skill.successCount / total;
|
|
106
|
+
return `${skill.id.slice(0, 8)} app=${skill.appPackage} steps=${skill.actionSequence.length} ` +
|
|
107
|
+
`success=${skill.successCount}/${total} rate=${rate.toFixed(2)} ` +
|
|
108
|
+
`lastUsed=${new Date(skill.lastUsedAt).toISOString()}`;
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=matcher-evolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matcher-evolver.js","sourceRoot":"","sources":["../../../src/agent-runtime/skills/matcher-evolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agent-runtime/skills/memory-store — in-memory implementation of
|
|
3
|
+
* {@link SkillCacheStore}.
|
|
4
|
+
*
|
|
5
|
+
* Used by tests, by the bench harness, and as a fallback when the
|
|
6
|
+
* filesystem store cannot be opened. The observable semantics match
|
|
7
|
+
* the {@link FileSystemSkillCacheStore} so integration tests can swap
|
|
8
|
+
* implementations transparently.
|
|
9
|
+
*/
|
|
10
|
+
import type { NewSkillInput, Skill, SkillCacheStore, SkillMatch } from "./types.js";
|
|
11
|
+
export declare class InMemorySkillCacheStore implements SkillCacheStore {
|
|
12
|
+
private rows;
|
|
13
|
+
insert(input: NewSkillInput): Skill;
|
|
14
|
+
get(id: string): Skill | undefined;
|
|
15
|
+
listByApp(appPackage: string, limit?: number): Skill[];
|
|
16
|
+
listAll(limit?: number): Skill[];
|
|
17
|
+
search(appPackage: string, query: Float32Array, k: number): SkillMatch[];
|
|
18
|
+
recordSuccess(id: string, now?: number): void;
|
|
19
|
+
recordFailure(id: string, now?: number): void;
|
|
20
|
+
delete(id: string): boolean;
|
|
21
|
+
clear(): void;
|
|
22
|
+
close(): void;
|
|
23
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agent-runtime/skills/memory-store — in-memory implementation of
|
|
3
|
+
* {@link SkillCacheStore}.
|
|
4
|
+
*
|
|
5
|
+
* Used by tests, by the bench harness, and as a fallback when the
|
|
6
|
+
* filesystem store cannot be opened. The observable semantics match
|
|
7
|
+
* the {@link FileSystemSkillCacheStore} so integration tests can swap
|
|
8
|
+
* implementations transparently.
|
|
9
|
+
*/
|
|
10
|
+
import { randomUUID } from "node:crypto";
|
|
11
|
+
import { cosine } from "./embedding.js";
|
|
12
|
+
export class InMemorySkillCacheStore {
|
|
13
|
+
rows = new Map();
|
|
14
|
+
insert(input) {
|
|
15
|
+
const now = Date.now();
|
|
16
|
+
const skill = {
|
|
17
|
+
id: randomUUID(),
|
|
18
|
+
appPackage: input.appPackage,
|
|
19
|
+
taskSummary: input.taskSummary,
|
|
20
|
+
taskEmbedding: input.taskEmbedding ? new Float32Array(input.taskEmbedding) : undefined,
|
|
21
|
+
actionSequence: input.actionSequence,
|
|
22
|
+
successCount: 1,
|
|
23
|
+
failCount: 0,
|
|
24
|
+
lastUsedAt: now,
|
|
25
|
+
createdAt: now,
|
|
26
|
+
};
|
|
27
|
+
this.rows.set(skill.id, skill);
|
|
28
|
+
return cloneSkill(skill);
|
|
29
|
+
}
|
|
30
|
+
get(id) {
|
|
31
|
+
const r = this.rows.get(id);
|
|
32
|
+
return r ? cloneSkill(r) : undefined;
|
|
33
|
+
}
|
|
34
|
+
listByApp(appPackage, limit = 50) {
|
|
35
|
+
const out = [];
|
|
36
|
+
for (const s of this.rows.values()) {
|
|
37
|
+
if (s.appPackage === appPackage)
|
|
38
|
+
out.push(cloneSkill(s));
|
|
39
|
+
}
|
|
40
|
+
out.sort((a, b) => b.lastUsedAt - a.lastUsedAt);
|
|
41
|
+
return out.slice(0, limit);
|
|
42
|
+
}
|
|
43
|
+
listAll(limit = 200) {
|
|
44
|
+
const out = Array.from(this.rows.values()).map(cloneSkill);
|
|
45
|
+
out.sort((a, b) => b.lastUsedAt - a.lastUsedAt);
|
|
46
|
+
return out.slice(0, limit);
|
|
47
|
+
}
|
|
48
|
+
search(appPackage, query, k) {
|
|
49
|
+
const matches = [];
|
|
50
|
+
for (const s of this.rows.values()) {
|
|
51
|
+
if (s.appPackage !== appPackage)
|
|
52
|
+
continue;
|
|
53
|
+
if (!s.taskEmbedding)
|
|
54
|
+
continue;
|
|
55
|
+
const score = cosine(query, s.taskEmbedding);
|
|
56
|
+
matches.push({ skill: cloneSkill(s), score });
|
|
57
|
+
}
|
|
58
|
+
matches.sort((a, b) => b.score - a.score);
|
|
59
|
+
return matches.slice(0, Math.max(0, k));
|
|
60
|
+
}
|
|
61
|
+
recordSuccess(id, now = Date.now()) {
|
|
62
|
+
const r = this.rows.get(id);
|
|
63
|
+
if (!r)
|
|
64
|
+
return;
|
|
65
|
+
r.successCount += 1;
|
|
66
|
+
r.lastUsedAt = now;
|
|
67
|
+
}
|
|
68
|
+
recordFailure(id, now = Date.now()) {
|
|
69
|
+
const r = this.rows.get(id);
|
|
70
|
+
if (!r)
|
|
71
|
+
return;
|
|
72
|
+
r.failCount += 1;
|
|
73
|
+
r.lastUsedAt = now;
|
|
74
|
+
}
|
|
75
|
+
delete(id) {
|
|
76
|
+
return this.rows.delete(id);
|
|
77
|
+
}
|
|
78
|
+
clear() {
|
|
79
|
+
this.rows.clear();
|
|
80
|
+
}
|
|
81
|
+
close() {
|
|
82
|
+
// No-op: the in-memory store keeps its rows so callers that close
|
|
83
|
+
// and re-open the same instance (e.g. CLI subcommand dispatchers)
|
|
84
|
+
// observe stable state. Use {@link clear} to wipe the cache.
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
function cloneSkill(s) {
|
|
88
|
+
return {
|
|
89
|
+
...s,
|
|
90
|
+
taskEmbedding: s.taskEmbedding ? new Float32Array(s.taskEmbedding) : undefined,
|
|
91
|
+
actionSequence: s.actionSequence,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=memory-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-store.js","sourceRoot":"","sources":["../../../src/agent-runtime/skills/memory-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agent-runtime/skills/normalise — squash a raw history into a replay-able
|
|
3
|
+
* action sequence.
|
|
4
|
+
*
|
|
5
|
+
* Phase 3.1 / 3.3 of the [device-agent reflector upgrade plan](../../../../../../.cursor/plans/device-agent-reflector-skills_d5599350.plan.md).
|
|
6
|
+
*
|
|
7
|
+
* The {@link SkillEvolver} stores a *normalised* version of what the
|
|
8
|
+
* agent did so that:
|
|
9
|
+
*
|
|
10
|
+
* - low-signal verbs (`screenshot`, `ui_dump`, `wait`, `take_note`)
|
|
11
|
+
* don't bloat the cached sequence — they're observation tools, not
|
|
12
|
+
* state changes.
|
|
13
|
+
* - terminal verbs (`done`, `fail`, `call_for_user`) are stripped —
|
|
14
|
+
* replay re-derives termination from the live execution.
|
|
15
|
+
* - small coordinate jitter is rounded so two near-identical runs
|
|
16
|
+
* don't produce two distinct skills.
|
|
17
|
+
*
|
|
18
|
+
* The dedup logic is intentionally cheap: it's run at most once per
|
|
19
|
+
* task and happens off the hot path.
|
|
20
|
+
*/
|
|
21
|
+
import type { Action } from "@beeos-ai/device-common";
|
|
22
|
+
import type { SkillActionSequence } from "./types.js";
|
|
23
|
+
export interface NormaliseOptions {
|
|
24
|
+
/** Override the default coordinate quantum (px). */
|
|
25
|
+
coordQuantum?: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Strip noise + quantise coords. Returns a frozen array so callers can
|
|
29
|
+
* keep the result without worrying about mutation downstream.
|
|
30
|
+
*/
|
|
31
|
+
export declare function normaliseActionSequence(raw: readonly Action[], opts?: NormaliseOptions): SkillActionSequence;
|
|
32
|
+
/**
|
|
33
|
+
* Compare two normalised sequences for "the same skill" — same
|
|
34
|
+
* length, same verb at every index, with target coordinates within one
|
|
35
|
+
* quantum. Payload equality is checked structurally.
|
|
36
|
+
*
|
|
37
|
+
* Returns a Jaccard-ish ratio in `[0, 1]` so callers can blend it with
|
|
38
|
+
* the embedding cosine for smarter matching later.
|
|
39
|
+
*/
|
|
40
|
+
export declare function similarityRatio(a: SkillActionSequence, b: SkillActionSequence): number;
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agent-runtime/skills/normalise — squash a raw history into a replay-able
|
|
3
|
+
* action sequence.
|
|
4
|
+
*
|
|
5
|
+
* Phase 3.1 / 3.3 of the [device-agent reflector upgrade plan](../../../../../../.cursor/plans/device-agent-reflector-skills_d5599350.plan.md).
|
|
6
|
+
*
|
|
7
|
+
* The {@link SkillEvolver} stores a *normalised* version of what the
|
|
8
|
+
* agent did so that:
|
|
9
|
+
*
|
|
10
|
+
* - low-signal verbs (`screenshot`, `ui_dump`, `wait`, `take_note`)
|
|
11
|
+
* don't bloat the cached sequence — they're observation tools, not
|
|
12
|
+
* state changes.
|
|
13
|
+
* - terminal verbs (`done`, `fail`, `call_for_user`) are stripped —
|
|
14
|
+
* replay re-derives termination from the live execution.
|
|
15
|
+
* - small coordinate jitter is rounded so two near-identical runs
|
|
16
|
+
* don't produce two distinct skills.
|
|
17
|
+
*
|
|
18
|
+
* The dedup logic is intentionally cheap: it's run at most once per
|
|
19
|
+
* task and happens off the hot path.
|
|
20
|
+
*/
|
|
21
|
+
/** Verbs that don't change device state — we skip them in replay. */
|
|
22
|
+
const OBSERVATION_VERBS = new Set([
|
|
23
|
+
"screenshot",
|
|
24
|
+
"ui_dump",
|
|
25
|
+
"wait",
|
|
26
|
+
"take_note",
|
|
27
|
+
]);
|
|
28
|
+
/** Verbs that end the run — stripped before persistence. */
|
|
29
|
+
const TERMINAL_VERBS = new Set(["done", "fail", "call_for_user"]);
|
|
30
|
+
/** Round each coordinate to this granularity so jitter doesn't fork skills. */
|
|
31
|
+
const COORD_QUANTUM = 8;
|
|
32
|
+
/**
|
|
33
|
+
* Strip noise + quantise coords. Returns a frozen array so callers can
|
|
34
|
+
* keep the result without worrying about mutation downstream.
|
|
35
|
+
*/
|
|
36
|
+
export function normaliseActionSequence(raw, opts = {}) {
|
|
37
|
+
const q = opts.coordQuantum ?? COORD_QUANTUM;
|
|
38
|
+
const out = [];
|
|
39
|
+
for (const a of raw) {
|
|
40
|
+
if (!a)
|
|
41
|
+
continue;
|
|
42
|
+
if (OBSERVATION_VERBS.has(a.type))
|
|
43
|
+
continue;
|
|
44
|
+
if (TERMINAL_VERBS.has(a.type))
|
|
45
|
+
continue;
|
|
46
|
+
out.push(quantiseAction(a, q));
|
|
47
|
+
}
|
|
48
|
+
return Object.freeze(out);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Compare two normalised sequences for "the same skill" — same
|
|
52
|
+
* length, same verb at every index, with target coordinates within one
|
|
53
|
+
* quantum. Payload equality is checked structurally.
|
|
54
|
+
*
|
|
55
|
+
* Returns a Jaccard-ish ratio in `[0, 1]` so callers can blend it with
|
|
56
|
+
* the embedding cosine for smarter matching later.
|
|
57
|
+
*/
|
|
58
|
+
export function similarityRatio(a, b) {
|
|
59
|
+
if (a.length === 0 && b.length === 0)
|
|
60
|
+
return 1;
|
|
61
|
+
if (a.length === 0 || b.length === 0)
|
|
62
|
+
return 0;
|
|
63
|
+
const len = Math.max(a.length, b.length);
|
|
64
|
+
let matches = 0;
|
|
65
|
+
for (let i = 0; i < Math.min(a.length, b.length); i++) {
|
|
66
|
+
if (actionsRoughlyEqual(a[i], b[i]))
|
|
67
|
+
matches++;
|
|
68
|
+
}
|
|
69
|
+
return matches / len;
|
|
70
|
+
}
|
|
71
|
+
function actionsRoughlyEqual(a, b) {
|
|
72
|
+
if (a.type !== b.type)
|
|
73
|
+
return false;
|
|
74
|
+
if (!targetsRoughlyEqual(a.target, b.target))
|
|
75
|
+
return false;
|
|
76
|
+
return shallowEqual(a.payload, b.payload);
|
|
77
|
+
}
|
|
78
|
+
function targetsRoughlyEqual(a, b) {
|
|
79
|
+
if (!a && !b)
|
|
80
|
+
return true;
|
|
81
|
+
if (!a || !b)
|
|
82
|
+
return false;
|
|
83
|
+
if (a.kind !== b.kind)
|
|
84
|
+
return false;
|
|
85
|
+
switch (a.kind) {
|
|
86
|
+
case "point":
|
|
87
|
+
return Math.abs(a.x - b.x) <= COORD_QUANTUM &&
|
|
88
|
+
Math.abs(a.y - b.y) <= COORD_QUANTUM;
|
|
89
|
+
case "box": {
|
|
90
|
+
const bb = b;
|
|
91
|
+
return (Math.abs(a.x1 - bb.x1) <= COORD_QUANTUM &&
|
|
92
|
+
Math.abs(a.y1 - bb.y1) <= COORD_QUANTUM &&
|
|
93
|
+
Math.abs(a.x2 - bb.x2) <= COORD_QUANTUM &&
|
|
94
|
+
Math.abs(a.y2 - bb.y2) <= COORD_QUANTUM);
|
|
95
|
+
}
|
|
96
|
+
case "text":
|
|
97
|
+
return a.value === b.value;
|
|
98
|
+
case "selector":
|
|
99
|
+
return a.value === b.value;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
function shallowEqual(a, b) {
|
|
103
|
+
const ak = Object.keys(a ?? {});
|
|
104
|
+
const bk = Object.keys(b ?? {});
|
|
105
|
+
if (ak.length !== bk.length)
|
|
106
|
+
return false;
|
|
107
|
+
for (const k of ak) {
|
|
108
|
+
if (a[k] !== b[k]) {
|
|
109
|
+
// shallow JSON equality fallback for nested
|
|
110
|
+
if (JSON.stringify(a[k]) !== JSON.stringify(b[k]))
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
function quantiseAction(a, q) {
|
|
117
|
+
if (!a.target)
|
|
118
|
+
return stripExtras(a);
|
|
119
|
+
const target = quantiseTarget(a.target, q);
|
|
120
|
+
return { ...stripExtras(a), target };
|
|
121
|
+
}
|
|
122
|
+
function stripExtras(a) {
|
|
123
|
+
// Drop `confidence` / `rationale` — those are run-specific and waste
|
|
124
|
+
// bytes in the cache.
|
|
125
|
+
return {
|
|
126
|
+
type: a.type,
|
|
127
|
+
target: a.target,
|
|
128
|
+
payload: a.payload,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
function quantiseTarget(t, q) {
|
|
132
|
+
switch (t.kind) {
|
|
133
|
+
case "point":
|
|
134
|
+
return { kind: "point", x: roundTo(t.x, q), y: roundTo(t.y, q) };
|
|
135
|
+
case "box":
|
|
136
|
+
return {
|
|
137
|
+
kind: "box",
|
|
138
|
+
x1: roundTo(t.x1, q),
|
|
139
|
+
y1: roundTo(t.y1, q),
|
|
140
|
+
x2: roundTo(t.x2, q),
|
|
141
|
+
y2: roundTo(t.y2, q),
|
|
142
|
+
};
|
|
143
|
+
default:
|
|
144
|
+
return t;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
function roundTo(n, q) {
|
|
148
|
+
if (q <= 0)
|
|
149
|
+
return n;
|
|
150
|
+
return Math.round(n / q) * q;
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=normalise.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalise.js","sourceRoot":"","sources":["../../../src/agent-runtime/skills/normalise.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agent-runtime/skills/replay — SkillReplayer.
|
|
3
|
+
*
|
|
4
|
+
* Phase 3.2 of the [device-agent reflector upgrade plan](../../../../../../.cursor/plans/device-agent-reflector-skills_d5599350.plan.md).
|
|
5
|
+
*
|
|
6
|
+
* Once the {@link matchSkill} returns a confident hit, the runner enters
|
|
7
|
+
* SkillReplay mode: it dispatches each cached action through MCP one at
|
|
8
|
+
* a time, taking a fresh observation between steps so the heuristic and
|
|
9
|
+
* pre-action sanity layers can still abort. The replayer stops at the
|
|
10
|
+
* first failure (MCP error, or a step that the agent loop would have
|
|
11
|
+
* vetoed) so the caller can fall back to the normal Plan-Act path.
|
|
12
|
+
*
|
|
13
|
+
* The replayer deliberately bypasses the grounder LLM — that's the whole
|
|
14
|
+
* point of caching the skill. If the cached coordinates have drifted we
|
|
15
|
+
* detect failure, the {@link evolveSkill} hook records the fail_count,
|
|
16
|
+
* and the runner re-plans from scratch.
|
|
17
|
+
*/
|
|
18
|
+
import type { Action, Observation } from "@beeos-ai/device-common";
|
|
19
|
+
import type { IMcpRuntime } from "../../mcp-client/runtime.js";
|
|
20
|
+
import type { AgentRunHooks } from "../core.js";
|
|
21
|
+
import type { SkillActionSequence } from "./types.js";
|
|
22
|
+
export interface SkillReplayOptions {
|
|
23
|
+
mcp: IMcpRuntime;
|
|
24
|
+
env: Observation["env"];
|
|
25
|
+
sequence: SkillActionSequence;
|
|
26
|
+
/** Hard upper bound — must be ≥ sequence.length. */
|
|
27
|
+
maxSteps: number;
|
|
28
|
+
timeoutMs: number;
|
|
29
|
+
signal?: AbortSignal;
|
|
30
|
+
hooks?: AgentRunHooks;
|
|
31
|
+
}
|
|
32
|
+
export interface SkillReplayResult {
|
|
33
|
+
/** All cached steps dispatched without an MCP error. */
|
|
34
|
+
success: boolean;
|
|
35
|
+
/** Number of cached steps actually executed. */
|
|
36
|
+
stepsRun: number;
|
|
37
|
+
/** Plan-Act would resume from the surviving observation. */
|
|
38
|
+
finalObservation?: Observation;
|
|
39
|
+
/** When `success === false`, the verb that failed. */
|
|
40
|
+
failedAt?: {
|
|
41
|
+
stepIdx: number;
|
|
42
|
+
action: Action;
|
|
43
|
+
reason: string;
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
export declare function replaySkill(opts: SkillReplayOptions): Promise<SkillReplayResult>;
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agent-runtime/skills/replay — SkillReplayer.
|
|
3
|
+
*
|
|
4
|
+
* Phase 3.2 of the [device-agent reflector upgrade plan](../../../../../../.cursor/plans/device-agent-reflector-skills_d5599350.plan.md).
|
|
5
|
+
*
|
|
6
|
+
* Once the {@link matchSkill} returns a confident hit, the runner enters
|
|
7
|
+
* SkillReplay mode: it dispatches each cached action through MCP one at
|
|
8
|
+
* a time, taking a fresh observation between steps so the heuristic and
|
|
9
|
+
* pre-action sanity layers can still abort. The replayer stops at the
|
|
10
|
+
* first failure (MCP error, or a step that the agent loop would have
|
|
11
|
+
* vetoed) so the caller can fall back to the normal Plan-Act path.
|
|
12
|
+
*
|
|
13
|
+
* The replayer deliberately bypasses the grounder LLM — that's the whole
|
|
14
|
+
* point of caching the skill. If the cached coordinates have drifted we
|
|
15
|
+
* detect failure, the {@link evolveSkill} hook records the fail_count,
|
|
16
|
+
* and the runner re-plans from scratch.
|
|
17
|
+
*/
|
|
18
|
+
import { getLogger } from "../../logger/index.js";
|
|
19
|
+
function buildArgs(action) {
|
|
20
|
+
const args = { ...(action.payload ?? {}) };
|
|
21
|
+
if (action.target)
|
|
22
|
+
args.target = action.target;
|
|
23
|
+
return args;
|
|
24
|
+
}
|
|
25
|
+
export async function replaySkill(opts) {
|
|
26
|
+
const log = getLogger().child({ component: "skill-replay" });
|
|
27
|
+
const startedAt = Date.now();
|
|
28
|
+
const deadline = startedAt + opts.timeoutMs;
|
|
29
|
+
const limit = Math.min(opts.sequence.length, opts.maxSteps);
|
|
30
|
+
let lastObs;
|
|
31
|
+
for (let i = 0; i < limit; i++) {
|
|
32
|
+
if (opts.signal?.aborted) {
|
|
33
|
+
return { success: false, stepsRun: i, finalObservation: lastObs };
|
|
34
|
+
}
|
|
35
|
+
if (Date.now() > deadline) {
|
|
36
|
+
return { success: false, stepsRun: i, finalObservation: lastObs };
|
|
37
|
+
}
|
|
38
|
+
const action = opts.sequence[i];
|
|
39
|
+
try {
|
|
40
|
+
// Refresh observation between steps so the next replay cycle (or
|
|
41
|
+
// the fallback PlanExecutor) starts from a current screen.
|
|
42
|
+
lastObs = await snapshotObservation(opts);
|
|
43
|
+
await opts.hooks?.onStep?.({
|
|
44
|
+
index: i + 1,
|
|
45
|
+
rationale: `[skill-replay] cached step ${i + 1}/${opts.sequence.length}`,
|
|
46
|
+
action,
|
|
47
|
+
prediction: {
|
|
48
|
+
action,
|
|
49
|
+
rationale: "skill-replay",
|
|
50
|
+
confidence: 0.5,
|
|
51
|
+
usage: { inputTokens: 0, outputTokens: 0 },
|
|
52
|
+
rawResponse: "",
|
|
53
|
+
},
|
|
54
|
+
finished: false,
|
|
55
|
+
});
|
|
56
|
+
const dispatchedAt = Date.now();
|
|
57
|
+
const res = await opts.mcp.act(action);
|
|
58
|
+
await opts.hooks?.onTool?.({
|
|
59
|
+
name: action.type,
|
|
60
|
+
args: buildArgs(action),
|
|
61
|
+
result: res,
|
|
62
|
+
durationMs: Date.now() - dispatchedAt,
|
|
63
|
+
});
|
|
64
|
+
if (!res.ok) {
|
|
65
|
+
const reason = res.error?.message ?? "act returned ok=false";
|
|
66
|
+
log.warn({ stepIdx: i + 1, action: action.type, reason }, "skill-replay.failed");
|
|
67
|
+
return {
|
|
68
|
+
success: false,
|
|
69
|
+
stepsRun: i + 1,
|
|
70
|
+
finalObservation: lastObs,
|
|
71
|
+
failedAt: { stepIdx: i + 1, action, reason },
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch (e) {
|
|
76
|
+
const reason = e instanceof Error ? e.message : String(e);
|
|
77
|
+
log.warn({ stepIdx: i + 1, action: action.type, err: reason }, "skill-replay.threw");
|
|
78
|
+
return {
|
|
79
|
+
success: false,
|
|
80
|
+
stepsRun: i + 1,
|
|
81
|
+
finalObservation: lastObs,
|
|
82
|
+
failedAt: { stepIdx: i + 1, action, reason },
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// Final observation after the last step — useful for the caller's
|
|
87
|
+
// post-replay verification or for seeding the next plan cycle.
|
|
88
|
+
try {
|
|
89
|
+
lastObs = await snapshotObservation(opts);
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
/* tolerate */
|
|
93
|
+
}
|
|
94
|
+
return { success: true, stepsRun: limit, finalObservation: lastObs };
|
|
95
|
+
}
|
|
96
|
+
async function snapshotObservation(opts) {
|
|
97
|
+
const ss = await opts.mcp.screenshot();
|
|
98
|
+
return {
|
|
99
|
+
task: "",
|
|
100
|
+
env: opts.env,
|
|
101
|
+
screenW: ss.deviceWidth ?? ss.width,
|
|
102
|
+
screenH: ss.deviceHeight ?? ss.height,
|
|
103
|
+
screenshotB64: ss.b64,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=replay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replay.js","sourceRoot":"","sources":["../../../src/agent-runtime/skills/replay.ts"],"names":[],"mappings":"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"}
|