@openscout/scout 0.2.105 → 0.2.106

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 (573) hide show
  1. package/bin/scoutd +0 -0
  2. package/dist/build-manifest.json +3 -3
  3. package/dist/chat.mjs +23 -1
  4. package/dist/client/assets/ActivityScreen-CZmGwQ2U.js +1 -0
  5. package/dist/client/assets/{AddProjectForm-CHNJ4NnS.js → AddProjectForm-CusDRiVO.js} +1 -1
  6. package/dist/client/assets/{AdventureEvidence-B4mEvXeD.js → AdventureEvidence-CyegKk1V.js} +1 -1
  7. package/dist/client/assets/{AdventureReader-ZsBDQITY.js → AdventureReader-X-hbTOi0.js} +1 -1
  8. package/dist/client/assets/{AdventureScenery-DSxDlqG1.js → AdventureScenery-LPXSVP67.js} +1 -1
  9. package/dist/client/assets/AgentAdventures-BAgxdOF8.js +1 -0
  10. package/dist/client/assets/AgentAvatar-CrP1eXxk.js +1 -0
  11. package/dist/client/assets/AgentConfigurationScreen-1L0IQm2w.js +1 -0
  12. package/dist/client/assets/AgentDefinitionsWorkspace-DguGs7jZ.js +1 -0
  13. package/dist/client/assets/{AgentDetailCard-MIEBKw_S.js → AgentDetailCard-DtHT3sCo.js} +1 -1
  14. package/dist/client/assets/AgentFloorView-DH4jiDgw.js +1 -0
  15. package/dist/client/assets/{AgentFloorWorld-BTqwmK5G.js → AgentFloorWorld-CjoIa6jA.js} +1 -1
  16. package/dist/client/assets/AgentInfoScreen-DYtmKkeE.js +1 -0
  17. package/dist/client/assets/{AgentLaneCard-C4rKLLdT.js → AgentLaneCard-BaZ2g-f8.js} +1 -1
  18. package/dist/client/assets/{AgentLaneChrome-fGC-ZrJS.js → AgentLaneChrome-TF1SlJSc.js} +1 -1
  19. package/dist/client/assets/{AgentLaneDetailSheet-BTF4_th9.js → AgentLaneDetailSheet-EzEPsn3g.js} +1 -1
  20. package/dist/client/assets/{AgentLaneSummaryResize-DgSeA_vS.js → AgentLaneSummaryResize-dpp7YvrX.js} +1 -1
  21. package/dist/client/assets/AgentLanesEmbedScreen-BlSof_6S.js +1 -0
  22. package/dist/client/assets/{AgentLanesPreflight-CcS23wij.js → AgentLanesPreflight-Ry-aqDTr.js} +1 -1
  23. package/dist/client/assets/AgentLanesView-BJi9xXz6.js +2 -0
  24. package/dist/client/assets/{AgentLiveActions-6Kfr1uOT.js → AgentLiveActions-CfTupTEl.js} +1 -1
  25. package/dist/client/assets/AgentMasterScreen-EJhmuKgl.js +1 -0
  26. package/dist/client/assets/AgentSessions-B1gOhDBf.js +6 -0
  27. package/dist/client/assets/AgentsConsole-RXGqRvcb.js +1 -0
  28. package/dist/client/assets/AgentsScreen-ChwMBs11.js +1 -0
  29. package/dist/client/assets/AgentsSubnav-DwNX4yy0.js +1 -0
  30. package/dist/client/assets/{AstronautSuit-D67fIBdR.js → AstronautSuit-Cchnc4Ug.js} +1 -1
  31. package/dist/client/assets/{AtopView-Ck30FbzG.js → AtopView-gkEp4y__.js} +1 -1
  32. package/dist/client/assets/{BackToPicker-CkBhGRlD.js → BackToPicker-CUkjnoVk.js} +1 -1
  33. package/dist/client/assets/BriefingDetailScreen-DrlC3qkm.js +1 -0
  34. package/dist/client/assets/{BriefingsScreen-DTxYMr3a.js → BriefingsScreen-B1HlBMGZ.js} +1 -1
  35. package/dist/client/assets/{BrokerMetadataPanel-crirZCdo.js → BrokerMetadataPanel-Dk242Yh_.js} +1 -1
  36. package/dist/client/assets/BrokerScreen-DwOF6bMA.js +8 -0
  37. package/dist/client/assets/{Canvas-CRP0KjKb.js → Canvas-X9pVSkw3.js} +1 -1
  38. package/dist/client/assets/{CastPicker-ZPomvOf-.js → CastPicker-BXUtPAGC.js} +1 -1
  39. package/dist/client/assets/ChannelComposer-DoK7IDGa.js +1 -0
  40. package/dist/client/assets/ChannelSidebar-e9DOPulb.js +1 -0
  41. package/dist/client/assets/{CharacterFamilyPreview-ckVkecDO.js → CharacterFamilyPreview-DMfw7UM_.js} +1 -1
  42. package/dist/client/assets/{ChatAvatar-DKBsbOqk.js → ChatAvatar-C3a_o5Hj.js} +1 -1
  43. package/dist/client/assets/ChatBits-CsvxbToF.js +1 -0
  44. package/dist/client/assets/{ChatCollapsedStrip-Co0NmqOO.js → ChatCollapsedStrip-FEmQ_G9J.js} +1 -1
  45. package/dist/client/assets/ChatRichInput-DhtwFxQE.js +31 -0
  46. package/dist/client/assets/ChatRightPanel-C1h_aIkn.js +1 -0
  47. package/dist/client/assets/ChatSpaceSurface-BXyLYKHn.js +1 -0
  48. package/dist/client/assets/ChatSpaceTheme-3wLZGsvT.css +1 -0
  49. package/dist/client/assets/ChatSpaceTheme-CUH8bTZc.js +1 -0
  50. package/dist/client/assets/{CodeDiffPane-D-iv28LJ.js → CodeDiffPane-DuQRwpgK.js} +1 -1
  51. package/dist/client/assets/{CodeProjectPicker-CZ3gDdiT.js → CodeProjectPicker-ZQ6gSBpg.js} +1 -1
  52. package/dist/client/assets/{CodeScreen-CSC-zbP9.js → CodeScreen-BXyKeL5T.js} +1 -1
  53. package/dist/client/assets/{CommsCanvas-DdNAwjGW.js → CommsCanvas-THp0r_U8.js} +1 -1
  54. package/dist/client/assets/{CommsDeck-mGWY7Ivi.js → CommsDeck-BVmSMV2V.js} +1 -1
  55. package/dist/client/assets/{CommsFlowGraph-voDD9M5R.js → CommsFlowGraph-DxoOaLF_.js} +1 -1
  56. package/dist/client/assets/{CommsFlowMap-C33sgD48.js → CommsFlowMap-Vi8ziCPg.js} +1 -1
  57. package/dist/client/assets/{CommsSelection-BL8aYD7z.js → CommsSelection-BUoRbu9o.js} +1 -1
  58. package/dist/client/assets/ComposerAttachments-DW0AIb8k.js +1 -0
  59. package/dist/client/assets/ConversationComposer-CUQyArlk.js +1 -0
  60. package/dist/client/assets/ConversationFeedRows-DWiOfT-y.js +1 -0
  61. package/dist/client/assets/ConversationHeader-C-ZWscKj.js +1 -0
  62. package/dist/client/assets/{ConversationPanels-6pprBpmq.js → ConversationPanels-D9oC0xG5.js} +2 -2
  63. package/dist/client/assets/ConversationScreen-9MlMnEo4.css +1 -0
  64. package/dist/client/assets/ConversationScreen-CUfsQ4MR.js +2 -0
  65. package/dist/client/assets/ConversationStatus--IPm2nGh.js +1 -0
  66. package/dist/client/assets/{CrewAvatar-D0c9z5Qr.css → CrewAvatar-BnIPIn_Z.css} +1 -1
  67. package/dist/client/assets/CrewAvatar-kTznzqcO.js +1 -0
  68. package/dist/client/assets/{CrewSprite-Dp9KBBGY.js → CrewSprite-Dhryjx2c.js} +1 -1
  69. package/dist/client/assets/CrewStage-vdO0qm3D.js +1 -0
  70. package/dist/client/assets/CrewWorkspaces-DCBzAAS4.js +1 -0
  71. package/dist/client/assets/{DataTable-av71ehJV.js → DataTable-aH-jCyDq.js} +1 -1
  72. package/dist/client/assets/{DispatchAftermath-CcYGUB10.js → DispatchAftermath-66uQAorV.js} +1 -1
  73. package/dist/client/assets/{DocumentFocusViewer-DlMiEALb.js → DocumentFocusViewer-DJr0v0D_.js} +1 -1
  74. package/dist/client/assets/{EmbeddableSurfacesLab-CTkO_tQR.js → EmbeddableSurfacesLab-BBa70EhJ.js} +1 -1
  75. package/dist/client/assets/{EmptyState-CYUwYyAW.js → EmptyState-CZlrHXy-.js} +1 -1
  76. package/dist/client/assets/{FileViewerPane-Cxhixtks.js → FileViewerPane-BAO6mtjD.js} +1 -1
  77. package/dist/client/assets/FleetRollCallHud-C5q2567n.js +1 -0
  78. package/dist/client/assets/FlightObserveScreen-DZ2mrw91.js +1 -0
  79. package/dist/client/assets/{FloorContextSheet-Vj_wVZq1.js → FloorContextSheet-2_NVPQor.js} +1 -1
  80. package/dist/client/assets/{FloorExchangePanel-CjHSDXad.js → FloorExchangePanel-BU1pPu8K.js} +1 -1
  81. package/dist/client/assets/{FloorMessagePasses-BG4ebnX5.js → FloorMessagePasses-cLW2UGNP.js} +1 -1
  82. package/dist/client/assets/{FloorReplay-BoYaGY9t.js → FloorReplay-VFzA6Kxc.js} +1 -1
  83. package/dist/client/assets/FloorResourcesSheet-C-kQ6Ren.js +1 -0
  84. package/dist/client/assets/{FloorSavedWork-jbtRs-YE.js → FloorSavedWork-BeHDejWz.js} +1 -1
  85. package/dist/client/assets/FloorTacticalHUD-CO-iiFpb.js +1 -0
  86. package/dist/client/assets/{FollowScreen-CupyOgt4.js → FollowScreen-CFfkIbc6.js} +1 -1
  87. package/dist/client/assets/HarnessMark-C4naWc16.js +1 -0
  88. package/dist/client/assets/HarnessesScreen-DX3NLcDG.js +1 -0
  89. package/dist/client/assets/{HerdrSession-Dcm3vf9U.js → HerdrSession-_t7yM8vX.js} +2 -2
  90. package/dist/client/assets/{HomeHero-pIZtE1cC.js → HomeHero-DouPyNmz.js} +1 -1
  91. package/dist/client/assets/{HostAdvisorView-Dv5meXo2.js → HostAdvisorView-CnM1i8hW.js} +1 -1
  92. package/dist/client/assets/InviteLandingScreen-CEjG2E34.js +1 -0
  93. package/dist/client/assets/InviteSheet-CwxZtWCl.js +1 -0
  94. package/dist/client/assets/{JumpPalette-BmiSOEmp.js → JumpPalette-O1aJE9gR.js} +1 -1
  95. package/dist/client/assets/{KnowledgeSearchInspector-B8yiM524.js → KnowledgeSearchInspector-32n9baT-.js} +1 -1
  96. package/dist/client/assets/KnowledgeSearchScreen-Dd6jrQ0A.js +1 -0
  97. package/dist/client/assets/{LaneToolHoverCard-D2cnTeUd.js → LaneToolHoverCard-CJa110yk.js} +1 -1
  98. package/dist/client/assets/LaneTraceDetailSheet-DYrd0BIf.js +1 -0
  99. package/dist/client/assets/{LaneTraceEventFocus-BLhVHwff.js → LaneTraceEventFocus-TbrNHRj_.js} +1 -1
  100. package/dist/client/assets/{MeshCanvas-BR25OBTJ.js → MeshCanvas-DWZHYh1A.js} +2 -2
  101. package/dist/client/assets/{MeshCanvasMinimap-ClVolr4-.js → MeshCanvasMinimap-iswYFpIb.js} +1 -1
  102. package/dist/client/assets/MeshScreen-8nAzQVbm.js +1 -0
  103. package/dist/client/assets/{MeshTopologyView-BT3ke2D1.js → MeshTopologyView-BVvtqI8q.js} +2 -2
  104. package/dist/client/assets/MessageEmbeds-ksPazAKH.js +1 -0
  105. package/dist/client/assets/MessagesScreen-C3WB4T21.js +1 -0
  106. package/dist/client/assets/{MissionContextRail-CafjuseK.js → MissionContextRail-D62-Wis8.js} +1 -1
  107. package/dist/client/assets/MissionControlView-B9cNPXvl.js +1 -0
  108. package/dist/client/assets/{MissionFocusOverlay-nhy3hkxQ.js → MissionFocusOverlay-C1zys3Jv.js} +1 -1
  109. package/dist/client/assets/MissionLeftAgentRow-vycMV77n.js +1 -0
  110. package/dist/client/assets/{MissionLogPane-DiUf3vWW.js → MissionLogPane-B19lYSY9.js} +1 -1
  111. package/dist/client/assets/NativeAreaScreen-B1RLa85C.js +1 -0
  112. package/dist/client/assets/NativeAreaScreen-CV0OhGra.js +1 -0
  113. package/dist/client/assets/NativeAreaScreen-CzuZt6o1.js +1 -0
  114. package/dist/client/assets/{NewAgentModal-BQ2wQ5gp.js → NewAgentModal-Bh-L-emz.js} +1 -1
  115. package/dist/client/assets/NewChatComposer-C97-iTMK.js +19 -0
  116. package/dist/client/assets/{NewChatOrigin-C8ROO4ps.js → NewChatOrigin-DFbF_XvR.js} +1 -1
  117. package/dist/client/assets/{NodeDetailPanel-BNTqYC7m.js → NodeDetailPanel-CElOEpCh.js} +1 -1
  118. package/dist/client/assets/{NodeMenu-CcOeFRCB.js → NodeMenu-B-jjHf1c.js} +1 -1
  119. package/dist/client/assets/ObserveEmbedScreen-B7Qt69Ms.js +2 -0
  120. package/dist/client/assets/{ObserveTextFlow-CC5mnngm.js → ObserveTextFlow-PFnG_10h.js} +2 -2
  121. package/dist/client/assets/{ObservedTopologyPanel-DF6tRZL_.js → ObservedTopologyPanel-CUTIoLZJ.js} +1 -1
  122. package/dist/client/assets/OpenScoutAppShell-37PDFfA4.js +31 -0
  123. package/dist/client/assets/OpsAgentsView-DajlX8LO.js +1 -0
  124. package/dist/client/assets/OpsScreen-jVcaBKGi.js +1 -0
  125. package/dist/client/assets/OpsSubnav-BOOYShHE.js +1 -0
  126. package/dist/client/assets/ProjectAgentProfile-D_wlW4sQ.js +1 -0
  127. package/dist/client/assets/{ProjectAgentProfileBar-C8z22pJ2.js → ProjectAgentProfileBar-DHuMKJj-.js} +1 -1
  128. package/dist/client/assets/ProjectAgentProfileHero-Dbebtug1.js +1 -0
  129. package/dist/client/assets/ProjectsInbox-B8zYE4vP.css +1 -0
  130. package/dist/client/assets/ProjectsInbox-Cgu7B4--.js +2 -0
  131. package/dist/client/assets/ProjectsRail-CDWocin_.js +1 -0
  132. package/dist/client/assets/ProjectsScreen-B_CJycqW.js +1 -0
  133. package/dist/client/assets/ProjectsThreadAside-1MMl_qUD.js +1 -0
  134. package/dist/client/assets/Provider-C35yu29I.js +5 -0
  135. package/dist/client/assets/{RailRow-DUPqXMZh.js → RailRow-BjmWK420.js} +1 -1
  136. package/dist/client/assets/RawSessionsTable-DzT90hWu.js +1 -0
  137. package/dist/client/assets/RealtimeVoiceScreen-B6ylX3WQ.js +16 -0
  138. package/dist/client/assets/{RenderedWorkerSprite-C8fxndAh.js → RenderedWorkerSprite-Dhlyg89J.js} +1 -1
  139. package/dist/client/assets/{ReplayClock-DUVJjrIu.js → ReplayClock-348f17bW.js} +1 -1
  140. package/dist/client/assets/{ReplayLog-Bek1Vc4W.js → ReplayLog-CBnAM3ui.js} +1 -1
  141. package/dist/client/assets/{ReplayOutpost-DlRg3172.js → ReplayOutpost-DyRPfNFx.js} +1 -1
  142. package/dist/client/assets/{RepoDiffEmbedScreen-CVUMnt6A.js → RepoDiffEmbedScreen-BWxvRDrS.js} +1 -1
  143. package/dist/client/assets/{RepoDiffPageScreen-D9-s5PyB.js → RepoDiffPageScreen-DN94irmY.js} +1 -1
  144. package/dist/client/assets/{RepoDiffViewer-D7FN-oyY.js → RepoDiffViewer-_4JVXBIW.js} +1 -1
  145. package/dist/client/assets/RepoDiffViewerLazy-XGVC3WXv.js +2 -0
  146. package/dist/client/assets/{ReposScreen-BQ7HO1om.js → ReposScreen-uMCpt0e9.js} +2 -2
  147. package/dist/client/assets/{RiggedWorkerCharacter-CJMWlvV-.js → RiggedWorkerCharacter-q6QRc7_o.js} +1 -1
  148. package/dist/client/assets/{SageModelStudio-B526NSnw.js → SageModelStudio-CNDhZhgD.js} +1 -1
  149. package/dist/client/assets/{ScoutDeckSurface-ChkvGyEW.js → ScoutDeckSurface-CUaU4R6T.js} +1 -1
  150. package/dist/client/assets/{ScoutSurface-6g1f5chk.js → ScoutSurface-3_25USO_.js} +1 -1
  151. package/dist/client/assets/{ScoutbotFxLab-BuwBdnPf.js → ScoutbotFxLab-CRqhYe0a.js} +1 -1
  152. package/dist/client/assets/{SecondaryNav-Bs-_VwTC.js → SecondaryNav-D7dbV2qo.js} +1 -1
  153. package/dist/client/assets/SessionContextStrip-CXfs9hUD.js +1 -0
  154. package/dist/client/assets/SessionContextStrip-DAIXwtHd.css +1 -0
  155. package/dist/client/assets/{SessionEmbedScreen-C2wf35-P.js → SessionEmbedScreen-D0zFmou-.js} +1 -1
  156. package/dist/client/assets/SessionHopMenu-E6VJZrE0.js +1 -0
  157. package/dist/client/assets/{SessionObserve-B64YsYhy.js → SessionObserve-DXxBvejJ.js} +9 -9
  158. package/dist/client/assets/SessionObserveEvidence-Cuj_KHxR.js +1 -0
  159. package/dist/client/assets/SessionRefScreen-DqLSUlCE.js +1 -0
  160. package/dist/client/assets/SessionsScreen-BLIRkohT.js +1 -0
  161. package/dist/client/assets/SettingsDrawer-juCpnbH6.js +3 -0
  162. package/dist/client/assets/SettingsScreen-BtGzE2-O.js +1 -0
  163. package/dist/client/assets/{SharedFloorCharacter-V04kD5T9.js → SharedFloorCharacter-DNEiaOUh.js} +1 -1
  164. package/dist/client/assets/SharedWorkFloor-0rqtdF-n.css +1 -0
  165. package/dist/client/assets/SharedWorkFloor-D9mf9KSg.js +2 -0
  166. package/dist/client/assets/{ShikiPane-XwFI-pCp.js → ShikiPane-CRtTYkMj.js} +1 -1
  167. package/dist/client/assets/{SlidePanel-BMpkXai_.js → SlidePanel-_CHAQdOa.js} +1 -1
  168. package/dist/client/assets/SpaceSwitcher-BLgSCf_T.js +1 -0
  169. package/dist/client/assets/{SpriteAvatar-aHeF4ZQZ.js → SpriteAvatar-CpZWf54-.js} +1 -1
  170. package/dist/client/assets/{SproutActionSprite-DI5N3gOj.js → SproutActionSprite-BSiTS4en.js} +1 -1
  171. package/dist/client/assets/{StatusPill-Dw4LP7wu.js → StatusPill-2gCP6H7A.js} +1 -1
  172. package/dist/client/assets/{TailView-BofjmUMJ.js → TailView-CYSijNTy.js} +2 -2
  173. package/dist/client/assets/Terminal-Bi97yb5s.js +4 -0
  174. package/dist/client/assets/TerminalEmbedScreen-Bqop67Bq.js +1 -0
  175. package/dist/client/assets/{TerminalHeaderMount-CwbQhXcI.js → TerminalHeaderMount-Cq4OD_xN.js} +1 -1
  176. package/dist/client/assets/{TerminalRelay--qOBwnbR.js → TerminalRelay-DrikpUSJ.js} +3 -3
  177. package/dist/client/assets/{TextDocumentSurface-BK6Qy41F.js → TextDocumentSurface-D52m7Vd8.js} +1 -1
  178. package/dist/client/assets/{TmuxPeek-DpUT9Tpc.js → TmuxPeek-CXFeweMg.js} +1 -1
  179. package/dist/client/assets/VoiceControlWell-DF3bjcYA.js +1 -0
  180. package/dist/client/assets/VoicePathDiagram-CmpHWfO-.js +1 -0
  181. package/dist/client/assets/{VoicePermissionsPanel-D35fOnQj.js → VoicePermissionsPanel-Ok2nfxHw.js} +1 -1
  182. package/dist/client/assets/VoiceTurnDetails-wAByRaNB.js +8 -0
  183. package/dist/client/assets/VoiceTurnStage-edoJalLV.js +1 -0
  184. package/dist/client/assets/VoiceTurnView-D-8g5E4r.js +1 -0
  185. package/dist/client/assets/WorkDetailScreen-zQkNVy2F.js +5 -0
  186. package/dist/client/assets/{WorkFilesViewer-t8AEyx3Q.js → WorkFilesViewer-vNt01sDd.js} +1 -1
  187. package/dist/client/assets/{WorkRunView-_mhG_FR2.js → WorkRunView-BDkR7Edq.js} +1 -1
  188. package/dist/client/assets/WorldActorTalk-BvSg_b1y.js +1 -0
  189. package/dist/client/assets/{WorldCharacter-BRrj3MQN.js → WorldCharacter-CIIlutQq.js} +1 -1
  190. package/dist/client/assets/WorldMinimap-B6HNgcDe.js +1 -0
  191. package/dist/client/assets/{WorldSky-D-RJzSa6.js → WorldSky-Jm2Z6dfW.js} +1 -1
  192. package/dist/client/assets/{activity-BJqFrZyB.js → activity-CIlFrfPJ.js} +1 -1
  193. package/dist/client/assets/{addon-fit-CHohcvS3.js → addon-fit-dFpj9Kfq.js} +1 -1
  194. package/dist/client/assets/{addon-webgl-CaRy2x2b.js → addon-webgl-BFCGRtGh.js} +1 -1
  195. package/dist/client/assets/{agent-essentials-bKWYOZaH.js → agent-essentials-BGGvT5G6.js} +1 -1
  196. package/dist/client/assets/{agent-master-model-C-KdOFDK.js → agent-master-model-Bk_yuUXJ.js} +1 -1
  197. package/dist/client/assets/{agent-specialization-BplZUa_0.js → agent-specialization-DDc7mLCW.js} +1 -1
  198. package/dist/client/assets/agents-screen-BYakbO50.css +1 -0
  199. package/dist/client/assets/{arc.es-CubLvQ4W.js → arc.es-C1SQHJ3k.js} +1 -1
  200. package/dist/client/assets/{arrow-left-DFfKAq0d.js → arrow-left-MVUKauwQ.js} +1 -1
  201. package/dist/client/assets/{arrow-right-DmAWnyAH.js → arrow-right-Bp-FpE5V.js} +1 -1
  202. package/dist/client/assets/{arrow-up-right-B0aLKiyF.js → arrow-up-right-BPedAgxO.js} +1 -1
  203. package/dist/client/assets/{book-open-BL9qvhEI.js → book-open-CV98WMSp.js} +1 -1
  204. package/dist/client/assets/{bot-BhAVbcCA.js → bot-B4zLQ4IN.js} +1 -1
  205. package/dist/client/assets/chat-api-DSJMBYoT.js +2 -0
  206. package/dist/client/assets/chat-message-markup-91DIry6R.js +1 -0
  207. package/dist/client/assets/chat-space-model-aW3Fd8_U.js +4 -0
  208. package/dist/client/assets/chat-transport-DNS5CB2I.js +1 -0
  209. package/dist/client/assets/{check-g7D7-c1J.js → check-lrJ3a73a.js} +1 -1
  210. package/dist/client/assets/{chevron-down-CDzRQQGl.js → chevron-down-l1mrh5S9.js} +1 -1
  211. package/dist/client/assets/{chevron-right-DKGTLiqc.js → chevron-right-DrfqcerI.js} +1 -1
  212. package/dist/client/assets/{chevron-up-DX7R6KY2.js → chevron-up-CETZJzjV.js} +1 -1
  213. package/dist/client/assets/{chunk-HRAB3GC3-Dvk_QpRq.js → chunk-HRAB3GC3-DbVLgbWX.js} +1 -1
  214. package/dist/client/assets/{clock-CQb4FeMf.js → clock-BV1aqPkK.js} +1 -1
  215. package/dist/client/assets/{code-xml-Cmadr3pQ.js → code-xml-BhcNbLWU.js} +1 -1
  216. package/dist/client/assets/{coffee-ljG1_krY.js → coffee-D7EAOdCk.js} +1 -1
  217. package/dist/client/assets/{compass-CvzkzkIh.js → compass-63TUaz5_.js} +1 -1
  218. package/dist/client/assets/content-B1lgE8qr.js +1 -0
  219. package/dist/client/assets/content-B5l11YyQ.js +1 -0
  220. package/dist/client/assets/content-BNZOZEpX.js +1 -0
  221. package/dist/client/assets/content-BRIxP155.js +1 -0
  222. package/dist/client/assets/content-BWd8gt8L.js +1 -0
  223. package/dist/client/assets/content-BfwS2jAK.js +1 -0
  224. package/dist/client/assets/content-C4p43_eT.js +1 -0
  225. package/dist/client/assets/content-CdYfaoDV.js +1 -0
  226. package/dist/client/assets/content-CzldLxw0.js +1 -0
  227. package/dist/client/assets/content-D-olnc4U.js +1 -0
  228. package/dist/client/assets/content-DTioimq4.js +1 -0
  229. package/dist/client/assets/content-LOebm3_d.js +1 -0
  230. package/dist/client/assets/{content-CKJ9zb7Z.js → content-nGlEZhUI.js} +1 -1
  231. package/dist/client/assets/{content-D1Ze_FG9.js → content-oyzDM-LK.js} +1 -1
  232. package/dist/client/assets/content-x1PHxED7.js +1 -0
  233. package/dist/client/assets/content-zX3ZY3T9.js +1 -0
  234. package/dist/client/assets/{conversation-icons-CIRaxmid.js → conversation-icons-Tqba2d56.js} +1 -1
  235. package/dist/client/assets/conversation-model-FxDeWlle.js +1 -0
  236. package/dist/client/assets/conversation-motion-features-C5zjuNwE.js +1 -0
  237. package/dist/client/assets/conversations-DoAAO6kA.js +1 -0
  238. package/dist/client/assets/{copy-BGOC1tJB.js → copy-xKeM5ZtU.js} +1 -1
  239. package/dist/client/assets/{cpu-Q6nrHFTN.js → cpu-BOTa_WLr.js} +1 -1
  240. package/dist/client/assets/{createLucideIcon-ChvMq-zl.js → createLucideIcon-zZ8Hx7er.js} +1 -1
  241. package/dist/client/assets/ctx-panel-BC8fpcWJ.css +1 -0
  242. package/dist/client/assets/direct-voice-BbLPuJ04.js +2 -0
  243. package/dist/client/assets/direct-voice-DbO7CSv_.css +1 -0
  244. package/dist/client/assets/discover-DJFxyV1k.js +2 -0
  245. package/dist/client/assets/embed-entry-Lyvu0Kfc.js +2 -0
  246. package/dist/client/assets/{external-link-BVccgH0n.js → external-link-CUObqmgX.js} +1 -1
  247. package/dist/client/assets/{eye-CsGfEVR6.js → eye-LrO-cXQt.js} +1 -1
  248. package/dist/client/assets/{file-code-corner-Be6da5l3.js → file-code-corner-CsU7jJpu.js} +1 -1
  249. package/dist/client/assets/{file-text-DP6txVW-.js → file-text-CnISiiw6.js} +1 -1
  250. package/dist/client/assets/{flag-DAFE2wZ5.js → flag-C4wl8z2-.js} +1 -1
  251. package/dist/client/assets/fleet-roll-call-BUgf7w-V.css +1 -0
  252. package/dist/client/assets/{folder-B_S7gBVr.js → folder-D5prSkzz.js} +1 -1
  253. package/dist/client/assets/{gauge-DQCGlE3o.js → gauge-D9_5iJEm.js} +1 -1
  254. package/dist/client/assets/{gestures-CofqY4Km.js → gestures-QZub3Ot9.js} +1 -1
  255. package/dist/client/assets/{git-branch-DcUCsWdJ.js → git-branch-B0_fPLO7.js} +1 -1
  256. package/dist/client/assets/{go-shortcuts-KQy-ZOpV.js → go-shortcuts-DicR7sUf.js} +1 -1
  257. package/dist/client/assets/home-moving-signal-rpMhsOJB.js +1 -0
  258. package/dist/client/assets/home-now-card-ByE6Umcx.js +1 -0
  259. package/dist/client/assets/{home-now-card-nano-CvU8B61b.js → home-now-card-nano-B5Dv3-pb.js} +1 -1
  260. package/dist/client/assets/hooks-_eCZZPsR.js +2 -0
  261. package/dist/client/assets/index-724SdE6r.js +1 -0
  262. package/dist/client/assets/{index-kkXUq-zf.js → index-CHD0qcfL.js} +1 -1
  263. package/dist/client/assets/index-CN4rBB_s.css +1 -0
  264. package/dist/client/assets/index-D1d98iYf.js +1 -0
  265. package/dist/client/assets/{index-DReVb7jZ.js → index-EsrkGBcv.js} +8 -8
  266. package/dist/client/assets/index-gGHPA-By.js +1 -0
  267. package/dist/client/assets/{inspector-panel-CLU7wjnT.js → inspector-panel-BkgUDn6G.js} +2 -2
  268. package/dist/client/assets/{keyboard-nav-CJXPaHXj.js → keyboard-nav-DDHegDbx.js} +1 -1
  269. package/dist/client/assets/{lane-roster-store-Ch9t6lb0.js → lane-roster-store-D-RSWjb-.js} +1 -1
  270. package/dist/client/assets/{layers-BOwyWodP.js → layers-C8PDiMul.js} +1 -1
  271. package/dist/client/assets/{layout-grid-B36Qsh0y.js → layout-grid-Cor2frzj.js} +1 -1
  272. package/dist/client/assets/left-Bn5X7x2o.js +2 -0
  273. package/dist/client/assets/left-BqS0fYX1.js +1 -0
  274. package/dist/client/assets/left-CTCeeeD3.js +1 -0
  275. package/dist/client/assets/left-DhtVPVux.js +1 -0
  276. package/dist/client/assets/left-K39b-Wvx.js +2 -0
  277. package/dist/client/assets/left-KGmueNPt.js +1 -0
  278. package/dist/client/assets/left-P_GOYB-s.js +1 -0
  279. package/dist/client/assets/left-advisor-B0N47De2.js +1 -0
  280. package/dist/client/assets/left-agents-CsSNc51Y.js +1 -0
  281. package/dist/client/assets/left-default-BlO5LP2T.js +1 -0
  282. package/dist/client/assets/left-lanes-C4PhaJE6.js +1 -0
  283. package/dist/client/assets/left-mission-BjTE5vPa.js +1 -0
  284. package/dist/client/assets/library-CkWNPHRp.js +1 -0
  285. package/dist/client/assets/{loader-circle-DNUsuPWz.js → loader-circle-OvccU82H.js} +1 -1
  286. package/dist/client/assets/{local-agents-I40PawYA.js → local-agents-BqnoxJrq.js} +1 -1
  287. package/dist/client/assets/log-in-7SnYqW5w.js +1 -0
  288. package/dist/client/assets/{machine-children-CdhNzDF0.js → machine-children-DxcqCLmd.js} +1 -1
  289. package/dist/client/assets/media-blobs-Bi8pxr1u.js +1 -0
  290. package/dist/client/assets/{mentions-Ck_Vjnyp.js → mentions-ByUvhS-v.js} +1 -1
  291. package/dist/client/assets/{mesh-ops-DSlvHp-D.js → mesh-ops-CiZ8xSAx.js} +1 -1
  292. package/dist/client/assets/{mesh-view-store-C1-mdP3P.js → mesh-view-store-DZvJC4KU.js} +1 -1
  293. package/dist/client/assets/{message-circle-cI5_A5mj.js → message-circle-CxRVKNE-.js} +1 -1
  294. package/dist/client/assets/message-markup-BQW5jdJw.js +15 -0
  295. package/dist/client/assets/message-markup-Zwo3t4cI.js +1 -0
  296. package/dist/client/assets/{message-square-CJW4WRlo.js → message-square-BxesYglW.js} +1 -1
  297. package/dist/client/assets/mission-control-model-BpJHDV5D.js +1 -0
  298. package/dist/client/assets/{mission-control-store-p_cboAm4.js → mission-control-store-elEEsIvb.js} +1 -1
  299. package/dist/client/assets/{mission-wall-DOuGOxQy.js → mission-wall-CAo4BKfa.js} +1 -1
  300. package/dist/client/assets/{monitor-C7_cHlkC.js → monitor-DTTYEb73.js} +1 -1
  301. package/dist/client/assets/{nav-destinations-CU_euC-Q.js → nav-destinations-uorRqFxf.js} +1 -1
  302. package/dist/client/assets/{observe-CtS0l3zu.js → observe-BJqERJVj.js} +1 -1
  303. package/dist/client/assets/{page-status-DwFR4wSw.js → page-status-BswZLqvA.js} +1 -1
  304. package/dist/client/assets/{panel-right-qP17MwMl.js → panel-right-Bv7sP_fc.js} +1 -1
  305. package/dist/client/assets/paperclip-BjcuP_Hx.js +1 -0
  306. package/dist/client/assets/{pause-B_hliKuR.js → pause-C2XTlkjs.js} +1 -1
  307. package/dist/client/assets/{persistent-state-BUsTTZFE.js → persistent-state-KRk_yb0q.js} +1 -1
  308. package/dist/client/assets/{pin-Oi4qHR6M.js → pin-C2mFOV1l.js} +1 -1
  309. package/dist/client/assets/{play-CVeRmqLH.js → play-FT6K3It1.js} +1 -1
  310. package/dist/client/assets/{plus-D5NLH_fM.js → plus-DFDDeGKu.js} +1 -1
  311. package/dist/client/assets/profile-DTmzN16I.js +1 -0
  312. package/dist/client/assets/{projects-inbox-CfwxCTdN.js → projects-inbox-C0FUCv_p.js} +1 -1
  313. package/dist/client/assets/projects-inbox-ColX6lpx.css +1 -0
  314. package/dist/client/assets/{provider-DwmCoSlc.js → provider-Dojd8quC.js} +1 -1
  315. package/dist/client/assets/{proxy-DgzP27W8.js → proxy-AJsmwA6h.js} +1 -1
  316. package/dist/client/assets/{radio-Cas2qg1D.js → radio-DRoOZsws.js} +1 -1
  317. package/dist/client/assets/{refresh-cw-IcD2lPoT.js → refresh-cw-BmVr7sCD.js} +1 -1
  318. package/dist/client/assets/resolve-panes-pbY1fCWi.js +1 -0
  319. package/dist/client/assets/resolve-sidebar-context-YWkZTq1t.js +1 -0
  320. package/dist/client/assets/right-49kO-6nD.js +1 -0
  321. package/dist/client/assets/right-APtItA8A.js +1 -0
  322. package/dist/client/assets/right-BJwhPqtn.js +1 -0
  323. package/dist/client/assets/right-BPqrf4ek.js +1 -0
  324. package/dist/client/assets/right-D7djOy6K.js +1 -0
  325. package/dist/client/assets/right-DKOUCRob.js +1 -0
  326. package/dist/client/assets/right-DMNrVzg7.js +1 -0
  327. package/dist/client/assets/{right-cjPTwPXS.js → right-DWPVB-nK.js} +1 -1
  328. package/dist/client/assets/right-DppeMCy4.js +1 -0
  329. package/dist/client/assets/right-GAL5Mw1v.js +1 -0
  330. package/dist/client/assets/{rocket-DAqYvu8I.js → rocket-CGl4RTV7.js} +1 -1
  331. package/dist/client/assets/router-DCtl8wqb.js +1 -0
  332. package/dist/client/assets/runtime-picker-DXu2bOTh.js +1 -0
  333. package/dist/client/assets/{scope-views-Dl3ml9OZ.js → scope-views-RUWwCVAr.js} +1 -1
  334. package/dist/client/assets/scout-voice-CZx60X6E.js +1 -0
  335. package/dist/client/assets/{scoutbot-markdown-DwvGQOWo.js → scoutbot-markdown-BKEBSbG0.js} +1 -1
  336. package/dist/client/assets/{scroll-text-B0tKI9Sg.js → scroll-text-DNjxhyO2.js} +1 -1
  337. package/dist/client/assets/{search-UsM-9-_W.js → search-DT42oyRW.js} +1 -1
  338. package/dist/client/assets/secondaryNavConfig-CS1svh6n.js +1 -0
  339. package/dist/client/assets/{selection-bridge-OTS2iFkt.js → selection-bridge-x3wFUjxj.js} +1 -1
  340. package/dist/client/assets/{send-horizontal-BlQsRK6C.js → send-horizontal-CH0-fbZE.js} +1 -1
  341. package/dist/client/assets/{send-to-agent-session-C1mgqdow.js → send-to-agent-session-DoKCDBJ4.js} +1 -1
  342. package/dist/client/assets/{server-DBlPW0Mp.js → server-QfsgMLk1.js} +1 -1
  343. package/dist/client/assets/{session-catalog-CnpZMB7C.js → session-catalog-CvSdPHPe.js} +1 -1
  344. package/dist/client/assets/session-recap-lanes-D-eVJnpY.js +1 -0
  345. package/dist/client/assets/session-recap-queue-41l2XVkI.js +1 -0
  346. package/dist/client/assets/{session-table-CGkfG5Yd.js → session-table-L-pns6Zl.js} +1 -1
  347. package/dist/client/assets/{sessions-view-Bge4XZ4I.js → sessions-view-Dc-QAa7O.js} +1 -1
  348. package/dist/client/assets/{settings-C69Zjrpq.js → settings-BVh7kldq.js} +1 -1
  349. package/dist/client/assets/{sliders-horizontal-6bzeod7c.js → sliders-horizontal-782VC_yy.js} +1 -1
  350. package/dist/client/assets/{sparkles-Cc5lPZRv.js → sparkles-BjHq_DNK.js} +1 -1
  351. package/dist/client/assets/{sse-A8AyLH0g.js → sse-BCPRocpq.js} +1 -1
  352. package/dist/client/assets/system-surfaces-redesign-q2BmCB7e.css +1 -0
  353. package/dist/client/assets/{tail-events-C4WdhVeK.js → tail-events-d0yAYxR0.js} +1 -1
  354. package/dist/client/assets/{terminal-DMZjX1es.js → terminal-hQKQygcf.js} +1 -1
  355. package/dist/client/assets/{terminal-relay-mO89dX-Y.js → terminal-relay-Bxs1hp-j.js} +1 -1
  356. package/dist/client/assets/{terminal-takeover-CZZsnPzj.js → terminal-takeover-Ay5C2c-M.js} +1 -1
  357. package/dist/client/assets/theme-vars-DNK0nn3k.js +1 -0
  358. package/dist/client/assets/triangle-alert-CHoRGdVO.js +1 -0
  359. package/dist/client/assets/{use-beside-D3cJpA5p.js → use-beside-DoRC1nt0.js} +1 -1
  360. package/dist/client/assets/{use-conversation-list-D5EnpVba.js → use-conversation-list-CY4JciOV.js} +1 -1
  361. package/dist/client/assets/{use-fleet-active-asks-D_QOmjg5.js → use-fleet-active-asks-CymmXWH4.js} +1 -1
  362. package/dist/client/assets/{use-mesh-node-state-3V3ADQ-G.js → use-mesh-node-state-BvaqtODo.js} +1 -1
  363. package/dist/client/assets/{use-mesh-ops-items-DI9GKWlF.js → use-mesh-ops-items-BSYaqH_0.js} +1 -1
  364. package/dist/client/assets/{use-reduced-motion-CiaZHMnk.js → use-reduced-motion-3gMYZNIp.js} +1 -1
  365. package/dist/client/assets/{use-scout-dev-flags-CkdAHlDR.js → use-scout-dev-flags-DS_pYYQd.js} +1 -1
  366. package/dist/client/assets/{useAgentHoverCard-A3QGXqIy.js → useAgentHoverCard-BANmpjMh.js} +1 -1
  367. package/dist/client/assets/useContentSecondaryNav-C6OBu-3_.js +1 -0
  368. package/dist/client/assets/{useEmbedHeadline-atkQVfGw.js → useEmbedHeadline-D6pJRxUg.js} +1 -1
  369. package/dist/client/assets/usePersistentState-B8lP7TRb.js +1 -0
  370. package/dist/client/assets/{usePierreRuntime-DTvcwISe.js → usePierreRuntime-BAQdiN0L.js} +1 -1
  371. package/dist/client/assets/useSidebarCollapse-OL_8J5cL.js +1 -0
  372. package/dist/client/assets/{users-RLK3P5U4.js → users-BUjx36gx.js} +1 -1
  373. package/dist/client/assets/voice-paths-CJUuBPh3.css +1 -0
  374. package/dist/client/assets/voice-turn-DftA0iIb.css +1 -0
  375. package/dist/client/assets/voice-turn-ledger-BMZxlSjg.js +1 -0
  376. package/dist/client/assets/{wrench-B4maQJai.js → wrench-DR0i5BU7.js} +1 -1
  377. package/dist/client/assets/{x-rlMdRqJF.js → x-DAehov0E.js} +1 -1
  378. package/dist/client/assets/{xterm-B1zHHOLQ.js → xterm-BXQiLVnI.js} +1 -1
  379. package/dist/client/assets/{zap-B4X0OrEw.js → zap-CEjZNZbI.js} +1 -1
  380. package/dist/client/crew/sheets/eye-plate-v1/look-down-left.webp +0 -0
  381. package/dist/client/crew/sheets/eye-plate-v1/look-down-right.webp +0 -0
  382. package/dist/client/crew/sheets/eye-plate-v1/look-down.webp +0 -0
  383. package/dist/client/crew/sheets/eye-plate-v1/look-up-left.webp +0 -0
  384. package/dist/client/crew/sheets/eye-plate-v1/look-up-right.webp +0 -0
  385. package/dist/client/crew/sheets/eye-plate-v1/look-up.webp +0 -0
  386. package/dist/client/crew/sheets/sprout/blink-half.webp +0 -0
  387. package/dist/client/crew/sheets/sprout/blink-shut.webp +0 -0
  388. package/dist/client/crew/sheets/sprout/look-down-left.webp +0 -0
  389. package/dist/client/crew/sheets/sprout/look-down-right.webp +0 -0
  390. package/dist/client/crew/sheets/sprout/look-down.webp +0 -0
  391. package/dist/client/crew/sheets/sprout/look-left.webp +0 -0
  392. package/dist/client/crew/sheets/sprout/look-right.webp +0 -0
  393. package/dist/client/crew/sheets/sprout/look-up-left.webp +0 -0
  394. package/dist/client/crew/sheets/sprout/look-up-right.webp +0 -0
  395. package/dist/client/crew/sheets/sprout/look-up.webp +0 -0
  396. package/dist/client/index.html +2 -2
  397. package/dist/drizzle/0020_message_reactions.sql +11 -0
  398. package/dist/drizzle/meta/_journal.json +7 -0
  399. package/dist/main.mjs +542 -150
  400. package/dist/node/main.mjs +131 -17
  401. package/dist/pairing-runtime-controller.mjs +375 -78
  402. package/dist/runtime/base-daemon.mjs +98 -5
  403. package/dist/runtime/broker-daemon.mjs +1879 -1198
  404. package/dist/runtime/broker-process-manager.mjs +96 -3
  405. package/dist/runtime/mesh-discover.mjs +96 -3
  406. package/dist/scout-control-plane-web.mjs +4817 -1616
  407. package/dist/update-helper.mjs +211 -39
  408. package/package.json +2 -2
  409. package/dist/client/assets/ActivityScreen-CcDdQTBK.js +0 -1
  410. package/dist/client/assets/AgentAdventures-BxrYq_2v.js +0 -1
  411. package/dist/client/assets/AgentAvatar-NZOqcsB2.js +0 -1
  412. package/dist/client/assets/AgentConfigurationScreen-BhD1PEAM.js +0 -1
  413. package/dist/client/assets/AgentDefinitionsWorkspace-BqS6MXqF.js +0 -1
  414. package/dist/client/assets/AgentFloorView-A0dDRlRV.js +0 -1
  415. package/dist/client/assets/AgentInfoScreen-DuaN0sgE.js +0 -1
  416. package/dist/client/assets/AgentLanesEmbedScreen-CeNiaZ9_.js +0 -1
  417. package/dist/client/assets/AgentLanesView-WZhEDBFE.js +0 -2
  418. package/dist/client/assets/AgentMasterScreen-DUDUTAnU.js +0 -1
  419. package/dist/client/assets/AgentSessions-CO1WGa8Z.js +0 -6
  420. package/dist/client/assets/AgentsConsole-BQOWkj35.js +0 -1
  421. package/dist/client/assets/AgentsScreen-BMNAj1PH.js +0 -1
  422. package/dist/client/assets/AgentsSubnav-CeHhuzyM.js +0 -1
  423. package/dist/client/assets/BriefingDetailScreen-yZG8_m4h.js +0 -1
  424. package/dist/client/assets/BrokerScreen-CT37VQiL.js +0 -8
  425. package/dist/client/assets/ChannelComposer-BVItWlEz.js +0 -1
  426. package/dist/client/assets/ChannelSidebar-B-2spawY.js +0 -1
  427. package/dist/client/assets/ChatBits-CLJ71hTY.js +0 -1
  428. package/dist/client/assets/ChatRightPanel-pKQtkAgl.js +0 -1
  429. package/dist/client/assets/ChatSpaceSurface-NrLwdPkE.js +0 -1
  430. package/dist/client/assets/ChatSpaceTheme-BPMgPdVK.css +0 -1
  431. package/dist/client/assets/ChatSpaceTheme-D37Jk7bl.js +0 -1
  432. package/dist/client/assets/ConversationComposer-DNcn5U6D.js +0 -1
  433. package/dist/client/assets/ConversationFeedRows-RnYSa7Io.js +0 -1
  434. package/dist/client/assets/ConversationHeader-Y9TEJxP_.js +0 -1
  435. package/dist/client/assets/ConversationScreen-Brfas2y0.css +0 -1
  436. package/dist/client/assets/ConversationScreen-tpj4cqWs.js +0 -2
  437. package/dist/client/assets/ConversationStatus-Cv-7hErW.js +0 -1
  438. package/dist/client/assets/CrewAvatar-zgzC3cbU.js +0 -1
  439. package/dist/client/assets/CrewWorkspaces-K2jcyLec.js +0 -1
  440. package/dist/client/assets/FlightObserveScreen-CvzhzuWc.js +0 -1
  441. package/dist/client/assets/FloorResourcesSheet-_Iy5UqgY.js +0 -1
  442. package/dist/client/assets/FloorTacticalHUD-BhyOqlL5.js +0 -1
  443. package/dist/client/assets/HarnessMark-DSvM_H7H.js +0 -1
  444. package/dist/client/assets/HarnessesScreen-DyjqbZ4k.js +0 -1
  445. package/dist/client/assets/InviteLandingScreen-xZQ2na1z.js +0 -1
  446. package/dist/client/assets/InviteSheet--5Zjct25.js +0 -1
  447. package/dist/client/assets/KnowledgeSearchScreen-BPqAjHnH.js +0 -1
  448. package/dist/client/assets/LaneTraceDetailSheet-jl4XQmEx.js +0 -1
  449. package/dist/client/assets/MeshScreen-BW1dMFWF.js +0 -1
  450. package/dist/client/assets/MessagesScreen-CtNMfIvC.js +0 -1
  451. package/dist/client/assets/MissionControlView-BjPOViGY.js +0 -1
  452. package/dist/client/assets/MissionLeftAgentRow-Dms0DBjO.js +0 -1
  453. package/dist/client/assets/NativeAreaScreen-BQSTo8As.js +0 -1
  454. package/dist/client/assets/NativeAreaScreen-Brix6xDB.js +0 -1
  455. package/dist/client/assets/NativeAreaScreen-D7HyQNlM.js +0 -1
  456. package/dist/client/assets/NewChatComposer-BEXS8vV6.js +0 -19
  457. package/dist/client/assets/ObserveEmbedScreen-Dh30EjAQ.js +0 -2
  458. package/dist/client/assets/OpenScoutAppShell-D9pgw36i.js +0 -31
  459. package/dist/client/assets/OpsAgentsView-D3rM0udq.js +0 -1
  460. package/dist/client/assets/OpsScreen-DySeNQ1V.js +0 -1
  461. package/dist/client/assets/OpsSubnav-C9E0r3GZ.js +0 -1
  462. package/dist/client/assets/ProjectAgentProfile-FUav75j2.js +0 -1
  463. package/dist/client/assets/ProjectAgentProfileHero-BLK0EwMg.js +0 -1
  464. package/dist/client/assets/ProjectsInbox-DfCXReZK.js +0 -2
  465. package/dist/client/assets/ProjectsRail-CELVubfJ.js +0 -1
  466. package/dist/client/assets/ProjectsScreen-DMw4TLKy.js +0 -1
  467. package/dist/client/assets/ProjectsThreadAside-D1Sh4fnX.js +0 -1
  468. package/dist/client/assets/Provider-CNZluAZb.js +0 -5
  469. package/dist/client/assets/RailToggle-BwmY70B8.js +0 -1
  470. package/dist/client/assets/RawSessionsTable-6OVJq0JZ.js +0 -1
  471. package/dist/client/assets/RealtimeVoiceScreen-D41TYY0x.js +0 -9
  472. package/dist/client/assets/RepoDiffViewerLazy-BpMR7tlx.js +0 -2
  473. package/dist/client/assets/SessionObserveEvidence-CS1aQBpQ.js +0 -1
  474. package/dist/client/assets/SessionRefScreen-DURV0MpF.js +0 -1
  475. package/dist/client/assets/SessionsScreen-D71ZR-8t.js +0 -1
  476. package/dist/client/assets/SettingsDrawer-Nz98oBVl.js +0 -3
  477. package/dist/client/assets/SettingsScreen-CYBHal6y.js +0 -1
  478. package/dist/client/assets/SharedWorkFloor-BCmdeb3Q.css +0 -1
  479. package/dist/client/assets/SharedWorkFloor-C0xxW4SN.js +0 -2
  480. package/dist/client/assets/SpaceSwitcher-BfeIf-ad.js +0 -1
  481. package/dist/client/assets/Terminal-jIqnIZZ6.js +0 -4
  482. package/dist/client/assets/TerminalEmbedScreen-3XsjuySR.js +0 -1
  483. package/dist/client/assets/WorkDetailScreen-Bcf_yHhU.js +0 -5
  484. package/dist/client/assets/WorldActorTalk-CKerDikx.js +0 -1
  485. package/dist/client/assets/WorldMinimap-DOptgrc4.js +0 -1
  486. package/dist/client/assets/agent-autocomplete-C7xwIcwd.css +0 -1
  487. package/dist/client/assets/agent-autocomplete-_u9o5EZu.js +0 -2
  488. package/dist/client/assets/agents-screen-BMu6PpRY.css +0 -1
  489. package/dist/client/assets/at-sign-DM7xeppo.js +0 -1
  490. package/dist/client/assets/chat-api-BPVC0asu.js +0 -1
  491. package/dist/client/assets/chat-space-model-B6Jg2CY4.js +0 -4
  492. package/dist/client/assets/content-0AXa0klu.js +0 -1
  493. package/dist/client/assets/content-BEyJ19Lx.js +0 -1
  494. package/dist/client/assets/content-BN5weWKW.js +0 -1
  495. package/dist/client/assets/content-BNokkm7C.js +0 -1
  496. package/dist/client/assets/content-BV4PUM9q.js +0 -1
  497. package/dist/client/assets/content-BxUPlcx5.js +0 -1
  498. package/dist/client/assets/content-CIC5sku8.js +0 -1
  499. package/dist/client/assets/content-CdkTyxqk.js +0 -1
  500. package/dist/client/assets/content-CnhhSCZq.js +0 -1
  501. package/dist/client/assets/content-DY3F9Vfr.js +0 -1
  502. package/dist/client/assets/content-DrKBYpcb.js +0 -1
  503. package/dist/client/assets/content-LSStQYj5.js +0 -1
  504. package/dist/client/assets/content-YvU-D0hF.js +0 -1
  505. package/dist/client/assets/content-oKQMyVnH.js +0 -1
  506. package/dist/client/assets/conversation-model-m8HhzroS.js +0 -1
  507. package/dist/client/assets/conversation-motion-features-D9PxLoDt.js +0 -1
  508. package/dist/client/assets/conversations-Cbg9h_Af.js +0 -1
  509. package/dist/client/assets/ctx-panel-F05jXK4Q.css +0 -1
  510. package/dist/client/assets/discover-DlwbftpC.js +0 -2
  511. package/dist/client/assets/embed-entry-c0lwtjBG.js +0 -2
  512. package/dist/client/assets/home-moving-signal-BIHUGNfI.js +0 -1
  513. package/dist/client/assets/home-now-card-CaLgZze2.js +0 -1
  514. package/dist/client/assets/hooks-DaUOREpP.js +0 -2
  515. package/dist/client/assets/index-CGbs0SBm.css +0 -1
  516. package/dist/client/assets/index-CbqBwfIW.js +0 -1
  517. package/dist/client/assets/index-CyPMl7Up.js +0 -1
  518. package/dist/client/assets/index-PQpJveGO.js +0 -1
  519. package/dist/client/assets/left-0vBrvrBG.js +0 -2
  520. package/dist/client/assets/left-C6SyaqlJ.js +0 -1
  521. package/dist/client/assets/left-CTuXysZR.js +0 -2
  522. package/dist/client/assets/left-Cc6s4DT2.js +0 -1
  523. package/dist/client/assets/left-DF5caiyh.js +0 -1
  524. package/dist/client/assets/left-DgT4tWCx.js +0 -1
  525. package/dist/client/assets/left-R0wppTTr.js +0 -1
  526. package/dist/client/assets/left-advisor-C-kt8V28.js +0 -1
  527. package/dist/client/assets/left-agents-thnBO156.js +0 -1
  528. package/dist/client/assets/left-default-CT42fnpF.js +0 -1
  529. package/dist/client/assets/left-lanes-CSmZgciK.js +0 -1
  530. package/dist/client/assets/left-mission-C86x6i9h.js +0 -1
  531. package/dist/client/assets/library-DdhYL_9v.js +0 -1
  532. package/dist/client/assets/message-markup-6Tgo4qFJ.js +0 -15
  533. package/dist/client/assets/mission-control-model-C30vU1Fe.js +0 -1
  534. package/dist/client/assets/profile-BegEUmB7.js +0 -1
  535. package/dist/client/assets/projects-inbox-CKPLZN8s.css +0 -1
  536. package/dist/client/assets/resolve-panes-pfZTezKo.js +0 -1
  537. package/dist/client/assets/resolve-sidebar-context-D5ksvrb_.js +0 -1
  538. package/dist/client/assets/right-BDaCJ0CF.js +0 -1
  539. package/dist/client/assets/right-BP6lXRFS.js +0 -1
  540. package/dist/client/assets/right-Cb1VCrdj.js +0 -1
  541. package/dist/client/assets/right-CeFaxfBo.js +0 -1
  542. package/dist/client/assets/right-Ck2SrYCj.js +0 -1
  543. package/dist/client/assets/right-D-uv5YfF.js +0 -1
  544. package/dist/client/assets/right-DJMSICky.js +0 -1
  545. package/dist/client/assets/right-Dnljs8ah.js +0 -1
  546. package/dist/client/assets/right-SdCSF8PP.js +0 -1
  547. package/dist/client/assets/router-C-MF5-mb.js +0 -1
  548. package/dist/client/assets/runtime-picker-C_AVYF63.js +0 -1
  549. package/dist/client/assets/scout-voice-CqAyfblr.js +0 -1
  550. package/dist/client/assets/secondaryNavConfig-DzNHk6IH.js +0 -1
  551. package/dist/client/assets/system-surfaces-redesign-DKFg4GB5.css +0 -1
  552. package/dist/client/assets/useContentSecondaryNav-DrL_nkCZ.js +0 -1
  553. package/dist/client/assets/usePersistentState-Y8XwSTg-.js +0 -1
  554. package/dist/drizzle/meta/0000_snapshot.json +0 -4575
  555. package/dist/drizzle/meta/0001_snapshot.json +0 -4624
  556. package/dist/drizzle/meta/0002_snapshot.json +0 -4631
  557. package/dist/drizzle/meta/0003_snapshot.json +0 -4952
  558. package/dist/drizzle/meta/0004_snapshot.json +0 -5235
  559. package/dist/drizzle/meta/0005_snapshot.json +0 -5599
  560. package/dist/drizzle/meta/0006_snapshot.json +0 -5606
  561. package/dist/drizzle/meta/0007_snapshot.json +0 -5767
  562. package/dist/drizzle/meta/0008_snapshot.json +0 -5774
  563. package/dist/drizzle/meta/0009_snapshot.json +0 -6262
  564. package/dist/drizzle/meta/0010_snapshot.json +0 -6286
  565. package/dist/drizzle/meta/0011_snapshot.json +0 -6337
  566. package/dist/drizzle/meta/0012_snapshot.json +0 -6458
  567. package/dist/drizzle/meta/0013_snapshot.json +0 -6465
  568. package/dist/drizzle/meta/0014_snapshot.json +0 -6503
  569. package/dist/drizzle/meta/0015_snapshot.json +0 -6596
  570. package/dist/drizzle/meta/0016_snapshot.json +0 -6611
  571. package/dist/drizzle/meta/0017_snapshot.json +0 -6785
  572. package/dist/drizzle/meta/0018_snapshot.json +0 -6804
  573. package/dist/drizzle/meta/0019_snapshot.json +0 -6804
