@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
@@ -14397,9 +14397,9 @@ var require_cjs11 = __commonJS((exports) => {
14397
14397
 
14398
14398
  // ../runtime/dist/broker-process-manager.js
14399
14399
  import { spawn as spawn2, spawnSync } from "node:child_process";
14400
- import { existsSync as existsSync6, mkdirSync as mkdirSync3, readFileSync as readFileSync4, renameSync as renameSync2, writeFileSync as writeFileSync3 } from "node:fs";
14400
+ import { existsSync as existsSync7, mkdirSync as mkdirSync4, readFileSync as readFileSync5, renameSync as renameSync3, writeFileSync as writeFileSync4 } from "node:fs";
14401
14401
  import { homedir as homedir5, networkInterfaces } from "node:os";
14402
- import { dirname as dirname3, join as join5, resolve as resolve2 } from "node:path";
14402
+ import { dirname as dirname4, join as join6, resolve as resolve2 } from "node:path";
14403
14403
  import { fileURLToPath } from "node:url";
14404
14404
 
14405
14405
  // ../runtime/dist/broker-api.js
@@ -14763,12 +14763,18 @@ import { existsSync as existsSync2, mkdirSync, rmSync, writeFileSync } from "nod
14763
14763
  import { homedir } from "node:os";
14764
14764
  import { join } from "node:path";
14765
14765
  var OPENSCOUT_RPC_CUTOVER_MARKER = "rpc-runtime-cutover-v1";
14766
+ function isTestRunnerProcess() {
14767
+ if (false)
14768
+ ;
14769
+ const entry = typeof Bun !== "undefined" ? Bun.main : process.argv[1] ?? "";
14770
+ return /[._](test|spec)\.[cm]?[jt]sx?$/.test(entry);
14771
+ }
14766
14772
  function assertTestIsolatedUserData(operation, isolationEnvKey) {
14767
- if (true)
14773
+ if (!isTestRunnerProcess())
14768
14774
  return;
14769
14775
  if (process.env[isolationEnvKey]?.trim())
14770
14776
  return;
14771
- 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).");
14777
+ 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).");
14772
14778
  }
14773
14779
  function resolveOpenScoutSupportPaths() {
14774
14780
  const home = homedir();
@@ -16218,9 +16224,202 @@ function readTailscaleSelfWebHostsSync(env = process.env) {
16218
16224
  }
16219
16225
 
16220
16226
  // ../runtime/dist/local-config.js
16221
- import { existsSync as existsSync4, mkdirSync as mkdirSync2, readFileSync as readFileSync3, renameSync, writeFileSync as writeFileSync2 } from "node:fs";
16227
+ import { existsSync as existsSync5, mkdirSync as mkdirSync3, readFileSync as readFileSync4, renameSync as renameSync2, writeFileSync as writeFileSync3 } from "node:fs";
16222
16228
  import { homedir as homedir3, hostname as osHostname } from "node:os";
16229
+ import { dirname as dirname2, join as join4 } from "node:path";
16230
+
16231
+ // ../runtime/dist/node-identity.js
16232
+ import { createHash, createPrivateKey, createPublicKey, generateKeyPairSync, randomBytes, sign, verify } from "node:crypto";
16233
+ import { chmodSync, existsSync as existsSync4, mkdirSync as mkdirSync2, readFileSync as readFileSync3, renameSync, rmSync as rmSync2, writeFileSync as writeFileSync2 } from "node:fs";
16223
16234
  import { dirname, join as join3 } from "node:path";
16235
+ var NODE_IDENTITY_FILE = "node-identity.json";
16236
+ var NODE_FINGERPRINT_PREFIX = "osc1";
16237
+ var NODE_CARD_TTL_MS = 24 * 60 * 60 * 1000;
16238
+ var stableNodeQualifierCache = new Map;
16239
+ function stripBonjourCollisionSuffix(value) {
16240
+ if (!value || typeof value !== "string")
16241
+ return "";
16242
+ let trimmed = value.trim();
16243
+ const isDotLocal = /\.local\.?$/i.test(trimmed);
16244
+ if (isDotLocal) {
16245
+ trimmed = trimmed.replace(/\.local\.?$/i, "");
16246
+ }
16247
+ const isHyphenLocalOpenscout = /-local-openscout$/i.test(trimmed);
16248
+ const isHyphenLocal = !isHyphenLocalOpenscout && /-local$/i.test(trimmed);
16249
+ if (isHyphenLocalOpenscout) {
16250
+ trimmed = trimmed.replace(/-local-openscout$/i, "");
16251
+ } else if (isHyphenLocal) {
16252
+ trimmed = trimmed.replace(/-local$/i, "");
16253
+ }
16254
+ if (!isDotLocal && !isHyphenLocalOpenscout && !isHyphenLocal) {
16255
+ return trimmed;
16256
+ }
16257
+ trimmed = trimmed.replace(/(?<=[a-zA-Z].*?)(?:-\d+)+$/, "");
16258
+ if (isDotLocal)
16259
+ return `${trimmed}.local`;
16260
+ if (isHyphenLocalOpenscout)
16261
+ return `${trimmed}-local-openscout`;
16262
+ if (isHyphenLocal)
16263
+ return `${trimmed}-local`;
16264
+ return trimmed;
16265
+ }
16266
+ function nodeIdentityPath(supportDirectory) {
16267
+ const dir = supportDirectory ?? resolveOpenScoutSupportPaths().supportDirectory;
16268
+ return join3(dir, NODE_IDENTITY_FILE);
16269
+ }
16270
+ function loadOrCreateNodeIdentity(supportDirectory) {
16271
+ const path = nodeIdentityPath(supportDirectory);
16272
+ if (existsSync4(path)) {
16273
+ return readAndValidateNodeIdentity(path);
16274
+ }
16275
+ return createNodeIdentity(supportDirectory);
16276
+ }
16277
+ function readStableNodeQualifier(supportDirectory) {
16278
+ const path = nodeIdentityPath(supportDirectory);
16279
+ const cached = stableNodeQualifierCache.get(path);
16280
+ if (cached) {
16281
+ return cached;
16282
+ }
16283
+ if (!existsSync4(path)) {
16284
+ return null;
16285
+ }
16286
+ const nodeQualifier = normalizeNodeQualifier(readAndValidateNodeIdentity(path).nodeQualifier);
16287
+ if (nodeQualifier) {
16288
+ stableNodeQualifierCache.set(path, nodeQualifier);
16289
+ }
16290
+ return nodeQualifier || null;
16291
+ }
16292
+ function readAndValidateNodeIdentity(path) {
16293
+ let parsed;
16294
+ try {
16295
+ parsed = JSON.parse(readFileSync3(path, "utf8"));
16296
+ } catch {
16297
+ throw new Error(`Corrupt node identity at ${path}; remove it to generate a fresh one.`);
16298
+ }
16299
+ if (parsed.version !== 1 || !parsed.publicKey || !parsed.privateKey) {
16300
+ throw new Error(`Corrupt node identity at ${path}; remove it to generate a fresh one.`);
16301
+ }
16302
+ if (parsed.nodeQualifier !== undefined && normalizePersistedNodeQualifier(parsed.nodeQualifier) !== parsed.nodeQualifier) {
16303
+ throw new Error(`Corrupt node identity at ${path}; remove it to generate a fresh one.`);
16304
+ }
16305
+ try {
16306
+ const derived = createPublicKey(importPrivateKey(parsed.privateKey)).export({ type: "spki", format: "der" }).toString("base64");
16307
+ if (derived !== parsed.publicKey) {
16308
+ throw new Error("mismatch");
16309
+ }
16310
+ } catch {
16311
+ throw new Error(`Node identity at ${path} has mismatched or invalid keys; remove it to generate a fresh one.`);
16312
+ }
16313
+ return parsed;
16314
+ }
16315
+ function normalizePersistedNodeQualifier(value) {
16316
+ return typeof value === "string" ? value.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/-+/g, "-").replace(/^-+|-+$/g, "") : "";
16317
+ }
16318
+ function normalizeNodeQualifier(value) {
16319
+ return stripBonjourCollisionSuffix(normalizePersistedNodeQualifier(value));
16320
+ }
16321
+ function createNodeIdentity(supportDirectory) {
16322
+ if (!supportDirectory) {
16323
+ assertTestIsolatedUserData("write the node identity", "OPENSCOUT_SUPPORT_DIRECTORY");
16324
+ }
16325
+ const path = nodeIdentityPath(supportDirectory);
16326
+ const { publicKey, privateKey } = generateKeyPairSync("ed25519");
16327
+ const identity = {
16328
+ version: 1,
16329
+ publicKey: publicKey.export({ type: "spki", format: "der" }).toString("base64"),
16330
+ privateKey: privateKey.export({ type: "pkcs8", format: "der" }).toString("base64"),
16331
+ createdAt: Date.now()
16332
+ };
16333
+ mkdirSync2(dirname(path), { recursive: true });
16334
+ try {
16335
+ writeFileSync2(path, `${JSON.stringify(identity, null, 2)}
16336
+ `, { encoding: "utf8", mode: 384, flag: "wx" });
16337
+ } catch (error) {
16338
+ if (error.code === "EEXIST") {
16339
+ return readAndValidateNodeIdentity(path);
16340
+ }
16341
+ throw error;
16342
+ }
16343
+ try {
16344
+ chmodSync(path, 384);
16345
+ } catch {}
16346
+ return identity;
16347
+ }
16348
+ function nodeKeyId(publicKeyBase64) {
16349
+ return createHash("sha256").update(Buffer.from(publicKeyBase64, "base64")).digest("hex");
16350
+ }
16351
+ function nodeFingerprint(publicKeyBase64) {
16352
+ const digest = createHash("sha256").update(Buffer.from(publicKeyBase64, "base64")).digest();
16353
+ const encoded = base32Encode(digest.subarray(0, 10)).toLowerCase();
16354
+ return `${NODE_FINGERPRINT_PREFIX}:${encoded.slice(0, 4)}-${encoded.slice(4, 8)}`;
16355
+ }
16356
+ function signNodePayload(identity, payload) {
16357
+ const key = importPrivateKey(identity.privateKey);
16358
+ return sign(null, typeof payload === "string" ? Buffer.from(payload, "utf8") : payload, key).toString("base64");
16359
+ }
16360
+ function verifyNodeSignature(publicKeyBase64, payload, signatureBase64) {
16361
+ try {
16362
+ const key = importPublicKey(publicKeyBase64);
16363
+ return verify(null, typeof payload === "string" ? Buffer.from(payload, "utf8") : payload, key, Buffer.from(signatureBase64, "base64"));
16364
+ } catch {
16365
+ return false;
16366
+ }
16367
+ }
16368
+ function canonicalJson(value) {
16369
+ if (value === null || typeof value !== "object") {
16370
+ return JSON.stringify(value);
16371
+ }
16372
+ if (Array.isArray(value)) {
16373
+ return `[${value.map(canonicalJson).join(",")}]`;
16374
+ }
16375
+ const record = value;
16376
+ const keys = Object.keys(record).sort();
16377
+ return `{${keys.map((key) => `${JSON.stringify(key)}:${canonicalJson(record[key])}`).join(",")}}`;
16378
+ }
16379
+ function verifySignedNodeCard(card, now = Date.now()) {
16380
+ if (nodeKeyId(card.publicKey) !== card.keyId) {
16381
+ return false;
16382
+ }
16383
+ if (nodeFingerprint(card.publicKey) !== card.fingerprint) {
16384
+ return false;
16385
+ }
16386
+ if (!Number.isFinite(card.expiresAt) || card.expiresAt <= now) {
16387
+ return false;
16388
+ }
16389
+ if (card.tls !== undefined) {
16390
+ if (typeof card.tls !== "object" || card.tls === null || typeof card.tls.spkiFingerprint !== "string" || !/^[0-9a-f]{64}$/.test(card.tls.spkiFingerprint)) {
16391
+ return false;
16392
+ }
16393
+ }
16394
+ const { signature, ...unsigned } = card;
16395
+ return verifyNodeSignature(card.publicKey, canonicalJson(unsigned), signature);
16396
+ }
16397
+ var BASE32_ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
16398
+ function base32Encode(input) {
16399
+ let bits = 0;
16400
+ let value = 0;
16401
+ let output = "";
16402
+ for (const byte of input) {
16403
+ value = value << 8 | byte;
16404
+ bits += 8;
16405
+ while (bits >= 5) {
16406
+ output += BASE32_ALPHABET[value >>> bits - 5 & 31];
16407
+ bits -= 5;
16408
+ }
16409
+ }
16410
+ if (bits > 0) {
16411
+ output += BASE32_ALPHABET[value << 5 - bits & 31];
16412
+ }
16413
+ return output;
16414
+ }
16415
+ function importPrivateKey(privateKeyBase64) {
16416
+ return createPrivateKey({ key: Buffer.from(privateKeyBase64, "base64"), format: "der", type: "pkcs8" });
16417
+ }
16418
+ function importPublicKey(publicKeyBase64) {
16419
+ return createPublicKey({ key: Buffer.from(publicKeyBase64, "base64"), format: "der", type: "spki" });
16420
+ }
16421
+
16422
+ // ../runtime/dist/local-config.js
16224
16423
  var LOCAL_CONFIG_VERSION = 1;
