@openscout/scout 0.2.86 → 0.2.90

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 (462) hide show
  1. package/README.md +10 -5
  2. package/bin/scoutd +0 -0
  3. package/dist/build-manifest.json +4 -4
  4. package/dist/client/assets/ActivityScreen-BUeb4ERK.js +1 -0
  5. package/dist/client/assets/{AddProjectForm-BNRpRPod.js → AddProjectForm-DtTfn4Zk.js} +1 -1
  6. package/dist/client/assets/AgentAvatar-CneOa70z.js +1 -0
  7. package/dist/client/assets/AgentConfigurationScreen-CkZ7EjZh.js +1 -0
  8. package/dist/client/assets/AgentDefinitionsWorkspace-0Y3kqMtv.js +1 -0
  9. package/dist/client/assets/{AgentDetailCard-FelCxQrT.js → AgentDetailCard-Dtc02KUO.js} +1 -1
  10. package/dist/client/assets/AgentFloorView-B5raPB_U.js +1 -0
  11. package/dist/client/assets/AgentInfoScreen-DFG4ElZD.js +1 -0
  12. package/dist/client/assets/{AgentLaneCard-CRDG74C1.js → AgentLaneCard-BRAkw8YJ.js} +1 -1
  13. package/dist/client/assets/{AgentLaneChrome-CWFqUdch.js → AgentLaneChrome-T8QE5742.js} +1 -1
  14. package/dist/client/assets/AgentLaneDetailSheet-C8RYotnv.js +4 -0
  15. package/dist/client/assets/{AgentLaneSummaryResize-yTM4GQAJ.js → AgentLaneSummaryResize-FyYweLo_.js} +1 -1
  16. package/dist/client/assets/AgentLanesEmbedScreen-Br7cmZVO.js +1 -0
  17. package/dist/client/assets/{AgentLanesPreflight-DJeDRTAN.js → AgentLanesPreflight-Cil3dNwu.js} +1 -1
  18. package/dist/client/assets/AgentLanesView-DPfO8MOo.js +2 -0
  19. package/dist/client/assets/{AgentLiveActions-Bn3zeZBN.js → AgentLiveActions-DwScaVRF.js} +1 -1
  20. package/dist/client/assets/AgentSessions-DKoWA0Lm.js +6 -0
  21. package/dist/client/assets/AgentsConsole-DoBIWGoq.js +1 -0
  22. package/dist/client/assets/AgentsScreen-JuUiSuwY.js +1 -0
  23. package/dist/client/assets/AgentsSubnav-BV0WAgzf.js +1 -0
  24. package/dist/client/assets/{AtopView-DymBCiXv.js → AtopView-ycxMrRwp.js} +1 -1
  25. package/dist/client/assets/BackToPicker-D6WgIDb-.js +1 -0
  26. package/dist/client/assets/BriefingDetailScreen-Zw-taW1s.js +6 -0
  27. package/dist/client/assets/{BriefingsScreen-CLvSOJjy.js → BriefingsScreen-BerYOoWS.js} +1 -1
  28. package/dist/client/assets/{BrokerMetadataPanel-DFAH-NO6.js → BrokerMetadataPanel-Cu93j-Ga.js} +1 -1
  29. package/dist/client/assets/BrokerScreen-CeN90URH.js +5 -0
  30. package/dist/client/assets/ChatCollapsedStrip-DdKyMSEM.js +1 -0
  31. package/dist/client/assets/{CodeDiffPane-C9HT1dCT.js → CodeDiffPane-BjCOBLze.js} +1 -1
  32. package/dist/client/assets/{CodeProjectPicker-5Y3GvXkM.js → CodeProjectPicker-NSGdCaK0.js} +1 -1
  33. package/dist/client/assets/{CodeScreen-DpN9kQvm.js → CodeScreen-CA9Sq6Dx.js} +1 -1
  34. package/dist/client/assets/ContextMenu-DnFcmfMR.js +1 -0
  35. package/dist/client/assets/ConversationComposer-CjRXFkvY.js +1 -0
  36. package/dist/client/assets/ConversationFeedRows-CgRTIpAv.js +1 -0
  37. package/dist/client/assets/ConversationHeader-CRmdtuL7.js +1 -0
  38. package/dist/client/assets/ConversationPanels-DCkcLIHk.js +2 -0
  39. package/dist/client/assets/ConversationScreen-Br0QQ3xo.js +1 -0
  40. package/dist/client/assets/ConversationScreen-yIKEsm-8.css +1 -0
  41. package/dist/client/assets/ConversationStatus-BJ1CMbAv.js +1 -0
  42. package/dist/client/assets/{DataTable-oJP339bX.js → DataTable-Dzqiaha4.js} +1 -1
  43. package/dist/client/assets/{DispatchAftermath-CH02HAVw.js → DispatchAftermath-B0WMg_z3.js} +1 -1
  44. package/dist/client/assets/DocumentFocusViewer-CZVVIAD5.js +1 -0
  45. package/dist/client/assets/{EmbeddableSurfacesLab-84b9I3fy.js → EmbeddableSurfacesLab-C3a7hJWO.js} +1 -1
  46. package/dist/client/assets/{EmptyState-BnDda92b.js → EmptyState-CYNJZMrZ.js} +1 -1
  47. package/dist/client/assets/{FileViewerPane-Dg7_88pv.js → FileViewerPane-Fwt8_KmD.js} +1 -1
  48. package/dist/client/assets/FleetSearch-Dsi_l2KW.js +1 -0
  49. package/dist/client/assets/FleetSearch-EXOe8ulE.css +1 -0
  50. package/dist/client/assets/FlightObserveScreen-g_tiGmvz.js +1 -0
  51. package/dist/client/assets/{FollowScreen-DcFBqr6l.js → FollowScreen-Bb_rcrzi.js} +1 -1
  52. package/dist/client/assets/{HarnessMark-DGZ6o6Ct.js → HarnessMark-DrE57dUq.js} +1 -1
  53. package/dist/client/assets/HarnessesScreen-CAsCJ_tG.js +1 -0
  54. package/dist/client/assets/{HerdrSession-DV2hD6Yh.js → HerdrSession-1eVu9Owj.js} +1 -1
  55. package/dist/client/assets/HomeHero-DEl-WBsT.css +1 -0
  56. package/dist/client/assets/HomeHero-W445QrG1.js +1 -0
  57. package/dist/client/assets/{KnowledgeSearchInspector-DNQjeWZO.js → KnowledgeSearchInspector-CbPVg3fr.js} +1 -1
  58. package/dist/client/assets/KnowledgeSearchScreen-C1lN1xJk.js +1 -0
  59. package/dist/client/assets/{LaneToolHoverCard-197xYmRp.js → LaneToolHoverCard-BkBcDYm-.js} +1 -1
  60. package/dist/client/assets/LaneTraceDetailSheet-CzTd44rf.js +1 -0
  61. package/dist/client/assets/{LaneTraceEventFocus-C9cmqxnK.js → LaneTraceEventFocus-BmMmPTyJ.js} +1 -1
  62. package/dist/client/assets/{MeshCanvas-C3_2p9B6.js → MeshCanvas-DwkjsiJ5.js} +2 -2
  63. package/dist/client/assets/{MeshCanvasMinimap-ZTjYWXTZ.js → MeshCanvasMinimap-vmCpU1sD.js} +1 -1
  64. package/dist/client/assets/MeshScreen-CkMepUpT.js +1 -0
  65. package/dist/client/assets/{MeshTopologyView-CBjHbAZw.js → MeshTopologyView-BD2xLE2C.js} +2 -2
  66. package/dist/client/assets/MessageComposerSuggestions-qbalTne_.js +1 -0
  67. package/dist/client/assets/MessagesScreen-C8UynyLC.js +1 -0
  68. package/dist/client/assets/{MissionContextRail-DXkrbcnZ.js → MissionContextRail-D5MEP2f4.js} +1 -1
  69. package/dist/client/assets/MissionControlView-K_I7eftL.js +1 -0
  70. package/dist/client/assets/MissionFocusOverlay-CWKLdUKG.js +1 -0
  71. package/dist/client/assets/MissionLeftAgentRow-ByGrNAcs.js +1 -0
  72. package/dist/client/assets/MissionLogPane-ZwHJ137T.js +1 -0
  73. package/dist/client/assets/{NewAgentModal-C18Ajovd.js → NewAgentModal-Do9aVvan.js} +1 -1
  74. package/dist/client/assets/NewChatComposer-DKlNX1UA.js +19 -0
  75. package/dist/client/assets/{NewChatOrigin-DpHS2Wmt.js → NewChatOrigin-DXPvX-hh.js} +1 -1
  76. package/dist/client/assets/ObserveEmbedScreen-Dghsq2on.js +2 -0
  77. package/dist/client/assets/ObserveTextFlow-DWNlmTVm.js +2 -0
  78. package/dist/client/assets/ObservedTopologyPanel-BlmGoxCE.js +2 -0
  79. package/dist/client/assets/OpenScoutAppShell-DDqQi-oe.js +87 -0
  80. package/dist/client/assets/OpsAgentsView-Bn_fGBdo.js +1 -0
  81. package/dist/client/assets/OpsScreen-DHnT-Q9R.js +1 -0
  82. package/dist/client/assets/OpsSubnav-CJRD7MjM.js +1 -0
  83. package/dist/client/assets/PlanView-B6gKo543.js +1 -0
  84. package/dist/client/assets/ProjectAgentProfile-Be1VOkI4.js +1 -0
  85. package/dist/client/assets/{ProjectAgentProfileBar-IDEpKZvI.js → ProjectAgentProfileBar-C5QWwZCn.js} +1 -1
  86. package/dist/client/assets/ProjectAgentProfileHero-DC7Dd8VL.js +1 -0
  87. package/dist/client/assets/ProjectsInbox-DCLrDmj1.js +2 -0
  88. package/dist/client/assets/ProjectsRail-C4hiXYSb.js +1 -0
  89. package/dist/client/assets/ProjectsScreen-jruZRjgD.js +1 -0
  90. package/dist/client/assets/ProjectsThreadAside-DYmL2dCY.js +1 -0
  91. package/dist/client/assets/Provider-p-xuaAoE.js +1 -0
  92. package/dist/client/assets/RailRow-Cf9LOiEj.css +1 -0
  93. package/dist/client/assets/RailRow-bRkkXIpR.js +1 -0
  94. package/dist/client/assets/RawSessionsTable-B7WKmXrk.js +1 -0
  95. package/dist/client/assets/RealtimeVoiceScreen-BzP3BQq9.js +1 -0
  96. package/dist/client/assets/{RepoDiffEmbedScreen-C97Euf4s.js → RepoDiffEmbedScreen-xjzjcJ_c.js} +1 -1
  97. package/dist/client/assets/{RepoDiffPageScreen-DUKLzkrW.js → RepoDiffPageScreen-DRzIY-dk.js} +1 -1
  98. package/dist/client/assets/RepoDiffViewer-CNDp01KM.js +7 -0
  99. package/dist/client/assets/RepoDiffViewerLazy-b6vjYxez.js +2 -0
  100. package/dist/client/assets/{ReposScreen-BR1LqTf1.js → ReposScreen-CpaLC_NU.js} +6 -6
  101. package/dist/client/assets/ScoutDeckSurface-DkpZ-0DH.js +1 -0
  102. package/dist/client/assets/{ScoutSurface-BMKW7hSu.js → ScoutSurface-BENBUt5-.js} +1 -1
  103. package/dist/client/assets/ScoutbotBroadcastChip-CGZyxS5H.js +2 -0
  104. package/dist/client/assets/{agent-autocomplete-C7xwIcwd.css → ScoutbotBroadcastChip-CxtYZWPZ.css} +1 -1
  105. package/dist/client/assets/{ScoutbotFxLab-0O2iDRrF.js → ScoutbotFxLab-Bk2ZsfPp.js} +1 -1
  106. package/dist/client/assets/ScoutbotRealtimeVoiceCall-n63LdBZs.js +1 -0
  107. package/dist/client/assets/{SecondaryNav-cYTw2p39.js → SecondaryNav-B4IsujYh.js} +1 -1
  108. package/dist/client/assets/{SessionEmbedScreen-mNjT0R6j.js → SessionEmbedScreen-CPfH-jqN.js} +1 -1
  109. package/dist/client/assets/{SessionObserve-zAlFbwFn.js → SessionObserve-B-SkP3tu.js} +1 -1
  110. package/dist/client/assets/{SessionObserveEvidence-BVawzqoE.js → SessionObserveEvidence-CF5jnH3-.js} +1 -1
  111. package/dist/client/assets/SessionRefScreen-C-4jjmVG.js +1 -0
  112. package/dist/client/assets/SessionsScreen-HAjFvmIq.js +1 -0
  113. package/dist/client/assets/SettingsDrawer-DATxwZrn.js +3 -0
  114. package/dist/client/assets/SettingsDrawer-UX7pFJU_.css +1 -0
  115. package/dist/client/assets/SettingsScreen-Bu53X7J_.js +1 -0
  116. package/dist/client/assets/{ShikiPane-DyEJdcvb.js → ShikiPane-DH8yYDks.js} +1 -1
  117. package/dist/client/assets/{SlidePanel-Dg8_styW.js → SlidePanel-RFXJpfUa.js} +1 -1
  118. package/dist/client/assets/{SpriteAvatar-DMrSssNZ.js → SpriteAvatar-CEYdCzem.js} +1 -1
  119. package/dist/client/assets/{StatusPill-NFFnphtx.js → StatusPill-9uy70ttd.js} +1 -1
  120. package/dist/client/assets/{TailView-BfObcZu3.js → TailView-6bIrgdxN.js} +2 -2
  121. package/dist/client/assets/Terminal-BI6km7H4.js +1 -0
  122. package/dist/client/assets/TerminalEmbedScreen-D4JOWwtm.js +1 -0
  123. package/dist/client/assets/{TextDocumentSurface-C7fGlzY8.js → TextDocumentSurface-BcP9vvji.js} +1 -1
  124. package/dist/client/assets/{TmuxPeek-BSeKIjnX.js → TmuxPeek-IaWqCgyJ.js} +1 -1
  125. package/dist/client/assets/{VoicePermissionsPanel-BkIGTzgw.js → VoicePermissionsPanel-C80iZxgy.js} +1 -1
  126. package/dist/client/assets/{WorkDetailScreen-Cwe-KWK4.js → WorkDetailScreen-CweZ6fEd.js} +3 -3
  127. package/dist/client/assets/WorkFilesViewer-Dy_-06iI.js +1 -0
  128. package/dist/client/assets/{activity-D4W2XZY2.js → activity-DS0u0Itf.js} +1 -1
  129. package/dist/client/assets/{addon-fit-Celjj2yn.js → addon-fit-CN888B3D.js} +1 -1
  130. package/dist/client/assets/{addon-webgl-Cu4tJ21-.js → addon-webgl-CoAnanQS.js} +1 -1
  131. package/dist/client/assets/{agent-essentials-CngjUhQj.js → agent-essentials-CuK4G_zS.js} +1 -1
  132. package/dist/client/assets/agent-identity-BxCsXnDp.js +1 -0
  133. package/dist/client/assets/{agent-lane-card-model-CSugZCdy.js → agent-lane-card-model-q4cwzLX4.js} +1 -1
  134. package/dist/client/assets/{agent-lane-detail-D5EIlX7_.js → agent-lane-detail-BNNm6FNu.js} +1 -1
  135. package/dist/client/assets/{agent-lane-preview-BhplDYGf.js → agent-lane-preview-C33Dwpn7.js} +1 -1
  136. package/dist/client/assets/{agent-lanes-DlqcEf0l.css → agent-lanes-BDNktFBZ.css} +1 -1
  137. package/dist/client/assets/{agent-lanes-model-BKOs_32K.js → agent-lanes-model-VYQ5a68i.js} +2 -2
  138. package/dist/client/assets/{api-BHHEUSS3.js → api-BkjHJfgJ.js} +1 -1
  139. package/dist/client/assets/api-h5zurxmi.js +1 -0
  140. package/dist/client/assets/{arc.es-DNT50Y-_.js → arc.es-BET9ev6q.js} +1 -1
  141. package/dist/client/assets/arrow-down-DxxPnPwh.js +1 -0
  142. package/dist/client/assets/{arrow-left-i-h6JAgs.js → arrow-left-CXDkJuCg.js} +1 -1
  143. package/dist/client/assets/{arrow-up-right-RBC6k8nn.js → arrow-up-right-Bj8RjSqW.js} +1 -1
  144. package/dist/client/assets/{bot-r2IuAuJd.js → bot-BSGSicKC.js} +1 -1
  145. package/dist/client/assets/broker-display-pp33bLsu.js +2 -0
  146. package/dist/client/assets/{cache-BO2Bd_LV.js → cache-Dr0why2k.js} +1 -1
  147. package/dist/client/assets/{check-Bfs7hMb1.js → check-BfA0T8UD.js} +1 -1
  148. package/dist/client/assets/{chevron-down-Da5tV19_.js → chevron-down-BVg09D6U.js} +1 -1
  149. package/dist/client/assets/{chevron-right-BMqtBds_.js → chevron-right-CaEwYkxE.js} +1 -1
  150. package/dist/client/assets/{chunk-HRAB3GC3-BUVYXXAp.js → chunk-HRAB3GC3-HhKwnZCi.js} +1 -1
  151. package/dist/client/assets/chunk-JTPDIGGW-DX2eTIQ_.js +46 -0
  152. package/dist/client/assets/chunk-T65CQEWV-D-bOfuCH.js +1 -0
  153. package/dist/client/assets/chunk-YOZR3KYS-oS9dlQCI.js +2 -0
  154. package/dist/client/assets/{clock-DaKLp6Xd.js → clock-C3TUL7D7.js} +1 -1
  155. package/dist/client/assets/{code-xml-ByQsfOI_.js → code-xml-Dbvjk9Kw.js} +1 -1
  156. package/dist/client/assets/collapsed-strip-Dz-of2SM.css +1 -0
  157. package/dist/client/assets/content-BQuEedeL.js +1 -0
  158. package/dist/client/assets/content-BUae-L_N.js +1 -0
  159. package/dist/client/assets/content-BfG98J1k.js +1 -0
  160. package/dist/client/assets/content-BkVTfkAC.js +1 -0
  161. package/dist/client/assets/content-BsNMos_d.js +1 -0
  162. package/dist/client/assets/content-C2TZOKSE.js +1 -0
  163. package/dist/client/assets/content-CCn98eSk.js +1 -0
  164. package/dist/client/assets/content-CJuH5cDP.js +1 -0
  165. package/dist/client/assets/content-CYnPp9yo.js +1 -0
  166. package/dist/client/assets/content-CcrUhm4P.js +1 -0
  167. package/dist/client/assets/content-CiOMtgQc.js +1 -0
  168. package/dist/client/assets/content-CxuVONeQ.js +1 -0
  169. package/dist/client/assets/content-Dmq9n1_L.js +1 -0
  170. package/dist/client/assets/content-DskHP2NI.js +1 -0
  171. package/dist/client/assets/content-DvvzL2HK.js +1 -0
  172. package/dist/client/assets/content-snCAUbwv.js +1 -0
  173. package/dist/client/assets/{conversation-icons-C4amK8Sa.js → conversation-icons-DmC_Ak3z.js} +1 -1
  174. package/dist/client/assets/conversation-model-CHwHZNw-.js +1 -0
  175. package/dist/client/assets/conversation-motion-features-DPiGTO21.js +1 -0
  176. package/dist/client/assets/{copy-De4s38o2.js → copy-C79v_7D-.js} +1 -1
  177. package/dist/client/assets/{createLucideIcon-DLlxGjKt.js → createLucideIcon-DCq_3fQn.js} +1 -1
  178. package/dist/client/assets/ctx-panel-B4s49N9e.css +1 -0
  179. package/dist/client/assets/discover-IEnbrH8_.js +2 -0
  180. package/dist/client/assets/embed-entry-XUPb-AzL.js +2 -0
  181. package/dist/client/assets/{external-link-BGHC_naA.js → external-link-Dd8xaveL.js} +1 -1
  182. package/dist/client/assets/{eye-BeCSqJn1.js → eye-DkU59kfl.js} +1 -1
  183. package/dist/client/assets/{file-text-BVhkMWyC.js → file-text-BITQqGtF.js} +1 -1
  184. package/dist/client/assets/gestures-B5rLNRpi.js +1 -0
  185. package/dist/client/assets/home-moving-signal-Bs635mVw.js +1 -0
  186. package/dist/client/assets/home-moving-signal-CAa0V91u.css +1 -0
  187. package/dist/client/assets/home-now-card-VxlLjg1A.js +1 -0
  188. package/dist/client/assets/{home-now-card-nano-Djhy6ax0.js → home-now-card-nano-C06GMiwD.js} +1 -1
  189. package/dist/client/assets/hooks-BWiLxTw1.js +2 -0
  190. package/dist/client/assets/index-9as_JTUs.css +1 -0
  191. package/dist/client/assets/index-BTj2MguM.js +1 -0
  192. package/dist/client/assets/index-BZovGpDk.js +10 -0
  193. package/dist/client/assets/index-CvF09yvf.css +1 -0
  194. package/dist/client/assets/index-DiiEQwdc.js +1 -0
  195. package/dist/client/assets/index-vbaJ8sin.js +1 -0
  196. package/dist/client/assets/inspector-panel-C96HcyK5.js +2 -0
  197. package/dist/client/assets/{keyboard-nav-7iEtvu9P.js → keyboard-nav-CHo_xmjw.js} +1 -1
  198. package/dist/client/assets/{lane-observe-vfyACHi0.js → lane-observe-BA3g9aVd.js} +1 -1
  199. package/dist/client/assets/{lane-roster-store-pHT3TAVs.js → lane-roster-store-B6ybJlHJ.js} +1 -1
  200. package/dist/client/assets/left-Bk3XnxPD.css +1 -0
  201. package/dist/client/assets/left-BuJ0wJW1.js +2 -0
  202. package/dist/client/assets/left-C6Zj3cR4.js +1 -0
  203. package/dist/client/assets/left-CCoobxPS.css +1 -0
  204. package/dist/client/assets/left-COMAiMfB.js +2 -0
  205. package/dist/client/assets/left-Ce4WKYPK.js +1 -0
  206. package/dist/client/assets/left-DMJkmJOF.js +1 -0
  207. package/dist/client/assets/left-DrCbY6ja.js +1 -0
  208. package/dist/client/assets/left-agents-BuSyVNGE.js +1 -0
  209. package/dist/client/assets/left-default-DRHywOKX.js +1 -0
  210. package/dist/client/assets/left-l92tw5Kc.js +1 -0
  211. package/dist/client/assets/left-lanes-4-aUyyrV.js +1 -0
  212. package/dist/client/assets/left-mission-e849d_Td.js +1 -0
  213. package/dist/client/assets/left-plan-MchYwAB_.js +2 -0
  214. package/dist/client/assets/library-DygjpA6u.js +1 -0
  215. package/dist/client/assets/{loader-circle-DoT8gpw6.js → loader-circle-B-l2Wj3-.js} +1 -1
  216. package/dist/client/assets/{local-agents-BMadXuP1.js → local-agents-Wof5knTJ.js} +1 -1
  217. package/dist/client/assets/{mentions-Cd6XticV.js → mentions-BjXfeF7t.js} +1 -1
  218. package/dist/client/assets/{mesh-ops-C0zCLTR8.js → mesh-ops-C1gq8zKf.js} +1 -1
  219. package/dist/client/assets/{mesh-view-store-Cpqil_2D.js → mesh-view-store-B56D3f77.js} +1 -1
  220. package/dist/client/assets/{message-circle-44KSmbvQ.js → message-circle-BwVx5X0q.js} +1 -1
  221. package/dist/client/assets/{message-markup-DAnnGpWr.js → message-markup-DlVX-iuc.js} +1 -1
  222. package/dist/client/assets/{message-square-DlY4EneU.js → message-square-BnkG6tae.js} +1 -1
  223. package/dist/client/assets/mission-control-m3BTDQ9l.css +1 -0
  224. package/dist/client/assets/{mission-control-store-DtjtRs9Z.js → mission-control-store-CMgIVjLJ.js} +1 -1
  225. package/dist/client/assets/model-Co0zkMIc.js +1 -0
  226. package/dist/client/assets/{observe-DL5_8-Zj.js → observe-DVHAcIrv.js} +1 -1
  227. package/dist/client/assets/{operator-attention-BqoWAlhp.js → operator-attention-BwSPeheT.js} +1 -1
  228. package/dist/client/assets/{page-status-CW8co39E.js → page-status-Bg2hd27j.js} +1 -1
  229. package/dist/client/assets/paperclip-DblaLD_N.js +1 -0
  230. package/dist/client/assets/plan-view-D56fneVF.css +1 -0
  231. package/dist/client/assets/{plus-64n9qucr.js → plus-BAI0t5g9.js} +1 -1
  232. package/dist/client/assets/profile-3Q4sUtvJ.js +1 -0
  233. package/dist/client/assets/projects-inbox-Da2hYEn6.js +1 -0
  234. package/dist/client/assets/{radio-BjpQTKT0.js → radio-BGtkyCG9.js} +1 -1
  235. package/dist/client/assets/{refresh-cw-IgN2fZLM.js → refresh-cw-DtF8xPqX.js} +1 -1
  236. package/dist/client/assets/resolve-panes-D4tlKNCT.js +1 -0
  237. package/dist/client/assets/resolve-sidebar-context-B27lj3Ci.js +1 -0
  238. package/dist/client/assets/right-B8qg3JdB.js +1 -0
  239. package/dist/client/assets/{right-B96CBzrV.js → right-BU_W1kSH.js} +1 -1
  240. package/dist/client/assets/right-BlR7h0US.js +1 -0
  241. package/dist/client/assets/right-BwgwTGGd.js +1 -0
  242. package/dist/client/assets/right-ByptvkVX.js +1 -0
  243. package/dist/client/assets/right-CUP-NIDG.js +1 -0
  244. package/dist/client/assets/right-Ch_jrNe2.js +1 -0
  245. package/dist/client/assets/right-Dd2DscRz.js +1 -0
  246. package/dist/client/assets/right-DmVHd8Xj.js +1 -0
  247. package/dist/client/assets/{right-DqiVyo8v.js → right-c4PAdFYZ.js} +1 -1
  248. package/dist/client/assets/{rocket-DnmN_YOD.js → rocket-BWh18pt_.js} +1 -1
  249. package/dist/client/assets/router-63XV_E7f.js +1 -0
  250. package/dist/client/assets/{text-BR9Bap0E.js → runtime-picker-BXKJbLot.js} +1 -1
  251. package/dist/client/assets/runtime-picker-vhm0gtLs.css +1 -0
  252. package/dist/client/assets/{scope-views-Z8aoAmtU.js → scope-views-Dm2_-NPi.js} +1 -1
  253. package/dist/client/assets/scout-voice-D8Q5sZOL.js +1 -0
  254. package/dist/client/assets/{scoutbot-D4vuKzOL.js → scoutbot-BTIErYHo.js} +2 -2
  255. package/dist/client/assets/{scroll-text-DRidbcse.js → scroll-text-DZb3mmYo.js} +1 -1
  256. package/dist/client/assets/{search-BbgsEMXa.js → search-1QMVOxF3.js} +1 -1
  257. package/dist/client/assets/secondaryNavConfig-c0cz3MkJ.js +1 -0
  258. package/dist/client/assets/{selection-bridge-CpzFGx3-.js → selection-bridge-O9C4kGfF.js} +1 -1
  259. package/dist/client/assets/{send-horizontal-BXo2uz3Z.js → send-horizontal-DbyEkGql.js} +1 -1
  260. package/dist/client/assets/{server-Dt3tpiBj.js → server-Bncn9S7r.js} +1 -1
  261. package/dist/client/assets/{session-catalog-CUQ8LUJY.js → session-catalog-DC6BlBBC.js} +1 -1
  262. package/dist/client/assets/{session-table-B4JOKevn.js → session-table-BUPq9Viy.js} +1 -1
  263. package/dist/client/assets/{sliders-horizontal-7V8B3xsf.js → sliders-horizontal-CMe8Bay1.js} +1 -1
  264. package/dist/client/assets/{sparkles-ytTwpCbZ.js → sparkles-_7cTZsIH.js} +1 -1
  265. package/dist/client/assets/{sse-CSozY6mp.js → sse-Bb0EOcU9.js} +1 -1
  266. package/dist/client/assets/system-surfaces-redesign-B7GQhfpw.css +1 -0
  267. package/dist/client/assets/{tail-display-DcliDVkW.js → tail-display-BRcJltQa.js} +1 -1
  268. package/dist/client/assets/{tail-events-CrN-Rmxj.js → tail-events-C12pfUax.js} +1 -1
  269. package/dist/client/assets/{terminal-relay-pSm7_An6.js → terminal-relay-BgfVJXIL.js} +1 -1
  270. package/dist/client/assets/{terminal-sessions-D4dHTRkt.js → terminal-sessions-AmSgHklm.js} +1 -1
  271. package/dist/client/assets/{terminal-takeover-CtA3wcXh.js → terminal-takeover--05EYhJm.js} +1 -1
  272. package/dist/client/assets/{terminal-BiNIXhna.js → terminal-xGf_F3y7.js} +1 -1
  273. package/dist/client/assets/text-DsBWV_4k.js +1 -0
  274. package/dist/client/assets/{use-conversation-list-C0bEXFeH.js → use-conversation-list-DWX02INv.js} +1 -1
  275. package/dist/client/assets/{use-fleet-active-asks-CK4aw-3G.js → use-fleet-active-asks-Cnwa4hTK.js} +1 -1
  276. package/dist/client/assets/{use-mesh-ops-items-QixBijmT.js → use-mesh-ops-items-BRFm37oY.js} +1 -1
  277. package/dist/client/assets/use-reduced-motion-C8cWvIZ3.js +1 -0
  278. package/dist/client/assets/use-scout-dev-flags-FkMreOOb.js +1 -0
  279. package/dist/client/assets/{useAgentHoverCard-6N8b7qsU.js → useAgentHoverCard-DvPZSJK3.js} +1 -1
  280. package/dist/client/assets/useContentSecondaryNav-CNlrhvvx.js +1 -0
  281. package/dist/client/assets/{usePierreRuntime-Bq6mXrgd.js → usePierreRuntime-C8WJ0X3F.js} +1 -1
  282. package/dist/client/assets/{wrench-CQvdf7KT.js → wrench-_tHBGTop.js} +1 -1
  283. package/dist/client/assets/{x-BJyPzFnn.js → x-CrGUKNRv.js} +1 -1
  284. package/dist/client/assets/{xterm-D6dE_wMr.js → xterm-Ks-VlLTq.js} +1 -1
  285. package/dist/client/index.html +2 -2
  286. package/dist/main.mjs +38 -169
  287. package/dist/node/main.mjs +240 -272
  288. package/dist/pairing-runtime-controller.mjs +476 -394
  289. package/dist/runtime/base-daemon.mjs +121 -49
  290. package/dist/runtime/broker-daemon.mjs +60 -171
  291. package/dist/runtime/broker-process-manager.mjs +0 -6
  292. package/dist/runtime/mesh-discover.mjs +0 -6
  293. package/dist/scout-control-plane-web.mjs +477 -672
  294. package/dist/scout-web-server.mjs +477 -672
  295. package/package.json +7 -6
  296. package/dist/client/assets/ActivityScreen-C7AwUogt.js +0 -1
  297. package/dist/client/assets/AgentAvatar-B1xvQ7ej.js +0 -1
  298. package/dist/client/assets/AgentConfigurationScreen-BoBQpyz5.js +0 -1
  299. package/dist/client/assets/AgentDefinitionsWorkspace-rw3vh8Lm.js +0 -1
  300. package/dist/client/assets/AgentFloorView-Crdw8Uo5.js +0 -1
  301. package/dist/client/assets/AgentInfoScreen-Cge7HHbV.js +0 -1
  302. package/dist/client/assets/AgentLaneDetailSheet-DCIIg3Zp.js +0 -4
  303. package/dist/client/assets/AgentLanesEmbedScreen-BJLwXSNp.js +0 -1
  304. package/dist/client/assets/AgentLanesView-CbY9qD0z.js +0 -2
  305. package/dist/client/assets/AgentSessions-czl5zT7A.js +0 -6
  306. package/dist/client/assets/AgentsConsole-CoT2crwq.js +0 -1
  307. package/dist/client/assets/AgentsScreen-BcPM-z1T.js +0 -1
  308. package/dist/client/assets/AgentsSubnav-3_vpn2bT.js +0 -1
  309. package/dist/client/assets/AstronautSuit-BADl7m8x.js +0 -1
  310. package/dist/client/assets/BackToPicker-CqYhOaLB.js +0 -1
  311. package/dist/client/assets/BriefingDetailScreen-DDfZ8ci1.js +0 -1
  312. package/dist/client/assets/BrokerScreen-Bkvu92jk.js +0 -5
  313. package/dist/client/assets/Canvas-KyTsDJlB.js +0 -1
  314. package/dist/client/assets/ChatCollapsedStrip-Bjjqa30K.js +0 -1
  315. package/dist/client/assets/ConversationComposer-Ce7Byw48.js +0 -1
  316. package/dist/client/assets/ConversationFeedRows-DygDfQn_.js +0 -1
  317. package/dist/client/assets/ConversationHeader-C3sg0ULI.js +0 -1
  318. package/dist/client/assets/ConversationPanels-Dg4Y2GgX.js +0 -6
  319. package/dist/client/assets/ConversationScreen-BP5tdz2k.css +0 -1
  320. package/dist/client/assets/ConversationScreen-CjWWmuuh.js +0 -1
  321. package/dist/client/assets/ConversationStatus-BhVIYQza.js +0 -1
  322. package/dist/client/assets/CrewWorkspaces-B6YIyw1z.css +0 -1
  323. package/dist/client/assets/CrewWorkspaces-CDU-wy1Y.js +0 -1
  324. package/dist/client/assets/DocumentFocusViewer-DmtFisY9.js +0 -1
  325. package/dist/client/assets/FlightObserveScreen-DL3Xhl0h.js +0 -1
  326. package/dist/client/assets/HarnessesScreen-DTDL-XaA.js +0 -1
  327. package/dist/client/assets/HomeHero-7JwycwFY.css +0 -1
  328. package/dist/client/assets/HomeHero-CENwVZ45.js +0 -1
  329. package/dist/client/assets/HostAdvisorView-PgiZUkd_.js +0 -1
  330. package/dist/client/assets/KnowledgeSearchScreen-Bj80IgR0.js +0 -1
  331. package/dist/client/assets/LaneTraceDetailSheet-BztwvOv9.js +0 -1
  332. package/dist/client/assets/MeshScreen-lJKaOyGB.js +0 -1
  333. package/dist/client/assets/MessagesScreen-D6MVLvdg.js +0 -1
  334. package/dist/client/assets/MissionControlView-BCH-Zsp4.js +0 -1
  335. package/dist/client/assets/MissionFocusOverlay-DbAliOSF.js +0 -1
  336. package/dist/client/assets/MissionLeftAgentRow-Bx6Pg8_O.js +0 -1
  337. package/dist/client/assets/MissionLogPane-D06c29Y8.js +0 -1
  338. package/dist/client/assets/NewChatComposer-Bgqes0UQ.js +0 -19
  339. package/dist/client/assets/ObserveEmbedScreen-Cmhwai4X.js +0 -2
  340. package/dist/client/assets/ObserveTextFlow-C1f5oize.js +0 -2
  341. package/dist/client/assets/ObservedTopologyPanel-D85P6RAk.js +0 -2
  342. package/dist/client/assets/OpenScoutAppShell-IDI4fuUE.js +0 -88
  343. package/dist/client/assets/OpsAgentsView-yt0JavoB.js +0 -1
  344. package/dist/client/assets/OpsScreen-C3yNQqJE.js +0 -1
  345. package/dist/client/assets/OpsSubnav-BijKI3yG.js +0 -1
  346. package/dist/client/assets/ProjectAgentProfile-DnIeC16r.js +0 -1
  347. package/dist/client/assets/ProjectAgentProfileHero-Bh_aISs-.js +0 -1
  348. package/dist/client/assets/ProjectsInbox-B8Srlklk.js +0 -2
  349. package/dist/client/assets/ProjectsRail-DqAbdvCf.js +0 -1
  350. package/dist/client/assets/ProjectsScreen-DKHQ2iEv.js +0 -1
  351. package/dist/client/assets/ProjectsThreadAside-DpkjYLL2.js +0 -1
  352. package/dist/client/assets/Provider-Ve8yXaWR.js +0 -1
  353. package/dist/client/assets/RailRow-B0sRaJc6.css +0 -1
  354. package/dist/client/assets/RailRow-C4GNGR80.js +0 -1
  355. package/dist/client/assets/RawSessionsTable-Co3vzwsf.js +0 -1
  356. package/dist/client/assets/RealtimeVoiceScreen-DMd1CBAf.js +0 -9
  357. package/dist/client/assets/RepoDiffViewer-CovKjSgb.js +0 -7
  358. package/dist/client/assets/RepoDiffViewerLazy-zIiEmh-e.js +0 -2
  359. package/dist/client/assets/ScoutDeckSurface-BGsVicc2.js +0 -1
  360. package/dist/client/assets/SessionRefScreen-BmKhf29o.js +0 -1
  361. package/dist/client/assets/SessionsScreen-CsSqjIY2.js +0 -1
  362. package/dist/client/assets/SettingsDrawer-Dsj-On_x.css +0 -1
  363. package/dist/client/assets/SettingsDrawer-DwYQTGi8.js +0 -3
  364. package/dist/client/assets/SettingsScreen-Btaku7YM.js +0 -1
  365. package/dist/client/assets/Terminal-Dr-M9U4u.js +0 -1
  366. package/dist/client/assets/TerminalEmbedScreen-BmyZkonh.js +0 -1
  367. package/dist/client/assets/TerminalRelay-lJ2KdMCW.js +0 -46
  368. package/dist/client/assets/WorkFilesViewer-BBtKRBPv.js +0 -1
  369. package/dist/client/assets/agent-autocomplete-Dv-_9dAw.js +0 -2
  370. package/dist/client/assets/agent-identity-DzHGhLdJ.js +0 -1
  371. package/dist/client/assets/agent-specialization-CNrsRbKA.js +0 -1
  372. package/dist/client/assets/api-DEHEgJ9m.js +0 -1
  373. package/dist/client/assets/archive-DH49QqFG.js +0 -1
  374. package/dist/client/assets/arrow-right-B0Yi01Zr.js +0 -1
  375. package/dist/client/assets/broker-display-Q75fupqG.js +0 -2
  376. package/dist/client/assets/collapsed-strip-raJWthAH.css +0 -1
  377. package/dist/client/assets/compass-BepM5iWH.js +0 -1
  378. package/dist/client/assets/content-5hnDC9WE.js +0 -1
  379. package/dist/client/assets/content-BRFZ-a6m.js +0 -1
  380. package/dist/client/assets/content-BYykncDo.js +0 -1
  381. package/dist/client/assets/content-Be6yyWbJ.js +0 -1
  382. package/dist/client/assets/content-Bgl_X3ao.js +0 -1
  383. package/dist/client/assets/content-BopJW1Zx.js +0 -1
  384. package/dist/client/assets/content-Bv2sfg0w.js +0 -1
  385. package/dist/client/assets/content-CMBiIZTg.js +0 -1
  386. package/dist/client/assets/content-CPVqvf5o.js +0 -1
  387. package/dist/client/assets/content-CbwyFqdI.js +0 -1
  388. package/dist/client/assets/content-ClQjAWYi.js +0 -1
  389. package/dist/client/assets/content-Cv2tSAbv.js +0 -1
  390. package/dist/client/assets/content-DFFe3-Ot.js +0 -1
  391. package/dist/client/assets/content-DY5hwBmm.js +0 -1
  392. package/dist/client/assets/content-_IXoxGno.js +0 -1
  393. package/dist/client/assets/content-j_tewJdE.js +0 -1
  394. package/dist/client/assets/conversation-model-CigSPlKA.js +0 -1
  395. package/dist/client/assets/conversation-motion-features-_95aZx_1.js +0 -1
  396. package/dist/client/assets/cpu-Bc268H9Q.js +0 -1
  397. package/dist/client/assets/credentials-qwds23lv.js +0 -1
  398. package/dist/client/assets/ctx-panel-D_HJ3nhb.css +0 -1
  399. package/dist/client/assets/discover-DOlk1hG7.js +0 -2
  400. package/dist/client/assets/embed-entry-BqDJfa87.js +0 -2
  401. package/dist/client/assets/file-code-corner-CX53Cd9y.js +0 -1
  402. package/dist/client/assets/gauge-CPcEPmNt.js +0 -1
  403. package/dist/client/assets/gestures-BXIGYk_p.js +0 -1
  404. package/dist/client/assets/git-branch-q8Ayc8py.js +0 -1
  405. package/dist/client/assets/home-moving-signal-DMguaRWR.css +0 -1
  406. package/dist/client/assets/home-moving-signal-Dm2Z2x0p.js +0 -1
  407. package/dist/client/assets/home-now-card-xU5LGP7q.js +0 -1
  408. package/dist/client/assets/hooks-CdKx1CxP.js +0 -2
  409. package/dist/client/assets/host-advisor-B2Fqs5Dd.css +0 -1
  410. package/dist/client/assets/index-Bli6bTLU.js +0 -10
  411. package/dist/client/assets/index-D7UEHxaY.js +0 -1
  412. package/dist/client/assets/index-DFdlQs_c.js +0 -1
  413. package/dist/client/assets/index-DhfOMK0D.js +0 -1
  414. package/dist/client/assets/index-DzlEgstl.css +0 -1
  415. package/dist/client/assets/index-wLwc74Pu.css +0 -1
  416. package/dist/client/assets/inspector-panel-B8pigRsg.js +0 -2
  417. package/dist/client/assets/layers-BiZA-Clc.js +0 -1
  418. package/dist/client/assets/layout-grid-DMpv9CZM.js +0 -1
  419. package/dist/client/assets/left-BayK4ocL.js +0 -1
  420. package/dist/client/assets/left-BhZhSrS2.js +0 -1
  421. package/dist/client/assets/left-BhgU6NOA.js +0 -1
  422. package/dist/client/assets/left-CY_FGnN7.js +0 -1
  423. package/dist/client/assets/left-Cq8mjamr.js +0 -1
  424. package/dist/client/assets/left-DH44V4I_.css +0 -1
  425. package/dist/client/assets/left-Dnqla0b5.js +0 -2
  426. package/dist/client/assets/left-Dy403II2.js +0 -2
  427. package/dist/client/assets/left-R2OOE7VG.css +0 -1
  428. package/dist/client/assets/left-advisor-oOAtJ9YE.js +0 -1
  429. package/dist/client/assets/left-agents-TIKe8vW8.js +0 -1
  430. package/dist/client/assets/left-default-owH0Lwxo.js +0 -1
  431. package/dist/client/assets/left-lanes-BE_co2lP.js +0 -1
  432. package/dist/client/assets/left-mission-C_nWUtfA.js +0 -1
  433. package/dist/client/assets/library-BSVrjn_m.js +0 -1
  434. package/dist/client/assets/mission-control-CnU7dNt1.css +0 -1
  435. package/dist/client/assets/persistent-state-DYjP8lqN.js +0 -1
  436. package/dist/client/assets/profile-BkmuseW7.js +0 -1
  437. package/dist/client/assets/projects-inbox-C0umZMSY.js +0 -1
  438. package/dist/client/assets/provider-CX9EWecp.js +0 -1
  439. package/dist/client/assets/proxy-C35W-YHZ.js +0 -1
  440. package/dist/client/assets/resolve-panes-CCqRkQdM.js +0 -1
  441. package/dist/client/assets/resolve-sidebar-context-JkxY8qsV.js +0 -1
  442. package/dist/client/assets/right-B3PQUHd5.js +0 -1
  443. package/dist/client/assets/right-BPirlFC8.js +0 -1
  444. package/dist/client/assets/right-BUP2Ro_M.js +0 -1
  445. package/dist/client/assets/right-BVWYPIFX.js +0 -1
  446. package/dist/client/assets/right-BoAJxwA3.js +0 -1
  447. package/dist/client/assets/right-C2aOC2li.js +0 -1
  448. package/dist/client/assets/right-CtPJjgOV.js +0 -1
  449. package/dist/client/assets/right-SfSu0zHC.js +0 -1
  450. package/dist/client/assets/router-B0YclXYg.js +0 -1
  451. package/dist/client/assets/scout-voice-DvG_3stJ.js +0 -1
  452. package/dist/client/assets/scoutbot-markdown-BJJyaPu2.js +0 -6
  453. package/dist/client/assets/secondaryNavConfig-DyC_P9Wx.js +0 -1
  454. package/dist/client/assets/settings-BzWCF3NF.js +0 -1
  455. package/dist/client/assets/system-surfaces-redesign-QVXNeGYw.css +0 -1
  456. package/dist/client/assets/text-rLpBg4_z.css +0 -1
  457. package/dist/client/assets/use-reduced-motion-BLn59zLn.js +0 -1
  458. package/dist/client/assets/use-scout-dev-flags-JKb1EhFh.js +0 -1
  459. package/dist/client/assets/useContentSecondaryNav-D-hVKzM9.js +0 -1
  460. package/dist/client/assets/usePersistentState-DOEahRlt.js +0 -1
  461. package/dist/client/assets/zap-rw7uwZht.js +0 -1
  462. /package/dist/client/assets/{DocumentFocusViewer-BSC_JwVE.css → document-focus-viewer-BSC_JwVE.css} +0 -0
