@openscout/scout 0.2.84 → 0.2.86

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 (451) hide show
  1. package/README.md +1 -1
  2. package/bin/scoutd +0 -0
  3. package/dist/build-manifest.json +3 -3
  4. package/dist/client/assets/ActivityScreen-C7AwUogt.js +1 -0
  5. package/dist/client/assets/{AddProjectForm-Czb5uwou.js → AddProjectForm-BNRpRPod.js} +1 -1
  6. package/dist/client/assets/AgentAvatar-B1xvQ7ej.js +1 -0
  7. package/dist/client/assets/AgentConfigurationScreen-BoBQpyz5.js +1 -0
  8. package/dist/client/assets/AgentDefinitionsWorkspace-rw3vh8Lm.js +1 -0
  9. package/dist/client/assets/{AgentDetailCard-Biq8b2gv.js → AgentDetailCard-FelCxQrT.js} +1 -1
  10. package/dist/client/assets/AgentFloorView-Crdw8Uo5.js +1 -0
  11. package/dist/client/assets/AgentInfoScreen-Cge7HHbV.js +1 -0
  12. package/dist/client/assets/{AgentLaneCard-C4DMQR-c.js → AgentLaneCard-CRDG74C1.js} +1 -1
  13. package/dist/client/assets/{AgentLaneChrome-D1xNNf7A.js → AgentLaneChrome-CWFqUdch.js} +1 -1
  14. package/dist/client/assets/AgentLaneDetailSheet-DCIIg3Zp.js +4 -0
  15. package/dist/client/assets/{AgentLaneSummaryResize-C9loK-st.js → AgentLaneSummaryResize-yTM4GQAJ.js} +1 -1
  16. package/dist/client/assets/AgentLanesEmbedScreen-BJLwXSNp.js +1 -0
  17. package/dist/client/assets/{AgentLanesPreflight-M7iDXdP2.js → AgentLanesPreflight-DJeDRTAN.js} +1 -1
  18. package/dist/client/assets/AgentLanesView-CbY9qD0z.js +2 -0
  19. package/dist/client/assets/{AgentLiveActions-0iy8QZ1T.js → AgentLiveActions-Bn3zeZBN.js} +1 -1
  20. package/dist/client/assets/AgentSessions-czl5zT7A.js +6 -0
  21. package/dist/client/assets/AgentsConsole-CoT2crwq.js +1 -0
  22. package/dist/client/assets/{AgentsScreen-Bww6HgFs.js → AgentsScreen-BcPM-z1T.js} +1 -1
  23. package/dist/client/assets/AgentsSubnav-3_vpn2bT.js +1 -0
  24. package/dist/client/assets/AstronautSuit-BADl7m8x.js +1 -0
  25. package/dist/client/assets/{AtopView-h_aFoNkP.js → AtopView-DymBCiXv.js} +1 -1
  26. package/dist/client/assets/{BackToPicker-BXp5E2ck.js → BackToPicker-CqYhOaLB.js} +1 -1
  27. package/dist/client/assets/BriefingDetailScreen-DDfZ8ci1.js +1 -0
  28. package/dist/client/assets/{BriefingsScreen-BTsvr5fv.js → BriefingsScreen-CLvSOJjy.js} +1 -1
  29. package/dist/client/assets/{BrokerMetadataPanel-jg7odHQp.js → BrokerMetadataPanel-DFAH-NO6.js} +1 -1
  30. package/dist/client/assets/BrokerScreen-Bkvu92jk.js +5 -0
  31. package/dist/client/assets/{Canvas-BePL08RR.js → Canvas-KyTsDJlB.js} +1 -1
  32. package/dist/client/assets/ChatCollapsedStrip-Bjjqa30K.js +1 -0
  33. package/dist/client/assets/{CodeDiffPane-86odpBSt.js → CodeDiffPane-C9HT1dCT.js} +1 -1
  34. package/dist/client/assets/{CodeProjectPicker-8svr_S_A.js → CodeProjectPicker-5Y3GvXkM.js} +1 -1
  35. package/dist/client/assets/{CodeScreen-CJ2RgB32.js → CodeScreen-DpN9kQvm.js} +1 -1
  36. package/dist/client/assets/ConversationComposer-Ce7Byw48.js +1 -0
  37. package/dist/client/assets/ConversationFeedRows-DygDfQn_.js +1 -0
  38. package/dist/client/assets/ConversationHeader-C3sg0ULI.js +1 -0
  39. package/dist/client/assets/ConversationPanels-Dg4Y2GgX.js +6 -0
  40. package/dist/client/assets/ConversationScreen-BP5tdz2k.css +1 -0
  41. package/dist/client/assets/ConversationScreen-CjWWmuuh.js +1 -0
  42. package/dist/client/assets/ConversationStatus-BhVIYQza.js +1 -0
  43. package/dist/client/assets/CrewWorkspaces-B6YIyw1z.css +1 -0
  44. package/dist/client/assets/CrewWorkspaces-CDU-wy1Y.js +1 -0
  45. package/dist/client/assets/{DataTable-CGw5CECG.js → DataTable-oJP339bX.js} +1 -1
  46. package/dist/client/assets/{DispatchAftermath-DowTb7uO.js → DispatchAftermath-CH02HAVw.js} +1 -1
  47. package/dist/client/assets/DocumentFocusViewer-DmtFisY9.js +1 -0
  48. package/dist/client/assets/{EmbeddableSurfacesLab-CxfJXS2g.js → EmbeddableSurfacesLab-84b9I3fy.js} +1 -1
  49. package/dist/client/assets/{EmptyState-BUvllvA6.js → EmptyState-BnDda92b.js} +1 -1
  50. package/dist/client/assets/{FileViewerPane-BM4AD_bo.js → FileViewerPane-Dg7_88pv.js} +1 -1
  51. package/dist/client/assets/FlightObserveScreen-DL3Xhl0h.js +1 -0
  52. package/dist/client/assets/{FollowScreen-DG0osbUp.js → FollowScreen-DcFBqr6l.js} +1 -1
  53. package/dist/client/assets/{HarnessMark-MztYnrGK.js → HarnessMark-DGZ6o6Ct.js} +1 -1
  54. package/dist/client/assets/{HarnessesScreen-BWqirBjK.js → HarnessesScreen-DTDL-XaA.js} +1 -1
  55. package/dist/client/assets/{HerdrSession-6sFln7WX.js → HerdrSession-DV2hD6Yh.js} +1 -1
  56. package/dist/client/assets/HomeHero-7JwycwFY.css +1 -0
  57. package/dist/client/assets/HomeHero-CENwVZ45.js +1 -0
  58. package/dist/client/assets/HostAdvisorView-PgiZUkd_.js +1 -0
  59. package/dist/client/assets/{KnowledgeSearchInspector-BOIhFWd2.js → KnowledgeSearchInspector-DNQjeWZO.js} +1 -1
  60. package/dist/client/assets/KnowledgeSearchScreen-Bj80IgR0.js +1 -0
  61. package/dist/client/assets/{LaneToolHoverCard-CcEiQC6B.js → LaneToolHoverCard-197xYmRp.js} +1 -1
  62. package/dist/client/assets/LaneTraceDetailSheet-BztwvOv9.js +1 -0
  63. package/dist/client/assets/{LaneTraceEventFocus-Bl9L0EYb.js → LaneTraceEventFocus-C9cmqxnK.js} +1 -1
  64. package/dist/client/assets/{MeshCanvas-ZjIuMiRo.js → MeshCanvas-C3_2p9B6.js} +2 -2
  65. package/dist/client/assets/{MeshCanvasMinimap-C-LQtiX6.js → MeshCanvasMinimap-ZTjYWXTZ.js} +1 -1
  66. package/dist/client/assets/{MeshScreen-Bs3soujg.js → MeshScreen-lJKaOyGB.js} +1 -1
  67. package/dist/client/assets/{MeshTopologyView-C0LUyT3K.js → MeshTopologyView-CBjHbAZw.js} +2 -2
  68. package/dist/client/assets/MessagesScreen-D6MVLvdg.js +1 -0
  69. package/dist/client/assets/{MissionContextRail-CjGAEGu8.js → MissionContextRail-DXkrbcnZ.js} +1 -1
  70. package/dist/client/assets/MissionControlView-BCH-Zsp4.js +1 -0
  71. package/dist/client/assets/MissionFocusOverlay-DbAliOSF.js +1 -0
  72. package/dist/client/assets/MissionLeftAgentRow-Bx6Pg8_O.js +1 -0
  73. package/dist/client/assets/MissionLogPane-D06c29Y8.js +1 -0
  74. package/dist/client/assets/{NewAgentModal-D5e0YUAo.js → NewAgentModal-C18Ajovd.js} +1 -1
  75. package/dist/client/assets/NewChatComposer-Bgqes0UQ.js +19 -0
  76. package/dist/client/assets/{NewChatOrigin-BEz6jyqf.js → NewChatOrigin-DpHS2Wmt.js} +1 -1
  77. package/dist/client/assets/ObserveEmbedScreen-Cmhwai4X.js +2 -0
  78. package/dist/client/assets/ObserveTextFlow-C1f5oize.js +2 -0
  79. package/dist/client/assets/ObservedTopologyPanel-D85P6RAk.js +2 -0
  80. package/dist/client/assets/OpenScoutAppShell-IDI4fuUE.js +88 -0
  81. package/dist/client/assets/OpsAgentsView-yt0JavoB.js +1 -0
  82. package/dist/client/assets/OpsScreen-C3yNQqJE.js +1 -0
  83. package/dist/client/assets/OpsSubnav-BijKI3yG.js +1 -0
  84. package/dist/client/assets/ProjectAgentProfile-DnIeC16r.js +1 -0
  85. package/dist/client/assets/{ProjectAgentProfileBar-B1VpwzGD.js → ProjectAgentProfileBar-IDEpKZvI.js} +1 -1
  86. package/dist/client/assets/ProjectAgentProfileHero-Bh_aISs-.js +1 -0
  87. package/dist/client/assets/ProjectsInbox-B8Srlklk.js +2 -0
  88. package/dist/client/assets/ProjectsRail-DqAbdvCf.js +1 -0
  89. package/dist/client/assets/ProjectsScreen-DKHQ2iEv.js +1 -0
  90. package/dist/client/assets/ProjectsThreadAside-DpkjYLL2.js +1 -0
  91. package/dist/client/assets/Provider-Ve8yXaWR.js +1 -0
  92. package/dist/client/assets/RailRow-B0sRaJc6.css +1 -0
  93. package/dist/client/assets/RailRow-C4GNGR80.js +1 -0
  94. package/dist/client/assets/RawSessionsTable-Co3vzwsf.js +1 -0
  95. package/dist/client/assets/RealtimeVoiceScreen-DMd1CBAf.js +9 -0
  96. package/dist/client/assets/{RepoDiffEmbedScreen-VLg4caej.js → RepoDiffEmbedScreen-C97Euf4s.js} +1 -1
  97. package/dist/client/assets/{RepoDiffPageScreen-BelnvgnP.js → RepoDiffPageScreen-DUKLzkrW.js} +1 -1
  98. package/dist/client/assets/RepoDiffViewer-CovKjSgb.js +7 -0
  99. package/dist/client/assets/RepoDiffViewerLazy-zIiEmh-e.js +2 -0
  100. package/dist/client/assets/{ReposScreen-IINK-CFn.js → ReposScreen-BR1LqTf1.js} +6 -6
  101. package/dist/client/assets/ScoutDeckSurface-BGsVicc2.js +1 -0
  102. package/dist/client/assets/{ScoutSurface-x_QbcRyk.js → ScoutSurface-BMKW7hSu.js} +1 -1
  103. package/dist/client/assets/{ScoutbotFxLab-7t9JVvZg.js → ScoutbotFxLab-0O2iDRrF.js} +1 -1
  104. package/dist/client/assets/{SecondaryNav-Dj30epYF.js → SecondaryNav-cYTw2p39.js} +1 -1
  105. package/dist/client/assets/{SessionEmbedScreen-s2mJ5Fg9.js → SessionEmbedScreen-mNjT0R6j.js} +1 -1
  106. package/dist/client/assets/{SessionObserve-DaUrJCMq.js → SessionObserve-zAlFbwFn.js} +1 -1
  107. package/dist/client/assets/{SessionObserveEvidence-ClUW8jpV.js → SessionObserveEvidence-BVawzqoE.js} +1 -1
  108. package/dist/client/assets/SessionRefScreen-BmKhf29o.js +1 -0
  109. package/dist/client/assets/SessionsScreen-CsSqjIY2.js +1 -0
  110. package/dist/client/assets/SettingsDrawer-Dsj-On_x.css +1 -0
  111. package/dist/client/assets/SettingsDrawer-DwYQTGi8.js +3 -0
  112. package/dist/client/assets/SettingsScreen-Btaku7YM.js +1 -0
  113. package/dist/client/assets/{ShikiPane-Dkwyx--r.js → ShikiPane-DyEJdcvb.js} +1 -1
  114. package/dist/client/assets/{SlidePanel-CuTeirnk.js → SlidePanel-Dg8_styW.js} +1 -1
  115. package/dist/client/assets/{SpriteAvatar-DQ3PTb8L.js → SpriteAvatar-DMrSssNZ.js} +1 -1
  116. package/dist/client/assets/{StatusPill-BJ1ierIR.js → StatusPill-NFFnphtx.js} +1 -1
  117. package/dist/client/assets/{TailView-CufWcrvf.js → TailView-BfObcZu3.js} +2 -2
  118. package/dist/client/assets/Terminal-Dr-M9U4u.js +1 -0
  119. package/dist/client/assets/TerminalEmbedScreen-BmyZkonh.js +1 -0
  120. package/dist/client/assets/{TerminalRelay-rvUzI9Ek.js → TerminalRelay-lJ2KdMCW.js} +3 -3
  121. package/dist/client/assets/{TextDocumentSurface-Bc-kHPgG.js → TextDocumentSurface-C7fGlzY8.js} +1 -1
  122. package/dist/client/assets/{TmuxPeek-DLyDkq_D.js → TmuxPeek-BSeKIjnX.js} +1 -1
  123. package/dist/client/assets/{VoicePermissionsPanel-CD903y9K.js → VoicePermissionsPanel-BkIGTzgw.js} +1 -1
  124. package/dist/client/assets/{WorkDetailScreen-D51oI0dH.js → WorkDetailScreen-Cwe-KWK4.js} +3 -3
  125. package/dist/client/assets/WorkFilesViewer-BBtKRBPv.js +1 -0
  126. package/dist/client/assets/{activity-BvGruxWG.js → activity-D4W2XZY2.js} +1 -1
  127. package/dist/client/assets/{addon-fit-Cfq4Ayjd.js → addon-fit-Celjj2yn.js} +1 -1
  128. package/dist/client/assets/{addon-webgl-B8sIf9-s.js → addon-webgl-Cu4tJ21-.js} +1 -1
  129. package/dist/client/assets/{ScoutbotBroadcastChip-CxtYZWPZ.css → agent-autocomplete-C7xwIcwd.css} +1 -1
  130. package/dist/client/assets/agent-autocomplete-Dv-_9dAw.js +2 -0
  131. package/dist/client/assets/{agent-essentials-yb4wIJlX.js → agent-essentials-CngjUhQj.js} +1 -1
  132. package/dist/client/assets/agent-identity-DzHGhLdJ.js +1 -0
  133. package/dist/client/assets/{agent-lane-card-model-q4cwzLX4.js → agent-lane-card-model-CSugZCdy.js} +1 -1
  134. package/dist/client/assets/{agent-lane-detail-BNNm6FNu.js → agent-lane-detail-D5EIlX7_.js} +1 -1
  135. package/dist/client/assets/{agent-lane-preview-C33Dwpn7.js → agent-lane-preview-BhplDYGf.js} +1 -1
  136. package/dist/client/assets/{agent-lanes-BDNktFBZ.css → agent-lanes-DlqcEf0l.css} +1 -1
  137. package/dist/client/assets/{agent-lanes-model-VYQ5a68i.js → agent-lanes-model-BKOs_32K.js} +2 -2
  138. package/dist/client/assets/agent-specialization-CNrsRbKA.js +1 -0
  139. package/dist/client/assets/{api-BkjHJfgJ.js → api-BHHEUSS3.js} +1 -1
  140. package/dist/client/assets/api-DEHEgJ9m.js +1 -0
  141. package/dist/client/assets/{arc.es-BBTfhvLE.js → arc.es-DNT50Y-_.js} +1 -1
  142. package/dist/client/assets/archive-DH49QqFG.js +1 -0
  143. package/dist/client/assets/{arrow-left-BOht-YQu.js → arrow-left-i-h6JAgs.js} +1 -1
  144. package/dist/client/assets/arrow-right-B0Yi01Zr.js +1 -0
  145. package/dist/client/assets/{arrow-up-right-hoR8_oUz.js → arrow-up-right-RBC6k8nn.js} +1 -1
  146. package/dist/client/assets/{bot-BUK7dOPS.js → bot-r2IuAuJd.js} +1 -1
  147. package/dist/client/assets/broker-display-Q75fupqG.js +2 -0
  148. package/dist/client/assets/{cache-Dr0why2k.js → cache-BO2Bd_LV.js} +1 -1
  149. package/dist/client/assets/{check--esHw52j.js → check-Bfs7hMb1.js} +1 -1
  150. package/dist/client/assets/{chevron-down-NAhBUkFd.js → chevron-down-Da5tV19_.js} +1 -1
  151. package/dist/client/assets/{chevron-right-C10o7t_X.js → chevron-right-BMqtBds_.js} +1 -1
  152. package/dist/client/assets/{chunk-HRAB3GC3-DF8R9rPv.js → chunk-HRAB3GC3-BUVYXXAp.js} +1 -1
  153. package/dist/client/assets/{clock-of01sAB6.js → clock-DaKLp6Xd.js} +1 -1
  154. package/dist/client/assets/{code-xml-CLn3TDWF.js → code-xml-ByQsfOI_.js} +1 -1
  155. package/dist/client/assets/collapsed-strip-raJWthAH.css +1 -0
  156. package/dist/client/assets/compass-BepM5iWH.js +1 -0
  157. package/dist/client/assets/{content-Cgj5AWqT.js → content-5hnDC9WE.js} +1 -1
  158. package/dist/client/assets/content-BRFZ-a6m.js +1 -0
  159. package/dist/client/assets/content-BYykncDo.js +1 -0
  160. package/dist/client/assets/content-Be6yyWbJ.js +1 -0
  161. package/dist/client/assets/content-Bgl_X3ao.js +1 -0
  162. package/dist/client/assets/content-BopJW1Zx.js +1 -0
  163. package/dist/client/assets/content-Bv2sfg0w.js +1 -0
  164. package/dist/client/assets/content-CMBiIZTg.js +1 -0
  165. package/dist/client/assets/content-CPVqvf5o.js +1 -0
  166. package/dist/client/assets/content-CbwyFqdI.js +1 -0
  167. package/dist/client/assets/content-ClQjAWYi.js +1 -0
  168. package/dist/client/assets/content-Cv2tSAbv.js +1 -0
  169. package/dist/client/assets/content-DFFe3-Ot.js +1 -0
  170. package/dist/client/assets/content-DY5hwBmm.js +1 -0
  171. package/dist/client/assets/content-_IXoxGno.js +1 -0
  172. package/dist/client/assets/content-j_tewJdE.js +1 -0
  173. package/dist/client/assets/{conversation-icons-ClBJi21l.js → conversation-icons-C4amK8Sa.js} +1 -1
  174. package/dist/client/assets/conversation-model-CigSPlKA.js +1 -0
  175. package/dist/client/assets/conversation-motion-features-_95aZx_1.js +1 -0
  176. package/dist/client/assets/{copy-Dty8ZYsM.js → copy-De4s38o2.js} +1 -1
  177. package/dist/client/assets/cpu-Bc268H9Q.js +1 -0
  178. package/dist/client/assets/{createLucideIcon-Bt67PWH-.js → createLucideIcon-DLlxGjKt.js} +1 -1
  179. package/dist/client/assets/credentials-qwds23lv.js +1 -0
  180. package/dist/client/assets/ctx-panel-D_HJ3nhb.css +1 -0
  181. package/dist/client/assets/discover-DOlk1hG7.js +2 -0
  182. package/dist/client/assets/embed-entry-BqDJfa87.js +2 -0
  183. package/dist/client/assets/{external-link-Dem738OJ.js → external-link-BGHC_naA.js} +1 -1
  184. package/dist/client/assets/{eye-B3lBIwJZ.js → eye-BeCSqJn1.js} +1 -1
  185. package/dist/client/assets/file-code-corner-CX53Cd9y.js +1 -0
  186. package/dist/client/assets/{file-text-iF0hyVyU.js → file-text-BVhkMWyC.js} +1 -1
  187. package/dist/client/assets/gauge-CPcEPmNt.js +1 -0
  188. package/dist/client/assets/gestures-BXIGYk_p.js +1 -0
  189. package/dist/client/assets/git-branch-q8Ayc8py.js +1 -0
  190. package/dist/client/assets/home-moving-signal-DMguaRWR.css +1 -0
  191. package/dist/client/assets/home-moving-signal-Dm2Z2x0p.js +1 -0
  192. package/dist/client/assets/{home-now-card-nano-hZl9klbP.js → home-now-card-nano-Djhy6ax0.js} +1 -1
  193. package/dist/client/assets/home-now-card-xU5LGP7q.js +1 -0
  194. package/dist/client/assets/hooks-CdKx1CxP.js +2 -0
  195. package/dist/client/assets/host-advisor-B2Fqs5Dd.css +1 -0
  196. package/dist/client/assets/index-Bli6bTLU.js +10 -0
  197. package/dist/client/assets/index-D7UEHxaY.js +1 -0
  198. package/dist/client/assets/index-DFdlQs_c.js +1 -0
  199. package/dist/client/assets/index-DhfOMK0D.js +1 -0
  200. package/dist/client/assets/index-DzlEgstl.css +1 -0
  201. package/dist/client/assets/index-wLwc74Pu.css +1 -0
  202. package/dist/client/assets/inspector-panel-B8pigRsg.js +2 -0
  203. package/dist/client/assets/{keyboard-nav-Chf51dns.js → keyboard-nav-7iEtvu9P.js} +1 -1
  204. package/dist/client/assets/{lane-observe-BA3g9aVd.js → lane-observe-vfyACHi0.js} +1 -1
  205. package/dist/client/assets/{lane-roster-store-BiIVlYmG.js → lane-roster-store-pHT3TAVs.js} +1 -1
  206. package/dist/client/assets/layers-BiZA-Clc.js +1 -0
  207. package/dist/client/assets/layout-grid-DMpv9CZM.js +1 -0
  208. package/dist/client/assets/left-BayK4ocL.js +1 -0
  209. package/dist/client/assets/left-BhZhSrS2.js +1 -0
  210. package/dist/client/assets/left-BhgU6NOA.js +1 -0
  211. package/dist/client/assets/left-CY_FGnN7.js +1 -0
  212. package/dist/client/assets/left-Cq8mjamr.js +1 -0
  213. package/dist/client/assets/left-DH44V4I_.css +1 -0
  214. package/dist/client/assets/left-Dnqla0b5.js +2 -0
  215. package/dist/client/assets/left-Dy403II2.js +2 -0
  216. package/dist/client/assets/left-R2OOE7VG.css +1 -0
  217. package/dist/client/assets/left-advisor-oOAtJ9YE.js +1 -0
  218. package/dist/client/assets/left-agents-TIKe8vW8.js +1 -0
  219. package/dist/client/assets/left-default-owH0Lwxo.js +1 -0
  220. package/dist/client/assets/left-lanes-BE_co2lP.js +1 -0
  221. package/dist/client/assets/left-mission-C_nWUtfA.js +1 -0
  222. package/dist/client/assets/library-BSVrjn_m.js +1 -0
  223. package/dist/client/assets/{loader-circle-4LDsy4Ke.js → loader-circle-DoT8gpw6.js} +1 -1
  224. package/dist/client/assets/{local-agents-DIi2EacM.js → local-agents-BMadXuP1.js} +1 -1
  225. package/dist/client/assets/mentions-Cd6XticV.js +1 -0
  226. package/dist/client/assets/{mesh-ops-JZwGuAPn.js → mesh-ops-C0zCLTR8.js} +1 -1
  227. package/dist/client/assets/{mesh-view-store-Du7VqIT_.js → mesh-view-store-Cpqil_2D.js} +1 -1
  228. package/dist/client/assets/{message-circle-BM3XgevU.js → message-circle-44KSmbvQ.js} +1 -1
  229. package/dist/client/assets/{message-markup-BcY1lShv.js → message-markup-DAnnGpWr.js} +1 -1
  230. package/dist/client/assets/{message-square-ER1_q2pe.js → message-square-DlY4EneU.js} +1 -1
  231. package/dist/client/assets/mission-control-CnU7dNt1.css +1 -0
  232. package/dist/client/assets/{mission-control-store-C6w5iVfg.js → mission-control-store-DtjtRs9Z.js} +1 -1
  233. package/dist/client/assets/{observe-3-jn4SXb.js → observe-DL5_8-Zj.js} +1 -1
  234. package/dist/client/assets/{operator-attention-BwSPeheT.js → operator-attention-BqoWAlhp.js} +1 -1
  235. package/dist/client/assets/{page-status-0LPfBC8S.js → page-status-CW8co39E.js} +1 -1
  236. package/dist/client/assets/persistent-state-DYjP8lqN.js +1 -0
  237. package/dist/client/assets/{plus-C-2gTcPK.js → plus-64n9qucr.js} +1 -1
  238. package/dist/client/assets/profile-BkmuseW7.js +1 -0
  239. package/dist/client/assets/projects-inbox-C0umZMSY.js +1 -0
  240. package/dist/client/assets/{provider-BvAxRQfE.js → provider-CX9EWecp.js} +1 -1
  241. package/dist/client/assets/proxy-C35W-YHZ.js +1 -0
  242. package/dist/client/assets/{radio-v7UAMZGh.js → radio-BjpQTKT0.js} +1 -1
  243. package/dist/client/assets/{refresh-cw-B5To7b6B.js → refresh-cw-IgN2fZLM.js} +1 -1
  244. package/dist/client/assets/resolve-panes-CCqRkQdM.js +1 -0
  245. package/dist/client/assets/resolve-sidebar-context-JkxY8qsV.js +1 -0
  246. package/dist/client/assets/right-B3PQUHd5.js +1 -0
  247. package/dist/client/assets/right-B96CBzrV.js +1 -0
  248. package/dist/client/assets/right-BPirlFC8.js +1 -0
  249. package/dist/client/assets/right-BUP2Ro_M.js +1 -0
  250. package/dist/client/assets/right-BVWYPIFX.js +1 -0
  251. package/dist/client/assets/right-BoAJxwA3.js +1 -0
  252. package/dist/client/assets/right-C2aOC2li.js +1 -0
  253. package/dist/client/assets/right-CtPJjgOV.js +1 -0
  254. package/dist/client/assets/{right-BvoGOUKH.js → right-DqiVyo8v.js} +1 -1
  255. package/dist/client/assets/right-SfSu0zHC.js +1 -0
  256. package/dist/client/assets/{rocket-BQQQv2L5.js → rocket-DnmN_YOD.js} +1 -1
  257. package/dist/client/assets/{router-C65cZYPn.js → router-B0YclXYg.js} +1 -1
  258. package/dist/client/assets/{scope-views-BOOmgmwx.js → scope-views-Z8aoAmtU.js} +1 -1
  259. package/dist/client/assets/scout-voice-DvG_3stJ.js +1 -0
  260. package/dist/client/assets/{scoutbot-BTIErYHo.js → scoutbot-D4vuKzOL.js} +2 -2
  261. package/dist/client/assets/scoutbot-markdown-BJJyaPu2.js +6 -0
  262. package/dist/client/assets/{scroll-text-BuneRiAD.js → scroll-text-DRidbcse.js} +1 -1
  263. package/dist/client/assets/{search-7_n7CxWl.js → search-BbgsEMXa.js} +1 -1
  264. package/dist/client/assets/secondaryNavConfig-DyC_P9Wx.js +1 -0
  265. package/dist/client/assets/{selection-bridge-SlGsgHw2.js → selection-bridge-CpzFGx3-.js} +1 -1
  266. package/dist/client/assets/{send-horizontal-DP16OOIW.js → send-horizontal-BXo2uz3Z.js} +1 -1
  267. package/dist/client/assets/{server-pYOMFjrT.js → server-Dt3tpiBj.js} +1 -1
  268. package/dist/client/assets/{session-catalog-_QfQ7fhZ.js → session-catalog-CUQ8LUJY.js} +1 -1
  269. package/dist/client/assets/{session-table-CYN8e4s3.js → session-table-B4JOKevn.js} +1 -1
  270. package/dist/client/assets/settings-BzWCF3NF.js +1 -0
  271. package/dist/client/assets/{sliders-horizontal-D2Z8gz6J.js → sliders-horizontal-7V8B3xsf.js} +1 -1
  272. package/dist/client/assets/{sparkles-Bth2iK7t.js → sparkles-ytTwpCbZ.js} +1 -1
  273. package/dist/client/assets/{sse-CL6gctHY.js → sse-CSozY6mp.js} +1 -1
  274. package/dist/client/assets/system-surfaces-redesign-QVXNeGYw.css +1 -0
  275. package/dist/client/assets/{tail-display-BRcJltQa.js → tail-display-DcliDVkW.js} +1 -1
  276. package/dist/client/assets/{tail-events-NLIWLq27.js → tail-events-CrN-Rmxj.js} +1 -1
  277. package/dist/client/assets/{terminal-By1Lw2i2.js → terminal-BiNIXhna.js} +1 -1
  278. package/dist/client/assets/{terminal-relay-CjkI5aUy.js → terminal-relay-pSm7_An6.js} +1 -1
  279. package/dist/client/assets/{terminal-sessions-AmSgHklm.js → terminal-sessions-D4dHTRkt.js} +1 -1
  280. package/dist/client/assets/{terminal-takeover-7AvNpnkC.js → terminal-takeover-CtA3wcXh.js} +1 -1
  281. package/dist/client/assets/{runtime-picker-eDEvx2Mz.js → text-BR9Bap0E.js} +1 -1
  282. package/dist/client/assets/text-rLpBg4_z.css +1 -0
  283. package/dist/client/assets/{use-conversation-list-BCzY032j.js → use-conversation-list-C0bEXFeH.js} +1 -1
  284. package/dist/client/assets/{use-fleet-active-asks-CJ6-oj5k.js → use-fleet-active-asks-CK4aw-3G.js} +1 -1
  285. package/dist/client/assets/{use-mesh-ops-items-D5L-CKe_.js → use-mesh-ops-items-QixBijmT.js} +1 -1
  286. package/dist/client/assets/use-reduced-motion-BLn59zLn.js +1 -0
  287. package/dist/client/assets/{use-scout-dev-flags-BohC8seq.js → use-scout-dev-flags-JKb1EhFh.js} +1 -1
  288. package/dist/client/assets/{useAgentHoverCard-RsLUYyeh.js → useAgentHoverCard-6N8b7qsU.js} +1 -1
  289. package/dist/client/assets/useContentSecondaryNav-D-hVKzM9.js +1 -0
  290. package/dist/client/assets/{usePersistentState-D3M4m2Ou.js → usePersistentState-DOEahRlt.js} +1 -1
  291. package/dist/client/assets/{usePierreRuntime-B4hbNWTz.js → usePierreRuntime-Bq6mXrgd.js} +1 -1
  292. package/dist/client/assets/{wrench-M4G7WtYB.js → wrench-CQvdf7KT.js} +1 -1
  293. package/dist/client/assets/{x-ynOfVadO.js → x-BJyPzFnn.js} +1 -1
  294. package/dist/client/assets/{xterm-DZHyijPp.js → xterm-D6dE_wMr.js} +1 -1
  295. package/dist/client/assets/zap-rw7uwZht.js +1 -0
  296. package/dist/client/index.html +2 -2
  297. package/dist/main.mjs +629 -167
  298. package/dist/node/main.mjs +454 -270
  299. package/dist/pairing-runtime-controller.mjs +607 -357
  300. package/dist/runtime/base-daemon.mjs +384 -21
  301. package/dist/runtime/broker-daemon.mjs +11024 -10023
  302. package/dist/runtime/broker-process-manager.mjs +9 -3
  303. package/dist/runtime/mesh-discover.mjs +9 -3
  304. package/dist/scout-control-plane-web.mjs +1590 -984
  305. package/dist/scout-web-server.mjs +1590 -984
  306. package/package.json +4 -4
  307. package/dist/client/assets/ActivityScreen-aewI4Ul1.js +0 -1
  308. package/dist/client/assets/AgentAvatar-DMov24_o.js +0 -1
  309. package/dist/client/assets/AgentConfigurationScreen-BjG6ECjl.js +0 -1
  310. package/dist/client/assets/AgentDefinitionsWorkspace-D4MbSMXp.js +0 -1
  311. package/dist/client/assets/AgentFloorView-h9KDJdw0.js +0 -1
  312. package/dist/client/assets/AgentInfoScreen-SjhK_SBh.js +0 -1
  313. package/dist/client/assets/AgentLaneDetailSheet-DnAKe4e3.js +0 -4
  314. package/dist/client/assets/AgentLanesEmbedScreen-BNOYF16R.js +0 -1
  315. package/dist/client/assets/AgentLanesView-Ct-Gz5WD.js +0 -2
  316. package/dist/client/assets/AgentSessions-CDfSfNiE.js +0 -6
  317. package/dist/client/assets/AgentsConsole-BVxhBqRa.js +0 -1
  318. package/dist/client/assets/AgentsSubnav-CiIuzxnZ.js +0 -1
  319. package/dist/client/assets/BriefingDetailScreen-C83o2YfN.js +0 -6
  320. package/dist/client/assets/BrokerScreen-DplF8d_X.js +0 -5
  321. package/dist/client/assets/ChatCollapsedStrip-BRljIymi.js +0 -1
  322. package/dist/client/assets/ContextMenu-CxkmFQcN.js +0 -1
  323. package/dist/client/assets/ConversationComposer-CWohCCmn.js +0 -1
  324. package/dist/client/assets/ConversationFeedRows-IWh0JSIL.js +0 -1
  325. package/dist/client/assets/ConversationHeader-BxTzXl8e.js +0 -1
  326. package/dist/client/assets/ConversationPanels-D9UCwNkS.js +0 -2
  327. package/dist/client/assets/ConversationScreen-oZSitVtX.js +0 -1
  328. package/dist/client/assets/ConversationScreen-yIKEsm-8.css +0 -1
  329. package/dist/client/assets/ConversationStatus-B6pAbo2w.js +0 -1
  330. package/dist/client/assets/DocumentFocusViewer-DRKjNG9s.js +0 -1
  331. package/dist/client/assets/FleetSearch-CYeWn85V.js +0 -1
  332. package/dist/client/assets/FleetSearch-EXOe8ulE.css +0 -1
  333. package/dist/client/assets/FlightObserveScreen-DYJJ3Z2B.js +0 -1
  334. package/dist/client/assets/HomeHero-BPBArHXa.js +0 -1
  335. package/dist/client/assets/HomeHero-DEl-WBsT.css +0 -1
  336. package/dist/client/assets/KnowledgeSearchScreen-BP8tD-Bh.js +0 -1
  337. package/dist/client/assets/LaneTraceDetailSheet-B4i1Ut4R.js +0 -1
  338. package/dist/client/assets/MessageComposerSuggestions-Dfc3PH2y.js +0 -1
  339. package/dist/client/assets/MessagesScreen-TgSL5KMc.js +0 -1
  340. package/dist/client/assets/MissionControlView-D629w2A8.js +0 -1
  341. package/dist/client/assets/MissionFocusOverlay-Bubrr8Gc.js +0 -1
  342. package/dist/client/assets/MissionLeftAgentRow-DokImu4Y.js +0 -1
  343. package/dist/client/assets/MissionLogPane-Cs0LuIkn.js +0 -1
  344. package/dist/client/assets/NewChatComposer-S08F6_La.js +0 -19
  345. package/dist/client/assets/ObserveEmbedScreen-CHx2sEAA.js +0 -2
  346. package/dist/client/assets/ObserveTextFlow-_ApDwRCO.js +0 -2
  347. package/dist/client/assets/ObservedTopologyPanel-ByW7Ar7p.js +0 -2
  348. package/dist/client/assets/OpenScoutAppShell-DTmnbG-h.js +0 -88
  349. package/dist/client/assets/OpsAgentsView-DiFuHcJs.js +0 -1
  350. package/dist/client/assets/OpsScreen-CCR3U_9P.js +0 -1
  351. package/dist/client/assets/OpsSubnav-CZs_OL2N.js +0 -1
  352. package/dist/client/assets/PlanView-C54eAzig.js +0 -1
  353. package/dist/client/assets/ProjectAgentProfile-BEfYOaxc.js +0 -1
  354. package/dist/client/assets/ProjectAgentProfileHero-B4f_AoCr.js +0 -1
  355. package/dist/client/assets/ProjectsInbox-DoPZ17FC.js +0 -2
  356. package/dist/client/assets/ProjectsRail-CWOkZjsY.js +0 -1
  357. package/dist/client/assets/ProjectsScreen-Dse0Q6p6.js +0 -1
  358. package/dist/client/assets/ProjectsThreadAside-DMnfyPLE.js +0 -1
  359. package/dist/client/assets/Provider-DKZWuzSR.js +0 -1
  360. package/dist/client/assets/RailRow-Cf9LOiEj.css +0 -1
  361. package/dist/client/assets/RailRow-DIGd3MMM.js +0 -1
  362. package/dist/client/assets/RawSessionsTable-Zkl4YDvz.js +0 -1
  363. package/dist/client/assets/RealtimeVoiceScreen-B_PMJxY_.js +0 -1
  364. package/dist/client/assets/RepoDiffViewer-VrUJw33u.js +0 -7
  365. package/dist/client/assets/RepoDiffViewerLazy-BPg_JkYW.js +0 -2
  366. package/dist/client/assets/ScoutDeckSurface-MbwGp6Ab.js +0 -1
  367. package/dist/client/assets/ScoutbotBroadcastChip-DAKQKB25.js +0 -2
  368. package/dist/client/assets/ScoutbotRealtimeVoiceCall-Br4bYVAx.js +0 -1
  369. package/dist/client/assets/SessionRefScreen-DLZNFZFK.js +0 -1
  370. package/dist/client/assets/SessionsScreen-D-hN1n4k.js +0 -1
  371. package/dist/client/assets/SettingsDrawer-BFsnww-k.js +0 -3
  372. package/dist/client/assets/SettingsDrawer-UX7pFJU_.css +0 -1
  373. package/dist/client/assets/SettingsScreen-Bc3Xtv5V.js +0 -1
  374. package/dist/client/assets/Terminal-D_OmdFmr.js +0 -1
  375. package/dist/client/assets/TerminalEmbedScreen-D21ytNXW.js +0 -1
  376. package/dist/client/assets/WorkFilesViewer-BDMNbxE4.js +0 -1
  377. package/dist/client/assets/agent-identity-BxCsXnDp.js +0 -1
  378. package/dist/client/assets/api-h5zurxmi.js +0 -1
  379. package/dist/client/assets/broker-display-pp33bLsu.js +0 -2
  380. package/dist/client/assets/collapsed-strip-Dz-of2SM.css +0 -1
  381. package/dist/client/assets/content-B-SUUhXj.js +0 -1
  382. package/dist/client/assets/content-BRY2vo1_.js +0 -1
  383. package/dist/client/assets/content-BTm0mVyD.js +0 -1
  384. package/dist/client/assets/content-BTqvyb5E.js +0 -1
  385. package/dist/client/assets/content-BjDaXmSD.js +0 -1
  386. package/dist/client/assets/content-BrR6deGh.js +0 -1
  387. package/dist/client/assets/content-C5yvBEMy.js +0 -1
  388. package/dist/client/assets/content-CkhG__-v.js +0 -1
  389. package/dist/client/assets/content-CudIBsiP.js +0 -1
  390. package/dist/client/assets/content-DBb7ppd5.js +0 -1
  391. package/dist/client/assets/content-DEw_kGyK.js +0 -1
  392. package/dist/client/assets/content-DIy0DCzK.js +0 -1
  393. package/dist/client/assets/content-THl9hRAo.js +0 -1
  394. package/dist/client/assets/content-vi9FbmV9.js +0 -1
  395. package/dist/client/assets/content-wcgPMGVf.js +0 -1
  396. package/dist/client/assets/conversation-model-CHwHZNw-.js +0 -1
  397. package/dist/client/assets/conversation-motion-features-zU0k3Agz.js +0 -1
  398. package/dist/client/assets/ctx-panel-B4s49N9e.css +0 -1
  399. package/dist/client/assets/discover-NDAqNvKt.js +0 -2
  400. package/dist/client/assets/embed-entry-BVR09F6e.js +0 -2
  401. package/dist/client/assets/home-moving-signal-C8dTXieA.js +0 -1
  402. package/dist/client/assets/home-moving-signal-CAa0V91u.css +0 -1
  403. package/dist/client/assets/home-now-card-BgvVcE83.js +0 -1
  404. package/dist/client/assets/hooks-DBIezYS2.js +0 -2
  405. package/dist/client/assets/index-BMwKgdz_.js +0 -1
  406. package/dist/client/assets/index-Bu-fckyR.css +0 -1
  407. package/dist/client/assets/index-BxoufAPA.js +0 -1
  408. package/dist/client/assets/index-Cj7NnSxI.js +0 -1
  409. package/dist/client/assets/index-CvF09yvf.css +0 -1
  410. package/dist/client/assets/index-o4FKpU7Z.js +0 -10
  411. package/dist/client/assets/inspector-panel-Dy2cVTCi.js +0 -2
  412. package/dist/client/assets/left-BC7p5QbT.js +0 -1
  413. package/dist/client/assets/left-BCSGqccQ.js +0 -1
  414. package/dist/client/assets/left-BSyj8PuJ.js +0 -2
  415. package/dist/client/assets/left-Bk3XnxPD.css +0 -1
  416. package/dist/client/assets/left-CCoobxPS.css +0 -1
  417. package/dist/client/assets/left-DDnxNUxd.js +0 -1
  418. package/dist/client/assets/left-DLoDKxT5.js +0 -2
  419. package/dist/client/assets/left-O-TBH7JB.js +0 -1
  420. package/dist/client/assets/left-agents-Dk9Y89lb.js +0 -1
  421. package/dist/client/assets/left-default-B3JBRQNJ.js +0 -1
  422. package/dist/client/assets/left-lanes-30Oe_3RM.js +0 -1
  423. package/dist/client/assets/left-mission-DEl4-7xu.js +0 -1
  424. package/dist/client/assets/left-plan-B4qdm4Gn.js +0 -2
  425. package/dist/client/assets/left-rvUOB14X.js +0 -1
  426. package/dist/client/assets/library-DDKSLFJ_.js +0 -1
  427. package/dist/client/assets/mentions-CvDaviLJ.js +0 -1
  428. package/dist/client/assets/mission-control-m3BTDQ9l.css +0 -1
  429. package/dist/client/assets/model-Co0zkMIc.js +0 -1
  430. package/dist/client/assets/plan-view-D56fneVF.css +0 -1
  431. package/dist/client/assets/profile-DW80Gn5k.js +0 -1
  432. package/dist/client/assets/projects-inbox-DCeD3FfV.js +0 -1
  433. package/dist/client/assets/resolve-panes-BDi9Qx4R.js +0 -1
  434. package/dist/client/assets/resolve-sidebar-context-HE-5eZYa.js +0 -1
  435. package/dist/client/assets/right-BDf_yTv6.js +0 -1
  436. package/dist/client/assets/right-C-bgjYg-.js +0 -1
  437. package/dist/client/assets/right-C3JdEfYQ.js +0 -1
  438. package/dist/client/assets/right-CYIs2tEe.js +0 -1
  439. package/dist/client/assets/right-CyRCv6Up.js +0 -1
  440. package/dist/client/assets/right-DBYGtoRv.js +0 -1
  441. package/dist/client/assets/right-o3LHMiKa.js +0 -1
  442. package/dist/client/assets/right-oPrcx9MX.js +0 -1
  443. package/dist/client/assets/right-sSvBUK-j.js +0 -1
  444. package/dist/client/assets/runtime-picker-vhm0gtLs.css +0 -1
  445. package/dist/client/assets/scout-voice-B7kXlkcl.js +0 -1
  446. package/dist/client/assets/secondaryNavConfig-CSFDCQAf.js +0 -1
  447. package/dist/client/assets/system-surfaces-redesign-B7GQhfpw.css +0 -1
  448. package/dist/client/assets/text-DsBWV_4k.js +0 -1
  449. package/dist/client/assets/use-reduced-motion-CqXpVXv-.js +0 -1
  450. package/dist/client/assets/useContentSecondaryNav-DOr5yHbT.js +0 -1
  451. /package/dist/client/assets/{document-focus-viewer-BSC_JwVE.css → DocumentFocusViewer-BSC_JwVE.css} +0 -0