16225
16424
  var DEFAULT_SCOUT_WEB_PORTAL_HOST = "scout.local";
16226
16425
  var DEFAULT_SCOUT_WEB_DEV_HOST = `dev.${DEFAULT_SCOUT_WEB_PORTAL_HOST}`;
@@ -16245,17 +16444,17 @@ var DEFAULT_LOCAL_CONFIG = {
16245
16444
  }
16246
16445
  };
16247
16446
  function localConfigHome() {
16248
- return process.env.OPENSCOUT_HOME ?? join3(homedir3(), ".openscout");
16447
+ return process.env.OPENSCOUT_HOME ?? join4(homedir3(), ".openscout");
16249
16448
  }
16250
16449
  function localConfigPath() {
16251
- return join3(localConfigHome(), "config.json");
16450
+ return join4(localConfigHome(), "config.json");
16252
16451
  }
16253
16452
  function loadLocalConfig() {
16254
16453
  const configPath = localConfigPath();
16255
- if (!existsSync4(configPath))
16454
+ if (!existsSync5(configPath))
16256
16455
  return { version: LOCAL_CONFIG_VERSION };
16257
16456
  try {
16258
- return validateLocalConfig(JSON.parse(readFileSync3(configPath, "utf8")));
16457
+ return validateLocalConfig(JSON.parse(readFileSync4(configPath, "utf8")));
16259
16458
  } catch {
16260
16459
  return { version: LOCAL_CONFIG_VERSION };
16261
16460
  }
@@ -16333,34 +16532,34 @@ function resolveBrokerPort() {
16333
16532
  function writeLocalConfig(config) {
16334
16533
  assertTestIsolatedUserData("write the OpenScout local config", "OPENSCOUT_HOME");
16335
16534
  const configPath = localConfigPath();
16336
- mkdirSync2(dirname(configPath), { recursive: true });
16535
+ mkdirSync3(dirname2(configPath), { recursive: true });
16337
16536
  const body = JSON.stringify({ ...config, version: LOCAL_CONFIG_VERSION }, null, 2) + `
16338
16537
  `;
16339
16538
  const tmp = `${configPath}.tmp`;
16340
- writeFileSync2(tmp, body, "utf8");
16341
- renameSync(tmp, configPath);
16539
+ writeFileSync3(tmp, body, "utf8");
16540
+ renameSync2(tmp, configPath);
16342
16541
  }
16343
16542
  function localConfigExists() {
16344
- return existsSync4(localConfigPath());
16543
+ return existsSync5(localConfigPath());
16345
16544
  }
16346
16545
 
16347
16546
  // ../runtime/dist/tool-resolution.js
16348
- import { accessSync, constants, existsSync as existsSync5 } from "node:fs";
16547
+ import { accessSync, constants, existsSync as existsSync6 } from "node:fs";
16349
16548
  import { homedir as homedir4 } from "node:os";
16350
- import { basename, dirname as dirname2, join as join4, resolve } from "node:path";
16549
+ import { basename, dirname as dirname3, join as join5, resolve } from "node:path";
16351
16550
  var DEFAULT_COMMON_EXECUTABLE_DIRECTORIES = [
16352
- join4(homedir4(), ".bun", "bin"),
16551
+ join5(homedir4(), ".bun", "bin"),
16353
16552
  "/opt/homebrew/bin",
16354
16553
  "/usr/local/bin"
16355
16554
  ];
16356
16555
  function commonClaudeExecutableDirectories(env) {
16357
16556
  const home = env.HOME ?? homedir4();
16358
16557
  return [
16359
- join4(home, ".local", "bin"),
16360
- join4(home, ".claude", "local"),
16558
+ join5(home, ".local", "bin"),
16559
+ join5(home, ".claude", "local"),
16361
16560
  "/opt/homebrew/bin",
16362
16561
  "/usr/local/bin",
16363
- join4(home, ".bun", "bin")
16562
+ join5(home, ".bun", "bin")
16364
16563
  ];
16365
16564
  }
16366
16565
  function expandHomePath(value, env = process.env) {
@@ -16369,7 +16568,7 @@ function expandHomePath(value, env = process.env) {
16369
16568
  return home;
16370
16569
  }
16371
16570
  if (value.startsWith("~/")) {
16372
- return join4(home, value.slice(2));
16571
+ return join5(home, value.slice(2));
16373
16572
  }
16374
16573
  return value;
16375
16574
  }
@@ -16426,7 +16625,7 @@ function resolveExecutableFromSearch(options) {
16426
16625
  ], env);
16427
16626
  for (const directory of searchDirectories) {
16428
16627
  for (const name of options.names) {
16429
- const candidate = join4(directory, name);
16628
+ const candidate = join5(directory, name);
16430
16629
  if (isExecutablePath(candidate)) {
16431
16630
  return {
16432
16631
  path: candidate,
@@ -16440,7 +16639,7 @@ function resolveExecutableFromSearch(options) {
16440
16639
  function resolveExecutableFromDirectories(directories, names, env, source) {
16441
16640
  for (const directory of dedupeDirectories(directories, env)) {
16442
16641
  for (const name of names) {
16443
- const candidate = join4(directory, name);
16642
+ const candidate = join5(directory, name);
16444
16643
  if (isExecutablePath(candidate)) {
16445
16644
  return { path: candidate, source };
16446
16645
  }
@@ -16478,7 +16677,7 @@ function findExecutableOnSearchPath(name, env) {
16478
16677
  ...DEFAULT_COMMON_EXECUTABLE_DIRECTORIES
16479
16678
  ], env);
16480
16679
  for (const directory of searchDirectories) {
16481
- const candidate = join4(directory, name);
16680
+ const candidate = join5(directory, name);
16482
16681
  if (isExecutablePath(candidate)) {
16483
16682
  return { path: candidate, source: "path" };
16484
16683
  }
@@ -16496,14 +16695,14 @@ var DEFAULT_ADVERTISE_SCOPE = "local";
16496
16695
  var MESH_BIND_CONFIG_FILE = "mesh-bind.json";
16497
16696
  function meshBindConfigPath(supportDirectory) {
16498
16697
  const dir = supportDirectory ?? resolveOpenScoutSupportPaths().supportDirectory;
16499
- return join5(dir, MESH_BIND_CONFIG_FILE);
16698
+ return join6(dir, MESH_BIND_CONFIG_FILE);
16500
16699
  }
16501
16700
  function readPersistedAdvertiseScope(supportDirectory) {
16502
16701
  const path = meshBindConfigPath(supportDirectory);
16503
- if (!existsSync6(path))
16702
+ if (!existsSync7(path))
16504
16703
  return null;
16505
16704
  try {
16506
- const parsed = JSON.parse(readFileSync4(path, "utf8"));
16705
+ const parsed = JSON.parse(readFileSync5(path, "utf8"));
16507
16706
  if (parsed.version !== 1)
16508
16707
  return null;
16509
16708
  if (parsed.advertiseScope === "mesh" || parsed.advertiseScope === "local") {
@@ -16549,13 +16748,13 @@ function resolveBrokerUrl(host, port, scope, env = process.env, lanHost = findLa
16549
16748
  return explicit;
16550
16749
  }
16551
16750
  if (scope === "mesh") {
16751
+ if (lanHost) {
16752
+ return buildDefaultBrokerHttpsUrl(lanHost, port);
16753
+ }
16552
16754
  const tailnetHost = readTailscaleSelfWebHostsSync(env)[0];
16553
16755
  if (tailnetHost) {
16554
16756
  return buildDefaultBrokerHttpsUrl(tailnetHost, port);
16555
16757
  }
16556
- if (lanHost) {
16557
- return buildDefaultBrokerHttpsUrl(lanHost, port);
16558
- }
16559
16758
  }
16560
16759
  return buildDefaultBrokerUrl(host, port);
16561
16760
  }
@@ -16622,7 +16821,7 @@ function isWildcardHost(host) {
16622
16821
  return trimmed === "0.0.0.0" || trimmed === "::" || trimmed === "[::]";
16623
16822
  }
16624
16823
  function buildDefaultBrokerSocketPath(runtimeDirectory) {
16625
- return join5(runtimeDirectory, "broker.sock");
16824
+ return join6(runtimeDirectory, "broker.sock");
16626
16825
  }
16627
16826
  var DEFAULT_BROKER_URL = buildDefaultBrokerUrl();
16628
16827
  function resolveScoutBrokerControlUrl(_config = resolveBrokerServiceConfig()) {
@@ -16641,17 +16840,17 @@ function runtimePackageDir() {
16641
16840
  const fromGlobal = findGlobalRuntimeDir();
16642
16841
  if (fromGlobal)
16643
16842
  return fromGlobal;
16644
- const moduleDir = dirname3(fileURLToPath(import.meta.url));
16843
+ const moduleDir = dirname4(fileURLToPath(import.meta.url));
16645
16844
  return resolve2(moduleDir, "..");
16646
16845
  }
16647
16846
  function isInstalledRuntimePackageDir(candidate) {
16648
- return existsSync6(join5(candidate, "package.json")) && existsSync6(join5(candidate, "bin", "openscout-runtime.mjs"));
16847
+ return existsSync7(join6(candidate, "package.json")) && existsSync7(join6(candidate, "bin", "openscout-runtime.mjs"));
16649
16848
  }
16650
16849
  function findGlobalRuntimeDir() {
16651
16850
  const candidates = [
16652
- join5(homedir5(), ".bun", "node_modules", "@openscout", "runtime"),
16653
- join5(homedir5(), ".bun", "install", "global", "node_modules", "@openscout", "runtime"),
16654
- join5(homedir5(), ".bun", "install", "global", "node_modules", "@openscout", "scout", "node_modules", "@openscout", "runtime")
16851
+ join6(homedir5(), ".bun", "node_modules", "@openscout", "runtime"),
16852
+ join6(homedir5(), ".bun", "install", "global", "node_modules", "@openscout", "runtime"),
16853
+ join6(homedir5(), ".bun", "install", "global", "node_modules", "@openscout", "scout", "node_modules", "@openscout", "runtime")
16655
16854
  ];
16656
16855
  for (const c of candidates) {
16657
16856
  if (isInstalledRuntimePackageDir(c))
@@ -16664,7 +16863,7 @@ function findGlobalRuntimeDir() {
16664
16863
  const scoutPkg = resolve2(scoutBin, "..", "..");
16665
16864
  if (isInstalledRuntimePackageDir(scoutPkg))
16666
16865
  return scoutPkg;
16667
- const nested = join5(scoutPkg, "node_modules", "@openscout", "runtime");
16866
+ const nested = join6(scoutPkg, "node_modules", "@openscout", "runtime");
16668
16867
  if (isInstalledRuntimePackageDir(nested))
16669
16868
  return nested;
16670
16869
  const sibling = resolve2(scoutPkg, "..", "runtime");
@@ -16675,7 +16874,7 @@ function findGlobalRuntimeDir() {
16675
16874
  return null;
16676
16875
  }
16677
16876
  function findBundledRuntimeDir() {
16678
- const moduleDir = dirname3(fileURLToPath(import.meta.url));
16877
+ const moduleDir = dirname4(fileURLToPath(import.meta.url));
16679
16878
  return resolveBundledRuntimeDirFromModuleDir(moduleDir);
16680
16879
  }
16681
16880
  function resolveBundledRuntimeDirFromModuleDir(moduleDir) {
@@ -16692,11 +16891,11 @@ function resolveBundledRuntimeDirFromModuleDir(moduleDir) {
16692
16891
  function findWorkspaceRuntimeDir(startDir) {
16693
16892
  let current = resolve2(startDir);
16694
16893
  while (true) {
16695
- const candidate = join5(current, "packages", "runtime");
16696
- if (existsSync6(join5(candidate, "package.json")) && existsSync6(join5(candidate, "src"))) {
16894
+ const candidate = join6(current, "packages", "runtime");
16895
+ if (existsSync7(join6(candidate, "package.json")) && existsSync7(join6(candidate, "src"))) {
16697
16896
  return candidate;
16698
16897
  }
16699
- const parent = dirname3(current);
16898
+ const parent = dirname4(current);
16700
16899
  if (parent === current)
16701
16900
  return null;
16702
16901
  current = parent;
@@ -16743,17 +16942,17 @@ function resolveBrokerServiceConfig() {
16743
16942
  const serviceAdapter = resolveBrokerServiceAdapter();
16744
16943
  const uid = typeof process.getuid === "function" ? process.getuid() : Number.parseInt(process.env.UID ?? "0", 10);
16745
16944
  const supportPaths = resolveOpenScoutSupportPaths();
16746
- const defaultSupportDir = join5(homedir5(), "Library", "Application Support", "OpenScout");
16945
+ const defaultSupportDir = join6(homedir5(), "Library", "Application Support", "OpenScout");
16747
16946
  const supportDirectory = isTmpPath(supportPaths.supportDirectory) ? defaultSupportDir : supportPaths.supportDirectory;
16748
- const runtimeDirectory = join5(supportDirectory, "runtime");
16749
- const logsDirectory = join5(supportDirectory, "logs", "broker");
16750
- const controlHome = isTmpPath(supportPaths.controlHome) ? join5(homedir5(), ".openscout", "control-plane") : supportPaths.controlHome;
16947
+ const runtimeDirectory = join6(supportDirectory, "runtime");
16948
+ const logsDirectory = join6(supportDirectory, "logs", "broker");
16949
+ const controlHome = isTmpPath(supportPaths.controlHome) ? join6(homedir5(), ".openscout", "control-plane") : supportPaths.controlHome;
16751
16950
  const advertiseScope = resolveAdvertiseScope(process.env, () => readPersistedAdvertiseScope(supportDirectory));
16752
16951
  const brokerHost = resolveBrokerHost(advertiseScope);
16753
16952
  const brokerPort = Number.parseInt(process.env.OPENSCOUT_BROKER_PORT ?? String(resolveBrokerPort()), 10);
16754
16953
  const brokerUrl = resolveBrokerUrl(brokerHost, brokerPort, advertiseScope);
16755
16954
  const brokerSocketPath = process.env.OPENSCOUT_BROKER_SOCKET_PATH ?? buildDefaultBrokerSocketPath(runtimeDirectory);
16756
- const launchAgentPath = join5(homedir5(), "Library", "LaunchAgents", `${label}.plist`);
16955
+ const launchAgentPath = join6(homedir5(), "Library", "LaunchAgents", `${label}.plist`);
16757
16956
  return {
16758
16957
  label,
16759
16958
  mode,
@@ -16764,8 +16963,8 @@ function resolveBrokerServiceConfig() {
16764
16963
  supportDirectory,
16765
16964
  runtimeDirectory,
16766
16965
  logsDirectory,
16767
- stdoutLogPath: join5(logsDirectory, "stdout.log"),
16768
- stderrLogPath: join5(logsDirectory, "stderr.log"),
16966
+ stdoutLogPath: join6(logsDirectory, "stdout.log"),
16967
+ stderrLogPath: join6(logsDirectory, "stderr.log"),
16769
16968
  controlHome,
16770
16969
  runtimePackageDir: runtimePackageDir(),
16771
16970
  bunExecutable: serviceAdapter === "macos-scoutd" ? resolveBunExecutable2() : resolveOptionalBunExecutable(),
@@ -16799,10 +16998,10 @@ function resolveEnvExecutable(value) {
16799
16998
  function findWorkspaceRootFromRuntimeDir(runtimePackageDir2) {
16800
16999
  let current = resolve2(runtimePackageDir2);
16801
17000
  while (true) {
16802
- if (existsSync6(join5(current, "Cargo.toml")) && existsSync6(join5(current, "crates", "scoutd", "Cargo.toml"))) {
17001
+ if (existsSync7(join6(current, "Cargo.toml")) && existsSync7(join6(current, "crates", "scoutd", "Cargo.toml"))) {
16803
17002
  return current;
16804
17003
  }
16805
- const parent = dirname3(current);
17004
+ const parent = dirname4(current);
16806
17005
  if (parent === current)
16807
17006
  return null;
16808
17007
  current = parent;
@@ -16819,13 +17018,13 @@ function resolveScoutdCommand(config = resolveBrokerServiceConfig()) {
16819
17018
  }
16820
17019
  const workspaceRoot = findWorkspaceRootFromRuntimeDir(config.runtimePackageDir);
16821
17020
  const packageCandidates = [
16822
- join5(config.runtimePackageDir, "bin", "scoutd"),
16823
- join5(config.runtimePackageDir, "native", "scoutd"),
16824
- join5(config.runtimePackageDir, "scoutd"),
16825
- workspaceRoot ? join5(workspaceRoot, "packages", "cli", "bin", "scoutd") : null,
16826
- workspaceRoot ? join5(workspaceRoot, "packages", "runtime", "bin", "scoutd") : null,
16827
- join5(config.runtimeDirectory, "scoutd"),
16828
- join5(dirname3(config.runtimePackageDir), "scout", "bin", "scoutd")
17021
+ join6(config.runtimePackageDir, "bin", "scoutd"),
17022
+ join6(config.runtimePackageDir, "native", "scoutd"),
17023
+ join6(config.runtimePackageDir, "scoutd"),
17024
+ workspaceRoot ? join6(workspaceRoot, "packages", "cli", "bin", "scoutd") : null,
17025
+ workspaceRoot ? join6(workspaceRoot, "packages", "runtime", "bin", "scoutd") : null,
17026
+ join6(config.runtimeDirectory, "scoutd"),
17027
+ join6(dirname4(config.runtimePackageDir), "scout", "bin", "scoutd")
16829
17028
  ];
16830
17029
  for (const candidate of packageCandidates) {
16831
17030
  const resolved = executableCandidate(candidate);
@@ -16839,8 +17038,8 @@ function resolveScoutdCommand(config = resolveBrokerServiceConfig()) {
16839
17038
  }
16840
17039
  if (workspaceRoot && workspaceScoutdAllowed()) {
16841
17040
  for (const candidate of [
16842
- join5(workspaceRoot, "target", "release", "scoutd"),
16843
- join5(workspaceRoot, "target", "debug", "scoutd")
17041
+ join6(workspaceRoot, "target", "release", "scoutd"),
17042
+ join6(workspaceRoot, "target", "debug", "scoutd")
16844
17043
  ]) {
16845
17044
  const resolved = executableCandidate(candidate);
16846
17045
  if (resolved) {
@@ -16925,7 +17124,7 @@ function normalizeNativeServiceStatus(input, config) {
16925
17124
  const healthMeshId = readString2(healthRecord.meshId);
16926
17125
  const healthSocketFallbackError = readString2(healthRecord.socketFallbackError);
16927
17126
  const healthCounts = isRecord3(healthRecord.counts) ? healthRecord.counts : undefined;
16928
- const installed = readBoolean(input.installed) ?? existsSync6(config.launchAgentPath);
17127
+ const installed = readBoolean(input.installed) ?? existsSync7(config.launchAgentPath);
16929
17128
  const loaded = readBoolean(input.loaded) ?? false;
16930
17129
  const stdoutLogPath = readString2(input.stdoutLogPath) ?? config.stdoutLogPath;
16931
17130
  const stderrLogPath = readString2(input.stderrLogPath) ?? config.stderrLogPath;
@@ -17046,8 +17245,8 @@ var SCHEMA_GUARDED_SERVICE_COMMANDS = new Set([
17046
17245
  "restart"
17047
17246
  ]);
17048
17247
  function assertBrokerServiceSchemaCompatible(config) {
17049
- const databasePath = join5(config.controlHome, "control-plane.sqlite");
17050
- if (!existsSync6(databasePath))
17248
+ const databasePath = join6(config.controlHome, "control-plane.sqlite");
17249
+ if (!existsSync7(databasePath))
17051
17250
  return;
17052
17251
  const database = openControlPlaneSqliteDatabase(databasePath, { readonly: true });
17053
17252
  try {
@@ -17080,7 +17279,7 @@ async function runScoutdServiceCommand(command, config, timeoutMs = SCOUTD_DEFAU
17080
17279
  function readCoreAgentsSync() {
17081
17280
  try {
17082
17281
  const settingsPath = resolveOpenScoutSupportPaths().settingsPath;
17083
- const raw = readFileSync4(settingsPath, "utf8");
17282
+ const raw = readFileSync5(settingsPath, "utf8");
17084
17283
  const settings = JSON.parse(raw);
17085
17284
  const raw_agents = settings?.agents?.coreAgents;
17086
17285
  if (Array.isArray(raw_agents)) {
@@ -17093,10 +17292,10 @@ function bootoutCommand(config) {
17093
17292
  return `/bin/launchctl bootout ${config.serviceTarget}`;
17094
17293
  }
17095
17294
  function readLogLines(path) {
17096
- if (!existsSync6(path)) {
17295
+ if (!existsSync7(path)) {
17097
17296
  return [];
17098
17297
  }
17099
- return readFileSync4(path, "utf8").split(`
17298
+ return readFileSync5(path, "utf8").split(`
17100
17299
  `).map((line) => line.trim()).filter(Boolean);
17101
17300
  }
17102
17301
  function isPackageScriptBanner(line) {
@@ -17320,15 +17519,15 @@ if (process.argv[1] && fileURLToPath(import.meta.url) === process.argv[1] && !pr
17320
17519
 
17321
17520
  // ../runtime/dist/harness-catalog.js
17322
17521
  import { execFileSync as execFileSync3 } from "node:child_process";
17323
- import { existsSync as existsSync7, statSync } from "node:fs";
17522
+ import { existsSync as existsSync8, statSync } from "node:fs";
17324
17523
  import { mkdir, readFile as readFile2, writeFile } from "node:fs/promises";
17325
17524
  import { homedir as homedir6 } from "node:os";
17326
- import { dirname as dirname4, join as join7 } from "node:path";
17525
+ import { dirname as dirname5, join as join8 } from "node:path";
17327
17526
 
17328
17527
  // ../agent-sessions/dist/codex-executable.js
17329
17528
  import { execFileSync as execFileSync2 } from "node:child_process";
17330
17529
  import { accessSync as accessSync2, constants as constants2 } from "node:fs";
17331
- import { delimiter, join as join6 } from "node:path";
17530
+ import { delimiter, join as join7 } from "node:path";
17332
17531
  function isExecutable(filePath) {
17333
17532
  if (!filePath)
17334
17533
  return false;
@@ -17372,11 +17571,11 @@ function codexAppBundleCandidates(env) {
17372
17571
  const appNames = ["Codex.app", "ChatGPT.app"];
17373
17572
  const candidates = appNames.flatMap((appName) => [
17374
17573
  {
17375
- path: join6("/Applications", appName, "Contents", "Resources", "codex"),
17574
+ path: join7("/Applications", appName, "Contents", "Resources", "codex"),
17376
17575
  source: "codex_app_bundle"
17377
17576
  },
17378
17577
  {
17379
- path: join6(env.HOME ?? "", "Applications", appName, "Contents", "Resources", "codex"),
17578
+ path: join7(env.HOME ?? "", "Applications", appName, "Contents", "Resources", "codex"),
17380
17579
  source: "codex_app_bundle"
17381
17580
  }
17382
17581
  ]);
@@ -17384,7 +17583,7 @@ function codexAppBundleCandidates(env) {
17384
17583
  }
17385
17584
  function pathCandidates(env) {
17386
17585
  return (env.PATH ?? "").split(delimiter).filter(Boolean).map((directory) => ({
17387
- path: join6(directory, "codex"),
17586
+ path: join7(directory, "codex"),
17388
17587
  source: "path"
17389
17588
  }));
17390
17589
  }
@@ -17395,7 +17594,7 @@ function commonCandidates(env) {
17395
17594
  "/opt/homebrew/bin",
17396
17595
  "/usr/local/bin"
17397
17596
  ].filter(Boolean).map((directory) => ({
17398
- path: join6(directory, "codex"),
17597
+ path: join7(directory, "codex"),
17399
17598
  source: "common"
17400
17599
  }));
17401
17600
  }
@@ -17880,6 +18079,7 @@ var BUILT_IN_HARNESS_CATALOG = [
17880
18079
  {
17881
18080
  name: "opencode",
17882
18081
  harness: "opencode",
18082
+ aliases: ["oc", "opencode2"],
17883
18083
  label: "OpenCode",
17884
18084
  description: "OpenCode's coding agent over ACP, fronting many model vendors via OpenCode Zen",
17885
18085
  homepage: "https://opencode.ai/docs/",
@@ -18030,7 +18230,7 @@ function expandHomePath2(value) {
18030
18230
  if (value === "~")
18031
18231
  return home;
18032
18232
  if (value.startsWith("~/"))
18033
- return join7(home, value.slice(2));
18233
+ return join8(home, value.slice(2));
18034
18234
  return value;
18035
18235
  }
18036
18236
  function defaultWhichBinary(binary, platform) {
@@ -18064,7 +18264,7 @@ function defaultRunCommand(command, platform) {
18064
18264
  }
18065
18265
  function defaultRequirementExists(requirement) {
18066
18266
  const expanded = expandHomePath2(requirement.path);
18067
- if (!existsSync7(expanded))
18267
+ if (!existsSync8(expanded))
18068
18268
  return false;
18069
18269
  if (requirement.fileType === "any" || !requirement.fileType)
18070
18270
  return true;
@@ -18146,6 +18346,7 @@ function codexCandidateReport(candidate, selectedPath) {
18146
18346
  function createBuiltInHarnessCatalog() {
18147
18347
  return BUILT_IN_HARNESS_CATALOG.map((entry) => ({
18148
18348
  ...entry,
18349
+ aliases: entry.aliases ? [...entry.aliases] : undefined,
18149
18350
  tags: [...entry.tags],
18150
18351
  support: { ...entry.support },
18151
18352
  install: entry.install ? { ...entry.install, requires: [...entry.install.requires ?? []] } : undefined,
@@ -18292,7 +18493,7 @@ async function readHarnessCatalogOverrides(overridePath = resolveOpenScoutSuppor
18292
18493
  }
18293
18494
  }
18294
18495
  async function writeHarnessCatalogOverrides(overrides, overridePath = resolveOpenScoutSupportPaths().harnessCatalogPath) {
18295
- await mkdir(dirname4(overridePath), { recursive: true });
18496
+ await mkdir(dirname5(overridePath), { recursive: true });
18296
18497
  const payload = {
18297
18498
  version: HARNESS_CATALOG_VERSION,
18298
18499
  entries: overrides,
@@ -18302,7 +18503,7 @@ async function writeHarnessCatalogOverrides(overrides, overridePath = resolveOpe
18302
18503
  `, "utf8");
18303
18504
  }
18304
18505
  async function ensureHarnessCatalogOverrideFile(overridePath = resolveOpenScoutSupportPaths().harnessCatalogPath) {
18305
- if (existsSync7(overridePath))
18506
+ if (existsSync8(overridePath))
18306
18507
  return;
18307
18508
  await writeHarnessCatalogOverrides({}, overridePath);
18308
18509
  }
@@ -19337,7 +19538,8 @@ function canonicalizeIdentity(input) {
19337
19538
  const definitionId = normalizeAgentIdentitySegment(input.definitionId);
19338
19539
  const workspaceQualifier = input.workspaceQualifier ? normalizeAgentIdentitySegment(input.workspaceQualifier) : undefined;
19339
19540
  const profile = input.profile ? normalizeAgentIdentitySegment(input.profile) : undefined;
19340
- const harness = input.harness ? normalizeAgentIdentitySegment(input.harness) : undefined;
19541
+ const rawHarness = input.harness ? normalizeAgentIdentitySegment(input.harness) : undefined;
19542
+ const harness = rawHarness === "oc" ? "opencode" : rawHarness;
19341
19543
  const model = input.model ? normalizeAgentIdentitySegment(input.model) : undefined;
19342
19544
  const nodeQualifier = input.nodeQualifier ? normalizeAgentIdentitySegment(input.nodeQualifier) : undefined;
19343
19545
  if (!definitionId) {
@@ -19764,6 +19966,21 @@ function normalizeScoutPermissionProfile(value) {
19764
19966
  return SCOUT_PERMISSION_PROFILES.find((profile) => profile === normalized);
19765
19967
  }
19766
19968
 
19969
+ // ../protocol/dist/presence.js
19970
+ var PRESENCE_STALE_AFTER_MS = 45000;
19971
+ var PRESENCE_GONE_AFTER_STALE_MS = 60000;
19972
+ function presenceLifecycle(beat, now, options = {}) {
19973
+ if (now < beat.staleAt)
19974
+ return "fresh";
19975
+ const goneAfterStaleMs = options.goneAfterStaleMs ?? PRESENCE_GONE_AFTER_STALE_MS;
19976
+ if (now < beat.staleAt + goneAfterStaleMs)
19977
+ return "stale";
19978
+ return "gone";
19979
+ }
19980
+ function isPresenceGone(beat, now, options = {}) {
19981
+ return presenceLifecycle(beat, now, options) === "gone";
19982
+ }
19983
+
19767
19984
  // ../protocol/dist/runtime-catalog.generated.js
19768
19985
  var SCOUT_RUNTIME_CATALOG_DATA = {
19769
19986
  schemaVersion: "openscout.runtime-catalog.v1",
@@ -20210,7 +20427,9 @@ var SCOUT_RESERVED_RUNTIME_PROFILE_IDS = [
20210
20427
  "fable",
20211
20428
  "kimi",
20212
20429
  "grok",
20213
- "opus"
20430
+ "opus",
20431
+ "oc",
20432
+ "opencode"
20214
20433
  ];
20215
20434
 
20216
20435
  // ../protocol/dist/runtime-catalog.js
@@ -20608,22 +20827,22 @@ function validateScoutRendezvousCodename(codename) {
20608
20827
 
20609
20828
  // ../runtime/dist/claude-statusline.js
20610
20829
  import { appendFile, mkdir as mkdir2, readFile as readFile3, writeFile as writeFile2 } from "node:fs/promises";
20611
- import { basename as basename2, dirname as dirname5, join as join8 } from "node:path";
20830
+ import { basename as basename2, dirname as dirname6, join as join9 } from "node:path";
20612
20831
  function resolveClaudeStatuslineDirectory() {
20613
- return join8(resolveOpenScoutSupportPaths().runtimeDirectory, "statusline");
20832
+ return join9(resolveOpenScoutSupportPaths().runtimeDirectory, "statusline");
20614
20833
  }
20615
20834
  function resolveClaudeStatuslineDelegatePath() {
20616
- return join8(resolveClaudeStatuslineDirectory(), "claude-delegate.json");
20835
+ return join9(resolveClaudeStatuslineDirectory(), "claude-delegate.json");
20617
20836
  }
20618
20837
  function resolveClaudeStatuslineWrapperPath() {
20619
- return join8(resolveClaudeStatuslineDirectory(), "claude-statusline.sh");
20838
+ return join9(resolveClaudeStatuslineDirectory(), "claude-statusline.sh");
20620
20839
  }
20621
20840
  async function writeClaudeStatuslineDelegate(delegate, path = resolveClaudeStatuslineDelegatePath()) {
20622
20841
  const next = {
20623
20842
  version: 1,
20624
20843
  ...delegate
20625
20844
  };
20626
- await mkdir2(dirname5(path), { recursive: true });
20845
+ await mkdir2(dirname6(path), { recursive: true });
20627
20846
  await writeFile2(path, JSON.stringify(next, null, 2) + `
20628
20847
  `, "utf8");
20629
20848
  return next;
@@ -20638,9 +20857,9 @@ function isOpenScoutClaudeStatuslineCommand(command, wrapperPath = resolveClaude
20638
20857
  }
20639
20858
 
20640
20859
  // ../runtime/dist/managed-installs.js
20641
- import { createHash } from "node:crypto";
20860
+ import { createHash as createHash2 } from "node:crypto";
20642
20861
  import { mkdir as mkdir3, readFile as readFile4, writeFile as writeFile3 } from "node:fs/promises";
20643
- import { dirname as dirname6 } from "node:path";
20862
+ import { dirname as dirname7 } from "node:path";
20644
20863
  function emptyManagedInstallsFile(now = Date.now()) {
20645
20864
  return {
20646
20865
  version: 1,
@@ -20657,7 +20876,7 @@ function stableInstallId(input) {
20657
20876
  input.provider ?? "",
20658
20877
  input.targetPath ?? ""
20659
20878
  ].join("\x00");
20660
- return `install.${createHash("sha256").update(key).digest("hex").slice(0, 18)}`;
20879
+ return `install.${createHash2("sha256").update(key).digest("hex").slice(0, 18)}`;
20661
20880
  }
20662
20881
  function normalizeManagedInstallsFile(value) {
20663
20882
  if (!value || typeof value !== "object" || Array.isArray(value)) {
@@ -20679,7 +20898,8 @@ async function readManagedInstallsFile(path = resolveOpenScoutSupportPaths().man
20679
20898
  }
20680
20899
  }
20681
20900
  async function writeManagedInstallsFile(file, path = resolveOpenScoutSupportPaths().managedInstallsPath) {
20682
- await mkdir3(dirname6(path), { recursive: true });
20901
+ assertTestIsolatedUserData("write the managed-installs registry", "OPENSCOUT_SUPPORT_DIRECTORY");
20902
+ await mkdir3(dirname7(path), { recursive: true });
20683
20903
  await writeFile3(path, JSON.stringify(file, null, 2) + `
20684
20904
  `, "utf8");
20685
20905
  }
@@ -20705,167 +20925,6 @@ async function upsertManagedInstall(input, now = Date.now()) {
20705
20925
  return next;
20706
20926
  }
20707
20927
 
20708
- // ../runtime/dist/node-identity.js
20709
- import { createHash as createHash2, createPrivateKey, createPublicKey, generateKeyPairSync, randomBytes, sign, verify } from "node:crypto";
20710
- import { chmodSync, existsSync as existsSync8, mkdirSync as mkdirSync4, readFileSync as readFileSync5, renameSync as renameSync3, rmSync as rmSync2, writeFileSync as writeFileSync4 } from "node:fs";
20711
- import { dirname as dirname7, join as join9 } from "node:path";
20712
- var NODE_IDENTITY_FILE = "node-identity.json";
20713
- var NODE_FINGERPRINT_PREFIX = "osc1";
20714
- var NODE_CARD_TTL_MS = 24 * 60 * 60 * 1000;
20715
- var stableNodeQualifierCache = new Map;
20716
- function nodeIdentityPath(supportDirectory) {
20717
- const dir = supportDirectory ?? resolveOpenScoutSupportPaths().supportDirectory;
20718
- return join9(dir, NODE_IDENTITY_FILE);
20719
- }
20720
- function loadOrCreateNodeIdentity(supportDirectory) {
20721
- const path = nodeIdentityPath(supportDirectory);
20722
- if (existsSync8(path)) {
20723
- return readAndValidateNodeIdentity(path);
20724
- }
20725
- return createNodeIdentity(supportDirectory);
20726
- }
20727
- function readStableNodeQualifier(supportDirectory) {
20728
- const path = nodeIdentityPath(supportDirectory);
20729
- const cached = stableNodeQualifierCache.get(path);
20730
- if (cached) {
20731
- return cached;
20732
- }
20733
- if (!existsSync8(path)) {
20734
- return null;
20735
- }
20736
- const nodeQualifier = normalizeNodeQualifier(readAndValidateNodeIdentity(path).nodeQualifier);
20737
- if (nodeQualifier) {
20738
- stableNodeQualifierCache.set(path, nodeQualifier);
20739
- }
20740
- return nodeQualifier || null;
20741
- }
20742
- function readAndValidateNodeIdentity(path) {
20743
- let parsed;
20744
- try {
20745
- parsed = JSON.parse(readFileSync5(path, "utf8"));
20746
- } catch {
20747
- throw new Error(`Corrupt node identity at ${path}; remove it to generate a fresh one.`);
20748
- }
20749
- if (parsed.version !== 1 || !parsed.publicKey || !parsed.privateKey) {
20750
- throw new Error(`Corrupt node identity at ${path}; remove it to generate a fresh one.`);
20751
- }
20752
- if (parsed.nodeQualifier !== undefined && normalizeNodeQualifier(parsed.nodeQualifier) !== parsed.nodeQualifier) {
20753
- throw new Error(`Corrupt node identity at ${path}; remove it to generate a fresh one.`);
20754
- }
20755
- try {
20756
- const derived = createPublicKey(importPrivateKey(parsed.privateKey)).export({ type: "spki", format: "der" }).toString("base64");
20757
- if (derived !== parsed.publicKey) {
20758
- throw new Error("mismatch");
20759
- }
20760
- } catch {
20761
- throw new Error(`Node identity at ${path} has mismatched or invalid keys; remove it to generate a fresh one.`);
20762
- }
20763
- return parsed;
20764
- }
20765
- function normalizeNodeQualifier(value) {
20766
- return typeof value === "string" ? value.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/-+/g, "-").replace(/^-+|-+$/g, "") : "";
20767
- }
20768
- function createNodeIdentity(supportDirectory) {
20769
- if (!supportDirectory) {
20770
- assertTestIsolatedUserData("write the node identity", "OPENSCOUT_SUPPORT_DIRECTORY");
20771
- }
20772
- const path = nodeIdentityPath(supportDirectory);
20773
- const { publicKey, privateKey } = generateKeyPairSync("ed25519");
20774
- const identity = {
20775
- version: 1,
20776
- publicKey: publicKey.export({ type: "spki", format: "der" }).toString("base64"),
20777
- privateKey: privateKey.export({ type: "pkcs8", format: "der" }).toString("base64"),
20778
- createdAt: Date.now()
20779
- };
20780
- mkdirSync4(dirname7(path), { recursive: true });
20781
- try {
20782
- writeFileSync4(path, `${JSON.stringify(identity, null, 2)}
20783
- `, { encoding: "utf8", mode: 384, flag: "wx" });
20784
- } catch (error) {
20785
- if (error.code === "EEXIST") {
20786
- return readAndValidateNodeIdentity(path);
20787
- }
20788
- throw error;
20789
- }
20790
- try {
20791
- chmodSync(path, 384);
20792
- } catch {}
20793
- return identity;
20794
- }
20795
- function nodeKeyId(publicKeyBase64) {
20796
- return createHash2("sha256").update(Buffer.from(publicKeyBase64, "base64")).digest("hex");
20797
- }
20798
- function nodeFingerprint(publicKeyBase64) {
20799
- const digest = createHash2("sha256").update(Buffer.from(publicKeyBase64, "base64")).digest();
20800
- const encoded = base32Encode(digest.subarray(0, 10)).toLowerCase();
20801
- return `${NODE_FINGERPRINT_PREFIX}:${encoded.slice(0, 4)}-${encoded.slice(4, 8)}`;
20802
- }
20803
- function signNodePayload(identity, payload) {
20804
- const key = importPrivateKey(identity.privateKey);
20805
- return sign(null, typeof payload === "string" ? Buffer.from(payload, "utf8") : payload, key).toString("base64");
20806
- }
20807
- function verifyNodeSignature(publicKeyBase64, payload, signatureBase64) {
20808
- try {
20809
- const key = importPublicKey(publicKeyBase64);
20810
- return verify(null, typeof payload === "string" ? Buffer.from(payload, "utf8") : payload, key, Buffer.from(signatureBase64, "base64"));
20811
- } catch {
20812
- return false;
20813
- }
20814
- }
20815
- function canonicalJson(value) {
20816
- if (value === null || typeof value !== "object") {
20817
- return JSON.stringify(value);
20818
- }
20819
- if (Array.isArray(value)) {
20820
- return `[${value.map(canonicalJson).join(",")}]`;
20821
- }
20822
- const record2 = value;
20823
- const keys = Object.keys(record2).sort();
20824
- return `{${keys.map((key) => `${JSON.stringify(key)}:${canonicalJson(record2[key])}`).join(",")}}`;
20825
- }
20826
- function verifySignedNodeCard(card, now = Date.now()) {
20827
- if (nodeKeyId(card.publicKey) !== card.keyId) {
20828
- return false;
20829
- }
20830
- if (nodeFingerprint(card.publicKey) !== card.fingerprint) {
20831
- return false;
20832
- }
20833
- if (!Number.isFinite(card.expiresAt) || card.expiresAt <= now) {
20834
- return false;
20835
- }
20836
- if (card.tls !== undefined) {
20837
- if (typeof card.tls !== "object" || card.tls === null || typeof card.tls.spkiFingerprint !== "string" || !/^[0-9a-f]{64}$/.test(card.tls.spkiFingerprint)) {
20838
- return false;
20839
- }
20840
- }
20841
- const { signature, ...unsigned } = card;
20842
- return verifyNodeSignature(card.publicKey, canonicalJson(unsigned), signature);
20843
- }
20844
- var BASE32_ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
20845
- function base32Encode(input) {
20846
- let bits = 0;
20847
- let value = 0;
20848
- let output = "";
20849
- for (const byte of input) {
20850
- value = value << 8 | byte;
20851
- bits += 8;
20852
- while (bits >= 5) {
20853
- output += BASE32_ALPHABET[value >>> bits - 5 & 31];
20854
- bits -= 5;
20855
- }
20856
- }
20857
- if (bits > 0) {
20858
- output += BASE32_ALPHABET[value << 5 - bits & 31];
20859
- }
20860
- return output;
20861
- }
20862
- function importPrivateKey(privateKeyBase64) {
20863
- return createPrivateKey({ key: Buffer.from(privateKeyBase64, "base64"), format: "der", type: "pkcs8" });
20864
- }
20865
- function importPublicKey(publicKeyBase64) {
20866
- return createPublicKey({ key: Buffer.from(publicKeyBase64, "base64"), format: "der", type: "spki" });
20867
- }
20868
-
20869
20928
  // ../runtime/dist/user-project-hints.js
20870
20929
  import { readdir, readFile as readFile5, stat } from "node:fs/promises";
20871
20930
  import { homedir as homedir7 } from "node:os";
@@ -21189,7 +21248,7 @@ async function collectUserLevelProjectRootHints(options = {}) {
21189
21248
  }
21190
21249
 
21191
21250
  // ../runtime/dist/setup.js
21192
- var MANAGED_AGENT_HARNESSES = ["claude", "codex", "cursor", "grok", "grok-acp", "kimi", "pi"];
21251
+ var MANAGED_AGENT_HARNESSES = ["claude", "codex", "cursor", "grok", "grok-acp", "kimi", "pi", "opencode"];
21193
21252
  function titleCaseWords(value) {
21194
21253
  return value.split(/[\s._-]+/).map((part) => part.trim()).filter(Boolean).map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join(" ");
21195
21254
  }
@@ -21326,6 +21385,10 @@ var PROJECT_HARNESS_MARKERS = {
21326
21385
  pi: [
21327
21386
  "PI.md",
21328
21387
  ".pi"
21388
+ ],
21389
+ opencode: [
21390
+ "OPENCODE.md",
21391
+ ".opencode"
21329
21392
  ]
21330
21393
  };
21331
21394
  function partitionFlatAndNestedMarkers(markers) {
@@ -21416,6 +21479,9 @@ function normalizeManagedHarness(value, fallback) {
21416
21479
  if (value === "pi") {
21417
21480
  return "pi";
21418
21481
  }
21482
+ if (value === "opencode") {
21483
+ return "opencode";
21484
+ }
21419
21485
  return fallback;
21420
21486
  }
21421
21487
  function titleCase(value) {
@@ -22160,7 +22226,8 @@ async function detectHarnessMarkers(projectRoot) {
22160
22226
  grok: [],
22161
22227
  "grok-acp": [],
22162
22228
  kimi: [],
22163
- pi: []
22229
+ pi: [],
22230
+ opencode: []
22164
22231
  };
22165
22232
  for (const harness2 of MANAGED_AGENT_HARNESSES) {
22166
22233
  for (const marker of PROJECT_HARNESS_MARKERS[harness2]) {
@@ -22341,6 +22408,7 @@ async function readOpenScoutSettings(options = {}) {
22341
22408
  async function writeOpenScoutSettings(settings, options = {}) {
22342
22409
  assertTestIsolatedUserData("write OpenScout settings", "OPENSCOUT_SUPPORT_DIRECTORY");
22343
22410
  ensureOpenScoutCleanSlateSync();
22411
+ const settingsPath = resolveOpenScoutSupportPaths().settingsPath;
22344
22412
  const current = await readOpenScoutSettings(options);
22345
22413
  const merged = {
22346
22414
  ...current,
@@ -22394,7 +22462,11 @@ async function writeOpenScoutSettings(settings, options = {}) {
22394
22462
  const normalized = await normalizeSettingsRecord(merged, {
22395
22463
  currentDirectory: options.currentDirectory
22396
22464
  });
22397
- await writeJsonFile(resolveOpenScoutSupportPaths().settingsPath, normalized);
22465
+ const settingsPathNow = resolveOpenScoutSupportPaths().settingsPath;
22466
+ if (settingsPathNow !== settingsPath) {
22467
+ throw new Error(`Refusing to write OpenScout settings: target moved from ${settingsPath} to ${settingsPathNow} mid-write (test teardown?).`);
22468
+ }
22469
+ await writeJsonFile(settingsPath, normalized);
22398
22470
  return normalized;
22399
22471
  }
22400
22472
  var SCOUT_SKILL_FILE_NAME = "SKILL.md";
@@ -22650,6 +22722,8 @@ async function readRelayAgentOverrides() {
22650
22722
  }));
22651
22723
  }
22652
22724
  async function writeRelayAgentOverrides(overrides) {
22725
+ assertTestIsolatedUserData("write the relay-agents registry", "OPENSCOUT_SUPPORT_DIRECTORY");
22726
+ const registryPath = resolveOpenScoutSupportPaths().relayAgentsRegistryPath;
22653
22727
  const normalizedAgents = Object.fromEntries(Object.entries(overrides).map(([agentId, record2]) => {
22654
22728
  const definitionId = normalizeAgentId(record2.definitionId || record2.agentId || agentId);
22655
22729
  const projectRoot = normalizePath(record2.projectRoot);
@@ -22683,7 +22757,11 @@ async function writeRelayAgentOverrides(overrides) {
22683
22757
  }
22684
22758
  ];
22685
22759
  }));
22686
- await writeJsonFile(resolveOpenScoutSupportPaths().relayAgentsRegistryPath, {
22760
+ const registryPathNow = resolveOpenScoutSupportPaths().relayAgentsRegistryPath;
22761
+ if (registryPathNow !== registryPath) {
22762
+ throw new Error(`Refusing to write the relay-agents registry: target moved from ${registryPath} to ${registryPathNow} mid-write (test teardown?).`);
22763
+ }
22764
+ await writeJsonFile(registryPath, {
22687
22765
  version: 1,
22688
22766
  agents: normalizedAgents
22689
22767
  });
@@ -23361,6 +23439,7 @@ function loadUserConfig() {
23361
23439
  }
23362
23440
  }
23363
23441
  function saveUserConfig(config) {
23442
+ assertTestIsolatedUserData("write the OpenScout user config", "OPENSCOUT_HOME");
23364
23443
  const configPath = userConfigPath();
23365
23444
  mkdirSync5(dirname10(configPath), { recursive: true });
23366
23445
  writeFileSync5(configPath, JSON.stringify(config, null, 2) + `
@@ -23510,10 +23589,8 @@ async function loadOpenScoutOnboardingState(options = {}) {
23510
23589
  const operatorNameSource = explicitUserName ? "user-config" : envOperatorName ? "env" : settingsOperatorName || answeredSettingsOperatorName ? "settings" : "default";
23511
23590
  const contextRoot = settings.discovery.contextRoot ?? null;
23512
23591
  const project = await resolveProjectConfig({ currentDirectory, contextRoot });
23513
- const [broker, catalog] = await Promise.all([
23514
- options.broker ?? brokerServiceStatus().catch(() => null),
23515
- options.catalog ?? loadHarnessCatalogSnapshot().catch(() => null)
23516
- ]);
23592
+ const broker = options.broker ?? await brokerServiceStatus().catch(() => null);
23593
+ const catalog = options.catalog ?? await loadHarnessCatalogSnapshot().catch(() => null);
23517
23594
  const readyRuntimeCount = catalog?.entries.filter((entry) => entry.readinessReport.ready).length ?? 0;
23518
23595
  const hasReadyRuntime = readyRuntimeCount > 0;
23519
23596
  const hasLocalConfig = localConfigExists();
@@ -23580,11 +23657,7 @@ async function ensureOpenScoutOnboardingLocalConfig(options = {}) {
23580
23657
  }, {
23581
23658
  currentDirectory: options.currentDirectory
23582
23659
  });
23583
- return loadOpenScoutOnboardingState({
23584
- currentDirectory: options.currentDirectory,
23585
- broker: options.broker,
23586
- catalog: options.catalog
23587
- });
23660
+ return loadOpenScoutOnboardingState({ currentDirectory: options.currentDirectory });
23588
23661
  }
23589
23662
  async function saveOpenScoutOnboardingIdentity(input) {
23590
23663
  const name = input.name.trim();
@@ -23604,11 +23677,7 @@ async function saveOpenScoutOnboardingIdentity(input) {
23604
23677
  }, {
23605
23678
  currentDirectory: input.currentDirectory
23606
23679
  });
23607
- return loadOpenScoutOnboardingState({
23608
- currentDirectory: input.currentDirectory,
23609
- broker: input.broker,
23610
- catalog: input.catalog
23611
- });
23680
+ return loadOpenScoutOnboardingState({ currentDirectory: input.currentDirectory });
23612
23681
  }
23613
23682
  async function saveOpenScoutOnboardingProject(input) {
23614
23683
  const contextRoot = normalizePath2(input.contextRoot);
@@ -23636,11 +23705,7 @@ async function saveOpenScoutOnboardingProject(input) {
23636
23705
  }, {
23637
23706
  currentDirectory: input.currentDirectory ?? contextRoot
23638
23707
  });
23639
- return loadOpenScoutOnboardingState({
23640
- currentDirectory: contextRoot,
23641
- broker: input.broker,
23642
- catalog: input.catalog
23643
- });
23708
+ return loadOpenScoutOnboardingState({ currentDirectory: contextRoot });
23644
23709
  }
23645
23710
  async function triggerMeshDiscovery(broker) {
23646
23711
  if (!broker.reachable || !broker.brokerUrl)
@@ -36975,6 +37040,125 @@ class ThreadEventPlane {
36975
37040
  watch.clients.clear();
36976
37041
  }
36977
37042
  }
37043
+ // ../runtime/dist/activity-transitions.js
37044
+ class ActivityTransitionTracker {
37045
+ transitions = new Map;
37046
+ record(agentId, activity, observedAt, now) {
37047
+ const previous = this.transitions.get(agentId);
37048
+ if (previous && previous.activity === activity) {
37049
+ return previous.transitionAt;
37050
+ }
37051
+ const transitionAt = Number.isFinite(observedAt) ? Math.min(observedAt, now) : now;
37052
+ this.transitions.set(agentId, { activity, transitionAt });
37053
+ return transitionAt;
37054
+ }
37055
+ peek(agentId) {
37056
+ const transition = this.transitions.get(agentId);
37057
+ return transition ? { ...transition } : undefined;
37058
+ }
37059
+ forget(agentId) {
37060
+ this.transitions.delete(agentId);
37061
+ }
37062
+ clear() {
37063
+ this.transitions.clear();
37064
+ }
37065
+ size() {
37066
+ return this.transitions.size;
37067
+ }
37068
+ }
37069
+ // ../runtime/dist/presence-map.js
37070
+ var DEFAULT_DETAIL_DEBOUNCE_MS = 5000;
37071
+
37072
+ class BrokerPresenceMap {
37073
+ beats = new Map;
37074
+ lastDetailChangeAt = new Map;
37075
+ staleAfterMs;
37076
+ goneAfterStaleMs;
37077
+ detailDebounceMs;
37078
+ transitions;
37079
+ constructor(options = {}) {
37080
+ this.staleAfterMs = options.staleAfterMs ?? PRESENCE_STALE_AFTER_MS;
37081
+ this.goneAfterStaleMs = options.goneAfterStaleMs ?? PRESENCE_GONE_AFTER_STALE_MS;
37082
+ this.detailDebounceMs = options.detailDebounceMs ?? DEFAULT_DETAIL_DEBOUNCE_MS;
37083
+ this.transitions = options.transitions ?? new ActivityTransitionTracker;
37084
+ }
37085
+ observe(observation, now) {
37086
+ const agentId = observation.agentId ?? observation.status.agentId ?? observation.status.subjectId;
37087
+ if (!agentId)
37088
+ return;
37089
+ const status = observation.status;
37090
+ if (isTransportInferredStall(status))
37091
+ return;
37092
+ const updatedAt = Math.min(status.updatedAt, now);
37093
+ const staleAt = Math.max(status.staleAt ?? 0, updatedAt + this.staleAfterMs);
37094
+ if (isPresenceGone({ staleAt }, now, { goneAfterStaleMs: this.goneAfterStaleMs })) {
37095
+ this.forget(agentId);
37096
+ return;
37097
+ }
37098
+ const previous = this.beats.get(agentId);
37099
+ const detail = status.detail?.title ?? undefined;
37100
+ const transitionAt = this.transitions.record(agentId, status.activity, status.transitionAt ?? status.updatedAt, now);
37101
+ const activityChanged = previous?.activity !== status.activity;
37102
+ const detailChanged = previous !== undefined && previous.detail !== detail;
37103
+ const debounceElapsed = now - (this.lastDetailChangeAt.get(agentId) ?? 0) >= this.detailDebounceMs;
37104
+ const transitioned = previous === undefined || activityChanged || detailChanged && debounceElapsed;
37105
+ if (activityChanged || detailChanged && debounceElapsed) {
37106
+ this.lastDetailChangeAt.set(agentId, now);
37107
+ }
37108
+ const beat = {
37109
+ agentId,
37110
+ displayName: observation.displayName ?? previous?.displayName,
37111
+ activity: status.activity,
37112
+ phase: status.phase,
37113
+ detail,
37114
+ transitionAt,
37115
+ updatedAt,
37116
+ staleAt,
37117
+ confidence: status.confidence,
37118
+ needRef: observation.needRef,
37119
+ boundConversationId: observation.boundConversationId
37120
+ };
37121
+ this.beats.set(agentId, beat);
37122
+ return { beat, transitioned, previousActivity: previous?.activity };
37123
+ }
37124
+ snapshot(now) {
37125
+ this.prune(now);
37126
+ return { at: now, beats: [...this.beats.values()] };
37127
+ }
37128
+ get(agentId) {
37129
+ return this.beats.get(agentId);
37130
+ }
37131
+ prune(now) {
37132
+ const dropped = [];
37133
+ for (const [agentId, beat] of this.beats) {
37134
+ if (!isPresenceGone(beat, now, { goneAfterStaleMs: this.goneAfterStaleMs }))
37135
+ continue;
37136
+ this.beats.delete(agentId);
37137
+ this.lastDetailChangeAt.delete(agentId);
37138
+ this.transitions.forget(agentId);
37139
+ dropped.push(agentId);
37140
+ }
37141
+ return dropped;
37142
+ }
37143
+ forget(agentId) {
37144
+ this.beats.delete(agentId);
37145
+ this.lastDetailChangeAt.delete(agentId);
37146
+ this.transitions.forget(agentId);
37147
+ }
37148
+ clear() {
37149
+ this.beats.clear();
37150
+ this.lastDetailChangeAt.clear();
37151
+ this.transitions.clear();
37152
+ }
37153
+ size() {
37154
+ return this.beats.size;
37155
+ }
37156
+ }
37157
+ function isTransportInferredStall(status) {
37158
+ if (status.activity !== "stalled")
37159
+ return false;
37160
+ return status.provenance.some((entry) => entry.source === "staleness_inference");
37161
+ }
36978
37162
  // ../runtime/dist/issue-runner.js
36979
37163
  var CLAIM_TERMINAL_STATES = new Set(["released", "expired", "cancelled"]);
36980
37164
  var ACTIVE_FLIGHT_STATES2 = new Set(["queued", "waking", "running", "waiting"]);