@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.
Files changed (398) hide show
  1. package/.pi/extensions/android-tools.ts +139 -0
  2. package/.pi/skills/.gitkeep +0 -0
  3. package/.pi/skills/ground-mobile-fallback/SKILL.md +50 -0
  4. package/LICENSE +201 -0
  5. package/dist/action/handler.d.ts +9 -0
  6. package/dist/action/handler.js +124 -0
  7. package/dist/action/handler.js.map +1 -0
  8. package/dist/adapters/agent-gateway-client.d.ts +256 -0
  9. package/dist/adapters/agent-gateway-client.js +332 -0
  10. package/dist/adapters/agent-gateway-client.js.map +1 -0
  11. package/dist/adapters/agentcore-inner-loop.d.ts +29 -0
  12. package/dist/adapters/agentcore-inner-loop.js +72 -0
  13. package/dist/adapters/agentcore-inner-loop.js.map +1 -0
  14. package/dist/adapters/agentcore-pi.d.ts +215 -0
  15. package/dist/adapters/agentcore-pi.js +464 -0
  16. package/dist/adapters/agentcore-pi.js.map +1 -0
  17. package/dist/adapters/agentcore-runner.d.ts +70 -0
  18. package/dist/adapters/agentcore-runner.js +255 -0
  19. package/dist/adapters/agentcore-runner.js.map +1 -0
  20. package/dist/adapters/device-android-adb.d.ts +41 -0
  21. package/dist/adapters/device-android-adb.js +279 -0
  22. package/dist/adapters/device-android-adb.js.map +1 -0
  23. package/dist/adapters/device-desktop.d.ts +37 -0
  24. package/dist/adapters/device-desktop.js +101 -0
  25. package/dist/adapters/device-desktop.js.map +1 -0
  26. package/dist/adapters/identity-file.d.ts +30 -0
  27. package/dist/adapters/identity-file.js +50 -0
  28. package/dist/adapters/identity-file.js.map +1 -0
  29. package/dist/adapters/transport-bridge-ws.d.ts +39 -0
  30. package/dist/adapters/transport-bridge-ws.js +49 -0
  31. package/dist/adapters/transport-bridge-ws.js.map +1 -0
  32. package/dist/adapters/vlm-inner-loop.d.ts +88 -0
  33. package/dist/adapters/vlm-inner-loop.js +199 -0
  34. package/dist/adapters/vlm-inner-loop.js.map +1 -0
  35. package/dist/agent-runtime/adapters/base.d.ts +145 -0
  36. package/dist/agent-runtime/adapters/base.js +29 -0
  37. package/dist/agent-runtime/adapters/base.js.map +1 -0
  38. package/dist/agent-runtime/adapters/index.d.ts +17 -0
  39. package/dist/agent-runtime/adapters/index.js +17 -0
  40. package/dist/agent-runtime/adapters/index.js.map +1 -0
  41. package/dist/agent-runtime/adapters/mock.d.ts +44 -0
  42. package/dist/agent-runtime/adapters/mock.js +54 -0
  43. package/dist/agent-runtime/adapters/mock.js.map +1 -0
  44. package/dist/agent-runtime/adapters/openai.d.ts +63 -0
  45. package/dist/agent-runtime/adapters/openai.js +302 -0
  46. package/dist/agent-runtime/adapters/openai.js.map +1 -0
  47. package/dist/agent-runtime/adapters/registry.d.ts +49 -0
  48. package/dist/agent-runtime/adapters/registry.js +129 -0
  49. package/dist/agent-runtime/adapters/registry.js.map +1 -0
  50. package/dist/agent-runtime/adapters/ui-tars.d.ts +13 -0
  51. package/dist/agent-runtime/adapters/ui-tars.js +22 -0
  52. package/dist/agent-runtime/adapters/ui-tars.js.map +1 -0
  53. package/dist/agent-runtime/agent-runner.d.ts +149 -0
  54. package/dist/agent-runtime/agent-runner.js +356 -0
  55. package/dist/agent-runtime/agent-runner.js.map +1 -0
  56. package/dist/agent-runtime/core.d.ts +170 -0
  57. package/dist/agent-runtime/core.js +624 -0
  58. package/dist/agent-runtime/core.js.map +1 -0
  59. package/dist/agent-runtime/index.d.ts +16 -0
  60. package/dist/agent-runtime/index.js +17 -0
  61. package/dist/agent-runtime/index.js.map +1 -0
  62. package/dist/agent-runtime/plan-executor.d.ts +118 -0
  63. package/dist/agent-runtime/plan-executor.js +501 -0
  64. package/dist/agent-runtime/plan-executor.js.map +1 -0
  65. package/dist/agent-runtime/planner/base.d.ts +128 -0
  66. package/dist/agent-runtime/planner/base.js +157 -0
  67. package/dist/agent-runtime/planner/base.js.map +1 -0
  68. package/dist/agent-runtime/planner/llm-planner.d.ts +58 -0
  69. package/dist/agent-runtime/planner/llm-planner.js +112 -0
  70. package/dist/agent-runtime/planner/llm-planner.js.map +1 -0
  71. package/dist/agent-runtime/planner/noop-planner.d.ts +13 -0
  72. package/dist/agent-runtime/planner/noop-planner.js +30 -0
  73. package/dist/agent-runtime/planner/noop-planner.js.map +1 -0
  74. package/dist/agent-runtime/planner/prompts.d.ts +33 -0
  75. package/dist/agent-runtime/planner/prompts.js +165 -0
  76. package/dist/agent-runtime/planner/prompts.js.map +1 -0
  77. package/dist/agent-runtime/reflection.d.ts +81 -0
  78. package/dist/agent-runtime/reflection.js +189 -0
  79. package/dist/agent-runtime/reflection.js.map +1 -0
  80. package/dist/agent-runtime/reflectors/action-reflector.d.ts +97 -0
  81. package/dist/agent-runtime/reflectors/action-reflector.js +233 -0
  82. package/dist/agent-runtime/reflectors/action-reflector.js.map +1 -0
  83. package/dist/agent-runtime/reflectors/policy.d.ts +53 -0
  84. package/dist/agent-runtime/reflectors/policy.js +106 -0
  85. package/dist/agent-runtime/reflectors/policy.js.map +1 -0
  86. package/dist/agent-runtime/reflectors/trajectory-reflector.d.ts +94 -0
  87. package/dist/agent-runtime/reflectors/trajectory-reflector.js +223 -0
  88. package/dist/agent-runtime/reflectors/trajectory-reflector.js.map +1 -0
  89. package/dist/agent-runtime/skills/embedding.d.ts +53 -0
  90. package/dist/agent-runtime/skills/embedding.js +134 -0
  91. package/dist/agent-runtime/skills/embedding.js.map +1 -0
  92. package/dist/agent-runtime/skills/fs-store.d.ts +88 -0
  93. package/dist/agent-runtime/skills/fs-store.js +483 -0
  94. package/dist/agent-runtime/skills/fs-store.js.map +1 -0
  95. package/dist/agent-runtime/skills/index.d.ts +10 -0
  96. package/dist/agent-runtime/skills/index.js +10 -0
  97. package/dist/agent-runtime/skills/index.js.map +1 -0
  98. package/dist/agent-runtime/skills/matcher-evolver.d.ts +88 -0
  99. package/dist/agent-runtime/skills/matcher-evolver.js +110 -0
  100. package/dist/agent-runtime/skills/matcher-evolver.js.map +1 -0
  101. package/dist/agent-runtime/skills/memory-store.d.ts +23 -0
  102. package/dist/agent-runtime/skills/memory-store.js +94 -0
  103. package/dist/agent-runtime/skills/memory-store.js.map +1 -0
  104. package/dist/agent-runtime/skills/normalise.d.ts +40 -0
  105. package/dist/agent-runtime/skills/normalise.js +152 -0
  106. package/dist/agent-runtime/skills/normalise.js.map +1 -0
  107. package/dist/agent-runtime/skills/replay.d.ts +46 -0
  108. package/dist/agent-runtime/skills/replay.js +106 -0
  109. package/dist/agent-runtime/skills/replay.js.map +1 -0
  110. package/dist/agent-runtime/skills/sqlite-store.d.ts +60 -0
  111. package/dist/agent-runtime/skills/sqlite-store.js +234 -0
  112. package/dist/agent-runtime/skills/sqlite-store.js.map +1 -0
  113. package/dist/agent-runtime/skills/types.d.ts +99 -0
  114. package/dist/agent-runtime/skills/types.js +14 -0
  115. package/dist/agent-runtime/skills/types.js.map +1 -0
  116. package/dist/agent.d.ts +110 -0
  117. package/dist/agent.js +162 -0
  118. package/dist/agent.js.map +1 -0
  119. package/dist/api.d.ts +27 -0
  120. package/dist/api.js +48 -0
  121. package/dist/api.js.map +1 -0
  122. package/dist/app/agent-host.d.ts +59 -0
  123. package/dist/app/agent-host.js +263 -0
  124. package/dist/app/agent-host.js.map +1 -0
  125. package/dist/app/device-manager.d.ts +28 -0
  126. package/dist/app/device-manager.js +64 -0
  127. package/dist/app/device-manager.js.map +1 -0
  128. package/dist/app/message-store.d.ts +55 -0
  129. package/dist/app/message-store.js +99 -0
  130. package/dist/app/message-store.js.map +1 -0
  131. package/dist/app/session-manager.d.ts +132 -0
  132. package/dist/app/session-manager.js +350 -0
  133. package/dist/app/session-manager.js.map +1 -0
  134. package/dist/bootstrap.d.ts +94 -0
  135. package/dist/bootstrap.js +459 -0
  136. package/dist/bootstrap.js.map +1 -0
  137. package/dist/chat.d.ts +16 -0
  138. package/dist/chat.js +175 -0
  139. package/dist/chat.js.map +1 -0
  140. package/dist/config/loader.d.ts +77 -0
  141. package/dist/config/loader.js +292 -0
  142. package/dist/config/loader.js.map +1 -0
  143. package/dist/config/schema.d.ts +162 -0
  144. package/dist/config/schema.js +243 -0
  145. package/dist/config/schema.js.map +1 -0
  146. package/dist/core/actions.d.ts +60 -0
  147. package/dist/core/actions.js +120 -0
  148. package/dist/core/actions.js.map +1 -0
  149. package/dist/core/errors.d.ts +8 -0
  150. package/dist/core/errors.js +9 -0
  151. package/dist/core/errors.js.map +1 -0
  152. package/dist/core/screen.d.ts +7 -0
  153. package/dist/core/screen.js +8 -0
  154. package/dist/core/screen.js.map +1 -0
  155. package/dist/core/session.d.ts +42 -0
  156. package/dist/core/session.js +29 -0
  157. package/dist/core/session.js.map +1 -0
  158. package/dist/debug/dump-system-prompt.d.ts +1 -0
  159. package/dist/debug/dump-system-prompt.js +34 -0
  160. package/dist/debug/dump-system-prompt.js.map +1 -0
  161. package/dist/device/android.d.ts +25 -0
  162. package/dist/device/android.js +231 -0
  163. package/dist/device/android.js.map +1 -0
  164. package/dist/device/apps.d.ts +3 -0
  165. package/dist/device/apps.js +77 -0
  166. package/dist/device/apps.js.map +1 -0
  167. package/dist/device/base.d.ts +20 -0
  168. package/dist/device/base.js +2 -0
  169. package/dist/device/base.js.map +1 -0
  170. package/dist/device/ui-xml.d.ts +29 -0
  171. package/dist/device/ui-xml.js +194 -0
  172. package/dist/device/ui-xml.js.map +1 -0
  173. package/dist/fleet/adapters/process/node-process-manager.d.ts +157 -0
  174. package/dist/fleet/adapters/process/node-process-manager.js +664 -0
  175. package/dist/fleet/adapters/process/node-process-manager.js.map +1 -0
  176. package/dist/fleet/adapters/sources/local-adb.d.ts +105 -0
  177. package/dist/fleet/adapters/sources/local-adb.js +353 -0
  178. package/dist/fleet/adapters/sources/local-adb.js.map +1 -0
  179. package/dist/fleet/adapters/sources/remote-adb.d.ts +97 -0
  180. package/dist/fleet/adapters/sources/remote-adb.js +138 -0
  181. package/dist/fleet/adapters/sources/remote-adb.js.map +1 -0
  182. package/dist/fleet/adapters/state/beeos-cli-store.d.ts +72 -0
  183. package/dist/fleet/adapters/state/beeos-cli-store.js +250 -0
  184. package/dist/fleet/adapters/state/beeos-cli-store.js.map +1 -0
  185. package/dist/fleet/adapters/state/port-allocator.d.ts +43 -0
  186. package/dist/fleet/adapters/state/port-allocator.js +173 -0
  187. package/dist/fleet/adapters/state/port-allocator.js.map +1 -0
  188. package/dist/fleet/domain/device.d.ts +138 -0
  189. package/dist/fleet/domain/device.js +49 -0
  190. package/dist/fleet/domain/device.js.map +1 -0
  191. package/dist/fleet/domain/events.d.ts +102 -0
  192. package/dist/fleet/domain/events.js +15 -0
  193. package/dist/fleet/domain/events.js.map +1 -0
  194. package/dist/fleet/domain/fsm.d.ts +122 -0
  195. package/dist/fleet/domain/fsm.js +475 -0
  196. package/dist/fleet/domain/fsm.js.map +1 -0
  197. package/dist/fleet/http/status-client.d.ts +31 -0
  198. package/dist/fleet/http/status-client.js +115 -0
  199. package/dist/fleet/http/status-client.js.map +1 -0
  200. package/dist/fleet/http/status-server.d.ts +64 -0
  201. package/dist/fleet/http/status-server.js +200 -0
  202. package/dist/fleet/http/status-server.js.map +1 -0
  203. package/dist/fleet/index.d.ts +27 -0
  204. package/dist/fleet/index.js +17 -0
  205. package/dist/fleet/index.js.map +1 -0
  206. package/dist/fleet/installer/index.d.ts +12 -0
  207. package/dist/fleet/installer/index.js +13 -0
  208. package/dist/fleet/installer/index.js.map +1 -0
  209. package/dist/fleet/installer/launchd-mac.d.ts +73 -0
  210. package/dist/fleet/installer/launchd-mac.js +291 -0
  211. package/dist/fleet/installer/launchd-mac.js.map +1 -0
  212. package/dist/fleet/installer/service-spec.d.ts +70 -0
  213. package/dist/fleet/installer/service-spec.js +43 -0
  214. package/dist/fleet/installer/service-spec.js.map +1 -0
  215. package/dist/fleet/installer/spawn-env.d.ts +45 -0
  216. package/dist/fleet/installer/spawn-env.js +224 -0
  217. package/dist/fleet/installer/spawn-env.js.map +1 -0
  218. package/dist/fleet/ports/clock.d.ts +19 -0
  219. package/dist/fleet/ports/clock.js +26 -0
  220. package/dist/fleet/ports/clock.js.map +1 -0
  221. package/dist/fleet/ports/device-source.d.ts +28 -0
  222. package/dist/fleet/ports/device-source.js +18 -0
  223. package/dist/fleet/ports/device-source.js.map +1 -0
  224. package/dist/fleet/ports/process-manager.d.ts +110 -0
  225. package/dist/fleet/ports/process-manager.js +27 -0
  226. package/dist/fleet/ports/process-manager.js.map +1 -0
  227. package/dist/fleet/ports/state-registry.d.ts +49 -0
  228. package/dist/fleet/ports/state-registry.js +12 -0
  229. package/dist/fleet/ports/state-registry.js.map +1 -0
  230. package/dist/fleet/supervisor.d.ts +107 -0
  231. package/dist/fleet/supervisor.js +508 -0
  232. package/dist/fleet/supervisor.js.map +1 -0
  233. package/dist/grounding/grounder.d.ts +46 -0
  234. package/dist/grounding/grounder.js +82 -0
  235. package/dist/grounding/grounder.js.map +1 -0
  236. package/dist/inbound/acp/handlers/device.d.ts +43 -0
  237. package/dist/inbound/acp/handlers/device.js +153 -0
  238. package/dist/inbound/acp/handlers/device.js.map +1 -0
  239. package/dist/inbound/acp/handlers/initialize.d.ts +71 -0
  240. package/dist/inbound/acp/handlers/initialize.js +53 -0
  241. package/dist/inbound/acp/handlers/initialize.js.map +1 -0
  242. package/dist/inbound/acp/handlers/models.d.ts +16 -0
  243. package/dist/inbound/acp/handlers/models.js +23 -0
  244. package/dist/inbound/acp/handlers/models.js.map +1 -0
  245. package/dist/inbound/acp/handlers/session.d.ts +51 -0
  246. package/dist/inbound/acp/handlers/session.js +61 -0
  247. package/dist/inbound/acp/handlers/session.js.map +1 -0
  248. package/dist/inbound/acp/handlers/skills.d.ts +8 -0
  249. package/dist/inbound/acp/handlers/skills.js +9 -0
  250. package/dist/inbound/acp/handlers/skills.js.map +1 -0
  251. package/dist/inbound/acp/notifier.d.ts +35 -0
  252. package/dist/inbound/acp/notifier.js +45 -0
  253. package/dist/inbound/acp/notifier.js.map +1 -0
  254. package/dist/inbound/acp/router.d.ts +67 -0
  255. package/dist/inbound/acp/router.js +179 -0
  256. package/dist/inbound/acp/router.js.map +1 -0
  257. package/dist/inbound/cli/fleet-command.d.ts +34 -0
  258. package/dist/inbound/cli/fleet-command.js +792 -0
  259. package/dist/inbound/cli/fleet-command.js.map +1 -0
  260. package/dist/inbound/cli/main.d.ts +38 -0
  261. package/dist/inbound/cli/main.js +364 -0
  262. package/dist/inbound/cli/main.js.map +1 -0
  263. package/dist/inbound/cli/run-command.d.ts +101 -0
  264. package/dist/inbound/cli/run-command.js +405 -0
  265. package/dist/inbound/cli/run-command.js.map +1 -0
  266. package/dist/inbound/cli/skills-command.d.ts +39 -0
  267. package/dist/inbound/cli/skills-command.js +333 -0
  268. package/dist/inbound/cli/skills-command.js.map +1 -0
  269. package/dist/inbound/http/server.d.ts +7 -0
  270. package/dist/inbound/http/server.js +8 -0
  271. package/dist/inbound/http/server.js.map +1 -0
  272. package/dist/index.d.ts +66 -0
  273. package/dist/index.js +48 -0
  274. package/dist/index.js.map +1 -0
  275. package/dist/logger/index.d.ts +37 -0
  276. package/dist/logger/index.js +84 -0
  277. package/dist/logger/index.js.map +1 -0
  278. package/dist/mcp-client/autospawn.d.ts +67 -0
  279. package/dist/mcp-client/autospawn.js +173 -0
  280. package/dist/mcp-client/autospawn.js.map +1 -0
  281. package/dist/mcp-client/client.d.ts +78 -0
  282. package/dist/mcp-client/client.js +168 -0
  283. package/dist/mcp-client/client.js.map +1 -0
  284. package/dist/mcp-client/index.d.ts +7 -0
  285. package/dist/mcp-client/index.js +4 -0
  286. package/dist/mcp-client/index.js.map +1 -0
  287. package/dist/mcp-client/inproc.d.ts +47 -0
  288. package/dist/mcp-client/inproc.js +229 -0
  289. package/dist/mcp-client/inproc.js.map +1 -0
  290. package/dist/mcp-client/runtime.d.ts +34 -0
  291. package/dist/mcp-client/runtime.js +15 -0
  292. package/dist/mcp-client/runtime.js.map +1 -0
  293. package/dist/model/adapters/autoglm.d.ts +31 -0
  294. package/dist/model/adapters/autoglm.js +409 -0
  295. package/dist/model/adapters/autoglm.js.map +1 -0
  296. package/dist/model/adapters/base.d.ts +13 -0
  297. package/dist/model/adapters/base.js +27 -0
  298. package/dist/model/adapters/base.js.map +1 -0
  299. package/dist/model/adapters/guiowl.d.ts +1 -0
  300. package/dist/model/adapters/guiowl.js +253 -0
  301. package/dist/model/adapters/guiowl.js.map +1 -0
  302. package/dist/model/adapters/index.d.ts +6 -0
  303. package/dist/model/adapters/index.js +8 -0
  304. package/dist/model/adapters/index.js.map +1 -0
  305. package/dist/model/adapters/maiui.d.ts +1 -0
  306. package/dist/model/adapters/maiui.js +117 -0
  307. package/dist/model/adapters/maiui.js.map +1 -0
  308. package/dist/model/adapters/qwenvl.d.ts +1 -0
  309. package/dist/model/adapters/qwenvl.js +108 -0
  310. package/dist/model/adapters/qwenvl.js.map +1 -0
  311. package/dist/model/adapters/showui.d.ts +1 -0
  312. package/dist/model/adapters/showui.js +132 -0
  313. package/dist/model/adapters/showui.js.map +1 -0
  314. package/dist/model/adapters/tool-call.d.ts +6 -0
  315. package/dist/model/adapters/tool-call.js +102 -0
  316. package/dist/model/adapters/tool-call.js.map +1 -0
  317. package/dist/model/adapters/uitars.d.ts +1 -0
  318. package/dist/model/adapters/uitars.js +180 -0
  319. package/dist/model/adapters/uitars.js.map +1 -0
  320. package/dist/model/base.d.ts +32 -0
  321. package/dist/model/base.js +2 -0
  322. package/dist/model/base.js.map +1 -0
  323. package/dist/model/client.d.ts +26 -0
  324. package/dist/model/client.js +300 -0
  325. package/dist/model/client.js.map +1 -0
  326. package/dist/model/image/compress.d.ts +53 -0
  327. package/dist/model/image/compress.js +89 -0
  328. package/dist/model/image/compress.js.map +1 -0
  329. package/dist/model/image/transport.d.ts +134 -0
  330. package/dist/model/image/transport.js +154 -0
  331. package/dist/model/image/transport.js.map +1 -0
  332. package/dist/orchestrator-system-prompt.d.ts +6 -0
  333. package/dist/orchestrator-system-prompt.js +81 -0
  334. package/dist/orchestrator-system-prompt.js.map +1 -0
  335. package/dist/pi-context.d.ts +82 -0
  336. package/dist/pi-context.js +62 -0
  337. package/dist/pi-context.js.map +1 -0
  338. package/dist/pi-local-skills.d.ts +17 -0
  339. package/dist/pi-local-skills.js +24 -0
  340. package/dist/pi-local-skills.js.map +1 -0
  341. package/dist/plugins/acp/index.d.ts +46 -0
  342. package/dist/plugins/acp/index.js +111 -0
  343. package/dist/plugins/acp/index.js.map +1 -0
  344. package/dist/plugins/agent-sync/index.d.ts +40 -0
  345. package/dist/plugins/agent-sync/index.js +98 -0
  346. package/dist/plugins/agent-sync/index.js.map +1 -0
  347. package/dist/plugins/http-debug/index.d.ts +30 -0
  348. package/dist/plugins/http-debug/index.js +64 -0
  349. package/dist/plugins/http-debug/index.js.map +1 -0
  350. package/dist/plugins/http-debug/server.d.ts +92 -0
  351. package/dist/plugins/http-debug/server.js +464 -0
  352. package/dist/plugins/http-debug/server.js.map +1 -0
  353. package/dist/ports/agent-core.d.ts +158 -0
  354. package/dist/ports/agent-core.js +2 -0
  355. package/dist/ports/agent-core.js.map +1 -0
  356. package/dist/ports/agent-host.d.ts +125 -0
  357. package/dist/ports/agent-host.js +23 -0
  358. package/dist/ports/agent-host.js.map +1 -0
  359. package/dist/ports/device.d.ts +53 -0
  360. package/dist/ports/device.js +13 -0
  361. package/dist/ports/device.js.map +1 -0
  362. package/dist/ports/identity.d.ts +22 -0
  363. package/dist/ports/identity.js +9 -0
  364. package/dist/ports/identity.js.map +1 -0
  365. package/dist/ports/plugin.d.ts +62 -0
  366. package/dist/ports/plugin.js +35 -0
  367. package/dist/ports/plugin.js.map +1 -0
  368. package/dist/ports/transport.d.ts +32 -0
  369. package/dist/ports/transport.js +12 -0
  370. package/dist/ports/transport.js.map +1 -0
  371. package/dist/ports/vlm.d.ts +59 -0
  372. package/dist/ports/vlm.js +14 -0
  373. package/dist/ports/vlm.js.map +1 -0
  374. package/dist/test-lan-autoglm.d.ts +7 -0
  375. package/dist/test-lan-autoglm.js +46 -0
  376. package/dist/test-lan-autoglm.js.map +1 -0
  377. package/dist/test-mem-breakdown.d.ts +1 -0
  378. package/dist/test-mem-breakdown.js +103 -0
  379. package/dist/test-mem-breakdown.js.map +1 -0
  380. package/dist/test-mem.d.ts +1 -0
  381. package/dist/test-mem.js +60 -0
  382. package/dist/test-mem.js.map +1 -0
  383. package/dist/test-mobile-use.d.ts +1 -0
  384. package/dist/test-mobile-use.js +18 -0
  385. package/dist/test-mobile-use.js.map +1 -0
  386. package/dist/test-screenshot-loop.d.ts +1 -0
  387. package/dist/test-screenshot-loop.js +43 -0
  388. package/dist/test-screenshot-loop.js.map +1 -0
  389. package/dist/test-screenshot.d.ts +1 -0
  390. package/dist/test-screenshot.js +10 -0
  391. package/dist/test-screenshot.js.map +1 -0
  392. package/dist/test-ui-xml-dump.d.ts +15 -0
  393. package/dist/test-ui-xml-dump.js +49 -0
  394. package/dist/test-ui-xml-dump.js.map +1 -0
  395. package/dist/types.d.ts +69 -0
  396. package/dist/types.js +23 -0
  397. package/dist/types.js.map +1 -0
  398. package/package.json +94 -0
