@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,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agent-runtime/reflectors/trajectory-reflector — periodic global progress
|
|
3
|
+
* assessment.
|
|
4
|
+
*
|
|
5
|
+
* Phase 2.2 of the device-agent reflector upgrade plan
|
|
6
|
+
* ([../../../../../../.cursor/plans/device-agent-reflector-skills_d5599350.plan.md]).
|
|
7
|
+
*
|
|
8
|
+
* Where the {@link IActionReflector} (Phase 1.4) is *step-local* — does THIS
|
|
9
|
+
* one prediction look right? — the trajectory reflector is *task-global*:
|
|
10
|
+
* every N steps it inspects the rolling history + accumulated notes + the
|
|
11
|
+
* current goal and decides whether the agent is making progress, drifting
|
|
12
|
+
* onto a wrong sub-task, or stuck altogether.
|
|
13
|
+
*
|
|
14
|
+
* The default {@link LLMTrajectoryReflector} talks to a cheap text-only
|
|
15
|
+
* chat model (`glm-4-flash` by default, the same family the planner uses)
|
|
16
|
+
* and emits a strict `{ verdict, reason, suggestion? }` JSON payload.
|
|
17
|
+
*
|
|
18
|
+
* Cost model:
|
|
19
|
+
* - One ~600-1000 input token / ≤80 output token request per N steps.
|
|
20
|
+
* With N=5 and a 30-step task budget that's ≤ 6 calls / task, ~ ¥0.001
|
|
21
|
+
* in incremental cost.
|
|
22
|
+
* - Reflector failures are non-fatal: a transient 5xx logs a warning and
|
|
23
|
+
* returns `verdict: "on_track"` so the executor keeps going.
|
|
24
|
+
*/
|
|
25
|
+
import OpenAI from "openai";
|
|
26
|
+
import { getLogger } from "../../logger/index.js";
|
|
27
|
+
const DEFAULT_MODEL = "glm-4-flash";
|
|
28
|
+
const DEFAULT_EVERY_N = 5;
|
|
29
|
+
const HISTORY_TAIL = 10;
|
|
30
|
+
const STR_MAX = 240;
|
|
31
|
+
export class LLMTrajectoryReflector {
|
|
32
|
+
name = "llm-trajectory-reflector";
|
|
33
|
+
client;
|
|
34
|
+
modelName;
|
|
35
|
+
everyNSteps;
|
|
36
|
+
maxTokens;
|
|
37
|
+
temperature;
|
|
38
|
+
constructor(opts = {}) {
|
|
39
|
+
this.modelName =
|
|
40
|
+
opts.modelName ?? process.env.TRAJECTORY_REFLECTOR_MODEL ?? DEFAULT_MODEL;
|
|
41
|
+
const fromEnv = readInt(process.env.TRAJECTORY_REFLECTOR_EVERY_N, NaN);
|
|
42
|
+
this.everyNSteps = Math.max(1, opts.everyNSteps ?? (Number.isFinite(fromEnv) ? fromEnv : DEFAULT_EVERY_N));
|
|
43
|
+
this.maxTokens = opts.maxTokens ?? 160;
|
|
44
|
+
this.temperature = opts.temperature ?? 0;
|
|
45
|
+
const baseUrl = opts.baseUrl ??
|
|
46
|
+
process.env.TRAJECTORY_REFLECTOR_BASE_URL ??
|
|
47
|
+
process.env.PLANNER_BASE_URL ??
|
|
48
|
+
process.env.GUI_AGENT_BASE_URL ??
|
|
49
|
+
"https://api.openai.com/v1";
|
|
50
|
+
const apiKey = opts.apiKey ??
|
|
51
|
+
process.env.TRAJECTORY_REFLECTOR_API_KEY ??
|
|
52
|
+
process.env.PLANNER_API_KEY ??
|
|
53
|
+
process.env.GUI_AGENT_API_KEY ??
|
|
54
|
+
"EMPTY";
|
|
55
|
+
this.client =
|
|
56
|
+
opts.client ?? new OpenAI({ baseURL: baseUrl, apiKey, timeout: 30_000, maxRetries: 1 });
|
|
57
|
+
}
|
|
58
|
+
shouldReflect(step, history) {
|
|
59
|
+
if (step <= 0)
|
|
60
|
+
return false;
|
|
61
|
+
if (step % this.everyNSteps !== 0)
|
|
62
|
+
return false;
|
|
63
|
+
// No need to fire when there is essentially no signal yet.
|
|
64
|
+
if (history.length === 0)
|
|
65
|
+
return false;
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
async reflect(ctx, signal) {
|
|
69
|
+
const startedAt = Date.now();
|
|
70
|
+
const messages = [
|
|
71
|
+
{ role: "system", content: SYSTEM_PROMPT },
|
|
72
|
+
{ role: "user", content: renderUserPrompt(ctx) },
|
|
73
|
+
];
|
|
74
|
+
try {
|
|
75
|
+
const resp = await this.client.chat.completions.create({
|
|
76
|
+
model: this.modelName,
|
|
77
|
+
messages,
|
|
78
|
+
temperature: this.temperature,
|
|
79
|
+
max_tokens: this.maxTokens,
|
|
80
|
+
response_format: { type: "json_object" },
|
|
81
|
+
}, { signal });
|
|
82
|
+
const raw = resp.choices?.[0]?.message?.content ?? "";
|
|
83
|
+
const usage = {
|
|
84
|
+
inputTokens: resp.usage?.prompt_tokens ?? 0,
|
|
85
|
+
outputTokens: resp.usage?.completion_tokens ?? 0,
|
|
86
|
+
durationMs: Date.now() - startedAt,
|
|
87
|
+
costUsd: estimateCostUsd(this.modelName, resp.usage?.prompt_tokens ?? 0, resp.usage?.completion_tokens ?? 0),
|
|
88
|
+
};
|
|
89
|
+
const parsed = parseVerdict(raw);
|
|
90
|
+
return { ...parsed, usage };
|
|
91
|
+
}
|
|
92
|
+
catch (e) {
|
|
93
|
+
// Reflector failures must NOT abort the run — log and pass.
|
|
94
|
+
getLogger().warn({ component: "trajectory-reflector", err: errMsg(e) }, "trajectory-reflector.failed");
|
|
95
|
+
return {
|
|
96
|
+
verdict: "on_track",
|
|
97
|
+
reason: `trajectory reflector unavailable: ${errMsg(e)}`,
|
|
98
|
+
usage: {
|
|
99
|
+
inputTokens: 0,
|
|
100
|
+
outputTokens: 0,
|
|
101
|
+
durationMs: Date.now() - startedAt,
|
|
102
|
+
costUsd: 0,
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/* -------------------------------------------------------------------------- */
|
|
109
|
+
/* Prompts */
|
|
110
|
+
/* -------------------------------------------------------------------------- */
|
|
111
|
+
const SYSTEM_PROMPT = `You are the trajectory reviewer of a mobile-agent run.
|
|
112
|
+
Every few steps you inspect the goal, the rolling step history, any notes the
|
|
113
|
+
agent took mid-run, and the latest screen summary, and you classify the
|
|
114
|
+
trajectory:
|
|
115
|
+
|
|
116
|
+
- "on_track" — clear progress toward the goal, keep going.
|
|
117
|
+
- "off_track" — drifting onto a wrong sub-goal / wrong app / wrong screen.
|
|
118
|
+
Recoverable; the executor should re-plan.
|
|
119
|
+
- "stuck" — repeated failures or no observable progress for several steps.
|
|
120
|
+
The executor MUST replan or escalate.
|
|
121
|
+
|
|
122
|
+
Output STRICT JSON:
|
|
123
|
+
{"verdict": "on_track" | "off_track" | "stuck",
|
|
124
|
+
"reason": "<<=200 chars>",
|
|
125
|
+
"suggestion": "<concrete next step, optional>"}
|
|
126
|
+
|
|
127
|
+
Be conservative — only flag off_track / stuck when the evidence is clear.
|
|
128
|
+
Empty notes / sparse history is normal early on; that alone is not stuck.`;
|
|
129
|
+
function renderUserPrompt(ctx) {
|
|
130
|
+
const tail = ctx.history.slice(-HISTORY_TAIL).map((h) => ({
|
|
131
|
+
step: h.stepIdx,
|
|
132
|
+
action: h.action ? actionToOneLiner(h.action) : null,
|
|
133
|
+
rationale: truncate(h.rationale, STR_MAX),
|
|
134
|
+
actionResult: h.actionResult ?? null,
|
|
135
|
+
actError: h.actErrorMessage ?? null,
|
|
136
|
+
obsSummary: truncate(h.observationSummary, STR_MAX),
|
|
137
|
+
}));
|
|
138
|
+
return JSON.stringify({
|
|
139
|
+
goal: truncate(ctx.goal, STR_MAX * 2),
|
|
140
|
+
stepCounter: ctx.step,
|
|
141
|
+
maxSteps: ctx.maxSteps,
|
|
142
|
+
recentHistory: tail,
|
|
143
|
+
notes: ctx.notes.slice(-8).map((n) => truncate(n, STR_MAX)),
|
|
144
|
+
latestScreenSummary: truncate(ctx.observationSummary, STR_MAX),
|
|
145
|
+
}, null, 2);
|
|
146
|
+
}
|
|
147
|
+
function actionToOneLiner(a) {
|
|
148
|
+
const target = a.target ? ` ${JSON.stringify(a.target)}` : "";
|
|
149
|
+
const payload = a.payload && Object.keys(a.payload).length > 0 ? ` ${JSON.stringify(a.payload)}` : "";
|
|
150
|
+
return `${a.type}${target}${payload}`;
|
|
151
|
+
}
|
|
152
|
+
function truncate(s, max) {
|
|
153
|
+
if (!s)
|
|
154
|
+
return "";
|
|
155
|
+
return s.length > max ? `${s.slice(0, max - 1)}…` : s;
|
|
156
|
+
}
|
|
157
|
+
/* -------------------------------------------------------------------------- */
|
|
158
|
+
/* Verdict parsing */
|
|
159
|
+
/* -------------------------------------------------------------------------- */
|
|
160
|
+
function parseVerdict(raw) {
|
|
161
|
+
if (!raw)
|
|
162
|
+
return { verdict: "on_track", reason: "empty trajectory response" };
|
|
163
|
+
try {
|
|
164
|
+
const obj = JSON.parse(raw);
|
|
165
|
+
if (obj && typeof obj === "object") {
|
|
166
|
+
const verdict = normaliseVerdict(obj.verdict);
|
|
167
|
+
const reason = typeof obj.reason === "string"
|
|
168
|
+
? obj.reason.trim()
|
|
169
|
+
: "";
|
|
170
|
+
const suggestion = typeof obj.suggestion === "string"
|
|
171
|
+
? obj.suggestion.trim()
|
|
172
|
+
: undefined;
|
|
173
|
+
return {
|
|
174
|
+
verdict,
|
|
175
|
+
reason: reason || (verdict === "on_track" ? "ok" : "trajectory flagged"),
|
|
176
|
+
suggestion: suggestion && suggestion.length > 0 ? suggestion : undefined,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
/* fall through */
|
|
182
|
+
}
|
|
183
|
+
return {
|
|
184
|
+
verdict: "on_track",
|
|
185
|
+
reason: `unparseable trajectory response: ${truncate(raw, 80)}`,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
function normaliseVerdict(v) {
|
|
189
|
+
if (typeof v !== "string")
|
|
190
|
+
return "on_track";
|
|
191
|
+
const norm = v.trim().toLowerCase();
|
|
192
|
+
if (norm === "off_track" || norm === "off-track" || norm === "drift")
|
|
193
|
+
return "off_track";
|
|
194
|
+
if (norm === "stuck" || norm === "stalled")
|
|
195
|
+
return "stuck";
|
|
196
|
+
return "on_track";
|
|
197
|
+
}
|
|
198
|
+
const PRICING_PER_KTOK_USD = {
|
|
199
|
+
"glm-4-flash": { input: 0.0001, output: 0.0001 },
|
|
200
|
+
"glm-4-air": { input: 0.0014, output: 0.0014 },
|
|
201
|
+
"glm-4-plus": { input: 0.007, output: 0.007 },
|
|
202
|
+
};
|
|
203
|
+
function estimateCostUsd(model, inputTokens, outputTokens) {
|
|
204
|
+
const p = PRICING_PER_KTOK_USD[model.toLowerCase()];
|
|
205
|
+
if (!p)
|
|
206
|
+
return 0;
|
|
207
|
+
return (inputTokens / 1000) * p.input + (outputTokens / 1000) * p.output;
|
|
208
|
+
}
|
|
209
|
+
/* -------------------------------------------------------------------------- */
|
|
210
|
+
/* Misc helpers */
|
|
211
|
+
/* -------------------------------------------------------------------------- */
|
|
212
|
+
function readInt(raw, fallback) {
|
|
213
|
+
if (!raw)
|
|
214
|
+
return fallback;
|
|
215
|
+
const n = Number(raw);
|
|
216
|
+
return Number.isFinite(n) ? Math.floor(n) : fallback;
|
|
217
|
+
}
|
|
218
|
+
function errMsg(e) {
|
|
219
|
+
if (e instanceof Error)
|
|
220
|
+
return e.message;
|
|
221
|
+
return String(e);
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=trajectory-reflector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trajectory-reflector.js","sourceRoot":"","sources":["../../../src/agent-runtime/reflectors/trajectory-reflector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agent-runtime/skills/embedding — task-summary → dense vector helpers.
|
|
3
|
+
*
|
|
4
|
+
* Phase 3.1 of the [device-agent reflector upgrade plan](../../../../../../.cursor/plans/device-agent-reflector-skills_d5599350.plan.md).
|
|
5
|
+
*
|
|
6
|
+
* The plan calls for "glm-4-flash embedding endpoint OR hash
|
|
7
|
+
* bag-of-words". We default to the deterministic hash producer because:
|
|
8
|
+
*
|
|
9
|
+
* - it has zero external deps and zero token cost,
|
|
10
|
+
* - it gives reasonable recall on the "same task wording" case (which
|
|
11
|
+
* is exactly what the cache hits on),
|
|
12
|
+
* - it lets unit tests run hermetically without an OpenAI client,
|
|
13
|
+
* - it can always be swapped out with an `EmbeddingProvider` plug-in
|
|
14
|
+
* later (the matcher only needs `Float32Array` of a fixed size).
|
|
15
|
+
*
|
|
16
|
+
* The vector dimension matches the SQL schema — Phase 3.1 picks 256.
|
|
17
|
+
*/
|
|
18
|
+
export declare const DEFAULT_EMBEDDING_DIM = 256;
|
|
19
|
+
/**
|
|
20
|
+
* Provider that turns a string into a fixed-length dense vector.
|
|
21
|
+
* Implementations may be sync (hash) or async (LLM endpoint). The
|
|
22
|
+
* matcher only invokes embed once per task, so an async hop is fine.
|
|
23
|
+
*/
|
|
24
|
+
export interface EmbeddingProvider {
|
|
25
|
+
readonly dim: number;
|
|
26
|
+
embed(text: string): Promise<Float32Array> | Float32Array;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Hash bag-of-words — fnv1a-32 per token, mod-projected onto a fixed
|
|
30
|
+
* dimension, L2-normalised. Same input yields the same vector across
|
|
31
|
+
* processes, which makes the cache deterministic.
|
|
32
|
+
*/
|
|
33
|
+
export declare class HashEmbeddingProvider implements EmbeddingProvider {
|
|
34
|
+
readonly dim: number;
|
|
35
|
+
constructor(dim?: number);
|
|
36
|
+
embed(text: string): Float32Array;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Cosine similarity in `[-1, 1]`. Returns 0 when either vector is the
|
|
40
|
+
* zero vector. Inputs are expected to share the same dimension; mixed
|
|
41
|
+
* dims throw.
|
|
42
|
+
*/
|
|
43
|
+
export declare function cosine(a: Float32Array, b: Float32Array): number;
|
|
44
|
+
/**
|
|
45
|
+
* Encode a Float32Array to a Buffer (raw little-endian Float32 layout).
|
|
46
|
+
* Re-exported because the filesystem store base64-encodes this Buffer
|
|
47
|
+
* into the per-skill JSON file; bench / migration tooling can use it
|
|
48
|
+
* directly. The dimension is recovered from `buffer.byteLength / 4` on
|
|
49
|
+
* read.
|
|
50
|
+
*/
|
|
51
|
+
export declare function embeddingToBuffer(v: Float32Array): Buffer;
|
|
52
|
+
/** Decode a Buffer back into a Float32Array (zero-copy when aligned). */
|
|
53
|
+
export declare function bufferToEmbedding(buf: Buffer): Float32Array;
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agent-runtime/skills/embedding — task-summary → dense vector helpers.
|
|
3
|
+
*
|
|
4
|
+
* Phase 3.1 of the [device-agent reflector upgrade plan](../../../../../../.cursor/plans/device-agent-reflector-skills_d5599350.plan.md).
|
|
5
|
+
*
|
|
6
|
+
* The plan calls for "glm-4-flash embedding endpoint OR hash
|
|
7
|
+
* bag-of-words". We default to the deterministic hash producer because:
|
|
8
|
+
*
|
|
9
|
+
* - it has zero external deps and zero token cost,
|
|
10
|
+
* - it gives reasonable recall on the "same task wording" case (which
|
|
11
|
+
* is exactly what the cache hits on),
|
|
12
|
+
* - it lets unit tests run hermetically without an OpenAI client,
|
|
13
|
+
* - it can always be swapped out with an `EmbeddingProvider` plug-in
|
|
14
|
+
* later (the matcher only needs `Float32Array` of a fixed size).
|
|
15
|
+
*
|
|
16
|
+
* The vector dimension matches the SQL schema — Phase 3.1 picks 256.
|
|
17
|
+
*/
|
|
18
|
+
export const DEFAULT_EMBEDDING_DIM = 256;
|
|
19
|
+
/**
|
|
20
|
+
* Hash bag-of-words — fnv1a-32 per token, mod-projected onto a fixed
|
|
21
|
+
* dimension, L2-normalised. Same input yields the same vector across
|
|
22
|
+
* processes, which makes the cache deterministic.
|
|
23
|
+
*/
|
|
24
|
+
export class HashEmbeddingProvider {
|
|
25
|
+
dim;
|
|
26
|
+
constructor(dim = DEFAULT_EMBEDDING_DIM) {
|
|
27
|
+
this.dim = dim;
|
|
28
|
+
}
|
|
29
|
+
embed(text) {
|
|
30
|
+
const v = new Float32Array(this.dim);
|
|
31
|
+
if (!text)
|
|
32
|
+
return v;
|
|
33
|
+
const tokens = tokenize(text);
|
|
34
|
+
for (const tok of tokens) {
|
|
35
|
+
const h = fnv1a32(tok);
|
|
36
|
+
const idx = h % this.dim;
|
|
37
|
+
// Sign bit picks +1 / -1 so unrelated tokens don't all just add.
|
|
38
|
+
const sign = (h >>> 31) === 0 ? 1 : -1;
|
|
39
|
+
v[idx] += sign;
|
|
40
|
+
}
|
|
41
|
+
return l2Normalise(v);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Cosine similarity in `[-1, 1]`. Returns 0 when either vector is the
|
|
46
|
+
* zero vector. Inputs are expected to share the same dimension; mixed
|
|
47
|
+
* dims throw.
|
|
48
|
+
*/
|
|
49
|
+
export function cosine(a, b) {
|
|
50
|
+
if (a.length !== b.length) {
|
|
51
|
+
throw new Error(`cosine: length mismatch ${a.length} vs ${b.length}`);
|
|
52
|
+
}
|
|
53
|
+
let dot = 0;
|
|
54
|
+
let aa = 0;
|
|
55
|
+
let bb = 0;
|
|
56
|
+
for (let i = 0; i < a.length; i++) {
|
|
57
|
+
const ax = a[i];
|
|
58
|
+
const bx = b[i];
|
|
59
|
+
dot += ax * bx;
|
|
60
|
+
aa += ax * ax;
|
|
61
|
+
bb += bx * bx;
|
|
62
|
+
}
|
|
63
|
+
if (aa === 0 || bb === 0)
|
|
64
|
+
return 0;
|
|
65
|
+
return dot / Math.sqrt(aa * bb);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Encode a Float32Array to a Buffer (raw little-endian Float32 layout).
|
|
69
|
+
* Re-exported because the filesystem store base64-encodes this Buffer
|
|
70
|
+
* into the per-skill JSON file; bench / migration tooling can use it
|
|
71
|
+
* directly. The dimension is recovered from `buffer.byteLength / 4` on
|
|
72
|
+
* read.
|
|
73
|
+
*/
|
|
74
|
+
export function embeddingToBuffer(v) {
|
|
75
|
+
return Buffer.from(v.buffer, v.byteOffset, v.byteLength);
|
|
76
|
+
}
|
|
77
|
+
/** Decode a Buffer back into a Float32Array (zero-copy when aligned). */
|
|
78
|
+
export function bufferToEmbedding(buf) {
|
|
79
|
+
// Buffer's underlying ArrayBuffer can be a slice — copy out so callers
|
|
80
|
+
// can hold the typed array beyond the buffer's lifetime.
|
|
81
|
+
const view = new Float32Array(buf.byteLength / 4);
|
|
82
|
+
for (let i = 0; i < view.length; i++) {
|
|
83
|
+
view[i] = buf.readFloatLE(i * 4);
|
|
84
|
+
}
|
|
85
|
+
return view;
|
|
86
|
+
}
|
|
87
|
+
/* -------------------------------------------------------------------------- */
|
|
88
|
+
/* internals */
|
|
89
|
+
/* -------------------------------------------------------------------------- */
|
|
90
|
+
function tokenize(text) {
|
|
91
|
+
// Whitespace tokens for ASCII / Latin scripts + per-character tokens for
|
|
92
|
+
// CJK (where there's no whitespace between glyphs). This is deliberately
|
|
93
|
+
// dumb — we only need enough recall to match "buy chicken" against
|
|
94
|
+
// "purchase chicken" or "买鸡" against "买只鸡".
|
|
95
|
+
const tokens = [];
|
|
96
|
+
for (const word of text.toLowerCase().split(/[^\p{L}\p{N}]+/u)) {
|
|
97
|
+
if (!word)
|
|
98
|
+
continue;
|
|
99
|
+
if (/[\u3400-\u9fff]/.test(word)) {
|
|
100
|
+
// CJK — emit each character + the bigrams to capture local order.
|
|
101
|
+
const chars = [...word];
|
|
102
|
+
for (const ch of chars)
|
|
103
|
+
tokens.push(ch);
|
|
104
|
+
for (let i = 0; i + 1 < chars.length; i++) {
|
|
105
|
+
tokens.push(chars[i] + chars[i + 1]);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
tokens.push(word);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return tokens;
|
|
113
|
+
}
|
|
114
|
+
function fnv1a32(s) {
|
|
115
|
+
let h = 0x811c9dc5;
|
|
116
|
+
for (let i = 0; i < s.length; i++) {
|
|
117
|
+
h ^= s.charCodeAt(i);
|
|
118
|
+
// 32-bit FNV prime multiplication.
|
|
119
|
+
h = (h + ((h << 1) + (h << 4) + (h << 7) + (h << 8) + (h << 24))) >>> 0;
|
|
120
|
+
}
|
|
121
|
+
return h >>> 0;
|
|
122
|
+
}
|
|
123
|
+
function l2Normalise(v) {
|
|
124
|
+
let sum = 0;
|
|
125
|
+
for (let i = 0; i < v.length; i++)
|
|
126
|
+
sum += v[i] * v[i];
|
|
127
|
+
if (sum === 0)
|
|
128
|
+
return v;
|
|
129
|
+
const inv = 1 / Math.sqrt(sum);
|
|
130
|
+
for (let i = 0; i < v.length; i++)
|
|
131
|
+
v[i] *= inv;
|
|
132
|
+
return v;
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=embedding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding.js","sourceRoot":"","sources":["../../../src/agent-runtime/skills/embedding.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agent-runtime/skills/fs-store — FileSystem-backed
|
|
3
|
+
* {@link SkillCacheStore}.
|
|
4
|
+
*
|
|
5
|
+
* Layout:
|
|
6
|
+
* ```
|
|
7
|
+
* <root>/
|
|
8
|
+
* ├── _meta/
|
|
9
|
+
* │ └── version # plain text "1"
|
|
10
|
+
* ├── com.tencent.mm/
|
|
11
|
+
* │ ├── 8dc7bafa-...-e58122.json # main record (atomic tmp+rename)
|
|
12
|
+
* │ └── 8dc7bafa-...-e58122.deltas.jsonl # append-only counter log
|
|
13
|
+
* └── com.xunmeng.pinduoduo/
|
|
14
|
+
* └── ...
|
|
15
|
+
* ```
|
|
16
|
+
*
|
|
17
|
+
* The default root is `~/.beeos/device-agent/skills/`. Cloud
|
|
18
|
+
* deployments mount a `ReadWriteMany` PVC at `$HOME/.beeos` so multiple
|
|
19
|
+
* pods see one shared cache; on a developer laptop / EdgeAgent host the
|
|
20
|
+
* directory is just a local folder, naturally shared by every
|
|
21
|
+
* `device-agent` process running on that machine.
|
|
22
|
+
*
|
|
23
|
+
* Counter atomicity relies on POSIX O_APPEND semantics: each
|
|
24
|
+
* `recordSuccess` / `recordFailure` writes a single ≤30-byte line via
|
|
25
|
+
* `fs.appendFileSync`, which the kernel guarantees to be atomic across
|
|
26
|
+
* processes (line ≤ PIPE_BUF). When `deltas.jsonl` exceeds
|
|
27
|
+
* `compactThresholdBytes` (default 4 KB) the next writer folds the
|
|
28
|
+
* accumulated deltas into the main JSON via tmp+rename and truncates
|
|
29
|
+
* the deltas file. Read paths always fold the live deltas plus any
|
|
30
|
+
* orphaned `*.compacting` files left by a crashed writer.
|
|
31
|
+
*
|
|
32
|
+
* The schema is intentionally diff-friendly (one self-contained JSON
|
|
33
|
+
* per skill, base64-encoded embedding) so users can inspect / git-track
|
|
34
|
+
* / rsync the cache directly.
|
|
35
|
+
*/
|
|
36
|
+
import type { NewSkillInput, Skill, SkillCacheStore, SkillMatch } from "./types.js";
|
|
37
|
+
export interface FileSystemSkillCacheStoreOptions {
|
|
38
|
+
/**
|
|
39
|
+
* Root directory under which the per-app subfolders live. Defaults
|
|
40
|
+
* to `~/.beeos/device-agent/skills/`.
|
|
41
|
+
*/
|
|
42
|
+
root?: string;
|
|
43
|
+
/**
|
|
44
|
+
* Skip the auto-mkdir step on construction. Tests typically pass a
|
|
45
|
+
* pre-existing tmp dir.
|
|
46
|
+
*/
|
|
47
|
+
noMkdir?: boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Override the compaction trigger size. Tests use a small value
|
|
50
|
+
* (e.g. 256 bytes) to exercise compaction; production keeps the
|
|
51
|
+
* default to stay below PIPE_BUF.
|
|
52
|
+
*/
|
|
53
|
+
compactThresholdBytes?: number;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Default cache root: `~/.beeos/device-agent/skills/` unless
|
|
57
|
+
* `SKILL_CACHE_PATH` overrides it. Returns a directory path (the
|
|
58
|
+
* legacy SQLite store returned a `.sqlite` *file*; the new layout is
|
|
59
|
+
* directory-based).
|
|
60
|
+
*/
|
|
61
|
+
export declare function defaultSkillCachePath(): string;
|
|
62
|
+
export declare class FileSystemSkillCacheStore implements SkillCacheStore {
|
|
63
|
+
private readonly root;
|
|
64
|
+
private readonly compactThreshold;
|
|
65
|
+
constructor(opts?: FileSystemSkillCacheStoreOptions);
|
|
66
|
+
insert(input: NewSkillInput): Skill;
|
|
67
|
+
get(id: string): Skill | undefined;
|
|
68
|
+
listByApp(appPackage: string, limit?: number): Skill[];
|
|
69
|
+
listAll(limit?: number): Skill[];
|
|
70
|
+
search(appPackage: string, query: Float32Array, k: number): SkillMatch[];
|
|
71
|
+
recordSuccess(id: string, now?: number): void;
|
|
72
|
+
recordFailure(id: string, now?: number): void;
|
|
73
|
+
delete(id: string): boolean;
|
|
74
|
+
clear(): void;
|
|
75
|
+
close(): void;
|
|
76
|
+
private writeVersionIfMissing;
|
|
77
|
+
private appDir;
|
|
78
|
+
private skillJsonPath;
|
|
79
|
+
private skillDeltasPath;
|
|
80
|
+
private appDirs;
|
|
81
|
+
private skillIdsIn;
|
|
82
|
+
private locate;
|
|
83
|
+
private readSkill;
|
|
84
|
+
private foldDeltaFiles;
|
|
85
|
+
private findCompacting;
|
|
86
|
+
private appendDelta;
|
|
87
|
+
private maybeCompact;
|
|
88
|
+
}
|