@@ -3,9 +3,9 @@ import "reflect-metadata";
3
3
 
4
4
  // packages/runtime/src/base-daemon.ts
5
5
  import { spawn as spawn3 } from "child_process";
6
- import { existsSync as existsSync6, mkdirSync as mkdirSync3, openSync, writeFileSync as writeFileSync3 } from "fs";
7
- import { homedir as homedir6 } from "os";
8
- import { dirname as dirname4, join as join6, resolve as resolve3 } from "path";
6
+ import { existsSync as existsSync7, mkdirSync as mkdirSync4, openSync, writeFileSync as writeFileSync4 } from "fs";
7
+ import { homedir as homedir7 } from "os";
8
+ import { dirname as dirname5, join as join7, resolve as resolve3 } from "path";
9
9
  import { fileURLToPath as fileURLToPath2 } from "url";
10
10
 
11
11
  // packages/runtime/src/broker-process-manager.ts
@@ -1827,6 +1827,39 @@ import {
1827
1827
  } from "fs";
1828
1828
  import { homedir as homedir3, hostname as osHostname } from "os";
1829
1829
  import { dirname, join as join3 } from "path";
1830
+
1831
+ // packages/runtime/src/node-identity.ts
1832
+ var NODE_CARD_TTL_MS = 24 * 60 * 60 * 1000;
1833
+ var stableNodeQualifierCache = new Map;
1834
+ function stripBonjourCollisionSuffix(value) {
1835
+ if (!value || typeof value !== "string")
1836
+ return "";
1837
+ let trimmed = value.trim();
1838
+ const isDotLocal = /\.local\.?$/i.test(trimmed);
1839
+ if (isDotLocal) {
1840
+ trimmed = trimmed.replace(/\.local\.?$/i, "");
1841
+ }
1842
+ const isHyphenLocalOpenscout = /-local-openscout$/i.test(trimmed);
1843
+ const isHyphenLocal = !isHyphenLocalOpenscout && /-local$/i.test(trimmed);
1844
+ if (isHyphenLocalOpenscout) {
1845
+ trimmed = trimmed.replace(/-local-openscout$/i, "");
1846
+ } else if (isHyphenLocal) {
1847
+ trimmed = trimmed.replace(/-local$/i, "");
1848
+ }
1849
+ if (!isDotLocal && !isHyphenLocalOpenscout && !isHyphenLocal) {
1850
+ return trimmed;
1851
+ }
1852
+ trimmed = trimmed.replace(/(?<=[a-zA-Z].*?)(?:-\d+)+$/, "");
1853
+ if (isDotLocal)
1854
+ return `${trimmed}.local`;
1855
+ if (isHyphenLocalOpenscout)
1856
+ return `${trimmed}-local-openscout`;
1857
+ if (isHyphenLocal)
1858
+ return `${trimmed}-local`;
1859
+ return trimmed;
1860
+ }
1861
+
1862
+ // packages/runtime/src/local-config.ts
1830
1863
  var LOCAL_CONFIG_VERSION = 1;
