@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,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter — `IDeviceSource` implementation that exposes a fixed list of
|
|
3
|
+
* remote ADB endpoints as if they were local devices.
|
|
4
|
+
*
|
|
5
|
+
* Use cases:
|
|
6
|
+
*
|
|
7
|
+
* - Local ReDroid containers (e.g. `127.0.0.1:5555`). The Docker /
|
|
8
|
+
* k8s pod publishes ADB on a TCP port; running `adb connect host:port`
|
|
9
|
+
* once is enough to make `adb track-devices` pick it up, but that
|
|
10
|
+
* extra step is fragile (manual connect, atomic-detach when the
|
|
11
|
+
* container restarts). With `RemoteAdbSource`, the supervisor treats
|
|
12
|
+
* each `(host, port)` as a logical "device with serial" without
|
|
13
|
+
* needing real `adb track-devices` to see it.
|
|
14
|
+
*
|
|
15
|
+
* - Edge sites where a remote `adb server -a -P 5037` exposes USB
|
|
16
|
+
* devices over TCP. Static config is more deterministic than auto
|
|
17
|
+
* discovery.
|
|
18
|
+
*
|
|
19
|
+
* Lifecycle:
|
|
20
|
+
*
|
|
21
|
+
* - On `start()`: for every configured endpoint, optionally run `adb
|
|
22
|
+
* connect host:port` (best-effort; non-fatal on failure) then emit
|
|
23
|
+
* `adb_online` for each known serial. The optional `serial` override
|
|
24
|
+
* in the config is what gets emitted; if absent, the canonical
|
|
25
|
+
* `host:port` form (which is what `adb` itself would report) is
|
|
26
|
+
* used. The serial used here is what flows into `devices.json` for
|
|
27
|
+
* binding lookup, so users should keep them stable.
|
|
28
|
+
*
|
|
29
|
+
* - During run: the source is otherwise quiescent. `RemoteAdbSource`
|
|
30
|
+
* does NOT itself probe whether the remote ADB is alive — that's
|
|
31
|
+
* the spawned `device-mcp-server`'s problem (and the fleet FSM will
|
|
32
|
+
* enter `degraded` if the mcp child can't reach the device).
|
|
33
|
+
*
|
|
34
|
+
* - On `stop()`: best-effort `adb disconnect host:port` for each
|
|
35
|
+
* endpoint that was connected.
|
|
36
|
+
*/
|
|
37
|
+
import { spawn } from "node:child_process";
|
|
38
|
+
const noopLogger = {
|
|
39
|
+
debug: () => { },
|
|
40
|
+
info: () => { },
|
|
41
|
+
warn: () => { },
|
|
42
|
+
error: () => { },
|
|
43
|
+
};
|
|
44
|
+
export function resolveEndpoint(ep) {
|
|
45
|
+
const port = ep.port ?? 5555;
|
|
46
|
+
const serial = ep.serial && ep.serial.length > 0 ? ep.serial : `${ep.host}:${port}`;
|
|
47
|
+
return { serial, host: ep.host, port, name: ep.name };
|
|
48
|
+
}
|
|
49
|
+
export class RemoteAdbSource {
|
|
50
|
+
endpoints;
|
|
51
|
+
adb;
|
|
52
|
+
autoConnect;
|
|
53
|
+
logger;
|
|
54
|
+
listeners = new Set();
|
|
55
|
+
online = new Set();
|
|
56
|
+
started = false;
|
|
57
|
+
constructor(opts) {
|
|
58
|
+
this.endpoints = opts.endpoints.map(resolveEndpoint);
|
|
59
|
+
this.adb = opts.adb ?? process.env.BEEOS_ADB_BIN ?? process.env.ADB_PATH ?? "adb";
|
|
60
|
+
this.autoConnect = opts.autoConnect ?? true;
|
|
61
|
+
this.logger = opts.logger ?? noopLogger;
|
|
62
|
+
}
|
|
63
|
+
async start() {
|
|
64
|
+
if (this.started)
|
|
65
|
+
return;
|
|
66
|
+
this.started = true;
|
|
67
|
+
if (this.autoConnect) {
|
|
68
|
+
await Promise.all(this.endpoints.map((ep) => this.connectOne(ep)));
|
|
69
|
+
}
|
|
70
|
+
for (const ep of this.endpoints) {
|
|
71
|
+
this.online.add(ep.serial);
|
|
72
|
+
this.emit({ kind: "adb_online", serial: ep.serial });
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
async stop() {
|
|
76
|
+
this.started = false;
|
|
77
|
+
if (this.autoConnect) {
|
|
78
|
+
await Promise.all(this.endpoints.map((ep) => this.disconnectOne(ep)));
|
|
79
|
+
}
|
|
80
|
+
this.online.clear();
|
|
81
|
+
}
|
|
82
|
+
on(listener) {
|
|
83
|
+
this.listeners.add(listener);
|
|
84
|
+
return () => this.listeners.delete(listener);
|
|
85
|
+
}
|
|
86
|
+
snapshot() {
|
|
87
|
+
return [...this.online];
|
|
88
|
+
}
|
|
89
|
+
// ── Internals ────────────────────────────────────────────────────────────
|
|
90
|
+
connectOne(ep) {
|
|
91
|
+
return runAdb(this.adb, ["connect", `${ep.host}:${ep.port}`]).then((r) => {
|
|
92
|
+
if (r.code === 0) {
|
|
93
|
+
this.logger.info("adb connect ok", { endpoint: `${ep.host}:${ep.port}` });
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
this.logger.warn("adb connect failed", {
|
|
97
|
+
endpoint: `${ep.host}:${ep.port}`,
|
|
98
|
+
code: r.code,
|
|
99
|
+
stderr: r.stderr.trim(),
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}, (e) => {
|
|
103
|
+
this.logger.warn("adb connect threw", {
|
|
104
|
+
endpoint: `${ep.host}:${ep.port}`,
|
|
105
|
+
error: String(e),
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
disconnectOne(ep) {
|
|
110
|
+
return runAdb(this.adb, ["disconnect", `${ep.host}:${ep.port}`]).then(() => undefined, () => undefined);
|
|
111
|
+
}
|
|
112
|
+
emit(event) {
|
|
113
|
+
for (const l of this.listeners) {
|
|
114
|
+
try {
|
|
115
|
+
l(event);
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
/* listener faults must not break the source */
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
function runAdb(bin, args) {
|
|
124
|
+
return new Promise((resolve, reject) => {
|
|
125
|
+
const child = spawn(bin, args, { stdio: ["ignore", "pipe", "pipe"] });
|
|
126
|
+
let stdout = "";
|
|
127
|
+
let stderr = "";
|
|
128
|
+
child.stdout.on("data", (c) => {
|
|
129
|
+
stdout += c.toString();
|
|
130
|
+
});
|
|
131
|
+
child.stderr.on("data", (c) => {
|
|
132
|
+
stderr += c.toString();
|
|
133
|
+
});
|
|
134
|
+
child.on("error", reject);
|
|
135
|
+
child.on("close", (code) => resolve({ code: code ?? -1, stdout, stderr }));
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=remote-adb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-adb.js","sourceRoot":"","sources":["../../../../src/fleet/adapters/sources/remote-adb.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter — `IStateRegistry` over `~/.beeos/devices.json`.
|
|
3
|
+
*
|
|
4
|
+
* `web/packages/cli` `attach.ts` / `detach.ts` is the sole writer. Fleet only
|
|
5
|
+
* reads. The schema (`{ devices: DeviceEntry[] }`) is documented in
|
|
6
|
+
* `web/packages/cli/src/commands/device/state.ts`; the relevant fields for
|
|
7
|
+
* fleet are: `serial`, `name`, `instance_id`, `key_file`, `http_port`, plus
|
|
8
|
+
* the optional fleet-specific overrides `grace_ms` and `keep_ms`.
|
|
9
|
+
*
|
|
10
|
+
* Watching strategy: `fs.watch` on the file directly is fragile across editors
|
|
11
|
+
* (atomic-rename creates a new inode and the old watcher dies). We instead
|
|
12
|
+
* watch the parent directory and filter for the file name; this also catches
|
|
13
|
+
* the file being created the first time `beeos device attach` runs.
|
|
14
|
+
*/
|
|
15
|
+
import type { DeviceBinding, FleetBackend } from "../../domain/device.js";
|
|
16
|
+
import type { IStateRegistry, BindingEventListener } from "../../ports/state-registry.js";
|
|
17
|
+
interface RawDeviceEntry {
|
|
18
|
+
serial: string;
|
|
19
|
+
name: string;
|
|
20
|
+
instance_id: string | null;
|
|
21
|
+
key_file: string;
|
|
22
|
+
http_port: number;
|
|
23
|
+
/** Video backend selection (`scrcpy`/`vnc`/`none`); written by `web/packages/cli`. */
|
|
24
|
+
video_mode?: "scrcpy" | "vnc" | "none";
|
|
25
|
+
/**
|
|
26
|
+
* `device-mcp-server --backend` selection. Canonical: `adb` | `macos` |
|
|
27
|
+
* `linux` | `windows` | `desktop` | `mock-desktop`. Aliases (`android`,
|
|
28
|
+
* `mac`, `win`, `desktop-{linux,windows,macos}`) are also accepted.
|
|
29
|
+
*/
|
|
30
|
+
backend?: string;
|
|
31
|
+
/** Fleet-specific overrides (per-device, optional). */
|
|
32
|
+
grace_ms?: number;
|
|
33
|
+
keep_ms?: number;
|
|
34
|
+
}
|
|
35
|
+
export interface BeeosCliStoreOptions {
|
|
36
|
+
/** Path to `devices.json` — defaults to `~/.beeos/devices.json`. */
|
|
37
|
+
filePath?: string;
|
|
38
|
+
/** Polling fallback interval (ms); only used when `fs.watch` is unsupported. */
|
|
39
|
+
pollIntervalMs?: number;
|
|
40
|
+
}
|
|
41
|
+
export declare class BeeosCliStore implements IStateRegistry {
|
|
42
|
+
private readonly filePath;
|
|
43
|
+
private readonly pollIntervalMs;
|
|
44
|
+
private listeners;
|
|
45
|
+
private bindings;
|
|
46
|
+
private watcher;
|
|
47
|
+
private pollHandle;
|
|
48
|
+
private started;
|
|
49
|
+
private debounce;
|
|
50
|
+
constructor(opts?: BeeosCliStoreOptions);
|
|
51
|
+
start(): Promise<void>;
|
|
52
|
+
stop(): Promise<void>;
|
|
53
|
+
reload(): Promise<void>;
|
|
54
|
+
list(): readonly DeviceBinding[];
|
|
55
|
+
get(serial: string): DeviceBinding | null;
|
|
56
|
+
on(listener: BindingEventListener): () => void;
|
|
57
|
+
private beginWatching;
|
|
58
|
+
/** Coalesce rapid bursts of writes (atomic-rename = create + rename). */
|
|
59
|
+
private scheduleReload;
|
|
60
|
+
private applyDiff;
|
|
61
|
+
private emit;
|
|
62
|
+
}
|
|
63
|
+
export declare function defaultDevicesPath(): string;
|
|
64
|
+
export declare function readBindings(filePath: string): Promise<Map<string, DeviceBinding>>;
|
|
65
|
+
export declare function toBinding(entry: RawDeviceEntry): DeviceBinding;
|
|
66
|
+
/**
|
|
67
|
+
* Normalize a raw `backend` string to a canonical `FleetBackend`.
|
|
68
|
+
* Returns `undefined` for missing / unknown values so the fleet
|
|
69
|
+
* supervisor can fall back to its default (`adb`).
|
|
70
|
+
*/
|
|
71
|
+
export declare function normalizeBackend(value: unknown): FleetBackend | undefined;
|
|
72
|
+
export {};
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter — `IStateRegistry` over `~/.beeos/devices.json`.
|
|
3
|
+
*
|
|
4
|
+
* `web/packages/cli` `attach.ts` / `detach.ts` is the sole writer. Fleet only
|
|
5
|
+
* reads. The schema (`{ devices: DeviceEntry[] }`) is documented in
|
|
6
|
+
* `web/packages/cli/src/commands/device/state.ts`; the relevant fields for
|
|
7
|
+
* fleet are: `serial`, `name`, `instance_id`, `key_file`, `http_port`, plus
|
|
8
|
+
* the optional fleet-specific overrides `grace_ms` and `keep_ms`.
|
|
9
|
+
*
|
|
10
|
+
* Watching strategy: `fs.watch` on the file directly is fragile across editors
|
|
11
|
+
* (atomic-rename creates a new inode and the old watcher dies). We instead
|
|
12
|
+
* watch the parent directory and filter for the file name; this also catches
|
|
13
|
+
* the file being created the first time `beeos device attach` runs.
|
|
14
|
+
*/
|
|
15
|
+
import * as fs from "node:fs";
|
|
16
|
+
import * as path from "node:path";
|
|
17
|
+
import * as os from "node:os";
|
|
18
|
+
export class BeeosCliStore {
|
|
19
|
+
filePath;
|
|
20
|
+
pollIntervalMs;
|
|
21
|
+
listeners = new Set();
|
|
22
|
+
bindings = new Map();
|
|
23
|
+
watcher = null;
|
|
24
|
+
pollHandle = null;
|
|
25
|
+
started = false;
|
|
26
|
+
debounce = null;
|
|
27
|
+
constructor(opts = {}) {
|
|
28
|
+
this.filePath = opts.filePath ?? defaultDevicesPath();
|
|
29
|
+
this.pollIntervalMs = opts.pollIntervalMs ?? 1_500;
|
|
30
|
+
}
|
|
31
|
+
async start() {
|
|
32
|
+
if (this.started)
|
|
33
|
+
return;
|
|
34
|
+
this.started = true;
|
|
35
|
+
await this.reload();
|
|
36
|
+
this.beginWatching();
|
|
37
|
+
}
|
|
38
|
+
async stop() {
|
|
39
|
+
this.started = false;
|
|
40
|
+
if (this.watcher) {
|
|
41
|
+
try {
|
|
42
|
+
this.watcher.close();
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
/* ignore */
|
|
46
|
+
}
|
|
47
|
+
this.watcher = null;
|
|
48
|
+
}
|
|
49
|
+
if (this.pollHandle) {
|
|
50
|
+
clearInterval(this.pollHandle);
|
|
51
|
+
this.pollHandle = null;
|
|
52
|
+
}
|
|
53
|
+
if (this.debounce) {
|
|
54
|
+
clearTimeout(this.debounce);
|
|
55
|
+
this.debounce = null;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
async reload() {
|
|
59
|
+
const next = await readBindings(this.filePath);
|
|
60
|
+
this.applyDiff(next);
|
|
61
|
+
}
|
|
62
|
+
list() {
|
|
63
|
+
return Array.from(this.bindings.values());
|
|
64
|
+
}
|
|
65
|
+
get(serial) {
|
|
66
|
+
return this.bindings.get(serial) ?? null;
|
|
67
|
+
}
|
|
68
|
+
on(listener) {
|
|
69
|
+
this.listeners.add(listener);
|
|
70
|
+
return () => this.listeners.delete(listener);
|
|
71
|
+
}
|
|
72
|
+
// ── Internals ────────────────────────────────────────────────────────────
|
|
73
|
+
beginWatching() {
|
|
74
|
+
const dir = path.dirname(this.filePath);
|
|
75
|
+
const name = path.basename(this.filePath);
|
|
76
|
+
try {
|
|
77
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
/* ignore — likely permission, falls back to polling */
|
|
81
|
+
}
|
|
82
|
+
try {
|
|
83
|
+
this.watcher = fs.watch(dir, (_event, changed) => {
|
|
84
|
+
if (!changed)
|
|
85
|
+
return;
|
|
86
|
+
if (changed.toString() !== name)
|
|
87
|
+
return;
|
|
88
|
+
this.scheduleReload();
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
// fs.watch may be unsupported (e.g. some FUSE / NFS); fall back to
|
|
93
|
+
// a low-frequency poll. We compare mtime to avoid re-parsing on every
|
|
94
|
+
// tick when nothing changed.
|
|
95
|
+
let lastMtimeMs = 0;
|
|
96
|
+
this.pollHandle = setInterval(() => {
|
|
97
|
+
fs.stat(this.filePath, (err, st) => {
|
|
98
|
+
if (err)
|
|
99
|
+
return;
|
|
100
|
+
if (st.mtimeMs === lastMtimeMs)
|
|
101
|
+
return;
|
|
102
|
+
lastMtimeMs = st.mtimeMs;
|
|
103
|
+
this.scheduleReload();
|
|
104
|
+
});
|
|
105
|
+
}, this.pollIntervalMs);
|
|
106
|
+
if (typeof this.pollHandle === "object" && this.pollHandle?.unref) {
|
|
107
|
+
this.pollHandle.unref();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/** Coalesce rapid bursts of writes (atomic-rename = create + rename). */
|
|
112
|
+
scheduleReload() {
|
|
113
|
+
if (this.debounce)
|
|
114
|
+
return;
|
|
115
|
+
this.debounce = setTimeout(() => {
|
|
116
|
+
this.debounce = null;
|
|
117
|
+
void this.reload().catch(() => {
|
|
118
|
+
/* swallowed: next event will retry */
|
|
119
|
+
});
|
|
120
|
+
}, 80);
|
|
121
|
+
if (typeof this.debounce === "object" && this.debounce?.unref) {
|
|
122
|
+
this.debounce.unref();
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
applyDiff(next) {
|
|
126
|
+
const prev = this.bindings;
|
|
127
|
+
this.bindings = next;
|
|
128
|
+
if (this.listeners.size === 0)
|
|
129
|
+
return;
|
|
130
|
+
for (const [serial, b] of next) {
|
|
131
|
+
const old = prev.get(serial);
|
|
132
|
+
if (!old) {
|
|
133
|
+
this.emit({ kind: "binding_added", serial });
|
|
134
|
+
}
|
|
135
|
+
else if (!shallowEqual(old, b)) {
|
|
136
|
+
this.emit({ kind: "binding_changed", serial });
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
for (const serial of prev.keys()) {
|
|
140
|
+
if (!next.has(serial)) {
|
|
141
|
+
this.emit({ kind: "binding_removed", serial });
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
emit(event) {
|
|
146
|
+
for (const l of this.listeners) {
|
|
147
|
+
try {
|
|
148
|
+
l(event);
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
/* listener faults must not break the store */
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// ── Pure helpers (exported for tests) ────────────────────────────────────────
|
|
157
|
+
export function defaultDevicesPath() {
|
|
158
|
+
const override = process.env.BEEOS_HOME;
|
|
159
|
+
const base = override && override.length > 0
|
|
160
|
+
? override
|
|
161
|
+
: path.join(os.homedir(), ".beeos");
|
|
162
|
+
return path.join(base, "devices.json");
|
|
163
|
+
}
|
|
164
|
+
export async function readBindings(filePath) {
|
|
165
|
+
const out = new Map();
|
|
166
|
+
let raw;
|
|
167
|
+
try {
|
|
168
|
+
raw = await fs.promises.readFile(filePath, "utf8");
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
return out;
|
|
172
|
+
}
|
|
173
|
+
let parsed;
|
|
174
|
+
try {
|
|
175
|
+
parsed = JSON.parse(raw);
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
return out;
|
|
179
|
+
}
|
|
180
|
+
if (!parsed || !Array.isArray(parsed.devices))
|
|
181
|
+
return out;
|
|
182
|
+
for (const entry of parsed.devices) {
|
|
183
|
+
if (!entry || typeof entry.serial !== "string" || entry.serial.length === 0)
|
|
184
|
+
continue;
|
|
185
|
+
out.set(entry.serial, toBinding(entry));
|
|
186
|
+
}
|
|
187
|
+
return out;
|
|
188
|
+
}
|
|
189
|
+
export function toBinding(entry) {
|
|
190
|
+
return {
|
|
191
|
+
serial: entry.serial,
|
|
192
|
+
name: entry.name ?? entry.serial,
|
|
193
|
+
instanceId: typeof entry.instance_id === "string" && entry.instance_id.length > 0
|
|
194
|
+
? entry.instance_id
|
|
195
|
+
: null,
|
|
196
|
+
keyFile: entry.key_file ?? "",
|
|
197
|
+
httpPort: typeof entry.http_port === "number" ? entry.http_port : undefined,
|
|
198
|
+
videoMode: entry.video_mode === "scrcpy" ||
|
|
199
|
+
entry.video_mode === "vnc" ||
|
|
200
|
+
entry.video_mode === "none"
|
|
201
|
+
? entry.video_mode
|
|
202
|
+
: undefined,
|
|
203
|
+
backend: normalizeBackend(entry.backend),
|
|
204
|
+
graceMs: typeof entry.grace_ms === "number" ? entry.grace_ms : undefined,
|
|
205
|
+
keepMs: typeof entry.keep_ms === "number" ? entry.keep_ms : undefined,
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Normalize a raw `backend` string to a canonical `FleetBackend`.
|
|
210
|
+
* Returns `undefined` for missing / unknown values so the fleet
|
|
211
|
+
* supervisor can fall back to its default (`adb`).
|
|
212
|
+
*/
|
|
213
|
+
export function normalizeBackend(value) {
|
|
214
|
+
if (typeof value !== "string")
|
|
215
|
+
return undefined;
|
|
216
|
+
switch (value) {
|
|
217
|
+
case "adb":
|
|
218
|
+
case "android":
|
|
219
|
+
return "adb";
|
|
220
|
+
case "macos":
|
|
221
|
+
case "mac":
|
|
222
|
+
case "desktop-macos":
|
|
223
|
+
return "macos";
|
|
224
|
+
case "linux":
|
|
225
|
+
case "desktop-linux":
|
|
226
|
+
return "linux";
|
|
227
|
+
case "windows":
|
|
228
|
+
case "win":
|
|
229
|
+
case "desktop-windows":
|
|
230
|
+
return "windows";
|
|
231
|
+
case "desktop":
|
|
232
|
+
return "desktop";
|
|
233
|
+
case "mock-desktop":
|
|
234
|
+
return "mock-desktop";
|
|
235
|
+
default:
|
|
236
|
+
return undefined;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
function shallowEqual(a, b) {
|
|
240
|
+
return (a.serial === b.serial &&
|
|
241
|
+
a.name === b.name &&
|
|
242
|
+
a.instanceId === b.instanceId &&
|
|
243
|
+
a.keyFile === b.keyFile &&
|
|
244
|
+
a.httpPort === b.httpPort &&
|
|
245
|
+
a.videoMode === b.videoMode &&
|
|
246
|
+
a.backend === b.backend &&
|
|
247
|
+
a.graceMs === b.graceMs &&
|
|
248
|
+
a.keepMs === b.keepMs);
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=beeos-cli-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"beeos-cli-store.js","sourceRoot":"","sources":["../../../../src/fleet/adapters/state/beeos-cli-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter — sticky port allocator backed by `~/.beeos/fleet.json`.
|
|
3
|
+
*
|
|
4
|
+
* Sticky semantics: once a serial is mapped to a port, that mapping is kept
|
|
5
|
+
* indefinitely so users can bookmark / paste the URL. The allocator only
|
|
6
|
+
* forgets a mapping if the persisted port collides with another listener at
|
|
7
|
+
* acquire time — then we probe the next free port within the configured
|
|
8
|
+
* range.
|
|
9
|
+
*
|
|
10
|
+
* Range: configurable, defaults to `[7900, 7999]` (matches the historical
|
|
11
|
+
* device-mcp-server default of 7900). 100 slots × per-laptop scale is plenty
|
|
12
|
+
* even for power users running 30 devices.
|
|
13
|
+
*/
|
|
14
|
+
import type { IPortAllocator } from "../../ports/state-registry.js";
|
|
15
|
+
export interface PortAllocatorOptions {
|
|
16
|
+
filePath?: string;
|
|
17
|
+
basePort?: number;
|
|
18
|
+
rangeSize?: number;
|
|
19
|
+
/** Probe-port helper override (tests). */
|
|
20
|
+
probe?: (port: number) => Promise<boolean>;
|
|
21
|
+
}
|
|
22
|
+
export declare class StickyPortAllocator implements IPortAllocator {
|
|
23
|
+
private readonly filePath;
|
|
24
|
+
private readonly basePort;
|
|
25
|
+
private readonly rangeSize;
|
|
26
|
+
private readonly probe;
|
|
27
|
+
private map;
|
|
28
|
+
private writeQueue;
|
|
29
|
+
private started;
|
|
30
|
+
constructor(opts?: PortAllocatorOptions);
|
|
31
|
+
start(): Promise<void>;
|
|
32
|
+
stop(): Promise<void>;
|
|
33
|
+
acquire(serial: string): Promise<number>;
|
|
34
|
+
release(serial: string): Promise<void>;
|
|
35
|
+
/** Test/maintenance helper: drop the persisted mapping for a serial. */
|
|
36
|
+
forget(serial: string): void;
|
|
37
|
+
snapshot(): ReadonlyMap<string, number>;
|
|
38
|
+
private hintFor;
|
|
39
|
+
private findAvailable;
|
|
40
|
+
private load;
|
|
41
|
+
private flush;
|
|
42
|
+
}
|
|
43
|
+
export declare function defaultFleetStatePath(): string;
|