@openscout/scout 0.2.95 → 0.2.96

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 (360) hide show
  1. package/bin/scout +26 -10
  2. package/bin/scoutd +0 -0
  3. package/dist/build-manifest.json +3 -3
  4. package/dist/client/assets/{ActivityScreen--eANwuxa.js → ActivityScreen-BnoaUkVZ.js} +1 -1
  5. package/dist/client/assets/{AddProjectForm-CcD6qvV8.js → AddProjectForm-IqOtJfRs.js} +1 -1
  6. package/dist/client/assets/{AgentAvatar-CYhf6twS.js → AgentAvatar-6-KBVKUu.js} +1 -1
  7. package/dist/client/assets/{AgentConfigurationScreen-BTI24HQX.js → AgentConfigurationScreen-CuZJy07q.js} +1 -1
  8. package/dist/client/assets/{AgentDefinitionsWorkspace-srmN6-vj.js → AgentDefinitionsWorkspace-Iyl4BesU.js} +1 -1
  9. package/dist/client/assets/{AgentDetailCard-UqPNpcvB.js → AgentDetailCard-C9rn3Fj5.js} +1 -1
  10. package/dist/client/assets/{AgentFloorView-XXNgI5Cj.js → AgentFloorView-YT-Jjccf.js} +1 -1
  11. package/dist/client/assets/{AgentInfoScreen-CimdOnZ9.js → AgentInfoScreen-Dr99gQEZ.js} +1 -1
  12. package/dist/client/assets/{AgentLaneCard-Z-aOBR3W.js → AgentLaneCard-DI2iW9zO.js} +1 -1
  13. package/dist/client/assets/{AgentLaneChrome-CyhA1reW.js → AgentLaneChrome-D8bARHMx.js} +1 -1
  14. package/dist/client/assets/{AgentLaneDetailSheet-BNzjMjIH.js → AgentLaneDetailSheet-52un7dKC.js} +1 -1
  15. package/dist/client/assets/{AgentLaneSummaryResize-Box8-_rS.js → AgentLaneSummaryResize-CEBjmPTa.js} +1 -1
  16. package/dist/client/assets/AgentLanesEmbedScreen-Dgcm7zd_.js +1 -0
  17. package/dist/client/assets/AgentLanesPreflight-q20mTjms.js +1 -0
  18. package/dist/client/assets/AgentLanesView-CetZZDyF.js +2 -0
  19. package/dist/client/assets/{AgentLiveActions-BwuzOE8h.js → AgentLiveActions-DrEJDJef.js} +1 -1
  20. package/dist/client/assets/AgentMasterScreen-DJPnstoD.js +1 -0
  21. package/dist/client/assets/{AgentSessions-CsZwoukw.js → AgentSessions-DCPCG4xb.js} +1 -1
  22. package/dist/client/assets/{AgentsConsole-KCao4XmX.js → AgentsConsole-CsYOoFJi.js} +1 -1
  23. package/dist/client/assets/{AgentsScreen-CtPAmwRX.js → AgentsScreen-k8LvBuU_.js} +1 -1
  24. package/dist/client/assets/AgentsSubnav-C4xpQhsv.js +1 -0
  25. package/dist/client/assets/{AstronautSuit-Ckx7lu7G.js → AstronautSuit-DbjQtfD_.js} +1 -1
  26. package/dist/client/assets/{AtopView-DYlpgEHf.js → AtopView-Daq_ob3z.js} +1 -1
  27. package/dist/client/assets/{BackToPicker-4JaeRvDm.js → BackToPicker-CXZjBRAe.js} +1 -1
  28. package/dist/client/assets/{BriefingDetailScreen-D6-xqrpo.js → BriefingDetailScreen-CUCXO-KH.js} +1 -1
  29. package/dist/client/assets/{BriefingsScreen-DKxSDEmk.js → BriefingsScreen-B5oMTGKv.js} +1 -1
  30. package/dist/client/assets/{BrokerMetadataPanel-BbREmsbK.js → BrokerMetadataPanel-BsiU8lTD.js} +1 -1
  31. package/dist/client/assets/{BrokerScreen-fbPIouMw.js → BrokerScreen-BPbOHhCS.js} +1 -1
  32. package/dist/client/assets/{CastPicker-BcA2vDDV.js → CastPicker-_5E5hNUe.js} +1 -1
  33. package/dist/client/assets/ChatCollapsedStrip-D-eXhzPf.js +1 -0
  34. package/dist/client/assets/{CodeDiffPane-Cn8Y9hAt.js → CodeDiffPane-n7W4iGUG.js} +1 -1
  35. package/dist/client/assets/{CodeProjectPicker-nPFktrco.js → CodeProjectPicker-CMsbSTDq.js} +1 -1
  36. package/dist/client/assets/{CodeScreen-BlAxtxE5.js → CodeScreen-CeuO3EhR.js} +1 -1
  37. package/dist/client/assets/{ConversationComposer-2HjbGPL9.js → ConversationComposer-CXPKx86g.js} +1 -1
  38. package/dist/client/assets/{ConversationFeedRows-C6wUqJrx.js → ConversationFeedRows-WrH-YI3L.js} +1 -1
  39. package/dist/client/assets/{ConversationHeader-C8vfXaTF.js → ConversationHeader-BQWzGzLK.js} +1 -1
  40. package/dist/client/assets/{ConversationPanels-CNCIbpqU.js → ConversationPanels-Dujvnmup.js} +2 -2
  41. package/dist/client/assets/ConversationScreen-CR9pWB65.js +2 -0
  42. package/dist/client/assets/{ConversationStatus-DZuyKsWN.js → ConversationStatus-DVzSb2Hv.js} +1 -1
  43. package/dist/client/assets/{CrewAvatar-CTIuxp4G.js → CrewAvatar-BwXjyg8N.js} +1 -1
  44. package/dist/client/assets/CrewWorkspaces-CkQDhyie.css +1 -0
  45. package/dist/client/assets/CrewWorkspaces-NKujRzwh.js +1 -0
  46. package/dist/client/assets/{DataTable-6IDhanr5.js → DataTable-Bp8tU9AK.js} +1 -1
  47. package/dist/client/assets/{DispatchAftermath-DC1u9itO.js → DispatchAftermath-B-6rmXzL.js} +1 -1
  48. package/dist/client/assets/{DocumentFocusViewer-DZVhS7as.js → DocumentFocusViewer-Do3wQ_3Z.js} +1 -1
  49. package/dist/client/assets/{EmbeddableSurfacesLab-BKUFJMCV.js → EmbeddableSurfacesLab-C1orRyP9.js} +1 -1
  50. package/dist/client/assets/{EmptyState-CeBl0iGd.js → EmptyState-CJzXj1l5.js} +1 -1
  51. package/dist/client/assets/{FileViewerPane-DQlpNt2S.js → FileViewerPane-Df6VzXjA.js} +1 -1
  52. package/dist/client/assets/FlightObserveScreen-6mGnmWQA.js +1 -0
  53. package/dist/client/assets/{FollowScreen-BXHOp3gb.js → FollowScreen-DvnxYLVh.js} +1 -1
  54. package/dist/client/assets/{HarnessMark-D5CA5uSp.js → HarnessMark-B979GCSB.js} +1 -1
  55. package/dist/client/assets/{HarnessesScreen-DhFXq1qz.js → HarnessesScreen-CHTuv8p6.js} +1 -1
  56. package/dist/client/assets/{HerdrSession-BRhs5LIR.js → HerdrSession-B3McuYgi.js} +1 -1
  57. package/dist/client/assets/{HomeHero-DMABJuze.js → HomeHero-CdUVPjkG.js} +1 -1
  58. package/dist/client/assets/{HostAdvisorView-RAociATV.js → HostAdvisorView-Bok5Sk5c.js} +1 -1
  59. package/dist/client/assets/{KnowledgeSearchInspector-CZPyVNSw.js → KnowledgeSearchInspector-B7XSoJsu.js} +1 -1
  60. package/dist/client/assets/{KnowledgeSearchScreen-mGTKIg00.js → KnowledgeSearchScreen-D3o3IODW.js} +1 -1
  61. package/dist/client/assets/{LaneToolHoverCard-D_DMlBeT.js → LaneToolHoverCard-HByf2ndx.js} +1 -1
  62. package/dist/client/assets/{LaneTraceDetailSheet-BEHg3LmH.js → LaneTraceDetailSheet-BUgHz-sd.js} +1 -1
  63. package/dist/client/assets/{LaneTraceEventFocus-DVimcizS.js → LaneTraceEventFocus-DM-hoPxG.js} +1 -1
  64. package/dist/client/assets/{MeshCanvas-BOuZx4AM.js → MeshCanvas-DCLJRsBy.js} +1 -1
  65. package/dist/client/assets/{MeshCanvasMinimap-wL-1N94e.js → MeshCanvasMinimap-cEFS9eW7.js} +1 -1
  66. package/dist/client/assets/{MeshScreen-DMY9Bmh5.js → MeshScreen-BcxPkhm6.js} +1 -1
  67. package/dist/client/assets/{MeshTopologyView-DiDcX5f4.js → MeshTopologyView-CCRPd8PU.js} +2 -2
  68. package/dist/client/assets/MessagesScreen-Bb5l13MO.js +1 -0
  69. package/dist/client/assets/{MissionContextRail-DrNKXG5u.js → MissionContextRail-DF0_kiU7.js} +1 -1
  70. package/dist/client/assets/{MissionControlView-ByBlHVN8.js → MissionControlView-E3V7bENU.js} +1 -1
  71. package/dist/client/assets/{MissionFocusOverlay-D1i6R6Zt.js → MissionFocusOverlay-h15sQFvP.js} +1 -1
  72. package/dist/client/assets/{MissionLeftAgentRow-DN9NcCML.js → MissionLeftAgentRow-KPdk9rSa.js} +1 -1
  73. package/dist/client/assets/{MissionLogPane-DSeIv3Xo.js → MissionLogPane-BbdDKjUl.js} +1 -1
  74. package/dist/client/assets/{NewAgentModal-V7yK6J6j.js → NewAgentModal-DfHxad34.js} +1 -1
  75. package/dist/client/assets/NewChatComposer-_Stj0fZy.js +19 -0
  76. package/dist/client/assets/{NewChatOrigin-DdpzE4kz.js → NewChatOrigin-B1u7ki70.js} +1 -1
  77. package/dist/client/assets/{ObserveEmbedScreen-l_Q3ts2q.js → ObserveEmbedScreen-Co0xTii6.js} +1 -1
  78. package/dist/client/assets/{ObserveTextFlow-BSEtYTxU.js → ObserveTextFlow-ZQWwrK3i.js} +2 -2
  79. package/dist/client/assets/{ObservedTopologyPanel-CdGUXxGR.js → ObservedTopologyPanel-BJUhDSuQ.js} +1 -1
  80. package/dist/client/assets/{OpenScoutAppShell-DN8dOSK4.js → OpenScoutAppShell-CUd2yOLu.js} +25 -25
  81. package/dist/client/assets/{OpsAgentsView-ntGr4pz4.js → OpsAgentsView-DI5wu1si.js} +1 -1
  82. package/dist/client/assets/OpsScreen-D8fQafCl.js +1 -0
  83. package/dist/client/assets/OpsSubnav-1K4Jaf__.js +1 -0
  84. package/dist/client/assets/ProjectAgentProfile-Bdjd_dAx.js +1 -0
  85. package/dist/client/assets/{ProjectAgentProfileBar-BQET-qrY.js → ProjectAgentProfileBar-k2QHHHsQ.js} +1 -1
  86. package/dist/client/assets/{ProjectAgentProfileHero-Ck8mThtx.js → ProjectAgentProfileHero-Bpxk1ui2.js} +1 -1
  87. package/dist/client/assets/ProjectsInbox-C_bMHLCc.js +2 -0
  88. package/dist/client/assets/ProjectsRail-J-aH_pxT.js +1 -0
  89. package/dist/client/assets/ProjectsScreen-cVUkGbPz.js +1 -0
  90. package/dist/client/assets/ProjectsThreadAside-_ourdM-Q.js +1 -0
  91. package/dist/client/assets/{Provider-B2xuo3rf.js → Provider-CtXJeLrP.js} +1 -1
  92. package/dist/client/assets/{RailRow-B-GycCBx.js → RailRow-CEH2MFBw.js} +1 -1
  93. package/dist/client/assets/{RawSessionsTable-AQThi6sm.js → RawSessionsTable-CDyrom-F.js} +1 -1
  94. package/dist/client/assets/RealtimeVoiceScreen-DBl3DN1H.js +1 -0
  95. package/dist/client/assets/{RepoDiffEmbedScreen-DXWoRF_c.js → RepoDiffEmbedScreen-kY2pHjIs.js} +1 -1
  96. package/dist/client/assets/{RepoDiffPageScreen-D_274ExO.js → RepoDiffPageScreen-C6LhoKrn.js} +1 -1
  97. package/dist/client/assets/{RepoDiffViewer-DbedmHDX.js → RepoDiffViewer-BhcIIQQg.js} +1 -1
  98. package/dist/client/assets/{RepoDiffViewerLazy-C0--fPtk.js → RepoDiffViewerLazy-Csy_j9LD.js} +2 -2
  99. package/dist/client/assets/{ReposScreen-D39_YG4H.js → ReposScreen-B_cB0zu7.js} +1 -1
  100. package/dist/client/assets/ScoutDeckSurface-CSy_fjcG.js +1 -0
  101. package/dist/client/assets/{ScoutSurface-UsRy0t-I.js → ScoutSurface-CQVcSrin.js} +1 -1
  102. package/dist/client/assets/{ScoutbotFxLab-Fmdfboxs.js → ScoutbotFxLab-DqGiLYNy.js} +1 -1
  103. package/dist/client/assets/{SecondaryNav-o2RL9H8H.js → SecondaryNav-BR4VRdgh.js} +1 -1
  104. package/dist/client/assets/SessionEmbedScreen-BTlZ9gAg.js +1 -0
  105. package/dist/client/assets/{SessionObserve-Dsd0j05N.js → SessionObserve-dQDN23pP.js} +1 -1
  106. package/dist/client/assets/{SessionObserveEvidence-DopQYDkD.js → SessionObserveEvidence-BRBGKAgd.js} +1 -1
  107. package/dist/client/assets/SessionRefScreen-COVQMbtE.js +1 -0
  108. package/dist/client/assets/SessionsScreen--5OJ3p3v.js +1 -0
  109. package/dist/client/assets/{SettingsDrawer-_AwuopMS.js → SettingsDrawer-RGVK_bmE.js} +1 -1
  110. package/dist/client/assets/{SettingsScreen-Cw4DDfJP.js → SettingsScreen-CCxzy5IU.js} +1 -1
  111. package/dist/client/assets/{ShikiPane-BfHc_3pM.js → ShikiPane-DYI9Hkge.js} +1 -1
  112. package/dist/client/assets/{SlidePanel-C-q7XwTa.js → SlidePanel-B9ugxWgA.js} +1 -1
  113. package/dist/client/assets/{SpriteAvatar-Bs68ZENy.js → SpriteAvatar-z5hHesx9.js} +1 -1
  114. package/dist/client/assets/{StatusPill-ZZQwxB1a.js → StatusPill-BFvMjmZV.js} +1 -1
  115. package/dist/client/assets/{TailView-Q4FVMsUH.js → TailView-0uEIj2JH.js} +1 -1
  116. package/dist/client/assets/{Terminal-D7zqHwHV.js → Terminal-DouZeNxc.js} +1 -1
  117. package/dist/client/assets/{TerminalEmbedScreen-CXIJ7qv6.js → TerminalEmbedScreen-dMNUbzXr.js} +1 -1
  118. package/dist/client/assets/{TerminalHeaderMount-BnBLOPbb.js → TerminalHeaderMount-BL07cd0q.js} +1 -1
  119. package/dist/client/assets/{TextDocumentSurface-CKQP-cBT.js → TextDocumentSurface-BflAwXeZ.js} +1 -1
  120. package/dist/client/assets/{TmuxPeek-V9dGESfO.js → TmuxPeek-BTnjOQi0.js} +1 -1
  121. package/dist/client/assets/{VoicePermissionsPanel-k7sbLXx2.js → VoicePermissionsPanel-CgQ6GGS-.js} +1 -1
  122. package/dist/client/assets/{WorkDetailScreen-60p9litn.js → WorkDetailScreen-CaLG-zDs.js} +1 -1
  123. package/dist/client/assets/{WorkFilesViewer-BjJS7GyM.js → WorkFilesViewer-B9Sil_No.js} +1 -1
  124. package/dist/client/assets/{activity-Bj3Hnbj3.js → activity-DcrMApUY.js} +1 -1
  125. package/dist/client/assets/{addon-fit-BL-NTWRU.js → addon-fit-DMVrz5Sv.js} +1 -1
  126. package/dist/client/assets/{addon-webgl-CIMgmNjg.js → addon-webgl-BYvpZUyu.js} +1 -1
  127. package/dist/client/assets/{agent-autocomplete-DXlvdc4b.js → agent-autocomplete-B-5QTeas.js} +1 -1
  128. package/dist/client/assets/{agent-essentials-BOMHR0_U.js → agent-essentials-D7KRGYvF.js} +1 -1
  129. package/dist/client/assets/{agent-lane-card-model-CTLxf3R4.js → agent-lane-card-model-CNZMPkhc.js} +1 -1
  130. package/dist/client/assets/{agent-lanes-model-AfrjRNK5.js → agent-lanes-model-DXqjs0OK.js} +2 -2
  131. package/dist/client/assets/agent-master-I1W-5d-x.css +1 -0
  132. package/dist/client/assets/agent-master-model-DqjrVI2h.js +1 -0
  133. package/dist/client/assets/{agent-specialization-BIPIBW8u.js → agent-specialization-BujJVUTD.js} +1 -1
  134. package/dist/client/assets/{arc.es-IR5r6sj_.js → arc.es-NHqHWohb.js} +1 -1
  135. package/dist/client/assets/{arrow-down-BydciYFZ.js → arrow-down-CKtSUjmW.js} +1 -1
  136. package/dist/client/assets/{arrow-left-CghA0kTw.js → arrow-left-Czpf-AE4.js} +1 -1
  137. package/dist/client/assets/{arrow-right-iJFv3jNh.js → arrow-right-BuzMnLYP.js} +1 -1
  138. package/dist/client/assets/{arrow-up-right-CCfZXPqD.js → arrow-up-right-C6Wl-1uw.js} +1 -1
  139. package/dist/client/assets/{bot-B5sub1-i.js → bot-rd0awxD3.js} +1 -1
  140. package/dist/client/assets/{check-C18YQC90.js → check-ofKUE8yH.js} +1 -1
  141. package/dist/client/assets/{chevron-down-Mp9mu_yd.js → chevron-down-wciXnOQz.js} +1 -1
  142. package/dist/client/assets/{chevron-right-CzH-TaSF.js → chevron-right-D-HdlPg8.js} +1 -1
  143. package/dist/client/assets/{chunk-HRAB3GC3-swV8PA2k.js → chunk-HRAB3GC3-Tyv9rzx7.js} +1 -1
  144. package/dist/client/assets/{chunk-JTPDIGGW-BKXqcLKw.js → chunk-JTPDIGGW-BC2Mandc.js} +3 -3
  145. package/dist/client/assets/{chunk-T65CQEWV-vYbNJ8E6.js → chunk-T65CQEWV-C1AWTYZZ.js} +1 -1
  146. package/dist/client/assets/{chunk-YOZR3KYS-U65yUmqt.js → chunk-YOZR3KYS-DwHPHa6f.js} +1 -1
  147. package/dist/client/assets/{clock-B4PTFi5m.js → clock-B88r8OrZ.js} +1 -1
  148. package/dist/client/assets/{code-xml-Jtxsp5d1.js → code-xml-D7pOQM9l.js} +1 -1
  149. package/dist/client/assets/{compass-0_54-vz3.js → compass-Dt1AMXz2.js} +1 -1
  150. package/dist/client/assets/content-9K38QchR.js +1 -0
  151. package/dist/client/assets/content-BRgnyXWh.js +1 -0
  152. package/dist/client/assets/{content-CHghn-rT.js → content-BWPNyXJ0.js} +1 -1
  153. package/dist/client/assets/content-BdkI07v3.js +1 -0
  154. package/dist/client/assets/content-C4oWa8SB.js +1 -0
  155. package/dist/client/assets/content-C9ijJxyl.js +1 -0
  156. package/dist/client/assets/content-CFZ4rghn.js +1 -0
  157. package/dist/client/assets/content-CIqu_Ci_.js +1 -0
  158. package/dist/client/assets/content-CnJF9DGO.js +1 -0
  159. package/dist/client/assets/content-CriW8Y8u.js +1 -0
  160. package/dist/client/assets/content-DDCyPPk_.js +1 -0
  161. package/dist/client/assets/content-DtcZeh5m.js +1 -0
  162. package/dist/client/assets/content-U9tsdtle.js +1 -0
  163. package/dist/client/assets/content-hFLK3CON.js +1 -0
  164. package/dist/client/assets/{content-DMbawvqU.js → content-nkx0swDe.js} +1 -1
  165. package/dist/client/assets/content-p00KQrtD.js +1 -0
  166. package/dist/client/assets/{conversation-icons-BV10B2Me.js → conversation-icons-tp9BX6X2.js} +1 -1
  167. package/dist/client/assets/{conversation-model-CwF6Y9gx.js → conversation-model-Dc02NsGp.js} +1 -1
  168. package/dist/client/assets/conversation-motion-features-D9-RmBSq.js +1 -0
  169. package/dist/client/assets/{copy-Dtpx4FOE.js → copy-CWWAJ75H.js} +1 -1
  170. package/dist/client/assets/{cpu-BjVis9mc.js → cpu-DrqejfkB.js} +1 -1
  171. package/dist/client/assets/{createLucideIcon-DXpqZP7I.js → createLucideIcon-DezKXSG2.js} +1 -1
  172. package/dist/client/assets/{ctx-panel-D_HJ3nhb.css → ctx-panel-F05jXK4Q.css} +1 -1
  173. package/dist/client/assets/discover-C2CZO4Tk.js +2 -0
  174. package/dist/client/assets/embed-entry-BSMUykuG.js +2 -0
  175. package/dist/client/assets/{external-link-Ckiyzjwo.js → external-link-Dp_a2vRZ.js} +1 -1
  176. package/dist/client/assets/{eye-CpfyvdLq.js → eye-BRyD0jno.js} +1 -1
  177. package/dist/client/assets/{file-code-corner-7mo7EviR.js → file-code-corner-muIVH_xO.js} +1 -1
  178. package/dist/client/assets/{file-text-KijGBnME.js → file-text-CqJgwxmv.js} +1 -1
  179. package/dist/client/assets/{gauge-y-Xg8Mrv.js → gauge-hU--hKVP.js} +1 -1
  180. package/dist/client/assets/{gestures-Bq9XnSqY.js → gestures-DN4hEeqv.js} +1 -1
  181. package/dist/client/assets/{git-branch-BQ_x8KZL.js → git-branch-CK5v8F2v.js} +1 -1
  182. package/dist/client/assets/{home-moving-signal-DtRpiNa0.js → home-moving-signal-BjDtEJUP.js} +1 -1
  183. package/dist/client/assets/{home-now-card-DFb4GOgM.js → home-now-card-nF8OotI-.js} +1 -1
  184. package/dist/client/assets/{home-now-card-nano-D--m9jpq.js → home-now-card-nano-C-r_bBg5.js} +1 -1
  185. package/dist/client/assets/{hooks-9d1SoaQA.js → hooks-D46bABUP.js} +1 -1
  186. package/dist/client/assets/index-CPrU5q04.js +1 -0
  187. package/dist/client/assets/{index-CZ-05hKz.js → index-DvLtl7rV.js} +5 -5
  188. package/dist/client/assets/index-kL1WLbeS.js +1 -0
  189. package/dist/client/assets/index-zvhpRHao.js +1 -0
  190. package/dist/client/assets/{inspector-panel-C-EhEDYy.js → inspector-panel-Dkc7rLvY.js} +1 -1
  191. package/dist/client/assets/{keyboard-nav-DFhAJkW3.js → keyboard-nav-BLYDhL3Z.js} +1 -1
  192. package/dist/client/assets/{lane-roster-store-gUBsydNf.js → lane-roster-store-DOdI1O13.js} +1 -1
  193. package/dist/client/assets/{layers-CGou-LwV.js → layers-CSsg3JVP.js} +1 -1
  194. package/dist/client/assets/{layout-grid-BrZt31QH.js → layout-grid-DOChPJdZ.js} +1 -1
  195. package/dist/client/assets/left-B-SdEJSJ.js +1 -0
  196. package/dist/client/assets/{left-B_o51JV6.js → left-B3wSE6ql.js} +1 -1
  197. package/dist/client/assets/{left-CwHZCGO3.js → left-BNRFiRsb.js} +1 -1
  198. package/dist/client/assets/{left-DA0amyfu.js → left-BggzhgXN.js} +1 -1
  199. package/dist/client/assets/left-CARCvvxS.js +2 -0
  200. package/dist/client/assets/left-CpokZYHt.js +1 -0
  201. package/dist/client/assets/{left-CwLs0okF.js → left-YT7mIGuH.js} +1 -1
  202. package/dist/client/assets/{left-advisor-DU3s01gk.js → left-advisor-CCY0vkcO.js} +1 -1
  203. package/dist/client/assets/left-agents-trhO5sL8.js +1 -0
  204. package/dist/client/assets/{left-default-uvuvDmt0.js → left-default-CG33elBs.js} +1 -1
  205. package/dist/client/assets/{left-lanes-DnNLgec8.js → left-lanes-CitMgeTp.js} +1 -1
  206. package/dist/client/assets/{left-mission-DN3-NLPC.js → left-mission-Zl2m_5eU.js} +1 -1
  207. package/dist/client/assets/{library-DIo5NiGP.js → library-DkALuCh5.js} +1 -1
  208. package/dist/client/assets/{loader-circle-BiohlpM3.js → loader-circle-pM56HNhR.js} +1 -1
  209. package/dist/client/assets/{local-agents-wUIaBcEr.js → local-agents-C8xAhbO5.js} +1 -1
  210. package/dist/client/assets/{mentions-CcPFMbmZ.js → mentions-DG6OQrsc.js} +1 -1
  211. package/dist/client/assets/{mesh-buckets-ByyFXdKT.js → mesh-buckets-6y3ZIibI.js} +1 -1
  212. package/dist/client/assets/{mesh-ops-CvGyjK84.js → mesh-ops-BZ1h5RQs.js} +1 -1
  213. package/dist/client/assets/{mesh-roster-n2nDpEmA.js → mesh-roster-Bc7T4b7z.js} +1 -1
  214. package/dist/client/assets/{mesh-view-store-BpxGm71b.js → mesh-view-store-ChUOASK8.js} +1 -1
  215. package/dist/client/assets/{message-circle-B2ddzBrX.js → message-circle-mZCv8tvB.js} +1 -1
  216. package/dist/client/assets/{message-markup-RkfmDfME.js → message-markup-C2LQDm_k.js} +1 -1
  217. package/dist/client/assets/{message-square-D9YYWE0x.js → message-square-C7t_qtuj.js} +1 -1
  218. package/dist/client/assets/{message-visibility-DwxgcgYK.js → message-visibility-CGOmSSKs.js} +1 -1
  219. package/dist/client/assets/{mission-control-store-Bf4b54MV.js → mission-control-store-nDLdUZPA.js} +1 -1
  220. package/dist/client/assets/{observe-CJRIvOCn.js → observe-BpEm1INu.js} +1 -1
  221. package/dist/client/assets/{page-status-BptpTdQ-.js → page-status-E5jnk48p.js} +1 -1
  222. package/dist/client/assets/{paperclip-B1UNGl5d.js → paperclip-C64lkcbM.js} +1 -1
  223. package/dist/client/assets/{persistent-state-YI-WHSCF.js → persistent-state-EHXw8WNy.js} +1 -1
  224. package/dist/client/assets/{plus-CuU_X0-8.js → plus-Co-dqKul.js} +1 -1
  225. package/dist/client/assets/{profile-rY8jO38P.js → profile-APxDsN2P.js} +1 -1
  226. package/dist/client/assets/projects-inbox-Cg4X2lUQ.js +1 -0
  227. package/dist/client/assets/projects-inbox-DRBl2N85.css +1 -0
  228. package/dist/client/assets/{proxy-DnLpZIi9.js → proxy-BiW5suC7.js} +1 -1
  229. package/dist/client/assets/{radio-Dm1ItnA4.js → radio-BOxBQX-T.js} +1 -1
  230. package/dist/client/assets/{refresh-cw-BRn9Oxxl.js → refresh-cw-DMxGzDwn.js} +1 -1
  231. package/dist/client/assets/resolve-panes-DeVJbS9c.js +1 -0
  232. package/dist/client/assets/resolve-sidebar-context-BQe5J6xF.js +1 -0
  233. package/dist/client/assets/{right-BJltPRnd.js → right-Bmfd3pjP.js} +1 -1
  234. package/dist/client/assets/{right-Beh3nCUB.js → right-BqI-nr9G.js} +1 -1
  235. package/dist/client/assets/{right-D3aTKf1F.js → right-BuCgE0fZ.js} +1 -1
  236. package/dist/client/assets/{right-Shpw_xDy.js → right-BwlW6E57.js} +1 -1
  237. package/dist/client/assets/{right-CPP7GyOm.js → right-C0ybUw0j.js} +1 -1
  238. package/dist/client/assets/{right-BbyYdzHn.js → right-CdkcrmeD.js} +1 -1
  239. package/dist/client/assets/{right-CJnB_Bg7.js → right-CimaAvQN.js} +1 -1
  240. package/dist/client/assets/{right-C1yumXNx.js → right-CkCCPbCX.js} +1 -1
  241. package/dist/client/assets/{right-DI1B79nR.js → right-D3eSiy41.js} +1 -1
  242. package/dist/client/assets/{right-DtsRNX5b.js → right-Dz_xD0Vj.js} +1 -1
  243. package/dist/client/assets/{rocket-DOwXHKWA.js → rocket-BQm5_CvR.js} +1 -1
  244. package/dist/client/assets/router-B9vQkNJL.js +1 -0
  245. package/dist/client/assets/{scope-views-A4_vP97W.js → scope-views-1IYJdl41.js} +1 -1
  246. package/dist/client/assets/{scout-voice-BhPzrc6P.js → scout-voice-BVUqGhth.js} +1 -1
  247. package/dist/client/assets/{scoutbot-markdown-jh7tzFB1.js → scoutbot-markdown-BQ_Ee2Ic.js} +1 -1
  248. package/dist/client/assets/{scroll-text-DO0GQzvN.js → scroll-text-Dze_dXtQ.js} +1 -1
  249. package/dist/client/assets/{search-D1tJSAWe.js → search-CDko0PKE.js} +1 -1
  250. package/dist/client/assets/{secondaryNavConfig-B9IF8wXl.js → secondaryNavConfig-BoQ_zYR9.js} +1 -1
  251. package/dist/client/assets/{selection-bridge-i2S9zpf8.js → selection-bridge-Din6yV3h.js} +1 -1
  252. package/dist/client/assets/{send-horizontal-CgLppsIC.js → send-horizontal-CSjIm6xg.js} +1 -1
  253. package/dist/client/assets/{server-Dymv5Emh.js → server-Bzj7lPIx.js} +1 -1
  254. package/dist/client/assets/{session-catalog-DNaOEzoQ.js → session-catalog-DsaZJXZt.js} +1 -1
  255. package/dist/client/assets/session-ref-lookup-state-SATH_jAP.js +1 -0
  256. package/dist/client/assets/{session-table-PTQVoTyc.js → session-table-BQfR7u6r.js} +1 -1
  257. package/dist/client/assets/{settings-2fC_G9nX.js → settings-Dyvpkb1D.js} +1 -1
  258. package/dist/client/assets/{sliders-horizontal-BPSMHhbm.js → sliders-horizontal-C8njVwfg.js} +1 -1
  259. package/dist/client/assets/{sparkles-Dy8p5xN8.js → sparkles-CETYrxGA.js} +1 -1
  260. package/dist/client/assets/{sse-CiOSzE5n.js → sse-CD9MMUxl.js} +1 -1
  261. package/dist/client/assets/{tail-events-BMQmSx1n.js → tail-events-Ps8KpKah.js} +1 -1
  262. package/dist/client/assets/{terminal-yN9xN-h9.js → terminal-9GRS_Qdc.js} +1 -1
  263. package/dist/client/assets/{terminal-relay-9lhzEp2V.js → terminal-relay-GYMIvKs1.js} +1 -1
  264. package/dist/client/assets/{terminal-takeover-DANQfTcy.js → terminal-takeover-_Jyys4me.js} +1 -1
  265. package/dist/client/assets/{text-CnZ0e1-V.js → text-BP3oyl8-.js} +1 -1
  266. package/dist/client/assets/{text-rLpBg4_z.css → text-BYAFNLNq.css} +1 -1
  267. package/dist/client/assets/{use-conversation-list-D9BNLfnW.js → use-conversation-list-C9ABzjXI.js} +1 -1
  268. package/dist/client/assets/use-fleet-active-asks-DAspZQjE.js +1 -0
  269. package/dist/client/assets/{use-mesh-ops-items-BIvIHlqe.js → use-mesh-ops-items-Dh54ymEp.js} +1 -1
  270. package/dist/client/assets/{use-reduced-motion-CKkhq9c5.js → use-reduced-motion-x8pJMVrG.js} +1 -1
  271. package/dist/client/assets/{use-scout-dev-flags-B2KCzPxn.js → use-scout-dev-flags-DhCbiDK3.js} +1 -1
  272. package/dist/client/assets/{useAgentHoverCard-CHBsxcbp.js → useAgentHoverCard-DoBwV0LX.js} +1 -1
  273. package/dist/client/assets/useContentSecondaryNav-pZe2Zfk1.js +1 -0
  274. package/dist/client/assets/{usePierreRuntime-DUuXH5yp.js → usePierreRuntime-ejq9dCWV.js} +1 -1
  275. package/dist/client/assets/{wrench-YcXMlsh2.js → wrench-DjkoAOQt.js} +1 -1
  276. package/dist/client/assets/{x-e3h2hDsp.js → x-CAbNespN.js} +1 -1
  277. package/dist/client/assets/{xterm-Byp1Hep_.js → xterm-Cf-ngcGP.js} +1 -1
  278. package/dist/client/assets/{zap-nMcjPoWB.js → zap-Cq8eWkcF.js} +1 -1
  279. package/dist/client/index.html +1 -1
  280. package/dist/drizzle/0009_old_korg.sql +72 -0
  281. package/dist/drizzle/0010_sparkling_colonel_america.sql +2 -0
  282. package/dist/drizzle/0011_funny_onslaught.sql +4 -0
  283. package/dist/drizzle/0012_high_blazing_skull.sql +16 -0
  284. package/dist/drizzle/0013_perfect_juggernaut.sql +1 -0
  285. package/dist/drizzle/0014_legal_meggan.sql +6 -0
  286. package/dist/drizzle/0015_lame_marvel_boy.sql +12 -0
  287. package/dist/drizzle/0016_early_goliath.sql +6 -0
  288. package/dist/drizzle/meta/0009_snapshot.json +6262 -0
  289. package/dist/drizzle/meta/0010_snapshot.json +6286 -0
  290. package/dist/drizzle/meta/0011_snapshot.json +6337 -0
  291. package/dist/drizzle/meta/0012_snapshot.json +6458 -0
  292. package/dist/drizzle/meta/0013_snapshot.json +6465 -0
  293. package/dist/drizzle/meta/0014_snapshot.json +6503 -0
  294. package/dist/drizzle/meta/0015_snapshot.json +6596 -0
  295. package/dist/drizzle/meta/0016_snapshot.json +6611 -0
  296. package/dist/drizzle/meta/_journal.json +56 -0
  297. package/dist/main.mjs +1306 -360
  298. package/dist/node/main.mjs +314 -12
  299. package/dist/pairing-runtime-controller.mjs +608 -108
  300. package/dist/runtime/base-daemon.mjs +30 -3
  301. package/dist/runtime/broker-daemon.mjs +4771 -529
  302. package/dist/runtime/broker-process-manager.mjs +23 -2
  303. package/dist/runtime/mesh-discover.mjs +23 -2
  304. package/dist/scout-control-plane-web.mjs +1914 -478
  305. package/package.json +2 -2
  306. package/dist/client/assets/AgentLanesEmbedScreen-BmLnN4on.js +0 -1
  307. package/dist/client/assets/AgentLanesPreflight-5B6sXvRB.js +0 -1
  308. package/dist/client/assets/AgentLanesView-DHyzVBk6.js +0 -2
  309. package/dist/client/assets/AgentsSubnav-CDMjKeYC.js +0 -1
  310. package/dist/client/assets/ChatCollapsedStrip-Ycm0ecaX.js +0 -1
  311. package/dist/client/assets/ConversationScreen-BNULZAp2.js +0 -2
  312. package/dist/client/assets/CrewWorkspaces-CJhBKVoZ.css +0 -1
  313. package/dist/client/assets/CrewWorkspaces-CkPYIA46.js +0 -1
  314. package/dist/client/assets/FlightObserveScreen-CDWGSKZg.js +0 -1
  315. package/dist/client/assets/MessagesScreen-Eulveud3.js +0 -1
  316. package/dist/client/assets/NewChatComposer-hlWT-nbR.js +0 -19
  317. package/dist/client/assets/OpsScreen-Ppen_Lmj.js +0 -1
  318. package/dist/client/assets/OpsSubnav-GAKsoSor.js +0 -1
  319. package/dist/client/assets/ProjectAgentProfile-BLlp2e6t.js +0 -1
  320. package/dist/client/assets/ProjectsInbox-Dlt8OQ8O.js +0 -2
  321. package/dist/client/assets/ProjectsRail-DCfNMmnW.js +0 -1
  322. package/dist/client/assets/ProjectsScreen-BP-hmI1m.js +0 -1
  323. package/dist/client/assets/ProjectsThreadAside-CWpMjGIH.js +0 -1
  324. package/dist/client/assets/RealtimeVoiceScreen-D7zZHK_t.js +0 -1
  325. package/dist/client/assets/ScoutDeckSurface-CKT3qdqY.js +0 -1
  326. package/dist/client/assets/SessionEmbedScreen-RD5XOx7R.js +0 -1
  327. package/dist/client/assets/SessionRefScreen-B_cTv47v.js +0 -1
  328. package/dist/client/assets/SessionsScreen-Bq0Z77On.js +0 -1
  329. package/dist/client/assets/archive-BjcGiAy8.js +0 -1
  330. package/dist/client/assets/content-6RvWTrtk.js +0 -1
  331. package/dist/client/assets/content-BCgwMUqz.js +0 -1
  332. package/dist/client/assets/content-Bf2VLhx0.js +0 -1
  333. package/dist/client/assets/content-BrU_38-m.js +0 -1
  334. package/dist/client/assets/content-BvvJN8rN.js +0 -1
  335. package/dist/client/assets/content-CAeEqYPw.js +0 -1
  336. package/dist/client/assets/content-CI_Z9DXk.js +0 -1
  337. package/dist/client/assets/content-CbyKONhW.js +0 -1
  338. package/dist/client/assets/content-Czogvp43.js +0 -1
  339. package/dist/client/assets/content-DFk0zNzX.js +0 -1
  340. package/dist/client/assets/content-DHe4DgkA.js +0 -1
  341. package/dist/client/assets/content-DTz7cKjo.js +0 -1
  342. package/dist/client/assets/content-E3kudY-W.js +0 -1
  343. package/dist/client/assets/content-LpO0aO_U.js +0 -1
  344. package/dist/client/assets/conversation-motion-features-BKkCRaWR.js +0 -1
  345. package/dist/client/assets/discover-CHbrEItO.js +0 -2
  346. package/dist/client/assets/embed-entry-vil28MyU.js +0 -2
  347. package/dist/client/assets/index-BVlMw8x_.js +0 -1
  348. package/dist/client/assets/index-Cn0GR-q1.js +0 -1
  349. package/dist/client/assets/index-DosI4AG9.js +0 -1
  350. package/dist/client/assets/left-BpgWnaah.js +0 -1
  351. package/dist/client/assets/left-Cx0kv6pe.js +0 -1
  352. package/dist/client/assets/left-agents-qL5PpUY-.js +0 -1
  353. package/dist/client/assets/left-z-6CkuBe.js +0 -2
  354. package/dist/client/assets/projects-inbox-BBs1hG13.css +0 -1
  355. package/dist/client/assets/projects-inbox-D-zAb9Gp.js +0 -1
  356. package/dist/client/assets/resolve-panes-DO6LkwhQ.js +0 -1
  357. package/dist/client/assets/resolve-sidebar-context-CIF288wY.js +0 -1
  358. package/dist/client/assets/router-DJj2WbDg.js +0 -1
  359. package/dist/client/assets/use-fleet-active-asks-BeAdcl09.js +0 -1
  360. package/dist/client/assets/useContentSecondaryNav-D0mUhxTF.js +0 -1
