@openscout/scout 0.2.102 → 0.2.105

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 (505) hide show
  1. package/README.md +37 -0
  2. package/bin/scout.mjs +6 -0
  3. package/bin/scoutd +0 -0
  4. package/dist/build-manifest.json +4 -4
  5. package/dist/chat.mjs +285 -0
  6. package/dist/client/assets/ActivityScreen-CcDdQTBK.js +1 -0
  7. package/dist/client/assets/{AddProjectForm-DfbjlFfy.js → AddProjectForm-CHNJ4NnS.js} +1 -1
  8. package/dist/client/assets/{AdventureEvidence-Dzz9VbuE.js → AdventureEvidence-B4mEvXeD.js} +1 -1
  9. package/dist/client/assets/{AdventureReader-ClMxT0e4.js → AdventureReader-ZsBDQITY.js} +1 -1
  10. package/dist/client/assets/{AdventureScenery-D548O0x4.js → AdventureScenery-DSxDlqG1.js} +1 -1
  11. package/dist/client/assets/AgentAdventures-BxrYq_2v.js +1 -0
  12. package/dist/client/assets/{AgentAvatar-BIwg54Tj.js → AgentAvatar-NZOqcsB2.js} +1 -1
  13. package/dist/client/assets/AgentConfigurationScreen-BhD1PEAM.js +1 -0
  14. package/dist/client/assets/AgentDefinitionsWorkspace-BqS6MXqF.js +1 -0
  15. package/dist/client/assets/{AgentDetailCard-CFDE8TLi.js → AgentDetailCard-MIEBKw_S.js} +1 -1
  16. package/dist/client/assets/AgentFloorView-A0dDRlRV.js +1 -0
  17. package/dist/client/assets/{AgentFloorWorld-BDJmXl3C.js → AgentFloorWorld-BTqwmK5G.js} +1 -1
  18. package/dist/client/assets/AgentInfoScreen-DuaN0sgE.js +1 -0
  19. package/dist/client/assets/{AgentLaneCard-C6YmwPxQ.js → AgentLaneCard-C4rKLLdT.js} +1 -1
  20. package/dist/client/assets/{AgentLaneChrome-D9uJ4QY7.js → AgentLaneChrome-fGC-ZrJS.js} +1 -1
  21. package/dist/client/assets/{AgentLaneDetailSheet-KYckCBCX.js → AgentLaneDetailSheet-BTF4_th9.js} +1 -1
  22. package/dist/client/assets/{AgentLaneSummaryResize-BBYBS3DO.js → AgentLaneSummaryResize-DgSeA_vS.js} +1 -1
  23. package/dist/client/assets/AgentLanesEmbedScreen-CeNiaZ9_.js +1 -0
  24. package/dist/client/assets/{AgentLanesPreflight-pw2vMO3Q.js → AgentLanesPreflight-CcS23wij.js} +1 -1
  25. package/dist/client/assets/{AgentLanesView-aAyC7lHf.js → AgentLanesView-WZhEDBFE.js} +1 -1
  26. package/dist/client/assets/{AgentLiveActions-lYzicnNa.js → AgentLiveActions-6Kfr1uOT.js} +1 -1
  27. package/dist/client/assets/AgentMasterScreen-DUDUTAnU.js +1 -0
  28. package/dist/client/assets/{AgentSessions-Cox2zS-e.js → AgentSessions-CO1WGa8Z.js} +2 -2
  29. package/dist/client/assets/AgentsConsole-BQOWkj35.js +1 -0
  30. package/dist/client/assets/AgentsScreen-BMNAj1PH.js +1 -0
  31. package/dist/client/assets/AgentsSubnav-CeHhuzyM.js +1 -0
  32. package/dist/client/assets/{AstronautSuit-C-4I5YKi.js → AstronautSuit-D67fIBdR.js} +1 -1
  33. package/dist/client/assets/{AtopView-DKm-ERYC.js → AtopView-Ck30FbzG.js} +1 -1
  34. package/dist/client/assets/{BackToPicker-Bys9ColC.js → BackToPicker-CkBhGRlD.js} +1 -1
  35. package/dist/client/assets/BriefingDetailScreen-yZG8_m4h.js +1 -0
  36. package/dist/client/assets/{BriefingsScreen-D4Zf31Y6.js → BriefingsScreen-DTxYMr3a.js} +1 -1
  37. package/dist/client/assets/{BrokerMetadataPanel-1GoSl2BV.js → BrokerMetadataPanel-crirZCdo.js} +1 -1
  38. package/dist/client/assets/BrokerScreen-CT37VQiL.js +8 -0
  39. package/dist/client/assets/Canvas-CRP0KjKb.js +1 -0
  40. package/dist/client/assets/{CastPicker-BuwE_JQp.js → CastPicker-ZPomvOf-.js} +1 -1
  41. package/dist/client/assets/ChannelComposer-BVItWlEz.js +1 -0
  42. package/dist/client/assets/ChannelSidebar-B-2spawY.js +1 -0
  43. package/dist/client/assets/{CharacterFamilyPreview-CfO3j8Of.js → CharacterFamilyPreview-ckVkecDO.js} +1 -1
  44. package/dist/client/assets/ChatAvatar-DKBsbOqk.js +1 -0
  45. package/dist/client/assets/ChatBits-CLJ71hTY.js +1 -0
  46. package/dist/client/assets/{ChatCollapsedStrip-TV0j1xTB.js → ChatCollapsedStrip-Co0NmqOO.js} +1 -1
  47. package/dist/client/assets/ChatRightPanel-pKQtkAgl.js +1 -0
  48. package/dist/client/assets/ChatSpaceSurface-NrLwdPkE.js +1 -0
  49. package/dist/client/assets/ChatSpaceTheme-BPMgPdVK.css +1 -0
  50. package/dist/client/assets/ChatSpaceTheme-D37Jk7bl.js +1 -0
  51. package/dist/client/assets/{CodeDiffPane-DB6-mqtX.js → CodeDiffPane-D-iv28LJ.js} +1 -1
  52. package/dist/client/assets/{CodeProjectPicker-B_LNLpIK.js → CodeProjectPicker-CZ3gDdiT.js} +1 -1
  53. package/dist/client/assets/{CodeScreen-C9H160XS.js → CodeScreen-CSC-zbP9.js} +1 -1
  54. package/dist/client/assets/{CommsCanvas-DOKw3Q8i.js → CommsCanvas-DdNAwjGW.js} +1 -1
  55. package/dist/client/assets/{CommsDeck-C18JA7rK.js → CommsDeck-mGWY7Ivi.js} +1 -1
  56. package/dist/client/assets/{CommsFlowGraph-Czg-KTS0.js → CommsFlowGraph-voDD9M5R.js} +1 -1
  57. package/dist/client/assets/{CommsFlowMap-CzBWvSa5.js → CommsFlowMap-C33sgD48.js} +1 -1
  58. package/dist/client/assets/{CommsSelection-g1twA-Lb.js → CommsSelection-BL8aYD7z.js} +1 -1
  59. package/dist/client/assets/{ConversationComposer-B7RU6LKd.js → ConversationComposer-DNcn5U6D.js} +1 -1
  60. package/dist/client/assets/ConversationFeedRows-RnYSa7Io.js +1 -0
  61. package/dist/client/assets/ConversationHeader-Y9TEJxP_.js +1 -0
  62. package/dist/client/assets/{ConversationPanels-C9yCAoJy.js → ConversationPanels-6pprBpmq.js} +2 -2
  63. package/dist/client/assets/ConversationScreen-tpj4cqWs.js +2 -0
  64. package/dist/client/assets/{ConversationStatus-CK-YfLpi.js → ConversationStatus-Cv-7hErW.js} +1 -1
  65. package/dist/client/assets/{CrewAvatar-CJhuqTsJ.js → CrewAvatar-zgzC3cbU.js} +1 -1
  66. package/dist/client/assets/{CrewSprite-hgpA3SWB.js → CrewSprite-Dp9KBBGY.js} +1 -1
  67. package/dist/client/assets/CrewWorkspaces-DDuYMByu.css +1 -0
  68. package/dist/client/assets/CrewWorkspaces-K2jcyLec.js +1 -0
  69. package/dist/client/assets/{DataTable-BMOZ1-z8.js → DataTable-av71ehJV.js} +1 -1
  70. package/dist/client/assets/{DispatchAftermath-DDlwqSCY.js → DispatchAftermath-CcYGUB10.js} +1 -1
  71. package/dist/client/assets/{DocumentFocusViewer-f12RRQpV.js → DocumentFocusViewer-DlMiEALb.js} +1 -1
  72. package/dist/client/assets/{EmbeddableSurfacesLab-DGl9EMRV.js → EmbeddableSurfacesLab-CTkO_tQR.js} +1 -1
  73. package/dist/client/assets/{EmptyState-uyYN5piI.js → EmptyState-CYUwYyAW.js} +1 -1
  74. package/dist/client/assets/{FileViewerPane-HtiDbj9N.js → FileViewerPane-Cxhixtks.js} +1 -1
  75. package/dist/client/assets/FlightObserveScreen-CvzhzuWc.js +1 -0
  76. package/dist/client/assets/{FloorContextSheet-DV-SYA0K.js → FloorContextSheet-Vj_wVZq1.js} +1 -1
  77. package/dist/client/assets/{FloorExchangePanel-D59nvRCF.js → FloorExchangePanel-CjHSDXad.js} +1 -1
  78. package/dist/client/assets/{FloorMessagePasses-BCwsz9VS.js → FloorMessagePasses-BG4ebnX5.js} +1 -1
  79. package/dist/client/assets/{FloorReplay-BHo79HCD.js → FloorReplay-BoYaGY9t.js} +1 -1
  80. package/dist/client/assets/FloorResourcesSheet-_Iy5UqgY.js +1 -0
  81. package/dist/client/assets/{FloorSavedWork-2tjBoy06.js → FloorSavedWork-jbtRs-YE.js} +1 -1
  82. package/dist/client/assets/{FloorTacticalHUD-Bngao6sn.js → FloorTacticalHUD-BhyOqlL5.js} +1 -1
  83. package/dist/client/assets/{FollowScreen-eHXOlK-u.js → FollowScreen-CupyOgt4.js} +1 -1
  84. package/dist/client/assets/HarnessMark-DSvM_H7H.js +1 -0
  85. package/dist/client/assets/HarnessesScreen-DyjqbZ4k.js +1 -0
  86. package/dist/client/assets/{HerdrSession-CtJOUn7H.js → HerdrSession-Dcm3vf9U.js} +1 -1
  87. package/dist/client/assets/{HomeHero-Cvwx2H0w.js → HomeHero-pIZtE1cC.js} +1 -1
  88. package/dist/client/assets/{HostAdvisorView-CTJXIc1Q.js → HostAdvisorView-Dv5meXo2.js} +1 -1
  89. package/dist/client/assets/InviteLandingScreen-xZQ2na1z.js +1 -0
  90. package/dist/client/assets/InviteSheet--5Zjct25.js +1 -0
  91. package/dist/client/assets/JumpPalette-BmiSOEmp.js +1 -0
  92. package/dist/client/assets/{KnowledgeSearchInspector-DwGMVmFL.js → KnowledgeSearchInspector-B8yiM524.js} +1 -1
  93. package/dist/client/assets/KnowledgeSearchScreen-BPqAjHnH.js +1 -0
  94. package/dist/client/assets/{LaneToolHoverCard-C6YehJqD.js → LaneToolHoverCard-D2cnTeUd.js} +1 -1
  95. package/dist/client/assets/LaneTraceDetailSheet-jl4XQmEx.js +1 -0
  96. package/dist/client/assets/{LaneTraceEventFocus-WLNZZVi_.js → LaneTraceEventFocus-BLhVHwff.js} +1 -1
  97. package/dist/client/assets/{MeshCanvas-FDDGE69h.js → MeshCanvas-BR25OBTJ.js} +1 -1
  98. package/dist/client/assets/{MeshCanvasMinimap-CGRzQCac.js → MeshCanvasMinimap-ClVolr4-.js} +1 -1
  99. package/dist/client/assets/MeshScreen-BW1dMFWF.js +1 -0
  100. package/dist/client/assets/{MeshTopologyView-C2Cv_2gx.js → MeshTopologyView-BT3ke2D1.js} +2 -2
  101. package/dist/client/assets/MessagesScreen-CtNMfIvC.js +1 -0
  102. package/dist/client/assets/{MissionContextRail-CVSZJnvX.js → MissionContextRail-CafjuseK.js} +1 -1
  103. package/dist/client/assets/MissionControlView-BjPOViGY.js +1 -0
  104. package/dist/client/assets/{MissionFocusOverlay-B9SiuO-i.js → MissionFocusOverlay-nhy3hkxQ.js} +1 -1
  105. package/dist/client/assets/MissionLeftAgentRow-Dms0DBjO.js +1 -0
  106. package/dist/client/assets/{MissionLogPane-CMBiI29U.js → MissionLogPane-DiUf3vWW.js} +1 -1
  107. package/dist/client/assets/NativeAreaScreen-BQSTo8As.js +1 -0
  108. package/dist/client/assets/NativeAreaScreen-Brix6xDB.js +1 -0
  109. package/dist/client/assets/NativeAreaScreen-D7HyQNlM.js +1 -0
  110. package/dist/client/assets/{NewAgentModal-Cl4nsGhu.js → NewAgentModal-BQ2wQ5gp.js} +1 -1
  111. package/dist/client/assets/NewChatComposer-BEXS8vV6.js +19 -0
  112. package/dist/client/assets/{NewChatOrigin-CyPPWTJP.js → NewChatOrigin-C8ROO4ps.js} +1 -1
  113. package/dist/client/assets/{NodeDetailPanel-BUG8rOb-.js → NodeDetailPanel-BNTqYC7m.js} +1 -1
  114. package/dist/client/assets/{NodeMenu-Fw8ATWQA.js → NodeMenu-CcOeFRCB.js} +1 -1
  115. package/dist/client/assets/{ObserveEmbedScreen-BPiSXXvm.js → ObserveEmbedScreen-Dh30EjAQ.js} +2 -2
  116. package/dist/client/assets/{ObserveTextFlow-ET0dD1wO.js → ObserveTextFlow-CC5mnngm.js} +2 -2
  117. package/dist/client/assets/{ObservedTopologyPanel-DkEkQzo-.js → ObservedTopologyPanel-DF6tRZL_.js} +1 -1
  118. package/dist/client/assets/OpenScoutAppShell-D9pgw36i.js +31 -0
  119. package/dist/client/assets/OpsAgentsView-D3rM0udq.js +1 -0
  120. package/dist/client/assets/OpsScreen-DySeNQ1V.js +1 -0
  121. package/dist/client/assets/OpsSubnav-C9E0r3GZ.js +1 -0
  122. package/dist/client/assets/ProjectAgentProfile-FUav75j2.js +1 -0
  123. package/dist/client/assets/{ProjectAgentProfileBar-C1fR65Eh.js → ProjectAgentProfileBar-C8z22pJ2.js} +1 -1
  124. package/dist/client/assets/ProjectAgentProfileHero-BLK0EwMg.js +1 -0
  125. package/dist/client/assets/ProjectsInbox-DfCXReZK.js +2 -0
  126. package/dist/client/assets/ProjectsRail-CELVubfJ.js +1 -0
  127. package/dist/client/assets/ProjectsScreen-DMw4TLKy.js +1 -0
  128. package/dist/client/assets/ProjectsThreadAside-D1Sh4fnX.js +1 -0
  129. package/dist/client/assets/{Provider-5Hotn7NQ.js → Provider-CNZluAZb.js} +2 -2
  130. package/dist/client/assets/{RailRow-BYguXNm4.js → RailRow-DUPqXMZh.js} +1 -1
  131. package/dist/client/assets/RailToggle-BwmY70B8.js +1 -0
  132. package/dist/client/assets/RawSessionsTable-6OVJq0JZ.js +1 -0
  133. package/dist/client/assets/RealtimeVoiceScreen-D41TYY0x.js +9 -0
  134. package/dist/client/assets/{RenderedWorkerSprite-CvdWO32C.js → RenderedWorkerSprite-C8fxndAh.js} +1 -1
  135. package/dist/client/assets/{ReplayClock-B7JLTp8A.js → ReplayClock-DUVJjrIu.js} +1 -1
  136. package/dist/client/assets/{ReplayLog-DZTpf2CW.js → ReplayLog-Bek1Vc4W.js} +1 -1
  137. package/dist/client/assets/{ReplayOutpost-CvWQa30T.js → ReplayOutpost-DlRg3172.js} +1 -1
  138. package/dist/client/assets/{RepoDiffEmbedScreen-Cbu0_PJW.js → RepoDiffEmbedScreen-CVUMnt6A.js} +1 -1
  139. package/dist/client/assets/{RepoDiffPageScreen-Chwm6GXL.js → RepoDiffPageScreen-D9-s5PyB.js} +1 -1
  140. package/dist/client/assets/{RepoDiffViewer-C2mb0Wj-.js → RepoDiffViewer-D7FN-oyY.js} +1 -1
  141. package/dist/client/assets/RepoDiffViewerLazy-BpMR7tlx.js +2 -0
  142. package/dist/client/assets/{ReposScreen-C7JZQmyh.js → ReposScreen-BQ7HO1om.js} +2 -2
  143. package/dist/client/assets/{RiggedWorkerCharacter-DNe731GE.js → RiggedWorkerCharacter-CJMWlvV-.js} +1 -1
  144. package/dist/client/assets/{SageModelStudio-BR1J2D4R.js → SageModelStudio-B526NSnw.js} +1 -1
  145. package/dist/client/assets/{ScoutDeckSurface-flRamdvE.js → ScoutDeckSurface-ChkvGyEW.js} +1 -1
  146. package/dist/client/assets/{ScoutSurface-BpklGmDL.js → ScoutSurface-6g1f5chk.js} +1 -1
  147. package/dist/client/assets/{ScoutbotFxLab-DeK7ySWZ.js → ScoutbotFxLab-BuwBdnPf.js} +1 -1
  148. package/dist/client/assets/{SecondaryNav-BkTn5tkq.js → SecondaryNav-Bs-_VwTC.js} +1 -1
  149. package/dist/client/assets/{SessionEmbedScreen-CcQN6xlo.js → SessionEmbedScreen-C2wf35-P.js} +1 -1
  150. package/dist/client/assets/{SessionObserve-DaqDhqDI.js → SessionObserve-B64YsYhy.js} +9 -9
  151. package/dist/client/assets/{SessionObserve-BOBJSfs0.css → SessionObserve-CDdJ7fAE.css} +1 -1
  152. package/dist/client/assets/{SessionObserveEvidence-Drv-D8Oh.js → SessionObserveEvidence-CS1aQBpQ.js} +1 -1
  153. package/dist/client/assets/SessionRefScreen-DURV0MpF.js +1 -0
  154. package/dist/client/assets/SessionsScreen-D71ZR-8t.js +1 -0
  155. package/dist/client/assets/{SettingsDrawer-BDapR4E9.js → SettingsDrawer-Nz98oBVl.js} +3 -3
  156. package/dist/client/assets/SettingsScreen-CYBHal6y.js +1 -0
  157. package/dist/client/assets/{SharedFloorCharacter-CSYG_t9t.js → SharedFloorCharacter-V04kD5T9.js} +1 -1
  158. package/dist/client/assets/SharedWorkFloor-C0xxW4SN.js +2 -0
  159. package/dist/client/assets/{ShikiPane-BudrOxNK.js → ShikiPane-XwFI-pCp.js} +1 -1
  160. package/dist/client/assets/{SlidePanel-Datu7XG4.js → SlidePanel-BMpkXai_.js} +1 -1
  161. package/dist/client/assets/SpaceSwitcher-BfeIf-ad.js +1 -0
  162. package/dist/client/assets/{SpriteAvatar-BW1JzkDt.js → SpriteAvatar-aHeF4ZQZ.js} +1 -1
  163. package/dist/client/assets/{SproutActionSprite-DveCzg6l.js → SproutActionSprite-DI5N3gOj.js} +1 -1
  164. package/dist/client/assets/{StatusPill-MxYClPG5.js → StatusPill-Dw4LP7wu.js} +1 -1
  165. package/dist/client/assets/{TailView-Dn7uWmPz.js → TailView-BofjmUMJ.js} +2 -2
  166. package/dist/client/assets/Terminal-jIqnIZZ6.js +4 -0
  167. package/dist/client/assets/TerminalEmbedScreen-3XsjuySR.js +1 -0
  168. package/dist/client/assets/{TerminalHeaderMount-DCGstkZ4.js → TerminalHeaderMount-CwbQhXcI.js} +1 -1
  169. package/dist/client/assets/TerminalRelay--qOBwnbR.js +46 -0
  170. package/dist/client/assets/{TextDocumentSurface-BhYvAB0o.js → TextDocumentSurface-BK6Qy41F.js} +1 -1
  171. package/dist/client/assets/{TmuxPeek-BhK0V9Qt.js → TmuxPeek-DpUT9Tpc.js} +1 -1
  172. package/dist/client/assets/{VoicePermissionsPanel-CecFWzva.js → VoicePermissionsPanel-D35fOnQj.js} +1 -1
  173. package/dist/client/assets/{WorkDetailScreen-CwtRCm_-.js → WorkDetailScreen-Bcf_yHhU.js} +2 -2
  174. package/dist/client/assets/{WorkFilesViewer-DJHftsH9.js → WorkFilesViewer-t8AEyx3Q.js} +1 -1
  175. package/dist/client/assets/{WorkRunView-x5PH1byG.js → WorkRunView-_mhG_FR2.js} +1 -1
  176. package/dist/client/assets/WorldActorTalk-CKerDikx.js +1 -0
  177. package/dist/client/assets/{WorldCharacter-Dn4sIXNP.js → WorldCharacter-BRrj3MQN.js} +1 -1
  178. package/dist/client/assets/{WorldMinimap-Blqg0d5r.js → WorldMinimap-DOptgrc4.js} +1 -1
  179. package/dist/client/assets/{WorldSky-DV9bpvXj.js → WorldSky-D-RJzSa6.js} +1 -1
  180. package/dist/client/assets/{activity-CSUhvjD0.js → activity-BJqFrZyB.js} +1 -1
  181. package/dist/client/assets/{addon-fit-MR98IWES.js → addon-fit-CHohcvS3.js} +1 -1
  182. package/dist/client/assets/{addon-webgl-CIIKXrvK.js → addon-webgl-CaRy2x2b.js} +1 -1
  183. package/dist/client/assets/agent-autocomplete-_u9o5EZu.js +2 -0
  184. package/dist/client/assets/{agent-essentials-8t2il7PV.js → agent-essentials-bKWYOZaH.js} +1 -1
  185. package/dist/client/assets/{agent-floor-actor-3v9drnxh.js → agent-floor-actor-DW8zLht0.js} +1 -1
  186. package/dist/client/assets/{agent-lane-card-model-l0stnU9N.js → agent-lane-card-model-CeqQGp-8.js} +1 -1
  187. package/dist/client/assets/{agent-lane-detail-Db7KyAlf.js → agent-lane-detail-Ti3trpfH.js} +1 -1
  188. package/dist/client/assets/{agent-lane-preview-B8lsQJOQ.js → agent-lane-preview-Dpa3DuOn.js} +1 -1
  189. package/dist/client/assets/{agent-lanes-model-CX0wTcnF.js → agent-lanes-model-DMAdqCmK.js} +1 -1
  190. package/dist/client/assets/{agent-specialization-CiVxQsFT.js → agent-specialization-BplZUa_0.js} +1 -1
  191. package/dist/client/assets/{api-B9_IqFKY.js → api-BQYTwoz6.js} +1 -1
  192. package/dist/client/assets/{api-CaROe5_H.js → api-DSqpVKC7.js} +1 -1
  193. package/dist/client/assets/{arc.es-BzhWalCl.js → arc.es-CubLvQ4W.js} +1 -1
  194. package/dist/client/assets/{arrow-left-PuKdO3NM.js → arrow-left-DFfKAq0d.js} +1 -1
  195. package/dist/client/assets/{arrow-right-ldbfp4SZ.js → arrow-right-DmAWnyAH.js} +1 -1
  196. package/dist/client/assets/{arrow-up-right-Hn754ybA.js → arrow-up-right-B0aLKiyF.js} +1 -1
  197. package/dist/client/assets/at-sign-DM7xeppo.js +1 -0
  198. package/dist/client/assets/{book-open-BlJnpf2U.js → book-open-BL9qvhEI.js} +1 -1
  199. package/dist/client/assets/{bot-CfN9PSBF.js → bot-BhAVbcCA.js} +1 -1
  200. package/dist/client/assets/{cache-DEy9E34b.js → cache-DGBo3vIf.js} +1 -1
  201. package/dist/client/assets/chat-api-BPVC0asu.js +1 -0
  202. package/dist/client/assets/chat-space-model-B6Jg2CY4.js +4 -0
  203. package/dist/client/assets/{check-B8dMv3Is.js → check-g7D7-c1J.js} +1 -1
  204. package/dist/client/assets/{chevron-down-B5eMsn5c.js → chevron-down-CDzRQQGl.js} +1 -1
  205. package/dist/client/assets/{chevron-right-C7UGFpkl.js → chevron-right-DKGTLiqc.js} +1 -1
  206. package/dist/client/assets/{chevron-up-BHOEgHcn.js → chevron-up-DX7R6KY2.js} +1 -1
  207. package/dist/client/assets/{chunk-HRAB3GC3-C5X-kFhb.js → chunk-HRAB3GC3-Dvk_QpRq.js} +1 -1
  208. package/dist/client/assets/{clock-DFcRbtrl.js → clock-CQb4FeMf.js} +1 -1
  209. package/dist/client/assets/{code-xml-BmyLM0I2.js → code-xml-Cmadr3pQ.js} +1 -1
  210. package/dist/client/assets/{coffee-C_D9zooM.js → coffee-ljG1_krY.js} +1 -1
  211. package/dist/client/assets/{compass-DTZdCpv9.js → compass-CvzkzkIh.js} +1 -1
  212. package/dist/client/assets/content-0AXa0klu.js +1 -0
  213. package/dist/client/assets/content-BEyJ19Lx.js +1 -0
  214. package/dist/client/assets/content-BN5weWKW.js +1 -0
  215. package/dist/client/assets/content-BNokkm7C.js +1 -0
  216. package/dist/client/assets/content-BV4PUM9q.js +1 -0
  217. package/dist/client/assets/content-BxUPlcx5.js +1 -0
  218. package/dist/client/assets/content-CIC5sku8.js +1 -0
  219. package/dist/client/assets/content-CKJ9zb7Z.js +1 -0
  220. package/dist/client/assets/content-CdkTyxqk.js +1 -0
  221. package/dist/client/assets/content-CnhhSCZq.js +1 -0
  222. package/dist/client/assets/content-D1Ze_FG9.js +1 -0
  223. package/dist/client/assets/content-DY3F9Vfr.js +1 -0
  224. package/dist/client/assets/content-DrKBYpcb.js +1 -0
  225. package/dist/client/assets/content-LSStQYj5.js +1 -0
  226. package/dist/client/assets/content-YvU-D0hF.js +1 -0
  227. package/dist/client/assets/content-oKQMyVnH.js +1 -0
  228. package/dist/client/assets/{context-budget-DemtXu7E.js → context-budget-8qFKqM-j.js} +1 -1
  229. package/dist/client/assets/{conversation-icons-BQ4OeOmr.js → conversation-icons-CIRaxmid.js} +1 -1
  230. package/dist/client/assets/{conversation-model-BGFHoxQ0.js → conversation-model-m8HhzroS.js} +1 -1
  231. package/dist/client/assets/conversation-motion-features-D9PxLoDt.js +1 -0
  232. package/dist/client/assets/{copy-D9WUpQRf.js → copy-BGOC1tJB.js} +1 -1
  233. package/dist/client/assets/{cpu-Ck_4tB_-.js → cpu-Q6nrHFTN.js} +1 -1
  234. package/dist/client/assets/{createLucideIcon-DkjnzvcJ.js → createLucideIcon-ChvMq-zl.js} +1 -1
  235. package/dist/client/assets/{credentials-C4VXz2hr.js → credentials-OeoF-VKJ.js} +1 -1
  236. package/dist/client/assets/discover-DlwbftpC.js +2 -0
  237. package/dist/client/assets/embed-entry-c0lwtjBG.js +2 -0
  238. package/dist/client/assets/{external-link-RT4Ph-6-.js → external-link-BVccgH0n.js} +1 -1
  239. package/dist/client/assets/{eye-CtqSV8BS.js → eye-CsGfEVR6.js} +1 -1
  240. package/dist/client/assets/{file-code-corner-D_Aptal2.js → file-code-corner-Be6da5l3.js} +1 -1
  241. package/dist/client/assets/{file-text-ChtICwub.js → file-text-DP6txVW-.js} +1 -1
  242. package/dist/client/assets/{flag-CqdOxVkI.js → flag-DAFE2wZ5.js} +1 -1
  243. package/dist/client/assets/{floor-context-model-DZBpo_oD.js → floor-context-model-rWKqaKmV.js} +1 -1
  244. package/dist/client/assets/{floor-message-passes-CJh9f8Jp.js → floor-message-passes-CO3Ix_wR.js} +1 -1
  245. package/dist/client/assets/{folder-0fWevPvQ.js → folder-B_S7gBVr.js} +1 -1
  246. package/dist/client/assets/{gauge-Dgtfxf_o.js → gauge-DQCGlE3o.js} +1 -1
  247. package/dist/client/assets/{gestures-BDCZ1FRG.js → gestures-CofqY4Km.js} +1 -1
  248. package/dist/client/assets/{git-branch-CA3cHKCI.js → git-branch-DcUCsWdJ.js} +1 -1
  249. package/dist/client/assets/{go-shortcuts-DKtw4qYx.js → go-shortcuts-KQy-ZOpV.js} +1 -1
  250. package/dist/client/assets/{home-moving-signal-B7m-ngb2.js → home-moving-signal-BIHUGNfI.js} +1 -1
  251. package/dist/client/assets/home-now-card-CaLgZze2.js +1 -0
  252. package/dist/client/assets/{home-now-card-nano-D1ScGrgv.js → home-now-card-nano-CvU8B61b.js} +1 -1
  253. package/dist/client/assets/hooks-DaUOREpP.js +2 -0
  254. package/dist/client/assets/index-CGbs0SBm.css +1 -0
  255. package/dist/client/assets/index-CbqBwfIW.js +1 -0
  256. package/dist/client/assets/index-CyPMl7Up.js +1 -0
  257. package/dist/client/assets/index-DReVb7jZ.js +10 -0
  258. package/dist/client/assets/index-PQpJveGO.js +1 -0
  259. package/dist/client/assets/{index-CvsM3jm8.js → index-kkXUq-zf.js} +1 -1
  260. package/dist/client/assets/{inspector-panel-BLhDODb3.js → inspector-panel-CLU7wjnT.js} +2 -2
  261. package/dist/client/assets/{keyboard-nav-CXfav14z.js → keyboard-nav-CJXPaHXj.js} +1 -1
  262. package/dist/client/assets/lane-ask-display-BTVSakyo.js +18 -0
  263. package/dist/client/assets/{lane-observe-BD21P8BB.js → lane-observe-CteDwdD-.js} +3 -3
  264. package/dist/client/assets/{lane-roster-store-DzNHP392.js → lane-roster-store-Ch9t6lb0.js} +1 -1
  265. package/dist/client/assets/{layers-Bolb8ejU.js → layers-BOwyWodP.js} +1 -1
  266. package/dist/client/assets/{layout-grid-DI9tVJ2E.js → layout-grid-B36Qsh0y.js} +1 -1
  267. package/dist/client/assets/left-0vBrvrBG.js +2 -0
  268. package/dist/client/assets/left-C6SyaqlJ.js +1 -0
  269. package/dist/client/assets/left-CTuXysZR.js +2 -0
  270. package/dist/client/assets/left-Cc6s4DT2.js +1 -0
  271. package/dist/client/assets/left-DF5caiyh.js +1 -0
  272. package/dist/client/assets/left-DgT4tWCx.js +1 -0
  273. package/dist/client/assets/left-R0wppTTr.js +1 -0
  274. package/dist/client/assets/left-advisor-C-kt8V28.js +1 -0
  275. package/dist/client/assets/left-agents-thnBO156.js +1 -0
  276. package/dist/client/assets/left-default-CT42fnpF.js +1 -0
  277. package/dist/client/assets/left-lanes-CSmZgciK.js +1 -0
  278. package/dist/client/assets/left-mission-C86x6i9h.js +1 -0
  279. package/dist/client/assets/library-DdhYL_9v.js +1 -0
  280. package/dist/client/assets/{loader-circle-DurUYl7E.js → loader-circle-DNUsuPWz.js} +1 -1
  281. package/dist/client/assets/{local-agents-D9fYYRyj.js → local-agents-I40PawYA.js} +1 -1
  282. package/dist/client/assets/{machine-children-RGS4Q0r6.js → machine-children-CdhNzDF0.js} +1 -1
  283. package/dist/client/assets/{mentions-Ctw1ECUC.js → mentions-Ck_Vjnyp.js} +1 -1
  284. package/dist/client/assets/{mesh-ops-CGpRk4ik.js → mesh-ops-DSlvHp-D.js} +1 -1
  285. package/dist/client/assets/{mesh-view-store-CliSYsmt.js → mesh-view-store-C1-mdP3P.js} +1 -1
  286. package/dist/client/assets/{message-circle-CSiJj6yo.js → message-circle-cI5_A5mj.js} +1 -1
  287. package/dist/client/assets/{message-markup-DgFSyb3f.js → message-markup-6Tgo4qFJ.js} +1 -1
  288. package/dist/client/assets/{message-square-NmXWtWLR.js → message-square-CJW4WRlo.js} +1 -1
  289. package/dist/client/assets/{mission-control-store-DZ29Mlj1.js → mission-control-store-p_cboAm4.js} +1 -1
  290. package/dist/client/assets/monitor-C7_cHlkC.js +1 -0
  291. package/dist/client/assets/{nav-destinations-CyXnw9kh.js → nav-destinations-CU_euC-Q.js} +1 -1
  292. package/dist/client/assets/{observe-CkfOxYx_.js → observe-CtS0l3zu.js} +1 -1
  293. package/dist/client/assets/{operator-attention-DGR4kOog.js → operator-attention-DBaRg5ep.js} +1 -1
  294. package/dist/client/assets/{page-status-CkS3SZu-.js → page-status-DwFR4wSw.js} +1 -1
  295. package/dist/client/assets/{panel-right-BNTJhy8M.js → panel-right-qP17MwMl.js} +1 -1
  296. package/dist/client/assets/{pause-DWS7YGQ3.js → pause-B_hliKuR.js} +1 -1
  297. package/dist/client/assets/{persistent-state-xsuk6Kc-.js → persistent-state-BUsTTZFE.js} +1 -1
  298. package/dist/client/assets/{pin-DWlD1BOF.js → pin-Oi4qHR6M.js} +1 -1
  299. package/dist/client/assets/{play-D_Pggug4.js → play-CVeRmqLH.js} +1 -1
  300. package/dist/client/assets/{plus-D_wLGJGT.js → plus-D5NLH_fM.js} +1 -1
  301. package/dist/client/assets/profile-BegEUmB7.js +1 -0
  302. package/dist/client/assets/projects-inbox-CKPLZN8s.css +1 -0
  303. package/dist/client/assets/{projects-inbox-DvbqJO3q.js → projects-inbox-CfwxCTdN.js} +1 -1
  304. package/dist/client/assets/provider-DwmCoSlc.js +1 -0
  305. package/dist/client/assets/{proxy-DOG46ja4.js → proxy-DgzP27W8.js} +1 -1
  306. package/dist/client/assets/{radio-C_jtwbFP.js → radio-Cas2qg1D.js} +1 -1
  307. package/dist/client/assets/{refresh-cw-Da9DDLk2.js → refresh-cw-IcD2lPoT.js} +1 -1
  308. package/dist/client/assets/resolve-panes-pfZTezKo.js +1 -0
  309. package/dist/client/assets/resolve-sidebar-context-D5ksvrb_.js +1 -0
  310. package/dist/client/assets/right-BDaCJ0CF.js +1 -0
  311. package/dist/client/assets/right-BP6lXRFS.js +1 -0
  312. package/dist/client/assets/right-Cb1VCrdj.js +1 -0
  313. package/dist/client/assets/right-CeFaxfBo.js +1 -0
  314. package/dist/client/assets/right-Ck2SrYCj.js +1 -0
  315. package/dist/client/assets/right-D-uv5YfF.js +1 -0
  316. package/dist/client/assets/right-DJMSICky.js +1 -0
  317. package/dist/client/assets/right-Dnljs8ah.js +1 -0
  318. package/dist/client/assets/right-SdCSF8PP.js +1 -0
  319. package/dist/client/assets/{right-BLJsc2-p.js → right-cjPTwPXS.js} +1 -1
  320. package/dist/client/assets/{rocket-DyrYDo8V.js → rocket-DAqYvu8I.js} +1 -1
  321. package/dist/client/assets/router-C-MF5-mb.js +1 -0
  322. package/dist/client/assets/{runtime-picker-DdsttHHc.js → runtime-picker-C_AVYF63.js} +1 -1
  323. package/dist/client/assets/{scope-views-B7PZGlhY.js → scope-views-Dl3ml9OZ.js} +1 -1
  324. package/dist/client/assets/{scout-voice-DOQ_B77g.js → scout-voice-CqAyfblr.js} +1 -1
  325. package/dist/client/assets/{scoutbot-markdown-Bz0Vbto2.js → scoutbot-markdown-DwvGQOWo.js} +1 -1
  326. package/dist/client/assets/{scroll-text-DwC8r2g6.js → scroll-text-B0tKI9Sg.js} +1 -1
  327. package/dist/client/assets/{search-C4VlW_0l.js → search-UsM-9-_W.js} +1 -1
  328. package/dist/client/assets/secondaryNavConfig-D15P1Y9k.css +1 -0
  329. package/dist/client/assets/secondaryNavConfig-DzNHk6IH.js +1 -0
  330. package/dist/client/assets/{selection-bridge-B5jqyMR9.js → selection-bridge-OTS2iFkt.js} +1 -1
  331. package/dist/client/assets/{send-horizontal-pOtGI7FM.js → send-horizontal-BlQsRK6C.js} +1 -1
  332. package/dist/client/assets/{send-to-agent-session-BZGq_ycy.js → send-to-agent-session-C1mgqdow.js} +1 -1
  333. package/dist/client/assets/{server-ms1yxUYJ.js → server-DBlPW0Mp.js} +1 -1
  334. package/dist/client/assets/{session-catalog-s-T_w41t.js → session-catalog-CnpZMB7C.js} +1 -1
  335. package/dist/client/assets/{session-table-CDx_16xf.js → session-table-CGkfG5Yd.js} +1 -1
  336. package/dist/client/assets/{sessions-view-DzYGsKWS.js → sessions-view-Bge4XZ4I.js} +1 -1
  337. package/dist/client/assets/{settings-TJIkkZ0P.js → settings-C69Zjrpq.js} +1 -1
  338. package/dist/client/assets/{shared-work-artifacts-4IIQXQfc.js → shared-work-artifacts-DfNl9KTo.js} +1 -1
  339. package/dist/client/assets/{sliders-horizontal-CHf3ntw0.js → sliders-horizontal-6bzeod7c.js} +1 -1
  340. package/dist/client/assets/{sparkles-BbOFw3d0.js → sparkles-Cc5lPZRv.js} +1 -1
  341. package/dist/client/assets/{sse-v5QLsOHV.js → sse-A8AyLH0g.js} +1 -1
  342. package/dist/client/assets/{tail-events-DQ46QBW1.js → tail-events-C4WdhVeK.js} +1 -1
  343. package/dist/client/assets/{terminal-96JWDYDL.js → terminal-DMZjX1es.js} +1 -1
  344. package/dist/client/assets/{terminal-relay-Bfx8pg80.js → terminal-relay-mO89dX-Y.js} +1 -1
  345. package/dist/client/assets/{terminal-sessions-Ch9aYlgi.js → terminal-sessions-3RfJpen8.js} +1 -1
  346. package/dist/client/assets/{terminal-takeover-BlpxpvSp.js → terminal-takeover-CZZsnPzj.js} +1 -1
  347. package/dist/client/assets/use-beside-D3cJpA5p.js +1 -0
  348. package/dist/client/assets/{use-conversation-list-A_YUf8lo.js → use-conversation-list-D5EnpVba.js} +1 -1
  349. package/dist/client/assets/{use-fleet-active-asks-DFs_u-vM.js → use-fleet-active-asks-D_QOmjg5.js} +1 -1
  350. package/dist/client/assets/{use-mesh-node-state-Ck9CYplv.js → use-mesh-node-state-3V3ADQ-G.js} +1 -1
  351. package/dist/client/assets/{use-mesh-ops-items-Be1WmwCg.js → use-mesh-ops-items-DI9GKWlF.js} +1 -1
  352. package/dist/client/assets/{use-reduced-motion-D7n3vK8t.js → use-reduced-motion-CiaZHMnk.js} +1 -1
  353. package/dist/client/assets/use-scout-dev-flags-CkdAHlDR.js +1 -0
  354. package/dist/client/assets/{useAgentHoverCard-Dr-OjNFF.js → useAgentHoverCard-A3QGXqIy.js} +1 -1
  355. package/dist/client/assets/useContentSecondaryNav-DrL_nkCZ.js +1 -0
  356. package/dist/client/assets/{useEmbedHeadline-BL8wQawZ.js → useEmbedHeadline-atkQVfGw.js} +1 -1
  357. package/dist/client/assets/usePersistentState-Y8XwSTg-.js +1 -0
  358. package/dist/client/assets/{usePierreRuntime-DJkRHMoe.js → usePierreRuntime-DTvcwISe.js} +1 -1
  359. package/dist/client/assets/users-RLK3P5U4.js +1 -0
  360. package/dist/client/assets/{wrench-BsMTSeji.js → wrench-B4maQJai.js} +1 -1
  361. package/dist/client/assets/{x-DI1ktCYb.js → x-rlMdRqJF.js} +1 -1
  362. package/dist/client/assets/{xterm-B1YBE4Gq.js → xterm-B1zHHOLQ.js} +1 -1
  363. package/dist/client/assets/{zap-sKPkh4sQ.js → zap-B4X0OrEw.js} +1 -1
  364. package/dist/client/index.html +15 -3
  365. package/dist/drizzle/0019_session_actor_targets.sql +227 -0
  366. package/dist/drizzle/README.md +19 -0
  367. package/dist/drizzle/meta/0019_snapshot.json +6804 -0
  368. package/dist/drizzle/meta/_journal.json +7 -0
  369. package/dist/highlights-eq9cgrbb.scm +604 -0
  370. package/dist/highlights-ghv9g403.scm +205 -0
  371. package/dist/highlights-hk7bwhj4.scm +284 -0
  372. package/dist/highlights-r812a2qc.scm +150 -0
  373. package/dist/highlights-x6tmsnaa.scm +115 -0
  374. package/dist/injections-73j83es3.scm +27 -0
  375. package/dist/main.mjs +1214 -722
  376. package/dist/node/main.mjs +133 -22
  377. package/dist/pairing-runtime-controller.mjs +715 -492
  378. package/dist/runtime/base-daemon.mjs +14176 -58
  379. package/dist/runtime/broker-daemon.mjs +15520 -445
  380. package/dist/runtime/broker-process-manager.mjs +5 -3
  381. package/dist/runtime/mesh-discover.mjs +5 -3
  382. package/dist/scout-control-plane-web.mjs +21065 -3387
  383. package/dist/tree-sitter-javascript-nd0q4pe9.wasm +0 -0
  384. package/dist/tree-sitter-markdown-411r6y9b.wasm +0 -0
  385. package/dist/tree-sitter-markdown_inline-j5349f42.wasm +0 -0
  386. package/dist/tree-sitter-typescript-zxjzwt75.wasm +0 -0
  387. package/dist/tree-sitter-zig-e78zbjpm.wasm +0 -0
  388. package/dist/update-helper.mjs +83 -17
  389. package/package.json +2 -2
  390. package/dist/client/assets/ActivityScreen-DCALiEXY.js +0 -1
  391. package/dist/client/assets/AgentAdventures-NwTKeF0F.js +0 -1
  392. package/dist/client/assets/AgentConfigurationScreen-B2Hw0ce1.js +0 -1
  393. package/dist/client/assets/AgentDefinitionsWorkspace-CwZJ833X.js +0 -1
  394. package/dist/client/assets/AgentFloorView-l2wNKFob.js +0 -1
  395. package/dist/client/assets/AgentInfoScreen-ClZM1wQb.js +0 -1
  396. package/dist/client/assets/AgentLanesEmbedScreen-DqHwqY0X.js +0 -1
  397. package/dist/client/assets/AgentMasterScreen-By6DN0jF.js +0 -1
  398. package/dist/client/assets/AgentsConsole-Dq0S_hRA.js +0 -1
  399. package/dist/client/assets/AgentsScreen-Bi9Lx47B.js +0 -1
  400. package/dist/client/assets/AgentsSubnav-BOobgtGE.js +0 -1
  401. package/dist/client/assets/BriefingDetailScreen-sprFl4Nk.js +0 -1
  402. package/dist/client/assets/BrokerScreen-CejzhRsB.js +0 -8
  403. package/dist/client/assets/ConversationFeedRows-DVqnZQH0.js +0 -1
  404. package/dist/client/assets/ConversationHeader-CCSU8uo_.js +0 -1
  405. package/dist/client/assets/ConversationScreen-tTP6B_F-.js +0 -2
  406. package/dist/client/assets/CrewWorkspaces-4O8dgRUD.js +0 -1
  407. package/dist/client/assets/CrewWorkspaces-Diq11KDq.css +0 -1
  408. package/dist/client/assets/FlightObserveScreen-DDXfNbsw.js +0 -1
  409. package/dist/client/assets/FloorResourcesSheet-Djrgd_ZU.js +0 -1
  410. package/dist/client/assets/HarnessMark-Bt47OeHy.js +0 -1
  411. package/dist/client/assets/HarnessesScreen-M84sFjWY.js +0 -1
  412. package/dist/client/assets/KnowledgeSearchScreen-WC0WhFio.js +0 -1
  413. package/dist/client/assets/LaneTraceDetailSheet-mAhj7MJi.js +0 -1
  414. package/dist/client/assets/MeshScreen-DlfiMlaR.js +0 -1
  415. package/dist/client/assets/MessagesScreen-BZ7yaGJx.js +0 -1
  416. package/dist/client/assets/MissionControlView-DpGhxG4a.js +0 -1
  417. package/dist/client/assets/MissionLeftAgentRow-DhhRRim0.js +0 -1
  418. package/dist/client/assets/NativeAreaScreen-BQyHHRAM.js +0 -1
  419. package/dist/client/assets/NativeAreaScreen-Ditv-TYW.js +0 -1
  420. package/dist/client/assets/NativeAreaScreen-Dq3uPSEI.js +0 -1
  421. package/dist/client/assets/NewChatComposer-JjLbm3W2.js +0 -19
  422. package/dist/client/assets/OpenScoutAppShell-CzKbjwCA.js +0 -22
  423. package/dist/client/assets/OpsAgentsView-CZbtkcQH.js +0 -1
  424. package/dist/client/assets/OpsScreen-DJq-aBmX.js +0 -1
  425. package/dist/client/assets/OpsSubnav-9sURjajO.js +0 -1
  426. package/dist/client/assets/ProjectAgentProfile-q_1tMJIL.js +0 -1
  427. package/dist/client/assets/ProjectAgentProfileHero-DyEFyTFs.js +0 -1
  428. package/dist/client/assets/ProjectsInbox-Bs8I__my.js +0 -2
  429. package/dist/client/assets/ProjectsRail-Deb38OJ1.js +0 -1
  430. package/dist/client/assets/ProjectsScreen-CgLiYiss.js +0 -1
  431. package/dist/client/assets/ProjectsThreadAside-C0Yw3yIL.js +0 -1
  432. package/dist/client/assets/RawSessionsTable-DIhmlvk-.js +0 -1
  433. package/dist/client/assets/RealtimeVoiceScreen-3oU7b7V5.js +0 -1
  434. package/dist/client/assets/RepoDiffViewerLazy-BQ6ZCrsq.js +0 -2
  435. package/dist/client/assets/SessionRefScreen-BOQ1_ydg.js +0 -1
  436. package/dist/client/assets/SessionsScreen-R8QKvoey.js +0 -1
  437. package/dist/client/assets/SettingsScreen-DirtO7Z0.js +0 -1
  438. package/dist/client/assets/SharedWorkFloor-yPWFLZwX.js +0 -2
  439. package/dist/client/assets/Terminal-D-DsQlmV.js +0 -4
  440. package/dist/client/assets/TerminalEmbedScreen-9Gmln759.js +0 -1
  441. package/dist/client/assets/WorldActorTalk-uIH2jGqA.js +0 -1
  442. package/dist/client/assets/agent-autocomplete-CeHQpuG9.js +0 -10
  443. package/dist/client/assets/arrow-down-WoVlkUmg.js +0 -1
  444. package/dist/client/assets/chunk-JTPDIGGW-ZC-98AHT.js +0 -46
  445. package/dist/client/assets/chunk-T65CQEWV-CSVUz2rY.js +0 -1
  446. package/dist/client/assets/chunk-YOZR3KYS-B59jqwO0.js +0 -2
  447. package/dist/client/assets/content-B5Q4pb9R.js +0 -1
  448. package/dist/client/assets/content-BK1IfOZs.js +0 -1
  449. package/dist/client/assets/content-BeEsWLEm.js +0 -1
  450. package/dist/client/assets/content-BkOwEknW.js +0 -1
  451. package/dist/client/assets/content-C32W5kAG.js +0 -1
  452. package/dist/client/assets/content-CoqyLs9v.js +0 -1
  453. package/dist/client/assets/content-CwpdIS5b.js +0 -1
  454. package/dist/client/assets/content-DS2OkJ3Q.js +0 -1
  455. package/dist/client/assets/content-DXKaPDfn.js +0 -1
  456. package/dist/client/assets/content-DZt5-dkI.js +0 -1
  457. package/dist/client/assets/content-DbQJH8L1.js +0 -1
  458. package/dist/client/assets/content-DetoiaHq.js +0 -1
  459. package/dist/client/assets/content-Dhu3wL7J.js +0 -1
  460. package/dist/client/assets/content-Dpv34iZu.js +0 -1
  461. package/dist/client/assets/content-TtQJb61D.js +0 -1
  462. package/dist/client/assets/content-ymNb2R7g.js +0 -1
  463. package/dist/client/assets/conversation-motion-features-9x8uZpwh.js +0 -1
  464. package/dist/client/assets/discover-C8IOY7_K.js +0 -2
  465. package/dist/client/assets/embed-entry-CG3CfCbm.js +0 -2
  466. package/dist/client/assets/home-now-card-DduXkHRR.js +0 -1
  467. package/dist/client/assets/hooks-C6VyQTQe.js +0 -2
  468. package/dist/client/assets/index-C5cX8dkl.js +0 -1
  469. package/dist/client/assets/index-C8uS5szO.js +0 -10
  470. package/dist/client/assets/index-Ck1__1yL.css +0 -1
  471. package/dist/client/assets/index-ClOOrVG1.js +0 -1
  472. package/dist/client/assets/index-Crtgfc9I.js +0 -1
  473. package/dist/client/assets/lane-ask-display-B6iCAVcd.js +0 -18
  474. package/dist/client/assets/left-B-_z_nqj.js +0 -2
  475. package/dist/client/assets/left-B1LY7rJc.js +0 -1
  476. package/dist/client/assets/left-C6bdjWcG.js +0 -2
  477. package/dist/client/assets/left-CF4iuqlz.js +0 -1
  478. package/dist/client/assets/left-DLtNyZl1.js +0 -1
  479. package/dist/client/assets/left-Fpxoq-VY.js +0 -1
  480. package/dist/client/assets/left-N2wXfTlp.js +0 -1
  481. package/dist/client/assets/left-advisor-CeIjCKbd.js +0 -1
  482. package/dist/client/assets/left-agents-upjHVlOj.js +0 -1
  483. package/dist/client/assets/left-default-08gmdCtb.js +0 -1
  484. package/dist/client/assets/left-lanes-Cvsp73Hw.js +0 -1
  485. package/dist/client/assets/left-mission-W1LLaz74.js +0 -1
  486. package/dist/client/assets/library-DLKBVUJ6.js +0 -1
  487. package/dist/client/assets/profile-C3KgiZvc.js +0 -1
  488. package/dist/client/assets/projects-inbox-BIW7nv-H.css +0 -1
  489. package/dist/client/assets/resolve-panes-DuowGRTk.js +0 -1
  490. package/dist/client/assets/resolve-sidebar-context-BkTbqteq.js +0 -1
  491. package/dist/client/assets/right-B9OUA6Ho.js +0 -1
  492. package/dist/client/assets/right-BDQnjetX.js +0 -1
  493. package/dist/client/assets/right-BUbKHmRH.js +0 -1
  494. package/dist/client/assets/right-Ci2IcD4s.js +0 -1
  495. package/dist/client/assets/right-CmCce3e5.js +0 -1
  496. package/dist/client/assets/right-D7w0zM5a.js +0 -1
  497. package/dist/client/assets/right-DIoON_bv.js +0 -1
  498. package/dist/client/assets/right-E0Jr3VN5.js +0 -1
  499. package/dist/client/assets/right-lCdAk9dW.js +0 -1
  500. package/dist/client/assets/router-BKiMcYa7.js +0 -1
  501. package/dist/client/assets/secondaryNavConfig-DAXIFtVd.js +0 -1
  502. package/dist/client/assets/secondaryNavConfig-xssF_ubT.css +0 -1
  503. package/dist/client/assets/use-beside-Df-F2Uvg.js +0 -1
  504. package/dist/client/assets/use-scout-dev-flags-0TXfQcG0.js +0 -1
  505. package/dist/client/assets/useContentSecondaryNav-CGvMOVGY.js +0 -1
