@openscout/scout 0.2.79 → 0.2.80

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 (389) hide show
  1. package/bin/scoutd +0 -0
  2. package/dist/build-manifest.json +3 -3
  3. package/dist/client/assets/ActivityScreen-BXm6nJ6L.js +1 -0
  4. package/dist/client/assets/{AddProjectForm-BoVtelSP.js → AddProjectForm-CtEiLQnm.js} +1 -1
  5. package/dist/client/assets/{AgentAvatar-CufDA4A-.js → AgentAvatar-CszU5eaU.js} +1 -1
  6. package/dist/client/assets/AgentConfigurationScreen-CfBXxrsD.js +1 -0
  7. package/dist/client/assets/AgentDefinitionsWorkspace-4Z0aN8AR.js +1 -0
  8. package/dist/client/assets/{AgentDetailCard-DxxVkgT1.js → AgentDetailCard-sZuHl1de.js} +1 -1
  9. package/dist/client/assets/AgentFloorView-DMivAYHU.js +1 -0
  10. package/dist/client/assets/AgentInfoScreen-CPkLg1pK.js +1 -0
  11. package/dist/client/assets/{AgentLaneCard-DTUvE96I.js → AgentLaneCard-nB68f2CI.js} +1 -1
  12. package/dist/client/assets/{AgentLaneChrome-BfVygkgL.js → AgentLaneChrome-O9Yf0uR-.js} +1 -1
  13. package/dist/client/assets/AgentLaneDetailSheet-BfhpaEQ3.js +4 -0
  14. package/dist/client/assets/{AgentLaneSummaryResize-CMgzYvAA.js → AgentLaneSummaryResize-Ct3b0TQR.js} +1 -1
  15. package/dist/client/assets/AgentLanesEmbedScreen-CjHMvy3v.js +1 -0
  16. package/dist/client/assets/{AgentLanesPreflight-KWfLcaNB.js → AgentLanesPreflight-DNGvZvjd.js} +1 -1
  17. package/dist/client/assets/{AgentLanesView-CxfbV8Kd.js → AgentLanesView-DqRK5-d2.js} +1 -1
  18. package/dist/client/assets/{AgentLiveActions-CZdAInEu.js → AgentLiveActions-DI4ooSHW.js} +1 -1
  19. package/dist/client/assets/{AgentSessions-Bkr0lyry.js → AgentSessions-BxWIPkWh.js} +1 -1
  20. package/dist/client/assets/{AgentsConsole-WtFVqaPJ.js → AgentsConsole-D6VHSCfZ.js} +1 -1
  21. package/dist/client/assets/AgentsScreen-zR6b2bUL.js +1 -0
  22. package/dist/client/assets/AgentsSubnav-q0xcZi6C.js +1 -0
  23. package/dist/client/assets/{AtopView-_OKDlZ1h.js → AtopView-VZkk40v0.js} +1 -1
  24. package/dist/client/assets/{BackToPicker-CkUmHuuo.js → BackToPicker-DZg_4nHL.js} +1 -1
  25. package/dist/client/assets/{BriefingDetailScreen-i54EtZKW.js → BriefingDetailScreen-BZU4qMwE.js} +1 -1
  26. package/dist/client/assets/{BriefingsScreen-CBrHojlQ.js → BriefingsScreen-Bfc3tqPp.js} +1 -1
  27. package/dist/client/assets/{BrokerMetadataPanel-opTLuZU6.js → BrokerMetadataPanel-CaFe6kdh.js} +1 -1
  28. package/dist/client/assets/BrokerScreen-Chh8sGen.js +5 -0
  29. package/dist/client/assets/{ChatCollapsedStrip-Dr2vmKXQ.js → ChatCollapsedStrip-Cov54p9V.js} +1 -1
  30. package/dist/client/assets/{CodeDiffPane-CLOGjwul.js → CodeDiffPane-C1ebFt-Y.js} +1 -1
  31. package/dist/client/assets/{CodeProjectPicker-DTV8hR6A.js → CodeProjectPicker-tsCly-f3.js} +1 -1
  32. package/dist/client/assets/CodeScreen-D0hpZNLP.js +1 -0
  33. package/dist/client/assets/{ContextMenu-BlBQhpax.js → ContextMenu-N-Z6X0Z1.js} +1 -1
  34. package/dist/client/assets/ConversationComposer-CiEF7dhd.js +1 -0
  35. package/dist/client/assets/ConversationFeedRows-5it6QNBV.js +1 -0
  36. package/dist/client/assets/ConversationHeader-BGgbITvr.js +1 -0
  37. package/dist/client/assets/ConversationPanels-vI9YuQJh.js +2 -0
  38. package/dist/client/assets/ConversationScreen-C-PrCRz1.js +1 -0
  39. package/dist/client/assets/ConversationScreen-yIKEsm-8.css +1 -0
  40. package/dist/client/assets/{ConversationStatus-DSgdVofa.js → ConversationStatus-COEj5loj.js} +1 -1
  41. package/dist/client/assets/{DataTable-0DwuXyvW.js → DataTable-BoofV-_4.js} +1 -1
  42. package/dist/client/assets/{DispatchAftermath-BrreQifA.js → DispatchAftermath-OXYlMbT1.js} +1 -1
  43. package/dist/client/assets/{DocumentFocusViewer-DU_9BHsD.js → DocumentFocusViewer-BCG2kOmd.js} +1 -1
  44. package/dist/client/assets/{EmbeddableSurfacesLab-DdaswbfI.js → EmbeddableSurfacesLab-C2SZvrHJ.js} +1 -1
  45. package/dist/client/assets/{EmptyState-CoL-QuUO.js → EmptyState-DypEjx0V.js} +1 -1
  46. package/dist/client/assets/{FileViewerPane-C9Ly01Ef.js → FileViewerPane-CXCq-oKj.js} +1 -1
  47. package/dist/client/assets/{FleetSearch-DlWTLl-v.js → FleetSearch-Dj7-CfNi.js} +1 -1
  48. package/dist/client/assets/FlightObserveScreen-Yq5NtQQJ.js +1 -0
  49. package/dist/client/assets/FollowScreen-DRgYuAvp.js +1 -0
  50. package/dist/client/assets/HarnessMark-BE-YSyci.js +1 -0
  51. package/dist/client/assets/HarnessesScreen-L-emPcXd.js +1 -0
  52. package/dist/client/assets/HerdrSession-DKFCJMst.js +4 -0
  53. package/dist/client/assets/{HomeHero-Cfsow7qL.js → HomeHero-CAEg8Yg5.js} +1 -1
  54. package/dist/client/assets/{KnowledgeSearchInspector-DKashKoH.js → KnowledgeSearchInspector-C2EZsQ5i.js} +1 -1
  55. package/dist/client/assets/KnowledgeSearchScreen-DvdOFh-b.js +1 -0
  56. package/dist/client/assets/{LaneToolHoverCard-BzehBmdi.js → LaneToolHoverCard-DrPXYZvQ.js} +1 -1
  57. package/dist/client/assets/LaneTraceDetailSheet-Dl7foF88.js +1 -0
  58. package/dist/client/assets/{LaneTraceEventFocus-DYvHfs_3.js → LaneTraceEventFocus-X4-DDFEo.js} +1 -1
  59. package/dist/client/assets/{MeshCanvas-DIjlrMPU.js → MeshCanvas-rtCBD7s6.js} +1 -1
  60. package/dist/client/assets/{MeshCanvasMinimap-DEq-PkF0.js → MeshCanvasMinimap-CuvXOkc7.js} +1 -1
  61. package/dist/client/assets/MeshScreen-D5zzTn0o.js +1 -0
  62. package/dist/client/assets/{MeshTopologyView-BMHpH5BU.js → MeshTopologyView-CeTShs-U.js} +2 -2
  63. package/dist/client/assets/{MessageComposerSuggestions-zAUUcLOv.js → MessageComposerSuggestions-Cs9u-F_3.js} +1 -1
  64. package/dist/client/assets/MessagesScreen-BhOJ7_tj.js +1 -0
  65. package/dist/client/assets/MissionContextRail-0O-Zu1Tn.js +1 -0
  66. package/dist/client/assets/MissionControlView-D2JO9u-y.js +1 -0
  67. package/dist/client/assets/{MissionFocusOverlay-C7cPt6eU.js → MissionFocusOverlay-LnjmqBiW.js} +1 -1
  68. package/dist/client/assets/{MissionLeftAgentRow-CxlH3dON.js → MissionLeftAgentRow-nc1Jyq3D.js} +1 -1
  69. package/dist/client/assets/MissionLogPane-lZ9vUftY.js +1 -0
  70. package/dist/client/assets/{NewAgentModal-DprvD4EK.js → NewAgentModal-K1cvdmZr.js} +1 -1
  71. package/dist/client/assets/NewChatComposer-C5LT7MF7.css +1 -0
  72. package/dist/client/assets/NewChatComposer-DXDxV2Mh.js +19 -0
  73. package/dist/client/assets/{NewChatOrigin--pHWUb4V.js → NewChatOrigin-CnjoswTG.js} +1 -1
  74. package/dist/client/assets/{ObserveEmbedScreen-CfvrnOiZ.js → ObserveEmbedScreen-CRpzYf0Y.js} +1 -1
  75. package/dist/client/assets/{ObserveTextFlow-CBitljxi.js → ObserveTextFlow-DJxQc2H6.js} +2 -2
  76. package/dist/client/assets/{ObservedTopologyPanel-Dv6fbHzW.js → ObservedTopologyPanel-C1AQM0Mq.js} +1 -1
  77. package/dist/client/assets/OpenScoutAppShell-DrHYD_pd.js +87 -0
  78. package/dist/client/assets/OpsAgentsView-BnMX0vEY.js +1 -0
  79. package/dist/client/assets/OpsScreen-BeC0lieE.js +1 -0
  80. package/dist/client/assets/OpsSubnav-D5Bpowtk.js +1 -0
  81. package/dist/client/assets/{PlanView-DYtt8H37.js → PlanView-DDXdC19M.js} +1 -1
  82. package/dist/client/assets/ProjectAgentProfile-zE1cApxw.js +1 -0
  83. package/dist/client/assets/{ProjectAgentProfileBar-B3IvVbqS.js → ProjectAgentProfileBar-MODhG0P6.js} +1 -1
  84. package/dist/client/assets/{ProjectAgentProfileHero-D5E8yvDj.js → ProjectAgentProfileHero-C1ImgGDu.js} +1 -1
  85. package/dist/client/assets/ProjectsInbox-C3Jd6JTk.js +2 -0
  86. package/dist/client/assets/{ProjectsRail-DEDS-M1c.js → ProjectsRail-B1zrQLZe.js} +1 -1
  87. package/dist/client/assets/ProjectsScreen-PW_NH5VK.js +1 -0
  88. package/dist/client/assets/ProjectsThreadAside-DaCEUWN1.js +1 -0
  89. package/dist/client/assets/Provider-DSsb2gLR.js +1 -0
  90. package/dist/client/assets/{RailRow-BTlVAnHS.js → RailRow-DerXOXQS.js} +1 -1
  91. package/dist/client/assets/RawSessionsTable-LWEvXJzj.js +1 -0
  92. package/dist/client/assets/RealtimeVoiceScreen-XtxbCjOs.js +1 -0
  93. package/dist/client/assets/{RepoDiffEmbedScreen-CtTdlQ2A.js → RepoDiffEmbedScreen-C9oLCcZX.js} +1 -1
  94. package/dist/client/assets/{RepoDiffPageScreen-BRvaVYoC.js → RepoDiffPageScreen-CGEMAv2Z.js} +1 -1
  95. package/dist/client/assets/{RepoDiffViewer-Bo0gREMj.js → RepoDiffViewer-CB8PSVey.js} +1 -1
  96. package/dist/client/assets/RepoDiffViewerLazy-DIxkiMto.js +2 -0
  97. package/dist/client/assets/{ReposScreen-BBkJf8xT.js → ReposScreen-BN1lVjOj.js} +1 -1
  98. package/dist/client/assets/{ScoutDeckSurface-Bi9ov9Bm.js → ScoutDeckSurface-BCpl0QCx.js} +1 -1
  99. package/dist/client/assets/{ScoutSurface-DEQg_7Io.js → ScoutSurface-BEnDlynn.js} +1 -1
  100. package/dist/client/assets/{ScoutbotBroadcastChip-DJXuyn73.js → ScoutbotBroadcastChip-z9R_pC_U.js} +1 -1
  101. package/dist/client/assets/{ScoutbotFxLab-BgsuLDjo.js → ScoutbotFxLab-fAROyIfz.js} +1 -1
  102. package/dist/client/assets/{ScoutbotRealtimeVoiceCall-Bzyl0BCS.js → ScoutbotRealtimeVoiceCall-CDyFJX8m.js} +1 -1
  103. package/dist/client/assets/{SecondaryNav-Bks0CO2h.js → SecondaryNav-Hv5AJ3Fv.js} +1 -1
  104. package/dist/client/assets/{SessionEmbedScreen-b0Zgmfx5.js → SessionEmbedScreen-CDRpQc3g.js} +1 -1
  105. package/dist/client/assets/{SessionObserve-Dlx5vDaV.js → SessionObserve-BmmJ8dEh.js} +1 -1
  106. package/dist/client/assets/{SessionObserveEvidence-ChBD1d4c.js → SessionObserveEvidence-CEedIk2a.js} +1 -1
  107. package/dist/client/assets/SessionRefScreen-Dk-O4OVt.js +1 -0
  108. package/dist/client/assets/SessionsScreen-BJEjuo2X.js +1 -0
  109. package/dist/client/assets/{SettingsDrawer-C587L1i1.js → SettingsDrawer-DL-SVLdd.js} +1 -1
  110. package/dist/client/assets/SettingsScreen-DJ-BhBwR.js +1 -0
  111. package/dist/client/assets/{ShikiPane-I_OTW5NO.js → ShikiPane-B7O4if20.js} +1 -1
  112. package/dist/client/assets/{SlidePanel-FCqT1zO3.js → SlidePanel-B3gc5HnM.js} +1 -1
  113. package/dist/client/assets/{SpriteAvatar-CQs-jC-v.js → SpriteAvatar-BpQDpOkq.js} +1 -1
  114. package/dist/client/assets/{StatusPill-CbABggnQ.js → StatusPill-B33sQinT.js} +1 -1
  115. package/dist/client/assets/{TailView-C_MXVSum.js → TailView-DL3YZkzE.js} +2 -2
  116. package/dist/client/assets/Terminal-Dp1FSGIS.js +1 -0
  117. package/dist/client/assets/TerminalEmbedScreen-DP9IM4xf.js +1 -0
  118. package/dist/client/assets/{TextDocumentSurface-C-9EtYqt.js → TextDocumentSurface-DRjctOIt.js} +1 -1
  119. package/dist/client/assets/{TmuxPeek-Dz1gJ2pU.js → TmuxPeek-DNC4uWky.js} +1 -1
  120. package/dist/client/assets/{VoicePermissionsPanel-MfICy9kk.js → VoicePermissionsPanel-WLN0V-Xv.js} +1 -1
  121. package/dist/client/assets/{WorkDetailScreen-Cs7kdllj.js → WorkDetailScreen-D2Yl0mYZ.js} +1 -1
  122. package/dist/client/assets/{WorkFilesViewer-CF-nhtZ4.js → WorkFilesViewer-BbVfcUN-.js} +1 -1
  123. package/dist/client/assets/{activity-WhBf3FXP.js → activity-BxwKkT8z.js} +1 -1
  124. package/dist/client/assets/{addon-fit-q-x_HytU.js → addon-fit-B9O2vJoh.js} +1 -1
  125. package/dist/client/assets/{addon-webgl-fhhvEA9h.js → addon-webgl-BhRZFDcn.js} +1 -1
  126. package/dist/client/assets/{agent-essentials-DyJiUGpZ.js → agent-essentials-SrzMYEXV.js} +1 -1
  127. package/dist/client/assets/agent-identity-BxCsXnDp.js +1 -0
  128. package/dist/client/assets/{agent-lane-card-model-BCIwPjEh.js → agent-lane-card-model-DSWdGu-v.js} +1 -1
  129. package/dist/client/assets/agent-lane-detail-BNNm6FNu.js +2 -0
  130. package/dist/client/assets/{agent-lane-preview-BtnfNyFR.js → agent-lane-preview-C33Dwpn7.js} +1 -1
  131. package/dist/client/assets/{agent-lanes-model-Bl6xfviL.js → agent-lanes-model-CPgQRenB.js} +2 -2
  132. package/dist/client/assets/{arc.es-DPJ0xRV6.js → arc.es-NlJw-19N.js} +1 -1
  133. package/dist/client/assets/{arrow-down-DsD-dYj-.js → arrow-down-D3-IbArq.js} +1 -1
  134. package/dist/client/assets/{arrow-left-WjQIN9J6.js → arrow-left-_vS7itsV.js} +1 -1
  135. package/dist/client/assets/{arrow-up-right-CtTDrZJr.js → arrow-up-right-CcrWONpD.js} +1 -1
  136. package/dist/client/assets/{bot-B_Uzf4_O.js → bot-BRINYlC6.js} +1 -1
  137. package/dist/client/assets/{check-BbgHJX8u.js → check-COxArFXG.js} +1 -1
  138. package/dist/client/assets/{chevron-down-BFai6ZfE.js → chevron-down-DRCbnzyY.js} +1 -1
  139. package/dist/client/assets/{chevron-right-CyUa1zXx.js → chevron-right-CNE6QAVr.js} +1 -1
  140. package/dist/client/assets/{chunk-HRAB3GC3-CvwpNg-G.js → chunk-HRAB3GC3-CAeEKaf5.js} +1 -1
  141. package/dist/client/assets/chunk-JTPDIGGW-s6WbxdjC.js +46 -0
  142. package/dist/client/assets/{chunk-T65CQEWV-DI4NKdNq.js → chunk-T65CQEWV-CiZ_ICHW.js} +1 -1
  143. package/dist/client/assets/chunk-YOZR3KYS-DLOc92uD.js +2 -0
  144. package/dist/client/assets/{clock-DviOalxA.js → clock-CyfvRmj6.js} +1 -1
  145. package/dist/client/assets/{code-xml-05TD3uOC.js → code-xml--LjSM4Mv.js} +1 -1
  146. package/dist/client/assets/content-7ZeCPAEt.js +1 -0
  147. package/dist/client/assets/content-BHUcUCH5.js +1 -0
  148. package/dist/client/assets/content-BUhvLPkv.js +1 -0
  149. package/dist/client/assets/content-BomQ5YWo.js +1 -0
  150. package/dist/client/assets/content-C39ELNgC.js +1 -0
  151. package/dist/client/assets/content-C4RYKHut.js +1 -0
  152. package/dist/client/assets/content-CCiZfG4H.js +1 -0
  153. package/dist/client/assets/content-CDpDtVI-.js +1 -0
  154. package/dist/client/assets/content-CO-9CeFd.js +1 -0
  155. package/dist/client/assets/content-CuOLxp1x.js +1 -0
  156. package/dist/client/assets/content-CvtLIjXS.js +1 -0
  157. package/dist/client/assets/content-CzwTUb9n.js +1 -0
  158. package/dist/client/assets/content-DQXbo2RO.js +1 -0
  159. package/dist/client/assets/content-DRTQ9QQb.js +1 -0
  160. package/dist/client/assets/content-LCELs6zg.js +1 -0
  161. package/dist/client/assets/content-Uqt8AG-s.css +1 -0
  162. package/dist/client/assets/content-qsDjA4Au.js +1 -0
  163. package/dist/client/assets/{conversation-icons-DohQL6GI.js → conversation-icons-c-hXv7hY.js} +1 -1
  164. package/dist/client/assets/conversation-model-CHwHZNw-.js +1 -0
  165. package/dist/client/assets/conversation-motion-features-T8vF9zED.js +1 -0
  166. package/dist/client/assets/{copy-CwCAivnc.js → copy-4LfKIdQJ.js} +1 -1
  167. package/dist/client/assets/{createLucideIcon-DlxlBfLC.js → createLucideIcon-ClCdc3F9.js} +1 -1
  168. package/dist/client/assets/discover-7Ks00w-M.js +2 -0
  169. package/dist/client/assets/embed-entry-n2ThmSSX.js +2 -0
  170. package/dist/client/assets/{external-link-CnjcXf32.js → external-link-CnaI1QFS.js} +1 -1
  171. package/dist/client/assets/{eye-So8tNNK6.js → eye-BFlhMzQL.js} +1 -1
  172. package/dist/client/assets/{file-text-i3xTDUjJ.js → file-text-DG-pufl1.js} +1 -1
  173. package/dist/client/assets/{gestures-CgvAMd6F.js → gestures-CxG3Dphs.js} +1 -1
  174. package/dist/client/assets/home-live-action-BkqGLVRY.js +1 -0
  175. package/dist/client/assets/home-moving-signal-aNJusIzL.js +1 -0
  176. package/dist/client/assets/home-now-card-BQK4EFHx.js +1 -0
  177. package/dist/client/assets/{home-now-card-nano-CkLHUQ4J.js → home-now-card-nano-CdtzqSIF.js} +1 -1
  178. package/dist/client/assets/hooks-Dst1TH7n.js +2 -0
  179. package/dist/client/assets/index-9as_JTUs.css +1 -0
  180. package/dist/client/assets/index-CU9dtwJk.js +1 -0
  181. package/dist/client/assets/{index-sUomXsrf.js → index-CzVeWScw.js} +2 -2
  182. package/dist/client/assets/index-Dewd56RX.js +1 -0
  183. package/dist/client/assets/index-_YQXKEhb.js +1 -0
  184. package/dist/client/assets/{inspector-panel-DhXd-YbT.js → inspector-panel-DgOM8nCo.js} +1 -1
  185. package/dist/client/assets/keyboard-nav-BJnFoFDP.js +1 -0
  186. package/dist/client/assets/{lane-observe-DrhKkQ3A.js → lane-observe-BA3g9aVd.js} +1 -1
  187. package/dist/client/assets/{lane-roster-store-NE15Oe6M.js → lane-roster-store-pR4ZaYQm.js} +1 -1
  188. package/dist/client/assets/left-BhzPp-_E.js +1 -0
  189. package/dist/client/assets/left-CN1MABD0.js +2 -0
  190. package/dist/client/assets/left-DDgbsio7.js +1 -0
  191. package/dist/client/assets/left-Dpf2R9uD.js +1 -0
  192. package/dist/client/assets/left-HwwbMVtl.js +2 -0
  193. package/dist/client/assets/left-YfH0daht.js +1 -0
  194. package/dist/client/assets/left-agents-CYUwAy2Z.js +1 -0
  195. package/dist/client/assets/left-default-vEGZALPv.js +1 -0
  196. package/dist/client/assets/left-lanes-bphF-vlX.js +1 -0
  197. package/dist/client/assets/left-mission-B54-c3hq.js +1 -0
  198. package/dist/client/assets/left-np5USKqG.js +1 -0
  199. package/dist/client/assets/left-plan-BNBuDoPQ.js +2 -0
  200. package/dist/client/assets/library-DbCVJG_O.js +1 -0
  201. package/dist/client/assets/{loader-circle-lWOOKezu.js → loader-circle-Byb9kSFx.js} +1 -1
  202. package/dist/client/assets/{local-agents-C7fDHLVC.js → local-agents-DBaUbP-_.js} +1 -1
  203. package/dist/client/assets/{mentions-CY_wPZc5.js → mentions-fbQJ2mBI.js} +1 -1
  204. package/dist/client/assets/{mesh-ops-Kn8pCtyJ.js → mesh-ops-Cnw3vwAu.js} +1 -1
  205. package/dist/client/assets/{mesh-view-store-D14ihwkF.js → mesh-view-store-Btlyc7rW.js} +1 -1
  206. package/dist/client/assets/{message-circle-C5UZ6fO7.js → message-circle-aGOfQWm2.js} +1 -1
  207. package/dist/client/assets/{message-markup-C8Nx04sP.js → message-markup-mGF07emJ.js} +1 -1
  208. package/dist/client/assets/{message-square-BD-4UUdc.js → message-square-CIXda-Y7.js} +1 -1
  209. package/dist/client/assets/mission-control-m3BTDQ9l.css +1 -0
  210. package/dist/client/assets/{mission-control-store-xQHVQdm8.js → mission-control-store-CcoNeQHG.js} +1 -1
  211. package/dist/client/assets/mission-wall-CocIM1cF.js +1 -0
  212. package/dist/client/assets/{observe-uJfIlIUV.js → observe-BNFzh-7B.js} +1 -1
  213. package/dist/client/assets/openAgent-Dbv5wfuL.js +1 -0
  214. package/dist/client/assets/{page-status-BymFEFai.js → page-status-DDvNdA8s.js} +1 -1
  215. package/dist/client/assets/{paperclip-DL9BXPp2.js → paperclip-DfpJkR4s.js} +1 -1
  216. package/dist/client/assets/{plus-C9lTjsgd.js → plus-CmFQp9Uj.js} +1 -1
  217. package/dist/client/assets/profile-s3KRbip1.js +1 -0
  218. package/dist/client/assets/{projects-inbox-DfVmGFFk.js → projects-inbox-Diddml6e.js} +1 -1
  219. package/dist/client/assets/{radio-DedMyP8J.js → radio-PauJIekM.js} +1 -1
  220. package/dist/client/assets/{refresh-cw-D8PFyhUa.js → refresh-cw-4oeFn1Jn.js} +1 -1
  221. package/dist/client/assets/resolve-panes-cp6eNewO.js +1 -0
  222. package/dist/client/assets/resolve-sidebar-context-Dbo-5PWx.js +1 -0
  223. package/dist/client/assets/right-09W2JJFg.js +1 -0
  224. package/dist/client/assets/right-B-MKhiJ6.js +1 -0
  225. package/dist/client/assets/right-B91Zl8lQ.js +1 -0
  226. package/dist/client/assets/{right-C1sIsSHR.js → right-BcFnuse9.js} +1 -1
  227. package/dist/client/assets/right-BdtMzn35.js +1 -0
  228. package/dist/client/assets/right-BqmKXLtf.js +1 -0
  229. package/dist/client/assets/right-BzeB-Dpt.js +1 -0
  230. package/dist/client/assets/right-CkGOs-sq.js +1 -0
  231. package/dist/client/assets/right-CzGiNBzB.js +1 -0
  232. package/dist/client/assets/right-Dc7uqv7l.js +1 -0
  233. package/dist/client/assets/{rocket-CriBwkHM.js → rocket-C-AskjZH.js} +1 -1
  234. package/dist/client/assets/router-B-K15T7B.js +1 -0
  235. package/dist/client/assets/{runtime-picker-DOZpZOlt.js → runtime-picker-BCQD7d4K.js} +1 -1
  236. package/dist/client/assets/{scope-views-BF_RvGKU.js → scope-views-BhkbIFPY.js} +1 -1
  237. package/dist/client/assets/{scout-voice-BZ4KqADJ.js → scout-voice-S5_YZ2v8.js} +1 -1
  238. package/dist/client/assets/{scroll-text-BIYf6g6N.js → scroll-text-BV-BB7v-.js} +1 -1
  239. package/dist/client/assets/{search-DCT_EvPr.js → search-C3bSJluv.js} +1 -1
  240. package/dist/client/assets/{secondaryNavConfig-Drb7wPG4.js → secondaryNavConfig-Bg4Tc0gT.js} +1 -1
  241. package/dist/client/assets/{selection-bridge-CJOTyYQs.js → selection-bridge-B1dmkX3P.js} +1 -1
  242. package/dist/client/assets/{send-horizontal-DDwOgEs3.js → send-horizontal-CqogPmbY.js} +1 -1
  243. package/dist/client/assets/{server-CHZCp3cF.js → server-Brw5Y1Gh.js} +1 -1
  244. package/dist/client/assets/{session-catalog-XhGxCtP-.js → session-catalog-9FqXmjBw.js} +1 -1
  245. package/dist/client/assets/session-table-1xdSxSXq.js +1 -0
  246. package/dist/client/assets/{sliders-horizontal-B9Nj-Y4J.js → sliders-horizontal-CUiOH26y.js} +1 -1
  247. package/dist/client/assets/{sparkles-up7pVlX-.js → sparkles-BjCA3Evu.js} +1 -1
  248. package/dist/client/assets/{sse-CVoGDiKW.js → sse-QcU9bikk.js} +1 -1
  249. package/dist/client/assets/synthetic-agent-routing-aduMYO7P.js +1 -0
  250. package/dist/client/assets/system-surfaces-redesign-B7GQhfpw.css +1 -0
  251. package/dist/client/assets/{tail-display-BdyoLvzY.js → tail-display-BRcJltQa.js} +2 -2
  252. package/dist/client/assets/{tail-events-CTipUIli.js → tail-events-C6K7bCWB.js} +1 -1
  253. package/dist/client/assets/{terminal-DXQISjZn.js → terminal-DrTkVXIj.js} +1 -1
  254. package/dist/client/assets/{terminal-relay-B5Sma7fK.js → terminal-relay-BkXjjSkq.js} +1 -1
  255. package/dist/client/assets/{terminal-screen-19jAI0Cw.css → terminal-screen-BqVnCwl0.css} +1 -1
  256. package/dist/client/assets/terminal-sessions-C3qU8tnY.js +1 -0
  257. package/dist/client/assets/{terminal-takeover-X97KCSJk.js → terminal-takeover-KvmTwABa.js} +1 -1
  258. package/dist/client/assets/{use-conversation-list-B1T6J_qE.js → use-conversation-list-C5sF6WBR.js} +1 -1
  259. package/dist/client/assets/{use-fleet-active-asks-DLofGhhK.js → use-fleet-active-asks-BOMPW0nl.js} +1 -1
  260. package/dist/client/assets/{use-mesh-ops-items-ByGZk8rU.js → use-mesh-ops-items-Co05vcTV.js} +1 -1
  261. package/dist/client/assets/{use-reduced-motion-Cvk-HRKg.js → use-reduced-motion-Dla-G_Jz.js} +1 -1
  262. package/dist/client/assets/{use-scout-dev-flags-BHvg3G2c.js → use-scout-dev-flags-BOQF3fW2.js} +1 -1
  263. package/dist/client/assets/{useAgentHoverCard-D5e8Qg1z.js → useAgentHoverCard-FtCmY-b9.js} +1 -1
  264. package/dist/client/assets/useContentSecondaryNav-BX7Sq7vy.js +1 -0
  265. package/dist/client/assets/{usePierreRuntime-DIVunfX0.js → usePierreRuntime-Bo4lD7Ui.js} +1 -1
  266. package/dist/client/assets/{wrench-pEVd8JnN.js → wrench-CeCdjiPF.js} +1 -1
  267. package/dist/client/assets/{x-0XjXwGqq.js → x-D4X_y1j_.js} +1 -1
  268. package/dist/client/assets/{xterm-CRLlV1Xp.js → xterm-D2a5wrkJ.js} +1 -1
  269. package/dist/client/index.html +2 -2
  270. package/dist/main.mjs +1404 -356
  271. package/dist/node/main.mjs +63 -15
  272. package/dist/openscout-terminal-relay.mjs +16 -4
  273. package/dist/pairing-runtime-controller.mjs +3028 -2946
  274. package/dist/runtime/broker-daemon.mjs +356 -134
  275. package/dist/scout-control-plane-web.mjs +5631 -5183
  276. package/dist/scout-web-server.mjs +5631 -5183
  277. package/package.json +1 -1
  278. package/dist/client/assets/ActivityScreen-DnqqRSlS.js +0 -1
  279. package/dist/client/assets/AgentConfigurationScreen-CJqoMA0J.js +0 -1
  280. package/dist/client/assets/AgentDefinitionsWorkspace-FpEkb-tu.js +0 -1
  281. package/dist/client/assets/AgentFloorView-CycUn0Lv.js +0 -1
  282. package/dist/client/assets/AgentInfoScreen-CAQAxpAK.js +0 -1
  283. package/dist/client/assets/AgentLaneDetailSheet-CWs9wKWk.js +0 -5
  284. package/dist/client/assets/AgentLanesEmbedScreen-BUCW4nUj.js +0 -1
  285. package/dist/client/assets/AgentsScreen-BMXvuiA2.js +0 -1
  286. package/dist/client/assets/AgentsSubnav-BTNjPYoA.js +0 -1
  287. package/dist/client/assets/BrokerScreen-CObCQvoy.js +0 -5
  288. package/dist/client/assets/CodeScreen-BXqi72NK.js +0 -1
  289. package/dist/client/assets/ConversationComposer-BBNPa5S9.js +0 -1
  290. package/dist/client/assets/ConversationFeedRows-BuejHMCY.js +0 -1
  291. package/dist/client/assets/ConversationHeader-DXMT-YXv.js +0 -1
  292. package/dist/client/assets/ConversationPanels-DHCtilQF.js +0 -2
  293. package/dist/client/assets/ConversationScreen-DSxIt9pq.css +0 -1
  294. package/dist/client/assets/ConversationScreen-Dz2d_Z_F.js +0 -1
  295. package/dist/client/assets/FlightObserveScreen-C-9S0nA5.js +0 -1
  296. package/dist/client/assets/FollowScreen--Q04xSSE.js +0 -1
  297. package/dist/client/assets/HarnessMark-Dm_qm1Ku.js +0 -1
  298. package/dist/client/assets/HarnessesScreen-Y54viPX8.js +0 -1
  299. package/dist/client/assets/KnowledgeSearchScreen-DsdDz8wY.js +0 -1
  300. package/dist/client/assets/LaneTraceDetailSheet-CBf_aNZx.js +0 -1
  301. package/dist/client/assets/MeshScreen-TgDtz-1l.js +0 -1
  302. package/dist/client/assets/MessagesScreen-BTQL0UcE.js +0 -1
  303. package/dist/client/assets/MissionControlView-D59SPnAm.js +0 -1
  304. package/dist/client/assets/MissionLogPane-Ye3YlF9s.js +0 -1
  305. package/dist/client/assets/NewChatComposer-B5FnPyzS.js +0 -19
  306. package/dist/client/assets/NewChatComposer-W-t-L4oV.css +0 -1
  307. package/dist/client/assets/OpenScoutAppShell-BIp0WitK.js +0 -87
  308. package/dist/client/assets/OpsAgentsView-CoBfAigH.js +0 -1
  309. package/dist/client/assets/OpsScreen-Bbo0W64T.js +0 -1
  310. package/dist/client/assets/OpsSubnav-CoN8utF8.js +0 -1
  311. package/dist/client/assets/ProjectAgentProfile-FiiIcB5R.js +0 -1
  312. package/dist/client/assets/ProjectsInbox-BWiXjGi7.js +0 -2
  313. package/dist/client/assets/ProjectsScreen-Cxk4CuYn.js +0 -1
  314. package/dist/client/assets/ProjectsThreadAside-BF66ugT5.js +0 -1
  315. package/dist/client/assets/Provider-tFc3jqZ4.js +0 -1
  316. package/dist/client/assets/RawSessionsTable-BsGVgZB3.js +0 -1
  317. package/dist/client/assets/RealtimeVoiceScreen-B0Bem5Rc.js +0 -1
  318. package/dist/client/assets/RepoDiffViewerLazy-C8UPk4oo.js +0 -2
  319. package/dist/client/assets/SessionRefScreen-D7TfPYPN.js +0 -1
  320. package/dist/client/assets/SessionsScreen-BlknOWAd.js +0 -1
  321. package/dist/client/assets/SettingsScreen-BIlYxv_a.js +0 -1
  322. package/dist/client/assets/Terminal-DwZyo8kA.js +0 -1
  323. package/dist/client/assets/TerminalEmbedScreen-Czp3tQyd.js +0 -1
  324. package/dist/client/assets/agent-chat-Bfjd9y6c.js +0 -1
  325. package/dist/client/assets/agent-identity-xQHedtLl.js +0 -1
  326. package/dist/client/assets/agent-lane-detail-Cw4QVAgH.js +0 -1
  327. package/dist/client/assets/chunk-YOZR3KYS-BW85tiCr.js +0 -47
  328. package/dist/client/assets/content-2u_eV3fX.js +0 -1
  329. package/dist/client/assets/content-5irOghrY.js +0 -1
  330. package/dist/client/assets/content-8Z_0CwtD.js +0 -1
  331. package/dist/client/assets/content-B38YRDBu.js +0 -1
  332. package/dist/client/assets/content-BE3uK0LB.js +0 -1
  333. package/dist/client/assets/content-BtIxSqVY.js +0 -1
  334. package/dist/client/assets/content-CFsPAihU.js +0 -1
  335. package/dist/client/assets/content-CHU0wwA3.css +0 -1
  336. package/dist/client/assets/content-CKj5g5tu.js +0 -1
  337. package/dist/client/assets/content-CLDWXf9Z.js +0 -1
  338. package/dist/client/assets/content-CRr73E0r.js +0 -1
  339. package/dist/client/assets/content-CVR75_Uj.js +0 -1
  340. package/dist/client/assets/content-Czdp7_JQ.js +0 -1
  341. package/dist/client/assets/content-D0_EJ6nP.js +0 -1
  342. package/dist/client/assets/content-DNmxpNhD.js +0 -1
  343. package/dist/client/assets/content-XpbI9uxd.js +0 -1
  344. package/dist/client/assets/content-cyxWdgKQ.js +0 -1
  345. package/dist/client/assets/conversation-model-C4yb6_FA.js +0 -1
  346. package/dist/client/assets/conversation-motion-features-CifSdJtm.js +0 -1
  347. package/dist/client/assets/discover-DoiAJo4Z.js +0 -2
  348. package/dist/client/assets/embed-entry-D1Or9S4d.js +0 -2
  349. package/dist/client/assets/home-live-action-B22u89j7.js +0 -1
  350. package/dist/client/assets/home-moving-signal-BdkERL6B.js +0 -1
  351. package/dist/client/assets/home-now-card-lLkv6nQs.js +0 -1
  352. package/dist/client/assets/hooks-BPLDD9yu.js +0 -2
  353. package/dist/client/assets/index-DGoLx89y.js +0 -1
  354. package/dist/client/assets/index-DITWsjFb.css +0 -1
  355. package/dist/client/assets/index-m6dFtY5f.js +0 -1
  356. package/dist/client/assets/index-pY8-Mz7y.js +0 -1
  357. package/dist/client/assets/keyboard-nav-BhZZ5HEq.js +0 -1
  358. package/dist/client/assets/left-B6eawimv.js +0 -1
  359. package/dist/client/assets/left-BL2uBHe0.js +0 -2
  360. package/dist/client/assets/left-BNJguPDG.js +0 -1
  361. package/dist/client/assets/left-BvCtvN0f.js +0 -1
  362. package/dist/client/assets/left-CfBb6bxM.js +0 -1
  363. package/dist/client/assets/left-DTrlBF0h.js +0 -2
  364. package/dist/client/assets/left-agents-DsOHgDCY.js +0 -1
  365. package/dist/client/assets/left-d4hlBBxY.js +0 -1
  366. package/dist/client/assets/left-default-BRCwoCJr.js +0 -1
  367. package/dist/client/assets/left-lanes-DNtoRzoV.js +0 -1
  368. package/dist/client/assets/left-mission-DsTu2X5Y.js +0 -1
  369. package/dist/client/assets/left-plan-CtySjsXC.js +0 -2
  370. package/dist/client/assets/library-CLpgWNJO.js +0 -1
  371. package/dist/client/assets/mission-control-D3ikEPND.css +0 -1
  372. package/dist/client/assets/openAgent-Bjt57GdM.js +0 -1
  373. package/dist/client/assets/profile-BqY5tesX.js +0 -1
  374. package/dist/client/assets/resolve-panes-1xeZMuaw.js +0 -1
  375. package/dist/client/assets/resolve-sidebar-context-PLr32WHN.js +0 -1
  376. package/dist/client/assets/right-1x7HzabC.js +0 -1
  377. package/dist/client/assets/right-CFzPUzlF.js +0 -1
  378. package/dist/client/assets/right-CRKyeJDk.js +0 -1
  379. package/dist/client/assets/right-CagzkLWg.js +0 -1
  380. package/dist/client/assets/right-CsV149pN.js +0 -1
  381. package/dist/client/assets/right-DITNyG2s.js +0 -1
  382. package/dist/client/assets/right-E3nNcLE3.js +0 -1
  383. package/dist/client/assets/right-eUQvSjd7.js +0 -1
  384. package/dist/client/assets/right-ozp4nM44.js +0 -1
  385. package/dist/client/assets/router-Dja9_ygK.js +0 -1
  386. package/dist/client/assets/session-table-sAVe44a4.js +0 -1
  387. package/dist/client/assets/system-surfaces-redesign-CD26LFc0.css +0 -1
  388. package/dist/client/assets/terminal-sessions-D5CIR2OL.js +0 -1
  389. package/dist/client/assets/useContentSecondaryNav-ZfBNi3d4.js +0 -1
