@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.
- package/bin/scout +26 -10
- package/bin/scoutd +0 -0
- package/dist/build-manifest.json +3 -3
- package/dist/client/assets/{ActivityScreen--eANwuxa.js → ActivityScreen-BnoaUkVZ.js} +1 -1
- package/dist/client/assets/{AddProjectForm-CcD6qvV8.js → AddProjectForm-IqOtJfRs.js} +1 -1
- package/dist/client/assets/{AgentAvatar-CYhf6twS.js → AgentAvatar-6-KBVKUu.js} +1 -1
- package/dist/client/assets/{AgentConfigurationScreen-BTI24HQX.js → AgentConfigurationScreen-CuZJy07q.js} +1 -1
- package/dist/client/assets/{AgentDefinitionsWorkspace-srmN6-vj.js → AgentDefinitionsWorkspace-Iyl4BesU.js} +1 -1
- package/dist/client/assets/{AgentDetailCard-UqPNpcvB.js → AgentDetailCard-C9rn3Fj5.js} +1 -1
- package/dist/client/assets/{AgentFloorView-XXNgI5Cj.js → AgentFloorView-YT-Jjccf.js} +1 -1
- package/dist/client/assets/{AgentInfoScreen-CimdOnZ9.js → AgentInfoScreen-Dr99gQEZ.js} +1 -1
- package/dist/client/assets/{AgentLaneCard-Z-aOBR3W.js → AgentLaneCard-DI2iW9zO.js} +1 -1
- package/dist/client/assets/{AgentLaneChrome-CyhA1reW.js → AgentLaneChrome-D8bARHMx.js} +1 -1
- package/dist/client/assets/{AgentLaneDetailSheet-BNzjMjIH.js → AgentLaneDetailSheet-52un7dKC.js} +1 -1
- package/dist/client/assets/{AgentLaneSummaryResize-Box8-_rS.js → AgentLaneSummaryResize-CEBjmPTa.js} +1 -1
- package/dist/client/assets/AgentLanesEmbedScreen-Dgcm7zd_.js +1 -0
- package/dist/client/assets/AgentLanesPreflight-q20mTjms.js +1 -0
- package/dist/client/assets/AgentLanesView-CetZZDyF.js +2 -0
- package/dist/client/assets/{AgentLiveActions-BwuzOE8h.js → AgentLiveActions-DrEJDJef.js} +1 -1
- package/dist/client/assets/AgentMasterScreen-DJPnstoD.js +1 -0
- package/dist/client/assets/{AgentSessions-CsZwoukw.js → AgentSessions-DCPCG4xb.js} +1 -1
- package/dist/client/assets/{AgentsConsole-KCao4XmX.js → AgentsConsole-CsYOoFJi.js} +1 -1
- package/dist/client/assets/{AgentsScreen-CtPAmwRX.js → AgentsScreen-k8LvBuU_.js} +1 -1
- package/dist/client/assets/AgentsSubnav-C4xpQhsv.js +1 -0
- package/dist/client/assets/{AstronautSuit-Ckx7lu7G.js → AstronautSuit-DbjQtfD_.js} +1 -1
- package/dist/client/assets/{AtopView-DYlpgEHf.js → AtopView-Daq_ob3z.js} +1 -1
- package/dist/client/assets/{BackToPicker-4JaeRvDm.js → BackToPicker-CXZjBRAe.js} +1 -1
- package/dist/client/assets/{BriefingDetailScreen-D6-xqrpo.js → BriefingDetailScreen-CUCXO-KH.js} +1 -1
- package/dist/client/assets/{BriefingsScreen-DKxSDEmk.js → BriefingsScreen-B5oMTGKv.js} +1 -1
- package/dist/client/assets/{BrokerMetadataPanel-BbREmsbK.js → BrokerMetadataPanel-BsiU8lTD.js} +1 -1
- package/dist/client/assets/{BrokerScreen-fbPIouMw.js → BrokerScreen-BPbOHhCS.js} +1 -1
- package/dist/client/assets/{CastPicker-BcA2vDDV.js → CastPicker-_5E5hNUe.js} +1 -1
- package/dist/client/assets/ChatCollapsedStrip-D-eXhzPf.js +1 -0
- package/dist/client/assets/{CodeDiffPane-Cn8Y9hAt.js → CodeDiffPane-n7W4iGUG.js} +1 -1
- package/dist/client/assets/{CodeProjectPicker-nPFktrco.js → CodeProjectPicker-CMsbSTDq.js} +1 -1
- package/dist/client/assets/{CodeScreen-BlAxtxE5.js → CodeScreen-CeuO3EhR.js} +1 -1
- package/dist/client/assets/{ConversationComposer-2HjbGPL9.js → ConversationComposer-CXPKx86g.js} +1 -1
- package/dist/client/assets/{ConversationFeedRows-C6wUqJrx.js → ConversationFeedRows-WrH-YI3L.js} +1 -1
- package/dist/client/assets/{ConversationHeader-C8vfXaTF.js → ConversationHeader-BQWzGzLK.js} +1 -1
- package/dist/client/assets/{ConversationPanels-CNCIbpqU.js → ConversationPanels-Dujvnmup.js} +2 -2
- package/dist/client/assets/ConversationScreen-CR9pWB65.js +2 -0
- package/dist/client/assets/{ConversationStatus-DZuyKsWN.js → ConversationStatus-DVzSb2Hv.js} +1 -1
- package/dist/client/assets/{CrewAvatar-CTIuxp4G.js → CrewAvatar-BwXjyg8N.js} +1 -1
- package/dist/client/assets/CrewWorkspaces-CkQDhyie.css +1 -0
- package/dist/client/assets/CrewWorkspaces-NKujRzwh.js +1 -0
- package/dist/client/assets/{DataTable-6IDhanr5.js → DataTable-Bp8tU9AK.js} +1 -1
- package/dist/client/assets/{DispatchAftermath-DC1u9itO.js → DispatchAftermath-B-6rmXzL.js} +1 -1
- package/dist/client/assets/{DocumentFocusViewer-DZVhS7as.js → DocumentFocusViewer-Do3wQ_3Z.js} +1 -1
- package/dist/client/assets/{EmbeddableSurfacesLab-BKUFJMCV.js → EmbeddableSurfacesLab-C1orRyP9.js} +1 -1
- package/dist/client/assets/{EmptyState-CeBl0iGd.js → EmptyState-CJzXj1l5.js} +1 -1
- package/dist/client/assets/{FileViewerPane-DQlpNt2S.js → FileViewerPane-Df6VzXjA.js} +1 -1
- package/dist/client/assets/FlightObserveScreen-6mGnmWQA.js +1 -0
- package/dist/client/assets/{FollowScreen-BXHOp3gb.js → FollowScreen-DvnxYLVh.js} +1 -1
- package/dist/client/assets/{HarnessMark-D5CA5uSp.js → HarnessMark-B979GCSB.js} +1 -1
- package/dist/client/assets/{HarnessesScreen-DhFXq1qz.js → HarnessesScreen-CHTuv8p6.js} +1 -1
- package/dist/client/assets/{HerdrSession-BRhs5LIR.js → HerdrSession-B3McuYgi.js} +1 -1
- package/dist/client/assets/{HomeHero-DMABJuze.js → HomeHero-CdUVPjkG.js} +1 -1
- package/dist/client/assets/{HostAdvisorView-RAociATV.js → HostAdvisorView-Bok5Sk5c.js} +1 -1
- package/dist/client/assets/{KnowledgeSearchInspector-CZPyVNSw.js → KnowledgeSearchInspector-B7XSoJsu.js} +1 -1
- package/dist/client/assets/{KnowledgeSearchScreen-mGTKIg00.js → KnowledgeSearchScreen-D3o3IODW.js} +1 -1
- package/dist/client/assets/{LaneToolHoverCard-D_DMlBeT.js → LaneToolHoverCard-HByf2ndx.js} +1 -1
- package/dist/client/assets/{LaneTraceDetailSheet-BEHg3LmH.js → LaneTraceDetailSheet-BUgHz-sd.js} +1 -1
- package/dist/client/assets/{LaneTraceEventFocus-DVimcizS.js → LaneTraceEventFocus-DM-hoPxG.js} +1 -1
- package/dist/client/assets/{MeshCanvas-BOuZx4AM.js → MeshCanvas-DCLJRsBy.js} +1 -1
- package/dist/client/assets/{MeshCanvasMinimap-wL-1N94e.js → MeshCanvasMinimap-cEFS9eW7.js} +1 -1
- package/dist/client/assets/{MeshScreen-DMY9Bmh5.js → MeshScreen-BcxPkhm6.js} +1 -1
- package/dist/client/assets/{MeshTopologyView-DiDcX5f4.js → MeshTopologyView-CCRPd8PU.js} +2 -2
- package/dist/client/assets/MessagesScreen-Bb5l13MO.js +1 -0
- package/dist/client/assets/{MissionContextRail-DrNKXG5u.js → MissionContextRail-DF0_kiU7.js} +1 -1
- package/dist/client/assets/{MissionControlView-ByBlHVN8.js → MissionControlView-E3V7bENU.js} +1 -1
- package/dist/client/assets/{MissionFocusOverlay-D1i6R6Zt.js → MissionFocusOverlay-h15sQFvP.js} +1 -1
- package/dist/client/assets/{MissionLeftAgentRow-DN9NcCML.js → MissionLeftAgentRow-KPdk9rSa.js} +1 -1
- package/dist/client/assets/{MissionLogPane-DSeIv3Xo.js → MissionLogPane-BbdDKjUl.js} +1 -1
- package/dist/client/assets/{NewAgentModal-V7yK6J6j.js → NewAgentModal-DfHxad34.js} +1 -1
- package/dist/client/assets/NewChatComposer-_Stj0fZy.js +19 -0
- package/dist/client/assets/{NewChatOrigin-DdpzE4kz.js → NewChatOrigin-B1u7ki70.js} +1 -1
- package/dist/client/assets/{ObserveEmbedScreen-l_Q3ts2q.js → ObserveEmbedScreen-Co0xTii6.js} +1 -1
- package/dist/client/assets/{ObserveTextFlow-BSEtYTxU.js → ObserveTextFlow-ZQWwrK3i.js} +2 -2
- package/dist/client/assets/{ObservedTopologyPanel-CdGUXxGR.js → ObservedTopologyPanel-BJUhDSuQ.js} +1 -1
- package/dist/client/assets/{OpenScoutAppShell-DN8dOSK4.js → OpenScoutAppShell-CUd2yOLu.js} +25 -25
- package/dist/client/assets/{OpsAgentsView-ntGr4pz4.js → OpsAgentsView-DI5wu1si.js} +1 -1
- package/dist/client/assets/OpsScreen-D8fQafCl.js +1 -0
- package/dist/client/assets/OpsSubnav-1K4Jaf__.js +1 -0
- package/dist/client/assets/ProjectAgentProfile-Bdjd_dAx.js +1 -0
- package/dist/client/assets/{ProjectAgentProfileBar-BQET-qrY.js → ProjectAgentProfileBar-k2QHHHsQ.js} +1 -1
- package/dist/client/assets/{ProjectAgentProfileHero-Ck8mThtx.js → ProjectAgentProfileHero-Bpxk1ui2.js} +1 -1
- package/dist/client/assets/ProjectsInbox-C_bMHLCc.js +2 -0
- package/dist/client/assets/ProjectsRail-J-aH_pxT.js +1 -0
- package/dist/client/assets/ProjectsScreen-cVUkGbPz.js +1 -0
- package/dist/client/assets/ProjectsThreadAside-_ourdM-Q.js +1 -0
- package/dist/client/assets/{Provider-B2xuo3rf.js → Provider-CtXJeLrP.js} +1 -1
- package/dist/client/assets/{RailRow-B-GycCBx.js → RailRow-CEH2MFBw.js} +1 -1
- package/dist/client/assets/{RawSessionsTable-AQThi6sm.js → RawSessionsTable-CDyrom-F.js} +1 -1
- package/dist/client/assets/RealtimeVoiceScreen-DBl3DN1H.js +1 -0
- package/dist/client/assets/{RepoDiffEmbedScreen-DXWoRF_c.js → RepoDiffEmbedScreen-kY2pHjIs.js} +1 -1
- package/dist/client/assets/{RepoDiffPageScreen-D_274ExO.js → RepoDiffPageScreen-C6LhoKrn.js} +1 -1
- package/dist/client/assets/{RepoDiffViewer-DbedmHDX.js → RepoDiffViewer-BhcIIQQg.js} +1 -1
- package/dist/client/assets/{RepoDiffViewerLazy-C0--fPtk.js → RepoDiffViewerLazy-Csy_j9LD.js} +2 -2
- package/dist/client/assets/{ReposScreen-D39_YG4H.js → ReposScreen-B_cB0zu7.js} +1 -1
- package/dist/client/assets/ScoutDeckSurface-CSy_fjcG.js +1 -0
- package/dist/client/assets/{ScoutSurface-UsRy0t-I.js → ScoutSurface-CQVcSrin.js} +1 -1
- package/dist/client/assets/{ScoutbotFxLab-Fmdfboxs.js → ScoutbotFxLab-DqGiLYNy.js} +1 -1
- package/dist/client/assets/{SecondaryNav-o2RL9H8H.js → SecondaryNav-BR4VRdgh.js} +1 -1
- package/dist/client/assets/SessionEmbedScreen-BTlZ9gAg.js +1 -0
- package/dist/client/assets/{SessionObserve-Dsd0j05N.js → SessionObserve-dQDN23pP.js} +1 -1
- package/dist/client/assets/{SessionObserveEvidence-DopQYDkD.js → SessionObserveEvidence-BRBGKAgd.js} +1 -1
- package/dist/client/assets/SessionRefScreen-COVQMbtE.js +1 -0
- package/dist/client/assets/SessionsScreen--5OJ3p3v.js +1 -0
- package/dist/client/assets/{SettingsDrawer-_AwuopMS.js → SettingsDrawer-RGVK_bmE.js} +1 -1
- package/dist/client/assets/{SettingsScreen-Cw4DDfJP.js → SettingsScreen-CCxzy5IU.js} +1 -1
- package/dist/client/assets/{ShikiPane-BfHc_3pM.js → ShikiPane-DYI9Hkge.js} +1 -1
- package/dist/client/assets/{SlidePanel-C-q7XwTa.js → SlidePanel-B9ugxWgA.js} +1 -1
- package/dist/client/assets/{SpriteAvatar-Bs68ZENy.js → SpriteAvatar-z5hHesx9.js} +1 -1
- package/dist/client/assets/{StatusPill-ZZQwxB1a.js → StatusPill-BFvMjmZV.js} +1 -1
- package/dist/client/assets/{TailView-Q4FVMsUH.js → TailView-0uEIj2JH.js} +1 -1
- package/dist/client/assets/{Terminal-D7zqHwHV.js → Terminal-DouZeNxc.js} +1 -1
- package/dist/client/assets/{TerminalEmbedScreen-CXIJ7qv6.js → TerminalEmbedScreen-dMNUbzXr.js} +1 -1
- package/dist/client/assets/{TerminalHeaderMount-BnBLOPbb.js → TerminalHeaderMount-BL07cd0q.js} +1 -1
- package/dist/client/assets/{TextDocumentSurface-CKQP-cBT.js → TextDocumentSurface-BflAwXeZ.js} +1 -1
- package/dist/client/assets/{TmuxPeek-V9dGESfO.js → TmuxPeek-BTnjOQi0.js} +1 -1
- package/dist/client/assets/{VoicePermissionsPanel-k7sbLXx2.js → VoicePermissionsPanel-CgQ6GGS-.js} +1 -1
- package/dist/client/assets/{WorkDetailScreen-60p9litn.js → WorkDetailScreen-CaLG-zDs.js} +1 -1
- package/dist/client/assets/{WorkFilesViewer-BjJS7GyM.js → WorkFilesViewer-B9Sil_No.js} +1 -1
- package/dist/client/assets/{activity-Bj3Hnbj3.js → activity-DcrMApUY.js} +1 -1
- package/dist/client/assets/{addon-fit-BL-NTWRU.js → addon-fit-DMVrz5Sv.js} +1 -1
- package/dist/client/assets/{addon-webgl-CIMgmNjg.js → addon-webgl-BYvpZUyu.js} +1 -1
- package/dist/client/assets/{agent-autocomplete-DXlvdc4b.js → agent-autocomplete-B-5QTeas.js} +1 -1
- package/dist/client/assets/{agent-essentials-BOMHR0_U.js → agent-essentials-D7KRGYvF.js} +1 -1
- package/dist/client/assets/{agent-lane-card-model-CTLxf3R4.js → agent-lane-card-model-CNZMPkhc.js} +1 -1
- package/dist/client/assets/{agent-lanes-model-AfrjRNK5.js → agent-lanes-model-DXqjs0OK.js} +2 -2
- package/dist/client/assets/agent-master-I1W-5d-x.css +1 -0
- package/dist/client/assets/agent-master-model-DqjrVI2h.js +1 -0
- package/dist/client/assets/{agent-specialization-BIPIBW8u.js → agent-specialization-BujJVUTD.js} +1 -1
- package/dist/client/assets/{arc.es-IR5r6sj_.js → arc.es-NHqHWohb.js} +1 -1
- package/dist/client/assets/{arrow-down-BydciYFZ.js → arrow-down-CKtSUjmW.js} +1 -1
- package/dist/client/assets/{arrow-left-CghA0kTw.js → arrow-left-Czpf-AE4.js} +1 -1
- package/dist/client/assets/{arrow-right-iJFv3jNh.js → arrow-right-BuzMnLYP.js} +1 -1
- package/dist/client/assets/{arrow-up-right-CCfZXPqD.js → arrow-up-right-C6Wl-1uw.js} +1 -1
- package/dist/client/assets/{bot-B5sub1-i.js → bot-rd0awxD3.js} +1 -1
- package/dist/client/assets/{check-C18YQC90.js → check-ofKUE8yH.js} +1 -1
- package/dist/client/assets/{chevron-down-Mp9mu_yd.js → chevron-down-wciXnOQz.js} +1 -1
- package/dist/client/assets/{chevron-right-CzH-TaSF.js → chevron-right-D-HdlPg8.js} +1 -1
- package/dist/client/assets/{chunk-HRAB3GC3-swV8PA2k.js → chunk-HRAB3GC3-Tyv9rzx7.js} +1 -1
- package/dist/client/assets/{chunk-JTPDIGGW-BKXqcLKw.js → chunk-JTPDIGGW-BC2Mandc.js} +3 -3
- package/dist/client/assets/{chunk-T65CQEWV-vYbNJ8E6.js → chunk-T65CQEWV-C1AWTYZZ.js} +1 -1
- package/dist/client/assets/{chunk-YOZR3KYS-U65yUmqt.js → chunk-YOZR3KYS-DwHPHa6f.js} +1 -1
- package/dist/client/assets/{clock-B4PTFi5m.js → clock-B88r8OrZ.js} +1 -1
- package/dist/client/assets/{code-xml-Jtxsp5d1.js → code-xml-D7pOQM9l.js} +1 -1
- package/dist/client/assets/{compass-0_54-vz3.js → compass-Dt1AMXz2.js} +1 -1
- package/dist/client/assets/content-9K38QchR.js +1 -0
- package/dist/client/assets/content-BRgnyXWh.js +1 -0
- package/dist/client/assets/{content-CHghn-rT.js → content-BWPNyXJ0.js} +1 -1
- package/dist/client/assets/content-BdkI07v3.js +1 -0
- package/dist/client/assets/content-C4oWa8SB.js +1 -0
- package/dist/client/assets/content-C9ijJxyl.js +1 -0
- package/dist/client/assets/content-CFZ4rghn.js +1 -0
- package/dist/client/assets/content-CIqu_Ci_.js +1 -0
- package/dist/client/assets/content-CnJF9DGO.js +1 -0
- package/dist/client/assets/content-CriW8Y8u.js +1 -0
- package/dist/client/assets/content-DDCyPPk_.js +1 -0
- package/dist/client/assets/content-DtcZeh5m.js +1 -0
- package/dist/client/assets/content-U9tsdtle.js +1 -0
- package/dist/client/assets/content-hFLK3CON.js +1 -0
- package/dist/client/assets/{content-DMbawvqU.js → content-nkx0swDe.js} +1 -1
- package/dist/client/assets/content-p00KQrtD.js +1 -0
- package/dist/client/assets/{conversation-icons-BV10B2Me.js → conversation-icons-tp9BX6X2.js} +1 -1
- package/dist/client/assets/{conversation-model-CwF6Y9gx.js → conversation-model-Dc02NsGp.js} +1 -1
- package/dist/client/assets/conversation-motion-features-D9-RmBSq.js +1 -0
- package/dist/client/assets/{copy-Dtpx4FOE.js → copy-CWWAJ75H.js} +1 -1
- package/dist/client/assets/{cpu-BjVis9mc.js → cpu-DrqejfkB.js} +1 -1
- package/dist/client/assets/{createLucideIcon-DXpqZP7I.js → createLucideIcon-DezKXSG2.js} +1 -1
- package/dist/client/assets/{ctx-panel-D_HJ3nhb.css → ctx-panel-F05jXK4Q.css} +1 -1
- package/dist/client/assets/discover-C2CZO4Tk.js +2 -0
- package/dist/client/assets/embed-entry-BSMUykuG.js +2 -0
- package/dist/client/assets/{external-link-Ckiyzjwo.js → external-link-Dp_a2vRZ.js} +1 -1
- package/dist/client/assets/{eye-CpfyvdLq.js → eye-BRyD0jno.js} +1 -1
- package/dist/client/assets/{file-code-corner-7mo7EviR.js → file-code-corner-muIVH_xO.js} +1 -1
- package/dist/client/assets/{file-text-KijGBnME.js → file-text-CqJgwxmv.js} +1 -1
- package/dist/client/assets/{gauge-y-Xg8Mrv.js → gauge-hU--hKVP.js} +1 -1
- package/dist/client/assets/{gestures-Bq9XnSqY.js → gestures-DN4hEeqv.js} +1 -1
- package/dist/client/assets/{git-branch-BQ_x8KZL.js → git-branch-CK5v8F2v.js} +1 -1
- package/dist/client/assets/{home-moving-signal-DtRpiNa0.js → home-moving-signal-BjDtEJUP.js} +1 -1
- package/dist/client/assets/{home-now-card-DFb4GOgM.js → home-now-card-nF8OotI-.js} +1 -1
- package/dist/client/assets/{home-now-card-nano-D--m9jpq.js → home-now-card-nano-C-r_bBg5.js} +1 -1
- package/dist/client/assets/{hooks-9d1SoaQA.js → hooks-D46bABUP.js} +1 -1
- package/dist/client/assets/index-CPrU5q04.js +1 -0
- package/dist/client/assets/{index-CZ-05hKz.js → index-DvLtl7rV.js} +5 -5
- package/dist/client/assets/index-kL1WLbeS.js +1 -0
- package/dist/client/assets/index-zvhpRHao.js +1 -0
- package/dist/client/assets/{inspector-panel-C-EhEDYy.js → inspector-panel-Dkc7rLvY.js} +1 -1
- package/dist/client/assets/{keyboard-nav-DFhAJkW3.js → keyboard-nav-BLYDhL3Z.js} +1 -1
- package/dist/client/assets/{lane-roster-store-gUBsydNf.js → lane-roster-store-DOdI1O13.js} +1 -1
- package/dist/client/assets/{layers-CGou-LwV.js → layers-CSsg3JVP.js} +1 -1
- package/dist/client/assets/{layout-grid-BrZt31QH.js → layout-grid-DOChPJdZ.js} +1 -1
- package/dist/client/assets/left-B-SdEJSJ.js +1 -0
- package/dist/client/assets/{left-B_o51JV6.js → left-B3wSE6ql.js} +1 -1
- package/dist/client/assets/{left-CwHZCGO3.js → left-BNRFiRsb.js} +1 -1
- package/dist/client/assets/{left-DA0amyfu.js → left-BggzhgXN.js} +1 -1
- package/dist/client/assets/left-CARCvvxS.js +2 -0
- package/dist/client/assets/left-CpokZYHt.js +1 -0
- package/dist/client/assets/{left-CwLs0okF.js → left-YT7mIGuH.js} +1 -1
- package/dist/client/assets/{left-advisor-DU3s01gk.js → left-advisor-CCY0vkcO.js} +1 -1
- package/dist/client/assets/left-agents-trhO5sL8.js +1 -0
- package/dist/client/assets/{left-default-uvuvDmt0.js → left-default-CG33elBs.js} +1 -1
- package/dist/client/assets/{left-lanes-DnNLgec8.js → left-lanes-CitMgeTp.js} +1 -1
- package/dist/client/assets/{left-mission-DN3-NLPC.js → left-mission-Zl2m_5eU.js} +1 -1
- package/dist/client/assets/{library-DIo5NiGP.js → library-DkALuCh5.js} +1 -1
- package/dist/client/assets/{loader-circle-BiohlpM3.js → loader-circle-pM56HNhR.js} +1 -1
- package/dist/client/assets/{local-agents-wUIaBcEr.js → local-agents-C8xAhbO5.js} +1 -1
- package/dist/client/assets/{mentions-CcPFMbmZ.js → mentions-DG6OQrsc.js} +1 -1
- package/dist/client/assets/{mesh-buckets-ByyFXdKT.js → mesh-buckets-6y3ZIibI.js} +1 -1
- package/dist/client/assets/{mesh-ops-CvGyjK84.js → mesh-ops-BZ1h5RQs.js} +1 -1
- package/dist/client/assets/{mesh-roster-n2nDpEmA.js → mesh-roster-Bc7T4b7z.js} +1 -1
- package/dist/client/assets/{mesh-view-store-BpxGm71b.js → mesh-view-store-ChUOASK8.js} +1 -1
- package/dist/client/assets/{message-circle-B2ddzBrX.js → message-circle-mZCv8tvB.js} +1 -1
- package/dist/client/assets/{message-markup-RkfmDfME.js → message-markup-C2LQDm_k.js} +1 -1
- package/dist/client/assets/{message-square-D9YYWE0x.js → message-square-C7t_qtuj.js} +1 -1
- package/dist/client/assets/{message-visibility-DwxgcgYK.js → message-visibility-CGOmSSKs.js} +1 -1
- package/dist/client/assets/{mission-control-store-Bf4b54MV.js → mission-control-store-nDLdUZPA.js} +1 -1
- package/dist/client/assets/{observe-CJRIvOCn.js → observe-BpEm1INu.js} +1 -1
- package/dist/client/assets/{page-status-BptpTdQ-.js → page-status-E5jnk48p.js} +1 -1
- package/dist/client/assets/{paperclip-B1UNGl5d.js → paperclip-C64lkcbM.js} +1 -1
- package/dist/client/assets/{persistent-state-YI-WHSCF.js → persistent-state-EHXw8WNy.js} +1 -1
- package/dist/client/assets/{plus-CuU_X0-8.js → plus-Co-dqKul.js} +1 -1
- package/dist/client/assets/{profile-rY8jO38P.js → profile-APxDsN2P.js} +1 -1
- package/dist/client/assets/projects-inbox-Cg4X2lUQ.js +1 -0
- package/dist/client/assets/projects-inbox-DRBl2N85.css +1 -0
- package/dist/client/assets/{proxy-DnLpZIi9.js → proxy-BiW5suC7.js} +1 -1
- package/dist/client/assets/{radio-Dm1ItnA4.js → radio-BOxBQX-T.js} +1 -1
- package/dist/client/assets/{refresh-cw-BRn9Oxxl.js → refresh-cw-DMxGzDwn.js} +1 -1
- package/dist/client/assets/resolve-panes-DeVJbS9c.js +1 -0
- package/dist/client/assets/resolve-sidebar-context-BQe5J6xF.js +1 -0
- package/dist/client/assets/{right-BJltPRnd.js → right-Bmfd3pjP.js} +1 -1
- package/dist/client/assets/{right-Beh3nCUB.js → right-BqI-nr9G.js} +1 -1
- package/dist/client/assets/{right-D3aTKf1F.js → right-BuCgE0fZ.js} +1 -1
- package/dist/client/assets/{right-Shpw_xDy.js → right-BwlW6E57.js} +1 -1
- package/dist/client/assets/{right-CPP7GyOm.js → right-C0ybUw0j.js} +1 -1
- package/dist/client/assets/{right-BbyYdzHn.js → right-CdkcrmeD.js} +1 -1
- package/dist/client/assets/{right-CJnB_Bg7.js → right-CimaAvQN.js} +1 -1
- package/dist/client/assets/{right-C1yumXNx.js → right-CkCCPbCX.js} +1 -1
- package/dist/client/assets/{right-DI1B79nR.js → right-D3eSiy41.js} +1 -1
- package/dist/client/assets/{right-DtsRNX5b.js → right-Dz_xD0Vj.js} +1 -1
- package/dist/client/assets/{rocket-DOwXHKWA.js → rocket-BQm5_CvR.js} +1 -1
- package/dist/client/assets/router-B9vQkNJL.js +1 -0
- package/dist/client/assets/{scope-views-A4_vP97W.js → scope-views-1IYJdl41.js} +1 -1
- package/dist/client/assets/{scout-voice-BhPzrc6P.js → scout-voice-BVUqGhth.js} +1 -1
- package/dist/client/assets/{scoutbot-markdown-jh7tzFB1.js → scoutbot-markdown-BQ_Ee2Ic.js} +1 -1
- package/dist/client/assets/{scroll-text-DO0GQzvN.js → scroll-text-Dze_dXtQ.js} +1 -1
- package/dist/client/assets/{search-D1tJSAWe.js → search-CDko0PKE.js} +1 -1
- package/dist/client/assets/{secondaryNavConfig-B9IF8wXl.js → secondaryNavConfig-BoQ_zYR9.js} +1 -1
- package/dist/client/assets/{selection-bridge-i2S9zpf8.js → selection-bridge-Din6yV3h.js} +1 -1
- package/dist/client/assets/{send-horizontal-CgLppsIC.js → send-horizontal-CSjIm6xg.js} +1 -1
- package/dist/client/assets/{server-Dymv5Emh.js → server-Bzj7lPIx.js} +1 -1
- package/dist/client/assets/{session-catalog-DNaOEzoQ.js → session-catalog-DsaZJXZt.js} +1 -1
- package/dist/client/assets/session-ref-lookup-state-SATH_jAP.js +1 -0
- package/dist/client/assets/{session-table-PTQVoTyc.js → session-table-BQfR7u6r.js} +1 -1
- package/dist/client/assets/{settings-2fC_G9nX.js → settings-Dyvpkb1D.js} +1 -1
- package/dist/client/assets/{sliders-horizontal-BPSMHhbm.js → sliders-horizontal-C8njVwfg.js} +1 -1
- package/dist/client/assets/{sparkles-Dy8p5xN8.js → sparkles-CETYrxGA.js} +1 -1
- package/dist/client/assets/{sse-CiOSzE5n.js → sse-CD9MMUxl.js} +1 -1
- package/dist/client/assets/{tail-events-BMQmSx1n.js → tail-events-Ps8KpKah.js} +1 -1
- package/dist/client/assets/{terminal-yN9xN-h9.js → terminal-9GRS_Qdc.js} +1 -1
- package/dist/client/assets/{terminal-relay-9lhzEp2V.js → terminal-relay-GYMIvKs1.js} +1 -1
- package/dist/client/assets/{terminal-takeover-DANQfTcy.js → terminal-takeover-_Jyys4me.js} +1 -1
- package/dist/client/assets/{text-CnZ0e1-V.js → text-BP3oyl8-.js} +1 -1
- package/dist/client/assets/{text-rLpBg4_z.css → text-BYAFNLNq.css} +1 -1
- package/dist/client/assets/{use-conversation-list-D9BNLfnW.js → use-conversation-list-C9ABzjXI.js} +1 -1
- package/dist/client/assets/use-fleet-active-asks-DAspZQjE.js +1 -0
- package/dist/client/assets/{use-mesh-ops-items-BIvIHlqe.js → use-mesh-ops-items-Dh54ymEp.js} +1 -1
- package/dist/client/assets/{use-reduced-motion-CKkhq9c5.js → use-reduced-motion-x8pJMVrG.js} +1 -1
- package/dist/client/assets/{use-scout-dev-flags-B2KCzPxn.js → use-scout-dev-flags-DhCbiDK3.js} +1 -1
- package/dist/client/assets/{useAgentHoverCard-CHBsxcbp.js → useAgentHoverCard-DoBwV0LX.js} +1 -1
- package/dist/client/assets/useContentSecondaryNav-pZe2Zfk1.js +1 -0
- package/dist/client/assets/{usePierreRuntime-DUuXH5yp.js → usePierreRuntime-ejq9dCWV.js} +1 -1
- package/dist/client/assets/{wrench-YcXMlsh2.js → wrench-DjkoAOQt.js} +1 -1
- package/dist/client/assets/{x-e3h2hDsp.js → x-CAbNespN.js} +1 -1
- package/dist/client/assets/{xterm-Byp1Hep_.js → xterm-Cf-ngcGP.js} +1 -1
- package/dist/client/assets/{zap-nMcjPoWB.js → zap-Cq8eWkcF.js} +1 -1
- package/dist/client/index.html +1 -1
- package/dist/drizzle/0009_old_korg.sql +72 -0
- package/dist/drizzle/0010_sparkling_colonel_america.sql +2 -0
- package/dist/drizzle/0011_funny_onslaught.sql +4 -0
- package/dist/drizzle/0012_high_blazing_skull.sql +16 -0
- package/dist/drizzle/0013_perfect_juggernaut.sql +1 -0
- package/dist/drizzle/0014_legal_meggan.sql +6 -0
- package/dist/drizzle/0015_lame_marvel_boy.sql +12 -0
- package/dist/drizzle/0016_early_goliath.sql +6 -0
- package/dist/drizzle/meta/0009_snapshot.json +6262 -0
- package/dist/drizzle/meta/0010_snapshot.json +6286 -0
- package/dist/drizzle/meta/0011_snapshot.json +6337 -0
- package/dist/drizzle/meta/0012_snapshot.json +6458 -0
- package/dist/drizzle/meta/0013_snapshot.json +6465 -0
- package/dist/drizzle/meta/0014_snapshot.json +6503 -0
- package/dist/drizzle/meta/0015_snapshot.json +6596 -0
- package/dist/drizzle/meta/0016_snapshot.json +6611 -0
- package/dist/drizzle/meta/_journal.json +56 -0
- package/dist/main.mjs +1306 -360
- package/dist/node/main.mjs +314 -12
- package/dist/pairing-runtime-controller.mjs +608 -108
- package/dist/runtime/base-daemon.mjs +30 -3
- package/dist/runtime/broker-daemon.mjs +4771 -529
- package/dist/runtime/broker-process-manager.mjs +23 -2
- package/dist/runtime/mesh-discover.mjs +23 -2
- package/dist/scout-control-plane-web.mjs +1914 -478
- package/package.json +2 -2
- package/dist/client/assets/AgentLanesEmbedScreen-BmLnN4on.js +0 -1
- package/dist/client/assets/AgentLanesPreflight-5B6sXvRB.js +0 -1
- package/dist/client/assets/AgentLanesView-DHyzVBk6.js +0 -2
- package/dist/client/assets/AgentsSubnav-CDMjKeYC.js +0 -1
- package/dist/client/assets/ChatCollapsedStrip-Ycm0ecaX.js +0 -1
- package/dist/client/assets/ConversationScreen-BNULZAp2.js +0 -2
- package/dist/client/assets/CrewWorkspaces-CJhBKVoZ.css +0 -1
- package/dist/client/assets/CrewWorkspaces-CkPYIA46.js +0 -1
- package/dist/client/assets/FlightObserveScreen-CDWGSKZg.js +0 -1
- package/dist/client/assets/MessagesScreen-Eulveud3.js +0 -1
- package/dist/client/assets/NewChatComposer-hlWT-nbR.js +0 -19
- package/dist/client/assets/OpsScreen-Ppen_Lmj.js +0 -1
- package/dist/client/assets/OpsSubnav-GAKsoSor.js +0 -1
- package/dist/client/assets/ProjectAgentProfile-BLlp2e6t.js +0 -1
- package/dist/client/assets/ProjectsInbox-Dlt8OQ8O.js +0 -2
- package/dist/client/assets/ProjectsRail-DCfNMmnW.js +0 -1
- package/dist/client/assets/ProjectsScreen-BP-hmI1m.js +0 -1
- package/dist/client/assets/ProjectsThreadAside-CWpMjGIH.js +0 -1
- package/dist/client/assets/RealtimeVoiceScreen-D7zZHK_t.js +0 -1
- package/dist/client/assets/ScoutDeckSurface-CKT3qdqY.js +0 -1
- package/dist/client/assets/SessionEmbedScreen-RD5XOx7R.js +0 -1
- package/dist/client/assets/SessionRefScreen-B_cTv47v.js +0 -1
- package/dist/client/assets/SessionsScreen-Bq0Z77On.js +0 -1
- package/dist/client/assets/archive-BjcGiAy8.js +0 -1
- package/dist/client/assets/content-6RvWTrtk.js +0 -1
- package/dist/client/assets/content-BCgwMUqz.js +0 -1
- package/dist/client/assets/content-Bf2VLhx0.js +0 -1
- package/dist/client/assets/content-BrU_38-m.js +0 -1
- package/dist/client/assets/content-BvvJN8rN.js +0 -1
- package/dist/client/assets/content-CAeEqYPw.js +0 -1
- package/dist/client/assets/content-CI_Z9DXk.js +0 -1
- package/dist/client/assets/content-CbyKONhW.js +0 -1
- package/dist/client/assets/content-Czogvp43.js +0 -1
- package/dist/client/assets/content-DFk0zNzX.js +0 -1
- package/dist/client/assets/content-DHe4DgkA.js +0 -1
- package/dist/client/assets/content-DTz7cKjo.js +0 -1
- package/dist/client/assets/content-E3kudY-W.js +0 -1
- package/dist/client/assets/content-LpO0aO_U.js +0 -1
- package/dist/client/assets/conversation-motion-features-BKkCRaWR.js +0 -1
- package/dist/client/assets/discover-CHbrEItO.js +0 -2
- package/dist/client/assets/embed-entry-vil28MyU.js +0 -2
- package/dist/client/assets/index-BVlMw8x_.js +0 -1
- package/dist/client/assets/index-Cn0GR-q1.js +0 -1
- package/dist/client/assets/index-DosI4AG9.js +0 -1
- package/dist/client/assets/left-BpgWnaah.js +0 -1
- package/dist/client/assets/left-Cx0kv6pe.js +0 -1
- package/dist/client/assets/left-agents-qL5PpUY-.js +0 -1
- package/dist/client/assets/left-z-6CkuBe.js +0 -2
- package/dist/client/assets/projects-inbox-BBs1hG13.css +0 -1
- package/dist/client/assets/projects-inbox-D-zAb9Gp.js +0 -1
- package/dist/client/assets/resolve-panes-DO6LkwhQ.js +0 -1
- package/dist/client/assets/resolve-sidebar-context-CIF288wY.js +0 -1
- package/dist/client/assets/router-DJj2WbDg.js +0 -1
- package/dist/client/assets/use-fleet-active-asks-BeAdcl09.js +0 -1
- 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-
|
|
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
|
-
|
|
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
|
|
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 =
|
|
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
|
|
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,
|
|
59547
|
-
if (
|
|
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
|
|
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
|
-
|
|
59581
|
-
|
|
59582
|
-
|
|
59583
|
-
|
|
59584
|
-
|
|
59585
|
-
|
|
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
|
-
|
|
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
|
|
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(${
|
|
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
|
|
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
|
|
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
|
-
${
|
|
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
|
|
61356
|
-
if (
|
|
61803
|
+
const candidates = await findRecentCodexJsonl(root, CODEX_LOOKBACK_DAYS);
|
|
61804
|
+
if (candidates.length === 0)
|
|
61357
61805
|
return fallback2;
|
|
61358
|
-
const observations = (await
|
|
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
|
|
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
|
|
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 =
|
|
61898
|
+
entries = await readdir4(dir, { withFileTypes: true });
|
|
61443
61899
|
} catch {
|
|
61444
|
-
|
|
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
|
-
|
|
61905
|
+
pending.push(full);
|
|
61450
61906
|
} else if (entry.isFile() && entry.name.endsWith(".jsonl")) {
|
|
61451
|
-
|
|
61452
|
-
|
|
61453
|
-
|
|
61454
|
-
|
|
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
|
-
|
|
61459
|
-
|
|
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
|
|
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
|
|
61544
|
-
if (!
|
|
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 (
|
|
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
|
|
62132
|
-
if (!
|
|
62629
|
+
const stat7 = safeStat(path2);
|
|
62630
|
+
if (!stat7 || stat7.size <= 0)
|
|
62133
62631
|
return [];
|
|
62134
|
-
const length = Math.min(
|
|
62135
|
-
const start = Math.max(0,
|
|
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
|
-
|
|
62663
|
-
|
|
62664
|
-
|
|
62665
|
-
|
|
62666
|
-
|
|
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
|
|
65838
|
-
if (!
|
|
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
|
|
66309
|
-
if (!
|
|
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
|
|
80945
|
-
if (!
|
|
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
|
|
81623
|
-
if (!
|
|
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"
|