@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
package/dist/main.mjs CHANGED
@@ -146,7 +146,8 @@ function canonicalizeIdentity(input) {
146
146
  const definitionId = normalizeAgentIdentitySegment(input.definitionId);
147
147
  const workspaceQualifier = input.workspaceQualifier ? normalizeAgentIdentitySegment(input.workspaceQualifier) : undefined;
148
148
  const profile = input.profile ? normalizeAgentIdentitySegment(input.profile) : undefined;
149
- const harness = input.harness ? normalizeAgentIdentitySegment(input.harness) : undefined;
149
+ const rawHarness = input.harness ? normalizeAgentIdentitySegment(input.harness) : undefined;
150
+ const harness = rawHarness === "oc" ? "opencode" : rawHarness;
150
151
  const model = input.model ? normalizeAgentIdentitySegment(input.model) : undefined;
151
152
  const nodeQualifier = input.nodeQualifier ? normalizeAgentIdentitySegment(input.nodeQualifier) : undefined;
152
153
  if (!definitionId) {
@@ -1116,6 +1117,20 @@ var init_agent_runs = () => {};
1116
1117
  // ../protocol/src/budget.ts
1117
1118
  var init_budget = () => {};
1118
1119
 
1120
+ // ../protocol/src/presence.ts
1121
+ function presenceLifecycle(beat, now, options = {}) {
1122
+ if (now < beat.staleAt)
1123
+ return "fresh";
1124
+ const goneAfterStaleMs = options.goneAfterStaleMs ?? PRESENCE_GONE_AFTER_STALE_MS;
1125
+ if (now < beat.staleAt + goneAfterStaleMs)
1126
+ return "stale";
1127
+ return "gone";
1128
+ }
1129
+ function isPresenceGone(beat, now, options = {}) {
1130
+ return presenceLifecycle(beat, now, options) === "gone";
1131
+ }
1132
+ var PRESENCE_STALE_AFTER_MS = 45000, PRESENCE_GONE_AFTER_STALE_MS = 60000;
1133
+
1119
1134
  // ../protocol/src/host-integrations.ts
1120
1135
  var init_host_integrations = () => {};
1121
1136
 
@@ -1559,7 +1574,8 @@ function parseScoutRuntimeSpec(input) {
1559
1574
  error: "runtime must be <harness>[/<model>[/<effort>]]"
1560
1575
  };
1561
1576
  }
1562
- const harness = parts[0].trim().toLowerCase();
1577
+ const rawHarness = parts[0].trim().toLowerCase();
1578
+ const harness = rawHarness === "oc" ? "opencode" : rawHarness;
1563
1579
  if (!isScoutLaunchableHarness(harness)) {
1564
1580
  return {
1565
1581
  ok: false,
@@ -1589,14 +1605,18 @@ function parseScoutRuntimeSpec(input) {
1589
1605
  };
1590
1606
  }
1591
1607
  function isScoutLaunchableHarness(value) {
1592
- return Boolean(value) && SCOUT_LAUNCHABLE_HARNESSES.includes(value.trim().toLowerCase());
1608
+ if (!value)
1609
+ return false;
1610
+ const normalized = value.trim().toLowerCase();
1611
+ return normalized === "oc" || SCOUT_LAUNCHABLE_HARNESSES.includes(normalized);
1593
1612
  }
1594
1613
  function normalizeScoutReasoningEffort(value) {
1595
1614
  const normalized = value?.trim().toLowerCase();
1596
1615
  return normalized && SCOUT_REASONING_EFFORTS.includes(normalized) ? normalized : null;
1597
1616
  }
1598
1617
  function validateScoutRuntimeTuple(input, catalog) {
1599
- const harness = input.harness?.trim().toLowerCase();
1618
+ const rawHarness = input.harness?.trim().toLowerCase();
1619
+ const harness = rawHarness === "oc" ? "opencode" : rawHarness;
1600
1620
  const model = input.model?.trim();
1601
1621
  const effortRaw = input.reasoningEffort?.trim();
1602
1622
  const issues = [];
@@ -1633,7 +1653,7 @@ function validateScoutRuntimeTuple(input, catalog) {
1633
1653
  });
1634
1654
  }
1635
1655
  }
