@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,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Application use case — DeviceManager.
|
|
3
|
+
*
|
|
4
|
+
* MVP keeps a single active IDevice (parity with the Python agent which is
|
|
5
|
+
* 1 device = 1 process). The class is structured to support multi-device
|
|
6
|
+
* fan-out later — the inbound layer never has to be rewritten when that day
|
|
7
|
+
* comes.
|
|
8
|
+
*/
|
|
9
|
+
export class DeviceManager {
|
|
10
|
+
devices = new Map();
|
|
11
|
+
activeId = null;
|
|
12
|
+
/** Register and connect a device. Returns the canonical id used. */
|
|
13
|
+
async register(device, id) {
|
|
14
|
+
await device.connect();
|
|
15
|
+
const info = await device.getInfo().catch(() => undefined);
|
|
16
|
+
const finalId = id ?? info?.name ?? "default";
|
|
17
|
+
const reg = { id: finalId, device, info };
|
|
18
|
+
this.devices.set(finalId, reg);
|
|
19
|
+
if (!this.activeId)
|
|
20
|
+
this.activeId = finalId;
|
|
21
|
+
return reg;
|
|
22
|
+
}
|
|
23
|
+
list() {
|
|
24
|
+
return Array.from(this.devices.values());
|
|
25
|
+
}
|
|
26
|
+
get(id) {
|
|
27
|
+
return this.devices.get(id ?? this.activeId ?? "");
|
|
28
|
+
}
|
|
29
|
+
active() {
|
|
30
|
+
const reg = this.get();
|
|
31
|
+
if (!reg)
|
|
32
|
+
throw new Error("No active device — register one first.");
|
|
33
|
+
return reg.device;
|
|
34
|
+
}
|
|
35
|
+
setActive(id) {
|
|
36
|
+
if (!this.devices.has(id))
|
|
37
|
+
throw new Error(`Unknown device id: ${id}`);
|
|
38
|
+
this.activeId = id;
|
|
39
|
+
}
|
|
40
|
+
async disconnectAll() {
|
|
41
|
+
for (const r of this.devices.values()) {
|
|
42
|
+
try {
|
|
43
|
+
await r.device.disconnect();
|
|
44
|
+
}
|
|
45
|
+
catch { /* ignore */ }
|
|
46
|
+
}
|
|
47
|
+
this.devices.clear();
|
|
48
|
+
this.activeId = null;
|
|
49
|
+
}
|
|
50
|
+
/** Quick liveness probe; returns true iff device.getInfo() resolves. */
|
|
51
|
+
async healthCheck(id) {
|
|
52
|
+
const reg = this.get(id);
|
|
53
|
+
if (!reg)
|
|
54
|
+
return false;
|
|
55
|
+
try {
|
|
56
|
+
reg.info = await reg.device.getInfo();
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=device-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device-manager.js","sourceRoot":"","sources":["../../src/app/device-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAWH,MAAM,OAAO,aAAa;IACP,OAAO,GAAG,IAAI,GAAG,EAA8B,CAAC;IACzD,QAAQ,GAAkB,IAAI,CAAC;IAEvC,oEAAoE;IACpE,KAAK,CAAC,QAAQ,CAAC,MAAe,EAAE,EAAW;QACzC,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC3D,MAAM,OAAO,GAAG,EAAE,IAAI,IAAI,EAAE,IAAI,IAAI,SAAS,CAAC;QAC9C,MAAM,GAAG,GAAuB,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAC9D,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QAC5C,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,GAAG,CAAC,EAAW;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,MAAM;QACJ,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QACpE,OAAO,GAAG,CAAC,MAAM,CAAC;IACpB,CAAC;IAED,SAAS,CAAC,EAAU;QAClB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC;QACvE,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YACtC,IAAI,CAAC;gBAAC,MAAM,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACvB,CAAC;IAED,wEAAwE;IACxE,KAAK,CAAC,WAAW,CAAC,EAAW;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACzB,IAAI,CAAC,GAAG;YAAE,OAAO,KAAK,CAAC;QACvB,IAAI,CAAC;YACH,GAAG,CAAC,IAAI,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory MessageStore.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the surface of the Python `MessageStore` (`add_message`,
|
|
5
|
+
* `get_messages_as_dicts`, `list_sessions`, etc.) so the ACP handlers stay
|
|
6
|
+
* byte-for-byte compatible. Persistence is left out of the MVP; `~/.beeos`
|
|
7
|
+
* SQLite can be re-added later behind the same interface (pluggable adapter).
|
|
8
|
+
*/
|
|
9
|
+
export interface StoredMessage {
|
|
10
|
+
id: string;
|
|
11
|
+
sessionId: string;
|
|
12
|
+
role: "user" | "assistant" | "system" | "tool";
|
|
13
|
+
content: string;
|
|
14
|
+
messageType: "text" | "tool_call" | "tool_result" | "status";
|
|
15
|
+
metadata: Record<string, unknown>;
|
|
16
|
+
createdAt: number;
|
|
17
|
+
}
|
|
18
|
+
export interface SessionRecord {
|
|
19
|
+
sessionId: string;
|
|
20
|
+
title: string;
|
|
21
|
+
createdAt: number;
|
|
22
|
+
updatedAt: number;
|
|
23
|
+
}
|
|
24
|
+
export interface MessageHistoryEntry {
|
|
25
|
+
role: string;
|
|
26
|
+
content: string;
|
|
27
|
+
type: string;
|
|
28
|
+
createdAt: number;
|
|
29
|
+
metadata?: Record<string, unknown>;
|
|
30
|
+
}
|
|
31
|
+
export declare class MessageStore {
|
|
32
|
+
private readonly maxPerSession;
|
|
33
|
+
private readonly maxSessions;
|
|
34
|
+
private readonly sessions;
|
|
35
|
+
private readonly messages;
|
|
36
|
+
constructor(opts?: {
|
|
37
|
+
maxMessagesPerSession?: number;
|
|
38
|
+
maxSessions?: number;
|
|
39
|
+
});
|
|
40
|
+
upsertSession(sessionId: string, title?: string): void;
|
|
41
|
+
sessionExists(sessionId: string): boolean;
|
|
42
|
+
renameSession(sessionId: string, title: string): void;
|
|
43
|
+
deleteSession(sessionId: string): void;
|
|
44
|
+
listSessions(limit?: number): Array<{
|
|
45
|
+
sessionId: string;
|
|
46
|
+
title: string;
|
|
47
|
+
updatedAt: number;
|
|
48
|
+
}>;
|
|
49
|
+
clearSession(sessionId: string): void;
|
|
50
|
+
addMessage(sessionId: string, role: StoredMessage["role"], content: string, messageType?: StoredMessage["messageType"], metadata?: Record<string, unknown>): string;
|
|
51
|
+
getMessages(sessionId: string, limit?: number): StoredMessage[];
|
|
52
|
+
getMessagesAsDicts(sessionId: string, limit?: number): MessageHistoryEntry[];
|
|
53
|
+
/** Drop the least-recently-updated sessions when we exceed maxSessions. */
|
|
54
|
+
private evictSessionLru;
|
|
55
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory MessageStore.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the surface of the Python `MessageStore` (`add_message`,
|
|
5
|
+
* `get_messages_as_dicts`, `list_sessions`, etc.) so the ACP handlers stay
|
|
6
|
+
* byte-for-byte compatible. Persistence is left out of the MVP; `~/.beeos`
|
|
7
|
+
* SQLite can be re-added later behind the same interface (pluggable adapter).
|
|
8
|
+
*/
|
|
9
|
+
import { randomUUID } from "node:crypto";
|
|
10
|
+
export class MessageStore {
|
|
11
|
+
maxPerSession;
|
|
12
|
+
maxSessions;
|
|
13
|
+
sessions = new Map();
|
|
14
|
+
messages = new Map();
|
|
15
|
+
constructor(opts = {}) {
|
|
16
|
+
this.maxPerSession = opts.maxMessagesPerSession ?? 100;
|
|
17
|
+
this.maxSessions = opts.maxSessions ?? 200;
|
|
18
|
+
}
|
|
19
|
+
upsertSession(sessionId, title = "New chat") {
|
|
20
|
+
const now = Date.now();
|
|
21
|
+
const cur = this.sessions.get(sessionId);
|
|
22
|
+
if (cur) {
|
|
23
|
+
cur.updatedAt = now;
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
this.sessions.set(sessionId, { sessionId, title, createdAt: now, updatedAt: now });
|
|
27
|
+
this.evictSessionLru();
|
|
28
|
+
}
|
|
29
|
+
sessionExists(sessionId) {
|
|
30
|
+
return this.sessions.has(sessionId);
|
|
31
|
+
}
|
|
32
|
+
renameSession(sessionId, title) {
|
|
33
|
+
const s = this.sessions.get(sessionId);
|
|
34
|
+
if (s) {
|
|
35
|
+
s.title = title;
|
|
36
|
+
s.updatedAt = Date.now();
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
deleteSession(sessionId) {
|
|
40
|
+
this.sessions.delete(sessionId);
|
|
41
|
+
this.messages.delete(sessionId);
|
|
42
|
+
}
|
|
43
|
+
listSessions(limit = 50) {
|
|
44
|
+
const all = Array.from(this.sessions.values())
|
|
45
|
+
.sort((a, b) => b.updatedAt - a.updatedAt)
|
|
46
|
+
.slice(0, limit);
|
|
47
|
+
return all.map((s) => ({ sessionId: s.sessionId, title: s.title, updatedAt: s.updatedAt }));
|
|
48
|
+
}
|
|
49
|
+
clearSession(sessionId) {
|
|
50
|
+
this.messages.delete(sessionId);
|
|
51
|
+
}
|
|
52
|
+
addMessage(sessionId, role, content, messageType = "text", metadata = {}) {
|
|
53
|
+
const id = randomUUID();
|
|
54
|
+
const now = Date.now();
|
|
55
|
+
const entry = { id, sessionId, role, content, messageType, metadata, createdAt: now };
|
|
56
|
+
const arr = this.messages.get(sessionId) ?? [];
|
|
57
|
+
arr.push(entry);
|
|
58
|
+
if (arr.length > this.maxPerSession)
|
|
59
|
+
arr.splice(0, arr.length - this.maxPerSession);
|
|
60
|
+
this.messages.set(sessionId, arr);
|
|
61
|
+
const s = this.sessions.get(sessionId);
|
|
62
|
+
if (s)
|
|
63
|
+
s.updatedAt = now;
|
|
64
|
+
else
|
|
65
|
+
this.upsertSession(sessionId);
|
|
66
|
+
return id;
|
|
67
|
+
}
|
|
68
|
+
getMessages(sessionId, limit) {
|
|
69
|
+
const arr = this.messages.get(sessionId) ?? [];
|
|
70
|
+
const n = Math.min(limit ?? this.maxPerSession, arr.length);
|
|
71
|
+
return arr.slice(arr.length - n);
|
|
72
|
+
}
|
|
73
|
+
getMessagesAsDicts(sessionId, limit) {
|
|
74
|
+
return this.getMessages(sessionId, limit).map((m) => {
|
|
75
|
+
const out = {
|
|
76
|
+
role: m.role,
|
|
77
|
+
content: m.content,
|
|
78
|
+
type: m.messageType,
|
|
79
|
+
createdAt: m.createdAt,
|
|
80
|
+
};
|
|
81
|
+
if (Object.keys(m.metadata).length > 0)
|
|
82
|
+
out.metadata = m.metadata;
|
|
83
|
+
return out;
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
/** Drop the least-recently-updated sessions when we exceed maxSessions. */
|
|
87
|
+
evictSessionLru() {
|
|
88
|
+
if (this.sessions.size <= this.maxSessions)
|
|
89
|
+
return;
|
|
90
|
+
const sorted = Array.from(this.sessions.values()).sort((a, b) => a.updatedAt - b.updatedAt);
|
|
91
|
+
const overflow = this.sessions.size - this.maxSessions;
|
|
92
|
+
for (let i = 0; i < overflow; i++) {
|
|
93
|
+
const id = sorted[i].sessionId;
|
|
94
|
+
this.sessions.delete(id);
|
|
95
|
+
this.messages.delete(id);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=message-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-store.js","sourceRoot":"","sources":["../../src/app/message-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Application use case — SessionManager.
|
|
3
|
+
*
|
|
4
|
+
* Owns ACP session lifecycle (new/load/list/rename/delete/clear) and the
|
|
5
|
+
* dispatch of `session/prompt` to the underlying `AgentHost`. Streaming
|
|
6
|
+
* `session/update` envelopes are produced by translating `AgentEvent`s
|
|
7
|
+
* received from the host bus.
|
|
8
|
+
*
|
|
9
|
+
* SessionManager itself is protocol-agnostic w.r.t. the agent core — it
|
|
10
|
+
* speaks `AgentHost` only. The translation of host events into ACP
|
|
11
|
+
* envelopes lives here so swapping `IAgentCore` (single-layer / pi
|
|
12
|
+
* orchestrator / mock) doesn't change ACP semantics.
|
|
13
|
+
*
|
|
14
|
+
* Surface mirrors the Python `SessionHandler` so ACP handlers remain
|
|
15
|
+
* thin pass-throughs.
|
|
16
|
+
*/
|
|
17
|
+
import { MessageStore, type MessageHistoryEntry } from "./message-store.js";
|
|
18
|
+
import type { AgentHost } from "../ports/agent-host.js";
|
|
19
|
+
export interface SessionUpdateNotifier {
|
|
20
|
+
/** Called for every step during `session/prompt`. */
|
|
21
|
+
send(sessionId: string, update: Record<string, unknown>): void;
|
|
22
|
+
}
|
|
23
|
+
export interface SessionManagerOptions {
|
|
24
|
+
host: AgentHost;
|
|
25
|
+
messageStore?: MessageStore;
|
|
26
|
+
notifier?: SessionUpdateNotifier;
|
|
27
|
+
/**
|
|
28
|
+
* Called when the user asks to switch the underlying agent model.
|
|
29
|
+
* `provider` may be empty when the caller doesn't pin a specific adapter
|
|
30
|
+
* (auto-detect from `model`).
|
|
31
|
+
*/
|
|
32
|
+
onSetModel?: (provider: string, model: string) => Promise<void> | void;
|
|
33
|
+
maxSessions?: number;
|
|
34
|
+
sessionTtlMs?: number;
|
|
35
|
+
}
|
|
36
|
+
export declare class SessionManager {
|
|
37
|
+
private readonly host;
|
|
38
|
+
private readonly store;
|
|
39
|
+
private readonly notifier;
|
|
40
|
+
private readonly onSetModel;
|
|
41
|
+
private readonly maxSessions;
|
|
42
|
+
private readonly sessionTtlMs;
|
|
43
|
+
private readonly sessions;
|
|
44
|
+
/** taskId → sessionId for routing host events to the right ACP session. */
|
|
45
|
+
private readonly taskToSession;
|
|
46
|
+
private activeSessionId;
|
|
47
|
+
private currentTask;
|
|
48
|
+
private unsubscribe;
|
|
49
|
+
constructor(opts: SessionManagerOptions);
|
|
50
|
+
/** Detach from the host bus (used when shutting down the ACP plugin). */
|
|
51
|
+
detach(): void;
|
|
52
|
+
newSession(): {
|
|
53
|
+
sessionId: string;
|
|
54
|
+
};
|
|
55
|
+
loadSession(sessionId: string): {
|
|
56
|
+
sessionId: string;
|
|
57
|
+
history: MessageHistoryEntry[];
|
|
58
|
+
};
|
|
59
|
+
listSessions(): {
|
|
60
|
+
sessions: {
|
|
61
|
+
sessionId: string;
|
|
62
|
+
title: string;
|
|
63
|
+
updatedAt: number;
|
|
64
|
+
}[];
|
|
65
|
+
};
|
|
66
|
+
renameSession(sessionId: string, title: string): {
|
|
67
|
+
sessionId: string;
|
|
68
|
+
title: string;
|
|
69
|
+
};
|
|
70
|
+
deleteSession(sessionId: string): {
|
|
71
|
+
deleted: boolean;
|
|
72
|
+
};
|
|
73
|
+
clearSession(sessionId: string): {
|
|
74
|
+
cleared: boolean;
|
|
75
|
+
};
|
|
76
|
+
setMode(sessionId: string, mode: string): {
|
|
77
|
+
sessionId: string;
|
|
78
|
+
mode: string;
|
|
79
|
+
};
|
|
80
|
+
setModel(sessionId: string, model: string, provider?: string): Promise<{
|
|
81
|
+
sessionId: string;
|
|
82
|
+
provider: string;
|
|
83
|
+
model: string;
|
|
84
|
+
}>;
|
|
85
|
+
/**
|
|
86
|
+
* Run a prompt to completion and return the ACP `stopReason`.
|
|
87
|
+
*
|
|
88
|
+
* Streams `session/update` notifications during execution (translated
|
|
89
|
+
* from `AgentHost` events).
|
|
90
|
+
*/
|
|
91
|
+
prompt(rawPrompt: string | Array<{
|
|
92
|
+
type?: string;
|
|
93
|
+
text?: string;
|
|
94
|
+
}>, sessionIdHint?: string): Promise<{
|
|
95
|
+
stopReason: string;
|
|
96
|
+
}>;
|
|
97
|
+
/** Cancel the in-flight task for the active session, if any. */
|
|
98
|
+
cancel(): Promise<boolean>;
|
|
99
|
+
/**
|
|
100
|
+
* Translate host `AgentEvent`s into ACP `session/update` envelopes.
|
|
101
|
+
*
|
|
102
|
+
* Handles five legitimate ACP-emitting sources plus structural events:
|
|
103
|
+
* - `task:text` — streamed user-visible reply (agent_message_chunk)
|
|
104
|
+
* - `task:reasoning` — streaming "thinking" delta (agent_thought_chunk):
|
|
105
|
+
* planner plan/replan descriptions and per-step
|
|
106
|
+
* VLM rationale.
|
|
107
|
+
* - `task:tool` — start / end pairs (tool_call / tool_call_update)
|
|
108
|
+
* - `task:notice` — out-of-band protocol notice. level=warn
|
|
109
|
+
* (transient retry hints) is dropped — noise
|
|
110
|
+
* the user can't act on. level=error (terminal
|
|
111
|
+
* failure) becomes a `system_message_chunk`
|
|
112
|
+
* with `metadata.kind = "agent_notice"`; the
|
|
113
|
+
* web client merges it into the matching
|
|
114
|
+
* assistant bubble's footer. NOT persisted.
|
|
115
|
+
* - `task:step` — structural step record (no ACP emission, kept
|
|
116
|
+
* for HTTP debug / future plugins).
|
|
117
|
+
*
|
|
118
|
+
* Every emitted envelope carries `_turnId` (groups all chunks of a
|
|
119
|
+
* single user prompt) and `messageId` (the per-task authoritative id
|
|
120
|
+
* shared by every chunk / thought / tool / notice in this turn). The
|
|
121
|
+
* web `chat-store` sidecar resolver pins thoughts and tool calls to
|
|
122
|
+
* the assistant bubble bearing the matching `_messageId`.
|
|
123
|
+
*
|
|
124
|
+
* Events for tasks not owned by this SessionManager are ignored —
|
|
125
|
+
* other plugins (HTTP debug, custom) may submit tasks through the
|
|
126
|
+
* same host bus.
|
|
127
|
+
*/
|
|
128
|
+
private handleHostEvent;
|
|
129
|
+
private resolveSession;
|
|
130
|
+
private notify;
|
|
131
|
+
private evictExpired;
|
|
132
|
+
}
|