@openscout/scout 0.2.95 → 0.2.97

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 (363) 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-y-5DLleY.js} +1 -1
  5. package/dist/client/assets/{AddProjectForm-CcD6qvV8.js → AddProjectForm-r_1tVuWk.js} +1 -1
  6. package/dist/client/assets/{AgentAvatar-CYhf6twS.js → AgentAvatar-B7c0egdP.js} +1 -1
  7. package/dist/client/assets/{AgentConfigurationScreen-BTI24HQX.js → AgentConfigurationScreen-BD7Unt2P.js} +1 -1
  8. package/dist/client/assets/{AgentDefinitionsWorkspace-srmN6-vj.js → AgentDefinitionsWorkspace-BbcZc9Xk.js} +1 -1
  9. package/dist/client/assets/{AgentDetailCard-UqPNpcvB.js → AgentDetailCard-B_KLcgsP.js} +1 -1
  10. package/dist/client/assets/{AgentFloorView-XXNgI5Cj.js → AgentFloorView-DMFiHs21.js} +1 -1
  11. package/dist/client/assets/{AgentInfoScreen-CimdOnZ9.js → AgentInfoScreen-DHGLRddI.js} +1 -1
  12. package/dist/client/assets/{AgentLaneCard-Z-aOBR3W.js → AgentLaneCard-ajZvcfdW.js} +1 -1
  13. package/dist/client/assets/{AgentLaneChrome-CyhA1reW.js → AgentLaneChrome-CTp39syR.js} +1 -1
  14. package/dist/client/assets/{AgentLaneDetailSheet-BNzjMjIH.js → AgentLaneDetailSheet-DRc-TpMB.js} +1 -1
  15. package/dist/client/assets/{AgentLaneSummaryResize-Box8-_rS.js → AgentLaneSummaryResize-VMNDo7kD.js} +1 -1
  16. package/dist/client/assets/AgentLanesEmbedScreen-C5k_dDS8.js +1 -0
  17. package/dist/client/assets/AgentLanesPreflight-CFadSaia.js +1 -0
  18. package/dist/client/assets/AgentLanesView-u5vpLwQf.js +2 -0
  19. package/dist/client/assets/{AgentLiveActions-BwuzOE8h.js → AgentLiveActions-CsQA3pu_.js} +1 -1
  20. package/dist/client/assets/AgentMasterScreen-C5WlWNmk.js +1 -0
  21. package/dist/client/assets/{AgentSessions-CsZwoukw.js → AgentSessions-BePq5Lgc.js} +1 -1
  22. package/dist/client/assets/{AgentsConsole-KCao4XmX.js → AgentsConsole-BuiZ_bDo.js} +1 -1
  23. package/dist/client/assets/{AgentsScreen-CtPAmwRX.js → AgentsScreen-CRi-hG2k.js} +1 -1
  24. package/dist/client/assets/AgentsSubnav-DUsya4WK.js +1 -0
  25. package/dist/client/assets/{AstronautSuit-Ckx7lu7G.js → AstronautSuit-Cjjcv6yQ.js} +1 -1
  26. package/dist/client/assets/{AtopView-DYlpgEHf.js → AtopView-PxWQd-sX.js} +1 -1
  27. package/dist/client/assets/{BackToPicker-4JaeRvDm.js → BackToPicker-Cto0Ioz9.js} +1 -1
  28. package/dist/client/assets/{BriefingDetailScreen-D6-xqrpo.js → BriefingDetailScreen-C29smC5d.js} +1 -1
  29. package/dist/client/assets/{BriefingsScreen-DKxSDEmk.js → BriefingsScreen-DNyFBrPn.js} +1 -1
  30. package/dist/client/assets/{BrokerMetadataPanel-BbREmsbK.js → BrokerMetadataPanel-DbaCQlhw.js} +1 -1
  31. package/dist/client/assets/{BrokerScreen-fbPIouMw.js → BrokerScreen-CS0s4Gm4.js} +1 -1
  32. package/dist/client/assets/{CastPicker-BcA2vDDV.js → CastPicker-CTBHjjGw.js} +1 -1
  33. package/dist/client/assets/ChatCollapsedStrip-D4rc7wBQ.js +1 -0
  34. package/dist/client/assets/{CodeDiffPane-Cn8Y9hAt.js → CodeDiffPane-QvxCUzTi.js} +1 -1
  35. package/dist/client/assets/{CodeProjectPicker-nPFktrco.js → CodeProjectPicker-DplkpM7f.js} +1 -1
  36. package/dist/client/assets/{CodeScreen-BlAxtxE5.js → CodeScreen-CrR2JaVj.js} +1 -1
  37. package/dist/client/assets/{ConversationComposer-2HjbGPL9.js → ConversationComposer-H8_hsYSc.js} +1 -1
  38. package/dist/client/assets/{ConversationFeedRows-C6wUqJrx.js → ConversationFeedRows-hlEFlURs.js} +1 -1
  39. package/dist/client/assets/{ConversationHeader-C8vfXaTF.js → ConversationHeader-B0ZBhE_E.js} +1 -1
  40. package/dist/client/assets/{ConversationPanels-CNCIbpqU.js → ConversationPanels-fMo6Uy1v.js} +2 -2
  41. package/dist/client/assets/ConversationScreen-CXAHQwQ3.js +2 -0
  42. package/dist/client/assets/{ConversationStatus-DZuyKsWN.js → ConversationStatus-DI5GCiyW.js} +1 -1
  43. package/dist/client/assets/{CrewAvatar-CTIuxp4G.js → CrewAvatar-CXJHLNVM.js} +1 -1
  44. package/dist/client/assets/CrewWorkspaces-Bz2Dcnt4.js +1 -0
  45. package/dist/client/assets/CrewWorkspaces-Diq11KDq.css +1 -0
  46. package/dist/client/assets/{DataTable-6IDhanr5.js → DataTable-DXIlOlVu.js} +1 -1
  47. package/dist/client/assets/{DispatchAftermath-DC1u9itO.js → DispatchAftermath-CrELgl2e.js} +1 -1
  48. package/dist/client/assets/{DocumentFocusViewer-DZVhS7as.js → DocumentFocusViewer-DFFE85Tq.js} +1 -1
  49. package/dist/client/assets/{EmbeddableSurfacesLab-BKUFJMCV.js → EmbeddableSurfacesLab-DgpewB3y.js} +1 -1
  50. package/dist/client/assets/{EmptyState-CeBl0iGd.js → EmptyState-D9X16fKq.js} +1 -1
  51. package/dist/client/assets/{FileViewerPane-DQlpNt2S.js → FileViewerPane-CY0RN78e.js} +1 -1
  52. package/dist/client/assets/FlightObserveScreen-qyzHzxLa.js +1 -0
  53. package/dist/client/assets/{FollowScreen-BXHOp3gb.js → FollowScreen-wZ-z67mX.js} +1 -1
  54. package/dist/client/assets/{HarnessMark-D5CA5uSp.js → HarnessMark-DAaWPiT_.js} +1 -1
  55. package/dist/client/assets/{HarnessesScreen-DhFXq1qz.js → HarnessesScreen-DbKkQM4o.js} +1 -1
  56. package/dist/client/assets/{HerdrSession-BRhs5LIR.js → HerdrSession-CYKRfBad.js} +1 -1
  57. package/dist/client/assets/{HomeHero-DMABJuze.js → HomeHero-DYyd3cpz.js} +1 -1
  58. package/dist/client/assets/{HostAdvisorView-RAociATV.js → HostAdvisorView-NtM0bsg8.js} +1 -1
  59. package/dist/client/assets/{KnowledgeSearchInspector-CZPyVNSw.js → KnowledgeSearchInspector-CU6BCFcS.js} +1 -1
  60. package/dist/client/assets/{KnowledgeSearchScreen-mGTKIg00.js → KnowledgeSearchScreen-DvbRRPQB.js} +1 -1
  61. package/dist/client/assets/{LaneToolHoverCard-D_DMlBeT.js → LaneToolHoverCard-Bo2Zl-1a.js} +1 -1
  62. package/dist/client/assets/{LaneTraceDetailSheet-BEHg3LmH.js → LaneTraceDetailSheet-C3C8UjXv.js} +1 -1
  63. package/dist/client/assets/{LaneTraceEventFocus-DVimcizS.js → LaneTraceEventFocus-Cek_64zR.js} +1 -1
  64. package/dist/client/assets/{MeshCanvas-BOuZx4AM.js → MeshCanvas-TvsID4fe.js} +1 -1
  65. package/dist/client/assets/{MeshCanvasMinimap-wL-1N94e.js → MeshCanvasMinimap-CxqeVVco.js} +1 -1
  66. package/dist/client/assets/{MeshScreen-DMY9Bmh5.js → MeshScreen-BJ-j9YXv.js} +1 -1
  67. package/dist/client/assets/{MeshTopologyView-DiDcX5f4.js → MeshTopologyView-BjprutE8.js} +2 -2
  68. package/dist/client/assets/MessagesScreen-CyNIZ3-X.js +1 -0
  69. package/dist/client/assets/{MissionContextRail-DrNKXG5u.js → MissionContextRail-Be0uXljQ.js} +1 -1
  70. package/dist/client/assets/{MissionControlView-ByBlHVN8.js → MissionControlView-Bj7cAbZd.js} +1 -1
  71. package/dist/client/assets/{MissionFocusOverlay-D1i6R6Zt.js → MissionFocusOverlay-DvTw6ts5.js} +1 -1
  72. package/dist/client/assets/{MissionLeftAgentRow-DN9NcCML.js → MissionLeftAgentRow-B0QG7Gys.js} +1 -1
  73. package/dist/client/assets/{MissionLogPane-DSeIv3Xo.js → MissionLogPane-EsM_S3ro.js} +1 -1
  74. package/dist/client/assets/{NewAgentModal-V7yK6J6j.js → NewAgentModal-Cqiq1CE1.js} +1 -1
  75. package/dist/client/assets/NewChatComposer-C_1op4dH.js +19 -0
  76. package/dist/client/assets/{NewChatOrigin-DdpzE4kz.js → NewChatOrigin-D7hwp6dm.js} +1 -1
  77. package/dist/client/assets/{ObserveEmbedScreen-l_Q3ts2q.js → ObserveEmbedScreen-CGHI_hb5.js} +1 -1
  78. package/dist/client/assets/{ObserveTextFlow-BSEtYTxU.js → ObserveTextFlow-BcrGQet8.js} +2 -2
  79. package/dist/client/assets/{ObservedTopologyPanel-CdGUXxGR.js → ObservedTopologyPanel-BhVsvwkh.js} +1 -1
  80. package/dist/client/assets/{OpenScoutAppShell-DN8dOSK4.js → OpenScoutAppShell-BtfvMkAp.js} +25 -25
  81. package/dist/client/assets/{OpsAgentsView-ntGr4pz4.js → OpsAgentsView-DBYtmLnh.js} +1 -1
  82. package/dist/client/assets/OpsScreen-CuYVgkC_.js +1 -0
  83. package/dist/client/assets/OpsSubnav-BEU4kKXm.js +1 -0
  84. package/dist/client/assets/ProjectAgentProfile-BhXAZEkW.js +1 -0
  85. package/dist/client/assets/{ProjectAgentProfileBar-BQET-qrY.js → ProjectAgentProfileBar-uJw9Wdfk.js} +1 -1
  86. package/dist/client/assets/{ProjectAgentProfileHero-Ck8mThtx.js → ProjectAgentProfileHero-CIMS4Dy_.js} +1 -1
  87. package/dist/client/assets/ProjectsInbox-JgU0lrY8.js +2 -0
  88. package/dist/client/assets/ProjectsRail-p99BRBOa.js +1 -0
  89. package/dist/client/assets/ProjectsScreen-BB45DU53.js +1 -0
  90. package/dist/client/assets/ProjectsThreadAside-BHDTJWOz.js +1 -0
  91. package/dist/client/assets/{Provider-B2xuo3rf.js → Provider-Bu-C8Hxc.js} +1 -1
  92. package/dist/client/assets/{RailRow-B-GycCBx.js → RailRow-ClMmtaIE.js} +1 -1
  93. package/dist/client/assets/{RawSessionsTable-AQThi6sm.js → RawSessionsTable-BtKdQPiv.js} +1 -1
  94. package/dist/client/assets/RealtimeVoiceScreen-KPHJgO1l.js +1 -0
  95. package/dist/client/assets/{RepoDiffEmbedScreen-DXWoRF_c.js → RepoDiffEmbedScreen-CjZ5ew3y.js} +1 -1
  96. package/dist/client/assets/{RepoDiffPageScreen-D_274ExO.js → RepoDiffPageScreen-CdTFfmbk.js} +1 -1
  97. package/dist/client/assets/{RepoDiffViewer-DbedmHDX.js → RepoDiffViewer-BFperHQg.js} +1 -1
  98. package/dist/client/assets/{RepoDiffViewerLazy-C0--fPtk.js → RepoDiffViewerLazy-BkBmbi1Z.js} +2 -2
  99. package/dist/client/assets/{ReposScreen-D39_YG4H.js → ReposScreen-C8dT4bK0.js} +1 -1
  100. package/dist/client/assets/ScoutDeckSurface-BcJsm2Kq.js +1 -0
  101. package/dist/client/assets/{ScoutSurface-UsRy0t-I.js → ScoutSurface-DmzEtrx8.js} +1 -1
  102. package/dist/client/assets/{ScoutbotFxLab-Fmdfboxs.js → ScoutbotFxLab-DU15Plja.js} +1 -1
  103. package/dist/client/assets/{SecondaryNav-o2RL9H8H.js → SecondaryNav-BrXMtvKE.js} +1 -1
  104. package/dist/client/assets/SessionEmbedScreen-Bt4flmAx.js +1 -0
  105. package/dist/client/assets/{SessionObserve-Dsd0j05N.js → SessionObserve-BCehTlO8.js} +1 -1
  106. package/dist/client/assets/{SessionObserveEvidence-DopQYDkD.js → SessionObserveEvidence-Bb6U-dem.js} +1 -1
  107. package/dist/client/assets/SessionRefScreen-C8BiRVPx.js +1 -0
  108. package/dist/client/assets/SessionsScreen-BNvjUflN.js +1 -0
  109. package/dist/client/assets/{SettingsDrawer-_AwuopMS.js → SettingsDrawer-BieUmb8g.js} +1 -1
  110. package/dist/client/assets/{SettingsScreen-Cw4DDfJP.js → SettingsScreen-3JvX1WFL.js} +1 -1
  111. package/dist/client/assets/{ShikiPane-BfHc_3pM.js → ShikiPane-DPWsVNtn.js} +1 -1
  112. package/dist/client/assets/{SlidePanel-C-q7XwTa.js → SlidePanel-BMRIR6bH.js} +1 -1
  113. package/dist/client/assets/{SpriteAvatar-Bs68ZENy.js → SpriteAvatar-56DTXxSV.js} +1 -1
  114. package/dist/client/assets/{StatusPill-ZZQwxB1a.js → StatusPill-BcuYUgsD.js} +1 -1
  115. package/dist/client/assets/{TailView-Q4FVMsUH.js → TailView-BDy8c2VB.js} +1 -1
  116. package/dist/client/assets/{Terminal-D7zqHwHV.js → Terminal-BlUQY9_Z.js} +1 -1
  117. package/dist/client/assets/{TerminalEmbedScreen-CXIJ7qv6.js → TerminalEmbedScreen-DTjxktyr.js} +1 -1
  118. package/dist/client/assets/{TerminalHeaderMount-BnBLOPbb.js → TerminalHeaderMount-Cy-uxkey.js} +1 -1
  119. package/dist/client/assets/{TextDocumentSurface-CKQP-cBT.js → TextDocumentSurface-BeSwe3Yl.js} +1 -1
  120. package/dist/client/assets/{TmuxPeek-V9dGESfO.js → TmuxPeek-B4no_aGI.js} +1 -1
  121. package/dist/client/assets/{VoicePermissionsPanel-k7sbLXx2.js → VoicePermissionsPanel-Bd16scwz.js} +1 -1
  122. package/dist/client/assets/{WorkDetailScreen-60p9litn.js → WorkDetailScreen-DIFQufak.js} +1 -1
  123. package/dist/client/assets/{WorkFilesViewer-BjJS7GyM.js → WorkFilesViewer-CT5XEFGf.js} +1 -1
  124. package/dist/client/assets/{activity-Bj3Hnbj3.js → activity-CqZafWfx.js} +1 -1
  125. package/dist/client/assets/{addon-fit-BL-NTWRU.js → addon-fit-CM6F_JRD.js} +1 -1
  126. package/dist/client/assets/{addon-webgl-CIMgmNjg.js → addon-webgl-DRTiePFC.js} +1 -1
  127. package/dist/client/assets/{agent-autocomplete-DXlvdc4b.js → agent-autocomplete-DXUBnlkN.js} +1 -1
  128. package/dist/client/assets/{agent-essentials-BOMHR0_U.js → agent-essentials-vytdybaX.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-DAZL92oe.js +1 -0
  133. package/dist/client/assets/{agent-specialization-BIPIBW8u.js → agent-specialization-BtxLN4UR.js} +1 -1
  134. package/dist/client/assets/agents-project-DgbqDc65.css +1 -0
  135. package/dist/client/assets/{arc.es-IR5r6sj_.js → arc.es-Bh84oHJ7.js} +1 -1
  136. package/dist/client/assets/{arrow-down-BydciYFZ.js → arrow-down-DvTsLokL.js} +1 -1
  137. package/dist/client/assets/{arrow-left-CghA0kTw.js → arrow-left-DHfdXJVZ.js} +1 -1
  138. package/dist/client/assets/{arrow-right-iJFv3jNh.js → arrow-right-BBsrogWf.js} +1 -1
  139. package/dist/client/assets/{arrow-up-right-CCfZXPqD.js → arrow-up-right-CY0Vw_67.js} +1 -1
  140. package/dist/client/assets/{bot-B5sub1-i.js → bot-DzkOUFBb.js} +1 -1
  141. package/dist/client/assets/{check-C18YQC90.js → check-DbIkldnK.js} +1 -1
  142. package/dist/client/assets/{chevron-down-Mp9mu_yd.js → chevron-down-C475vltS.js} +1 -1
  143. package/dist/client/assets/{chevron-right-CzH-TaSF.js → chevron-right-CnZRSd-V.js} +1 -1
  144. package/dist/client/assets/{chunk-HRAB3GC3-swV8PA2k.js → chunk-HRAB3GC3-DLNT8aOo.js} +1 -1
  145. package/dist/client/assets/{chunk-JTPDIGGW-BKXqcLKw.js → chunk-JTPDIGGW-Ci5j4vzV.js} +3 -3
  146. package/dist/client/assets/{chunk-T65CQEWV-vYbNJ8E6.js → chunk-T65CQEWV-BtNvicWs.js} +1 -1
  147. package/dist/client/assets/{chunk-YOZR3KYS-U65yUmqt.js → chunk-YOZR3KYS-DN5EJulq.js} +1 -1
  148. package/dist/client/assets/{clock-B4PTFi5m.js → clock-DVvENUU5.js} +1 -1
  149. package/dist/client/assets/{code-xml-Jtxsp5d1.js → code-xml-CvKBY3KA.js} +1 -1
  150. package/dist/client/assets/{compass-0_54-vz3.js → compass-BcRI_YXo.js} +1 -1
  151. package/dist/client/assets/content--T3p6akp.js +1 -0
  152. package/dist/client/assets/content-4nFMLuzF.js +1 -0
  153. package/dist/client/assets/content-BJ4nHvcu.js +1 -0
  154. package/dist/client/assets/{content-DMbawvqU.js → content-BNyAjpUl.js} +1 -1
  155. package/dist/client/assets/content-BmGp9wNl.js +1 -0
  156. package/dist/client/assets/content-CBWhwaRo.js +1 -0
  157. package/dist/client/assets/content-CQlykFbe.js +1 -0
  158. package/dist/client/assets/content-CevL0DgF.js +1 -0
  159. package/dist/client/assets/content-Ch8pf2bj.js +1 -0
  160. package/dist/client/assets/content-Cpvdcm_l.js +1 -0
  161. package/dist/client/assets/content-DfS3vgAu.js +1 -0
  162. package/dist/client/assets/content-DpQdNePJ.js +1 -0
  163. package/dist/client/assets/content-Dqpibejl.js +1 -0
  164. package/dist/client/assets/content-TV0nd6-r.js +1 -0
  165. package/dist/client/assets/{content-CHghn-rT.js → content-odbb5H4U.js} +1 -1
  166. package/dist/client/assets/content-uXHLPHe0.js +1 -0
  167. package/dist/client/assets/{conversation-icons-BV10B2Me.js → conversation-icons-CBMKBGHd.js} +1 -1
  168. package/dist/client/assets/{conversation-model-CwF6Y9gx.js → conversation-model-QsJVfSeG.js} +1 -1
  169. package/dist/client/assets/conversation-motion-features-BFLHX2eg.js +1 -0
  170. package/dist/client/assets/{copy-Dtpx4FOE.js → copy-Cj-owMb-.js} +1 -1
  171. package/dist/client/assets/{cpu-BjVis9mc.js → cpu-DuD3RFX5.js} +1 -1
  172. package/dist/client/assets/{createLucideIcon-DXpqZP7I.js → createLucideIcon-DthwWQIg.js} +1 -1
  173. package/dist/client/assets/{ctx-panel-D_HJ3nhb.css → ctx-panel-F05jXK4Q.css} +1 -1
  174. package/dist/client/assets/discover-B3uQlh5L.js +2 -0
  175. package/dist/client/assets/embed-entry-DkRcHKTh.js +2 -0
  176. package/dist/client/assets/{external-link-Ckiyzjwo.js → external-link-C_nxk0MJ.js} +1 -1
  177. package/dist/client/assets/{eye-CpfyvdLq.js → eye-FnaaPfja.js} +1 -1
  178. package/dist/client/assets/{file-code-corner-7mo7EviR.js → file-code-corner-DDPq4Cur.js} +1 -1
  179. package/dist/client/assets/{file-text-KijGBnME.js → file-text--hfhwZH1.js} +1 -1
  180. package/dist/client/assets/{gauge-y-Xg8Mrv.js → gauge-BVEknshP.js} +1 -1
  181. package/dist/client/assets/{gestures-Bq9XnSqY.js → gestures-3gw5VgUS.js} +1 -1
  182. package/dist/client/assets/{git-branch-BQ_x8KZL.js → git-branch-DJyvr0k-.js} +1 -1
  183. package/dist/client/assets/{home-moving-signal-DtRpiNa0.js → home-moving-signal-BPqBoNSm.js} +1 -1
  184. package/dist/client/assets/{home-now-card-DFb4GOgM.js → home-now-card-UspVW2-2.js} +1 -1
  185. package/dist/client/assets/{home-now-card-nano-D--m9jpq.js → home-now-card-nano-G8kMB32m.js} +1 -1
  186. package/dist/client/assets/{hooks-9d1SoaQA.js → hooks-BMsQzo9j.js} +1 -1
  187. package/dist/client/assets/{index-CZ-05hKz.js → index-BI9AljSD.js} +5 -5
  188. package/dist/client/assets/index-C-v0Z6ZS.js +1 -0
  189. package/dist/client/assets/index-D9DzUORB.js +1 -0
  190. package/dist/client/assets/index-DfsTyYDx.js +1 -0
  191. package/dist/client/assets/{inspector-panel-C-EhEDYy.js → inspector-panel-CFSArQ8Y.js} +1 -1
  192. package/dist/client/assets/{keyboard-nav-DFhAJkW3.js → keyboard-nav-e6yGeorb.js} +1 -1
  193. package/dist/client/assets/{lane-roster-store-gUBsydNf.js → lane-roster-store-Q7pcblY5.js} +1 -1
  194. package/dist/client/assets/{layers-CGou-LwV.js → layers-Dz2dKOnU.js} +1 -1
  195. package/dist/client/assets/{layout-grid-BrZt31QH.js → layout-grid-Bvs5fdB4.js} +1 -1
  196. package/dist/client/assets/{left-CwHZCGO3.js → left-B4Ak-Ibt.js} +1 -1
  197. package/dist/client/assets/{left-DA0amyfu.js → left-BMb493FZ.js} +1 -1
  198. package/dist/client/assets/{left-CwLs0okF.js → left-BjFLvVOC.js} +1 -1
  199. package/dist/client/assets/{left-B_o51JV6.js → left-CsXQ8Q3G.js} +1 -1
  200. package/dist/client/assets/left-FNH7faCI.js +1 -0
  201. package/dist/client/assets/left-POkqE8gI.js +2 -0
  202. package/dist/client/assets/left-UulOTcWh.js +1 -0
  203. package/dist/client/assets/{left-advisor-DU3s01gk.js → left-advisor-CJkQS2d6.js} +1 -1
  204. package/dist/client/assets/left-agents-CFMxyEjT.js +1 -0
  205. package/dist/client/assets/{left-default-uvuvDmt0.js → left-default-rnX5HANc.js} +1 -1
  206. package/dist/client/assets/{left-lanes-DnNLgec8.js → left-lanes-BpLXT_qH.js} +1 -1
  207. package/dist/client/assets/{left-mission-DN3-NLPC.js → left-mission-B0bhseWw.js} +1 -1
  208. package/dist/client/assets/library-D1iXfda2.js +1 -0
  209. package/dist/client/assets/{loader-circle-BiohlpM3.js → loader-circle-B2W9DPG5.js} +1 -1
  210. package/dist/client/assets/{local-agents-wUIaBcEr.js → local-agents-DKr-gIDC.js} +1 -1
  211. package/dist/client/assets/{mentions-CcPFMbmZ.js → mentions-DuLQnEcn.js} +1 -1
  212. package/dist/client/assets/{mesh-buckets-ByyFXdKT.js → mesh-buckets-6y3ZIibI.js} +1 -1
  213. package/dist/client/assets/{mesh-ops-CvGyjK84.js → mesh-ops-CRR-KnCG.js} +1 -1
  214. package/dist/client/assets/{mesh-roster-n2nDpEmA.js → mesh-roster-Bc7T4b7z.js} +1 -1
  215. package/dist/client/assets/{mesh-view-store-BpxGm71b.js → mesh-view-store-CiET-yN8.js} +1 -1
  216. package/dist/client/assets/{message-circle-B2ddzBrX.js → message-circle-B2DoYKDO.js} +1 -1
  217. package/dist/client/assets/{message-markup-RkfmDfME.js → message-markup-Cc_O-WdA.js} +1 -1
  218. package/dist/client/assets/{message-square-D9YYWE0x.js → message-square-O-Hu9Mk2.js} +1 -1
  219. package/dist/client/assets/{message-visibility-DwxgcgYK.js → message-visibility-CGOmSSKs.js} +1 -1
  220. package/dist/client/assets/{mission-control-store-Bf4b54MV.js → mission-control-store-DDAgWKUl.js} +1 -1
  221. package/dist/client/assets/{observe-CJRIvOCn.js → observe-Da2mRAsc.js} +1 -1
  222. package/dist/client/assets/{page-status-BptpTdQ-.js → page-status-Crtgjbq3.js} +1 -1
  223. package/dist/client/assets/{paperclip-B1UNGl5d.js → paperclip-BudMKSyr.js} +1 -1
  224. package/dist/client/assets/{persistent-state-YI-WHSCF.js → persistent-state-xJz-qAFc.js} +1 -1
  225. package/dist/client/assets/{plus-CuU_X0-8.js → plus-BJ1If8vj.js} +1 -1
  226. package/dist/client/assets/{profile-rY8jO38P.js → profile-B3qDSbrH.js} +1 -1
  227. package/dist/client/assets/projects-inbox-CLek3QaG.js +1 -0
  228. package/dist/client/assets/projects-inbox-DRBl2N85.css +1 -0
  229. package/dist/client/assets/{proxy-DnLpZIi9.js → proxy-1BABCaDb.js} +1 -1
  230. package/dist/client/assets/{radio-Dm1ItnA4.js → radio-B5OpHrrK.js} +1 -1
  231. package/dist/client/assets/{refresh-cw-BRn9Oxxl.js → refresh-cw-DmNAhaH0.js} +1 -1
  232. package/dist/client/assets/resolve-panes-DXw-cHaj.js +1 -0
  233. package/dist/client/assets/resolve-sidebar-context-CDdbRDEa.js +1 -0
  234. package/dist/client/assets/{right-BJltPRnd.js → right-BgJ4mQLf.js} +1 -1
  235. package/dist/client/assets/{right-DtsRNX5b.js → right-Bk6h7o-Z.js} +1 -1
  236. package/dist/client/assets/{right-C1yumXNx.js → right-BrICCmEt.js} +1 -1
  237. package/dist/client/assets/{right-BbyYdzHn.js → right-C1QIbqFZ.js} +1 -1
  238. package/dist/client/assets/{right-Shpw_xDy.js → right-CfliKiHY.js} +1 -1
  239. package/dist/client/assets/{right-D3aTKf1F.js → right-CtOLXB9s.js} +1 -1
  240. package/dist/client/assets/{right-CJnB_Bg7.js → right-D8id_DWQ.js} +1 -1
  241. package/dist/client/assets/{right-CPP7GyOm.js → right-DJ34yMAi.js} +1 -1
  242. package/dist/client/assets/{right-DI1B79nR.js → right-DiFmtw6d.js} +1 -1
  243. package/dist/client/assets/{right-Beh3nCUB.js → right-Lx79pxpG.js} +1 -1
  244. package/dist/client/assets/{rocket-DOwXHKWA.js → rocket-D3-TUJ2m.js} +1 -1
  245. package/dist/client/assets/router-DTtux5sP.js +1 -0
  246. package/dist/client/assets/{scope-views-A4_vP97W.js → scope-views-CPM0sBw_.js} +1 -1
  247. package/dist/client/assets/{scout-voice-BhPzrc6P.js → scout-voice-BZKsdquE.js} +1 -1
  248. package/dist/client/assets/{scoutbot-markdown-jh7tzFB1.js → scoutbot-markdown-CQ7Y1McC.js} +1 -1
  249. package/dist/client/assets/{scroll-text-DO0GQzvN.js → scroll-text-kPhYbh-M.js} +1 -1
  250. package/dist/client/assets/{search-D1tJSAWe.js → search-DmFM_9jm.js} +1 -1
  251. package/dist/client/assets/{secondaryNavConfig-B9IF8wXl.js → secondaryNavConfig-C9bQ9_IA.js} +1 -1
  252. package/dist/client/assets/{selection-bridge-i2S9zpf8.js → selection-bridge-Dy2mtMyi.js} +1 -1
  253. package/dist/client/assets/{send-horizontal-CgLppsIC.js → send-horizontal-qyjNgEaV.js} +1 -1
  254. package/dist/client/assets/{server-Dymv5Emh.js → server-nWqndnxu.js} +1 -1
  255. package/dist/client/assets/{session-catalog-DNaOEzoQ.js → session-catalog-BkmktBHI.js} +1 -1
  256. package/dist/client/assets/session-ref-lookup-state-SATH_jAP.js +1 -0
  257. package/dist/client/assets/{session-table-PTQVoTyc.js → session-table-DKSF0mrS.js} +1 -1
  258. package/dist/client/assets/{settings-2fC_G9nX.js → settings-C6h9y5XX.js} +1 -1
  259. package/dist/client/assets/{sliders-horizontal-BPSMHhbm.js → sliders-horizontal-BhHKxsCO.js} +1 -1
  260. package/dist/client/assets/{sparkles-Dy8p5xN8.js → sparkles-Cf8gin88.js} +1 -1
  261. package/dist/client/assets/{sse-CiOSzE5n.js → sse-DDHEHUgz.js} +1 -1
  262. package/dist/client/assets/{tail-events-BMQmSx1n.js → tail-events-BdUrO0kb.js} +1 -1
  263. package/dist/client/assets/{terminal-yN9xN-h9.js → terminal-C3YRPfyz.js} +1 -1
  264. package/dist/client/assets/{terminal-relay-9lhzEp2V.js → terminal-relay-BFhdIstF.js} +1 -1
  265. package/dist/client/assets/{terminal-takeover-DANQfTcy.js → terminal-takeover-B6H4llRR.js} +1 -1
  266. package/dist/client/assets/{text-rLpBg4_z.css → text-BYAFNLNq.css} +1 -1
  267. package/dist/client/assets/{text-CnZ0e1-V.js → text-Faa3ZStB.js} +1 -1
  268. package/dist/client/assets/{use-conversation-list-D9BNLfnW.js → use-conversation-list-DO5J8T1H.js} +1 -1
  269. package/dist/client/assets/use-fleet-active-asks-BtgNnRgK.js +1 -0
  270. package/dist/client/assets/{use-mesh-ops-items-BIvIHlqe.js → use-mesh-ops-items-N1HHhChY.js} +1 -1
  271. package/dist/client/assets/{use-reduced-motion-CKkhq9c5.js → use-reduced-motion-8WuxLa5l.js} +1 -1
  272. package/dist/client/assets/{use-scout-dev-flags-B2KCzPxn.js → use-scout-dev-flags-B31qTy6m.js} +1 -1
  273. package/dist/client/assets/{useAgentHoverCard-CHBsxcbp.js → useAgentHoverCard-Bkv-Uz_V.js} +1 -1
  274. package/dist/client/assets/useContentSecondaryNav-Bpkc8ayb.js +1 -0
  275. package/dist/client/assets/{usePierreRuntime-DUuXH5yp.js → usePierreRuntime-BfZHKAkI.js} +1 -1
  276. package/dist/client/assets/{wrench-YcXMlsh2.js → wrench-DkxnZRlR.js} +1 -1
  277. package/dist/client/assets/{x-e3h2hDsp.js → x-DfRJbqrh.js} +1 -1
  278. package/dist/client/assets/{xterm-Byp1Hep_.js → xterm-CJw8Epxv.js} +1 -1
  279. package/dist/client/assets/{zap-nMcjPoWB.js → zap-CIo8msJB.js} +1 -1
  280. package/dist/client/index.html +1 -1
  281. package/dist/drizzle/0009_old_korg.sql +72 -0
  282. package/dist/drizzle/0010_sparkling_colonel_america.sql +2 -0
  283. package/dist/drizzle/0011_funny_onslaught.sql +4 -0
  284. package/dist/drizzle/0012_high_blazing_skull.sql +16 -0
  285. package/dist/drizzle/0013_perfect_juggernaut.sql +1 -0
  286. package/dist/drizzle/0014_legal_meggan.sql +6 -0
  287. package/dist/drizzle/0015_lame_marvel_boy.sql +12 -0
  288. package/dist/drizzle/0016_early_goliath.sql +6 -0
  289. package/dist/drizzle/meta/0009_snapshot.json +6262 -0
  290. package/dist/drizzle/meta/0010_snapshot.json +6286 -0
  291. package/dist/drizzle/meta/0011_snapshot.json +6337 -0
  292. package/dist/drizzle/meta/0012_snapshot.json +6458 -0
  293. package/dist/drizzle/meta/0013_snapshot.json +6465 -0
  294. package/dist/drizzle/meta/0014_snapshot.json +6503 -0
  295. package/dist/drizzle/meta/0015_snapshot.json +6596 -0
  296. package/dist/drizzle/meta/0016_snapshot.json +6611 -0
  297. package/dist/drizzle/meta/_journal.json +56 -0
  298. package/dist/main.mjs +1355 -365
  299. package/dist/node/main.mjs +314 -12
  300. package/dist/pairing-runtime-controller.mjs +616 -108
  301. package/dist/runtime/base-daemon.mjs +30 -3
  302. package/dist/runtime/broker-daemon.mjs +4822 -532
  303. package/dist/runtime/broker-process-manager.mjs +23 -2
  304. package/dist/runtime/mesh-discover.mjs +23 -2
  305. package/dist/scout-control-plane-web.mjs +1922 -478
  306. package/package.json +2 -2
  307. package/dist/client/assets/AgentLanesEmbedScreen-BmLnN4on.js +0 -1
  308. package/dist/client/assets/AgentLanesPreflight-5B6sXvRB.js +0 -1
  309. package/dist/client/assets/AgentLanesView-DHyzVBk6.js +0 -2
  310. package/dist/client/assets/AgentsSubnav-CDMjKeYC.js +0 -1
  311. package/dist/client/assets/ChatCollapsedStrip-Ycm0ecaX.js +0 -1
  312. package/dist/client/assets/ConversationScreen-BNULZAp2.js +0 -2
  313. package/dist/client/assets/CrewWorkspaces-CJhBKVoZ.css +0 -1
  314. package/dist/client/assets/CrewWorkspaces-CkPYIA46.js +0 -1
  315. package/dist/client/assets/FlightObserveScreen-CDWGSKZg.js +0 -1
  316. package/dist/client/assets/MessagesScreen-Eulveud3.js +0 -1
  317. package/dist/client/assets/NewChatComposer-hlWT-nbR.js +0 -19
  318. package/dist/client/assets/OpsScreen-Ppen_Lmj.js +0 -1
  319. package/dist/client/assets/OpsSubnav-GAKsoSor.js +0 -1
  320. package/dist/client/assets/ProjectAgentProfile-BLlp2e6t.js +0 -1
  321. package/dist/client/assets/ProjectsInbox-Dlt8OQ8O.js +0 -2
  322. package/dist/client/assets/ProjectsRail-DCfNMmnW.js +0 -1
  323. package/dist/client/assets/ProjectsScreen-BP-hmI1m.js +0 -1
  324. package/dist/client/assets/ProjectsThreadAside-CWpMjGIH.js +0 -1
  325. package/dist/client/assets/RealtimeVoiceScreen-D7zZHK_t.js +0 -1
  326. package/dist/client/assets/ScoutDeckSurface-CKT3qdqY.js +0 -1
  327. package/dist/client/assets/SessionEmbedScreen-RD5XOx7R.js +0 -1
  328. package/dist/client/assets/SessionRefScreen-B_cTv47v.js +0 -1
  329. package/dist/client/assets/SessionsScreen-Bq0Z77On.js +0 -1
  330. package/dist/client/assets/agents-project-COzHxZAF.css +0 -1
  331. package/dist/client/assets/archive-BjcGiAy8.js +0 -1
  332. package/dist/client/assets/content-6RvWTrtk.js +0 -1
  333. package/dist/client/assets/content-BCgwMUqz.js +0 -1
  334. package/dist/client/assets/content-Bf2VLhx0.js +0 -1
  335. package/dist/client/assets/content-BrU_38-m.js +0 -1
  336. package/dist/client/assets/content-BvvJN8rN.js +0 -1
  337. package/dist/client/assets/content-CAeEqYPw.js +0 -1
  338. package/dist/client/assets/content-CI_Z9DXk.js +0 -1
  339. package/dist/client/assets/content-CbyKONhW.js +0 -1
  340. package/dist/client/assets/content-Czogvp43.js +0 -1
  341. package/dist/client/assets/content-DFk0zNzX.js +0 -1
  342. package/dist/client/assets/content-DHe4DgkA.js +0 -1
  343. package/dist/client/assets/content-DTz7cKjo.js +0 -1
  344. package/dist/client/assets/content-E3kudY-W.js +0 -1
  345. package/dist/client/assets/content-LpO0aO_U.js +0 -1
  346. package/dist/client/assets/conversation-motion-features-BKkCRaWR.js +0 -1
  347. package/dist/client/assets/discover-CHbrEItO.js +0 -2
  348. package/dist/client/assets/embed-entry-vil28MyU.js +0 -2
  349. package/dist/client/assets/index-BVlMw8x_.js +0 -1
  350. package/dist/client/assets/index-Cn0GR-q1.js +0 -1
  351. package/dist/client/assets/index-DosI4AG9.js +0 -1
  352. package/dist/client/assets/left-BpgWnaah.js +0 -1
  353. package/dist/client/assets/left-Cx0kv6pe.js +0 -1
  354. package/dist/client/assets/left-agents-qL5PpUY-.js +0 -1
  355. package/dist/client/assets/left-z-6CkuBe.js +0 -2
  356. package/dist/client/assets/library-DIo5NiGP.js +0 -1
  357. package/dist/client/assets/projects-inbox-BBs1hG13.css +0 -1
  358. package/dist/client/assets/projects-inbox-D-zAb9Gp.js +0 -1
  359. package/dist/client/assets/resolve-panes-DO6LkwhQ.js +0 -1
  360. package/dist/client/assets/resolve-sidebar-context-CIF288wY.js +0 -1
  361. package/dist/client/assets/router-DJj2WbDg.js +0 -1
  362. package/dist/client/assets/use-fleet-active-asks-BeAdcl09.js +0 -1
  363. 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",
@@ -3151,6 +3161,12 @@ var init_runtime_catalog = __esm(() => {
3151
3161
  reasoningEfforts = new Set(SCOUT_REASONING_EFFORTS);
3152
3162
  });
3153
3163
 
3164
+ // ../protocol/src/scout-baseline-runtime.ts
3165
+ var init_scout_baseline_runtime = () => {};
3166
+
3167
+ // ../protocol/src/session-title.ts
3168
+ var init_session_title = () => {};
3169
+
3154
3170
  // ../protocol/src/reserved-vocabulary.ts
3155
3171
  function scoutReservedVocabularyKind(value) {
3156
3172
  const normalized = normalizeAgentSelectorSegment(value ?? "");
@@ -3379,6 +3395,7 @@ var init_broker_routes = __esm(() => {
3379
3395
  home: "/v1/home",
3380
3396
  node: "/v1/node",
3381
3397
  snapshot: "/v1/snapshot",
3398
+ conversationProjection: "/v1/conversation-projection",
3382
3399
  capabilities: "/v1/capabilities",
3383
3400
  runtimeCatalog: "/v1/runtime-catalog",
3384
3401
  topologySnapshot: "/v1/topology/snapshot",
@@ -3447,9 +3464,12 @@ var init_src = __esm(() => {
3447
3464
  init_budget();
3448
3465
  init_host_integrations();
3449
3466
  init_native_interactions();
3467
+ init_session_handle();
3450
3468
  init_runtime_profiles();
3451
3469
  init_runtime_execution();
3452
3470
  init_runtime_catalog();
3471
+ init_scout_baseline_runtime();
3472
+ init_session_title();
3453
3473
  init_reserved_vocabulary();
3454
3474
  init_scout_composer();
3455
3475
  init_inbox();
@@ -22839,11 +22859,32 @@ function resolveBundledRuntimeDirFromModuleDir(moduleDir) {
22839
22859
  resolve5(moduleDir, "..", "..")
22840
22860
  ];
22841
22861
  for (const candidate of candidates) {
22842
- if (isInstalledRuntimePackageDir(candidate))
22843
- return candidate;
22862
+ if (!isInstalledRuntimePackageDir(candidate))
22863
+ continue;
22864
+ const sourceWorkspaceRuntime = resolveSourceWorkspaceRuntimeDir(candidate);
22865
+ if (sourceWorkspaceRuntime)
22866
+ return sourceWorkspaceRuntime;
22867
+ return candidate;
22844
22868
  }
22845
22869
  return null;
22846
22870
  }
22871
+ function resolveSourceWorkspaceRuntimeDir(bundledPackageDir) {
22872
+ const packagesDir = dirname9(bundledPackageDir);
22873
+ if (resolve5(packagesDir, "cli") !== resolve5(bundledPackageDir))
22874
+ return null;
22875
+ const runtimeDir = join19(packagesDir, "runtime");
22876
+ if (!existsSync18(join19(runtimeDir, "src")))
22877
+ return null;
22878
+ if (!isInstalledRuntimePackageDir(runtimeDir))
22879
+ return null;
22880
+ try {
22881
+ const cliPackage = JSON.parse(readFileSync8(join19(bundledPackageDir, "package.json"), "utf8"));
22882
+ const runtimePackage = JSON.parse(readFileSync8(join19(runtimeDir, "package.json"), "utf8"));
22883
+ return cliPackage.name === "@openscout/scout" && runtimePackage.name === "@openscout/runtime" ? runtimeDir : null;
22884
+ } catch {
22885
+ return null;
22886
+ }
22887
+ }
22847
22888
  function findWorkspaceRuntimeDir(startDir) {
22848
22889
  let current = resolve5(startDir);
22849
22890
  while (true) {
@@ -35518,7 +35559,10 @@ var agentsTable = sqliteTable("agents", {
35518
35559
  advertiseScope: text("advertise_scope").notNull(),
35519
35560
  ownerId: text("owner_id"),
35520
35561
  metadataJson: text("metadata_json")
35521
- });
35562
+ }, (table) => [
35563
+ index("idx_agents_home_node_id").on(table.homeNodeId),
35564
+ index("idx_agents_authority_node_id").on(table.authorityNodeId)
35565
+ ]);
35522
35566
  var agentEndpointsTable = sqliteTable("agent_endpoints", {
35523
35567
  id: text("id").primaryKey(),
35524
35568
  agentId: text("agent_id").notNull().references(() => agentsTable.id, { onDelete: "cascade" }),
@@ -35534,7 +35578,14 @@ var agentEndpointsTable = sqliteTable("agent_endpoints", {
35534
35578
  metadataJson: text("metadata_json"),
35535
35579
  updatedAt: integer("updated_at").notNull().default(epochMsNow)
35536
35580
  }, (table) => [
35537
- index("idx_agent_endpoints_agent_updated_at").on(table.agentId, desc(table.updatedAt))
35581
+ index("idx_agent_endpoints_agent_updated_at").on(table.agentId, desc(table.updatedAt)),
35582
+ index("idx_agent_endpoints_roster_recency").on(desc(sql`CASE
35583
+ WHEN ${table.updatedAt} IS NULL THEN NULL
35584
+ WHEN CAST(${table.updatedAt} AS REAL) < 1000000000000
35585
+ THEN CAST(CAST(${table.updatedAt} AS REAL) * 1000 AS INTEGER)
35586
+ ELSE CAST(${table.updatedAt} AS INTEGER)
35587
+ END`), table.agentId),
35588
+ index("idx_agent_endpoints_node_id").on(table.nodeId)
35538
35589
  ]);
35539
35590
  var runtimeSessionsTable = sqliteTable("runtime_sessions", {
35540
35591
  id: text("id").primaryKey(),
@@ -35558,6 +35609,7 @@ var runtimeSessionsTable = sqliteTable("runtime_sessions", {
35558
35609
  }, (table) => [
35559
35610
  index("idx_runtime_sessions_agent_last_seen").on(table.agentId, desc(table.lastSeenAt)),
35560
35611
  index("idx_runtime_sessions_endpoint_last_seen").on(table.endpointId, desc(table.lastSeenAt)),
35612
+ index("idx_runtime_sessions_node_id").on(table.nodeId),
35561
35613
  index("idx_runtime_sessions_external").on(table.externalSessionId),
35562
35614
  index("idx_runtime_sessions_expires").on(table.expiresAt).where(sql`expires_at IS NOT NULL`)
35563
35615
  ]);
@@ -35577,6 +35629,8 @@ var runtimeSessionAliasesTable = sqliteTable("runtime_session_aliases", {
35577
35629
  primaryKey({ columns: [table.alias, table.sessionId] }),
35578
35630
  index("idx_runtime_session_aliases_alias").on(table.alias, desc(table.lastSeenAt)),
35579
35631
  index("idx_runtime_session_aliases_session").on(table.sessionId),
35632
+ index("idx_runtime_session_aliases_endpoint").on(table.endpointId),
35633
+ index("idx_runtime_session_aliases_node_id").on(table.nodeId),
35580
35634
  index("idx_runtime_session_aliases_expires").on(table.expiresAt).where(sql`expires_at IS NOT NULL`)
35581
35635
  ]);
35582
35636
  var routeAliasBindingsTable = sqliteTable("route_alias_bindings", {
@@ -35656,7 +35710,8 @@ var conversationMembersTable = sqliteTable("conversation_members", {
35656
35710
  actorId: text("actor_id").notNull().references(() => actorsTable.id, { onDelete: "cascade" }),
35657
35711
  role: text("role")
35658
35712
  }, (table) => [
35659
- primaryKey({ columns: [table.conversationId, table.actorId] })
35713
+ primaryKey({ columns: [table.conversationId, table.actorId] }),
35714
+ index("idx_conversation_members_actor").on(table.actorId, table.conversationId)
35660
35715
  ]);
35661
35716
  var messagesTable = sqliteTable("messages", {
35662
35717
  id: text("id").primaryKey(),
@@ -35676,7 +35731,8 @@ var messagesTable = sqliteTable("messages", {
35676
35731
  }, (table) => [
35677
35732
  index("idx_messages_conversation_created_at").on(table.conversationId, table.createdAt),
35678
35733
  index("idx_messages_created_at").on(desc(table.createdAt)),
35679
- index("idx_messages_actor_created_at").on(table.actorId, desc(table.createdAt))
35734
+ index("idx_messages_actor_created_at").on(table.actorId, desc(table.createdAt)),
35735
+ index("idx_messages_origin_node_id").on(table.originNodeId)
35680
35736
  ]);
35681
35737
  var messageMentionsTable = sqliteTable("message_mentions", {
35682
35738
  messageId: text("message_id").notNull().references(() => messagesTable.id, { onDelete: "cascade" }),
@@ -35705,7 +35761,102 @@ var conversationReadCursorsTable = sqliteTable("conversation_read_cursors", {
35705
35761
  metadataJson: text("metadata_json")
35706
35762
  }, (table) => [
35707
35763
  primaryKey({ columns: [table.conversationId, table.actorId] }),
35708
- index("idx_read_cursors_conversation_updated_at").on(table.conversationId, desc(table.updatedAt))
35764
+ index("idx_read_cursors_conversation_updated_at").on(table.conversationId, desc(table.updatedAt)),
35765
+ index("idx_read_cursors_reader_node_id").on(table.readerNodeId)
35766
+ ]);
35767
+ var brokerJournalProjectionCheckpointsTable = sqliteTable("broker_journal_projection_checkpoints", {
35768
+ projectionId: text("projection_id").primaryKey(),
35769
+ projectionVersion: integer("projection_version").notNull(),
35770
+ barrierId: text("barrier_id").notNull(),
35771
+ updatedAt: integer("updated_at").notNull()
35772
+ });
35773
+ var conversationProjectionMetaTable = sqliteTable("conversation_projection_meta", {
35774
+ singleton: integer("singleton").primaryKey(),
35775
+ projectionId: text("projection_id").notNull(),
35776
+ projectionVersion: integer("projection_version").notNull(),
35777
+ headSeq: integer("head_seq").notNull(),
35778
+ minReplayableSeq: integer("min_replayable_seq").notNull(),
35779
+ updatedAt: integer("updated_at").notNull()
35780
+ }, (table) => [
35781
+ check("conversation_projection_meta_singleton_check", sql`${table.singleton} = 1`)
35782
+ ]);
35783
+ var conversationProjectionItemsTable = sqliteTable("conversation_projection_items", {
35784
+ feedId: text("feed_id").primaryKey(),
35785
+ entityKind: text("entity_kind").notNull(),
35786
+ kind: text("kind").notNull(),
35787
+ conversationId: text("conversation_id"),
35788
+ runtimeSessionId: text("runtime_session_id"),
35789
+ source: text("source"),
35790
+ sourceSessionId: text("source_session_id"),
35791
+ title: text("title"),
35792
+ alias: text("alias"),
35793
+ naturalKey: text("natural_key"),
35794
+ projectRoot: text("project_root"),
35795
+ harness: text("harness"),
35796
+ model: text("model"),
35797
+ effort: text("effort"),
35798
+ agentId: text("agent_id"),
35799
+ agentName: text("agent_name"),
35800
+ currentBranch: text("current_branch"),
35801
+ authorityNodeId: text("authority_node_id"),
35802
+ authorityNodeName: text("authority_node_name"),
35803
+ parentConversationId: text("parent_conversation_id"),
35804
+ anchorMessageId: text("anchor_message_id"),
35805
+ activityState: text("activity_state").notNull(),
35806
+ lastMessageId: text("last_message_id"),
35807
+ lastMessageAt: integer("last_message_at"),
35808
+ lastActivityAt: integer("last_activity_at").notNull(),
35809
+ messageCount: integer("message_count").notNull().default(0),
35810
+ unreadCount: integer("unread_count").notNull().default(0),
35811
+ participantCount: integer("participant_count").notNull().default(0),
35812
+ preview: text("preview"),
35813
+ lastEngagedAt: integer("last_engaged_at"),
35814
+ sourceFreshAt: integer("source_fresh_at"),
35815
+ visibilityState: text("visibility_state").notNull().default("visible"),
35816
+ updatedSeq: integer("updated_seq").notNull(),
35817
+ updatedAt: integer("updated_at").notNull()
35818
+ }, (table) => [
35819
+ check("conversation_projection_items_entity_kind_check", sql`${table.entityKind} IN ('scout_conversation', 'observed_session')`),
35820
+ check("conversation_projection_items_visibility_check", sql`${table.visibilityState} IN ('visible', 'hidden')`),
35821
+ index("idx_conversation_projection_recent").on(table.visibilityState, desc(table.lastActivityAt), table.feedId),
35822
+ index("idx_conversation_projection_project_recent").on(table.projectRoot, table.visibilityState, desc(table.lastActivityAt)),
35823
+ index("idx_conversation_projection_engaged").on(table.visibilityState, desc(table.lastEngagedAt), desc(table.lastActivityAt), table.feedId),
35824
+ index("idx_conversation_projection_source_fresh").on(table.visibilityState, desc(table.sourceFreshAt)),
35825
+ index("idx_conversation_projection_runtime_session").on(table.entityKind, table.runtimeSessionId),
35826
+ index("idx_conversation_projection_source_session").on(table.entityKind, table.sourceSessionId),
35827
+ uniqueIndex("idx_conversation_projection_conversation").on(table.conversationId).where(sql`conversation_id IS NOT NULL`)
35828
+ ]);
35829
+ var conversationProjectionMessageFactsTable = sqliteTable("conversation_projection_message_facts", {
35830
+ messageId: text("message_id").primaryKey().references(() => messagesTable.id, { onDelete: "cascade" }),
35831
+ conversationId: text("conversation_id").notNull().references(() => conversationsTable.id, { onDelete: "cascade" }),
35832
+ createdAt: integer("created_at").notNull()
35833
+ }, (table) => [
35834
+ index("idx_conversation_projection_message_facts_conversation").on(table.conversationId, table.createdAt, table.messageId)
35835
+ ]);
35836
+ var conversationProjectionMessageStatsTable = sqliteTable("conversation_projection_message_stats", {
35837
+ conversationId: text("conversation_id").primaryKey().references(() => conversationsTable.id, { onDelete: "cascade" }),
35838
+ messageCount: integer("message_count").notNull().default(0),
35839
+ latestMessageId: text("latest_message_id"),
35840
+ latestMessageAt: integer("latest_message_at")
35841
+ });
35842
+ var conversationProjectionSourcesTable = sqliteTable("conversation_projection_sources", {
35843
+ source: text("source").notNull(),
35844
+ sourceSessionId: text("source_session_id").notNull(),
35845
+ feedId: text("feed_id").notNull().references(() => conversationProjectionItemsTable.feedId, { onDelete: "cascade" }),
35846
+ firstSeenAt: integer("first_seen_at").notNull(),
35847
+ lastSeenAt: integer("last_seen_at").notNull()
35848
+ }, (table) => [
35849
+ primaryKey({ columns: [table.source, table.sourceSessionId] }),
35850
+ index("idx_conversation_projection_sources_feed").on(table.feedId)
35851
+ ]);
35852
+ var conversationProjectionEventsTable = sqliteTable("conversation_projection_events", {
35853
+ seq: integer("seq").primaryKey({ autoIncrement: true }),
35854
+ projectionId: text("projection_id").notNull(),
35855
+ ts: integer("ts").notNull(),
35856
+ payloadJson: text("payload_json").notNull()
35857
+ }, (table) => [
35858
+ index("idx_conversation_projection_events_projection_seq").on(table.projectionId, table.seq),
35859
+ index("idx_conversation_projection_events_ts").on(table.ts)
35709
35860
  ]);
35710
35861
  var invocationsTable = sqliteTable("invocations", {
35711
35862
  id: text("id").primaryKey(),
@@ -35737,7 +35888,10 @@ var invocationsTable = sqliteTable("invocations", {
35737
35888
  executionResolutionJson: text("execution_resolution_json")
35738
35889
  }, (table) => [
35739
35890
  index("idx_invocations_target_created_at").on(table.targetAgentId, table.createdAt),
35740
- index("idx_invocations_requester_created_at").on(table.requesterId, desc(table.createdAt))
35891
+ index("idx_invocations_requester_created_at").on(table.requesterId, desc(table.createdAt)),
35892
+ index("idx_invocations_conversation_created_at").on(table.conversationId, desc(table.createdAt)),
35893
+ index("idx_invocations_requester_node_id").on(table.requesterNodeId),
35894
+ index("idx_invocations_target_node_id").on(table.targetNodeId)
35741
35895
  ]);
35742
35896
  var flightsTable = sqliteTable("flights", {
35743
35897
  id: text("id").primaryKey(),
@@ -35783,7 +35937,8 @@ var deliveriesTable = sqliteTable("deliveries", {
35783
35937
  createdAt: integer("created_at").notNull().default(epochMsNow)
35784
35938
  }, (table) => [
35785
35939
  index("idx_deliveries_status_transport").on(table.status, table.transport),
35786
- index("idx_deliveries_created_at").on(desc(table.createdAt))
35940
+ index("idx_deliveries_created_at").on(desc(table.createdAt)),
35941
+ index("idx_deliveries_target_node_id").on(table.targetNodeId)
35787
35942
  ]);
35788
35943
  var deliveryAttemptsTable = sqliteTable("delivery_attempts", {
35789
35944
  id: text("id").primaryKey(),
@@ -35953,7 +36108,8 @@ var threadEventsTable = sqliteTable("thread_events", {
35953
36108
  }, (table) => [
35954
36109
  unique2().on(table.conversationId, table.seq),
35955
36110
  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))
36111
+ index("idx_thread_events_conversation_ts").on(table.conversationId, desc(table.ts)),
36112
+ index("idx_thread_events_authority_node_id").on(table.authorityNodeId)
35957
36113
  ]);
35958
36114
  var threadCursorsTable = sqliteTable("thread_cursors", {
35959
36115
  conversationId: text("conversation_id").notNull().references(() => conversationsTable.id, { onDelete: "cascade" }),
@@ -35961,7 +36117,8 @@ var threadCursorsTable = sqliteTable("thread_cursors", {
35961
36117
  lastAppliedSeq: integer("last_applied_seq").notNull(),
35962
36118
  updatedAt: integer("updated_at").notNull()
35963
36119
  }, (table) => [
35964
- primaryKey({ columns: [table.conversationId, table.authorityNodeId] })
36120
+ primaryKey({ columns: [table.conversationId, table.authorityNodeId] }),
36121
+ index("idx_thread_cursors_authority_node_id").on(table.authorityNodeId)
35965
36122
  ]);
35966
36123
  var scoutDispatchesTable = sqliteTable("scout_dispatches", {
35967
36124
  id: text("id").primaryKey(),
@@ -36189,6 +36346,8 @@ CREATE INDEX IF NOT EXISTS idx_runtime_sessions_agent_last_seen
36189
36346
  ON runtime_sessions (agent_id, last_seen_at DESC);
36190
36347
  CREATE INDEX IF NOT EXISTS idx_runtime_sessions_endpoint_last_seen
36191
36348
  ON runtime_sessions (endpoint_id, last_seen_at DESC);
36349
+ CREATE INDEX IF NOT EXISTS idx_runtime_sessions_node_id
36350
+ ON runtime_sessions (node_id);
36192
36351
  CREATE INDEX IF NOT EXISTS idx_runtime_sessions_external
36193
36352
  ON runtime_sessions (external_session_id);
36194
36353
  CREATE INDEX IF NOT EXISTS idx_runtime_sessions_expires
@@ -36198,6 +36357,10 @@ CREATE INDEX IF NOT EXISTS idx_runtime_session_aliases_alias
36198
36357
  ON runtime_session_aliases (alias, last_seen_at DESC);
36199
36358
  CREATE INDEX IF NOT EXISTS idx_runtime_session_aliases_session
36200
36359
  ON runtime_session_aliases (session_id);
36360
+ CREATE INDEX IF NOT EXISTS idx_runtime_session_aliases_endpoint
36361
+ ON runtime_session_aliases (endpoint_id);
36362
+ CREATE INDEX IF NOT EXISTS idx_runtime_session_aliases_node_id
36363
+ ON runtime_session_aliases (node_id);
36201
36364
  CREATE INDEX IF NOT EXISTS idx_runtime_session_aliases_expires
36202
36365
  ON runtime_session_aliases (expires_at)
36203
36366
  WHERE expires_at IS NOT NULL;
@@ -36420,6 +36583,93 @@ CREATE TABLE IF NOT EXISTS conversation_read_cursors (
36420
36583
  PRIMARY KEY (conversation_id, actor_id)
36421
36584
  );
36422
36585
 
36586
+ CREATE TABLE IF NOT EXISTS broker_journal_projection_checkpoints (
36587
+ projection_id TEXT PRIMARY KEY,
36588
+ projection_version INTEGER NOT NULL,
36589
+ barrier_id TEXT NOT NULL,
36590
+ updated_at INTEGER NOT NULL
36591
+ );
36592
+
36593
+ CREATE TABLE IF NOT EXISTS conversation_projection_meta (
36594
+ singleton INTEGER PRIMARY KEY,
36595
+ projection_id TEXT NOT NULL,
36596
+ projection_version INTEGER NOT NULL,
36597
+ head_seq INTEGER NOT NULL,
36598
+ min_replayable_seq INTEGER NOT NULL,
36599
+ updated_at INTEGER NOT NULL,
36600
+ CONSTRAINT conversation_projection_meta_singleton_check CHECK (singleton = 1)
36601
+ );
36602
+
36603
+ CREATE TABLE IF NOT EXISTS conversation_projection_items (
36604
+ feed_id TEXT PRIMARY KEY,
36605
+ entity_kind TEXT NOT NULL,
36606
+ kind TEXT NOT NULL,
36607
+ conversation_id TEXT,
36608
+ runtime_session_id TEXT,
36609
+ source TEXT,
36610
+ source_session_id TEXT,
36611
+ title TEXT,
36612
+ alias TEXT,
36613
+ natural_key TEXT,
36614
+ project_root TEXT,
36615
+ harness TEXT,
36616
+ model TEXT,
36617
+ effort TEXT,
36618
+ agent_id TEXT,
36619
+ agent_name TEXT,
36620
+ current_branch TEXT,
36621
+ authority_node_id TEXT,
36622
+ authority_node_name TEXT,
36623
+ parent_conversation_id TEXT,
36624
+ anchor_message_id TEXT,
36625
+ activity_state TEXT NOT NULL,
36626
+ last_message_id TEXT,
36627
+ last_message_at INTEGER,
36628
+ last_activity_at INTEGER NOT NULL,
36629
+ message_count INTEGER NOT NULL DEFAULT 0,
36630
+ unread_count INTEGER NOT NULL DEFAULT 0,
36631
+ participant_count INTEGER NOT NULL DEFAULT 0,
36632
+ preview TEXT,
36633
+ last_engaged_at INTEGER,
36634
+ source_fresh_at INTEGER,
36635
+ visibility_state TEXT NOT NULL DEFAULT 'visible',
36636
+ updated_seq INTEGER NOT NULL,
36637
+ updated_at INTEGER NOT NULL,
36638
+ CONSTRAINT conversation_projection_items_entity_kind_check
36639
+ CHECK (entity_kind IN ('scout_conversation', 'observed_session')),
36640
+ CONSTRAINT conversation_projection_items_visibility_check
36641
+ CHECK (visibility_state IN ('visible', 'hidden'))
36642
+ );
36643
+
36644
+ CREATE TABLE IF NOT EXISTS conversation_projection_message_facts (
36645
+ message_id TEXT PRIMARY KEY REFERENCES messages(id) ON DELETE CASCADE,
36646
+ conversation_id TEXT NOT NULL REFERENCES conversations(id) ON DELETE CASCADE,
36647
+ created_at INTEGER NOT NULL
36648
+ );
36649
+
36650
+ CREATE TABLE IF NOT EXISTS conversation_projection_message_stats (
36651
+ conversation_id TEXT PRIMARY KEY REFERENCES conversations(id) ON DELETE CASCADE,
36652
+ message_count INTEGER NOT NULL DEFAULT 0,
36653
+ latest_message_id TEXT,
36654
+ latest_message_at INTEGER
36655
+ );
36656
+
36657
+ CREATE TABLE IF NOT EXISTS conversation_projection_sources (
36658
+ source TEXT NOT NULL,
36659
+ source_session_id TEXT NOT NULL,
36660
+ feed_id TEXT NOT NULL REFERENCES conversation_projection_items(feed_id) ON DELETE CASCADE,
36661
+ first_seen_at INTEGER NOT NULL,
36662
+ last_seen_at INTEGER NOT NULL,
36663
+ PRIMARY KEY (source, source_session_id)
36664
+ );
36665
+
36666
+ CREATE TABLE IF NOT EXISTS conversation_projection_events (
36667
+ seq INTEGER PRIMARY KEY AUTOINCREMENT,
36668
+ projection_id TEXT NOT NULL,
36669
+ ts INTEGER NOT NULL,
36670
+ payload_json TEXT NOT NULL
36671
+ );
36672
+
36423
36673
  CREATE TABLE IF NOT EXISTS invocations (
36424
36674
  id TEXT PRIMARY KEY,
36425
36675
  requester_id TEXT NOT NULL REFERENCES actors(id) ON DELETE RESTRICT,
@@ -36827,18 +37077,74 @@ CREATE INDEX IF NOT EXISTS idx_peer_nonces_seen_at
36827
37077
  ON peer_nonces (seen_at);
36828
37078
  CREATE INDEX IF NOT EXISTS idx_agent_endpoints_agent_updated_at
36829
37079
  ON agent_endpoints (agent_id, updated_at DESC);
37080
+ CREATE INDEX IF NOT EXISTS idx_agent_endpoints_roster_recency
37081
+ ON agent_endpoints (
37082
+ CASE
37083
+ WHEN updated_at IS NULL THEN NULL
37084
+ WHEN CAST(updated_at AS REAL) < 1000000000000
37085
+ THEN CAST(CAST(updated_at AS REAL) * 1000 AS INTEGER)
37086
+ ELSE CAST(updated_at AS INTEGER)
37087
+ END DESC,
37088
+ agent_id
37089
+ );
37090
+ CREATE INDEX IF NOT EXISTS idx_agents_home_node_id
37091
+ ON agents (home_node_id);
37092
+ CREATE INDEX IF NOT EXISTS idx_agents_authority_node_id
37093
+ ON agents (authority_node_id);
37094
+ CREATE INDEX IF NOT EXISTS idx_agent_endpoints_node_id
37095
+ ON agent_endpoints (node_id);
37096
+ CREATE INDEX IF NOT EXISTS idx_conversation_members_actor
37097
+ ON conversation_members (actor_id, conversation_id);
36830
37098
  CREATE INDEX IF NOT EXISTS idx_messages_conversation_created_at
36831
37099
  ON messages (conversation_id, created_at);
36832
37100
  CREATE INDEX IF NOT EXISTS idx_messages_created_at
36833
37101
  ON messages (created_at DESC);
36834
37102
  CREATE INDEX IF NOT EXISTS idx_messages_actor_created_at
36835
37103
  ON messages (actor_id, created_at DESC);
37104
+ CREATE INDEX IF NOT EXISTS idx_messages_origin_node_id
37105
+ ON messages (origin_node_id);
36836
37106
  CREATE INDEX IF NOT EXISTS idx_read_cursors_conversation_updated_at
36837
37107
  ON conversation_read_cursors (conversation_id, updated_at DESC);
37108
+ CREATE INDEX IF NOT EXISTS idx_read_cursors_reader_node_id
37109
+ ON conversation_read_cursors (reader_node_id);
37110
+ CREATE INDEX IF NOT EXISTS idx_conversation_projection_recent
37111
+ ON conversation_projection_items (visibility_state, last_activity_at DESC, feed_id);
37112
+ CREATE INDEX IF NOT EXISTS idx_conversation_projection_project_recent
37113
+ ON conversation_projection_items (project_root, visibility_state, last_activity_at DESC);
37114
+ CREATE INDEX IF NOT EXISTS idx_conversation_projection_message_facts_conversation
37115
+ ON conversation_projection_message_facts (conversation_id, created_at, message_id);
37116
+ CREATE INDEX IF NOT EXISTS idx_conversation_projection_engaged
37117
+ ON conversation_projection_items (
37118
+ visibility_state,
37119
+ last_engaged_at DESC,
37120
+ last_activity_at DESC,
37121
+ feed_id
37122
+ );
37123
+ CREATE INDEX IF NOT EXISTS idx_conversation_projection_source_fresh
37124
+ ON conversation_projection_items (visibility_state, source_fresh_at DESC);
37125
+ CREATE INDEX IF NOT EXISTS idx_conversation_projection_runtime_session
37126
+ ON conversation_projection_items (entity_kind, runtime_session_id);
37127
+ CREATE INDEX IF NOT EXISTS idx_conversation_projection_source_session
37128
+ ON conversation_projection_items (entity_kind, source_session_id);
37129
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_conversation_projection_conversation
37130
+ ON conversation_projection_items (conversation_id)
37131
+ WHERE conversation_id IS NOT NULL;
37132
+ CREATE INDEX IF NOT EXISTS idx_conversation_projection_sources_feed
37133
+ ON conversation_projection_sources (feed_id);
37134
+ CREATE INDEX IF NOT EXISTS idx_conversation_projection_events_projection_seq
37135
+ ON conversation_projection_events (projection_id, seq);
37136
+ CREATE INDEX IF NOT EXISTS idx_conversation_projection_events_ts
37137
+ ON conversation_projection_events (ts);
36838
37138
  CREATE INDEX IF NOT EXISTS idx_invocations_target_created_at
36839
37139
  ON invocations (target_agent_id, created_at);
36840
37140
  CREATE INDEX IF NOT EXISTS idx_invocations_requester_created_at
36841
37141
  ON invocations (requester_id, created_at DESC);
37142
+ CREATE INDEX IF NOT EXISTS idx_invocations_conversation_created_at
37143
+ ON invocations (conversation_id, created_at DESC);
37144
+ CREATE INDEX IF NOT EXISTS idx_invocations_requester_node_id
37145
+ ON invocations (requester_node_id);
37146
+ CREATE INDEX IF NOT EXISTS idx_invocations_target_node_id
37147
+ ON invocations (target_node_id);
36842
37148
  CREATE INDEX IF NOT EXISTS idx_flights_target_state
36843
37149
  ON flights (target_agent_id, state);
36844
37150
  CREATE INDEX IF NOT EXISTS idx_flights_invocation_id
@@ -36847,6 +37153,8 @@ CREATE INDEX IF NOT EXISTS idx_deliveries_status_transport
36847
37153
  ON deliveries (status, transport);
36848
37154
  CREATE INDEX IF NOT EXISTS idx_deliveries_created_at
36849
37155
  ON deliveries (created_at DESC);
37156
+ CREATE INDEX IF NOT EXISTS idx_deliveries_target_node_id
37157
+ ON deliveries (target_node_id);
36850
37158
  CREATE INDEX IF NOT EXISTS idx_delivery_attempts_created_at
36851
37159
  ON delivery_attempts (created_at DESC);
36852
37160
  CREATE UNIQUE INDEX IF NOT EXISTS idx_durable_actions_idempotency_key
@@ -36893,6 +37201,10 @@ CREATE INDEX IF NOT EXISTS idx_thread_events_conversation_seq
36893
37201
  ON thread_events (conversation_id, seq DESC);
36894
37202
  CREATE INDEX IF NOT EXISTS idx_thread_events_conversation_ts
36895
37203
  ON thread_events (conversation_id, ts DESC);
37204
+ CREATE INDEX IF NOT EXISTS idx_thread_events_authority_node_id
37205
+ ON thread_events (authority_node_id);
37206
+ CREATE INDEX IF NOT EXISTS idx_thread_cursors_authority_node_id
37207
+ ON thread_cursors (authority_node_id);
36896
37208
  CREATE INDEX IF NOT EXISTS idx_activity_items_agent_ts
36897
37209
  ON activity_items (agent_id, ts DESC);
36898
37210
  CREATE INDEX IF NOT EXISTS idx_activity_items_actor_ts
@@ -50353,12 +50665,24 @@ var meshPeerFetch = createMeshPeerFetch();
50353
50665
  init_tailscale();
50354
50666
  // ../runtime/src/iroh-bridge.ts
50355
50667
  init_support_paths();
50668
+
50669
+ // ../runtime/src/mesh-forwarding.ts
50670
+ var MAX_PEER_AGENT_SNAPSHOT_BYTES = 2 * 1024 * 1024;
50356
50671
  // ../runtime/src/mesh-rendezvous.ts
50357
50672
  init_src();
50358
50673
  init_broker_process_manager();
50359
50674
  init_open_scout_network();
50360
50675
  var DEFAULT_RENDEZVOUS_TTL_MS = 60000;
50361
50676
  var DEFAULT_RENDEZVOUS_INTERVAL_MS = 30000;
50677
+
50678
+ class MeshRendezvousPublishError extends Error {
50679
+ status;
50680
+ constructor(status, message) {
50681
+ super(message);
50682
+ this.status = status;
50683
+ this.name = "MeshRendezvousPublishError";
50684
+ }
50685
+ }
50362
50686
  function resolveMeshRendezvousPublishConfig(env = process.env, options = {}) {
50363
50687
  const explicitUrl = env.OPENSCOUT_MESH_RENDEZVOUS_URL?.trim();
50364
50688
  if (explicitUrl?.toLowerCase() === "false" || explicitUrl === "0") {
@@ -50372,6 +50696,10 @@ function resolveMeshRendezvousPublishConfig(env = process.env, options = {}) {
50372
50696
  }
50373
50697
  const token = env.OPENSCOUT_MESH_RENDEZVOUS_TOKEN?.trim() || undefined;
50374
50698
  const sessionToken = env.OPENSCOUT_MESH_RENDEZVOUS_SESSION?.trim() || undefined;
50699
+ const allowAnonymous = readBooleanFlag(env.OPENSCOUT_MESH_RENDEZVOUS_ALLOW_ANONYMOUS);
50700
+ if (!token && !sessionToken && !allowAnonymous) {
50701
+ return;
50702
+ }
50375
50703
  return {
50376
50704
  url: rawUrl.replace(/\/$/, ""),
50377
50705
  token,
@@ -50413,15 +50741,16 @@ async function publishMeshRendezvousPresence(node, options) {
50413
50741
  });
50414
50742
  if (!response.ok) {
50415
50743
  const detail = await response.text().catch(() => "");
50416
- throw new Error(`rendezvous publish failed: ${response.status} ${response.statusText}${detail ? ` ${detail}` : ""}`);
50744
+ throw new MeshRendezvousPublishError(response.status, `rendezvous publish failed: ${response.status} ${response.statusText}${detail ? ` ${detail}` : ""}`);
50417
50745
  }
50418
50746
  return true;
50419
50747
  }
50420
50748
  function startMeshRendezvousPublisher(node, options) {
50421
50749
  let stopped2 = false;
50750
+ let suspendedForAuth = false;
50422
50751
  let inFlight = null;
50423
50752
  const publishNow = async () => {
50424
- if (stopped2)
50753
+ if (stopped2 || suspendedForAuth)
50425
50754
  return;
50426
50755
  if (inFlight) {
50427
50756
  await inFlight;
@@ -50432,6 +50761,11 @@ function startMeshRendezvousPublisher(node, options) {
50432
50761
  options.logger?.log(`[openscout-runtime] published mesh rendezvous presence to ${options.config.url}`);
50433
50762
  }
50434
50763
  }).catch((error) => {
50764
+ if (error instanceof MeshRendezvousPublishError && (error.status === 401 || error.status === 403)) {
50765
+ suspendedForAuth = true;
50766
+ options.logger?.warn(`[openscout-runtime] mesh rendezvous authentication rejected; publishing is suspended until restart: ${error.message}`);
50767
+ return;
50768
+ }
50435
50769
  options.logger?.warn(`[openscout-runtime] mesh rendezvous publish failed: ${error instanceof Error ? error.message : String(error)}`);
50436
50770
  }).finally(() => {
50437
50771
  inFlight = null;
@@ -50493,6 +50827,9 @@ function readPositiveInteger(value, fallback2) {
50493
50827
  const parsed = Number.parseInt(value ?? "", 10);
50494
50828
  return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback2;
50495
50829
  }
50830
+ function readBooleanFlag(value) {
50831
+ return ["1", "true", "yes", "on"].includes(value?.trim().toLowerCase() ?? "");
50832
+ }
50496
50833
 
50497
50834
  // ../runtime/src/index.ts
50498
50835
  init_node_identity();
@@ -54697,6 +55034,7 @@ var pairingLog = {
54697
55034
  };
54698
55035
 
54699
55036
  // ../web/server/core/pairing/runtime/relay/relay.ts
55037
+ init_local_config();
54700
55038
  var BRIDGE_ABSENCE_GRACE_MS = 30000;
54701
55039
  var ROOM_IDLE_TIMEOUT_MS = 60000;
54702
55040
  function startRelay(port, options = {}) {
@@ -54713,6 +55051,9 @@ function startRelay(port, options = {}) {
54713
55051
  } : {},
54714
55052
  fetch(req, server2) {
54715
55053
  const url = new URL(req.url);
55054
+ if (url.pathname === "/pair" && req.method === "GET") {
55055
+ return proxyPairHttp(req, url, options.pairHttpOrigin, server2.requestIP(req)?.address);
55056
+ }
54716
55057
  if (url.pathname === "/resolve" && req.method === "POST") {
54717
55058
  return handleResolve(req, roomByBridgeKey, rooms);
54718
55059
  }
@@ -54856,6 +55197,46 @@ function startRelay(port, options = {}) {
54856
55197
  }
54857
55198
  };
54858
55199
  }
55200
+ async function proxyPairHttp(req, url, pairHttpOrigin, clientIp) {
55201
+ const origin = pairHttpOrigin === undefined ? `http://127.0.0.1:${resolveWebPort()}` : pairHttpOrigin?.trim() || null;
55202
+ if (!origin) {
55203
+ return new Response("Pairing HTTP is not configured", { status: 503 });
55204
+ }
55205
+ const target2 = new URL("/pair", origin);
55206
+ target2.search = url.search;
55207
+ const headers2 = new Headers;
55208
+ for (const name2 of ["accept", "user-agent", "x-scout-client", "x-scout-device-name"]) {
55209
+ const value = req.headers.get(name2);
55210
+ if (value)
55211
+ headers2.set(name2, value);
55212
+ }
55213
+ headers2.set("x-scout-pair-relay", "1");
55214
+ if (clientIp) {
55215
+ headers2.set("x-forwarded-for", clientIp);
55216
+ headers2.set("x-real-ip", clientIp);
55217
+ }
55218
+ try {
55219
+ const response = await fetch(target2, {
55220
+ method: "GET",
55221
+ headers: headers2,
55222
+ redirect: "manual",
55223
+ signal: AbortSignal.timeout(3000)
55224
+ });
55225
+ const out = new Headers;
55226
+ const location = response.headers.get("location");
55227
+ if (location)
55228
+ out.set("location", location);
55229
+ const cacheControl = response.headers.get("cache-control");
55230
+ if (cacheControl)
55231
+ out.set("cache-control", cacheControl);
55232
+ const contentType = response.headers.get("content-type");
55233
+ if (contentType)
55234
+ out.set("content-type", contentType);
55235
+ return new Response(response.body, { status: response.status, headers: out });
55236
+ } catch {
55237
+ return new Response("Pairing service unreachable", { status: 502 });
55238
+ }
55239
+ }
54859
55240
  async function handleResolve(req, roomByBridgeKey, rooms) {
54860
55241
  try {
54861
55242
  const body = await req.json();
@@ -59215,7 +59596,8 @@ var SCOUT_API_LOG_ALL = process.env.SCOUT_PERF_LOG_API === "1";
59215
59596
  // ../web/server/core/broker/service.ts
59216
59597
  var DEFAULT_SCOUT_BROKER_SNAPSHOT_WINDOW_MS = 24 * 60 * 60 * 1000;
59217
59598
  var DEFAULT_SCOUT_BROKER_SNAPSHOT_BUCKET_MS = 60 * 1000;
59218
- var SCOUT_BROKER_CONTEXT_CACHE_TTL_MS = 5000;
59599
+ var SCOUT_BROKER_CONTEXT_CACHE_TTL_MS = 30000;
59600
+ var SCOUT_BROKER_CONTEXT_STALE_RETENTION_MS = 60000;
59219
59601
  var scoutBrokerContextCache = new Map;
59220
59602
  function invalidateScoutBrokerContextCache(baseUrl) {
59221
59603
  const prefix = [baseUrl, resolveBrokerSocketPathForBaseUrl(baseUrl) ?? "http"].join("\x00") + "\x00";
@@ -59532,26 +59914,24 @@ async function recordScoutBrokerReadCursor(input, baseUrl = resolveScoutBrokerUr
59532
59914
  });
59533
59915
  }
59534
59916
  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;
59917
+ const usesRollingWindow = options.since === undefined;
59918
+ 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
59919
  if (options.force) {
59537
59920
  invalidateScoutBrokerContextCache(baseUrl);
59538
59921
  }
59539
59922
  const cacheKey = options.signal ? null : [
59540
59923
  baseUrl,
59541
59924
  resolveBrokerSocketPathForBaseUrl(baseUrl) ?? "http",
59542
- since ?? "full",
59925
+ usesRollingWindow ? "rolling-24h" : since ?? "full",
59543
59926
  options.scope ?? "default"
59544
59927
  ].join("\x00");
59545
59928
  const now = Date.now();
59546
- for (const [key, entry] of scoutBrokerContextCache) {
59547
- if (entry.expiresAt <= now)
59929
+ for (const [key, entry2] of scoutBrokerContextCache) {
59930
+ if (key !== cacheKey && !entry2.inFlight && entry2.expiresAt + SCOUT_BROKER_CONTEXT_STALE_RETENTION_MS <= now) {
59548
59931
  scoutBrokerContextCache.delete(key);
59932
+ }
59549
59933
  }
59550
- const cached = cacheKey ? scoutBrokerContextCache.get(cacheKey) : null;
59551
- if (cached && cached.expiresAt > now) {
59552
- return cached.promise;
59553
- }
59554
- const promise = (async () => {
59934
+ const readContext = async () => {
59555
59935
  const health = await readScoutBrokerHealth(baseUrl, { signal: options.signal });
59556
59936
  if (!health.reachable || !health.ok) {
59557
59937
  return null;
@@ -59575,19 +59955,60 @@ async function loadScoutBrokerContext(baseUrl = resolveScoutBrokerUrl(), options
59575
59955
  } catch {
59576
59956
  return null;
59577
59957
  }
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) {
59958
+ };
59959
+ if (!cacheKey) {
59960
+ return readContext();
59961
+ }
59962
+ const refresh = (entry2, delayMs = 0) => {
59963
+ if (entry2.inFlight)
59964
+ return entry2.inFlight;
59965
+ const attempt = (delayMs > 0 ? new Promise((resolve15) => setTimeout(resolve15, delayMs)) : Promise.resolve()).then(readContext).then((context) => {
59966
+ if (scoutBrokerContextCache.get(cacheKey) !== entry2)
59967
+ return context;
59968
+ if (context) {
59969
+ entry2.value = context;
59970
+ entry2.hasValue = true;
59971
+ entry2.expiresAt = Date.now() + SCOUT_BROKER_CONTEXT_CACHE_TTL_MS;
59972
+ } else if (!entry2.hasValue) {
59586
59973
  scoutBrokerContextCache.delete(cacheKey);
59974
+ } else {
59975
+ entry2.expiresAt = Date.now() + SCOUT_BROKER_CONTEXT_CACHE_TTL_MS;
59976
+ }
59977
+ return context;
59978
+ }).finally(() => {
59979
+ if (scoutBrokerContextCache.get(cacheKey) === entry2) {
59980
+ entry2.inFlight = null;
59587
59981
  }
59588
59982
  });
59983
+ entry2.inFlight = attempt;
59984
+ return attempt;
59985
+ };
59986
+ const cached = scoutBrokerContextCache.get(cacheKey);
59987
+ if (cached) {
59988
+ if (cached.hasValue) {
59989
+ if (cached.expiresAt <= now && !cached.inFlight) {
59990
+ refresh(cached);
59991
+ }
59992
+ return cached.value;
59993
+ }
59994
+ if (options.waitForInitial === false) {
59995
+ refresh(cached, options.initialRefreshDelayMs);
59996
+ return null;
59997
+ }
59998
+ return refresh(cached);
59999
+ }
60000
+ const entry = {
60001
+ expiresAt: now + SCOUT_BROKER_CONTEXT_CACHE_TTL_MS,
60002
+ value: null,
60003
+ hasValue: false,
60004
+ inFlight: null
60005
+ };
60006
+ scoutBrokerContextCache.set(cacheKey, entry);
60007
+ if (options.waitForInitial === false) {
60008
+ refresh(entry, options.initialRefreshDelayMs);
60009
+ return null;
59589
60010
  }
59590
- return promise;
60011
+ return refresh(entry);
59591
60012
  }
59592
60013
  async function requireScoutBrokerContext(baseUrl = resolveScoutBrokerUrl()) {
59593
60014
  const context = await loadScoutBrokerContext(baseUrl);
@@ -60674,14 +61095,71 @@ function staleFlightActivityPredicate(alias) {
60674
61095
  }
60675
61096
 
60676
61097
  // ../web/server/db/agents.ts
61098
+ var actorCreatedAtExpression = sqlTimestampMsExpression("ac.created_at");
61099
+ var endpointUpdatedAtExpression = sqlTimestampMsExpression("ep.updated_at");
61100
+ var AGENT_ROW_SELECT = `SELECT
61101
+ a.id,
61102
+ a.definition_id,
61103
+ a.node_qualifier,
61104
+ a.workspace_qualifier,
61105
+ a.selector,
61106
+ ac.display_name AS name,
61107
+ ac.handle,
61108
+ ${actorCreatedAtExpression} AS actor_created_at,
61109
+ a.agent_class,
61110
+ a.default_selector,
61111
+ a.wake_policy,
61112
+ a.capabilities_json,
61113
+ a.metadata_json,
61114
+ a.authority_node_id,
61115
+ an.name AS authority_node_name,
61116
+ a.home_node_id,
61117
+ hn.name AS home_node_name,
61118
+ a.owner_id,
61119
+ oa.display_name AS owner_name,
61120
+ oa.handle AS owner_handle,
61121
+ ep.harness,
61122
+ ep.transport,
61123
+ ep.state,
61124
+ ep.project_root,
61125
+ ep.cwd,
61126
+ ep.session_id,
61127
+ ep.metadata_json AS endpoint_metadata_json,
61128
+ ${endpointUpdatedAtExpression} AS updated_at
61129
+ FROM agents a
61130
+ JOIN actors ac ON ac.id = a.id
61131
+ LEFT JOIN nodes an ON an.id = a.authority_node_id
61132
+ LEFT JOIN nodes hn ON hn.id = a.home_node_id
61133
+ LEFT JOIN actors oa ON oa.id = a.owner_id
61134
+ ${LATEST_AGENT_ENDPOINT_JOIN}`;
61135
+ var RECENT_ENDPOINT_AGENT_IDS_WITHOUT_INDEX_SQL = (() => {
61136
+ const endpointUpdatedAtExpression2 = sqlTimestampMsExpression("ep.updated_at");
61137
+ const latestEndpointUpdatedAtExpression = sqlTimestampMsCoalesceExpression("ep2.updated_at");
61138
+ return `SELECT a.id
61139
+ FROM agent_endpoints ep
61140
+ JOIN agents a ON a.id = ep.agent_id
61141
+ JOIN actors ac ON ac.id = a.id
61142
+ WHERE ep.id = (
61143
+ SELECT ep2.id
61144
+ FROM agent_endpoints ep2
61145
+ WHERE ep2.agent_id = a.id
61146
+ ORDER BY ${latestEndpointUpdatedAtExpression} DESC
61147
+ LIMIT 1
61148
+ )
61149
+ AND ${endpointUpdatedAtExpression2} > 0
61150
+ AND ${activeAgentMetadataPredicate("a")}
61151
+ ORDER BY ${endpointUpdatedAtExpression2} DESC, ac.display_name ASC
61152
+ LIMIT ?`;
61153
+ })();
61154
+ 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
61155
  function queryAgentIdsByEndpointSessionId() {
60678
- const endpointUpdatedAtExpression = sqlTimestampMsExpression("ep.updated_at");
61156
+ const endpointUpdatedAtExpression2 = sqlTimestampMsExpression("ep.updated_at");
60679
61157
  const rows = db().prepare(`SELECT a.id, ep.session_id
60680
61158
  FROM agents a
60681
61159
  ${LATEST_AGENT_ENDPOINT_JOIN}
60682
61160
  WHERE ep.session_id IS NOT NULL
60683
61161
  AND ${activeAgentMetadataPredicate("a")}
60684
- ORDER BY COALESCE(${endpointUpdatedAtExpression}, 0) ASC`).all();
61162
+ ORDER BY COALESCE(${endpointUpdatedAtExpression2}, 0) ASC`).all();
60685
61163
  const map = new Map;
60686
61164
  for (const row of rows) {
60687
61165
  const sessionId = row.session_id.trim();
@@ -60865,8 +61343,8 @@ function queryFleetAskRows(requesterIds, limit) {
60865
61343
  ep.state AS endpoint_state,
60866
61344
  cr.title AS work_title,
60867
61345
  cr.summary AS work_summary,
61346
+ cr.kind AS record_kind,
60868
61347
  cr.state AS work_state,
60869
- cr.acceptance_state,
60870
61348
  cr.next_move_owner_id,
60871
61349
  cr.updated_at AS work_updated_at
60872
61350
  FROM invocations inv
@@ -60928,7 +61406,8 @@ function projectFleetAsk(row, requesterIdSet) {
60928
61406
  const queuedUntilOnline = queuedFlight && row.dispatch_outcome_status === "queued_until_online";
60929
61407
  const staleActiveFlight = hasFlight && row.flight_state !== null && !TERMINAL_FLIGHT_STATES.has(row.flight_state) && isStaleActiveFlight(row.started_at, row.created_at);
60930
61408
  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");
61409
+ 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);
61410
+ const awaitingOperator = attentionEligibleState && Boolean(row.next_move_owner_id && requesterIdSet.has(row.next_move_owner_id));
60932
61411
  const updatedAt = normalizeTimestampMs(row.status_ts ?? row.completed_at ?? row.started_at ?? row.work_updated_at ?? row.created_at) ?? Date.now();
60933
61412
  const dismissedAt = normalizeTimestampMs(row.flight_dismissed_at);
60934
61413
  const recoveredAfterFailureAt = normalizeTimestampMs(row.recovered_after_failure_at);
@@ -60941,10 +61420,10 @@ function projectFleetAsk(row, requesterIdSet) {
60941
61420
  status = queuedUntilOnline ? "failed" : "queued";
60942
61421
  } else if (isActiveFlight) {
60943
61422
  status = "working";
60944
- } else if (awaitingOperator) {
60945
- status = "needs_attention";
60946
61423
  } else if (failed || staleActiveFlight) {
60947
61424
  status = "failed";
61425
+ } else if (awaitingOperator) {
61426
+ status = "needs_attention";
60948
61427
  } else {
60949
61428
  status = "completed";
60950
61429
  }
@@ -60988,34 +61467,7 @@ function queryFleetAttentionRows(requesterIds, limit) {
60988
61467
  (cr.kind = 'work_item' AND cr.state IN ('open', 'working', 'waiting', 'review'))
60989
61468
  OR (cr.kind = 'question' AND cr.state IN ('open', 'answered'))
60990
61469
  )
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
- )
61470
+ AND cr.next_move_owner_id IN (${requesterClause})
61019
61471
  AND NOT EXISTS (
61020
61472
  SELECT 1
61021
61473
  FROM collaboration_events dismissed
@@ -61088,7 +61540,7 @@ function resolveAgentConversationId(agentId) {
61088
61540
  return recent?.conversation_id ?? null;
61089
61541
  }
61090
61542
  function queryMobileAgentDetail(agentId) {
61091
- const endpointUpdatedAtExpression = sqlTimestampMsExpression("ep.updated_at");
61543
+ const endpointUpdatedAtExpression2 = sqlTimestampMsExpression("ep.updated_at");
61092
61544
  const row = db().prepare(`SELECT
61093
61545
  a.id,
61094
61546
  ac.display_name,
@@ -61102,7 +61554,7 @@ function queryMobileAgentDetail(agentId) {
61102
61554
  ep.project_root,
61103
61555
  ep.cwd,
61104
61556
  ep.session_id,
61105
- ${endpointUpdatedAtExpression} AS updated_at
61557
+ ${endpointUpdatedAtExpression2} AS updated_at
61106
61558
  FROM agents a
61107
61559
  JOIN actors ac ON ac.id = a.id
61108
61560
  ${LATEST_AGENT_ENDPOINT_JOIN}
@@ -61246,7 +61698,7 @@ init_pi_rpc();
61246
61698
  init_system_probes();
61247
61699
  import { createHash as createHash6 } from "crypto";
61248
61700
  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";
61701
+ import { open, readdir as readdir4, stat as stat6 } from "fs/promises";
61250
61702
  import { homedir as homedir33 } from "os";
61251
61703
  import { dirname as dirname21, join as join41 } from "path";
61252
61704
  import { createInterface as createInterface2 } from "readline";
@@ -61254,6 +61706,10 @@ import { Database as Database3 } from "bun:sqlite";
61254
61706
  var CACHE_TTL_MS = 60 * 1000;
61255
61707
  var WEEK_MS = 7 * 24 * 3600 * 1000;
61256
61708
  var CODEX_LOOKBACK_DAYS = 3;
61709
+ var CODEX_JSONL_TAIL_MAX_BYTES = 2 * 1024 * 1024;
61710
+ var CODEX_INITIAL_FILE_LIMIT = 32;
61711
+ var CODEX_RECENT_CANDIDATE_LIMIT = 64;
61712
+ var CODEX_JSONL_READ_CONCURRENCY = 8;
61257
61713
  var LOCAL_QUOTA_FRESH_MS = 2 * 60 * 1000;
61258
61714
  var REMOTE_QUOTA_FRESH_MS = 5 * 60 * 1000;
61259
61715
  var GH_CLI_TIMEOUT_MS = 4000;
@@ -61352,12 +61808,14 @@ async function loadCodexGauge(forceRefresh = false) {
61352
61808
  const root = join41(homeDir(), ".codex", "sessions");
61353
61809
  if (!existsSync35(root))
61354
61810
  return fallback2;
61355
- const recent = findRecentCodexJsonl(root, CODEX_LOOKBACK_DAYS);
61356
- if (recent.length === 0)
61811
+ const candidates = await findRecentCodexJsonl(root, CODEX_LOOKBACK_DAYS);
61812
+ if (candidates.length === 0)
61357
61813
  return fallback2;
61358
- const observations = (await Promise.all(recent.map((path2) => readLatestCodexRateLimits(path2)))).flat().sort((left, right) => left.capturedAt - right.capturedAt);
61814
+ const observations = (await harvestRecentCodexRateLimits(candidates)).sort((left, right) => left.capturedAt - right.capturedAt);
61359
61815
  if (observations.length === 0)
61360
61816
  return fallback2;
61817
+ if (!observations.some(isCodexAccountPoolObservation))
61818
+ return fallback2;
61361
61819
  const snapshots = bindingCodexPoolSnapshots(observations.flatMap((observation) => codexQuotaSnapshotsFromObservation(observation.usage, observation.capturedAt)));
61362
61820
  persistQuotaSnapshots(snapshots);
61363
61821
  const persisted = loadPersistedProviderQuotaGauge({
@@ -61414,9 +61872,11 @@ function bindingCodexPoolSnapshots(snapshots) {
61414
61872
  const usedPercent = quotaSnapshotUsage(row)?.fill;
61415
61873
  if (usedPercent === undefined)
61416
61874
  continue;
61875
+ const poolId = poolIdOf(row);
61876
+ const accountPool = isCodexAccountPoolId(poolId);
61417
61877
  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 });
61878
+ if (!best || usedPercent > best.usedPercent || usedPercent === best.usedPercent && accountPool && !best.accountPool || usedPercent === best.usedPercent && accountPool === best.accountPool && row.capturedAt > best.capturedAt) {
61879
+ bindingPoolByLabel.set(row.label, { poolId, usedPercent, capturedAt: row.capturedAt, accountPool });
61420
61880
  }
61421
61881
  }
61422
61882
  return snapshots.filter((row) => bindingPoolByLabel.get(row.label)?.poolId === poolIdOf(row));
@@ -61433,37 +61893,83 @@ function formatQuotaWindowLabel(windowMinutes, fallback2) {
61433
61893
  }
61434
61894
  return `${windowMinutes}m`;
61435
61895
  }
61436
- function findRecentCodexJsonl(root, lookbackDays) {
61896
+ async function findRecentCodexJsonl(root, lookbackDays) {
61437
61897
  const cutoffMs = Date.now() - lookbackDays * 86400 * 1000;
61438
61898
  const paths2 = [];
61439
- const walk = (dir) => {
61899
+ const pending = [root];
61900
+ while (pending.length > 0) {
61901
+ const dir = pending.pop();
61902
+ if (!dir)
61903
+ continue;
61440
61904
  let entries;
61441
61905
  try {
61442
- entries = readdirSync5(dir, { withFileTypes: true });
61906
+ entries = await readdir4(dir, { withFileTypes: true });
61443
61907
  } catch {
61444
- return;
61908
+ continue;
61445
61909
  }
61446
61910
  for (const entry of entries) {
61447
61911
  const full = join41(dir, entry.name);
61448
61912
  if (entry.isDirectory()) {
61449
- walk(full);
61913
+ pending.push(full);
61450
61914
  } 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 });
61915
+ try {
61916
+ const fileStat = await stat6(full);
61917
+ if (fileStat.mtimeMs < cutoffMs)
61918
+ continue;
61919
+ paths2.push({ path: full, mtimeMs: fileStat.mtimeMs });
61920
+ } catch {}
61455
61921
  }
61456
61922
  }
61457
- };
61458
- walk(root);
61459
- return paths2.sort((left, right) => right.mtimeMs - left.mtimeMs).map((entry) => entry.path);
61923
+ }
61924
+ return paths2.sort((left, right) => right.mtimeMs - left.mtimeMs).slice(0, CODEX_RECENT_CANDIDATE_LIMIT);
61925
+ }
61926
+ async function harvestRecentCodexRateLimits(candidates) {
61927
+ const observations = await readCodexCandidateBatch(candidates.slice(0, CODEX_INITIAL_FILE_LIMIT));
61928
+ if (observations.some(isCodexAccountPoolObservation))
61929
+ return observations;
61930
+ const overflow = candidates.slice(CODEX_INITIAL_FILE_LIMIT, CODEX_RECENT_CANDIDATE_LIMIT);
61931
+ for (let index2 = 0;index2 < overflow.length; index2 += CODEX_JSONL_READ_CONCURRENCY) {
61932
+ observations.push(...await readCodexCandidateBatch(overflow.slice(index2, index2 + CODEX_JSONL_READ_CONCURRENCY)));
61933
+ if (observations.some(isCodexAccountPoolObservation))
61934
+ break;
61935
+ }
61936
+ return observations;
61937
+ }
61938
+ async function readCodexCandidateBatch(candidates) {
61939
+ return (await Promise.all(candidates.map(async (candidate) => {
61940
+ try {
61941
+ return await readLatestCodexRateLimits(candidate.path);
61942
+ } catch {
61943
+ return [];
61944
+ }
61945
+ }))).flat();
61946
+ }
61947
+ function isCodexAccountPoolObservation(observation) {
61948
+ return isCodexAccountPoolId(observation.usage.limitId);
61949
+ }
61950
+ function isCodexAccountPoolId(limitId) {
61951
+ const normalized = limitId?.trim().toLowerCase();
61952
+ return !normalized || normalized === "codex";
61460
61953
  }
61461
61954
  async function readLatestCodexRateLimits(path2) {
61462
61955
  const handle = await open(path2, "r");
61463
61956
  try {
61464
- const rl = createInterface2({ input: handle.createReadStream({ encoding: "utf8" }) });
61957
+ const fileStat = await handle.stat();
61958
+ const start = Math.max(0, fileStat.size - CODEX_JSONL_TAIL_MAX_BYTES);
61959
+ const rl = createInterface2({
61960
+ input: handle.createReadStream({
61961
+ encoding: "utf8",
61962
+ start,
61963
+ autoClose: false
61964
+ })
61965
+ });
61465
61966
  const latestByPool = new Map;
61967
+ let firstLine = start > 0;
61466
61968
  for await (const line of rl) {
61969
+ if (firstLine) {
61970
+ firstLine = false;
61971
+ continue;
61972
+ }
61467
61973
  if (!line.includes('"rate_limits"'))
61468
61974
  continue;
61469
61975
  try {
@@ -61540,8 +62046,8 @@ function loadClaudeStatuslineQuotaSnapshots() {
61540
62046
  }
61541
62047
  function readClaudeStatuslineHistory(minCapturedAt) {
61542
62048
  const path2 = join41(claudeStatuslineDir(), "claude-history.jsonl");
61543
- const stat6 = safeStat(path2);
61544
- if (!stat6)
62049
+ const stat7 = safeStat(path2);
62050
+ if (!stat7)
61545
62051
  return [];
61546
62052
  let content;
61547
62053
  try {
@@ -61549,7 +62055,7 @@ function readClaudeStatuslineHistory(minCapturedAt) {
61549
62055
  } catch {
61550
62056
  return [];
61551
62057
  }
61552
- if (stat6.size > CLAUDE_STATUSLINE_HISTORY_MAX_BYTES) {
62058
+ if (stat7.size > CLAUDE_STATUSLINE_HISTORY_MAX_BYTES) {
61553
62059
  content = content.slice(-CLAUDE_STATUSLINE_HISTORY_MAX_BYTES);
61554
62060
  const firstNewline = content.indexOf(`
61555
62061
  `);
@@ -62128,11 +62634,11 @@ async function loadGrokGauge() {
62128
62634
  }
62129
62635
  async function loadGrokBillingQuotaSnapshots() {
62130
62636
  const path2 = join41(homeDir(), ".grok", "logs", "unified.jsonl");
62131
- const stat6 = safeStat(path2);
62132
- if (!stat6 || stat6.size <= 0)
62637
+ const stat7 = safeStat(path2);
62638
+ if (!stat7 || stat7.size <= 0)
62133
62639
  return [];
62134
- const length = Math.min(stat6.size, GROK_BILLING_LOG_MAX_BYTES);
62135
- const start = Math.max(0, stat6.size - length);
62640
+ const length = Math.min(stat7.size, GROK_BILLING_LOG_MAX_BYTES);
62641
+ const start = Math.max(0, stat7.size - length);
62136
62642
  let content = "";
62137
62643
  let handle;
62138
62644
  try {
@@ -62659,11 +63165,13 @@ function persistQuotaSnapshots(snapshots) {
62659
63165
  return;
62660
63166
  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
63167
  };
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);
63168
+ writer.transaction(() => {
63169
+ for (const snapshot of snapshots) {
63170
+ writeSnapshot(quotaSnapshotId(snapshot), snapshot, snapshot.metadata);
63171
+ writeSnapshot(quotaHistorySnapshotId(snapshot), snapshot, quotaHistoryMetadata(snapshot));
63172
+ }
63173
+ pruneHistory.run(createdAt - QUOTA_HISTORY_LOOKBACK_MS - QUOTA_HISTORY_BUCKET_MS2);
63174
+ })();
62667
63175
  } catch {}
62668
63176
  }
62669
63177
  function quotaSnapshotMayReplace(existing, incoming) {
@@ -65834,8 +66342,8 @@ async function handleRPCInner(bridge, req, rpcContext = {}) {
65834
66342
  }
65835
66343
  const root = resolveWorkspaceRoot(configuredRoot);
65836
66344
  const projectPath = resolveWorkspacePath(root, p.path);
65837
- const stat6 = statSync13(projectPath);
65838
- if (!stat6.isDirectory()) {
66345
+ const stat7 = statSync13(projectPath);
66346
+ if (!stat7.isDirectory()) {
65839
66347
  return { id: req.id, error: { code: -32000, message: "Workspace target is not a directory" } };
65840
66348
  }
65841
66349
  const adapterType = p.adapter ?? "claude-code";
@@ -66305,8 +66813,8 @@ function listDirectories(dirPath) {
66305
66813
  continue;
66306
66814
  const fullPath = join46(dirPath, name2);
66307
66815
  try {
66308
- const stat6 = statSync13(fullPath);
66309
- if (!stat6.isDirectory())
66816
+ const stat7 = statSync13(fullPath);
66817
+ if (!stat7.isDirectory())
66310
66818
  continue;
66311
66819
  const children = new Set(readdirSync6(fullPath));
66312
66820
  const markers = [];
@@ -80941,8 +81449,8 @@ function listDirectories2(dirPath) {
80941
81449
  continue;
80942
81450
  const fullPath = join47(dirPath, name2);
80943
81451
  try {
80944
- const stat6 = statSync14(fullPath);
80945
- if (!stat6.isDirectory())
81452
+ const stat7 = statSync14(fullPath);
81453
+ if (!stat7.isDirectory())
80946
81454
  continue;
80947
81455
  const children = new Set(readdirSync7(fullPath));
80948
81456
  const markers = [];
@@ -81619,8 +82127,8 @@ var workspaceRouter = t.router({
81619
82127
  }
81620
82128
  const root = resolveWorkspaceRoot2(configuredRoot);
81621
82129
  const projectPath = resolveWorkspacePath2(root, input.path);
81622
- const stat6 = statSync14(projectPath);
81623
- if (!stat6.isDirectory()) {
82130
+ const stat7 = statSync14(projectPath);
82131
+ if (!stat7.isDirectory()) {
81624
82132
  throw new TRPCError({
81625
82133
  code: "BAD_REQUEST",
81626
82134
  message: "Workspace target is not a directory"