@@ -1827,39 +1827,6 @@ import {
1827
1827
  } from "fs";
1828
1828
  import { homedir as homedir3, hostname as osHostname } from "os";
1829
1829
  import { dirname, join as join3 } from "path";
1830
-
1831
- // packages/runtime/src/node-identity.ts
1832
- var NODE_CARD_TTL_MS = 24 * 60 * 60 * 1000;
1833
- var stableNodeQualifierCache = new Map;
1834
- function stripBonjourCollisionSuffix(value) {
1835
- if (!value || typeof value !== "string")
1836
- return "";
1837
- let trimmed = value.trim();
1838
- const isDotLocal = /\.local\.?$/i.test(trimmed);
1839
- if (isDotLocal) {
1840
- trimmed = trimmed.replace(/\.local\.?$/i, "");
1841
- }
1842
- const isHyphenLocalOpenscout = /-local-openscout$/i.test(trimmed);
1843
- const isHyphenLocal = !isHyphenLocalOpenscout && /-local$/i.test(trimmed);
1844
- if (isHyphenLocalOpenscout) {
1845
- trimmed = trimmed.replace(/-local-openscout$/i, "");
1846
- } else if (isHyphenLocal) {
1847
- trimmed = trimmed.replace(/-local$/i, "");
1848
- }
1849
- if (!isDotLocal && !isHyphenLocalOpenscout && !isHyphenLocal) {
1850
- return trimmed;
1851
- }
1852
- trimmed = trimmed.replace(/(?<=[a-zA-Z].*?)(?:-\d+)+$/, "");
1853
- if (isDotLocal)
1854
- return `${trimmed}.local`;
1855
- if (isHyphenLocalOpenscout)
1856
- return `${trimmed}-local-openscout`;
1857
- if (isHyphenLocal)
1858
- return `${trimmed}-local`;
1859
- return trimmed;
1860
- }
1861
-
1862
- // packages/runtime/src/local-config.ts
1863
1830
  var LOCAL_CONFIG_VERSION = 1;