1831
1864
  var DEFAULT_SCOUT_WEB_PORTAL_HOST = "scout.local";
1832
1865
  var DEFAULT_SCOUT_WEB_DEV_HOST = `dev.${DEFAULT_SCOUT_WEB_PORTAL_HOST}`;
@@ -1852,12 +1885,14 @@ var DEFAULT_LOCAL_CONFIG = {
1852
1885
  }
1853
1886
  };
1854
1887
  function normalizeLocalHostnameLabel(value) {
1855
- const firstLabel = value?.trim().replace(/\.local\.?$/i, "").split(".").find((part) => part.trim().length > 0)?.trim();
1888
+ const stripped = value ? stripBonjourCollisionSuffix(value) : value;
1889
+ const firstLabel = stripped?.trim().replace(/\.local\.?$/i, "").split(".").find((part) => part.trim().length > 0)?.trim();
1856
1890
  const normalized = firstLabel?.toLowerCase().replace(/[^a-z0-9-]+/g, "-").replace(/^-+|-+$/g, "").replace(/-{2,}/g, "-");
1857
1891
  return normalized || "localhost";
1858
1892
  }
1859
1893
  function normalizeLocalHostname(value) {
1860
- const trimmed = value?.trim().replace(/\.$/, "").toLowerCase();
1894
+ const stripped = value ? stripBonjourCollisionSuffix(value) : value;
1895
+ const trimmed = stripped?.trim().replace(/\.$/, "").toLowerCase();
1861
1896
  const labels = trimmed?.split(".").map((label) => label.trim().replace(/[^a-z0-9-]+/g, "-").replace(/^-+|-+$/g, "").replace(/-{2,}/g, "-")).filter(Boolean);
1862
1897
  return labels && labels.length > 0 ? labels.join(".") : "localhost";
1863
1898
  }