package/dist/main.mjs CHANGED
@@ -1619,6 +1619,31 @@ var init_orchestration_provider_map = __esm(() => {
1619
1619
  };
1620
1620
  });
1621
1621
 
1622
+ // ../protocol/src/message-reactions.ts
1623
+ var REACTION_EMOJI_QUICK, REACTION_EMOJI_MORE, REACTION_EMOJI_ALLOWLIST, REACTION_EMOJI_ALLOWLIST_SET;
1624
+ var init_message_reactions = __esm(() => {
1625
+ REACTION_EMOJI_QUICK = ["\uD83D\uDC4D", "\u2764\uFE0F", "\uD83D\uDE02", "\uD83D\uDC40", "\uD83C\uDF89"];
1626
+ REACTION_EMOJI_MORE = [
1627
+ "\uD83D\uDD25",
1628
+ "\uD83D\uDE4F",
1629
+ "\uD83D\uDC4F",
1630
+ "\uD83D\uDE22",
1631
+ "\uD83D\uDE2E",
1632
+ "\uD83D\uDE80",
1633
+ "\u2705",
1634
+ "\uD83D\uDCAF",
1635
+ "\uD83E\uDD14",
1636
+ "\uD83D\uDCA1",
1637
+ "\uD83D\uDE4C",
1638
+ "\u2728"
1639
+ ];
1640
+ REACTION_EMOJI_ALLOWLIST = [
1641
+ ...REACTION_EMOJI_QUICK,
1642
+ ...REACTION_EMOJI_MORE
1643
+ ];
1644
+ REACTION_EMOJI_ALLOWLIST_SET = new Set(REACTION_EMOJI_ALLOWLIST);
1645
+ });
1646
+
1622
1647
  // ../protocol/src/permission-policy.ts