1864
1831
  var DEFAULT_SCOUT_WEB_PORTAL_HOST = "scout.local";
1865
1832
  var DEFAULT_SCOUT_WEB_DEV_HOST = `dev.${DEFAULT_SCOUT_WEB_PORTAL_HOST}`;
@@ -1885,14 +1852,12 @@ var DEFAULT_LOCAL_CONFIG = {
1885
1852
  }
1886
1853
  };
1887
1854
  function normalizeLocalHostnameLabel(value) {
1888
- const stripped = value ? stripBonjourCollisionSuffix(value) : value;
1889
- const firstLabel = stripped?.trim().replace(/\.local\.?$/i, "").split(".").find((part) => part.trim().length > 0)?.trim();
1855
+ const firstLabel = value?.trim().replace(/\.local\.?$/i, "").split(".").find((part) => part.trim().length > 0)?.trim();
1890
1856
  const normalized = firstLabel?.toLowerCase().replace(/[^a-z0-9-]+/g, "-").replace(/^-+|-+$/g, "").replace(/-{2,}/g, "-");
1891
1857
  return normalized || "localhost";
1892
1858
  }
1893
1859
  function normalizeLocalHostname(value) {
1894
- const stripped = value ? stripBonjourCollisionSuffix(value) : value;
1895
- const trimmed = stripped?.trim().replace(/\.$/, "").toLowerCase();
1860
+ const trimmed = value?.trim().replace(/\.$/, "").toLowerCase();
1896
1861
  const labels = trimmed?.split(".").map((label) => label.trim().replace(/[^a-z0-9-]+/g, "-").replace(/^-+|-+$/g, "").replace(/-{2,}/g, "-")).filter(Boolean);
1897
1862
  return labels && labels.length > 0 ? labels.join(".") : "localhost";
1898
1863
  }