@@ -0,0 +1,291 @@
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 { execFile } from "node:child_process";
27
+ import * as fs from "node:fs/promises";
28
+ import * as fsSync from "node:fs";
29
+ import * as os from "node:os";
30
+ import * as path from "node:path";
31
+ import { promisify } from "node:util";
32
+ const execFileP = promisify(execFile);
33
+ const LAUNCH_AGENTS_DIR = path.join(os.homedir(), "Library", "LaunchAgents");
34
+ /** Legacy per-device labels written by `beeos device attach` v0.3.x. */
35
+ export const LEGACY_DEVICE_AGENT_PREFIX = "ai.beeos.device-agent-";
36
+ export const LEGACY_SCRCPY_BRIDGE_PREFIX = "ai.beeos.scrcpy-bridge-";
37
+ /**
38
+ * Render the plist file for a `FleetServiceSpec` and bootstrap it into
39
+ * the user's GUI session. Idempotent — calling twice in a row leaves
40
+ * the same loaded service running with the latest plist.
41
+ */
42
+ export async function installFleetLaunchd(spec) {
43
+ if (process.platform !== "darwin") {
44
+ throw new Error(`installFleetLaunchd is macOS-only (platform=${process.platform}). ` +
45
+ "Linux / Windows fleet installation is not yet supported — run `device-agent fleet start` manually.");
46
+ }
47
+ const plistPath = path.join(LAUNCH_AGENTS_DIR, `${spec.label}.plist`);
48
+ await fs.mkdir(path.dirname(plistPath), { recursive: true });
49
+ await fs.mkdir(path.dirname(spec.logFile), { recursive: true });
50
+ await fs.writeFile(plistPath, renderFleetPlist(spec), { mode: 0o644 });
51
+ const warnings = [];
52
+ let bootstrapped = false;
53
+ const uid = process.getuid?.();
54
+ if (uid === undefined) {
55
+ warnings.push("process.getuid() unavailable; skipped launchctl bootstrap (plist still written).");
56
+ return { plistPath, bootstrapped: false, warnings };
57
+ }
58
+ // Bootstrap sequence: best-effort bootout (ignore "Service not loaded"),
59
+ // then bootstrap+kickstart. Mirrors web/packages/core/services/launchd.ts.
60
+ //
61
+ // macOS Sonoma+ caveat: `bootout` is asynchronous, so a `bootstrap`
62
+ // issued immediately after sometimes fails with `5: Input/output
63
+ // error` while launchd is still tearing down the previous service.
64
+ // We give launchd a tiny grace window then retry once before falling
65
+ // back to `load -w`.
66
+ try {
67
+ await execFileP("launchctl", ["bootout", `gui/${uid}/${spec.label}`]);
68
+ }
69
+ catch {
70
+ /* not previously loaded — fine */
71
+ }
72
+ const tryBootstrap = async () => {
73
+ try {
74
+ await execFileP("launchctl", ["bootstrap", `gui/${uid}`, plistPath]);
75
+ return { ok: true };
76
+ }
77
+ catch (e) {
78
+ return { ok: false, err: e instanceof Error ? e.message : String(e) };
79
+ }
80
+ };
81
+ let bootstrapResult = await tryBootstrap();
82
+ if (!bootstrapResult.ok && /Input\/output error/i.test(bootstrapResult.err)) {
83
+ // Known launchd race after bootout. Wait 250ms and retry once.
84
+ await new Promise((resolve) => setTimeout(resolve, 250));
85
+ bootstrapResult = await tryBootstrap();
86
+ }
87
+ if (bootstrapResult.ok) {
88
+ bootstrapped = true;
89
+ }
90
+ else {
91
+ warnings.push(`launchctl bootstrap failed: ${bootstrapResult.err}; trying legacy load -w`);
92
+ try {
93
+ await execFileP("launchctl", ["load", "-w", plistPath]);
94
+ bootstrapped = true;
95
+ }
96
+ catch (legacyErr) {
97
+ const legacyMsg = legacyErr instanceof Error ? legacyErr.message : String(legacyErr);
98
+ warnings.push(`launchctl load -w also failed: ${legacyMsg}`);
99
+ }
100
+ }
101
+ if (bootstrapped) {
102
+ try {
103
+ await execFileP("launchctl", ["kickstart", "-k", `gui/${uid}/${spec.label}`]);
104
+ }
105
+ catch {
106
+ /* harmless on first install */
107
+ }
108
+ }
109
+ return { plistPath, bootstrapped, warnings };
110
+ }
111
+ /**
112
+ * Stop and remove the `ai.beeos.device-fleet` plist. Returns
113
+ * `removed: false` when nothing was installed (idempotent).
114
+ */
115
+ export async function uninstallFleetLaunchd(label) {
116
+ const plistPath = path.join(LAUNCH_AGENTS_DIR, `${label}.plist`);
117
+ const warnings = [];
118
+ const existed = fsSync.existsSync(plistPath);
119
+ const uid = process.getuid?.();
120
+ if (uid !== undefined) {
121
+ try {
122
+ await execFileP("launchctl", ["bootout", `gui/${uid}/${label}`]);
123
+ }
124
+ catch {
125
+ try {
126
+ await execFileP("launchctl", ["unload", "-w", plistPath]);
127
+ }
128
+ catch {
129
+ /* ignore */
130
+ }
131
+ }
132
+ }
133
+ else {
134
+ try {
135
+ await execFileP("launchctl", ["unload", "-w", plistPath]);
136
+ }
137
+ catch {
138
+ /* ignore */
139
+ }
140
+ }
141
+ if (existed) {
142
+ try {
143
+ await fs.unlink(plistPath);
144
+ }
145
+ catch (e) {
146
+ warnings.push(`failed to delete ${plistPath}: ${e.message}`);
147
+ }
148
+ }
149
+ return { removed: existed, plistPath, warnings };
150
+ }
151
+ /**
152
+ * Sweep `~/Library/LaunchAgents/` for legacy per-device plists left
153
+ * behind by older `beeos device attach`, unload them via launchctl,
154
+ * and delete the files. The fleet supersedes them all.
155
+ *
156
+ * No-op when the directory doesn't exist (fresh install) or no
157
+ * matching files are found.
158
+ */
159
+ export async function migrateFromAttach() {
160
+ const removedDeviceAgents = [];
161
+ const removedScrcpyBridges = [];
162
+ const warnings = [];
163
+ let entries;
164
+ try {
165
+ entries = await fs.readdir(LAUNCH_AGENTS_DIR);
166
+ }
167
+ catch (e) {
168
+ const code = e.code;
169
+ if (code === "ENOENT")
170
+ return { removedDeviceAgents, removedScrcpyBridges, warnings };
171
+ warnings.push(`could not list ${LAUNCH_AGENTS_DIR}: ${e.message}`);
172
+ return { removedDeviceAgents, removedScrcpyBridges, warnings };
173
+ }
174
+ const uid = process.getuid?.();
175
+ for (const file of entries) {
176
+ if (!file.endsWith(".plist"))
177
+ continue;
178
+ const label = file.slice(0, -".plist".length);
179
+ const isDeviceAgent = label.startsWith(LEGACY_DEVICE_AGENT_PREFIX);
180
+ const isScrcpyBridge = label.startsWith(LEGACY_SCRCPY_BRIDGE_PREFIX);
181
+ if (!isDeviceAgent && !isScrcpyBridge)
182
+ continue;
183
+ const plistPath = path.join(LAUNCH_AGENTS_DIR, file);
184
+ if (uid !== undefined) {
185
+ try {
186
+ await execFileP("launchctl", ["bootout", `gui/${uid}/${label}`]);
187
+ }
188
+ catch {
189
+ try {
190
+ await execFileP("launchctl", ["unload", "-w", plistPath]);
191
+ }
192
+ catch {
193
+ /* ignore — likely never loaded */
194
+ }
195
+ }
196
+ }
197
+ else {
198
+ try {
199
+ await execFileP("launchctl", ["unload", "-w", plistPath]);
200
+ }
201
+ catch {
202
+ /* ignore */
203
+ }
204
+ }
205
+ try {
206
+ await fs.unlink(plistPath);
207
+ if (isDeviceAgent)
208
+ removedDeviceAgents.push(label);
209
+ else
210
+ removedScrcpyBridges.push(label);
211
+ }
212
+ catch (e) {
213
+ warnings.push(`failed to delete ${plistPath}: ${e.message}`);
214
+ }
215
+ }
216
+ return { removedDeviceAgents, removedScrcpyBridges, warnings };
217
+ }
218
+ /**
219
+ * Render a launchd plist for a `FleetServiceSpec`.
220
+ *
221
+ * Exported for unit tests — the full byte-for-byte XML is the contract
222
+ * we ship to launchd, so any change MUST surface as a test diff.
223
+ */
224
+ export function renderFleetPlist(spec) {
225
+ const args = [spec.command, ...spec.args]
226
+ .map((a) => ` <string>${escapeXml(a)}</string>`)
227
+ .join("\n");
228
+ const env = spec.env ?? {};
229
+ const envEntries = Object.entries(env);
230
+ // Thread a known-good macOS PATH through the plist so launchd-spawned
231
+ // children can resolve `node` (when `command` itself is absolute, the
232
+ // children we spawn — adb, scrcpy-bridge — still need a sane PATH).
233
+ const baseMacPath = "/usr/local/bin:/opt/homebrew/bin:/usr/bin:/bin";
234
+ if (!envEntries.some(([k]) => k === "PATH")) {
235
+ envEntries.unshift(["PATH", baseMacPath]);
236
+ }
237
+ const envXml = envEntries
238
+ .map(([k, v]) => ` <key>${escapeXml(k)}</key>\n <string>${escapeXml(v)}</string>`)
239
+ .join("\n");
240
+ const restart = spec.restart ?? "on-failure";
241
+ let keepAliveXml = "";
242
+ if (restart === "always") {
243
+ keepAliveXml = " <key>KeepAlive</key>\n <true/>\n";
244
+ }
245
+ else if (restart === "on-failure") {
246
+ keepAliveXml =
247
+ " <key>KeepAlive</key>\n <dict>\n <key>SuccessfulExit</key>\n <false/>\n </dict>\n";
248
+ }
249
+ const cwdXml = spec.cwd
250
+ ? ` <key>WorkingDirectory</key>\n <string>${escapeXml(spec.cwd)}</string>\n`
251
+ : "";
252
+ return `<?xml version="1.0" encoding="UTF-8"?>
253
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
254
+ <plist version="1.0">
255
+ <dict>
256
+ <key>Label</key>
257
+ <string>${escapeXml(spec.label)}</string>
258
+ <key>ProgramArguments</key>
259
+ <array>
260
+ ${args}
261
+ </array>
262
+ <key>RunAtLoad</key>
263
+ <true/>
264
+ ${keepAliveXml} <key>ThrottleInterval</key>
265
+ <integer>10</integer>
266
+ <key>ProcessType</key>
267
+ <string>Background</string>
268
+ <key>StandardOutPath</key>
269
+ <string>${escapeXml(spec.logFile)}</string>
270
+ <key>StandardErrorPath</key>
271
+ <string>${escapeXml(spec.logFile)}</string>
272
+ ${cwdXml} <key>EnvironmentVariables</key>
273
+ <dict>
274
+ ${envXml}
275
+ </dict>
276
+ </dict>
277
+ </plist>
278
+ `;
279
+ }
280
+ function escapeXml(s) {
281
+ return s
282
+ .replace(/&/g, "&amp;")
283
+ .replace(/</g, "&lt;")
284
+ .replace(/>/g, "&gt;")
285
+ .replace(/"/g, "&quot;");
286
+ }
287
+ /** Path that `installFleetLaunchd` writes to. Exported for tests / `fleet logs`. */
288
+ export function fleetPlistPath(label) {
289
+ return path.join(LAUNCH_AGENTS_DIR, `${label}.plist`);
290
+ }
291
+ //# sourceMappingURL=launchd-mac.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launchd-mac.js","sourceRoot":"","sources":["../../../src/fleet/installer/launchd-mac.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Fleet OS-service spec — input to `installer/install.ts`.
3
+ *
4
+ * This is a deliberately tiny structural type: the device-agent
5
+ * package does NOT depend on `@beeos/core`'s richer `ServiceSpec`
6
+ * shape because that would pull the entire web monorepo into the
7
+ * fleet runtime. Both shapes converge on the same plist, but we own
8
+ * the rendering inside `installer/launchd-mac.ts` so the fleet stays
9
+ * a closed, single-purpose package.
10
+ *
11
+ * Fields:
12
+ * - `label`: launchd label written to the plist `<key>Label</key>` and
13
+ * also used as the filename (`<label>.plist`).
14
+ * - `command` / `args`: ProgramArguments. `command` MUST be an absolute
15
+ * path or a bare name resolvable on the user's PATH at install time.
16
+ * We do **not** auto-absolutize here — the install flow does, so
17
+ * tests can keep using bare names.
18
+ * - `env`: optional env vars merged into `EnvironmentVariables`.
19
+ * - `restart`: `"always"` keeps the process alive across normal exits;
20
+ * `"on-failure"` (default) only restarts on non-zero exit.
21
+ * - `logFile`: absolute path for both stdout and stderr (single file —
22
+ * launchd merges them when both keys point at the same path).
23
+ * - `cwd`: optional working directory.
24
+ */
25
+ export type FleetServiceLabel = `ai.beeos.${string}`;
26
+ export type FleetRestartPolicy = "always" | "on-failure" | "never";
27
+ export interface FleetServiceSpec {
28
+ label: FleetServiceLabel;
29
+ command: string;
30
+ args: string[];
31
+ env?: Record<string, string>;
32
+ restart?: FleetRestartPolicy;
33
+ logFile: string;
34
+ cwd?: string;
35
+ }
36
+ export declare const FLEET_LABEL: FleetServiceLabel;
37
+ export interface BuildFleetSpecInput {
38
+ /**
39
+ * Absolute path to the node binary (or any wrapper) we ask launchd
40
+ * to invoke. Defaults to `process.execPath` — the very binary that's
41
+ * running the `fleet enable` command — so the daemon is guaranteed
42
+ * to use a node version compatible with the installed sources.
43
+ */
44
+ nodeBin?: string;
45
+ /**
46
+ * Absolute path to the device-agent CLI entrypoint. Required so the
47
+ * plist doesn't depend on the user's PATH at launchd boot time
48
+ * (which differs from a login shell on macOS).
49
+ */
50
+ cliEntry: string;
51
+ /**
52
+ * Extra env vars to inject — typically just `AGENT_GATEWAY_URL` and
53
+ * the fleet tuning knobs (`FLEET_ADB_GRACE_MS`, etc.) that the user
54
+ * passed on the command line.
55
+ */
56
+ env?: Record<string, string>;
57
+ /** Override log path (defaults to `~/.beeos/logs/device-fleet.log`). */
58
+ logFile?: string;
59
+ /** Override `~/.beeos` location (mirrors what the daemon honours via `BEEOS_HOME`). */
60
+ beeosHome?: string;
61
+ }
62
+ /**
63
+ * Build the canonical `ai.beeos.device-fleet` spec.
64
+ *
65
+ * Why `restart: "always"`: the fleet daemon owns ALL device-agent
66
+ * supervision now — if it stays down, every connected device goes
67
+ * silent. launchd's `KeepAlive: true` is the simplest watchdog that
68
+ * matches the BFD-style failure model we want.
69
+ */
70
+ export declare function buildFleetServiceSpec(input: BuildFleetSpecInput): FleetServiceSpec;
@@ -0,0 +1,43 @@
1
+ import * as os from "node:os";
2
+ import * as path from "node:path";
3
+ export const FLEET_LABEL = "ai.beeos.device-fleet";
4
+ /**
5
+ * Resolve `~/.beeos`, honouring the same `BEEOS_HOME` override the
6
+ * daemon uses. Kept inline so the installer doesn't import the
7
+ * supervisor barrel (which would pull in adb sources etc.).
8
+ */
9
+ function resolveBeeosHome(override) {
10
+ if (override && override.length > 0)
11
+ return override;
12
+ const env = process.env.BEEOS_HOME;
13
+ if (env && env.length > 0)
14
+ return env;
15
+ return path.join(os.homedir(), ".beeos");
16
+ }
17
+ /**
18
+ * Build the canonical `ai.beeos.device-fleet` spec.
19
+ *
20
+ * Why `restart: "always"`: the fleet daemon owns ALL device-agent
21
+ * supervision now — if it stays down, every connected device goes
22
+ * silent. launchd's `KeepAlive: true` is the simplest watchdog that
23
+ * matches the BFD-style failure model we want.
24
+ */
25
+ export function buildFleetServiceSpec(input) {
26
+ const beeosHome = resolveBeeosHome(input.beeosHome);
27
+ const logFile = input.logFile ?? path.join(beeosHome, "logs", "device-fleet.log");
28
+ return {
29
+ label: FLEET_LABEL,
30
+ command: input.nodeBin ?? process.execPath,
31
+ args: [input.cliEntry, "fleet", "start"],
32
+ env: {
33
+ // Always thread BEEOS_HOME so the daemon resolves the same set of
34
+ // files (devices.json, fleet.json, key files) regardless of which
35
+ // user opened launchd's login session.
36
+ BEEOS_HOME: beeosHome,
37
+ ...(input.env ?? {}),
38
+ },
39
+ restart: "always",
40
+ logFile,
41
+ };
42
+ }
43
+ //# sourceMappingURL=service-spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-spec.js","sourceRoot":"","sources":["../../../src/fleet/installer/service-spec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAyClC,MAAM,CAAC,MAAM,WAAW,GAAsB,uBAAuB,CAAC;AAgCtE;;;;GAIG;AACH,SAAS,gBAAgB,CAAC,QAAiB;IACzC,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,QAAQ,CAAC;IACrD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IACnC,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IACtC,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC3C,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAA0B;IAC9D,MAAM,SAAS,GAAG,gBAAgB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAClF,OAAO;QACL,KAAK,EAAE,WAAW;QAClB,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,OAAO,CAAC,QAAQ;QAC1C,IAAI,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC;QACxC,GAAG,EAAE;YACH,kEAAkE;YAClE,kEAAkE;YAClE,uCAAuC;YACvC,UAAU,EAAE,SAAS;YACrB,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,CAAC;SACrB;QACD,OAAO,EAAE,QAAQ;QACjB,OAAO;KACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,45 @@
1
+ export interface DeriveSpawnEnvOptions {
2
+ /** Absolute path to the device-agent CLI entry that the fleet plist will exec. */
3
+ cliEntry: string;
4
+ /** Override `~/.beeos` (matches the daemon's `BEEOS_HOME` semantics). */
5
+ beeosHome?: string;
6
+ /** Inject explicit env vars (CLI flags) — these take precedence over discovery. */
7
+ overrides?: Record<string, string | undefined>;
8
+ /** Snapshot of the current shell environment (defaults to `process.env`). */
9
+ currentEnv?: NodeJS.ProcessEnv;
10
+ /** Test hooks. */
11
+ fileExists?: (p: string) => Promise<boolean>;
12
+ whichBin?: (name: string) => Promise<string | null>;
13
+ readConfigToml?: (cfgPath: string) => Promise<ConfigToml | null>;
14
+ }
15
+ export interface ConfigToml {
16
+ agentGatewayUrl?: string;
17
+ bridgeUrl?: string;
18
+ }
19
+ /**
20
+ * Derive the env vars that should be threaded into the launchd
21
+ * `EnvironmentVariables` block for the fleet plist.
22
+ *
23
+ * Returns ONLY the keys that have a value — `installFleetLaunchd` will
24
+ * merge them with `BEEOS_HOME` (always) and `PATH` (defaulted to the
25
+ * minimal mac PATH if neither operator nor this function provides one).
26
+ */
27
+ export declare function deriveFleetSpawnEnv(opts: DeriveSpawnEnvOptions): Promise<{
28
+ env: Record<string, string>;
29
+ warnings: string[];
30
+ }>;
31
+ /**
32
+ * Minimal `~/.beeos/config.toml` reader — only extracts the two keys
33
+ * we care about (`platform.agent_gateway_url`, `platform.bridge_url`).
34
+ *
35
+ * Keeping this inline avoids pulling `smol-toml` (or any other parser)
36
+ * into the device-agent runtime — `config.toml` is shaped exactly as
37
+ * the BeeOS CLI writes it: a single `[platform]` section with bare
38
+ * `key = "value"` lines. Comments and arrays are not supported here
39
+ * because they are not part of the file we own.
40
+ */
41
+ export declare function defaultReadConfigToml(cfgPath: string): Promise<ConfigToml | null>;
42
+ /**
43
+ * Pure parser exported for unit tests — operates on the file body text.
44
+ */
45
+ export declare function parseConfigToml(text: string): ConfigToml;