@@ -2677,12 +2677,15 @@ var init_host_integrations = () => {};
2677
2677
  // ../protocol/src/native-interactions.ts
2678
2678
  var init_native_interactions = () => {};
2679
2679
 
2680
+ // ../protocol/src/session-handle.ts
2681
+ var init_session_handle = () => {};
2682
+
2680
2683
  // ../protocol/src/runtime-catalog.generated.ts
2681
2684
  var SCOUT_RUNTIME_CATALOG_DATA;
2682
2685
  var init_runtime_catalog_generated = __esm(() => {
2683
2686
  SCOUT_RUNTIME_CATALOG_DATA = {
2684
2687
  schemaVersion: "openscout.runtime-catalog.v1",
2685
- revision: "2026-08-18.1",
2688
+ revision: "2026-09-01.1",
2686
2689
  harnesses: [
2687
2690
  {
2688
2691
  id: "claude",
@@ -2706,6 +2709,13 @@ var init_runtime_catalog_generated = __esm(() => {
2706
2709
  family: "Opus",
2707
2710
  version: "5"
2708
2711
  },
2712
+ {
2713
+ id: "claude-fable-5",
2714
+ label: "Fable 5",
2715
+ enabled: true,
2716
+ family: "Fable",
2717
+ version: "5"
2718
+ },
2709
2719
  {
2710
2720
  id: "claude-sonnet-4-6",
2711
2721
  label: "Sonnet 4.6",
@@ -3379,6 +3389,7 @@ var init_broker_routes = __esm(() => {
3379
3389
  home: "/v1/home",
3380
3390
  node: "/v1/node",
3381
3391
  snapshot: "/v1/snapshot",
3392
+ conversationProjection: "/v1/conversation-projection",
3382
3393
  capabilities: "/v1/capabilities",
3383
3394
  runtimeCatalog: "/v1/runtime-catalog",
3384
3395
  topologySnapshot: "/v1/topology/snapshot",
@@ -3447,6 +3458,7 @@ var init_src = __esm(() => {
3447
3458
  init_budget();
3448
3459
  init_host_integrations();
3449
3460
  init_native_interactions();
3461
+ init_session_handle();
3450
3462
  init_runtime_profiles();
3451
3463
  init_runtime_execution();
3452
3464
  init_runtime_catalog();
@@ -22839,11 +22851,32 @@ function resolveBundledRuntimeDirFromModuleDir(moduleDir) {
22839
22851
  resolve5(moduleDir, "..", "..")
22840
22852
  ];
22841
22853
  for (const candidate of candidates) {
22842
- if (isInstalledRuntimePackageDir(candidate))
22843
- return candidate;
22854
+ if (!isInstalledRuntimePackageDir(candidate))
22855
+ continue;
22856
+ const sourceWorkspaceRuntime = resolveSourceWorkspaceRuntimeDir(candidate);
22857
+ if (sourceWorkspaceRuntime)
22858
+ return sourceWorkspaceRuntime;
22859
+ return candidate;
22844
22860
  }
22845
22861
  return null;
22846
22862
  }
22863
+ function resolveSourceWorkspaceRuntimeDir(bundledPackageDir) {
22864
+ const packagesDir = dirname9(bundledPackageDir);
22865
+ if (resolve5(packagesDir, "cli") !== resolve5(bundledPackageDir))
22866
+ return null;
22867
+ const runtimeDir = join19(packagesDir, "runtime");
22868
+ if (!existsSync18(join19(runtimeDir, "src")))
22869
+ return null;
22870
+ if (!isInstalledRuntimePackageDir(runtimeDir))
22871
+ return null;
22872
+ try {
22873
+ const cliPackage = JSON.parse(readFileSync8(join19(bundledPackageDir, "package.json"), "utf8"));
22874
+ const runtimePackage = JSON.parse(readFileSync8(join19(runtimeDir, "package.json"), "utf8"));
22875
+ return cliPackage.name === "@openscout/scout" && runtimePackage.name === "@openscout/runtime" ? runtimeDir : null;
22876
+ } catch {
22877
+ return null;
22878
+ }
22879
+ }
22847
22880
  function findWorkspaceRuntimeDir(startDir) {
22848
22881
  let current = resolve5(startDir);
22849
22882
  while (true) {
@@ -35518,7 +35551,10 @@ var agentsTable = sqliteTable("agents", {
35518
35551
  advertiseScope: text("advertise_scope").notNull(),
35519
35552
  ownerId: text("owner_id"),
35520
35553
  metadataJson: text("metadata_json")
35521
- });
35554
+ }, (table) => [
35555
+ index("idx_agents_home_node_id").on(table.homeNodeId),
35556
+ index("idx_agents_authority_node_id").on(table.authorityNodeId)
35557
+ ]);
35522
35558
  var agentEndpointsTable = sqliteTable("agent_endpoints", {
35523
35559
  id: text("id").primaryKey(),
35524
35560
  agentId: text("agent_id").notNull().references(() => agentsTable.id, { onDelete: "cascade" }),
@@ -35534,7 +35570,14 @@ var agentEndpointsTable = sqliteTable("agent_endpoints", {
35534
35570
  metadataJson: text("metadata_json"),
35535
35571
  updatedAt: integer("updated_at").notNull().default(epochMsNow)
35536
35572
  }, (table) => [
35537
- index("idx_agent_endpoints_agent_updated_at").on(table.agentId, desc(table.updatedAt))
35573
+ index("idx_agent_endpoints_agent_updated_at").on(table.agentId, desc(table.updatedAt)),
35574
+ index("idx_agent_endpoints_roster_recency").on(desc(sql`CASE
35575
+ WHEN ${table.updatedAt} IS NULL THEN NULL
35576
+ WHEN CAST(${table.updatedAt} AS REAL) < 1000000000000
35577
+ THEN CAST(CAST(${table.updatedAt} AS REAL) * 1000 AS INTEGER)
35578
+ ELSE CAST(${table.updatedAt} AS INTEGER)
35579
+ END`), table.agentId),
35580
+ index("idx_agent_endpoints_node_id").on(table.nodeId)
35538
35581
  ]);
35539
35582
  var runtimeSessionsTable = sqliteTable("runtime_sessions", {
35540
35583
  id: text("id").primaryKey(),
@@ -35558,6 +35601,7 @@ var runtimeSessionsTable = sqliteTable("runtime_sessions", {
35558
35601
  }, (table) => [
35559
35602
  index("idx_runtime_sessions_agent_last_seen").on(table.agentId, desc(table.lastSeenAt)),
35560
35603
  index("idx_runtime_sessions_endpoint_last_seen").on(table.endpointId, desc(table.lastSeenAt)),
35604
+ index("idx_runtime_sessions_node_id").on(table.nodeId),
35561
35605
  index("idx_runtime_sessions_external").on(table.externalSessionId),
35562
35606
  index("idx_runtime_sessions_expires").on(table.expiresAt).where(sql`expires_at IS NOT NULL`)
35563
35607
  ]);
@@ -35577,6 +35621,8 @@ var runtimeSessionAliasesTable = sqliteTable("runtime_session_aliases", {
35577
35621
  primaryKey({ columns: [table.alias, table.sessionId] }),
35578
35622
  index("idx_runtime_session_aliases_alias").on(table.alias, desc(table.lastSeenAt)),
35579
35623
  index("idx_runtime_session_aliases_session").on(table.sessionId),
35624
+ index("idx_runtime_session_aliases_endpoint").on(table.endpointId),
35625
+ index("idx_runtime_session_aliases_node_id").on(table.nodeId),
35580
35626
  index("idx_runtime_session_aliases_expires").on(table.expiresAt).where(sql`expires_at IS NOT NULL`)
35581
35627
  ]);
35582
35628
  var routeAliasBindingsTable = sqliteTable("route_alias_bindings", {
@@ -35656,7 +35702,8 @@ var conversationMembersTable = sqliteTable("conversation_members", {
35656
35702
  actorId: text("actor_id").notNull().references(() => actorsTable.id, { onDelete: "cascade" }),
35657
35703
  role: text("role")
35658
35704
  }, (table) => [
35659
- primaryKey({ columns: [table.conversationId, table.actorId] })
35705
+ primaryKey({ columns: [table.conversationId, table.actorId] }),
35706
+ index("idx_conversation_members_actor").on(table.actorId, table.conversationId)
35660
35707
  ]);
35661
35708
  var messagesTable = sqliteTable("messages", {
35662
35709
  id: text("id").primaryKey(),
@@ -35676,7 +35723,8 @@ var messagesTable = sqliteTable("messages", {
35676
35723
  }, (table) => [
35677
35724
  index("idx_messages_conversation_created_at").on(table.conversationId, table.createdAt),
35678
35725
  index("idx_messages_created_at").on(desc(table.createdAt)),
35679
- index("idx_messages_actor_created_at").on(table.actorId, desc(table.createdAt))
35726
+ index("idx_messages_actor_created_at").on(table.actorId, desc(table.createdAt)),
35727
+ index("idx_messages_origin_node_id").on(table.originNodeId)
35680
35728
  ]);
35681
35729
  var messageMentionsTable = sqliteTable("message_mentions", {
35682
35730
  messageId: text("message_id").notNull().references(() => messagesTable.id, { onDelete: "cascade" }),
@@ -35705,7 +35753,102 @@ var conversationReadCursorsTable = sqliteTable("conversation_read_cursors", {
35705
35753
  metadataJson: text("metadata_json")
35706
35754
  }, (table) => [
35707
35755
  primaryKey({ columns: [table.conversationId, table.actorId] }),
35708
- index("idx_read_cursors_conversation_updated_at").on(table.conversationId, desc(table.updatedAt))
35756
+ index("idx_read_cursors_conversation_updated_at").on(table.conversationId, desc(table.updatedAt)),
35757
+ index("idx_read_cursors_reader_node_id").on(table.readerNodeId)
35758
+ ]);
35759
+ var brokerJournalProjectionCheckpointsTable = sqliteTable("broker_journal_projection_checkpoints", {
35760
+ projectionId: text("projection_id").primaryKey(),
35761
+ projectionVersion: integer("projection_version").notNull(),
35762
+ barrierId: text("barrier_id").notNull(),
35763
+ updatedAt: integer("updated_at").notNull()
35764
+ });
35765
+ var conversationProjectionMetaTable = sqliteTable("conversation_projection_meta", {
35766
+ singleton: integer("singleton").primaryKey(),
35767
+ projectionId: text("projection_id").notNull(),
35768
+ projectionVersion: integer("projection_version").notNull(),
35769
+ headSeq: integer("head_seq").notNull(),
35770
+ minReplayableSeq: integer("min_replayable_seq").notNull(),
35771
+ updatedAt: integer("updated_at").notNull()
35772
+ }, (table) => [
35773
+ check("conversation_projection_meta_singleton_check", sql`${table.singleton} = 1`)
35774
+ ]);
35775
+ var conversationProjectionItemsTable = sqliteTable("conversation_projection_items", {
35776
+ feedId: text("feed_id").primaryKey(),
35777
+ entityKind: text("entity_kind").notNull(),
35778
+ kind: text("kind").notNull(),
35779
+ conversationId: text("conversation_id"),
35780
+ runtimeSessionId: text("runtime_session_id"),
35781
+ source: text("source"),
35782
+ sourceSessionId: text("source_session_id"),
35783
+ title: text("title"),
35784
+ alias: text("alias"),
35785
+ naturalKey: text("natural_key"),
35786
+ projectRoot: text("project_root"),
35787
+ harness: text("harness"),
35788
+ model: text("model"),
35789
+ effort: text("effort"),
35790
+ agentId: text("agent_id"),
35791
+ agentName: text("agent_name"),
35792
+ currentBranch: text("current_branch"),
35793
+ authorityNodeId: text("authority_node_id"),
35794
+ authorityNodeName: text("authority_node_name"),
35795
+ parentConversationId: text("parent_conversation_id"),
35796
+ anchorMessageId: text("anchor_message_id"),
35797
+ activityState: text("activity_state").notNull(),
35798
+ lastMessageId: text("last_message_id"),
35799
+ lastMessageAt: integer("last_message_at"),
35800
+ lastActivityAt: integer("last_activity_at").notNull(),
35801
+ messageCount: integer("message_count").notNull().default(0),
35802
+ unreadCount: integer("unread_count").notNull().default(0),
35803
+ participantCount: integer("participant_count").notNull().default(0),
35804
+ preview: text("preview"),
35805
+ lastEngagedAt: integer("last_engaged_at"),
35806
+ sourceFreshAt: integer("source_fresh_at"),
35807
+ visibilityState: text("visibility_state").notNull().default("visible"),
35808
+ updatedSeq: integer("updated_seq").notNull(),
35809
+ updatedAt: integer("updated_at").notNull()
35810
+ }, (table) => [
35811
+ check("conversation_projection_items_entity_kind_check", sql`${table.entityKind} IN ('scout_conversation', 'observed_session')`),
35812
+ check("conversation_projection_items_visibility_check", sql`${table.visibilityState} IN ('visible', 'hidden')`),
35813
+ index("idx_conversation_projection_recent").on(table.visibilityState, desc(table.lastActivityAt), table.feedId),
35814
+ index("idx_conversation_projection_project_recent").on(table.projectRoot, table.visibilityState, desc(table.lastActivityAt)),
35815
+ index("idx_conversation_projection_engaged").on(table.visibilityState, desc(table.lastEngagedAt), desc(table.lastActivityAt), table.feedId),
35816
+ index("idx_conversation_projection_source_fresh").on(table.visibilityState, desc(table.sourceFreshAt)),
35817
+ index("idx_conversation_projection_runtime_session").on(table.entityKind, table.runtimeSessionId),
35818
+ index("idx_conversation_projection_source_session").on(table.entityKind, table.sourceSessionId),
35819
+ uniqueIndex("idx_conversation_projection_conversation").on(table.conversationId).where(sql`conversation_id IS NOT NULL`)
35820
+ ]);
35821
+ var conversationProjectionMessageFactsTable = sqliteTable("conversation_projection_message_facts", {
35822
+ messageId: text("message_id").primaryKey().references(() => messagesTable.id, { onDelete: "cascade" }),
35823
+ conversationId: text("conversation_id").notNull().references(() => conversationsTable.id, { onDelete: "cascade" }),
35824
+ createdAt: integer("created_at").notNull()
35825
+ }, (table) => [
35826
+ index("idx_conversation_projection_message_facts_conversation").on(table.conversationId, table.createdAt, table.messageId)
35827
+ ]);
35828
+ var conversationProjectionMessageStatsTable = sqliteTable("conversation_projection_message_stats", {
35829
+ conversationId: text("conversation_id").primaryKey().references(() => conversationsTable.id, { onDelete: "cascade" }),
35830
+ messageCount: integer("message_count").notNull().default(0),
35831
+ latestMessageId: text("latest_message_id"),
35832
+ latestMessageAt: integer("latest_message_at")
35833
+ });
35834
+ var conversationProjectionSourcesTable = sqliteTable("conversation_projection_sources", {
35835
+ source: text("source").notNull(),
35836
+ sourceSessionId: text("source_session_id").notNull(),
35837
+ feedId: text("feed_id").notNull().references(() => conversationProjectionItemsTable.feedId, { onDelete: "cascade" }),
35838
+ firstSeenAt: integer("first_seen_at").notNull(),
35839
+ lastSeenAt: integer("last_seen_at").notNull()
35840
+ }, (table) => [
35841
+ primaryKey({ columns: [table.source, table.sourceSessionId] }),
35842
+ index("idx_conversation_projection_sources_feed").on(table.feedId)
35843
+ ]);
35844
+ var conversationProjectionEventsTable = sqliteTable("conversation_projection_events", {
35845
+ seq: integer("seq").primaryKey({ autoIncrement: true }),
35846
+ projectionId: text("projection_id").notNull(),
35847
+ ts: integer("ts").notNull(),
35848
+ payloadJson: text("payload_json").notNull()
35849
+ }, (table) => [
35850
+ index("idx_conversation_projection_events_projection_seq").on(table.projectionId, table.seq),
35851
+ index("idx_conversation_projection_events_ts").on(table.ts)
35709
35852
  ]);
35710
35853
  var invocationsTable = sqliteTable("invocations", {
35711
35854
  id: text("id").primaryKey(),
@@ -35737,7 +35880,10 @@ var invocationsTable = sqliteTable("invocations", {
35737
35880
  executionResolutionJson: text("execution_resolution_json")
35738
35881
  }, (table) => [
35739
35882
  index("idx_invocations_target_created_at").on(table.targetAgentId, table.createdAt),
35740
- index("idx_invocations_requester_created_at").on(table.requesterId, desc(table.createdAt))
35883
+ index("idx_invocations_requester_created_at").on(table.requesterId, desc(table.createdAt)),
35884
+ index("idx_invocations_conversation_created_at").on(table.conversationId, desc(table.createdAt)),
35885
+ index("idx_invocations_requester_node_id").on(table.requesterNodeId),
35886
+ index("idx_invocations_target_node_id").on(table.targetNodeId)
35741
35887
  ]);
35742
35888
  var flightsTable = sqliteTable("flights", {
35743
35889
  id: text("id").primaryKey(),
@@ -35783,7 +35929,8 @@ var deliveriesTable = sqliteTable("deliveries", {
35783
35929
  createdAt: integer("created_at").notNull().default(epochMsNow)
35784
35930
  }, (table) => [
35785
35931
  index("idx_deliveries_status_transport").on(table.status, table.transport),
35786
- index("idx_deliveries_created_at").on(desc(table.createdAt))
35932
+ index("idx_deliveries_created_at").on(desc(table.createdAt)),
35933
+ index("idx_deliveries_target_node_id").on(table.targetNodeId)
35787
35934
  ]);
35788
35935
  var deliveryAttemptsTable = sqliteTable("delivery_attempts", {
35789
35936
  id: text("id").primaryKey(),
@@ -35953,7 +36100,8 @@ var threadEventsTable = sqliteTable("thread_events", {
35953
36100
  }, (table) => [
35954
36101
  unique2().on(table.conversationId, table.seq),
35955
36102
  index("idx_thread_events_conversation_seq").on(table.conversationId, desc(table.seq)),
35956
- index("idx_thread_events_conversation_ts").on(table.conversationId, desc(table.ts))
36103
+ index("idx_thread_events_conversation_ts").on(table.conversationId, desc(table.ts)),
36104
+ index("idx_thread_events_authority_node_id").on(table.authorityNodeId)
35957
36105
  ]);
35958
36106
  var threadCursorsTable = sqliteTable("thread_cursors", {
35959
36107
  conversationId: text("conversation_id").notNull().references(() => conversationsTable.id, { onDelete: "cascade" }),
@@ -35961,7 +36109,8 @@ var threadCursorsTable = sqliteTable("thread_cursors", {
35961
36109
  lastAppliedSeq: integer("last_applied_seq").notNull(),
35962
36110
  updatedAt: integer("updated_at").notNull()
35963
36111
  }, (table) => [
35964
- primaryKey({ columns: [table.conversationId, table.authorityNodeId] })
36112
+ primaryKey({ columns: [table.conversationId, table.authorityNodeId] }),
36113
+ index("idx_thread_cursors_authority_node_id").on(table.authorityNodeId)
35965
36114
  ]);
35966
36115
  var scoutDispatchesTable = sqliteTable("scout_dispatches", {
35967
36116
  id: text("id").primaryKey(),
@@ -36189,6 +36338,8 @@ CREATE INDEX IF NOT EXISTS idx_runtime_sessions_agent_last_seen
36189
36338
  ON runtime_sessions (agent_id, last_seen_at DESC);
36190
36339
  CREATE INDEX IF NOT EXISTS idx_runtime_sessions_endpoint_last_seen
36191
36340
  ON runtime_sessions (endpoint_id, last_seen_at DESC);
36341
+ CREATE INDEX IF NOT EXISTS idx_runtime_sessions_node_id
36342
+ ON runtime_sessions (node_id);
36192
36343
  CREATE INDEX IF NOT EXISTS idx_runtime_sessions_external
36193
36344
  ON runtime_sessions (external_session_id);
36194
36345
  CREATE INDEX IF NOT EXISTS idx_runtime_sessions_expires
@@ -36198,6 +36349,10 @@ CREATE INDEX IF NOT EXISTS idx_runtime_session_aliases_alias
36198
36349
  ON runtime_session_aliases (alias, last_seen_at DESC);
36199
36350
  CREATE INDEX IF NOT EXISTS idx_runtime_session_aliases_session
36200
36351
  ON runtime_session_aliases (session_id);
36352
+ CREATE INDEX IF NOT EXISTS idx_runtime_session_aliases_endpoint
36353
+ ON runtime_session_aliases (endpoint_id);
36354
+ CREATE INDEX IF NOT EXISTS idx_runtime_session_aliases_node_id
36355
+ ON runtime_session_aliases (node_id);
36201
36356
  CREATE INDEX IF NOT EXISTS idx_runtime_session_aliases_expires
36202
36357
  ON runtime_session_aliases (expires_at)
36203
36358
  WHERE expires_at IS NOT NULL;
@@ -36420,6 +36575,93 @@ CREATE TABLE IF NOT EXISTS conversation_read_cursors (
36420
36575
  PRIMARY KEY (conversation_id, actor_id)
36421
36576
  );
36422
36577
 
36578
+ CREATE TABLE IF NOT EXISTS broker_journal_projection_checkpoints (
36579
+ projection_id TEXT PRIMARY KEY,
36580
+ projection_version INTEGER NOT NULL,
36581
+ barrier_id TEXT NOT NULL,
36582
+ updated_at INTEGER NOT NULL
36583
+ );
36584
+
36585
+ CREATE TABLE IF NOT EXISTS conversation_projection_meta (
36586
+ singleton INTEGER PRIMARY KEY,
36587
+ projection_id TEXT NOT NULL,
36588
+ projection_version INTEGER NOT NULL,
36589
+ head_seq INTEGER NOT NULL,
36590
+ min_replayable_seq INTEGER NOT NULL,
36591
+ updated_at INTEGER NOT NULL,
36592
+ CONSTRAINT conversation_projection_meta_singleton_check CHECK (singleton = 1)
36593
+ );
36594
+
36595
+ CREATE TABLE IF NOT EXISTS conversation_projection_items (
36596
+ feed_id TEXT PRIMARY KEY,
36597
+ entity_kind TEXT NOT NULL,
36598
+ kind TEXT NOT NULL,
36599
+ conversation_id TEXT,
36600
+ runtime_session_id TEXT,
36601
+ source TEXT,
36602
+ source_session_id TEXT,
36603
+ title TEXT,
36604
+ alias TEXT,
36605
+ natural_key TEXT,
36606
+ project_root TEXT,
36607
+ harness TEXT,
36608
+ model TEXT,
36609
+ effort TEXT,
36610
+ agent_id TEXT,
36611
+ agent_name TEXT,
36612
+ current_branch TEXT,
36613
+ authority_node_id TEXT,
36614
+ authority_node_name TEXT,
36615
+ parent_conversation_id TEXT,
36616
+ anchor_message_id TEXT,
36617
+ activity_state TEXT NOT NULL,
36618
+ last_message_id TEXT,
36619
+ last_message_at INTEGER,
36620
+ last_activity_at INTEGER NOT NULL,
36621
+ message_count INTEGER NOT NULL DEFAULT 0,
36622
+ unread_count INTEGER NOT NULL DEFAULT 0,
36623
+ participant_count INTEGER NOT NULL DEFAULT 0,
36624
+ preview TEXT,
36625
+ last_engaged_at INTEGER,
36626
+ source_fresh_at INTEGER,
36627
+ visibility_state TEXT NOT NULL DEFAULT 'visible',
36628
+ updated_seq INTEGER NOT NULL,
36629
+ updated_at INTEGER NOT NULL,
36630
+ CONSTRAINT conversation_projection_items_entity_kind_check
36631
+ CHECK (entity_kind IN ('scout_conversation', 'observed_session')),
36632
+ CONSTRAINT conversation_projection_items_visibility_check
36633
+ CHECK (visibility_state IN ('visible', 'hidden'))
36634
+ );
36635
+
36636
+ CREATE TABLE IF NOT EXISTS conversation_projection_message_facts (
36637
+ message_id TEXT PRIMARY KEY REFERENCES messages(id) ON DELETE CASCADE,
36638
+ conversation_id TEXT NOT NULL REFERENCES conversations(id) ON DELETE CASCADE,
36639
+ created_at INTEGER NOT NULL
36640
+ );
36641
+
36642
+ CREATE TABLE IF NOT EXISTS conversation_projection_message_stats (
36643
+ conversation_id TEXT PRIMARY KEY REFERENCES conversations(id) ON DELETE CASCADE,
36644
+ message_count INTEGER NOT NULL DEFAULT 0,
36645
+ latest_message_id TEXT,
36646
+ latest_message_at INTEGER
36647
+ );
36648
+
36649
+ CREATE TABLE IF NOT EXISTS conversation_projection_sources (
36650
+ source TEXT NOT NULL,
36651
+ source_session_id TEXT NOT NULL,
36652
+ feed_id TEXT NOT NULL REFERENCES conversation_projection_items(feed_id) ON DELETE CASCADE,
36653
+ first_seen_at INTEGER NOT NULL,
36654
+ last_seen_at INTEGER NOT NULL,
36655
+ PRIMARY KEY (source, source_session_id)
36656
+ );
36657
+
36658
+ CREATE TABLE IF NOT EXISTS conversation_projection_events (
36659
+ seq INTEGER PRIMARY KEY AUTOINCREMENT,
36660
+ projection_id TEXT NOT NULL,
36661
+ ts INTEGER NOT NULL,
36662
+ payload_json TEXT NOT NULL
36663
+ );
36664
+
36423
36665
  CREATE TABLE IF NOT EXISTS invocations (
36424
36666
  id TEXT PRIMARY KEY,
36425
36667
  requester_id TEXT NOT NULL REFERENCES actors(id) ON DELETE RESTRICT,
@@ -36827,18 +37069,74 @@ CREATE INDEX IF NOT EXISTS idx_peer_nonces_seen_at
36827
37069
  ON peer_nonces (seen_at);
36828
37070
  CREATE INDEX IF NOT EXISTS idx_agent_endpoints_agent_updated_at
36829
37071
  ON agent_endpoints (agent_id, updated_at DESC);
37072
+ CREATE INDEX IF NOT EXISTS idx_agent_endpoints_roster_recency
37073
+ ON agent_endpoints (
37074
+ CASE
37075
+ WHEN updated_at IS NULL THEN NULL
37076
+ WHEN CAST(updated_at AS REAL) < 1000000000000
37077
+ THEN CAST(CAST(updated_at AS REAL) * 1000 AS INTEGER)
37078
+ ELSE CAST(updated_at AS INTEGER)
37079
+ END DESC,
37080
+ agent_id
37081
+ );
37082
+ CREATE INDEX IF NOT EXISTS idx_agents_home_node_id
37083
+ ON agents (home_node_id);
37084
+ CREATE INDEX IF NOT EXISTS idx_agents_authority_node_id
37085
+ ON agents (authority_node_id);
37086
+ CREATE INDEX IF NOT EXISTS idx_agent_endpoints_node_id
37087
+ ON agent_endpoints (node_id);
37088
+ CREATE INDEX IF NOT EXISTS idx_conversation_members_actor
37089
+ ON conversation_members (actor_id, conversation_id);
36830
37090
  CREATE INDEX IF NOT EXISTS idx_messages_conversation_created_at
36831
37091
  ON messages (conversation_id, created_at);
36832
37092
  CREATE INDEX IF NOT EXISTS idx_messages_created_at
36833
37093
  ON messages (created_at DESC);
36834
37094
  CREATE INDEX IF NOT EXISTS idx_messages_actor_created_at
36835
37095
  ON messages (actor_id, created_at DESC);
37096
+ CREATE INDEX IF NOT EXISTS idx_messages_origin_node_id
37097
+ ON messages (origin_node_id);
36836
37098
  CREATE INDEX IF NOT EXISTS idx_read_cursors_conversation_updated_at
36837
37099
  ON conversation_read_cursors (conversation_id, updated_at DESC);
37100
+ CREATE INDEX IF NOT EXISTS idx_read_cursors_reader_node_id
37101
+ ON conversation_read_cursors (reader_node_id);
37102
+ CREATE INDEX IF NOT EXISTS idx_conversation_projection_recent
37103
+ ON conversation_projection_items (visibility_state, last_activity_at DESC, feed_id);
37104
+ CREATE INDEX IF NOT EXISTS idx_conversation_projection_project_recent
37105
+ ON conversation_projection_items (project_root, visibility_state, last_activity_at DESC);
37106
+ CREATE INDEX IF NOT EXISTS idx_conversation_projection_message_facts_conversation
37107
+ ON conversation_projection_message_facts (conversation_id, created_at, message_id);
37108
+ CREATE INDEX IF NOT EXISTS idx_conversation_projection_engaged
37109
+ ON conversation_projection_items (
37110
+ visibility_state,
37111
+ last_engaged_at DESC,
37112
+ last_activity_at DESC,
37113
+ feed_id
37114
+ );
37115
+ CREATE INDEX IF NOT EXISTS idx_conversation_projection_source_fresh
37116
+ ON conversation_projection_items (visibility_state, source_fresh_at DESC);
37117
+ CREATE INDEX IF NOT EXISTS idx_conversation_projection_runtime_session
37118
+ ON conversation_projection_items (entity_kind, runtime_session_id);
37119
+ CREATE INDEX IF NOT EXISTS idx_conversation_projection_source_session
37120
+ ON conversation_projection_items (entity_kind, source_session_id);
37121
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_conversation_projection_conversation
37122
+ ON conversation_projection_items (conversation_id)
37123
+ WHERE conversation_id IS NOT NULL;
37124
+ CREATE INDEX IF NOT EXISTS idx_conversation_projection_sources_feed
37125
+ ON conversation_projection_sources (feed_id);
37126
+ CREATE INDEX IF NOT EXISTS idx_conversation_projection_events_projection_seq
37127
+ ON conversation_projection_events (projection_id, seq);
37128
+ CREATE INDEX IF NOT EXISTS idx_conversation_projection_events_ts
37129
+ ON conversation_projection_events (ts);
36838
37130
  CREATE INDEX IF NOT EXISTS idx_invocations_target_created_at
36839
37131
  ON invocations (target_agent_id, created_at);
36840
37132
  CREATE INDEX IF NOT EXISTS idx_invocations_requester_created_at
36841
37133
  ON invocations (requester_id, created_at DESC);
37134
+ CREATE INDEX IF NOT EXISTS idx_invocations_conversation_created_at
37135
+ ON invocations (conversation_id, created_at DESC);
37136
+ CREATE INDEX IF NOT EXISTS idx_invocations_requester_node_id
37137
+ ON invocations (requester_node_id);
37138
+ CREATE INDEX IF NOT EXISTS idx_invocations_target_node_id
37139
+ ON invocations (target_node_id);
36842
37140
  CREATE INDEX IF NOT EXISTS idx_flights_target_state
36843
37141
  ON flights (target_agent_id, state);
36844
37142
  CREATE INDEX IF NOT EXISTS idx_flights_invocation_id
@@ -36847,6 +37145,8 @@ CREATE INDEX IF NOT EXISTS idx_deliveries_status_transport
36847
37145
  ON deliveries (status, transport);
36848
37146
  CREATE INDEX IF NOT EXISTS idx_deliveries_created_at
36849
37147
  ON deliveries (created_at DESC);
37148
+ CREATE INDEX IF NOT EXISTS idx_deliveries_target_node_id
37149
+ ON deliveries (target_node_id);
36850
37150
  CREATE INDEX IF NOT EXISTS idx_delivery_attempts_created_at
36851
37151
  ON delivery_attempts (created_at DESC);
36852
37152
  CREATE UNIQUE INDEX IF NOT EXISTS idx_durable_actions_idempotency_key
@@ -36893,6 +37193,10 @@ CREATE INDEX IF NOT EXISTS idx_thread_events_conversation_seq
36893
37193
  ON thread_events (conversation_id, seq DESC);
36894
37194
  CREATE INDEX IF NOT EXISTS idx_thread_events_conversation_ts
36895
37195
  ON thread_events (conversation_id, ts DESC);
37196
+ CREATE INDEX IF NOT EXISTS idx_thread_events_authority_node_id
37197
+ ON thread_events (authority_node_id);
37198
+ CREATE INDEX IF NOT EXISTS idx_thread_cursors_authority_node_id
37199
+ ON thread_cursors (authority_node_id);
36896
37200
  CREATE INDEX IF NOT EXISTS idx_activity_items_agent_ts
36897
37201
  ON activity_items (agent_id, ts DESC);
36898
37202
  CREATE INDEX IF NOT EXISTS idx_activity_items_actor_ts
@@ -50353,12 +50657,24 @@ var meshPeerFetch = createMeshPeerFetch();
50353
50657
  init_tailscale();
50354
50658
  // ../runtime/src/iroh-bridge.ts
50355
50659
  init_support_paths();
50660
+
50661
+ // ../runtime/src/mesh-forwarding.ts
50662
+ var MAX_PEER_AGENT_SNAPSHOT_BYTES = 2 * 1024 * 1024;
50356
50663
  // ../runtime/src/mesh-rendezvous.ts
50357
50664
  init_src();
50358
50665
  init_broker_process_manager();
50359
50666
  init_open_scout_network();
50360
50667
  var DEFAULT_RENDEZVOUS_TTL_MS = 60000;
50361
50668
  var DEFAULT_RENDEZVOUS_INTERVAL_MS = 30000;
50669
+
50670
+ class MeshRendezvousPublishError extends Error {
50671
+ status;
50672
+ constructor(status, message) {
50673
+ super(message);
50674
+ this.status = status;
50675
+ this.name = "MeshRendezvousPublishError";
50676
+ }
50677
+ }
50362
50678
  function resolveMeshRendezvousPublishConfig(env = process.env, options = {}) {
50363
50679
  const explicitUrl = env.OPENSCOUT_MESH_RENDEZVOUS_URL?.trim();
50364
50680
  if (explicitUrl?.toLowerCase() === "false" || explicitUrl === "0") {
@@ -50372,6 +50688,10 @@ function resolveMeshRendezvousPublishConfig(env = process.env, options = {}) {
50372
50688
  }
50373
50689
  const token = env.OPENSCOUT_MESH_RENDEZVOUS_TOKEN?.trim() || undefined;
50374
50690
  const sessionToken = env.OPENSCOUT_MESH_RENDEZVOUS_SESSION?.trim() || undefined;
50691
+ const allowAnonymous = readBooleanFlag(env.OPENSCOUT_MESH_RENDEZVOUS_ALLOW_ANONYMOUS);
50692
+ if (!token && !sessionToken && !allowAnonymous) {
50693
+ return;
50694
+ }
50375
50695
  return {
50376
50696
  url: rawUrl.replace(/\/$/, ""),
50377
50697
  token,
@@ -50413,15 +50733,16 @@ async function publishMeshRendezvousPresence(node, options) {
50413
50733
  });
50414
50734
  if (!response.ok) {
50415
50735
  const detail = await response.text().catch(() => "");
50416
- throw new Error(`rendezvous publish failed: ${response.status} ${response.statusText}${detail ? ` ${detail}` : ""}`);
50736
+ throw new MeshRendezvousPublishError(response.status, `rendezvous publish failed: ${response.status} ${response.statusText}${detail ? ` ${detail}` : ""}`);
50417
50737
  }
50418
50738
  return true;
50419
50739
  }
50420
50740
  function startMeshRendezvousPublisher(node, options) {
50421
50741
  let stopped2 = false;
50742
+ let suspendedForAuth = false;
50422
50743
  let inFlight = null;
50423
50744
  const publishNow = async () => {
50424
- if (stopped2)
50745
+ if (stopped2 || suspendedForAuth)
50425
50746
  return;
50426
50747
  if (inFlight) {
50427
50748
  await inFlight;
@@ -50432,6 +50753,11 @@ function startMeshRendezvousPublisher(node, options) {
50432
50753
  options.logger?.log(`[openscout-runtime] published mesh rendezvous presence to ${options.config.url}`);
50433
50754
  }
50434
50755
  }).catch((error) => {
50756
+ if (error instanceof MeshRendezvousPublishError && (error.status === 401 || error.status === 403)) {
50757
+ suspendedForAuth = true;
50758
+ options.logger?.warn(`[openscout-runtime] mesh rendezvous authentication rejected; publishing is suspended until restart: ${error.message}`);
50759
+ return;
50760
+ }
50435
50761
  options.logger?.warn(`[openscout-runtime] mesh rendezvous publish failed: ${error instanceof Error ? error.message : String(error)}`);
50436
50762
  }).finally(() => {
50437
50763
  inFlight = null;
@@ -50493,6 +50819,9 @@ function readPositiveInteger(value, fallback2) {
50493
50819
  const parsed = Number.parseInt(value ?? "", 10);
50494
50820
  return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback2;
50495
50821
  }
50822
+ function readBooleanFlag(value) {
50823
+ return ["1", "true", "yes", "on"].includes(value?.trim().toLowerCase() ?? "");
50824
+ }
50496
50825
 
50497
50826
  // ../runtime/src/index.ts
50498
50827
  init_node_identity();
@@ -54697,6 +55026,7 @@ var pairingLog = {
54697
55026
  };
54698
55027
 
54699
55028
  // ../web/server/core/pairing/runtime/relay/relay.ts
55029
+ init_local_config();
54700
55030
  var BRIDGE_ABSENCE_GRACE_MS = 30000;
54701
55031
  var ROOM_IDLE_TIMEOUT_MS = 60000;
54702
55032
  function startRelay(port, options = {}) {
@@ -54713,6 +55043,9 @@ function startRelay(port, options = {}) {
54713
55043
  } : {},
54714
55044
  fetch(req, server2) {
54715
55045
  const url = new URL(req.url);
55046
+ if (url.pathname === "/pair" && req.method === "GET") {
55047
+ return proxyPairHttp(req, url, options.pairHttpOrigin, server2.requestIP(req)?.address);
55048
+ }
54716
55049
  if (url.pathname === "/resolve" && req.method === "POST") {
54717
55050
  return handleResolve(req, roomByBridgeKey, rooms);
54718
55051
  }
@@ -54856,6 +55189,46 @@ function startRelay(port, options = {}) {
54856
55189
  }
54857
55190
  };
54858
55191
  }
55192
+ async function proxyPairHttp(req, url, pairHttpOrigin, clientIp) {
55193
+ const origin = pairHttpOrigin === undefined ? `http://127.0.0.1:${resolveWebPort()}` : pairHttpOrigin?.trim() || null;
55194
+ if (!origin) {
55195
+ return new Response("Pairing HTTP is not configured", { status: 503 });
55196
+ }
55197
+ const target2 = new URL("/pair", origin);
55198
+ target2.search = url.search;
55199
+ const headers2 = new Headers;
55200
+ for (const name2 of ["accept", "user-agent", "x-scout-client", "x-scout-device-name"]) {
55201
+ const value = req.headers.get(name2);
55202
+ if (value)
55203
+ headers2.set(name2, value);
55204
+ }
55205
+ headers2.set("x-scout-pair-relay", "1");
55206
+ if (clientIp) {
55207
+ headers2.set("x-forwarded-for", clientIp);
55208
+ headers2.set("x-real-ip", clientIp);
55209
+ }
55210
+ try {
55211
+ const response = await fetch(target2, {
55212
+ method: "GET",
55213
+ headers: headers2,
55214
+ redirect: "manual",
55215
+ signal: AbortSignal.timeout(3000)
55216
+ });
55217
+ const out = new Headers;
55218
+ const location = response.headers.get("location");
55219
+ if (location)
55220
+ out.set("location", location);
55221
+ const cacheControl = response.headers.get("cache-control");
55222
+ if (cacheControl)
55223
+ out.set("cache-control", cacheControl);
55224
+ const contentType = response.headers.get("content-type");
55225
+ if (contentType)
55226
+ out.set("content-type", contentType);
55227
+ return new Response(response.body, { status: response.status, headers: out });
55228
+ } catch {
55229
+ return new Response("Pairing service unreachable", { status: 502 });
55230
+ }
55231
+ }
54859
55232
  async function handleResolve(req, roomByBridgeKey, rooms) {
54860
55233
  try {
54861
55234
  const body = await req.json();
@@ -59215,7 +59588,8 @@ var SCOUT_API_LOG_ALL = process.env.SCOUT_PERF_LOG_API === "1";
59215
59588
  // ../web/server/core/broker/service.ts
59216
59589
  var DEFAULT_SCOUT_BROKER_SNAPSHOT_WINDOW_MS = 24 * 60 * 60 * 1000;
59217
59590
  var DEFAULT_SCOUT_BROKER_SNAPSHOT_BUCKET_MS = 60 * 1000;
59218
- var SCOUT_BROKER_CONTEXT_CACHE_TTL_MS = 5000;
59591
+ var SCOUT_BROKER_CONTEXT_CACHE_TTL_MS = 30000;
59592
+ var SCOUT_BROKER_CONTEXT_STALE_RETENTION_MS = 60000;
59219
59593
  var scoutBrokerContextCache = new Map;
59220
59594
  function invalidateScoutBrokerContextCache(baseUrl) {
59221
59595
  const prefix = [baseUrl, resolveBrokerSocketPathForBaseUrl(baseUrl) ?? "http"].join("\x00") + "\x00";
@@ -59532,26 +59906,24 @@ async function recordScoutBrokerReadCursor(input, baseUrl = resolveScoutBrokerUr
59532
59906
  });
59533
59907
  }
59534
59908
  async function loadScoutBrokerContext(baseUrl = resolveScoutBrokerUrl(), options = {}) {
59535
- const since = options.since === undefined ? Math.floor((Date.now() - DEFAULT_SCOUT_BROKER_SNAPSHOT_WINDOW_MS) / DEFAULT_SCOUT_BROKER_SNAPSHOT_BUCKET_MS) * DEFAULT_SCOUT_BROKER_SNAPSHOT_BUCKET_MS : options.since;
59909
+ const usesRollingWindow = options.since === undefined;
59910
+ const since = usesRollingWindow ? Math.floor((Date.now() - DEFAULT_SCOUT_BROKER_SNAPSHOT_WINDOW_MS) / DEFAULT_SCOUT_BROKER_SNAPSHOT_BUCKET_MS) * DEFAULT_SCOUT_BROKER_SNAPSHOT_BUCKET_MS : options.since;
59536
59911
  if (options.force) {
59537
59912
  invalidateScoutBrokerContextCache(baseUrl);
59538
59913
  }
59539
59914
  const cacheKey = options.signal ? null : [
59540
59915
  baseUrl,
59541
59916
  resolveBrokerSocketPathForBaseUrl(baseUrl) ?? "http",
59542
- since ?? "full",
59917
+ usesRollingWindow ? "rolling-24h" : since ?? "full",
59543
59918
  options.scope ?? "default"
59544
59919
  ].join("\x00");
59545
59920
  const now = Date.now();
59546
- for (const [key, entry] of scoutBrokerContextCache) {
59547
- if (entry.expiresAt <= now)
59921
+ for (const [key, entry2] of scoutBrokerContextCache) {
59922
+ if (key !== cacheKey && !entry2.inFlight && entry2.expiresAt + SCOUT_BROKER_CONTEXT_STALE_RETENTION_MS <= now) {
59548
59923
  scoutBrokerContextCache.delete(key);
59924
+ }
59549
59925
  }
59550
- const cached = cacheKey ? scoutBrokerContextCache.get(cacheKey) : null;
59551
- if (cached && cached.expiresAt > now) {
59552
- return cached.promise;
59553
- }
59554
- const promise = (async () => {
59926
+ const readContext = async () => {
59555
59927
  const health = await readScoutBrokerHealth(baseUrl, { signal: options.signal });
59556
59928
  if (!health.reachable || !health.ok) {
59557
59929
  return null;
@@ -59575,19 +59947,60 @@ async function loadScoutBrokerContext(baseUrl = resolveScoutBrokerUrl(), options
59575
59947
  } catch {
59576
59948
  return null;
59577
59949
  }
59578
- })();
59579
- if (cacheKey) {
59580
- scoutBrokerContextCache.set(cacheKey, {
59581
- expiresAt: now + SCOUT_BROKER_CONTEXT_CACHE_TTL_MS,
59582
- promise
59583
- });
59584
- promise.then((context) => {
59585
- if (!context && scoutBrokerContextCache.get(cacheKey)?.promise === promise) {
59950
+ };
59951
+ if (!cacheKey) {
59952
+ return readContext();
59953
+ }
59954
+ const refresh = (entry2, delayMs = 0) => {
59955
+ if (entry2.inFlight)
59956
+ return entry2.inFlight;
59957
+ const attempt = (delayMs > 0 ? new Promise((resolve15) => setTimeout(resolve15, delayMs)) : Promise.resolve()).then(readContext).then((context) => {
59958
+ if (scoutBrokerContextCache.get(cacheKey) !== entry2)
59959
+ return context;
59960
+ if (context) {
59961
+ entry2.value = context;
59962
+ entry2.hasValue = true;
59963
+ entry2.expiresAt = Date.now() + SCOUT_BROKER_CONTEXT_CACHE_TTL_MS;
59964
+ } else if (!entry2.hasValue) {
59586
59965
  scoutBrokerContextCache.delete(cacheKey);
59966
+ } else {
59967
+ entry2.expiresAt = Date.now() + SCOUT_BROKER_CONTEXT_CACHE_TTL_MS;
59968
+ }
59969
+ return context;
59970
+ }).finally(() => {
59971
+ if (scoutBrokerContextCache.get(cacheKey) === entry2) {
59972
+ entry2.inFlight = null;
59587
59973
  }
59588
59974
  });
59975
+ entry2.inFlight = attempt;
59976
+ return attempt;
59977
+ };
59978
+ const cached = scoutBrokerContextCache.get(cacheKey);
59979
+ if (cached) {
59980
+ if (cached.hasValue) {
59981
+ if (cached.expiresAt <= now && !cached.inFlight) {
59982
+ refresh(cached);
59983
+ }
59984
+ return cached.value;
59985
+ }
59986
+ if (options.waitForInitial === false) {
59987
+ refresh(cached, options.initialRefreshDelayMs);
59988
+ return null;
59989
+ }
59990
+ return refresh(cached);
59589
59991
  }
59590
- return promise;
59992
+ const entry = {
59993
+ expiresAt: now + SCOUT_BROKER_CONTEXT_CACHE_TTL_MS,
59994
+ value: null,
59995
+ hasValue: false,
59996
+ inFlight: null
59997
+ };
59998
+ scoutBrokerContextCache.set(cacheKey, entry);
59999
+ if (options.waitForInitial === false) {
60000
+ refresh(entry, options.initialRefreshDelayMs);
60001
+ return null;
60002
+ }
60003
+ return refresh(entry);
59591
60004
  }
59592
60005
  async function requireScoutBrokerContext(baseUrl = resolveScoutBrokerUrl()) {
59593
60006
  const context = await loadScoutBrokerContext(baseUrl);
@@ -60674,14 +61087,71 @@ function staleFlightActivityPredicate(alias) {
60674
61087
  }
60675
61088
 
60676
61089
  // ../web/server/db/agents.ts
61090
+ var actorCreatedAtExpression = sqlTimestampMsExpression("ac.created_at");
61091
+ var endpointUpdatedAtExpression = sqlTimestampMsExpression("ep.updated_at");
61092
+ var AGENT_ROW_SELECT = `SELECT
61093
+ a.id,
61094
+ a.definition_id,
61095
+ a.node_qualifier,
61096
+ a.workspace_qualifier,
61097
+ a.selector,
61098
+ ac.display_name AS name,
61099
+ ac.handle,
61100
+ ${actorCreatedAtExpression} AS actor_created_at,
61101
+ a.agent_class,
61102
+ a.default_selector,
61103
+ a.wake_policy,
61104
+ a.capabilities_json,
61105
+ a.metadata_json,
61106
+ a.authority_node_id,
61107
+ an.name AS authority_node_name,
61108
+ a.home_node_id,
61109
+ hn.name AS home_node_name,
61110
+ a.owner_id,
61111
+ oa.display_name AS owner_name,
61112
+ oa.handle AS owner_handle,
61113
+ ep.harness,
61114
+ ep.transport,
61115
+ ep.state,
61116
+ ep.project_root,
61117
+ ep.cwd,
61118
+ ep.session_id,
61119
+ ep.metadata_json AS endpoint_metadata_json,
61120
+ ${endpointUpdatedAtExpression} AS updated_at
61121
+ FROM agents a
61122
+ JOIN actors ac ON ac.id = a.id
61123
+ LEFT JOIN nodes an ON an.id = a.authority_node_id
61124
+ LEFT JOIN nodes hn ON hn.id = a.home_node_id
61125
+ LEFT JOIN actors oa ON oa.id = a.owner_id
61126
+ ${LATEST_AGENT_ENDPOINT_JOIN}`;
61127
+ var RECENT_ENDPOINT_AGENT_IDS_WITHOUT_INDEX_SQL = (() => {
61128
+ const endpointUpdatedAtExpression2 = sqlTimestampMsExpression("ep.updated_at");
61129
+ const latestEndpointUpdatedAtExpression = sqlTimestampMsCoalesceExpression("ep2.updated_at");
61130
+ return `SELECT a.id
61131
+ FROM agent_endpoints ep
61132
+ JOIN agents a ON a.id = ep.agent_id
61133
+ JOIN actors ac ON ac.id = a.id
61134
+ WHERE ep.id = (
61135
+ SELECT ep2.id
61136
+ FROM agent_endpoints ep2
61137
+ WHERE ep2.agent_id = a.id
61138
+ ORDER BY ${latestEndpointUpdatedAtExpression} DESC
61139
+ LIMIT 1
61140
+ )
61141
+ AND ${endpointUpdatedAtExpression2} > 0
61142
+ AND ${activeAgentMetadataPredicate("a")}
61143
+ ORDER BY ${endpointUpdatedAtExpression2} DESC, ac.display_name ASC
61144
+ LIMIT ?`;
61145
+ })();
61146
+ var RECENT_ENDPOINT_AGENT_IDS_SQL = RECENT_ENDPOINT_AGENT_IDS_WITHOUT_INDEX_SQL.replace("FROM agent_endpoints ep", "FROM agent_endpoints ep INDEXED BY idx_agent_endpoints_roster_recency");
60677
61147
  function queryAgentIdsByEndpointSessionId() {
60678
- const endpointUpdatedAtExpression = sqlTimestampMsExpression("ep.updated_at");
61148
+ const endpointUpdatedAtExpression2 = sqlTimestampMsExpression("ep.updated_at");
60679
61149
  const rows = db().prepare(`SELECT a.id, ep.session_id
60680
61150
  FROM agents a
60681
61151
  ${LATEST_AGENT_ENDPOINT_JOIN}
60682
61152
  WHERE ep.session_id IS NOT NULL
60683
61153
  AND ${activeAgentMetadataPredicate("a")}
60684
- ORDER BY COALESCE(${endpointUpdatedAtExpression}, 0) ASC`).all();
61154
+ ORDER BY COALESCE(${endpointUpdatedAtExpression2}, 0) ASC`).all();
60685
61155
  const map = new Map;
60686
61156
  for (const row of rows) {
60687
61157
  const sessionId = row.session_id.trim();
@@ -60865,8 +61335,8 @@ function queryFleetAskRows(requesterIds, limit) {
60865
61335
  ep.state AS endpoint_state,
60866
61336
  cr.title AS work_title,
60867
61337
  cr.summary AS work_summary,
61338
+ cr.kind AS record_kind,
60868
61339
  cr.state AS work_state,
60869
- cr.acceptance_state,
60870
61340
  cr.next_move_owner_id,
60871
61341
  cr.updated_at AS work_updated_at
60872
61342
  FROM invocations inv
@@ -60928,7 +61398,8 @@ function projectFleetAsk(row, requesterIdSet) {
60928
61398
  const queuedUntilOnline = queuedFlight && row.dispatch_outcome_status === "queued_until_online";
60929
61399
  const staleActiveFlight = hasFlight && row.flight_state !== null && !TERMINAL_FLIGHT_STATES.has(row.flight_state) && isStaleActiveFlight(row.started_at, row.created_at);
60930
61400
  const isActiveFlight = hasFlight && row.flight_state !== null && !TERMINAL_FLIGHT_STATES.has(row.flight_state) && !failed && !staleActiveFlight;
60931
- const awaitingOperator = Boolean(row.next_move_owner_id && requesterIdSet.has(row.next_move_owner_id) || row.acceptance_state === "pending");
61401
+ const attentionEligibleState = row.record_kind === "work_item" && row.work_state !== null && ["open", "working", "waiting", "review"].includes(row.work_state) || row.record_kind === "question" && row.work_state !== null && ["open", "answered"].includes(row.work_state);
61402
+ const awaitingOperator = attentionEligibleState && Boolean(row.next_move_owner_id && requesterIdSet.has(row.next_move_owner_id));
60932
61403
  const updatedAt = normalizeTimestampMs(row.status_ts ?? row.completed_at ?? row.started_at ?? row.work_updated_at ?? row.created_at) ?? Date.now();
60933
61404
  const dismissedAt = normalizeTimestampMs(row.flight_dismissed_at);
60934
61405
  const recoveredAfterFailureAt = normalizeTimestampMs(row.recovered_after_failure_at);
@@ -60941,10 +61412,10 @@ function projectFleetAsk(row, requesterIdSet) {
60941
61412
  status = queuedUntilOnline ? "failed" : "queued";
60942
61413
  } else if (isActiveFlight) {
60943
61414
  status = "working";
60944
- } else if (awaitingOperator) {
60945
- status = "needs_attention";
60946
61415
  } else if (failed || staleActiveFlight) {
60947
61416
  status = "failed";
61417
+ } else if (awaitingOperator) {
61418
+ status = "needs_attention";
60948
61419
  } else {
60949
61420
  status = "completed";
60950
61421
  }
@@ -60988,34 +61459,7 @@ function queryFleetAttentionRows(requesterIds, limit) {
60988
61459
  (cr.kind = 'work_item' AND cr.state IN ('open', 'working', 'waiting', 'review'))
60989
61460
  OR (cr.kind = 'question' AND cr.state IN ('open', 'answered'))
60990
61461
  )
60991
- AND (
60992
- cr.next_move_owner_id IN (${requesterClause})
60993
- OR (
60994
- cr.kind = 'work_item'
60995
- AND cr.state = 'review'
60996
- AND cr.acceptance_state = 'pending'
60997
- AND NOT EXISTS (
60998
- SELECT 1
60999
- FROM collaboration_events e
61000
- WHERE e.record_id = cr.id
61001
- AND e.created_at > cr.updated_at
61002
- )
61003
- AND NOT EXISTS (
61004
- SELECT 1
61005
- FROM invocations inv
61006
- WHERE inv.collaboration_record_id = cr.id
61007
- AND inv.flight_id IS NOT NULL
61008
- AND COALESCE(inv.completed_at, inv.started_at, 0) > cr.updated_at
61009
- )
61010
- AND NOT EXISTS (
61011
- SELECT 1
61012
- FROM messages m
61013
- WHERE m.conversation_id = cr.conversation_id
61014
- AND m.actor_id = cr.owner_id
61015
- AND m.created_at > cr.updated_at
61016
- )
61017
- )
61018
- )
61462
+ AND cr.next_move_owner_id IN (${requesterClause})
61019
61463
  AND NOT EXISTS (
61020
61464
  SELECT 1
61021
61465
  FROM collaboration_events dismissed
@@ -61088,7 +61532,7 @@ function resolveAgentConversationId(agentId) {
61088
61532
  return recent?.conversation_id ?? null;
61089
61533
  }
61090
61534
  function queryMobileAgentDetail(agentId) {
61091
- const endpointUpdatedAtExpression = sqlTimestampMsExpression("ep.updated_at");
61535
+ const endpointUpdatedAtExpression2 = sqlTimestampMsExpression("ep.updated_at");
61092
61536
  const row = db().prepare(`SELECT
61093
61537
  a.id,
61094
61538
  ac.display_name,
@@ -61102,7 +61546,7 @@ function queryMobileAgentDetail(agentId) {
61102
61546
  ep.project_root,
61103
61547
  ep.cwd,
61104
61548
  ep.session_id,
61105
- ${endpointUpdatedAtExpression} AS updated_at
61549
+ ${endpointUpdatedAtExpression2} AS updated_at
61106
61550
  FROM agents a
61107
61551
  JOIN actors ac ON ac.id = a.id
61108
61552
  ${LATEST_AGENT_ENDPOINT_JOIN}
@@ -61246,7 +61690,7 @@ init_pi_rpc();
61246
61690
  init_system_probes();
61247
61691
  import { createHash as createHash6 } from "crypto";
61248
61692
  import { existsSync as existsSync35, mkdirSync as mkdirSync16, readdirSync as readdirSync5, readFileSync as readFileSync21, renameSync as renameSync5, statSync as statSync10, writeFileSync as writeFileSync12 } from "fs";
61249
- import { open } from "fs/promises";
61693
+ import { open, readdir as readdir4, stat as stat6 } from "fs/promises";
61250
61694
  import { homedir as homedir33 } from "os";
61251
61695
  import { dirname as dirname21, join as join41 } from "path";
61252
61696
  import { createInterface as createInterface2 } from "readline";
@@ -61254,6 +61698,10 @@ import { Database as Database3 } from "bun:sqlite";
61254
61698
  var CACHE_TTL_MS = 60 * 1000;
61255
61699
  var WEEK_MS = 7 * 24 * 3600 * 1000;
61256
61700
  var CODEX_LOOKBACK_DAYS = 3;
61701
+ var CODEX_JSONL_TAIL_MAX_BYTES = 2 * 1024 * 1024;
61702
+ var CODEX_INITIAL_FILE_LIMIT = 32;
61703
+ var CODEX_RECENT_CANDIDATE_LIMIT = 64;
61704
+ var CODEX_JSONL_READ_CONCURRENCY = 8;
61257
61705
  var LOCAL_QUOTA_FRESH_MS = 2 * 60 * 1000;
61258
61706
  var REMOTE_QUOTA_FRESH_MS = 5 * 60 * 1000;
61259
61707
  var GH_CLI_TIMEOUT_MS = 4000;
@@ -61352,12 +61800,14 @@ async function loadCodexGauge(forceRefresh = false) {
61352
61800
  const root = join41(homeDir(), ".codex", "sessions");
61353
61801
  if (!existsSync35(root))
61354
61802
  return fallback2;
61355
- const recent = findRecentCodexJsonl(root, CODEX_LOOKBACK_DAYS);
61356
- if (recent.length === 0)
61803
+ const candidates = await findRecentCodexJsonl(root, CODEX_LOOKBACK_DAYS);
61804
+ if (candidates.length === 0)
61357
61805
  return fallback2;
61358
- const observations = (await Promise.all(recent.map((path2) => readLatestCodexRateLimits(path2)))).flat().sort((left, right) => left.capturedAt - right.capturedAt);
61806
+ const observations = (await harvestRecentCodexRateLimits(candidates)).sort((left, right) => left.capturedAt - right.capturedAt);
61359
61807
  if (observations.length === 0)
61360
61808
  return fallback2;
61809
+ if (!observations.some(isCodexAccountPoolObservation))
61810
+ return fallback2;
61361
61811
  const snapshots = bindingCodexPoolSnapshots(observations.flatMap((observation) => codexQuotaSnapshotsFromObservation(observation.usage, observation.capturedAt)));
61362
61812
  persistQuotaSnapshots(snapshots);
61363
61813
  const persisted = loadPersistedProviderQuotaGauge({
@@ -61414,9 +61864,11 @@ function bindingCodexPoolSnapshots(snapshots) {
61414
61864
  const usedPercent = quotaSnapshotUsage(row)?.fill;
61415
61865
  if (usedPercent === undefined)
61416
61866
  continue;
61867
+ const poolId = poolIdOf(row);
61868
+ const accountPool = isCodexAccountPoolId(poolId);
61417
61869
  const best = bindingPoolByLabel.get(row.label);
61418
- if (!best || usedPercent > best.usedPercent || usedPercent === best.usedPercent && row.capturedAt > best.capturedAt) {
61419
- bindingPoolByLabel.set(row.label, { poolId: poolIdOf(row), usedPercent, capturedAt: row.capturedAt });
61870
+ if (!best || usedPercent > best.usedPercent || usedPercent === best.usedPercent && accountPool && !best.accountPool || usedPercent === best.usedPercent && accountPool === best.accountPool && row.capturedAt > best.capturedAt) {
61871
+ bindingPoolByLabel.set(row.label, { poolId, usedPercent, capturedAt: row.capturedAt, accountPool });
61420
61872
  }
61421
61873
  }
61422
61874
  return snapshots.filter((row) => bindingPoolByLabel.get(row.label)?.poolId === poolIdOf(row));
@@ -61433,37 +61885,83 @@ function formatQuotaWindowLabel(windowMinutes, fallback2) {
61433
61885
  }
61434
61886
  return `${windowMinutes}m`;
61435
61887
  }
61436
- function findRecentCodexJsonl(root, lookbackDays) {
61888
+ async function findRecentCodexJsonl(root, lookbackDays) {
61437
61889
  const cutoffMs = Date.now() - lookbackDays * 86400 * 1000;
61438
61890
  const paths2 = [];
61439
- const walk = (dir) => {
61891
+ const pending = [root];
61892
+ while (pending.length > 0) {
61893
+ const dir = pending.pop();
61894
+ if (!dir)
61895
+ continue;
61440
61896
  let entries;
61441
61897
  try {
61442
- entries = readdirSync5(dir, { withFileTypes: true });
61898
+ entries = await readdir4(dir, { withFileTypes: true });
61443
61899
  } catch {
61444
- return;
61900
+ continue;
61445
61901
  }
61446
61902
  for (const entry of entries) {
61447
61903
  const full = join41(dir, entry.name);
61448
61904
  if (entry.isDirectory()) {
61449
- walk(full);
61905
+ pending.push(full);
61450
61906
  } else if (entry.isFile() && entry.name.endsWith(".jsonl")) {
61451
- const stat6 = safeStat(full);
61452
- if (!stat6 || stat6.mtimeMs < cutoffMs)
61453
- continue;
61454
- paths2.push({ path: full, mtimeMs: stat6.mtimeMs });
61907
+ try {
61908
+ const fileStat = await stat6(full);
61909
+ if (fileStat.mtimeMs < cutoffMs)
61910
+ continue;
61911
+ paths2.push({ path: full, mtimeMs: fileStat.mtimeMs });
61912
+ } catch {}
61455
61913
  }
61456
61914
  }
61457
- };
61458
- walk(root);
61459
- return paths2.sort((left, right) => right.mtimeMs - left.mtimeMs).map((entry) => entry.path);
61915
+ }
61916
+ return paths2.sort((left, right) => right.mtimeMs - left.mtimeMs).slice(0, CODEX_RECENT_CANDIDATE_LIMIT);
61917
+ }
61918
+ async function harvestRecentCodexRateLimits(candidates) {
61919
+ const observations = await readCodexCandidateBatch(candidates.slice(0, CODEX_INITIAL_FILE_LIMIT));
61920
+ if (observations.some(isCodexAccountPoolObservation))
61921
+ return observations;
61922
+ const overflow = candidates.slice(CODEX_INITIAL_FILE_LIMIT, CODEX_RECENT_CANDIDATE_LIMIT);
61923
+ for (let index2 = 0;index2 < overflow.length; index2 += CODEX_JSONL_READ_CONCURRENCY) {
61924
+ observations.push(...await readCodexCandidateBatch(overflow.slice(index2, index2 + CODEX_JSONL_READ_CONCURRENCY)));
61925
+ if (observations.some(isCodexAccountPoolObservation))
61926
+ break;
61927
+ }
61928
+ return observations;
61929
+ }
61930
+ async function readCodexCandidateBatch(candidates) {
61931
+ return (await Promise.all(candidates.map(async (candidate) => {
61932
+ try {
61933
+ return await readLatestCodexRateLimits(candidate.path);
61934
+ } catch {
61935
+ return [];
61936
+ }
61937
+ }))).flat();
61938
+ }
61939
+ function isCodexAccountPoolObservation(observation) {
61940
+ return isCodexAccountPoolId(observation.usage.limitId);
61941
+ }
61942
+ function isCodexAccountPoolId(limitId) {
61943
+ const normalized = limitId?.trim().toLowerCase();
61944
+ return !normalized || normalized === "codex";
61460
61945
  }
61461
61946
  async function readLatestCodexRateLimits(path2) {
61462
61947
  const handle = await open(path2, "r");
61463
61948
  try {
61464
- const rl = createInterface2({ input: handle.createReadStream({ encoding: "utf8" }) });
61949
+ const fileStat = await handle.stat();
61950
+ const start = Math.max(0, fileStat.size - CODEX_JSONL_TAIL_MAX_BYTES);
61951
+ const rl = createInterface2({
61952
+ input: handle.createReadStream({
61953
+ encoding: "utf8",
61954
+ start,
61955
+ autoClose: false
61956
+ })
61957
+ });
61465
61958
  const latestByPool = new Map;
61959
+ let firstLine = start > 0;
61466
61960
  for await (const line of rl) {
61961
+ if (firstLine) {
61962
+ firstLine = false;
61963
+ continue;
61964
+ }
61467
61965
  if (!line.includes('"rate_limits"'))
61468
61966
  continue;
61469
61967
  try {
@@ -61540,8 +62038,8 @@ function loadClaudeStatuslineQuotaSnapshots() {
61540
62038
  }
61541
62039
  function readClaudeStatuslineHistory(minCapturedAt) {
61542
62040
  const path2 = join41(claudeStatuslineDir(), "claude-history.jsonl");
61543
- const stat6 = safeStat(path2);
61544
- if (!stat6)
62041
+ const stat7 = safeStat(path2);
62042
+ if (!stat7)
61545
62043
  return [];
61546
62044
  let content;
61547
62045
  try {
@@ -61549,7 +62047,7 @@ function readClaudeStatuslineHistory(minCapturedAt) {
61549
62047
  } catch {
61550
62048
  return [];
61551
62049
  }
61552
- if (stat6.size > CLAUDE_STATUSLINE_HISTORY_MAX_BYTES) {
62050
+ if (stat7.size > CLAUDE_STATUSLINE_HISTORY_MAX_BYTES) {
61553
62051
  content = content.slice(-CLAUDE_STATUSLINE_HISTORY_MAX_BYTES);
61554
62052
  const firstNewline = content.indexOf(`
61555
62053
  `);
@@ -62128,11 +62626,11 @@ async function loadGrokGauge() {
62128
62626
  }
62129
62627
  async function loadGrokBillingQuotaSnapshots() {
62130
62628
  const path2 = join41(homeDir(), ".grok", "logs", "unified.jsonl");
62131
- const stat6 = safeStat(path2);
62132
- if (!stat6 || stat6.size <= 0)
62629
+ const stat7 = safeStat(path2);
62630
+ if (!stat7 || stat7.size <= 0)
62133
62631
  return [];
62134
- const length = Math.min(stat6.size, GROK_BILLING_LOG_MAX_BYTES);
62135
- const start = Math.max(0, stat6.size - length);
62632
+ const length = Math.min(stat7.size, GROK_BILLING_LOG_MAX_BYTES);
62633
+ const start = Math.max(0, stat7.size - length);
62136
62634
  let content = "";
62137
62635
  let handle;
62138
62636
  try {
@@ -62659,11 +63157,13 @@ function persistQuotaSnapshots(snapshots) {
62659
63157
  return;
62660
63158
  statement.run(id, snapshot.source ?? "provider_reported", snapshot.provider ?? null, snapshot.harness ?? null, snapshot.transport ?? null, snapshot.planType ?? null, snapshot.label, snapshot.windowKind ?? null, finiteNumber(snapshot.usedPercent) ?? null, finiteNumber(snapshot.percentRemaining) ?? null, finiteNumber(snapshot.used) ?? null, finiteNumber(snapshot.limitValue) ?? null, finiteNumber(snapshot.resetAt) ?? null, finiteNumber(snapshot.windowMs) ?? null, snapshot.capturedAt, JSON.stringify(metadata ?? {}), createdAt);
62661
63159
  };
62662
- for (const snapshot of snapshots) {
62663
- writeSnapshot(quotaSnapshotId(snapshot), snapshot, snapshot.metadata);
62664
- writeSnapshot(quotaHistorySnapshotId(snapshot), snapshot, quotaHistoryMetadata(snapshot));
62665
- }
62666
- pruneHistory.run(createdAt - QUOTA_HISTORY_LOOKBACK_MS - QUOTA_HISTORY_BUCKET_MS2);
63160
+ writer.transaction(() => {
63161
+ for (const snapshot of snapshots) {
63162
+ writeSnapshot(quotaSnapshotId(snapshot), snapshot, snapshot.metadata);
63163
+ writeSnapshot(quotaHistorySnapshotId(snapshot), snapshot, quotaHistoryMetadata(snapshot));
63164
+ }
63165
+ pruneHistory.run(createdAt - QUOTA_HISTORY_LOOKBACK_MS - QUOTA_HISTORY_BUCKET_MS2);
63166
+ })();
62667
63167
  } catch {}
62668
63168
  }
62669
63169
  function quotaSnapshotMayReplace(existing, incoming) {
@@ -65834,8 +66334,8 @@ async function handleRPCInner(bridge, req, rpcContext = {}) {
65834
66334
  }
65835
66335
  const root = resolveWorkspaceRoot(configuredRoot);
65836
66336
  const projectPath = resolveWorkspacePath(root, p.path);
65837
- const stat6 = statSync13(projectPath);
65838
- if (!stat6.isDirectory()) {
66337
+ const stat7 = statSync13(projectPath);
66338
+ if (!stat7.isDirectory()) {
65839
66339
  return { id: req.id, error: { code: -32000, message: "Workspace target is not a directory" } };
65840
66340
  }
65841
66341
  const adapterType = p.adapter ?? "claude-code";
@@ -66305,8 +66805,8 @@ function listDirectories(dirPath) {
66305
66805
  continue;
66306
66806
  const fullPath = join46(dirPath, name2);
66307
66807
  try {
66308
- const stat6 = statSync13(fullPath);
66309
- if (!stat6.isDirectory())
66808
+ const stat7 = statSync13(fullPath);
66809
+ if (!stat7.isDirectory())
66310
66810
  continue;
66311
66811
  const children = new Set(readdirSync6(fullPath));
66312
66812
  const markers = [];
@@ -80941,8 +81441,8 @@ function listDirectories2(dirPath) {
80941
81441
  continue;
80942
81442
  const fullPath = join47(dirPath, name2);
80943
81443
  try {
80944
- const stat6 = statSync14(fullPath);
80945
- if (!stat6.isDirectory())
81444
+ const stat7 = statSync14(fullPath);
81445
+ if (!stat7.isDirectory())
80946
81446
  continue;
80947
81447
  const children = new Set(readdirSync7(fullPath));
80948
81448
  const markers = [];
@@ -81619,8 +82119,8 @@ var workspaceRouter = t.router({
81619
82119
  }
81620
82120
  const root = resolveWorkspaceRoot2(configuredRoot);
81621
82121
  const projectPath = resolveWorkspacePath2(root, input.path);
81622
- const stat6 = statSync14(projectPath);
81623
- if (!stat6.isDirectory()) {
82122
+ const stat7 = statSync14(projectPath);
82123
+ if (!stat7.isDirectory()) {
81624
82124
  throw new TRPCError({
81625
82125
  code: "BAD_REQUEST",
81626
82126
  message: "Workspace target is not a directory"