@@ -2953,6 +2918,8 @@ if (process.argv[1] && fileURLToPath(import.meta.url) === process.argv[1] && !pr
2953
2918
  }
2954
2919
 
2955
2920
  // packages/runtime/src/pairing-supervisor.ts
2921
+ import { execFileSync as execFileSync2 } from "child_process";
2922
+ import { randomUUID } from "crypto";
2956
2923
  import {
2957
2924
  existsSync as existsSync6,
2958
2925
  mkdirSync as mkdirSync3,
@@ -2965,7 +2932,9 @@ import { homedir as homedir6 } from "os";
2965
2932
  import { dirname as dirname4, join as join6 } from "path";
2966
2933
  var SCOUT_PAIRING_SUPERVISOR_INTENT_FILE = "supervisor.json";
2967
2934
  var SCOUT_PAIRING_RUNTIME_PID_FILE = "runtime.pid";
2935
+ var SCOUT_PAIRING_RUNTIME_OWNER_FILE = "runtime-owner.json";
2968
2936
  var SCOUT_PAIRING_SUPERVISOR_PID_FILE = "supervisor.pid";
2937
+ var SCOUT_PAIRING_RUNTIME_PROCESS_MARKER = "pairing-runtime-controller";
2969
2938
  function resolveScoutPairingSupervisorPaths(env = process.env) {
2970
2939
  const configuredRoot = env.OPENSCOUT_PAIRING_HOME?.trim() || env.SCOUT_PAIRING_HOME?.trim();
2971
2940
  const rootDir = configuredRoot || join6(homedir6(), ".scout", "pairing");
@@ -2973,6 +2942,7 @@ function resolveScoutPairingSupervisorPaths(env = process.env) {
2973
2942
  rootDir,
2974
2943
  intentPath: join6(rootDir, SCOUT_PAIRING_SUPERVISOR_INTENT_FILE),
2975
2944
  runtimePidPath: join6(rootDir, SCOUT_PAIRING_RUNTIME_PID_FILE),
2945
+ runtimeOwnerPath: join6(rootDir, SCOUT_PAIRING_RUNTIME_OWNER_FILE),
2976
2946
  supervisorPidPath: join6(rootDir, SCOUT_PAIRING_SUPERVISOR_PID_FILE)
2977
2947
  };
2978
2948
  }
@@ -3012,6 +2982,84 @@ function isScoutPairingProcessRunning(pid) {
3012
2982
  return error.code === "EPERM";
3013
2983
  }
3014
2984
  }
