@openscout/scout 0.2.84 → 0.2.86
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/README.md +1 -1
- package/bin/scoutd +0 -0
- package/dist/build-manifest.json +3 -3
- package/dist/client/assets/ActivityScreen-C7AwUogt.js +1 -0
- package/dist/client/assets/{AddProjectForm-Czb5uwou.js → AddProjectForm-BNRpRPod.js} +1 -1
- package/dist/client/assets/AgentAvatar-B1xvQ7ej.js +1 -0
- package/dist/client/assets/AgentConfigurationScreen-BoBQpyz5.js +1 -0
- package/dist/client/assets/AgentDefinitionsWorkspace-rw3vh8Lm.js +1 -0
- package/dist/client/assets/{AgentDetailCard-Biq8b2gv.js → AgentDetailCard-FelCxQrT.js} +1 -1
- package/dist/client/assets/AgentFloorView-Crdw8Uo5.js +1 -0
- package/dist/client/assets/AgentInfoScreen-Cge7HHbV.js +1 -0
- package/dist/client/assets/{AgentLaneCard-C4DMQR-c.js → AgentLaneCard-CRDG74C1.js} +1 -1
- package/dist/client/assets/{AgentLaneChrome-D1xNNf7A.js → AgentLaneChrome-CWFqUdch.js} +1 -1
- package/dist/client/assets/AgentLaneDetailSheet-DCIIg3Zp.js +4 -0
- package/dist/client/assets/{AgentLaneSummaryResize-C9loK-st.js → AgentLaneSummaryResize-yTM4GQAJ.js} +1 -1
- package/dist/client/assets/AgentLanesEmbedScreen-BJLwXSNp.js +1 -0
- package/dist/client/assets/{AgentLanesPreflight-M7iDXdP2.js → AgentLanesPreflight-DJeDRTAN.js} +1 -1
- package/dist/client/assets/AgentLanesView-CbY9qD0z.js +2 -0
- package/dist/client/assets/{AgentLiveActions-0iy8QZ1T.js → AgentLiveActions-Bn3zeZBN.js} +1 -1
- package/dist/client/assets/AgentSessions-czl5zT7A.js +6 -0
- package/dist/client/assets/AgentsConsole-CoT2crwq.js +1 -0
- package/dist/client/assets/{AgentsScreen-Bww6HgFs.js → AgentsScreen-BcPM-z1T.js} +1 -1
- package/dist/client/assets/AgentsSubnav-3_vpn2bT.js +1 -0
- package/dist/client/assets/AstronautSuit-BADl7m8x.js +1 -0
- package/dist/client/assets/{AtopView-h_aFoNkP.js → AtopView-DymBCiXv.js} +1 -1
- package/dist/client/assets/{BackToPicker-BXp5E2ck.js → BackToPicker-CqYhOaLB.js} +1 -1
- package/dist/client/assets/BriefingDetailScreen-DDfZ8ci1.js +1 -0
- package/dist/client/assets/{BriefingsScreen-BTsvr5fv.js → BriefingsScreen-CLvSOJjy.js} +1 -1
- package/dist/client/assets/{BrokerMetadataPanel-jg7odHQp.js → BrokerMetadataPanel-DFAH-NO6.js} +1 -1
- package/dist/client/assets/BrokerScreen-Bkvu92jk.js +5 -0
- package/dist/client/assets/{Canvas-BePL08RR.js → Canvas-KyTsDJlB.js} +1 -1
- package/dist/client/assets/ChatCollapsedStrip-Bjjqa30K.js +1 -0
- package/dist/client/assets/{CodeDiffPane-86odpBSt.js → CodeDiffPane-C9HT1dCT.js} +1 -1
- package/dist/client/assets/{CodeProjectPicker-8svr_S_A.js → CodeProjectPicker-5Y3GvXkM.js} +1 -1
- package/dist/client/assets/{CodeScreen-CJ2RgB32.js → CodeScreen-DpN9kQvm.js} +1 -1
- package/dist/client/assets/ConversationComposer-Ce7Byw48.js +1 -0
- package/dist/client/assets/ConversationFeedRows-DygDfQn_.js +1 -0
- package/dist/client/assets/ConversationHeader-C3sg0ULI.js +1 -0
- package/dist/client/assets/ConversationPanels-Dg4Y2GgX.js +6 -0
- package/dist/client/assets/ConversationScreen-BP5tdz2k.css +1 -0
- package/dist/client/assets/ConversationScreen-CjWWmuuh.js +1 -0
- package/dist/client/assets/ConversationStatus-BhVIYQza.js +1 -0
- package/dist/client/assets/CrewWorkspaces-B6YIyw1z.css +1 -0
- package/dist/client/assets/CrewWorkspaces-CDU-wy1Y.js +1 -0
- package/dist/client/assets/{DataTable-CGw5CECG.js → DataTable-oJP339bX.js} +1 -1
- package/dist/client/assets/{DispatchAftermath-DowTb7uO.js → DispatchAftermath-CH02HAVw.js} +1 -1
- package/dist/client/assets/DocumentFocusViewer-DmtFisY9.js +1 -0
- package/dist/client/assets/{EmbeddableSurfacesLab-CxfJXS2g.js → EmbeddableSurfacesLab-84b9I3fy.js} +1 -1
- package/dist/client/assets/{EmptyState-BUvllvA6.js → EmptyState-BnDda92b.js} +1 -1
- package/dist/client/assets/{FileViewerPane-BM4AD_bo.js → FileViewerPane-Dg7_88pv.js} +1 -1
- package/dist/client/assets/FlightObserveScreen-DL3Xhl0h.js +1 -0
- package/dist/client/assets/{FollowScreen-DG0osbUp.js → FollowScreen-DcFBqr6l.js} +1 -1
- package/dist/client/assets/{HarnessMark-MztYnrGK.js → HarnessMark-DGZ6o6Ct.js} +1 -1
- package/dist/client/assets/{HarnessesScreen-BWqirBjK.js → HarnessesScreen-DTDL-XaA.js} +1 -1
- package/dist/client/assets/{HerdrSession-6sFln7WX.js → HerdrSession-DV2hD6Yh.js} +1 -1
- package/dist/client/assets/HomeHero-7JwycwFY.css +1 -0
- package/dist/client/assets/HomeHero-CENwVZ45.js +1 -0
- package/dist/client/assets/HostAdvisorView-PgiZUkd_.js +1 -0
- package/dist/client/assets/{KnowledgeSearchInspector-BOIhFWd2.js → KnowledgeSearchInspector-DNQjeWZO.js} +1 -1
- package/dist/client/assets/KnowledgeSearchScreen-Bj80IgR0.js +1 -0
- package/dist/client/assets/{LaneToolHoverCard-CcEiQC6B.js → LaneToolHoverCard-197xYmRp.js} +1 -1
- package/dist/client/assets/LaneTraceDetailSheet-BztwvOv9.js +1 -0
- package/dist/client/assets/{LaneTraceEventFocus-Bl9L0EYb.js → LaneTraceEventFocus-C9cmqxnK.js} +1 -1
- package/dist/client/assets/{MeshCanvas-ZjIuMiRo.js → MeshCanvas-C3_2p9B6.js} +2 -2
- package/dist/client/assets/{MeshCanvasMinimap-C-LQtiX6.js → MeshCanvasMinimap-ZTjYWXTZ.js} +1 -1
- package/dist/client/assets/{MeshScreen-Bs3soujg.js → MeshScreen-lJKaOyGB.js} +1 -1
- package/dist/client/assets/{MeshTopologyView-C0LUyT3K.js → MeshTopologyView-CBjHbAZw.js} +2 -2
- package/dist/client/assets/MessagesScreen-D6MVLvdg.js +1 -0
- package/dist/client/assets/{MissionContextRail-CjGAEGu8.js → MissionContextRail-DXkrbcnZ.js} +1 -1
- package/dist/client/assets/MissionControlView-BCH-Zsp4.js +1 -0
- package/dist/client/assets/MissionFocusOverlay-DbAliOSF.js +1 -0
- package/dist/client/assets/MissionLeftAgentRow-Bx6Pg8_O.js +1 -0
- package/dist/client/assets/MissionLogPane-D06c29Y8.js +1 -0
- package/dist/client/assets/{NewAgentModal-D5e0YUAo.js → NewAgentModal-C18Ajovd.js} +1 -1
- package/dist/client/assets/NewChatComposer-Bgqes0UQ.js +19 -0
- package/dist/client/assets/{NewChatOrigin-BEz6jyqf.js → NewChatOrigin-DpHS2Wmt.js} +1 -1
- package/dist/client/assets/ObserveEmbedScreen-Cmhwai4X.js +2 -0
- package/dist/client/assets/ObserveTextFlow-C1f5oize.js +2 -0
- package/dist/client/assets/ObservedTopologyPanel-D85P6RAk.js +2 -0
- package/dist/client/assets/OpenScoutAppShell-IDI4fuUE.js +88 -0
- package/dist/client/assets/OpsAgentsView-yt0JavoB.js +1 -0
- package/dist/client/assets/OpsScreen-C3yNQqJE.js +1 -0
- package/dist/client/assets/OpsSubnav-BijKI3yG.js +1 -0
- package/dist/client/assets/ProjectAgentProfile-DnIeC16r.js +1 -0
- package/dist/client/assets/{ProjectAgentProfileBar-B1VpwzGD.js → ProjectAgentProfileBar-IDEpKZvI.js} +1 -1
- package/dist/client/assets/ProjectAgentProfileHero-Bh_aISs-.js +1 -0
- package/dist/client/assets/ProjectsInbox-B8Srlklk.js +2 -0
- package/dist/client/assets/ProjectsRail-DqAbdvCf.js +1 -0
- package/dist/client/assets/ProjectsScreen-DKHQ2iEv.js +1 -0
- package/dist/client/assets/ProjectsThreadAside-DpkjYLL2.js +1 -0
- package/dist/client/assets/Provider-Ve8yXaWR.js +1 -0
- package/dist/client/assets/RailRow-B0sRaJc6.css +1 -0
- package/dist/client/assets/RailRow-C4GNGR80.js +1 -0
- package/dist/client/assets/RawSessionsTable-Co3vzwsf.js +1 -0
- package/dist/client/assets/RealtimeVoiceScreen-DMd1CBAf.js +9 -0
- package/dist/client/assets/{RepoDiffEmbedScreen-VLg4caej.js → RepoDiffEmbedScreen-C97Euf4s.js} +1 -1
- package/dist/client/assets/{RepoDiffPageScreen-BelnvgnP.js → RepoDiffPageScreen-DUKLzkrW.js} +1 -1
- package/dist/client/assets/RepoDiffViewer-CovKjSgb.js +7 -0
- package/dist/client/assets/RepoDiffViewerLazy-zIiEmh-e.js +2 -0
- package/dist/client/assets/{ReposScreen-IINK-CFn.js → ReposScreen-BR1LqTf1.js} +6 -6
- package/dist/client/assets/ScoutDeckSurface-BGsVicc2.js +1 -0
- package/dist/client/assets/{ScoutSurface-x_QbcRyk.js → ScoutSurface-BMKW7hSu.js} +1 -1
- package/dist/client/assets/{ScoutbotFxLab-7t9JVvZg.js → ScoutbotFxLab-0O2iDRrF.js} +1 -1
- package/dist/client/assets/{SecondaryNav-Dj30epYF.js → SecondaryNav-cYTw2p39.js} +1 -1
- package/dist/client/assets/{SessionEmbedScreen-s2mJ5Fg9.js → SessionEmbedScreen-mNjT0R6j.js} +1 -1
- package/dist/client/assets/{SessionObserve-DaUrJCMq.js → SessionObserve-zAlFbwFn.js} +1 -1
- package/dist/client/assets/{SessionObserveEvidence-ClUW8jpV.js → SessionObserveEvidence-BVawzqoE.js} +1 -1
- package/dist/client/assets/SessionRefScreen-BmKhf29o.js +1 -0
- package/dist/client/assets/SessionsScreen-CsSqjIY2.js +1 -0
- package/dist/client/assets/SettingsDrawer-Dsj-On_x.css +1 -0
- package/dist/client/assets/SettingsDrawer-DwYQTGi8.js +3 -0
- package/dist/client/assets/SettingsScreen-Btaku7YM.js +1 -0
- package/dist/client/assets/{ShikiPane-Dkwyx--r.js → ShikiPane-DyEJdcvb.js} +1 -1
- package/dist/client/assets/{SlidePanel-CuTeirnk.js → SlidePanel-Dg8_styW.js} +1 -1
- package/dist/client/assets/{SpriteAvatar-DQ3PTb8L.js → SpriteAvatar-DMrSssNZ.js} +1 -1
- package/dist/client/assets/{StatusPill-BJ1ierIR.js → StatusPill-NFFnphtx.js} +1 -1
- package/dist/client/assets/{TailView-CufWcrvf.js → TailView-BfObcZu3.js} +2 -2
- package/dist/client/assets/Terminal-Dr-M9U4u.js +1 -0
- package/dist/client/assets/TerminalEmbedScreen-BmyZkonh.js +1 -0
- package/dist/client/assets/{TerminalRelay-rvUzI9Ek.js → TerminalRelay-lJ2KdMCW.js} +3 -3
- package/dist/client/assets/{TextDocumentSurface-Bc-kHPgG.js → TextDocumentSurface-C7fGlzY8.js} +1 -1
- package/dist/client/assets/{TmuxPeek-DLyDkq_D.js → TmuxPeek-BSeKIjnX.js} +1 -1
- package/dist/client/assets/{VoicePermissionsPanel-CD903y9K.js → VoicePermissionsPanel-BkIGTzgw.js} +1 -1
- package/dist/client/assets/{WorkDetailScreen-D51oI0dH.js → WorkDetailScreen-Cwe-KWK4.js} +3 -3
- package/dist/client/assets/WorkFilesViewer-BBtKRBPv.js +1 -0
- package/dist/client/assets/{activity-BvGruxWG.js → activity-D4W2XZY2.js} +1 -1
- package/dist/client/assets/{addon-fit-Cfq4Ayjd.js → addon-fit-Celjj2yn.js} +1 -1
- package/dist/client/assets/{addon-webgl-B8sIf9-s.js → addon-webgl-Cu4tJ21-.js} +1 -1
- package/dist/client/assets/{ScoutbotBroadcastChip-CxtYZWPZ.css → agent-autocomplete-C7xwIcwd.css} +1 -1
- package/dist/client/assets/agent-autocomplete-Dv-_9dAw.js +2 -0
- package/dist/client/assets/{agent-essentials-yb4wIJlX.js → agent-essentials-CngjUhQj.js} +1 -1
- package/dist/client/assets/agent-identity-DzHGhLdJ.js +1 -0
- package/dist/client/assets/{agent-lane-card-model-q4cwzLX4.js → agent-lane-card-model-CSugZCdy.js} +1 -1
- package/dist/client/assets/{agent-lane-detail-BNNm6FNu.js → agent-lane-detail-D5EIlX7_.js} +1 -1
- package/dist/client/assets/{agent-lane-preview-C33Dwpn7.js → agent-lane-preview-BhplDYGf.js} +1 -1
- package/dist/client/assets/{agent-lanes-BDNktFBZ.css → agent-lanes-DlqcEf0l.css} +1 -1
- package/dist/client/assets/{agent-lanes-model-VYQ5a68i.js → agent-lanes-model-BKOs_32K.js} +2 -2
- package/dist/client/assets/agent-specialization-CNrsRbKA.js +1 -0
- package/dist/client/assets/{api-BkjHJfgJ.js → api-BHHEUSS3.js} +1 -1
- package/dist/client/assets/api-DEHEgJ9m.js +1 -0
- package/dist/client/assets/{arc.es-BBTfhvLE.js → arc.es-DNT50Y-_.js} +1 -1
- package/dist/client/assets/archive-DH49QqFG.js +1 -0
- package/dist/client/assets/{arrow-left-BOht-YQu.js → arrow-left-i-h6JAgs.js} +1 -1
- package/dist/client/assets/arrow-right-B0Yi01Zr.js +1 -0
- package/dist/client/assets/{arrow-up-right-hoR8_oUz.js → arrow-up-right-RBC6k8nn.js} +1 -1
- package/dist/client/assets/{bot-BUK7dOPS.js → bot-r2IuAuJd.js} +1 -1
- package/dist/client/assets/broker-display-Q75fupqG.js +2 -0
- package/dist/client/assets/{cache-Dr0why2k.js → cache-BO2Bd_LV.js} +1 -1
- package/dist/client/assets/{check--esHw52j.js → check-Bfs7hMb1.js} +1 -1
- package/dist/client/assets/{chevron-down-NAhBUkFd.js → chevron-down-Da5tV19_.js} +1 -1
- package/dist/client/assets/{chevron-right-C10o7t_X.js → chevron-right-BMqtBds_.js} +1 -1
- package/dist/client/assets/{chunk-HRAB3GC3-DF8R9rPv.js → chunk-HRAB3GC3-BUVYXXAp.js} +1 -1
- package/dist/client/assets/{clock-of01sAB6.js → clock-DaKLp6Xd.js} +1 -1
- package/dist/client/assets/{code-xml-CLn3TDWF.js → code-xml-ByQsfOI_.js} +1 -1
- package/dist/client/assets/collapsed-strip-raJWthAH.css +1 -0
- package/dist/client/assets/compass-BepM5iWH.js +1 -0
- package/dist/client/assets/{content-Cgj5AWqT.js → content-5hnDC9WE.js} +1 -1
- package/dist/client/assets/content-BRFZ-a6m.js +1 -0
- package/dist/client/assets/content-BYykncDo.js +1 -0
- package/dist/client/assets/content-Be6yyWbJ.js +1 -0
- package/dist/client/assets/content-Bgl_X3ao.js +1 -0
- package/dist/client/assets/content-BopJW1Zx.js +1 -0
- package/dist/client/assets/content-Bv2sfg0w.js +1 -0
- package/dist/client/assets/content-CMBiIZTg.js +1 -0
- package/dist/client/assets/content-CPVqvf5o.js +1 -0
- package/dist/client/assets/content-CbwyFqdI.js +1 -0
- package/dist/client/assets/content-ClQjAWYi.js +1 -0
- package/dist/client/assets/content-Cv2tSAbv.js +1 -0
- package/dist/client/assets/content-DFFe3-Ot.js +1 -0
- package/dist/client/assets/content-DY5hwBmm.js +1 -0
- package/dist/client/assets/content-_IXoxGno.js +1 -0
- package/dist/client/assets/content-j_tewJdE.js +1 -0
- package/dist/client/assets/{conversation-icons-ClBJi21l.js → conversation-icons-C4amK8Sa.js} +1 -1
- package/dist/client/assets/conversation-model-CigSPlKA.js +1 -0
- package/dist/client/assets/conversation-motion-features-_95aZx_1.js +1 -0
- package/dist/client/assets/{copy-Dty8ZYsM.js → copy-De4s38o2.js} +1 -1
- package/dist/client/assets/cpu-Bc268H9Q.js +1 -0
- package/dist/client/assets/{createLucideIcon-Bt67PWH-.js → createLucideIcon-DLlxGjKt.js} +1 -1
- package/dist/client/assets/credentials-qwds23lv.js +1 -0
- package/dist/client/assets/ctx-panel-D_HJ3nhb.css +1 -0
- package/dist/client/assets/discover-DOlk1hG7.js +2 -0
- package/dist/client/assets/embed-entry-BqDJfa87.js +2 -0
- package/dist/client/assets/{external-link-Dem738OJ.js → external-link-BGHC_naA.js} +1 -1
- package/dist/client/assets/{eye-B3lBIwJZ.js → eye-BeCSqJn1.js} +1 -1
- package/dist/client/assets/file-code-corner-CX53Cd9y.js +1 -0
- package/dist/client/assets/{file-text-iF0hyVyU.js → file-text-BVhkMWyC.js} +1 -1
- package/dist/client/assets/gauge-CPcEPmNt.js +1 -0
- package/dist/client/assets/gestures-BXIGYk_p.js +1 -0
- package/dist/client/assets/git-branch-q8Ayc8py.js +1 -0
- package/dist/client/assets/home-moving-signal-DMguaRWR.css +1 -0
- package/dist/client/assets/home-moving-signal-Dm2Z2x0p.js +1 -0
- package/dist/client/assets/{home-now-card-nano-hZl9klbP.js → home-now-card-nano-Djhy6ax0.js} +1 -1
- package/dist/client/assets/home-now-card-xU5LGP7q.js +1 -0
- package/dist/client/assets/hooks-CdKx1CxP.js +2 -0
- package/dist/client/assets/host-advisor-B2Fqs5Dd.css +1 -0
- package/dist/client/assets/index-Bli6bTLU.js +10 -0
- package/dist/client/assets/index-D7UEHxaY.js +1 -0
- package/dist/client/assets/index-DFdlQs_c.js +1 -0
- package/dist/client/assets/index-DhfOMK0D.js +1 -0
- package/dist/client/assets/index-DzlEgstl.css +1 -0
- package/dist/client/assets/index-wLwc74Pu.css +1 -0
- package/dist/client/assets/inspector-panel-B8pigRsg.js +2 -0
- package/dist/client/assets/{keyboard-nav-Chf51dns.js → keyboard-nav-7iEtvu9P.js} +1 -1
- package/dist/client/assets/{lane-observe-BA3g9aVd.js → lane-observe-vfyACHi0.js} +1 -1
- package/dist/client/assets/{lane-roster-store-BiIVlYmG.js → lane-roster-store-pHT3TAVs.js} +1 -1
- package/dist/client/assets/layers-BiZA-Clc.js +1 -0
- package/dist/client/assets/layout-grid-DMpv9CZM.js +1 -0
- package/dist/client/assets/left-BayK4ocL.js +1 -0
- package/dist/client/assets/left-BhZhSrS2.js +1 -0
- package/dist/client/assets/left-BhgU6NOA.js +1 -0
- package/dist/client/assets/left-CY_FGnN7.js +1 -0
- package/dist/client/assets/left-Cq8mjamr.js +1 -0
- package/dist/client/assets/left-DH44V4I_.css +1 -0
- package/dist/client/assets/left-Dnqla0b5.js +2 -0
- package/dist/client/assets/left-Dy403II2.js +2 -0
- package/dist/client/assets/left-R2OOE7VG.css +1 -0
- package/dist/client/assets/left-advisor-oOAtJ9YE.js +1 -0
- package/dist/client/assets/left-agents-TIKe8vW8.js +1 -0
- package/dist/client/assets/left-default-owH0Lwxo.js +1 -0
- package/dist/client/assets/left-lanes-BE_co2lP.js +1 -0
- package/dist/client/assets/left-mission-C_nWUtfA.js +1 -0
- package/dist/client/assets/library-BSVrjn_m.js +1 -0
- package/dist/client/assets/{loader-circle-4LDsy4Ke.js → loader-circle-DoT8gpw6.js} +1 -1
- package/dist/client/assets/{local-agents-DIi2EacM.js → local-agents-BMadXuP1.js} +1 -1
- package/dist/client/assets/mentions-Cd6XticV.js +1 -0
- package/dist/client/assets/{mesh-ops-JZwGuAPn.js → mesh-ops-C0zCLTR8.js} +1 -1
- package/dist/client/assets/{mesh-view-store-Du7VqIT_.js → mesh-view-store-Cpqil_2D.js} +1 -1
- package/dist/client/assets/{message-circle-BM3XgevU.js → message-circle-44KSmbvQ.js} +1 -1
- package/dist/client/assets/{message-markup-BcY1lShv.js → message-markup-DAnnGpWr.js} +1 -1
- package/dist/client/assets/{message-square-ER1_q2pe.js → message-square-DlY4EneU.js} +1 -1
- package/dist/client/assets/mission-control-CnU7dNt1.css +1 -0
- package/dist/client/assets/{mission-control-store-C6w5iVfg.js → mission-control-store-DtjtRs9Z.js} +1 -1
- package/dist/client/assets/{observe-3-jn4SXb.js → observe-DL5_8-Zj.js} +1 -1
- package/dist/client/assets/{operator-attention-BwSPeheT.js → operator-attention-BqoWAlhp.js} +1 -1
- package/dist/client/assets/{page-status-0LPfBC8S.js → page-status-CW8co39E.js} +1 -1
- package/dist/client/assets/persistent-state-DYjP8lqN.js +1 -0
- package/dist/client/assets/{plus-C-2gTcPK.js → plus-64n9qucr.js} +1 -1
- package/dist/client/assets/profile-BkmuseW7.js +1 -0
- package/dist/client/assets/projects-inbox-C0umZMSY.js +1 -0
- package/dist/client/assets/{provider-BvAxRQfE.js → provider-CX9EWecp.js} +1 -1
- package/dist/client/assets/proxy-C35W-YHZ.js +1 -0
- package/dist/client/assets/{radio-v7UAMZGh.js → radio-BjpQTKT0.js} +1 -1
- package/dist/client/assets/{refresh-cw-B5To7b6B.js → refresh-cw-IgN2fZLM.js} +1 -1
- package/dist/client/assets/resolve-panes-CCqRkQdM.js +1 -0
- package/dist/client/assets/resolve-sidebar-context-JkxY8qsV.js +1 -0
- package/dist/client/assets/right-B3PQUHd5.js +1 -0
- package/dist/client/assets/right-B96CBzrV.js +1 -0
- package/dist/client/assets/right-BPirlFC8.js +1 -0
- package/dist/client/assets/right-BUP2Ro_M.js +1 -0
- package/dist/client/assets/right-BVWYPIFX.js +1 -0
- package/dist/client/assets/right-BoAJxwA3.js +1 -0
- package/dist/client/assets/right-C2aOC2li.js +1 -0
- package/dist/client/assets/right-CtPJjgOV.js +1 -0
- package/dist/client/assets/{right-BvoGOUKH.js → right-DqiVyo8v.js} +1 -1
- package/dist/client/assets/right-SfSu0zHC.js +1 -0
- package/dist/client/assets/{rocket-BQQQv2L5.js → rocket-DnmN_YOD.js} +1 -1
- package/dist/client/assets/{router-C65cZYPn.js → router-B0YclXYg.js} +1 -1
- package/dist/client/assets/{scope-views-BOOmgmwx.js → scope-views-Z8aoAmtU.js} +1 -1
- package/dist/client/assets/scout-voice-DvG_3stJ.js +1 -0
- package/dist/client/assets/{scoutbot-BTIErYHo.js → scoutbot-D4vuKzOL.js} +2 -2
- package/dist/client/assets/scoutbot-markdown-BJJyaPu2.js +6 -0
- package/dist/client/assets/{scroll-text-BuneRiAD.js → scroll-text-DRidbcse.js} +1 -1
- package/dist/client/assets/{search-7_n7CxWl.js → search-BbgsEMXa.js} +1 -1
- package/dist/client/assets/secondaryNavConfig-DyC_P9Wx.js +1 -0
- package/dist/client/assets/{selection-bridge-SlGsgHw2.js → selection-bridge-CpzFGx3-.js} +1 -1
- package/dist/client/assets/{send-horizontal-DP16OOIW.js → send-horizontal-BXo2uz3Z.js} +1 -1
- package/dist/client/assets/{server-pYOMFjrT.js → server-Dt3tpiBj.js} +1 -1
- package/dist/client/assets/{session-catalog-_QfQ7fhZ.js → session-catalog-CUQ8LUJY.js} +1 -1
- package/dist/client/assets/{session-table-CYN8e4s3.js → session-table-B4JOKevn.js} +1 -1
- package/dist/client/assets/settings-BzWCF3NF.js +1 -0
- package/dist/client/assets/{sliders-horizontal-D2Z8gz6J.js → sliders-horizontal-7V8B3xsf.js} +1 -1
- package/dist/client/assets/{sparkles-Bth2iK7t.js → sparkles-ytTwpCbZ.js} +1 -1
- package/dist/client/assets/{sse-CL6gctHY.js → sse-CSozY6mp.js} +1 -1
- package/dist/client/assets/system-surfaces-redesign-QVXNeGYw.css +1 -0
- package/dist/client/assets/{tail-display-BRcJltQa.js → tail-display-DcliDVkW.js} +1 -1
- package/dist/client/assets/{tail-events-NLIWLq27.js → tail-events-CrN-Rmxj.js} +1 -1
- package/dist/client/assets/{terminal-By1Lw2i2.js → terminal-BiNIXhna.js} +1 -1
- package/dist/client/assets/{terminal-relay-CjkI5aUy.js → terminal-relay-pSm7_An6.js} +1 -1
- package/dist/client/assets/{terminal-sessions-AmSgHklm.js → terminal-sessions-D4dHTRkt.js} +1 -1
- package/dist/client/assets/{terminal-takeover-7AvNpnkC.js → terminal-takeover-CtA3wcXh.js} +1 -1
- package/dist/client/assets/{runtime-picker-eDEvx2Mz.js → text-BR9Bap0E.js} +1 -1
- package/dist/client/assets/text-rLpBg4_z.css +1 -0
- package/dist/client/assets/{use-conversation-list-BCzY032j.js → use-conversation-list-C0bEXFeH.js} +1 -1
- package/dist/client/assets/{use-fleet-active-asks-CJ6-oj5k.js → use-fleet-active-asks-CK4aw-3G.js} +1 -1
- package/dist/client/assets/{use-mesh-ops-items-D5L-CKe_.js → use-mesh-ops-items-QixBijmT.js} +1 -1
- package/dist/client/assets/use-reduced-motion-BLn59zLn.js +1 -0
- package/dist/client/assets/{use-scout-dev-flags-BohC8seq.js → use-scout-dev-flags-JKb1EhFh.js} +1 -1
- package/dist/client/assets/{useAgentHoverCard-RsLUYyeh.js → useAgentHoverCard-6N8b7qsU.js} +1 -1
- package/dist/client/assets/useContentSecondaryNav-D-hVKzM9.js +1 -0
- package/dist/client/assets/{usePersistentState-D3M4m2Ou.js → usePersistentState-DOEahRlt.js} +1 -1
- package/dist/client/assets/{usePierreRuntime-B4hbNWTz.js → usePierreRuntime-Bq6mXrgd.js} +1 -1
- package/dist/client/assets/{wrench-M4G7WtYB.js → wrench-CQvdf7KT.js} +1 -1
- package/dist/client/assets/{x-ynOfVadO.js → x-BJyPzFnn.js} +1 -1
- package/dist/client/assets/{xterm-DZHyijPp.js → xterm-D6dE_wMr.js} +1 -1
- package/dist/client/assets/zap-rw7uwZht.js +1 -0
- package/dist/client/index.html +2 -2
- package/dist/main.mjs +629 -167
- package/dist/node/main.mjs +454 -270
- package/dist/pairing-runtime-controller.mjs +607 -357
- package/dist/runtime/base-daemon.mjs +384 -21
- package/dist/runtime/broker-daemon.mjs +11024 -10023
- package/dist/runtime/broker-process-manager.mjs +9 -3
- package/dist/runtime/mesh-discover.mjs +9 -3
- package/dist/scout-control-plane-web.mjs +1590 -984
- package/dist/scout-web-server.mjs +1590 -984
- package/package.json +4 -4
- package/dist/client/assets/ActivityScreen-aewI4Ul1.js +0 -1
- package/dist/client/assets/AgentAvatar-DMov24_o.js +0 -1
- package/dist/client/assets/AgentConfigurationScreen-BjG6ECjl.js +0 -1
- package/dist/client/assets/AgentDefinitionsWorkspace-D4MbSMXp.js +0 -1
- package/dist/client/assets/AgentFloorView-h9KDJdw0.js +0 -1
- package/dist/client/assets/AgentInfoScreen-SjhK_SBh.js +0 -1
- package/dist/client/assets/AgentLaneDetailSheet-DnAKe4e3.js +0 -4
- package/dist/client/assets/AgentLanesEmbedScreen-BNOYF16R.js +0 -1
- package/dist/client/assets/AgentLanesView-Ct-Gz5WD.js +0 -2
- package/dist/client/assets/AgentSessions-CDfSfNiE.js +0 -6
- package/dist/client/assets/AgentsConsole-BVxhBqRa.js +0 -1
- package/dist/client/assets/AgentsSubnav-CiIuzxnZ.js +0 -1
- package/dist/client/assets/BriefingDetailScreen-C83o2YfN.js +0 -6
- package/dist/client/assets/BrokerScreen-DplF8d_X.js +0 -5
- package/dist/client/assets/ChatCollapsedStrip-BRljIymi.js +0 -1
- package/dist/client/assets/ContextMenu-CxkmFQcN.js +0 -1
- package/dist/client/assets/ConversationComposer-CWohCCmn.js +0 -1
- package/dist/client/assets/ConversationFeedRows-IWh0JSIL.js +0 -1
- package/dist/client/assets/ConversationHeader-BxTzXl8e.js +0 -1
- package/dist/client/assets/ConversationPanels-D9UCwNkS.js +0 -2
- package/dist/client/assets/ConversationScreen-oZSitVtX.js +0 -1
- package/dist/client/assets/ConversationScreen-yIKEsm-8.css +0 -1
- package/dist/client/assets/ConversationStatus-B6pAbo2w.js +0 -1
- package/dist/client/assets/DocumentFocusViewer-DRKjNG9s.js +0 -1
- package/dist/client/assets/FleetSearch-CYeWn85V.js +0 -1
- package/dist/client/assets/FleetSearch-EXOe8ulE.css +0 -1
- package/dist/client/assets/FlightObserveScreen-DYJJ3Z2B.js +0 -1
- package/dist/client/assets/HomeHero-BPBArHXa.js +0 -1
- package/dist/client/assets/HomeHero-DEl-WBsT.css +0 -1
- package/dist/client/assets/KnowledgeSearchScreen-BP8tD-Bh.js +0 -1
- package/dist/client/assets/LaneTraceDetailSheet-B4i1Ut4R.js +0 -1
- package/dist/client/assets/MessageComposerSuggestions-Dfc3PH2y.js +0 -1
- package/dist/client/assets/MessagesScreen-TgSL5KMc.js +0 -1
- package/dist/client/assets/MissionControlView-D629w2A8.js +0 -1
- package/dist/client/assets/MissionFocusOverlay-Bubrr8Gc.js +0 -1
- package/dist/client/assets/MissionLeftAgentRow-DokImu4Y.js +0 -1
- package/dist/client/assets/MissionLogPane-Cs0LuIkn.js +0 -1
- package/dist/client/assets/NewChatComposer-S08F6_La.js +0 -19
- package/dist/client/assets/ObserveEmbedScreen-CHx2sEAA.js +0 -2
- package/dist/client/assets/ObserveTextFlow-_ApDwRCO.js +0 -2
- package/dist/client/assets/ObservedTopologyPanel-ByW7Ar7p.js +0 -2
- package/dist/client/assets/OpenScoutAppShell-DTmnbG-h.js +0 -88
- package/dist/client/assets/OpsAgentsView-DiFuHcJs.js +0 -1
- package/dist/client/assets/OpsScreen-CCR3U_9P.js +0 -1
- package/dist/client/assets/OpsSubnav-CZs_OL2N.js +0 -1
- package/dist/client/assets/PlanView-C54eAzig.js +0 -1
- package/dist/client/assets/ProjectAgentProfile-BEfYOaxc.js +0 -1
- package/dist/client/assets/ProjectAgentProfileHero-B4f_AoCr.js +0 -1
- package/dist/client/assets/ProjectsInbox-DoPZ17FC.js +0 -2
- package/dist/client/assets/ProjectsRail-CWOkZjsY.js +0 -1
- package/dist/client/assets/ProjectsScreen-Dse0Q6p6.js +0 -1
- package/dist/client/assets/ProjectsThreadAside-DMnfyPLE.js +0 -1
- package/dist/client/assets/Provider-DKZWuzSR.js +0 -1
- package/dist/client/assets/RailRow-Cf9LOiEj.css +0 -1
- package/dist/client/assets/RailRow-DIGd3MMM.js +0 -1
- package/dist/client/assets/RawSessionsTable-Zkl4YDvz.js +0 -1
- package/dist/client/assets/RealtimeVoiceScreen-B_PMJxY_.js +0 -1
- package/dist/client/assets/RepoDiffViewer-VrUJw33u.js +0 -7
- package/dist/client/assets/RepoDiffViewerLazy-BPg_JkYW.js +0 -2
- package/dist/client/assets/ScoutDeckSurface-MbwGp6Ab.js +0 -1
- package/dist/client/assets/ScoutbotBroadcastChip-DAKQKB25.js +0 -2
- package/dist/client/assets/ScoutbotRealtimeVoiceCall-Br4bYVAx.js +0 -1
- package/dist/client/assets/SessionRefScreen-DLZNFZFK.js +0 -1
- package/dist/client/assets/SessionsScreen-D-hN1n4k.js +0 -1
- package/dist/client/assets/SettingsDrawer-BFsnww-k.js +0 -3
- package/dist/client/assets/SettingsDrawer-UX7pFJU_.css +0 -1
- package/dist/client/assets/SettingsScreen-Bc3Xtv5V.js +0 -1
- package/dist/client/assets/Terminal-D_OmdFmr.js +0 -1
- package/dist/client/assets/TerminalEmbedScreen-D21ytNXW.js +0 -1
- package/dist/client/assets/WorkFilesViewer-BDMNbxE4.js +0 -1
- package/dist/client/assets/agent-identity-BxCsXnDp.js +0 -1
- package/dist/client/assets/api-h5zurxmi.js +0 -1
- package/dist/client/assets/broker-display-pp33bLsu.js +0 -2
- package/dist/client/assets/collapsed-strip-Dz-of2SM.css +0 -1
- package/dist/client/assets/content-B-SUUhXj.js +0 -1
- package/dist/client/assets/content-BRY2vo1_.js +0 -1
- package/dist/client/assets/content-BTm0mVyD.js +0 -1
- package/dist/client/assets/content-BTqvyb5E.js +0 -1
- package/dist/client/assets/content-BjDaXmSD.js +0 -1
- package/dist/client/assets/content-BrR6deGh.js +0 -1
- package/dist/client/assets/content-C5yvBEMy.js +0 -1
- package/dist/client/assets/content-CkhG__-v.js +0 -1
- package/dist/client/assets/content-CudIBsiP.js +0 -1
- package/dist/client/assets/content-DBb7ppd5.js +0 -1
- package/dist/client/assets/content-DEw_kGyK.js +0 -1
- package/dist/client/assets/content-DIy0DCzK.js +0 -1
- package/dist/client/assets/content-THl9hRAo.js +0 -1
- package/dist/client/assets/content-vi9FbmV9.js +0 -1
- package/dist/client/assets/content-wcgPMGVf.js +0 -1
- package/dist/client/assets/conversation-model-CHwHZNw-.js +0 -1
- package/dist/client/assets/conversation-motion-features-zU0k3Agz.js +0 -1
- package/dist/client/assets/ctx-panel-B4s49N9e.css +0 -1
- package/dist/client/assets/discover-NDAqNvKt.js +0 -2
- package/dist/client/assets/embed-entry-BVR09F6e.js +0 -2
- package/dist/client/assets/home-moving-signal-C8dTXieA.js +0 -1
- package/dist/client/assets/home-moving-signal-CAa0V91u.css +0 -1
- package/dist/client/assets/home-now-card-BgvVcE83.js +0 -1
- package/dist/client/assets/hooks-DBIezYS2.js +0 -2
- package/dist/client/assets/index-BMwKgdz_.js +0 -1
- package/dist/client/assets/index-Bu-fckyR.css +0 -1
- package/dist/client/assets/index-BxoufAPA.js +0 -1
- package/dist/client/assets/index-Cj7NnSxI.js +0 -1
- package/dist/client/assets/index-CvF09yvf.css +0 -1
- package/dist/client/assets/index-o4FKpU7Z.js +0 -10
- package/dist/client/assets/inspector-panel-Dy2cVTCi.js +0 -2
- package/dist/client/assets/left-BC7p5QbT.js +0 -1
- package/dist/client/assets/left-BCSGqccQ.js +0 -1
- package/dist/client/assets/left-BSyj8PuJ.js +0 -2
- package/dist/client/assets/left-Bk3XnxPD.css +0 -1
- package/dist/client/assets/left-CCoobxPS.css +0 -1
- package/dist/client/assets/left-DDnxNUxd.js +0 -1
- package/dist/client/assets/left-DLoDKxT5.js +0 -2
- package/dist/client/assets/left-O-TBH7JB.js +0 -1
- package/dist/client/assets/left-agents-Dk9Y89lb.js +0 -1
- package/dist/client/assets/left-default-B3JBRQNJ.js +0 -1
- package/dist/client/assets/left-lanes-30Oe_3RM.js +0 -1
- package/dist/client/assets/left-mission-DEl4-7xu.js +0 -1
- package/dist/client/assets/left-plan-B4qdm4Gn.js +0 -2
- package/dist/client/assets/left-rvUOB14X.js +0 -1
- package/dist/client/assets/library-DDKSLFJ_.js +0 -1
- package/dist/client/assets/mentions-CvDaviLJ.js +0 -1
- package/dist/client/assets/mission-control-m3BTDQ9l.css +0 -1
- package/dist/client/assets/model-Co0zkMIc.js +0 -1
- package/dist/client/assets/plan-view-D56fneVF.css +0 -1
- package/dist/client/assets/profile-DW80Gn5k.js +0 -1
- package/dist/client/assets/projects-inbox-DCeD3FfV.js +0 -1
- package/dist/client/assets/resolve-panes-BDi9Qx4R.js +0 -1
- package/dist/client/assets/resolve-sidebar-context-HE-5eZYa.js +0 -1
- package/dist/client/assets/right-BDf_yTv6.js +0 -1
- package/dist/client/assets/right-C-bgjYg-.js +0 -1
- package/dist/client/assets/right-C3JdEfYQ.js +0 -1
- package/dist/client/assets/right-CYIs2tEe.js +0 -1
- package/dist/client/assets/right-CyRCv6Up.js +0 -1
- package/dist/client/assets/right-DBYGtoRv.js +0 -1
- package/dist/client/assets/right-o3LHMiKa.js +0 -1
- package/dist/client/assets/right-oPrcx9MX.js +0 -1
- package/dist/client/assets/right-sSvBUK-j.js +0 -1
- package/dist/client/assets/runtime-picker-vhm0gtLs.css +0 -1
- package/dist/client/assets/scout-voice-B7kXlkcl.js +0 -1
- package/dist/client/assets/secondaryNavConfig-CSFDCQAf.js +0 -1
- package/dist/client/assets/system-surfaces-redesign-B7GQhfpw.css +0 -1
- package/dist/client/assets/text-DsBWV_4k.js +0 -1
- package/dist/client/assets/use-reduced-motion-CqXpVXv-.js +0 -1
- package/dist/client/assets/useContentSecondaryNav-DOr5yHbT.js +0 -1
- /package/dist/client/assets/{document-focus-viewer-BSC_JwVE.css → DocumentFocusViewer-BSC_JwVE.css} +0 -0
package/dist/main.mjs
CHANGED
|
@@ -146,7 +146,8 @@ function canonicalizeIdentity(input) {
|
|
|
146
146
|
const definitionId = normalizeAgentIdentitySegment(input.definitionId);
|
|
147
147
|
const workspaceQualifier = input.workspaceQualifier ? normalizeAgentIdentitySegment(input.workspaceQualifier) : undefined;
|
|
148
148
|
const profile = input.profile ? normalizeAgentIdentitySegment(input.profile) : undefined;
|
|
149
|
-
const
|
|
149
|
+
const rawHarness = input.harness ? normalizeAgentIdentitySegment(input.harness) : undefined;
|
|
150
|
+
const harness = rawHarness === "oc" ? "opencode" : rawHarness;
|
|
150
151
|
const model = input.model ? normalizeAgentIdentitySegment(input.model) : undefined;
|
|
151
152
|
const nodeQualifier = input.nodeQualifier ? normalizeAgentIdentitySegment(input.nodeQualifier) : undefined;
|
|
152
153
|
if (!definitionId) {
|
|
@@ -1116,6 +1117,20 @@ var init_agent_runs = () => {};
|
|
|
1116
1117
|
// ../protocol/src/budget.ts
|
|
1117
1118
|
var init_budget = () => {};
|
|
1118
1119
|
|
|
1120
|
+
// ../protocol/src/presence.ts
|
|
1121
|
+
function presenceLifecycle(beat, now, options = {}) {
|
|
1122
|
+
if (now < beat.staleAt)
|
|
1123
|
+
return "fresh";
|
|
1124
|
+
const goneAfterStaleMs = options.goneAfterStaleMs ?? PRESENCE_GONE_AFTER_STALE_MS;
|
|
1125
|
+
if (now < beat.staleAt + goneAfterStaleMs)
|
|
1126
|
+
return "stale";
|
|
1127
|
+
return "gone";
|
|
1128
|
+
}
|
|
1129
|
+
function isPresenceGone(beat, now, options = {}) {
|
|
1130
|
+
return presenceLifecycle(beat, now, options) === "gone";
|
|
1131
|
+
}
|
|
1132
|
+
var PRESENCE_STALE_AFTER_MS = 45000, PRESENCE_GONE_AFTER_STALE_MS = 60000;
|
|
1133
|
+
|
|
1119
1134
|
// ../protocol/src/host-integrations.ts
|
|
1120
1135
|
var init_host_integrations = () => {};
|
|
1121
1136
|
|
|
@@ -1559,7 +1574,8 @@ function parseScoutRuntimeSpec(input) {
|
|
|
1559
1574
|
error: "runtime must be <harness>[/<model>[/<effort>]]"
|
|
1560
1575
|
};
|
|
1561
1576
|
}
|
|
1562
|
-
const
|
|
1577
|
+
const rawHarness = parts[0].trim().toLowerCase();
|
|
1578
|
+
const harness = rawHarness === "oc" ? "opencode" : rawHarness;
|
|
1563
1579
|
if (!isScoutLaunchableHarness(harness)) {
|
|
1564
1580
|
return {
|
|
1565
1581
|
ok: false,
|
|
@@ -1589,14 +1605,18 @@ function parseScoutRuntimeSpec(input) {
|
|
|
1589
1605
|
};
|
|
1590
1606
|
}
|
|
1591
1607
|
function isScoutLaunchableHarness(value) {
|
|
1592
|
-
|
|
1608
|
+
if (!value)
|
|
1609
|
+
return false;
|
|
1610
|
+
const normalized = value.trim().toLowerCase();
|
|
1611
|
+
return normalized === "oc" || SCOUT_LAUNCHABLE_HARNESSES.includes(normalized);
|
|
1593
1612
|
}
|
|
1594
1613
|
function normalizeScoutReasoningEffort(value) {
|
|
1595
1614
|
const normalized = value?.trim().toLowerCase();
|
|
1596
1615
|
return normalized && SCOUT_REASONING_EFFORTS.includes(normalized) ? normalized : null;
|
|
1597
1616
|
}
|
|
1598
1617
|
function validateScoutRuntimeTuple(input, catalog) {
|
|
1599
|
-
const
|
|
1618
|
+
const rawHarness = input.harness?.trim().toLowerCase();
|
|
1619
|
+
const harness = rawHarness === "oc" ? "opencode" : rawHarness;
|
|
1600
1620
|
const model = input.model?.trim();
|
|
1601
1621
|
const effortRaw = input.reasoningEffort?.trim();
|
|
1602
1622
|
const issues = [];
|
|
@@ -1633,7 +1653,7 @@ function validateScoutRuntimeTuple(input, catalog) {
|
|
|
1633
1653
|
});
|
|
1634
1654
|
}
|
|
1635
1655
|
}
|
|
1636
|
-
const modelSelectableHarness = harness === "claude" || harness === "codex" || harness === "grok" || harness === "grok-acp";
|
|
1656
|
+
const modelSelectableHarness = harness === "claude" || harness === "codex" || harness === "grok" || harness === "grok-acp" || harness === "opencode";
|
|
1637
1657
|
if (model && harness && !modelSelectableHarness) {
|
|
1638
1658
|
issues.push({
|
|
1639
1659
|
code: "unsupported_model_dimension",
|
|
@@ -1693,7 +1713,9 @@ var init_runtime_profiles = __esm(() => {
|
|
|
1693
1713
|
"fable",
|
|
1694
1714
|
"kimi",
|
|
1695
1715
|
"grok",
|
|
1696
|
-
"opus"
|
|
1716
|
+
"opus",
|
|
1717
|
+
"oc",
|
|
1718
|
+
"opencode"
|
|
1697
1719
|
];
|
|
1698
1720
|
});
|
|
1699
1721
|
|
|
@@ -1994,6 +2016,14 @@ var init_inbox = __esm(() => {
|
|
|
1994
2016
|
];
|
|
1995
2017
|
});
|
|
1996
2018
|
|
|
2019
|
+
// ../protocol/src/events.ts
|
|
2020
|
+
var EPHEMERAL_CONTROL_EVENT_KINDS;
|
|
2021
|
+
var init_events = __esm(() => {
|
|
2022
|
+
EPHEMERAL_CONTROL_EVENT_KINDS = new Set([
|
|
2023
|
+
"presence.updated"
|
|
2024
|
+
]);
|
|
2025
|
+
});
|
|
2026
|
+
|
|
1997
2027
|
// ../protocol/src/cursor-transport.ts
|
|
1998
2028
|
var init_cursor_transport = () => {};
|
|
1999
2029
|
|
|
@@ -2137,6 +2167,7 @@ var init_src = __esm(() => {
|
|
|
2137
2167
|
init_reserved_vocabulary();
|
|
2138
2168
|
init_scout_composer();
|
|
2139
2169
|
init_inbox();
|
|
2170
|
+
init_events();
|
|
2140
2171
|
init_permission_policy();
|
|
2141
2172
|
init_cursor_transport();
|
|
2142
2173
|
init_terminal_surface_id();
|
|
@@ -2320,7 +2351,7 @@ function mergeRuntimeProfileReasoningEffort(flagEffort, naturalEffort) {
|
|
|
2320
2351
|
return naturalEffort ?? flagEffort;
|
|
2321
2352
|
}
|
|
2322
2353
|
function rejectUnsupportedRuntimeProfileEffort(profile, reasoningEffort) {
|
|
2323
|
-
if (reasoningEffort && (profile === "grok" || profile === "kimi")) {
|
|
2354
|
+
if (reasoningEffort && (profile === "grok" || profile === "kimi" || profile === "oc" || profile === "opencode")) {
|
|
2324
2355
|
throw new ScoutCliError(`reasoning_effort_harness_mismatch: ${profile} runtime profile does not support reasoning effort through its ACP transport`);
|
|
2325
2356
|
}
|
|
2326
2357
|
}
|
|
@@ -2458,7 +2489,7 @@ function parseSetupCommandOptions(args, defaultCurrentDirectory) {
|
|
|
2458
2489
|
}
|
|
2459
2490
|
if (current === "--default-harness" || current.startsWith("--default-harness=")) {
|
|
2460
2491
|
const value = parseFlagValue(parsed.args, index, "--default-harness");
|
|
2461
|
-
if (!["claude", "codex", "cursor", "grok", "pi"].includes(value.value)) {
|
|
2492
|
+
if (!["claude", "codex", "cursor", "grok", "pi", "opencode"].includes(value.value)) {
|
|
2462
2493
|
throw new ScoutCliError(`invalid default harness: ${value.value}`);
|
|
2463
2494
|
}
|
|
2464
2495
|
defaultHarness = value.value;
|
|
@@ -4972,12 +5003,18 @@ var init_auth = __esm(() => {
|
|
|
4972
5003
|
import { existsSync, mkdirSync, rmSync, writeFileSync } from "fs";
|
|
4973
5004
|
import { homedir } from "os";
|
|
4974
5005
|
import { join as join2 } from "path";
|
|
5006
|
+
function isTestRunnerProcess() {
|
|
5007
|
+
if (false)
|
|
5008
|
+
;
|
|
5009
|
+
const entry = typeof Bun !== "undefined" ? Bun.main : process.argv[1] ?? "";
|
|
5010
|
+
return /[._](test|spec)\.[cm]?[jt]sx?$/.test(entry);
|
|
5011
|
+
}
|
|
4975
5012
|
function assertTestIsolatedUserData(operation, isolationEnvKey) {
|
|
4976
|
-
if (
|
|
5013
|
+
if (!isTestRunnerProcess())
|
|
4977
5014
|
return;
|
|
4978
5015
|
if (process.env[isolationEnvKey]?.trim())
|
|
4979
5016
|
return;
|
|
4980
|
-
throw new Error(`Refusing to ${operation}
|
|
5017
|
+
throw new Error(`Refusing to ${operation} under a test runner without ${isolationEnvKey} set. ` + "Tests must isolate OpenScout user data in a temp directory (see prepareHome in onboarding.test.ts).");
|
|
4981
5018
|
}
|
|
4982
5019
|
function resolveOpenScoutSupportPaths() {
|
|
4983
5020
|
const home = homedir();
|
|
@@ -5208,11 +5245,13 @@ function shellQuoteArg(value) {
|
|
|
5208
5245
|
function findHarnessEntry(harness) {
|
|
5209
5246
|
if (!harness)
|
|
5210
5247
|
return null;
|
|
5211
|
-
|
|
5248
|
+
const lower = harness.trim().toLowerCase();
|
|
5249
|
+
return BUILT_IN_HARNESS_CATALOG.find((e) => e.harness === lower || e.name === lower || e.aliases?.includes(lower)) ?? null;
|
|
5212
5250
|
}
|
|
5213
5251
|
function createBuiltInHarnessCatalog() {
|
|
5214
5252
|
return BUILT_IN_HARNESS_CATALOG.map((entry) => ({
|
|
5215
5253
|
...entry,
|
|
5254
|
+
aliases: entry.aliases ? [...entry.aliases] : undefined,
|
|
5216
5255
|
tags: [...entry.tags],
|
|
5217
5256
|
support: { ...entry.support },
|
|
5218
5257
|
install: entry.install ? { ...entry.install, requires: [...entry.install.requires ?? []] } : undefined,
|
|
@@ -5581,6 +5620,7 @@ var init_harness_catalog = __esm(() => {
|
|
|
5581
5620
|
{
|
|
5582
5621
|
name: "opencode",
|
|
5583
5622
|
harness: "opencode",
|
|
5623
|
+
aliases: ["oc", "opencode2"],
|
|
5584
5624
|
label: "OpenCode",
|
|
5585
5625
|
description: "OpenCode's coding agent over ACP, fronting many model vendors via OpenCode Zen",
|
|
5586
5626
|
homepage: "https://opencode.ai/docs/",
|
|
@@ -5928,6 +5968,7 @@ async function readManagedInstallsFile(path = resolveOpenScoutSupportPaths().man
|
|
|
5928
5968
|
}
|
|
5929
5969
|
}
|
|
5930
5970
|
async function writeManagedInstallsFile(file, path = resolveOpenScoutSupportPaths().managedInstallsPath) {
|
|
5971
|
+
assertTestIsolatedUserData("write the managed-installs registry", "OPENSCOUT_SUPPORT_DIRECTORY");
|
|
5931
5972
|
await mkdir3(dirname3(path), { recursive: true });
|
|
5932
5973
|
await writeFile3(path, JSON.stringify(file, null, 2) + `
|
|
5933
5974
|
`, "utf8");
|
|
@@ -5977,6 +6018,38 @@ import {
|
|
|
5977
6018
|
writeFileSync as writeFileSync2
|
|
5978
6019
|
} from "fs";
|
|
5979
6020
|
import { dirname as dirname4, join as join5 } from "path";
|
|
6021
|
+
function stripBonjourCollisionSuffix(value) {
|
|
6022
|
+
if (!value || typeof value !== "string")
|
|
6023
|
+
return "";
|
|
6024
|
+
let trimmed = value.trim();
|
|
6025
|
+
const isDotLocal = /\.local\.?$/i.test(trimmed);
|
|
6026
|
+
if (isDotLocal) {
|
|
6027
|
+
trimmed = trimmed.replace(/\.local\.?$/i, "");
|
|
6028
|
+
}
|
|
6029
|
+
const isHyphenLocalOpenscout = /-local-openscout$/i.test(trimmed);
|
|
6030
|
+
const isHyphenLocal = !isHyphenLocalOpenscout && /-local$/i.test(trimmed);
|
|
6031
|
+
if (isHyphenLocalOpenscout) {
|
|
6032
|
+
trimmed = trimmed.replace(/-local-openscout$/i, "");
|
|
6033
|
+
} else if (isHyphenLocal) {
|
|
6034
|
+
trimmed = trimmed.replace(/-local$/i, "");
|
|
6035
|
+
}
|
|
6036
|
+
if (!isDotLocal && !isHyphenLocalOpenscout && !isHyphenLocal) {
|
|
6037
|
+
return trimmed;
|
|
6038
|
+
}
|
|
6039
|
+
trimmed = trimmed.replace(/(?<=[a-zA-Z].*?)(?:-\d+)+$/, "");
|
|
6040
|
+
if (isDotLocal)
|
|
6041
|
+
return `${trimmed}.local`;
|
|
6042
|
+
if (isHyphenLocalOpenscout)
|
|
6043
|
+
return `${trimmed}-local-openscout`;
|
|
6044
|
+
if (isHyphenLocal)
|
|
6045
|
+
return `${trimmed}-local`;
|
|
6046
|
+
return trimmed;
|
|
6047
|
+
}
|
|
6048
|
+
function canonicalMeshNodeId(nodeId) {
|
|
6049
|
+
if (!nodeId || typeof nodeId !== "string")
|
|
6050
|
+
return "";
|
|
6051
|
+
return stripBonjourCollisionSuffix(nodeId);
|
|
6052
|
+
}
|
|
5980
6053
|
function nodeIdentityPath(supportDirectory) {
|
|
5981
6054
|
const dir = supportDirectory ?? resolveOpenScoutSupportPaths().supportDirectory;
|
|
5982
6055
|
return join5(dir, NODE_IDENTITY_FILE);
|
|
@@ -6013,7 +6086,7 @@ function readAndValidateNodeIdentity(path) {
|
|
|
6013
6086
|
if (parsed.version !== 1 || !parsed.publicKey || !parsed.privateKey) {
|
|
6014
6087
|
throw new Error(`Corrupt node identity at ${path}; remove it to generate a fresh one.`);
|
|
6015
6088
|
}
|
|
6016
|
-
if (parsed.nodeQualifier !== undefined &&
|
|
6089
|
+
if (parsed.nodeQualifier !== undefined && normalizePersistedNodeQualifier(parsed.nodeQualifier) !== parsed.nodeQualifier) {
|
|
6017
6090
|
throw new Error(`Corrupt node identity at ${path}; remove it to generate a fresh one.`);
|
|
6018
6091
|
}
|
|
6019
6092
|
try {
|
|
@@ -6026,9 +6099,12 @@ function readAndValidateNodeIdentity(path) {
|
|
|
6026
6099
|
}
|
|
6027
6100
|
return parsed;
|
|
6028
6101
|
}
|
|
6029
|
-
function
|
|
6102
|
+
function normalizePersistedNodeQualifier(value) {
|
|
6030
6103
|
return typeof value === "string" ? value.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/-+/g, "-").replace(/^-+|-+$/g, "") : "";
|
|
6031
6104
|
}
|
|
6105
|
+
function normalizeNodeQualifier(value) {
|
|
6106
|
+
return stripBonjourCollisionSuffix(normalizePersistedNodeQualifier(value));
|
|
6107
|
+
}
|
|
6032
6108
|
function createNodeIdentity(supportDirectory) {
|
|
6033
6109
|
if (!supportDirectory) {
|
|
6034
6110
|
assertTestIsolatedUserData("write the node identity", "OPENSCOUT_SUPPORT_DIRECTORY");
|
|
@@ -6661,6 +6737,9 @@ function normalizeManagedHarness(value, fallback) {
|
|
|
6661
6737
|
if (value === "pi") {
|
|
6662
6738
|
return "pi";
|
|
6663
6739
|
}
|
|
6740
|
+
if (value === "opencode") {
|
|
6741
|
+
return "opencode";
|
|
6742
|
+
}
|
|
6664
6743
|
return fallback;
|
|
6665
6744
|
}
|
|
6666
6745
|
function titleCase(value) {
|
|
@@ -7403,7 +7482,8 @@ async function detectHarnessMarkers(projectRoot) {
|
|
|
7403
7482
|
grok: [],
|
|
7404
7483
|
"grok-acp": [],
|
|
7405
7484
|
kimi: [],
|
|
7406
|
-
pi: []
|
|
7485
|
+
pi: [],
|
|
7486
|
+
opencode: []
|
|
7407
7487
|
};
|
|
7408
7488
|
for (const harness of MANAGED_AGENT_HARNESSES) {
|
|
7409
7489
|
for (const marker of PROJECT_HARNESS_MARKERS[harness]) {
|
|
@@ -7584,6 +7664,7 @@ async function readOpenScoutSettings(options = {}) {
|
|
|
7584
7664
|
async function writeOpenScoutSettings(settings, options = {}) {
|
|
7585
7665
|
assertTestIsolatedUserData("write OpenScout settings", "OPENSCOUT_SUPPORT_DIRECTORY");
|
|
7586
7666
|
ensureOpenScoutCleanSlateSync();
|
|
7667
|
+
const settingsPath = resolveOpenScoutSupportPaths().settingsPath;
|
|
7587
7668
|
const current = await readOpenScoutSettings(options);
|
|
7588
7669
|
const merged = {
|
|
7589
7670
|
...current,
|
|
@@ -7637,7 +7718,11 @@ async function writeOpenScoutSettings(settings, options = {}) {
|
|
|
7637
7718
|
const normalized = await normalizeSettingsRecord(merged, {
|
|
7638
7719
|
currentDirectory: options.currentDirectory
|
|
7639
7720
|
});
|
|
7640
|
-
|
|
7721
|
+
const settingsPathNow = resolveOpenScoutSupportPaths().settingsPath;
|
|
7722
|
+
if (settingsPathNow !== settingsPath) {
|
|
7723
|
+
throw new Error(`Refusing to write OpenScout settings: target moved from ${settingsPath} to ${settingsPathNow} mid-write (test teardown?).`);
|
|
7724
|
+
}
|
|
7725
|
+
await writeJsonFile(settingsPath, normalized);
|
|
7641
7726
|
return normalized;
|
|
7642
7727
|
}
|
|
7643
7728
|
function scoutSkillInstallTargets(home = homedir4()) {
|
|
@@ -7890,6 +7975,8 @@ async function readRelayAgentOverrides() {
|
|
|
7890
7975
|
}));
|
|
7891
7976
|
}
|
|
7892
7977
|
async function writeRelayAgentOverrides(overrides) {
|
|
7978
|
+
assertTestIsolatedUserData("write the relay-agents registry", "OPENSCOUT_SUPPORT_DIRECTORY");
|
|
7979
|
+
const registryPath = resolveOpenScoutSupportPaths().relayAgentsRegistryPath;
|
|
7893
7980
|
const normalizedAgents = Object.fromEntries(Object.entries(overrides).map(([agentId, record]) => {
|
|
7894
7981
|
const definitionId = normalizeAgentId(record.definitionId || record.agentId || agentId);
|
|
7895
7982
|
const projectRoot = normalizePath(record.projectRoot);
|
|
@@ -7923,7 +8010,11 @@ async function writeRelayAgentOverrides(overrides) {
|
|
|
7923
8010
|
}
|
|
7924
8011
|
];
|
|
7925
8012
|
}));
|
|
7926
|
-
|
|
8013
|
+
const registryPathNow = resolveOpenScoutSupportPaths().relayAgentsRegistryPath;
|
|
8014
|
+
if (registryPathNow !== registryPath) {
|
|
8015
|
+
throw new Error(`Refusing to write the relay-agents registry: target moved from ${registryPath} to ${registryPathNow} mid-write (test teardown?).`);
|
|
8016
|
+
}
|
|
8017
|
+
await writeJsonFile(registryPath, {
|
|
7927
8018
|
version: 1,
|
|
7928
8019
|
agents: normalizedAgents
|
|
7929
8020
|
});
|
|
@@ -8658,7 +8749,7 @@ var init_setup = __esm(() => {
|
|
|
8658
8749
|
init_open_scout_network();
|
|
8659
8750
|
init_support_paths();
|
|
8660
8751
|
init_user_project_hints();
|
|
8661
|
-
MANAGED_AGENT_HARNESSES = ["claude", "codex", "cursor", "grok", "grok-acp", "kimi", "pi"];
|
|
8752
|
+
MANAGED_AGENT_HARNESSES = ["claude", "codex", "cursor", "grok", "grok-acp", "kimi", "pi", "opencode"];
|
|
8662
8753
|
DEFAULT_OPERATOR_NAME = guessedOperatorName();
|
|
8663
8754
|
DEFAULT_CAPABILITIES = ["chat", "invoke", "deliver"];
|
|
8664
8755
|
PROJECT_SCAN_SKIP_DIRECTORIES = new Set([
|
|
@@ -8761,6 +8852,10 @@ var init_setup = __esm(() => {
|
|
|
8761
8852
|
pi: [
|
|
8762
8853
|
"PI.md",
|
|
8763
8854
|
".pi"
|
|
8855
|
+
],
|
|
8856
|
+
opencode: [
|
|
8857
|
+
"OPENCODE.md",
|
|
8858
|
+
".opencode"
|
|
8764
8859
|
]
|
|
8765
8860
|
};
|
|
8766
8861
|
PROJECT_STRONG_MARKERS_FLAT_NESTED = partitionFlatAndNestedMarkers(PROJECT_STRONG_MARKERS);
|
|
@@ -11128,12 +11223,14 @@ import {
|
|
|
11128
11223
|
import { homedir as homedir6, hostname as osHostname } from "os";
|
|
11129
11224
|
import { dirname as dirname7, join as join9 } from "path";
|
|
11130
11225
|
function normalizeLocalHostnameLabel(value) {
|
|
11131
|
-
const
|
|
11226
|
+
const stripped = value ? stripBonjourCollisionSuffix(value) : value;
|
|
11227
|
+
const firstLabel = stripped?.trim().replace(/\.local\.?$/i, "").split(".").find((part) => part.trim().length > 0)?.trim();
|
|
11132
11228
|
const normalized = firstLabel?.toLowerCase().replace(/[^a-z0-9-]+/g, "-").replace(/^-+|-+$/g, "").replace(/-{2,}/g, "-");
|
|
11133
11229
|
return normalized || "localhost";
|
|
11134
11230
|
}
|
|
11135
11231
|
function normalizeLocalHostname(value) {
|
|
11136
|
-
const
|
|
11232
|
+
const stripped = value ? stripBonjourCollisionSuffix(value) : value;
|
|
11233
|
+
const trimmed = stripped?.trim().replace(/\.$/, "").toLowerCase();
|
|
11137
11234
|
const labels = trimmed?.split(".").map((label) => label.trim().replace(/[^a-z0-9-]+/g, "-").replace(/^-+|-+$/g, "").replace(/-{2,}/g, "-")).filter(Boolean);
|
|
11138
11235
|
return labels && labels.length > 0 ? labels.join(".") : "localhost";
|
|
11139
11236
|
}
|
|
@@ -11262,6 +11359,7 @@ function localConfigExists() {
|
|
|
11262
11359
|
var LOCAL_CONFIG_VERSION = 1, DEFAULT_SCOUT_WEB_PORTAL_HOST = "scout.local", DEFAULT_SCOUT_WEB_DEV_HOST, DEFAULT_SCOUT_WEB_VITE_HMR_PATH = "/ws/hmr", OPENSCOUT_PORTS, DEFAULT_LOCAL_CONFIG;
|
|
11263
11360
|
var init_local_config = __esm(() => {
|
|
11264
11361
|
init_support_paths();
|
|
11362
|
+
init_node_identity();
|
|
11265
11363
|
DEFAULT_SCOUT_WEB_DEV_HOST = `dev.${DEFAULT_SCOUT_WEB_PORTAL_HOST}`;
|
|
11266
11364
|
OPENSCOUT_PORTS = {
|
|
11267
11365
|
broker: 43110,
|
|
@@ -11656,13 +11754,13 @@ function resolveBrokerUrl(host, port, scope, env = process.env, lanHost = findLa
|
|
|
11656
11754
|
return explicit;
|
|
11657
11755
|
}
|
|
11658
11756
|
if (scope === "mesh") {
|
|
11757
|
+
if (lanHost) {
|
|
11758
|
+
return buildDefaultBrokerHttpsUrl(lanHost, port);
|
|
11759
|
+
}
|
|
11659
11760
|
const tailnetHost = readTailscaleSelfWebHostsSync(env)[0];
|
|
11660
11761
|
if (tailnetHost) {
|
|
11661
11762
|
return buildDefaultBrokerHttpsUrl(tailnetHost, port);
|
|
11662
11763
|
}
|
|
11663
|
-
if (lanHost) {
|
|
11664
|
-
return buildDefaultBrokerHttpsUrl(lanHost, port);
|
|
11665
|
-
}
|
|
11666
11764
|
}
|
|
11667
11765
|
return buildDefaultBrokerUrl(host, port);
|
|
11668
11766
|
}
|
|
@@ -18156,9 +18254,15 @@ async function recordCodexSessionCatalog(runtimeDirectory, threadId, input) {
|
|
|
18156
18254
|
});
|
|
18157
18255
|
}
|
|
18158
18256
|
async function closeCodexSessionCatalog(runtimeDirectory, threadId) {
|
|
18257
|
+
if (!threadId) {
|
|
18258
|
+
return;
|
|
18259
|
+
}
|
|
18159
18260
|
const catalog = await readCodexSessionCatalog(runtimeDirectory);
|
|
18261
|
+
if (catalog.activeSessionId !== threadId) {
|
|
18262
|
+
return;
|
|
18263
|
+
}
|
|
18264
|
+
const activeSessionId = threadId;
|
|
18160
18265
|
const now = Date.now();
|
|
18161
|
-
const activeSessionId = threadId ?? catalog.activeSessionId;
|
|
18162
18266
|
const sessions2 = catalog.sessions.map((session) => session.id === activeSessionId && !session.endedAt ? { ...session, endedAt: now } : session);
|
|
18163
18267
|
await writeCodexSessionCatalog(runtimeDirectory, {
|
|
18164
18268
|
activeSessionId: null,
|
|
@@ -18181,8 +18285,10 @@ class CodexAppServerTransport {
|
|
|
18181
18285
|
nextRequestId = 1;
|
|
18182
18286
|
pendingRequests = new Map;
|
|
18183
18287
|
starting = null;
|
|
18288
|
+
threadPersistence = Promise.resolve();
|
|
18184
18289
|
threadId = null;
|
|
18185
18290
|
threadPath = null;
|
|
18291
|
+
durableThreadId = null;
|
|
18186
18292
|
proactiveShutdown = null;
|
|
18187
18293
|
lastConfigSignature;
|
|
18188
18294
|
notificationListeners = new Set;
|
|
@@ -18250,7 +18356,7 @@ class CodexAppServerTransport {
|
|
|
18250
18356
|
cwd: this.options.cwd,
|
|
18251
18357
|
input: this.textInput(prompt)
|
|
18252
18358
|
});
|
|
18253
|
-
await this.
|
|
18359
|
+
await this.persistThreadId();
|
|
18254
18360
|
return response;
|
|
18255
18361
|
}
|
|
18256
18362
|
async steerTurn(prompt, expectedTurnId) {
|
|
@@ -18300,10 +18406,12 @@ class CodexAppServerTransport {
|
|
|
18300
18406
|
child.kill("SIGKILL");
|
|
18301
18407
|
}
|
|
18302
18408
|
}
|
|
18409
|
+
await this.threadPersistence;
|
|
18303
18410
|
if (options.resetThread) {
|
|
18304
|
-
await closeCodexSessionCatalog(this.options.runtimeDirectory, this.
|
|
18411
|
+
await closeCodexSessionCatalog(this.options.runtimeDirectory, this.durableThreadId);
|
|
18305
18412
|
this.threadId = null;
|
|
18306
18413
|
this.threadPath = null;
|
|
18414
|
+
this.durableThreadId = null;
|
|
18307
18415
|
await rm2(this.threadIdPath, { force: true });
|
|
18308
18416
|
}
|
|
18309
18417
|
await this.persistState();
|
|
@@ -18426,6 +18534,7 @@ class CodexAppServerTransport {
|
|
|
18426
18534
|
const requestedThreadId = this.options.threadId?.trim() || null;
|
|
18427
18535
|
const storedThreadId = requestedThreadId ?? await readOptionalFile(this.threadIdPath);
|
|
18428
18536
|
if (storedThreadId) {
|
|
18537
|
+
const threadOrigin = requestedThreadId ? "requested" : "stored";
|
|
18429
18538
|
try {
|
|
18430
18539
|
const resumed = await this.request("thread/resume", {
|
|
18431
18540
|
threadId: storedThreadId,
|
|
@@ -18437,11 +18546,10 @@ class CodexAppServerTransport {
|
|
|
18437
18546
|
});
|
|
18438
18547
|
this.threadId = resumed.thread.id;
|
|
18439
18548
|
this.threadPath = resumed.thread.path ?? null;
|
|
18440
|
-
await this.persistThreadId();
|
|
18441
|
-
await recordCodexSessionCatalog(this.options.runtimeDirectory, this.threadId, this.catalogRuntimeMeta());
|
|
18549
|
+
await this.persistThreadId({ confirmed: true });
|
|
18442
18550
|
return;
|
|
18443
18551
|
} catch (error) {
|
|
18444
|
-
await appendFile2(this.stderrLogPath, `[openscout] failed to resume
|
|
18552
|
+
await appendFile2(this.stderrLogPath, `[openscout] failed to resume ${threadOrigin} Codex thread ${storedThreadId}: ${errorMessage3(error)}
|
|
18445
18553
|
`).catch(() => {
|
|
18446
18554
|
return;
|
|
18447
18555
|
});
|
|
@@ -18449,9 +18557,11 @@ class CodexAppServerTransport {
|
|
|
18449
18557
|
await rm2(this.threadIdPath, { force: true }).catch(() => {
|
|
18450
18558
|
return;
|
|
18451
18559
|
});
|
|
18560
|
+
await closeCodexSessionCatalog(this.options.runtimeDirectory, storedThreadId);
|
|
18561
|
+
await this.persistState();
|
|
18452
18562
|
}
|
|
18453
18563
|
if (requestedThreadId || this.options.requireExistingThread) {
|
|
18454
|
-
throw new Error(`Failed to resume
|
|
18564
|
+
throw new Error(`Failed to resume ${threadOrigin} Codex thread ${storedThreadId}: ${errorMessage3(error)}`);
|
|
18455
18565
|
}
|
|
18456
18566
|
}
|
|
18457
18567
|
}
|
|
@@ -18470,8 +18580,10 @@ class CodexAppServerTransport {
|
|
|
18470
18580
|
});
|
|
18471
18581
|
this.threadId = started.thread.id;
|
|
18472
18582
|
this.threadPath = started.thread.path ?? null;
|
|
18583
|
+
if (this.durableThreadId !== this.threadId) {
|
|
18584
|
+
this.durableThreadId = null;
|
|
18585
|
+
}
|
|
18473
18586
|
await this.persistThreadId();
|
|
18474
|
-
await recordCodexSessionCatalog(this.options.runtimeDirectory, this.threadId, this.catalogRuntimeMeta());
|
|
18475
18587
|
}
|
|
18476
18588
|
catalogRuntimeMeta() {
|
|
18477
18589
|
return {
|
|
@@ -18541,12 +18653,17 @@ class CodexAppServerTransport {
|
|
|
18541
18653
|
if (method === "thread/started" || method === "thread/name/updated") {
|
|
18542
18654
|
const thread = params.thread;
|
|
18543
18655
|
if (thread?.id) {
|
|
18656
|
+
if (thread.id !== this.threadId) {
|
|
18657
|
+
this.durableThreadId = null;
|
|
18658
|
+
}
|
|
18544
18659
|
this.threadId = thread.id;
|
|
18545
18660
|
}
|
|
18546
18661
|
if ("path" in (thread ?? {})) {
|
|
18547
18662
|
this.threadPath = thread?.path ?? null;
|
|
18548
18663
|
}
|
|
18549
18664
|
this.persistThreadId();
|
|
18665
|
+
} else if (this.threadId && !this.durableThreadId) {
|
|
18666
|
+
this.persistThreadId();
|
|
18550
18667
|
}
|
|
18551
18668
|
this.emitNotification(message);
|
|
18552
18669
|
}
|
|
@@ -18598,16 +18715,46 @@ class CodexAppServerTransport {
|
|
|
18598
18715
|
});
|
|
18599
18716
|
this.persistState();
|
|
18600
18717
|
}
|
|
18601
|
-
|
|
18602
|
-
|
|
18718
|
+
persistThreadId(options = {}) {
|
|
18719
|
+
const persistence = this.threadPersistence.then(() => this.persistThreadIdNow(options));
|
|
18720
|
+
this.threadPersistence = persistence.catch(() => {
|
|
18721
|
+
return;
|
|
18722
|
+
});
|
|
18723
|
+
return persistence;
|
|
18724
|
+
}
|
|
18725
|
+
async persistThreadIdNow(options) {
|
|
18726
|
+
const threadId = this.threadId;
|
|
18727
|
+
if (!threadId) {
|
|
18728
|
+
this.durableThreadId = null;
|
|
18603
18729
|
await rm2(this.threadIdPath, { force: true });
|
|
18730
|
+
await this.persistState();
|
|
18604
18731
|
return;
|
|
18605
18732
|
}
|
|
18606
|
-
|
|
18733
|
+
let rolloutExists = false;
|
|
18734
|
+
if (this.threadPath) {
|
|
18735
|
+
try {
|
|
18736
|
+
rolloutExists = (await stat4(this.threadPath)).isFile();
|
|
18737
|
+
} catch {
|
|
18738
|
+
rolloutExists = false;
|
|
18739
|
+
}
|
|
18740
|
+
}
|
|
18741
|
+
if (!options.confirmed && !rolloutExists && this.durableThreadId !== threadId) {
|
|
18742
|
+
this.durableThreadId = null;
|
|
18743
|
+
await rm2(this.threadIdPath, { force: true });
|
|
18744
|
+
await this.persistState();
|
|
18745
|
+
return;
|
|
18746
|
+
}
|
|
18747
|
+
const becameDurable = this.durableThreadId !== threadId;
|
|
18748
|
+
await writeFile6(this.threadIdPath, `${threadId}
|
|
18607
18749
|
`);
|
|
18750
|
+
this.durableThreadId = threadId;
|
|
18608
18751
|
await this.persistState();
|
|
18752
|
+
if (becameDurable) {
|
|
18753
|
+
await recordCodexSessionCatalog(this.options.runtimeDirectory, threadId, this.catalogRuntimeMeta());
|
|
18754
|
+
}
|
|
18609
18755
|
}
|
|
18610
18756
|
async persistState() {
|
|
18757
|
+
const durableThreadPath = this.durableThreadId === this.threadId ? this.threadPath : null;
|
|
18611
18758
|
await mkdir6(this.options.runtimeDirectory, { recursive: true });
|
|
18612
18759
|
await writeFile6(this.statePath, JSON.stringify({
|
|
18613
18760
|
agentId: this.options.agentName,
|
|
@@ -18615,8 +18762,8 @@ class CodexAppServerTransport {
|
|
|
18615
18762
|
sessionId: this.options.sessionId,
|
|
18616
18763
|
projectRoot: this.options.cwd,
|
|
18617
18764
|
cwd: this.options.cwd,
|
|
18618
|
-
threadId: this.
|
|
18619
|
-
threadPath:
|
|
18765
|
+
threadId: this.durableThreadId,
|
|
18766
|
+
threadPath: durableThreadPath,
|
|
18620
18767
|
requestedThreadId: this.options.threadId ?? null,
|
|
18621
18768
|
requireExistingThread: this.options.requireExistingThread === true,
|
|
18622
18769
|
pid: this.process?.pid ?? null,
|
|
@@ -29611,6 +29758,7 @@ function loadUserConfig() {
|
|
|
29611
29758
|
}
|
|
29612
29759
|
}
|
|
29613
29760
|
function saveUserConfig(config) {
|
|
29761
|
+
assertTestIsolatedUserData("write the OpenScout user config", "OPENSCOUT_HOME");
|
|
29614
29762
|
const configPath = userConfigPath();
|
|
29615
29763
|
mkdirSync6(dirname16(configPath), { recursive: true });
|
|
29616
29764
|
writeFileSync6(configPath, JSON.stringify(config, null, 2) + `
|
|
@@ -32306,7 +32454,7 @@ var init_local_agents = __esm(() => {
|
|
|
32306
32454
|
OPENSCOUT_REPO_ROOT = resolve13(MODULE_DIRECTORY, "..", "..", "..");
|
|
32307
32455
|
DEFAULT_LOCAL_AGENT_CAPABILITIES = ["chat", "invoke", "deliver"];
|
|
32308
32456
|
DEFAULT_ONE_TIME_LOCAL_AGENT_CARD_TTL_MS = 24 * 60 * 60 * 1000;
|
|
32309
|
-
SUPPORTED_LOCAL_AGENT_HARNESSES = ["claude", "codex", "grok", "grok-acp", "kimi", "pi", "cursor"];
|
|
32457
|
+
SUPPORTED_LOCAL_AGENT_HARNESSES = ["claude", "codex", "grok", "grok-acp", "kimi", "pi", "cursor", "opencode"];
|
|
32310
32458
|
SUPPORTED_SCOUT_HARNESSES = [...SCOUT_LAUNCHABLE_HARNESSES];
|
|
32311
32459
|
DEFAULT_CLAUDE_SCOUT_ALLOWED_TOOLS = [
|
|
32312
32460
|
"mcp__scout__current_reply_context",
|
|
@@ -39222,6 +39370,10 @@ function hasColumn(database, tableName, columnName) {
|
|
|
39222
39370
|
const rows = database.query(`SELECT name FROM pragma_table_info('${escapedTableName}')`).all();
|
|
39223
39371
|
return rows.some((row) => row.name === columnName);
|
|
39224
39372
|
}
|
|
39373
|
+
function hasTable(database, tableName) {
|
|
39374
|
+
const row = database.query("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?1").get(tableName);
|
|
39375
|
+
return Boolean(row);
|
|
39376
|
+
}
|
|
39225
39377
|
function configureControlPlaneDatabase(database) {
|
|
39226
39378
|
database.exec("PRAGMA busy_timeout = 5000;");
|
|
39227
39379
|
database.exec("PRAGMA journal_mode = WAL;");
|
|
@@ -39383,6 +39535,7 @@ var init_control_plane_migrations = __esm(() => {
|
|
|
39383
39535
|
init_migrator();
|
|
39384
39536
|
init_schema();
|
|
39385
39537
|
init_support_paths();
|
|
39538
|
+
init_node_identity();
|
|
39386
39539
|
CONTROL_PLANE_SCHEMA_MIGRATIONS = [
|
|
39387
39540
|
{
|
|
39388
39541
|
id: "runtime-session-mapping-read-model",
|
|
@@ -39561,6 +39714,46 @@ WHERE latest.invocation_id = inv.id
|
|
|
39561
39714
|
database.exec("ALTER TABLE trusted_peers ADD COLUMN tls_spki_fingerprint TEXT");
|
|
39562
39715
|
}
|
|
39563
39716
|
}
|
|
39717
|
+
},
|
|
39718
|
+
{
|
|
39719
|
+
id: "canonicalize-mesh-nodes-and-rehome",
|
|
39720
|
+
description: "Re-homes foreign key references on Bonjour collision-suffixed ghost nodes to canonical stable node IDs and prunes ghost nodes.",
|
|
39721
|
+
apply(database) {
|
|
39722
|
+
if (!hasTable(database, "nodes"))
|
|
39723
|
+
return;
|
|
39724
|
+
const nodeRows = database.query("SELECT * FROM nodes").all();
|
|
39725
|
+
for (const row of nodeRows) {
|
|
39726
|
+
const canonicalId = canonicalMeshNodeId(row.id);
|
|
39727
|
+
if (canonicalId && canonicalId !== row.id) {
|
|
39728
|
+
const existing = nodeRows.find((r) => r.id === canonicalId);
|
|
39729
|
+
if (!existing) {
|
|
39730
|
+
database.query(`INSERT INTO nodes (
|
|
39731
|
+
id, mesh_id, name, host_name, advertise_scope, broker_url, tailnet_name,
|
|
39732
|
+
capabilities_json, labels_json, metadata_json, last_seen_at, registered_at
|
|
39733
|
+
) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12)
|
|
39734
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
39735
|
+
last_seen_at = MAX(COALESCE(nodes.last_seen_at, 0), COALESCE(excluded.last_seen_at, 0)),
|
|
39736
|
+
broker_url = COALESCE(excluded.broker_url, nodes.broker_url),
|
|
39737
|
+
tailnet_name = COALESCE(excluded.tailnet_name, nodes.tailnet_name)`).run(canonicalId, row.mesh_id, stripBonjourCollisionSuffix(row.name) || row.name, stripBonjourCollisionSuffix(row.host_name ?? "") || (row.host_name ?? null), row.advertise_scope, row.broker_url ?? null, row.tailnet_name ?? null, row.capabilities_json ?? null, row.labels_json ?? null, row.metadata_json ?? null, row.last_seen_at ?? null, row.registered_at);
|
|
39738
|
+
}
|
|
39739
|
+
database.query("UPDATE agents SET home_node_id = ?1 WHERE home_node_id = ?2").run(canonicalId, row.id);
|
|
39740
|
+
database.query("UPDATE agents SET authority_node_id = ?1 WHERE authority_node_id = ?2").run(canonicalId, row.id);
|
|
39741
|
+
database.query("UPDATE agent_endpoints SET node_id = ?1 WHERE node_id = ?2").run(canonicalId, row.id);
|
|
39742
|
+
database.query("UPDATE runtime_sessions SET node_id = ?1 WHERE node_id = ?2").run(canonicalId, row.id);
|
|
39743
|
+
database.query("UPDATE runtime_session_aliases SET node_id = ?1 WHERE node_id = ?2").run(canonicalId, row.id);
|
|
39744
|
+
database.query("UPDATE conversations SET authority_node_id = ?1 WHERE authority_node_id = ?2").run(canonicalId, row.id);
|
|
39745
|
+
database.query("UPDATE conversation_read_cursors SET reader_node_id = ?1 WHERE reader_node_id = ?2").run(canonicalId, row.id);
|
|
39746
|
+
database.query("UPDATE messages SET origin_node_id = ?1 WHERE origin_node_id = ?2").run(canonicalId, row.id);
|
|
39747
|
+
database.query("UPDATE deliveries SET target_node_id = ?1 WHERE target_node_id = ?2").run(canonicalId, row.id);
|
|
39748
|
+
database.query("UPDATE invocations SET requester_node_id = ?1 WHERE requester_node_id = ?2").run(canonicalId, row.id);
|
|
39749
|
+
database.query("UPDATE invocations SET target_node_id = ?1 WHERE target_node_id = ?2").run(canonicalId, row.id);
|
|
39750
|
+
database.query("UPDATE thread_events SET authority_node_id = ?1 WHERE authority_node_id = ?2").run(canonicalId, row.id);
|
|
39751
|
+
database.query("UPDATE thread_cursors SET authority_node_id = ?1 WHERE authority_node_id = ?2").run(canonicalId, row.id);
|
|
39752
|
+
database.query("UPDATE trusted_peers SET node_id = ?1 WHERE node_id = ?2").run(canonicalId, row.id);
|
|
39753
|
+
database.query("DELETE FROM nodes WHERE id = ?1").run(row.id);
|
|
39754
|
+
}
|
|
39755
|
+
}
|
|
39756
|
+
}
|
|
39564
39757
|
}
|
|
39565
39758
|
];
|
|
39566
39759
|
LEGACY_ROLE_MIGRATION_HASHES = [
|
|
@@ -40426,6 +40619,93 @@ class SQLiteControlPlaneStore {
|
|
|
40426
40619
|
sessionsDeleted: sessionsResult.changes ?? 0
|
|
40427
40620
|
};
|
|
40428
40621
|
}
|
|
40622
|
+
compactAndPruneMeshNodes(options = {}) {
|
|
40623
|
+
const now = options.now ?? currentTimestampMs();
|
|
40624
|
+
const maxStaleAgeMs = options.maxStaleAgeMs ?? 7 * 24 * 60 * 60 * 1000;
|
|
40625
|
+
const staleCutoff = now - maxStaleAgeMs;
|
|
40626
|
+
const nodeRows = this.db.query("SELECT * FROM nodes").all();
|
|
40627
|
+
const peerRows = this.db.query("SELECT * FROM trusted_peers").all();
|
|
40628
|
+
const rehomedMappings = [];
|
|
40629
|
+
const rehomeMap = new Map;
|
|
40630
|
+
for (const row of nodeRows) {
|
|
40631
|
+
const canonicalId = canonicalMeshNodeId(row.id);
|
|
40632
|
+
if (canonicalId && canonicalId !== row.id) {
|
|
40633
|
+
rehomeMap.set(row.id, { to: canonicalId, candidateRow: row });
|
|
40634
|
+
}
|
|
40635
|
+
}
|
|
40636
|
+
let rehomedNodeCount = 0;
|
|
40637
|
+
let prunedNodeCount = 0;
|
|
40638
|
+
this.db.transaction(() => {
|
|
40639
|
+
for (const [staleId, { to: canonicalId, candidateRow }] of rehomeMap.entries()) {
|
|
40640
|
+
const existingCanonical = nodeRows.find((r) => r.id === canonicalId);
|
|
40641
|
+
if (!existingCanonical) {
|
|
40642
|
+
this.db.query(`INSERT INTO nodes (
|
|
40643
|
+
id, mesh_id, name, host_name, advertise_scope, broker_url, tailnet_name,
|
|
40644
|
+
capabilities_json, labels_json, metadata_json, last_seen_at, registered_at
|
|
40645
|
+
) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12)
|
|
40646
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
40647
|
+
last_seen_at = MAX(COALESCE(nodes.last_seen_at, 0), COALESCE(excluded.last_seen_at, 0)),
|
|
40648
|
+
broker_url = COALESCE(excluded.broker_url, nodes.broker_url),
|
|
40649
|
+
tailnet_name = COALESCE(excluded.tailnet_name, nodes.tailnet_name)`).run(canonicalId, candidateRow.mesh_id, stripBonjourCollisionSuffix(candidateRow.name) || candidateRow.name, stripBonjourCollisionSuffix(candidateRow.host_name ?? "") || (candidateRow.host_name ?? null), candidateRow.advertise_scope, candidateRow.broker_url ?? null, candidateRow.tailnet_name ?? null, candidateRow.capabilities_json ?? null, candidateRow.labels_json ?? null, candidateRow.metadata_json ?? null, candidateRow.last_seen_at ?? null, candidateRow.registered_at);
|
|
40650
|
+
} else {
|
|
40651
|
+
this.db.query(`UPDATE nodes SET
|
|
40652
|
+
last_seen_at = MAX(COALESCE(last_seen_at, 0), COALESCE(?1, 0)),
|
|
40653
|
+
broker_url = COALESCE(?2, broker_url)
|
|
40654
|
+
WHERE id = ?3`).run(candidateRow.last_seen_at ?? null, candidateRow.broker_url ?? null, canonicalId);
|
|
40655
|
+
}
|
|
40656
|
+
this.db.query("UPDATE agents SET home_node_id = ?1 WHERE home_node_id = ?2").run(canonicalId, staleId);
|
|
40657
|
+
this.db.query("UPDATE agents SET authority_node_id = ?1 WHERE authority_node_id = ?2").run(canonicalId, staleId);
|
|
40658
|
+
this.db.query("UPDATE agent_endpoints SET node_id = ?1 WHERE node_id = ?2").run(canonicalId, staleId);
|
|
40659
|
+
this.db.query("UPDATE runtime_sessions SET node_id = ?1 WHERE node_id = ?2").run(canonicalId, staleId);
|
|
40660
|
+
this.db.query("UPDATE runtime_session_aliases SET node_id = ?1 WHERE node_id = ?2").run(canonicalId, staleId);
|
|
40661
|
+
this.db.query("UPDATE conversations SET authority_node_id = ?1 WHERE authority_node_id = ?2").run(canonicalId, staleId);
|
|
40662
|
+
this.db.query("UPDATE conversation_read_cursors SET reader_node_id = ?1 WHERE reader_node_id = ?2").run(canonicalId, staleId);
|
|
40663
|
+
this.db.query("UPDATE messages SET origin_node_id = ?1 WHERE origin_node_id = ?2").run(canonicalId, staleId);
|
|
40664
|
+
this.db.query("UPDATE deliveries SET target_node_id = ?1 WHERE target_node_id = ?2").run(canonicalId, staleId);
|
|
40665
|
+
this.db.query("UPDATE invocations SET requester_node_id = ?1 WHERE requester_node_id = ?2").run(canonicalId, staleId);
|
|
40666
|
+
this.db.query("UPDATE invocations SET target_node_id = ?1 WHERE target_node_id = ?2").run(canonicalId, staleId);
|
|
40667
|
+
this.db.query("UPDATE thread_events SET authority_node_id = ?1 WHERE authority_node_id = ?2").run(canonicalId, staleId);
|
|
40668
|
+
this.db.query("UPDATE thread_cursors SET authority_node_id = ?1 WHERE authority_node_id = ?2").run(canonicalId, staleId);
|
|
40669
|
+
this.db.query("UPDATE trusted_peers SET node_id = ?1 WHERE node_id = ?2").run(canonicalId, staleId);
|
|
40670
|
+
const delRes = this.db.query("DELETE FROM nodes WHERE id = ?1").run(staleId);
|
|
40671
|
+
if ((delRes.changes ?? 0) > 0) {
|
|
40672
|
+
prunedNodeCount++;
|
|
40673
|
+
rehomedNodeCount++;
|
|
40674
|
+
rehomedMappings.push({ from: staleId, to: canonicalId });
|
|
40675
|
+
}
|
|
40676
|
+
}
|
|
40677
|
+
for (const peer of peerRows) {
|
|
40678
|
+
if (peer.node_id) {
|
|
40679
|
+
const canonical = canonicalMeshNodeId(peer.node_id);
|
|
40680
|
+
if (canonical && canonical !== peer.node_id) {
|
|
40681
|
+
this.db.query("UPDATE trusted_peers SET node_id = ?1 WHERE key_id = ?2").run(canonical, peer.key_id);
|
|
40682
|
+
}
|
|
40683
|
+
}
|
|
40684
|
+
}
|
|
40685
|
+
const remainingNodes = this.db.query("SELECT * FROM nodes").all();
|
|
40686
|
+
for (const row of remainingNodes) {
|
|
40687
|
+
if (row.id === options.localNodeId)
|
|
40688
|
+
continue;
|
|
40689
|
+
const lastActive = row.last_seen_at ?? row.registered_at;
|
|
40690
|
+
if (lastActive > staleCutoff)
|
|
40691
|
+
continue;
|
|
40692
|
+
const isTrusted = peerRows.some((p) => p.node_id === row.id);
|
|
40693
|
+
if (isTrusted)
|
|
40694
|
+
continue;
|
|
40695
|
+
try {
|
|
40696
|
+
const delRes = this.db.query("DELETE FROM nodes WHERE id = ?1").run(row.id);
|
|
40697
|
+
if ((delRes.changes ?? 0) > 0) {
|
|
40698
|
+
prunedNodeCount++;
|
|
40699
|
+
}
|
|
40700
|
+
} catch {}
|
|
40701
|
+
}
|
|
40702
|
+
})();
|
|
40703
|
+
return {
|
|
40704
|
+
rehomedNodeCount,
|
|
40705
|
+
prunedNodeCount,
|
|
40706
|
+
rehomedMappings
|
|
40707
|
+
};
|
|
40708
|
+
}
|
|
40429
40709
|
close() {
|
|
40430
40710
|
this.flushPendingEvents();
|
|
40431
40711
|
if (this.flushPendingEventsTimer) {
|
|
@@ -42276,6 +42556,7 @@ class SQLiteControlPlaneStore {
|
|
|
42276
42556
|
var RUNTIME_SESSION_RETENTION_MS, RUNTIME_SESSION_ALIAS_METADATA_KEYS;
|
|
42277
42557
|
var init_sqlite_store = __esm(() => {
|
|
42278
42558
|
init_drizzle_orm();
|
|
42559
|
+
init_node_identity();
|
|
42279
42560
|
init_src();
|
|
42280
42561
|
init_registry3();
|
|
42281
42562
|
init_drizzle_client();
|
|
@@ -57946,10 +58227,75 @@ var init_iroh_bridge = __esm(() => {
|
|
|
57946
58227
|
init_support_paths();
|
|
57947
58228
|
});
|
|
57948
58229
|
|
|
58230
|
+
// ../runtime/src/mesh-dial-order.ts
|
|
58231
|
+
function meshDialRank(url) {
|
|
58232
|
+
let hostname2;
|
|
58233
|
+
try {
|
|
58234
|
+
hostname2 = new URL(url).hostname.replace(/^\[|\]$/g, "").toLowerCase();
|
|
58235
|
+
} catch {
|
|
58236
|
+
return 2;
|
|
58237
|
+
}
|
|
58238
|
+
if (isTailscaleIPv42(hostname2) || TAILSCALE_MAGIC_DNS.test(hostname2)) {
|
|
58239
|
+
return 1;
|
|
58240
|
+
}
|
|
58241
|
+
if (isPrivateLanIPv4(hostname2) || hostname2.endsWith(".local")) {
|
|
58242
|
+
return 0;
|
|
58243
|
+
}
|
|
58244
|
+
return 2;
|
|
58245
|
+
}
|
|
58246
|
+
function orderMeshDialUrls(urls) {
|
|
58247
|
+
const seen = new Set;
|
|
58248
|
+
const unique3 = [];
|
|
58249
|
+
for (const url of urls) {
|
|
58250
|
+
const trimmed = url.trim();
|
|
58251
|
+
if (!trimmed || seen.has(trimmed))
|
|
58252
|
+
continue;
|
|
58253
|
+
seen.add(trimmed);
|
|
58254
|
+
unique3.push(trimmed);
|
|
58255
|
+
}
|
|
58256
|
+
return unique3.map((url, index2) => ({ url, index: index2, rank: meshDialRank(url) })).sort((left, right) => left.rank - right.rank || left.index - right.index).map((entry) => entry.url);
|
|
58257
|
+
}
|
|
58258
|
+
function httpMeshUrlsForNode(node) {
|
|
58259
|
+
const urls = [];
|
|
58260
|
+
if (node.brokerUrl)
|
|
58261
|
+
urls.push(node.brokerUrl);
|
|
58262
|
+
for (const entrypoint of node.meshEntrypoints ?? []) {
|
|
58263
|
+
if (entrypoint.kind === "http" && entrypoint.url) {
|
|
58264
|
+
urls.push(entrypoint.url);
|
|
58265
|
+
}
|
|
58266
|
+
}
|
|
58267
|
+
return orderMeshDialUrls(urls);
|
|
58268
|
+
}
|
|
58269
|
+
function isPrivateLanIPv4(address) {
|
|
58270
|
+
const octets = parseIPv42(address);
|
|
58271
|
+
if (!octets)
|
|
58272
|
+
return false;
|
|
58273
|
+
const [first, second] = octets;
|
|
58274
|
+
return first === 10 || first === 172 && second >= 16 && second <= 31 || first === 192 && second === 168;
|
|
58275
|
+
}
|
|
58276
|
+
function isTailscaleIPv42(address) {
|
|
58277
|
+
const octets = parseIPv42(address);
|
|
58278
|
+
return Boolean(octets && octets[0] === 100 && octets[1] >= 64 && octets[1] <= 127);
|
|
58279
|
+
}
|
|
58280
|
+
function parseIPv42(address) {
|
|
58281
|
+
const octets = address.split(".");
|
|
58282
|
+
if (octets.length !== 4)
|
|
58283
|
+
return null;
|
|
58284
|
+
const numbers = octets.map((octet) => Number(octet));
|
|
58285
|
+
if (numbers.some((value) => !Number.isInteger(value) || value < 0 || value > 255))
|
|
58286
|
+
return null;
|
|
58287
|
+
return numbers;
|
|
58288
|
+
}
|
|
58289
|
+
var TAILSCALE_MAGIC_DNS;
|
|
58290
|
+
var init_mesh_dial_order = __esm(() => {
|
|
58291
|
+
TAILSCALE_MAGIC_DNS = /\.(ts\.net|tailscale\.net)$/i;
|
|
58292
|
+
});
|
|
58293
|
+
|
|
57949
58294
|
// ../runtime/src/mesh-forwarding.ts
|
|
57950
58295
|
var init_mesh_forwarding = __esm(() => {
|
|
57951
58296
|
init_iroh_bridge();
|
|
57952
58297
|
init_mesh_peer_client();
|
|
58298
|
+
init_mesh_dial_order();
|
|
57953
58299
|
});
|
|
57954
58300
|
|
|
57955
58301
|
// ../runtime/src/mesh-rendezvous.ts
|
|
@@ -57972,6 +58318,7 @@ var init_mesh_mdns_service = __esm(() => {
|
|
|
57972
58318
|
// ../runtime/src/mesh-bind-controller.ts
|
|
57973
58319
|
var init_mesh_bind_controller = __esm(() => {
|
|
57974
58320
|
init_broker_process_manager();
|
|
58321
|
+
init_mesh_dial_order();
|
|
57975
58322
|
init_broker_server_lifecycle();
|
|
57976
58323
|
init_mesh_mdns_service();
|
|
57977
58324
|
init_node_tls_identity();
|
|
@@ -59818,14 +60165,14 @@ class BrokerRendezvousService {
|
|
|
59818
60165
|
}
|
|
59819
60166
|
return consumedResponse(activeMatch, input.participantId);
|
|
59820
60167
|
}
|
|
59821
|
-
const
|
|
59822
|
-
if (
|
|
60168
|
+
const presence2 = this.presences.get(key);
|
|
60169
|
+
if (presence2 && presence2.participantId !== input.participantId) {
|
|
59823
60170
|
const match = {
|
|
59824
60171
|
id: this.createMatchId(),
|
|
59825
|
-
projectRoot:
|
|
59826
|
-
codename:
|
|
59827
|
-
normalizedCodename:
|
|
59828
|
-
participantIds: [
|
|
60172
|
+
projectRoot: presence2.projectRoot,
|
|
60173
|
+
codename: presence2.codename,
|
|
60174
|
+
normalizedCodename: presence2.normalizedCodename,
|
|
60175
|
+
participantIds: [presence2.participantId, input.participantId],
|
|
59829
60176
|
createdAt: now,
|
|
59830
60177
|
expiresAt: now + this.matchTtlMs
|
|
59831
60178
|
};
|
|
@@ -59834,7 +60181,7 @@ class BrokerRendezvousService {
|
|
|
59834
60181
|
this.resolveMatchedWaiters(key, match);
|
|
59835
60182
|
return matchedResponse(match, input.participantId);
|
|
59836
60183
|
}
|
|
59837
|
-
if (!
|
|
60184
|
+
if (!presence2) {
|
|
59838
60185
|
const expiredInvite = this.expiredInvites.get(key);
|
|
59839
60186
|
if (expiredInvite) {
|
|
59840
60187
|
return expiredResponse(expiredInvite, input.participantId);
|
|
@@ -59851,9 +60198,9 @@ class BrokerRendezvousService {
|
|
|
59851
60198
|
};
|
|
59852
60199
|
}
|
|
59853
60200
|
if (input.waitMs === 0) {
|
|
59854
|
-
return waitingResponse(
|
|
60201
|
+
return waitingResponse(presence2);
|
|
59855
60202
|
}
|
|
59856
|
-
return await this.waitForMatch(key,
|
|
60203
|
+
return await this.waitForMatch(key, presence2, input.waitMs);
|
|
59857
60204
|
}
|
|
59858
60205
|
create(projectRoot, participantId, requestedCodename) {
|
|
59859
60206
|
const now = this.now();
|
|
@@ -59875,15 +60222,15 @@ class BrokerRendezvousService {
|
|
|
59875
60222
|
suggestion: "choose_another_codename"
|
|
59876
60223
|
};
|
|
59877
60224
|
}
|
|
59878
|
-
const
|
|
59879
|
-
if (
|
|
60225
|
+
const presence2 = this.presences.get(key);
|
|
60226
|
+
if (presence2) {
|
|
59880
60227
|
return {
|
|
59881
60228
|
status: "codename_busy",
|
|
59882
|
-
codename:
|
|
60229
|
+
codename: presence2.codename,
|
|
59883
60230
|
projectRoot,
|
|
59884
60231
|
participantId,
|
|
59885
60232
|
participantCount: 1,
|
|
59886
|
-
expiresAt:
|
|
60233
|
+
expiresAt: presence2.expiresAt,
|
|
59887
60234
|
suggestion: "choose_another_codename"
|
|
59888
60235
|
};
|
|
59889
60236
|
}
|
|
@@ -59901,7 +60248,7 @@ class BrokerRendezvousService {
|
|
|
59901
60248
|
throw new Error("could not allocate a unique match codename");
|
|
59902
60249
|
}
|
|
59903
60250
|
createPresence(projectRoot, participantId, codename, normalizedCodename, now) {
|
|
59904
|
-
const
|
|
60251
|
+
const presence2 = {
|
|
59905
60252
|
participantId,
|
|
59906
60253
|
projectRoot,
|
|
59907
60254
|
codename,
|
|
@@ -59909,14 +60256,14 @@ class BrokerRendezvousService {
|
|
|
59909
60256
|
joinedAt: now,
|
|
59910
60257
|
expiresAt: now + this.presenceTtlMs
|
|
59911
60258
|
};
|
|
59912
|
-
this.presences.set(rendezvousKey(projectRoot, normalizedCodename),
|
|
60259
|
+
this.presences.set(rendezvousKey(projectRoot, normalizedCodename), presence2);
|
|
59913
60260
|
return {
|
|
59914
60261
|
status: "created",
|
|
59915
60262
|
codename,
|
|
59916
60263
|
projectRoot,
|
|
59917
60264
|
participantId,
|
|
59918
60265
|
createdAt: now,
|
|
59919
|
-
expiresAt:
|
|
60266
|
+
expiresAt: presence2.expiresAt
|
|
59920
60267
|
};
|
|
59921
60268
|
}
|
|
59922
60269
|
hasCodenameInAnotherProject(projectRoot, normalizedCodename) {
|
|
@@ -59928,11 +60275,11 @@ class BrokerRendezvousService {
|
|
|
59928
60275
|
}
|
|
59929
60276
|
cleanupExpired() {
|
|
59930
60277
|
const now = this.now();
|
|
59931
|
-
for (const [key,
|
|
59932
|
-
if (
|
|
60278
|
+
for (const [key, presence2] of this.presences) {
|
|
60279
|
+
if (presence2.expiresAt > now)
|
|
59933
60280
|
continue;
|
|
59934
60281
|
this.presences.delete(key);
|
|
59935
|
-
const expiredInvite = this.recordExpiredInvite(
|
|
60282
|
+
const expiredInvite = this.recordExpiredInvite(presence2);
|
|
59936
60283
|
this.resolveExpiredWaiters(key, expiredInvite);
|
|
59937
60284
|
}
|
|
59938
60285
|
for (const [key, match] of this.matches) {
|
|
@@ -59950,18 +60297,18 @@ class BrokerRendezvousService {
|
|
|
59950
60297
|
if (this.cleanupTimer) {
|
|
59951
60298
|
clearInterval(this.cleanupTimer);
|
|
59952
60299
|
}
|
|
59953
|
-
for (const [key,
|
|
59954
|
-
this.resolveExpiredWaiters(key, this.recordExpiredInvite(
|
|
60300
|
+
for (const [key, presence2] of this.presences) {
|
|
60301
|
+
this.resolveExpiredWaiters(key, this.recordExpiredInvite(presence2));
|
|
59955
60302
|
}
|
|
59956
60303
|
this.presences.clear();
|
|
59957
60304
|
this.matches.clear();
|
|
59958
60305
|
this.expiredInvites.clear();
|
|
59959
60306
|
}
|
|
59960
|
-
waitForMatch(key,
|
|
60307
|
+
waitForMatch(key, presence2, waitMs) {
|
|
59961
60308
|
return new Promise((resolveWait) => {
|
|
59962
|
-
const waitDuration = Math.min(waitMs, Math.max(0,
|
|
60309
|
+
const waitDuration = Math.min(waitMs, Math.max(0, presence2.expiresAt - this.now()));
|
|
59963
60310
|
const waiter = {
|
|
59964
|
-
participantId:
|
|
60311
|
+
participantId: presence2.participantId,
|
|
59965
60312
|
resolve: resolveWait,
|
|
59966
60313
|
timer: setTimeout(() => {
|
|
59967
60314
|
this.removeWaiter(key, waiter);
|
|
@@ -59982,7 +60329,7 @@ class BrokerRendezvousService {
|
|
|
59982
60329
|
resolveWait(expiredResponse(expiredInvite, waiter.participantId));
|
|
59983
60330
|
return;
|
|
59984
60331
|
}
|
|
59985
|
-
resolveWait(notFoundResponse(
|
|
60332
|
+
resolveWait(notFoundResponse(presence2, waiter.participantId));
|
|
59986
60333
|
}, waitDuration)
|
|
59987
60334
|
};
|
|
59988
60335
|
waiter.timer.unref?.();
|
|
@@ -60011,15 +60358,15 @@ class BrokerRendezvousService {
|
|
|
60011
60358
|
waiter.resolve(expiredResponse(expiredInvite, waiter.participantId));
|
|
60012
60359
|
}
|
|
60013
60360
|
}
|
|
60014
|
-
recordExpiredInvite(
|
|
60361
|
+
recordExpiredInvite(presence2) {
|
|
60015
60362
|
const expiredInvite = {
|
|
60016
|
-
projectRoot:
|
|
60017
|
-
codename:
|
|
60018
|
-
normalizedCodename:
|
|
60019
|
-
inviteExpiresAt:
|
|
60363
|
+
projectRoot: presence2.projectRoot,
|
|
60364
|
+
codename: presence2.codename,
|
|
60365
|
+
normalizedCodename: presence2.normalizedCodename,
|
|
60366
|
+
inviteExpiresAt: presence2.expiresAt,
|
|
60020
60367
|
retainUntil: this.now() + this.matchTtlMs
|
|
60021
60368
|
};
|
|
60022
|
-
this.expiredInvites.set(rendezvousKey(
|
|
60369
|
+
this.expiredInvites.set(rendezvousKey(presence2.projectRoot, presence2.normalizedCodename), expiredInvite);
|
|
60023
60370
|
return expiredInvite;
|
|
60024
60371
|
}
|
|
60025
60372
|
removeWaiter(key, waiter) {
|
|
@@ -60098,14 +60445,14 @@ function createRandomInviteCodename() {
|
|
|
60098
60445
|
function rendezvousKey(projectRoot, normalizedCodename) {
|
|
60099
60446
|
return `${projectRoot}\x00${normalizedCodename}`;
|
|
60100
60447
|
}
|
|
60101
|
-
function waitingResponse(
|
|
60448
|
+
function waitingResponse(presence2) {
|
|
60102
60449
|
return {
|
|
60103
60450
|
status: "waiting",
|
|
60104
|
-
codename:
|
|
60105
|
-
projectRoot:
|
|
60106
|
-
participantId:
|
|
60107
|
-
joinedAt:
|
|
60108
|
-
expiresAt:
|
|
60451
|
+
codename: presence2.codename,
|
|
60452
|
+
projectRoot: presence2.projectRoot,
|
|
60453
|
+
participantId: presence2.participantId,
|
|
60454
|
+
joinedAt: presence2.joinedAt,
|
|
60455
|
+
expiresAt: presence2.expiresAt
|
|
60109
60456
|
};
|
|
60110
60457
|
}
|
|
60111
60458
|
function matchedResponse(match, participantId) {
|
|
@@ -60150,11 +60497,11 @@ function projectMismatchResponse(input) {
|
|
|
60150
60497
|
suggestion: "run_in_invitation_project"
|
|
60151
60498
|
};
|
|
60152
60499
|
}
|
|
60153
|
-
function notFoundResponse(
|
|
60500
|
+
function notFoundResponse(presence2, participantId) {
|
|
60154
60501
|
return {
|
|
60155
60502
|
status: "not_found",
|
|
60156
|
-
codename:
|
|
60157
|
-
projectRoot:
|
|
60503
|
+
codename: presence2.codename,
|
|
60504
|
+
projectRoot: presence2.projectRoot,
|
|
60158
60505
|
participantId,
|
|
60159
60506
|
suggestion: "check_codename_or_create"
|
|
60160
60507
|
};
|
|
@@ -61112,10 +61459,8 @@ async function loadOpenScoutOnboardingState(options = {}) {
|
|
|
61112
61459
|
const operatorNameSource = explicitUserName ? "user-config" : envOperatorName ? "env" : settingsOperatorName || answeredSettingsOperatorName ? "settings" : "default";
|
|
61113
61460
|
const contextRoot = settings.discovery.contextRoot ?? null;
|
|
61114
61461
|
const project = await resolveProjectConfig({ currentDirectory, contextRoot });
|
|
61115
|
-
const
|
|
61116
|
-
|
|
61117
|
-
options.catalog ?? loadHarnessCatalogSnapshot().catch(() => null)
|
|
61118
|
-
]);
|
|
61462
|
+
const broker = options.broker ?? await brokerServiceStatus().catch(() => null);
|
|
61463
|
+
const catalog = options.catalog ?? await loadHarnessCatalogSnapshot().catch(() => null);
|
|
61119
61464
|
const readyRuntimeCount = catalog?.entries.filter((entry) => entry.readinessReport.ready).length ?? 0;
|
|
61120
61465
|
const hasReadyRuntime = readyRuntimeCount > 0;
|
|
61121
61466
|
const hasLocalConfig = localConfigExists();
|
|
@@ -61182,11 +61527,7 @@ async function ensureOpenScoutOnboardingLocalConfig(options = {}) {
|
|
|
61182
61527
|
}, {
|
|
61183
61528
|
currentDirectory: options.currentDirectory
|
|
61184
61529
|
});
|
|
61185
|
-
return loadOpenScoutOnboardingState({
|
|
61186
|
-
currentDirectory: options.currentDirectory,
|
|
61187
|
-
broker: options.broker,
|
|
61188
|
-
catalog: options.catalog
|
|
61189
|
-
});
|
|
61530
|
+
return loadOpenScoutOnboardingState({ currentDirectory: options.currentDirectory });
|
|
61190
61531
|
}
|
|
61191
61532
|
async function saveOpenScoutOnboardingIdentity(input) {
|
|
61192
61533
|
const name2 = input.name.trim();
|
|
@@ -61206,11 +61547,7 @@ async function saveOpenScoutOnboardingIdentity(input) {
|
|
|
61206
61547
|
}, {
|
|
61207
61548
|
currentDirectory: input.currentDirectory
|
|
61208
61549
|
});
|
|
61209
|
-
return loadOpenScoutOnboardingState({
|
|
61210
|
-
currentDirectory: input.currentDirectory,
|
|
61211
|
-
broker: input.broker,
|
|
61212
|
-
catalog: input.catalog
|
|
61213
|
-
});
|
|
61550
|
+
return loadOpenScoutOnboardingState({ currentDirectory: input.currentDirectory });
|
|
61214
61551
|
}
|
|
61215
61552
|
async function saveOpenScoutOnboardingProject(input) {
|
|
61216
61553
|
const contextRoot = normalizePath2(input.contextRoot);
|
|
@@ -61238,11 +61575,7 @@ async function saveOpenScoutOnboardingProject(input) {
|
|
|
61238
61575
|
}, {
|
|
61239
61576
|
currentDirectory: input.currentDirectory ?? contextRoot
|
|
61240
61577
|
});
|
|
61241
|
-
return loadOpenScoutOnboardingState({
|
|
61242
|
-
currentDirectory: contextRoot,
|
|
61243
|
-
broker: input.broker,
|
|
61244
|
-
catalog: input.catalog
|
|
61245
|
-
});
|
|
61578
|
+
return loadOpenScoutOnboardingState({ currentDirectory: contextRoot });
|
|
61246
61579
|
}
|
|
61247
61580
|
async function triggerMeshDiscovery(broker) {
|
|
61248
61581
|
if (!broker.reachable || !broker.brokerUrl)
|
|
@@ -62513,8 +62846,137 @@ var init_mobile_push = __esm(() => {
|
|
|
62513
62846
|
|
|
62514
62847
|
// ../runtime/src/agent-run-registry.ts
|
|
62515
62848
|
var init_agent_run_registry = () => {};
|
|
62849
|
+
|
|
62850
|
+
// ../runtime/src/observed-status-projection.ts
|
|
62851
|
+
var init_observed_status_projection = () => {};
|
|
62852
|
+
|
|
62516
62853
|
// ../runtime/src/activity-projection.ts
|
|
62517
|
-
var init_activity_projection = () => {
|
|
62854
|
+
var init_activity_projection = __esm(() => {
|
|
62855
|
+
init_observed_status_projection();
|
|
62856
|
+
});
|
|
62857
|
+
|
|
62858
|
+
// ../runtime/src/activity-transitions.ts
|
|
62859
|
+
class ActivityTransitionTracker {
|
|
62860
|
+
transitions = new Map;
|
|
62861
|
+
record(agentId, activity2, observedAt2, now) {
|
|
62862
|
+
const previous = this.transitions.get(agentId);
|
|
62863
|
+
if (previous && previous.activity === activity2) {
|
|
62864
|
+
return previous.transitionAt;
|
|
62865
|
+
}
|
|
62866
|
+
const transitionAt = Number.isFinite(observedAt2) ? Math.min(observedAt2, now) : now;
|
|
62867
|
+
this.transitions.set(agentId, { activity: activity2, transitionAt });
|
|
62868
|
+
return transitionAt;
|
|
62869
|
+
}
|
|
62870
|
+
peek(agentId) {
|
|
62871
|
+
const transition = this.transitions.get(agentId);
|
|
62872
|
+
return transition ? { ...transition } : undefined;
|
|
62873
|
+
}
|
|
62874
|
+
forget(agentId) {
|
|
62875
|
+
this.transitions.delete(agentId);
|
|
62876
|
+
}
|
|
62877
|
+
clear() {
|
|
62878
|
+
this.transitions.clear();
|
|
62879
|
+
}
|
|
62880
|
+
size() {
|
|
62881
|
+
return this.transitions.size;
|
|
62882
|
+
}
|
|
62883
|
+
}
|
|
62884
|
+
|
|
62885
|
+
// ../runtime/src/presence-map.ts
|
|
62886
|
+
class BrokerPresenceMap {
|
|
62887
|
+
beats = new Map;
|
|
62888
|
+
lastDetailChangeAt = new Map;
|
|
62889
|
+
staleAfterMs;
|
|
62890
|
+
goneAfterStaleMs;
|
|
62891
|
+
detailDebounceMs;
|
|
62892
|
+
transitions;
|
|
62893
|
+
constructor(options = {}) {
|
|
62894
|
+
this.staleAfterMs = options.staleAfterMs ?? PRESENCE_STALE_AFTER_MS;
|
|
62895
|
+
this.goneAfterStaleMs = options.goneAfterStaleMs ?? PRESENCE_GONE_AFTER_STALE_MS;
|
|
62896
|
+
this.detailDebounceMs = options.detailDebounceMs ?? DEFAULT_DETAIL_DEBOUNCE_MS;
|
|
62897
|
+
this.transitions = options.transitions ?? new ActivityTransitionTracker;
|
|
62898
|
+
}
|
|
62899
|
+
observe(observation, now) {
|
|
62900
|
+
const agentId = observation.agentId ?? observation.status.agentId ?? observation.status.subjectId;
|
|
62901
|
+
if (!agentId)
|
|
62902
|
+
return;
|
|
62903
|
+
const status = observation.status;
|
|
62904
|
+
if (isTransportInferredStall(status))
|
|
62905
|
+
return;
|
|
62906
|
+
const updatedAt = Math.min(status.updatedAt, now);
|
|
62907
|
+
const staleAt = Math.max(status.staleAt ?? 0, updatedAt + this.staleAfterMs);
|
|
62908
|
+
if (isPresenceGone({ staleAt }, now, { goneAfterStaleMs: this.goneAfterStaleMs })) {
|
|
62909
|
+
this.forget(agentId);
|
|
62910
|
+
return;
|
|
62911
|
+
}
|
|
62912
|
+
const previous = this.beats.get(agentId);
|
|
62913
|
+
const detail = status.detail?.title ?? undefined;
|
|
62914
|
+
const transitionAt = this.transitions.record(agentId, status.activity, status.transitionAt ?? status.updatedAt, now);
|
|
62915
|
+
const activityChanged = previous?.activity !== status.activity;
|
|
62916
|
+
const detailChanged = previous !== undefined && previous.detail !== detail;
|
|
62917
|
+
const debounceElapsed = now - (this.lastDetailChangeAt.get(agentId) ?? 0) >= this.detailDebounceMs;
|
|
62918
|
+
const transitioned = previous === undefined || activityChanged || detailChanged && debounceElapsed;
|
|
62919
|
+
if (activityChanged || detailChanged && debounceElapsed) {
|
|
62920
|
+
this.lastDetailChangeAt.set(agentId, now);
|
|
62921
|
+
}
|
|
62922
|
+
const beat = {
|
|
62923
|
+
agentId,
|
|
62924
|
+
displayName: observation.displayName ?? previous?.displayName,
|
|
62925
|
+
activity: status.activity,
|
|
62926
|
+
phase: status.phase,
|
|
62927
|
+
detail,
|
|
62928
|
+
transitionAt,
|
|
62929
|
+
updatedAt,
|
|
62930
|
+
staleAt,
|
|
62931
|
+
confidence: status.confidence,
|
|
62932
|
+
needRef: observation.needRef,
|
|
62933
|
+
boundConversationId: observation.boundConversationId
|
|
62934
|
+
};
|
|
62935
|
+
this.beats.set(agentId, beat);
|
|
62936
|
+
return { beat, transitioned, previousActivity: previous?.activity };
|
|
62937
|
+
}
|
|
62938
|
+
snapshot(now) {
|
|
62939
|
+
this.prune(now);
|
|
62940
|
+
return { at: now, beats: [...this.beats.values()] };
|
|
62941
|
+
}
|
|
62942
|
+
get(agentId) {
|
|
62943
|
+
return this.beats.get(agentId);
|
|
62944
|
+
}
|
|
62945
|
+
prune(now) {
|
|
62946
|
+
const dropped = [];
|
|
62947
|
+
for (const [agentId, beat] of this.beats) {
|
|
62948
|
+
if (!isPresenceGone(beat, now, { goneAfterStaleMs: this.goneAfterStaleMs }))
|
|
62949
|
+
continue;
|
|
62950
|
+
this.beats.delete(agentId);
|
|
62951
|
+
this.lastDetailChangeAt.delete(agentId);
|
|
62952
|
+
this.transitions.forget(agentId);
|
|
62953
|
+
dropped.push(agentId);
|
|
62954
|
+
}
|
|
62955
|
+
return dropped;
|
|
62956
|
+
}
|
|
62957
|
+
forget(agentId) {
|
|
62958
|
+
this.beats.delete(agentId);
|
|
62959
|
+
this.lastDetailChangeAt.delete(agentId);
|
|
62960
|
+
this.transitions.forget(agentId);
|
|
62961
|
+
}
|
|
62962
|
+
clear() {
|
|
62963
|
+
this.beats.clear();
|
|
62964
|
+
this.lastDetailChangeAt.clear();
|
|
62965
|
+
this.transitions.clear();
|
|
62966
|
+
}
|
|
62967
|
+
size() {
|
|
62968
|
+
return this.beats.size;
|
|
62969
|
+
}
|
|
62970
|
+
}
|
|
62971
|
+
function isTransportInferredStall(status) {
|
|
62972
|
+
if (status.activity !== "stalled")
|
|
62973
|
+
return false;
|
|
62974
|
+
return status.provenance.some((entry) => entry.source === "staleness_inference");
|
|
62975
|
+
}
|
|
62976
|
+
var DEFAULT_DETAIL_DEBOUNCE_MS = 5000;
|
|
62977
|
+
var init_presence_map = __esm(() => {
|
|
62978
|
+
init_src();
|
|
62979
|
+
});
|
|
62518
62980
|
|
|
62519
62981
|
// ../runtime/src/session-attention.ts
|
|
62520
62982
|
function sessionApprovalAttentionId(sessionId, turnId, blockId, version2) {
|
|
@@ -64984,7 +65446,9 @@ var init_src3 = __esm(() => {
|
|
|
64984
65446
|
init_mobile_push();
|
|
64985
65447
|
init_permission_policy2();
|
|
64986
65448
|
init_agent_run_registry();
|
|
65449
|
+
init_observed_status_projection();
|
|
64987
65450
|
init_activity_projection();
|
|
65451
|
+
init_presence_map();
|
|
64988
65452
|
init_session_display_projection();
|
|
64989
65453
|
init_issue_runner();
|
|
64990
65454
|
init_issue_runner_service();
|
|
@@ -69105,10 +69569,10 @@ function bootstrapLaunchdJob(plistPath, uid) {
|
|
|
69105
69569
|
return { ok, detail };
|
|
69106
69570
|
}
|
|
69107
69571
|
function chooseLaunchdStartMethod(input) {
|
|
69108
|
-
if (input.loaded)
|
|
69109
|
-
return "kickstart";
|
|
69110
69572
|
if (input.scoutdPath)
|
|
69111
69573
|
return "scoutd";
|
|
69574
|
+
if (input.loaded)
|
|
69575
|
+
return "kickstart";
|
|
69112
69576
|
return input.plistExists ? "bootstrap" : "unavailable";
|
|
69113
69577
|
}
|
|
69114
69578
|
function startLaunchdJob(label, uid, home, options = {}) {
|
|
@@ -69180,14 +69644,9 @@ function verifyTree(tree) {
|
|
|
69180
69644
|
ownedBy(web, broker2, "web");
|
|
69181
69645
|
const app = single("app");
|
|
69182
69646
|
const menu = single("menu");
|
|
69183
|
-
|
|
69184
|
-
|
|
69185
|
-
|
|
69186
|
-
layer: "pairing",
|
|
69187
|
-
message: `pairing controller pid ${controller.pid} is not owned by ScoutMenu pid ${menu.pid}`
|
|
69188
|
-
});
|
|
69189
|
-
}
|
|
69190
|
-
}
|
|
69647
|
+
const pairing = single("pairing");
|
|
69648
|
+
const pairingOwner = tree.layers.base[0] ?? menu;
|
|
69649
|
+
ownedBy(pairing, pairingOwner, "pairing");
|
|
69191
69650
|
for (const stray of detachedExpectedProcesses(tree)) {
|
|
69192
69651
|
problems.push({
|
|
69193
69652
|
layer: stray.layer,
|
|
@@ -69216,8 +69675,8 @@ var SUPERVISED_LAYERS, LAUNCH_SERVICES_LAYERS, SCOUT_LAUNCHD_LABEL = "app.opensc
|
|
|
69216
69675
|
pairing: []
|
|
69217
69676
|
});
|
|
69218
69677
|
var init_app_lifecycle = __esm(() => {
|
|
69219
|
-
SUPERVISED_LAYERS = ["web", "edge", "broker", "probes", "base", "scoutd"];
|
|
69220
|
-
LAUNCH_SERVICES_LAYERS = ["
|
|
69678
|
+
SUPERVISED_LAYERS = ["pairing", "web", "edge", "broker", "probes", "base", "scoutd"];
|
|
69679
|
+
LAUNCH_SERVICES_LAYERS = ["menu", "app"];
|
|
69221
69680
|
});
|
|
69222
69681
|
|
|
69223
69682
|
// ../../apps/desktop/src/cli/commands/app.ts
|
|
@@ -69256,8 +69715,8 @@ function renderAppCommandHelp() {
|
|
|
69256
69715
|
" start = up",
|
|
69257
69716
|
"",
|
|
69258
69717
|
"Ownership:",
|
|
69259
|
-
" launchd -> scoutd -> base/probes -> broker/edge -> web",
|
|
69260
|
-
" LaunchServices -> Scout -> embedded ScoutMenu
|
|
69718
|
+
" launchd -> scoutd -> base/probes -> pairing/broker/edge -> web",
|
|
69719
|
+
" LaunchServices -> Scout -> embedded ScoutMenu",
|
|
69261
69720
|
"",
|
|
69262
69721
|
"Behavior:",
|
|
69263
69722
|
" Stop walks the tree leaf-first. The LaunchServices apps are signalled",
|
|
@@ -70470,7 +70929,7 @@ function renderAliasCommandHelp() {
|
|
|
70470
70929
|
"Bare native agent names keep precedence; use alias:<name> for explicit alias routing.",
|
|
70471
70930
|
"",
|
|
70472
70931
|
"Examples:",
|
|
70473
|
-
" scout alias set review --to scope.main.
|
|
70932
|
+
" scout alias set review --to scope.main.arts-mac-mini-local",
|
|
70474
70933
|
" scout alias set patch --to session:019eff52-9347-7470-ba5c-6bfe99d8dd83",
|
|
70475
70934
|
" scout alias repoint patch --to session:<new-id> --if-revision 4",
|
|
70476
70935
|
' scout ask --to alias:review "take a fresh pass"'
|
|
@@ -99489,7 +99948,7 @@ var init_stdio2 = __esm(() => {
|
|
|
99489
99948
|
// ../../apps/desktop/src/shared/product.ts
|
|
99490
99949
|
var SCOUT_APP_VERSION;
|
|
99491
99950
|
var init_product = __esm(() => {
|
|
99492
|
-
SCOUT_APP_VERSION = process.env.SCOUT_APP_VERSION?.trim() || "0.2.
|
|
99951
|
+
SCOUT_APP_VERSION = process.env.SCOUT_APP_VERSION?.trim() || "0.2.86";
|
|
99493
99952
|
});
|
|
99494
99953
|
|
|
99495
99954
|
// ../../apps/desktop/src/core/mcp/stdio-server-lifecycle.ts
|
|
@@ -103835,7 +104294,7 @@ async function runInstallCommand(context, args) {
|
|
|
103835
104294
|
message: `${verb} OpenScout ${installedAfter} \u2192 ${APP_PATH}${relaunchNote}`
|
|
103836
104295
|
}, renderInstallResult);
|
|
103837
104296
|
}
|
|
103838
|
-
var GITHUB_OWNER = "
|
|
104297
|
+
var GITHUB_OWNER = "arach", GITHUB_REPO = "openscout", APP_NAME = "OpenScout.app", APP_PATH, INFO_PLIST_PATH, APP_BUNDLE_ID = "app.openscout.scout", APP_PROCESS_NAME = "Scout", USER_AGENT = "scout-cli", HELP_FLAGS9;
|
|
103839
104298
|
var init_install = __esm(() => {
|
|
103840
104299
|
init_errors();
|
|
103841
104300
|
APP_PATH = `/Applications/${APP_NAME}`;
|
|
@@ -112873,63 +113332,65 @@ async function runMeshPing(target2) {
|
|
|
112873
113332
|
const brokerUrl = resolveScoutBrokerUrl();
|
|
112874
113333
|
const context = await loadScoutBrokerContext(brokerUrl);
|
|
112875
113334
|
const localMeshId = context?.node.meshId ?? null;
|
|
112876
|
-
|
|
112877
|
-
if (target2.startsWith("http://") || target2.startsWith("https://")) {
|
|
112878
|
-
probeUrl = target2;
|
|
112879
|
-
} else {
|
|
112880
|
-
const nodes = context?.snapshot.nodes ?? {};
|
|
112881
|
-
const matchedNode = Object.values(nodes).find((n) => n.id === target2 || n.name === target2 || n.hostName === target2);
|
|
112882
|
-
if (matchedNode?.brokerUrl) {
|
|
112883
|
-
probeUrl = matchedNode.brokerUrl;
|
|
112884
|
-
} else {
|
|
112885
|
-
probeUrl = `http://${target2}:43110`;
|
|
112886
|
-
}
|
|
112887
|
-
}
|
|
113335
|
+
const probeUrls = resolveMeshPingUrls(target2, context?.snapshot.nodes ?? {});
|
|
112888
113336
|
const start = performance.now();
|
|
112889
|
-
|
|
112890
|
-
|
|
112891
|
-
|
|
112892
|
-
|
|
112893
|
-
|
|
112894
|
-
|
|
112895
|
-
|
|
112896
|
-
|
|
112897
|
-
|
|
112898
|
-
|
|
113337
|
+
let lastError = null;
|
|
113338
|
+
let lastUrl = probeUrls[0] ?? `http://${target2}:43110`;
|
|
113339
|
+
for (const probeUrl of probeUrls) {
|
|
113340
|
+
lastUrl = probeUrl;
|
|
113341
|
+
try {
|
|
113342
|
+
const controller = new AbortController;
|
|
113343
|
+
const timeout = setTimeout(() => controller.abort(), 3000);
|
|
113344
|
+
const response = await meshPeerFetch(probeUrl, "/v1/node", {
|
|
113345
|
+
signal: controller.signal,
|
|
113346
|
+
headers: { accept: "application/json" }
|
|
113347
|
+
});
|
|
113348
|
+
clearTimeout(timeout);
|
|
113349
|
+
const latencyMs = Math.round(performance.now() - start);
|
|
113350
|
+
if (!response.ok) {
|
|
113351
|
+
lastError = `HTTP ${response.status}`;
|
|
113352
|
+
continue;
|
|
113353
|
+
}
|
|
113354
|
+
const node = await response.json();
|
|
112899
113355
|
return {
|
|
112900
113356
|
target: target2,
|
|
112901
113357
|
url: probeUrl,
|
|
112902
|
-
reachable:
|
|
113358
|
+
reachable: true,
|
|
112903
113359
|
latencyMs,
|
|
112904
|
-
node
|
|
112905
|
-
meshIdMatch:
|
|
113360
|
+
node,
|
|
113361
|
+
meshIdMatch: localMeshId !== null && node.meshId === localMeshId,
|
|
112906
113362
|
localMeshId,
|
|
112907
|
-
error:
|
|
113363
|
+
error: null
|
|
112908
113364
|
};
|
|
113365
|
+
} catch (error48) {
|
|
113366
|
+
lastError = error48 instanceof Error ? error48.message : String(error48);
|
|
112909
113367
|
}
|
|
112910
|
-
const node = await response.json();
|
|
112911
|
-
return {
|
|
112912
|
-
target: target2,
|
|
112913
|
-
url: probeUrl,
|
|
112914
|
-
reachable: true,
|
|
112915
|
-
latencyMs,
|
|
112916
|
-
node,
|
|
112917
|
-
meshIdMatch: localMeshId !== null && node.meshId === localMeshId,
|
|
112918
|
-
localMeshId,
|
|
112919
|
-
error: null
|
|
112920
|
-
};
|
|
112921
|
-
} catch (error48) {
|
|
112922
|
-
return {
|
|
112923
|
-
target: target2,
|
|
112924
|
-
url: probeUrl,
|
|
112925
|
-
reachable: false,
|
|
112926
|
-
latencyMs: Math.round(performance.now() - start),
|
|
112927
|
-
node: null,
|
|
112928
|
-
meshIdMatch: false,
|
|
112929
|
-
localMeshId,
|
|
112930
|
-
error: error48 instanceof Error ? error48.message : String(error48)
|
|
112931
|
-
};
|
|
112932
113368
|
}
|
|
113369
|
+
return {
|
|
113370
|
+
target: target2,
|
|
113371
|
+
url: lastUrl,
|
|
113372
|
+
reachable: false,
|
|
113373
|
+
latencyMs: Math.round(performance.now() - start),
|
|
113374
|
+
node: null,
|
|
113375
|
+
meshIdMatch: false,
|
|
113376
|
+
localMeshId,
|
|
113377
|
+
error: lastError
|
|
113378
|
+
};
|
|
113379
|
+
}
|
|
113380
|
+
function resolveMeshPingUrls(target2, nodes) {
|
|
113381
|
+
if (target2.startsWith("http://") || target2.startsWith("https://")) {
|
|
113382
|
+
return [target2];
|
|
113383
|
+
}
|
|
113384
|
+
const matchedNode = Object.values(nodes).find((n) => n.id === target2 || n.name === target2 || n.hostName === target2);
|
|
113385
|
+
if (matchedNode) {
|
|
113386
|
+
const urls = httpMeshUrlsForNode(matchedNode);
|
|
113387
|
+
if (urls.length > 0)
|
|
113388
|
+
return urls;
|
|
113389
|
+
}
|
|
113390
|
+
return orderMeshDialUrls([
|
|
113391
|
+
`https://${target2}:43110`,
|
|
113392
|
+
`http://${target2}:43110`
|
|
113393
|
+
]);
|
|
112933
113394
|
}
|
|
112934
113395
|
async function loadMeshNodes() {
|
|
112935
113396
|
const brokerUrl = resolveScoutBrokerUrl();
|
|
@@ -112942,6 +113403,7 @@ async function loadMeshNodes() {
|
|
|
112942
113403
|
}
|
|
112943
113404
|
var init_service7 = __esm(() => {
|
|
112944
113405
|
init_src3();
|
|
113406
|
+
init_mesh_dial_order();
|
|
112945
113407
|
init_system_probes();
|
|
112946
113408
|
init_service3();
|
|
112947
113409
|
init_trust_service();
|
|
@@ -125258,7 +125720,7 @@ function findLocalNetworkAddress() {
|
|
|
125258
125720
|
if (entry.internal || entry.family !== "IPv4") {
|
|
125259
125721
|
continue;
|
|
125260
125722
|
}
|
|
125261
|
-
if (!isPrivateIPv42(entry.address) || isLinkLocalIPv42(entry.address) ||
|
|
125723
|
+
if (!isPrivateIPv42(entry.address) || isLinkLocalIPv42(entry.address) || isTailscaleIPv43(entry.address)) {
|
|
125262
125724
|
continue;
|
|
125263
125725
|
}
|
|
125264
125726
|
candidates.push({ name: name2, address: entry.address });
|
|
@@ -125284,7 +125746,7 @@ function localInterfaceScore(name2) {
|
|
|
125284
125746
|
return 1;
|
|
125285
125747
|
}
|
|
125286
125748
|
function isPrivateIPv42(address) {
|
|
125287
|
-
const octets =
|
|
125749
|
+
const octets = parseIPv43(address);
|
|
125288
125750
|
if (!octets) {
|
|
125289
125751
|
return false;
|
|
125290
125752
|
}
|
|
@@ -125292,14 +125754,14 @@ function isPrivateIPv42(address) {
|
|
|
125292
125754
|
return first === 10 || first === 172 && second >= 16 && second <= 31 || first === 192 && second === 168;
|
|
125293
125755
|
}
|
|
125294
125756
|
function isLinkLocalIPv42(address) {
|
|
125295
|
-
const octets =
|
|
125757
|
+
const octets = parseIPv43(address);
|
|
125296
125758
|
return Boolean(octets && octets[0] === 169 && octets[1] === 254);
|
|
125297
125759
|
}
|
|
125298
|
-
function
|
|
125299
|
-
const octets =
|
|
125760
|
+
function isTailscaleIPv43(address) {
|
|
125761
|
+
const octets = parseIPv43(address);
|
|
125300
125762
|
return Boolean(octets && octets[0] === 100 && octets[1] >= 64 && octets[1] <= 127);
|
|
125301
125763
|
}
|
|
125302
|
-
function
|
|
125764
|
+
function parseIPv43(address) {
|
|
125303
125765
|
const octets = address.split(".");
|
|
125304
125766
|
if (octets.length !== 4) {
|
|
125305
125767
|
return null;
|