@@ -2042,6 +2077,28 @@ function resolveBunExecutable(env = process.env) {
2042
2077
  names: ["bun"]
2043
2078
  });
2044
2079
  }
2080
+ function resolveOpenScoutRepoRoot(options = {}) {
2081
+ const starts = options.startDirectories?.map((entry) => entry?.trim()).filter((entry) => Boolean(entry));
2082
+ if (!starts || starts.length === 0) {
2083
+ return null;
2084
+ }
2085
+ for (const start of starts) {
2086
+ let current = resolve(start);
2087
+ while (true) {
2088
+ const scoutEntry = join4(current, "apps", "desktop", "bin", "scout.ts");
2089
+ const runtimeEntry = join4(current, "packages", "runtime", "bin", "openscout-runtime.mjs");
2090
+ if (existsSync4(scoutEntry) && existsSync4(runtimeEntry)) {
2091
+ return current;
2092
+ }
2093
+ const parent = dirname2(current);
2094
+ if (parent === current) {
2095
+ break;
2096
+ }
2097
+ current = parent;
2098
+ }
2099
+ }
2100
+ return null;
2101
+ }
2045
2102
  function findExecutableOnSearchPath(name, env) {
2046
2103
  const searchDirectories = dedupeDirectories([
2047
2104
  ...splitPathEntries(env),
@@ -2126,13 +2183,13 @@ function resolveBrokerUrl(host, port, scope, env = process.env, lanHost = findLa
2126
2183
  return explicit;
2127
2184
  }
2128
2185
  if (scope === "mesh") {
2186
+ if (lanHost) {
2187
+ return buildDefaultBrokerHttpsUrl(lanHost, port);
2188
+ }
2129
2189
  const tailnetHost = readTailscaleSelfWebHostsSync(env)[0];
2130
2190
  if (tailnetHost) {
2131
2191
  return buildDefaultBrokerHttpsUrl(tailnetHost, port);
2132
2192
  }
2133
- if (lanHost) {
2134
- return buildDefaultBrokerHttpsUrl(lanHost, port);
2135
- }
2136
2193
  }
2137
2194
  return buildDefaultBrokerUrl(host, port);
2138
2195
  }
@@ -2895,6 +2952,119 @@ if (process.argv[1] && fileURLToPath(import.meta.url) === process.argv[1] && !pr
2895
2952
  });
2896
2953
  }
