@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,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agent-runtime/skills/sqlite-store — SQLite-backed
|
|
3
|
+
* {@link SkillCacheStore}.
|
|
4
|
+
*
|
|
5
|
+
* Phase 3.1 of the [device-agent reflector upgrade plan](../../../../../../.cursor/plans/device-agent-reflector-skills_d5599350.plan.md).
|
|
6
|
+
*
|
|
7
|
+
* Schema (kept verbatim with the plan):
|
|
8
|
+
* ```sql
|
|
9
|
+
* CREATE TABLE skills (
|
|
10
|
+
* id TEXT PRIMARY KEY,
|
|
11
|
+
* app_package TEXT NOT NULL,
|
|
12
|
+
* task_summary TEXT NOT NULL,
|
|
13
|
+
* task_embedding BLOB,
|
|
14
|
+
* action_sequence_json TEXT NOT NULL,
|
|
15
|
+
* success_count INTEGER NOT NULL DEFAULT 1,
|
|
16
|
+
* fail_count INTEGER NOT NULL DEFAULT 0,
|
|
17
|
+
* last_used_at INTEGER NOT NULL,
|
|
18
|
+
* created_at INTEGER NOT NULL
|
|
19
|
+
* );
|
|
20
|
+
* CREATE INDEX idx_skills_app ON skills(app_package);
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* Default DB path: `~/.beeos/device-agent/skills.sqlite`. Containerised
|
|
24
|
+
* deployments mount `/var/lib/beeos/device-agent` and override
|
|
25
|
+
* `SKILL_CACHE_PATH` accordingly.
|
|
26
|
+
*
|
|
27
|
+
* Search is implemented as a full scan over the matching app rows —
|
|
28
|
+
* the cache is intentionally small (<10k rows / device), so a brute
|
|
29
|
+
* cosine pass is cheaper than maintaining an ANN index. If profile
|
|
30
|
+
* data shows that's wrong we can plug in `sqlite-vss` / `pgvector`
|
|
31
|
+
* later behind the same {@link SkillCacheStore} interface.
|
|
32
|
+
*/
|
|
33
|
+
import type { Database as DB } from "better-sqlite3";
|
|
34
|
+
import type { NewSkillInput, Skill, SkillCacheStore, SkillMatch } from "./types.js";
|
|
35
|
+
export interface SQLiteSkillCacheStoreOptions {
|
|
36
|
+
/** Override the default DB path. Use ":memory:" for ephemeral tests. */
|
|
37
|
+
path?: string;
|
|
38
|
+
/** Pre-built better-sqlite3 Database (used by tests). */
|
|
39
|
+
db?: DB;
|
|
40
|
+
/** Skip auto-mkdir on the parent dir (when path is :memory:). */
|
|
41
|
+
noMkdir?: boolean;
|
|
42
|
+
}
|
|
43
|
+
export declare function defaultSkillCachePath(): string;
|
|
44
|
+
export declare class SQLiteSkillCacheStore implements SkillCacheStore {
|
|
45
|
+
private readonly db;
|
|
46
|
+
private readonly stmts;
|
|
47
|
+
private closed;
|
|
48
|
+
constructor(opts?: SQLiteSkillCacheStoreOptions);
|
|
49
|
+
insert(input: NewSkillInput): Skill;
|
|
50
|
+
get(id: string): Skill | undefined;
|
|
51
|
+
listByApp(appPackage: string, limit?: number): Skill[];
|
|
52
|
+
listAll(limit?: number): Skill[];
|
|
53
|
+
search(appPackage: string, query: Float32Array, k: number): SkillMatch[];
|
|
54
|
+
recordSuccess(id: string, now?: number): void;
|
|
55
|
+
recordFailure(id: string, now?: number): void;
|
|
56
|
+
delete(id: string): boolean;
|
|
57
|
+
clear(): void;
|
|
58
|
+
close(): void;
|
|
59
|
+
private applyMigrations;
|
|
60
|
+
}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agent-runtime/skills/sqlite-store — SQLite-backed
|
|
3
|
+
* {@link SkillCacheStore}.
|
|
4
|
+
*
|
|
5
|
+
* Phase 3.1 of the [device-agent reflector upgrade plan](../../../../../../.cursor/plans/device-agent-reflector-skills_d5599350.plan.md).
|
|
6
|
+
*
|
|
7
|
+
* Schema (kept verbatim with the plan):
|
|
8
|
+
* ```sql
|
|
9
|
+
* CREATE TABLE skills (
|
|
10
|
+
* id TEXT PRIMARY KEY,
|
|
11
|
+
* app_package TEXT NOT NULL,
|
|
12
|
+
* task_summary TEXT NOT NULL,
|
|
13
|
+
* task_embedding BLOB,
|
|
14
|
+
* action_sequence_json TEXT NOT NULL,
|
|
15
|
+
* success_count INTEGER NOT NULL DEFAULT 1,
|
|
16
|
+
* fail_count INTEGER NOT NULL DEFAULT 0,
|
|
17
|
+
* last_used_at INTEGER NOT NULL,
|
|
18
|
+
* created_at INTEGER NOT NULL
|
|
19
|
+
* );
|
|
20
|
+
* CREATE INDEX idx_skills_app ON skills(app_package);
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* Default DB path: `~/.beeos/device-agent/skills.sqlite`. Containerised
|
|
24
|
+
* deployments mount `/var/lib/beeos/device-agent` and override
|
|
25
|
+
* `SKILL_CACHE_PATH` accordingly.
|
|
26
|
+
*
|
|
27
|
+
* Search is implemented as a full scan over the matching app rows —
|
|
28
|
+
* the cache is intentionally small (<10k rows / device), so a brute
|
|
29
|
+
* cosine pass is cheaper than maintaining an ANN index. If profile
|
|
30
|
+
* data shows that's wrong we can plug in `sqlite-vss` / `pgvector`
|
|
31
|
+
* later behind the same {@link SkillCacheStore} interface.
|
|
32
|
+
*/
|
|
33
|
+
import { mkdirSync } from "node:fs";
|
|
34
|
+
import path from "node:path";
|
|
35
|
+
import { homedir } from "node:os";
|
|
36
|
+
import { randomUUID } from "node:crypto";
|
|
37
|
+
import Database from "better-sqlite3";
|
|
38
|
+
import { bufferToEmbedding, cosine, embeddingToBuffer, } from "./embedding.js";
|
|
39
|
+
const SCHEMA_VERSION = 1;
|
|
40
|
+
const SCHEMA_SQL = `
|
|
41
|
+
PRAGMA journal_mode=WAL;
|
|
42
|
+
PRAGMA synchronous=NORMAL;
|
|
43
|
+
PRAGMA foreign_keys=ON;
|
|
44
|
+
|
|
45
|
+
CREATE TABLE IF NOT EXISTS skills (
|
|
46
|
+
id TEXT PRIMARY KEY,
|
|
47
|
+
app_package TEXT NOT NULL,
|
|
48
|
+
task_summary TEXT NOT NULL,
|
|
49
|
+
task_embedding BLOB,
|
|
50
|
+
action_sequence_json TEXT NOT NULL,
|
|
51
|
+
success_count INTEGER NOT NULL DEFAULT 1,
|
|
52
|
+
fail_count INTEGER NOT NULL DEFAULT 0,
|
|
53
|
+
last_used_at INTEGER NOT NULL,
|
|
54
|
+
created_at INTEGER NOT NULL
|
|
55
|
+
);
|
|
56
|
+
CREATE INDEX IF NOT EXISTS idx_skills_app ON skills(app_package);
|
|
57
|
+
|
|
58
|
+
CREATE TABLE IF NOT EXISTS skill_meta (
|
|
59
|
+
key TEXT PRIMARY KEY,
|
|
60
|
+
value TEXT NOT NULL
|
|
61
|
+
);
|
|
62
|
+
`;
|
|
63
|
+
export function defaultSkillCachePath() {
|
|
64
|
+
const env = process.env.SKILL_CACHE_PATH;
|
|
65
|
+
if (env && env.length > 0)
|
|
66
|
+
return env;
|
|
67
|
+
return path.join(homedir(), ".beeos", "device-agent", "skills.sqlite");
|
|
68
|
+
}
|
|
69
|
+
export class SQLiteSkillCacheStore {
|
|
70
|
+
db;
|
|
71
|
+
stmts;
|
|
72
|
+
closed = false;
|
|
73
|
+
constructor(opts = {}) {
|
|
74
|
+
const dbPath = opts.path ?? defaultSkillCachePath();
|
|
75
|
+
if (opts.db) {
|
|
76
|
+
this.db = opts.db;
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
if (!opts.noMkdir && dbPath !== ":memory:") {
|
|
80
|
+
mkdirSync(path.dirname(dbPath), { recursive: true });
|
|
81
|
+
}
|
|
82
|
+
this.db = new Database(dbPath);
|
|
83
|
+
}
|
|
84
|
+
this.db.exec(SCHEMA_SQL);
|
|
85
|
+
this.applyMigrations();
|
|
86
|
+
this.stmts = prepareStatements(this.db);
|
|
87
|
+
}
|
|
88
|
+
insert(input) {
|
|
89
|
+
if (this.closed)
|
|
90
|
+
throw new Error("SQLiteSkillCacheStore: handle closed");
|
|
91
|
+
const now = Date.now();
|
|
92
|
+
const id = randomUUID();
|
|
93
|
+
this.stmts.insert.run({
|
|
94
|
+
id,
|
|
95
|
+
app: input.appPackage,
|
|
96
|
+
summary: input.taskSummary,
|
|
97
|
+
embed: input.taskEmbedding ? embeddingToBuffer(input.taskEmbedding) : null,
|
|
98
|
+
seq: serialiseSequence(input.actionSequence),
|
|
99
|
+
now,
|
|
100
|
+
});
|
|
101
|
+
return {
|
|
102
|
+
id,
|
|
103
|
+
appPackage: input.appPackage,
|
|
104
|
+
taskSummary: input.taskSummary,
|
|
105
|
+
taskEmbedding: input.taskEmbedding ? new Float32Array(input.taskEmbedding) : undefined,
|
|
106
|
+
actionSequence: input.actionSequence,
|
|
107
|
+
successCount: 1,
|
|
108
|
+
failCount: 0,
|
|
109
|
+
lastUsedAt: now,
|
|
110
|
+
createdAt: now,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
get(id) {
|
|
114
|
+
const row = this.stmts.getById.get({ id });
|
|
115
|
+
return row ? rowToSkill(row) : undefined;
|
|
116
|
+
}
|
|
117
|
+
listByApp(appPackage, limit = 50) {
|
|
118
|
+
const rows = this.stmts.listByApp.all({ app: appPackage, limit });
|
|
119
|
+
return rows.map(rowToSkill);
|
|
120
|
+
}
|
|
121
|
+
listAll(limit = 200) {
|
|
122
|
+
const rows = this.stmts.listAll.all({ limit });
|
|
123
|
+
return rows.map(rowToSkill);
|
|
124
|
+
}
|
|
125
|
+
search(appPackage, query, k) {
|
|
126
|
+
const rows = this.stmts.searchByApp.all({ app: appPackage });
|
|
127
|
+
const matches = [];
|
|
128
|
+
for (const row of rows) {
|
|
129
|
+
if (!row.task_embedding)
|
|
130
|
+
continue;
|
|
131
|
+
const v = bufferToEmbedding(row.task_embedding);
|
|
132
|
+
if (v.length !== query.length)
|
|
133
|
+
continue;
|
|
134
|
+
const score = cosine(query, v);
|
|
135
|
+
matches.push({ skill: rowToSkill(row), score });
|
|
136
|
+
}
|
|
137
|
+
matches.sort((a, b) => b.score - a.score);
|
|
138
|
+
return matches.slice(0, Math.max(0, k));
|
|
139
|
+
}
|
|
140
|
+
recordSuccess(id, now = Date.now()) {
|
|
141
|
+
this.stmts.success.run({ id, now });
|
|
142
|
+
}
|
|
143
|
+
recordFailure(id, now = Date.now()) {
|
|
144
|
+
this.stmts.failure.run({ id, now });
|
|
145
|
+
}
|
|
146
|
+
delete(id) {
|
|
147
|
+
const res = this.stmts.delete.run({ id });
|
|
148
|
+
return res.changes > 0;
|
|
149
|
+
}
|
|
150
|
+
clear() {
|
|
151
|
+
this.db.exec("DELETE FROM skills;");
|
|
152
|
+
}
|
|
153
|
+
close() {
|
|
154
|
+
if (this.closed)
|
|
155
|
+
return;
|
|
156
|
+
this.closed = true;
|
|
157
|
+
try {
|
|
158
|
+
this.db.close();
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
/* swallow — close is best-effort */
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
applyMigrations() {
|
|
165
|
+
const row = this.db
|
|
166
|
+
.prepare("SELECT value FROM skill_meta WHERE key = 'schema_version'")
|
|
167
|
+
.get();
|
|
168
|
+
if (!row) {
|
|
169
|
+
this.db
|
|
170
|
+
.prepare("INSERT INTO skill_meta(key, value) VALUES('schema_version', ?)")
|
|
171
|
+
.run(String(SCHEMA_VERSION));
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
// Future migrations would diff `row.value` against SCHEMA_VERSION here.
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
function prepareStatements(db) {
|
|
178
|
+
return {
|
|
179
|
+
insert: db.prepare(`INSERT INTO skills (
|
|
180
|
+
id, app_package, task_summary, task_embedding,
|
|
181
|
+
action_sequence_json, success_count, fail_count, last_used_at, created_at
|
|
182
|
+
) VALUES (
|
|
183
|
+
@id, @app, @summary, @embed,
|
|
184
|
+
@seq, 1, 0, @now, @now
|
|
185
|
+
);`),
|
|
186
|
+
getById: db.prepare(`SELECT * FROM skills WHERE id = @id`),
|
|
187
|
+
listByApp: db.prepare(`SELECT * FROM skills
|
|
188
|
+
WHERE app_package = @app
|
|
189
|
+
ORDER BY last_used_at DESC
|
|
190
|
+
LIMIT @limit`),
|
|
191
|
+
listAll: db.prepare(`SELECT * FROM skills
|
|
192
|
+
ORDER BY last_used_at DESC
|
|
193
|
+
LIMIT @limit`),
|
|
194
|
+
searchByApp: db.prepare(`SELECT * FROM skills WHERE app_package = @app`),
|
|
195
|
+
success: db.prepare(`UPDATE skills SET success_count = success_count + 1,
|
|
196
|
+
last_used_at = @now
|
|
197
|
+
WHERE id = @id`),
|
|
198
|
+
failure: db.prepare(`UPDATE skills SET fail_count = fail_count + 1,
|
|
199
|
+
last_used_at = @now
|
|
200
|
+
WHERE id = @id`),
|
|
201
|
+
delete: db.prepare(`DELETE FROM skills WHERE id = @id`),
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
function serialiseSequence(seq) {
|
|
205
|
+
return JSON.stringify(seq);
|
|
206
|
+
}
|
|
207
|
+
function deserialiseSequence(raw) {
|
|
208
|
+
if (!raw)
|
|
209
|
+
return [];
|
|
210
|
+
try {
|
|
211
|
+
const v = JSON.parse(raw);
|
|
212
|
+
if (Array.isArray(v)) {
|
|
213
|
+
return v;
|
|
214
|
+
}
|
|
215
|
+
return [];
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
return [];
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
function rowToSkill(row) {
|
|
222
|
+
return {
|
|
223
|
+
id: row.id,
|
|
224
|
+
appPackage: row.app_package,
|
|
225
|
+
taskSummary: row.task_summary,
|
|
226
|
+
taskEmbedding: row.task_embedding ? bufferToEmbedding(row.task_embedding) : undefined,
|
|
227
|
+
actionSequence: deserialiseSequence(row.action_sequence_json),
|
|
228
|
+
successCount: row.success_count,
|
|
229
|
+
failCount: row.fail_count,
|
|
230
|
+
lastUsedAt: row.last_used_at,
|
|
231
|
+
createdAt: row.created_at,
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=sqlite-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-store.js","sourceRoot":"","sources":["../../../src/agent-runtime/skills/sqlite-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAKtC,OAAO,EACL,iBAAiB,EACjB,MAAM,EACN,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AASxB,MAAM,cAAc,GAAG,CAAC,CAAC;AAEzB,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;CAsBlB,CAAC;AAWF,MAAM,UAAU,qBAAqB;IACnC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IACzC,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IACtC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,OAAO,qBAAqB;IACf,EAAE,CAAK;IACP,KAAK,CAAqB;IACnC,MAAM,GAAG,KAAK,CAAC;IAEvB,YAAY,OAAqC,EAAE;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,IAAI,qBAAqB,EAAE,CAAC;QACpD,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;gBAC3C,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACvD,CAAC;YACD,IAAI,CAAC,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;QACD,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACzB,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,CAAC,KAAoB;QACzB,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QACzE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QACxB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;YACpB,EAAE;YACF,GAAG,EAAE,KAAK,CAAC,UAAU;YACrB,OAAO,EAAE,KAAK,CAAC,WAAW;YAC1B,KAAK,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI;YAC1E,GAAG,EAAE,iBAAiB,CAAC,KAAK,CAAC,cAAc,CAAC;YAC5C,GAAG;SACJ,CAAC,CAAC;QACH,OAAO;YACL,EAAE;YACF,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,aAAa,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS;YACtF,cAAc,EAAE,KAAK,CAAC,cAAc;YACpC,YAAY,EAAE,CAAC;YACf,SAAS,EAAE,CAAC;YACZ,UAAU,EAAE,GAAG;YACf,SAAS,EAAE,GAAG;SACf,CAAC;IACJ,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAuB,CAAC;QACjE,OAAO,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3C,CAAC;IAED,SAAS,CAAC,UAAkB,EAAE,KAAK,GAAG,EAAE;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,CAAa,CAAC;QAC9E,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,CAAC,KAAK,GAAG,GAAG;QACjB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAa,CAAC;QAC3D,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC9B,CAAC;IAED,MAAM,CAAC,UAAkB,EAAE,KAAmB,EAAE,CAAS;QACvD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,CAAa,CAAC;QACzE,MAAM,OAAO,GAAiB,EAAE,CAAC;QACjC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,GAAG,CAAC,cAAc;gBAAE,SAAS;YAClC,MAAM,CAAC,GAAG,iBAAiB,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAChD,IAAI,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;gBAAE,SAAS;YACxC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QAC1C,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,aAAa,CAAC,EAAU,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QACxC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,aAAa,CAAC,EAAU,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QACxC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,CAAC,EAAU;QACf,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1C,OAAO,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC;IACzB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACtC,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC;YACH,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC;QAAC,MAAM,CAAC;YACP,oCAAoC;QACtC,CAAC;IACH,CAAC;IAEO,eAAe;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CAAC,2DAA2D,CAAC;aACpE,GAAG,EAAmC,CAAC;QAC1C,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,IAAI,CAAC,EAAE;iBACJ,OAAO,CAAC,gEAAgE,CAAC;iBACzE,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;YAC/B,OAAO;QACT,CAAC;QACD,wEAAwE;IAC1E,CAAC;CACF;AA6BD,SAAS,iBAAiB,CAAC,EAAM;IAC/B,OAAO;QACL,MAAM,EAAE,EAAE,CAAC,OAAO,CAChB;;;;;;UAMI,CACL;QACD,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,qCAAqC,CAAC;QAC1D,SAAS,EAAE,EAAE,CAAC,OAAO,CACnB;;;oBAGc,CACf;QACD,OAAO,EAAE,EAAE,CAAC,OAAO,CACjB;;oBAEc,CACf;QACD,WAAW,EAAE,EAAE,CAAC,OAAO,CACrB,+CAA+C,CAChD;QACD,OAAO,EAAE,EAAE,CAAC,OAAO,CACjB;;sBAEgB,CACjB;QACD,OAAO,EAAE,EAAE,CAAC,OAAO,CACjB;;sBAEgB,CACjB;QACD,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,mCAAmC,CAAC;KACxD,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAwB;IACjD,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAW;IACtC,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YACrB,OAAO,CAAa,CAAC;QACvB,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,UAAU,EAAE,GAAG,CAAC,WAAW;QAC3B,WAAW,EAAE,GAAG,CAAC,YAAY;QAC7B,aAAa,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,SAAS;QACrF,cAAc,EAAE,mBAAmB,CAAC,GAAG,CAAC,oBAAoB,CAAC;QAC7D,YAAY,EAAE,GAAG,CAAC,aAAa;QAC/B,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,UAAU,EAAE,GAAG,CAAC,YAAY;QAC5B,SAAS,EAAE,GAAG,CAAC,UAAU;KAC1B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agent-runtime/skills/types — Skill memory shared types.
|
|
3
|
+
*
|
|
4
|
+
* Phase 3.1 of the [device-agent reflector upgrade plan](../../../../../../.cursor/plans/device-agent-reflector-skills_d5599350.plan.md).
|
|
5
|
+
*
|
|
6
|
+
* The skill cache stores normalised action sequences keyed by (app, task
|
|
7
|
+
* summary). At task-entry time the {@link SkillMatcher} consults the
|
|
8
|
+
* cache; at task-exit time the {@link SkillEvolver} updates success /
|
|
9
|
+
* failure counters. Both layers depend only on this minimal type
|
|
10
|
+
* surface, which is also exercised by the unit tests via the in-memory
|
|
11
|
+
* implementation.
|
|
12
|
+
*/
|
|
13
|
+
import type { Action } from "@beeos-ai/device-common";
|
|
14
|
+
/**
|
|
15
|
+
* Normalised action sequence — the minimum the executor needs to
|
|
16
|
+
* replay a successful task. Coordinates and rationales are kept; ad-hoc
|
|
17
|
+
* `screenshot` / `wait` steps are stripped by the evolver before
|
|
18
|
+
* persistence so the replay budget stays small.
|
|
19
|
+
*/
|
|
20
|
+
export type SkillActionSequence = readonly Action[];
|
|
21
|
+
/**
|
|
22
|
+
* One persisted skill row.
|
|
23
|
+
*
|
|
24
|
+
* All numeric fields are stored as integers (epoch millis for
|
|
25
|
+
* timestamps). `taskEmbedding` is an optional dense vector — the
|
|
26
|
+
* matcher computes cosine similarity against the live task embedding.
|
|
27
|
+
* When the embedding model is unavailable we fall back to the
|
|
28
|
+
* deterministic hash bag-of-words producer in
|
|
29
|
+
* [embedding.ts](./embedding.ts), which is good enough for "same
|
|
30
|
+
* grocery-shopping task" recall.
|
|
31
|
+
*/
|
|
32
|
+
export interface Skill {
|
|
33
|
+
id: string;
|
|
34
|
+
appPackage: string;
|
|
35
|
+
taskSummary: string;
|
|
36
|
+
taskEmbedding?: Float32Array;
|
|
37
|
+
actionSequence: SkillActionSequence;
|
|
38
|
+
successCount: number;
|
|
39
|
+
failCount: number;
|
|
40
|
+
lastUsedAt: number;
|
|
41
|
+
createdAt: number;
|
|
42
|
+
}
|
|
43
|
+
/** Result of a similarity search. */
|
|
44
|
+
export interface SkillMatch {
|
|
45
|
+
skill: Skill;
|
|
46
|
+
/** cosine similarity in `[0, 1]`. */
|
|
47
|
+
score: number;
|
|
48
|
+
}
|
|
49
|
+
/** Read-only skill view returned by the CLI. Hides the raw embedding blob. */
|
|
50
|
+
export type SkillSummary = Omit<Skill, "taskEmbedding"> & {
|
|
51
|
+
successRate: number;
|
|
52
|
+
hasEmbedding: boolean;
|
|
53
|
+
};
|
|
54
|
+
export interface NewSkillInput {
|
|
55
|
+
appPackage: string;
|
|
56
|
+
taskSummary: string;
|
|
57
|
+
taskEmbedding?: Float32Array;
|
|
58
|
+
actionSequence: SkillActionSequence;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Storage abstraction for the skill cache. Implementations:
|
|
62
|
+
* - {@link FileSystemSkillCacheStore} — production directory layout at
|
|
63
|
+
* `~/.beeos/device-agent/skills/<appPackage>/<id>.json` with
|
|
64
|
+
* append-only `<id>.deltas.jsonl` counter logs (POSIX-atomic, lock-free).
|
|
65
|
+
* - {@link InMemorySkillCacheStore} — used by tests and any caller
|
|
66
|
+
* that wants ephemeral state.
|
|
67
|
+
*
|
|
68
|
+
* Methods are synchronous because the filesystem backend uses
|
|
69
|
+
* `fs.appendFileSync` / atomic tmp+rename — both are synchronous and
|
|
70
|
+
* we deliberately avoid leaking a Promise indirection through the
|
|
71
|
+
* loop's hot path. Concurrency across processes is handled by
|
|
72
|
+
* O_APPEND for ≤PIPE_BUF writes; no in-process locking is required.
|
|
73
|
+
*/
|
|
74
|
+
export interface SkillCacheStore {
|
|
75
|
+
/** Persist a brand-new skill row and return the id. */
|
|
76
|
+
insert(input: NewSkillInput): Skill;
|
|
77
|
+
/** Fetch a single skill by id (or undefined). */
|
|
78
|
+
get(id: string): Skill | undefined;
|
|
79
|
+
/** List all skills for one app package, newest first. */
|
|
80
|
+
listByApp(appPackage: string, limit?: number): Skill[];
|
|
81
|
+
/** List every skill (debug / CLI). */
|
|
82
|
+
listAll(limit?: number): Skill[];
|
|
83
|
+
/**
|
|
84
|
+
* Top-K cosine search restricted to the given app package. Skills
|
|
85
|
+
* without an embedding are skipped (caller may still call `listByApp`
|
|
86
|
+
* to consider them).
|
|
87
|
+
*/
|
|
88
|
+
search(appPackage: string, query: Float32Array, k: number): SkillMatch[];
|
|
89
|
+
/** Increment the success counter and bump `last_used_at`. */
|
|
90
|
+
recordSuccess(id: string, now?: number): void;
|
|
91
|
+
/** Increment the fail counter and bump `last_used_at`. */
|
|
92
|
+
recordFailure(id: string, now?: number): void;
|
|
93
|
+
/** Delete a single skill (CLI `forget`). */
|
|
94
|
+
delete(id: string): boolean;
|
|
95
|
+
/** Delete all skills (test reset / CLI `forget --all`). */
|
|
96
|
+
clear(): void;
|
|
97
|
+
/** Free underlying handles. Safe to call multiple times. */
|
|
98
|
+
close(): void;
|
|
99
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agent-runtime/skills/types — Skill memory shared types.
|
|
3
|
+
*
|
|
4
|
+
* Phase 3.1 of the [device-agent reflector upgrade plan](../../../../../../.cursor/plans/device-agent-reflector-skills_d5599350.plan.md).
|
|
5
|
+
*
|
|
6
|
+
* The skill cache stores normalised action sequences keyed by (app, task
|
|
7
|
+
* summary). At task-entry time the {@link SkillMatcher} consults the
|
|
8
|
+
* cache; at task-exit time the {@link SkillEvolver} updates success /
|
|
9
|
+
* failure counters. Both layers depend only on this minimal type
|
|
10
|
+
* surface, which is also exercised by the unit tests via the in-memory
|
|
11
|
+
* implementation.
|
|
12
|
+
*/
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/agent-runtime/skills/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
|
package/dist/agent.d.ts
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @deprecated since v0.3.0 — use `AgentRunner` from `agent-runtime/agent-runner.ts`
|
|
3
|
+
* (or the `AgentRunnerCore` adapter at `adapters/agentcore-runner.ts` for
|
|
4
|
+
* embedders that need an `IAgentCore`). This shim only exists so that
|
|
5
|
+
* `InnerLoopVlm`, the legacy `api.ts` HTTP debug server, and external
|
|
6
|
+
* test embedders keep working without changes — new call sites must NOT
|
|
7
|
+
* reach for this class.
|
|
8
|
+
*
|
|
9
|
+
* Migration sketch:
|
|
10
|
+
*
|
|
11
|
+
* ```typescript
|
|
12
|
+
* // Before (v0.2.x)
|
|
13
|
+
* const a = new Agent(modelClient, device);
|
|
14
|
+
* const r = await a.run(task, { onStep, signal });
|
|
15
|
+
*
|
|
16
|
+
* // After (v0.3.0+)
|
|
17
|
+
* const adapter = new OpenAIAdapter({ client: modelClient, lang: "cn" });
|
|
18
|
+
* const mcp = new InProcMcpClient(device);
|
|
19
|
+
* const runner = new AgentRunner({ task, env: "mobile", mcp, adapter });
|
|
20
|
+
* const r = await runner.run();
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* Legacy `Agent` — backwards-compatible shim around the new `AgentLoop`.
|
|
24
|
+
*
|
|
25
|
+
* Pre-monorepo this class hosted a hand-rolled screenshot → reason → act
|
|
26
|
+
* loop. The loop has now moved into `agent-runtime/core.AgentLoop`, which is
|
|
27
|
+
* Plan-Act-Reflect-aware, drives any `IMcpRuntime`, and wires every model
|
|
28
|
+
* through an `IModelAdapter`. This file keeps the original constructor
|
|
29
|
+
* signature, public methods, hook payload shapes, and termination strings so
|
|
30
|
+
* that `InnerLoopVlm`, `api.ts`, the `agent-hooks` test suite, and any
|
|
31
|
+
* external embedder continue to work without changes.
|
|
32
|
+
*
|
|
33
|
+
* Internally a fresh `AgentLoop` is constructed for each `run()` call. The
|
|
34
|
+
* device handed to the constructor is wrapped in `InProcMcpClient` (no HTTP
|
|
35
|
+
* hop), and the `ModelClient` is wrapped in `OpenAIAdapter` (the adapter
|
|
36
|
+
* that already translates legacy `ParsedAction` outputs onto the new unified
|
|
37
|
+
* `Action` schema, preserving coordinate-system metadata for AgentLoop's
|
|
38
|
+
* scaling layer).
|
|
39
|
+
*
|
|
40
|
+
* The shim is intentionally thin — anything new (waitForUser, reflection
|
|
41
|
+
* hooks, custom adapters, alternate envs) should go straight to `AgentLoop`
|
|
42
|
+
* (or `AgentRunner` for the Hybrid Plan-Act path).
|
|
43
|
+
*/
|
|
44
|
+
import type { Device } from "./device/base.js";
|
|
45
|
+
import type { ModelClient } from "./model/base.js";
|
|
46
|
+
export interface AgentConfig {
|
|
47
|
+
maxSteps?: number;
|
|
48
|
+
lang?: "cn" | "en";
|
|
49
|
+
verbose?: boolean;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Per-step record surfaced via `Agent.run`'s `onStep` hook. Kept stable so
|
|
53
|
+
* callers (notably `InnerLoopVlm`) can map directly onto the public
|
|
54
|
+
* `VlmStep` shape without re-deriving fields.
|
|
55
|
+
*/
|
|
56
|
+
export interface AgentStepRecord {
|
|
57
|
+
/** 1-based step index, matches `Agent.stepCount`. */
|
|
58
|
+
index: number;
|
|
59
|
+
/** Model thinking text for this step. */
|
|
60
|
+
thinking: string;
|
|
61
|
+
/** Parsed action (tool call) the model decided on. */
|
|
62
|
+
action: {
|
|
63
|
+
actionType: string;
|
|
64
|
+
params: Record<string, unknown>;
|
|
65
|
+
} | null;
|
|
66
|
+
/** True iff this step was the terminating step. */
|
|
67
|
+
finished: boolean;
|
|
68
|
+
/** Final user-facing message when `finished` is true. */
|
|
69
|
+
message: string | null;
|
|
70
|
+
}
|
|
71
|
+
/** Optional progress callbacks for `Agent.run`. */
|
|
72
|
+
export interface AgentRunHooks {
|
|
73
|
+
/** Streaming token delta from the underlying model. */
|
|
74
|
+
onText?: (delta: string) => void | Promise<void>;
|
|
75
|
+
/** Fired exactly once per step after the action has been parsed. */
|
|
76
|
+
onStep?: (step: AgentStepRecord) => void | Promise<void>;
|
|
77
|
+
}
|
|
78
|
+
export interface AgentRunOptions extends AgentRunHooks {
|
|
79
|
+
signal?: AbortSignal;
|
|
80
|
+
/**
|
|
81
|
+
* Per-call override of `AgentConfig.maxSteps`. When omitted the value
|
|
82
|
+
* passed to the constructor is used.
|
|
83
|
+
*/
|
|
84
|
+
maxSteps?: number;
|
|
85
|
+
}
|
|
86
|
+
export interface AgentRunResult {
|
|
87
|
+
/** Final user-facing message, identical to the legacy `string` return. */
|
|
88
|
+
finalText: string;
|
|
89
|
+
/** Number of `executeStep` invocations (1-based count). */
|
|
90
|
+
steps: number;
|
|
91
|
+
/** True iff the run terminated due to abort. */
|
|
92
|
+
cancelled: boolean;
|
|
93
|
+
}
|
|
94
|
+
/** @deprecated since v0.3.0 — use `AgentRunner` instead. */
|
|
95
|
+
export declare class Agent {
|
|
96
|
+
private readonly modelClient;
|
|
97
|
+
private readonly cfg;
|
|
98
|
+
private readonly mcp;
|
|
99
|
+
private readonly adapter;
|
|
100
|
+
constructor(modelClient: ModelClient, device: Device, config?: AgentConfig);
|
|
101
|
+
run(task: string, opts?: AgentRunOptions): Promise<AgentRunResult>;
|
|
102
|
+
/**
|
|
103
|
+
* Legacy hook — clears any rolling adapter context so the next `run()`
|
|
104
|
+
* starts fresh. The new `AgentLoop` already isolates state per run, so
|
|
105
|
+
* this only matters if callers reach into the adapter directly.
|
|
106
|
+
*/
|
|
107
|
+
reset(): void;
|
|
108
|
+
/** Internal — kept for backwards compatibility with embedders that peek. */
|
|
109
|
+
get model(): ModelClient;
|
|
110
|
+
}
|