@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
|
+
* Fleet status server — local HTTP endpoint exposing supervisor state and a
|
|
3
|
+
* minimal control plane for the `device-agent fleet …` CLI subcommands.
|
|
4
|
+
*
|
|
5
|
+
* Bind: `127.0.0.1:7950` by default (env `FLEET_STATUS_PORT`). Loopback-only
|
|
6
|
+
* by design — there is NO authentication. Anyone on the host who can reach
|
|
7
|
+
* loopback is already trusted (they could read `~/.beeos/keys/`).
|
|
8
|
+
*
|
|
9
|
+
* Routes:
|
|
10
|
+
*
|
|
11
|
+
* GET /healthz — liveness probe (200 "ok\n")
|
|
12
|
+
* GET /fleet/devices — array of `DeviceSnapshot`
|
|
13
|
+
* GET /fleet/devices/:serial — single device snapshot or 404
|
|
14
|
+
* POST /fleet/devices/:serial/restart — kick device's mcp + daemon
|
|
15
|
+
* POST /fleet/reload — re-read `~/.beeos/devices.json`
|
|
16
|
+
* POST /fleet/shutdown — graceful exit (`fleet stop`)
|
|
17
|
+
*
|
|
18
|
+
* `shutdown` is opt-in — the caller must wire an `onShutdown` callback that
|
|
19
|
+
* tears down the supervisor + status server in the right order. Without
|
|
20
|
+
* that callback the route returns 501 so we don't accidentally mask a
|
|
21
|
+
* misconfigured stack with a confusing 200.
|
|
22
|
+
*
|
|
23
|
+
* The dispatcher uses Node's stdlib `http` module to keep the dependency
|
|
24
|
+
* footprint minimal — fastify pulls in a heavy plugin chain we don't need
|
|
25
|
+
* for five trivial endpoints.
|
|
26
|
+
*/
|
|
27
|
+
import type { FleetSupervisor, SupervisorLogger } from "../supervisor.js";
|
|
28
|
+
export interface StatusServerOptions {
|
|
29
|
+
supervisor: FleetSupervisor;
|
|
30
|
+
host?: string;
|
|
31
|
+
port?: number;
|
|
32
|
+
logger?: SupervisorLogger;
|
|
33
|
+
/**
|
|
34
|
+
* Optional graceful-shutdown hook for `POST /fleet/shutdown`.
|
|
35
|
+
*
|
|
36
|
+
* The caller is responsible for tearing down the supervisor + status
|
|
37
|
+
* server (and exiting the process if appropriate). We schedule it as
|
|
38
|
+
* a microtask so the HTTP response goes out before we close the
|
|
39
|
+
* listener — a synchronous call would leave the client hanging.
|
|
40
|
+
*/
|
|
41
|
+
onShutdown?: () => Promise<void> | void;
|
|
42
|
+
}
|
|
43
|
+
export declare class StatusServer {
|
|
44
|
+
private readonly supervisor;
|
|
45
|
+
private readonly host;
|
|
46
|
+
private port;
|
|
47
|
+
private readonly logger;
|
|
48
|
+
private readonly onShutdown?;
|
|
49
|
+
private server;
|
|
50
|
+
constructor(opts: StatusServerOptions);
|
|
51
|
+
/**
|
|
52
|
+
* Public address (only meaningful after `start()`). When `port: 0` was
|
|
53
|
+
* passed (tests), this reflects the OS-assigned ephemeral port — not the
|
|
54
|
+
* 0 that was supplied at construction time.
|
|
55
|
+
*/
|
|
56
|
+
get address(): {
|
|
57
|
+
host: string;
|
|
58
|
+
port: number;
|
|
59
|
+
};
|
|
60
|
+
start(): Promise<void>;
|
|
61
|
+
stop(): Promise<void>;
|
|
62
|
+
private handle;
|
|
63
|
+
private json;
|
|
64
|
+
}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fleet status server — local HTTP endpoint exposing supervisor state and a
|
|
3
|
+
* minimal control plane for the `device-agent fleet …` CLI subcommands.
|
|
4
|
+
*
|
|
5
|
+
* Bind: `127.0.0.1:7950` by default (env `FLEET_STATUS_PORT`). Loopback-only
|
|
6
|
+
* by design — there is NO authentication. Anyone on the host who can reach
|
|
7
|
+
* loopback is already trusted (they could read `~/.beeos/keys/`).
|
|
8
|
+
*
|
|
9
|
+
* Routes:
|
|
10
|
+
*
|
|
11
|
+
* GET /healthz — liveness probe (200 "ok\n")
|
|
12
|
+
* GET /fleet/devices — array of `DeviceSnapshot`
|
|
13
|
+
* GET /fleet/devices/:serial — single device snapshot or 404
|
|
14
|
+
* POST /fleet/devices/:serial/restart — kick device's mcp + daemon
|
|
15
|
+
* POST /fleet/reload — re-read `~/.beeos/devices.json`
|
|
16
|
+
* POST /fleet/shutdown — graceful exit (`fleet stop`)
|
|
17
|
+
*
|
|
18
|
+
* `shutdown` is opt-in — the caller must wire an `onShutdown` callback that
|
|
19
|
+
* tears down the supervisor + status server in the right order. Without
|
|
20
|
+
* that callback the route returns 501 so we don't accidentally mask a
|
|
21
|
+
* misconfigured stack with a confusing 200.
|
|
22
|
+
*
|
|
23
|
+
* The dispatcher uses Node's stdlib `http` module to keep the dependency
|
|
24
|
+
* footprint minimal — fastify pulls in a heavy plugin chain we don't need
|
|
25
|
+
* for five trivial endpoints.
|
|
26
|
+
*/
|
|
27
|
+
import * as http from "node:http";
|
|
28
|
+
import { Buffer } from "node:buffer";
|
|
29
|
+
const DEFAULT_HOST = "127.0.0.1";
|
|
30
|
+
const DEFAULT_PORT = 7950;
|
|
31
|
+
const noopLogger = {
|
|
32
|
+
debug: () => { },
|
|
33
|
+
info: () => { },
|
|
34
|
+
warn: () => { },
|
|
35
|
+
error: () => { },
|
|
36
|
+
};
|
|
37
|
+
export class StatusServer {
|
|
38
|
+
supervisor;
|
|
39
|
+
host;
|
|
40
|
+
// Mutable so we can reflect the OS-assigned port back when callers pass
|
|
41
|
+
// `port: 0` (tests typically do).
|
|
42
|
+
port;
|
|
43
|
+
logger;
|
|
44
|
+
onShutdown;
|
|
45
|
+
server = null;
|
|
46
|
+
constructor(opts) {
|
|
47
|
+
this.supervisor = opts.supervisor;
|
|
48
|
+
this.host = opts.host ?? DEFAULT_HOST;
|
|
49
|
+
this.port = opts.port ?? Number(process.env.FLEET_STATUS_PORT ?? DEFAULT_PORT);
|
|
50
|
+
this.logger = opts.logger ?? noopLogger;
|
|
51
|
+
this.onShutdown = opts.onShutdown;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Public address (only meaningful after `start()`). When `port: 0` was
|
|
55
|
+
* passed (tests), this reflects the OS-assigned ephemeral port — not the
|
|
56
|
+
* 0 that was supplied at construction time.
|
|
57
|
+
*/
|
|
58
|
+
get address() {
|
|
59
|
+
return { host: this.host, port: this.port };
|
|
60
|
+
}
|
|
61
|
+
async start() {
|
|
62
|
+
if (this.server)
|
|
63
|
+
return;
|
|
64
|
+
this.server = http.createServer((req, res) => {
|
|
65
|
+
this.handle(req, res).catch((e) => {
|
|
66
|
+
this.logger.error("status-server handler threw", { error: String(e) });
|
|
67
|
+
if (!res.headersSent) {
|
|
68
|
+
res.statusCode = 500;
|
|
69
|
+
res.setHeader("content-type", "application/json");
|
|
70
|
+
res.end(JSON.stringify({ error: "internal" }));
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
await new Promise((resolve, reject) => {
|
|
75
|
+
this.server.once("error", reject);
|
|
76
|
+
this.server.listen(this.port, this.host, () => {
|
|
77
|
+
this.server.off("error", reject);
|
|
78
|
+
// Reflect the OS-assigned port back into `this.port` so callers
|
|
79
|
+
// reading `server.address` after `start()` see the real bound
|
|
80
|
+
// port — important for tests using `port: 0`.
|
|
81
|
+
const addr = this.server.address();
|
|
82
|
+
if (addr && typeof addr === "object") {
|
|
83
|
+
this.port = addr.port;
|
|
84
|
+
}
|
|
85
|
+
resolve();
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
this.logger.info("fleet status-server listening", {
|
|
89
|
+
host: this.host,
|
|
90
|
+
port: this.port,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
async stop() {
|
|
94
|
+
const server = this.server;
|
|
95
|
+
if (!server)
|
|
96
|
+
return;
|
|
97
|
+
this.server = null;
|
|
98
|
+
await new Promise((resolve) => {
|
|
99
|
+
server.close(() => resolve());
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
// ── Dispatcher ──────────────────────────────────────────────────────────
|
|
103
|
+
async handle(req, res) {
|
|
104
|
+
const url = req.url ?? "/";
|
|
105
|
+
const [pathOnly] = url.split("?");
|
|
106
|
+
const method = (req.method ?? "GET").toUpperCase();
|
|
107
|
+
// Healthz first — used by service managers, must be cheap.
|
|
108
|
+
if (pathOnly === "/healthz" && method === "GET") {
|
|
109
|
+
res.statusCode = 200;
|
|
110
|
+
res.setHeader("content-type", "text/plain");
|
|
111
|
+
res.end("ok\n");
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
if (pathOnly === "/fleet/devices" && method === "GET") {
|
|
115
|
+
this.json(res, 200, this.supervisor.snapshot());
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
if (pathOnly === "/fleet/reload" && method === "POST") {
|
|
119
|
+
await drain(req);
|
|
120
|
+
try {
|
|
121
|
+
await this.supervisor.reload();
|
|
122
|
+
this.json(res, 202, { ok: true });
|
|
123
|
+
}
|
|
124
|
+
catch (e) {
|
|
125
|
+
this.json(res, 500, { ok: false, error: String(e) });
|
|
126
|
+
}
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
if (pathOnly === "/fleet/shutdown" && method === "POST") {
|
|
130
|
+
await drain(req);
|
|
131
|
+
if (!this.onShutdown) {
|
|
132
|
+
this.json(res, 501, {
|
|
133
|
+
ok: false,
|
|
134
|
+
error: "shutdown hook not configured",
|
|
135
|
+
});
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
// Reply first, then run the shutdown hook on the next tick so the
|
|
139
|
+
// socket flushes before we close the listener. Errors inside the
|
|
140
|
+
// hook are logged but not surfaced to the caller — the response
|
|
141
|
+
// has already been sent and the process is on its way out.
|
|
142
|
+
this.json(res, 202, { ok: true });
|
|
143
|
+
const hook = this.onShutdown;
|
|
144
|
+
setImmediate(() => {
|
|
145
|
+
Promise.resolve()
|
|
146
|
+
.then(() => hook())
|
|
147
|
+
.catch((e) => {
|
|
148
|
+
this.logger.error("fleet shutdown hook failed", {
|
|
149
|
+
error: String(e),
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
// /fleet/devices/<serial> [/restart]
|
|
156
|
+
const m = pathOnly.match(/^\/fleet\/devices\/([^/]+)(\/restart)?$/);
|
|
157
|
+
if (m) {
|
|
158
|
+
const serial = decodeURIComponent(m[1]);
|
|
159
|
+
const isRestart = Boolean(m[2]);
|
|
160
|
+
if (isRestart && method === "POST") {
|
|
161
|
+
await drain(req);
|
|
162
|
+
const ok = await this.supervisor.restartDevice(serial);
|
|
163
|
+
if (!ok) {
|
|
164
|
+
this.json(res, 404, { error: "unknown serial", serial });
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
this.json(res, 202, { ok: true, serial });
|
|
168
|
+
}
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
if (!isRestart && method === "GET") {
|
|
172
|
+
const found = this.supervisor.snapshot().find((d) => d.serial === serial);
|
|
173
|
+
if (!found) {
|
|
174
|
+
this.json(res, 404, { error: "unknown serial", serial });
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
this.json(res, 200, found);
|
|
178
|
+
}
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
res.statusCode = 404;
|
|
183
|
+
res.setHeader("content-type", "application/json");
|
|
184
|
+
res.end(JSON.stringify({ error: "not found", path: pathOnly, method }));
|
|
185
|
+
}
|
|
186
|
+
json(res, status, body) {
|
|
187
|
+
res.statusCode = status;
|
|
188
|
+
res.setHeader("content-type", "application/json");
|
|
189
|
+
res.end(JSON.stringify(body));
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
async function drain(req) {
|
|
193
|
+
return new Promise((resolve, reject) => {
|
|
194
|
+
const chunks = [];
|
|
195
|
+
req.on("data", (c) => chunks.push(c));
|
|
196
|
+
req.on("end", () => resolve(Buffer.concat(chunks)));
|
|
197
|
+
req.on("error", reject);
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=status-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-server.js","sourceRoot":"","sources":["../../../src/fleet/http/status-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public surface of the `device-agent fleet` module.
|
|
3
|
+
*
|
|
4
|
+
* Fleet is opt-in: import nothing here unless you actually want the
|
|
5
|
+
* multi-device supervisor. The CLI (`device-agent fleet …` subcommands) lives
|
|
6
|
+
* in `inbound/cli/fleet-command.ts` and is the canonical consumer.
|
|
7
|
+
*/
|
|
8
|
+
export type { DeviceBinding, DeviceRecord, DeviceSnapshot, FleetState, } from "./domain/device.js";
|
|
9
|
+
export { newDeviceRecord, stateExpectsDaemon, stateExpectsMcp, } from "./domain/device.js";
|
|
10
|
+
export type { AdbEvent, BindingEvent, FleetEvent, ProcessEvent, TimerEvent, } from "./domain/events.js";
|
|
11
|
+
export type { FleetEffect, StepContext, StepResult, } from "./domain/fsm.js";
|
|
12
|
+
export { backoffMs, markHealthy, step } from "./domain/fsm.js";
|
|
13
|
+
export type { IDeviceSource } from "./ports/device-source.js";
|
|
14
|
+
export type { IProcessManager, SpawnOptions } from "./ports/process-manager.js";
|
|
15
|
+
export type { IPortAllocator, IStateRegistry } from "./ports/state-registry.js";
|
|
16
|
+
export type { CancelFn, IClock } from "./ports/clock.js";
|
|
17
|
+
export { SystemClock } from "./ports/clock.js";
|
|
18
|
+
export { BeeosCliStore, defaultDevicesPath, readBindings, } from "./adapters/state/beeos-cli-store.js";
|
|
19
|
+
export { StickyPortAllocator, defaultFleetStatePath, } from "./adapters/state/port-allocator.js";
|
|
20
|
+
export { LocalAdbSource, diffSnapshots, parseSnapshotBody, parseTrackDevicesLine, tryParseFrames, } from "./adapters/sources/local-adb.js";
|
|
21
|
+
export type { LocalAdbSourceOptions, AdbLogger } from "./adapters/sources/local-adb.js";
|
|
22
|
+
export { NodeProcessManager } from "./adapters/process/node-process-manager.js";
|
|
23
|
+
export type { HttpProbeFn, ManagedChild, NodeProcessManagerOptions, ProcessManagerLogger, SpawnFn, } from "./adapters/process/node-process-manager.js";
|
|
24
|
+
export { FleetSupervisor } from "./supervisor.js";
|
|
25
|
+
export type { FleetSupervisorOptions, SupervisorLogger, } from "./supervisor.js";
|
|
26
|
+
export { buildFleetServiceSpec, FLEET_LABEL, fleetPlistPath, installFleetLaunchd, LEGACY_DEVICE_AGENT_PREFIX, LEGACY_SCRCPY_BRIDGE_PREFIX, migrateFromAttach, renderFleetPlist, uninstallFleetLaunchd, } from "./installer/index.js";
|
|
27
|
+
export type { BuildFleetSpecInput, FleetRestartPolicy, FleetServiceLabel, FleetServiceSpec, InstallResult, MigrateResult, UninstallResult, } from "./installer/index.js";
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public surface of the `device-agent fleet` module.
|
|
3
|
+
*
|
|
4
|
+
* Fleet is opt-in: import nothing here unless you actually want the
|
|
5
|
+
* multi-device supervisor. The CLI (`device-agent fleet …` subcommands) lives
|
|
6
|
+
* in `inbound/cli/fleet-command.ts` and is the canonical consumer.
|
|
7
|
+
*/
|
|
8
|
+
export { newDeviceRecord, stateExpectsDaemon, stateExpectsMcp, } from "./domain/device.js";
|
|
9
|
+
export { backoffMs, markHealthy, step } from "./domain/fsm.js";
|
|
10
|
+
export { SystemClock } from "./ports/clock.js";
|
|
11
|
+
export { BeeosCliStore, defaultDevicesPath, readBindings, } from "./adapters/state/beeos-cli-store.js";
|
|
12
|
+
export { StickyPortAllocator, defaultFleetStatePath, } from "./adapters/state/port-allocator.js";
|
|
13
|
+
export { LocalAdbSource, diffSnapshots, parseSnapshotBody, parseTrackDevicesLine, tryParseFrames, } from "./adapters/sources/local-adb.js";
|
|
14
|
+
export { NodeProcessManager } from "./adapters/process/node-process-manager.js";
|
|
15
|
+
export { FleetSupervisor } from "./supervisor.js";
|
|
16
|
+
export { buildFleetServiceSpec, FLEET_LABEL, fleetPlistPath, installFleetLaunchd, LEGACY_DEVICE_AGENT_PREFIX, LEGACY_SCRCPY_BRIDGE_PREFIX, migrateFromAttach, renderFleetPlist, uninstallFleetLaunchd, } from "./installer/index.js";
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fleet/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAe5B,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAM/D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,YAAY,GACb,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EACL,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,qBAAqB,EACrB,cAAc,GACf,MAAM,iCAAiC,CAAC;AAGzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAShF,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAMlD,OAAO,EACL,qBAAqB,EACrB,WAAW,EACX,cAAc,EACd,mBAAmB,EACnB,0BAA0B,EAC1B,2BAA2B,EAC3B,iBAAiB,EACjB,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fleet OS-service installer — public surface.
|
|
3
|
+
*
|
|
4
|
+
* Currently macOS-only (launchd). Linux (`systemd --user`) and Windows
|
|
5
|
+
* (Task Scheduler) are deliberately deferred to a follow-up milestone;
|
|
6
|
+
* `installFleet` throws an actionable error on those platforms so users
|
|
7
|
+
* see "fleet enable not yet supported on linux" rather than a silently
|
|
8
|
+
* broken install.
|
|
9
|
+
*/
|
|
10
|
+
export { buildFleetServiceSpec, FLEET_LABEL, type BuildFleetSpecInput, type FleetRestartPolicy, type FleetServiceLabel, type FleetServiceSpec, } from "./service-spec.js";
|
|
11
|
+
export { installFleetLaunchd, uninstallFleetLaunchd, migrateFromAttach, renderFleetPlist, fleetPlistPath, LEGACY_DEVICE_AGENT_PREFIX, LEGACY_SCRCPY_BRIDGE_PREFIX, type InstallResult, type UninstallResult, type MigrateResult, } from "./launchd-mac.js";
|
|
12
|
+
export { deriveFleetSpawnEnv, parseConfigToml, defaultReadConfigToml, type ConfigToml, type DeriveSpawnEnvOptions, } from "./spawn-env.js";
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fleet OS-service installer — public surface.
|
|
3
|
+
*
|
|
4
|
+
* Currently macOS-only (launchd). Linux (`systemd --user`) and Windows
|
|
5
|
+
* (Task Scheduler) are deliberately deferred to a follow-up milestone;
|
|
6
|
+
* `installFleet` throws an actionable error on those platforms so users
|
|
7
|
+
* see "fleet enable not yet supported on linux" rather than a silently
|
|
8
|
+
* broken install.
|
|
9
|
+
*/
|
|
10
|
+
export { buildFleetServiceSpec, FLEET_LABEL, } from "./service-spec.js";
|
|
11
|
+
export { installFleetLaunchd, uninstallFleetLaunchd, migrateFromAttach, renderFleetPlist, fleetPlistPath, LEGACY_DEVICE_AGENT_PREFIX, LEGACY_SCRCPY_BRIDGE_PREFIX, } from "./launchd-mac.js";
|
|
12
|
+
export { deriveFleetSpawnEnv, parseConfigToml, defaultReadConfigToml, } from "./spawn-env.js";
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/fleet/installer/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,qBAAqB,EACrB,WAAW,GAKZ,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,0BAA0B,EAC1B,2BAA2B,GAI5B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,qBAAqB,GAGtB,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* macOS-only launchd integration for `device-agent fleet enable / disable`.
|
|
3
|
+
*
|
|
4
|
+
* The fleet package intentionally does NOT depend on `@beeos/core` — that
|
|
5
|
+
* would pull the entire web monorepo into the runtime. Instead, this file
|
|
6
|
+
* mirrors the renderer + bootstrap sequence in `web/packages/core/src/services/launchd.ts`
|
|
7
|
+
* for the single label `ai.beeos.device-fleet` plus the migration sweep over
|
|
8
|
+
* legacy per-device labels.
|
|
9
|
+
*
|
|
10
|
+
* Restart policy: the rendered plist always sets `KeepAlive: true` —
|
|
11
|
+
* if the fleet process exits, every connected device goes silent, so
|
|
12
|
+
* we want unconditional restarts capped by `ThrottleInterval` (10s).
|
|
13
|
+
*
|
|
14
|
+
* Bootstrap sequence: same pattern as `web/packages/core` — `bootout`
|
|
15
|
+
* any prior copy, then `bootstrap gui/<uid>` and `kickstart -k`. We
|
|
16
|
+
* fall back to legacy `launchctl load -w` on macOS versions that
|
|
17
|
+
* lack `bootstrap`.
|
|
18
|
+
*
|
|
19
|
+
* `migrate-from-attach` removes EVERY plist that matches one of the
|
|
20
|
+
* legacy per-device prefixes (`ai.beeos.device-agent-` /
|
|
21
|
+
* `ai.beeos.scrcpy-bridge-`). Those were how `beeos device attach`
|
|
22
|
+
* used to register supervision before the fleet existed; once the
|
|
23
|
+
* user opts into fleet mode they MUST be removed or we'd double-spawn
|
|
24
|
+
* device-agent for every adb device.
|
|
25
|
+
*/
|
|
26
|
+
import type { FleetServiceSpec } from "./service-spec.js";
|
|
27
|
+
/** Legacy per-device labels written by `beeos device attach` v0.3.x. */
|
|
28
|
+
export declare const LEGACY_DEVICE_AGENT_PREFIX = "ai.beeos.device-agent-";
|
|
29
|
+
export declare const LEGACY_SCRCPY_BRIDGE_PREFIX = "ai.beeos.scrcpy-bridge-";
|
|
30
|
+
export interface InstallResult {
|
|
31
|
+
plistPath: string;
|
|
32
|
+
bootstrapped: boolean;
|
|
33
|
+
warnings: string[];
|
|
34
|
+
}
|
|
35
|
+
export interface UninstallResult {
|
|
36
|
+
removed: boolean;
|
|
37
|
+
plistPath: string;
|
|
38
|
+
warnings: string[];
|
|
39
|
+
}
|
|
40
|
+
export interface MigrateResult {
|
|
41
|
+
removedDeviceAgents: string[];
|
|
42
|
+
removedScrcpyBridges: string[];
|
|
43
|
+
warnings: string[];
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Render the plist file for a `FleetServiceSpec` and bootstrap it into
|
|
47
|
+
* the user's GUI session. Idempotent — calling twice in a row leaves
|
|
48
|
+
* the same loaded service running with the latest plist.
|
|
49
|
+
*/
|
|
50
|
+
export declare function installFleetLaunchd(spec: FleetServiceSpec): Promise<InstallResult>;
|
|
51
|
+
/**
|
|
52
|
+
* Stop and remove the `ai.beeos.device-fleet` plist. Returns
|
|
53
|
+
* `removed: false` when nothing was installed (idempotent).
|
|
54
|
+
*/
|
|
55
|
+
export declare function uninstallFleetLaunchd(label: string): Promise<UninstallResult>;
|
|
56
|
+
/**
|
|
57
|
+
* Sweep `~/Library/LaunchAgents/` for legacy per-device plists left
|
|
58
|
+
* behind by older `beeos device attach`, unload them via launchctl,
|
|
59
|
+
* and delete the files. The fleet supersedes them all.
|
|
60
|
+
*
|
|
61
|
+
* No-op when the directory doesn't exist (fresh install) or no
|
|
62
|
+
* matching files are found.
|
|
63
|
+
*/
|
|
64
|
+
export declare function migrateFromAttach(): Promise<MigrateResult>;
|
|
65
|
+
/**
|
|
66
|
+
* Render a launchd plist for a `FleetServiceSpec`.
|
|
67
|
+
*
|
|
68
|
+
* Exported for unit tests — the full byte-for-byte XML is the contract
|
|
69
|
+
* we ship to launchd, so any change MUST surface as a test diff.
|
|
70
|
+
*/
|
|
71
|
+
export declare function renderFleetPlist(spec: FleetServiceSpec): string;
|
|
72
|
+
/** Path that `installFleetLaunchd` writes to. Exported for tests / `fleet logs`. */
|
|
73
|
+
export declare function fleetPlistPath(label: string): string;
|