1623
1648
  function normalizeScoutPermissionProfile(value) {
1624
1649
  const normalized = value?.trim().replaceAll("-", "_");
@@ -2663,6 +2688,9 @@ var init_terminal_sessions = __esm(() => {
2663
2688
  init_terminal_surface_id();
2664
2689
  });
2665
2690
 
2691
+ // ../protocol/src/terminal-session-resolve.ts
2692
+ var init_terminal_session_resolve = () => {};
2693
+
2666
2694
  // ../protocol/src/terminal-workspaces.ts
2667
2695
  function normalizeTerminalWorkspaceColumnCount(value) {
2668
2696
  return value === "dynamic" ? "dynamic" : normalizeTerminalWorkspaceColumns(value);
@@ -2811,6 +2839,8 @@ var init_broker_routes = __esm(() => {
2811
2839
  machines: "/v1/machines",
2812
2840
  machinesScan: "/v1/machines/scan",
2813
2841
  messages: "/v1/messages",
2842
+ messageReactions: "/v1/message-reactions",
2843
+ messageReactionsRemove: "/v1/message-reactions/remove",
2814
2844
  brokerMessages: "/v1/broker/messages",
2815
2845
  eventsStream: "/v1/events/stream",
2816
2846
  commands: "/v1/commands",
@@ -2874,6 +2904,7 @@ var init_src = __esm(() => {
2874
2904
  init_assigned_roles();
2875
2905
  init_orchestrator_prompt();
2876
2906
  init_orchestration_provider_map();
2907
+ init_message_reactions();
2877
2908
  init_agent_runs();
2878
2909
  init_budget();
2879
2910
  init_host_integrations();
@@ -2892,6 +2923,7 @@ var init_src = __esm(() => {
2892
2923
  init_cursor_transport();
2893
2924
  init_terminal_surface_id();
2894
2925
  init_terminal_sessions();
2926
+ init_terminal_session_resolve();
2895
2927
  init_terminal_workspaces();
2896
2928
  init_herdr_workspace_digest();
2897
2929
  init_broker_routes();
@@ -11600,6 +11632,101 @@ var init_broker_api = __esm(() => {
11600
11632
  // ../runtime/src/schema-version.ts
11601
11633
  var CONTROL_PLANE_SCHEMA_VERSION = 18;
11602
11634
 
11635
+ // ../runtime/src/sqlite-observation.ts
11636
+ import { createHash as createHash3 } from "crypto";
11637
+ function observeSqliteDatabase(database, options) {
11638
+ const configured = options.thresholdMs ?? Number(process.env.OPENSCOUT_SLOW_DB_MS ?? 100);
11639
+ const threshold = Number.isFinite(configured) && configured >= 0 ? configured : 100;
11640
+ if (threshold === 0)
11641
+ return database;
11642
+ const now = options.now ?? (() => performance.now());
11643
+ const emit = options.emit ?? ((event) => console.warn("[scout-db]", JSON.stringify(event)));
11644
+ const statements = new WeakMap;
11645
+ let windowStart = -Infinity;
11646
+ let emitted = 0;
11647
+ let suppressed = 0;
11648
+ function timed(operation, sql, call) {
11649
+ const start = now();
11650
+ let outcome = "error";
11651
+ try {
11652
+ const result = call();
11653
+ outcome = "ok";
11654
+ return result;
11655
+ } finally {
11656
+ try {
11657
+ const end = now();
11658
+ const duration = end - start;
11659
+ if (duration >= threshold) {
11660
+ if (end - windowStart >= 60000) {
11661
+ windowStart = end;
11662
+ emitted = 0;
11663
+ }
11664
+ if (emitted >= 10) {
11665
+ suppressed += 1;
11666
+ } else {
11667
+ emitted += 1;
11668
+ const caller = (new Error().stack ?? "").split(`
11669
+ `).filter((line) => !/sqlite-observation\.(?:ts|js):/.test(line)).map((line) => line.match(/(?:packages|apps)\/[\w./-]+:\d+:\d+/)?.[0]).filter((line) => Boolean(line)).slice(0, 4);
11670
+ emit({
11671
+ event: "slow_sqlite",
11672
+ database: options.database,
11673
+ pid: process.pid,
11674
+ operation,
11675
+ queryId: createHash3("sha256").update(sql).digest("hex").slice(0, 16),
11676
+ durationMs: Math.round(duration * 100) / 100,
11677
+ outcome,
11678
+ suppressed,
11679
+ caller
11680
+ });
11681
+ suppressed = 0;
11682
+ }
11683
+ }
11684
+ } catch {}
11685
+ }
11686
+ }
11687
+ function statementProxy(statement, sql) {
11688
+ const existing = statements.get(statement);
11689
+ if (existing)
11690
+ return existing;
11691
+ const proxy = bindProxy(statement, (key, method, args) => {
11692
+ if (["all", "get", "run", "values"].includes(key)) {
11693
+ return timed(key, sql, () => Reflect.apply(method, statement, args));
11694
+ }
11695
+ return Reflect.apply(method, statement, args);
11696
+ });
11697
+ statements.set(statement, proxy);
11698
+ return proxy;
11699
+ }
11700
+ return bindProxy(database, (key, method, args) => {
11701
+ if (["query", "prepare"].includes(key) && typeof args[0] === "string") {
11702
+ const sql = args[0];
11703
+ const statement = timed(`${key}.prepare`, sql, () => Reflect.apply(method, database, args));
11704
+ return statementProxy(statement, sql);
11705
+ }
11706
+ if (["exec", "run"].includes(key) && typeof args[0] === "string") {
11707
+ return timed(key, args[0], () => Reflect.apply(method, database, args));
11708
+ }
11709
+ return Reflect.apply(method, database, args);
11710
+ });
11711
+ }
11712
+ function bindProxy(target, invoke) {
11713
+ const methods = new Map;
11714
+ return new Proxy(target, {
11715
+ get(object, key) {
11716
+ const value = Reflect.get(object, key, object);
11717
+ if (typeof value !== "function" || key === "constructor")
11718
+ return value;
11719
+ const cached = methods.get(key);
11720
+ if (cached?.original === value)
11721
+ return cached.wrapped;
11722
+ const wrapped = (...args) => invoke(String(key), value, args);
11723
+ methods.set(key, { original: value, wrapped });
11724
+ return wrapped;
11725
+ }
11726
+ });
11727
+ }
11728
+ var init_sqlite_observation = () => {};
11729
+
11603
11730
  // ../runtime/src/runtime-adapters.ts
11604
11731
  function detectRuntimeHost(globalScope = globalThis) {
11605
11732
  return typeof globalScope.Bun === "undefined" ? "node" : "bun";
@@ -11665,13 +11792,13 @@ function openRuntimeSqliteDatabase(path, options) {
11665
11792
  const adapter = controlPlaneSqliteAdapterKind();
11666
11793
  if (adapter === "bun-sqlite") {
11667
11794
  const { Database } = require2("bun:sqlite");
11668
- return new Database(path, options);
11795
+ return observeSqliteDatabase(new Database(path, options), { database: "runtime" });
11669
11796
  }
11670
11797
  const { DatabaseSync } = require2("node:sqlite");
11671
- return new NodeSqliteDatabaseAdapter(new DatabaseSync(path, {
11798
+ return observeSqliteDatabase(new NodeSqliteDatabaseAdapter(new DatabaseSync(path, {
11672
11799
  open: true,
11673
11800
  readOnly: options?.readonly === true
11674
- }));
11801
+ })), { database: "runtime" });
11675
11802
  }
11676
11803
  function prepareNodeSqliteSql(sql) {
11677
11804
  const numberedParamIndexes = [];
@@ -11764,6 +11891,8 @@ class NodeSqliteDatabaseAdapter {
11764
11891
  }
11765
11892
  var require2;
11766
11893
  var init_sqlite_adapter = __esm(() => {
11894
+ init_sqlite_observation();
11895
+ init_sqlite_observation();
11767
11896
  require2 = createRequire(import.meta.url);
11768
11897
  });
11769
11898
 
@@ -19592,6 +19721,7 @@ class CodexAppServerTransport {
19592
19721
  });
19593
19722
  }
19594
19723
  async ensureStarted() {
19724
+ this.options.signal?.throwIfAborted();
19595
19725
  if (this.isAlive() && this.threadId) {
19596
19726
  return;
19597
19727
  }
@@ -19623,6 +19753,7 @@ class CodexAppServerTransport {
19623
19753
  });
19624
19754
  throw failure;
19625
19755
  }
19756
+ this.options.signal?.throwIfAborted();
19626
19757
  const codexExecutable = resolveCodexExecutable();
19627
19758
  const launchArgs = normalizeCodexAppServerLaunchArgs(this.options.launchArgs);
19628
19759
  const env = this.options.processEnv ?? mergeEnvironmentOverrides(process.env, this.options.env);
@@ -20006,13 +20137,17 @@ class CodexAppServerClient {
20006
20137
  return this.transport.ensureOnline();
20007
20138
  }
20008
20139
  async invoke(prompt, timeoutMs) {
20140
+ const onDelta = this.options.onDelta;
20141
+ const signal = this.options.signal;
20009
20142
  return this.enqueue(async () => {
20143
+ signal?.throwIfAborted();
20010
20144
  await this.transport.ensureOnline();
20145
+ signal?.throwIfAborted();
20011
20146
  if (!this.transport.currentThreadId) {
20012
20147
  throw new Error(`Codex app-server session for ${this.options.agentName} has no active thread.`);
20013
20148
  }
20014
20149
  const outputPromise = new Promise(async (resolve13, reject) => {
20015
- const turn = this.createActiveTurn(resolve13, reject);
20150
+ const turn = this.createActiveTurn(resolve13, reject, onDelta);
20016
20151
  try {
20017
20152
  const response = await this.transport.startTurn(prompt);
20018
20153
  turn.turnId = response.turn.id;
@@ -20029,8 +20164,12 @@ class CodexAppServerClient {
20029
20164
  });
20030
20165
  }
20031
20166
  async start(prompt) {
20167
+ const onDelta = this.options.onDelta;
20168
+ const signal = this.options.signal;
20032
20169
  return this.enqueue(async () => {
20170
+ signal?.throwIfAborted();
20033
20171
  await this.transport.ensureOnline();
20172
+ signal?.throwIfAborted();
20034
20173
  if (!this.transport.currentThreadId) {
20035
20174
  throw new Error(`Codex app-server session for ${this.options.agentName} has no active thread.`);
20036
20175
  }
@@ -20039,7 +20178,7 @@ class CodexAppServerClient {
20039
20178
  }
20040
20179
  let turn;
20041
20180
  const completion = new Promise((resolve13, reject) => {
20042
- turn = this.createActiveTurn(resolve13, reject);
20181
+ turn = this.createActiveTurn(resolve13, reject, onDelta);
20043
20182
  });
20044
20183
  completion.catch(() => {
20045
20184
  return;
@@ -20136,11 +20275,12 @@ class CodexAppServerClient {
20136
20275
  });
20137
20276
  return next;
20138
20277
  }
20139
- createActiveTurn(resolve13, reject) {
20278
+ createActiveTurn(resolve13, reject, onDelta) {
20140
20279
  if (this.activeTurn) {
20141
20280
  throw new Error(`Codex app-server session for ${this.options.agentName} already has an active turn.`);
20142
20281
  }
20143
20282
  const turn = {
20283
+ onDelta,
20144
20284
  turnId: "",
20145
20285
  startedAt: Date.now(),
20146
20286
  messageOrder: [],
@@ -20217,6 +20357,8 @@ class CodexAppServerClient {
20217
20357
  this.activeTurn.messageByItemId.set(itemId, "");
20218
20358
  }
20219
20359
  this.activeTurn.messageByItemId.set(itemId, (this.activeTurn.messageByItemId.get(itemId) ?? "") + delta);
20360
+ if (delta)
20361
+ this.activeTurn.onDelta?.(delta);
20220
20362
  return;
20221
20363
  }
20222
20364
  if (method === "item/completed") {
@@ -30949,7 +31091,7 @@ var init_sqlite_core = __esm(() => {
30949
31091
  });
30950
31092
 
30951
31093
  // ../runtime/src/drizzle-schema.ts
30952
- var epochMsNow, nodesTable, machinesTable, trustedPeersTable, peerNoncesTable, actorsTable, agentsTable, agentEndpointsTable, runtimeSessionsTable, runtimeSessionAliasesTable, routeAliasBindingsTable, routeAliasRevisionsTable, conversationsTable, conversationMembersTable, messagesTable, messageMentionsTable, messageAttachmentsTable, conversationReadCursorsTable, brokerJournalProjectionCheckpointsTable, conversationProjectionMetaTable, conversationProjectionItemsTable, conversationProjectionMessageFactsTable, conversationProjectionMessageStatsTable, conversationProjectionSourcesTable, conversationProjectionEventsTable, invocationsTable, flightsTable, bindingsTable, deliveriesTable, deliveryAttemptsTable, durableActionsTable, durableAttemptsTable, durableCheckpointsTable, durableSignalsTable, collaborationRecordsTable, collaborationEventsTable, contextBlocksTable, contextPacksTable, eventsTable, threadEventsTable, threadCursorsTable, scoutDispatchesTable, activityItemsTable, budgetUsageEventsTable, budgetQuotaWindowSnapshotsTable, mobilePushRegistrationsTable, briefingsTable, roleAssignmentsTable, missionLogEntriesTable, controlPlaneDrizzleSchema;
31094
+ var epochMsNow, nodesTable, machinesTable, trustedPeersTable, peerNoncesTable, actorsTable, agentsTable, agentEndpointsTable, runtimeSessionsTable, runtimeSessionAliasesTable, routeAliasBindingsTable, routeAliasRevisionsTable, conversationsTable, conversationMembersTable, messagesTable, messageMentionsTable, messageReactionsTable, messageAttachmentsTable, conversationReadCursorsTable, brokerJournalProjectionCheckpointsTable, conversationProjectionMetaTable, conversationProjectionItemsTable, conversationProjectionMessageFactsTable, conversationProjectionMessageStatsTable, conversationProjectionSourcesTable, conversationProjectionEventsTable, invocationsTable, flightsTable, bindingsTable, deliveriesTable, deliveryAttemptsTable, durableActionsTable, durableAttemptsTable, durableCheckpointsTable, durableSignalsTable, collaborationRecordsTable, collaborationEventsTable, contextBlocksTable, contextPacksTable, eventsTable, threadEventsTable, threadCursorsTable, scoutDispatchesTable, activityItemsTable, budgetUsageEventsTable, budgetQuotaWindowSnapshotsTable, mobilePushRegistrationsTable, briefingsTable, roleAssignmentsTable, missionLogEntriesTable, controlPlaneDrizzleSchema;
30953
31095
  var init_drizzle_schema = __esm(() => {
30954
31096
  init_drizzle_orm();
30955
31097
  init_sqlite_core();
@@ -31230,6 +31372,15 @@ var init_drizzle_schema = __esm(() => {
31230
31372
  }, (table3) => [
31231
31373
  primaryKey({ columns: [table3.messageId, table3.actorId] })
31232
31374
  ]);
31375
+ messageReactionsTable = sqliteTable("message_reactions", {
31376
+ messageId: text("message_id").notNull().references(() => messagesTable.id, { onDelete: "cascade" }),
31377
+ actorId: text("actor_id").notNull().references(() => actorsTable.id, { onDelete: "restrict" }),
31378
+ emoji: text("emoji").notNull(),
31379
+ createdAt: integer("created_at").notNull()
31380
+ }, (table3) => [
31381
+ primaryKey({ columns: [table3.messageId, table3.actorId, table3.emoji] }),
31382
+ index("idx_message_reactions_message").on(table3.messageId)
31383
+ ]);
31233
31384
  messageAttachmentsTable = sqliteTable("message_attachments", {
31234
31385
  id: text("id").primaryKey(),
31235
31386
  messageId: text("message_id").notNull().references(() => messagesTable.id, { onDelete: "cascade" }),
@@ -31808,6 +31959,7 @@ var init_drizzle_schema = __esm(() => {
31808
31959
  conversationMembers: conversationMembersTable,
31809
31960
  messages: messagesTable,
31810
31961
  messageMentions: messageMentionsTable,
31962
+ messageReactions: messageReactionsTable,
31811
31963
  messageAttachments: messageAttachmentsTable,
31812
31964
  conversationReadCursors: conversationReadCursorsTable,
31813
31965
  brokerJournalProjectionCheckpoints: brokerJournalProjectionCheckpointsTable,
@@ -32197,6 +32349,16 @@ CREATE TABLE IF NOT EXISTS message_mentions (
32197
32349
  PRIMARY KEY (message_id, actor_id)
32198
32350
  );
32199
32351
 
32352
+ CREATE TABLE IF NOT EXISTS message_reactions (
32353
+ message_id TEXT NOT NULL REFERENCES messages(id) ON DELETE CASCADE,
32354
+ actor_id TEXT NOT NULL REFERENCES actors(id) ON DELETE RESTRICT,
32355
+ emoji TEXT NOT NULL,
32356
+ created_at INTEGER NOT NULL,
32357
+ PRIMARY KEY (message_id, actor_id, emoji)
32358
+ );
32359
+ CREATE INDEX IF NOT EXISTS idx_message_reactions_message
32360
+ ON message_reactions (message_id);
32361
+
32200
32362
  CREATE TABLE IF NOT EXISTS message_attachments (
32201
32363
  id TEXT PRIMARY KEY,
32202
32364
  message_id TEXT NOT NULL REFERENCES messages(id) ON DELETE CASCADE,
@@ -33599,7 +33761,7 @@ var init_broker = __esm(() => {
33599
33761
  });
33600
33762
 
33601
33763
  // ../runtime/src/conversation-thread-artifact.ts
33602
- import { createHash as createHash3, randomBytes as randomBytes2 } from "crypto";
33764
+ import { createHash as createHash4, randomBytes as randomBytes2 } from "crypto";
33603
33765
  import {
33604
33766
  existsSync as existsSync25,
33605
33767
  mkdirSync as mkdirSync7,
@@ -33719,7 +33881,7 @@ function artifactBytes(artifact) {
33719
33881
  return Buffer.byteLength(encodedArtifact(artifact), "utf8");
33720
33882
  }
33721
33883
  function contentCursorForArtifact(artifact) {
33722
- return createHash3("sha256").update(JSON.stringify({
33884
+ return createHash4("sha256").update(JSON.stringify({
33723
33885
  feedId: artifact.feedId,
33724
33886
  entityKind: artifact.entityKind,
33725
33887
  conversationId: artifact.conversationId,
@@ -33729,7 +33891,7 @@ function contentCursorForArtifact(artifact) {
33729
33891
  })).digest("hex");
33730
33892
  }
33731
33893
  function nativeReadThreadArtifactPath(outputDirectory, feedId) {
33732
- const digest = createHash3("sha256").update(feedId).digest("hex");
33894
+ const digest = createHash4("sha256").update(feedId).digest("hex");
33733
33895
  return join28(outputDirectory, `${ARTIFACT_PREFIX}${digest}${ARTIFACT_SUFFIX}`);
33734
33896
  }
33735
33897
  function buildNativeReadThreadArtifact(snapshot) {
@@ -34752,9 +34914,9 @@ var init_budget_observations = __esm(() => {
34752
34914
  });
34753
34915
 
34754
34916
  // ../runtime/src/budget-observations.ts
34755
- import { createHash as createHash4 } from "crypto";
34917
+ import { createHash as createHash5 } from "crypto";
34756
34918
  function stableHash(value) {
34757
- return createHash4("sha256").update(JSON.stringify(value)).digest("hex").slice(0, 24);
34919
+ return createHash5("sha256").update(JSON.stringify(value)).digest("hex").slice(0, 24);
34758
34920
  }
34759
34921
  function metadataRecord4(value) {
34760
34922
  return value && typeof value === "object" && !Array.isArray(value) ? value : undefined;
@@ -34880,7 +35042,7 @@ var init_budget_observations2 = __esm(() => {
34880
35042
  });
34881
35043
 
34882
35044
  // ../runtime/src/runtime-session-handle.ts
34883
- import { createHash as createHash5 } from "crypto";
35045
+ import { createHash as createHash6 } from "crypto";
34884
35046
  function metadataStringValue(metadata, key) {
34885
35047
  const value = metadata?.[key];
34886
35048
  return typeof value === "string" && value.trim() ? value.trim() : null;
@@ -34903,7 +35065,7 @@ function runtimeSessionHandleForEndpoint(endpoint, primaryAlias = runtimeSession
34903
35065
  endpoint.harness,
34904
35066
  primaryAlias
34905
35067
  ].join("\x00");
34906
- const token = createHash5("sha256").update(resolutionKey).digest("hex").slice(0, 20);
35068
+ const token = createHash6("sha256").update(resolutionKey).digest("hex").slice(0, 20);
34907
35069
  return `${SCOUT_SESSION_HANDLE_PREFIX}${token}`;
34908
35070
  }
34909
35071
  var init_runtime_session_handle = __esm(() => {
@@ -34911,7 +35073,7 @@ var init_runtime_session_handle = __esm(() => {
34911
35073
  });
34912
35074
 
34913
35075
  // ../runtime/src/sqlite-store.ts
34914
- import { createHash as createHash6 } from "crypto";
35076
+ import { createHash as createHash7 } from "crypto";
34915
35077
  import { mkdirSync as mkdirSync8 } from "fs";
34916
35078
  import { dirname as dirname18 } from "path";
34917
35079
  function parseJson(value, fallback) {
@@ -34943,7 +35105,7 @@ function normalizeTimestampMs(value) {
34943
35105
  return epochMs(value);
34944
35106
  }
34945
35107
  function stableHash2(value, length = 20) {
34946
- return createHash6("sha256").update(value).digest("hex").slice(0, length);
35108
+ return createHash7("sha256").update(value).digest("hex").slice(0, length);
34947
35109
  }
34948
35110
  function metadataStringValue2(metadata, key) {
34949
35111
  const value = metadata?.[key];
@@ -36535,6 +36697,62 @@ class SQLiteControlPlaneStore {
36535
36697
  })(message, activityItem, threadMessageEvent);
36536
36698
  return threadEvents;
36537
36699
  }
36700
+ upsertMessageReaction(input) {
36701
+ const message = this.db.query(`SELECT id, conversation_id FROM messages WHERE id = ?1`).get(input.messageId);
36702
+ if (!message) {
36703
+ throw Object.assign(new Error("message not found"), { status: 404, reason: "message_not_found" });
36704
+ }
36705
+ if (message.conversation_id !== input.channelId) {
36706
+ const conversation = this.db.query(`SELECT kind, parent_conversation_id FROM conversations WHERE id = ?1`).get(message.conversation_id);
36707
+ if (conversation?.kind !== "thread" || conversation.parent_conversation_id !== input.channelId) {
36708
+ throw Object.assign(new Error("message is not in this channel"), {
36709
+ status: 404,
36710
+ reason: "wrong_channel"
36711
+ });
36712
+ }
36713
+ }
36714
+ const actor = this.db.query(`SELECT id FROM actors WHERE id = ?1`).get(input.actorId);
36715
+ if (!actor) {
36716
+ throw Object.assign(new Error("actor not found"), { status: 404, reason: "actor_not_found" });
36717
+ }
36718
+ const result = this.db.query(`INSERT OR IGNORE INTO message_reactions (message_id, actor_id, emoji, created_at)
36719
+ VALUES (?1, ?2, ?3, ?4)`).run(input.messageId, input.actorId, input.emoji, input.createdAt);
36720
+ return { replayed: Number(result.changes) === 0 };
36721
+ }
36722
+ removeMessageReaction(input) {
36723
+ const message = this.db.query(`SELECT id, conversation_id FROM messages WHERE id = ?1`).get(input.messageId);
36724
+ if (!message) {
36725
+ throw Object.assign(new Error("message not found"), { status: 404, reason: "message_not_found" });
36726
+ }
36727
+ if (message.conversation_id !== input.channelId) {
36728
+ const conversation = this.db.query(`SELECT kind, parent_conversation_id FROM conversations WHERE id = ?1`).get(message.conversation_id);
36729
+ if (conversation?.kind !== "thread" || conversation.parent_conversation_id !== input.channelId) {
36730
+ throw Object.assign(new Error("message is not in this channel"), {
36731
+ status: 404,
36732
+ reason: "wrong_channel"
36733
+ });
36734
+ }
36735
+ }
36736
+ const result = this.db.query(`DELETE FROM message_reactions
36737
+ WHERE message_id = ?1 AND actor_id = ?2 AND emoji = ?3`).run(input.messageId, input.actorId, input.emoji);
36738
+ return { replayed: Number(result.changes) === 0 };
36739
+ }
36740
+ listMessageReactions(channelId) {
36741
+ const rows = queryAll(this.readDb, `SELECT r.message_id, r.actor_id, r.emoji, r.created_at
36742
+ FROM message_reactions r
36743
+ JOIN messages m ON m.id = r.message_id
36744
+ WHERE m.conversation_id = ?1
36745
+ OR m.conversation_id IN (
36746
+ SELECT id FROM conversations WHERE parent_conversation_id = ?1
36747
+ )
36748
+ ORDER BY r.created_at ASC, r.emoji ASC`, channelId);
36749
+ return rows.map((row) => ({
36750
+ messageId: row.message_id,
36751
+ actorId: row.actor_id,
36752
+ emoji: row.emoji,
36753
+ createdAt: row.created_at
36754
+ }));
36755
+ }
36538
36756
  upsertReadCursor(cursor) {
36539
36757
  this.db.query(`INSERT INTO conversation_read_cursors (
36540
36758
  conversation_id, actor_id, reader_node_id, last_read_message_id,
@@ -37667,7 +37885,7 @@ var init_sqlite_store = __esm(() => {
37667
37885
  });
37668
37886
 
37669
37887
  // ../runtime/src/mesh-peer-auth.ts
37670
- import { createHash as createHash7, randomBytes as randomBytes3 } from "crypto";
37888
+ import { createHash as createHash8, randomBytes as randomBytes3 } from "crypto";
37671
37889
  function assertNoNewlines(component, name) {
37672
37890
  if (component.includes(`
37673
37891
  `) || component.includes("\r")) {
@@ -37693,7 +37911,7 @@ function peerRequestSigningPayload(input) {
37693
37911
  `);
37694
37912
  }
37695
37913
  function sha256Hex(body) {
37696
- return createHash7("sha256").update(body).digest("hex");
37914
+ return createHash8("sha256").update(body).digest("hex");
37697
37915
  }
37698
37916
  function signPeerRequest(identity, input) {
37699
37917
  const ts = input.ts ?? Date.now();
@@ -52749,14 +52967,14 @@ var init_x509_es = __esm(() => {
52749
52967
 
52750
52968
  // ../runtime/src/node-tls-identity.ts
52751
52969
  import {
52752
- createHash as createHash8,
52970
+ createHash as createHash9,
52753
52971
  createPrivateKey as createPrivateKey2,
52754
52972
  createPublicKey as createPublicKey2,
52755
52973
  generateKeyPairSync as generateKeyPairSync2,
52756
52974
  randomBytes as randomBytes4
52757
52975
  } from "crypto";
52758
52976
  function tlsSpkiFingerprintFromDer(spkiDer) {
52759
- return createHash8("sha256").update(spkiDer).digest("hex");
52977
+ return createHash9("sha256").update(spkiDer).digest("hex");
52760
52978
  }
52761
52979
  function tlsSpkiFingerprintFromCertificateDer(certificateDer) {
52762
52980
  const certificate2 = new X509Certificate(asBufferSource(certificateDer));
@@ -54719,9 +54937,9 @@ var init_eff_short_wordlist = __esm(() => {
54719
54937
  });
54720
54938
 
54721
54939
  // ../runtime/src/mesh-sas.ts
54722
- import { createHash as createHash9, createHmac } from "crypto";
54940
+ import { createHash as createHash10, createHmac } from "crypto";
54723
54941
  function createEnrollmentCommitment(nonce, cardSignature) {
54724
- return createHash9("sha256").update(Buffer.concat([nonce, Buffer.from(cardSignature, "utf8")])).digest("base64");
54942
+ return createHash10("sha256").update(Buffer.concat([nonce, Buffer.from(cardSignature, "utf8")])).digest("base64");
54725
54943
  }
54726
54944
  function verifyEnrollmentCommitment(commitment, nonce, cardSignature) {
54727
54945
  const expected = createEnrollmentCommitment(nonce, cardSignature);
@@ -56223,6 +56441,9 @@ function hasNonEmpty(value) {
56223
56441
  function envEquals(env, key, expected) {
56224
56442
  return env[key]?.trim().toLowerCase() === expected;
56225
56443
  }
56444
+ function isHerdrManagedAgent(env, kind) {
56445
+ return isTruthyFlag(env.HERDR_ENV) && hasNonEmpty(env.HERDR_PANE_ID) && hasNonEmpty(env.HERDR_AGENT_NAME) && envEquals(env, "HERDR_AGENT", kind);
56446
+ }
56226
56447
  function detectCodingAgentHost(env = process.env) {
56227
56448
  for (const entry of HARNESS_SIGNALS) {
56228
56449
  if (entry.matches(env)) {
@@ -56248,6 +56469,36 @@ var init_coding_agent_host = __esm(() => {
56248
56469
  signal: "OPENSCOUT_MANAGED_AGENT",
56249
56470
  matches: (env) => isTruthyFlag(env.OPENSCOUT_MANAGED_AGENT)
56250
56471
  },
56472
+ {
56473
+ harness: "cursor",
56474
+ signal: "HERDR_AGENT_NAME",
56475
+ matches: (env) => isHerdrManagedAgent(env, "cursor")
56476
+ },
56477
+ {
56478
+ harness: "claude",
56479
+ signal: "HERDR_AGENT_NAME",
56480
+ matches: (env) => isHerdrManagedAgent(env, "claude")
56481
+ },
56482
+ {
56483
+ harness: "codex",
56484
+ signal: "HERDR_AGENT_NAME",
56485
+ matches: (env) => isHerdrManagedAgent(env, "codex")
56486
+ },
56487
+ {
56488
+ harness: "devin",
56489
+ signal: "HERDR_AGENT_NAME",
56490
+ matches: (env) => isHerdrManagedAgent(env, "devin")
56491
+ },
56492
+ {
56493
+ harness: "kimi",
56494
+ signal: "HERDR_AGENT_NAME",
56495
+ matches: (env) => isHerdrManagedAgent(env, "kimi")
56496
+ },
56497
+ {
56498
+ harness: "pi",
56499
+ signal: "HERDR_AGENT_NAME",
56500
+ matches: (env) => isHerdrManagedAgent(env, "pi")
56501
+ },
56251
56502
  {
56252
56503
  harness: "cursor",
56253
56504
  signal: "CURSOR_AGENT",
@@ -57584,7 +57835,7 @@ async function broadcastPushRelayAlert(alert) {
57584
57835
  retryAfterSeconds: retryAfter ? Number.parseInt(retryAfter, 10) || null : null,
57585
57836
  rateLimitWindow: window2,
57586
57837
  failures: [{
57587
- deviceId: "push-relay",
57838
+ deviceId: PUSH_RELAY_TRANSPORT_DEVICE_ID,
57588
57839
  tokenSuffix: "relay",
57589
57840
  status: 429,
57590
57841
  reason: detail || `HTTP 429 (window=${window2 ?? "unknown"})`
@@ -57600,7 +57851,7 @@ async function broadcastPushRelayAlert(alert) {
57600
57851
  failedCount: 1,
57601
57852
  configMissing: false,
57602
57853
  failures: [{
57603
- deviceId: "push-relay",
57854
+ deviceId: PUSH_RELAY_TRANSPORT_DEVICE_ID,
57604
57855
  tokenSuffix: "relay",
57605
57856
  status: response.status,
57606
57857
  reason: detail || `HTTP ${response.status}`
@@ -57900,15 +58151,30 @@ async function sendApnsAlertToRegistration(registration, alert) {
57900
58151
  request.end(payload);
57901
58152
  });
57902
58153
  }
58154
+ function relayRejectedOurCredential(result) {
58155
+ return result.failures.some((failure) => failure.deviceId === PUSH_RELAY_TRANSPORT_DEVICE_ID && (failure.status === 401 || failure.status === 403));
58156
+ }
58157
+ function hasDirectApnsCredentials() {
58158
+ try {
58159
+ return loadApnsCredentials() !== null;
58160
+ } catch {
58161
+ return false;
58162
+ }
58163
+ }
57903
58164
  async function broadcastApnsAlertToActiveMobileDevices(alert) {
58165
+ let relayFailures = [];
57904
58166
  if (resolvePushRelayConfig()) {
57905
- return broadcastPushRelayAlert(alert);
58167
+ const relayResult = await broadcastPushRelayAlert(alert);
58168
+ if (!relayRejectedOurCredential(relayResult) || !hasDirectApnsCredentials()) {
58169
+ return relayResult;
58170
+ }
58171
+ relayFailures = relayResult.failures;
57906
58172
  }
57907
58173
  const registrations = listActiveMobilePushRegistrations();
57908
58174
  let deliveredCount = 0;
57909
58175
  let skippedCount = 0;
57910
58176
  let configMissing = false;
57911
- const failures = [];
58177
+ const failures = [...relayFailures];
57912
58178
  for (const registration of registrations) {
57913
58179
  try {
57914
58180
  const outcome = await sendApnsAlertToRegistration(registration, alert);
@@ -57969,7 +58235,7 @@ CREATE UNIQUE INDEX IF NOT EXISTS idx_mobile_push_registrations_push_token
57969
58235
  ON mobile_push_registrations (push_token);
57970
58236
  CREATE INDEX IF NOT EXISTS idx_mobile_push_registrations_device_updated_at
57971
58237
  ON mobile_push_registrations (device_id, updated_at DESC);
57972
- `, dbHandle = null, dbPath = null, cachedApnsJwt = null, OPAQUE_MOBILE_PUSH_PAYLOAD_KEYS;
58238
+ `, dbHandle = null, dbPath = null, cachedApnsJwt = null, PUSH_RELAY_TRANSPORT_DEVICE_ID = "push-relay", OPAQUE_MOBILE_PUSH_PAYLOAD_KEYS;
57973
58239
  var init_mobile_push = __esm(() => {
57974
58240
  init_support_paths();
57975
58241
  OPAQUE_MOBILE_PUSH_PAYLOAD_KEYS = [
@@ -58652,11 +58918,11 @@ var init_paths2 = __esm(() => {
58652
58918
 
58653
58919
  // ../runtime/src/knowledge/store.ts
58654
58920
  import { existsSync as existsSync30, mkdirSync as mkdirSync11, statSync as statSync7 } from "fs";
58655
- import { createHash as createHash10, randomUUID as randomUUID4 } from "crypto";
58921
+ import { createHash as createHash11, randomUUID as randomUUID4 } from "crypto";
58656
58922
  import { dirname as dirname22 } from "path";
58657
58923
  import { Database as Database3 } from "bun:sqlite";
58658
58924
  function ftsRowidForChunk(chunkId) {
58659
- return createHash10("sha256").update(chunkId).digest().readBigInt64BE(0);
58925
+ return createHash11("sha256").update(chunkId).digest().readBigInt64BE(0);
58660
58926
  }
58661
58927
  function stringify3(value) {
58662
58928
  return JSON.stringify(value ?? null);
@@ -58695,7 +58961,7 @@ function normalizeFtsQueryOr(value) {
58695
58961
  return terms.map(quoteFtsTerm).join(" OR ");
58696
58962
  }
58697
58963
  function textHash(value) {
58698
- return `sha256:${createHash10("sha256").update(value).digest("hex")}`;
58964
+ return `sha256:${createHash11("sha256").update(value).digest("hex")}`;
58699
58965
  }
58700
58966
  function deterministicKnowledgeChunkId(input) {
58701
58967
  return textHash([
@@ -59450,7 +59716,7 @@ var init_store = __esm(() => {
59450
59716
  });
59451
59717
 
59452
59718
  // ../runtime/src/knowledge/session-indexer.ts
59453
- import { createHash as createHash11 } from "crypto";
59719
+ import { createHash as createHash12 } from "crypto";
59454
59720
  import {
59455
59721
  createReadStream as createReadStream2,
59456
59722
  existsSync as existsSync31,
@@ -59564,7 +59830,7 @@ function discoverRecentSessionFiles(cutoffMs, limit, harnessFilter) {
59564
59830
  async function parseJsonl(file) {
59565
59831
  const maybeYield = createYieldBudget();
59566
59832
  const records = [];
59567
- const hash = createHash11("sha256");
59833
+ const hash = createHash12("sha256");
59568
59834
  let carry = "";
59569
59835
  let offset = 0;
59570
59836
  let index2 = 0;
@@ -59895,10 +60161,10 @@ function trimOneLine(value, max) {
59895
60161
  return flat.length <= max ? flat : `${flat.slice(0, Math.max(0, max - 3))}...`;
59896
60162
  }
59897
60163
  function hashText(value) {
59898
- return `sha256:${createHash11("sha256").update(value).digest("hex")}`;
60164
+ return `sha256:${createHash12("sha256").update(value).digest("hex")}`;
59899
60165
  }
59900
60166
  function stableId(value, length = 16) {
59901
- return createHash11("sha256").update(value).digest("hex").slice(0, length);
60167
+ return createHash12("sha256").update(value).digest("hex").slice(0, length);
59902
60168
  }
59903
60169
  function portablePath(filePath) {
59904
60170
  const home = homedir24();
@@ -60664,6 +60930,16 @@ function resolveScoutAgentName(agentName) {
60664
60930
  }
60665
60931
  return resolveOperatorName();
60666
60932
  }
60933
+ function resolveHerdrAgentName(env) {
60934
+ const herdrEnv = env.HERDR_ENV?.trim().toLowerCase();
60935
+ if (!herdrEnv || !TRUTHY_ENV_VALUES.has(herdrEnv)) {
60936
+ return null;
60937
+ }
60938
+ if (!env.HERDR_PANE_ID?.trim()) {
60939
+ return null;
60940
+ }
60941
+ return normalizeAgentSelectorSegment(env.HERDR_AGENT_NAME ?? "") || null;
60942
+ }
60667
60943
  function resolveHumanAskSenderName(agentName, env = process.env) {
60668
60944
  if (agentName?.trim()) {
60669
60945
  return agentName.trim();
@@ -60673,7 +60949,7 @@ function resolveHumanAskSenderName(agentName, env = process.env) {
60673
60949
  }
60674
60950
  return "operator";
60675
60951
  }
60676
- function resolveConfiguredSenderIdForProjectRoot(overrides, projectRoot, preferredDefinitionIds = []) {
60952
+ function resolveConfiguredSenderIdForProjectRoot(overrides, projectRoot, preferredDefinitionIds = [], allowProjectFallback = true) {
60677
60953
  let fallbackSenderId = null;
60678
60954
  const normalizedPreferredDefinitionIds = preferredDefinitionIds.map((value) => normalizeAgentSelectorSegment(value)).filter(Boolean);
60679
60955
  for (const preferredDefinitionId of normalizedPreferredDefinitionIds) {
@@ -60689,6 +60965,9 @@ function resolveConfiguredSenderIdForProjectRoot(overrides, projectRoot, preferr
60689
60965
  }
60690
60966
  }
60691
60967
  }
60968
+ if (!allowProjectFallback) {
60969
+ return null;
60970
+ }
60692
60971
  for (const [agentId, override] of Object.entries(overrides)) {
60693
60972
  if (BUILT_IN_AGENT_DEFINITION_IDS.has(agentId)) {
60694
60973
  continue;
@@ -60700,10 +60979,16 @@ function resolveConfiguredSenderIdForProjectRoot(overrides, projectRoot, preferr
60700
60979
  }
60701
60980
  return fallbackSenderId;
60702
60981
  }
60703
- async function inferSenderIdForProjectRoot(projectRoot) {
60982
+ async function inferSenderIdForProjectRoot(projectRoot, preferredDefinitionIds = []) {
60704
60983
  const overrides = await readRelayAgentOverrides();
60705
60984
  const projectConfig = await readProjectConfig(projectRoot);
60706
60985
  const configuredDefinitionId = normalizeAgentSelectorSegment(projectConfig?.agent?.id?.trim() ?? "");
60986
+ const normalizedPreferredDefinitionIds = preferredDefinitionIds.map((value) => normalizeAgentSelectorSegment(value)).filter(Boolean);
60987
+ const preferredDefinitionId = normalizedPreferredDefinitionIds[0];
60988
+ if (preferredDefinitionId) {
60989
+ const preferredSenderId = resolveConfiguredSenderIdForProjectRoot(overrides, projectRoot, [preferredDefinitionId], false);
60990
+ return preferredSenderId ?? buildRelayAgentInstance(preferredDefinitionId, projectRoot).id;
60991
+ }
60707
60992
  const projectDefaultDefinitionIds2 = [
60708
60993
  configuredDefinitionId,
60709
60994
  projectConfig?.project?.id,
@@ -60723,11 +61008,12 @@ async function resolveScoutSenderId(agentName, currentDirectory, env = process.e
60723
61008
  if (env.OPENSCOUT_AGENT?.trim()) {
60724
61009
  return env.OPENSCOUT_AGENT.trim();
60725
61010
  }
61011
+ const herdrAgentName = resolveHerdrAgentName(env);
60726
61012
  const projectRoot = await findNearestProjectRoot(currentDirectory);
60727
61013
  if (!projectRoot) {
60728
- return resolveOperatorName();
61014
+ return herdrAgentName ? buildRelayAgentInstance(herdrAgentName, currentDirectory).id : resolveOperatorName();
60729
61015
  }
60730
- return inferSenderIdForProjectRoot(projectRoot);
61016
+ return inferSenderIdForProjectRoot(projectRoot, herdrAgentName ? [herdrAgentName] : []);
60731
61017
  }
60732
61018
  async function resolveScoutMatchParticipantId(sessionIdOverride, env = process.env) {
60733
61019
  const sessionId = sessionIdOverride?.trim() || env.OPENSCOUT_SESSION_ID?.trim() || env.CODEX_THREAD_ID?.trim() || env.OPENSCOUT_CODEX_THREAD_ID?.trim() || env.CLAUDE_CODE_SESSION_ID?.trim() || env.CLAUDE_SESSION_ID?.trim() || env.CLAUDE_CODE_REMOTE_SESSION_ID?.trim();
@@ -60741,18 +61027,20 @@ async function resolveScoutMatchParticipantId(sessionIdOverride, env = process.e
60741
61027
  }
60742
61028
  return parsed.value;
60743
61029
  }
61030
+ var TRUTHY_ENV_VALUES;
60744
61031
  var init_sender = __esm(() => {
60745
61032
  init_src();
60746
61033
  init_setup();
60747
61034
  init_src2();
60748
61035
  init_user_config();
61036
+ TRUTHY_ENV_VALUES = new Set(["1", "true", "yes", "on"]);
60749
61037
  });
60750
61038
 
60751
61039
  // ../../apps/desktop/src/core/broker/service.ts
60752
61040
  import { setTimeout as delay2 } from "timers/promises";
60753
61041
  import { mkdir as mkdir11, readFile as readFile14, unlink, writeFile as writeFile10 } from "fs/promises";
60754
61042
  import { basename as basename13, join as join37, resolve as resolve17 } from "path";
60755
- import { createHash as createHash12, randomUUID as randomUUID5 } from "crypto";
61043
+ import { createHash as createHash13, randomUUID as randomUUID5 } from "crypto";
60756
61044
  function relayHubDirectory() {
60757
61045
  return resolveOpenScoutSupportPaths().relayHubDirectory;
60758
61046
  }
@@ -60844,7 +61132,7 @@ function deliveryRequestId(clientMessageId, createdAt) {
60844
61132
  if (!normalized) {
60845
61133
  return `deliver-${createdAt.toString(36)}-${Math.random().toString(36).slice(2, 8)}`;
60846
61134
  }
60847
- const digest = createHash12("sha256").update(normalized).digest("hex").slice(0, 32);
61135
+ const digest = createHash13("sha256").update(normalized).digest("hex").slice(0, 32);
60848
61136
  return `deliver-client-${digest}`;
60849
61137
  }
60850
61138
  function metadataStringList(metadata, key) {
@@ -65179,15 +65467,20 @@ function findRepoDistDirectory(startDirectory) {
65179
65467
  current = parent;
65180
65468
  }
65181
65469
  }
65470
+ function isRepoBuildOutput(bundlePath) {
65471
+ const distDir = dirname24(bundlePath);
65472
+ return basename15(distDir) === "dist" && basename15(dirname24(distDir)) === "macos";
65473
+ }
65182
65474
  function selectInstalledAppBundle(indexedPaths, home, pathExists3 = existsSync33) {
65183
- for (const candidate of [
65184
- join39("/Applications", INSTALLED_APP_BUNDLE_NAME),
65185
- join39(home, "Applications", INSTALLED_APP_BUNDLE_NAME)
65186
- ]) {
65187
- if (pathExists3(candidate))
65188
- return candidate;
65475
+ const names2 = [INSTALLED_APP_BUNDLE_NAME, ...LEGACY_INSTALLED_APP_BUNDLE_NAMES];
65476
+ for (const name2 of names2) {
65477
+ for (const root of ["/Applications", join39(home, "Applications")]) {
65478
+ const candidate = join39(root, name2);
65479
+ if (pathExists3(candidate))
65480
+ return candidate;
65481
+ }
65189
65482
  }
65190
- return indexedPaths.map((line) => line.trim()).filter((candidate) => basename15(candidate) === INSTALLED_APP_BUNDLE_NAME).find(pathExists3) ?? null;
65483
+ return indexedPaths.map((line) => line.trim()).filter((candidate) => names2.includes(basename15(candidate))).filter((candidate) => !isRepoBuildOutput(candidate)).find(pathExists3) ?? null;
65191
65484
  }
65192
65485
  function findInstalledAppBundle(env) {
65193
65486
  const spotlight = spawnSync5("mdfind", [`kMDItemCFBundleIdentifier == '${INSTALLED_APP_BUNDLE_ID}'`], {
@@ -65204,7 +65497,7 @@ function resolveBundlePaths(context) {
65204
65497
  const installed = findInstalledAppBundle(context.env);
65205
65498
  if (installed)
65206
65499
  return resolveAppBundlePaths(installed);
65207
- throw new ScoutCliError("No OpenScout app bundle found. Build one with `bun run scout:build` from a checkout, or install with `scout install`.");
65500
+ throw new ScoutCliError("No Scout app bundle found. Build one with `bun run scout:build` from a checkout, or install with `scout install`.");
65208
65501
  }
65209
65502
  function readTree(paths2) {
65210
65503
  return classifyProcesses(readProcessTable(), paths2);
@@ -65408,12 +65701,13 @@ async function runAppCommand(context, args) {
65408
65701
  throw new ScoutCliError(result.message);
65409
65702
  }
65410
65703
  }
65411
- var HELP_FLAGS3, INSTALLED_APP_BUNDLE_ID = "app.openscout.scout", INSTALLED_APP_BUNDLE_NAME = "OpenScout.app", READY_TIMEOUT_MS = 30000, SUPERVISED_READY_TIMEOUT_MS = 120000, SUPERVISED_DRAIN_TIMEOUT_MS = 20000, POLL_MS = 250;
65704
+ var HELP_FLAGS3, INSTALLED_APP_BUNDLE_ID = "app.openscout.scout", INSTALLED_APP_BUNDLE_NAME = "Scout.app", LEGACY_INSTALLED_APP_BUNDLE_NAMES, READY_TIMEOUT_MS = 30000, SUPERVISED_READY_TIMEOUT_MS = 120000, SUPERVISED_DRAIN_TIMEOUT_MS = 20000, POLL_MS = 250;
65412
65705
  var init_app = __esm(() => {
65413
65706
  init_app_lifecycle();
65414
65707
  init_context();
65415
65708
  init_errors();
65416
65709
  HELP_FLAGS3 = new Set(["help", "--help", "-h"]);
65710
+ LEGACY_INSTALLED_APP_BUNDLE_NAMES = ["OpenScout.app"];
65417
65711
  });
65418
65712
 
65419
65713
  // ../../apps/desktop/src/cli/commands/status.ts
@@ -67217,15 +67511,18 @@ function renderSendCommandHelp() {
67217
67511
  " --body-file <path> -> alias for --message-file",
67218
67512
  "",
67219
67513
  "Examples:",
67220
- ' scout send --to hudson "ready for review; literal @codex stays text"',
67514
+ ' scout send --to hudson "review completed; literal @codex stays text"',
67221
67515
  ' scout send --to target:mw-talkie "status update for that worker"',
67222
- ' scout send --ref 7f3a9c21 "follow-up for that bound session"',
67223
- ' scout send --to lattices#codex?5.5 "ready for review"',
67224
- ' scout send --to hudson --wake "please apply the chrome feedback; no reply needed"',
67516
+ ' scout send --ref 7f3a9c21 "FYI: the build passed; no action needed"',
67517
+ ' scout send --to lattices#codex?5.5 "review completed; findings recorded in the PR"',
67518
+ ' scout send --to hudson --wake "FYI: the chrome feedback is already applied"',
67225
67519
  " scout send --channel triage --message-file ./status.md",
67226
67520
  ' scout send --as premotion.master.mini --to hudson "editor branch is green"',
67227
- ' scout send --channel triage "need two reviewers"',
67228
- ' scout send "@hudson ready for review" # legacy body-mention shorthand'
67521
+ ' scout send --channel triage "both reviews are complete"',
67522
+ ' scout send "@hudson build passed" # legacy body-mention shorthand',
67523
+ "",
67524
+ "For work instead:",
67525
+ ' scout ask --to hudson --notify "apply the chrome feedback and report back"'
67229
67526
  ].join(`
67230
67527
  `);
67231
67528
  }
@@ -67764,7 +68061,7 @@ __export(exports_chat, {
67764
68061
  chatRequest: () => chatRequest,
67765
68062
  chatPath: () => chatPath
67766
68063
  });
67767
- import { createHash as createHash13, randomUUID as randomUUID7 } from "crypto";
68064
+ import { createHash as createHash14, randomUUID as randomUUID7 } from "crypto";
67768
68065
  import { mkdir as mkdir12, readFile as readFile16, writeFile as writeFile11, rename, chmod as chmod2, rm as rm5 } from "fs/promises";
67769
68066
  import { homedir as homedir27 } from "os";
67770
68067
  import { join as join41 } from "path";
@@ -67820,6 +68117,8 @@ function renderChatHelp(commandName = "scout chat") {
67820
68117
  ${commandName} read [--channel <id>]
67821
68118
  ${commandName} say "Hello" [--request-id <id>]
67822
68119
  ${commandName} reply <message-id> "My reply" [--request-id <id>]
68120
+ ${commandName} react <message-id> <emoji> [--request-id <id>]
68121
+ ${commandName} unreact <message-id> <emoji> [--request-id <id>]
67823
68122
  ${commandName} watch [--for 10m] [--once] [--compact] [--reset-cursor] [--channel <id>]
67824
68123
  ${commandName} status
67825
68124
 
@@ -67836,7 +68135,9 @@ with reply; ignore your own messages. Run watch again to resume from its saved
67836
68135
  cursor. If history has expired, read the room, then explicitly use watch
67837
68136
  --reset-cursor to replay retained history. Deduplicate by message id.
67838
68137
  Listening does not itself generate replies.
67839
- Use the same --request-id to retry a send whose outcome was uncertain.`;
68138
+ Use the same --request-id to retry a send whose outcome was uncertain.
68139
+ React and unreact acknowledge a message without posting a turn. They never
68140
+ wake an agent or create a flight.`;
67840
68141
  }
67841
68142
  async function runChatCommand(context, args, commandName = "scout chat") {
67842
68143
  if (!args.length || args.includes("--help") || args.includes("-h")) {
@@ -67860,7 +68161,7 @@ async function runChatCommand(context, args, commandName = "scout chat") {
67860
68161
  positional.push(arg);
67861
68162
  }
67862
68163
  const [command, ...values] = positional;
67863
- const scope2 = createHash13("sha256").update(`${context.cwd}
68164
+ const scope2 = createHash14("sha256").update(`${context.cwd}
67864
68165
  ${currentChatSession(context.env) ?? "shell"}`).digest("hex");
67865
68166
  const directory = join41(context.env.OPENSCOUT_CHAT_HOME ?? join41(homedir27(), ".openscout", "chat"), scope2);
67866
68167
  await mkdir12(directory, { recursive: true, mode: 448 });
@@ -67883,7 +68184,7 @@ ${currentChatSession(context.env) ?? "shell"}`).digest("hex");
67883
68184
  if (values.length !== 1)
67884
68185
  throw new Error(`Usage: ${commandName} join <invite-url>`);
67885
68186
  const invite = parseChatInvite(values[0]);
67886
- const attempt = createHash13("sha256").update(`${invite.origin}/${invite.token}`).digest("hex");
68187
+ const attempt = createHash14("sha256").update(`${invite.origin}/${invite.token}`).digest("hex");
67887
68188
  state.attempts[attempt] ??= randomUUID7();
67888
68189
  await save();
67889
68190
  const { data, cookie } = await chatRequest(invite.origin, `/api/invites/${invite.token}/participate`, {
@@ -67916,6 +68217,24 @@ Watch returns message records with IDs. Reply with ${commandName} reply <message
67916
68217
  context.output.writeValue(data, (d) => JSON.stringify(d, null, 2));
67917
68218
  return;
67918
68219
  }
68220
+ if (command === "react" || command === "unreact") {
68221
+ const messageId = values[0]?.trim();
68222
+ const emoji = values[1]?.trim();
68223
+ if (!messageId || !emoji)
68224
+ throw new Error(`Usage: ${commandName} ${command} <message-id> <emoji>`);
68225
+ const requestId = flags["request-id"] ?? randomUUID7();
68226
+ const resource = command === "unreact" ? "reactions/remove" : "reactions";
68227
+ try {
68228
+ const { data } = await chatRequest(room.origin, chatPath(room, resource), {
68229
+ token: room.token,
68230
+ body: { requestId, messageId, emoji }
68231
+ });
68232
+ context.output.writeValue({ ...data, requestId, messageId, emoji }, () => `${command === "unreact" ? "Removed" : "Reacted"} ${emoji} on ${messageId}.`);
68233
+ } catch (error) {
68234
+ throw new Error(`${error.message} Retry with --request-id ${requestId} to avoid duplicates.`);
68235
+ }
68236
+ return;
68237
+ }
67919
68238
  if (command === "say" || command === "reply") {
67920
68239
  const replyToMessageId = command === "reply" ? values.shift() : undefined;
67921
68240
  const body = values.join(" ").trim();
@@ -67938,7 +68257,7 @@ After watch returns, answer relevant messages with ${commandName} reply <message
67938
68257
  const milliseconds = match ? Number(match[1]) * (match[2] === "m" ? 60000 : 1000) : 0;
67939
68258
  if (milliseconds < 1000 || milliseconds > 3600000)
67940
68259
  throw new Error("Watch duration must be between 1s and 60m.");
67941
- const cursorFile = join41(directory, `cursor-${createHash13("sha256").update(`${room.origin}/${room.channelId}`).digest("hex")}.json`);
68260
+ const cursorFile = join41(directory, `cursor-${createHash14("sha256").update(`${room.origin}/${room.channelId}`).digest("hex")}.json`);
67942
68261
  if (flags["reset-cursor"]) {
67943
68262
  await rm5(cursorFile, { force: true });
67944
68263
  room.cursor = null;
@@ -96082,7 +96401,7 @@ var init_stdio2 = __esm(() => {
96082
96401
  // ../../apps/desktop/src/shared/product.ts
96083
96402
  var SCOUT_APP_VERSION;
96084
96403
  var init_product = __esm(() => {
96085
- SCOUT_APP_VERSION = process.env.SCOUT_APP_VERSION?.trim() || "0.2.105";
96404
+ SCOUT_APP_VERSION = process.env.SCOUT_APP_VERSION?.trim() || "0.2.106";
96086
96405
  });
96087
96406
 
96088
96407
  // ../../apps/desktop/src/core/mcp/stdio-server-lifecycle.ts
@@ -100441,10 +100760,11 @@ __export(exports_install, {
100441
100760
  OPENSCOUT_RELEASE_OWNER: () => OPENSCOUT_RELEASE_OWNER,
100442
100761
  OPENSCOUT_APP_NAME: () => OPENSCOUT_APP_NAME,
100443
100762
  OPENSCOUT_APP_BUNDLE_ID: () => OPENSCOUT_APP_BUNDLE_ID,
100763
+ LEGACY_APP_BUNDLE_NAMES: () => LEGACY_APP_BUNDLE_NAMES,
100444
100764
  DEFAULT_OPENSCOUT_APP_PATH: () => DEFAULT_OPENSCOUT_APP_PATH
100445
100765
  });
100446
100766
  import { spawnSync as spawnSync8 } from "child_process";
100447
- import { createHash as createHash14 } from "crypto";
100767
+ import { createHash as createHash15 } from "crypto";
100448
100768
  import {
100449
100769
  existsSync as fsExistsSync,
100450
100770
  mkdirSync as fsMkdirSync,
@@ -100455,23 +100775,23 @@ import {
100455
100775
  readFileSync as readFileSync20
100456
100776
  } from "fs";
100457
100777
  import { tmpdir as osTmpdir } from "os";
100458
- import { join as join49 } from "path";
100778
+ import { dirname as dirname30, join as join49 } from "path";
100459
100779
  function renderInstallCommandHelp() {
100460
100780
  return [
100461
- "scout install \u2014 download and install the OpenScout macOS app",
100781
+ "scout install \u2014 download and install the Scout macOS app",
100462
100782
  "",
100463
100783
  "Usage:",
100464
100784
  " scout install # install or update to the latest signed release",
100465
100785
  " scout install --check # report installed vs latest, install nothing",
100466
100786
  " scout install --version <tag> # install a specific release (e.g. v0.2.70)",
100467
100787
  " scout install --force # reinstall even if already up to date",
100468
- " scout install --no-restart # do not relaunch OpenScout after installing",
100788
+ " scout install --no-restart # do not relaunch Scout after installing",
100469
100789
  " scout install --candidate <receipt.json> --dmg <file> # explicit local signed candidate",
100470
100790
  "",
100471
100791
  "Behavior:",
100472
100792
  " Downloads the signed + notarized OpenScout.dmg from the GitHub release,",
100473
100793
  " verifies the published byte size and sha256 digest when GitHub provides one,",
100474
- " then codesign and Gatekeeper-assess the DMG before mounting. OpenScout.app",
100794
+ " then codesign and Gatekeeper-assess the DMG before mounting. Scout.app",
100475
100795
  " must match the pinned bundle id and Team ID, pass codesign --deep --strict,",
100476
100796
  " and pass Gatekeeper execute after staging. A running copy of the installed",
100477
100797
  " app and any stale ScoutMenu helpers from other checkouts are stopped first;",
@@ -100570,7 +100890,7 @@ function stripLeadingV(tag) {
100570
100890
  function normalizeReleaseVersion(tag) {
100571
100891
  const version3 = stripLeadingV(tag);
100572
100892
  if (!/^\d+\.\d+\.\d+$/.test(version3)) {
100573
- throw new ScoutCliError(`unsupported OpenScout release tag: ${tag}`);
100893
+ throw new ScoutCliError(`unsupported Scout release tag: ${tag}`);
100574
100894
  }
100575
100895
  return version3;
100576
100896
  }
@@ -100666,7 +100986,7 @@ function verifyDownloadedAsset(buffer, asset) {
100666
100986
  const parsed = parseGithubAssetDigest(digest);
100667
100987
  let actual;
100668
100988
  try {
100669
- actual = createHash14(parsed.algorithm).update(buffer).digest("hex");
100989
+ actual = createHash15(parsed.algorithm).update(buffer).digest("hex");
100670
100990
  } catch {
100671
100991
  throw new ScoutCliError(`unsupported GitHub asset digest algorithm: ${parsed.algorithm}`);
100672
100992
  }
@@ -100683,7 +101003,7 @@ function findAppDmgAsset(release2) {
100683
101003
  const latestAlias = assets.find((asset) => asset.name === LATEST_DMG_ALIAS);
100684
101004
  if (latestAlias)
100685
101005
  return latestAlias;
100686
- throw new ScoutCliError(`no OpenScout.app DMG found in release ${release2.tag_name}. Assets: ${assets.map((asset) => asset.name).join(", ") || "(none)"}`);
101006
+ throw new ScoutCliError(`no product DMG found in release ${release2.tag_name}. Assets: ${assets.map((asset) => asset.name).join(", ") || "(none)"}`);
100687
101007
  }
100688
101008
  function infoPlistPath(appPath) {
100689
101009
  return join49(appPath, "Contents", "Info.plist");
@@ -100716,7 +101036,7 @@ async function fetchRelease(version3, deps) {
100716
101036
  if ((gh.status ?? 1) === 0 && gh.stdout.trim()) {
100717
101037
  return JSON.parse(gh.stdout);
100718
101038
  }
100719
- throw new ScoutCliError(version3 ? `release "${version3}" not found on GitHub (${OPENSCOUT_RELEASE_OWNER}/${OPENSCOUT_RELEASE_REPOSITORY})` : `could not fetch the latest OpenScout release from GitHub (${OPENSCOUT_RELEASE_OWNER}/${OPENSCOUT_RELEASE_REPOSITORY})`);
101039
+ throw new ScoutCliError(version3 ? `release "${version3}" not found on GitHub (${OPENSCOUT_RELEASE_OWNER}/${OPENSCOUT_RELEASE_REPOSITORY})` : `could not fetch the latest Scout release from GitHub (${OPENSCOUT_RELEASE_OWNER}/${OPENSCOUT_RELEASE_REPOSITORY})`);
100720
101040
  }
100721
101041
  async function downloadDmg(asset, destination, context, deps) {
100722
101042
  context.stderr(`Downloading ${asset.name} (${formatBytes(asset.size)})\u2026`);
@@ -100753,11 +101073,13 @@ function unmountDmg(mountPoint, deps) {
100753
101073
  deps.run("hdiutil", ["detach", mountPoint, "-force", "-quiet"]);
100754
101074
  }
100755
101075
  function requireMountedOpenScoutApp(mountPoint, deps) {
100756
- const source = join49(mountPoint, OPENSCOUT_APP_NAME);
100757
- if (!deps.existsSync(source) || !deps.existsSync(infoPlistPath(source))) {
100758
- throw new ScoutCliError(`no ${OPENSCOUT_APP_NAME} found in the mounted DMG at ${mountPoint}`);
101076
+ for (const name2 of [OPENSCOUT_APP_NAME, ...LEGACY_APP_BUNDLE_NAMES]) {
101077
+ const source = join49(mountPoint, name2);
101078
+ if (deps.existsSync(source) && deps.existsSync(infoPlistPath(source)))
101079
+ return source;
100759
101080
  }
100760
- return source;
101081
+ const names2 = [OPENSCOUT_APP_NAME, ...LEGACY_APP_BUNDLE_NAMES].join(" or ");
101082
+ throw new ScoutCliError(`no ${names2} found in the mounted DMG at ${mountPoint}`);
100761
101083
  }
100762
101084
  function codesignField(output, key) {
100763
101085
  const match = output.match(new RegExp(`^${key}=(.+)$`, "m"));
@@ -100978,7 +101300,7 @@ function processIdsForMenuOutsideApp(psOutput, appPath) {
100978
101300
  }
100979
101301
  function inspectInstallProcessIds(deps) {
100980
101302
  const result = deps.run("ps", ["-axo", "pid=,args="]);
100981
- requireSuccess(result, "could not inspect running OpenScout processes");
101303
+ requireSuccess(result, "could not inspect running Scout processes");
100982
101304
  return {
100983
101305
  installed: processIdsForInstalledApp(result.stdout, deps.appPath),
100984
101306
  staleMenus: processIdsForMenuOutsideApp(result.stdout, deps.appPath)
@@ -101016,7 +101338,57 @@ function stopRunningApp(deps) {
101016
101338
  }
101017
101339
  if (waitUntilInstallUnblocked(deps, STOP_POLL_ATTEMPTS))
101018
101340
  return hadInstalledRunning;
101019
- throw new ScoutCliError("could not stop OpenScout before replacing it");
101341
+ throw new ScoutCliError("could not stop Scout before replacing it");
101342
+ }
101343
+ function stopAppAtPath(appPath, deps) {
101344
+ const scan = () => {
101345
+ const result = deps.run("ps", ["-axo", "pid=,args="]);
101346
+ requireSuccess(result, "could not inspect running Scout processes");
101347
+ return processIdsForInstalledApp(result.stdout, appPath);
101348
+ };
101349
+ if (scan().length === 0)
101350
+ return false;
101351
+ for (const pid of scan())
101352
+ deps.run("kill", [String(pid)]);
101353
+ for (let attempt = 0;attempt < STOP_POLL_ATTEMPTS; attempt += 1) {
101354
+ if (scan().length === 0)
101355
+ return true;
101356
+ deps.sleep(STOP_POLL_MS);
101357
+ }
101358
+ for (const pid of scan())
101359
+ deps.run("kill", ["-9", String(pid)]);
101360
+ for (let attempt = 0;attempt < STOP_POLL_ATTEMPTS; attempt += 1) {
101361
+ if (scan().length === 0)
101362
+ return true;
101363
+ deps.sleep(STOP_POLL_MS);
101364
+ }
101365
+ throw new ScoutCliError(`could not stop the pre-rename app at ${appPath}`);
101366
+ }
101367
+ function retireLegacyAppBundles(deps, context) {
101368
+ const removed = [];
101369
+ let hadRunning = false;
101370
+ let blocked = false;
101371
+ for (const name2 of LEGACY_APP_BUNDLE_NAMES) {
101372
+ const legacyPath = join49(dirname30(deps.appPath), name2);
101373
+ if (legacyPath === deps.appPath || !deps.existsSync(legacyPath))
101374
+ continue;
101375
+ try {
101376
+ if (stopAppAtPath(legacyPath, deps))
101377
+ hadRunning = true;
101378
+ } catch (error48) {
101379
+ blocked = true;
101380
+ context.stderr(`Kept ${legacyPath}; automatic relaunch skipped: ${error48 instanceof Error ? error48.message : String(error48)}`);
101381
+ continue;
101382
+ }
101383
+ try {
101384
+ deps.rmSync(legacyPath, { recursive: true, force: true });
101385
+ removed.push(legacyPath);
101386
+ context.stderr(`Removed the pre-rename bundle at ${legacyPath}.`);
101387
+ } catch (error48) {
101388
+ context.stderr(`Could not remove the pre-rename bundle at ${legacyPath}: ${error48 instanceof Error ? error48.message : String(error48)}`);
101389
+ }
101390
+ }
101391
+ return { removed, hadRunning, blocked };
101020
101392
  }
101021
101393
  function launchApp(deps) {
101022
101394
  requireSuccess(deps.run("open", [deps.appPath]), `could not relaunch ${deps.appPath}`);
@@ -101042,24 +101414,24 @@ async function runCheck(context, options, deps) {
101042
101414
  if (!deps.existsSync(deps.appPath)) {
101043
101415
  if (deps.existsSync(backupPathFor(deps.appPath))) {
101044
101416
  status = "repair-needed";
101045
- message = "An interrupted OpenScout install needs repair \u2014 run `scout install --force`.";
101417
+ message = "An interrupted Scout install needs repair \u2014 run `scout install --force`.";
101046
101418
  } else {
101047
101419
  status = "not-installed";
101048
- message = "OpenScout is not installed \u2014 run `scout install`.";
101420
+ message = "Scout is not installed \u2014 run `scout install`.";
101049
101421
  }
101050
101422
  } else {
101051
101423
  try {
101052
101424
  installed = verifyStagedOpenScoutApp(deps.appPath, deps);
101053
101425
  if (installed === target2) {
101054
101426
  status = "up-to-date";
101055
- message = `OpenScout ${installed} is up to date.`;
101427
+ message = `Scout ${installed} is up to date.`;
101056
101428
  } else {
101057
101429
  status = "update-available";
101058
101430
  message = `Update available: ${installed} \u2192 ${target2}. Run \`scout install\`.`;
101059
101431
  }
101060
101432
  } catch (error48) {
101061
101433
  status = "repair-needed";
101062
- message = `OpenScout needs repair (${error48 instanceof Error ? error48.message : String(error48)}). ` + "Run `scout install --force`.";
101434
+ message = `Scout needs repair (${error48 instanceof Error ? error48.message : String(error48)}). ` + "Run `scout install --force`.";
101063
101435
  }
101064
101436
  }
101065
101437
  context.output.writeValue({ action: "check", status, installed, target: target2, bundlePath: deps.appPath, message }, renderInstallResult);
@@ -101080,7 +101452,7 @@ async function runInstallCommand(context, args, dependencies = {}) {
101080
101452
  await runCheck(context, options, deps);
101081
101453
  return;
101082
101454
  }
101083
- context.stderr(options.candidate ? "Verifying explicit local candidate (unpublished)\u2026" : options.version ? `Fetching release ${options.version}\u2026` : "Fetching the latest OpenScout release\u2026");
101455
+ context.stderr(options.candidate ? "Verifying explicit local candidate (unpublished)\u2026" : options.version ? `Fetching release ${options.version}\u2026` : "Fetching the latest Scout release\u2026");
101084
101456
  const release2 = options.candidate && options.dmg ? loadInstallCandidate(options.candidate, options.dmg) : await fetchRelease(options.version, deps);
101085
101457
  const target2 = normalizeReleaseVersion(release2.tag_name);
101086
101458
  const releaseInstallLock = acquireInstallLock(deps);
@@ -101098,12 +101470,12 @@ async function runInstallCommand(context, args, dependencies = {}) {
101098
101470
  installed: verifiedVersion,
101099
101471
  target: target2,
101100
101472
  bundlePath: deps.appPath,
101101
- message: `OpenScout ${target2} is already installed (use --force to reinstall).`
101473
+ message: `Scout ${target2} is already installed (use --force to reinstall).`
101102
101474
  }, renderInstallResult);
101103
101475
  return;
101104
101476
  } catch (error48) {
101105
101477
  repairingInstalledApp = true;
101106
- context.stderr(`Installed OpenScout ${target2} failed verification; repairing it: ${error48 instanceof Error ? error48.message : String(error48)}`);
101478
+ context.stderr(`Installed Scout ${target2} failed verification; repairing it: ${error48 instanceof Error ? error48.message : String(error48)}`);
101107
101479
  }
101108
101480
  }
101109
101481
  const asset = findAppDmgAsset(release2);
@@ -101122,7 +101494,7 @@ async function runInstallCommand(context, args, dependencies = {}) {
101122
101494
  } else {
101123
101495
  await downloadDmg(asset, dmgPath, context, deps);
101124
101496
  }
101125
- context.stderr(`Installing OpenScout ${target2} to ${deps.appPath}\u2026`);
101497
+ context.stderr(`Installing Scout ${target2} to ${deps.appPath}\u2026`);
101126
101498
  verifyDownloadedDmg(dmgPath, deps);
101127
101499
  mountDmg(dmgPath, mountPoint, deps);
101128
101500
  mounted = true;
@@ -101136,11 +101508,14 @@ async function runInstallCommand(context, args, dependencies = {}) {
101136
101508
  unmountDmg(mountPoint, deps);
101137
101509
  deps.rmSync(workDir, { recursive: true, force: true });
101138
101510
  }
101139
- if (wasRunning && options.restart) {
101511
+ const retirement = retireLegacyAppBundles(deps, context);
101512
+ if (retirement.hadRunning)
101513
+ wasRunning = true;
101514
+ if (wasRunning && options.restart && !retirement.blocked) {
101140
101515
  launchApp(deps);
101141
101516
  }
101142
101517
  const status = hadInstalledApp ? "updated" : "installed";
101143
- const relaunchNote = wasRunning ? options.restart ? " (relaunched)" : " (restart OpenScout to use the new version)" : "";
101518
+ const relaunchNote = retirement.blocked ? " (legacy app cleanup incomplete; automatic relaunch skipped)" : wasRunning ? options.restart ? " (relaunched)" : " (restart Scout to use the new version)" : "";
101144
101519
  let verb = "Installed";
101145
101520
  if (repairingInstalledApp || hadInstalledApp && !installedBefore) {
101146
101521
  verb = "Repaired";
@@ -101153,15 +101528,16 @@ async function runInstallCommand(context, args, dependencies = {}) {
101153
101528
  installed: installedAfter,
101154
101529
  target: target2,
101155
101530
  bundlePath: deps.appPath,
101156
- message: `${verb} OpenScout ${installedAfter} \u2192 ${deps.appPath}${relaunchNote}`
101531
+ message: `${verb} Scout ${installedAfter} \u2192 ${deps.appPath}${relaunchNote}`
101157
101532
  }, renderInstallResult);
101158
101533
  } finally {
101159
101534
  releaseInstallLock();
101160
101535
  }
101161
101536
  }
101162
- var OPENSCOUT_RELEASE_OWNER = "oscout", OPENSCOUT_RELEASE_REPOSITORY = "scout", OPENSCOUT_APP_NAME = "OpenScout.app", OPENSCOUT_APP_BUNDLE_ID = "app.openscout.scout", OPENSCOUT_SIGNING_TEAM_ID = "2U83JFPW66", DEFAULT_OPENSCOUT_APP_PATH, GITHUB_ASSET_DIGEST_ALGORITHM = "sha256", GITHUB_ASSET_DIGEST_HEX_LENGTH = 64, LATEST_DMG_ALIAS = "OpenScout.dmg", USER_AGENT = "scout-cli", BACKUP_SUFFIX = ".openscout-previous", INSTALL_LOCK_SUFFIX = ".openscout-install.lock", SHLOCK_PATH = "/usr/bin/shlock", STOP_POLL_ATTEMPTS = 50, STOP_POLL_MS = 100, MENU_PROCESS_EXECUTABLE = "ScoutMenu", HELP_FLAGS9;
101537
+ var OPENSCOUT_RELEASE_OWNER = "oscout", OPENSCOUT_RELEASE_REPOSITORY = "scout", OPENSCOUT_APP_NAME = "Scout.app", LEGACY_APP_BUNDLE_NAMES, OPENSCOUT_APP_BUNDLE_ID = "app.openscout.scout", OPENSCOUT_SIGNING_TEAM_ID = "2U83JFPW66", DEFAULT_OPENSCOUT_APP_PATH, GITHUB_ASSET_DIGEST_ALGORITHM = "sha256", GITHUB_ASSET_DIGEST_HEX_LENGTH = 64, LATEST_DMG_ALIAS = "OpenScout.dmg", USER_AGENT = "scout-cli", BACKUP_SUFFIX = ".openscout-previous", INSTALL_LOCK_SUFFIX = ".openscout-install.lock", SHLOCK_PATH = "/usr/bin/shlock", STOP_POLL_ATTEMPTS = 50, STOP_POLL_MS = 100, MENU_PROCESS_EXECUTABLE = "ScoutMenu", HELP_FLAGS9;
101163
101538
  var init_install = __esm(() => {
101164
101539
  init_errors();
101540
+ LEGACY_APP_BUNDLE_NAMES = ["OpenScout.app"];
101165
101541
  DEFAULT_OPENSCOUT_APP_PATH = `/Applications/${OPENSCOUT_APP_NAME}`;
101166
101542
  HELP_FLAGS9 = new Set(["help", "--help", "-h"]);
101167
101543
  });
@@ -110208,7 +110584,7 @@ __export(exports_menu, {
110208
110584
  import { spawnSync as spawnSync10 } from "child_process";
110209
110585
  import { existsSync as existsSync39 } from "fs";
110210
110586
  import { homedir as homedir32 } from "os";
110211
- import { dirname as dirname30, join as join51, resolve as resolve30 } from "path";
110587
+ import { dirname as dirname31, join as join51, resolve as resolve30 } from "path";
110212
110588
  import { fileURLToPath as fileURLToPath12 } from "url";
110213
110589
  function renderMenuCommandHelp() {
110214
110590
  return [
@@ -110228,8 +110604,8 @@ function renderMenuCommandHelp() {
110228
110604
  " quit = stop",
110229
110605
  "",
110230
110606
  "Behavior:",
110231
- " On macOS, `scout menu` loads the menu bar app from the installed OpenScout.app",
110232
- " (the menu ships as an embedded helper). If OpenScout.app is not installed, a",
110607
+ " On macOS, `scout menu` loads the menu bar app from the installed Scout.app",
110608
+ " (the menu ships as an embedded helper). If Scout.app is not installed, a",
110233
110609
  " repo checkout can fall back to `apps/macos/bin/openscout-menu.ts` for local",
110234
110610
  " development. `scout menu build` and `scout menu dmg` always require a checkout.",
110235
110611
  "",
@@ -110299,7 +110675,7 @@ function findRepoMenuHelper(startDirectory) {
110299
110675
  if (existsSync39(candidate)) {
110300
110676
  return candidate;
110301
110677
  }
110302
- const parent = dirname30(current);
110678
+ const parent = dirname31(current);
110303
110679
  if (parent === current) {
110304
110680
  break;
110305
110681
  }
@@ -110309,7 +110685,7 @@ function findRepoMenuHelper(startDirectory) {
110309
110685
  return existsSync39(sourceRelativeCandidate) ? sourceRelativeCandidate : null;
110310
110686
  }
110311
110687
  function resolveRepoBundlePath(helperPath) {
110312
- return resolve30(dirname30(helperPath), "..", "dist", "Scout.app", EMBEDDED_MENU_RELATIVE_PATH);
110688
+ return resolve30(dirname31(helperPath), "..", "dist", "Scout.app", EMBEDDED_MENU_RELATIVE_PATH);
110313
110689
  }
110314
110690
  function menuProcesses(helperBundlePath) {
110315
110691
  const expected = helperBundlePath ? join51(helperBundlePath, "Contents", "MacOS", MENU_PROCESS_NAME) : null;
@@ -110501,18 +110877,16 @@ async function runMenuCommand(context, args) {
110501
110877
  const result = preferRepoHelper && repoHelperPath ? await runWithRepoHelper(context, repoHelperPath, command) : installedAppPath ? await runWithInstalledApp(context, command) : repoHelperPath ? await runWithRepoHelper(context, repoHelperPath, command) : await runWithInstalledApp(context, command);
110502
110878
  context.output.writeValue(result, renderMenuResult);
110503
110879
  }
110504
- var MENU_BUNDLE_ID = "app.openscout.scout.menu", MENU_PROCESS_NAME = "ScoutMenu", APP_BUNDLE_ID = "app.openscout.scout", APP_BUNDLE_NAME = "OpenScout.app", EMBEDDED_MENU_RELATIVE_PATH, HELP_FLAGS14, COMMON_APP_BUNDLE_PATHS;
110880
+ var MENU_BUNDLE_ID = "app.openscout.scout.menu", MENU_PROCESS_NAME = "ScoutMenu", APP_BUNDLE_ID = "app.openscout.scout", APP_BUNDLE_NAME = "Scout.app", LEGACY_APP_BUNDLE_NAMES2, EMBEDDED_MENU_RELATIVE_PATH, HELP_FLAGS14, COMMON_APP_BUNDLE_PATHS;
110505
110881
  var init_menu = __esm(() => {
110506
110882
  init_src2();
110507
110883
  init_app_lifecycle();
110508
110884
  init_context();
110509
110885
  init_errors();
110886
+ LEGACY_APP_BUNDLE_NAMES2 = ["OpenScout.app"];
110510
110887
  EMBEDDED_MENU_RELATIVE_PATH = join51("Contents", "Library", "LoginItems", "ScoutMenu.app");
110511
110888
  HELP_FLAGS14 = new Set(["help", "--help", "-h"]);
110512
- COMMON_APP_BUNDLE_PATHS = [
110513
- join51("/Applications", APP_BUNDLE_NAME),
110514
- join51(homedir32(), "Applications", APP_BUNDLE_NAME)
110515
- ];
110889
+ COMMON_APP_BUNDLE_PATHS = [APP_BUNDLE_NAME, ...LEGACY_APP_BUNDLE_NAMES2].flatMap((name2) => [join51("/Applications", name2), join51(homedir32(), "Applications", name2)]);
110516
110890
  });
110517
110891
 
110518
110892
  // ../runtime/src/mesh-join.ts
@@ -111319,7 +111693,7 @@ var init_mesh = () => {};
111319
111693
 
111320
111694
  // ../../apps/desktop/src/core/mesh/enroll-pending.ts
111321
111695
  import { existsSync as existsSync40, mkdirSync as mkdirSync14, readFileSync as readFileSync22, rmSync as rmSync6, writeFileSync as writeFileSync11 } from "fs";
111322
- import { dirname as dirname31, join as join52 } from "path";
111696
+ import { dirname as dirname32, join as join52 } from "path";
111323
111697
  function pendingMeshEnrollmentPath(supportDirectory) {
111324
111698
  const dir = supportDirectory ?? resolveOpenScoutSupportPaths().supportDirectory;
111325
111699
  return join52(dir, PENDING_FILE);
@@ -111329,7 +111703,7 @@ function savePendingMeshEnrollment(handshake, supportDirectory) {
111329
111703
  assertTestIsolatedUserData("write the pending mesh enrollment", "OPENSCOUT_SUPPORT_DIRECTORY");
111330
111704
  }
111331
111705
  const path = pendingMeshEnrollmentPath(supportDirectory);
111332
- mkdirSync14(dirname31(path), { recursive: true });
111706
+ mkdirSync14(dirname32(path), { recursive: true });
111333
111707
  writeFileSync11(path, `${JSON.stringify(handshake, null, 2)}
111334
111708
  `, { encoding: "utf8", mode: 384 });
111335
111709
  }
@@ -114912,7 +115286,7 @@ function createLiveNormalizerContext(sessionId) {
114912
115286
  // ../agent-sessions/src/adapters/claude-code/team-topology.ts
114913
115287
  import { existsSync as existsSync45, readdirSync as readdirSync5, readFileSync as readFileSync28, statSync as statSync12 } from "fs";
114914
115288
  import { homedir as homedir36 } from "os";
114915
- import { basename as basename20, dirname as dirname32, join as join55, relative as relative6 } from "path";
115289
+ import { basename as basename20, dirname as dirname33, join as join55, relative as relative6 } from "path";
114916
115290
  function isObject4(value) {
114917
115291
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
114918
115292
  }
@@ -115153,7 +115527,7 @@ function parseTaskFile(taskPath, teamName, tasksRoot, sourceRef) {
115153
115527
  const relativePath = relative6(join55(tasksRoot, teamName), taskPath);
115154
115528
  const fallbackId = relativePath.replace(/\.[^.]+$/u, "");
115155
115529
  const fallbackTitle = firstMarkdownTitle(raw) ?? basename20(fallbackId);
115156
- const inferredState = inferTaskStateFromPath(dirname32(relativePath));
115530
+ const inferredState = inferTaskStateFromPath(dirname33(relativePath));
115157
115531
  let parsed = null;
115158
115532
  try {
115159
115533
  const json2 = JSON.parse(raw);
@@ -123833,7 +124207,7 @@ var init_service9 = __esm(() => {
123833
124207
  });
123834
124208
 
123835
124209
  // ../../apps/desktop/src/core/pairing/runtime/bridge/ssh-terminal-access.ts
123836
- import { createHash as createHash15 } from "crypto";
124210
+ import { createHash as createHash16 } from "crypto";
123837
124211
  function validateIosGeneratedSshPublicKey(publicKey) {
123838
124212
  const fields = publicKey.trim().split(/\s+/);
123839
124213
  if (fields.length < 2) {
@@ -123994,10 +124368,10 @@ function readSshWireString(buffer, offset) {
123994
124368
  };
123995
124369
  }
123996
124370
  function fingerprintKeyData(keyData) {
123997
- return `SHA256:${createHash15("sha256").update(Buffer.from(keyData, "base64")).digest("base64").replace(/=+$/, "")}`;
124371
+ return `SHA256:${createHash16("sha256").update(Buffer.from(keyData, "base64")).digest("base64").replace(/=+$/, "")}`;
123998
124372
  }
123999
124373
  function fingerprintUtf8(value) {
124000
- return `SHA256:${createHash15("sha256").update(value, "utf8").digest("base64").replace(/=+$/, "")}`;
124374
+ return `SHA256:${createHash16("sha256").update(value, "utf8").digest("base64").replace(/=+$/, "")}`;
124001
124375
  }
124002
124376
  function encodeMarkerValue(value) {
124003
124377
  return Buffer.from(value, "utf8").toString("base64url");
@@ -124020,10 +124394,10 @@ var init_ssh_terminal_access = __esm(() => {
124020
124394
  });
124021
124395
 
124022
124396
  // ../../apps/desktop/src/core/pairing/runtime/bridge/mobile-terminal-session.ts
124023
- import { createHash as createHash16 } from "crypto";
124397
+ import { createHash as createHash17 } from "crypto";
124024
124398
  function mobileTerminalSessionName(sshPublicKey, deviceClass) {
124025
124399
  const normalizedClass = normalizeMobileTerminalDeviceClass(deviceClass);
124026
- const signature = createHash16("sha256").update(sshPublicKey.trim()).digest("hex").slice(0, 8);
124400
+ const signature = createHash17("sha256").update(sshPublicKey.trim()).digest("hex").slice(0, 8);
124027
124401
  return `scout-${normalizedClass}-${signature}`;
124028
124402
  }
124029
124403
  function provisionedMobileTerminalSessionName(sshPublicKey, deviceClass) {
@@ -124059,7 +124433,7 @@ var init_mobile_terminal_session = __esm(() => {
124059
124433
  });
124060
124434
 
124061
124435
  // ../../apps/desktop/src/core/pairing/runtime/bridge/mobile-terminal-provision.ts
124062
- import { createHash as createHash17 } from "crypto";
124436
+ import { createHash as createHash18 } from "crypto";
124063
124437
  import {
124064
124438
  chmodSync as chmodSync3,
124065
124439
  closeSync,
@@ -124209,7 +124583,7 @@ function readRequiredHostKeyFingerprint() {
124209
124583
  const keyData = pub.trim().split(/\s+/)[1];
124210
124584
  if (!keyData)
124211
124585
  throw new Error("missing key data");
124212
- const digest = createHash17("sha256").update(Buffer.from(keyData, "base64")).digest("base64").replace(/=+$/, "");
124586
+ const digest = createHash18("sha256").update(Buffer.from(keyData, "base64")).digest("base64").replace(/=+$/, "");
124213
124587
  return `SHA256:${digest}`;
124214
124588
  } catch (error48) {
124215
124589
  const detail = error48 instanceof Error ? error48.message : String(error48);
@@ -131463,7 +131837,7 @@ __export(exports_session, {
131463
131837
  mergeTerminalSurfaces: () => mergeTerminalSurfaces
131464
131838
  });
131465
131839
  import { spawnSync as spawnSync11 } from "child_process";
131466
- import { createHash as createHash18 } from "crypto";
131840
+ import { createHash as createHash19 } from "crypto";
131467
131841
  import { mkdirSync as mkdirSync23 } from "fs";
131468
131842
  import { homedir as homedir50 } from "os";
131469
131843
  import { basename as basename25, join as join68, resolve as resolve35 } from "path";
@@ -131828,7 +132202,7 @@ function terminalSurfaceKey(surface) {
131828
132202
  function defaultTerminalSessionName(input) {
131829
132203
  const projectName2 = sanitizeTerminalSessionNamePart(basename25(input.cwd) || "workspace", 28);
131830
132204
  const harnessName = sanitizeTerminalSessionNamePart(input.harness, 18);
131831
- const fingerprint = createHash18("sha1").update(`${input.backend}\x00${input.harness}\x00${input.cwd}\x00${input.sessionId}`).digest("hex").slice(0, 10);
132205
+ const fingerprint = createHash19("sha1").update(`${input.backend}\x00${input.harness}\x00${input.cwd}\x00${input.sessionId}`).digest("hex").slice(0, 10);
131832
132206
  return `scout-${harnessName}-${projectName2}-${fingerprint}`;
131833
132207
  }
131834
132208
  function sanitizeTerminalSessionNamePart(value, maxLength) {
@@ -132199,7 +132573,7 @@ __export(exports_server, {
132199
132573
  import { spawn as spawn11 } from "child_process";
132200
132574
  import { existsSync as existsSync52, mkdirSync as mkdirSync24, openSync as openSync2, writeFileSync as writeFileSync17 } from "fs";
132201
132575
  import { homedir as homedir51 } from "os";
132202
- import { dirname as dirname33, join as join69, resolve as resolve36 } from "path";
132576
+ import { dirname as dirname34, join as join69, resolve as resolve36 } from "path";
132203
132577
  import { fileURLToPath as fileURLToPath13 } from "url";
132204
132578
  function renderServerCommandHelp() {
132205
132579
  return [
@@ -132259,7 +132633,7 @@ function resolveScoutControlPlaneWebServerEntry() {
132259
132633
  startDirectories: [
132260
132634
  process.env.OPENSCOUT_SETUP_CWD,
132261
132635
  process.cwd(),
132262
- dirname33(fileURLToPath13(import.meta.url))
132636
+ dirname34(fileURLToPath13(import.meta.url))
132263
132637
  ]
132264
132638
  });
132265
132639
  const source = resolveRepoEntrypoint(repoRoot, "packages/web/server/index.ts");
@@ -132781,14 +133155,14 @@ __export(exports_setup, {
132781
133155
  });
132782
133156
  import { existsSync as existsSync53 } from "fs";
132783
133157
  import { homedir as homedir52 } from "os";
132784
- import { dirname as dirname34, join as join70, resolve as resolve37 } from "path";
133158
+ import { dirname as dirname35, join as join70, resolve as resolve37 } from "path";
132785
133159
  import { createInterface as createInterface4 } from "readline/promises";
132786
133160
  function findGitRoot(startDirectory) {
132787
133161
  let current = resolve37(startDirectory);
132788
133162
  while (true) {
132789
133163
  if (existsSync53(join70(current, ".git")))
132790
133164
  return current;
132791
- const parent = dirname34(current);
133165
+ const parent = dirname35(current);
132792
133166
  if (parent === current)
132793
133167
  return null;
132794
133168
  current = parent;
@@ -132797,7 +133171,7 @@ function findGitRoot(startDirectory) {
132797
133171
  function suggestProjectSourceRoot(currentDirectory, homeDirectory = homedir52()) {
132798
133172
  const gitRoot = findGitRoot(currentDirectory);
132799
133173
  if (gitRoot && resolve37(gitRoot) !== resolve37(homeDirectory))
132800
- return dirname34(gitRoot);
133174
+ return dirname35(gitRoot);
132801
133175
  for (const candidate of [
132802
133176
  join70(homeDirectory, "dev"),
132803
133177
  join70(homeDirectory, "Developer"),
@@ -133046,49 +133420,62 @@ var init_cursor_source = __esm(() => {
133046
133420
  HEAD_READ_BYTES3 = 512 * 1024;
133047
133421
  });
133048
133422
 
133049
- // ../runtime/src/tail/grok-source.ts
133050
- var DEFAULT_HOT_DISCOVERY_WINDOW_MS4, DEFAULT_SHALLOW_DISCOVERY_WINDOW_MS4, DEFAULT_DEEP_DISCOVERY_WINDOW_MS4, HEAD_READ_BYTES4, grokToolCallMatchers, metadataCache3;
133051
- var init_grok_source = __esm(() => {
133423
+ // ../runtime/src/tail/devin-source.ts
133424
+ var DEFAULT_HOT_DISCOVERY_WINDOW_MS4, DEFAULT_SHALLOW_DISCOVERY_WINDOW_MS4, DEFAULT_DEEP_DISCOVERY_WINDOW_MS4, HEAD_READ_BYTES4, sessionDbCache;
133425
+ var init_devin_source = __esm(() => {
133052
133426
  init_discover();
133053
133427
  init_tool_format();
133428
+ init_user_config();
133054
133429
  DEFAULT_HOT_DISCOVERY_WINDOW_MS4 = 10 * 60 * 1000;
133055
133430
  DEFAULT_SHALLOW_DISCOVERY_WINDOW_MS4 = 24 * 60 * 60 * 1000;
133056
133431
  DEFAULT_DEEP_DISCOVERY_WINDOW_MS4 = 24 * 60 * 60 * 1000;
133057
- HEAD_READ_BYTES4 = 256 * 1024;
133432
+ HEAD_READ_BYTES4 = 8 * 1024;
133433
+ sessionDbCache = new Map;
133434
+ });
133435
+
133436
+ // ../runtime/src/tail/grok-source.ts
133437
+ var DEFAULT_HOT_DISCOVERY_WINDOW_MS5, DEFAULT_SHALLOW_DISCOVERY_WINDOW_MS5, DEFAULT_DEEP_DISCOVERY_WINDOW_MS5, HEAD_READ_BYTES5, grokToolCallMatchers, metadataCache3;
133438
+ var init_grok_source = __esm(() => {
133439
+ init_discover();
133440
+ init_tool_format();
133441
+ DEFAULT_HOT_DISCOVERY_WINDOW_MS5 = 10 * 60 * 1000;
133442
+ DEFAULT_SHALLOW_DISCOVERY_WINDOW_MS5 = 24 * 60 * 60 * 1000;
133443
+ DEFAULT_DEEP_DISCOVERY_WINDOW_MS5 = 24 * 60 * 60 * 1000;
133444
+ HEAD_READ_BYTES5 = 256 * 1024;
133058
133445
  grokToolCallMatchers = new Map;
133059
133446
  metadataCache3 = new Map;
133060
133447
  });
133061
133448
 
133062
133449
  // ../runtime/src/tail/kimi-source.ts
133063
- var DEFAULT_HOT_DISCOVERY_WINDOW_MS5, DEFAULT_SHALLOW_DISCOVERY_WINDOW_MS5, DEFAULT_DEEP_DISCOVERY_WINDOW_MS5, metadataCache4;
133450
+ var DEFAULT_HOT_DISCOVERY_WINDOW_MS6, DEFAULT_SHALLOW_DISCOVERY_WINDOW_MS6, DEFAULT_DEEP_DISCOVERY_WINDOW_MS6, metadataCache4;
133064
133451
  var init_kimi_source = __esm(() => {
133065
133452
  init_discover();
133066
133453
  init_tool_format();
133067
- DEFAULT_HOT_DISCOVERY_WINDOW_MS5 = 10 * 60 * 1000;
133068
- DEFAULT_SHALLOW_DISCOVERY_WINDOW_MS5 = 24 * 60 * 60 * 1000;
133069
- DEFAULT_DEEP_DISCOVERY_WINDOW_MS5 = 24 * 60 * 60 * 1000;
133454
+ DEFAULT_HOT_DISCOVERY_WINDOW_MS6 = 10 * 60 * 1000;
133455
+ DEFAULT_SHALLOW_DISCOVERY_WINDOW_MS6 = 24 * 60 * 60 * 1000;
133456
+ DEFAULT_DEEP_DISCOVERY_WINDOW_MS6 = 24 * 60 * 60 * 1000;
133070
133457
  metadataCache4 = new Map;
133071
133458
  });
133072
133459
 
133073
133460
  // ../runtime/src/tail/opencode-source.ts
133074
- var DEFAULT_HOT_DISCOVERY_WINDOW_MS6, DEFAULT_SHALLOW_DISCOVERY_WINDOW_MS6, DEFAULT_DEEP_DISCOVERY_WINDOW_MS6, HEAD_READ_BYTES5;
133461
+ var DEFAULT_HOT_DISCOVERY_WINDOW_MS7, DEFAULT_SHALLOW_DISCOVERY_WINDOW_MS7, DEFAULT_DEEP_DISCOVERY_WINDOW_MS7, HEAD_READ_BYTES6;
133075
133462
  var init_opencode_source = __esm(() => {
133076
133463
  init_discover();
133077
- DEFAULT_HOT_DISCOVERY_WINDOW_MS6 = 10 * 60 * 1000;
133078
- DEFAULT_SHALLOW_DISCOVERY_WINDOW_MS6 = 24 * 60 * 60 * 1000;
133079
- DEFAULT_DEEP_DISCOVERY_WINDOW_MS6 = 24 * 60 * 60 * 1000;
133080
- HEAD_READ_BYTES5 = 128 * 1024;
133464
+ DEFAULT_HOT_DISCOVERY_WINDOW_MS7 = 10 * 60 * 1000;
133465
+ DEFAULT_SHALLOW_DISCOVERY_WINDOW_MS7 = 24 * 60 * 60 * 1000;
133466
+ DEFAULT_DEEP_DISCOVERY_WINDOW_MS7 = 24 * 60 * 60 * 1000;
133467
+ HEAD_READ_BYTES6 = 128 * 1024;
133081
133468
  });
133082
133469
 
133083
133470
  // ../runtime/src/tail/pi-source.ts
133084
- var DEFAULT_HOT_DISCOVERY_WINDOW_MS7, DEFAULT_SHALLOW_DISCOVERY_WINDOW_MS7, DEFAULT_DEEP_DISCOVERY_WINDOW_MS7, HEAD_READ_BYTES6, metadataCache5;
133471
+ var DEFAULT_HOT_DISCOVERY_WINDOW_MS8, DEFAULT_SHALLOW_DISCOVERY_WINDOW_MS8, DEFAULT_DEEP_DISCOVERY_WINDOW_MS8, HEAD_READ_BYTES7, metadataCache5;
133085
133472
  var init_pi_source = __esm(() => {
133086
133473
  init_discover();
133087
133474
  init_tool_format();
133088
- DEFAULT_HOT_DISCOVERY_WINDOW_MS7 = 10 * 60 * 1000;
133089
- DEFAULT_SHALLOW_DISCOVERY_WINDOW_MS7 = 24 * 60 * 60 * 1000;
133090
- DEFAULT_DEEP_DISCOVERY_WINDOW_MS7 = 24 * 60 * 60 * 1000;
133091
- HEAD_READ_BYTES6 = 256 * 1024;
133475
+ DEFAULT_HOT_DISCOVERY_WINDOW_MS8 = 10 * 60 * 1000;
133476
+ DEFAULT_SHALLOW_DISCOVERY_WINDOW_MS8 = 24 * 60 * 60 * 1000;
133477
+ DEFAULT_DEEP_DISCOVERY_WINDOW_MS8 = 24 * 60 * 60 * 1000;
133478
+ HEAD_READ_BYTES7 = 256 * 1024;
133092
133479
  metadataCache5 = new Map;
133093
133480
  });
133094
133481
  // ../runtime/src/tail/service.ts
@@ -133101,6 +133488,7 @@ var init_service11 = __esm(() => {
133101
133488
  init_claude_source();
133102
133489
  init_codex_source();
133103
133490
  init_cursor_source();
133491
+ init_devin_source();
133104
133492
  init_grok_source();
133105
133493
  init_kimi_source();
133106
133494
  init_opencode_source();
@@ -133694,7 +134082,7 @@ __export(exports_tui, {
133694
134082
  });
133695
134083
  import { spawnSync as spawnSync12 } from "child_process";
133696
134084
  import { accessSync as accessSync5, constants as constants5, existsSync as existsSync54 } from "fs";
133697
- import { dirname as dirname35, join as join71, resolve as resolve38 } from "path";
134085
+ import { dirname as dirname36, join as join71, resolve as resolve38 } from "path";
133698
134086
  import { fileURLToPath as fileURLToPath14 } from "url";
133699
134087
  function renderTuiCommandHelp() {
133700
134088
  return [
@@ -133816,7 +134204,7 @@ function findScoutTuiCheckout(cwd, env) {
133816
134204
  const starts = [
133817
134205
  cwd,
133818
134206
  env.OPENSCOUT_SETUP_CWD?.trim(),
133819
- dirname35(fileURLToPath14(import.meta.url))
134207
+ dirname36(fileURLToPath14(import.meta.url))
133820
134208
  ].filter((value) => Boolean(value));
133821
134209
  for (const start of starts) {
133822
134210
  let current = resolve38(start);
@@ -133824,7 +134212,7 @@ function findScoutTuiCheckout(cwd, env) {
133824
134212
  if (existsSync54(join71(current, "crates/scout-tui/Cargo.toml"))) {
133825
134213
  return current;
133826
134214
  }
133827
- const parent = dirname35(current);
134215
+ const parent = dirname36(current);
133828
134216
  if (parent === current)
133829
134217
  break;
133830
134218
  current = parent;
@@ -134538,12 +134926,12 @@ var init_machine_update = __esm(() => {
134538
134926
  });
134539
134927
 
134540
134928
  // ../../apps/desktop/src/cli/machine-update-remote.ts
134541
- import { createHash as createHash19 } from "crypto";
134929
+ import { createHash as createHash20 } from "crypto";
134542
134930
  import { existsSync as existsSync56, readFileSync as readFileSync33 } from "fs";
134543
- import { dirname as dirname36, resolve as resolve40 } from "path";
134931
+ import { dirname as dirname37, resolve as resolve40 } from "path";
134544
134932
  import { fileURLToPath as fileURLToPath15 } from "url";
134545
134933
  function resolveUpdateHelperPath() {
134546
- const here = dirname36(fileURLToPath15(import.meta.url));
134934
+ const here = dirname37(fileURLToPath15(import.meta.url));
134547
134935
  const candidates = [
134548
134936
  resolve40(here, "update-helper.mjs"),
134549
134937
  resolve40(here, "../update-helper.mjs"),
@@ -134572,7 +134960,7 @@ async function runRemoteCandidateInstall(options) {
134572
134960
  ["OpenScout.dmg", options.dmg]
134573
134961
  ]) {
134574
134962
  const bytes = readFileSync33(path2);
134575
- files[name2] = { data: bytes.toString("base64"), sha256: createHash19("sha256").update(bytes).digest("hex") };
134963
+ files[name2] = { data: bytes.toString("base64"), sha256: createHash20("sha256").update(bytes).digest("hex") };
134576
134964
  }
134577
134965
  const argv = ["ssh", "-o", "BatchMode=yes", "-o", "StrictHostKeyChecking=yes", "-o", "ConnectTimeout=8"];
134578
134966
  if (options.target.port !== undefined)
@@ -134779,15 +135167,15 @@ function readSshConfigAliases(read2 = (path2) => readFileSync34(path2, "utf8"))
134779
135167
  }
134780
135168
  function resolveMachineSshDestination(machine, options = {}) {
134781
135169
  const label = machineLabel(machine);
134782
- if (!machine.capabilities.includes("ssh")) {
134783
- throw new ScoutCliError(`${label} does not advertise ssh \u2014 cannot read its versions.`);
134784
- }
134785
135170
  const aliases = options.aliases ?? new Set;
134786
135171
  const names2 = [machine.displayName ?? "", machine.name, ...machine.hostNames].map((name2) => name2.trim()).filter((name2) => name2.length > 0);
134787
135172
  for (const name2 of names2) {
134788
135173
  if (aliases.has(name2.toLowerCase()))
134789
135174
  return name2;
134790
135175
  }
135176
+ if (!machine.capabilities.includes("ssh")) {
135177
+ throw new ScoutCliError(`${label} does not advertise ssh \u2014 cannot read its versions.`);
135178
+ }
134791
135179
  const tiers = [
134792
135180
  machine.routes.filter((route2) => route2.kind === "tailnet").map((route2) => route2.host),
134793
135181
  machine.routes.filter((route2) => route2.kind === "lan").map((route2) => route2.host),
@@ -135393,6 +135781,7 @@ async function loadScoutWhoAmIReport(context, currentDirectory) {
135393
135781
  return {
135394
135782
  defaultSenderId,
135395
135783
  envAgent: context.env.OPENSCOUT_AGENT?.trim() || null,
135784
+ herdrAgentName: resolveHerdrAgentName(context.env),
135396
135785
  codingAgentHost: detectCodingAgentHost(context.env),
135397
135786
  currentDirectory,
135398
135787
  projectRoot,
@@ -135409,6 +135798,9 @@ function renderScoutWhoAmIReport(report) {
135409
135798
  if (report.envAgent) {
135410
135799
  lines.push(`OPENSCOUT_AGENT: ${report.envAgent}`);
135411
135800
  }
135801
+ if (report.herdrAgentName) {
135802
+ lines.push(`Herdr Agent: ${report.herdrAgentName}`);
135803
+ }
135412
135804
  if (report.codingAgentHost) {
135413
135805
  lines.push(`Host Harness: ${report.codingAgentHost.harness} (${report.codingAgentHost.signal})`);
135414
135806
  }
@@ -135746,7 +136138,7 @@ function renderScoutHelp(version3 = "0.2.19") {
135746
136138
  " scout server open",
135747
136139
  "",
135748
136140
  "macOS app:",
135749
- " scout install # download + install OpenScout.app from the latest signed release",
136141
+ " scout install # download + install Scout.app from the latest signed release",
135750
136142
  " scout install --check # compare the installed app against the latest release",
135751
136143
  "",
135752
136144
  "Lifecycle:",
@@ -135830,7 +136222,7 @@ init_options();
135830
136222
  // ../../apps/desktop/src/cli/broker-update.ts
135831
136223
  import { randomUUID as randomUUID9 } from "crypto";
135832
136224
  import { mkdir as mkdir16, readFile as readFile19, rename as rename2, rm as rm7, stat as stat7, writeFile as writeFile13 } from "fs/promises";
135833
- import { basename as basename26, dirname as dirname37, join as join74 } from "path";
136225
+ import { basename as basename26, dirname as dirname38, join as join74 } from "path";
135834
136226
 
135835
136227
  // ../../apps/desktop/src/cli/runtime-freshness.ts
135836
136228
  function isRecord18(value) {
@@ -135970,7 +136362,7 @@ async function tryCreateOwnedLock(lockPath) {
135970
136362
  };
135971
136363
  }
135972
136364
  async function tryReclaimDeadLock(lockPath, observedOwner) {
135973
- const reclaimPath = join74(dirname37(lockPath), BROKER_UPDATE_RECLAIM_DIRECTORY);
136365
+ const reclaimPath = join74(dirname38(lockPath), BROKER_UPDATE_RECLAIM_DIRECTORY);
135974
136366
  const reclaimGuard = await tryCreateOwnedLock(reclaimPath);
135975
136367
  if (!reclaimGuard.acquired) {
135976
136368
  return false;
@@ -136012,7 +136404,7 @@ async function waitForBrokerUpdateLockRelease(lockPath, deadline) {
136012
136404
  return false;
136013
136405
  }
136014
136406
  async function acquireBrokerUpdateLock(lockPath, waitTimeoutMs) {
136015
- await mkdir16(dirname37(lockPath), { recursive: true });
136407
+ await mkdir16(dirname38(lockPath), { recursive: true });
136016
136408
  const waitDeadline = Date.now() + waitTimeoutMs;
136017
136409
  for (;; ) {
136018
136410
  const created = await tryCreateOwnedLock(lockPath);
@@ -136039,7 +136431,7 @@ async function acquireBrokerUpdateLock(lockPath, waitTimeoutMs) {
136039
136431
  }
136040
136432
  }
136041
136433
  async function writeCliMtimeCheckpointAtomically(checkpointPath, mtime) {
136042
- const checkpointDirectory = dirname37(checkpointPath);
136434
+ const checkpointDirectory = dirname38(checkpointPath);
136043
136435
  await mkdir16(checkpointDirectory, { recursive: true });
136044
136436
  const temporaryPath = join74(checkpointDirectory, `.${basename26(checkpointPath)}.${process.pid}.${randomUUID9()}.tmp`);
136045
136437
  try {
@@ -136076,7 +136468,7 @@ async function ensureBrokerUptodate(options) {
136076
136468
  const report = options.report ?? (() => {
136077
136469
  return;
136078
136470
  });
136079
- const lockPath = join74(dirname37(options.checkpointPath), BROKER_UPDATE_LOCK_DIRECTORY);
136471
+ const lockPath = join74(dirname38(options.checkpointPath), BROKER_UPDATE_LOCK_DIRECTORY);
136080
136472
  let lock;
136081
136473
  try {
136082
136474
  lock = await acquireBrokerUpdateLock(lockPath, options.lockWaitTimeoutMs ?? BROKER_UPDATE_LOCK_WAIT_MS);