2897
2954
 
2955
+ // packages/runtime/src/pairing-supervisor.ts
2956
+ import {
2957
+ existsSync as existsSync6,
2958
+ mkdirSync as mkdirSync3,
2959
+ readFileSync as readFileSync5,
2960
+ renameSync as renameSync3,
2961
+ rmSync,
2962
+ writeFileSync as writeFileSync3
2963
+ } from "fs";
2964
+ import { homedir as homedir6 } from "os";
2965
+ import { dirname as dirname4, join as join6 } from "path";
2966
+ var SCOUT_PAIRING_SUPERVISOR_INTENT_FILE = "supervisor.json";
2967
+ var SCOUT_PAIRING_RUNTIME_PID_FILE = "runtime.pid";
2968
+ var SCOUT_PAIRING_SUPERVISOR_PID_FILE = "supervisor.pid";
2969
+ function resolveScoutPairingSupervisorPaths(env = process.env) {
2970
+ const configuredRoot = env.OPENSCOUT_PAIRING_HOME?.trim() || env.SCOUT_PAIRING_HOME?.trim();
2971
+ const rootDir = configuredRoot || join6(homedir6(), ".scout", "pairing");
2972
+ return {
2973
+ rootDir,
2974
+ intentPath: join6(rootDir, SCOUT_PAIRING_SUPERVISOR_INTENT_FILE),
2975
+ runtimePidPath: join6(rootDir, SCOUT_PAIRING_RUNTIME_PID_FILE),
2976
+ supervisorPidPath: join6(rootDir, SCOUT_PAIRING_SUPERVISOR_PID_FILE)
2977
+ };
2978
+ }
2979
+ function readScoutPairingSupervisorIntent(intentPath = resolveScoutPairingSupervisorPaths().intentPath) {
2980
+ const intent = readPairingIntent(intentPath);
2981
+ return {
2982
+ desiredState: intent.desiredState === "running" || intent.desiredState === "stopped" ? intent.desiredState : null,
2983
+ restartGeneration: validRestartGeneration(intent.restartGeneration)
2984
+ };
2985
+ }
2986
+ function updateScoutPairingSupervisorIntent(action, intentPath = resolveScoutPairingSupervisorPaths().intentPath) {
2987
+ const intent = readPairingIntent(intentPath);
2988
+ intent.desiredState = action === "stop" ? "stopped" : "running";
2989
+ if (action === "restart") {
2990
+ intent.restartGeneration = Math.max(Date.now(), validRestartGeneration(intent.restartGeneration) + 1);
2991
+ }
2992
+ writePairingIntent(intentPath, intent);
2993
+ return readScoutPairingSupervisorIntent(intentPath);
2994
+ }
2995
+ function readScoutPairingProcessPid(path) {
2996
+ if (!existsSync6(path))
2997
+ return null;
2998
+ try {
2999
+ const pid = Number.parseInt(readFileSync5(path, "utf8").trim(), 10);
3000
+ return Number.isInteger(pid) && pid > 0 ? pid : null;
3001
+ } catch {
3002
+ return null;
3003
+ }
3004
+ }
3005
+ function isScoutPairingProcessRunning(pid) {
3006
+ if (!pid || pid <= 0)
3007
+ return false;
3008
+ try {
3009
+ process.kill(pid, 0);
3010
+ return true;
3011
+ } catch (error) {
3012
+ return error.code === "EPERM";
3013
+ }
3014
+ }
3015
+ function readLiveScoutPairingSupervisorPid(supervisorPidPath = resolveScoutPairingSupervisorPaths().supervisorPidPath) {
3016
+ const pid = readScoutPairingProcessPid(supervisorPidPath);
3017
+ return isScoutPairingProcessRunning(pid) ? pid : null;
3018
+ }
3019
+ function claimScoutPairingSupervision(pid = process.pid, supervisorPidPath = resolveScoutPairingSupervisorPaths().supervisorPidPath) {
3020
+ const currentPid = readLiveScoutPairingSupervisorPid(supervisorPidPath);
3021
+ if (currentPid && currentPid !== pid) {
3022
+ throw new Error(`Scout pairing is already supervised by pid ${currentPid}.`);
3023
+ }
3024
+ mkdirSync3(dirname4(supervisorPidPath), { recursive: true });
3025
+ writeFileAtomically(supervisorPidPath, `${pid}
3026
+ `);
3027
+ }
3028
+ function releaseScoutPairingSupervision(pid = process.pid, supervisorPidPath = resolveScoutPairingSupervisorPaths().supervisorPidPath) {
3029
+ if (readScoutPairingProcessPid(supervisorPidPath) !== pid)
3030
+ return;
3031
+ rmSync(supervisorPidPath, { force: true });
3032
+ }
3033
+ function readPairingIntent(intentPath) {
3034
+ if (!existsSync6(intentPath))
3035
+ return {};
3036
+ try {
3037
+ const parsed = JSON.parse(readFileSync5(intentPath, "utf8"));
3038
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
3039
+ return { desiredState: "stopped" };
3040
+ }
3041
+ const intent = parsed;
3042
+ if (intent.desiredState !== "running" && intent.desiredState !== "stopped") {
3043
+ intent.desiredState = "stopped";
3044
+ }
3045
+ return intent;
3046
+ } catch {
3047
+ return { desiredState: "stopped" };
3048
+ }
3049
+ }
3050
+ function writePairingIntent(intentPath, intent) {
3051
+ mkdirSync3(dirname4(intentPath), { recursive: true });
3052
+ writeFileAtomically(intentPath, `${JSON.stringify(intent, null, 2)}
3053
+ `);
3054
+ }
3055
+ function writeFileAtomically(path, contents) {
3056
+ const temporaryPath = `${path}.${process.pid}.${Date.now()}.tmp`;
3057
+ try {
3058
+ writeFileSync3(temporaryPath, contents);
3059
+ renameSync3(temporaryPath, path);
3060
+ } finally {
3061
+ rmSync(temporaryPath, { force: true });
3062
+ }
3063
+ }
3064
+ function validRestartGeneration(value) {
3065
+ return typeof value === "number" && Number.isSafeInteger(value) && value >= 0 ? value : 0;
3066
+ }
3067
+
2898
3068
  // packages/runtime/src/scout-ascii-mark.ts