@@ -23925,7 +23925,7 @@ var init_chunk_PEYQIXJW = __esm(() => {
23925
23925
  });
23926
23926
 
23927
23927
  // node_modules/.bun/varlock@1.16.0/node_modules/varlock/dist/chunk-QUJCQE4P.js
23928
- import fs9, { readFileSync as readFileSync18, existsSync as existsSync37 } from "fs";
23928
+ import fs9, { readFileSync as readFileSync19, existsSync as existsSync37 } from "fs";
23929
23929
  import crypto3, { createHash as createHash9 } from "crypto";
23930
23930
  import net2 from "net";
23931
23931
  import { mkdir as mkdir10, writeFile as writeFile8, rename as rename2, readdir as readdir4, readFile as readFile10, rm as rm5 } from "fs/promises";
@@ -23960,7 +23960,7 @@ function writeBackValue(itemKey, newValueStr, sourceFilePath) {
23960
23960
  }
23961
23961
  function getParentPidViaProc(pid) {
23962
23962
  try {
23963
- const stat7 = readFileSync18(`/proc/${pid}/stat`, "utf8");
23963
+ const stat7 = readFileSync19(`/proc/${pid}/stat`, "utf8");
23964
23964
  const after = stat7.slice(stat7.lastIndexOf(")") + 2);
23965
23965
  const fields = after.split(" ");
23966
23966
  const ppid = Number(fields[1]);
@@ -46088,6 +46088,9 @@ var METADATA_CACHE_LIMIT4 = 512;
46088
46088
  var TOOL_CALL_STATE_KEY2 = "kimiToolCallSummaries";
46089
46089
  var TOOL_CALL_STATE_LIMIT2 = 512;
46090
46090
  var metadataCache4 = new Map;
46091
+ function trimmedString(value) {
46092
+ return typeof value === "string" && value.trim() ? value.trim() : null;
46093
+ }
46091
46094
  function recordValue(value) {
46092
46095
  return value && typeof value === "object" && !Array.isArray(value) ? value : null;
46093
46096
  }
@@ -46186,19 +46189,27 @@ function walkRecentKimiWireFiles(root, scope) {
46186
46189
  return found.sort((left, right) => right.mtimeMs - left.mtimeMs).slice(0, discoveryLimit5(scope));
46187
46190
  }
46188
46191
  function readKimiTranscriptMetadata(file2) {
46192
+ const agentId = basename5(dirname3(file2.path));
46193
+ const sessionDirectory = dirname3(dirname3(dirname3(file2.path)));
46194
+ const statePath = join8(sessionDirectory, "state.json");
46195
+ let stateMtimeMs = null;
46196
+ let stateSize = null;
46197
+ try {
46198
+ const stateStat = statSync5(statePath);
46199
+ stateMtimeMs = stateStat.mtimeMs;
46200
+ stateSize = stateStat.size;
46201
+ } catch {}
46189
46202
  const cached2 = metadataCache4.get(file2.path);
46190
- if (cached2 && cached2.mtimeMs === file2.mtimeMs && cached2.size === file2.size) {
46203
+ if (cached2 && cached2.mtimeMs === file2.mtimeMs && cached2.size === file2.size && cached2.stateMtimeMs === stateMtimeMs && cached2.stateSize === stateSize) {
46191
46204
  return cached2;
46192
46205
  }
46193
- const agentId = basename5(dirname3(file2.path));
46194
- const sessionDirectory = dirname3(dirname3(dirname3(file2.path)));
46195
46206
  const parentSessionId = basename5(sessionDirectory);
46196
46207
  let cwd = null;
46197
46208
  let title = null;
46198
46209
  try {
46199
- const state = recordValue(JSON.parse(readFileSync3(join8(sessionDirectory, "state.json"), "utf8")));
46200
- cwd = typeof state?.workDir === "string" && state.workDir.trim() ? state.workDir.trim() : null;
46201
- title = typeof state?.title === "string" && state.title.trim() ? state.title.trim() : null;
46210
+ const state = recordValue(JSON.parse(readFileSync3(statePath, "utf8")));
46211
+ cwd = trimmedString(state?.cwd) ?? trimmedString(state?.workDir);
46212
+ title = trimmedString(state?.title);
46202
46213
  } catch {}
46203
46214
  const metadata = {
46204
46215
  cwd,
@@ -46208,7 +46219,7 @@ function readKimiTranscriptMetadata(file2) {
46208
46219
  title
46209
46220
  };
46210
46221
  metadataCache4.delete(file2.path);
46211
- metadataCache4.set(file2.path, { ...file2, ...metadata });
46222
+ metadataCache4.set(file2.path, { ...file2, stateMtimeMs, stateSize, ...metadata });
46212
46223
  while (metadataCache4.size > METADATA_CACHE_LIMIT4) {
46213
46224
  const oldest = metadataCache4.keys().next().value;
46214
46225
  if (!oldest)
@@ -46217,6 +46228,10 @@ function readKimiTranscriptMetadata(file2) {
46217
46228
  }
46218
46229
  return metadata;
46219
46230
  }
46231
+ function workspaceProject(wirePath) {
46232
+ const workspaceDirectory = basename5(dirname3(dirname3(dirname3(dirname3(wirePath)))));
46233
+ return trimmedString(/^wd_(.+)_[0-9a-f]{6,}$/u.exec(workspaceDirectory)?.[1]);
46234
+ }
46220
46235
  function discoverKimiTranscripts(scope) {
46221
46236
  return walkRecentKimiWireFiles(kimiSessionsRoot(), scope).map((file2) => {
46222
46237
  const metadata = readKimiTranscriptMetadata(file2);
@@ -46225,7 +46240,7 @@ function discoverKimiTranscripts(scope) {
46225
46240
  transcriptPath: file2.path,
46226
46241
  sessionId: metadata.sessionId,
46227
46242
  cwd: metadata.cwd,
46228
- project: metadata.cwd ? basename5(metadata.cwd) : "(unknown)",
46243
+ project: (metadata.cwd ? basename5(metadata.cwd) : workspaceProject(file2.path)) ?? "(unknown)",
46229
46244
  harness: "unattributed",
46230
46245
  mtimeMs: file2.mtimeMs,
46231
46246
  size: file2.size
@@ -50871,10 +50886,26 @@ function candidateAliases(candidate) {
50871
50886
  ];
50872
50887
  return Array.from(new Set(aliases.map((alias) => trimIdentityPrefix(alias)).filter(Boolean)));
50873
50888
  }
50889
+ var explicitAliasesCache = new WeakMap;
50890
+ var aliasKeysCache = new WeakMap;
50891
+ var canonicalIdentityCache = new WeakMap;
50874
50892
  function explicitCandidateAliases(candidate) {
50893
+ const cached2 = explicitAliasesCache.get(candidate);
50894
+ if (cached2)
50895
+ return cached2;
50875
50896
  const canonical = candidateCanonicalIdentity(candidate);
50876
50897
  const implicitAliases = canonical?.definitionId === OPENSCOUT_COORDINATOR_AGENT_ID ? [SCOUT_DISPATCHER_AGENT_ID] : [];
50877
- return Array.from(new Set([...candidate.aliases ?? [], ...implicitAliases].map((alias) => normalizeAgentIdentitySegment(trimIdentityPrefix(alias))).filter(Boolean)));
50898
+ const aliases = Array.from(new Set([...candidate.aliases ?? [], ...implicitAliases].map((alias) => normalizeAgentIdentitySegment(trimIdentityPrefix(alias))).filter(Boolean)));
50899
+ explicitAliasesCache.set(candidate, aliases);
50900
+ return aliases;
50901
+ }
50902
+ function candidateAliasKeys(candidate) {
50903
+ const cached2 = aliasKeysCache.get(candidate);
50904
+ if (cached2)
50905
+ return cached2;
50906
+ const keys = explicitCandidateAliases(candidate).map(canonicalizeAliasValue);
50907
+ aliasKeysCache.set(candidate, keys);
50908
+ return keys;
50878
50909
  }
50879
50910
  function canonicalizeAliasValue(value) {
50880
50911
  const parsed = parseAgentIdentity(value.startsWith("@") ? value : `@${value}`);
@@ -50891,7 +50922,10 @@ function identityAliasKeys(identity2) {
50891
50922
  ].filter(Boolean)));
50892
50923
  }
50893
50924
  function candidateCanonicalIdentity(candidate) {
50894
- return constructAgentIdentity({
50925
+ if (canonicalIdentityCache.has(candidate)) {
50926
+ return canonicalIdentityCache.get(candidate) ?? null;
50927
+ }
50928
+ const canonical = constructAgentIdentity({
50895
50929
  definitionId: candidate.definitionId || candidate.agentId,
50896
50930
  nodeQualifier: candidate.nodeQualifier,
50897
50931
  workspaceQualifier: candidate.workspaceQualifier,
@@ -50899,6 +50933,8 @@ function candidateCanonicalIdentity(candidate) {
50899
50933
  harness: candidate.harness,
50900
50934
  model: candidate.model
50901
50935
  });
50936
+ canonicalIdentityCache.set(candidate, canonical);
50937
+ return canonical;
50902
50938
  }
50903
50939
  function candidateDimensionValue(candidate, dimension) {
50904
50940
  const canonical = candidateCanonicalIdentity(candidate);
@@ -50948,8 +50984,8 @@ function definitionMatchesIdentity(identityDefinitionId, candidateDefinitionId)
50948
50984
  }
50949
50985
  function agentIdentityMatches(identity2, candidate) {
50950
50986
  const aliasKeys = identityAliasKeys(identity2);
50951
- const candidateAliasKeys = explicitCandidateAliases(candidate).map(canonicalizeAliasValue);
50952
- if (aliasKeys.some((key) => candidateAliasKeys.includes(key))) {
50987
+ const candidateAliasKeys2 = explicitCandidateAliases(candidate).map(canonicalizeAliasValue);
50988
+ if (aliasKeys.some((key) => candidateAliasKeys2.includes(key))) {
50953
50989
  return true;
50954
50990
  }
50955
50991
  const canonical = canonicalizeIdentity({
@@ -50987,8 +51023,8 @@ function resolveAgentIdentity(identity2, candidates) {
50987
51023
  function diagnoseAgentIdentity(identity2, candidates) {
50988
51024
  const aliasKeys = identityAliasKeys(identity2);
50989
51025
  const exactAliasMatches = candidates.filter((candidate) => {
50990
- const candidateAliasKeys = explicitCandidateAliases(candidate).map(canonicalizeAliasValue);
50991
- return aliasKeys.some((key) => candidateAliasKeys.includes(key));
51026
+ const keys = candidateAliasKeys(candidate);
51027
+ return keys.length > 0 && aliasKeys.some((key) => keys.includes(key));
50992
51028
  });
50993
51029
  if (exactAliasMatches.length === 1) {
50994
51030
  return { kind: "resolved", match: exactAliasMatches[0] };
@@ -51029,15 +51065,32 @@ function buildIdentitySubset(candidate, dimensions) {
51029
51065
  ...dimensions.includes("node") && canonical.nodeQualifier ? { nodeQualifier: canonical.nodeQualifier } : {}
51030
51066
  });
51031
51067
  }
51068
+ var peersByDefinitionCache = new WeakMap;
51069
+ function peersByDefinitionId(candidates) {
51070
+ const cached2 = peersByDefinitionCache.get(candidates);
51071
+ if (cached2)
51072
+ return cached2;
51073
+ const groups = new Map;
51074
+ for (const candidate of candidates) {
51075
+ const canonical = candidateCanonicalIdentity(candidate);
51076
+ if (!canonical)
51077
+ continue;
51078
+ const group = groups.get(canonical.definitionId);
51079
+ if (group) {
51080
+ group.push(candidate);
51081
+ } else {
51082
+ groups.set(canonical.definitionId, [candidate]);
51083
+ }
51084
+ }
51085
+ peersByDefinitionCache.set(candidates, groups);
51086
+ return groups;
51087
+ }
51032
51088
  function formatMinimalAgentIdentity(candidate, candidates, options = {}) {
51033
51089
  const canonical = candidateCanonicalIdentity(candidate);
51034
51090
  if (!canonical) {
51035
51091
  return options.includeSigil === false ? "" : "@";
51036
51092
  }
51037
- const peers = candidates.filter((peer) => {
51038
- const peerCanonical = candidateCanonicalIdentity(peer);
51039
- return peerCanonical && peerCanonical.definitionId === canonical.definitionId;
51040
- });
51093
+ const peers = peersByDefinitionId(candidates).get(canonical.definitionId) ?? [];
51041
51094
  const aliasMatches = explicitCandidateAliases(candidate).map((alias) => ({ alias, identity: parseAgentIdentity(`@${alias}`) })).filter((entry) => Boolean(entry.identity)).filter((entry) => resolveAgentIdentity(entry.identity, candidates) === candidate).sort((left, right) => left.alias.length - right.alias.length || left.alias.localeCompare(right.alias));
51042
51095
  if (aliasMatches.length > 0) {
51043
51096
  return formatAgentIdentity({ definitionId: aliasMatches[0].alias }, options);
@@ -52353,7 +52406,7 @@ function inferMcpIdempotence(annotations) {
52353
52406
  // packages/protocol/src/runtime-catalog.generated.ts
52354
52407
  var SCOUT_RUNTIME_CATALOG_DATA = {
52355
52408
  schemaVersion: "openscout.runtime-catalog.v1",
52356
- revision: "2026-08-12.1",
52409
+ revision: "2026-08-18.1",
52357
52410
  harnesses: [
52358
52411
  {
52359
52412
  id: "claude",
@@ -52482,6 +52535,7 @@ var SCOUT_RUNTIME_CATALOG_DATA = {
52482
52535
  id: "grok",
52483
52536
  label: "Grok CLI",
52484
52537
  enabled: true,
52538
+ listed: false,
52485
52539
  reasoningEfforts: [
52486
52540
  "low",
52487
52541
  "medium",
@@ -52517,7 +52571,7 @@ var SCOUT_RUNTIME_CATALOG_DATA = {
52517
52571
  },
52518
52572
  {
52519
52573
  id: "grok-acp",
52520
- label: "Grok ACP",
52574
+ label: "Grok",
52521
52575
  enabled: true,
52522
52576
  reasoningEfforts: null,
52523
52577
  models: [
@@ -53011,6 +53065,9 @@ function harness(value, path, errors3) {
53011
53065
  errors3.push(`${path}.label is required`);
53012
53066
  if (typeof input.enabled !== "boolean")
53013
53067
  errors3.push(`${path}.enabled must be boolean`);
53068
+ if (input.listed !== undefined && typeof input.listed !== "boolean") {
53069
+ errors3.push(`${path}.listed must be boolean when provided`);
53070
+ }
53014
53071
  if (input.default === true && input.enabled !== true)
53015
53072
  errors3.push(`${path} cannot be default while disabled`);
53016
53073
  const efforts = effortList(input.reasoningEfforts, `${path}.reasoningEfforts`, errors3);
@@ -53049,6 +53106,7 @@ function harness(value, path, errors3) {
53049
53106
  id,
53050
53107
  label,
53051
53108
  enabled: input.enabled,
53109
+ ...typeof input.listed === "boolean" ? { listed: input.listed } : {},
53052
53110
  ...input.default === true ? { default: true } : {},
53053
53111
  reasoningEfforts: efforts,
53054
53112
  ...defaultEffort && reasoningEfforts.has(defaultEffort) ? { defaultReasoningEffort: defaultEffort } : {},
@@ -53337,7 +53395,7 @@ function normalizeTerminalWorkspaceColumns(value) {
53337
53395
  // packages/protocol/src/rendezvous.ts
53338
53396
  var SCOUT_RENDEZVOUS_GENERATED_CODENAME_LENGTH = 6;
53339
53397
  var SCOUT_RENDEZVOUS_CODENAME_MAX_LENGTH = 32;
53340
- var SCOUT_RENDEZVOUS_INVITE_TTL_MS = 10 * 60000;
53398
+ var SCOUT_RENDEZVOUS_INVITE_TTL_MS = 4 * 60 * 60000;
53341
53399
  var SCOUT_RENDEZVOUS_MAX_WAIT_MS = 10 * 60000;
53342
53400
  function normalizeScoutRendezvousCodename(codename) {
53343
53401
  return codename.normalize("NFKC").trim().toLocaleUpperCase("en-US");
@@ -55465,7 +55523,7 @@ class BrokerWorkItemStore {
55465
55523
 
55466
55524
  // packages/runtime/src/local-agents.ts
55467
55525
  import { randomUUID as randomUUID3 } from "crypto";
55468
- import { existsSync as existsSync34, readFileSync as readFileSync17 } from "fs";
55526
+ import { existsSync as existsSync34, readFileSync as readFileSync18 } from "fs";
55469
55527
  import { mkdir as mkdir9, readFile as readFile9, rm as rm4, stat as stat6, writeFile as writeFile7 } from "fs/promises";
55470
55528
  import { basename as basename16, dirname as dirname20, join as join37, resolve as resolve11 } from "path";
55471
55529
  import { fileURLToPath as fileURLToPath6 } from "url";
@@ -57022,14 +57080,20 @@ function herdrProbeTarget(env) {
57022
57080
  return {
57023
57081
  bin: herdrBin(env),
57024
57082
  path: env.PATH ?? "",
57025
- home: env.XDG_CONFIG_HOME?.trim() || env.HOME?.trim() || homedir17()
57083
+ home: env.HOME?.trim() || homedir17(),
57084
+ xdgConfigHome: env.XDG_CONFIG_HOME?.trim() || null
57026
57085
  };
57027
57086
  }
57028
57087
  function parseHerdrProbeKey(key) {
57029
57088
  try {
57030
57089
  const parsed = JSON.parse(key);
57031
57090
  if (typeof parsed?.bin === "string" && typeof parsed.path === "string" && typeof parsed.home === "string") {
57032
- return { bin: parsed.bin, path: parsed.path, home: parsed.home };
57091
+ return {
57092
+ bin: parsed.bin,
57093
+ path: parsed.path,
57094
+ home: parsed.home,
57095
+ xdgConfigHome: typeof parsed.xdgConfigHome === "string" && parsed.xdgConfigHome.trim() ? parsed.xdgConfigHome.trim() : null
57096
+ };
57033
57097
  }
57034
57098
  } catch {}
57035
57099
  return herdrProbeTarget(process.env);
@@ -57071,8 +57135,13 @@ function parseHerdrSessionListJson(output) {
57071
57135
  async function readHerdrSessionsLocal(key, ctx) {
57072
57136
  const target = parseHerdrProbeKey(key);
57073
57137
  try {
57138
+ const env = { ...process.env, PATH: target.path, HOME: target.home };
57139
+ if (target.xdgConfigHome)
57140
+ env.XDG_CONFIG_HOME = target.xdgConfigHome;
57141
+ else
57142
+ delete env.XDG_CONFIG_HOME;
57074
57143
  const { stdout } = await execProbeFile(ctx, target.bin, ["session", "list", "--json"], {
57075
- env: { ...process.env, PATH: target.path, HOME: target.home, XDG_CONFIG_HOME: target.home },
57144
+ env,
57076
57145
  maxStdoutBytes: 512 * 1024,
57077
57146
  maxStderrBytes: 64 * 1024
57078
57147
  });
@@ -57103,6 +57172,7 @@ var herdrSessionsProbe = defineProbeFamily({
57103
57172
  });
57104
57173
  }
57105
57174
  });
57175
+ var herdrTopologyCache = new Map;
57106
57176
  // packages/runtime/src/system-probes/sessions.ts
57107
57177
  import { createReadStream as createReadStream2 } from "fs";
57108
57178
  import { readdir, stat as stat2 } from "fs/promises";
@@ -65729,7 +65799,7 @@ function buildInvocationCollaborationContextPrompt(invocation) {
65729
65799
  }
65730
65800
 
65731
65801
  // packages/runtime/src/pi-rpc.ts
65732
- import { existsSync as existsSync26 } from "fs";
65802
+ import { existsSync as existsSync26, readFileSync as readFileSync10, statSync as statSync13 } from "fs";
65733
65803
  import { mkdir as mkdir6, writeFile as writeFile4 } from "fs/promises";
65734
65804
  import { execFileSync as execFileSync2 } from "child_process";
65735
65805
  import { homedir as homedir26 } from "os";
@@ -65825,7 +65895,37 @@ function inferPiProvider(launch) {
65825
65895
  }
65826
65896
  return;
65827
65897
  }
65828
- function readSecretValue(name, commandOverride) {
65898
+ function readPiRpcCredentialFile(name, options = {}) {
65899
+ if (!/^[A-Z0-9_]+$/.test(name)) {
65900
+ return;
65901
+ }
65902
+ const env = options.env ?? process.env;
65903
+ const platform = options.platform ?? process.platform;
65904
+ const directory = normalizeOptionalString(env.CREDENTIALS_DIRECTORY) ?? normalizeOptionalString(env.OPENSCOUT_CREDENTIALS_DIRECTORY) ?? (platform === "linux" ? join28(normalizeOptionalString(env.XDG_CONFIG_HOME) ?? join28(options.homedir ?? homedir26(), ".config"), "openscout", "credentials") : undefined);
65905
+ if (!directory) {
65906
+ return;
65907
+ }
65908
+ try {
65909
+ const directoryStat = statSync13(directory);
65910
+ if (!directoryStat.isDirectory() || (directoryStat.mode & 63) !== 0) {
65911
+ return;
65912
+ }
65913
+ const path = join28(directory, name);
65914
+ const stat4 = statSync13(path);
65915
+ if (!stat4.isFile() || (stat4.mode & 63) !== 0 || stat4.size > 16 * 1024) {
65916
+ return;
65917
+ }
65918
+ const value = readFileSync10(path, "utf8").trim();
65919
+ return value || undefined;
65920
+ } catch {
65921
+ return;
65922
+ }
65923
+ }
65924
+ function readSecretValue(name, commandOverride, env = process.env) {
65925
+ const credentialFile = readPiRpcCredentialFile(name, { env });
65926
+ if (credentialFile) {
65927
+ return credentialFile;
65928
+ }
65829
65929
  try {
65830
65930
  const output = execFileSync2(commandOverride || "secret", ["get", name], {
65831
65931
  encoding: "utf8",
@@ -65859,7 +65959,7 @@ function buildPiRpcCredentialEnv(launch, sources2 = {}) {
65859
65959
  }
65860
65960
  const env = {};
65861
65961
  const sourceEnv = sources2.env ?? process.env;
65862
- const readSecret = sources2.readSecret ?? ((name) => readSecretValue(name, sources2.secretCommand));
65962
+ const readSecret = sources2.readSecret ?? ((name) => readSecretValue(name, sources2.secretCommand, sourceEnv));
65863
65963
  for (const mapping of mappings) {
65864
65964
  const value = readMappedCredentialValue(mapping, sourceEnv, readSecret);
65865
65965
  if (value) {
@@ -66162,7 +66262,7 @@ async function shutdownPiRpcAgent(options) {
66162
66262
 
66163
66263
  // packages/runtime/src/setup.ts
66164
66264
  import { execFileSync as execFileSync4 } from "child_process";
66165
- import { existsSync as existsSync29, readFileSync as readFileSync12 } from "fs";
66265
+ import { existsSync as existsSync29, readFileSync as readFileSync13 } from "fs";
66166
66266
  import { access, chmod, mkdir as mkdir8, readdir as readdir3, readFile as readFile8, realpath, rm as rm3, stat as stat5, writeFile as writeFile6 } from "fs/promises";
66167
66267
  import { homedir as homedir29, hostname as hostname3, userInfo } from "os";
66168
66268
  import { basename as basename15, dirname as dirname16, isAbsolute as isAbsolute2, join as join32, relative as relative6, resolve as resolve9 } from "path";
@@ -67116,7 +67216,7 @@ function parse5(toml, { maxDepth = 1000, integersAsBigInt } = {}) {
67116
67216
 
67117
67217
  // packages/runtime/src/harness-catalog.ts
67118
67218
  import { execFileSync as execFileSync3 } from "child_process";
67119
- import { existsSync as existsSync27, statSync as statSync13 } from "fs";
67219
+ import { existsSync as existsSync27, statSync as statSync14 } from "fs";
67120
67220
  import { mkdir as mkdir7, readFile as readFile6, writeFile as writeFile5 } from "fs/promises";
67121
67221
  import { homedir as homedir27 } from "os";
67122
67222
  import { dirname as dirname13, join as join29 } from "path";
@@ -67701,7 +67801,7 @@ function defaultRequirementExists(requirement) {
67701
67801
  if (requirement.fileType === "any" || !requirement.fileType)
67702
67802
  return true;
67703
67803
  try {
67704
- const fileStat = statSync13(expanded);
67804
+ const fileStat = statSync14(expanded);
67705
67805
  return requirement.fileType === "directory" ? fileStat.isDirectory() : fileStat.isFile();
67706
67806
  } catch {
67707
67807
  return false;
@@ -67990,7 +68090,7 @@ import {
67990
68090
  chmodSync,
67991
68091
  existsSync as existsSync28,
67992
68092
  mkdirSync as mkdirSync3,
67993
- readFileSync as readFileSync10,
68093
+ readFileSync as readFileSync11,
67994
68094
  renameSync,
67995
68095
  rmSync as rmSync2,
67996
68096
  writeFileSync as writeFileSync3
@@ -68058,7 +68158,7 @@ function resolveStableLocalNodeId(input) {
68058
68158
  function readAndValidateNodeIdentity(path) {
68059
68159
  let parsed;
68060
68160
  try {
68061
- parsed = JSON.parse(readFileSync10(path, "utf8"));
68161
+ parsed = JSON.parse(readFileSync11(path, "utf8"));
68062
68162
  } catch {
68063
68163
  throw new Error(`Corrupt node identity at ${path}; remove it to generate a fresh one.`);
68064
68164
  }
@@ -68219,7 +68319,7 @@ function importPublicKey(publicKeyBase64) {
68219
68319
  }
68220
68320
 
68221
68321
  // packages/runtime/src/open-scout-network.ts
68222
- import { readFileSync as readFileSync11 } from "fs";
68322
+ import { readFileSync as readFileSync12 } from "fs";
68223
68323
  var DEFAULT_OPENSCOUT_NETWORK_RENDEZVOUS_URL = "https://mesh.oscout.net";
68224
68324
  var DEFAULT_OPENSCOUT_NETWORK_PAIRING_RELAY_URL = "wss://mesh.oscout.net/v1/relay";
68225
68325
  function defaultOpenScoutNetworkSettings() {
@@ -68242,7 +68342,7 @@ function normalizeOpenScoutNetworkSettings(input) {
68242
68342
  }
68243
68343
  function readOpenScoutNetworkSettingsSync() {
68244
68344
  try {
68245
- const raw = readFileSync11(resolveOpenScoutSupportPaths().settingsPath, "utf8");
68345
+ const raw = readFileSync12(resolveOpenScoutSupportPaths().settingsPath, "utf8");
68246
68346
  const parsed = JSON.parse(raw);
68247
68347
  const network = isRecord9(parsed) && isRecord9(parsed.network) ? parsed.network : {};
68248
68348
  return normalizeOpenScoutNetworkSettings(isRecord9(network.openScoutNetwork) ? network.openScoutNetwork : {});
@@ -68926,7 +69026,7 @@ function resolveNodeQualifier() {
68926
69026
  function readNodeAliasSync() {
68927
69027
  try {
68928
69028
  const settingsPath = resolveOpenScoutSupportPaths().settingsPath;
68929
- const raw = readFileSync12(settingsPath, "utf8");
69029
+ const raw = readFileSync13(settingsPath, "utf8");
68930
69030
  const settings = JSON.parse(raw);
68931
69031
  return settings.node?.alias?.trim() || null;
68932
69032
  } catch {
@@ -68937,14 +69037,14 @@ function readGitHeadBranch(projectRoot) {
68937
69037
  const dotGitPath = join32(projectRoot, ".git");
68938
69038
  let gitDirectory = dotGitPath;
68939
69039
  try {
68940
- const marker = readFileSync12(dotGitPath, "utf8");
69040
+ const marker = readFileSync13(dotGitPath, "utf8");
68941
69041
  const match = /^gitdir:\s*(.+)\s*$/imu.exec(marker);
68942
69042
  if (!match?.[1])
68943
69043
  return { found: false, branch: null };
68944
69044
  gitDirectory = isAbsolute2(match[1]) ? match[1] : resolve9(projectRoot, match[1]);
68945
69045
  } catch {}
68946
69046
  try {
68947
- const head = readFileSync12(join32(gitDirectory, "HEAD"), "utf8").trim();
69047
+ const head = readFileSync13(join32(gitDirectory, "HEAD"), "utf8").trim();
68948
69048
  const match = /^ref:\s*refs\/heads\/(.+)$/u.exec(head);
68949
69049
  return { found: true, branch: match?.[1]?.trim() || null };
68950
69050
  } catch {
@@ -70581,7 +70681,7 @@ function buildInteractiveTerminalShellDirectives() {
70581
70681
 
70582
70682
  // packages/runtime/src/broker-process-manager.ts
70583
70683
  import { spawn as spawn6, spawnSync as spawnSync3 } from "child_process";
70584
- import { existsSync as existsSync32, mkdirSync as mkdirSync5, readFileSync as readFileSync15, renameSync as renameSync3, writeFileSync as writeFileSync5 } from "fs";
70684
+ import { existsSync as existsSync32, mkdirSync as mkdirSync5, readFileSync as readFileSync16, renameSync as renameSync3, writeFileSync as writeFileSync5 } from "fs";
70585
70685
  import { homedir as homedir31, networkInterfaces } from "os";
70586
70686
  import { dirname as dirname18, join as join34, resolve as resolve10 } from "path";
70587
70687
  import { fileURLToPath as fileURLToPath5 } from "url";
@@ -70974,13 +71074,13 @@ class NodeSqliteDatabaseAdapter {
70974
71074
  }
70975
71075
 
70976
71076
  // packages/runtime/src/tailscale.ts
70977
- import { readFileSync as readFileSync13 } from "fs";
71077
+ import { readFileSync as readFileSync14 } from "fs";
70978
71078
  import { execFileSync as execFileSync5 } from "child_process";
70979
71079
  var DEFAULT_TAILSCALE_STATUS_TIMEOUT_MS2 = 1500;
70980
71080
  var SYNC_TAILSCALE_STATUS_CACHE_MS = 30000;
70981
71081
  var syncStatusCache = null;
70982
71082
  function readStatusJsonFromFileSync(filePath) {
70983
- const raw = readFileSync13(filePath, "utf8");
71083
+ const raw = readFileSync14(filePath, "utf8");
70984
71084
  return parseTailscaleStatusJson(raw);
70985
71085
  }
70986
71086
  function statusTimeoutMs2(env) {
@@ -71052,7 +71152,7 @@ function readTailscaleSelfWebHostsSync(env = process.env) {
71052
71152
  import {
71053
71153
  existsSync as existsSync31,
71054
71154
  mkdirSync as mkdirSync4,
71055
- readFileSync as readFileSync14,
71155
+ readFileSync as readFileSync15,
71056
71156
  renameSync as renameSync2,
71057
71157
  writeFileSync as writeFileSync4
71058
71158
  } from "fs";
@@ -71092,7 +71192,7 @@ function loadLocalConfig() {
71092
71192
  if (!existsSync31(configPath))
71093
71193
  return { version: LOCAL_CONFIG_VERSION };
71094
71194
  try {
71095
- return validateLocalConfig(JSON.parse(readFileSync14(configPath, "utf8")));
71195
+ return validateLocalConfig(JSON.parse(readFileSync15(configPath, "utf8")));
71096
71196
  } catch {
71097
71197
  return { version: LOCAL_CONFIG_VERSION };
71098
71198
  }
@@ -71188,7 +71288,7 @@ function readPersistedAdvertiseScope(supportDirectory) {
71188
71288
  if (!existsSync32(path))
71189
71289
  return null;
71190
71290
  try {
71191
- const parsed = JSON.parse(readFileSync15(path, "utf8"));
71291
+ const parsed = JSON.parse(readFileSync16(path, "utf8"));
71192
71292
  if (parsed.version !== 1)
71193
71293
  return null;
71194
71294
  if (parsed.advertiseScope === "mesh" || parsed.advertiseScope === "local") {
@@ -71814,7 +71914,7 @@ async function runScoutdServiceCommand(command, config2, timeoutMs = SCOUTD_DEFA
71814
71914
  function readCoreAgentsSync() {
71815
71915
  try {
71816
71916
  const settingsPath = resolveOpenScoutSupportPaths().settingsPath;
71817
- const raw = readFileSync15(settingsPath, "utf8");
71917
+ const raw = readFileSync16(settingsPath, "utf8");
71818
71918
  const settings = JSON.parse(raw);
71819
71919
  const raw_agents = settings?.agents?.coreAgents;
71820
71920
  if (Array.isArray(raw_agents)) {
@@ -71830,7 +71930,7 @@ function readLogLines(path) {
71830
71930
  if (!existsSync32(path)) {
71831
71931
  return [];
71832
71932
  }
71833
- return readFileSync15(path, "utf8").split(`
71933
+ return readFileSync16(path, "utf8").split(`
71834
71934
  `).map((line) => line.trim()).filter(Boolean);
71835
71935
  }
71836
71936
  function isPackageScriptBanner(line) {
@@ -72060,7 +72160,7 @@ var LOCAL_AGENT_SYSTEM_PROMPT_TEMPLATE_HINT = [
72060
72160
  ].join("");
72061
72161
 
72062
72162
  // packages/runtime/src/relay-agent-process-leases.ts
72063
- import { existsSync as existsSync33, mkdirSync as mkdirSync6, readdirSync as readdirSync12, readFileSync as readFileSync16, rmSync as rmSync3, writeFileSync as writeFileSync6 } from "fs";
72163
+ import { existsSync as existsSync33, mkdirSync as mkdirSync6, readdirSync as readdirSync12, readFileSync as readFileSync17, rmSync as rmSync3, writeFileSync as writeFileSync6 } from "fs";
72064
72164
  import { join as join35 } from "path";
72065
72165
  var RELAY_AGENT_PROCESS_LEASE_PREFIX = "relay-agent-";
72066
72166
  function processLeasesDirectory() {
@@ -72101,7 +72201,7 @@ function readRelayAgentProcessLeases() {
72101
72201
  continue;
72102
72202
  }
72103
72203
  try {
72104
- const parsed = JSON.parse(readFileSync16(join35(directory, entry), "utf8"));
72204
+ const parsed = JSON.parse(readFileSync17(join35(directory, entry), "utf8"));
72105
72205
  if (parsed?.kind === "relay_agent" && parsed.sessionName?.trim() && parsed.agentId?.trim()) {
72106
72206
  leases.push(parsed);
72107
72207
  }
@@ -72298,7 +72398,7 @@ function resolveProjectsRoot(projectPath) {
72298
72398
  if (!existsSync34(supportPaths.settingsPath)) {
72299
72399
  return dirname20(projectPath);
72300
72400
  }
72301
- const raw = JSON.parse(readFileSync17(supportPaths.settingsPath, "utf8"));
72401
+ const raw = JSON.parse(readFileSync18(supportPaths.settingsPath, "utf8"));
72302
72402
  const workspaceRoot = raw.discovery?.workspaceRoots?.find((entry) => typeof entry === "string" && entry.trim().length > 0);
72303
72403
  return workspaceRoot ? resolve11(workspaceRoot) : dirname20(projectPath);
72304
72404
  } catch {
@@ -74547,7 +74647,7 @@ async function ensureLocalAgentOnlineOnce(agentName, record3) {
74547
74647
  }
74548
74648
  }
74549
74649
  if (!sessionOnline) {
74550
- const stderrTail = existsSync34(stderrLogFile) ? readFileSync17(stderrLogFile, "utf8").trim().split(/\r?\n/).slice(-10).join(`
74650
+ const stderrTail = existsSync34(stderrLogFile) ? readFileSync18(stderrLogFile, "utf8").trim().split(/\r?\n/).slice(-10).join(`
74551
74651
  `).trim() : "";
74552
74652
  throw new Error(stderrTail ? `Relay agent ${agentName} failed to stay online:
74553
74653
  ${redactSecrets(stderrTail)}` : `Relay agent ${agentName} failed to stay online.`);
@@ -74571,7 +74671,7 @@ function readPersistedSessionCatalogId(runtimeDir) {
74571
74671
  try {
74572
74672
  const catalogPath = join37(runtimeDir, "session-catalog.json");
74573
74673
  if (existsSync34(catalogPath)) {
74574
- const raw = readFileSync17(catalogPath, "utf8").trim();
74674
+ const raw = readFileSync18(catalogPath, "utf8").trim();
74575
74675
  if (raw) {
74576
74676
  const catalog = JSON.parse(raw);
74577
74677
  if (typeof catalog.activeSessionId === "string" && catalog.activeSessionId.trim()) {
@@ -74588,7 +74688,7 @@ function readPersistedLegacySessionId(runtimeDir, filename) {
74588
74688
  try {
74589
74689
  const legacyPath = join37(runtimeDir, filename);
74590
74690
  if (existsSync34(legacyPath)) {
74591
- const value = readFileSync17(legacyPath, "utf8").trim();
74691
+ const value = readFileSync18(legacyPath, "utf8").trim();
74592
74692
  return value || null;
74593
74693
  }
74594
74694
  return null;
@@ -74684,6 +74784,7 @@ function buildLocalAgentBinding(agentId, record3, alive, nodeId, source) {
74684
74784
  labels: ["relay", "project", "agent", "local-agent"],
74685
74785
  metadata: {
74686
74786
  source,
74787
+ brokerRegistered: true,
74687
74788
  ...normalizedRecord.registrationSource ? { registrationSource: normalizedRecord.registrationSource } : {},
74688
74789
  project: normalizedRecord.project,
74689
74790
  projectRoot,
@@ -79583,10 +79684,7 @@ class BrokerRendezvousService {
79583
79684
  suggestion: "choose_another_codename"
79584
79685
  };
79585
79686
  }
79586
- const expiredInvite = this.expiredInvites.get(key);
79587
- if (expiredInvite) {
79588
- return expiredResponse(expiredInvite, participantId);
79589
- }
79687
+ this.expiredInvites.delete(key);
79590
79688
  return this.createPresence(projectRoot, participantId, requestedCodename, normalizedCodename, now);
79591
79689
  }
79592
79690
  for (let attempt = 0;attempt < MAX_CODENAME_GENERATION_ATTEMPTS; attempt += 1) {
@@ -80965,7 +81063,7 @@ import {
80965
81063
  generateKeyPairSync as generateKeyPairSync2,
80966
81064
  randomBytes as randomBytes6
80967
81065
  } from "crypto";
80968
- import { chmodSync as chmodSync2, existsSync as existsSync39, mkdirSync as mkdirSync8, readFileSync as readFileSync19, renameSync as renameSync4, writeFileSync as writeFileSync8 } from "fs";
81066
+ import { chmodSync as chmodSync2, existsSync as existsSync39, mkdirSync as mkdirSync8, readFileSync as readFileSync20, renameSync as renameSync4, writeFileSync as writeFileSync8 } from "fs";
80969
81067
  import { dirname as dirname24, join as join43 } from "path";
80970
81068
 
80971
81069
  // node_modules/.bun/@peculiar+x509@1.12.3/node_modules/@peculiar/x509/build/x509.es.js
@@ -93254,7 +93352,7 @@ async function createTlsIdentity(supportDirectory, options) {
93254
93352
  function readAndValidateTlsIdentity(path7) {
93255
93353
  let parsed;
93256
93354
  try {
93257
- parsed = JSON.parse(readFileSync19(path7, "utf8"));
93355
+ parsed = JSON.parse(readFileSync20(path7, "utf8"));
93258
93356
  } catch {
93259
93357
  throw new Error(`Corrupt node TLS identity at ${path7}; remove it to generate a fresh one.`);
93260
93358
  }
@@ -93998,7 +94096,7 @@ async function postJson(brokerUrl, path7, payload, options) {
93998
94096
  const url2 = `${brokerUrl.replace(/\/$/, "")}${path7}`;
93999
94097
  let response;
94000
94098
  try {
94001
- response = await meshPeerFetch(brokerUrl, path7, {
94099
+ response = await (options?.peerFetch ?? meshPeerFetch)(brokerUrl, path7, {
94002
94100
  method: "POST",
94003
94101
  headers: {
94004
94102
  "content-type": "application/json",
@@ -94079,13 +94177,13 @@ async function forwardMeshCollaborationRecord(target2, bundle, options) {
94079
94177
  async function forwardMeshCollaborationEvent(target2, bundle, options) {
94080
94178
  return forwardMeshEnvelope(target2, "collaboration/events", "/v1/mesh/collaboration/events", bundle, options);
94081
94179
  }
94082
- async function fetchPeerAgents(brokerUrl) {
94083
- let response = await meshPeerFetch(brokerUrl, "/v1/mesh/snapshot", {
94180
+ async function fetchPeerAgents(brokerUrl, peerFetch = meshPeerFetch) {
94181
+ let response = await peerFetch(brokerUrl, "/v1/mesh/snapshot", {
94084
94182
  headers: { accept: "application/json" },
94085
94183
  signal: AbortSignal.timeout(5000)
94086
94184
  });
94087
94185
  if (response.status === 404) {
94088
- response = await meshPeerFetch(brokerUrl, "/v1/snapshot", {
94186
+ response = await peerFetch(brokerUrl, "/v1/snapshot", {
94089
94187
  headers: { accept: "application/json" },
94090
94188
  signal: AbortSignal.timeout(5000)
94091
94189
  });
@@ -94619,7 +94717,7 @@ class RelayAgentSessionReaper {
94619
94717
  }
94620
94718
 
94621
94719
  // packages/runtime/src/pairing-session-agents.ts
94622
- import { existsSync as existsSync40, readFileSync as readFileSync20 } from "fs";
94720
+ import { existsSync as existsSync40, readFileSync as readFileSync21 } from "fs";
94623
94721
  import { basename as basename20, join as join44 } from "path";
94624
94722
  import { homedir as homedir34 } from "os";
94625
94723
  var DEFAULT_PAIRING_PORT = 43130;
@@ -94641,7 +94739,7 @@ function readJsonFile4(filePath) {
94641
94739
  return null;
94642
94740
  }
94643
94741
  try {
94644
- return JSON.parse(readFileSync20(filePath, "utf8"));
94742
+ return JSON.parse(readFileSync21(filePath, "utf8"));
94645
94743
  } catch {
94646
94744
  return null;
94647
94745
  }
@@ -104741,7 +104839,7 @@ class ThreadEventPlane {
104741
104839
  }
104742
104840
 
104743
104841
  // packages/runtime/src/build-info.ts
104744
- import { readFileSync as readFileSync21 } from "fs";
104842
+ import { readFileSync as readFileSync22 } from "fs";
104745
104843
  import { dirname as dirname26, join as join46 } from "path";
104746
104844
  import { fileURLToPath as fileURLToPath9 } from "url";
104747
104845
  var cachedBuildIdentity = null;
@@ -104757,7 +104855,7 @@ function envString(...names2) {
104757
104855
  function readRuntimePackageJson() {
104758
104856
  try {
104759
104857
  const packagePath = join46(dirname26(fileURLToPath9(import.meta.url)), "..", "package.json");
104760
- const parsed = JSON.parse(readFileSync21(packagePath, "utf8"));
104858
+ const parsed = JSON.parse(readFileSync22(packagePath, "utf8"));
104761
104859
  return {
104762
104860
  name: typeof parsed.name === "string" && parsed.name.trim() ? parsed.name.trim() : null,
104763
104861
  version: typeof parsed.version === "string" && parsed.version.trim() ? parsed.version.trim() : null
@@ -105438,7 +105536,7 @@ function createBrokerCoreService(deps) {
105438
105536
  }
105439
105537
 
105440
105538
  // packages/runtime/src/mesh-rendezvous.ts
105441
- import { existsSync as existsSync42, readFileSync as readFileSync22 } from "fs";
105539
+ import { existsSync as existsSync42, readFileSync as readFileSync23 } from "fs";
105442
105540
  import { homedir as homedir35 } from "os";
105443
105541
  import { join as join47 } from "path";
105444
105542
  var DEFAULT_RENDEZVOUS_TTL_MS = 60000;
@@ -105545,7 +105643,7 @@ function readMobilePairingMeshEntrypoint(env = process.env, now = Date.now()) {
105545
105643
  return;
105546
105644
  }
105547
105645
  try {
105548
- return mobilePairingMeshEntrypointFromSnapshot(JSON.parse(readFileSync22(runtimeStatePath, "utf8")), now);
105646
+ return mobilePairingMeshEntrypointFromSnapshot(JSON.parse(readFileSync23(runtimeStatePath, "utf8")), now);
105549
105647
  } catch {
105550
105648
  return;
105551
105649
  }
@@ -105650,7 +105748,7 @@ function isPublicKeyHex(value) {
105650
105748
 
105651
105749
  // packages/runtime/src/mobile-push.ts
105652
105750
  import { Database as Database2 } from "bun:sqlite";
105653
- import { mkdirSync as mkdirSync10, readFileSync as readFileSync23 } from "fs";
105751
+ import { mkdirSync as mkdirSync10, readFileSync as readFileSync24 } from "fs";
105654
105752
  import { connect as connectHttp2 } from "http2";
105655
105753
  import { createPrivateKey as createPrivateKey3, sign as signWithKey } from "crypto";
105656
105754
  import { dirname as dirname27, join as join48 } from "path";
@@ -105908,7 +106006,7 @@ function loadApnsCredentials() {
105908
106006
  privateKeyPem = Buffer.from(inlineBase64, "base64").toString("utf8");
105909
106007
  }
105910
106008
  if (!privateKeyPem && path7) {
105911
- privateKeyPem = readFileSync23(path7, "utf8");
106009
+ privateKeyPem = readFileSync24(path7, "utf8");
105912
106010
  }
105913
106011
  if (!teamId || !keyId || !privateKeyPem) {
105914
106012
  return null;
@@ -110473,7 +110571,7 @@ function localInvocationTargetIdentity(targetId, agent, actor) {
110473
110571
  }
110474
110572
 
110475
110573
  // packages/runtime/src/provisional-agent-names-config.ts
110476
- import { existsSync as existsSync44, readFileSync as readFileSync24, writeFileSync as writeFileSync9, mkdirSync as mkdirSync12 } from "fs";
110574
+ import { existsSync as existsSync44, readFileSync as readFileSync25, writeFileSync as writeFileSync9, mkdirSync as mkdirSync12 } from "fs";
110477
110575
  import { homedir as homedir37 } from "os";
110478
110576
  import { isAbsolute as isAbsolute4, join as join54, resolve as resolve20 } from "path";
110479
110577
  function openScoutHome() {
@@ -110509,7 +110607,7 @@ function resolvePoolFilePath(filePath) {
110509
110607
  return isAbsolute4(trimmed) ? trimmed : resolve20(openScoutHome(), trimmed);
110510
110608
  }
110511
110609
  function readProvisionalAgentNamesJsonFile(filePath) {
110512
- return parseProvisionalAgentNamesJson(readFileSync24(filePath, "utf8"));
110610
+ return parseProvisionalAgentNamesJson(readFileSync25(filePath, "utf8"));
110513
110611
  }
110514
110612
  function loadInlineProvisionalAgentNames(config2) {
110515
110613
  const customNames = normalizeProvisionalAgentNamesSetting(config2.provisionalAgentNames);
@@ -110654,7 +110752,7 @@ function resolveProjectProvisionalAgentName(input) {
110654
110752
  }
110655
110753
 
110656
110754
  // packages/runtime/src/session-locator.ts
110657
- import { existsSync as existsSync45, readdirSync as readdirSync14, readFileSync as readFileSync25, statSync as statSync14 } from "fs";
110755
+ import { existsSync as existsSync45, readdirSync as readdirSync14, readFileSync as readFileSync26, statSync as statSync15 } from "fs";
110658
110756
  import { homedir as homedir38 } from "os";
110659
110757
  import { basename as basename23, join as join55, resolve as resolve21 } from "path";
110660
110758
  var CODEX_HARNESS = "codex";
@@ -110671,7 +110769,7 @@ function pathExists4(path7) {
110671
110769
  }
110672
110770
  function safeStatMtimeMs(path7) {
110673
110771
  try {
110674
- return statSync14(path7).mtimeMs;
110772
+ return statSync15(path7).mtimeMs;
110675
110773
  } catch {
110676
110774
  return 0;
110677
110775
  }
@@ -110691,7 +110789,7 @@ function walkFiles(root, predicate, into = [], depth = 0) {
110691
110789
  const full = join55(root, name2);
110692
110790
  let isDir = false;
110693
110791
  try {
110694
- isDir = statSync14(full).isDirectory();
110792
+ isDir = statSync15(full).isDirectory();
110695
110793
  } catch {
110696
110794
  continue;
110697
110795
  }
@@ -110706,7 +110804,7 @@ function walkFiles(root, predicate, into = [], depth = 0) {
110706
110804
  function readFirstJsonlRecords(path7, maxLines = 8) {
110707
110805
  let text3;
110708
110806
  try {
110709
- const fdChunk = readFileSync25(path7, { encoding: "utf8" });
110807
+ const fdChunk = readFileSync26(path7, { encoding: "utf8" });
110710
110808
  text3 = fdChunk.length > 256000 ? fdChunk.slice(0, 256000) : fdChunk;
110711
110809
  } catch {
110712
110810
  return [];
@@ -111494,7 +111592,7 @@ async function handleBrokerHttpEntityWriteRoute(input) {
111494
111592
  }
111495
111593
  return true;
111496
111594
  }
111497
- if (method === "POST" && url2.pathname === "/v1/flights") {
111595
+ if (method === "POST" && (url2.pathname === "/v1/flights" || url2.pathname === "/v1/mesh/flights")) {
111498
111596
  try {
111499
111597
  const flight = await readRequestBody(request);
111500
111598
  await recordFlight(flight);
@@ -114650,8 +114748,16 @@ class BrokerMeshBundleService {
114650
114748
  this.deps = deps;
114651
114749
  }
114652
114750
  applyBundle = async (bundle, options = {}) => {
114653
- this.validateBundle(bundle);
114654
- const entries = buildMeshBundleEntries(bundle);
114751
+ const existingOriginNode = this.deps.runtime.node(bundle.originNode.id);
114752
+ const routedBundle = existingOriginNode?.brokerUrl ? {
114753
+ ...bundle,
114754
+ originNode: {
114755
+ ...bundle.originNode,
114756
+ brokerUrl: existingOriginNode.brokerUrl
114757
+ }
114758
+ } : bundle;
114759
+ this.validateBundle(routedBundle);
114760
+ const entries = buildMeshBundleEntries(routedBundle);
114655
114761
  return this.deps.commitEntries(entries, async (retainedEntries) => {
114656
114762
  await this.applyRetainedEntries(retainedEntries);
114657
114763
  }, options);
@@ -114783,8 +114889,8 @@ function actorIdsForCollaboration2(record3, conversation) {
114783
114889
  }
114784
114890
  return [...ids];
114785
114891
  }
114786
- async function brokerPostJson(brokerBaseUrl, path7, payload) {
114787
- const response = await meshPeerFetch(brokerBaseUrl, path7, {
114892
+ async function postMeshPeerJson(brokerBaseUrl, path7, payload, peerFetch = meshPeerFetch) {
114893
+ const response = await peerFetch(brokerBaseUrl, path7, {
114788
114894
  method: "POST",
114789
114895
  headers: {
114790
114896
  "content-type": "application/json",
@@ -114807,10 +114913,19 @@ class BrokerMeshForwardingService {
114807
114913
  postJson;
114808
114914
  constructor(deps) {
114809
114915
  this.deps = deps;
114810
- this.forwardMessage = deps.forwardMessage ?? forwardMeshMessage;
114811
- this.forwardCollaborationRecord = deps.forwardCollaborationRecord ?? forwardMeshCollaborationRecord;
114812
- this.forwardCollaborationEvent = deps.forwardCollaborationEvent ?? forwardMeshCollaborationEvent;
114813
- this.postJson = deps.postJson ?? brokerPostJson;
114916
+ this.forwardMessage = deps.forwardMessage ?? ((target2, bundle, options) => forwardMeshMessage(target2, bundle, {
114917
+ ...options,
114918
+ peerFetch: deps.peerFetch
114919
+ }));
114920
+ this.forwardCollaborationRecord = deps.forwardCollaborationRecord ?? ((target2, bundle, options) => forwardMeshCollaborationRecord(target2, bundle, {
114921
+ ...options,
114922
+ peerFetch: deps.peerFetch
114923
+ }));
114924
+ this.forwardCollaborationEvent = deps.forwardCollaborationEvent ?? ((target2, bundle, options) => forwardMeshCollaborationEvent(target2, bundle, {
114925
+ ...options,
114926
+ peerFetch: deps.peerFetch
114927
+ }));
114928
+ this.postJson = deps.postJson ?? ((brokerBaseUrl, path7, payload) => postMeshPeerJson(brokerBaseUrl, path7, payload, deps.peerFetch));
114814
114929
  }
114815
114930
  describeRemoteAuthorityIssue(agent, authorityNode) {
114816
114931
  const displayName = agent.displayName ?? agent.id;
@@ -114911,7 +115026,7 @@ class BrokerMeshForwardingService {
114911
115026
  if (!isReachableRemoteBrokerUrl(brokerUrl)) {
114912
115027
  return;
114913
115028
  }
114914
- await this.postJson(brokerUrl, "/v1/flights", flight);
115029
+ await this.postJson(brokerUrl, "/v1/mesh/flights", flight);
114915
115030
  }
114916
115031
  async forwardPeerBrokerDeliveries(message, deliveries) {
114917
115032
  return { forwarded: [], failed: [] };
@@ -114981,9 +115096,9 @@ class BrokerMeshForwardingService {
114981
115096
  function unique4(values) {
114982
115097
  return [...new Set(values.filter(Boolean))];
114983
115098
  }
114984
- function normalizeSeedUrl(seed, defaultPort2) {
115099
+ function normalizeSeedUrl(seed, defaultPort2, scheme = "http") {
114985
115100
  try {
114986
- const url2 = new URL(seed.includes("://") ? seed : `http://${seed}`);
115101
+ const url2 = new URL(seed.includes("://") ? seed : `${scheme}://${seed}`);
114987
115102
  if (!url2.port) {
114988
115103
  url2.port = String(defaultPort2);
114989
115104
  }
@@ -114992,26 +115107,21 @@ function normalizeSeedUrl(seed, defaultPort2) {
114992
115107
  return "";
114993
115108
  }
114994
115109
  }
114995
- function resolveDiscoveredBrokerUrl(advertisedBrokerUrl, observedBrokerUrl) {
114996
- const observed = observedBrokerUrl.replace(/\/$/, "");
114997
- if (!advertisedBrokerUrl) {
114998
- return observed;
114999
- }
115000
- if (!isReachableRemoteBrokerUrl(advertisedBrokerUrl)) {
115001
- return observed;
115002
- }
115003
- return new URL(advertisedBrokerUrl).toString().replace(/\/$/, "");
115110
+ function resolveDiscoveredBrokerUrl(_advertisedBrokerUrl, observedBrokerUrl) {
115111
+ return observedBrokerUrl.replace(/\/$/, "");
115004
115112
  }
115005
115113
  function buildPeerSeeds(peerName, addresses, dnsName, defaultPort2) {
115006
- const names2 = [dnsName, peerName].filter((value) => Boolean(value)).map((value) => normalizeSeedUrl(value, defaultPort2));
115007
- const ips = addresses.map((address) => normalizeSeedUrl(address, defaultPort2));
115008
- return unique4([...names2, ...ips]);
115114
+ const hosts = [dnsName, peerName, ...addresses].filter((value) => Boolean(value));
115115
+ return unique4([
115116
+ ...hosts.map((value) => normalizeSeedUrl(value, defaultPort2, "https")),
115117
+ ...hosts.map((value) => normalizeSeedUrl(value, defaultPort2, "http"))
115118
+ ]);
115009
115119
  }
115010
- async function probeNode(baseUrl, timeoutMs) {
115120
+ async function probeNode(baseUrl, timeoutMs, peerFetch) {
115011
115121
  const controller = new AbortController;
115012
115122
  const timeout = setTimeout(() => controller.abort(), timeoutMs);
115013
115123
  try {
115014
- const response = await fetch(`${baseUrl}/v1/node`, {
115124
+ const response = await peerFetch(baseUrl, "/v1/node", {
115015
115125
  signal: controller.signal,
115016
115126
  headers: {
115017
115127
  accept: "application/json"
@@ -115033,13 +115143,14 @@ async function probeNode(baseUrl, timeoutMs) {
115033
115143
  }
115034
115144
  async function discoverMeshNodes(options) {
115035
115145
  const peerSeeds = options.seeds ? options.seeds.map((seed) => normalizeSeedUrl(seed, options.defaultPort)) : [];
115036
- const tailscalePeers = await readTailscalePeers();
115146
+ const tailscalePeers = await (options.readTailscalePeers ?? readTailscalePeers)();
115037
115147
  const tailscaleSeeds = tailscalePeers.filter((peer) => peer.online).flatMap((peer) => buildPeerSeeds(peer.name, peer.addresses, peer.dnsName, options.defaultPort));
115038
115148
  const candidates = unique4([...peerSeeds, ...tailscaleSeeds]).filter((seed) => seed && seed !== options.localBrokerUrl);
115039
115149
  const discovered = [];
115040
115150
  const seen = new Set;
115151
+ const peerFetch = options.peerFetch ?? meshPeerFetch;
115041
115152
  for (const seed of candidates) {
115042
- const node = await probeNode(seed, options.timeoutMs ?? 1500);
115153
+ const node = await probeNode(seed, options.timeoutMs ?? 1500, peerFetch);
115043
115154
  if (!node)
115044
115155
  continue;
115045
115156
  if (node.id === options.localNodeId)
@@ -115085,7 +115196,8 @@ function remotePeerAgentForNode(input) {
115085
115196
  return {
115086
115197
  ...input.agent,
115087
115198
  homeNodeId: agentHome,
115088
- authorityNodeId: input.agent.authorityNodeId || input.node.id
115199
+ authorityNodeId: input.agent.authorityNodeId || input.node.id,
115200
+ advertiseScope: "mesh"
115089
115201
  };
115090
115202
  }
115091
115203
 
@@ -116648,13 +116760,105 @@ import { createServer as createHttpsServer } from "https";
116648
116760
 
116649
116761
  // packages/runtime/src/mesh-mdns-service.ts
116650
116762
  import { createRequire as createRequire3 } from "module";
116763
+ import { spawn as spawn12 } from "child_process";
116651
116764
  var MESH_MDNS_SERVICE_TYPE = "openscout";
116652
116765
  var MESH_MDNS_PROTOCOL_VERSION = 1;
116653
116766
  var MESH_MDNS_KEY_ID_DIGEST_HEX_CHARS = 32;
116654
116767
  var require3 = createRequire3(import.meta.url);
116655
- function defaultResponderFactory() {
116768
+ function buildDarwinDnsSdRegisterArgs(options) {
116769
+ return [
116770
+ "-R",
116771
+ options.name,
116772
+ `_${options.type}._${options.protocol}`,
116773
+ "local.",
116774
+ String(options.port),
116775
+ ...Object.entries(options.txt).map(([key, value]) => `${key}=${value}`)
116776
+ ];
116777
+ }
116778
+ function createDarwinMdnsResponder(browserResponder, spawnProcess3 = spawn12, logger = console, processEvents = process) {
116779
+ const registrations = new Set;
116780
+ const stopRegistration = (child) => {
116781
+ registrations.delete(child);
116782
+ if (child.killed)
116783
+ return;
116784
+ try {
116785
+ child.kill("SIGTERM");
116786
+ } catch {}
116787
+ };
116788
+ const stopAll = () => {
116789
+ for (const child of registrations)
116790
+ stopRegistration(child);
116791
+ };
116792
+ processEvents.once("exit", stopAll);
116793
+ return {
116794
+ publish(options) {
116795
+ let diagnosticOutput = "";
116796
+ let failure = null;
116797
+ const failureListeners = new Set;
116798
+ const child = spawnProcess3("/usr/bin/dns-sd", buildDarwinDnsSdRegisterArgs(options), {
116799
+ argv0: "openscout-mesh-mdns",
116800
+ stdio: ["ignore", "pipe", "pipe"]
116801
+ });
116802
+ registrations.add(child);
116803
+ const appendDiagnostic = (chunk) => {
116804
+ diagnosticOutput = `${diagnosticOutput}${String(chunk)}`.slice(-4096);
116805
+ };
116806
+ child.stdout?.on("data", appendDiagnostic);
116807
+ child.stderr?.on("data", appendDiagnostic);
116808
+ const reportFailure = (error48) => {
116809
+ if (failure)
116810
+ return;
116811
+ failure = error48;
116812
+ registrations.delete(child);
116813
+ logger.warn(`[mesh-mdns] native registration failed: ${error48.message}`);
116814
+ for (const listener of failureListeners)
116815
+ listener(error48);
116816
+ failureListeners.clear();
116817
+ };
116818
+ child.once("exit", (code, signal) => {
116819
+ if (!registrations.has(child))
116820
+ return;
116821
+ const detail = code === null ? `signal ${signal ?? "unknown"}` : `exit ${code}`;
116822
+ const diagnostic = diagnosticOutput.trim();
116823
+ reportFailure(new Error(`${detail}${diagnostic ? `: ${diagnostic}` : ""}`));
116824
+ });
116825
+ child.once("error", reportFailure);
116826
+ return {
116827
+ stop(callback) {
116828
+ failureListeners.clear();
116829
+ stopRegistration(child);
116830
+ callback?.();
116831
+ },
116832
+ onFailure(listener) {
116833
+ if (failure) {
116834
+ listener(failure);
116835
+ } else {
116836
+ failureListeners.add(listener);
116837
+ }
116838
+ }
116839
+ };
116840
+ },
116841
+ unpublishAll(callback) {
116842
+ stopAll();
116843
+ callback?.();
116844
+ },
116845
+ find(options, onup) {
116846
+ return browserResponder.find(options, onup);
116847
+ },
116848
+ destroy(callback) {
116849
+ stopAll();
116850
+ processEvents.off("exit", stopAll);
116851
+ browserResponder.destroy(callback);
116852
+ }
116853
+ };
116854
+ }
116855
+ function selectMdnsResponderForPlatform(browserResponder, platform = process.platform, spawnProcess3 = spawn12, logger = console, processEvents = process) {
116856
+ return platform === "darwin" ? createDarwinMdnsResponder(browserResponder, spawnProcess3, logger, processEvents) : browserResponder;
116857
+ }
116858
+ function defaultResponderFactory(logger = console) {
116656
116859
  const Bonjour = require3("bonjour-service");
116657
- return new Bonjour;
116860
+ const responder = new Bonjour;
116861
+ return selectMdnsResponderForPlatform(responder, process.platform, spawn12, logger, process);
116658
116862
  }
116659
116863
  function meshMdnsKeyIdDigest(keyId) {
116660
116864
  const normalized = keyId.trim().toLowerCase();
@@ -116696,13 +116900,19 @@ class MeshMdnsService {
116696
116900
  return;
116697
116901
  }
116698
116902
  const responder = this.ensureResponder();
116699
- this.published = responder.publish({
116903
+ const published = responder.publish({
116700
116904
  name: options.name ?? `OpenScout Node ${this.ownKidDigest.slice(0, 8)}`,
116905
+ host: `openscout-${this.ownKidDigest}.local`,
116701
116906
  type: MESH_MDNS_SERVICE_TYPE,
116702
116907
  protocol: "tcp",
116703
116908
  port: options.port,
116704
116909
  txt: buildMeshMdnsTxt(options)
116705
116910
  });
116911
+ this.published = published;
116912
+ published.onFailure?.(() => {
116913
+ if (this.published === published)
116914
+ this.published = null;
116915
+ });
116706
116916
  }
116707
116917
  startBrowse(options = {}) {
116708
116918
  if (this.browser) {
@@ -116745,7 +116955,7 @@ class MeshMdnsService {
116745
116955
  }
116746
116956
  ensureResponder() {
116747
116957
  if (!this.responder) {
116748
- this.responder = (this.options.responderFactory ?? defaultResponderFactory)();
116958
+ this.responder = this.options.responderFactory ? this.options.responderFactory() : defaultResponderFactory(this.options.logger);
116749
116959
  }
116750
116960
  return this.responder;
116751
116961
  }
@@ -116853,16 +117063,23 @@ function createMeshBindController(deps) {
116853
117063
  responderFactory: deps.mdnsResponderFactory,
116854
117064
  logger
116855
117065
  });
116856
- service.start({
116857
- port: deps.port,
116858
- keyId: deps.keyId,
116859
- tls: true
116860
- });
116861
- service.startBrowse({
116862
- onPeerFound: deps.onPeerFound,
116863
- onPeerLost: deps.onPeerLost
116864
- });
116865
117066
  mdns = service;
117067
+ try {
117068
+ service.start({
117069
+ port: deps.port,
117070
+ keyId: deps.keyId,
117071
+ tls: true
117072
+ });
117073
+ service.startBrowse({
117074
+ onPeerFound: deps.onPeerFound,
117075
+ onPeerLost: deps.onPeerLost
117076
+ });
117077
+ } catch (error48) {
117078
+ service.stop();
117079
+ if (mdns === service)
117080
+ mdns = null;
117081
+ throw error48;
117082
+ }
116866
117083
  logger?.log(`[openscout-runtime] mesh mDNS advertising _openscout._tcp on port ${deps.port} (tls=1)`);
116867
117084
  }
116868
117085
  async function openTlsListeners(addresses, identity2) {
@@ -117017,6 +117234,7 @@ var MESH_ROUTE_MATRIX = {
117017
117234
  "POST /v1/mesh/collaboration/events": "control",
117018
117235
  "POST /v1/mesh/collaboration/records": "control",
117019
117236
  "POST /v1/mesh/discover": "control",
117237
+ "POST /v1/mesh/flights": "control",
117020
117238
  "POST /v1/mesh/invocations": "control",
117021
117239
  "POST /v1/mesh/messages": "control",
117022
117240
  [TRPC_UPGRADE_ROUTE]: "control",
@@ -117509,16 +117727,18 @@ function currentSignedNodeCard() {
117509
117727
  function effectiveGateMode() {
117510
117728
  return meshBindController?.hasNonLoopbackListener() ? "enforce" : meshGateMode;
117511
117729
  }
117730
+ function trustedPeerForBrokerBaseUrl(baseUrl) {
117731
+ const normalized = baseUrl.replace(/\/$/, "");
117732
+ const node = Object.values(runtime.snapshot().nodes).find((candidate) => candidate.brokerUrl?.replace(/\/$/, "") === normalized);
117733
+ if (!node || !trustedPeerStore) {
117734
+ return;
117735
+ }
117736
+ return trustedPeerStore.listTrustedPeers().find((peer) => peer.nodeId === node.id);
117737
+ }
117512
117738
  var daemonMeshPeerFetch = createMeshPeerFetch({
117513
117739
  loadIdentity: () => nodeIdentity,
117514
- expectedPeerKeyId: (baseUrl) => {
117515
- const normalized = baseUrl.replace(/\/$/, "");
117516
- const node = Object.values(runtime.snapshot().nodes).find((candidate) => candidate.brokerUrl?.replace(/\/$/, "") === normalized);
117517
- if (!node || !trustedPeerStore) {
117518
- return;
117519
- }
117520
- return trustedPeerStore.listTrustedPeers().find((peer) => peer.nodeId === node.id)?.keyId;
117521
- }
117740
+ expectedPeerKeyId: (baseUrl) => trustedPeerForBrokerBaseUrl(baseUrl)?.keyId,
117741
+ expectedPeerTlsPin: (baseUrl) => trustedPeerForBrokerBaseUrl(baseUrl)?.tlsSpkiFingerprint
117522
117742
  });
117523
117743
  var threadEvents = new ThreadEventPlane({
117524
117744
  nodeId,
@@ -117560,7 +117780,8 @@ var meshForwardingService = new BrokerMeshForwardingService({
117560
117780
  currentLocalNode,
117561
117781
  invocationFor: (invocationId) => knownInvocations.get(invocationId),
117562
117782
  endpointForAgent: (agentId) => homeEndpointForAgent(runtime.snapshot(), agentId),
117563
- projectRootForTarget: brokerTargetProjectRoot
117783
+ projectRootForTarget: brokerTargetProjectRoot,
117784
+ peerFetch: daemonMeshPeerFetch
117564
117785
  });
117565
117786
  var controlStreams = new BrokerControlStreamService({
117566
117787
  enqueueEvent: (event) => projection.enqueueEvent(event),
@@ -117608,6 +117829,7 @@ var meshDiscoveryService = new BrokerMeshDiscoveryService({
117608
117829
  upsertNode: upsertNodeDurably,
117609
117830
  upsertAgent: upsertAgentDurably,
117610
117831
  notifyPeerOnline: (peerNodeId) => peerDelivery.notifyPeerOnline(peerNodeId),
117832
+ fetchPeerAgents: (peerBrokerUrl) => fetchPeerAgents(peerBrokerUrl, daemonMeshPeerFetch),
117611
117833
  log: (message) => console.log(message)
117612
117834
  });
117613
117835
  var deliveryStore = new BrokerDeliveryStore({
@@ -117689,9 +117911,9 @@ var deliveryRouter = new BrokerDeliveryRouter({
117689
117911
  remediation: `bring a ${session.harness} worker online first, or use a resumable harness`
117690
117912
  };
117691
117913
  }
117692
- let spawn12;
117914
+ let spawn13;
117693
117915
  try {
117694
- spawn12 = resolveCardlessSessionSpawnTarget(session.harness);
117916
+ spawn13 = resolveCardlessSessionSpawnTarget(session.harness);
117695
117917
  } catch (error48) {
117696
117918
  return {
117697
117919
  ok: false,
@@ -117730,8 +117952,8 @@ var deliveryRouter = new BrokerDeliveryRouter({
117730
117952
  }, {
117731
117953
  sessionId: scoutSessionId,
117732
117954
  handle: scoutSessionId,
117733
- transport: spawn12.transport,
117734
- harness: spawn12.harness,
117955
+ transport: spawn13.transport,
117956
+ harness: spawn13.harness,
117735
117957
  cwd,
117736
117958
  projectRoot: cwd,
117737
117959
  nodeId,
@@ -117740,7 +117962,7 @@ var deliveryRouter = new BrokerDeliveryRouter({
117740
117962
  flatDispatch: true,
117741
117963
  displayName: `${basename24(cwd)}:${session.nativeSessionId.slice(0, 8)}`
117742
117964
  });
117743
- console.log(`[openscout-runtime] flat-dispatch wake ${session.harness}:${session.nativeSessionId} via ${spawn12.transport} cwd=${cwd}`);
117965
+ console.log(`[openscout-runtime] flat-dispatch wake ${session.harness}:${session.nativeSessionId} via ${spawn13.transport} cwd=${cwd}`);
117744
117966
  return { ok: true };
117745
117967
  } catch (error48) {
117746
117968
  return {