@@ -368,7 +368,7 @@ function validateLocalConfig(input) {
368
368
  if (typeof raw.webLocalName === "string" && raw.webLocalName.trim().length > 0) {
369
369
  out.webLocalName = raw.webLocalName.trim();
370
370
  }
371
- if (raw.webLanScope === "full" || raw.webLanScope === "pairing") {
371
+ if (raw.webLanScope === "full" || raw.webLanScope === "pairing" || raw.webLanScope === "chat") {
372
372
  out.webLanScope = raw.webLanScope;
373
373
  }
374
374
  if (raw.ports && typeof raw.ports === "object") {
@@ -449,7 +449,9 @@ var init_local_config = __esm(() => {
449
449
  pairingBridge: 43130,
450
450
  pairingRelay: 43131,
451
451
  pairingFileServer: 43132,
452
- studio: 43140
452
+ studio: 43140,
453
+ jetstream: 43150,
454
+ jetstreamMonitor: 43151
453
455
  };
454
456
  DEFAULT_LOCAL_CONFIG = {
455
457
  version: LOCAL_CONFIG_VERSION,
@@ -783,6 +785,13 @@ var init_domains = __esm(() => {
783
785
  ]
784
786
  },
785
787
  groq: { id: "groq", label: "Groq", env: [envCredential("GROQ_API_KEY")] },
788
+ devin: {
789
+ id: "devin",
790
+ label: "Cognition / Devin",
791
+ env: [
792
+ envCredential("WINDSURF_API_KEY", { billing: "subscription" })
793
+ ]
794
+ },
786
795
  cerebras: { id: "cerebras", label: "Cerebras", env: [envCredential("CEREBRAS_API_KEY")] },
787
796
  mistral: { id: "mistral", label: "Mistral", env: [envCredential("MISTRAL_API_KEY")] },
788
797
  zai: { id: "zai", label: "Z.ai", env: [envCredential("ZAI_API_KEY")] },
@@ -863,6 +872,22 @@ var init_domains = __esm(() => {
863
872
  ],
864
873
  login: { command: "grok login", interactive: true },
865
874
  notReadyMessage: "Grok is installed but not authenticated yet."
875
+ },
876
+ devin: {
877
+ harness: "devin",
878
+ mode: "hybrid",
879
+ domains: ["devin"],
880
+ credentials: [
881
+ {
882
+ kind: "file",
883
+ path: "~/.local/share/devin/credentials.toml",
884
+ portable: false,
885
+ fileType: "file"
886
+ },
887
+ ...domainEnv("devin")
888
+ ],
889
+ login: { command: "devin auth login", interactive: true },
890
+ notReadyMessage: "Devin is installed but still needs devin auth login or WINDSURF_API_KEY."
866
891
  }
867
892
  };
868
893
  HARNESS_AUTH_MODELS["grok-acp"] = {
@@ -1471,6 +1496,39 @@ var init_harness_catalog = __esm(() => {
1471
1496
  transport: "acp_stdio"
1472
1497
  }
1473
1498
  },
1499
+ {
1500
+ name: "devin",
1501
+ harness: "devin",
1502
+ label: "Devin",
1503
+ description: "Cognition's Devin CLI coding agent over ACP",
1504
+ homepage: "https://docs.devin.ai/cli",
1505
+ tags: ["coding", "cli", "devin", "cognition", "acp"],
1506
+ featured: true,
1507
+ order: 4,
1508
+ support: {
1509
+ ...DEFAULT_SUPPORT,
1510
+ workspace: true,
1511
+ collaboration: true,
1512
+ files: true
1513
+ },
1514
+ install: {
1515
+ binary: "devin",
1516
+ requires: ["curl"],
1517
+ macos: "brew install --cask devin-cli",
1518
+ linux: "curl -fsSL https://cli.devin.ai/install.sh | bash",
1519
+ windows: "irm https://cli.devin.ai/install.ps1 | iex",
1520
+ verify: "devin --version >/dev/null 2>&1"
1521
+ },
1522
+ readiness: readinessFromAuthModel("devin"),
1523
+ sessionDefaults: {
1524
+ defaultTransport: "devin_acp"
1525
+ },
1526
+ capabilities: ["chat", "invoke", "deliver", "review", "execute"],
1527
+ metadata: {
1528
+ adapterType: "devin-acp",
1529
+ transport: "acp_stdio"
1530
+ }
1531
+ },
1474
1532
  {
1475
1533
  name: "flue",
1476
1534
  harness: "flue",
@@ -1549,7 +1607,7 @@ var init_harness_catalog = __esm(() => {
1549
1607
  });
1550
1608
 
1551
1609
  // ../runtime/src/schema-version.ts
1552
- var CONTROL_PLANE_SCHEMA_VERSION = 17;
1610
+ var CONTROL_PLANE_SCHEMA_VERSION = 18;
1553
1611
 
1554
1612
  // ../protocol/src/time.ts
1555
1613
  function isFinitePositive(value) {
@@ -1576,6 +1634,7 @@ var init_actors = __esm(() => {
1576
1634
  "flue",
1577
1635
  "cursor",
1578
1636
  "opencode",
1637
+ "devin",
1579
1638
  "native",
1580
1639
  "worker",
1581
1640
  "bridge",
@@ -2444,6 +2503,28 @@ var init_channel_identity = __esm(() => {
2444
2503
  CHAT_ID_PREFIX = CHANNEL_ID_PREFIX;
2445
2504
  });
2446
2505
 
2506
+ // ../protocol/src/channel-reception.ts
2507
+ var PERSISTENT_RECEIVE_TRANSPORTS, CHANNEL_RECEPTION_STALE_AFTER_MS;
2508
+ var init_channel_reception = __esm(() => {
2509
+ PERSISTENT_RECEIVE_TRANSPORTS = new Set([
2510
+ "local_socket",
2511
+ "websocket",
2512
+ "pairing_bridge",
2513
+ "peer_broker",
2514
+ "claude_channel",
2515
+ "claude_stream_json",
2516
+ "codex_app_server",
2517
+ "pi_rpc",
2518
+ "grok_acp",
2519
+ "kimi_acp",
2520
+ "cursor_acp",
2521
+ "opencode_acp",
2522
+ "devin_acp",
2523
+ "cursor_sdk_local"
2524
+ ]);
2525
+ CHANNEL_RECEPTION_STALE_AFTER_MS = 10 * 60 * 1000;
2526
+ });
2527
+
2447
2528
  // ../protocol/src/collaboration.ts
2448
2529
  function isWorkItemTerminalState(state) {
2449
2530
  return state === "done" || state === "cancelled";
@@ -2730,7 +2811,7 @@ var SCOUT_RUNTIME_CATALOG_DATA;
2730
2811
  var init_runtime_catalog_generated = __esm(() => {
2731
2812
  SCOUT_RUNTIME_CATALOG_DATA = {
2732
2813
  schemaVersion: "openscout.runtime-catalog.v1",
2733
- revision: "2026-09-10.1",
2814
+ revision: "2026-09-14.1",
2734
2815
  harnesses: [
2735
2816
  {
2736
2817
  id: "claude",
@@ -3040,6 +3121,39 @@ var init_runtime_catalog_generated = __esm(() => {
3040
3121
  enabled: true,
3041
3122
  reasoningEfforts: null,
3042
3123
  models: []
3124
+ },
3125
+ {
3126
+ id: "devin",
3127
+ label: "Devin",
3128
+ enabled: true,
3129
+ reasoningEfforts: null,
3130
+ models: [
3131
+ {
3132
+ id: "swe-2-high",
3133
+ label: "SWE-2 High",
3134
+ enabled: true,
3135
+ default: true,
3136
+ family: "SWE",
3137
+ version: "2 High",
3138
+ contextWindowTokens: 262000
3139
+ },
3140
+ {
3141
+ id: "swe-2-medium",
3142
+ label: "SWE-2 Medium",
3143
+ enabled: true,
3144
+ family: "SWE",
3145
+ version: "2 Medium",
3146
+ contextWindowTokens: 262000
3147
+ },
3148
+ {
3149
+ id: "swe-2-max",
3150
+ label: "SWE-2 Max",
3151
+ enabled: true,
3152
+ family: "SWE",
3153
+ version: "2 Max",
3154
+ contextWindowTokens: 262000
3155
+ }
3156
+ ]
3043
3157
  }
3044
3158
  ]
3045
3159
  };
@@ -3057,7 +3171,8 @@ var init_runtime_catalog_contract = __esm(() => {
3057
3171
  "flue",
3058
3172
  "cursor",
3059
3173
  "opencode",
3060
- "pi"
3174
+ "pi",
3175
+ "devin"
3061
3176
  ];
3062
3177
  SCOUT_REASONING_EFFORTS = [
3063
3178
  "none",
@@ -3467,6 +3582,7 @@ var init_broker_routes = __esm(() => {
3467
3582
  messages: "/v1/messages",
3468
3583
  brokerMessages: "/v1/broker/messages",
3469
3584
  eventsStream: "/v1/events/stream",
3585
+ commands: "/v1/commands",
3470
3586
  actors: "/v1/actors",
3471
3587
  agents: "/v1/agents",
3472
3588
  endpoints: "/v1/endpoints",
@@ -3520,6 +3636,7 @@ var init_src = __esm(() => {
3520
3636
  init_a2a();
3521
3637
  init_machines();
3522
3638
  init_channel_identity();
3639
+ init_channel_reception();
3523
3640
  init_assigned_roles();
3524
3641
  init_orchestrator_prompt();
3525
3642
  init_orchestration_provider_map();
@@ -12573,6 +12690,76 @@ var init_opencode_acp = __esm(() => {
12573
12690
  init_adapter4();
12574
12691
  });
12575
12692
 
12693
+ // ../agent-sessions/src/adapters/devin-acp/adapter.ts
12694
+ import { existsSync as existsSync18 } from "fs";
12695
+ import { homedir as homedir15 } from "os";
12696
+ import { join as join16 } from "path";
12697
+ function isRecord9(value) {
12698
+ return Boolean(value && typeof value === "object" && !Array.isArray(value));
12699
+ }
12700
+ function stringValue5(value) {
12701
+ return typeof value === "string" && value.trim() ? value.trim() : null;
12702
+ }
12703
+ function stringArray5(value) {
12704
+ if (!Array.isArray(value))
12705
+ return null;
12706
+ const entries = value.filter((entry) => typeof entry === "string");
12707
+ return entries.length === value.length ? entries : null;
12708
+ }
12709
+ function firstNonEmptyString4(...values) {
12710
+ for (const value of values) {
12711
+ const trimmed = value?.trim();
12712
+ if (trimmed)
12713
+ return trimmed;
12714
+ }
12715
+ return null;
12716
+ }
12717
+ function defaultDevinCommand(env) {
12718
+ const override = firstNonEmptyString4(env?.DEVIN_CLI_BIN, env?.OPENSCOUT_DEVIN_BIN, process.env.DEVIN_CLI_BIN, process.env.OPENSCOUT_DEVIN_BIN);
12719
+ if (override)
12720
+ return override;
12721
+ const installed = join16(homedir15(), ".local", "bin", "devin");
12722
+ return existsSync18(installed) ? installed : "devin";
12723
+ }
12724
+ function devinArgs(rawOptions) {
12725
+ const explicit = stringArray5(rawOptions.args);
12726
+ if (explicit)
12727
+ return explicit;
12728
+ const args = ["acp"];
12729
+ const model = stringValue5(rawOptions.model);
12730
+ if (model)
12731
+ args.push("--model", model);
12732
+ return args;
12733
+ }
12734
+ var DEVIN_ACP_ADAPTER_TYPE = "devin-acp", DEFAULT_DEVIN_STARTUP_TIMEOUT_MS = 60000, createAdapter5 = (config) => {
12735
+ const rawOptions = isRecord9(config.options) ? config.options : {};
12736
+ const command = stringValue5(rawOptions.command) ?? defaultDevinCommand(config.env);
12737
+ const args = devinArgs(rawOptions);
12738
+ const authMethodPreference = stringArray5(rawOptions.authMethodPreference) ?? [];
12739
+ return new AcpAdapter({
12740
+ ...config,
12741
+ options: {
12742
+ clientName: "openscout",
12743
+ clientTitle: "OpenScout",
12744
+ ...rawOptions,
12745
+ adapterType: DEVIN_ACP_ADAPTER_TYPE,
12746
+ command,
12747
+ args,
12748
+ startupTimeoutMs: typeof rawOptions.startupTimeoutMs === "number" ? rawOptions.startupTimeoutMs : DEFAULT_DEVIN_STARTUP_TIMEOUT_MS,
12749
+ requireAuth: typeof rawOptions.requireAuth === "boolean" ? rawOptions.requireAuth : false,
12750
+ authMethodPreference
12751
+ }
12752
+ });
12753
+ };
12754
+ var init_adapter5 = __esm(() => {
12755
+ init_adapter();
12756
+ });
12757
+
12758
+ // ../agent-sessions/src/adapters/devin-acp/index.ts
12759
+ var init_devin_acp = __esm(() => {
12760
+ init_adapter5();
12761
+ });
12762
+
12576
12763
  // ../agent-sessions/src/runtime/process.ts
12577
12764
  async function spawnHarnessProcess(command, args, options) {
12578
12765
  if (typeof Bun !== "undefined") {
@@ -12891,8 +13078,8 @@ function buildPiProcessEnv(config, sourceEnv = process.env) {
12891
13078
  }
12892
13079
  return env;
12893
13080
  }
12894
- var BASE_PROCESS_ENV_KEYS, PROVIDER_CREDENTIAL_ENV, MAX_PI_STDERR_CHARS = 4096, PiAdapter, createAdapter5 = (config) => new PiAdapter(config);
12895
- var init_adapter5 = __esm(() => {
13081
+ var BASE_PROCESS_ENV_KEYS, PROVIDER_CREDENTIAL_ENV, MAX_PI_STDERR_CHARS = 4096, PiAdapter, createAdapter6 = (config) => new PiAdapter(config);
13082
+ var init_adapter6 = __esm(() => {
12896
13083
  init_secret_redaction();
12897
13084
  BASE_PROCESS_ENV_KEYS = [
12898
13085
  "PATH",
@@ -13741,7 +13928,7 @@ var init_adapter5 = __esm(() => {
13741
13928
 
13742
13929
  // ../agent-sessions/src/adapters/pi/index.ts
13743
13930
  var init_pi = __esm(() => {
13744
- init_adapter5();
13931
+ init_adapter6();
13745
13932
  });
13746
13933
 
13747
13934
  // ../agent-sessions/src/buffer.ts
@@ -14397,9 +14584,9 @@ var init_registry2 = __esm(() => {
14397
14584
  });
14398
14585
 
14399
14586
  // ../agent-sessions/src/codex-launch-config.ts
14400
- import { accessSync as accessSync3, constants as constants3, existsSync as existsSync18 } from "fs";
14401
- import { homedir as homedir15 } from "os";
14402
- import { basename as basename7, delimiter as delimiter2, dirname as dirname11, join as join16, resolve as resolve9 } from "path";
14587
+ import { accessSync as accessSync3, constants as constants3, existsSync as existsSync19 } from "fs";
14588
+ import { homedir as homedir16 } from "os";
14589
+ import { basename as basename7, delimiter as delimiter2, dirname as dirname11, join as join17, resolve as resolve9 } from "path";
14403
14590
  import { fileURLToPath as fileURLToPath2 } from "url";
14404
14591
  function isExecutable2(filePath) {
14405
14592
  if (!filePath) {
@@ -14430,14 +14617,14 @@ function ancestorChain(start) {
14430
14617
  function resolveExecutableFromSearchPath(names2, env) {
14431
14618
  const pathEntries = (env.PATH ?? "").split(delimiter2).filter(Boolean);
14432
14619
  const commonDirectories = [
14433
- join16(homedir15(), ".local", "bin"),
14434
- join16(homedir15(), ".bun", "bin"),
14620
+ join17(homedir16(), ".local", "bin"),
14621
+ join17(homedir16(), ".bun", "bin"),
14435
14622
  "/opt/homebrew/bin",
14436
14623
  "/usr/local/bin"
14437
14624
  ];
14438
14625
  for (const directory of [...pathEntries, ...commonDirectories]) {
14439
14626
  for (const name2 of names2) {
14440
- const candidate = join16(directory, name2);
14627
+ const candidate = join17(directory, name2);
14441
14628
  if (isExecutable2(candidate)) {
14442
14629
  return candidate;
14443
14630
  }
@@ -14480,8 +14667,8 @@ function resolveRepoScoutScript(currentDirectory) {
14480
14667
  const starts = uniquePaths([currentDirectory, moduleDirectory]);
14481
14668
  for (const start of starts) {
14482
14669
  for (const candidate of ancestorChain(start)) {
14483
- const scriptPath = join16(candidate, "apps", "desktop", "bin", "scout.ts");
14484
- if (existsSync18(scriptPath)) {
14670
+ const scriptPath = join17(candidate, "apps", "desktop", "bin", "scout.ts");
14671
+ if (existsSync19(scriptPath)) {
14485
14672
  return scriptPath;
14486
14673
  }
14487
14674
  }
@@ -14533,7 +14720,7 @@ var init_codex_launch_config = () => {};
14533
14720
  // ../agent-sessions/src/local/transports/codex-app-server.ts
14534
14721
  import { spawn as spawn5 } from "child_process";
14535
14722
  import { appendFile, mkdir as mkdir3, readFile as readFile4, rm, stat as stat2, writeFile as writeFile3 } from "fs/promises";
14536
- import { join as join17 } from "path";
14723
+ import { join as join18 } from "path";
14537
14724
  function codexAppServerExitMessage(input) {
14538
14725
  if (input.exitKind === "proactive_shutdown") {
14539
14726
  return `Codex app-server session for ${input.agentName} was stopped by OpenScout` + (input.reason ? `: ${input.reason}` : "") + ".";
@@ -14851,7 +15038,7 @@ function parseCodexMaybeJson(value) {
14851
15038
  }
14852
15039
  }
14853
15040
  async function readCodexSessionCatalog(runtimeDirectory) {
14854
- const raw = await readOptionalFile(join17(runtimeDirectory, SESSION_CATALOG_FILENAME));
15041
+ const raw = await readOptionalFile(join18(runtimeDirectory, SESSION_CATALOG_FILENAME));
14855
15042
  if (!raw) {
14856
15043
  return { activeSessionId: null, sessions: [] };
14857
15044
  }
@@ -14866,7 +15053,7 @@ async function readCodexSessionCatalog(runtimeDirectory) {
14866
15053
  }
14867
15054
  async function writeCodexSessionCatalog(runtimeDirectory, catalog) {
14868
15055
  await mkdir3(runtimeDirectory, { recursive: true });
14869
- await writeFile3(join17(runtimeDirectory, SESSION_CATALOG_FILENAME), JSON.stringify(catalog, null, 2) + `
15056
+ await writeFile3(join18(runtimeDirectory, SESSION_CATALOG_FILENAME), JSON.stringify(catalog, null, 2) + `
14870
15057
  `);
14871
15058
  }
14872
15059
  async function recordCodexSessionCatalog(runtimeDirectory, threadId, input) {
@@ -14939,10 +15126,10 @@ class CodexAppServerTransport {
14939
15126
  errorListeners = new Set;
14940
15127
  constructor(options) {
14941
15128
  this.options = options;
14942
- this.threadIdPath = join17(options.runtimeDirectory, "codex-thread-id.txt");
14943
- this.statePath = join17(options.runtimeDirectory, "state.json");
14944
- this.stdoutLogPath = join17(options.logsDirectory, "stdout.log");
14945
- this.stderrLogPath = join17(options.logsDirectory, "stderr.log");
15129
+ this.threadIdPath = join18(options.runtimeDirectory, "codex-thread-id.txt");
15130
+ this.statePath = join18(options.runtimeDirectory, "state.json");
15131
+ this.stdoutLogPath = join18(options.logsDirectory, "stdout.log");
15132
+ this.stderrLogPath = join18(options.logsDirectory, "stderr.log");
14946
15133
  this.lastConfigSignature = this.configSignature(options);
14947
15134
  }
14948
15135
  get currentThreadId() {
@@ -15103,7 +15290,7 @@ class CodexAppServerTransport {
15103
15290
  async startSession() {
15104
15291
  await mkdir3(this.options.runtimeDirectory, { recursive: true });
15105
15292
  await mkdir3(this.options.logsDirectory, { recursive: true });
15106
- await writeFile3(join17(this.options.runtimeDirectory, "prompt.txt"), this.options.systemPrompt);
15293
+ await writeFile3(join18(this.options.runtimeDirectory, "prompt.txt"), this.options.systemPrompt);
15107
15294
  this.proactiveShutdown = null;
15108
15295
  try {
15109
15296
  await assertCodexWorkingDirectory(this.options.cwd, this.options.agentName);
@@ -15855,9 +16042,9 @@ async function shutdownCodexAppServerLocalAgent(options, shutdownOptions = {}) {
15855
16042
  const session = codexAppServerClients.get(key);
15856
16043
  if (!session) {
15857
16044
  if (shutdownOptions.resetThread) {
15858
- const threadId = await readOptionalFile(join17(options.runtimeDirectory, "codex-thread-id.txt"));
16045
+ const threadId = await readOptionalFile(join18(options.runtimeDirectory, "codex-thread-id.txt"));
15859
16046
  await closeCodexSessionCatalog(options.runtimeDirectory, threadId);
15860
- await rm(join17(options.runtimeDirectory, "codex-thread-id.txt"), { force: true });
16047
+ await rm(join18(options.runtimeDirectory, "codex-thread-id.txt"), { force: true });
15861
16048
  }
15862
16049
  return;
15863
16050
  }
@@ -15982,6 +16169,11 @@ var init_opencode_acp_invocation = __esm(() => {
15982
16169
  init_acp_agent_invocation();
15983
16170
  });
15984
16171
 
16172
+ // ../runtime/src/devin-acp-invocation.ts
16173
+ var init_devin_acp_invocation = __esm(() => {
16174
+ init_acp_agent_invocation();
16175
+ });
16176
+
15985
16177
  // ../runtime/src/managed-agent-environment.ts
15986
16178
  function managedAgentEnvironmentEntries(options) {
15987
16179
  const agentName = options.agentName.trim();
@@ -16010,8 +16202,8 @@ function buildManagedAgentShellExports(options) {
16010
16202
  import { randomUUID as randomUUID2 } from "crypto";
16011
16203
  import { spawn as spawn6 } from "child_process";
16012
16204
  import { appendFile as appendFile2, mkdir as mkdir4, readFile as readFile5, writeFile as writeFile4 } from "fs/promises";
16013
- import { existsSync as existsSync19, readFileSync as readFileSync8 } from "fs";
16014
- import { join as join18 } from "path";
16205
+ import { existsSync as existsSync20, readFileSync as readFileSync8 } from "fs";
16206
+ import { join as join19 } from "path";
16015
16207
  function resolveRequesterTimeoutMs2(timeoutMs) {
16016
16208
  if (typeof timeoutMs === "number" && Number.isFinite(timeoutMs) && timeoutMs > 0) {
16017
16209
  return timeoutMs;
@@ -16062,11 +16254,11 @@ function errorMessage4(error) {
16062
16254
  return error instanceof Error ? error.message : String(error);
16063
16255
  }
16064
16256
  function readSessionCatalogSync(runtimeDirectory) {
16065
- const catalogPath = join18(runtimeDirectory, SESSION_CATALOG_FILENAME2);
16257
+ const catalogPath = join19(runtimeDirectory, SESSION_CATALOG_FILENAME2);
16066
16258
  try {
16067
- if (!existsSync19(catalogPath)) {
16068
- const legacyPath = join18(runtimeDirectory, "claude-session-id.txt");
16069
- if (existsSync19(legacyPath)) {
16259
+ if (!existsSync20(catalogPath)) {
16260
+ const legacyPath = join19(runtimeDirectory, "claude-session-id.txt");
16261
+ if (existsSync20(legacyPath)) {
16070
16262
  const legacyId = readFileSync8(legacyPath, "utf8").trim();
16071
16263
  if (legacyId) {
16072
16264
  return {
@@ -16093,7 +16285,7 @@ async function readSessionCatalog(runtimeDirectory) {
16093
16285
  return readSessionCatalogSync(runtimeDirectory);
16094
16286
  }
16095
16287
  async function writeSessionCatalog(runtimeDirectory, catalog) {
16096
- const catalogPath = join18(runtimeDirectory, SESSION_CATALOG_FILENAME2);
16288
+ const catalogPath = join19(runtimeDirectory, SESSION_CATALOG_FILENAME2);
16097
16289
  await mkdir4(runtimeDirectory, { recursive: true });
16098
16290
  await writeFile4(catalogPath, JSON.stringify(catalog, null, 2) + `
16099
16291
  `);
@@ -16126,8 +16318,8 @@ class ClaudeStreamJsonSession {
16126
16318
  constructor(options) {
16127
16319
  this.options = options;
16128
16320
  this.catalogDirectory = options.runtimeDirectory;
16129
- this.stdoutLogPath = join18(options.logsDirectory, "stdout.log");
16130
- this.stderrLogPath = join18(options.logsDirectory, "stderr.log");
16321
+ this.stdoutLogPath = join19(options.logsDirectory, "stdout.log");
16322
+ this.stderrLogPath = join19(options.logsDirectory, "stderr.log");
16131
16323
  this.lastConfigSignature = this.configSignature(options);
16132
16324
  }
16133
16325
  matches(options) {
@@ -16283,7 +16475,7 @@ class ClaudeStreamJsonSession {
16283
16475
  async startSession() {
16284
16476
  await mkdir4(this.options.runtimeDirectory, { recursive: true });
16285
16477
  await mkdir4(this.options.logsDirectory, { recursive: true });
16286
- await writeFile4(join18(this.options.runtimeDirectory, "prompt.txt"), this.options.systemPrompt);
16478
+ await writeFile4(join19(this.options.runtimeDirectory, "prompt.txt"), this.options.systemPrompt);
16287
16479
  const catalog = await readSessionCatalog(this.catalogDirectory);
16288
16480
  this.claudeSessionId = catalog.activeSessionId;
16289
16481
  this.resumedSessionId = this.claudeSessionId;
@@ -16468,13 +16660,13 @@ var init_claude_stream_json = __esm(() => {
16468
16660
  });
16469
16661
 
16470
16662
  // ../agent-sessions/src/adapters/codex/topology.ts
16471
- import { existsSync as existsSync20, readdirSync as readdirSync2, readFileSync as readFileSync9, statSync as statSync4 } from "fs";
16472
- import { homedir as homedir16 } from "os";
16473
- import { basename as basename8, join as join19 } from "path";
16663
+ import { existsSync as existsSync21, readdirSync as readdirSync2, readFileSync as readFileSync9, statSync as statSync4 } from "fs";
16664
+ import { homedir as homedir17 } from "os";
16665
+ import { basename as basename8, join as join20 } from "path";
16474
16666
  function isObject(value) {
16475
16667
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
16476
16668
  }
16477
- function stringValue5(value) {
16669
+ function stringValue6(value) {
16478
16670
  return typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined;
16479
16671
  }
16480
16672
  function numberValue2(value) {
@@ -16594,15 +16786,15 @@ function readTomlKeyValues(path2) {
16594
16786
  }
16595
16787
  function firstString(record, keys) {
16596
16788
  for (const key of keys) {
16597
- const value = stringValue5(record[key]);
16789
+ const value = stringValue6(record[key]);
16598
16790
  if (value)
16599
16791
  return value;
16600
16792
  }
16601
16793
  return;
16602
16794
  }
16603
16795
  function readAgentDefinitions(root, scope) {
16604
- const agentsDir = join19(root, ".codex", "agents");
16605
- if (!existsSync20(agentsDir) || !statIsDirectory(agentsDir)) {
16796
+ const agentsDir = join20(root, ".codex", "agents");
16797
+ if (!existsSync21(agentsDir) || !statIsDirectory(agentsDir)) {
16606
16798
  return { agents: [], sourceRefs: [] };
16607
16799
  }
16608
16800
  const agents = [];
@@ -16610,7 +16802,7 @@ function readAgentDefinitions(root, scope) {
16610
16802
  for (const entry of readdirSync2(agentsDir).sort()) {
16611
16803
  if (!entry.endsWith(".toml"))
16612
16804
  continue;
16613
- const path2 = join19(agentsDir, entry);
16805
+ const path2 = join20(agentsDir, entry);
16614
16806
  if (!statIsFile(path2))
16615
16807
  continue;
16616
16808
  const parsed = readTomlKeyValues(path2);
@@ -16649,8 +16841,8 @@ function readAgentDefinitions(root, scope) {
16649
16841
  function readProjectAgentsConfig(cwd) {
16650
16842
  if (!cwd)
16651
16843
  return {};
16652
- const configPath = join19(cwd, ".codex", "config.toml");
16653
- if (!existsSync20(configPath) || !statIsFile(configPath)) {
16844
+ const configPath = join20(cwd, ".codex", "config.toml");
16845
+ if (!existsSync21(configPath) || !statIsFile(configPath)) {
16654
16846
  return {};
16655
16847
  }
16656
16848
  const parsed = readTomlKeyValues(configPath);
@@ -16683,7 +16875,7 @@ function taskStateFromStatus(value, fallback = "running") {
16683
16875
  if (typeof value === "string" && value.trim())
16684
16876
  return value.trim();
16685
16877
  if (isObject(value)) {
16686
- const nested = stringValue5(value.type) ?? stringValue5(value.status);
16878
+ const nested = stringValue6(value.type) ?? stringValue6(value.status);
16687
16879
  if (nested)
16688
16880
  return nested;
16689
16881
  }
@@ -16709,14 +16901,14 @@ class CodexObservedTopologyTracker {
16709
16901
  this.threadPath = options.threadPath?.trim() || null;
16710
16902
  this.cwd = options.cwd;
16711
16903
  this.sessionName = options.sessionName;
16712
- this.homeDir = options.homeDir ?? homedir16();
16904
+ this.homeDir = options.homeDir ?? homedir17();
16713
16905
  this.now = options.now ?? (() => new Date);
16714
16906
  }
16715
16907
  updateThread(thread) {
16716
- const threadId = stringValue5(thread.id);
16717
- const threadPath = stringValue5(thread.path);
16718
- const cwd = stringValue5(thread.cwd);
16719
- const name2 = stringValue5(thread.name);
16908
+ const threadId = stringValue6(thread.id);
16909
+ const threadPath = stringValue6(thread.path);
16910
+ const cwd = stringValue6(thread.cwd);
16911
+ const name2 = stringValue6(thread.name);
16720
16912
  if (threadId)
16721
16913
  this.threadId = threadId;
16722
16914
  if (threadPath)
@@ -16727,7 +16919,7 @@ class CodexObservedTopologyTracker {
16727
16919
  this.sessionName = name2;
16728
16920
  }
16729
16921
  observeItem(item, phase) {
16730
- const type = stringValue5(item.type);
16922
+ const type = stringValue6(item.type);
16731
16923
  if (!type)
16732
16924
  return false;
16733
16925
  if (type === "subagent") {
@@ -16916,7 +17108,7 @@ var OBSERVED_HARNESS_TOPOLOGY_META_KEY = "observedTopology";
16916
17108
 
16917
17109
  // ../runtime/src/codex-app-server.ts
16918
17110
  import { lstat, mkdir as mkdir5, readFile as readFile6, symlink } from "fs/promises";
16919
- import { join as join20 } from "path";
17111
+ import { join as join21 } from "path";
16920
17112
  function isCodexThreadGlobalMessage(message) {
16921
17113
  const result = message.result;
16922
17114
  const thread = result?.thread;
@@ -17761,7 +17953,7 @@ async function prepareManagedCodexAuthentication(options) {
17761
17953
  const authSource = options.env?.OPENSCOUT_CODEX_AUTH_SOURCE?.trim();
17762
17954
  if (!codexHome || !authSource || options.env?.OPENAI_API_KEY?.trim() || process.env.OPENAI_API_KEY?.trim())
17763
17955
  return;
17764
- const authTarget = join20(codexHome, "auth.json");
17956
+ const authTarget = join21(codexHome, "auth.json");
17765
17957
  try {
17766
17958
  await lstat(authTarget);
17767
17959
  return;
@@ -17805,9 +17997,9 @@ function isCodexAppServerAgentAlive(options) {
17805
17997
  return isCodexAppServerLocalAgentAlive(options);
17806
17998
  }
17807
17999
  async function getCodexAppServerAgentSnapshot(options) {
17808
- const stdoutLogPath = join20(options.logsDirectory, "stdout.log");
17809
- const threadIdPath = join20(options.runtimeDirectory, "codex-thread-id.txt");
17810
- const statePath = join20(options.runtimeDirectory, "state.json");
18000
+ const stdoutLogPath = join21(options.logsDirectory, "stdout.log");
18001
+ const threadIdPath = join21(options.runtimeDirectory, "codex-thread-id.txt");
18002
+ const statePath = join21(options.runtimeDirectory, "state.json");
17811
18003
  const [rawLog, persistedThreadId, persistedState] = await Promise.all([
17812
18004
  readOptionalFile2(stdoutLogPath),
17813
18005
  readOptionalFile2(threadIdPath),
@@ -17874,11 +18066,11 @@ function buildCollaborationContractPrompt(agentId) {
17874
18066
  }
17875
18067
 
17876
18068
  // ../runtime/src/pi-rpc.ts
17877
- import { existsSync as existsSync21, readFileSync as readFileSync10, statSync as statSync5 } from "fs";
18069
+ import { existsSync as existsSync22, readFileSync as readFileSync10, statSync as statSync5 } from "fs";
17878
18070
  import { mkdir as mkdir6, writeFile as writeFile5 } from "fs/promises";
17879
18071
  import { execFileSync as execFileSync4 } from "child_process";
17880
- import { homedir as homedir17 } from "os";
17881
- import { join as join21 } from "path";
18072
+ import { homedir as homedir18 } from "os";
18073
+ import { join as join22 } from "path";
17882
18074
  function normalizeOptionalString(value) {
17883
18075
  const trimmed = value?.trim();
17884
18076
  return trimmed ? trimmed : undefined;
@@ -17899,7 +18091,7 @@ function resolveDefaultPiScoutExtension() {
17899
18091
  return null;
17900
18092
  }
17901
18093
  for (const candidate of PI_SCOUT_EXTENSION_CANDIDATES) {
17902
- if (existsSync21(candidate)) {
18094
+ if (existsSync22(candidate)) {
17903
18095
  return candidate;
17904
18096
  }
17905
18097
  }
@@ -17938,7 +18130,7 @@ function readPiRpcCredentialFile(name2, options = {}) {
17938
18130
  }
17939
18131
  const env = options.env ?? process.env;
17940
18132
  const platform = options.platform ?? process.platform;
17941
- const directory = normalizeOptionalString(env.CREDENTIALS_DIRECTORY) ?? normalizeOptionalString(env.OPENSCOUT_CREDENTIALS_DIRECTORY) ?? (platform === "linux" ? join21(normalizeOptionalString(env.XDG_CONFIG_HOME) ?? join21(options.homedir ?? homedir17(), ".config"), "openscout", "credentials") : undefined);
18133
+ const directory = normalizeOptionalString(env.CREDENTIALS_DIRECTORY) ?? normalizeOptionalString(env.OPENSCOUT_CREDENTIALS_DIRECTORY) ?? (platform === "linux" ? join22(normalizeOptionalString(env.XDG_CONFIG_HOME) ?? join22(options.homedir ?? homedir18(), ".config"), "openscout", "credentials") : undefined);
17942
18134
  if (!directory) {
17943
18135
  return;
17944
18136
  }
@@ -17947,7 +18139,7 @@ function readPiRpcCredentialFile(name2, options = {}) {
17947
18139
  if (!directoryStat.isDirectory() || (directoryStat.mode & 63) !== 0) {
17948
18140
  return;
17949
18141
  }
17950
- const path2 = join21(directory, name2);
18142
+ const path2 = join22(directory, name2);
17951
18143
  const stat3 = statSync5(path2);
17952
18144
  if (!stat3.isFile() || (stat3.mode & 63) !== 0 || stat3.size > 16 * 1024) {
17953
18145
  return;
@@ -18010,7 +18202,7 @@ function parsePiRpcLaunchArgs(launchArgs, options) {
18010
18202
  const parsed = {
18011
18203
  extensions: [],
18012
18204
  extraArgs: [],
18013
- sessionDir: join21(options.runtimeDirectory, "pi-sessions")
18205
+ sessionDir: join22(options.runtimeDirectory, "pi-sessions")
18014
18206
  };
18015
18207
  for (let index2 = 0;index2 < launchArgs.length; index2 += 1) {
18016
18208
  const current = launchArgs[index2] ?? "";
@@ -18129,11 +18321,11 @@ class PiRpcAgentSession {
18129
18321
  }
18130
18322
  await mkdir6(this.options.runtimeDirectory, { recursive: true });
18131
18323
  await mkdir6(this.options.logsDirectory, { recursive: true });
18132
- await writeFile5(join21(this.options.runtimeDirectory, "prompt.txt"), this.options.systemPrompt);
18324
+ await writeFile5(join22(this.options.runtimeDirectory, "prompt.txt"), this.options.systemPrompt);
18133
18325
  const launch = parsePiRpcLaunchArgs(this.options.launchArgs, {
18134
18326
  runtimeDirectory: this.options.runtimeDirectory
18135
18327
  });
18136
- const adapter = createAdapter5({
18328
+ const adapter = createAdapter6({
18137
18329
  sessionId: this.options.sessionId,
18138
18330
  name: `${this.options.agentName} Pi RPC`,
18139
18331
  cwd: this.options.cwd,
@@ -18290,8 +18482,8 @@ var init_pi_rpc = __esm(() => {
18290
18482
  init_pi();
18291
18483
  PI_SCOUT_EXTENSION_CANDIDATES = [
18292
18484
  process.env.OPENSCOUT_PI_SCOUT_EXTENSION_PATH,
18293
- join21(homedir17(), ".pi", "agent", "extensions", "pi-scout"),
18294
- join21(homedir17(), "dev", "pi-scout")
18485
+ join22(homedir18(), ".pi", "agent", "extensions", "pi-scout"),
18486
+ join22(homedir18(), "dev", "pi-scout")
18295
18487
  ].filter((candidate) => Boolean(candidate));
18296
18488
  PI_RPC_FLAGS_WITH_VALUES = new Set([
18297
18489
  "--model",
@@ -19321,8 +19513,8 @@ var init_managed_installs = __esm(() => {
19321
19513
 
19322
19514
  // ../runtime/src/user-project-hints.ts
19323
19515
  import { readdir as readdir2, readFile as readFile7, stat as stat3 } from "fs/promises";
19324
- import { homedir as homedir18 } from "os";
19325
- import { dirname as dirname12, join as join22, resolve as resolve10 } from "path";
19516
+ import { homedir as homedir19 } from "os";
19517
+ import { dirname as dirname12, join as join23, resolve as resolve10 } from "path";
19326
19518
  import { fileURLToPath as fileURLToPath3 } from "url";
19327
19519
  function decodeClaudeProjectsSlug(name2) {
19328
19520
  if (!name2 || name2 === "." || name2 === "..") {
@@ -19369,7 +19561,7 @@ async function findLikelyProjectRoot(absolutePath) {
19369
19561
  let lastCandidate = null;
19370
19562
  while (true) {
19371
19563
  for (const marker of PROJECT_HINT_MARKERS) {
19372
- if (await pathExists(join22(current, marker))) {
19564
+ if (await pathExists(join23(current, marker))) {
19373
19565
  lastCandidate = current;
19374
19566
  if (marker === ".git" || marker === ".openscout/project.json") {
19375
19567
  return current;
@@ -19392,16 +19584,16 @@ async function appendPathHint(pathLike, roots) {
19392
19584
  }
19393
19585
  function cursorWorkspaceStoragePath(home) {
19394
19586
  if (process.platform === "darwin") {
19395
- return join22(home, "Library", "Application Support", "Cursor", "User", "workspaceStorage");
19587
+ return join23(home, "Library", "Application Support", "Cursor", "User", "workspaceStorage");
19396
19588
  }
19397
19589
  if (process.platform === "win32") {
19398
19590
  const appData = process.env.APPDATA;
19399
19591
  if (appData) {
19400
- return join22(appData, "Cursor", "User", "workspaceStorage");
19592
+ return join23(appData, "Cursor", "User", "workspaceStorage");
19401
19593
  }
19402
- return join22(home, "AppData", "Roaming", "Cursor", "User", "workspaceStorage");
19594
+ return join23(home, "AppData", "Roaming", "Cursor", "User", "workspaceStorage");
19403
19595
  }
19404
- return join22(home, ".config", "Cursor", "User", "workspaceStorage");
19596
+ return join23(home, ".config", "Cursor", "User", "workspaceStorage");
19405
19597
  }
19406
19598
  function collectPathLikeStrings(value, out, depth) {
19407
19599
  if (depth > 4 || value === null || value === undefined) {
@@ -19430,7 +19622,7 @@ function collectPathLikeStrings(value, out, depth) {
19430
19622
  }
19431
19623
  }
19432
19624
  async function appendCodexHistoryPaths(home, roots) {
19433
- const candidates = [join22(home, ".codex", "history.jsonl"), join22(home, ".openai-codex", "history.jsonl")];
19625
+ const candidates = [join23(home, ".codex", "history.jsonl"), join23(home, ".openai-codex", "history.jsonl")];
19434
19626
  const maxLines = 2500;
19435
19627
  const maxBytes = 4 * 1024 * 1024;
19436
19628
  for (const filePath of candidates) {
@@ -19481,7 +19673,7 @@ async function appendCursorWorkspacePaths(home, roots) {
19481
19673
  return;
19482
19674
  }
19483
19675
  for (const id of ids) {
19484
- const workspaceJsonPath = join22(base, id, "workspace.json");
19676
+ const workspaceJsonPath = join23(base, id, "workspace.json");
19485
19677
  let raw;
19486
19678
  try {
19487
19679
  raw = await readFile7(workspaceJsonPath, "utf8");
@@ -19530,7 +19722,7 @@ async function appendCursorWorkspacePaths(home, roots) {
19530
19722
  }
19531
19723
  }
19532
19724
  async function appendClaudeProjectSlugs(home, roots) {
19533
- const projectsDir = join22(home, ".claude", "projects");
19725
+ const projectsDir = join23(home, ".claude", "projects");
19534
19726
  let names2 = [];
19535
19727
  try {
19536
19728
  names2 = await readdir2(projectsDir, { withFileTypes: false });
@@ -19546,7 +19738,7 @@ async function appendClaudeProjectSlugs(home, roots) {
19546
19738
  }
19547
19739
  }
19548
19740
  async function appendClaudeSessionPaths(home, roots) {
19549
- const projectsDir = join22(home, ".claude", "projects");
19741
+ const projectsDir = join23(home, ".claude", "projects");
19550
19742
  const maxProjectDirectories = 200;
19551
19743
  const maxSessionFiles = 400;
19552
19744
  const maxLinesPerFile = 400;
@@ -19561,7 +19753,7 @@ async function appendClaudeSessionPaths(home, roots) {
19561
19753
  for (const projectName of projectNames) {
19562
19754
  let entries = [];
19563
19755
  try {
19564
- entries = await readdir2(join22(projectsDir, projectName), { withFileTypes: false });
19756
+ entries = await readdir2(join23(projectsDir, projectName), { withFileTypes: false });
19565
19757
  } catch {
19566
19758
  continue;
19567
19759
  }
@@ -19572,7 +19764,7 @@ async function appendClaudeSessionPaths(home, roots) {
19572
19764
  if (!entry.endsWith(".jsonl")) {
19573
19765
  continue;
19574
19766
  }
19575
- const sessionPath = join22(projectsDir, projectName, entry);
19767
+ const sessionPath = join23(projectsDir, projectName, entry);
19576
19768
  let info;
19577
19769
  try {
19578
19770
  info = await stat3(sessionPath);
@@ -19614,7 +19806,7 @@ async function appendClaudeSessionPaths(home, roots) {
19614
19806
  }
19615
19807
  }
19616
19808
  async function collectUserLevelProjectRootHints(options = {}) {
19617
- const home = options.home ?? homedir18();
19809
+ const home = options.home ?? homedir19();
19618
19810
  const roots = new Set;
19619
19811
  try {
19620
19812
  await appendClaudeProjectSlugs(home, roots);
@@ -19646,10 +19838,10 @@ var init_user_project_hints = __esm(() => {
19646
19838
 
19647
19839
  // ../runtime/src/setup.ts
19648
19840
  import { execFileSync as execFileSync5 } from "child_process";
19649
- import { existsSync as existsSync22, readFileSync as readFileSync11 } from "fs";
19841
+ import { existsSync as existsSync23, readFileSync as readFileSync11 } from "fs";
19650
19842
  import { access, chmod, mkdir as mkdir7, readdir as readdir3, readFile as readFile8, realpath, rm as rm3, stat as stat4, writeFile as writeFile6 } from "fs/promises";
19651
- import { homedir as homedir19, hostname, userInfo } from "os";
19652
- import { basename as basename9, dirname as dirname13, isAbsolute as isAbsolute2, join as join23, relative as relative2, resolve as resolve11 } from "path";
19843
+ import { homedir as homedir20, hostname, userInfo } from "os";
19844
+ import { basename as basename9, dirname as dirname13, isAbsolute as isAbsolute2, join as join24, relative as relative2, resolve as resolve11 } from "path";
19653
19845
  import { fileURLToPath as fileURLToPath4 } from "url";
19654
19846
  function titleCaseWords(value) {
19655
19847
  return value.split(/[\s._-]+/).map((part) => part.trim()).filter(Boolean).map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join(" ");
@@ -19705,7 +19897,7 @@ async function matchNestedMarkers(projectRoot, nestedMarkers) {
19705
19897
  if (nestedMarkers.length === 0) {
19706
19898
  return [];
19707
19899
  }
19708
- const hits = await Promise.all(nestedMarkers.map(async (marker) => await pathExists2(join23(projectRoot, marker)) ? marker : null));
19900
+ const hits = await Promise.all(nestedMarkers.map(async (marker) => await pathExists2(join24(projectRoot, marker)) ? marker : null));
19709
19901
  return hits.filter((marker) => Boolean(marker));
19710
19902
  }
19711
19903
  function nowSeconds() {
@@ -19713,10 +19905,10 @@ function nowSeconds() {
19713
19905
  }
19714
19906
  function expandHomePath3(value) {
19715
19907
  if (value === "~") {
19716
- return homedir19();
19908
+ return homedir20();
19717
19909
  }
19718
19910
  if (value.startsWith("~/")) {
19719
- return join23(homedir19(), value.slice(2));
19911
+ return join24(homedir20(), value.slice(2));
19720
19912
  }
19721
19913
  return value;
19722
19914
  }
@@ -19754,6 +19946,9 @@ function normalizeManagedHarness(value, fallback) {
19754
19946
  if (value === "cursor") {
19755
19947
  return "cursor";
19756
19948
  }
19949
+ if (value === "devin") {
19950
+ return "devin";
19951
+ }
19757
19952
  if (value === "grok") {
19758
19953
  return "grok";
19759
19954
  }
@@ -19823,16 +20018,16 @@ function resolveTelegramConfigSeedValue(key, currentDirectory) {
19823
20018
  return envValue;
19824
20019
  }
19825
20020
  if (currentDirectory) {
19826
- const currentDirValue = readEnvFileValue(join23(currentDirectory, ".env.local"), key).trim();
20021
+ const currentDirValue = readEnvFileValue(join24(currentDirectory, ".env.local"), key).trim();
19827
20022
  if (currentDirValue) {
19828
20023
  return currentDirValue;
19829
20024
  }
19830
20025
  }
19831
- const home = homedir19();
20026
+ const home = homedir20();
19832
20027
  if (!home) {
19833
20028
  return "";
19834
20029
  }
19835
- return readEnvFileValue(join23(home, ".env.local"), key).trim();
20030
+ return readEnvFileValue(join24(home, ".env.local"), key).trim();
19836
20031
  }
19837
20032
  function normalizeTelegramBridgeMode(value) {
19838
20033
  const normalized = typeof value === "string" ? value.trim().toLowerCase() : "";
@@ -19875,7 +20070,7 @@ function readNodeAliasSync() {
19875
20070
  }
19876
20071
  }
19877
20072
  function readGitHeadBranch(projectRoot) {
19878
- const dotGitPath = join23(projectRoot, ".git");
20073
+ const dotGitPath = join24(projectRoot, ".git");
19879
20074
  let gitDirectory = dotGitPath;
19880
20075
  try {
19881
20076
  const marker = readFileSync11(dotGitPath, "utf8");
@@ -19885,7 +20080,7 @@ function readGitHeadBranch(projectRoot) {
19885
20080
  gitDirectory = isAbsolute2(match[1]) ? match[1] : resolve11(projectRoot, match[1]);
19886
20081
  } catch {}
19887
20082
  try {
19888
- const head = readFileSync11(join23(gitDirectory, "HEAD"), "utf8").trim();
20083
+ const head = readFileSync11(join24(gitDirectory, "HEAD"), "utf8").trim();
19889
20084
  const match = /^ref:\s*refs\/heads\/(.+)$/u.exec(head);
19890
20085
  return { found: true, branch: match?.[1]?.trim() || null };
19891
20086
  } catch {
@@ -19972,6 +20167,9 @@ function normalizeTransport(value, harness, fallback) {
19972
20167
  if (harness === "cursor") {
19973
20168
  return "cursor_acp";
19974
20169
  }
20170
+ if (harness === "devin") {
20171
+ return "devin_acp";
20172
+ }
19975
20173
  if (harness === "opencode") {
19976
20174
  return "opencode_acp";
19977
20175
  }
@@ -19987,7 +20185,7 @@ function normalizeTransport(value, harness, fallback) {
19987
20185
  if (value === "pi_rpc") {
19988
20186
  return "pi_rpc";
19989
20187
  }
19990
- if (value === "grok_acp" || value === "kimi_acp" || value === "cursor_acp" || value === "opencode_acp") {
20188
+ if (value === "grok_acp" || value === "kimi_acp" || value === "cursor_acp" || value === "opencode_acp" || value === "devin_acp") {
19991
20189
  return value;
19992
20190
  }
19993
20191
  if (value === "cursor_exec") {
@@ -20168,13 +20366,13 @@ function defaultSettings() {
20168
20366
  };
20169
20367
  }
20170
20368
  function projectConfigPath(projectRoot) {
20171
- return join23(projectRoot, ".openscout", "project.json");
20369
+ return join24(projectRoot, ".openscout", "project.json");
20172
20370
  }
20173
20371
  function projectGitignorePath(projectRoot) {
20174
- return join23(projectRoot, ".gitignore");
20372
+ return join24(projectRoot, ".gitignore");
20175
20373
  }
20176
20374
  function legacyLocalRelayLinkPath(projectRoot) {
20177
- return join23(projectRoot, ".openscout", "relay.json");
20375
+ return join24(projectRoot, ".openscout", "relay.json");
20178
20376
  }
20179
20377
  async function pathExists2(filePath) {
20180
20378
  try {
@@ -20205,10 +20403,10 @@ async function writeJsonFile(filePath, value) {
20205
20403
  `, "utf8");
20206
20404
  }
20207
20405
  function codexEnvironmentPath(projectRoot) {
20208
- return join23(projectRoot, ".codex", "environments", "environment.toml");
20406
+ return join24(projectRoot, ".codex", "environments", "environment.toml");
20209
20407
  }
20210
20408
  function currentHomeDirectory() {
20211
- return process.env.HOME?.trim() || homedir19();
20409
+ return process.env.HOME?.trim() || homedir20();
20212
20410
  }
20213
20411
  function normalizeProjectScriptSet(value) {
20214
20412
  if (typeof value !== "object" || !value) {
@@ -20364,11 +20562,11 @@ async function readCodexEnvironmentImport(projectRoot) {
20364
20562
  }
20365
20563
  async function readClaudeProjectImport(projectRoot) {
20366
20564
  const slug = encodeClaudeProjectsSlug(projectRoot);
20367
- const sourcePath = join23(currentHomeDirectory(), ".claude", "projects", slug);
20565
+ const sourcePath = join24(currentHomeDirectory(), ".claude", "projects", slug);
20368
20566
  if (!await isDirectory(sourcePath)) {
20369
20567
  return null;
20370
20568
  }
20371
- const memoryPath = await pathExists2(join23(sourcePath, "memory", "MEMORY.md")) ? join23(sourcePath, "memory", "MEMORY.md") : undefined;
20569
+ const memoryPath = await pathExists2(join24(sourcePath, "memory", "MEMORY.md")) ? join24(sourcePath, "memory", "MEMORY.md") : undefined;
20372
20570
  let entries = [];
20373
20571
  try {
20374
20572
  entries = await readdir3(sourcePath, { withFileTypes: false });
@@ -20383,7 +20581,7 @@ async function readClaudeProjectImport(projectRoot) {
20383
20581
  continue;
20384
20582
  }
20385
20583
  sessionCount += 1;
20386
- const sessionPath = join23(sourcePath, entry);
20584
+ const sessionPath = join24(sourcePath, entry);
20387
20585
  let body;
20388
20586
  try {
20389
20587
  body = await readFile8(sessionPath, "utf8");
@@ -20498,17 +20696,18 @@ async function ensureProjectConfigIgnored(projectRoot) {
20498
20696
  }
20499
20697
  async function readLegacyRelayConfig() {
20500
20698
  const relayHub = resolveOpenScoutSupportPaths().relayHubDirectory;
20501
- return readJsonFile(join23(relayHub, "config.json"));
20699
+ return readJsonFile(join24(relayHub, "config.json"));
20502
20700
  }
20503
20701
  async function readLegacyAgentRegistry() {
20504
20702
  const relayHub = resolveOpenScoutSupportPaths().relayHubDirectory;
20505
- return await readJsonFile(join23(relayHub, "agents.json")) ?? {};
20703
+ return await readJsonFile(join24(relayHub, "agents.json")) ?? {};
20506
20704
  }
20507
20705
  async function detectHarnessMarkers(projectRoot) {
20508
20706
  const detected = {
20509
20707
  claude: [],
20510
20708
  codex: [],
20511
20709
  cursor: [],
20710
+ devin: [],
20512
20711
  grok: [],
20513
20712
  "grok-acp": [],
20514
20713
  kimi: [],
@@ -20517,7 +20716,7 @@ async function detectHarnessMarkers(projectRoot) {
20517
20716
  };
20518
20717
  for (const harness of MANAGED_AGENT_HARNESSES) {
20519
20718
  for (const marker of PROJECT_HARNESS_MARKERS[harness]) {
20520
- if (await pathExists2(join23(projectRoot, marker))) {
20719
+ if (await pathExists2(join24(projectRoot, marker))) {
20521
20720
  detected[harness].push(marker);
20522
20721
  }
20523
20722
  }
@@ -20681,7 +20880,7 @@ async function seedWorkspaceRoots(options) {
20681
20880
  }
20682
20881
  }
20683
20882
  if (roots.size === 0) {
20684
- roots.add(join23(homedir19(), "dev"));
20883
+ roots.add(join24(homedir20(), "dev"));
20685
20884
  }
20686
20885
  return Array.from(roots);
20687
20886
  }
@@ -20783,10 +20982,10 @@ async function findNearestProjectRoot(startDirectory) {
20783
20982
  let current = normalizePath(startDirectory);
20784
20983
  let lastCandidate = null;
20785
20984
  while (true) {
20786
- if (await pathExists2(join23(current, ".git"))) {
20985
+ if (await pathExists2(join24(current, ".git"))) {
20787
20986
  return current;
20788
20987
  }
20789
- if (await pathExists2(projectConfigPath(current)) || await pathExists2(join23(current, "package.json")) || await pathExists2(join23(current, "AGENTS.md")) || await pathExists2(join23(current, "CLAUDE.md"))) {
20988
+ if (await pathExists2(projectConfigPath(current)) || await pathExists2(join24(current, "package.json")) || await pathExists2(join24(current, "AGENTS.md")) || await pathExists2(join24(current, "CLAUDE.md"))) {
20790
20989
  lastCandidate = current;
20791
20990
  }
20792
20991
  const parent = dirname13(current);
@@ -20970,7 +21169,7 @@ async function scanSourceRoot(sourceRoot) {
20970
21169
  if (PROJECT_SCAN_SKIP_DIRECTORIES.has(entry.name)) {
20971
21170
  continue;
20972
21171
  }
20973
- const nextPath = join23(currentDirectory, entry.name);
21172
+ const nextPath = join24(currentDirectory, entry.name);
20974
21173
  if (entry.isSymbolicLink()) {
20975
21174
  if (!await isDirectory(nextPath)) {
20976
21175
  continue;
@@ -21011,7 +21210,7 @@ function relativeProjectPath(projectRoot, sourceRoot) {
21011
21210
  return relative2(sourceRoot, projectRoot) || ".";
21012
21211
  }
21013
21212
  function resolveProjectRootFromConfig(projectRoot, config) {
21014
- return normalizePath(join23(projectRoot, config.project.root ?? "."));
21213
+ return normalizePath(join24(projectRoot, config.project.root ?? "."));
21015
21214
  }
21016
21215
  function mergeResolvedAgentConfig(base, override, settings) {
21017
21216
  if (!override) {
@@ -21204,7 +21403,7 @@ async function resolveInferredAgent(projectRoot, settings, override) {
21204
21403
  return mergeResolvedAgentConfig(base, override, settings);
21205
21404
  }
21206
21405
  async function buildProjectInventoryEntry(agent, sourceRoot) {
21207
- const manifestRoot = agent.projectConfigPath ? normalizePath(join23(dirname13(agent.projectConfigPath), "..")) : null;
21406
+ const manifestRoot = agent.projectConfigPath ? normalizePath(join24(dirname13(agent.projectConfigPath), "..")) : null;
21208
21407
  const manifest = manifestRoot ? await readProjectConfig(manifestRoot) : null;
21209
21408
  const markers = await detectHarnessMarkers(agent.projectRoot);
21210
21409
  const harnesses = new Map;
@@ -21313,7 +21512,7 @@ async function loadResolvedRelayAgents(options = {}) {
21313
21512
  const sourceRootByProject = new Map(workspaceCandidates.map((candidate) => [candidate.projectRoot, candidate.sourceRoot]));
21314
21513
  if (process.env.OPENSCOUT_SKIP_USER_PROJECT_HINTS !== "1") {
21315
21514
  try {
21316
- const hintHome = options.userLevelHintsHome ?? homedir19();
21515
+ const hintHome = options.userLevelHintsHome ?? homedir20();
21317
21516
  const userHints = await collectUserLevelProjectRootHints({ home: hintHome });
21318
21517
  for (const hint of userHints) {
21319
21518
  const normalized = normalizePath(hint);
@@ -21502,7 +21701,7 @@ var init_setup = __esm(() => {
21502
21701
  init_open_scout_network();
21503
21702
  init_support_paths();
21504
21703
  init_user_project_hints();
21505
- MANAGED_AGENT_HARNESSES = ["claude", "codex", "cursor", "grok", "grok-acp", "kimi", "pi", "opencode"];
21704
+ MANAGED_AGENT_HARNESSES = ["claude", "codex", "cursor", "devin", "grok", "grok-acp", "kimi", "pi", "opencode"];
21506
21705
  DEFAULT_OPERATOR_NAME = guessedOperatorName();
21507
21706
  DEFAULT_CAPABILITIES = ["chat", "invoke", "deliver"];
21508
21707
  PROJECT_SCAN_SKIP_DIRECTORIES = new Set([
@@ -21591,6 +21790,9 @@ var init_setup = __esm(() => {
21591
21790
  ".cursor",
21592
21791
  ".cursorrules"
21593
21792
  ],
21793
+ devin: [
21794
+ ".devin"
21795
+ ],
21594
21796
  grok: [
21595
21797
  "AGENTS.md",
21596
21798
  "Grok.md",
@@ -21682,17 +21884,17 @@ var init_local_agent_template = __esm(() => {
21682
21884
  });
21683
21885
 
21684
21886
  // ../runtime/src/relay-agent-process-leases.ts
21685
- import { existsSync as existsSync23, mkdirSync as mkdirSync7, readdirSync as readdirSync3, readFileSync as readFileSync12, rmSync as rmSync4, writeFileSync as writeFileSync7 } from "fs";
21686
- import { join as join24 } from "path";
21887
+ import { existsSync as existsSync24, mkdirSync as mkdirSync7, readdirSync as readdirSync3, readFileSync as readFileSync12, rmSync as rmSync4, writeFileSync as writeFileSync7 } from "fs";
21888
+ import { join as join25 } from "path";
21687
21889
  function processLeasesDirectory() {
21688
- return join24(resolveOpenScoutSupportPaths().runtimeDirectory, "process-leases");
21890
+ return join25(resolveOpenScoutSupportPaths().runtimeDirectory, "process-leases");
21689
21891
  }
21690
21892
  function leaseFileName(sessionName) {
21691
21893
  const safe = sessionName.trim().replace(/[^\w.-]+/g, "-");
21692
21894
  return `${RELAY_AGENT_PROCESS_LEASE_PREFIX}${safe}.json`;
21693
21895
  }
21694
21896
  function relayAgentProcessLeasePath(sessionName) {
21695
- return join24(processLeasesDirectory(), leaseFileName(sessionName));
21897
+ return join25(processLeasesDirectory(), leaseFileName(sessionName));
21696
21898
  }
21697
21899
  function writeRelayAgentProcessLease(lease) {
21698
21900
  assertTestIsolatedUserData("write a relay-agent process lease", "OPENSCOUT_SUPPORT_DIRECTORY");
@@ -21717,9 +21919,9 @@ var init_relay_agent_process_leases = __esm(() => {
21717
21919
  });
21718
21920
 
21719
21921
  // ../runtime/src/relay-agent-watchdog.ts
21720
- import { dirname as dirname14, join as join25 } from "path";
21922
+ import { dirname as dirname14, join as join26 } from "path";
21721
21923
  function brokerRuntimeHeartbeatPath() {
21722
- return join25(resolveOpenScoutSupportPaths().runtimeDirectory, BROKER_RUNTIME_HEARTBEAT_FILENAME);
21924
+ return join26(resolveOpenScoutSupportPaths().runtimeDirectory, BROKER_RUNTIME_HEARTBEAT_FILENAME);
21723
21925
  }
21724
21926
  function resolveRelayAgentOrphanGraceMs(env = process.env) {
21725
21927
  const raw = env.OPENSCOUT_RELAY_AGENT_ORPHAN_GRACE_MS?.trim();
@@ -21834,11 +22036,11 @@ var init_permission_policy2 = __esm(() => {
21834
22036
  });
21835
22037
 
21836
22038
  // ../runtime/src/user-config.ts
21837
- import { existsSync as existsSync24, readFileSync as readFileSync13, statSync as statSync6, writeFileSync as writeFileSync8, mkdirSync as mkdirSync8 } from "fs";
21838
- import { homedir as homedir20 } from "os";
21839
- import { dirname as dirname15, join as join26 } from "path";
22039
+ import { existsSync as existsSync25, readFileSync as readFileSync13, statSync as statSync6, writeFileSync as writeFileSync8, mkdirSync as mkdirSync8 } from "fs";
22040
+ import { homedir as homedir21 } from "os";
22041
+ import { dirname as dirname15, join as join27 } from "path";
21840
22042
  function userConfigPath() {
21841
- return join26(process.env.OPENSCOUT_HOME ?? join26(homedir20(), ".openscout"), "user.json");
22043
+ return join27(process.env.OPENSCOUT_HOME ?? join27(homedir21(), ".openscout"), "user.json");
21842
22044
  }
21843
22045
  function userConfigFileKey(configPath) {
21844
22046
  try {
@@ -21851,7 +22053,7 @@ function userConfigFileKey(configPath) {
21851
22053
  function readUserConfigFromDisk(configPath, now) {
21852
22054
  const fileKey = userConfigFileKey(configPath);
21853
22055
  let value = {};
21854
- if (existsSync24(configPath)) {
22056
+ if (existsSync25(configPath)) {
21855
22057
  try {
21856
22058
  value = JSON.parse(readFileSync13(configPath, "utf8"));
21857
22059
  } catch {
@@ -21876,7 +22078,7 @@ function loadUserConfig(now = Date.now()) {
21876
22078
  }
21877
22079
  function readSettingsOperatorName() {
21878
22080
  const settingsPath = resolveOpenScoutSupportPaths().settingsPath;
21879
- if (!existsSync24(settingsPath))
22081
+ if (!existsSync25(settingsPath))
21880
22082
  return "";
21881
22083
  try {
21882
22084
  const settings = JSON.parse(readFileSync13(settingsPath, "utf8"));
@@ -21903,9 +22105,9 @@ var init_user_config = __esm(() => {
21903
22105
  });
21904
22106
 
21905
22107
  // ../runtime/src/local-agents.ts
21906
- import { existsSync as existsSync25, readFileSync as readFileSync14 } from "fs";
22108
+ import { existsSync as existsSync26, readFileSync as readFileSync14 } from "fs";
21907
22109
  import { mkdir as mkdir8, readFile as readFile9, rm as rm4, stat as stat5, writeFile as writeFile7 } from "fs/promises";
21908
- import { dirname as dirname16, join as join27, resolve as resolve12 } from "path";
22110
+ import { dirname as dirname16, join as join28, resolve as resolve12 } from "path";
21909
22111
  import { fileURLToPath as fileURLToPath5 } from "url";
21910
22112
  function resolveRelayHub() {
21911
22113
  return resolveOpenScoutSupportPaths().relayHubDirectory;
@@ -21916,7 +22118,7 @@ function resolveProjectsRoot(projectPath) {
21916
22118
  }
21917
22119
  try {
21918
22120
  const supportPaths = resolveOpenScoutSupportPaths();
21919
- if (!existsSync25(supportPaths.settingsPath)) {
22121
+ if (!existsSync26(supportPaths.settingsPath)) {
21920
22122
  return dirname16(projectPath);
21921
22123
  }
21922
22124
  const raw = JSON.parse(readFileSync14(supportPaths.settingsPath, "utf8"));
@@ -21940,27 +22142,30 @@ function parseNonNegativeInteger(value, fallback) {
21940
22142
  const parsed = Number.parseInt(value ?? "", 10);
21941
22143
  return Number.isFinite(parsed) && parsed >= 0 ? parsed : fallback;
21942
22144
  }
21943
- function scoutCliPath() {
21944
- return join27(OPENSCOUT_REPO_ROOT, "packages", "cli", "bin", "scout.mjs");
22145
+ function resolveLocalAgentScoutCliPath(moduleDirectory = MODULE_DIRECTORY) {
22146
+ const packagedCli = resolve12(moduleDirectory, "..", "..", "bin", "scout.mjs");
22147
+ if (existsSync26(packagedCli))
22148
+ return packagedCli;
22149
+ return resolve12(moduleDirectory, "..", "..", "..", "packages", "cli", "bin", "scout.mjs");
21945
22150
  }
21946
22151
  function legacyNodeBrokerRelayCommand() {
21947
- return `node ${JSON.stringify(scoutCliPath())}`;
22152
+ return `node ${JSON.stringify(resolveLocalAgentScoutCliPath())}`;
21948
22153
  }
21949
22154
  function brokerRelayCommand() {
21950
- return `bun ${JSON.stringify(scoutCliPath())}`;
22155
+ return `bun ${JSON.stringify(resolveLocalAgentScoutCliPath())}`;
21951
22156
  }
21952
22157
  function titleCaseLocalAgentName(value) {
21953
22158
  return value.split(/[-_.\s]+/).filter(Boolean).map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1)).join(" ");
21954
22159
  }
21955
22160
  function resolveScoutSkillPath() {
21956
22161
  const candidatePaths = [
21957
- join27(OPENSCOUT_REPO_ROOT, ".agents", "skills", "scout", "SKILL.md"),
21958
- join27(process.env.HOME ?? "", ".agents", "skills", "scout", "SKILL.md"),
21959
- join27(OPENSCOUT_REPO_ROOT, ".agents", "skills", "relay-agent-comms", "SKILL.md"),
21960
- join27(process.env.HOME ?? "", ".agents", "skills", "relay-agent-comms", "SKILL.md")
22162
+ join28(OPENSCOUT_REPO_ROOT, ".agents", "skills", "scout", "SKILL.md"),
22163
+ join28(process.env.HOME ?? "", ".agents", "skills", "scout", "SKILL.md"),
22164
+ join28(OPENSCOUT_REPO_ROOT, ".agents", "skills", "relay-agent-comms", "SKILL.md"),
22165
+ join28(process.env.HOME ?? "", ".agents", "skills", "relay-agent-comms", "SKILL.md")
21961
22166
  ];
21962
22167
  for (const path2 of candidatePaths) {
21963
- if (existsSync25(path2)) {
22168
+ if (existsSync26(path2)) {
21964
22169
  return path2;
21965
22170
  }
21966
22171
  }
@@ -22157,7 +22362,7 @@ function renderLocalAgentSystemPromptTemplate(template, context, options = {}) {
22157
22362
  const basePrompt = buildLocalAgentBasePrompt(context);
22158
22363
  const projectContext = buildLocalAgentProjectContextPrompt(context);
22159
22364
  const collaborationPrompt = buildLocalAgentCollaborationPrompt(context);
22160
- const protocolPrompt = options.transport === "codex_app_server" || options.transport === "claude_stream_json" || options.transport === "pi_rpc" || options.transport === "grok_acp" || options.transport === "kimi_acp" ? buildLocalAgentDirectProtocolPrompt(context) : buildLocalAgentTmuxProtocolPrompt(context);
22365
+ const protocolPrompt = options.transport === "codex_app_server" || options.transport === "claude_stream_json" || options.transport === "pi_rpc" || options.transport === "grok_acp" || options.transport === "kimi_acp" || options.transport === "devin_acp" ? buildLocalAgentDirectProtocolPrompt(context) : buildLocalAgentTmuxProtocolPrompt(context);
22161
22366
  const variables = {
22162
22367
  agent_id: context.agentId,
22163
22368
  display_name: context.displayName,
@@ -22269,7 +22474,8 @@ function generatedLocalAgentSystemPromptCandidates(agentId, projectName, project
22269
22474
  "claude_stream_json",
22270
22475
  "pi_rpc",
22271
22476
  "grok_acp",
22272
- "kimi_acp"
22477
+ "kimi_acp",
22478
+ "devin_acp"
22273
22479
  ];
22274
22480
  const candidates = new Set;
22275
22481
  for (const relayCommand of relayCommands) {
@@ -22322,7 +22528,7 @@ function expandHomePath4(value) {
22322
22528
  return process.env.HOME ?? process.cwd();
22323
22529
  }
22324
22530
  if (value.startsWith("~/")) {
22325
- return join27(process.env.HOME ?? process.cwd(), value.slice(2));
22531
+ return join28(process.env.HOME ?? process.cwd(), value.slice(2));
22326
22532
  }
22327
22533
  return value;
22328
22534
  }
@@ -22346,7 +22552,7 @@ function normalizeTmuxSessionName2(value, agentId) {
22346
22552
  return normalized || fallback.replace(/[^\w-]+/g, "-").replace(/^-+|-+$/g, "") || "relay-agent";
22347
22553
  }
22348
22554
  function normalizeLocalAgentHarness(value) {
22349
- if (value === "codex" || value === "claude" || value === "grok" || value === "grok-acp" || value === "kimi" || value === "pi" || value === "cursor") {
22555
+ if (value === "codex" || value === "claude" || value === "grok" || value === "grok-acp" || value === "kimi" || value === "pi" || value === "cursor" || value === "devin") {
22350
22556
  return value;
22351
22557
  }
22352
22558
  return DEFAULT_LOCAL_AGENT_HARNESS;
@@ -22361,6 +22567,9 @@ function normalizeLocalAgentTransport(value, harness) {
22361
22567
  if (harness === "cursor") {
22362
22568
  return "cursor_acp";
22363
22569
  }
22570
+ if (harness === "devin") {
22571
+ return "devin_acp";
22572
+ }
22364
22573
  if (harness === "grok-acp") {
22365
22574
  return "grok_acp";
22366
22575
  }
@@ -22376,7 +22585,7 @@ function normalizeLocalAgentTransport(value, harness) {
22376
22585
  if (value === "pi_rpc") {
22377
22586
  return "pi_rpc";
22378
22587
  }
22379
- if (value === "grok_acp" || value === "kimi_acp" || value === "cursor_acp" || value === "opencode_acp") {
22588
+ if (value === "grok_acp" || value === "kimi_acp" || value === "cursor_acp" || value === "opencode_acp" || value === "devin_acp") {
22380
22589
  return value;
22381
22590
  }
22382
22591
  if (value === "cursor_exec") {
@@ -22739,7 +22948,7 @@ function overrideHarnessProfile(override, harness) {
22739
22948
  };
22740
22949
  }
22741
22950
  function normalizeManagedHarness2(value, fallback) {
22742
- return value === "codex" ? "codex" : value === "claude" ? "claude" : value === "cursor" ? "cursor" : value === "grok" ? "grok" : value === "grok-acp" ? "grok-acp" : value === "kimi" ? "kimi" : value === "pi" ? "pi" : fallback;
22951
+ return value === "codex" ? "codex" : value === "claude" ? "claude" : value === "cursor" ? "cursor" : value === "devin" ? "devin" : value === "grok" ? "grok" : value === "grok-acp" ? "grok-acp" : value === "kimi" ? "kimi" : value === "pi" ? "pi" : fallback;
22743
22952
  }
22744
22953
  function normalizeLocalHarnessProfiles(agentId, record) {
22745
22954
  const defaultHarness = normalizeManagedHarness2(typeof record.defaultHarness === "string" ? record.defaultHarness : record.harness, "claude");
@@ -23341,7 +23550,7 @@ function isLocalAgentRecordOnline(agentName, record) {
23341
23550
  if (normalizedRecord.transport === "pi_rpc") {
23342
23551
  return isPiRpcAgentAlive(buildPiAgentSessionOptions(agentName, normalizedRecord));
23343
23552
  }
23344
- if (normalizedRecord.transport === "grok_acp" || normalizedRecord.transport === "kimi_acp" || normalizedRecord.transport === "cursor_acp" || normalizedRecord.transport === "opencode_acp") {
23553
+ if (normalizedRecord.transport === "grok_acp" || normalizedRecord.transport === "kimi_acp" || normalizedRecord.transport === "cursor_acp" || normalizedRecord.transport === "opencode_acp" || normalizedRecord.transport === "devin_acp") {
23345
23554
  return areHarnessBinariesAvailable(normalizedRecord);
23346
23555
  }
23347
23556
  return isLocalAgentSessionAlive(normalizedRecord.tmuxSession);
@@ -23362,7 +23571,7 @@ function buildLocalAgentInitialMessage(projectName, agentName) {
23362
23571
  return `You are now online as the ${agentName} relay agent for ${projectName}. Announce yourself on the relay with: ${brokerRelayCommand()} send --as ${agentName} "relay agent online \u2014 ready to assist with ${projectName}"`;
23363
23572
  }
23364
23573
  function scoutReplyContextPath(runtimeDirectory) {
23365
- return join27(runtimeDirectory, "scout-reply-context.json");
23574
+ return join28(runtimeDirectory, "scout-reply-context.json");
23366
23575
  }
23367
23576
  function withScoutReplyContextEnvironment(options) {
23368
23577
  return {
@@ -23469,10 +23678,10 @@ function buildLocalAgentLaunchCommand(agentName, record, projectPath, promptFile
23469
23678
  const harness = normalizeLocalAgentHarness(record.harness);
23470
23679
  const extraArgs = shellQuoteArguments(harness === "claude" ? normalizeClaudeRuntimeLaunchArgs(record.launchArgs) : harness === "grok" ? normalizeGrokRuntimeLaunchArgs(record.launchArgs) : normalizeLaunchArgsForHarness(harness, record.launchArgs));
23471
23680
  if (harness === "codex") {
23472
- return `exec bash ${JSON.stringify(workerScript ?? join27(relayAgentRuntimeDirectory(agentName), "codex-worker.sh"))}`;
23681
+ return `exec bash ${JSON.stringify(workerScript ?? join28(relayAgentRuntimeDirectory(agentName), "codex-worker.sh"))}`;
23473
23682
  }
23474
23683
  if (harness === "pi") {
23475
- const sessionDir = join27(relayAgentRuntimeDirectory(agentName), "pi-sessions");
23684
+ const sessionDir = join28(relayAgentRuntimeDirectory(agentName), "pi-sessions");
23476
23685
  return [
23477
23686
  "exec pi",
23478
23687
  `--append-system-prompt "$(cat ${JSON.stringify(promptFile)})"`,
@@ -23512,12 +23721,12 @@ function isShellCommandAvailable(binary) {
23512
23721
  if (!binary.trim())
23513
23722
  return false;
23514
23723
  if (binary.includes("/"))
23515
- return existsSync25(binary);
23724
+ return existsSync26(binary);
23516
23725
  const pathValue = process.env.PATH ?? "";
23517
23726
  for (const directory of pathValue.split(":")) {
23518
23727
  if (!directory)
23519
23728
  continue;
23520
- if (existsSync25(join27(directory, binary)))
23729
+ if (existsSync26(join28(directory, binary)))
23521
23730
  return true;
23522
23731
  }
23523
23732
  return false;
@@ -23557,6 +23766,8 @@ function areHarnessBinariesAvailable(record) {
23557
23766
  binaries.add("cursor-agent");
23558
23767
  if (record.transport === "opencode_acp")
23559
23768
  binaries.add("opencode");
23769
+ if (record.transport === "devin_acp")
23770
+ binaries.add("devin");
23560
23771
  if (record.transport === "tmux") {
23561
23772
  binaries.add("tmux");
23562
23773
  }
@@ -23587,7 +23798,7 @@ async function ensureLocalAgentOnline(agentName, record) {
23587
23798
  async function ensureLocalAgentOnlineOnce(agentName, record) {
23588
23799
  const normalizedRecord = normalizeLocalAgentRecord(agentName, record);
23589
23800
  if (isLocalAgentRecordOnline(agentName, normalizedRecord)) {
23590
- if (normalizedRecord.transport === "grok_acp" || normalizedRecord.transport === "kimi_acp") {
23801
+ if (normalizedRecord.transport === "grok_acp" || normalizedRecord.transport === "kimi_acp" || normalizedRecord.transport === "devin_acp") {
23591
23802
  const registry3 = await readLocalAgentRegistry();
23592
23803
  registry3[agentName] = {
23593
23804
  ...normalizedRecord,
@@ -23612,7 +23823,7 @@ async function ensureLocalAgentOnlineOnce(agentName, record) {
23612
23823
  await mkdir8(agentRuntimeDir, { recursive: true });
23613
23824
  await mkdir8(logsDir, { recursive: true });
23614
23825
  if (normalizedRecord.transport === "codex_app_server") {
23615
- await writeFile7(join27(agentRuntimeDir, "prompt.txt"), systemPrompt);
23826
+ await writeFile7(join28(agentRuntimeDir, "prompt.txt"), systemPrompt);
23616
23827
  await ensureCodexAppServerAgentOnline(buildCodexAgentSessionOptions(agentName, normalizedRecord, systemPrompt));
23617
23828
  const registry3 = await readLocalAgentRegistry();
23618
23829
  registry3[agentName] = {
@@ -23624,7 +23835,7 @@ async function ensureLocalAgentOnlineOnce(agentName, record) {
23624
23835
  return registry3[agentName];
23625
23836
  }
23626
23837
  if (normalizedRecord.transport === "claude_stream_json") {
23627
- await writeFile7(join27(agentRuntimeDir, "prompt.txt"), systemPrompt);
23838
+ await writeFile7(join28(agentRuntimeDir, "prompt.txt"), systemPrompt);
23628
23839
  await ensureClaudeStreamJsonAgentOnline(buildClaudeAgentSessionOptions(agentName, normalizedRecord, systemPrompt));
23629
23840
  const registry3 = await readLocalAgentRegistry();
23630
23841
  registry3[agentName] = {
@@ -23636,7 +23847,7 @@ async function ensureLocalAgentOnlineOnce(agentName, record) {
23636
23847
  return registry3[agentName];
23637
23848
  }
23638
23849
  if (normalizedRecord.transport === "pi_rpc") {
23639
- await writeFile7(join27(agentRuntimeDir, "prompt.txt"), systemPrompt);
23850
+ await writeFile7(join28(agentRuntimeDir, "prompt.txt"), systemPrompt);
23640
23851
  await ensurePiRpcAgentOnline(buildPiAgentSessionOptions(agentName, normalizedRecord, systemPrompt));
23641
23852
  const registry3 = await readLocalAgentRegistry();
23642
23853
  registry3[agentName] = {
@@ -23653,17 +23864,17 @@ async function ensureLocalAgentOnlineOnce(agentName, record) {
23653
23864
  }
23654
23865
  const initialMessage = buildLocalAgentInitialMessage(projectName, agentName);
23655
23866
  const bootstrapPrompt = buildLocalAgentBootstrapPrompt(normalizeLocalAgentHarness(normalizedRecord.harness), systemPrompt, initialMessage);
23656
- const queueDirectory = join27(agentRuntimeDir, "queue");
23657
- const processingDirectory = join27(queueDirectory, "processing");
23658
- const processedDirectory = join27(queueDirectory, "processed");
23659
- const promptFile = join27(agentRuntimeDir, "prompt.txt");
23660
- const initialFile = join27(agentRuntimeDir, "initial.txt");
23661
- const launchScript = join27(agentRuntimeDir, "launch.sh");
23662
- const workerScript = join27(agentRuntimeDir, "codex-worker.sh");
23663
- const codexSessionIdFile = join27(agentRuntimeDir, "codex-session-id.txt");
23664
- const stateFile = join27(agentRuntimeDir, "state.json");
23665
- const stdoutLogFile = join27(logsDir, "stdout.log");
23666
- const stderrLogFile = join27(logsDir, "stderr.log");
23867
+ const queueDirectory = join28(agentRuntimeDir, "queue");
23868
+ const processingDirectory = join28(queueDirectory, "processing");
23869
+ const processedDirectory = join28(queueDirectory, "processed");
23870
+ const promptFile = join28(agentRuntimeDir, "prompt.txt");
23871
+ const initialFile = join28(agentRuntimeDir, "initial.txt");
23872
+ const launchScript = join28(agentRuntimeDir, "launch.sh");
23873
+ const workerScript = join28(agentRuntimeDir, "codex-worker.sh");
23874
+ const codexSessionIdFile = join28(agentRuntimeDir, "codex-session-id.txt");
23875
+ const stateFile = join28(agentRuntimeDir, "state.json");
23876
+ const stdoutLogFile = join28(logsDir, "stdout.log");
23877
+ const stderrLogFile = join28(logsDir, "stderr.log");
23667
23878
  await writeFile7(promptFile, systemPrompt);
23668
23879
  await writeFile7(initialFile, bootstrapPrompt);
23669
23880
  await writeFile7(stderrLogFile, "");
@@ -23768,7 +23979,7 @@ async function ensureLocalAgentOnlineOnce(agentName, record) {
23768
23979
  }
23769
23980
  }
23770
23981
  if (!sessionOnline) {
23771
- const stderrTail = existsSync25(stderrLogFile) ? readFileSync14(stderrLogFile, "utf8").trim().split(/\r?\n/).slice(-10).join(`
23982
+ const stderrTail = existsSync26(stderrLogFile) ? readFileSync14(stderrLogFile, "utf8").trim().split(/\r?\n/).slice(-10).join(`
23772
23983
  `).trim() : "";
23773
23984
  throw new Error(stderrTail ? `Relay agent ${agentName} failed to stay online:
23774
23985
  ${redactSecrets(stderrTail)}` : `Relay agent ${agentName} failed to stay online.`);
@@ -23831,10 +24042,10 @@ async function restartLocalAgent(agentId, options = {}) {
23831
24042
  sessionId: sessionName
23832
24043
  });
23833
24044
  }
23834
- } else if (normalizedRecord.transport === "grok_acp" || normalizedRecord.transport === "kimi_acp") {
24045
+ } else if (normalizedRecord.transport === "grok_acp" || normalizedRecord.transport === "kimi_acp" || normalizedRecord.transport === "devin_acp") {
23835
24046
  for (const sessionName of sessionsToStop) {
23836
24047
  await shutdownAcpAgentSession({
23837
- adapterType: normalizedRecord.transport === "grok_acp" ? "grok-acp" : "kimi-acp",
24048
+ adapterType: normalizedRecord.transport === "grok_acp" ? "grok-acp" : normalizedRecord.transport === "devin_acp" ? "devin-acp" : "kimi-acp",
23838
24049
  sessionId: sessionName,
23839
24050
  poolKey: localAgentAcpPoolKey(agentId, normalizedRecord)
23840
24051
  });
@@ -24107,10 +24318,10 @@ async function stopLocalAgent(agentId) {
24107
24318
  sessionId: sessionName
24108
24319
  });
24109
24320
  }
24110
- } else if (normalizedRecord.transport === "grok_acp" || normalizedRecord.transport === "kimi_acp") {
24321
+ } else if (normalizedRecord.transport === "grok_acp" || normalizedRecord.transport === "kimi_acp" || normalizedRecord.transport === "devin_acp") {
24111
24322
  for (const sessionName of sessionsToStop) {
24112
24323
  await shutdownAcpAgentSession({
24113
- adapterType: normalizedRecord.transport === "grok_acp" ? "grok-acp" : "kimi-acp",
24324
+ adapterType: normalizedRecord.transport === "grok_acp" ? "grok-acp" : normalizedRecord.transport === "devin_acp" ? "devin-acp" : "kimi-acp",
24114
24325
  sessionId: sessionName,
24115
24326
  poolKey: localAgentAcpPoolKey(agentId, normalizedRecord)
24116
24327
  });
@@ -24159,8 +24370,8 @@ async function restartAllLocalAgents(options = {}) {
24159
24370
  }
24160
24371
  function readPersistedSessionCatalogId(runtimeDir) {
24161
24372
  try {
24162
- const catalogPath = join27(runtimeDir, "session-catalog.json");
24163
- if (existsSync25(catalogPath)) {
24373
+ const catalogPath = join28(runtimeDir, "session-catalog.json");
24374
+ if (existsSync26(catalogPath)) {
24164
24375
  const raw = readFileSync14(catalogPath, "utf8").trim();
24165
24376
  if (raw) {
24166
24377
  const catalog = JSON.parse(raw);
@@ -24176,8 +24387,8 @@ function readPersistedSessionCatalogId(runtimeDir) {
24176
24387
  }
24177
24388
  function readPersistedLegacySessionId(runtimeDir, filename) {
24178
24389
  try {
24179
- const legacyPath = join27(runtimeDir, filename);
24180
- if (existsSync25(legacyPath)) {
24390
+ const legacyPath = join28(runtimeDir, filename);
24391
+ if (existsSync26(legacyPath)) {
24181
24392
  const value = readFileSync14(legacyPath, "utf8").trim();
24182
24393
  return value || null;
24183
24394
  }
@@ -24453,6 +24664,7 @@ var init_local_agents = __esm(() => {
24453
24664
  init_kimi_acp_invocation();
24454
24665
  init_cursor_acp_invocation();
24455
24666
  init_opencode_acp_invocation();
24667
+ init_devin_acp_invocation();
24456
24668
  init_acp_agent_invocation();
24457
24669
  init_claude_stream_json();
24458
24670
  init_codex_app_server2();
@@ -26781,7 +26993,7 @@ var agentsTable = sqliteTable("agents", {
26781
26993
  ]);
26782
26994
  var agentEndpointsTable = sqliteTable("agent_endpoints", {
26783
26995
  id: text("id").primaryKey(),
26784
- agentId: text("agent_id").notNull().references(() => agentsTable.id, { onDelete: "cascade" }),
26996
+ agentId: text("agent_id").notNull().references(() => actorsTable.id, { onDelete: "cascade" }),
26785
26997
  nodeId: text("node_id").notNull().references(() => nodesTable.id, { onDelete: "restrict" }),
26786
26998
  harness: text("harness").notNull(),
26787
26999
  transport: text("transport").notNull(),
@@ -26805,7 +27017,7 @@ var agentEndpointsTable = sqliteTable("agent_endpoints", {
26805
27017
  ]);
26806
27018
  var runtimeSessionsTable = sqliteTable("runtime_sessions", {
26807
27019
  id: text("id").primaryKey(),
26808
- agentId: text("agent_id").notNull().references(() => agentsTable.id, { onDelete: "cascade" }),
27020
+ agentId: text("agent_id").notNull().references(() => actorsTable.id, { onDelete: "cascade" }),
26809
27021
  endpointId: text("endpoint_id").notNull().references(() => agentEndpointsTable.id, { onDelete: "cascade" }),
26810
27022
  nodeId: text("node_id").notNull().references(() => nodesTable.id, { onDelete: "restrict" }),
26811
27023
  harness: text("harness").notNull(),
@@ -26833,7 +27045,7 @@ var runtimeSessionAliasesTable = sqliteTable("runtime_session_aliases", {
26833
27045
  alias: text("alias").notNull(),
26834
27046
  sessionId: text("session_id").notNull().references(() => runtimeSessionsTable.id, { onDelete: "cascade" }),
26835
27047
  aliasKind: text("alias_kind").notNull(),
26836
- agentId: text("agent_id").notNull().references(() => agentsTable.id, { onDelete: "cascade" }),
27048
+ agentId: text("agent_id").notNull().references(() => actorsTable.id, { onDelete: "cascade" }),
26837
27049
  endpointId: text("endpoint_id").notNull().references(() => agentEndpointsTable.id, { onDelete: "cascade" }),
26838
27050
  nodeId: text("node_id").notNull().references(() => nodesTable.id, { onDelete: "restrict" }),
26839
27051
  harness: text("harness").notNull(),
@@ -27079,7 +27291,7 @@ var invocationsTable = sqliteTable("invocations", {
27079
27291
  id: text("id").primaryKey(),
27080
27292
  requesterId: text("requester_id").notNull().references(() => actorsTable.id, { onDelete: "restrict" }),
27081
27293
  requesterNodeId: text("requester_node_id").notNull().references(() => nodesTable.id, { onDelete: "restrict" }),
27082
- targetAgentId: text("target_agent_id").notNull().references(() => agentsTable.id, { onDelete: "restrict" }),
27294
+ targetAgentId: text("target_agent_id").notNull().references(() => actorsTable.id, { onDelete: "restrict" }),
27083
27295
  targetNodeId: text("target_node_id").references(() => nodesTable.id, { onDelete: "set null" }),
27084
27296
  action: text("action").notNull(),
27085
27297
  task: text("task").notNull(),
@@ -27114,7 +27326,7 @@ var flightsTable = sqliteTable("flights", {
27114
27326
  id: text("id").primaryKey(),
27115
27327
  invocationId: text("invocation_id").notNull().references(() => invocationsTable.id, { onDelete: "cascade" }),
27116
27328
  requesterId: text("requester_id").notNull().references(() => actorsTable.id, { onDelete: "restrict" }),
27117
- targetAgentId: text("target_agent_id").notNull().references(() => agentsTable.id, { onDelete: "restrict" }),
27329
+ targetAgentId: text("target_agent_id").notNull().references(() => actorsTable.id, { onDelete: "restrict" }),
27118
27330
  state: text("state").notNull(),
27119
27331
  summary: text("summary"),
27120
27332
  output: text("output"),
@@ -27363,7 +27575,7 @@ var activityItemsTable = sqliteTable("activity_items", {
27363
27575
  recordId: text("record_id").references(() => collaborationRecordsTable.id, { onDelete: "cascade" }),
27364
27576
  actorId: text("actor_id").references(() => actorsTable.id, { onDelete: "set null" }),
27365
27577
  counterpartId: text("counterpart_id").references(() => actorsTable.id, { onDelete: "set null" }),
27366
- agentId: text("agent_id").references(() => agentsTable.id, { onDelete: "set null" }),
27578
+ agentId: text("agent_id").references(() => actorsTable.id, { onDelete: "set null" }),
27367
27579
  workspaceRoot: text("workspace_root"),
27368
27580
  sessionId: text("session_id"),
27369
27581
  title: text("title"),
@@ -27525,7 +27737,7 @@ var missionLogEntriesTable = sqliteTable("mission_log_entries", {
27525
27737
  var CONTROL_PLANE_RUNTIME_SESSION_SQLITE_SCHEMA = `
27526
27738
  CREATE TABLE IF NOT EXISTS runtime_sessions (
27527
27739
  id TEXT PRIMARY KEY,
27528
- agent_id TEXT NOT NULL REFERENCES agents(id) ON DELETE CASCADE,
27740
+ agent_id TEXT NOT NULL REFERENCES actors(id) ON DELETE CASCADE,
27529
27741
  endpoint_id TEXT NOT NULL REFERENCES agent_endpoints(id) ON DELETE CASCADE,
27530
27742
  node_id TEXT NOT NULL REFERENCES nodes(id) ON DELETE RESTRICT,
27531
27743
  harness TEXT NOT NULL,
@@ -27548,7 +27760,7 @@ CREATE TABLE IF NOT EXISTS runtime_session_aliases (
27548
27760
  alias TEXT NOT NULL,
27549
27761
  session_id TEXT NOT NULL REFERENCES runtime_sessions(id) ON DELETE CASCADE,
27550
27762
  alias_kind TEXT NOT NULL,
27551
- agent_id TEXT NOT NULL REFERENCES agents(id) ON DELETE CASCADE,
27763
+ agent_id TEXT NOT NULL REFERENCES actors(id) ON DELETE CASCADE,
27552
27764
  endpoint_id TEXT NOT NULL REFERENCES agent_endpoints(id) ON DELETE CASCADE,
27553
27765
  node_id TEXT NOT NULL REFERENCES nodes(id) ON DELETE RESTRICT,
27554
27766
  harness TEXT NOT NULL,
@@ -27744,7 +27956,7 @@ CREATE TABLE IF NOT EXISTS agents (
27744
27956
 
27745
27957
  CREATE TABLE IF NOT EXISTS agent_endpoints (
27746
27958
  id TEXT PRIMARY KEY,
27747
- agent_id TEXT NOT NULL REFERENCES agents(id) ON DELETE CASCADE,
27959
+ agent_id TEXT NOT NULL REFERENCES actors(id) ON DELETE CASCADE,
27748
27960
  node_id TEXT NOT NULL REFERENCES nodes(id) ON DELETE RESTRICT,
27749
27961
  harness TEXT NOT NULL,
27750
27962
  transport TEXT NOT NULL,
@@ -27918,7 +28130,7 @@ CREATE TABLE IF NOT EXISTS invocations (
27918
28130
  id TEXT PRIMARY KEY,
27919
28131
  requester_id TEXT NOT NULL REFERENCES actors(id) ON DELETE RESTRICT,
27920
28132
  requester_node_id TEXT NOT NULL REFERENCES nodes(id) ON DELETE RESTRICT,
27921
- target_agent_id TEXT NOT NULL REFERENCES agents(id) ON DELETE RESTRICT,
28133
+ target_agent_id TEXT NOT NULL REFERENCES actors(id) ON DELETE RESTRICT,
27922
28134
  target_node_id TEXT REFERENCES nodes(id) ON DELETE SET NULL,
27923
28135
  action TEXT NOT NULL,
27924
28136
  task TEXT NOT NULL,
@@ -27948,7 +28160,7 @@ CREATE TABLE IF NOT EXISTS flights (
27948
28160
  id TEXT PRIMARY KEY,
27949
28161
  invocation_id TEXT NOT NULL REFERENCES invocations(id) ON DELETE CASCADE,
27950
28162
  requester_id TEXT NOT NULL REFERENCES actors(id) ON DELETE RESTRICT,
27951
- target_agent_id TEXT NOT NULL REFERENCES agents(id) ON DELETE RESTRICT,
28163
+ target_agent_id TEXT NOT NULL REFERENCES actors(id) ON DELETE RESTRICT,
27952
28164
  state TEXT NOT NULL,
27953
28165
  summary TEXT,
27954
28166
  output TEXT,
@@ -28170,7 +28382,7 @@ CREATE TABLE IF NOT EXISTS activity_items (
28170
28382
  record_id TEXT REFERENCES collaboration_records(id) ON DELETE CASCADE,
28171
28383
  actor_id TEXT REFERENCES actors(id) ON DELETE SET NULL,
28172
28384
  counterpart_id TEXT REFERENCES actors(id) ON DELETE SET NULL,
28173
- agent_id TEXT REFERENCES agents(id) ON DELETE SET NULL,
28385
+ agent_id TEXT REFERENCES actors(id) ON DELETE SET NULL,
28174
28386
  workspace_root TEXT,
28175
28387
  session_id TEXT,
28176
28388
  title TEXT,
@@ -28757,6 +28969,10 @@ class InMemoryControlRuntime {
28757
28969
  return;
28758
28970
  case "stream.subscribe":
28759
28971
  return;
28972
+ case "channel.invite.create":
28973
+ case "channel.invite.revoke":
28974
+ case "channel.invite.redeem":
28975
+ throw new Error(`${command.kind} must be executed by the durable broker command service, not the in-memory registry.`);
28760
28976
  default: {
28761
28977
  const exhaustive = command;
28762
28978
  return exhaustive;
@@ -44137,7 +44353,10 @@ var MODEL_CONTEXT_WINDOWS = {
44137
44353
  var RUNTIME_MODEL_CONTEXT_WINDOWS = {
44138
44354
  "gpt-6-astra": 1050000,
44139
44355
  "grok-4-6": 500000,
44140
- "grok-4-5": 500000
44356
+ "grok-4-5": 500000,
44357
+ "swe-2-high": 262000,
44358
+ "swe-2-medium": 262000,
44359
+ "swe-2-max": 262000
44141
44360
  };
44142
44361
 
44143
44362
  // ../agent-sessions/src/model-catalog.ts
@@ -44573,14 +44792,14 @@ init_src();
44573
44792
  // ../runtime/src/provisional-agent-names-config.ts
44574
44793
  init_src();
44575
44794
  init_user_config();
44576
- import { existsSync as existsSync26, readFileSync as readFileSync15, writeFileSync as writeFileSync9, mkdirSync as mkdirSync9 } from "fs";
44577
- import { homedir as homedir21 } from "os";
44578
- import { isAbsolute as isAbsolute3, join as join28, resolve as resolve13 } from "path";
44795
+ import { existsSync as existsSync27, readFileSync as readFileSync15, writeFileSync as writeFileSync9, mkdirSync as mkdirSync9 } from "fs";
44796
+ import { homedir as homedir22 } from "os";
44797
+ import { isAbsolute as isAbsolute3, join as join29, resolve as resolve13 } from "path";
44579
44798
  function openScoutHome() {
44580
- return process.env.OPENSCOUT_HOME ?? join28(homedir21(), ".openscout");
44799
+ return process.env.OPENSCOUT_HOME ?? join29(homedir22(), ".openscout");
44581
44800
  }
44582
44801
  function defaultProvisionalAgentNamesPath() {
44583
- return join28(openScoutHome(), "provisional-agent-names.json");
44802
+ return join29(openScoutHome(), "provisional-agent-names.json");
44584
44803
  }
44585
44804
  function resolveProvisionalAgentNamesMode(config) {
44586
44805
  return config.provisionalAgentNamesMode === "extend" ? "extend" : "replace";
@@ -44625,7 +44844,7 @@ function loadInlineProvisionalAgentNames(config) {
44625
44844
  }
44626
44845
  function loadFileProvisionalAgentNames(config = loadUserConfig()) {
44627
44846
  const envFile = process.env.OPENSCOUT_PROVISIONAL_AGENT_NAMES_FILE?.trim();
44628
- if (envFile && existsSync26(envFile)) {
44847
+ if (envFile && existsSync27(envFile)) {
44629
44848
  const names2 = readProvisionalAgentNamesJsonFile(envFile);
44630
44849
  if (names2.length > 0) {
44631
44850
  return { names: names2, source: "env-file", sourcePath: envFile };
@@ -44633,7 +44852,7 @@ function loadFileProvisionalAgentNames(config = loadUserConfig()) {
44633
44852
  }
44634
44853
  if (config.provisionalAgentNamesFile?.trim()) {
44635
44854
  const filePath = resolvePoolFilePath(config.provisionalAgentNamesFile);
44636
- if (existsSync26(filePath)) {
44855
+ if (existsSync27(filePath)) {
44637
44856
  const names2 = readProvisionalAgentNamesJsonFile(filePath);
44638
44857
  if (names2.length > 0) {
44639
44858
  return { names: names2, source: "user-config-file", sourcePath: filePath };
@@ -44641,7 +44860,7 @@ function loadFileProvisionalAgentNames(config = loadUserConfig()) {
44641
44860
  }
44642
44861
  }
44643
44862
  const homeJson = defaultProvisionalAgentNamesPath();
44644
- if (existsSync26(homeJson)) {
44863
+ if (existsSync27(homeJson)) {
44645
44864
  const names2 = readProvisionalAgentNamesJsonFile(homeJson);
44646
44865
  if (names2.length > 0) {
44647
44866
  return { names: names2, source: "home-json", sourcePath: homeJson };
@@ -45059,7 +45278,8 @@ var directLocalAgentTransports = new Set([
45059
45278
  "grok_acp",
45060
45279
  "kimi_acp",
45061
45280
  "cursor_acp",
45062
- "opencode_acp"
45281
+ "opencode_acp",
45282
+ "devin_acp"
45063
45283
  ]);
45064
45284
 
45065
45285
  // ../runtime/src/broker-endpoint-selection.ts
@@ -45625,7 +45845,7 @@ import { Database } from "bun:sqlite";
45625
45845
  import { mkdirSync as mkdirSync10, readFileSync as readFileSync16 } from "fs";
45626
45846
  import { connect as connectHttp2 } from "http2";
45627
45847
  import { createPrivateKey as createPrivateKey3, sign as signWithKey } from "crypto";
45628
- import { dirname as dirname17, join as join29 } from "path";
45848
+ import { dirname as dirname17, join as join30 } from "path";
45629
45849
  var MOBILE_PUSH_SCHEMA = `
45630
45850
  CREATE TABLE IF NOT EXISTS mobile_push_registrations (
45631
45851
  id TEXT PRIMARY KEY,
@@ -45653,7 +45873,7 @@ var dbHandle = null;
45653
45873
  var dbPath = null;
45654
45874
  var cachedApnsJwt = null;
45655
45875
  function resolveControlPlaneDbPath() {
45656
- return join29(resolveOpenScoutSupportPaths().controlHome, "control-plane.sqlite");
45876
+ return join30(resolveOpenScoutSupportPaths().controlHome, "control-plane.sqlite");
45657
45877
  }
45658
45878
  function ensureMobilePushSchema(database) {
45659
45879
  database.exec("PRAGMA busy_timeout = 5000;");
@@ -46821,9 +47041,9 @@ function normalizeNodeId(value) {
46821
47041
 
46822
47042
  // ../web/server/core/pairing/runtime/relay-runtime.ts
46823
47043
  init_system_probes();
46824
- import { existsSync as existsSync27, mkdirSync as mkdirSync12 } from "fs";
46825
- import { homedir as homedir22, networkInterfaces as networkInterfaces2 } from "os";
46826
- import { join as join30 } from "path";
47044
+ import { existsSync as existsSync28, mkdirSync as mkdirSync12 } from "fs";
47045
+ import { homedir as homedir23, networkInterfaces as networkInterfaces2 } from "os";
47046
+ import { join as join31 } from "path";
46827
47047
 
46828
47048
  // ../web/server/core/pairing/runtime/log.ts
46829
47049
  import { appendFileSync, mkdirSync as mkdirSync11 } from "fs";
@@ -47115,14 +47335,14 @@ function parseRelayEnvelope(data) {
47115
47335
  }
47116
47336
 
47117
47337
  // ../web/server/core/pairing/runtime/relay-runtime.ts
47118
- var PAIRING_DIR = join30(homedir22(), ".scout/pairing");
47338
+ var PAIRING_DIR = join31(homedir23(), ".scout/pairing");
47119
47339
  async function findStoredTailscaleCert(hostname3) {
47120
- if (!existsSync27(PAIRING_DIR)) {
47340
+ if (!existsSync28(PAIRING_DIR)) {
47121
47341
  return null;
47122
47342
  }
47123
- const certPath = join30(PAIRING_DIR, `${hostname3}.crt`);
47124
- const keyPath = join30(PAIRING_DIR, `${hostname3}.key`);
47125
- if (!existsSync27(certPath) || !existsSync27(keyPath)) {
47343
+ const certPath = join31(PAIRING_DIR, `${hostname3}.crt`);
47344
+ const keyPath = join31(PAIRING_DIR, `${hostname3}.key`);
47345
+ if (!existsSync28(certPath) || !existsSync28(keyPath)) {
47126
47346
  return null;
47127
47347
  }
47128
47348
  if (!await storedCertificateLooksPubliclyTrusted(certPath)) {
@@ -47206,8 +47426,8 @@ function resolveRelayEndpointForTailscaleStatus(port, tailscale2, options = {})
47206
47426
  }
47207
47427
  async function generateTailscaleCerts(hostname3) {
47208
47428
  mkdirSync12(PAIRING_DIR, { recursive: true });
47209
- const certPath = join30(PAIRING_DIR, `${hostname3}.crt`);
47210
- const keyPath = join30(PAIRING_DIR, `${hostname3}.key`);
47429
+ const certPath = join31(PAIRING_DIR, `${hostname3}.crt`);
47430
+ const keyPath = join31(PAIRING_DIR, `${hostname3}.key`);
47211
47431
  try {
47212
47432
  pairingLog.info("relay", "generating tailscale TLS cert", { hostname: hostname3 });
47213
47433
  await execSystemFile("tailscale", ["cert", "--cert-file", certPath, "--key-file", keyPath, hostname3], {
@@ -47332,7 +47552,7 @@ function parseIPv42(address) {
47332
47552
  }
47333
47553
 
47334
47554
  // ../web/server/core/pairing/runtime/runtime-state.ts
47335
- import { existsSync as existsSync29, mkdirSync as mkdirSync14, readFileSync as readFileSync18, renameSync as renameSync5, unlinkSync, writeFileSync as writeFileSync11 } from "fs";
47555
+ import { existsSync as existsSync30, mkdirSync as mkdirSync14, readFileSync as readFileSync18, renameSync as renameSync5, unlinkSync, writeFileSync as writeFileSync11 } from "fs";
47336
47556
 
47337
47557
  // ../../node_modules/.bun/@noble+hashes@2.0.1/node_modules/@noble/hashes/utils.js
47338
47558
  /*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */
@@ -49368,14 +49588,14 @@ function concat3(...arrays) {
49368
49588
  return result;
49369
49589
  }
49370
49590
  // ../web/server/core/pairing/runtime/security/identity.ts
49371
- import { existsSync as existsSync28, mkdirSync as mkdirSync13, readFileSync as readFileSync17, writeFileSync as writeFileSync10 } from "fs";
49372
- import { join as join31 } from "path";
49373
- import { homedir as homedir23 } from "os";
49374
- var PAIRING_DIR2 = join31(homedir23(), ".scout/pairing");
49375
- var IDENTITY_FILE = join31(PAIRING_DIR2, "identity.json");
49376
- var TRUSTED_PEERS_FILE = join31(PAIRING_DIR2, "trusted-peers.json");
49591
+ import { existsSync as existsSync29, mkdirSync as mkdirSync13, readFileSync as readFileSync17, writeFileSync as writeFileSync10 } from "fs";
49592
+ import { join as join32 } from "path";
49593
+ import { homedir as homedir24 } from "os";
49594
+ var PAIRING_DIR2 = join32(homedir24(), ".scout/pairing");
49595
+ var IDENTITY_FILE = join32(PAIRING_DIR2, "identity.json");
49596
+ var TRUSTED_PEERS_FILE = join32(PAIRING_DIR2, "trusted-peers.json");
49377
49597
  function loadOrCreateIdentity() {
49378
- if (existsSync28(IDENTITY_FILE)) {
49598
+ if (existsSync29(IDENTITY_FILE)) {
49379
49599
  return loadIdentity();
49380
49600
  }
49381
49601
  return createAndSaveIdentity();
@@ -49399,7 +49619,7 @@ function createAndSaveIdentity() {
49399
49619
  return keyPair;
49400
49620
  }
49401
49621
  function loadTrustedPeers() {
49402
- if (!existsSync28(TRUSTED_PEERS_FILE))
49622
+ if (!existsSync29(TRUSTED_PEERS_FILE))
49403
49623
  return new Map;
49404
49624
  const data = JSON.parse(readFileSync17(TRUSTED_PEERS_FILE, "utf8"));
49405
49625
  return new Map(data.map((p) => [p.publicKey, p]));
@@ -49593,7 +49813,7 @@ function trustedPeerCount() {
49593
49813
  // ../web/server/core/pairing/runtime/runtime-state.ts
49594
49814
  function readPairingRuntimeSnapshot() {
49595
49815
  const { runtimeStatePath } = pairingPaths();
49596
- if (!existsSync29(runtimeStatePath)) {
49816
+ if (!existsSync30(runtimeStatePath)) {
49597
49817
  return null;
49598
49818
  }
49599
49819
  try {
@@ -49622,7 +49842,7 @@ function clearPairingRuntimeSnapshot() {
49622
49842
  }
49623
49843
  function readPairingRuntimePid() {
49624
49844
  const { runtimePidPath } = pairingPaths();
49625
- if (!existsSync29(runtimePidPath)) {
49845
+ if (!existsSync30(runtimePidPath)) {
49626
49846
  return null;
49627
49847
  }
49628
49848
  try {
@@ -49702,7 +49922,7 @@ function writeJsonAtomically(filePath, value) {
49702
49922
  }
49703
49923
 
49704
49924
  // ../web/server/core/pairing/runtime/runtime.ts
49705
- import { homedir as homedir41 } from "os";
49925
+ import { homedir as homedir42 } from "os";
49706
49926
 
49707
49927
  // ../agent-sessions/src/index.ts
49708
49928
  init_registry2();
@@ -49932,7 +50152,7 @@ function stringifyUnknown(value) {
49932
50152
  return String(value);
49933
50153
  }
49934
50154
  }
49935
- function isRecord9(value) {
50155
+ function isRecord10(value) {
49936
50156
  return !!value && typeof value === "object" && !Array.isArray(value);
49937
50157
  }
49938
50158
  function maybeString(value) {
@@ -49975,7 +50195,7 @@ function renderContentPartsText(content) {
49975
50195
  if (typeof entry === "string") {
49976
50196
  return entry;
49977
50197
  }
49978
- if (!isRecord9(entry)) {
50198
+ if (!isRecord10(entry)) {
49979
50199
  return "";
49980
50200
  }
49981
50201
  if (typeof entry.text === "string") {
@@ -50188,7 +50408,7 @@ class ClaudeCodeHistoryParser {
50188
50408
  if (recordCwd && !this.session.cwd) {
50189
50409
  this.session.cwd = recordCwd;
50190
50410
  }
50191
- const message = isRecord9(record.message) ? record.message : null;
50411
+ const message = isRecord10(record.message) ? record.message : null;
50192
50412
  const model = maybeString(message?.model);
50193
50413
  if (model && this.session.model !== model) {
50194
50414
  this.session.model = model;
@@ -50207,13 +50427,13 @@ class ClaudeCodeHistoryParser {
50207
50427
  }
50208
50428
  readClaudeUsageEntry(record) {
50209
50429
  const type = maybeString(record.type);
50210
- const message = isRecord9(record.message) ? record.message : null;
50430
+ const message = isRecord10(record.message) ? record.message : null;
50211
50431
  const role = maybeString(message?.role);
50212
50432
  if (type !== "assistant" && role !== "assistant") {
50213
50433
  return null;
50214
50434
  }
50215
- const usage = isRecord9(message?.usage) ? message.usage : null;
50216
- const serverToolUse = isRecord9(usage?.server_tool_use) ? usage.server_tool_use : null;
50435
+ const usage = isRecord10(message?.usage) ? message.usage : null;
50436
+ const serverToolUse = isRecord10(usage?.server_tool_use) ? usage.server_tool_use : null;
50217
50437
  const inputTokens = maybeNumber(usage?.input_tokens) ?? 0;
50218
50438
  const cacheReadInputTokens = maybeNumber(usage?.cache_read_input_tokens) ?? 0;
50219
50439
  const cacheCreationInputTokens = maybeNumber(usage?.cache_creation_input_tokens) ?? 0;
@@ -50312,10 +50532,10 @@ class ClaudeCodeHistoryParser {
50312
50532
  return changed;
50313
50533
  }
50314
50534
  ensureObserveMetaRecord(key) {
50315
- const providerMeta = isRecord9(this.session.providerMeta) ? this.session.providerMeta : {};
50535
+ const providerMeta = isRecord10(this.session.providerMeta) ? this.session.providerMeta : {};
50316
50536
  this.session.providerMeta = providerMeta;
50317
50537
  const existing = providerMeta[key];
50318
- if (isRecord9(existing)) {
50538
+ if (isRecord10(existing)) {
50319
50539
  return existing;
50320
50540
  }
50321
50541
  const next = {};
@@ -50788,7 +51008,7 @@ class PiHistoryParser {
50788
51008
  let record;
50789
51009
  try {
50790
51010
  const parsed = JSON.parse(trimmed);
50791
- if (!isRecord9(parsed)) {
51011
+ if (!isRecord10(parsed)) {
50792
51012
  this.skippedLineCount += 1;
50793
51013
  return;
50794
51014
  }
@@ -50831,7 +51051,7 @@ class PiHistoryParser {
50831
51051
  }
50832
51052
  return true;
50833
51053
  }
50834
- if (type !== "message" || !isRecord9(record.message)) {
51054
+ if (type !== "message" || !isRecord10(record.message)) {
50835
51055
  return false;
50836
51056
  }
50837
51057
  const message = record.message;
@@ -50887,7 +51107,7 @@ class PiHistoryParser {
50887
51107
  const content = Array.isArray(message.content) ? message.content : [];
50888
51108
  let hasOpenToolCall = false;
50889
51109
  for (const part of content) {
50890
- if (!isRecord9(part))
51110
+ if (!isRecord10(part))
50891
51111
  continue;
50892
51112
  const type = maybeString(part.type);
50893
51113
  if (type === "thinking") {
@@ -50959,7 +51179,7 @@ class PiHistoryParser {
50959
51179
  providerMeta.provider = provider;
50960
51180
  changed = true;
50961
51181
  }
50962
- if (isRecord9(message.usage)) {
51182
+ if (isRecord10(message.usage)) {
50963
51183
  const usage = this.ensureObserveMetaRecord("observeUsage");
50964
51184
  const inputTokens = maybeNumber(message.usage.input);
50965
51185
  const outputTokens = maybeNumber(message.usage.output);
@@ -51055,7 +51275,7 @@ class PiHistoryParser {
51055
51275
  });
51056
51276
  }
51057
51277
  buildAction(toolName2, toolCallId, input) {
51058
- if (toolName2 === "bash" && isRecord9(input)) {
51278
+ if (toolName2 === "bash" && isRecord10(input)) {
51059
51279
  return {
51060
51280
  kind: "command",
51061
51281
  command: maybeString(input.command) ?? "",
@@ -51063,7 +51283,7 @@ class PiHistoryParser {
51063
51283
  output: ""
51064
51284
  };
51065
51285
  }
51066
- if ((toolName2 === "edit" || toolName2 === "write") && isRecord9(input)) {
51286
+ if ((toolName2 === "edit" || toolName2 === "write") && isRecord10(input)) {
51067
51287
  return {
51068
51288
  kind: "file_change",
51069
51289
  path: maybeString(input.file_path) ?? maybeString(input.path) ?? "",
@@ -51082,14 +51302,14 @@ class PiHistoryParser {
51082
51302
  };
51083
51303
  }
51084
51304
  ensureProviderMeta() {
51085
- const providerMeta = isRecord9(this.session.providerMeta) ? this.session.providerMeta : {};
51305
+ const providerMeta = isRecord10(this.session.providerMeta) ? this.session.providerMeta : {};
51086
51306
  this.session.providerMeta = providerMeta;
51087
51307
  return providerMeta;
51088
51308
  }
51089
51309
  ensureObserveMetaRecord(key) {
51090
51310
  const providerMeta = this.ensureProviderMeta();
51091
51311
  const existing = providerMeta[key];
51092
- if (isRecord9(existing)) {
51312
+ if (isRecord10(existing)) {
51093
51313
  return existing;
51094
51314
  }
51095
51315
  const next = {};
@@ -51161,7 +51381,7 @@ class CodexHistoryParser {
51161
51381
  let record;
51162
51382
  try {
51163
51383
  const parsed = JSON.parse(trimmed);
51164
- if (!isRecord9(parsed)) {
51384
+ if (!isRecord10(parsed)) {
51165
51385
  skippedLineCount += 1;
51166
51386
  continue;
51167
51387
  }
@@ -51213,7 +51433,7 @@ class CodexHistoryParser {
51213
51433
  }
51214
51434
  }
51215
51435
  handleSessionMeta(record, capturedAt) {
51216
- const payload = isRecord9(record.payload) ? record.payload : {};
51436
+ const payload = isRecord10(record.payload) ? record.payload : {};
51217
51437
  let changed = false;
51218
51438
  const providerMeta = this.ensureProviderMeta();
51219
51439
  const externalSessionId = maybeString(payload.id);
@@ -51229,7 +51449,7 @@ class CodexHistoryParser {
51229
51449
  }
51230
51450
  changed = true;
51231
51451
  }
51232
- const git2 = isRecord9(payload.git) ? payload.git : null;
51452
+ const git2 = isRecord10(payload.git) ? payload.git : null;
51233
51453
  const runtime = this.ensureObserveMetaRecord("observeRuntime");
51234
51454
  changed = this.assignObserveString(runtime, "originator", payload.originator) || changed;
51235
51455
  changed = this.assignObserveString(runtime, "cliVersion", payload.cli_version) || changed;
@@ -51244,7 +51464,7 @@ class CodexHistoryParser {
51244
51464
  }
51245
51465
  }
51246
51466
  handleTurnContext(record, capturedAt) {
51247
- const payload = isRecord9(record.payload) ? record.payload : {};
51467
+ const payload = isRecord10(record.payload) ? record.payload : {};
51248
51468
  let changed = false;
51249
51469
  const cwd = maybeString(payload.cwd);
51250
51470
  if (cwd && this.session.cwd !== cwd) {
@@ -51262,7 +51482,7 @@ class CodexHistoryParser {
51262
51482
  changed = this.assignObserveString(runtime, "timezone", payload.timezone) || changed;
51263
51483
  changed = this.assignObserveString(runtime, "effort", payload.effort) || changed;
51264
51484
  changed = this.assignObserveString(runtime, "personality", payload.personality) || changed;
51265
- if (isRecord9(payload.sandbox_policy) && runtime.sandboxPolicy !== payload.sandbox_policy) {
51485
+ if (isRecord10(payload.sandbox_policy) && runtime.sandboxPolicy !== payload.sandbox_policy) {
51266
51486
  runtime.sandboxPolicy = payload.sandbox_policy;
51267
51487
  changed = true;
51268
51488
  }
@@ -51271,7 +51491,7 @@ class CodexHistoryParser {
51271
51491
  }
51272
51492
  }
51273
51493
  handleEventMessage(record, capturedAt) {
51274
- const payload = isRecord9(record.payload) ? record.payload : {};
51494
+ const payload = isRecord10(record.payload) ? record.payload : {};
51275
51495
  const eventType = maybeString(payload.type);
51276
51496
  if (!eventType) {
51277
51497
  return;
@@ -51310,7 +51530,7 @@ class CodexHistoryParser {
51310
51530
  }
51311
51531
  }
51312
51532
  handleResponseItem(record, capturedAt) {
51313
- const payload = isRecord9(record.payload) ? record.payload : {};
51533
+ const payload = isRecord10(record.payload) ? record.payload : {};
51314
51534
  const itemType = maybeString(payload.type);
51315
51535
  if (!itemType) {
51316
51536
  return;
@@ -51410,7 +51630,7 @@ class CodexHistoryParser {
51410
51630
  }
51411
51631
  }
51412
51632
  buildAction(toolName2, toolCallId, input) {
51413
- const inputRecord = isRecord9(input) ? input : {};
51633
+ const inputRecord = isRecord10(input) ? input : {};
51414
51634
  if (toolName2 === "exec_command") {
51415
51635
  return {
51416
51636
  kind: "command",
@@ -51635,8 +51855,8 @@ class CodexHistoryParser {
51635
51855
  return false;
51636
51856
  }
51637
51857
  const metadata = this.ensureObserveMetaRecord("observeHostMetadata");
51638
- const directives = Array.isArray(metadata.directives) ? metadata.directives.filter(isRecord9) : [];
51639
- const memoryCitations = Array.isArray(metadata.memoryCitations) ? metadata.memoryCitations.filter(isRecord9) : [];
51858
+ const directives = Array.isArray(metadata.directives) ? metadata.directives.filter(isRecord10) : [];
51859
+ const memoryCitations = Array.isArray(metadata.memoryCitations) ? metadata.memoryCitations.filter(isRecord10) : [];
51640
51860
  for (const entry of fresh) {
51641
51861
  if (entry.kind === "directive") {
51642
51862
  directives.push({
@@ -51688,14 +51908,14 @@ class CodexHistoryParser {
51688
51908
  });
51689
51909
  }
51690
51910
  ensureProviderMeta() {
51691
- const providerMeta = isRecord9(this.session.providerMeta) ? this.session.providerMeta : {};
51911
+ const providerMeta = isRecord10(this.session.providerMeta) ? this.session.providerMeta : {};
51692
51912
  this.session.providerMeta = providerMeta;
51693
51913
  return providerMeta;
51694
51914
  }
51695
51915
  ensureObserveMetaRecord(key) {
51696
51916
  const providerMeta = this.ensureProviderMeta();
51697
51917
  const existing = providerMeta[key];
51698
- if (isRecord9(existing)) {
51918
+ if (isRecord10(existing)) {
51699
51919
  return existing;
51700
51920
  }
51701
51921
  const next = {};
@@ -51758,9 +51978,9 @@ function createHistorySessionSnapshot(input) {
51758
51978
  };
51759
51979
  }
51760
51980
  // ../agent-sessions/src/adapters/claude-code/adapter.ts
51761
- import { existsSync as existsSync31, readdirSync as readdirSync5, statSync as statSync8 } from "fs";
51762
- import { homedir as homedir25 } from "os";
51763
- import { delimiter as delimiter3, join as join33 } from "path";
51981
+ import { existsSync as existsSync32, readdirSync as readdirSync5, statSync as statSync8 } from "fs";
51982
+ import { homedir as homedir26 } from "os";
51983
+ import { delimiter as delimiter3, join as join34 } from "path";
51764
51984
 
51765
51985
  // ../agent-sessions/src/protocol/live-normalizer-context.ts
51766
51986
  function createLiveNormalizerContext(sessionId) {
@@ -51772,9 +51992,9 @@ function createLiveNormalizerContext(sessionId) {
51772
51992
  }
51773
51993
 
51774
51994
  // ../agent-sessions/src/adapters/claude-code/team-topology.ts
51775
- import { existsSync as existsSync30, readdirSync as readdirSync4, readFileSync as readFileSync19, statSync as statSync7 } from "fs";
51776
- import { homedir as homedir24 } from "os";
51777
- import { basename as basename12, dirname as dirname19, join as join32, relative as relative3 } from "path";
51995
+ import { existsSync as existsSync31, readdirSync as readdirSync4, readFileSync as readFileSync19, statSync as statSync7 } from "fs";
51996
+ import { homedir as homedir25 } from "os";
51997
+ import { basename as basename12, dirname as dirname19, join as join33, relative as relative3 } from "path";
51778
51998
  var TOPOLOGY_SCHEMA_VERSION2 = "openscout.observed-harness-topology.v1";
51779
51999
  var CLAUDE_TOPOLOGY_SOURCE = "claude-code-agent-teams";
51780
52000
  var SESSION_ID_KEYS = new Set([
@@ -51798,13 +52018,13 @@ var CWD_KEYS = new Set([
51798
52018
  function isObject2(value) {
51799
52019
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
51800
52020
  }
51801
- function stringValue6(value) {
52021
+ function stringValue7(value) {
51802
52022
  return typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined;
51803
52023
  }
51804
- function stringArray5(value) {
52024
+ function stringArray6(value) {
51805
52025
  if (!Array.isArray(value))
51806
52026
  return [];
51807
- return value.map((entry) => stringValue6(entry)).filter((entry) => Boolean(entry));
52027
+ return value.map((entry) => stringValue7(entry)).filter((entry) => Boolean(entry));
51808
52028
  }
51809
52029
  function keyToken(key) {
51810
52030
  return key.replace(/[^a-zA-Z0-9_]/g, "").toLowerCase();
@@ -51838,23 +52058,23 @@ function statIsFile2(path2) {
51838
52058
  }
51839
52059
  }
51840
52060
  function readTeamConfigs(homeDir) {
51841
- const teamsRoot = join32(homeDir, ".claude", "teams");
51842
- if (!existsSync30(teamsRoot) || !statIsDirectory2(teamsRoot)) {
52061
+ const teamsRoot = join33(homeDir, ".claude", "teams");
52062
+ if (!existsSync31(teamsRoot) || !statIsDirectory2(teamsRoot)) {
51843
52063
  return [];
51844
52064
  }
51845
52065
  const teams = [];
51846
52066
  for (const entry of readdirSync4(teamsRoot)) {
51847
- const teamDir = join32(teamsRoot, entry);
52067
+ const teamDir = join33(teamsRoot, entry);
51848
52068
  if (!statIsDirectory2(teamDir)) {
51849
52069
  continue;
51850
52070
  }
51851
- const configPath = join32(teamDir, "config.json");
52071
+ const configPath = join33(teamDir, "config.json");
51852
52072
  const config = readJsonObject(configPath);
51853
52073
  if (!config) {
51854
52074
  continue;
51855
52075
  }
51856
52076
  teams.push({
51857
- teamName: stringValue6(config.name) ?? stringValue6(config.teamName) ?? entry,
52077
+ teamName: stringValue7(config.name) ?? stringValue7(config.teamName) ?? entry,
51858
52078
  configPath,
51859
52079
  config
51860
52080
  });
@@ -51878,7 +52098,7 @@ function objectContainsKeyedValue(value, expected, keys, seen = new Set) {
51878
52098
  seen.add(value);
51879
52099
  for (const [key, nested] of Object.entries(value)) {
51880
52100
  const normalizedKey = keyToken(key);
51881
- if (keys.has(normalizedKey) && stringValue6(nested) === expected) {
52101
+ if (keys.has(normalizedKey) && stringValue7(nested) === expected) {
51882
52102
  return true;
51883
52103
  }
51884
52104
  if (objectContainsKeyedValue(nested, expected, keys, seen)) {
@@ -51912,7 +52132,7 @@ function asMemberEntries(value) {
51912
52132
  }
51913
52133
  function firstString2(record, keys) {
51914
52134
  for (const key of keys) {
51915
- const value = stringValue6(record[key]);
52135
+ const value = stringValue7(record[key]);
51916
52136
  if (value)
51917
52137
  return value;
51918
52138
  }
@@ -51937,7 +52157,7 @@ function firstStringDeepForKeys(value, keys, seen = new Set) {
51937
52157
  seen.add(value);
51938
52158
  for (const [key, nested] of Object.entries(value)) {
51939
52159
  if (keys.has(keyToken(key))) {
51940
- const direct = stringValue6(nested);
52160
+ const direct = stringValue7(nested);
51941
52161
  if (direct)
51942
52162
  return direct;
51943
52163
  }
@@ -51986,8 +52206,8 @@ function membersFromConfig(team, groupId, configRefId) {
51986
52206
  return { agents, relationships, agentByExternal };
51987
52207
  }
51988
52208
  function readTaskFiles(tasksRoot, teamName) {
51989
- const teamTasksRoot = join32(tasksRoot, teamName);
51990
- if (!existsSync30(teamTasksRoot) || !statIsDirectory2(teamTasksRoot)) {
52209
+ const teamTasksRoot = join33(tasksRoot, teamName);
52210
+ if (!existsSync31(teamTasksRoot) || !statIsDirectory2(teamTasksRoot)) {
51991
52211
  return [];
51992
52212
  }
51993
52213
  const result = [];
@@ -51997,7 +52217,7 @@ function readTaskFiles(tasksRoot, teamName) {
51997
52217
  if (!current)
51998
52218
  continue;
51999
52219
  for (const entry of readdirSync4(current)) {
52000
- const path2 = join32(current, entry);
52220
+ const path2 = join33(current, entry);
52001
52221
  if (statIsDirectory2(path2)) {
52002
52222
  stack.push(path2);
52003
52223
  } else if (statIsFile2(path2)) {
@@ -52032,7 +52252,7 @@ function parseTaskFile(taskPath, teamName, tasksRoot, sourceRef) {
52032
52252
  } catch {
52033
52253
  return null;
52034
52254
  }
52035
- const relativePath = relative3(join32(tasksRoot, teamName), taskPath);
52255
+ const relativePath = relative3(join33(tasksRoot, teamName), taskPath);
52036
52256
  const fallbackId = relativePath.replace(/\.[^.]+$/u, "");
52037
52257
  const fallbackTitle = firstMarkdownTitle(raw) ?? basename12(fallbackId);
52038
52258
  const inferredState = inferTaskStateFromPath(dirname19(relativePath));
@@ -52048,9 +52268,9 @@ function parseTaskFile(taskPath, teamName, tasksRoot, sourceRef) {
52048
52268
  const state = parsed ? firstString2(parsed, ["state", "status"]) ?? inferredState : inferredState;
52049
52269
  const rawAssignee = parsed ? firstString2(parsed, ["assigneeId", "assignee", "owner", "ownerId", "agentId", "assignedTo"]) : undefined;
52050
52270
  const rawDependencies = parsed ? [
52051
- ...stringArray5(parsed.dependencies),
52052
- ...stringArray5(parsed.dependsOn),
52053
- ...stringArray5(parsed.blockedBy)
52271
+ ...stringArray6(parsed.dependencies),
52272
+ ...stringArray6(parsed.dependsOn),
52273
+ ...stringArray6(parsed.blockedBy)
52054
52274
  ] : [];
52055
52275
  return {
52056
52276
  id: `claude-task:${stableSegment2(teamName)}:${stableSegment2(externalId)}`,
@@ -52066,7 +52286,7 @@ function parseTaskFile(taskPath, teamName, tasksRoot, sourceRef) {
52066
52286
  };
52067
52287
  }
52068
52288
  function tasksFromFiles(homeDir, teamName, agentByExternal) {
52069
- const tasksRoot = join32(homeDir, ".claude", "tasks");
52289
+ const tasksRoot = join33(homeDir, ".claude", "tasks");
52070
52290
  const taskFiles = readTaskFiles(tasksRoot, teamName);
52071
52291
  const sourceRefs = [];
52072
52292
  const parsedTasks = [];
@@ -52154,7 +52374,7 @@ function leaderAgentForTeam(team, groupId, configRefId, options) {
52154
52374
  };
52155
52375
  }
52156
52376
  function readClaudeAgentTeamTopology(options = {}) {
52157
- const homeDir = options.homeDir ?? homedir24();
52377
+ const homeDir = options.homeDir ?? homedir25();
52158
52378
  const teams = readTeamConfigs(homeDir).filter((team) => teamMatches(team, options));
52159
52379
  if (teams.length === 0) {
52160
52380
  return null;
@@ -52232,7 +52452,7 @@ function record(value) {
52232
52452
  function arrayValue(value) {
52233
52453
  return Array.isArray(value) ? value : [];
52234
52454
  }
52235
- function stringValue7(value) {
52455
+ function stringValue8(value) {
52236
52456
  return typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined;
52237
52457
  }
52238
52458
  function numberValue3(value) {
@@ -52259,7 +52479,7 @@ function readString4(source, keys) {
52259
52479
  if (!source)
52260
52480
  return;
52261
52481
  for (const key of keys) {
52262
- const value = stringValue7(source[key]);
52482
+ const value = stringValue8(source[key]);
52263
52483
  if (value !== undefined)
52264
52484
  return value;
52265
52485
  }
@@ -52270,7 +52490,7 @@ function timestampValue(value) {
52270
52490
  if (parsedEpoch !== undefined) {
52271
52491
  return parsedEpoch;
52272
52492
  }
52273
- const text2 = stringValue7(value);
52493
+ const text2 = stringValue8(value);
52274
52494
  if (!text2)
52275
52495
  return;
52276
52496
  const parsed = Date.parse(text2);
@@ -53361,7 +53581,7 @@ Referenced files: ${prompt.files.join(", ")}` });
53361
53581
  this.setStatus("error");
53362
53582
  }
53363
53583
  }
53364
- var createAdapter6 = (config) => new ClaudeCodeAdapter(config);
53584
+ var createAdapter7 = (config) => new ClaudeCodeAdapter(config);
53365
53585
  async function waitForSubprocessExit(child, timeoutMs) {
53366
53586
  return await child.waitForExit(timeoutMs);
53367
53587
  }
@@ -53371,8 +53591,8 @@ function resolveClaudeResumeContext(config) {
53371
53591
  if (!resumeId) {
53372
53592
  return null;
53373
53593
  }
53374
- const projectsRoot = join33(homedir25(), ".claude", "projects");
53375
- if (!existsSync31(projectsRoot)) {
53594
+ const projectsRoot = join34(homedir26(), ".claude", "projects");
53595
+ if (!existsSync32(projectsRoot)) {
53376
53596
  return null;
53377
53597
  }
53378
53598
  let projectSlugs;
@@ -53382,8 +53602,8 @@ function resolveClaudeResumeContext(config) {
53382
53602
  return null;
53383
53603
  }
53384
53604
  for (const slug of projectSlugs) {
53385
- const sessionPath = join33(projectsRoot, slug, `${resumeId}.jsonl`);
53386
- if (!existsSync31(sessionPath)) {
53605
+ const sessionPath = join34(projectsRoot, slug, `${resumeId}.jsonl`);
53606
+ if (!existsSync32(sessionPath)) {
53387
53607
  continue;
53388
53608
  }
53389
53609
  const cwd = decodeClaudeProjectsSlug3(slug);
@@ -53423,7 +53643,7 @@ function resolveExecutableFromPath(command, env) {
53423
53643
  for (const directory of pathValue.split(delimiter3)) {
53424
53644
  if (!directory)
53425
53645
  continue;
53426
- const candidate = join33(directory, command);
53646
+ const candidate = join34(directory, command);
53427
53647
  try {
53428
53648
  if (statSync8(candidate).isFile()) {
53429
53649
  return candidate;
@@ -53434,8 +53654,8 @@ function resolveExecutableFromPath(command, env) {
53434
53654
  }
53435
53655
  // ../agent-sessions/src/adapters/codex/adapter.ts
53436
53656
  init_codex_app_server();
53437
- import { homedir as homedir26 } from "os";
53438
- import { join as join34 } from "path";
53657
+ import { homedir as homedir27 } from "os";
53658
+ import { join as join35 } from "path";
53439
53659
 
53440
53660
  // ../agent-sessions/src/adapters/codex/normalizer.ts
53441
53661
  init_normalizer();
@@ -54283,7 +54503,7 @@ class CodexAdapter extends BaseAdapter {
54283
54503
  sequence = 0;
54284
54504
  constructor(config) {
54285
54505
  super(config);
54286
- const runtimeRoot = join34(homedir26(), ".scout/pairing", "codex", this.session.id);
54506
+ const runtimeRoot = join35(homedir27(), ".scout/pairing", "codex", this.session.id);
54287
54507
  this.observedTopology = new CodexObservedTopologyTracker({
54288
54508
  cwd: config.cwd ?? process.cwd(),
54289
54509
  homeDir: config.env?.HOME,
@@ -54295,8 +54515,8 @@ class CodexAdapter extends BaseAdapter {
54295
54515
  model: this.session.model,
54296
54516
  providerMeta: {
54297
54517
  ...this.session.providerMeta ?? {},
54298
- stdoutLogFile: join34(runtimeRoot, "logs/stdout.log"),
54299
- stderrLogFile: join34(runtimeRoot, "logs/stderr.log")
54518
+ stdoutLogFile: join35(runtimeRoot, "logs/stdout.log"),
54519
+ stderrLogFile: join35(runtimeRoot, "logs/stderr.log")
54300
54520
  }
54301
54521
  });
54302
54522
  }
@@ -54355,7 +54575,7 @@ class CodexAdapter extends BaseAdapter {
54355
54575
  this.setStatus("closed");
54356
54576
  }
54357
54577
  get codexOptions() {
54358
- const runtimeRoot = join34(homedir26(), ".scout/pairing", "codex", this.session.id);
54578
+ const runtimeRoot = join35(homedir27(), ".scout/pairing", "codex", this.session.id);
54359
54579
  const configuredThreadId = this.config.options?.["threadId"];
54360
54580
  const requireExistingThread = this.config.options?.["requireExistingThread"];
54361
54581
  const rawLaunchArgs = this.config.options?.["launchArgs"];
@@ -54367,8 +54587,8 @@ class CodexAdapter extends BaseAdapter {
54367
54587
  sessionId: this.session.id,
54368
54588
  cwd: this.config.cwd ?? process.cwd(),
54369
54589
  systemPrompt: this.systemPrompt,
54370
- runtimeDirectory: join34(runtimeRoot, "runtime"),
54371
- logsDirectory: join34(runtimeRoot, "logs"),
54590
+ runtimeDirectory: join35(runtimeRoot, "runtime"),
54591
+ logsDirectory: join35(runtimeRoot, "logs"),
54372
54592
  env: this.config.env,
54373
54593
  launchArgs,
54374
54594
  threadId: typeof configuredThreadId === "string" && configuredThreadId.trim().length > 0 ? configuredThreadId.trim() : undefined,
@@ -54387,10 +54607,10 @@ class CodexAdapter extends BaseAdapter {
54387
54607
  return typeof raw === "string" && raw.trim().length > 0 ? raw : "You are a helpful agent working through Pairing.";
54388
54608
  }
54389
54609
  get stdoutLogPath() {
54390
- return this.transport?.stdoutLogFile ?? join34(this.codexOptions.logsDirectory, "stdout.log");
54610
+ return this.transport?.stdoutLogFile ?? join35(this.codexOptions.logsDirectory, "stdout.log");
54391
54611
  }
54392
54612
  get stderrLogPath() {
54393
- return this.transport?.stderrLogFile ?? join34(this.codexOptions.logsDirectory, "stderr.log");
54613
+ return this.transport?.stderrLogFile ?? join35(this.codexOptions.logsDirectory, "stderr.log");
54394
54614
  }
54395
54615
  enqueue(task) {
54396
54616
  const next = this.serialized.then(task, task);
@@ -54549,8 +54769,9 @@ class CodexAdapter extends BaseAdapter {
54549
54769
  this.setStatus("error");
54550
54770
  }
54551
54771
  }
54552
- var createAdapter7 = (config) => new CodexAdapter(config);
54772
+ var createAdapter8 = (config) => new CodexAdapter(config);
54553
54773
  // ../agent-sessions/src/index.ts
54774
+ init_devin_acp();
54554
54775
  init_usage();
54555
54776
 
54556
54777
  // ../agent-sessions/src/adapters/acp/index.ts
@@ -54934,7 +55155,7 @@ Referenced files: ${prompt.files.join(", ")}`
54934
55155
  });
54935
55156
  }
54936
55157
  }
54937
- var createAdapter8 = (config) => new OpenAICompatAdapter(config);
55158
+ var createAdapter9 = (config) => new OpenAICompatAdapter(config);
54938
55159
  // ../agent-sessions/src/adapters/opencode/adapter.ts
54939
55160
  class OpenCodeAdapter extends BaseAdapter {
54940
55161
  type = "opencode";
@@ -55385,7 +55606,7 @@ class OpenCodeAdapter extends BaseAdapter {
55385
55606
  });
55386
55607
  }
55387
55608
  }
55388
- var createAdapter9 = (config) => new OpenCodeAdapter(config);
55609
+ var createAdapter10 = (config) => new OpenCodeAdapter(config);
55389
55610
  function throwIfAborted(signal) {
55390
55611
  if (signal?.aborted) {
55391
55612
  throw abortReason(signal);
@@ -55412,9 +55633,9 @@ function delay2(ms, signal) {
55412
55633
  });
55413
55634
  }
55414
55635
  // ../agent-sessions/src/adapters/opencode-v2/adapter.ts
55415
- import { existsSync as existsSync32 } from "fs";
55416
- import { homedir as homedir28 } from "os";
55417
- import { basename as basename13, isAbsolute as isAbsolute4, join as join36, resolve as resolve14 } from "path";
55636
+ import { existsSync as existsSync33 } from "fs";
55637
+ import { homedir as homedir29 } from "os";
55638
+ import { basename as basename13, isAbsolute as isAbsolute4, join as join37, resolve as resolve14 } from "path";
55418
55639
  import { pathToFileURL as pathToFileURL2 } from "url";
55419
55640
 
55420
55641
  // ../../node_modules/.bun/@opencode-ai+client@0.0.0-next-17226+b8d34c012796aeeb/node_modules/@opencode-ai/client/dist/promise/generated/client-error.js
@@ -56667,8 +56888,8 @@ function isContentType(response, expected) {
56667
56888
  // ../../node_modules/.bun/@opencode-ai+client@0.0.0-next-17226+b8d34c012796aeeb/node_modules/@opencode-ai/client/dist/promise/service.js
56668
56889
  import { readFile as readFile10 } from "fs/promises";
56669
56890
  import { spawn as spawn7 } from "child_process";
56670
- import { homedir as homedir27 } from "os";
56671
- import { join as join35 } from "path";
56891
+ import { homedir as homedir28 } from "os";
56892
+ import { join as join36 } from "path";
56672
56893
  async function discover(options = {}) {
56673
56894
  return (await discoverLocal(options))?.endpoint;
56674
56895
  }
@@ -56780,7 +57001,7 @@ async function stop(options = {}) {
56780
57001
  await kill(existing, options);
56781
57002
  }
56782
57003
  function fallback() {
56783
- return join35(process.env["XDG_STATE_HOME"] ?? join35(homedir27(), ".local", "state"), "opencode", "service.json");
57004
+ return join36(process.env["XDG_STATE_HOME"] ?? join36(homedir28(), ".local", "state"), "opencode", "service.json");
56784
57005
  }
56785
57006
  function headers(endpoint) {
56786
57007
  if (endpoint.auth === undefined)
@@ -56947,10 +57168,10 @@ var MAX_FILE_DATA_UTF8_BYTES = 48 * 1024;
56947
57168
  var MAX_QUESTION_OPTIONS = 16;
56948
57169
  var MAX_QUESTION_OPTION_TEXT_UTF8_BYTES = 1024;
56949
57170
  var MAX_SEEN_EVENT_IDS = 4096;
56950
- function isRecord10(value) {
57171
+ function isRecord11(value) {
56951
57172
  return Boolean(value && typeof value === "object" && !Array.isArray(value));
56952
57173
  }
56953
- function stringValue8(value) {
57174
+ function stringValue9(value) {
56954
57175
  return typeof value === "string" && value.trim() ? value : undefined;
56955
57176
  }
56956
57177
  function stringify2(value) {
@@ -56965,13 +57186,13 @@ function stringify2(value) {
56965
57186
  }
56966
57187
  }
56967
57188
  function eventShape(value) {
56968
- if (!isRecord10(value) || typeof value.type !== "string" || !isRecord10(value.data)) {
57189
+ if (!isRecord11(value) || typeof value.type !== "string" || !isRecord11(value.data)) {
56969
57190
  return null;
56970
57191
  }
56971
57192
  return value;
56972
57193
  }
56973
57194
  function eventSessionId(event) {
56974
- return stringValue8(event.data.sessionID);
57195
+ return stringValue9(event.data.sessionID);
56975
57196
  }
56976
57197
  function streamKey(kind, data) {
56977
57198
  return `${kind}:${data.assistantMessageID}:${data.ordinal}`;
@@ -56986,10 +57207,10 @@ function toolNameLooksLikeSubagent(name2) {
56986
57207
  return ["agent", "subagent", "task"].includes(name2.toLowerCase());
56987
57208
  }
56988
57209
  function actionForTool(name2, id, inputValue) {
56989
- const input = isRecord10(inputValue) ? inputValue : {};
57210
+ const input = isRecord11(inputValue) ? inputValue : {};
56990
57211
  const boundedInput = boundOpaqueValue(inputValue, MAX_TOOL_INPUT_UTF8_BYTES, `opencode-v2:tool:${id}:input`);
56991
57212
  if (toolNameLooksLikeCommand(name2)) {
56992
- const command = stringValue8(input.command) ?? (Array.isArray(input.command) ? input.command.filter((entry) => typeof entry === "string").join(" ") : stringify2(inputValue));
57213
+ const command = stringValue9(input.command) ?? (Array.isArray(input.command) ? input.command.filter((entry) => typeof entry === "string").join(" ") : stringify2(inputValue));
56993
57214
  return {
56994
57215
  kind: "command",
56995
57216
  command,
@@ -56998,8 +57219,8 @@ function actionForTool(name2, id, inputValue) {
56998
57219
  };
56999
57220
  }
57000
57221
  if (toolNameLooksLikeFileChange(name2)) {
57001
- const path2 = stringValue8(input.filePath) ?? stringValue8(input.file_path) ?? stringValue8(input.path) ?? stringValue8(input.file) ?? "";
57002
- const diff = stringValue8(input.diff) ?? stringValue8(input.patch);
57222
+ const path2 = stringValue9(input.filePath) ?? stringValue9(input.file_path) ?? stringValue9(input.path) ?? stringValue9(input.file) ?? "";
57223
+ const diff = stringValue9(input.diff) ?? stringValue9(input.patch);
57003
57224
  if (path2) {
57004
57225
  return {
57005
57226
  kind: "file_change",
@@ -57013,9 +57234,9 @@ function actionForTool(name2, id, inputValue) {
57013
57234
  if (toolNameLooksLikeSubagent(name2)) {
57014
57235
  return {
57015
57236
  kind: "subagent",
57016
- agentId: stringValue8(input.agentId) ?? stringValue8(input.agent) ?? id,
57017
- agentName: stringValue8(input.agentName) ?? stringValue8(input.name),
57018
- prompt: stringValue8(input.prompt),
57237
+ agentId: stringValue9(input.agentId) ?? stringValue9(input.agent) ?? id,
57238
+ agentName: stringValue9(input.agentName) ?? stringValue9(input.name),
57239
+ prompt: stringValue9(input.prompt),
57019
57240
  status: "running",
57020
57241
  output: ""
57021
57242
  };
@@ -57030,10 +57251,10 @@ function actionForTool(name2, id, inputValue) {
57030
57251
  };
57031
57252
  }
57032
57253
  function structuredErrorMessage(value) {
57033
- if (!isRecord10(value))
57254
+ if (!isRecord11(value))
57034
57255
  return stringify2(value) || "OpenCode execution failed.";
57035
- const message = stringValue8(value.message) ?? "OpenCode execution failed.";
57036
- const type = stringValue8(value.type);
57256
+ const message = stringValue9(value.message) ?? "OpenCode execution failed.";
57257
+ const type = stringValue9(value.type);
57037
57258
  return type && !message.includes(type) ? `${message} (${type})` : message;
57038
57259
  }
57039
57260
  function boundedText(value, maxBytes) {
@@ -57216,8 +57437,8 @@ class OpenCodeV2EventNormalizer {
57216
57437
  }
57217
57438
  ingestControl(record2) {
57218
57439
  if (record2.event === "prompt_accepted") {
57219
- const payload = isRecord10(record2.payload) ? record2.payload : {};
57220
- const remoteSessionId = stringValue8(payload.remoteSessionId);
57440
+ const payload = isRecord11(record2.payload) ? record2.payload : {};
57441
+ const remoteSessionId = stringValue9(payload.remoteSessionId);
57221
57442
  if (remoteSessionId)
57222
57443
  this.remoteSessionId = remoteSessionId;
57223
57444
  const events2 = this.current ? [...this.finishTurn("failed", "A new prompt replaced an unfinished OpenCode turn.")] : [];
@@ -57253,11 +57474,11 @@ class OpenCodeV2EventNormalizer {
57253
57474
  return this.finishTurn("stopped");
57254
57475
  }
57255
57476
  if (record2.event === "transport_error") {
57256
- const message = isRecord10(record2.payload) ? stringValue8(record2.payload.message) : stringValue8(record2.payload);
57477
+ const message = isRecord11(record2.payload) ? stringValue9(record2.payload.message) : stringValue9(record2.payload);
57257
57478
  return this.finishTurn("failed", message ?? "OpenCode event transport failed.");
57258
57479
  }
57259
- if (record2.event === "question_answered" && isRecord10(record2.payload)) {
57260
- const blockId = stringValue8(record2.payload.blockId);
57480
+ if (record2.event === "question_answered" && isRecord11(record2.payload)) {
57481
+ const blockId = stringValue9(record2.payload.blockId);
57261
57482
  const answer = Array.isArray(record2.payload.answer) ? record2.payload.answer.filter((entry) => typeof entry === "string") : [];
57262
57483
  const request = blockId ? this.questionRequestForBlock(blockId) : undefined;
57263
57484
  return request ? this.resolveQuestions(request.requestId, [answer]) : [];
@@ -57409,7 +57630,7 @@ class OpenCodeV2EventNormalizer {
57409
57630
  data: boundedFileData(item.uri, `opencode-v2:tool:${id}:file:${index2}`)
57410
57631
  }));
57411
57632
  }
57412
- const meta = isRecord10(metadata) ? boundOpaqueValue(metadata, MAX_TOOL_METADATA_UTF8_BYTES, `opencode-v2:tool:${id}:metadata`) : undefined;
57633
+ const meta = isRecord11(metadata) ? boundOpaqueValue(metadata, MAX_TOOL_METADATA_UTF8_BYTES, `opencode-v2:tool:${id}:metadata`) : undefined;
57413
57634
  events2.push({
57414
57635
  event: "block:action:status",
57415
57636
  sessionId: this.context.sessionId,
@@ -57630,69 +57851,69 @@ function deferred() {
57630
57851
  });
57631
57852
  return { promise, resolve: resolvePromise, reject: rejectPromise };
57632
57853
  }
57633
- function isRecord11(value) {
57854
+ function isRecord12(value) {
57634
57855
  return Boolean(value && typeof value === "object" && !Array.isArray(value));
57635
57856
  }
57636
- function stringValue9(value) {
57857
+ function stringValue10(value) {
57637
57858
  return typeof value === "string" && value.trim() ? value.trim() : undefined;
57638
57859
  }
57639
57860
  function numberValue4(value, fallback2) {
57640
57861
  return typeof value === "number" && Number.isFinite(value) && value > 0 ? Math.floor(value) : fallback2;
57641
57862
  }
57642
- function stringArray6(value) {
57863
+ function stringArray7(value) {
57643
57864
  if (!Array.isArray(value) || value.some((entry) => typeof entry !== "string" || !entry.trim())) {
57644
57865
  return;
57645
57866
  }
57646
57867
  return value.map((entry) => entry.trim());
57647
57868
  }
57648
57869
  function defaultOpenCodeV2Binary(env) {
57649
- const override = stringValue9(env?.OPENCODE_V2_BIN) ?? stringValue9(process.env.OPENCODE_V2_BIN);
57870
+ const override = stringValue10(env?.OPENCODE_V2_BIN) ?? stringValue10(process.env.OPENCODE_V2_BIN);
57650
57871
  if (override)
57651
57872
  return override;
57652
- const home = stringValue9(env?.HOME) ?? homedir28();
57873
+ const home = stringValue10(env?.HOME) ?? homedir29();
57653
57874
  const candidates = [
57654
57875
  "/opt/homebrew/bin/opencode2",
57655
57876
  "/usr/local/bin/opencode2",
57656
- join36(home, ".opencode", "bin", "opencode2"),
57657
- join36(home, ".local", "bin", "opencode2")
57877
+ join37(home, ".opencode", "bin", "opencode2"),
57878
+ join37(home, ".local", "bin", "opencode2")
57658
57879
  ];
57659
- return candidates.find((candidate) => existsSync32(candidate)) ?? "opencode2";
57880
+ return candidates.find((candidate) => existsSync33(candidate)) ?? "opencode2";
57660
57881
  }
57661
57882
  function modelRef(value, variantValue) {
57662
- const raw = stringValue9(value);
57883
+ const raw = stringValue10(value);
57663
57884
  if (!raw)
57664
57885
  return;
57665
57886
  const hash = raw.lastIndexOf("#");
57666
57887
  const withoutVariant = hash > 0 ? raw.slice(0, hash) : raw;
57667
- const inlineVariant = hash > 0 ? stringValue9(raw.slice(hash + 1)) : undefined;
57888
+ const inlineVariant = hash > 0 ? stringValue10(raw.slice(hash + 1)) : undefined;
57668
57889
  const slash = withoutVariant.indexOf("/");
57669
57890
  const providerID = slash > 0 ? withoutVariant.slice(0, slash) : "opencode";
57670
57891
  const id = slash > 0 ? withoutVariant.slice(slash + 1) : withoutVariant;
57671
57892
  if (!id)
57672
57893
  return;
57673
- const variant = stringValue9(variantValue) ?? inlineVariant;
57894
+ const variant = stringValue10(variantValue) ?? inlineVariant;
57674
57895
  return { id, providerID, ...variant ? { variant } : {} };
57675
57896
  }
57676
57897
  function parseOptions3(config) {
57677
- const raw = isRecord11(config.options) ? config.options : {};
57678
- const explicitCommand = stringArray6(raw.command);
57679
- const binary = stringValue9(raw.command) ?? defaultOpenCodeV2Binary(config.env);
57680
- const args = stringArray6(raw.args) ?? ["serve", "--service"];
57681
- const requiredVersion = raw.requiredVersion === false ? null : stringValue9(raw.requiredVersion) ?? OPENCODE_V2_CLIENT_VERSION;
57898
+ const raw = isRecord12(config.options) ? config.options : {};
57899
+ const explicitCommand = stringArray7(raw.command);
57900
+ const binary = stringValue10(raw.command) ?? defaultOpenCodeV2Binary(config.env);
57901
+ const args = stringArray7(raw.args) ?? ["serve", "--service"];
57902
+ const requiredVersion = raw.requiredVersion === false ? null : stringValue10(raw.requiredVersion) ?? OPENCODE_V2_CLIENT_VERSION;
57682
57903
  return {
57683
- serverUrl: stringValue9(raw.serverUrl) ?? stringValue9(raw.url),
57684
- serverUsername: stringValue9(raw.serverUsername) ?? "opencode",
57685
- serverPassword: stringValue9(raw.serverPassword) ?? stringValue9(config.env?.OPENCODE_PASSWORD) ?? stringValue9(process.env.OPENCODE_PASSWORD),
57686
- serviceFile: stringValue9(raw.serviceFile),
57904
+ serverUrl: stringValue10(raw.serverUrl) ?? stringValue10(raw.url),
57905
+ serverUsername: stringValue10(raw.serverUsername) ?? "opencode",
57906
+ serverPassword: stringValue10(raw.serverPassword) ?? stringValue10(config.env?.OPENCODE_PASSWORD) ?? stringValue10(process.env.OPENCODE_PASSWORD),
57907
+ serviceFile: stringValue10(raw.serviceFile),
57687
57908
  autoStart: raw.autoStart !== false,
57688
57909
  command: explicitCommand ?? [binary, ...args],
57689
57910
  requiredVersion,
57690
57911
  startupTimeoutMs: numberValue4(raw.startupTimeoutMs, DEFAULT_STARTUP_TIMEOUT_MS2),
57691
57912
  reconnectDelayMs: numberValue4(raw.reconnectDelayMs, DEFAULT_RECONNECT_DELAY_MS),
57692
- remoteSessionId: stringValue9(raw.sessionId) ?? stringValue9(raw.session),
57913
+ remoteSessionId: stringValue10(raw.sessionId) ?? stringValue10(raw.session),
57693
57914
  allowCrossDirectoryResume: raw.allowCrossDirectoryResume === true,
57694
- title: stringValue9(raw.title) ?? stringValue9(config.name),
57695
- agent: stringValue9(raw.agent),
57915
+ title: stringValue10(raw.title) ?? stringValue10(config.name),
57916
+ agent: stringValue10(raw.agent),
57696
57917
  model: modelRef(raw.model, raw.variant)
57697
57918
  };
57698
57919
  }
@@ -57776,20 +57997,20 @@ function observeWithinSignal(promise, signal2) {
57776
57997
  function normalizedError(error, fallback2) {
57777
57998
  if (error instanceof Error)
57778
57999
  return new Error(redactSecrets(error.message || fallback2), { cause: error });
57779
- if (isRecord11(error)) {
57780
- const tag = stringValue9(error._tag);
57781
- const message = stringValue9(error.message) ?? fallback2;
58000
+ if (isRecord12(error)) {
58001
+ const tag = stringValue10(error._tag);
58002
+ const message = stringValue10(error.message) ?? fallback2;
57782
58003
  return new Error(redactSecrets(tag ? `${message} (${tag})` : message));
57783
58004
  }
57784
58005
  return new Error(redactSecrets(typeof error === "string" ? error : fallback2));
57785
58006
  }
57786
58007
  function isAuthoritativePromptRejection(error) {
57787
- if (!isRecord11(error))
58008
+ if (!isRecord12(error))
57788
58009
  return false;
57789
58010
  return error._tag === "InvalidRequestError" || error._tag === "UnauthorizedError" || error._tag === "SessionNotFoundError";
57790
58011
  }
57791
58012
  function httpServerResponseObserved(error) {
57792
- if (!isRecord11(error))
58013
+ if (!isRecord12(error))
57793
58014
  return false;
57794
58015
  if (typeof error._tag === "string")
57795
58016
  return true;
@@ -58657,7 +58878,7 @@ class OpenCodeV2Adapter extends BaseAdapter {
58657
58878
  return this.nativeSessionId;
58658
58879
  }
58659
58880
  }
58660
- var createAdapter10 = (config) => new OpenCodeV2Adapter(config);
58881
+ var createAdapter11 = (config) => new OpenCodeV2Adapter(config);
58661
58882
  var OPENCODE_V2_CAPABILITIES = Object.freeze({
58662
58883
  protocolVersion: "v2",
58663
58884
  transport: "http-sse",
@@ -58679,10 +58900,10 @@ init_pi();
58679
58900
 
58680
58901
  // ../web/server/core/pairing/runtime/bridge/log.ts
58681
58902
  import { appendFileSync as appendFileSync2, mkdirSync as mkdirSync15 } from "fs";
58682
- import { join as join37 } from "path";
58683
- import { homedir as homedir29 } from "os";
58684
- var LOG_DIR = join37(homedir29(), ".scout/pairing");
58685
- var LOG_FILE = join37(LOG_DIR, "bridge.log");
58903
+ import { join as join38 } from "path";
58904
+ import { homedir as homedir30 } from "os";
58905
+ var LOG_DIR = join38(homedir30(), ".scout/pairing");
58906
+ var LOG_FILE = join38(LOG_DIR, "bridge.log");
58686
58907
  mkdirSync15(LOG_DIR, { recursive: true });
58687
58908
  function write2(level, category, message, data) {
58688
58909
  const ts = new Date().toISOString().slice(11, 23);
@@ -58767,17 +58988,17 @@ class Bridge {
58767
58988
 
58768
58989
  // ../web/server/core/pairing/runtime/bridge/config.ts
58769
58990
  init_local_config();
58770
- import { existsSync as existsSync33, readFileSync as readFileSync20 } from "fs";
58771
- import { join as join38 } from "path";
58772
- import { homedir as homedir30 } from "os";
58991
+ import { existsSync as existsSync34, readFileSync as readFileSync20 } from "fs";
58992
+ import { join as join39 } from "path";
58993
+ import { homedir as homedir31 } from "os";
58773
58994
  var DEFAULTS = {
58774
58995
  port: 43130,
58775
58996
  secure: true
58776
58997
  };
58777
- var CONFIG_DIR = join38(homedir30(), ".scout/pairing");
58778
- var CONFIG_FILE = join38(CONFIG_DIR, "config.json");
58998
+ var CONFIG_DIR = join39(homedir31(), ".scout/pairing");
58999
+ var CONFIG_FILE = join39(CONFIG_DIR, "config.json");
58779
59000
  function loadConfigFile() {
58780
- if (!existsSync33(CONFIG_FILE)) {
59001
+ if (!existsSync34(CONFIG_FILE)) {
58781
59002
  return {};
58782
59003
  }
58783
59004
  try {
@@ -58847,10 +59068,10 @@ function resolveConfig() {
58847
59068
 
58848
59069
  // ../web/server/core/pairing/runtime/bridge/fileserver.ts
58849
59070
  import { randomUUID as randomUUID3 } from "crypto";
58850
- import { existsSync as existsSync34, mkdirSync as mkdirSync16, readFileSync as readFileSync21, realpathSync as realpathSync4, statSync as statSync10, unlinkSync as unlinkSync2, writeFileSync as writeFileSync12 } from "fs";
59071
+ import { existsSync as existsSync35, mkdirSync as mkdirSync16, readFileSync as readFileSync21, realpathSync as realpathSync4, statSync as statSync10, unlinkSync as unlinkSync2, writeFileSync as writeFileSync12 } from "fs";
58851
59072
  import { BlockList, isIP } from "net";
58852
- import { isAbsolute as isAbsolute6, join as join39, relative as relative5, sep as sep2 } from "path";
58853
- import { homedir as homedir31 } from "os";
59073
+ import { isAbsolute as isAbsolute6, join as join40, relative as relative5, sep as sep2 } from "path";
59074
+ import { homedir as homedir32 } from "os";
58854
59075
 
58855
59076
  // ../web/server/core/pairing/runtime/bridge/web-handoff.ts
58856
59077
  import { randomBytes as randomBytes7 } from "crypto";
@@ -59099,12 +59320,12 @@ function presentationResponse(body, status, headers2 = {}) {
59099
59320
  }
59100
59321
 
59101
59322
  // ../web/server/core/pairing/runtime/bridge/fileserver.ts
59102
- var ALLOWED_ROOTS = [homedir31(), "/tmp"];
59323
+ var ALLOWED_ROOTS = [homedir32(), "/tmp"];
59103
59324
  var LOOPBACK_PEERS = new BlockList;
59104
59325
  LOOPBACK_PEERS.addSubnet("127.0.0.0", 8, "ipv4");
59105
59326
  LOOPBACK_PEERS.addAddress("::1", "ipv6");
59106
59327
  LOOPBACK_PEERS.addSubnet("::ffff:127.0.0.0", 104, "ipv6");
59107
- var PAIRING_ATTACHMENT_ROOT = join39(homedir31(), ".scout", "pairing", "attachments");
59328
+ var PAIRING_ATTACHMENT_ROOT = join40(homedir32(), ".scout", "pairing", "attachments");
59108
59329
  var PAIRING_ATTACHMENT_TTL_MS = 6 * 60 * 60 * 1000;
59109
59330
  var PAIRING_ATTACHMENT_MAX_BYTES = 25 * 1024 * 1024;
59110
59331
  var PAIRING_ATTACHMENT_PATH_PREFIX = "/attachments/";
@@ -59127,7 +59348,7 @@ function storePairingAttachmentBlob(input, options) {
59127
59348
  mkdirSync16(PAIRING_ATTACHMENT_ROOT, { recursive: true, mode: 448 });
59128
59349
  purgeExpiredPairingAttachments(options.now);
59129
59350
  const id = `att-${randomUUID3()}`;
59130
- const path2 = join39(PAIRING_ATTACHMENT_ROOT, id);
59351
+ const path2 = join40(PAIRING_ATTACHMENT_ROOT, id);
59131
59352
  writeFileSync12(path2, data, { mode: 384 });
59132
59353
  const now = options.now ?? Date.now();
59133
59354
  const entry = {
@@ -59176,21 +59397,21 @@ function resolvePairingAttachment(id, now) {
59176
59397
  }
59177
59398
  const known = attachmentBlobs.get(id);
59178
59399
  if (known) {
59179
- if (known.expiresAt <= now || !existsSync34(known.path)) {
59400
+ if (known.expiresAt <= now || !existsSync35(known.path)) {
59180
59401
  forgetPairingAttachment(id);
59181
59402
  return null;
59182
59403
  }
59183
59404
  return known;
59184
59405
  }
59185
59406
  const rehydrated = readAttachmentSidecar(id);
59186
- if (!rehydrated || rehydrated.expiresAt <= now || !existsSync34(rehydrated.path)) {
59407
+ if (!rehydrated || rehydrated.expiresAt <= now || !existsSync35(rehydrated.path)) {
59187
59408
  return null;
59188
59409
  }
59189
59410
  attachmentBlobs.set(id, rehydrated);
59190
59411
  return rehydrated;
59191
59412
  }
59192
59413
  function attachmentSidecarPath(id) {
59193
- return join39(PAIRING_ATTACHMENT_ROOT, `${id}.json`);
59414
+ return join40(PAIRING_ATTACHMENT_ROOT, `${id}.json`);
59194
59415
  }
59195
59416
  function writeAttachmentSidecar(entry) {
59196
59417
  try {
@@ -59212,7 +59433,7 @@ function readAttachmentSidecar(id) {
59212
59433
  }
59213
59434
  return {
59214
59435
  id,
59215
- path: join39(PAIRING_ATTACHMENT_ROOT, id),
59436
+ path: join40(PAIRING_ATTACHMENT_ROOT, id),
59216
59437
  mediaType,
59217
59438
  fileName: sanitizeAttachmentFileName(raw.fileName),
59218
59439
  size: typeof raw.size === "number" ? raw.size : 0,
@@ -59224,7 +59445,7 @@ function readAttachmentSidecar(id) {
59224
59445
  }
59225
59446
  function forgetPairingAttachment(id) {
59226
59447
  attachmentBlobs.delete(id);
59227
- for (const path2 of [join39(PAIRING_ATTACHMENT_ROOT, id), attachmentSidecarPath(id)]) {
59448
+ for (const path2 of [join40(PAIRING_ATTACHMENT_ROOT, id), attachmentSidecarPath(id)]) {
59228
59449
  try {
59229
59450
  unlinkSync2(path2);
59230
59451
  } catch {}
@@ -59276,7 +59497,7 @@ function isInsideRoot(root, candidate) {
59276
59497
  function isAllowedHomeRelativePath(rel) {
59277
59498
  if (!rel.startsWith("."))
59278
59499
  return true;
59279
- return rel === ".claude" || rel.startsWith(`.claude${sep2}`) || rel === join39(".scout", "pairing") || rel.startsWith(`${join39(".scout", "pairing")}${sep2}`);
59500
+ return rel === ".claude" || rel.startsWith(`.claude${sep2}`) || rel === join40(".scout", "pairing") || rel.startsWith(`${join40(".scout", "pairing")}${sep2}`);
59280
59501
  }
59281
59502
  function resolveAllowedFile(filePath) {
59282
59503
  if (!isAbsolute6(filePath))
@@ -59287,7 +59508,7 @@ function resolveAllowedFile(filePath) {
59287
59508
  } catch {
59288
59509
  return { status: "missing" };
59289
59510
  }
59290
- const canonicalHome = realpathSync4(homedir31());
59511
+ const canonicalHome = realpathSync4(homedir32());
59291
59512
  for (const configuredRoot of ALLOWED_ROOTS) {
59292
59513
  const root = realpathSync4(configuredRoot);
59293
59514
  if (!isInsideRoot(root, candidate))
@@ -61345,7 +61566,8 @@ async function sendScoutConversationMessage(input) {
61345
61566
  const currentDirectory = input.currentDirectory ?? process.cwd();
61346
61567
  const createdAtMs = input.createdAtMs ?? Date.now();
61347
61568
  const senderId = await resolveConversationActorId(broker2.baseUrl, broker2.snapshot, broker2.node.id, input.senderId, currentDirectory);
61348
- const mentionResolution = await resolveMentionTargets(broker2.snapshot, input.body, currentDirectory);
61569
+ const routeBodyMentions = input.resolveMentionsFromBody !== false;
61570
+ const mentionResolution = routeBodyMentions ? await resolveMentionTargets(broker2.snapshot, input.body, currentDirectory) : { resolved: [], unresolved: [], ambiguous: [] };
61349
61571
  const mentionedTargetIds = new Set(mentionResolution.resolved.map((target2) => target2.agentId));
61350
61572
  const participantTargetIds = input.notifyParticipantAgents && (conversation.kind === "channel" || conversation.kind === "group_direct" || conversation.kind === "thread") ? conversation.participantIds.filter((participantId) => isSteerableParticipant(broker2.snapshot, participantId, senderId)) : [];
61351
61573
  const candidateTargetIds = [...new Set([
@@ -61732,8 +61954,8 @@ var watchSharedScoutMessages = createBrokerMessageFanout();
61732
61954
  // ../web/server/core/pairing/runtime/bridge/server.ts
61733
61955
  init_system_probes();
61734
61956
  import { readdirSync as readdirSync7, readFileSync as readFileSync25, realpathSync as realpathSync5, statSync as statSync14 } from "fs";
61735
- import { basename as basename16, isAbsolute as isAbsolute7, join as join47, relative as relative6, resolve as resolve19 } from "path";
61736
- import { homedir as homedir38 } from "os";
61957
+ import { basename as basename16, isAbsolute as isAbsolute7, join as join48, relative as relative6, resolve as resolve19 } from "path";
61958
+ import { homedir as homedir39 } from "os";
61737
61959
 
61738
61960
  // ../web/server/core/mobile/service.ts
61739
61961
  init_src();
@@ -61744,9 +61966,9 @@ init_setup();
61744
61966
 
61745
61967
  // ../runtime/src/agent-workspace.ts
61746
61968
  init_exec();
61747
- import { existsSync as existsSync35 } from "fs";
61969
+ import { existsSync as existsSync36 } from "fs";
61748
61970
  import { mkdir as mkdir9 } from "fs/promises";
61749
- import { join as join40 } from "path";
61971
+ import { join as join41 } from "path";
61750
61972
  var SCOUT_WORKSPACES_DIRNAME = ".scout-worktrees";
61751
61973
  async function isGitRepo(projectRoot) {
61752
61974
  try {
@@ -61767,9 +61989,9 @@ async function createAgentWorkspace(projectRoot, agentName, requestedBranch) {
61767
61989
  }
61768
61990
  const branch = requestedBranch?.trim() || `scout/${agentName}`;
61769
61991
  validateWorktreeBranch(branch);
61770
- const workspaceDir = join40(projectRoot, SCOUT_WORKSPACES_DIRNAME);
61771
- const workspacePath = join40(workspaceDir, agentName);
61772
- if (existsSync35(workspacePath)) {
61992
+ const workspaceDir = join41(projectRoot, SCOUT_WORKSPACES_DIRNAME);
61993
+ const workspacePath = join41(workspaceDir, agentName);
61994
+ if (existsSync36(workspacePath)) {
61773
61995
  return { path: workspacePath, branch };
61774
61996
  }
61775
61997
  await mkdir9(workspaceDir, { recursive: true });
@@ -61807,11 +62029,11 @@ var {
61807
62029
 
61808
62030
  // ../web/server/db/internal/db.ts
61809
62031
  import { Database as Database2 } from "bun:sqlite";
61810
- import { homedir as homedir32 } from "os";
61811
- import { join as join41 } from "path";
62032
+ import { homedir as homedir33 } from "os";
62033
+ import { join as join42 } from "path";
61812
62034
  function resolveDbPath() {
61813
- const controlHome = process.env.OPENSCOUT_CONTROL_HOME ?? join41(homedir32(), ".openscout", "control-plane");
61814
- return join41(controlHome, "control-plane.sqlite");
62035
+ const controlHome = process.env.OPENSCOUT_CONTROL_HOME ?? join42(homedir33(), ".openscout", "control-plane");
62036
+ return join42(controlHome, "control-plane.sqlite");
61815
62037
  }
61816
62038
  var _db = null;
61817
62039
  var DB_BUSY_TIMEOUT_MS = 250;
@@ -61833,9 +62055,9 @@ function normalizeTimestampMs(value) {
61833
62055
  }
61834
62056
 
61835
62057
  // ../web/server/db/internal/paths.ts
61836
- import { homedir as homedir33 } from "os";
62058
+ import { homedir as homedir34 } from "os";
61837
62059
  init_support_paths();
61838
- var HOME = homedir33();
62060
+ var HOME = homedir34();
61839
62061
  function compact(p) {
61840
62062
  if (!p)
61841
62063
  return null;
@@ -62556,10 +62778,10 @@ function isMissingTerminalSessionRegistryError(error) {
62556
62778
  }
62557
62779
  // ../web/server/service-budgets.ts
62558
62780
  import { createHash as createHash7 } from "crypto";
62559
- import { existsSync as existsSync36, mkdirSync as mkdirSync17, readdirSync as readdirSync6, readFileSync as readFileSync22, renameSync as renameSync6, statSync as statSync11, writeFileSync as writeFileSync13 } from "fs";
62781
+ import { existsSync as existsSync37, mkdirSync as mkdirSync17, readdirSync as readdirSync6, readFileSync as readFileSync22, renameSync as renameSync6, statSync as statSync11, writeFileSync as writeFileSync13 } from "fs";
62560
62782
  import { open, readdir as readdir4, stat as stat6 } from "fs/promises";
62561
- import { homedir as homedir34 } from "os";
62562
- import { dirname as dirname22, join as join42 } from "path";
62783
+ import { homedir as homedir35 } from "os";
62784
+ import { dirname as dirname22, join as join43 } from "path";
62563
62785
  import { createInterface as createInterface2 } from "readline";
62564
62786
  init_src();
62565
62787
  init_claude_statusline();
@@ -62668,8 +62890,8 @@ async function loadCodexGauge(forceRefresh = false) {
62668
62890
  harness: "codex",
62669
62891
  maxAgeMs: WEEK_MS
62670
62892
  });
62671
- const root = join42(homeDir(), ".codex", "sessions");
62672
- if (!existsSync36(root))
62893
+ const root = join43(homeDir(), ".codex", "sessions");
62894
+ if (!existsSync37(root))
62673
62895
  return fallback2;
62674
62896
  const candidates = await findRecentCodexJsonl(root, CODEX_LOOKBACK_DAYS);
62675
62897
  if (candidates.length === 0)
@@ -62726,7 +62948,7 @@ function codexQuotaSnapshotsFromObservation(usage, capturedAt) {
62726
62948
  return usage.quotaWindows.map((window2) => codexQuotaSnapshot(window2, capturedAt, usage.planType, usage.limitId)).filter((entry) => entry !== null);
62727
62949
  }
62728
62950
  function bindingCodexPoolSnapshots(snapshots) {
62729
- const poolIdOf = (row) => stringValue10(row.metadata?.limitId) ?? "";
62951
+ const poolIdOf = (row) => stringValue11(row.metadata?.limitId) ?? "";
62730
62952
  const pools = new Set(snapshots.map(poolIdOf));
62731
62953
  if (pools.size <= 1)
62732
62954
  return snapshots;
@@ -62771,7 +62993,7 @@ async function findRecentCodexJsonl(root, lookbackDays) {
62771
62993
  continue;
62772
62994
  }
62773
62995
  for (const entry of entries) {
62774
- const full = join42(dir, entry.name);
62996
+ const full = join43(dir, entry.name);
62775
62997
  if (entry.isDirectory()) {
62776
62998
  pending.push(full);
62777
62999
  } else if (entry.isFile() && entry.name.endsWith(".jsonl")) {
@@ -62896,7 +63118,7 @@ function claudeStatuslineDir() {
62896
63118
  return resolveClaudeStatuslineDirectory();
62897
63119
  }
62898
63120
  function readClaudeStatuslineLatest() {
62899
- return readJsonRecord(join42(claudeStatuslineDir(), "claude-latest.json"));
63121
+ return readJsonRecord(join43(claudeStatuslineDir(), "claude-latest.json"));
62900
63122
  }
62901
63123
  function loadClaudeStatuslineQuotaSnapshots() {
62902
63124
  const now = Date.now();
@@ -62908,7 +63130,7 @@ function loadClaudeStatuslineQuotaSnapshots() {
62908
63130
  ].flatMap((record2) => claudeQuotaSnapshotsFromStatusline(record2)).sort((a, b) => b.capturedAt - a.capturedAt).slice(0, PERSISTED_QUOTA_ROW_LIMIT);
62909
63131
  }
62910
63132
  function readClaudeStatuslineHistory(minCapturedAt) {
62911
- const path2 = join42(claudeStatuslineDir(), "claude-history.jsonl");
63133
+ const path2 = join43(claudeStatuslineDir(), "claude-history.jsonl");
62912
63134
  const stat7 = safeStat(path2);
62913
63135
  if (!stat7)
62914
63136
  return [];
@@ -62982,8 +63204,8 @@ function claudeQuotaSnapshotFromStatuslineWindow(record2, value, options) {
62982
63204
  capturedAt: options.capturedAt,
62983
63205
  metadata: {
62984
63206
  source: "service-budgets.claude-statusline",
62985
- sessionId: stringValue10(record2.session_id),
62986
- cwd: stringValue10(record2.cwd),
63207
+ sessionId: stringValue11(record2.session_id),
63208
+ cwd: stringValue11(record2.cwd),
62987
63209
  model: claudeStatuslineModel(record2)
62988
63210
  }
62989
63211
  };
@@ -62993,7 +63215,7 @@ function claudeStatuslineCapturedAt(record2) {
62993
63215
  }
62994
63216
  function claudeStatuslineModel(record2) {
62995
63217
  const model = recordValue(record2.model);
62996
- return stringValue10(model?.id) ?? stringValue10(model?.display_name);
63218
+ return stringValue11(model?.id) ?? stringValue11(model?.display_name);
62997
63219
  }
62998
63220
  function loadPersistedProviderQuotaGauge(input) {
62999
63221
  return quotaGaugeFromSnapshots({
@@ -63076,7 +63298,7 @@ function quotaGaugeFromSnapshots(input, snapshots) {
63076
63298
  return null;
63077
63299
  const displayWindow = windows.find((window2) => window2.label === "7d") ?? windows[windows.length - 1];
63078
63300
  const fill = Math.max(...windows.map((window2) => window2.fill));
63079
- const plan = snapshots.filter((snapshot) => snapshot.capturedAt >= minCurrentCapturedAt).sort((a, b) => b.capturedAt - a.capturedAt).map((snapshot) => stringValue10(snapshot.planType)).find((value) => Boolean(value));
63301
+ const plan = snapshots.filter((snapshot) => snapshot.capturedAt >= minCurrentCapturedAt).sort((a, b) => b.capturedAt - a.capturedAt).map((snapshot) => stringValue11(snapshot.planType)).find((value) => Boolean(value));
63080
63302
  return {
63081
63303
  id: input.id,
63082
63304
  label: input.label,
@@ -63127,7 +63349,7 @@ function quotaHistoryByWindow(snapshots) {
63127
63349
  return out;
63128
63350
  }
63129
63351
  function quotaSnapshotWindowKey(row) {
63130
- const resource = stringValue10(row.metadata?.resource) ?? stringValue10(row.metadata?.modelName) ?? "";
63352
+ const resource = stringValue11(row.metadata?.resource) ?? stringValue11(row.metadata?.modelName) ?? "";
63131
63353
  return [resource, formatStoredQuotaWindowLabel(row)].join(":");
63132
63354
  }
63133
63355
  function quotaSnapshotIsExpired(row, now) {
@@ -63271,7 +63493,7 @@ async function readKimiUsageResponse() {
63271
63493
  return parsed;
63272
63494
  }
63273
63495
  const credentials = readKimiCredentials();
63274
- const accessToken = stringValue10(credentials?.access_token);
63496
+ const accessToken = stringValue11(credentials?.access_token);
63275
63497
  if (!accessToken)
63276
63498
  return null;
63277
63499
  let response;
@@ -63302,12 +63524,12 @@ async function readKimiUsageResponse() {
63302
63524
  }
63303
63525
  }
63304
63526
  function kimiCodeHome() {
63305
- return process.env.KIMI_CODE_HOME?.trim() || join42(homeDir(), ".kimi-code");
63527
+ return process.env.KIMI_CODE_HOME?.trim() || join43(homeDir(), ".kimi-code");
63306
63528
  }
63307
63529
  function readKimiCredentials() {
63308
- const candidates = [join42(kimiCodeHome(), "credentials", "kimi-code.json")];
63530
+ const candidates = [join43(kimiCodeHome(), "credentials", "kimi-code.json")];
63309
63531
  if (!process.env.KIMI_CODE_HOME?.trim()) {
63310
- candidates.push(join42(homeDir(), ".kimi", "credentials", "kimi-code.json"));
63532
+ candidates.push(join43(homeDir(), ".kimi", "credentials", "kimi-code.json"));
63311
63533
  }
63312
63534
  for (const path2 of candidates) {
63313
63535
  const credentials = readJsonRecord(path2);
@@ -63374,7 +63596,7 @@ function kimiWindowMs(window2) {
63374
63596
  const duration = numericValue(window2?.duration);
63375
63597
  if (duration === undefined || duration <= 0)
63376
63598
  return null;
63377
- const unit = stringValue10(window2?.timeUnit)?.toUpperCase() ?? "";
63599
+ const unit = stringValue11(window2?.timeUnit)?.toUpperCase() ?? "";
63378
63600
  if (unit.includes("MINUTE"))
63379
63601
  return duration * 60000;
63380
63602
  if (unit.includes("HOUR"))
@@ -63386,13 +63608,13 @@ function kimiWindowMs(window2) {
63386
63608
  return null;
63387
63609
  }
63388
63610
  function kimiMembershipPlan(payload) {
63389
- const raw2 = stringValue10(payload.user?.membership?.level);
63611
+ const raw2 = stringValue11(payload.user?.membership?.level);
63390
63612
  if (!raw2)
63391
63613
  return;
63392
63614
  return raw2.replace(/^LEVEL_/u, "").toLowerCase().replace(/(^|_)([a-z])/gu, (_match, prefix, letter) => `${prefix ? " " : ""}${letter.toUpperCase()}`);
63393
63615
  }
63394
63616
  function dashboardImportPath() {
63395
- return join42(dirname22(resolveDbPath()), "provider-usage-snapshots.json");
63617
+ return join43(dirname22(resolveDbPath()), "provider-usage-snapshots.json");
63396
63618
  }
63397
63619
  function readDashboardUsageStore() {
63398
63620
  const record2 = readJsonRecord(dashboardImportPath());
@@ -63406,8 +63628,8 @@ function readDashboardUsageStore() {
63406
63628
  store2.providers[provider] = {
63407
63629
  provider,
63408
63630
  capturedAt,
63409
- plan: stringValue10(value?.plan),
63410
- periodLabel: stringValue10(value?.periodLabel),
63631
+ plan: stringValue11(value?.plan),
63632
+ periodLabel: stringValue11(value?.periodLabel),
63411
63633
  usedPercent: numericValue(value?.usedPercent),
63412
63634
  resetAt: numericValue(value?.resetAt),
63413
63635
  totalTokens: numericValue(value?.totalTokens),
@@ -63496,7 +63718,7 @@ async function loadGrokGauge() {
63496
63718
  };
63497
63719
  }
63498
63720
  async function loadGrokBillingQuotaSnapshots() {
63499
- const path2 = join42(homeDir(), ".grok", "logs", "unified.jsonl");
63721
+ const path2 = join43(homeDir(), ".grok", "logs", "unified.jsonl");
63500
63722
  const stat7 = safeStat(path2);
63501
63723
  if (!stat7 || stat7.size <= 0)
63502
63724
  return [];
@@ -63534,7 +63756,7 @@ async function loadGrokBillingQuotaSnapshots() {
63534
63756
  }).sort((left, right) => left.capturedAt - right.capturedAt).slice(-PERSISTED_QUOTA_ROW_LIMIT);
63535
63757
  }
63536
63758
  function grokBillingQuotaSnapshot(record2) {
63537
- if (!record2 || stringValue10(record2.msg) !== "billing: fetched credits config")
63759
+ if (!record2 || stringValue11(record2.msg) !== "billing: fetched credits config")
63538
63760
  return null;
63539
63761
  const context = recordValue(record2.ctx);
63540
63762
  const config = recordValue(context?.config);
@@ -63545,7 +63767,7 @@ function grokBillingQuotaSnapshot(record2) {
63545
63767
  const period = recordValue(config?.currentPeriod);
63546
63768
  const startAt = timestampMs(period?.start) ?? timestampMs(config?.billingPeriodStart);
63547
63769
  const resetAt = timestampMs(period?.end) ?? timestampMs(config?.billingPeriodEnd);
63548
- const periodType = stringValue10(period?.type)?.toUpperCase() ?? "";
63770
+ const periodType = stringValue11(period?.type)?.toUpperCase() ?? "";
63549
63771
  const inferredWindowMs = periodType.includes("MONTH") ? 30 * 24 * 3600000 : WEEK_MS;
63550
63772
  const windowMs = startAt !== undefined && resetAt !== undefined && resetAt > startAt ? resetAt - startAt : inferredWindowMs;
63551
63773
  const label = periodType.includes("MONTH") ? "30d" : periodType.includes("WEEK") ? "7d" : formatWindowMs(windowMs) ?? "quota";
@@ -63554,7 +63776,7 @@ function grokBillingQuotaSnapshot(record2) {
63554
63776
  provider: "xai",
63555
63777
  harness: "grok",
63556
63778
  transport: "grok_local_log",
63557
- planType: stringValue10(context?.subscriptionTier) ?? stringValue10(config?.subscriptionTier),
63779
+ planType: stringValue11(context?.subscriptionTier) ?? stringValue11(config?.subscriptionTier),
63558
63780
  label,
63559
63781
  windowKind: "subscription",
63560
63782
  usedPercent,
@@ -63574,8 +63796,8 @@ function loadGrokLocalUsage() {
63574
63796
  const usage = grokUsageFromRecord(parsed, Date.now());
63575
63797
  return usage ? [usage] : [];
63576
63798
  }
63577
- const root = join42(homeDir(), ".grok", "sessions");
63578
- if (!existsSync36(root))
63799
+ const root = join43(homeDir(), ".grok", "sessions");
63800
+ if (!existsSync37(root))
63579
63801
  return [];
63580
63802
  const cutoff = Date.now() - WEEK_MS;
63581
63803
  const paths2 = [];
@@ -63587,7 +63809,7 @@ function loadGrokLocalUsage() {
63587
63809
  return;
63588
63810
  }
63589
63811
  for (const entry of entries) {
63590
- const path2 = join42(directory, entry.name);
63812
+ const path2 = join43(directory, entry.name);
63591
63813
  if (entry.isDirectory())
63592
63814
  walk(path2);
63593
63815
  else if (entry.isFile() && entry.name === "updates.jsonl" && (safeStat(path2)?.mtimeMs ?? 0) >= cutoff)
@@ -63639,8 +63861,8 @@ function formatTokenCount(value) {
63639
63861
  }
63640
63862
  async function loadCursorGauge() {
63641
63863
  const state = readCursorSubscriptionState();
63642
- const membership = stringValue10(state?.membershipType);
63643
- const subscriptionStatus = stringValue10(state?.subscriptionStatus);
63864
+ const membership = stringValue11(state?.membershipType);
63865
+ const subscriptionStatus = stringValue11(state?.subscriptionStatus);
63644
63866
  const imported = readDashboardUsageStore().providers.cursor;
63645
63867
  const dashboard = imported ? dashboardGauge(imported) : null;
63646
63868
  if (!membership && !subscriptionStatus)
@@ -63665,11 +63887,11 @@ function readCursorSubscriptionState() {
63665
63887
  return parseJsonRecord2(fixtureJson);
63666
63888
  }
63667
63889
  const candidates = [
63668
- join42(homeDir(), "Library", "Application Support", "Cursor", "User", "globalStorage", "state.vscdb"),
63669
- join42(homeDir(), ".config", "Cursor", "User", "globalStorage", "state.vscdb")
63890
+ join43(homeDir(), "Library", "Application Support", "Cursor", "User", "globalStorage", "state.vscdb"),
63891
+ join43(homeDir(), ".config", "Cursor", "User", "globalStorage", "state.vscdb")
63670
63892
  ];
63671
63893
  for (const path2 of candidates) {
63672
- if (!existsSync36(path2))
63894
+ if (!existsSync37(path2))
63673
63895
  continue;
63674
63896
  let cursorDb = null;
63675
63897
  try {
@@ -63768,7 +63990,7 @@ async function readMinimaxRemainsResponse() {
63768
63990
  }
63769
63991
  function minimaxQuotaSnapshots(payload, capturedAt) {
63770
63992
  return (Array.isArray(payload.model_remains) ? payload.model_remains : []).flatMap((model, index2) => {
63771
- const modelName2 = stringValue10(model.model_name) ?? `model-${index2 + 1}`;
63993
+ const modelName2 = stringValue11(model.model_name) ?? `model-${index2 + 1}`;
63772
63994
  const prefix = modelName2.toLowerCase() === "general" ? "" : `${modelName2} `;
63773
63995
  const intervalStartAt = timestampMs(model.start_time);
63774
63996
  const intervalEndAt = timestampMs(model.end_time);
@@ -63822,7 +64044,7 @@ function minimaxQuotaSnapshot(model, input) {
63822
64044
  capturedAt: input.capturedAt,
63823
64045
  metadata: {
63824
64046
  source: "service-budgets.minimax-token-plan",
63825
- modelName: stringValue10(model.model_name)
64047
+ modelName: stringValue11(model.model_name)
63826
64048
  }
63827
64049
  };
63828
64050
  }
@@ -63916,20 +64138,20 @@ function githubQuotaSnapshot(core, capturedAt) {
63916
64138
  }
63917
64139
  function detectCloudAccounts() {
63918
64140
  const accounts = [];
63919
- const declaredAccounts = readJsonRecord(join42(homeDir(), ".scout", "provider-accounts.json"));
64141
+ const declaredAccounts = readJsonRecord(join43(homeDir(), ".scout", "provider-accounts.json"));
63920
64142
  const exeAccount = recordValue(declaredAccounts?.exe);
63921
- if (exeAccount && stringValue10(exeAccount.status)?.toLowerCase() !== "inactive") {
64143
+ if (exeAccount && stringValue11(exeAccount.status)?.toLowerCase() !== "inactive") {
63922
64144
  accounts.push({
63923
64145
  id: "exe",
63924
64146
  label: "exe.dev",
63925
64147
  statusLabel: "Connected",
63926
- detailLabel: stringValue10(exeAccount.detail) ?? "Persistent VMs for remote agents"
64148
+ detailLabel: stringValue11(exeAccount.detail) ?? "Persistent VMs for remote agents"
63927
64149
  });
63928
64150
  }
63929
64151
  const cloudflareConfig = [
63930
- join42(homeDir(), "Library", "Preferences", ".wrangler", "config", "default.toml"),
63931
- join42(homeDir(), ".wrangler", "config", "default.toml"),
63932
- join42(homeDir(), ".config", ".wrangler", "config", "default.toml")
64152
+ join43(homeDir(), "Library", "Preferences", ".wrangler", "config", "default.toml"),
64153
+ join43(homeDir(), ".wrangler", "config", "default.toml"),
64154
+ join43(homeDir(), ".config", ".wrangler", "config", "default.toml")
63933
64155
  ].find((path2) => fileContainsAny(path2, ["oauth_token", "api_token"]));
63934
64156
  if (cloudflareConfig) {
63935
64157
  accounts.push({
@@ -63940,10 +64162,10 @@ function detectCloudAccounts() {
63940
64162
  });
63941
64163
  }
63942
64164
  const vercelConfig = [
63943
- join42(homeDir(), "Library", "Application Support", "com.vercel.cli", "config.json"),
63944
- join42(homeDir(), ".config", "com.vercel.cli", "config.json")
63945
- ].map((path2) => readJsonRecord(path2)).find((record2) => Boolean(stringValue10(record2?.currentTeam)));
63946
- const vercelAuth = existsSync36(join42(homeDir(), ".local", "share", "com.vercel.cli", "auth.json"));
64165
+ join43(homeDir(), "Library", "Application Support", "com.vercel.cli", "config.json"),
64166
+ join43(homeDir(), ".config", "com.vercel.cli", "config.json")
64167
+ ].map((path2) => readJsonRecord(path2)).find((record2) => Boolean(stringValue11(record2?.currentTeam)));
64168
+ const vercelAuth = existsSync37(join43(homeDir(), ".local", "share", "com.vercel.cli", "auth.json"));
63947
64169
  if (vercelConfig || vercelAuth) {
63948
64170
  accounts.push({
63949
64171
  id: "vercel",
@@ -64099,7 +64321,7 @@ function numericValue(value) {
64099
64321
  }
64100
64322
  return;
64101
64323
  }
64102
- function stringValue10(value) {
64324
+ function stringValue11(value) {
64103
64325
  return typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined;
64104
64326
  }
64105
64327
  function recordValue(value) {
@@ -64130,7 +64352,7 @@ function parseMetadataJson(value) {
64130
64352
  }
64131
64353
  }
64132
64354
  function homeDir() {
64133
- return process.env.HOME?.trim() || homedir34();
64355
+ return process.env.HOME?.trim() || homedir35();
64134
64356
  }
64135
64357
  function safeStat(path2) {
64136
64358
  try {
@@ -64438,7 +64660,7 @@ init_src();
64438
64660
  init_support_paths();
64439
64661
  import { mkdir as mkdir10, readFile as readFile11, rename, writeFile as writeFile8 } from "fs/promises";
64440
64662
  import { randomUUID as randomUUID5 } from "crypto";
64441
- import { dirname as dirname23, join as join43 } from "path";
64663
+ import { dirname as dirname23, join as join44 } from "path";
64442
64664
  class ScoutbotThreadMapStore {
64443
64665
  filePath;
64444
64666
  constructor(filePath = defaultScoutbotThreadMapPath()) {
@@ -64593,7 +64815,7 @@ class ScoutbotThreadMapStore {
64593
64815
  }
64594
64816
  }
64595
64817
  function defaultScoutbotThreadMapPath() {
64596
- return join43(resolveOpenScoutSupportPaths().supportDirectory, "scoutbot-threads.json");
64818
+ return join44(resolveOpenScoutSupportPaths().supportDirectory, "scoutbot-threads.json");
64597
64819
  }
64598
64820
  function chooseDefaultConversationId(snapshot) {
64599
64821
  const existing = Object.values(snapshot?.conversations ?? {}).find((conversation) => conversation.metadata?.scoutbotThreadId === SCOUTBOT_DEFAULT_THREAD_ID && isOpaqueChannelId(conversation.id));
@@ -65081,7 +65303,7 @@ async function admitScoutbotTurn(key, thread, snapshot, post) {
65081
65303
  // ../web/server/pairing.ts
65082
65304
  import {
65083
65305
  closeSync,
65084
- existsSync as existsSync37,
65306
+ existsSync as existsSync38,
65085
65307
  mkdirSync as mkdirSync18,
65086
65308
  openSync,
65087
65309
  readFileSync as readFileSync23,
@@ -65090,8 +65312,8 @@ import {
65090
65312
  unlinkSync as unlinkSync3,
65091
65313
  writeFileSync as writeFileSync14
65092
65314
  } from "fs";
65093
- import { homedir as homedir35 } from "os";
65094
- import { dirname as dirname24, join as join44, resolve as resolve16 } from "path";
65315
+ import { homedir as homedir36 } from "os";
65316
+ import { dirname as dirname24, join as join45, resolve as resolve16 } from "path";
65095
65317
  init_setup();
65096
65318
  init_local_config();
65097
65319
  init_tool_resolution();
@@ -65108,18 +65330,18 @@ var SCOUT_PAIRING_BRIDGE_CONNECT_TIMEOUT_MS = 1500;
65108
65330
  var SCOUT_PAIRING_BRIDGE_REQUEST_TIMEOUT_MS = 2500;
65109
65331
  function resolveScoutPairingHomeDirectory() {
65110
65332
  const configured = process.env.OPENSCOUT_PAIRING_HOME?.trim() || process.env.SCOUT_PAIRING_HOME?.trim();
65111
- return configured || join44(homedir35(), SCOUT_PAIRING_HOME_DIRECTORY);
65333
+ return configured || join45(homedir36(), SCOUT_PAIRING_HOME_DIRECTORY);
65112
65334
  }
65113
65335
  function resolveScoutPairingPaths() {
65114
65336
  const rootDir = resolveScoutPairingHomeDirectory();
65115
65337
  return {
65116
65338
  rootDir,
65117
- configPath: join44(rootDir, SCOUT_PAIRING_CONFIG_FILE),
65118
- identityPath: join44(rootDir, SCOUT_PAIRING_IDENTITY_FILE),
65119
- trustedPeersPath: join44(rootDir, SCOUT_PAIRING_TRUSTED_PEERS_FILE),
65120
- logPath: join44(rootDir, SCOUT_PAIRING_LOG_FILE),
65121
- runtimeStatePath: join44(rootDir, SCOUT_PAIRING_RUNTIME_STATE_FILE),
65122
- runtimePidPath: join44(rootDir, SCOUT_PAIRING_RUNTIME_PID_FILE)
65339
+ configPath: join45(rootDir, SCOUT_PAIRING_CONFIG_FILE),
65340
+ identityPath: join45(rootDir, SCOUT_PAIRING_IDENTITY_FILE),
65341
+ trustedPeersPath: join45(rootDir, SCOUT_PAIRING_TRUSTED_PEERS_FILE),
65342
+ logPath: join45(rootDir, SCOUT_PAIRING_LOG_FILE),
65343
+ runtimeStatePath: join45(rootDir, SCOUT_PAIRING_RUNTIME_STATE_FILE),
65344
+ runtimePidPath: join45(rootDir, SCOUT_PAIRING_RUNTIME_PID_FILE)
65123
65345
  };
65124
65346
  }
65125
65347
  function createScoutPairingBridgeUrl(port) {
@@ -65280,7 +65502,7 @@ async function readScoutPairingSessionSnapshots(port) {
65280
65502
  }
65281
65503
  function loadScoutPairingConfig() {
65282
65504
  const { configPath } = resolveScoutPairingPaths();
65283
- if (!existsSync37(configPath)) {
65505
+ if (!existsSync38(configPath)) {
65284
65506
  return {};
65285
65507
  }
65286
65508
  try {
@@ -65305,7 +65527,7 @@ function resolveScoutPairingConfig() {
65305
65527
  }
65306
65528
  function readScoutPairingRuntimeSnapshot() {
65307
65529
  const { runtimeStatePath } = resolveScoutPairingPaths();
65308
- if (!existsSync37(runtimeStatePath)) {
65530
+ if (!existsSync38(runtimeStatePath)) {
65309
65531
  return null;
65310
65532
  }
65311
65533
  try {
@@ -65317,7 +65539,7 @@ function readScoutPairingRuntimeSnapshot() {
65317
65539
  }
65318
65540
  function readScoutPairingRuntimePid() {
65319
65541
  const { runtimePidPath } = resolveScoutPairingPaths();
65320
- if (!existsSync37(runtimePidPath)) {
65542
+ if (!existsSync38(runtimePidPath)) {
65321
65543
  return null;
65322
65544
  }
65323
65545
  try {
@@ -65360,8 +65582,8 @@ async function getScoutWebPairingSessionSnapshots() {
65360
65582
 
65361
65583
  // ../web/server/core/agent-endpoints.ts
65362
65584
  init_src();
65363
- import { homedir as homedir36 } from "os";
65364
- import { join as join45, resolve as resolve17 } from "path";
65585
+ import { homedir as homedir37 } from "os";
65586
+ import { join as join46, resolve as resolve17 } from "path";
65365
65587
  function endpointMetadataRecord(endpoint) {
65366
65588
  return endpoint?.metadata && typeof endpoint.metadata === "object" && !Array.isArray(endpoint.metadata) ? endpoint.metadata : {};
65367
65589
  }
@@ -65395,10 +65617,10 @@ function endpointSessionAliases(endpoint) {
65395
65617
  }
65396
65618
  function expandHomePath5(value) {
65397
65619
  if (value === "~") {
65398
- return homedir36();
65620
+ return homedir37();
65399
65621
  }
65400
65622
  if (value.startsWith("~/")) {
65401
- return join45(homedir36(), value.slice(2));
65623
+ return join46(homedir37(), value.slice(2));
65402
65624
  }
65403
65625
  return value;
65404
65626
  }
@@ -66737,7 +66959,7 @@ import { createHash as createHash10 } from "crypto";
66737
66959
  import {
66738
66960
  chmodSync as chmodSync2,
66739
66961
  closeSync as closeSync2,
66740
- existsSync as existsSync38,
66962
+ existsSync as existsSync39,
66741
66963
  mkdirSync as mkdirSync19,
66742
66964
  openSync as openSync2,
66743
66965
  readFileSync as readFileSync24,
@@ -66745,8 +66967,8 @@ import {
66745
66967
  unlinkSync as unlinkSync4,
66746
66968
  writeFileSync as writeFileSync15
66747
66969
  } from "fs";
66748
- import { homedir as homedir37, hostname as hostname3, userInfo as userInfo2 } from "os";
66749
- import { join as join46 } from "path";
66970
+ import { homedir as homedir38, hostname as hostname3, userInfo as userInfo2 } from "os";
66971
+ import { join as join47 } from "path";
66750
66972
 
66751
66973
  // ../web/server/core/pairing/runtime/bridge/ssh-terminal-access.ts
66752
66974
  import { createHash as createHash8 } from "crypto";
@@ -66973,8 +67195,8 @@ function authorizedMobileTerminalSessionName(requestedSessionName, provisionedSe
66973
67195
 
66974
67196
  // ../web/server/core/pairing/runtime/bridge/mobile-terminal-provision.ts
66975
67197
  async function readMobileTerminalStatus(requestedSessionName, deviceId) {
66976
- const authorizedKeysPath = join46(homedir37(), ".ssh", "authorized_keys");
66977
- const authorizedKeys = existsSync38(authorizedKeysPath) ? readFileSync24(authorizedKeysPath, "utf8") : "";
67198
+ const authorizedKeysPath = join47(homedir38(), ".ssh", "authorized_keys");
67199
+ const authorizedKeys = existsSync39(authorizedKeysPath) ? readFileSync24(authorizedKeysPath, "utf8") : "";
66978
67200
  const provisionedSessionName = findSshTerminalSessionForDevice(authorizedKeys, deviceId);
66979
67201
  const sessionName = authorizedMobileTerminalSessionName(requestedSessionName, provisionedSessionName);
66980
67202
  const base = {
@@ -67046,17 +67268,17 @@ async function readMobileTerminalStatus(requestedSessionName, deviceId) {
67046
67268
  async function provisionMobileTerminalAccess(sshPublicKey, deviceId, deviceClass = undefined) {
67047
67269
  const id = deviceId?.trim() || "scout-ios-device";
67048
67270
  const sessionName = provisionedMobileTerminalSessionName(sshPublicKey, deviceClass);
67049
- const sshDir = join46(homedir37(), ".ssh");
67050
- const authorizedKeysPath = join46(sshDir, "authorized_keys");
67271
+ const sshDir = join47(homedir38(), ".ssh");
67272
+ const authorizedKeysPath = join47(sshDir, "authorized_keys");
67051
67273
  const hostKeyFingerprint = readRequiredHostKeyFingerprint();
67052
67274
  const result = withAuthorizedKeysLock(sshDir, () => {
67053
- if (!existsSync38(sshDir)) {
67275
+ if (!existsSync39(sshDir)) {
67054
67276
  mkdirSync19(sshDir, { recursive: true, mode: 448 });
67055
67277
  }
67056
67278
  try {
67057
67279
  chmodSync2(sshDir, 448);
67058
67280
  } catch {}
67059
- const existing = existsSync38(authorizedKeysPath) ? readFileSync24(authorizedKeysPath, "utf8") : "";
67281
+ const existing = existsSync39(authorizedKeysPath) ? readFileSync24(authorizedKeysPath, "utf8") : "";
67060
67282
  const result2 = provisionSshTerminalAccess({
67061
67283
  authorizedKeys: existing,
67062
67284
  deviceId: id,
@@ -67128,10 +67350,10 @@ function writeAuthorizedKeysAtomically(path2, contents) {
67128
67350
  }
67129
67351
  }
67130
67352
  function withAuthorizedKeysLock(sshDir, action) {
67131
- if (!existsSync38(sshDir)) {
67353
+ if (!existsSync39(sshDir)) {
67132
67354
  mkdirSync19(sshDir, { recursive: true, mode: 448 });
67133
67355
  }
67134
- const lockPath = join46(sshDir, ".scout-authorized-keys.lock");
67356
+ const lockPath = join47(sshDir, ".scout-authorized-keys.lock");
67135
67357
  const deadline = Date.now() + 5000;
67136
67358
  let fd = null;
67137
67359
  while (fd === null) {
@@ -67724,7 +67946,7 @@ async function handleRPCInner(bridge, req, rpcContext = {}) {
67724
67946
  const config = resolveConfig();
67725
67947
  const workspaceRoot = config.workspace?.root ? resolveWorkspaceRoot(config.workspace.root) : null;
67726
67948
  const matches = await readSessionSearch({
67727
- home: homedir38(),
67949
+ home: homedir39(),
67728
67950
  workspaceRoot,
67729
67951
  maxAgeDays: maxAge,
67730
67952
  limit,
@@ -67860,13 +68082,13 @@ function resolveMobileCurrentDirectory() {
67860
68082
  }
67861
68083
  }
67862
68084
  function resolveWorkspaceRoot(root) {
67863
- const expandedRoot = root.replace(/^~/, homedir38());
68085
+ const expandedRoot = root.replace(/^~/, homedir39());
67864
68086
  return realpathSync5(expandedRoot);
67865
68087
  }
67866
68088
  function resolveWorkspacePath(root, requestedPath) {
67867
68089
  const normalizedRoot = resolveWorkspaceRoot(root);
67868
- const expandedPath = requestedPath?.replace(/^~/, homedir38());
67869
- const candidate = expandedPath ? isAbsolute7(expandedPath) ? expandedPath : join47(normalizedRoot, expandedPath) : normalizedRoot;
68090
+ const expandedPath = requestedPath?.replace(/^~/, homedir39());
68091
+ const candidate = expandedPath ? isAbsolute7(expandedPath) ? expandedPath : join48(normalizedRoot, expandedPath) : normalizedRoot;
67870
68092
  const resolvedCandidate = realpathSync5(candidate);
67871
68093
  const rel = relative6(normalizedRoot, resolvedCandidate);
67872
68094
  if (rel === "" || !rel.startsWith("..") && !isAbsolute7(rel)) {
@@ -67896,7 +68118,7 @@ function listDirectories(dirPath) {
67896
68118
  continue;
67897
68119
  if (name2 === "node_modules" || name2 === ".build" || name2 === "target")
67898
68120
  continue;
67899
- const fullPath = join47(dirPath, name2);
68121
+ const fullPath = join48(dirPath, name2);
67900
68122
  try {
67901
68123
  const stat7 = statSync14(fullPath);
67902
68124
  if (!stat7.isDirectory())
@@ -67922,7 +68144,7 @@ async function discoverSessionFiles(maxAgeDays, limit) {
67922
68144
  const config = resolveConfig();
67923
68145
  const workspaceRoot = config.workspace?.root ? resolveWorkspaceRoot(config.workspace.root) : null;
67924
68146
  const sessions4 = await readSessionFileScan({
67925
- home: homedir38(),
68147
+ home: homedir39(),
67926
68148
  workspaceRoot,
67927
68149
  maxAgeDays,
67928
68150
  limit
@@ -79730,7 +79952,7 @@ function finalize(ctx, schema2) {
79730
79952
  result.$schema = "http://json-schema.org/draft-07/schema#";
79731
79953
  } else if (ctx.target === "draft-04") {
79732
79954
  result.$schema = "http://json-schema.org/draft-04/schema#";
79733
- } else if (ctx.target === "openapi-3.0") {} else {}
79955
+ } else if (ctx.target === "openapi-3.0") {}
79734
79956
  if (ctx.external?.uri) {
79735
79957
  const id = ctx.external.registry.get(schema2)?.id;
79736
79958
  if (!id)
@@ -79978,7 +80200,7 @@ var literalProcessor = (schema2, ctx, json2, _params) => {
79978
80200
  if (val === undefined) {
79979
80201
  if (ctx.unrepresentable === "throw") {
79980
80202
  throw new Error("Literal `undefined` cannot be represented in JSON Schema");
79981
- } else {}
80203
+ }
79982
80204
  } else if (typeof val === "bigint") {
79983
80205
  if (ctx.unrepresentable === "throw") {
79984
80206
  throw new Error("BigInt literals cannot be represented in JSON Schema");
@@ -82328,8 +82550,8 @@ init_system_probes();
82328
82550
  init_local_config();
82329
82551
  init_local_agents();
82330
82552
  import { readFileSync as readFileSync26, readdirSync as readdirSync8, realpathSync as realpathSync6, statSync as statSync15 } from "fs";
82331
- import { basename as basename17, isAbsolute as isAbsolute8, join as join48, relative as relative7, resolve as resolve20 } from "path";
82332
- import { homedir as homedir39 } from "os";
82553
+ import { basename as basename17, isAbsolute as isAbsolute8, join as join49, relative as relative7, resolve as resolve20 } from "path";
82554
+ import { homedir as homedir40 } from "os";
82333
82555
  var t = initTRPC.context().create();
82334
82556
  var logged = t.middleware(async ({ path: path2, type, next }) => {
82335
82557
  const start = Date.now();
@@ -82495,13 +82717,13 @@ function resolveMobileCurrentDirectory2() {
82495
82717
  }
82496
82718
  }
82497
82719
  function resolveWorkspaceRoot2(root) {
82498
- const expandedRoot = root.replace(/^~/, homedir39());
82720
+ const expandedRoot = root.replace(/^~/, homedir40());
82499
82721
  return realpathSync6(expandedRoot);
82500
82722
  }
82501
82723
  function resolveWorkspacePath2(root, requestedPath) {
82502
82724
  const normalizedRoot = resolveWorkspaceRoot2(root);
82503
- const expandedPath = requestedPath?.replace(/^~/, homedir39());
82504
- const candidate = expandedPath ? isAbsolute8(expandedPath) ? expandedPath : join48(normalizedRoot, expandedPath) : normalizedRoot;
82725
+ const expandedPath = requestedPath?.replace(/^~/, homedir40());
82726
+ const candidate = expandedPath ? isAbsolute8(expandedPath) ? expandedPath : join49(normalizedRoot, expandedPath) : normalizedRoot;
82505
82727
  const resolvedCandidate = realpathSync6(candidate);
82506
82728
  const rel = relative7(normalizedRoot, resolvedCandidate);
82507
82729
  if (rel === "" || !rel.startsWith("..") && !isAbsolute8(rel)) {
@@ -82531,7 +82753,7 @@ function listDirectories2(dirPath) {
82531
82753
  continue;
82532
82754
  if (name2 === "node_modules" || name2 === ".build" || name2 === "target")
82533
82755
  continue;
82534
- const fullPath = join48(dirPath, name2);
82756
+ const fullPath = join49(dirPath, name2);
82535
82757
  try {
82536
82758
  const stat7 = statSync15(fullPath);
82537
82759
  if (!stat7.isDirectory())
@@ -82564,7 +82786,7 @@ async function discoverSessionFiles2(maxAgeDays, limit) {
82564
82786
  const config2 = resolveConfig();
82565
82787
  const workspaceRoot = config2.workspace?.root ? resolveWorkspaceRoot2(config2.workspace.root) : null;
82566
82788
  const sessions4 = await readSessionFileScan({
82567
- home: homedir39(),
82789
+ home: homedir40(),
82568
82790
  workspaceRoot,
82569
82791
  maxAgeDays,
82570
82792
  limit
@@ -83253,7 +83475,7 @@ var historyRouter = t.router({
83253
83475
  const config2 = resolveConfig();
83254
83476
  const workspaceRoot = config2.workspace?.root ? resolveWorkspaceRoot2(config2.workspace.root) : null;
83255
83477
  const matches = await readSessionSearch({
83256
- home: homedir39(),
83478
+ home: homedir40(),
83257
83479
  workspaceRoot,
83258
83480
  maxAgeDays: maxAge,
83259
83481
  limit,
@@ -85418,14 +85640,14 @@ function observableToAsyncIterable(observable$1, signal2) {
85418
85640
  }
85419
85641
  // ../web/server/core/pairing/runtime/bridge/server-trpc.ts
85420
85642
  import { realpathSync as realpathSync7 } from "fs";
85421
- import { homedir as homedir40 } from "os";
85643
+ import { homedir as homedir41 } from "os";
85422
85644
  function resolveCurrentDirectory() {
85423
85645
  try {
85424
85646
  const config2 = resolveConfig();
85425
85647
  const configuredRoot = config2.workspace?.root;
85426
85648
  if (!configuredRoot)
85427
85649
  return process.cwd();
85428
- const expanded = configuredRoot.replace(/^~/, homedir40());
85650
+ const expanded = configuredRoot.replace(/^~/, homedir41());
85429
85651
  return realpathSync7(expanded);
85430
85652
  } catch {
85431
85653
  return process.cwd();
@@ -85960,16 +86182,17 @@ function isAsyncIterable(value) {
85960
86182
  // ../web/server/core/pairing/runtime/runtime.ts
85961
86183
  function createPairingAdapterRegistry(configAdapters) {
85962
86184
  const adapters = {
85963
- "claude-code": createAdapter6,
86185
+ "claude-code": createAdapter7,
85964
86186
  acp: createAdapter,
85965
- codex: createAdapter7,
86187
+ codex: createAdapter8,
86188
+ "devin-acp": createAdapter5,
85966
86189
  "grok-acp": createAdapter2,
85967
86190
  "kimi-acp": createAdapter3,
85968
- pi: createAdapter5,
85969
- opencode: createAdapter9,
86191
+ pi: createAdapter6,
86192
+ opencode: createAdapter10,
85970
86193
  "opencode-acp": createAdapter4,
85971
- "opencode-v2": createAdapter10,
85972
- openai: createAdapter8
86194
+ "opencode-v2": createAdapter11,
86195
+ openai: createAdapter9
85973
86196
  };
85974
86197
  if (configAdapters) {
85975
86198
  for (const [name2, entry] of Object.entries(configAdapters)) {
@@ -86112,7 +86335,7 @@ async function autoStartConfiguredSessions(bridge, sessions4) {
86112
86335
  try {
86113
86336
  const session = await bridge.createSession(entry.adapter, {
86114
86337
  name: entry.name,
86115
- cwd: entry.cwd?.replace(/^~/, homedir41()),
86338
+ cwd: entry.cwd?.replace(/^~/, homedir42()),
86116
86339
  options: entry.options
86117
86340
  });
86118
86341
  console.log(`[bridge] session started: ${session.name} (${entry.adapter})`);