1636
- const modelSelectableHarness = harness === "claude" || harness === "codex" || harness === "grok" || harness === "grok-acp";
1656
+ const modelSelectableHarness = harness === "claude" || harness === "codex" || harness === "grok" || harness === "grok-acp" || harness === "opencode";
1637
1657
  if (model && harness && !modelSelectableHarness) {
1638
1658
  issues.push({
1639
1659
  code: "unsupported_model_dimension",
@@ -1693,7 +1713,9 @@ var init_runtime_profiles = __esm(() => {
1693
1713
  "fable",
1694
1714
  "kimi",
1695
1715
  "grok",
1696
- "opus"
1716
+ "opus",
1717
+ "oc",
1718
+ "opencode"
1697
1719
  ];
1698
1720
  });
1699
1721
 
@@ -1994,6 +2016,14 @@ var init_inbox = __esm(() => {
1994
2016
  ];
1995
2017
  });
1996
2018
 
2019
+ // ../protocol/src/events.ts
2020
+ var EPHEMERAL_CONTROL_EVENT_KINDS;
2021
+ var init_events = __esm(() => {
2022
+ EPHEMERAL_CONTROL_EVENT_KINDS = new Set([
2023
+ "presence.updated"
2024
+ ]);
2025
+ });
2026
+
1997
2027
  // ../protocol/src/cursor-transport.ts
1998
2028
  var init_cursor_transport = () => {};
1999
2029
 
@@ -2137,6 +2167,7 @@ var init_src = __esm(() => {
2137
2167
  init_reserved_vocabulary();
2138
2168
  init_scout_composer();
2139
2169
  init_inbox();
2170
+ init_events();
2140
2171
  init_permission_policy();
2141
2172
  init_cursor_transport();
2142
2173
  init_terminal_surface_id();
@@ -2320,7 +2351,7 @@ function mergeRuntimeProfileReasoningEffort(flagEffort, naturalEffort) {
2320
2351
  return naturalEffort ?? flagEffort;
2321
2352
  }
2322
2353
  function rejectUnsupportedRuntimeProfileEffort(profile, reasoningEffort) {
2323
- if (reasoningEffort && (profile === "grok" || profile === "kimi")) {
2354
+ if (reasoningEffort && (profile === "grok" || profile === "kimi" || profile === "oc" || profile === "opencode")) {
2324
2355
  throw new ScoutCliError(`reasoning_effort_harness_mismatch: ${profile} runtime profile does not support reasoning effort through its ACP transport`);
2325
2356
  }
2326
2357
  }
@@ -2458,7 +2489,7 @@ function parseSetupCommandOptions(args, defaultCurrentDirectory) {
2458
2489
  }
2459
2490
  if (current === "--default-harness" || current.startsWith("--default-harness=")) {
2460
2491
  const value = parseFlagValue(parsed.args, index, "--default-harness");
2461
- if (!["claude", "codex", "cursor", "grok", "pi"].includes(value.value)) {
2492
+ if (!["claude", "codex", "cursor", "grok", "pi", "opencode"].includes(value.value)) {
2462
2493
  throw new ScoutCliError(`invalid default harness: ${value.value}`);
2463
2494
  }
2464
2495
  defaultHarness = value.value;
@@ -4972,12 +5003,18 @@ var init_auth = __esm(() => {
4972
5003
  import { existsSync, mkdirSync, rmSync, writeFileSync } from "fs";
4973
5004
  import { homedir } from "os";
4974
5005
  import { join as join2 } from "path";
5006
+ function isTestRunnerProcess() {
5007
+ if (false)
5008
+ ;
5009
+ const entry = typeof Bun !== "undefined" ? Bun.main : process.argv[1] ?? "";
5010
+ return /[._](test|spec)\.[cm]?[jt]sx?$/.test(entry);
5011
+ }
4975
5012
  function assertTestIsolatedUserData(operation, isolationEnvKey) {
4976
- if (true)
5013
+ if (!isTestRunnerProcess())
4977
5014
  return;
4978
5015
  if (process.env[isolationEnvKey]?.trim())
4979
5016
  return;
4980
- throw new Error(`Refusing to ${operation} while NODE_ENV=test without ${isolationEnvKey} set. ` + "Tests must isolate OpenScout user data in a temp directory (see prepareHome in onboarding.test.ts).");
5017
+ throw new Error(`Refusing to ${operation} under a test runner without ${isolationEnvKey} set. ` + "Tests must isolate OpenScout user data in a temp directory (see prepareHome in onboarding.test.ts).");
4981
5018
  }
4982
5019
  function resolveOpenScoutSupportPaths() {
4983
5020
  const home = homedir();
@@ -5208,11 +5245,13 @@ function shellQuoteArg(value) {
5208
5245
  function findHarnessEntry(harness) {
5209
5246
  if (!harness)
5210
5247
  return null;
5211
- return BUILT_IN_HARNESS_CATALOG.find((e) => e.harness === harness || e.name === harness) ?? null;
5248
+ const lower = harness.trim().toLowerCase();
5249
+ return BUILT_IN_HARNESS_CATALOG.find((e) => e.harness === lower || e.name === lower || e.aliases?.includes(lower)) ?? null;
5212
5250
  }
5213
5251
  function createBuiltInHarnessCatalog() {
5214
5252
  return BUILT_IN_HARNESS_CATALOG.map((entry) => ({
5215
5253
  ...entry,
5254
+ aliases: entry.aliases ? [...entry.aliases] : undefined,
5216
5255
  tags: [...entry.tags],
5217
5256
  support: { ...entry.support },
5218
5257
  install: entry.install ? { ...entry.install, requires: [...entry.install.requires ?? []] } : undefined,
@@ -5581,6 +5620,7 @@ var init_harness_catalog = __esm(() => {
5581
5620
  {
5582
5621
  name: "opencode",
5583
5622
  harness: "opencode",
5623
+ aliases: ["oc", "opencode2"],
5584
5624
  label: "OpenCode",
5585
5625
  description: "OpenCode's coding agent over ACP, fronting many model vendors via OpenCode Zen",
5586
5626
  homepage: "https://opencode.ai/docs/",
@@ -5928,6 +5968,7 @@ async function readManagedInstallsFile(path = resolveOpenScoutSupportPaths().man
5928
5968
  }
5929
5969
  }
5930
5970
  async function writeManagedInstallsFile(file, path = resolveOpenScoutSupportPaths().managedInstallsPath) {
5971
+ assertTestIsolatedUserData("write the managed-installs registry", "OPENSCOUT_SUPPORT_DIRECTORY");
5931
5972
  await mkdir3(dirname3(path), { recursive: true });
5932
5973
  await writeFile3(path, JSON.stringify(file, null, 2) + `
5933
5974
  `, "utf8");
@@ -5977,6 +6018,38 @@ import {
5977
6018
  writeFileSync as writeFileSync2
5978
6019
  } from "fs";
5979
6020
  import { dirname as dirname4, join as join5 } from "path";
6021
+ function stripBonjourCollisionSuffix(value) {
6022
+ if (!value || typeof value !== "string")
6023
+ return "";
6024
+ let trimmed = value.trim();
6025
+ const isDotLocal = /\.local\.?$/i.test(trimmed);
6026
+ if (isDotLocal) {
6027
+ trimmed = trimmed.replace(/\.local\.?$/i, "");
6028
+ }
6029
+ const isHyphenLocalOpenscout = /-local-openscout$/i.test(trimmed);
6030
+ const isHyphenLocal = !isHyphenLocalOpenscout && /-local$/i.test(trimmed);
6031
+ if (isHyphenLocalOpenscout) {
6032
+ trimmed = trimmed.replace(/-local-openscout$/i, "");
6033
+ } else if (isHyphenLocal) {
6034
+ trimmed = trimmed.replace(/-local$/i, "");
6035
+ }
6036
+ if (!isDotLocal && !isHyphenLocalOpenscout && !isHyphenLocal) {
6037
+ return trimmed;
6038
+ }
6039
+ trimmed = trimmed.replace(/(?<=[a-zA-Z].*?)(?:-\d+)+$/, "");
6040
+ if (isDotLocal)
6041
+ return `${trimmed}.local`;
6042
+ if (isHyphenLocalOpenscout)
6043
+ return `${trimmed}-local-openscout`;
6044
+ if (isHyphenLocal)
6045
+ return `${trimmed}-local`;
6046
+ return trimmed;
6047
+ }
6048
+ function canonicalMeshNodeId(nodeId) {
6049
+ if (!nodeId || typeof nodeId !== "string")
6050
+ return "";
6051
+ return stripBonjourCollisionSuffix(nodeId);
6052
+ }
5980
6053
  function nodeIdentityPath(supportDirectory) {
5981
6054
  const dir = supportDirectory ?? resolveOpenScoutSupportPaths().supportDirectory;
5982
6055
  return join5(dir, NODE_IDENTITY_FILE);
@@ -6013,7 +6086,7 @@ function readAndValidateNodeIdentity(path) {
6013
6086
  if (parsed.version !== 1 || !parsed.publicKey || !parsed.privateKey) {
6014
6087
  throw new Error(`Corrupt node identity at ${path}; remove it to generate a fresh one.`);
6015
6088
  }
6016
- if (parsed.nodeQualifier !== undefined && normalizeNodeQualifier(parsed.nodeQualifier) !== parsed.nodeQualifier) {
6089
+ if (parsed.nodeQualifier !== undefined && normalizePersistedNodeQualifier(parsed.nodeQualifier) !== parsed.nodeQualifier) {
6017
6090
  throw new Error(`Corrupt node identity at ${path}; remove it to generate a fresh one.`);
6018
6091
  }
6019
6092
  try {
@@ -6026,9 +6099,12 @@ function readAndValidateNodeIdentity(path) {
6026
6099
  }
6027
6100
  return parsed;
6028
6101
  }
6029
- function normalizeNodeQualifier(value) {
6102
+ function normalizePersistedNodeQualifier(value) {
6030
6103
  return typeof value === "string" ? value.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/-+/g, "-").replace(/^-+|-+$/g, "") : "";
6031
6104
  }
6105
+ function normalizeNodeQualifier(value) {
6106
+ return stripBonjourCollisionSuffix(normalizePersistedNodeQualifier(value));
6107
+ }
6032
6108
  function createNodeIdentity(supportDirectory) {
6033
6109
  if (!supportDirectory) {
6034
6110
  assertTestIsolatedUserData("write the node identity", "OPENSCOUT_SUPPORT_DIRECTORY");
@@ -6661,6 +6737,9 @@ function normalizeManagedHarness(value, fallback) {
6661
6737
  if (value === "pi") {
6662
6738
  return "pi";
6663
6739
  }
6740
+ if (value === "opencode") {
6741
+ return "opencode";
6742
+ }
6664
6743
  return fallback;
6665
6744
  }
6666
6745
  function titleCase(value) {
@@ -7403,7 +7482,8 @@ async function detectHarnessMarkers(projectRoot) {
7403
7482
  grok: [],
7404
7483
  "grok-acp": [],
7405
7484
  kimi: [],
7406
- pi: []
7485
+ pi: [],
7486
+ opencode: []
7407
7487
  };
7408
7488
  for (const harness of MANAGED_AGENT_HARNESSES) {
7409
7489
  for (const marker of PROJECT_HARNESS_MARKERS[harness]) {
@@ -7584,6 +7664,7 @@ async function readOpenScoutSettings(options = {}) {
7584
7664
  async function writeOpenScoutSettings(settings, options = {}) {
7585
7665
  assertTestIsolatedUserData("write OpenScout settings", "OPENSCOUT_SUPPORT_DIRECTORY");
7586
7666
  ensureOpenScoutCleanSlateSync();
7667
+ const settingsPath = resolveOpenScoutSupportPaths().settingsPath;
7587
7668
  const current = await readOpenScoutSettings(options);
7588
7669
  const merged = {
7589
7670
  ...current,
@@ -7637,7 +7718,11 @@ async function writeOpenScoutSettings(settings, options = {}) {
7637
7718
  const normalized = await normalizeSettingsRecord(merged, {
7638
7719
  currentDirectory: options.currentDirectory
7639
7720
  });
7640
- await writeJsonFile(resolveOpenScoutSupportPaths().settingsPath, normalized);
7721
+ const settingsPathNow = resolveOpenScoutSupportPaths().settingsPath;
7722
+ if (settingsPathNow !== settingsPath) {
7723
+ throw new Error(`Refusing to write OpenScout settings: target moved from ${settingsPath} to ${settingsPathNow} mid-write (test teardown?).`);
7724
+ }
7725
+ await writeJsonFile(settingsPath, normalized);
7641
7726
  return normalized;
7642
7727
  }
7643
7728
  function scoutSkillInstallTargets(home = homedir4()) {
@@ -7890,6 +7975,8 @@ async function readRelayAgentOverrides() {
7890
7975
  }));
7891
7976
  }
7892
7977
  async function writeRelayAgentOverrides(overrides) {
7978
+ assertTestIsolatedUserData("write the relay-agents registry", "OPENSCOUT_SUPPORT_DIRECTORY");
7979
+ const registryPath = resolveOpenScoutSupportPaths().relayAgentsRegistryPath;
7893
7980
  const normalizedAgents = Object.fromEntries(Object.entries(overrides).map(([agentId, record]) => {
7894
7981
  const definitionId = normalizeAgentId(record.definitionId || record.agentId || agentId);
7895
7982
  const projectRoot = normalizePath(record.projectRoot);
@@ -7923,7 +8010,11 @@ async function writeRelayAgentOverrides(overrides) {
7923
8010
  }
7924
8011
  ];
7925
8012
  }));
7926
- await writeJsonFile(resolveOpenScoutSupportPaths().relayAgentsRegistryPath, {
8013
+ const registryPathNow = resolveOpenScoutSupportPaths().relayAgentsRegistryPath;
8014
+ if (registryPathNow !== registryPath) {
8015
+ throw new Error(`Refusing to write the relay-agents registry: target moved from ${registryPath} to ${registryPathNow} mid-write (test teardown?).`);
8016
+ }
8017
+ await writeJsonFile(registryPath, {
7927
8018
  version: 1,
7928
8019
  agents: normalizedAgents
7929
8020
  });
@@ -8658,7 +8749,7 @@ var init_setup = __esm(() => {
8658
8749
  init_open_scout_network();
8659
8750
  init_support_paths();
8660
8751
  init_user_project_hints();
8661
- MANAGED_AGENT_HARNESSES = ["claude", "codex", "cursor", "grok", "grok-acp", "kimi", "pi"];
8752
+ MANAGED_AGENT_HARNESSES = ["claude", "codex", "cursor", "grok", "grok-acp", "kimi", "pi", "opencode"];
8662
8753
  DEFAULT_OPERATOR_NAME = guessedOperatorName();
8663
8754
  DEFAULT_CAPABILITIES = ["chat", "invoke", "deliver"];
8664
8755
  PROJECT_SCAN_SKIP_DIRECTORIES = new Set([
@@ -8761,6 +8852,10 @@ var init_setup = __esm(() => {
8761
8852
  pi: [
8762
8853
  "PI.md",
8763
8854
  ".pi"
8855
+ ],
8856
+ opencode: [
8857
+ "OPENCODE.md",
8858
+ ".opencode"
8764
8859
  ]
8765
8860
  };
8766
8861
  PROJECT_STRONG_MARKERS_FLAT_NESTED = partitionFlatAndNestedMarkers(PROJECT_STRONG_MARKERS);
@@ -11128,12 +11223,14 @@ import {
11128
11223
  import { homedir as homedir6, hostname as osHostname } from "os";
11129
11224
  import { dirname as dirname7, join as join9 } from "path";
11130
11225
  function normalizeLocalHostnameLabel(value) {
11131
- const firstLabel = value?.trim().replace(/\.local\.?$/i, "").split(".").find((part) => part.trim().length > 0)?.trim();
11226
+ const stripped = value ? stripBonjourCollisionSuffix(value) : value;
11227
+ const firstLabel = stripped?.trim().replace(/\.local\.?$/i, "").split(".").find((part) => part.trim().length > 0)?.trim();
11132
11228
  const normalized = firstLabel?.toLowerCase().replace(/[^a-z0-9-]+/g, "-").replace(/^-+|-+$/g, "").replace(/-{2,}/g, "-");
11133
11229
  return normalized || "localhost";
11134
11230
  }
11135
11231
  function normalizeLocalHostname(value) {
11136
- const trimmed = value?.trim().replace(/\.$/, "").toLowerCase();
11232
+ const stripped = value ? stripBonjourCollisionSuffix(value) : value;
11233
+ const trimmed = stripped?.trim().replace(/\.$/, "").toLowerCase();
11137
11234
  const labels = trimmed?.split(".").map((label) => label.trim().replace(/[^a-z0-9-]+/g, "-").replace(/^-+|-+$/g, "").replace(/-{2,}/g, "-")).filter(Boolean);
11138
11235
  return labels && labels.length > 0 ? labels.join(".") : "localhost";
11139
11236
  }
@@ -11262,6 +11359,7 @@ function localConfigExists() {
11262
11359
  var LOCAL_CONFIG_VERSION = 1, DEFAULT_SCOUT_WEB_PORTAL_HOST = "scout.local", DEFAULT_SCOUT_WEB_DEV_HOST, DEFAULT_SCOUT_WEB_VITE_HMR_PATH = "/ws/hmr", OPENSCOUT_PORTS, DEFAULT_LOCAL_CONFIG;
11263
11360
  var init_local_config = __esm(() => {
11264
11361
  init_support_paths();
11362
+ init_node_identity();
11265
11363
  DEFAULT_SCOUT_WEB_DEV_HOST = `dev.${DEFAULT_SCOUT_WEB_PORTAL_HOST}`;
11266
11364
  OPENSCOUT_PORTS = {
11267
11365
  broker: 43110,
@@ -11656,13 +11754,13 @@ function resolveBrokerUrl(host, port, scope, env = process.env, lanHost = findLa
11656
11754
  return explicit;
11657
11755
  }
11658
11756
  if (scope === "mesh") {
11757
+ if (lanHost) {
11758
+ return buildDefaultBrokerHttpsUrl(lanHost, port);
11759
+ }
11659
11760
  const tailnetHost = readTailscaleSelfWebHostsSync(env)[0];
11660
11761
  if (tailnetHost) {
11661
11762
  return buildDefaultBrokerHttpsUrl(tailnetHost, port);
11662
11763
  }
11663
- if (lanHost) {
11664
- return buildDefaultBrokerHttpsUrl(lanHost, port);
11665
- }
11666
11764
  }
11667
11765
  return buildDefaultBrokerUrl(host, port);
11668
11766
  }
@@ -18156,9 +18254,15 @@ async function recordCodexSessionCatalog(runtimeDirectory, threadId, input) {
18156
18254
  });
18157
18255
  }
18158
18256
  async function closeCodexSessionCatalog(runtimeDirectory, threadId) {
18257
+ if (!threadId) {
18258
+ return;
18259
+ }
18159
18260
  const catalog = await readCodexSessionCatalog(runtimeDirectory);
18261
+ if (catalog.activeSessionId !== threadId) {
18262
+ return;
18263
+ }
18264
+ const activeSessionId = threadId;
18160
18265
  const now = Date.now();
18161
- const activeSessionId = threadId ?? catalog.activeSessionId;
18162
18266
  const sessions2 = catalog.sessions.map((session) => session.id === activeSessionId && !session.endedAt ? { ...session, endedAt: now } : session);
18163
18267
  await writeCodexSessionCatalog(runtimeDirectory, {
18164
18268
  activeSessionId: null,
@@ -18181,8 +18285,10 @@ class CodexAppServerTransport {
18181
18285
  nextRequestId = 1;
18182
18286
  pendingRequests = new Map;
18183
18287
  starting = null;
18288
+ threadPersistence = Promise.resolve();
18184
18289
  threadId = null;
18185
18290
  threadPath = null;
18291
+ durableThreadId = null;
18186
18292
  proactiveShutdown = null;
18187
18293
  lastConfigSignature;
18188
18294
  notificationListeners = new Set;
@@ -18250,7 +18356,7 @@ class CodexAppServerTransport {
18250
18356
  cwd: this.options.cwd,
18251
18357
  input: this.textInput(prompt)
18252
18358
  });
18253
- await this.persistState();
18359
+ await this.persistThreadId();
18254
18360
  return response;
18255
18361
  }
18256
18362
  async steerTurn(prompt, expectedTurnId) {
@@ -18300,10 +18406,12 @@ class CodexAppServerTransport {
18300
18406
  child.kill("SIGKILL");
18301
18407
  }
18302
18408
  }
18409
+ await this.threadPersistence;
18303
18410
  if (options.resetThread) {
18304
- await closeCodexSessionCatalog(this.options.runtimeDirectory, this.threadId);
18411
+ await closeCodexSessionCatalog(this.options.runtimeDirectory, this.durableThreadId);
18305
18412
  this.threadId = null;
18306
18413
  this.threadPath = null;
18414
+ this.durableThreadId = null;
18307
18415
  await rm2(this.threadIdPath, { force: true });
18308
18416
  }
18309
18417
  await this.persistState();
@@ -18426,6 +18534,7 @@ class CodexAppServerTransport {
18426
18534
  const requestedThreadId = this.options.threadId?.trim() || null;
18427
18535
  const storedThreadId = requestedThreadId ?? await readOptionalFile(this.threadIdPath);
18428
18536
  if (storedThreadId) {
18537
+ const threadOrigin = requestedThreadId ? "requested" : "stored";
18429
18538
  try {
18430
18539
  const resumed = await this.request("thread/resume", {
18431
18540
  threadId: storedThreadId,
@@ -18437,11 +18546,10 @@ class CodexAppServerTransport {
18437
18546
  });
18438
18547
  this.threadId = resumed.thread.id;
18439
18548
  this.threadPath = resumed.thread.path ?? null;
18440
- await this.persistThreadId();
18441
- await recordCodexSessionCatalog(this.options.runtimeDirectory, this.threadId, this.catalogRuntimeMeta());
18549
+ await this.persistThreadId({ confirmed: true });
18442
18550
  return;
18443
18551
  } catch (error) {
18444
- await appendFile2(this.stderrLogPath, `[openscout] failed to resume stored Codex thread ${storedThreadId}: ${errorMessage3(error)}
18552
+ await appendFile2(this.stderrLogPath, `[openscout] failed to resume ${threadOrigin} Codex thread ${storedThreadId}: ${errorMessage3(error)}
18445
18553
  `).catch(() => {
18446
18554
  return;
18447
18555
  });
@@ -18449,9 +18557,11 @@ class CodexAppServerTransport {
18449
18557
  await rm2(this.threadIdPath, { force: true }).catch(() => {
18450
18558
  return;
18451
18559
  });
18560
+ await closeCodexSessionCatalog(this.options.runtimeDirectory, storedThreadId);
18561
+ await this.persistState();
18452
18562
  }
18453
18563
  if (requestedThreadId || this.options.requireExistingThread) {
18454
- throw new Error(`Failed to resume requested Codex thread ${storedThreadId}: ${errorMessage3(error)}`);
18564
+ throw new Error(`Failed to resume ${threadOrigin} Codex thread ${storedThreadId}: ${errorMessage3(error)}`);
18455
18565
  }
18456
18566
  }
18457
18567
  }
@@ -18470,8 +18580,10 @@ class CodexAppServerTransport {
18470
18580
  });
18471
18581
  this.threadId = started.thread.id;
18472
18582
  this.threadPath = started.thread.path ?? null;
18583
+ if (this.durableThreadId !== this.threadId) {
18584
+ this.durableThreadId = null;
18585
+ }
18473
18586
  await this.persistThreadId();
18474
- await recordCodexSessionCatalog(this.options.runtimeDirectory, this.threadId, this.catalogRuntimeMeta());
18475
18587
  }
18476
18588
  catalogRuntimeMeta() {
18477
18589
  return {
@@ -18541,12 +18653,17 @@ class CodexAppServerTransport {
18541
18653
  if (method === "thread/started" || method === "thread/name/updated") {
18542
18654
  const thread = params.thread;
18543
18655
  if (thread?.id) {
18656
+ if (thread.id !== this.threadId) {
18657
+ this.durableThreadId = null;
18658
+ }
18544
18659
  this.threadId = thread.id;
18545
18660
  }
18546
18661
  if ("path" in (thread ?? {})) {
18547
18662
  this.threadPath = thread?.path ?? null;
18548
18663
  }
18549
18664
  this.persistThreadId();
18665
+ } else if (this.threadId && !this.durableThreadId) {
18666
+ this.persistThreadId();
18550
18667
  }
18551
18668
  this.emitNotification(message);
18552
18669
  }
@@ -18598,16 +18715,46 @@ class CodexAppServerTransport {
18598
18715
  });
18599
18716
  this.persistState();
18600
18717
  }
18601
- async persistThreadId() {
18602
- if (!this.threadId) {
18718
+ persistThreadId(options = {}) {
18719
+ const persistence = this.threadPersistence.then(() => this.persistThreadIdNow(options));
18720
+ this.threadPersistence = persistence.catch(() => {
18721
+ return;
18722
+ });
18723
+ return persistence;
18724
+ }
18725
+ async persistThreadIdNow(options) {
18726
+ const threadId = this.threadId;
18727
+ if (!threadId) {
18728
+ this.durableThreadId = null;
18603
18729
  await rm2(this.threadIdPath, { force: true });
18730
+ await this.persistState();
18604
18731
  return;
18605
18732
  }
18606
- await writeFile6(this.threadIdPath, `${this.threadId}
18733
+ let rolloutExists = false;
18734
+ if (this.threadPath) {
18735
+ try {
18736
+ rolloutExists = (await stat4(this.threadPath)).isFile();
18737
+ } catch {
18738
+ rolloutExists = false;
18739
+ }
18740
+ }
18741
+ if (!options.confirmed && !rolloutExists && this.durableThreadId !== threadId) {
18742
+ this.durableThreadId = null;
18743
+ await rm2(this.threadIdPath, { force: true });
18744
+ await this.persistState();
18745
+ return;
18746
+ }
18747
+ const becameDurable = this.durableThreadId !== threadId;
18748
+ await writeFile6(this.threadIdPath, `${threadId}
18607
18749
  `);
18750
+ this.durableThreadId = threadId;
18608
18751
  await this.persistState();
18752
+ if (becameDurable) {
18753
+ await recordCodexSessionCatalog(this.options.runtimeDirectory, threadId, this.catalogRuntimeMeta());
18754
+ }
18609
18755
  }
18610
18756
  async persistState() {
18757
+ const durableThreadPath = this.durableThreadId === this.threadId ? this.threadPath : null;
18611
18758
  await mkdir6(this.options.runtimeDirectory, { recursive: true });
18612
18759
  await writeFile6(this.statePath, JSON.stringify({
18613
18760
  agentId: this.options.agentName,
@@ -18615,8 +18762,8 @@ class CodexAppServerTransport {
18615
18762
  sessionId: this.options.sessionId,
18616
18763
  projectRoot: this.options.cwd,
18617
18764
  cwd: this.options.cwd,
18618
- threadId: this.threadId,
18619
- threadPath: this.threadPath,
18765
+ threadId: this.durableThreadId,
18766
+ threadPath: durableThreadPath,
18620
18767
  requestedThreadId: this.options.threadId ?? null,
18621
18768
  requireExistingThread: this.options.requireExistingThread === true,
18622
18769
  pid: this.process?.pid ?? null,
@@ -29611,6 +29758,7 @@ function loadUserConfig() {
29611
29758
  }
29612
29759
  }
29613
29760
  function saveUserConfig(config) {
29761
+ assertTestIsolatedUserData("write the OpenScout user config", "OPENSCOUT_HOME");
29614
29762
  const configPath = userConfigPath();
29615
29763
  mkdirSync6(dirname16(configPath), { recursive: true });
29616
29764
  writeFileSync6(configPath, JSON.stringify(config, null, 2) + `
@@ -32306,7 +32454,7 @@ var init_local_agents = __esm(() => {
32306
32454
  OPENSCOUT_REPO_ROOT = resolve13(MODULE_DIRECTORY, "..", "..", "..");
32307
32455
  DEFAULT_LOCAL_AGENT_CAPABILITIES = ["chat", "invoke", "deliver"];
32308
32456
  DEFAULT_ONE_TIME_LOCAL_AGENT_CARD_TTL_MS = 24 * 60 * 60 * 1000;
32309
- SUPPORTED_LOCAL_AGENT_HARNESSES = ["claude", "codex", "grok", "grok-acp", "kimi", "pi", "cursor"];
32457
+ SUPPORTED_LOCAL_AGENT_HARNESSES = ["claude", "codex", "grok", "grok-acp", "kimi", "pi", "cursor", "opencode"];
32310
32458
  SUPPORTED_SCOUT_HARNESSES = [...SCOUT_LAUNCHABLE_HARNESSES];
32311
32459
  DEFAULT_CLAUDE_SCOUT_ALLOWED_TOOLS = [
32312
32460
  "mcp__scout__current_reply_context",
@@ -39222,6 +39370,10 @@ function hasColumn(database, tableName, columnName) {
39222
39370
  const rows = database.query(`SELECT name FROM pragma_table_info('${escapedTableName}')`).all();
39223
39371
  return rows.some((row) => row.name === columnName);
39224
39372
  }
39373
+ function hasTable(database, tableName) {
39374
+ const row = database.query("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?1").get(tableName);
39375
+ return Boolean(row);
39376
+ }
39225
39377
  function configureControlPlaneDatabase(database) {
39226
39378
  database.exec("PRAGMA busy_timeout = 5000;");
39227
39379
  database.exec("PRAGMA journal_mode = WAL;");
@@ -39383,6 +39535,7 @@ var init_control_plane_migrations = __esm(() => {
39383
39535
  init_migrator();
39384
39536
  init_schema();
39385
39537
  init_support_paths();
39538
+ init_node_identity();
39386
39539
  CONTROL_PLANE_SCHEMA_MIGRATIONS = [
39387
39540
  {
39388
39541
  id: "runtime-session-mapping-read-model",
@@ -39561,6 +39714,46 @@ WHERE latest.invocation_id = inv.id
39561
39714
  database.exec("ALTER TABLE trusted_peers ADD COLUMN tls_spki_fingerprint TEXT");
39562
39715
  }
39563
39716
  }
39717
+ },
39718
+ {
39719
+ id: "canonicalize-mesh-nodes-and-rehome",
39720
+ description: "Re-homes foreign key references on Bonjour collision-suffixed ghost nodes to canonical stable node IDs and prunes ghost nodes.",
39721
+ apply(database) {
39722
+ if (!hasTable(database, "nodes"))
39723
+ return;
39724
+ const nodeRows = database.query("SELECT * FROM nodes").all();
39725
+ for (const row of nodeRows) {
39726
+ const canonicalId = canonicalMeshNodeId(row.id);
39727
+ if (canonicalId && canonicalId !== row.id) {
39728
+ const existing = nodeRows.find((r) => r.id === canonicalId);
39729
+ if (!existing) {
39730
+ database.query(`INSERT INTO nodes (
39731
+ id, mesh_id, name, host_name, advertise_scope, broker_url, tailnet_name,
39732
+ capabilities_json, labels_json, metadata_json, last_seen_at, registered_at
39733
+ ) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12)
39734
+ ON CONFLICT(id) DO UPDATE SET
39735
+ last_seen_at = MAX(COALESCE(nodes.last_seen_at, 0), COALESCE(excluded.last_seen_at, 0)),
39736
+ broker_url = COALESCE(excluded.broker_url, nodes.broker_url),
39737
+ tailnet_name = COALESCE(excluded.tailnet_name, nodes.tailnet_name)`).run(canonicalId, row.mesh_id, stripBonjourCollisionSuffix(row.name) || row.name, stripBonjourCollisionSuffix(row.host_name ?? "") || (row.host_name ?? null), row.advertise_scope, row.broker_url ?? null, row.tailnet_name ?? null, row.capabilities_json ?? null, row.labels_json ?? null, row.metadata_json ?? null, row.last_seen_at ?? null, row.registered_at);
39738
+ }
39739
+ database.query("UPDATE agents SET home_node_id = ?1 WHERE home_node_id = ?2").run(canonicalId, row.id);
39740
+ database.query("UPDATE agents SET authority_node_id = ?1 WHERE authority_node_id = ?2").run(canonicalId, row.id);
39741
+ database.query("UPDATE agent_endpoints SET node_id = ?1 WHERE node_id = ?2").run(canonicalId, row.id);
39742
+ database.query("UPDATE runtime_sessions SET node_id = ?1 WHERE node_id = ?2").run(canonicalId, row.id);
39743
+ database.query("UPDATE runtime_session_aliases SET node_id = ?1 WHERE node_id = ?2").run(canonicalId, row.id);
39744
+ database.query("UPDATE conversations SET authority_node_id = ?1 WHERE authority_node_id = ?2").run(canonicalId, row.id);
39745
+ database.query("UPDATE conversation_read_cursors SET reader_node_id = ?1 WHERE reader_node_id = ?2").run(canonicalId, row.id);
39746
+ database.query("UPDATE messages SET origin_node_id = ?1 WHERE origin_node_id = ?2").run(canonicalId, row.id);
39747
+ database.query("UPDATE deliveries SET target_node_id = ?1 WHERE target_node_id = ?2").run(canonicalId, row.id);
39748
+ database.query("UPDATE invocations SET requester_node_id = ?1 WHERE requester_node_id = ?2").run(canonicalId, row.id);
39749
+ database.query("UPDATE invocations SET target_node_id = ?1 WHERE target_node_id = ?2").run(canonicalId, row.id);
39750
+ database.query("UPDATE thread_events SET authority_node_id = ?1 WHERE authority_node_id = ?2").run(canonicalId, row.id);
39751
+ database.query("UPDATE thread_cursors SET authority_node_id = ?1 WHERE authority_node_id = ?2").run(canonicalId, row.id);
39752
+ database.query("UPDATE trusted_peers SET node_id = ?1 WHERE node_id = ?2").run(canonicalId, row.id);
39753
+ database.query("DELETE FROM nodes WHERE id = ?1").run(row.id);
39754
+ }
39755
+ }
39756
+ }
39564
39757
  }
39565
39758
  ];
39566
39759
  LEGACY_ROLE_MIGRATION_HASHES = [
@@ -40426,6 +40619,93 @@ class SQLiteControlPlaneStore {
40426
40619
  sessionsDeleted: sessionsResult.changes ?? 0
40427
40620
  };
40428
40621
  }
40622
+ compactAndPruneMeshNodes(options = {}) {
40623
+ const now = options.now ?? currentTimestampMs();
40624
+ const maxStaleAgeMs = options.maxStaleAgeMs ?? 7 * 24 * 60 * 60 * 1000;
40625
+ const staleCutoff = now - maxStaleAgeMs;
40626
+ const nodeRows = this.db.query("SELECT * FROM nodes").all();
40627
+ const peerRows = this.db.query("SELECT * FROM trusted_peers").all();
40628
+ const rehomedMappings = [];
40629
+ const rehomeMap = new Map;
40630
+ for (const row of nodeRows) {
40631
+ const canonicalId = canonicalMeshNodeId(row.id);
40632
+ if (canonicalId && canonicalId !== row.id) {
40633
+ rehomeMap.set(row.id, { to: canonicalId, candidateRow: row });
40634
+ }
40635
+ }
40636
+ let rehomedNodeCount = 0;
40637
+ let prunedNodeCount = 0;
40638
+ this.db.transaction(() => {
40639
+ for (const [staleId, { to: canonicalId, candidateRow }] of rehomeMap.entries()) {
40640
+ const existingCanonical = nodeRows.find((r) => r.id === canonicalId);
40641
+ if (!existingCanonical) {
40642
+ this.db.query(`INSERT INTO nodes (
40643
+ id, mesh_id, name, host_name, advertise_scope, broker_url, tailnet_name,
40644
+ capabilities_json, labels_json, metadata_json, last_seen_at, registered_at
40645
+ ) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12)
40646
+ ON CONFLICT(id) DO UPDATE SET
40647
+ last_seen_at = MAX(COALESCE(nodes.last_seen_at, 0), COALESCE(excluded.last_seen_at, 0)),
40648
+ broker_url = COALESCE(excluded.broker_url, nodes.broker_url),
40649
+ tailnet_name = COALESCE(excluded.tailnet_name, nodes.tailnet_name)`).run(canonicalId, candidateRow.mesh_id, stripBonjourCollisionSuffix(candidateRow.name) || candidateRow.name, stripBonjourCollisionSuffix(candidateRow.host_name ?? "") || (candidateRow.host_name ?? null), candidateRow.advertise_scope, candidateRow.broker_url ?? null, candidateRow.tailnet_name ?? null, candidateRow.capabilities_json ?? null, candidateRow.labels_json ?? null, candidateRow.metadata_json ?? null, candidateRow.last_seen_at ?? null, candidateRow.registered_at);
40650
+ } else {
40651
+ this.db.query(`UPDATE nodes SET
40652
+ last_seen_at = MAX(COALESCE(last_seen_at, 0), COALESCE(?1, 0)),
40653
+ broker_url = COALESCE(?2, broker_url)
40654
+ WHERE id = ?3`).run(candidateRow.last_seen_at ?? null, candidateRow.broker_url ?? null, canonicalId);
40655
+ }
40656
+ this.db.query("UPDATE agents SET home_node_id = ?1 WHERE home_node_id = ?2").run(canonicalId, staleId);
40657
+ this.db.query("UPDATE agents SET authority_node_id = ?1 WHERE authority_node_id = ?2").run(canonicalId, staleId);
40658
+ this.db.query("UPDATE agent_endpoints SET node_id = ?1 WHERE node_id = ?2").run(canonicalId, staleId);
40659
+ this.db.query("UPDATE runtime_sessions SET node_id = ?1 WHERE node_id = ?2").run(canonicalId, staleId);
40660
+ this.db.query("UPDATE runtime_session_aliases SET node_id = ?1 WHERE node_id = ?2").run(canonicalId, staleId);
40661
+ this.db.query("UPDATE conversations SET authority_node_id = ?1 WHERE authority_node_id = ?2").run(canonicalId, staleId);
40662
+ this.db.query("UPDATE conversation_read_cursors SET reader_node_id = ?1 WHERE reader_node_id = ?2").run(canonicalId, staleId);
40663
+ this.db.query("UPDATE messages SET origin_node_id = ?1 WHERE origin_node_id = ?2").run(canonicalId, staleId);
40664
+ this.db.query("UPDATE deliveries SET target_node_id = ?1 WHERE target_node_id = ?2").run(canonicalId, staleId);
40665
+ this.db.query("UPDATE invocations SET requester_node_id = ?1 WHERE requester_node_id = ?2").run(canonicalId, staleId);
40666
+ this.db.query("UPDATE invocations SET target_node_id = ?1 WHERE target_node_id = ?2").run(canonicalId, staleId);
40667
+ this.db.query("UPDATE thread_events SET authority_node_id = ?1 WHERE authority_node_id = ?2").run(canonicalId, staleId);
40668
+ this.db.query("UPDATE thread_cursors SET authority_node_id = ?1 WHERE authority_node_id = ?2").run(canonicalId, staleId);
40669
+ this.db.query("UPDATE trusted_peers SET node_id = ?1 WHERE node_id = ?2").run(canonicalId, staleId);
40670
+ const delRes = this.db.query("DELETE FROM nodes WHERE id = ?1").run(staleId);
40671
+ if ((delRes.changes ?? 0) > 0) {
40672
+ prunedNodeCount++;
40673
+ rehomedNodeCount++;
40674
+ rehomedMappings.push({ from: staleId, to: canonicalId });
40675
+ }
40676
+ }
40677
+ for (const peer of peerRows) {
40678
+ if (peer.node_id) {
40679
+ const canonical = canonicalMeshNodeId(peer.node_id);
40680
+ if (canonical && canonical !== peer.node_id) {
40681
+ this.db.query("UPDATE trusted_peers SET node_id = ?1 WHERE key_id = ?2").run(canonical, peer.key_id);
40682
+ }
40683
+ }
40684
+ }
40685
+ const remainingNodes = this.db.query("SELECT * FROM nodes").all();
40686
+ for (const row of remainingNodes) {
40687
+ if (row.id === options.localNodeId)
40688
+ continue;
40689
+ const lastActive = row.last_seen_at ?? row.registered_at;
40690
+ if (lastActive > staleCutoff)
40691
+ continue;
40692
+ const isTrusted = peerRows.some((p) => p.node_id === row.id);
40693
+ if (isTrusted)
40694
+ continue;
40695
+ try {
40696
+ const delRes = this.db.query("DELETE FROM nodes WHERE id = ?1").run(row.id);
40697
+ if ((delRes.changes ?? 0) > 0) {
40698
+ prunedNodeCount++;
40699
+ }
40700
+ } catch {}
40701
+ }
40702
+ })();
40703
+ return {
40704
+ rehomedNodeCount,
40705
+ prunedNodeCount,
40706
+ rehomedMappings
40707
+ };
40708
+ }
40429
40709
  close() {
40430
40710
  this.flushPendingEvents();
40431
40711
  if (this.flushPendingEventsTimer) {
@@ -42276,6 +42556,7 @@ class SQLiteControlPlaneStore {
42276
42556
  var RUNTIME_SESSION_RETENTION_MS, RUNTIME_SESSION_ALIAS_METADATA_KEYS;
42277
42557
  var init_sqlite_store = __esm(() => {
42278
42558
  init_drizzle_orm();
42559
+ init_node_identity();
42279
42560
  init_src();
42280
42561
  init_registry3();
42281
42562
  init_drizzle_client();
@@ -57946,10 +58227,75 @@ var init_iroh_bridge = __esm(() => {
57946
58227
  init_support_paths();
57947
58228
  });
57948
58229
 
58230
+ // ../runtime/src/mesh-dial-order.ts
58231
+ function meshDialRank(url) {
58232
+ let hostname2;
58233
+ try {
58234
+ hostname2 = new URL(url).hostname.replace(/^\[|\]$/g, "").toLowerCase();
58235
+ } catch {
58236
+ return 2;
58237
+ }
58238
+ if (isTailscaleIPv42(hostname2) || TAILSCALE_MAGIC_DNS.test(hostname2)) {
58239
+ return 1;
58240
+ }
58241
+ if (isPrivateLanIPv4(hostname2) || hostname2.endsWith(".local")) {
58242
+ return 0;
58243
+ }
58244
+ return 2;
58245
+ }
58246
+ function orderMeshDialUrls(urls) {
58247
+ const seen = new Set;
58248
+ const unique3 = [];
58249
+ for (const url of urls) {
58250
+ const trimmed = url.trim();
58251
+ if (!trimmed || seen.has(trimmed))
58252
+ continue;
58253
+ seen.add(trimmed);
58254
+ unique3.push(trimmed);
58255
+ }
58256
+ return unique3.map((url, index2) => ({ url, index: index2, rank: meshDialRank(url) })).sort((left, right) => left.rank - right.rank || left.index - right.index).map((entry) => entry.url);
58257
+ }
58258
+ function httpMeshUrlsForNode(node) {
58259
+ const urls = [];
58260
+ if (node.brokerUrl)
58261
+ urls.push(node.brokerUrl);
58262
+ for (const entrypoint of node.meshEntrypoints ?? []) {
58263
+ if (entrypoint.kind === "http" && entrypoint.url) {
58264
+ urls.push(entrypoint.url);
58265
+ }
58266
+ }
58267
+ return orderMeshDialUrls(urls);
58268
+ }
58269
+ function isPrivateLanIPv4(address) {
58270
+ const octets = parseIPv42(address);
58271
+ if (!octets)
58272
+ return false;
58273
+ const [first, second] = octets;
58274
+ return first === 10 || first === 172 && second >= 16 && second <= 31 || first === 192 && second === 168;
58275
+ }
58276
+ function isTailscaleIPv42(address) {
58277
+ const octets = parseIPv42(address);
58278
+ return Boolean(octets && octets[0] === 100 && octets[1] >= 64 && octets[1] <= 127);
58279
+ }
58280
+ function parseIPv42(address) {
58281
+ const octets = address.split(".");
58282
+ if (octets.length !== 4)
58283
+ return null;
58284
+ const numbers = octets.map((octet) => Number(octet));
58285
+ if (numbers.some((value) => !Number.isInteger(value) || value < 0 || value > 255))
58286
+ return null;
58287
+ return numbers;
58288
+ }
58289
+ var TAILSCALE_MAGIC_DNS;
58290
+ var init_mesh_dial_order = __esm(() => {
58291
+ TAILSCALE_MAGIC_DNS = /\.(ts\.net|tailscale\.net)$/i;
58292
+ });
58293
+
57949
58294
  // ../runtime/src/mesh-forwarding.ts
57950
58295
  var init_mesh_forwarding = __esm(() => {
57951
58296
  init_iroh_bridge();
57952
58297
  init_mesh_peer_client();
58298
+ init_mesh_dial_order();
57953
58299
  });
57954
58300
 
57955
58301
  // ../runtime/src/mesh-rendezvous.ts
@@ -57972,6 +58318,7 @@ var init_mesh_mdns_service = __esm(() => {
57972
58318
  // ../runtime/src/mesh-bind-controller.ts
57973
58319
  var init_mesh_bind_controller = __esm(() => {
57974
58320
  init_broker_process_manager();
58321
+ init_mesh_dial_order();
57975
58322
  init_broker_server_lifecycle();
57976
58323
  init_mesh_mdns_service();
57977
58324
  init_node_tls_identity();
@@ -59818,14 +60165,14 @@ class BrokerRendezvousService {
59818
60165
  }
59819
60166
  return consumedResponse(activeMatch, input.participantId);
59820
60167
  }
59821
- const presence = this.presences.get(key);
59822
- if (presence && presence.participantId !== input.participantId) {
60168
+ const presence2 = this.presences.get(key);
60169
+ if (presence2 && presence2.participantId !== input.participantId) {
59823
60170
  const match = {
59824
60171
  id: this.createMatchId(),
59825
- projectRoot: presence.projectRoot,
59826
- codename: presence.codename,
59827
- normalizedCodename: presence.normalizedCodename,
59828
- participantIds: [presence.participantId, input.participantId],
60172
+ projectRoot: presence2.projectRoot,
60173
+ codename: presence2.codename,
60174
+ normalizedCodename: presence2.normalizedCodename,
60175
+ participantIds: [presence2.participantId, input.participantId],
59829
60176
  createdAt: now,
59830
60177
  expiresAt: now + this.matchTtlMs
59831
60178
  };
@@ -59834,7 +60181,7 @@ class BrokerRendezvousService {
59834
60181
  this.resolveMatchedWaiters(key, match);
59835
60182
  return matchedResponse(match, input.participantId);
59836
60183
  }
59837
- if (!presence) {
60184
+ if (!presence2) {
59838
60185
  const expiredInvite = this.expiredInvites.get(key);
59839
60186
  if (expiredInvite) {
59840
60187
  return expiredResponse(expiredInvite, input.participantId);
@@ -59851,9 +60198,9 @@ class BrokerRendezvousService {
59851
60198
  };
59852
60199
  }
59853
60200
  if (input.waitMs === 0) {
59854
- return waitingResponse(presence);
60201
+ return waitingResponse(presence2);
59855
60202
  }
59856
- return await this.waitForMatch(key, presence, input.waitMs);
60203
+ return await this.waitForMatch(key, presence2, input.waitMs);
59857
60204
  }
59858
60205
  create(projectRoot, participantId, requestedCodename) {
59859
60206
  const now = this.now();
@@ -59875,15 +60222,15 @@ class BrokerRendezvousService {
59875
60222
  suggestion: "choose_another_codename"
59876
60223
  };
59877
60224
  }
59878
- const presence = this.presences.get(key);
59879
- if (presence) {
60225
+ const presence2 = this.presences.get(key);
60226
+ if (presence2) {
59880
60227
  return {
59881
60228
  status: "codename_busy",
59882
- codename: presence.codename,
60229
+ codename: presence2.codename,
59883
60230
  projectRoot,
59884
60231
  participantId,
59885
60232
  participantCount: 1,
59886
- expiresAt: presence.expiresAt,
60233
+ expiresAt: presence2.expiresAt,
59887
60234
  suggestion: "choose_another_codename"
59888
60235
  };
59889
60236
  }
@@ -59901,7 +60248,7 @@ class BrokerRendezvousService {
59901
60248
  throw new Error("could not allocate a unique match codename");
59902
60249
  }
59903
60250
  createPresence(projectRoot, participantId, codename, normalizedCodename, now) {
59904
- const presence = {
60251
+ const presence2 = {
59905
60252
  participantId,
59906
60253
  projectRoot,
59907
60254
  codename,
@@ -59909,14 +60256,14 @@ class BrokerRendezvousService {
59909
60256
  joinedAt: now,
59910
60257
  expiresAt: now + this.presenceTtlMs
59911
60258
  };
59912
- this.presences.set(rendezvousKey(projectRoot, normalizedCodename), presence);
60259
+ this.presences.set(rendezvousKey(projectRoot, normalizedCodename), presence2);
59913
60260
  return {
59914
60261
  status: "created",
59915
60262
  codename,
59916
60263
  projectRoot,
59917
60264
  participantId,
59918
60265
  createdAt: now,
59919
- expiresAt: presence.expiresAt
60266
+ expiresAt: presence2.expiresAt
59920
60267
  };
59921
60268
  }
59922
60269
  hasCodenameInAnotherProject(projectRoot, normalizedCodename) {
@@ -59928,11 +60275,11 @@ class BrokerRendezvousService {
59928
60275
  }
59929
60276
  cleanupExpired() {
59930
60277
  const now = this.now();
59931
- for (const [key, presence] of this.presences) {
59932
- if (presence.expiresAt > now)
60278
+ for (const [key, presence2] of this.presences) {
60279
+ if (presence2.expiresAt > now)
59933
60280
  continue;
59934
60281
  this.presences.delete(key);
59935
- const expiredInvite = this.recordExpiredInvite(presence);
60282
+ const expiredInvite = this.recordExpiredInvite(presence2);
59936
60283
  this.resolveExpiredWaiters(key, expiredInvite);
59937
60284
  }
59938
60285
  for (const [key, match] of this.matches) {
@@ -59950,18 +60297,18 @@ class BrokerRendezvousService {
59950
60297
  if (this.cleanupTimer) {
59951
60298
  clearInterval(this.cleanupTimer);
59952
60299
  }
59953
- for (const [key, presence] of this.presences) {
59954
- this.resolveExpiredWaiters(key, this.recordExpiredInvite(presence));
60300
+ for (const [key, presence2] of this.presences) {
60301
+ this.resolveExpiredWaiters(key, this.recordExpiredInvite(presence2));
59955
60302
  }
59956
60303
  this.presences.clear();
59957
60304
  this.matches.clear();
59958
60305
  this.expiredInvites.clear();
59959
60306
  }
59960
- waitForMatch(key, presence, waitMs) {
60307
+ waitForMatch(key, presence2, waitMs) {
59961
60308
  return new Promise((resolveWait) => {
59962
- const waitDuration = Math.min(waitMs, Math.max(0, presence.expiresAt - this.now()));
60309
+ const waitDuration = Math.min(waitMs, Math.max(0, presence2.expiresAt - this.now()));
59963
60310
  const waiter = {
59964
- participantId: presence.participantId,
60311
+ participantId: presence2.participantId,
59965
60312
  resolve: resolveWait,
59966
60313
  timer: setTimeout(() => {
59967
60314
  this.removeWaiter(key, waiter);
@@ -59982,7 +60329,7 @@ class BrokerRendezvousService {
59982
60329
  resolveWait(expiredResponse(expiredInvite, waiter.participantId));
59983
60330
  return;
59984
60331
  }
59985
- resolveWait(notFoundResponse(presence, waiter.participantId));
60332
+ resolveWait(notFoundResponse(presence2, waiter.participantId));
59986
60333
  }, waitDuration)
59987
60334
  };
59988
60335
  waiter.timer.unref?.();
@@ -60011,15 +60358,15 @@ class BrokerRendezvousService {
60011
60358
  waiter.resolve(expiredResponse(expiredInvite, waiter.participantId));
60012
60359
  }
60013
60360
  }
60014
- recordExpiredInvite(presence) {
60361
+ recordExpiredInvite(presence2) {
60015
60362
  const expiredInvite = {
60016
- projectRoot: presence.projectRoot,
60017
- codename: presence.codename,
60018
- normalizedCodename: presence.normalizedCodename,
60019
- inviteExpiresAt: presence.expiresAt,
60363
+ projectRoot: presence2.projectRoot,
60364
+ codename: presence2.codename,
60365
+ normalizedCodename: presence2.normalizedCodename,
60366
+ inviteExpiresAt: presence2.expiresAt,
60020
60367
  retainUntil: this.now() + this.matchTtlMs
60021
60368
  };
60022
- this.expiredInvites.set(rendezvousKey(presence.projectRoot, presence.normalizedCodename), expiredInvite);
60369
+ this.expiredInvites.set(rendezvousKey(presence2.projectRoot, presence2.normalizedCodename), expiredInvite);
60023
60370
  return expiredInvite;
60024
60371
  }
60025
60372
  removeWaiter(key, waiter) {
@@ -60098,14 +60445,14 @@ function createRandomInviteCodename() {
60098
60445
  function rendezvousKey(projectRoot, normalizedCodename) {
60099
60446
  return `${projectRoot}\x00${normalizedCodename}`;
60100
60447
  }
60101
- function waitingResponse(presence) {
60448
+ function waitingResponse(presence2) {
60102
60449
  return {
60103
60450
  status: "waiting",
60104
- codename: presence.codename,
60105
- projectRoot: presence.projectRoot,
60106
- participantId: presence.participantId,
60107
- joinedAt: presence.joinedAt,
60108
- expiresAt: presence.expiresAt
60451
+ codename: presence2.codename,
60452
+ projectRoot: presence2.projectRoot,
60453
+ participantId: presence2.participantId,
60454
+ joinedAt: presence2.joinedAt,
60455
+ expiresAt: presence2.expiresAt
60109
60456
  };
60110
60457
  }
60111
60458
  function matchedResponse(match, participantId) {
@@ -60150,11 +60497,11 @@ function projectMismatchResponse(input) {
60150
60497
  suggestion: "run_in_invitation_project"
60151
60498
  };
60152
60499
  }
60153
- function notFoundResponse(presence, participantId) {
60500
+ function notFoundResponse(presence2, participantId) {
60154
60501
  return {
60155
60502
  status: "not_found",
60156
- codename: presence.codename,
60157
- projectRoot: presence.projectRoot,
60503
+ codename: presence2.codename,
60504
+ projectRoot: presence2.projectRoot,
60158
60505
  participantId,
60159
60506
  suggestion: "check_codename_or_create"
60160
60507
  };
@@ -61112,10 +61459,8 @@ async function loadOpenScoutOnboardingState(options = {}) {
61112
61459
  const operatorNameSource = explicitUserName ? "user-config" : envOperatorName ? "env" : settingsOperatorName || answeredSettingsOperatorName ? "settings" : "default";
61113
61460
  const contextRoot = settings.discovery.contextRoot ?? null;
61114
61461
  const project = await resolveProjectConfig({ currentDirectory, contextRoot });
61115
- const [broker, catalog] = await Promise.all([
61116
- options.broker ?? brokerServiceStatus().catch(() => null),
61117
- options.catalog ?? loadHarnessCatalogSnapshot().catch(() => null)
61118
- ]);
61462
+ const broker = options.broker ?? await brokerServiceStatus().catch(() => null);
61463
+ const catalog = options.catalog ?? await loadHarnessCatalogSnapshot().catch(() => null);
61119
61464
  const readyRuntimeCount = catalog?.entries.filter((entry) => entry.readinessReport.ready).length ?? 0;
61120
61465
  const hasReadyRuntime = readyRuntimeCount > 0;
61121
61466
  const hasLocalConfig = localConfigExists();
@@ -61182,11 +61527,7 @@ async function ensureOpenScoutOnboardingLocalConfig(options = {}) {
61182
61527
  }, {
61183
61528
  currentDirectory: options.currentDirectory
61184
61529
  });
61185
- return loadOpenScoutOnboardingState({
61186
- currentDirectory: options.currentDirectory,
61187
- broker: options.broker,
61188
- catalog: options.catalog
61189
- });
61530
+ return loadOpenScoutOnboardingState({ currentDirectory: options.currentDirectory });
61190
61531
  }
61191
61532
  async function saveOpenScoutOnboardingIdentity(input) {
61192
61533
  const name2 = input.name.trim();
@@ -61206,11 +61547,7 @@ async function saveOpenScoutOnboardingIdentity(input) {
61206
61547
  }, {
61207
61548
  currentDirectory: input.currentDirectory
61208
61549
  });
61209
- return loadOpenScoutOnboardingState({
61210
- currentDirectory: input.currentDirectory,
61211
- broker: input.broker,
61212
- catalog: input.catalog
61213
- });
61550
+ return loadOpenScoutOnboardingState({ currentDirectory: input.currentDirectory });
61214
61551
  }
61215
61552
  async function saveOpenScoutOnboardingProject(input) {
61216
61553
  const contextRoot = normalizePath2(input.contextRoot);
@@ -61238,11 +61575,7 @@ async function saveOpenScoutOnboardingProject(input) {
61238
61575
  }, {
61239
61576
  currentDirectory: input.currentDirectory ?? contextRoot
61240
61577
  });
61241
- return loadOpenScoutOnboardingState({
61242
- currentDirectory: contextRoot,
61243
- broker: input.broker,
61244
- catalog: input.catalog
61245
- });
61578
+ return loadOpenScoutOnboardingState({ currentDirectory: contextRoot });
61246
61579
  }
61247
61580
  async function triggerMeshDiscovery(broker) {
61248
61581
  if (!broker.reachable || !broker.brokerUrl)
@@ -62513,8 +62846,137 @@ var init_mobile_push = __esm(() => {
62513
62846
 
62514
62847
  // ../runtime/src/agent-run-registry.ts
62515
62848
  var init_agent_run_registry = () => {};
62849
+
62850
+ // ../runtime/src/observed-status-projection.ts
62851
+ var init_observed_status_projection = () => {};
62852
+
62516
62853
  // ../runtime/src/activity-projection.ts
62517
- var init_activity_projection = () => {};
62854
+ var init_activity_projection = __esm(() => {
62855
+ init_observed_status_projection();
62856
+ });
62857
+
62858
+ // ../runtime/src/activity-transitions.ts
62859
+ class ActivityTransitionTracker {
62860
+ transitions = new Map;
62861
+ record(agentId, activity2, observedAt2, now) {
62862
+ const previous = this.transitions.get(agentId);
62863
+ if (previous && previous.activity === activity2) {
62864
+ return previous.transitionAt;
62865
+ }
62866
+ const transitionAt = Number.isFinite(observedAt2) ? Math.min(observedAt2, now) : now;
62867
+ this.transitions.set(agentId, { activity: activity2, transitionAt });
62868
+ return transitionAt;
62869
+ }
62870
+ peek(agentId) {
62871
+ const transition = this.transitions.get(agentId);
62872
+ return transition ? { ...transition } : undefined;
62873
+ }
62874
+ forget(agentId) {
62875
+ this.transitions.delete(agentId);
62876
+ }
62877
+ clear() {
62878
+ this.transitions.clear();
62879
+ }
62880
+ size() {
62881
+ return this.transitions.size;
62882
+ }
62883
+ }
62884
+
62885
+ // ../runtime/src/presence-map.ts
62886
+ class BrokerPresenceMap {
62887
+ beats = new Map;
62888
+ lastDetailChangeAt = new Map;
62889
+ staleAfterMs;
62890
+ goneAfterStaleMs;
62891
+ detailDebounceMs;
62892
+ transitions;
62893
+ constructor(options = {}) {
62894
+ this.staleAfterMs = options.staleAfterMs ?? PRESENCE_STALE_AFTER_MS;
62895
+ this.goneAfterStaleMs = options.goneAfterStaleMs ?? PRESENCE_GONE_AFTER_STALE_MS;
62896
+ this.detailDebounceMs = options.detailDebounceMs ?? DEFAULT_DETAIL_DEBOUNCE_MS;
62897
+ this.transitions = options.transitions ?? new ActivityTransitionTracker;
62898
+ }
62899
+ observe(observation, now) {
62900
+ const agentId = observation.agentId ?? observation.status.agentId ?? observation.status.subjectId;
62901
+ if (!agentId)
62902
+ return;
62903
+ const status = observation.status;
62904
+ if (isTransportInferredStall(status))
62905
+ return;
62906
+ const updatedAt = Math.min(status.updatedAt, now);
62907
+ const staleAt = Math.max(status.staleAt ?? 0, updatedAt + this.staleAfterMs);
62908
+ if (isPresenceGone({ staleAt }, now, { goneAfterStaleMs: this.goneAfterStaleMs })) {
62909
+ this.forget(agentId);
62910
+ return;
62911
+ }
62912
+ const previous = this.beats.get(agentId);
62913
+ const detail = status.detail?.title ?? undefined;
62914
+ const transitionAt = this.transitions.record(agentId, status.activity, status.transitionAt ?? status.updatedAt, now);
62915
+ const activityChanged = previous?.activity !== status.activity;
62916
+ const detailChanged = previous !== undefined && previous.detail !== detail;
62917
+ const debounceElapsed = now - (this.lastDetailChangeAt.get(agentId) ?? 0) >= this.detailDebounceMs;
62918
+ const transitioned = previous === undefined || activityChanged || detailChanged && debounceElapsed;
62919
+ if (activityChanged || detailChanged && debounceElapsed) {
62920
+ this.lastDetailChangeAt.set(agentId, now);
62921
+ }
62922
+ const beat = {
62923
+ agentId,
62924
+ displayName: observation.displayName ?? previous?.displayName,
62925
+ activity: status.activity,
62926
+ phase: status.phase,
62927
+ detail,
62928
+ transitionAt,
62929
+ updatedAt,
62930
+ staleAt,
62931
+ confidence: status.confidence,
62932
+ needRef: observation.needRef,
62933
+ boundConversationId: observation.boundConversationId
62934
+ };
62935
+ this.beats.set(agentId, beat);
62936
+ return { beat, transitioned, previousActivity: previous?.activity };
62937
+ }
62938
+ snapshot(now) {
62939
+ this.prune(now);
62940
+ return { at: now, beats: [...this.beats.values()] };
62941
+ }
62942
+ get(agentId) {
62943
+ return this.beats.get(agentId);
62944
+ }
62945
+ prune(now) {
62946
+ const dropped = [];
62947
+ for (const [agentId, beat] of this.beats) {
62948
+ if (!isPresenceGone(beat, now, { goneAfterStaleMs: this.goneAfterStaleMs }))
62949
+ continue;
62950
+ this.beats.delete(agentId);
62951
+ this.lastDetailChangeAt.delete(agentId);
62952
+ this.transitions.forget(agentId);
62953
+ dropped.push(agentId);
62954
+ }
62955
+ return dropped;
62956
+ }
62957
+ forget(agentId) {
62958
+ this.beats.delete(agentId);
62959
+ this.lastDetailChangeAt.delete(agentId);
62960
+ this.transitions.forget(agentId);
62961
+ }
62962
+ clear() {
62963
+ this.beats.clear();
62964
+ this.lastDetailChangeAt.clear();
62965
+ this.transitions.clear();
62966
+ }
62967
+ size() {
62968
+ return this.beats.size;
62969
+ }
62970
+ }
62971
+ function isTransportInferredStall(status) {
62972
+ if (status.activity !== "stalled")
62973
+ return false;
62974
+ return status.provenance.some((entry) => entry.source === "staleness_inference");
62975
+ }
62976
+ var DEFAULT_DETAIL_DEBOUNCE_MS = 5000;
62977
+ var init_presence_map = __esm(() => {
62978
+ init_src();
62979
+ });
62518
62980
 
62519
62981
  // ../runtime/src/session-attention.ts
62520
62982
  function sessionApprovalAttentionId(sessionId, turnId, blockId, version2) {
@@ -64984,7 +65446,9 @@ var init_src3 = __esm(() => {
64984
65446
  init_mobile_push();
64985
65447
  init_permission_policy2();
64986
65448
  init_agent_run_registry();
65449
+ init_observed_status_projection();
64987
65450
  init_activity_projection();
65451
+ init_presence_map();
64988
65452
  init_session_display_projection();
64989
65453
  init_issue_runner();
64990
65454
  init_issue_runner_service();
@@ -69105,10 +69569,10 @@ function bootstrapLaunchdJob(plistPath, uid) {
69105
69569
  return { ok, detail };
69106
69570
  }
69107
69571
  function chooseLaunchdStartMethod(input) {
69108
- if (input.loaded)
69109
- return "kickstart";
69110
69572
  if (input.scoutdPath)
69111
69573
  return "scoutd";
69574
+ if (input.loaded)
69575
+ return "kickstart";
69112
69576
  return input.plistExists ? "bootstrap" : "unavailable";
69113
69577
  }
69114
69578
  function startLaunchdJob(label, uid, home, options = {}) {
@@ -69180,14 +69644,9 @@ function verifyTree(tree) {
69180
69644
  ownedBy(web, broker2, "web");
69181
69645
  const app = single("app");
69182
69646
  const menu = single("menu");
69183
- for (const controller of tree.layers.pairing) {
69184
- if (menu && controller.ppid !== menu.pid) {
69185
- problems.push({
69186
- layer: "pairing",
69187
- message: `pairing controller pid ${controller.pid} is not owned by ScoutMenu pid ${menu.pid}`
69188
- });
69189
- }
69190
- }
69647
+ const pairing = single("pairing");
69648
+ const pairingOwner = tree.layers.base[0] ?? menu;
69649
+ ownedBy(pairing, pairingOwner, "pairing");
69191
69650
  for (const stray of detachedExpectedProcesses(tree)) {
69192
69651
  problems.push({
69193
69652
  layer: stray.layer,
@@ -69216,8 +69675,8 @@ var SUPERVISED_LAYERS, LAUNCH_SERVICES_LAYERS, SCOUT_LAUNCHD_LABEL = "app.opensc
69216
69675
  pairing: []
69217
69676
  });
69218
69677
  var init_app_lifecycle = __esm(() => {
69219
- SUPERVISED_LAYERS = ["web", "edge", "broker", "probes", "base", "scoutd"];
69220
- LAUNCH_SERVICES_LAYERS = ["pairing", "menu", "app"];
69678
+ SUPERVISED_LAYERS = ["pairing", "web", "edge", "broker", "probes", "base", "scoutd"];
69679
+ LAUNCH_SERVICES_LAYERS = ["menu", "app"];
69221
69680
  });
69222
69681
 
69223
69682
  // ../../apps/desktop/src/cli/commands/app.ts
@@ -69256,8 +69715,8 @@ function renderAppCommandHelp() {
69256
69715
  " start = up",
69257
69716
  "",
69258
69717
  "Ownership:",
69259
- " launchd -> scoutd -> base/probes -> broker/edge -> web",
69260
- " LaunchServices -> Scout -> embedded ScoutMenu -> pairing runtime",
69718
+ " launchd -> scoutd -> base/probes -> pairing/broker/edge -> web",
69719
+ " LaunchServices -> Scout -> embedded ScoutMenu",
69261
69720
  "",
69262
69721
  "Behavior:",
69263
69722
  " Stop walks the tree leaf-first. The LaunchServices apps are signalled",
@@ -70470,7 +70929,7 @@ function renderAliasCommandHelp() {
70470
70929
  "Bare native agent names keep precedence; use alias:<name> for explicit alias routing.",
70471
70930
  "",
70472
70931
  "Examples:",
70473
- " scout alias set review --to scope.main.dev-mac-mini-local",
70932
+ " scout alias set review --to scope.main.arts-mac-mini-local",
70474
70933
  " scout alias set patch --to session:019eff52-9347-7470-ba5c-6bfe99d8dd83",
70475
70934
  " scout alias repoint patch --to session:<new-id> --if-revision 4",
70476
70935
  ' scout ask --to alias:review "take a fresh pass"'
@@ -99489,7 +99948,7 @@ var init_stdio2 = __esm(() => {
99489
99948
  // ../../apps/desktop/src/shared/product.ts
99490
99949
  var SCOUT_APP_VERSION;
99491
99950
  var init_product = __esm(() => {
99492
- SCOUT_APP_VERSION = process.env.SCOUT_APP_VERSION?.trim() || "0.2.84";
99951
+ SCOUT_APP_VERSION = process.env.SCOUT_APP_VERSION?.trim() || "0.2.86";
99493
99952
  });
99494
99953
 
99495
99954
  // ../../apps/desktop/src/core/mcp/stdio-server-lifecycle.ts
@@ -103835,7 +104294,7 @@ async function runInstallCommand(context, args) {
103835
104294
  message: `${verb} OpenScout ${installedAfter} \u2192 ${APP_PATH}${relaunchNote}`
103836
104295
  }, renderInstallResult);
103837
104296
  }
103838
- var GITHUB_OWNER = "oscout", GITHUB_REPO = "scout", APP_NAME = "OpenScout.app", APP_PATH, INFO_PLIST_PATH, APP_BUNDLE_ID = "app.openscout.scout", APP_PROCESS_NAME = "Scout", USER_AGENT = "scout-cli", HELP_FLAGS9;
104297
+ var GITHUB_OWNER = "arach", GITHUB_REPO = "openscout", APP_NAME = "OpenScout.app", APP_PATH, INFO_PLIST_PATH, APP_BUNDLE_ID = "app.openscout.scout", APP_PROCESS_NAME = "Scout", USER_AGENT = "scout-cli", HELP_FLAGS9;
103839
104298
  var init_install = __esm(() => {
103840
104299
  init_errors();
103841
104300
  APP_PATH = `/Applications/${APP_NAME}`;
@@ -112873,63 +113332,65 @@ async function runMeshPing(target2) {
112873
113332
  const brokerUrl = resolveScoutBrokerUrl();
112874
113333
  const context = await loadScoutBrokerContext(brokerUrl);
112875
113334
  const localMeshId = context?.node.meshId ?? null;
112876
- let probeUrl;
112877
- if (target2.startsWith("http://") || target2.startsWith("https://")) {
112878
- probeUrl = target2;
112879
- } else {
112880
- const nodes = context?.snapshot.nodes ?? {};
112881
- const matchedNode = Object.values(nodes).find((n) => n.id === target2 || n.name === target2 || n.hostName === target2);
112882
- if (matchedNode?.brokerUrl) {
112883
- probeUrl = matchedNode.brokerUrl;
112884
- } else {
112885
- probeUrl = `http://${target2}:43110`;
112886
- }
112887
- }
113335
+ const probeUrls = resolveMeshPingUrls(target2, context?.snapshot.nodes ?? {});
112888
113336
  const start = performance.now();
112889
- try {
112890
- const controller = new AbortController;
112891
- const timeout = setTimeout(() => controller.abort(), 3000);
112892
- const response = await meshPeerFetch(probeUrl, "/v1/node", {
112893
- signal: controller.signal,
112894
- headers: { accept: "application/json" }
112895
- });
112896
- clearTimeout(timeout);
112897
- const latencyMs = Math.round(performance.now() - start);
112898
- if (!response.ok) {
113337
+ let lastError = null;
113338
+ let lastUrl = probeUrls[0] ?? `http://${target2}:43110`;
113339
+ for (const probeUrl of probeUrls) {
113340
+ lastUrl = probeUrl;
113341
+ try {
113342
+ const controller = new AbortController;
113343
+ const timeout = setTimeout(() => controller.abort(), 3000);
113344
+ const response = await meshPeerFetch(probeUrl, "/v1/node", {
113345
+ signal: controller.signal,
113346
+ headers: { accept: "application/json" }
113347
+ });
113348
+ clearTimeout(timeout);
113349
+ const latencyMs = Math.round(performance.now() - start);
113350
+ if (!response.ok) {
113351
+ lastError = `HTTP ${response.status}`;
113352
+ continue;
113353
+ }
113354
+ const node = await response.json();
112899
113355
  return {
112900
113356
  target: target2,
112901
113357
  url: probeUrl,
112902
- reachable: false,
113358
+ reachable: true,
112903
113359
  latencyMs,
112904
- node: null,
112905
- meshIdMatch: false,
113360
+ node,
113361
+ meshIdMatch: localMeshId !== null && node.meshId === localMeshId,
112906
113362
  localMeshId,
112907
- error: `HTTP ${response.status}`
113363
+ error: null
112908
113364
  };
113365
+ } catch (error48) {
113366
+ lastError = error48 instanceof Error ? error48.message : String(error48);
112909
113367
  }
112910
- const node = await response.json();
112911
- return {
112912
- target: target2,
112913
- url: probeUrl,
112914
- reachable: true,
112915
- latencyMs,
112916
- node,
112917
- meshIdMatch: localMeshId !== null && node.meshId === localMeshId,
112918
- localMeshId,
112919
- error: null
112920
- };
112921
- } catch (error48) {
112922
- return {
112923
- target: target2,
112924
- url: probeUrl,
112925
- reachable: false,
112926
- latencyMs: Math.round(performance.now() - start),
112927
- node: null,
112928
- meshIdMatch: false,
112929
- localMeshId,
112930
- error: error48 instanceof Error ? error48.message : String(error48)
112931
- };
112932
113368
  }
113369
+ return {
113370
+ target: target2,
113371
+ url: lastUrl,
113372
+ reachable: false,
113373
+ latencyMs: Math.round(performance.now() - start),
113374
+ node: null,
113375
+ meshIdMatch: false,
113376
+ localMeshId,
113377
+ error: lastError
113378
+ };
113379
+ }
113380
+ function resolveMeshPingUrls(target2, nodes) {
113381
+ if (target2.startsWith("http://") || target2.startsWith("https://")) {
113382
+ return [target2];
113383
+ }
113384
+ const matchedNode = Object.values(nodes).find((n) => n.id === target2 || n.name === target2 || n.hostName === target2);
113385
+ if (matchedNode) {
113386
+ const urls = httpMeshUrlsForNode(matchedNode);
113387
+ if (urls.length > 0)
113388
+ return urls;
113389
+ }
113390
+ return orderMeshDialUrls([
113391
+ `https://${target2}:43110`,
113392
+ `http://${target2}:43110`
113393
+ ]);
112933
113394
  }
112934
113395
  async function loadMeshNodes() {
112935
113396
  const brokerUrl = resolveScoutBrokerUrl();
@@ -112942,6 +113403,7 @@ async function loadMeshNodes() {
112942
113403
  }
112943
113404
  var init_service7 = __esm(() => {
112944
113405
  init_src3();
113406
+ init_mesh_dial_order();
112945
113407
  init_system_probes();
112946
113408
  init_service3();
112947
113409
  init_trust_service();
@@ -125258,7 +125720,7 @@ function findLocalNetworkAddress() {
125258
125720
  if (entry.internal || entry.family !== "IPv4") {
125259
125721
  continue;
125260
125722
  }
125261
- if (!isPrivateIPv42(entry.address) || isLinkLocalIPv42(entry.address) || isTailscaleIPv42(entry.address)) {
125723
+ if (!isPrivateIPv42(entry.address) || isLinkLocalIPv42(entry.address) || isTailscaleIPv43(entry.address)) {
125262
125724
  continue;
125263
125725
  }
125264
125726
  candidates.push({ name: name2, address: entry.address });
@@ -125284,7 +125746,7 @@ function localInterfaceScore(name2) {
125284
125746
  return 1;
125285
125747
  }
125286
125748
  function isPrivateIPv42(address) {
125287
- const octets = parseIPv42(address);
125749
+ const octets = parseIPv43(address);
125288
125750
  if (!octets) {
125289
125751
  return false;
125290
125752
  }
@@ -125292,14 +125754,14 @@ function isPrivateIPv42(address) {
125292
125754
  return first === 10 || first === 172 && second >= 16 && second <= 31 || first === 192 && second === 168;
125293
125755
  }
125294
125756
  function isLinkLocalIPv42(address) {
125295
- const octets = parseIPv42(address);
125757
+ const octets = parseIPv43(address);
125296
125758
  return Boolean(octets && octets[0] === 169 && octets[1] === 254);
125297
125759
  }
125298
- function isTailscaleIPv42(address) {
125299
- const octets = parseIPv42(address);
125760
+ function isTailscaleIPv43(address) {
125761
+ const octets = parseIPv43(address);
125300
125762
  return Boolean(octets && octets[0] === 100 && octets[1] >= 64 && octets[1] <= 127);
125301
125763
  }
125302
- function parseIPv42(address) {
125764
+ function parseIPv43(address) {
125303
125765
  const octets = address.split(".");
125304
125766
  if (octets.length !== 4) {
125305
125767
  return null;