2899
3069
  var ORB_COLS = 60;
2900
3070
  var ORB_ROWS = 47;
@@ -3528,6 +3698,8 @@ var BROKER_HEALTH_TIMEOUT_MS = 30000;
3528
3698
  var BROKER_HEALTH_POLL_MS = 250;
3529
3699
  var CHILD_SHUTDOWN_TIMEOUT_MS = 15000;
3530
3700
  var WEB_START_RETRY_MS = 5000;
3701
+ var PAIRING_RECONCILE_INTERVAL_MS = 500;
3702
+ var PAIRING_STOP_TIMEOUT_MS = 5000;
3531
3703
  var MENU_BUNDLE_ID = "app.openscout.scout.menu";
3532
3704
  var PROCESS_NAME = "scout-base";
3533
3705
  var BROKER_PROCESS_NAME = "scout-broker";
@@ -3544,9 +3716,17 @@ var baseKeepAlive = null;
3544
3716
  var webStartRetryTimer = null;
3545
3717
  var webStartInFlight = false;
3546
3718
  var parentWatcher = null;
3719
+ var pairingProcess = null;
3720
+ var pairingReconcileTimer = null;
3721
+ var pairingReconcileInFlight = false;
3722
+ var pairingRestartGeneration = null;
3723
+ var pairingRestartDelayMs = RESTART_MIN_DELAY_MS;
3724
+ var pairingNextStartAt = 0;
3725
+ var pairingSupervisionClaimed = false;
3547
3726
  var parentPid = Number.parseInt(process.env.OPENSCOUT_PARENT_PID ?? "0", 10);