2985
+ function isScoutPairingRuntimeOwnerPidRunning(owner, expectedPid, options = {}) {
2986
+ if (!owner || expectedPid === null || owner.pid !== expectedPid)
2987
+ return false;
2988
+ return (options.isRunning ?? isScoutPairingProcessRunning)(expectedPid);
2989
+ }
2990
+ function inspectScoutPairingProcess(pid) {
2991
+ if (!Number.isInteger(pid) || pid <= 0)
2992
+ return null;
2993
+ try {
2994
+ const output = execFileSync2("ps", ["-p", String(pid), "-o", "lstart=", "-o", "command="], {
2995
+ encoding: "utf8",
2996
+ stdio: ["ignore", "pipe", "ignore"]
2997
+ }).trim();
2998
+ const startedAt = output.slice(0, 24).trim().replace(/\s+/g, " ");
2999
+ const command = output.slice(24).trim();
3000
+ return startedAt && command ? { pid, startedAt, command } : null;
3001
+ } catch {
3002
+ return null;
3003
+ }
3004
+ }
3005
+ function readScoutPairingRuntimeOwner(ownerPath = resolveScoutPairingSupervisorPaths().runtimeOwnerPath) {
3006
+ if (!existsSync6(ownerPath))
3007
+ return null;
3008
+ try {
3009
+ const value = JSON.parse(readFileSync5(ownerPath, "utf8"));
3010
+ return value.version === 1 && Number.isInteger(value.pid) && (value.pid ?? 0) > 0 && typeof value.token === "string" && value.token.length >= 16 && typeof value.startedAt === "string" && value.startedAt.length > 0 && typeof value.command === "string" && value.command.includes(SCOUT_PAIRING_RUNTIME_PROCESS_MARKER) && typeof value.claimedAt === "number" && Number.isFinite(value.claimedAt) ? value : null;
3011
+ } catch {
3012
+ return null;
3013
+ }
3014
+ }
3015
+ function isScoutPairingRuntimeOwnerLive(owner, options = {}) {
3016
+ if (!owner || options.expectedToken && owner.token !== options.expectedToken)
3017
+ return false;
3018
+ const current = (options.inspect ?? inspectScoutPairingProcess)(owner.pid);
3019
+ return current !== null && current.startedAt === owner.startedAt && current.command === owner.command && current.command.includes(SCOUT_PAIRING_RUNTIME_PROCESS_MARKER);
3020
+ }
3021
+ function readLiveScoutPairingRuntimeOwner(ownerPath = resolveScoutPairingSupervisorPaths().runtimeOwnerPath, options = {}) {
3022
+ const owner = readScoutPairingRuntimeOwner(ownerPath);
3023
+ return isScoutPairingRuntimeOwnerLive(owner, options) ? owner : null;
3024
+ }
3025
+ function claimScoutPairingRuntimeOwnership(options = {}) {
3026
+ const pid = options.pid ?? process.pid;
3027
+ const ownerPath = options.ownerPath ?? resolveScoutPairingSupervisorPaths().runtimeOwnerPath;
3028
+ const inspect = options.inspect ?? inspectScoutPairingProcess;
3029
+ const existing = readLiveScoutPairingRuntimeOwner(ownerPath, { inspect });
3030
+ if (existing && existing.pid !== pid) {
3031
+ throw new Error(`Scout pairing runtime is already owned by pid ${existing.pid}.`);
3032
+ }
3033
+ const identity = inspect(pid);
3034
+ if (!identity || !identity.command.includes(SCOUT_PAIRING_RUNTIME_PROCESS_MARKER)) {
3035
+ throw new Error(`Cannot prove Scout pairing runtime ownership for pid ${pid}.`);
3036
+ }
3037
+ const owner = {
3038
+ version: 1,
3039
+ ...identity,
3040
+ token: options.token?.trim() || randomUUID(),
3041
+ claimedAt: options.now ?? Date.now()
3042
+ };
3043
+ mkdirSync3(dirname4(ownerPath), { recursive: true });
3044
+ writeFileAtomically(ownerPath, `${JSON.stringify(owner, null, 2)}
3045
+ `);
3046
+ return owner;
3047
+ }
3048
+ function signalScoutPairingRuntimeOwner(owner, signal, options = {}) {
3049
+ const ownerPath = options.ownerPath ?? resolveScoutPairingSupervisorPaths().runtimeOwnerPath;
3050
+ const current = readLiveScoutPairingRuntimeOwner(ownerPath, {
3051
+ expectedToken: owner.token,
3052
+ inspect: options.inspect
3053
+ });
3054
+ if (!current || current.pid !== owner.pid)
3055
+ return false;
3056
+ try {
3057
+ (options.kill ?? ((pid, nextSignal) => process.kill(pid, nextSignal)))(owner.pid, signal);
3058
+ return true;
3059
+ } catch {
3060
+ return false;
3061
+ }
3062
+ }
3015
3063
  function readLiveScoutPairingSupervisorPid(supervisorPidPath = resolveScoutPairingSupervisorPaths().supervisorPidPath) {
3016
3064
  const pid = readScoutPairingProcessPid(supervisorPidPath);
3017
3065
  return isScoutPairingProcessRunning(pid) ? pid : null;
@@ -4095,14 +4143,18 @@ function resolvePairingControllerCommand() {
4095
4143
  const bun = resolveBunExecutable();
4096
4144
  return bun ? { command: bun.path, args: [entrypoint], cwd: setupCwd } : null;
4097
4145
  }
4098
- async function waitForPairingProcessExit(pid) {
4146
+ async function waitForPairingProcessExit(owner) {
4099
4147
  const deadline = Date.now() + PAIRING_STOP_TIMEOUT_MS;
4100
4148
  while (Date.now() < deadline) {
4101
- if (!isScoutPairingProcessRunning(pid))
4149
+ if (!readLiveScoutPairingRuntimeOwner(pairingPaths.runtimeOwnerPath, {
4150
+ expectedToken: owner.token
4151
+ }))
4102
4152
  return true;
4103
4153
  await sleep(100);
4104
4154
  }
4105
- return !isScoutPairingProcessRunning(pid);
4155
+ return !readLiveScoutPairingRuntimeOwner(pairingPaths.runtimeOwnerPath, {
4156
+ expectedToken: owner.token
4157
+ });
4106
4158
  }
4107
4159
  async function stopPairingController() {
4108
4160
  const ownedChild = pairingProcess;
@@ -4112,21 +4164,27 @@ async function stopPairingController() {
4112
4164
  return;
4113
4165
  }
4114
4166
  const runtimePid = readScoutPairingProcessPid(pairingPaths.runtimePidPath);
4115
- if (!isScoutPairingProcessRunning(runtimePid)) {
4167
+ const runtimeOwner = readLiveScoutPairingRuntimeOwner(pairingPaths.runtimeOwnerPath);
4168
+ if (!runtimePid || !runtimeOwner || runtimeOwner.pid !== runtimePid) {
4169
+ if (isScoutPairingProcessRunning(runtimePid)) {
4170
+ warn("refusing to signal unverified pairing runtime pid", { pid: runtimePid });
4171
+ }
4116
4172
  pairingProcess = null;
4117
4173
  return;
4118
4174
  }
4119
- try {
4120
- process.kill(runtimePid, "SIGTERM");
4121
- } catch {
4175
+ if (!signalScoutPairingRuntimeOwner(runtimeOwner, "SIGTERM", {
4176
+ ownerPath: pairingPaths.runtimeOwnerPath
4177
+ })) {
4122
4178
  pairingProcess = null;
4123
4179
  return;
4124
4180
  }
4125
- if (!await waitForPairingProcessExit(runtimePid)) {
4181
+ if (!await waitForPairingProcessExit(runtimeOwner)) {
4126
4182
  warn("pairing controller did not exit after SIGTERM; forcing shutdown", { pid: runtimePid });
4127
- try {
4128
- process.kill(runtimePid, "SIGKILL");
4129
- } catch {}
4183
+ if (!signalScoutPairingRuntimeOwner(runtimeOwner, "SIGKILL", {
4184
+ ownerPath: pairingPaths.runtimeOwnerPath
4185
+ })) {
4186
+ warn("pairing controller ownership changed before SIGKILL; refusing escalation", { pid: runtimePid });
4187
+ }
4130
4188
  }
4131
4189
  pairingProcess = null;
4132
4190
  }
@@ -4182,7 +4240,19 @@ async function reconcilePairingController() {
4182
4240
  try {
4183
4241
  let intent = readScoutPairingSupervisorIntent(pairingPaths.intentPath);
4184
4242
  const runtimePid = readScoutPairingProcessPid(pairingPaths.runtimePidPath);
4185
- const runtimeRunning = isScoutPairingProcessRunning(runtimePid);
4243
+ let runtimeOwner = readScoutPairingRuntimeOwner(pairingPaths.runtimeOwnerPath);
4244
+ if (!runtimeOwner && runtimePid) {
4245
+ try {
4246
+ runtimeOwner = claimScoutPairingRuntimeOwnership({
4247
+ pid: runtimePid,
4248
+ ownerPath: pairingPaths.runtimeOwnerPath
4249
+ });
4250
+ log("adopted legacy pairing runtime ownership", { pid: runtimePid });
4251
+ } catch {
4252
+ runtimeOwner = null;
4253
+ }
4254
+ }
4255
+ const runtimeRunning = isScoutPairingRuntimeOwnerPidRunning(runtimeOwner, runtimePid);
4186
4256
  if (intent.desiredState === null) {
4187
4257
  intent = updateScoutPairingSupervisorIntent("start", pairingPaths.intentPath);
4188
4258
  log(runtimeRunning ? "adopted live pairing runtime as desired running state" : "initialized pairing desired state as running", runtimeRunning ? { pid: runtimePid } : {});
@@ -4203,6 +4273,8 @@ async function reconcilePairingController() {
4203
4273
  return;
4204
4274
  }
4205
4275
  if (restartRequested) {
4276
+ pairingNextStartAt = 0;
4277
+ pairingRestartDelayMs = RESTART_MIN_DELAY_MS;
4206
4278
  await stopPairingController();
4207
4279
  } else if (pairingProcess && !isChildExited(pairingProcess) && runtimeRunning && runtimePid === pairingProcess.pid) {
4208
4280
  pairingRestartDelayMs = RESTART_MIN_DELAY_MS;
@@ -39809,7 +39809,7 @@ function finalize(ctx, schema) {
39809
39809
  result.$schema = "http://json-schema.org/draft-07/schema#";
39810
39810
  } else if (ctx.target === "draft-04") {
39811
39811
  result.$schema = "http://json-schema.org/draft-04/schema#";
39812
- } else if (ctx.target === "openapi-3.0") {}
39812
+ } else if (ctx.target === "openapi-3.0") {} else {}
39813
39813
  if (ctx.external?.uri) {
39814
39814
  const id = ctx.external.registry.get(schema)?.id;
39815
39815
  if (!id)
@@ -40057,7 +40057,7 @@ var literalProcessor = (schema, ctx, json, _params) => {
40057
40057
  if (val === undefined) {
40058
40058
  if (ctx.unrepresentable === "throw") {
40059
40059
  throw new Error("Literal `undefined` cannot be represented in JSON Schema");
40060
- }
40060
+ } else {}
40061
40061
  } else if (typeof val === "bigint") {
40062
40062
  if (ctx.unrepresentable === "throw") {
40063
40063
  throw new Error("BigInt literals cannot be represented in JSON Schema");
@@ -43866,6 +43866,7 @@ function formatScoutPermissionProfiles() {
43866
43866
 
43867
43867
  // packages/protocol/src/presence.ts
43868
43868
  var PRESENCE_STALE_AFTER_MS = 45000;
43869
+ var PRESENCE_REFRESH_INTERVAL_MS = 30000;
43869
43870
  var PRESENCE_GONE_AFTER_STALE_MS = 60000;
43870
43871
  function presenceLifecycle(beat, now, options = {}) {
43871
43872
  if (now < beat.staleAt)
@@ -44659,7 +44660,7 @@ function isScoutLaunchableHarness(value) {
44659
44660
  if (!value)
44660
44661
  return false;
44661
44662
  const normalized = value.trim().toLowerCase();
44662
- return normalized === "oc" || SCOUT_LAUNCHABLE_HARNESSES.includes(normalized);
44663
+ return SCOUT_LAUNCHABLE_HARNESSES.includes(normalized);
44663
44664
  }
44664
44665
  function normalizeScoutReasoningEffort(value) {
44665
44666
  const normalized = value?.trim().toLowerCase();
@@ -53366,28 +53367,41 @@ var controlRouter = t.router({
53366
53367
  events: t.procedure.input(controlEventsInput).subscription(async function* ({ input, signal }) {
53367
53368
  const kinds = input?.kinds;
53368
53369
  const filter = kinds && kinds.length > 0 ? new Set(kinds) : null;
53369
- const backlog = snapshotRecentControlEvents(CONTROL_BACKLOG_LIMIT);
53370
- let startIdx = 0;
53371
- if (input?.since) {
53372
- const idx = backlog.findIndex((event) => event.id === input.since);
53373
- if (idx >= 0)
53374
- startIdx = idx + 1;
53375
- }
53376
- for (let i = startIdx;i < backlog.length; i++) {
53377
- const event = backlog[i];
53378
- if (!event)
53379
- continue;
53380
- if (filter && !filter.has(event.kind))
53381
- continue;
53382
- yield tracked(event.id, event);
53383
- }
53384
- for (const event of snapshotPresenceControlEvents()) {
53385
- if (filter && !filter.has(event.kind))
53386
- continue;
53387
- yield tracked(event.id, event);
53388
- }
53389
- for await (const event of controlEventIterable(kinds, signal)) {
53390
- yield tracked(event.id, event);
53370
+ const liveIterator = controlEventIterable(kinds, signal)[Symbol.asyncIterator]();
53371
+ const replayedIds = new Set;
53372
+ try {
53373
+ const backlog = snapshotRecentControlEvents(CONTROL_BACKLOG_LIMIT);
53374
+ let startIdx = 0;
53375
+ if (input?.since) {
53376
+ const idx = backlog.findIndex((event) => event.id === input.since);
53377
+ if (idx >= 0)
53378
+ startIdx = idx + 1;
53379
+ }
53380
+ for (let i = startIdx;i < backlog.length; i++) {
53381
+ const event = backlog[i];
53382
+ if (!event)
53383
+ continue;
53384
+ if (filter && !filter.has(event.kind))
53385
+ continue;
53386
+ replayedIds.add(event.id);
53387
+ yield tracked(event.id, event);
53388
+ }
53389
+ for (const event of snapshotPresenceControlEvents()) {
53390
+ if (filter && !filter.has(event.kind))
53391
+ continue;
53392
+ replayedIds.add(event.id);
53393
+ yield tracked(event.id, event);
53394
+ }
53395
+ while (true) {
53396
+ const next = await liveIterator.next();
53397
+ if (next.done)
53398
+ return;
53399
+ if (replayedIds.delete(next.value.id))
53400
+ continue;
53401
+ yield tracked(next.value.id, next.value);
53402
+ }
53403
+ } finally {
53404
+ await liveIterator.return?.();
53391
53405
  }
53392
53406
  })
53393
53407
  });
@@ -54830,9 +54844,12 @@ function isTransportInferredStall(status) {
54830
54844
  class BrokerPresenceService {
54831
54845
  deps;
54832
54846
  presence;
54847
+ lastPublished = new Map;
54848
+ refreshIntervalMs;
54833
54849
  constructor(deps) {
54834
54850
  this.deps = deps;
54835
54851
  this.presence = new BrokerPresenceMap(deps.map);
54852
+ this.refreshIntervalMs = Math.max(1, deps.refreshIntervalMs ?? PRESENCE_REFRESH_INTERVAL_MS);
54836
54853
  }
54837
54854
  snapshot(now = this.now()) {
54838
54855
  return this.presence.snapshot(now);
@@ -54856,16 +54873,23 @@ class BrokerPresenceService {
54856
54873
  needRef: needRefForStatus(status),
54857
54874
  boundConversationId: boundConversationIdForStatus(status, snapshot)
54858
54875
  }, now);
54859
- if (!result?.transitioned)
54876
+ if (!result)
54860
54877
  continue;
54861
- this.deps.publish(this.presenceEvent(result.beat, result.previousActivity, now));
54878
+ const lastPublished = this.lastPublished.get(agentId);
54879
+ const refreshDue = !result.transitioned && lastPublished !== undefined && result.beat.updatedAt > lastPublished.updatedAt && now - lastPublished.at >= this.refreshIntervalMs;
54880
+ if (!result.transitioned && !refreshDue)
54881
+ continue;
54882
+ this.deps.publish(this.presenceEvent(result.beat, result.transitioned ? result.previousActivity : undefined, now));
54883
+ this.lastPublished.set(agentId, { at: now, updatedAt: result.beat.updatedAt });
54862
54884
  published += 1;
54863
54885
  }
54864
- this.presence.prune(now);
54886
+ this.forgetPublished(this.presence.prune(now));
54865
54887
  return published;
54866
54888
  }
54867
54889
  sweep(now = this.now()) {
54868
- return this.presence.prune(now);
54890
+ const dropped = this.presence.prune(now);
54891
+ this.forgetPublished(dropped);
54892
+ return dropped;
54869
54893
  }
54870
54894
  presenceEvent(beat, previousActivity, now) {
54871
54895
  return {
@@ -54880,6 +54904,10 @@ class BrokerPresenceService {
54880
54904
  now() {
54881
54905
  return this.deps.now?.() ?? Date.now();
54882
54906
  }
54907
+ forgetPublished(agentIds) {
54908
+ for (const agentId of agentIds)
54909
+ this.lastPublished.delete(agentId);
54910
+ }
54883
54911
  }
54884
54912
  function needRefForStatus(status) {
54885
54913
  if (status.subjectKind !== "question")
@@ -68726,38 +68754,6 @@ var NODE_IDENTITY_FILE = "node-identity.json";
68726
68754
  var NODE_FINGERPRINT_PREFIX = "osc1";
68727
68755
  var NODE_CARD_TTL_MS = 24 * 60 * 60 * 1000;
68728
68756
  var stableNodeQualifierCache = new Map;
68729
- function stripBonjourCollisionSuffix(value) {
68730
- if (!value || typeof value !== "string")
68731
- return "";
68732
- let trimmed = value.trim();
68733
- const isDotLocal = /\.local\.?$/i.test(trimmed);
68734
- if (isDotLocal) {
68735
- trimmed = trimmed.replace(/\.local\.?$/i, "");
68736
- }
68737
- const isHyphenLocalOpenscout = /-local-openscout$/i.test(trimmed);
68738
- const isHyphenLocal = !isHyphenLocalOpenscout && /-local$/i.test(trimmed);
68739
- if (isHyphenLocalOpenscout) {
68740
- trimmed = trimmed.replace(/-local-openscout$/i, "");
68741
- } else if (isHyphenLocal) {
68742
- trimmed = trimmed.replace(/-local$/i, "");
68743
- }
68744
- if (!isDotLocal && !isHyphenLocalOpenscout && !isHyphenLocal) {
68745
- return trimmed;
68746
- }
68747
- trimmed = trimmed.replace(/(?<=[a-zA-Z].*?)(?:-\d+)+$/, "");
68748
- if (isDotLocal)
68749
- return `${trimmed}.local`;
68750
- if (isHyphenLocalOpenscout)
68751
- return `${trimmed}-local-openscout`;
68752
- if (isHyphenLocal)
68753
- return `${trimmed}-local`;
68754
- return trimmed;
68755
- }
68756
- function canonicalMeshNodeId(nodeId) {
68757
- if (!nodeId || typeof nodeId !== "string")
68758
- return "";
68759
- return stripBonjourCollisionSuffix(nodeId);
68760
- }
68761
68757
  function nodeIdentityPath(supportDirectory) {
68762
68758
  const dir = supportDirectory ?? resolveOpenScoutSupportPaths().supportDirectory;
68763
68759
  return join30(dir, NODE_IDENTITY_FILE);
@@ -68778,12 +68774,6 @@ function loadOrCreateStableNodeQualifier(fallbackName, supportDirectory) {
68778
68774
  const identity2 = loadOrCreateNodeIdentity(supportDirectory);
68779
68775
  const existing = normalizeNodeQualifier(identity2.nodeQualifier);
68780
68776
  if (existing) {
68781
- if (identity2.nodeQualifier !== existing) {
68782
- persistNodeIdentity(path, {
68783
- ...identity2,
68784
- nodeQualifier: existing
68785
- });
68786
- }
68787
68777
  stableNodeQualifierCache.set(path, existing);
68788
68778
  return existing;
68789
68779
  }
@@ -68829,7 +68819,7 @@ function readAndValidateNodeIdentity(path) {
68829
68819
  if (parsed.version !== 1 || !parsed.publicKey || !parsed.privateKey) {
68830
68820
  throw new Error(`Corrupt node identity at ${path}; remove it to generate a fresh one.`);
68831
68821
  }
68832
- if (parsed.nodeQualifier !== undefined && normalizePersistedNodeQualifier(parsed.nodeQualifier) !== parsed.nodeQualifier) {
68822
+ if (parsed.nodeQualifier !== undefined && normalizeNodeQualifier(parsed.nodeQualifier) !== parsed.nodeQualifier) {
68833
68823
  throw new Error(`Corrupt node identity at ${path}; remove it to generate a fresh one.`);
68834
68824
  }
68835
68825
  try {
@@ -68842,11 +68832,8 @@ function readAndValidateNodeIdentity(path) {
68842
68832
  }
68843
68833
  return parsed;
68844
68834
  }
68845
- function normalizePersistedNodeQualifier(value) {
68846
- return typeof value === "string" ? value.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/-+/g, "-").replace(/^-+|-+$/g, "") : "";
68847
- }
68848
68835
  function normalizeNodeQualifier(value) {
68849
- return stripBonjourCollisionSuffix(normalizePersistedNodeQualifier(value));
68836
+ return typeof value === "string" ? value.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/-+/g, "-").replace(/^-+|-+$/g, "") : "";
68850
68837
  }
68851
68838
  function persistNodeIdentity(path, identity2) {
68852
68839
  const tempPath = `${path}.${process.pid}.${randomBytes(6).toString("hex")}.tmp`;
@@ -101789,10 +101776,6 @@ function hasColumn(database, tableName, columnName) {
101789
101776
  const rows = database.query(`SELECT name FROM pragma_table_info('${escapedTableName}')`).all();
101790
101777
  return rows.some((row) => row.name === columnName);
101791
101778
  }
101792
- function hasTable(database, tableName) {
101793
- const row = database.query("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?1").get(tableName);
101794
- return Boolean(row);
101795
- }
101796
101779
  var CONTROL_PLANE_SCHEMA_MIGRATIONS = [
101797
101780
  {
101798
101781
  id: "runtime-session-mapping-read-model",
@@ -101971,46 +101954,6 @@ WHERE latest.invocation_id = inv.id
101971
101954
  database.exec("ALTER TABLE trusted_peers ADD COLUMN tls_spki_fingerprint TEXT");
101972
101955
  }
101973
101956
  }
101974
- },
101975
- {
101976
- id: "canonicalize-mesh-nodes-and-rehome",
101977
- description: "Re-homes foreign key references on Bonjour collision-suffixed ghost nodes to canonical stable node IDs and prunes ghost nodes.",
101978
- apply(database) {
101979
- if (!hasTable(database, "nodes"))
101980
- return;
101981
- const nodeRows = database.query("SELECT * FROM nodes").all();
101982
- for (const row of nodeRows) {
101983
- const canonicalId = canonicalMeshNodeId(row.id);
101984
- if (canonicalId && canonicalId !== row.id) {
101985
- const existing = nodeRows.find((r) => r.id === canonicalId);
101986
- if (!existing) {
101987
- database.query(`INSERT INTO nodes (
101988
- id, mesh_id, name, host_name, advertise_scope, broker_url, tailnet_name,
101989
- capabilities_json, labels_json, metadata_json, last_seen_at, registered_at
101990
- ) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12)
101991
- ON CONFLICT(id) DO UPDATE SET
101992
- last_seen_at = MAX(COALESCE(nodes.last_seen_at, 0), COALESCE(excluded.last_seen_at, 0)),
101993
- broker_url = COALESCE(excluded.broker_url, nodes.broker_url),
101994
- 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);
101995
- }
101996
- database.query("UPDATE agents SET home_node_id = ?1 WHERE home_node_id = ?2").run(canonicalId, row.id);
101997
- database.query("UPDATE agents SET authority_node_id = ?1 WHERE authority_node_id = ?2").run(canonicalId, row.id);
101998
- database.query("UPDATE agent_endpoints SET node_id = ?1 WHERE node_id = ?2").run(canonicalId, row.id);
101999
- database.query("UPDATE runtime_sessions SET node_id = ?1 WHERE node_id = ?2").run(canonicalId, row.id);
102000
- database.query("UPDATE runtime_session_aliases SET node_id = ?1 WHERE node_id = ?2").run(canonicalId, row.id);
102001
- database.query("UPDATE conversations SET authority_node_id = ?1 WHERE authority_node_id = ?2").run(canonicalId, row.id);
102002
- database.query("UPDATE conversation_read_cursors SET reader_node_id = ?1 WHERE reader_node_id = ?2").run(canonicalId, row.id);
102003
- database.query("UPDATE messages SET origin_node_id = ?1 WHERE origin_node_id = ?2").run(canonicalId, row.id);
102004
- database.query("UPDATE deliveries SET target_node_id = ?1 WHERE target_node_id = ?2").run(canonicalId, row.id);
102005
- database.query("UPDATE invocations SET requester_node_id = ?1 WHERE requester_node_id = ?2").run(canonicalId, row.id);
102006
- database.query("UPDATE invocations SET target_node_id = ?1 WHERE target_node_id = ?2").run(canonicalId, row.id);
102007
- database.query("UPDATE thread_events SET authority_node_id = ?1 WHERE authority_node_id = ?2").run(canonicalId, row.id);
102008
- database.query("UPDATE thread_cursors SET authority_node_id = ?1 WHERE authority_node_id = ?2").run(canonicalId, row.id);
102009
- database.query("UPDATE trusted_peers SET node_id = ?1 WHERE node_id = ?2").run(canonicalId, row.id);
102010
- database.query("DELETE FROM nodes WHERE id = ?1").run(row.id);
102011
- }
102012
- }
102013
- }
102014
101957
  }
102015
101958
  ];
102016
101959
  function configureControlPlaneDatabase(database) {
@@ -103037,65 +102980,11 @@ class SQLiteControlPlaneStore {
103037
102980
  const now = options.now ?? currentTimestampMs();
103038
102981
  const maxStaleAgeMs = options.maxStaleAgeMs ?? 7 * 24 * 60 * 60 * 1000;
103039
102982
  const staleCutoff = now - maxStaleAgeMs;
103040
- const nodeRows = this.db.query("SELECT * FROM nodes").all();
103041
102983
  const peerRows = this.db.query("SELECT * FROM trusted_peers").all();
103042
102984
  const rehomedMappings = [];
103043
- const rehomeMap = new Map;
103044
- for (const row of nodeRows) {
103045
- const canonicalId = canonicalMeshNodeId(row.id);
103046
- if (canonicalId && canonicalId !== row.id) {
103047
- rehomeMap.set(row.id, { to: canonicalId, candidateRow: row });
103048
- }
103049
- }
103050
- let rehomedNodeCount = 0;
102985
+ const rehomedNodeCount = 0;
103051
102986
  let prunedNodeCount = 0;
103052
102987
  this.db.transaction(() => {
103053
- for (const [staleId, { to: canonicalId, candidateRow }] of rehomeMap.entries()) {
103054
- const existingCanonical = nodeRows.find((r) => r.id === canonicalId);
103055
- if (!existingCanonical) {
103056
- this.db.query(`INSERT INTO nodes (
103057
- id, mesh_id, name, host_name, advertise_scope, broker_url, tailnet_name,
103058
- capabilities_json, labels_json, metadata_json, last_seen_at, registered_at
103059
- ) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12)
103060
- ON CONFLICT(id) DO UPDATE SET
103061
- last_seen_at = MAX(COALESCE(nodes.last_seen_at, 0), COALESCE(excluded.last_seen_at, 0)),
103062
- broker_url = COALESCE(excluded.broker_url, nodes.broker_url),
103063
- 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);
103064
- } else {
103065
- this.db.query(`UPDATE nodes SET
103066
- last_seen_at = MAX(COALESCE(last_seen_at, 0), COALESCE(?1, 0)),
103067
- broker_url = COALESCE(?2, broker_url)
103068
- WHERE id = ?3`).run(candidateRow.last_seen_at ?? null, candidateRow.broker_url ?? null, canonicalId);
103069
- }
103070
- this.db.query("UPDATE agents SET home_node_id = ?1 WHERE home_node_id = ?2").run(canonicalId, staleId);
103071
- this.db.query("UPDATE agents SET authority_node_id = ?1 WHERE authority_node_id = ?2").run(canonicalId, staleId);
103072
- this.db.query("UPDATE agent_endpoints SET node_id = ?1 WHERE node_id = ?2").run(canonicalId, staleId);
103073
- this.db.query("UPDATE runtime_sessions SET node_id = ?1 WHERE node_id = ?2").run(canonicalId, staleId);
103074
- this.db.query("UPDATE runtime_session_aliases SET node_id = ?1 WHERE node_id = ?2").run(canonicalId, staleId);
103075
- this.db.query("UPDATE conversations SET authority_node_id = ?1 WHERE authority_node_id = ?2").run(canonicalId, staleId);
103076
- this.db.query("UPDATE conversation_read_cursors SET reader_node_id = ?1 WHERE reader_node_id = ?2").run(canonicalId, staleId);
103077
- this.db.query("UPDATE messages SET origin_node_id = ?1 WHERE origin_node_id = ?2").run(canonicalId, staleId);
103078
- this.db.query("UPDATE deliveries SET target_node_id = ?1 WHERE target_node_id = ?2").run(canonicalId, staleId);
103079
- this.db.query("UPDATE invocations SET requester_node_id = ?1 WHERE requester_node_id = ?2").run(canonicalId, staleId);
103080
- this.db.query("UPDATE invocations SET target_node_id = ?1 WHERE target_node_id = ?2").run(canonicalId, staleId);
103081
- this.db.query("UPDATE thread_events SET authority_node_id = ?1 WHERE authority_node_id = ?2").run(canonicalId, staleId);
103082
- this.db.query("UPDATE thread_cursors SET authority_node_id = ?1 WHERE authority_node_id = ?2").run(canonicalId, staleId);
103083
- this.db.query("UPDATE trusted_peers SET node_id = ?1 WHERE node_id = ?2").run(canonicalId, staleId);
103084
- const delRes = this.db.query("DELETE FROM nodes WHERE id = ?1").run(staleId);
103085
- if ((delRes.changes ?? 0) > 0) {
103086
- prunedNodeCount++;
103087
- rehomedNodeCount++;
103088
- rehomedMappings.push({ from: staleId, to: canonicalId });
103089
- }
103090
- }
103091
- for (const peer of peerRows) {
103092
- if (peer.node_id) {
103093
- const canonical2 = canonicalMeshNodeId(peer.node_id);
103094
- if (canonical2 && canonical2 !== peer.node_id) {
103095
- this.db.query("UPDATE trusted_peers SET node_id = ?1 WHERE key_id = ?2").run(canonical2, peer.key_id);
103096
- }
103097
- }
103098
- }
103099
102988
  const remainingNodes = this.db.query("SELECT * FROM nodes").all();
103100
102989
  for (const row of remainingNodes) {
103101
102990
  if (row.id === options.localNodeId)
@@ -1803,12 +1803,6 @@ import {
1803
1803
  } from "fs";
1804
1804
  import { homedir as homedir3, hostname as osHostname } from "os";
1805
1805
  import { dirname, join as join3 } from "path";
1806
-
1807
- // packages/runtime/src/node-identity.ts
1808
- var NODE_CARD_TTL_MS = 24 * 60 * 60 * 1000;
1809
- var stableNodeQualifierCache = new Map;
1810
-
1811
- // packages/runtime/src/local-config.ts
1812
1806
  var LOCAL_CONFIG_VERSION = 1;
1813
1807
  var DEFAULT_SCOUT_WEB_PORTAL_HOST = "scout.local";
1814
1808
  var DEFAULT_SCOUT_WEB_DEV_HOST = `dev.${DEFAULT_SCOUT_WEB_PORTAL_HOST}`;
@@ -1803,12 +1803,6 @@ import {
1803
1803
  } from "fs";
1804
1804
  import { homedir as homedir3, hostname as osHostname } from "os";
1805
1805
  import { dirname, join as join3 } from "path";
1806
-
1807
- // packages/runtime/src/node-identity.ts
1808
- var NODE_CARD_TTL_MS = 24 * 60 * 60 * 1000;
1809
- var stableNodeQualifierCache = new Map;
1810
-
1811
- // packages/runtime/src/local-config.ts
1812
1806
  var LOCAL_CONFIG_VERSION = 1;
1813
1807
  var DEFAULT_SCOUT_WEB_PORTAL_HOST = "scout.local";
1814
1808
  var DEFAULT_SCOUT_WEB_DEV_HOST = `dev.${DEFAULT_SCOUT_WEB_PORTAL_HOST}`;