3548
3727
  var config = resolveBrokerServiceConfig();
3549
3728
  var brokerControlUrl = buildLocalBrokerControlUrl(config.brokerHost, config.brokerPort);
3729
+ var pairingPaths = resolveScoutPairingSupervisorPaths();
3550
3730
  function log(message, details) {
3551
3731
  if (details === undefined) {
3552
3732
  console.log(`[openscout-base] ${message}`);
@@ -3584,15 +3764,15 @@ function resolveWebTrustedHostsEnv() {
3584
3764
  return appendCsvValues(process.env.OPENSCOUT_WEB_TRUSTED_HOSTS, resolveTailnetWebHosts());
3585
3765
  }
3586
3766
  function ensureDirectory(path) {
3587
- mkdirSync3(path, { recursive: true });
3767
+ mkdirSync4(path, { recursive: true });
3588
3768
  }
3589
3769
  function logFile(name) {
3590
- const dir = join6(config.supportDirectory, "logs", "base");
3770
+ const dir = join7(config.supportDirectory, "logs", "base");
3591
3771
  ensureDirectory(dir);
3592
- return openSync(join6(dir, name), "a");
3772
+ return openSync(join7(dir, name), "a");
3593
3773
  }
3594
3774
  function runtimeEntrypoint(config2) {
3595
- return join6(config2.runtimePackageDir, "bin", "openscout-runtime.mjs");
3775
+ return join7(config2.runtimePackageDir, "bin", "openscout-runtime.mjs");
3596
3776
  }
3597
3777
  function spawnBroker() {
3598
3778
  if (shuttingDown || brokerProcess) {
@@ -3696,9 +3876,9 @@ function resolveEdgeConfig() {
3696
3876
  });
3697
3877
  }
3698
3878
  function resolveLocalEdgeCaddyfilePath() {
3699
- const dir = join6(homedir6(), ".scout", "local-edge");
3879
+ const dir = join7(homedir7(), ".scout", "local-edge");
3700
3880
  ensureDirectory(dir);
3701
- return join6(dir, "Caddyfile");
3881
+ return join7(dir, "Caddyfile");
3702
3882
  }
3703
3883
  function resolveCaddyExecutable() {
3704
3884
  return process.env.OPENSCOUT_CADDY_BIN?.trim() || "caddy";
@@ -3740,7 +3920,7 @@ function startLocalEdge() {
3740
3920
  const edgeConfig = resolveEdgeConfig();
3741
3921
  const schemes = edgeConfig.scheme === "both" ? ["http", "https"] : [edgeConfig.scheme];
3742
3922
  const caddyfilePath = resolveLocalEdgeCaddyfilePath();
3743
- writeFileSync3(caddyfilePath, renderOpenScoutCaddyfile(edgeConfig), "utf8");
3923
+ writeFileSync4(caddyfilePath, renderOpenScoutCaddyfile(edgeConfig), "utf8");
3744
3924
  mdnsProcesses = schemes.flatMap((scheme) => {
3745
3925
  const edgePort = scheme === "https" ? 443 : 80;
3746
3926
  const suffix = scheme.toUpperCase();
@@ -3850,7 +4030,7 @@ function scheduleWebStartRetry() {
3850
4030
  webStartRetryTimer.unref();
3851
4031
  }
3852
4032
  function findRepoMenuBundle() {
3853
- let current = dirname4(fileURLToPath2(import.meta.url));
4033
+ let current = dirname5(fileURLToPath2(import.meta.url));
3854
4034
  while (true) {
3855
4035
  const distRoot = resolve3(current, "apps", "macos", "dist");
3856
4036
  const candidates = [
@@ -3858,10 +4038,10 @@ function findRepoMenuBundle() {
3858
4038
  resolve3(distRoot, "ScoutMenu.app")
3859
4039
  ];
3860
4040
  for (const candidate of candidates) {
3861
- if (existsSync6(candidate))
4041
+ if (existsSync7(candidate))
3862
4042
  return candidate;
3863
4043
  }
3864
- const parent = dirname4(current);
4044
+ const parent = dirname5(current);
3865
4045
  if (parent === current) {
3866
4046
  return null;
3867
4047
  }
@@ -3873,7 +4053,7 @@ function startMenuBarApp() {
3873
4053
  return;
3874
4054
  }
3875
4055
  const explicitBundle = process.env.OPENSCOUT_MENU_BUNDLE_PATH?.trim();
3876
- const repoBundle = explicitBundle && existsSync6(explicitBundle) ? explicitBundle : findRepoMenuBundle();
4056
+ const repoBundle = explicitBundle && existsSync7(explicitBundle) ? explicitBundle : findRepoMenuBundle();
3877
4057
  const args = repoBundle ? [repoBundle] : ["-b", MENU_BUNDLE_ID];
3878
4058
  const child = spawn3("open", args, {
3879
4059
  stdio: ["ignore", logFile("menu.stdout.log"), logFile("menu.stderr.log")]
@@ -3886,6 +4066,177 @@ function startMenuBarApp() {
3886
4066
  warn("menu bar app launch failed", { target: repoBundle ?? MENU_BUNDLE_ID, code });
3887
4067
  });
3888
4068
  }
4069
+ function resolvePairingControllerCommand() {
4070
+ const moduleDirectory = dirname5(fileURLToPath2(import.meta.url));
4071
+ const repoRoot = resolveOpenScoutRepoRoot({
4072
+ startDirectories: [
4073
+ process.env.OPENSCOUT_SETUP_CWD,
4074
+ process.cwd(),
4075
+ moduleDirectory
4076
+ ]
4077
+ });
4078
+ const setupCwd = process.env.OPENSCOUT_SETUP_CWD?.trim() || repoRoot || process.cwd();
4079
+ const explicit = process.env.OPENSCOUT_PAIRING_RUNTIME_CONTROLLER_BIN?.trim();
4080
+ const candidates = [
4081
+ explicit,
4082
+ repoRoot ? join7(repoRoot, "packages", "cli", "dist", "pairing-runtime-controller.mjs") : null,
4083
+ repoRoot ? join7(repoRoot, "packages", "web", "dist", "pairing-runtime-controller.mjs") : null,
4084
+ repoRoot ? join7(repoRoot, "packages", "web", "server", "pairing-runtime-controller.ts") : null,
4085
+ resolve3(moduleDirectory, "..", "pairing-runtime-controller.mjs"),
4086
+ join7(homedir7(), ".bun", "install", "global", "node_modules", "@openscout", "scout", "dist", "pairing-runtime-controller.mjs"),
4087
+ join7(homedir7(), ".bun", "node_modules", "@openscout", "scout", "dist", "pairing-runtime-controller.mjs")
4088
+ ].filter((candidate) => Boolean(candidate));
4089
+ const entrypoint = candidates.find((candidate) => existsSync7(candidate));
4090
+ if (!entrypoint)
4091
+ return null;
4092
+ if (explicit === entrypoint && !/\.(?:[cm]?js|ts)$/.test(entrypoint)) {
4093
+ return { command: entrypoint, args: [], cwd: setupCwd };
4094
+ }
4095
+ const bun = resolveBunExecutable();
4096
+ return bun ? { command: bun.path, args: [entrypoint], cwd: setupCwd } : null;
4097
+ }
4098
+ async function waitForPairingProcessExit(pid) {
4099
+ const deadline = Date.now() + PAIRING_STOP_TIMEOUT_MS;
4100
+ while (Date.now() < deadline) {
4101
+ if (!isScoutPairingProcessRunning(pid))
4102
+ return true;
4103
+ await sleep(100);
4104
+ }
4105
+ return !isScoutPairingProcessRunning(pid);
4106
+ }
4107
+ async function stopPairingController() {
4108
+ const ownedChild = pairingProcess;
4109
+ if (ownedChild && !isChildExited(ownedChild)) {
4110
+ pairingProcess = null;
4111
+ await terminateChildProcess(ownedChild, "pairing controller", PAIRING_STOP_TIMEOUT_MS);
4112
+ return;
4113
+ }
4114
+ const runtimePid = readScoutPairingProcessPid(pairingPaths.runtimePidPath);
4115
+ if (!isScoutPairingProcessRunning(runtimePid)) {
4116
+ pairingProcess = null;
4117
+ return;
4118
+ }
4119
+ try {
4120
+ process.kill(runtimePid, "SIGTERM");
4121
+ } catch {
4122
+ pairingProcess = null;
4123
+ return;
4124
+ }
4125
+ if (!await waitForPairingProcessExit(runtimePid)) {
4126
+ warn("pairing controller did not exit after SIGTERM; forcing shutdown", { pid: runtimePid });
4127
+ try {
4128
+ process.kill(runtimePid, "SIGKILL");
4129
+ } catch {}
4130
+ }
4131
+ pairingProcess = null;
4132
+ }
4133
+ function spawnPairingController() {
4134
+ if (shuttingDown || pairingProcess)
4135
+ return;
4136
+ const descriptor = resolvePairingControllerCommand();
4137
+ if (!descriptor) {
4138
+ warn("pairing controller entrypoint or Bun executable could not be resolved");
4139
+ pairingNextStartAt = Date.now() + pairingRestartDelayMs;
4140
+ pairingRestartDelayMs = Math.min(pairingRestartDelayMs * 2, RESTART_MAX_DELAY_MS);
4141
+ return;
4142
+ }
4143
+ const child = spawn3(descriptor.command, descriptor.args, {
4144
+ cwd: descriptor.cwd,
4145
+ env: {
4146
+ ...process.env,
4147
+ OPENSCOUT_PARENT_PID: String(process.pid)
4148
+ },
4149
+ stdio: [
4150
+ "ignore",
4151
+ logFile("pairing.stdout.log"),
4152
+ logFile("pairing.stderr.log")
4153
+ ]
4154
+ });
4155
+ pairingProcess = child;
4156
+ log("pairing controller started", { pid: child.pid, entrypoint: descriptor.args[0] ?? descriptor.command });
4157
+ child.once("error", (error) => {
4158
+ warn("pairing controller failed to start", error.message);
4159
+ if (pairingProcess !== child)
4160
+ return;
4161
+ pairingProcess = null;
4162
+ pairingNextStartAt = Date.now() + pairingRestartDelayMs;
4163
+ pairingRestartDelayMs = Math.min(pairingRestartDelayMs * 2, RESTART_MAX_DELAY_MS);
4164
+ reconcilePairingController();
4165
+ });
4166
+ child.once("exit", (code, signal) => {
4167
+ if (pairingProcess !== child)
4168
+ return;
4169
+ pairingProcess = null;
4170
+ if (shuttingDown)
4171
+ return;
4172
+ warn("pairing controller exited", { code, signal });
4173
+ pairingNextStartAt = Date.now() + pairingRestartDelayMs;
4174
+ pairingRestartDelayMs = Math.min(pairingRestartDelayMs * 2, RESTART_MAX_DELAY_MS);
4175
+ reconcilePairingController();
4176
+ });
4177
+ }
4178
+ async function reconcilePairingController() {
4179
+ if (shuttingDown || !pairingSupervisionClaimed || pairingReconcileInFlight)
4180
+ return;
4181
+ pairingReconcileInFlight = true;
4182
+ try {
4183
+ let intent = readScoutPairingSupervisorIntent(pairingPaths.intentPath);
4184
+ const runtimePid = readScoutPairingProcessPid(pairingPaths.runtimePidPath);
4185
+ const runtimeRunning = isScoutPairingProcessRunning(runtimePid);
4186
+ if (intent.desiredState === null) {
4187
+ intent = updateScoutPairingSupervisorIntent("start", pairingPaths.intentPath);
4188
+ log(runtimeRunning ? "adopted live pairing runtime as desired running state" : "initialized pairing desired state as running", runtimeRunning ? { pid: runtimePid } : {});
4189
+ }
4190
+ if (pairingRestartGeneration === null) {
4191
+ pairingRestartGeneration = intent.restartGeneration;
4192
+ }
4193
+ const restartRequested = pairingRestartGeneration !== intent.restartGeneration;
4194
+ if (restartRequested) {
4195
+ pairingRestartGeneration = intent.restartGeneration;
4196
+ }
4197
+ if (intent.desiredState !== "running") {
4198
+ pairingNextStartAt = 0;
4199
+ pairingRestartDelayMs = RESTART_MIN_DELAY_MS;
4200
+ if (runtimeRunning || pairingProcess) {
4201
+ await stopPairingController();
4202
+ }
4203
+ return;
4204
+ }
4205
+ if (restartRequested) {
4206
+ await stopPairingController();
4207
+ } else if (pairingProcess && !isChildExited(pairingProcess) && runtimeRunning && runtimePid === pairingProcess.pid) {
4208
+ pairingRestartDelayMs = RESTART_MIN_DELAY_MS;
4209
+ return;
4210
+ } else if (runtimeRunning) {
4211
+ await stopPairingController();
4212
+ } else if (pairingProcess && !isChildExited(pairingProcess)) {
4213
+ return;
4214
+ } else {
4215
+ pairingProcess = null;
4216
+ }
4217
+ if (Date.now() >= pairingNextStartAt) {
4218
+ spawnPairingController();
4219
+ }
4220
+ } catch (error) {
4221
+ warn("pairing supervisor reconciliation failed", error instanceof Error ? error.message : String(error));
4222
+ } finally {
4223
+ pairingReconcileInFlight = false;
4224
+ }
4225
+ }
4226
+ function startPairingSupervision() {
4227
+ try {
4228
+ claimScoutPairingSupervision(process.pid, pairingPaths.supervisorPidPath);
4229
+ } catch (error) {
4230
+ warn("pairing supervision is owned by another live process", error instanceof Error ? error.message : String(error));
4231
+ return;
4232
+ }
4233
+ pairingSupervisionClaimed = true;
4234
+ pairingReconcileTimer = setInterval(() => {
4235
+ reconcilePairingController();
4236
+ }, PAIRING_RECONCILE_INTERVAL_MS);
4237
+ pairingReconcileTimer.unref();
4238
+ reconcilePairingController();
4239
+ }
3889
4240
  function isChildExited(child) {
3890
4241
  return child.exitCode !== null || child.signalCode !== null;
3891
4242
  }
@@ -3941,10 +4292,21 @@ async function shutdown(exitCode = 0) {
3941
4292
  clearTimeout(webStartRetryTimer);
3942
4293
  webStartRetryTimer = null;
3943
4294
  }
4295
+ if (pairingReconcileTimer) {
4296
+ clearInterval(pairingReconcileTimer);
4297
+ pairingReconcileTimer = null;
4298
+ }
3944
4299
  const activeCaddyProcess = caddyProcess;
3945
4300
  stopEdgeProcesses();
3946
- await terminateChildProcess(brokerProcess, "broker");
3947
- await terminateChildProcess(activeCaddyProcess, "local edge", 2000);
4301
+ await Promise.all([
4302
+ stopPairingController(),
4303
+ terminateChildProcess(brokerProcess, "broker"),
4304
+ terminateChildProcess(activeCaddyProcess, "local edge", 2000)
4305
+ ]);
4306
+ if (pairingSupervisionClaimed) {
4307
+ releaseScoutPairingSupervision(process.pid, pairingPaths.supervisorPidPath);
4308
+ pairingSupervisionClaimed = false;
4309
+ }
3948
4310
  process.exit(exitCode);
3949
4311
  }
3950
4312
  function sleep(ms) {
@@ -3988,5 +4350,6 @@ log("starting Scout base service", {
3988
4350
  anchorBaseDaemonLifetime();
3989
4351
  spawnBroker();
3990
4352
  startLocalEdge();
4353
+ startPairingSupervision();
3991
4354
  startMenuBarApp();
3992
4355
  startWebWhenBrokerIsReady();