@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/node/main.mjs
CHANGED
|
@@ -14397,9 +14397,9 @@ var require_cjs11 = __commonJS((exports) => {
|
|
|
14397
14397
|
|
|
14398
14398
|
// ../runtime/dist/broker-process-manager.js
|
|
14399
14399
|
import { spawn as spawn2, spawnSync } from "node:child_process";
|
|
14400
|
-
import { existsSync as
|
|
14400
|
+
import { existsSync as existsSync7, mkdirSync as mkdirSync4, readFileSync as readFileSync5, renameSync as renameSync3, writeFileSync as writeFileSync4 } from "node:fs";
|
|
14401
14401
|
import { homedir as homedir5, networkInterfaces } from "node:os";
|
|
14402
|
-
import { dirname as
|
|
14402
|
+
import { dirname as dirname4, join as join6, resolve as resolve2 } from "node:path";
|
|
14403
14403
|
import { fileURLToPath } from "node:url";
|
|
14404
14404
|
|
|
14405
14405
|
// ../runtime/dist/broker-api.js
|
|
@@ -14763,12 +14763,18 @@ import { existsSync as existsSync2, mkdirSync, rmSync, writeFileSync } from "nod
|
|
|
14763
14763
|
import { homedir } from "node:os";
|
|
14764
14764
|
import { join } from "node:path";
|
|
14765
14765
|
var OPENSCOUT_RPC_CUTOVER_MARKER = "rpc-runtime-cutover-v1";
|
|
14766
|
+
function isTestRunnerProcess() {
|
|
14767
|
+
if (false)
|
|
14768
|
+
;
|
|
14769
|
+
const entry = typeof Bun !== "undefined" ? Bun.main : process.argv[1] ?? "";
|
|
14770
|
+
return /[._](test|spec)\.[cm]?[jt]sx?$/.test(entry);
|
|
14771
|
+
}
|
|
14766
14772
|
function assertTestIsolatedUserData(operation, isolationEnvKey) {
|
|
14767
|
-
if (
|
|
14773
|
+
if (!isTestRunnerProcess())
|
|
14768
14774
|
return;
|
|
14769
14775
|
if (process.env[isolationEnvKey]?.trim())
|
|
14770
14776
|
return;
|
|
14771
|
-
throw new Error(`Refusing to ${operation}
|
|
14777
|
+
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).");
|
|
14772
14778
|
}
|
|
14773
14779
|
function resolveOpenScoutSupportPaths() {
|
|
14774
14780
|
const home = homedir();
|
|
@@ -16218,9 +16224,202 @@ function readTailscaleSelfWebHostsSync(env = process.env) {
|
|
|
16218
16224
|
}
|
|
16219
16225
|
|
|
16220
16226
|
// ../runtime/dist/local-config.js
|
|
16221
|
-
import { existsSync as
|
|
16227
|
+
import { existsSync as existsSync5, mkdirSync as mkdirSync3, readFileSync as readFileSync4, renameSync as renameSync2, writeFileSync as writeFileSync3 } from "node:fs";
|
|
16222
16228
|
import { homedir as homedir3, hostname as osHostname } from "node:os";
|
|
16229
|
+
import { dirname as dirname2, join as join4 } from "node:path";
|
|
16230
|
+
|
|
16231
|
+
// ../runtime/dist/node-identity.js
|
|
16232
|
+
import { createHash, createPrivateKey, createPublicKey, generateKeyPairSync, randomBytes, sign, verify } from "node:crypto";
|
|
16233
|
+
import { chmodSync, existsSync as existsSync4, mkdirSync as mkdirSync2, readFileSync as readFileSync3, renameSync, rmSync as rmSync2, writeFileSync as writeFileSync2 } from "node:fs";
|
|
16223
16234
|
import { dirname, join as join3 } from "node:path";
|
|
16235
|
+
var NODE_IDENTITY_FILE = "node-identity.json";
|
|
16236
|
+
var NODE_FINGERPRINT_PREFIX = "osc1";
|
|
16237
|
+
var NODE_CARD_TTL_MS = 24 * 60 * 60 * 1000;
|
|
16238
|
+
var stableNodeQualifierCache = new Map;
|
|
16239
|
+
function stripBonjourCollisionSuffix(value) {
|
|
16240
|
+
if (!value || typeof value !== "string")
|
|
16241
|
+
return "";
|
|
16242
|
+
let trimmed = value.trim();
|
|
16243
|
+
const isDotLocal = /\.local\.?$/i.test(trimmed);
|
|
16244
|
+
if (isDotLocal) {
|
|
16245
|
+
trimmed = trimmed.replace(/\.local\.?$/i, "");
|
|
16246
|
+
}
|
|
16247
|
+
const isHyphenLocalOpenscout = /-local-openscout$/i.test(trimmed);
|
|
16248
|
+
const isHyphenLocal = !isHyphenLocalOpenscout && /-local$/i.test(trimmed);
|
|
16249
|
+
if (isHyphenLocalOpenscout) {
|
|
16250
|
+
trimmed = trimmed.replace(/-local-openscout$/i, "");
|
|
16251
|
+
} else if (isHyphenLocal) {
|
|
16252
|
+
trimmed = trimmed.replace(/-local$/i, "");
|
|
16253
|
+
}
|
|
16254
|
+
if (!isDotLocal && !isHyphenLocalOpenscout && !isHyphenLocal) {
|
|
16255
|
+
return trimmed;
|
|
16256
|
+
}
|
|
16257
|
+
trimmed = trimmed.replace(/(?<=[a-zA-Z].*?)(?:-\d+)+$/, "");
|
|
16258
|
+
if (isDotLocal)
|
|
16259
|
+
return `${trimmed}.local`;
|
|
16260
|
+
if (isHyphenLocalOpenscout)
|
|
16261
|
+
return `${trimmed}-local-openscout`;
|
|
16262
|
+
if (isHyphenLocal)
|
|
16263
|
+
return `${trimmed}-local`;
|
|
16264
|
+
return trimmed;
|
|
16265
|
+
}
|
|
16266
|
+
function nodeIdentityPath(supportDirectory) {
|
|
16267
|
+
const dir = supportDirectory ?? resolveOpenScoutSupportPaths().supportDirectory;
|
|
16268
|
+
return join3(dir, NODE_IDENTITY_FILE);
|
|
16269
|
+
}
|
|
16270
|
+
function loadOrCreateNodeIdentity(supportDirectory) {
|
|
16271
|
+
const path = nodeIdentityPath(supportDirectory);
|
|
16272
|
+
if (existsSync4(path)) {
|
|
16273
|
+
return readAndValidateNodeIdentity(path);
|
|
16274
|
+
}
|
|
16275
|
+
return createNodeIdentity(supportDirectory);
|
|
16276
|
+
}
|
|
16277
|
+
function readStableNodeQualifier(supportDirectory) {
|
|
16278
|
+
const path = nodeIdentityPath(supportDirectory);
|
|
16279
|
+
const cached = stableNodeQualifierCache.get(path);
|
|
16280
|
+
if (cached) {
|
|
16281
|
+
return cached;
|
|
16282
|
+
}
|
|
16283
|
+
if (!existsSync4(path)) {
|
|
16284
|
+
return null;
|
|
16285
|
+
}
|
|
16286
|
+
const nodeQualifier = normalizeNodeQualifier(readAndValidateNodeIdentity(path).nodeQualifier);
|
|
16287
|
+
if (nodeQualifier) {
|
|
16288
|
+
stableNodeQualifierCache.set(path, nodeQualifier);
|
|
16289
|
+
}
|
|
16290
|
+
return nodeQualifier || null;
|
|
16291
|
+
}
|
|
16292
|
+
function readAndValidateNodeIdentity(path) {
|
|
16293
|
+
let parsed;
|
|
16294
|
+
try {
|
|
16295
|
+
parsed = JSON.parse(readFileSync3(path, "utf8"));
|
|
16296
|
+
} catch {
|
|
16297
|
+
throw new Error(`Corrupt node identity at ${path}; remove it to generate a fresh one.`);
|
|
16298
|
+
}
|
|
16299
|
+
if (parsed.version !== 1 || !parsed.publicKey || !parsed.privateKey) {
|
|
16300
|
+
throw new Error(`Corrupt node identity at ${path}; remove it to generate a fresh one.`);
|
|
16301
|
+
}
|
|
16302
|
+
if (parsed.nodeQualifier !== undefined && normalizePersistedNodeQualifier(parsed.nodeQualifier) !== parsed.nodeQualifier) {
|
|
16303
|
+
throw new Error(`Corrupt node identity at ${path}; remove it to generate a fresh one.`);
|
|
16304
|
+
}
|
|
16305
|
+
try {
|
|
16306
|
+
const derived = createPublicKey(importPrivateKey(parsed.privateKey)).export({ type: "spki", format: "der" }).toString("base64");
|
|
16307
|
+
if (derived !== parsed.publicKey) {
|
|
16308
|
+
throw new Error("mismatch");
|
|
16309
|
+
}
|
|
16310
|
+
} catch {
|
|
16311
|
+
throw new Error(`Node identity at ${path} has mismatched or invalid keys; remove it to generate a fresh one.`);
|
|
16312
|
+
}
|
|
16313
|
+
return parsed;
|
|
16314
|
+
}
|
|
16315
|
+
function normalizePersistedNodeQualifier(value) {
|
|
16316
|
+
return typeof value === "string" ? value.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/-+/g, "-").replace(/^-+|-+$/g, "") : "";
|
|
16317
|
+
}
|
|
16318
|
+
function normalizeNodeQualifier(value) {
|
|
16319
|
+
return stripBonjourCollisionSuffix(normalizePersistedNodeQualifier(value));
|
|
16320
|
+
}
|
|
16321
|
+
function createNodeIdentity(supportDirectory) {
|
|
16322
|
+
if (!supportDirectory) {
|
|
16323
|
+
assertTestIsolatedUserData("write the node identity", "OPENSCOUT_SUPPORT_DIRECTORY");
|
|
16324
|
+
}
|
|
16325
|
+
const path = nodeIdentityPath(supportDirectory);
|
|
16326
|
+
const { publicKey, privateKey } = generateKeyPairSync("ed25519");
|
|
16327
|
+
const identity = {
|
|
16328
|
+
version: 1,
|
|
16329
|
+
publicKey: publicKey.export({ type: "spki", format: "der" }).toString("base64"),
|
|
16330
|
+
privateKey: privateKey.export({ type: "pkcs8", format: "der" }).toString("base64"),
|
|
16331
|
+
createdAt: Date.now()
|
|
16332
|
+
};
|
|
16333
|
+
mkdirSync2(dirname(path), { recursive: true });
|
|
16334
|
+
try {
|
|
16335
|
+
writeFileSync2(path, `${JSON.stringify(identity, null, 2)}
|
|
16336
|
+
`, { encoding: "utf8", mode: 384, flag: "wx" });
|
|
16337
|
+
} catch (error) {
|
|
16338
|
+
if (error.code === "EEXIST") {
|
|
16339
|
+
return readAndValidateNodeIdentity(path);
|
|
16340
|
+
}
|
|
16341
|
+
throw error;
|
|
16342
|
+
}
|
|
16343
|
+
try {
|
|
16344
|
+
chmodSync(path, 384);
|
|
16345
|
+
} catch {}
|
|
16346
|
+
return identity;
|
|
16347
|
+
}
|
|
16348
|
+
function nodeKeyId(publicKeyBase64) {
|
|
16349
|
+
return createHash("sha256").update(Buffer.from(publicKeyBase64, "base64")).digest("hex");
|
|
16350
|
+
}
|
|
16351
|
+
function nodeFingerprint(publicKeyBase64) {
|
|
16352
|
+
const digest = createHash("sha256").update(Buffer.from(publicKeyBase64, "base64")).digest();
|
|
16353
|
+
const encoded = base32Encode(digest.subarray(0, 10)).toLowerCase();
|
|
16354
|
+
return `${NODE_FINGERPRINT_PREFIX}:${encoded.slice(0, 4)}-${encoded.slice(4, 8)}`;
|
|
16355
|
+
}
|
|
16356
|
+
function signNodePayload(identity, payload) {
|
|
16357
|
+
const key = importPrivateKey(identity.privateKey);
|
|
16358
|
+
return sign(null, typeof payload === "string" ? Buffer.from(payload, "utf8") : payload, key).toString("base64");
|
|
16359
|
+
}
|
|
16360
|
+
function verifyNodeSignature(publicKeyBase64, payload, signatureBase64) {
|
|
16361
|
+
try {
|
|
16362
|
+
const key = importPublicKey(publicKeyBase64);
|
|
16363
|
+
return verify(null, typeof payload === "string" ? Buffer.from(payload, "utf8") : payload, key, Buffer.from(signatureBase64, "base64"));
|
|
16364
|
+
} catch {
|
|
16365
|
+
return false;
|
|
16366
|
+
}
|
|
16367
|
+
}
|
|
16368
|
+
function canonicalJson(value) {
|
|
16369
|
+
if (value === null || typeof value !== "object") {
|
|
16370
|
+
return JSON.stringify(value);
|
|
16371
|
+
}
|
|
16372
|
+
if (Array.isArray(value)) {
|
|
16373
|
+
return `[${value.map(canonicalJson).join(",")}]`;
|
|
16374
|
+
}
|
|
16375
|
+
const record = value;
|
|
16376
|
+
const keys = Object.keys(record).sort();
|
|
16377
|
+
return `{${keys.map((key) => `${JSON.stringify(key)}:${canonicalJson(record[key])}`).join(",")}}`;
|
|
16378
|
+
}
|
|
16379
|
+
function verifySignedNodeCard(card, now = Date.now()) {
|
|
16380
|
+
if (nodeKeyId(card.publicKey) !== card.keyId) {
|
|
16381
|
+
return false;
|
|
16382
|
+
}
|
|
16383
|
+
if (nodeFingerprint(card.publicKey) !== card.fingerprint) {
|
|
16384
|
+
return false;
|
|
16385
|
+
}
|
|
16386
|
+
if (!Number.isFinite(card.expiresAt) || card.expiresAt <= now) {
|
|
16387
|
+
return false;
|
|
16388
|
+
}
|
|
16389
|
+
if (card.tls !== undefined) {
|
|
16390
|
+
if (typeof card.tls !== "object" || card.tls === null || typeof card.tls.spkiFingerprint !== "string" || !/^[0-9a-f]{64}$/.test(card.tls.spkiFingerprint)) {
|
|
16391
|
+
return false;
|
|
16392
|
+
}
|
|
16393
|
+
}
|
|
16394
|
+
const { signature, ...unsigned } = card;
|
|
16395
|
+
return verifyNodeSignature(card.publicKey, canonicalJson(unsigned), signature);
|
|
16396
|
+
}
|
|
16397
|
+
var BASE32_ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
|
|
16398
|
+
function base32Encode(input) {
|
|
16399
|
+
let bits = 0;
|
|
16400
|
+
let value = 0;
|
|
16401
|
+
let output = "";
|
|
16402
|
+
for (const byte of input) {
|
|
16403
|
+
value = value << 8 | byte;
|
|
16404
|
+
bits += 8;
|
|
16405
|
+
while (bits >= 5) {
|
|
16406
|
+
output += BASE32_ALPHABET[value >>> bits - 5 & 31];
|
|
16407
|
+
bits -= 5;
|
|
16408
|
+
}
|
|
16409
|
+
}
|
|
16410
|
+
if (bits > 0) {
|
|
16411
|
+
output += BASE32_ALPHABET[value << 5 - bits & 31];
|
|
16412
|
+
}
|
|
16413
|
+
return output;
|
|
16414
|
+
}
|
|
16415
|
+
function importPrivateKey(privateKeyBase64) {
|
|
16416
|
+
return createPrivateKey({ key: Buffer.from(privateKeyBase64, "base64"), format: "der", type: "pkcs8" });
|
|
16417
|
+
}
|
|
16418
|
+
function importPublicKey(publicKeyBase64) {
|
|
16419
|
+
return createPublicKey({ key: Buffer.from(publicKeyBase64, "base64"), format: "der", type: "spki" });
|
|
16420
|
+
}
|
|
16421
|
+
|
|
16422
|
+
// ../runtime/dist/local-config.js
|
|
16224
16423
|
var LOCAL_CONFIG_VERSION = 1;
|
|
16225
16424
|
var DEFAULT_SCOUT_WEB_PORTAL_HOST = "scout.local";
|
|
16226
16425
|
var DEFAULT_SCOUT_WEB_DEV_HOST = `dev.${DEFAULT_SCOUT_WEB_PORTAL_HOST}`;
|
|
@@ -16245,17 +16444,17 @@ var DEFAULT_LOCAL_CONFIG = {
|
|
|
16245
16444
|
}
|
|
16246
16445
|
};
|
|
16247
16446
|
function localConfigHome() {
|
|
16248
|
-
return process.env.OPENSCOUT_HOME ??
|
|
16447
|
+
return process.env.OPENSCOUT_HOME ?? join4(homedir3(), ".openscout");
|
|
16249
16448
|
}
|
|
16250
16449
|
function localConfigPath() {
|
|
16251
|
-
return
|
|
16450
|
+
return join4(localConfigHome(), "config.json");
|
|
16252
16451
|
}
|
|
16253
16452
|
function loadLocalConfig() {
|
|
16254
16453
|
const configPath = localConfigPath();
|
|
16255
|
-
if (!
|
|
16454
|
+
if (!existsSync5(configPath))
|
|
16256
16455
|
return { version: LOCAL_CONFIG_VERSION };
|
|
16257
16456
|
try {
|
|
16258
|
-
return validateLocalConfig(JSON.parse(
|
|
16457
|
+
return validateLocalConfig(JSON.parse(readFileSync4(configPath, "utf8")));
|
|
16259
16458
|
} catch {
|
|
16260
16459
|
return { version: LOCAL_CONFIG_VERSION };
|
|
16261
16460
|
}
|
|
@@ -16333,34 +16532,34 @@ function resolveBrokerPort() {
|
|
|
16333
16532
|
function writeLocalConfig(config) {
|
|
16334
16533
|
assertTestIsolatedUserData("write the OpenScout local config", "OPENSCOUT_HOME");
|
|
16335
16534
|
const configPath = localConfigPath();
|
|
16336
|
-
|
|
16535
|
+
mkdirSync3(dirname2(configPath), { recursive: true });
|
|
16337
16536
|
const body = JSON.stringify({ ...config, version: LOCAL_CONFIG_VERSION }, null, 2) + `
|
|
16338
16537
|
`;
|
|
16339
16538
|
const tmp = `${configPath}.tmp`;
|
|
16340
|
-
|
|
16341
|
-
|
|
16539
|
+
writeFileSync3(tmp, body, "utf8");
|
|
16540
|
+
renameSync2(tmp, configPath);
|
|
16342
16541
|
}
|
|
16343
16542
|
function localConfigExists() {
|
|
16344
|
-
return
|
|
16543
|
+
return existsSync5(localConfigPath());
|
|
16345
16544
|
}
|
|
16346
16545
|
|
|
16347
16546
|
// ../runtime/dist/tool-resolution.js
|
|
16348
|
-
import { accessSync, constants, existsSync as
|
|
16547
|
+
import { accessSync, constants, existsSync as existsSync6 } from "node:fs";
|
|
16349
16548
|
import { homedir as homedir4 } from "node:os";
|
|
16350
|
-
import { basename, dirname as
|
|
16549
|
+
import { basename, dirname as dirname3, join as join5, resolve } from "node:path";
|
|
16351
16550
|
var DEFAULT_COMMON_EXECUTABLE_DIRECTORIES = [
|
|
16352
|
-
|
|
16551
|
+
join5(homedir4(), ".bun", "bin"),
|
|
16353
16552
|
"/opt/homebrew/bin",
|
|
16354
16553
|
"/usr/local/bin"
|
|
16355
16554
|
];
|
|
16356
16555
|
function commonClaudeExecutableDirectories(env) {
|
|
16357
16556
|
const home = env.HOME ?? homedir4();
|
|
16358
16557
|
return [
|
|
16359
|
-
|
|
16360
|
-
|
|
16558
|
+
join5(home, ".local", "bin"),
|
|
16559
|
+
join5(home, ".claude", "local"),
|
|
16361
16560
|
"/opt/homebrew/bin",
|
|
16362
16561
|
"/usr/local/bin",
|
|
16363
|
-
|
|
16562
|
+
join5(home, ".bun", "bin")
|
|
16364
16563
|
];
|
|
16365
16564
|
}
|
|
16366
16565
|
function expandHomePath(value, env = process.env) {
|
|
@@ -16369,7 +16568,7 @@ function expandHomePath(value, env = process.env) {
|
|
|
16369
16568
|
return home;
|
|
16370
16569
|
}
|
|
16371
16570
|
if (value.startsWith("~/")) {
|
|
16372
|
-
return
|
|
16571
|
+
return join5(home, value.slice(2));
|
|
16373
16572
|
}
|
|
16374
16573
|
return value;
|
|
16375
16574
|
}
|
|
@@ -16426,7 +16625,7 @@ function resolveExecutableFromSearch(options) {
|
|
|
16426
16625
|
], env);
|
|
16427
16626
|
for (const directory of searchDirectories) {
|
|
16428
16627
|
for (const name of options.names) {
|
|
16429
|
-
const candidate =
|
|
16628
|
+
const candidate = join5(directory, name);
|
|
16430
16629
|
if (isExecutablePath(candidate)) {
|
|
16431
16630
|
return {
|
|
16432
16631
|
path: candidate,
|
|
@@ -16440,7 +16639,7 @@ function resolveExecutableFromSearch(options) {
|
|
|
16440
16639
|
function resolveExecutableFromDirectories(directories, names, env, source) {
|
|
16441
16640
|
for (const directory of dedupeDirectories(directories, env)) {
|
|
16442
16641
|
for (const name of names) {
|
|
16443
|
-
const candidate =
|
|
16642
|
+
const candidate = join5(directory, name);
|
|
16444
16643
|
if (isExecutablePath(candidate)) {
|
|
16445
16644
|
return { path: candidate, source };
|
|
16446
16645
|
}
|
|
@@ -16478,7 +16677,7 @@ function findExecutableOnSearchPath(name, env) {
|
|
|
16478
16677
|
...DEFAULT_COMMON_EXECUTABLE_DIRECTORIES
|
|
16479
16678
|
], env);
|
|
16480
16679
|
for (const directory of searchDirectories) {
|
|
16481
|
-
const candidate =
|
|
16680
|
+
const candidate = join5(directory, name);
|
|
16482
16681
|
if (isExecutablePath(candidate)) {
|
|
16483
16682
|
return { path: candidate, source: "path" };
|
|
16484
16683
|
}
|
|
@@ -16496,14 +16695,14 @@ var DEFAULT_ADVERTISE_SCOPE = "local";
|
|
|
16496
16695
|
var MESH_BIND_CONFIG_FILE = "mesh-bind.json";
|
|
16497
16696
|
function meshBindConfigPath(supportDirectory) {
|
|
16498
16697
|
const dir = supportDirectory ?? resolveOpenScoutSupportPaths().supportDirectory;
|
|
16499
|
-
return
|
|
16698
|
+
return join6(dir, MESH_BIND_CONFIG_FILE);
|
|
16500
16699
|
}
|
|
16501
16700
|
function readPersistedAdvertiseScope(supportDirectory) {
|
|
16502
16701
|
const path = meshBindConfigPath(supportDirectory);
|
|
16503
|
-
if (!
|
|
16702
|
+
if (!existsSync7(path))
|
|
16504
16703
|
return null;
|
|
16505
16704
|
try {
|
|
16506
|
-
const parsed = JSON.parse(
|
|
16705
|
+
const parsed = JSON.parse(readFileSync5(path, "utf8"));
|
|
16507
16706
|
if (parsed.version !== 1)
|
|
16508
16707
|
return null;
|
|
16509
16708
|
if (parsed.advertiseScope === "mesh" || parsed.advertiseScope === "local") {
|
|
@@ -16549,13 +16748,13 @@ function resolveBrokerUrl(host, port, scope, env = process.env, lanHost = findLa
|
|
|
16549
16748
|
return explicit;
|
|
16550
16749
|
}
|
|
16551
16750
|
if (scope === "mesh") {
|
|
16751
|
+
if (lanHost) {
|
|
16752
|
+
return buildDefaultBrokerHttpsUrl(lanHost, port);
|
|
16753
|
+
}
|
|
16552
16754
|
const tailnetHost = readTailscaleSelfWebHostsSync(env)[0];
|
|
16553
16755
|
if (tailnetHost) {
|
|
16554
16756
|
return buildDefaultBrokerHttpsUrl(tailnetHost, port);
|
|
16555
16757
|
}
|
|
16556
|
-
if (lanHost) {
|
|
16557
|
-
return buildDefaultBrokerHttpsUrl(lanHost, port);
|
|
16558
|
-
}
|
|
16559
16758
|
}
|
|
16560
16759
|
return buildDefaultBrokerUrl(host, port);
|
|
16561
16760
|
}
|
|
@@ -16622,7 +16821,7 @@ function isWildcardHost(host) {
|
|
|
16622
16821
|
return trimmed === "0.0.0.0" || trimmed === "::" || trimmed === "[::]";
|
|
16623
16822
|
}
|
|
16624
16823
|
function buildDefaultBrokerSocketPath(runtimeDirectory) {
|
|
16625
|
-
return
|
|
16824
|
+
return join6(runtimeDirectory, "broker.sock");
|
|
16626
16825
|
}
|
|
16627
16826
|
var DEFAULT_BROKER_URL = buildDefaultBrokerUrl();
|
|
16628
16827
|
function resolveScoutBrokerControlUrl(_config = resolveBrokerServiceConfig()) {
|
|
@@ -16641,17 +16840,17 @@ function runtimePackageDir() {
|
|
|
16641
16840
|
const fromGlobal = findGlobalRuntimeDir();
|
|
16642
16841
|
if (fromGlobal)
|
|
16643
16842
|
return fromGlobal;
|
|
16644
|
-
const moduleDir =
|
|
16843
|
+
const moduleDir = dirname4(fileURLToPath(import.meta.url));
|
|
16645
16844
|
return resolve2(moduleDir, "..");
|
|
16646
16845
|
}
|
|
16647
16846
|
function isInstalledRuntimePackageDir(candidate) {
|
|
16648
|
-
return
|
|
16847
|
+
return existsSync7(join6(candidate, "package.json")) && existsSync7(join6(candidate, "bin", "openscout-runtime.mjs"));
|
|
16649
16848
|
}
|
|
16650
16849
|
function findGlobalRuntimeDir() {
|
|
16651
16850
|
const candidates = [
|
|
16652
|
-
|
|
16653
|
-
|
|
16654
|
-
|
|
16851
|
+
join6(homedir5(), ".bun", "node_modules", "@openscout", "runtime"),
|
|
16852
|
+
join6(homedir5(), ".bun", "install", "global", "node_modules", "@openscout", "runtime"),
|
|
16853
|
+
join6(homedir5(), ".bun", "install", "global", "node_modules", "@openscout", "scout", "node_modules", "@openscout", "runtime")
|
|
16655
16854
|
];
|
|
16656
16855
|
for (const c of candidates) {
|
|
16657
16856
|
if (isInstalledRuntimePackageDir(c))
|
|
@@ -16664,7 +16863,7 @@ function findGlobalRuntimeDir() {
|
|
|
16664
16863
|
const scoutPkg = resolve2(scoutBin, "..", "..");
|
|
16665
16864
|
if (isInstalledRuntimePackageDir(scoutPkg))
|
|
16666
16865
|
return scoutPkg;
|
|
16667
|
-
const nested =
|
|
16866
|
+
const nested = join6(scoutPkg, "node_modules", "@openscout", "runtime");
|
|
16668
16867
|
if (isInstalledRuntimePackageDir(nested))
|
|
16669
16868
|
return nested;
|
|
16670
16869
|
const sibling = resolve2(scoutPkg, "..", "runtime");
|
|
@@ -16675,7 +16874,7 @@ function findGlobalRuntimeDir() {
|
|
|
16675
16874
|
return null;
|
|
16676
16875
|
}
|
|
16677
16876
|
function findBundledRuntimeDir() {
|
|
16678
|
-
const moduleDir =
|
|
16877
|
+
const moduleDir = dirname4(fileURLToPath(import.meta.url));
|
|
16679
16878
|
return resolveBundledRuntimeDirFromModuleDir(moduleDir);
|
|
16680
16879
|
}
|
|
16681
16880
|
function resolveBundledRuntimeDirFromModuleDir(moduleDir) {
|
|
@@ -16692,11 +16891,11 @@ function resolveBundledRuntimeDirFromModuleDir(moduleDir) {
|
|
|
16692
16891
|
function findWorkspaceRuntimeDir(startDir) {
|
|
16693
16892
|
let current = resolve2(startDir);
|
|
16694
16893
|
while (true) {
|
|
16695
|
-
const candidate =
|
|
16696
|
-
if (
|
|
16894
|
+
const candidate = join6(current, "packages", "runtime");
|
|
16895
|
+
if (existsSync7(join6(candidate, "package.json")) && existsSync7(join6(candidate, "src"))) {
|
|
16697
16896
|
return candidate;
|
|
16698
16897
|
}
|
|
16699
|
-
const parent =
|
|
16898
|
+
const parent = dirname4(current);
|
|
16700
16899
|
if (parent === current)
|
|
16701
16900
|
return null;
|
|
16702
16901
|
current = parent;
|
|
@@ -16743,17 +16942,17 @@ function resolveBrokerServiceConfig() {
|
|
|
16743
16942
|
const serviceAdapter = resolveBrokerServiceAdapter();
|
|
16744
16943
|
const uid = typeof process.getuid === "function" ? process.getuid() : Number.parseInt(process.env.UID ?? "0", 10);
|
|
16745
16944
|
const supportPaths = resolveOpenScoutSupportPaths();
|
|
16746
|
-
const defaultSupportDir =
|
|
16945
|
+
const defaultSupportDir = join6(homedir5(), "Library", "Application Support", "OpenScout");
|
|
16747
16946
|
const supportDirectory = isTmpPath(supportPaths.supportDirectory) ? defaultSupportDir : supportPaths.supportDirectory;
|
|
16748
|
-
const runtimeDirectory =
|
|
16749
|
-
const logsDirectory =
|
|
16750
|
-
const controlHome = isTmpPath(supportPaths.controlHome) ?
|
|
16947
|
+
const runtimeDirectory = join6(supportDirectory, "runtime");
|
|
16948
|
+
const logsDirectory = join6(supportDirectory, "logs", "broker");
|
|
16949
|
+
const controlHome = isTmpPath(supportPaths.controlHome) ? join6(homedir5(), ".openscout", "control-plane") : supportPaths.controlHome;
|
|
16751
16950
|
const advertiseScope = resolveAdvertiseScope(process.env, () => readPersistedAdvertiseScope(supportDirectory));
|
|
16752
16951
|
const brokerHost = resolveBrokerHost(advertiseScope);
|
|
16753
16952
|
const brokerPort = Number.parseInt(process.env.OPENSCOUT_BROKER_PORT ?? String(resolveBrokerPort()), 10);
|
|
16754
16953
|
const brokerUrl = resolveBrokerUrl(brokerHost, brokerPort, advertiseScope);
|
|
16755
16954
|
const brokerSocketPath = process.env.OPENSCOUT_BROKER_SOCKET_PATH ?? buildDefaultBrokerSocketPath(runtimeDirectory);
|
|
16756
|
-
const launchAgentPath =
|
|
16955
|
+
const launchAgentPath = join6(homedir5(), "Library", "LaunchAgents", `${label}.plist`);
|
|
16757
16956
|
return {
|
|
16758
16957
|
label,
|
|
16759
16958
|
mode,
|
|
@@ -16764,8 +16963,8 @@ function resolveBrokerServiceConfig() {
|
|
|
16764
16963
|
supportDirectory,
|
|
16765
16964
|
runtimeDirectory,
|
|
16766
16965
|
logsDirectory,
|
|
16767
|
-
stdoutLogPath:
|
|
16768
|
-
stderrLogPath:
|
|
16966
|
+
stdoutLogPath: join6(logsDirectory, "stdout.log"),
|
|
16967
|
+
stderrLogPath: join6(logsDirectory, "stderr.log"),
|
|
16769
16968
|
controlHome,
|
|
16770
16969
|
runtimePackageDir: runtimePackageDir(),
|
|
16771
16970
|
bunExecutable: serviceAdapter === "macos-scoutd" ? resolveBunExecutable2() : resolveOptionalBunExecutable(),
|
|
@@ -16799,10 +16998,10 @@ function resolveEnvExecutable(value) {
|
|
|
16799
16998
|
function findWorkspaceRootFromRuntimeDir(runtimePackageDir2) {
|
|
16800
16999
|
let current = resolve2(runtimePackageDir2);
|
|
16801
17000
|
while (true) {
|
|
16802
|
-
if (
|
|
17001
|
+
if (existsSync7(join6(current, "Cargo.toml")) && existsSync7(join6(current, "crates", "scoutd", "Cargo.toml"))) {
|
|
16803
17002
|
return current;
|
|
16804
17003
|
}
|
|
16805
|
-
const parent =
|
|
17004
|
+
const parent = dirname4(current);
|
|
16806
17005
|
if (parent === current)
|
|
16807
17006
|
return null;
|
|
16808
17007
|
current = parent;
|
|
@@ -16819,13 +17018,13 @@ function resolveScoutdCommand(config = resolveBrokerServiceConfig()) {
|
|
|
16819
17018
|
}
|
|
16820
17019
|
const workspaceRoot = findWorkspaceRootFromRuntimeDir(config.runtimePackageDir);
|
|
16821
17020
|
const packageCandidates = [
|
|
16822
|
-
|
|
16823
|
-
|
|
16824
|
-
|
|
16825
|
-
workspaceRoot ?
|
|
16826
|
-
workspaceRoot ?
|
|
16827
|
-
|
|
16828
|
-
|
|
17021
|
+
join6(config.runtimePackageDir, "bin", "scoutd"),
|
|
17022
|
+
join6(config.runtimePackageDir, "native", "scoutd"),
|
|
17023
|
+
join6(config.runtimePackageDir, "scoutd"),
|
|
17024
|
+
workspaceRoot ? join6(workspaceRoot, "packages", "cli", "bin", "scoutd") : null,
|
|
17025
|
+
workspaceRoot ? join6(workspaceRoot, "packages", "runtime", "bin", "scoutd") : null,
|
|
17026
|
+
join6(config.runtimeDirectory, "scoutd"),
|
|
17027
|
+
join6(dirname4(config.runtimePackageDir), "scout", "bin", "scoutd")
|
|
16829
17028
|
];
|
|
16830
17029
|
for (const candidate of packageCandidates) {
|
|
16831
17030
|
const resolved = executableCandidate(candidate);
|
|
@@ -16839,8 +17038,8 @@ function resolveScoutdCommand(config = resolveBrokerServiceConfig()) {
|
|
|
16839
17038
|
}
|
|
16840
17039
|
if (workspaceRoot && workspaceScoutdAllowed()) {
|
|
16841
17040
|
for (const candidate of [
|
|
16842
|
-
|
|
16843
|
-
|
|
17041
|
+
join6(workspaceRoot, "target", "release", "scoutd"),
|
|
17042
|
+
join6(workspaceRoot, "target", "debug", "scoutd")
|
|
16844
17043
|
]) {
|
|
16845
17044
|
const resolved = executableCandidate(candidate);
|
|
16846
17045
|
if (resolved) {
|
|
@@ -16925,7 +17124,7 @@ function normalizeNativeServiceStatus(input, config) {
|
|
|
16925
17124
|
const healthMeshId = readString2(healthRecord.meshId);
|
|
16926
17125
|
const healthSocketFallbackError = readString2(healthRecord.socketFallbackError);
|
|
16927
17126
|
const healthCounts = isRecord3(healthRecord.counts) ? healthRecord.counts : undefined;
|
|
16928
|
-
const installed = readBoolean(input.installed) ??
|
|
17127
|
+
const installed = readBoolean(input.installed) ?? existsSync7(config.launchAgentPath);
|
|
16929
17128
|
const loaded = readBoolean(input.loaded) ?? false;
|
|
16930
17129
|
const stdoutLogPath = readString2(input.stdoutLogPath) ?? config.stdoutLogPath;
|
|
16931
17130
|
const stderrLogPath = readString2(input.stderrLogPath) ?? config.stderrLogPath;
|
|
@@ -17046,8 +17245,8 @@ var SCHEMA_GUARDED_SERVICE_COMMANDS = new Set([
|
|
|
17046
17245
|
"restart"
|
|
17047
17246
|
]);
|
|
17048
17247
|
function assertBrokerServiceSchemaCompatible(config) {
|
|
17049
|
-
const databasePath =
|
|
17050
|
-
if (!
|
|
17248
|
+
const databasePath = join6(config.controlHome, "control-plane.sqlite");
|
|
17249
|
+
if (!existsSync7(databasePath))
|
|
17051
17250
|
return;
|
|
17052
17251
|
const database = openControlPlaneSqliteDatabase(databasePath, { readonly: true });
|
|
17053
17252
|
try {
|
|
@@ -17080,7 +17279,7 @@ async function runScoutdServiceCommand(command, config, timeoutMs = SCOUTD_DEFAU
|
|
|
17080
17279
|
function readCoreAgentsSync() {
|
|
17081
17280
|
try {
|
|
17082
17281
|
const settingsPath = resolveOpenScoutSupportPaths().settingsPath;
|
|
17083
|
-
const raw =
|
|
17282
|
+
const raw = readFileSync5(settingsPath, "utf8");
|
|
17084
17283
|
const settings = JSON.parse(raw);
|
|
17085
17284
|
const raw_agents = settings?.agents?.coreAgents;
|
|
17086
17285
|
if (Array.isArray(raw_agents)) {
|
|
@@ -17093,10 +17292,10 @@ function bootoutCommand(config) {
|
|
|
17093
17292
|
return `/bin/launchctl bootout ${config.serviceTarget}`;
|
|
17094
17293
|
}
|
|
17095
17294
|
function readLogLines(path) {
|
|
17096
|
-
if (!
|
|
17295
|
+
if (!existsSync7(path)) {
|
|
17097
17296
|
return [];
|
|
17098
17297
|
}
|
|
17099
|
-
return
|
|
17298
|
+
return readFileSync5(path, "utf8").split(`
|
|
17100
17299
|
`).map((line) => line.trim()).filter(Boolean);
|
|
17101
17300
|
}
|
|
17102
17301
|
function isPackageScriptBanner(line) {
|
|
@@ -17320,15 +17519,15 @@ if (process.argv[1] && fileURLToPath(import.meta.url) === process.argv[1] && !pr
|
|
|
17320
17519
|
|
|
17321
17520
|
// ../runtime/dist/harness-catalog.js
|
|
17322
17521
|
import { execFileSync as execFileSync3 } from "node:child_process";
|
|
17323
|
-
import { existsSync as
|
|
17522
|
+
import { existsSync as existsSync8, statSync } from "node:fs";
|
|
17324
17523
|
import { mkdir, readFile as readFile2, writeFile } from "node:fs/promises";
|
|
17325
17524
|
import { homedir as homedir6 } from "node:os";
|
|
17326
|
-
import { dirname as
|
|
17525
|
+
import { dirname as dirname5, join as join8 } from "node:path";
|
|
17327
17526
|
|
|
17328
17527
|
// ../agent-sessions/dist/codex-executable.js
|
|
17329
17528
|
import { execFileSync as execFileSync2 } from "node:child_process";
|
|
17330
17529
|
import { accessSync as accessSync2, constants as constants2 } from "node:fs";
|
|
17331
|
-
import { delimiter, join as
|
|
17530
|
+
import { delimiter, join as join7 } from "node:path";
|
|
17332
17531
|
function isExecutable(filePath) {
|
|
17333
17532
|
if (!filePath)
|
|
17334
17533
|
return false;
|
|
@@ -17372,11 +17571,11 @@ function codexAppBundleCandidates(env) {
|
|
|
17372
17571
|
const appNames = ["Codex.app", "ChatGPT.app"];
|
|
17373
17572
|
const candidates = appNames.flatMap((appName) => [
|
|
17374
17573
|
{
|
|
17375
|
-
path:
|
|
17574
|
+
path: join7("/Applications", appName, "Contents", "Resources", "codex"),
|
|
17376
17575
|
source: "codex_app_bundle"
|
|
17377
17576
|
},
|
|
17378
17577
|
{
|
|
17379
|
-
path:
|
|
17578
|
+
path: join7(env.HOME ?? "", "Applications", appName, "Contents", "Resources", "codex"),
|
|
17380
17579
|
source: "codex_app_bundle"
|
|
17381
17580
|
}
|
|
17382
17581
|
]);
|
|
@@ -17384,7 +17583,7 @@ function codexAppBundleCandidates(env) {
|
|
|
17384
17583
|
}
|
|
17385
17584
|
function pathCandidates(env) {
|
|
17386
17585
|
return (env.PATH ?? "").split(delimiter).filter(Boolean).map((directory) => ({
|
|
17387
|
-
path:
|
|
17586
|
+
path: join7(directory, "codex"),
|
|
17388
17587
|
source: "path"
|
|
17389
17588
|
}));
|
|
17390
17589
|
}
|
|
@@ -17395,7 +17594,7 @@ function commonCandidates(env) {
|
|
|
17395
17594
|
"/opt/homebrew/bin",
|
|
17396
17595
|
"/usr/local/bin"
|
|
17397
17596
|
].filter(Boolean).map((directory) => ({
|
|
17398
|
-
path:
|
|
17597
|
+
path: join7(directory, "codex"),
|
|
17399
17598
|
source: "common"
|
|
17400
17599
|
}));
|
|
17401
17600
|
}
|
|
@@ -17880,6 +18079,7 @@ var BUILT_IN_HARNESS_CATALOG = [
|
|
|
17880
18079
|
{
|
|
17881
18080
|
name: "opencode",
|
|
17882
18081
|
harness: "opencode",
|
|
18082
|
+
aliases: ["oc", "opencode2"],
|
|
17883
18083
|
label: "OpenCode",
|
|
17884
18084
|
description: "OpenCode's coding agent over ACP, fronting many model vendors via OpenCode Zen",
|
|
17885
18085
|
homepage: "https://opencode.ai/docs/",
|
|
@@ -18030,7 +18230,7 @@ function expandHomePath2(value) {
|
|
|
18030
18230
|
if (value === "~")
|
|
18031
18231
|
return home;
|
|
18032
18232
|
if (value.startsWith("~/"))
|
|
18033
|
-
return
|
|
18233
|
+
return join8(home, value.slice(2));
|
|
18034
18234
|
return value;
|
|
18035
18235
|
}
|
|
18036
18236
|
function defaultWhichBinary(binary, platform) {
|
|
@@ -18064,7 +18264,7 @@ function defaultRunCommand(command, platform) {
|
|
|
18064
18264
|
}
|
|
18065
18265
|
function defaultRequirementExists(requirement) {
|
|
18066
18266
|
const expanded = expandHomePath2(requirement.path);
|
|
18067
|
-
if (!
|
|
18267
|
+
if (!existsSync8(expanded))
|
|
18068
18268
|
return false;
|
|
18069
18269
|
if (requirement.fileType === "any" || !requirement.fileType)
|
|
18070
18270
|
return true;
|
|
@@ -18146,6 +18346,7 @@ function codexCandidateReport(candidate, selectedPath) {
|
|
|
18146
18346
|
function createBuiltInHarnessCatalog() {
|
|
18147
18347
|
return BUILT_IN_HARNESS_CATALOG.map((entry) => ({
|
|
18148
18348
|
...entry,
|
|
18349
|
+
aliases: entry.aliases ? [...entry.aliases] : undefined,
|
|
18149
18350
|
tags: [...entry.tags],
|
|
18150
18351
|
support: { ...entry.support },
|
|
18151
18352
|
install: entry.install ? { ...entry.install, requires: [...entry.install.requires ?? []] } : undefined,
|
|
@@ -18292,7 +18493,7 @@ async function readHarnessCatalogOverrides(overridePath = resolveOpenScoutSuppor
|
|
|
18292
18493
|
}
|
|
18293
18494
|
}
|
|
18294
18495
|
async function writeHarnessCatalogOverrides(overrides, overridePath = resolveOpenScoutSupportPaths().harnessCatalogPath) {
|
|
18295
|
-
await mkdir(
|
|
18496
|
+
await mkdir(dirname5(overridePath), { recursive: true });
|
|
18296
18497
|
const payload = {
|
|
18297
18498
|
version: HARNESS_CATALOG_VERSION,
|
|
18298
18499
|
entries: overrides,
|
|
@@ -18302,7 +18503,7 @@ async function writeHarnessCatalogOverrides(overrides, overridePath = resolveOpe
|
|
|
18302
18503
|
`, "utf8");
|
|
18303
18504
|
}
|
|
18304
18505
|
async function ensureHarnessCatalogOverrideFile(overridePath = resolveOpenScoutSupportPaths().harnessCatalogPath) {
|
|
18305
|
-
if (
|
|
18506
|
+
if (existsSync8(overridePath))
|
|
18306
18507
|
return;
|
|
18307
18508
|
await writeHarnessCatalogOverrides({}, overridePath);
|
|
18308
18509
|
}
|
|
@@ -19337,7 +19538,8 @@ function canonicalizeIdentity(input) {
|
|
|
19337
19538
|
const definitionId = normalizeAgentIdentitySegment(input.definitionId);
|
|
19338
19539
|
const workspaceQualifier = input.workspaceQualifier ? normalizeAgentIdentitySegment(input.workspaceQualifier) : undefined;
|
|
19339
19540
|
const profile = input.profile ? normalizeAgentIdentitySegment(input.profile) : undefined;
|
|
19340
|
-
const
|
|
19541
|
+
const rawHarness = input.harness ? normalizeAgentIdentitySegment(input.harness) : undefined;
|
|
19542
|
+
const harness = rawHarness === "oc" ? "opencode" : rawHarness;
|
|
19341
19543
|
const model = input.model ? normalizeAgentIdentitySegment(input.model) : undefined;
|
|
19342
19544
|
const nodeQualifier = input.nodeQualifier ? normalizeAgentIdentitySegment(input.nodeQualifier) : undefined;
|
|
19343
19545
|
if (!definitionId) {
|
|
@@ -19764,6 +19966,21 @@ function normalizeScoutPermissionProfile(value) {
|
|
|
19764
19966
|
return SCOUT_PERMISSION_PROFILES.find((profile) => profile === normalized);
|
|
19765
19967
|
}
|
|
19766
19968
|
|
|
19969
|
+
// ../protocol/dist/presence.js
|
|
19970
|
+
var PRESENCE_STALE_AFTER_MS = 45000;
|
|
19971
|
+
var PRESENCE_GONE_AFTER_STALE_MS = 60000;
|
|
19972
|
+
function presenceLifecycle(beat, now, options = {}) {
|
|
19973
|
+
if (now < beat.staleAt)
|
|
19974
|
+
return "fresh";
|
|
19975
|
+
const goneAfterStaleMs = options.goneAfterStaleMs ?? PRESENCE_GONE_AFTER_STALE_MS;
|
|
19976
|
+
if (now < beat.staleAt + goneAfterStaleMs)
|
|
19977
|
+
return "stale";
|
|
19978
|
+
return "gone";
|
|
19979
|
+
}
|
|
19980
|
+
function isPresenceGone(beat, now, options = {}) {
|
|
19981
|
+
return presenceLifecycle(beat, now, options) === "gone";
|
|
19982
|
+
}
|
|
19983
|
+
|
|
19767
19984
|
// ../protocol/dist/runtime-catalog.generated.js
|
|
19768
19985
|
var SCOUT_RUNTIME_CATALOG_DATA = {
|
|
19769
19986
|
schemaVersion: "openscout.runtime-catalog.v1",
|
|
@@ -20210,7 +20427,9 @@ var SCOUT_RESERVED_RUNTIME_PROFILE_IDS = [
|
|
|
20210
20427
|
"fable",
|
|
20211
20428
|
"kimi",
|
|
20212
20429
|
"grok",
|
|
20213
|
-
"opus"
|
|
20430
|
+
"opus",
|
|
20431
|
+
"oc",
|
|
20432
|
+
"opencode"
|
|
20214
20433
|
];
|
|
20215
20434
|
|
|
20216
20435
|
// ../protocol/dist/runtime-catalog.js
|
|
@@ -20608,22 +20827,22 @@ function validateScoutRendezvousCodename(codename) {
|
|
|
20608
20827
|
|
|
20609
20828
|
// ../runtime/dist/claude-statusline.js
|
|
20610
20829
|
import { appendFile, mkdir as mkdir2, readFile as readFile3, writeFile as writeFile2 } from "node:fs/promises";
|
|
20611
|
-
import { basename as basename2, dirname as
|
|
20830
|
+
import { basename as basename2, dirname as dirname6, join as join9 } from "node:path";
|
|
20612
20831
|
function resolveClaudeStatuslineDirectory() {
|
|
20613
|
-
return
|
|
20832
|
+
return join9(resolveOpenScoutSupportPaths().runtimeDirectory, "statusline");
|
|
20614
20833
|
}
|
|
20615
20834
|
function resolveClaudeStatuslineDelegatePath() {
|
|
20616
|
-
return
|
|
20835
|
+
return join9(resolveClaudeStatuslineDirectory(), "claude-delegate.json");
|
|
20617
20836
|
}
|
|
20618
20837
|
function resolveClaudeStatuslineWrapperPath() {
|
|
20619
|
-
return
|
|
20838
|
+
return join9(resolveClaudeStatuslineDirectory(), "claude-statusline.sh");
|
|
20620
20839
|
}
|
|
20621
20840
|
async function writeClaudeStatuslineDelegate(delegate, path = resolveClaudeStatuslineDelegatePath()) {
|
|
20622
20841
|
const next = {
|
|
20623
20842
|
version: 1,
|
|
20624
20843
|
...delegate
|
|
20625
20844
|
};
|
|
20626
|
-
await mkdir2(
|
|
20845
|
+
await mkdir2(dirname6(path), { recursive: true });
|
|
20627
20846
|
await writeFile2(path, JSON.stringify(next, null, 2) + `
|
|
20628
20847
|
`, "utf8");
|
|
20629
20848
|
return next;
|
|
@@ -20638,9 +20857,9 @@ function isOpenScoutClaudeStatuslineCommand(command, wrapperPath = resolveClaude
|
|
|
20638
20857
|
}
|
|
20639
20858
|
|
|
20640
20859
|
// ../runtime/dist/managed-installs.js
|
|
20641
|
-
import { createHash } from "node:crypto";
|
|
20860
|
+
import { createHash as createHash2 } from "node:crypto";
|
|
20642
20861
|
import { mkdir as mkdir3, readFile as readFile4, writeFile as writeFile3 } from "node:fs/promises";
|
|
20643
|
-
import { dirname as
|
|
20862
|
+
import { dirname as dirname7 } from "node:path";
|
|
20644
20863
|
function emptyManagedInstallsFile(now = Date.now()) {
|
|
20645
20864
|
return {
|
|
20646
20865
|
version: 1,
|
|
@@ -20657,7 +20876,7 @@ function stableInstallId(input) {
|
|
|
20657
20876
|
input.provider ?? "",
|
|
20658
20877
|
input.targetPath ?? ""
|
|
20659
20878
|
].join("\x00");
|
|
20660
|
-
return `install.${
|
|
20879
|
+
return `install.${createHash2("sha256").update(key).digest("hex").slice(0, 18)}`;
|
|
20661
20880
|
}
|
|
20662
20881
|
function normalizeManagedInstallsFile(value) {
|
|
20663
20882
|
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
@@ -20679,7 +20898,8 @@ async function readManagedInstallsFile(path = resolveOpenScoutSupportPaths().man
|
|
|
20679
20898
|
}
|
|
20680
20899
|
}
|
|
20681
20900
|
async function writeManagedInstallsFile(file, path = resolveOpenScoutSupportPaths().managedInstallsPath) {
|
|
20682
|
-
|
|
20901
|
+
assertTestIsolatedUserData("write the managed-installs registry", "OPENSCOUT_SUPPORT_DIRECTORY");
|
|
20902
|
+
await mkdir3(dirname7(path), { recursive: true });
|
|
20683
20903
|
await writeFile3(path, JSON.stringify(file, null, 2) + `
|
|
20684
20904
|
`, "utf8");
|
|
20685
20905
|
}
|
|
@@ -20705,167 +20925,6 @@ async function upsertManagedInstall(input, now = Date.now()) {
|
|
|
20705
20925
|
return next;
|
|
20706
20926
|
}
|
|
20707
20927
|
|
|
20708
|
-
// ../runtime/dist/node-identity.js
|
|
20709
|
-
import { createHash as createHash2, createPrivateKey, createPublicKey, generateKeyPairSync, randomBytes, sign, verify } from "node:crypto";
|
|
20710
|
-
import { chmodSync, existsSync as existsSync8, mkdirSync as mkdirSync4, readFileSync as readFileSync5, renameSync as renameSync3, rmSync as rmSync2, writeFileSync as writeFileSync4 } from "node:fs";
|
|
20711
|
-
import { dirname as dirname7, join as join9 } from "node:path";
|
|
20712
|
-
var NODE_IDENTITY_FILE = "node-identity.json";
|
|
20713
|
-
var NODE_FINGERPRINT_PREFIX = "osc1";
|
|
20714
|
-
var NODE_CARD_TTL_MS = 24 * 60 * 60 * 1000;
|
|
20715
|
-
var stableNodeQualifierCache = new Map;
|
|
20716
|
-
function nodeIdentityPath(supportDirectory) {
|
|
20717
|
-
const dir = supportDirectory ?? resolveOpenScoutSupportPaths().supportDirectory;
|
|
20718
|
-
return join9(dir, NODE_IDENTITY_FILE);
|
|
20719
|
-
}
|
|
20720
|
-
function loadOrCreateNodeIdentity(supportDirectory) {
|
|
20721
|
-
const path = nodeIdentityPath(supportDirectory);
|
|
20722
|
-
if (existsSync8(path)) {
|
|
20723
|
-
return readAndValidateNodeIdentity(path);
|
|
20724
|
-
}
|
|
20725
|
-
return createNodeIdentity(supportDirectory);
|
|
20726
|
-
}
|
|
20727
|
-
function readStableNodeQualifier(supportDirectory) {
|
|
20728
|
-
const path = nodeIdentityPath(supportDirectory);
|
|
20729
|
-
const cached = stableNodeQualifierCache.get(path);
|
|
20730
|
-
if (cached) {
|
|
20731
|
-
return cached;
|
|
20732
|
-
}
|
|
20733
|
-
if (!existsSync8(path)) {
|
|
20734
|
-
return null;
|
|
20735
|
-
}
|
|
20736
|
-
const nodeQualifier = normalizeNodeQualifier(readAndValidateNodeIdentity(path).nodeQualifier);
|
|
20737
|
-
if (nodeQualifier) {
|
|
20738
|
-
stableNodeQualifierCache.set(path, nodeQualifier);
|
|
20739
|
-
}
|
|
20740
|
-
return nodeQualifier || null;
|
|
20741
|
-
}
|
|
20742
|
-
function readAndValidateNodeIdentity(path) {
|
|
20743
|
-
let parsed;
|
|
20744
|
-
try {
|
|
20745
|
-
parsed = JSON.parse(readFileSync5(path, "utf8"));
|
|
20746
|
-
} catch {
|
|
20747
|
-
throw new Error(`Corrupt node identity at ${path}; remove it to generate a fresh one.`);
|
|
20748
|
-
}
|
|
20749
|
-
if (parsed.version !== 1 || !parsed.publicKey || !parsed.privateKey) {
|
|
20750
|
-
throw new Error(`Corrupt node identity at ${path}; remove it to generate a fresh one.`);
|
|
20751
|
-
}
|
|
20752
|
-
if (parsed.nodeQualifier !== undefined && normalizeNodeQualifier(parsed.nodeQualifier) !== parsed.nodeQualifier) {
|
|
20753
|
-
throw new Error(`Corrupt node identity at ${path}; remove it to generate a fresh one.`);
|
|
20754
|
-
}
|
|
20755
|
-
try {
|
|
20756
|
-
const derived = createPublicKey(importPrivateKey(parsed.privateKey)).export({ type: "spki", format: "der" }).toString("base64");
|
|
20757
|
-
if (derived !== parsed.publicKey) {
|
|
20758
|
-
throw new Error("mismatch");
|
|
20759
|
-
}
|
|
20760
|
-
} catch {
|
|
20761
|
-
throw new Error(`Node identity at ${path} has mismatched or invalid keys; remove it to generate a fresh one.`);
|
|
20762
|
-
}
|
|
20763
|
-
return parsed;
|
|
20764
|
-
}
|
|
20765
|
-
function normalizeNodeQualifier(value) {
|
|
20766
|
-
return typeof value === "string" ? value.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/-+/g, "-").replace(/^-+|-+$/g, "") : "";
|
|
20767
|
-
}
|
|
20768
|
-
function createNodeIdentity(supportDirectory) {
|
|
20769
|
-
if (!supportDirectory) {
|
|
20770
|
-
assertTestIsolatedUserData("write the node identity", "OPENSCOUT_SUPPORT_DIRECTORY");
|
|
20771
|
-
}
|
|
20772
|
-
const path = nodeIdentityPath(supportDirectory);
|
|
20773
|
-
const { publicKey, privateKey } = generateKeyPairSync("ed25519");
|
|
20774
|
-
const identity = {
|
|
20775
|
-
version: 1,
|
|
20776
|
-
publicKey: publicKey.export({ type: "spki", format: "der" }).toString("base64"),
|
|
20777
|
-
privateKey: privateKey.export({ type: "pkcs8", format: "der" }).toString("base64"),
|
|
20778
|
-
createdAt: Date.now()
|
|
20779
|
-
};
|
|
20780
|
-
mkdirSync4(dirname7(path), { recursive: true });
|
|
20781
|
-
try {
|
|
20782
|
-
writeFileSync4(path, `${JSON.stringify(identity, null, 2)}
|
|
20783
|
-
`, { encoding: "utf8", mode: 384, flag: "wx" });
|
|
20784
|
-
} catch (error) {
|
|
20785
|
-
if (error.code === "EEXIST") {
|
|
20786
|
-
return readAndValidateNodeIdentity(path);
|
|
20787
|
-
}
|
|
20788
|
-
throw error;
|
|
20789
|
-
}
|
|
20790
|
-
try {
|
|
20791
|
-
chmodSync(path, 384);
|
|
20792
|
-
} catch {}
|
|
20793
|
-
return identity;
|
|
20794
|
-
}
|
|
20795
|
-
function nodeKeyId(publicKeyBase64) {
|
|
20796
|
-
return createHash2("sha256").update(Buffer.from(publicKeyBase64, "base64")).digest("hex");
|
|
20797
|
-
}
|
|
20798
|
-
function nodeFingerprint(publicKeyBase64) {
|
|
20799
|
-
const digest = createHash2("sha256").update(Buffer.from(publicKeyBase64, "base64")).digest();
|
|
20800
|
-
const encoded = base32Encode(digest.subarray(0, 10)).toLowerCase();
|
|
20801
|
-
return `${NODE_FINGERPRINT_PREFIX}:${encoded.slice(0, 4)}-${encoded.slice(4, 8)}`;
|
|
20802
|
-
}
|
|
20803
|
-
function signNodePayload(identity, payload) {
|
|
20804
|
-
const key = importPrivateKey(identity.privateKey);
|
|
20805
|
-
return sign(null, typeof payload === "string" ? Buffer.from(payload, "utf8") : payload, key).toString("base64");
|
|
20806
|
-
}
|
|
20807
|
-
function verifyNodeSignature(publicKeyBase64, payload, signatureBase64) {
|
|
20808
|
-
try {
|
|
20809
|
-
const key = importPublicKey(publicKeyBase64);
|
|
20810
|
-
return verify(null, typeof payload === "string" ? Buffer.from(payload, "utf8") : payload, key, Buffer.from(signatureBase64, "base64"));
|
|
20811
|
-
} catch {
|
|
20812
|
-
return false;
|
|
20813
|
-
}
|
|
20814
|
-
}
|
|
20815
|
-
function canonicalJson(value) {
|
|
20816
|
-
if (value === null || typeof value !== "object") {
|
|
20817
|
-
return JSON.stringify(value);
|
|
20818
|
-
}
|
|
20819
|
-
if (Array.isArray(value)) {
|
|
20820
|
-
return `[${value.map(canonicalJson).join(",")}]`;
|
|
20821
|
-
}
|
|
20822
|
-
const record2 = value;
|
|
20823
|
-
const keys = Object.keys(record2).sort();
|
|
20824
|
-
return `{${keys.map((key) => `${JSON.stringify(key)}:${canonicalJson(record2[key])}`).join(",")}}`;
|
|
20825
|
-
}
|
|
20826
|
-
function verifySignedNodeCard(card, now = Date.now()) {
|
|
20827
|
-
if (nodeKeyId(card.publicKey) !== card.keyId) {
|
|
20828
|
-
return false;
|
|
20829
|
-
}
|
|
20830
|
-
if (nodeFingerprint(card.publicKey) !== card.fingerprint) {
|
|
20831
|
-
return false;
|
|
20832
|
-
}
|
|
20833
|
-
if (!Number.isFinite(card.expiresAt) || card.expiresAt <= now) {
|
|
20834
|
-
return false;
|
|
20835
|
-
}
|
|
20836
|
-
if (card.tls !== undefined) {
|
|
20837
|
-
if (typeof card.tls !== "object" || card.tls === null || typeof card.tls.spkiFingerprint !== "string" || !/^[0-9a-f]{64}$/.test(card.tls.spkiFingerprint)) {
|
|
20838
|
-
return false;
|
|
20839
|
-
}
|
|
20840
|
-
}
|
|
20841
|
-
const { signature, ...unsigned } = card;
|
|
20842
|
-
return verifyNodeSignature(card.publicKey, canonicalJson(unsigned), signature);
|
|
20843
|
-
}
|
|
20844
|
-
var BASE32_ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
|
|
20845
|
-
function base32Encode(input) {
|
|
20846
|
-
let bits = 0;
|
|
20847
|
-
let value = 0;
|
|
20848
|
-
let output = "";
|
|
20849
|
-
for (const byte of input) {
|
|
20850
|
-
value = value << 8 | byte;
|
|
20851
|
-
bits += 8;
|
|
20852
|
-
while (bits >= 5) {
|
|
20853
|
-
output += BASE32_ALPHABET[value >>> bits - 5 & 31];
|
|
20854
|
-
bits -= 5;
|
|
20855
|
-
}
|
|
20856
|
-
}
|
|
20857
|
-
if (bits > 0) {
|
|
20858
|
-
output += BASE32_ALPHABET[value << 5 - bits & 31];
|
|
20859
|
-
}
|
|
20860
|
-
return output;
|
|
20861
|
-
}
|
|
20862
|
-
function importPrivateKey(privateKeyBase64) {
|
|
20863
|
-
return createPrivateKey({ key: Buffer.from(privateKeyBase64, "base64"), format: "der", type: "pkcs8" });
|
|
20864
|
-
}
|
|
20865
|
-
function importPublicKey(publicKeyBase64) {
|
|
20866
|
-
return createPublicKey({ key: Buffer.from(publicKeyBase64, "base64"), format: "der", type: "spki" });
|
|
20867
|
-
}
|
|
20868
|
-
|
|
20869
20928
|
// ../runtime/dist/user-project-hints.js
|
|
20870
20929
|
import { readdir, readFile as readFile5, stat } from "node:fs/promises";
|
|
20871
20930
|
import { homedir as homedir7 } from "node:os";
|
|
@@ -21189,7 +21248,7 @@ async function collectUserLevelProjectRootHints(options = {}) {
|
|
|
21189
21248
|
}
|
|
21190
21249
|
|
|
21191
21250
|
// ../runtime/dist/setup.js
|
|
21192
|
-
var MANAGED_AGENT_HARNESSES = ["claude", "codex", "cursor", "grok", "grok-acp", "kimi", "pi"];
|
|
21251
|
+
var MANAGED_AGENT_HARNESSES = ["claude", "codex", "cursor", "grok", "grok-acp", "kimi", "pi", "opencode"];
|
|
21193
21252
|
function titleCaseWords(value) {
|
|
21194
21253
|
return value.split(/[\s._-]+/).map((part) => part.trim()).filter(Boolean).map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join(" ");
|
|
21195
21254
|
}
|
|
@@ -21326,6 +21385,10 @@ var PROJECT_HARNESS_MARKERS = {
|
|
|
21326
21385
|
pi: [
|
|
21327
21386
|
"PI.md",
|
|
21328
21387
|
".pi"
|
|
21388
|
+
],
|
|
21389
|
+
opencode: [
|
|
21390
|
+
"OPENCODE.md",
|
|
21391
|
+
".opencode"
|
|
21329
21392
|
]
|
|
21330
21393
|
};
|
|
21331
21394
|
function partitionFlatAndNestedMarkers(markers) {
|
|
@@ -21416,6 +21479,9 @@ function normalizeManagedHarness(value, fallback) {
|
|
|
21416
21479
|
if (value === "pi") {
|
|
21417
21480
|
return "pi";
|
|
21418
21481
|
}
|
|
21482
|
+
if (value === "opencode") {
|
|
21483
|
+
return "opencode";
|
|
21484
|
+
}
|
|
21419
21485
|
return fallback;
|
|
21420
21486
|
}
|
|
21421
21487
|
function titleCase(value) {
|
|
@@ -22160,7 +22226,8 @@ async function detectHarnessMarkers(projectRoot) {
|
|
|
22160
22226
|
grok: [],
|
|
22161
22227
|
"grok-acp": [],
|
|
22162
22228
|
kimi: [],
|
|
22163
|
-
pi: []
|
|
22229
|
+
pi: [],
|
|
22230
|
+
opencode: []
|
|
22164
22231
|
};
|
|
22165
22232
|
for (const harness2 of MANAGED_AGENT_HARNESSES) {
|
|
22166
22233
|
for (const marker of PROJECT_HARNESS_MARKERS[harness2]) {
|
|
@@ -22341,6 +22408,7 @@ async function readOpenScoutSettings(options = {}) {
|
|
|
22341
22408
|
async function writeOpenScoutSettings(settings, options = {}) {
|
|
22342
22409
|
assertTestIsolatedUserData("write OpenScout settings", "OPENSCOUT_SUPPORT_DIRECTORY");
|
|
22343
22410
|
ensureOpenScoutCleanSlateSync();
|
|
22411
|
+
const settingsPath = resolveOpenScoutSupportPaths().settingsPath;
|
|
22344
22412
|
const current = await readOpenScoutSettings(options);
|
|
22345
22413
|
const merged = {
|
|
22346
22414
|
...current,
|
|
@@ -22394,7 +22462,11 @@ async function writeOpenScoutSettings(settings, options = {}) {
|
|
|
22394
22462
|
const normalized = await normalizeSettingsRecord(merged, {
|
|
22395
22463
|
currentDirectory: options.currentDirectory
|
|
22396
22464
|
});
|
|
22397
|
-
|
|
22465
|
+
const settingsPathNow = resolveOpenScoutSupportPaths().settingsPath;
|
|
22466
|
+
if (settingsPathNow !== settingsPath) {
|
|
22467
|
+
throw new Error(`Refusing to write OpenScout settings: target moved from ${settingsPath} to ${settingsPathNow} mid-write (test teardown?).`);
|
|
22468
|
+
}
|
|
22469
|
+
await writeJsonFile(settingsPath, normalized);
|
|
22398
22470
|
return normalized;
|
|
22399
22471
|
}
|
|
22400
22472
|
var SCOUT_SKILL_FILE_NAME = "SKILL.md";
|
|
@@ -22650,6 +22722,8 @@ async function readRelayAgentOverrides() {
|
|
|
22650
22722
|
}));
|
|
22651
22723
|
}
|
|
22652
22724
|
async function writeRelayAgentOverrides(overrides) {
|
|
22725
|
+
assertTestIsolatedUserData("write the relay-agents registry", "OPENSCOUT_SUPPORT_DIRECTORY");
|
|
22726
|
+
const registryPath = resolveOpenScoutSupportPaths().relayAgentsRegistryPath;
|
|
22653
22727
|
const normalizedAgents = Object.fromEntries(Object.entries(overrides).map(([agentId, record2]) => {
|
|
22654
22728
|
const definitionId = normalizeAgentId(record2.definitionId || record2.agentId || agentId);
|
|
22655
22729
|
const projectRoot = normalizePath(record2.projectRoot);
|
|
@@ -22683,7 +22757,11 @@ async function writeRelayAgentOverrides(overrides) {
|
|
|
22683
22757
|
}
|
|
22684
22758
|
];
|
|
22685
22759
|
}));
|
|
22686
|
-
|
|
22760
|
+
const registryPathNow = resolveOpenScoutSupportPaths().relayAgentsRegistryPath;
|
|
22761
|
+
if (registryPathNow !== registryPath) {
|
|
22762
|
+
throw new Error(`Refusing to write the relay-agents registry: target moved from ${registryPath} to ${registryPathNow} mid-write (test teardown?).`);
|
|
22763
|
+
}
|
|
22764
|
+
await writeJsonFile(registryPath, {
|
|
22687
22765
|
version: 1,
|
|
22688
22766
|
agents: normalizedAgents
|
|
22689
22767
|
});
|
|
@@ -23361,6 +23439,7 @@ function loadUserConfig() {
|
|
|
23361
23439
|
}
|
|
23362
23440
|
}
|
|
23363
23441
|
function saveUserConfig(config) {
|
|
23442
|
+
assertTestIsolatedUserData("write the OpenScout user config", "OPENSCOUT_HOME");
|
|
23364
23443
|
const configPath = userConfigPath();
|
|
23365
23444
|
mkdirSync5(dirname10(configPath), { recursive: true });
|
|
23366
23445
|
writeFileSync5(configPath, JSON.stringify(config, null, 2) + `
|
|
@@ -23510,10 +23589,8 @@ async function loadOpenScoutOnboardingState(options = {}) {
|
|
|
23510
23589
|
const operatorNameSource = explicitUserName ? "user-config" : envOperatorName ? "env" : settingsOperatorName || answeredSettingsOperatorName ? "settings" : "default";
|
|
23511
23590
|
const contextRoot = settings.discovery.contextRoot ?? null;
|
|
23512
23591
|
const project = await resolveProjectConfig({ currentDirectory, contextRoot });
|
|
23513
|
-
const
|
|
23514
|
-
|
|
23515
|
-
options.catalog ?? loadHarnessCatalogSnapshot().catch(() => null)
|
|
23516
|
-
]);
|
|
23592
|
+
const broker = options.broker ?? await brokerServiceStatus().catch(() => null);
|
|
23593
|
+
const catalog = options.catalog ?? await loadHarnessCatalogSnapshot().catch(() => null);
|
|
23517
23594
|
const readyRuntimeCount = catalog?.entries.filter((entry) => entry.readinessReport.ready).length ?? 0;
|
|
23518
23595
|
const hasReadyRuntime = readyRuntimeCount > 0;
|
|
23519
23596
|
const hasLocalConfig = localConfigExists();
|
|
@@ -23580,11 +23657,7 @@ async function ensureOpenScoutOnboardingLocalConfig(options = {}) {
|
|
|
23580
23657
|
}, {
|
|
23581
23658
|
currentDirectory: options.currentDirectory
|
|
23582
23659
|
});
|
|
23583
|
-
return loadOpenScoutOnboardingState({
|
|
23584
|
-
currentDirectory: options.currentDirectory,
|
|
23585
|
-
broker: options.broker,
|
|
23586
|
-
catalog: options.catalog
|
|
23587
|
-
});
|
|
23660
|
+
return loadOpenScoutOnboardingState({ currentDirectory: options.currentDirectory });
|
|
23588
23661
|
}
|
|
23589
23662
|
async function saveOpenScoutOnboardingIdentity(input) {
|
|
23590
23663
|
const name = input.name.trim();
|
|
@@ -23604,11 +23677,7 @@ async function saveOpenScoutOnboardingIdentity(input) {
|
|
|
23604
23677
|
}, {
|
|
23605
23678
|
currentDirectory: input.currentDirectory
|
|
23606
23679
|
});
|
|
23607
|
-
return loadOpenScoutOnboardingState({
|
|
23608
|
-
currentDirectory: input.currentDirectory,
|
|
23609
|
-
broker: input.broker,
|
|
23610
|
-
catalog: input.catalog
|
|
23611
|
-
});
|
|
23680
|
+
return loadOpenScoutOnboardingState({ currentDirectory: input.currentDirectory });
|
|
23612
23681
|
}
|
|
23613
23682
|
async function saveOpenScoutOnboardingProject(input) {
|
|
23614
23683
|
const contextRoot = normalizePath2(input.contextRoot);
|
|
@@ -23636,11 +23705,7 @@ async function saveOpenScoutOnboardingProject(input) {
|
|
|
23636
23705
|
}, {
|
|
23637
23706
|
currentDirectory: input.currentDirectory ?? contextRoot
|
|
23638
23707
|
});
|
|
23639
|
-
return loadOpenScoutOnboardingState({
|
|
23640
|
-
currentDirectory: contextRoot,
|
|
23641
|
-
broker: input.broker,
|
|
23642
|
-
catalog: input.catalog
|
|
23643
|
-
});
|
|
23708
|
+
return loadOpenScoutOnboardingState({ currentDirectory: contextRoot });
|
|
23644
23709
|
}
|
|
23645
23710
|
async function triggerMeshDiscovery(broker) {
|
|
23646
23711
|
if (!broker.reachable || !broker.brokerUrl)
|
|
@@ -36975,6 +37040,125 @@ class ThreadEventPlane {
|
|
|
36975
37040
|
watch.clients.clear();
|
|
36976
37041
|
}
|
|
36977
37042
|
}
|
|
37043
|
+
// ../runtime/dist/activity-transitions.js
|
|
37044
|
+
class ActivityTransitionTracker {
|
|
37045
|
+
transitions = new Map;
|
|
37046
|
+
record(agentId, activity, observedAt, now) {
|
|
37047
|
+
const previous = this.transitions.get(agentId);
|
|
37048
|
+
if (previous && previous.activity === activity) {
|
|
37049
|
+
return previous.transitionAt;
|
|
37050
|
+
}
|
|
37051
|
+
const transitionAt = Number.isFinite(observedAt) ? Math.min(observedAt, now) : now;
|
|
37052
|
+
this.transitions.set(agentId, { activity, transitionAt });
|
|
37053
|
+
return transitionAt;
|
|
37054
|
+
}
|
|
37055
|
+
peek(agentId) {
|
|
37056
|
+
const transition = this.transitions.get(agentId);
|
|
37057
|
+
return transition ? { ...transition } : undefined;
|
|
37058
|
+
}
|
|
37059
|
+
forget(agentId) {
|
|
37060
|
+
this.transitions.delete(agentId);
|
|
37061
|
+
}
|
|
37062
|
+
clear() {
|
|
37063
|
+
this.transitions.clear();
|
|
37064
|
+
}
|
|
37065
|
+
size() {
|
|
37066
|
+
return this.transitions.size;
|
|
37067
|
+
}
|
|
37068
|
+
}
|
|
37069
|
+
// ../runtime/dist/presence-map.js
|
|
37070
|
+
var DEFAULT_DETAIL_DEBOUNCE_MS = 5000;
|
|
37071
|
+
|
|
37072
|
+
class BrokerPresenceMap {
|
|
37073
|
+
beats = new Map;
|
|
37074
|
+
lastDetailChangeAt = new Map;
|
|
37075
|
+
staleAfterMs;
|
|
37076
|
+
goneAfterStaleMs;
|
|
37077
|
+
detailDebounceMs;
|
|
37078
|
+
transitions;
|
|
37079
|
+
constructor(options = {}) {
|
|
37080
|
+
this.staleAfterMs = options.staleAfterMs ?? PRESENCE_STALE_AFTER_MS;
|
|
37081
|
+
this.goneAfterStaleMs = options.goneAfterStaleMs ?? PRESENCE_GONE_AFTER_STALE_MS;
|
|
37082
|
+
this.detailDebounceMs = options.detailDebounceMs ?? DEFAULT_DETAIL_DEBOUNCE_MS;
|
|
37083
|
+
this.transitions = options.transitions ?? new ActivityTransitionTracker;
|
|
37084
|
+
}
|
|
37085
|
+
observe(observation, now) {
|
|
37086
|
+
const agentId = observation.agentId ?? observation.status.agentId ?? observation.status.subjectId;
|
|
37087
|
+
if (!agentId)
|
|
37088
|
+
return;
|
|
37089
|
+
const status = observation.status;
|
|
37090
|
+
if (isTransportInferredStall(status))
|
|
37091
|
+
return;
|
|
37092
|
+
const updatedAt = Math.min(status.updatedAt, now);
|
|
37093
|
+
const staleAt = Math.max(status.staleAt ?? 0, updatedAt + this.staleAfterMs);
|
|
37094
|
+
if (isPresenceGone({ staleAt }, now, { goneAfterStaleMs: this.goneAfterStaleMs })) {
|
|
37095
|
+
this.forget(agentId);
|
|
37096
|
+
return;
|
|
37097
|
+
}
|
|
37098
|
+
const previous = this.beats.get(agentId);
|
|
37099
|
+
const detail = status.detail?.title ?? undefined;
|
|
37100
|
+
const transitionAt = this.transitions.record(agentId, status.activity, status.transitionAt ?? status.updatedAt, now);
|
|
37101
|
+
const activityChanged = previous?.activity !== status.activity;
|
|
37102
|
+
const detailChanged = previous !== undefined && previous.detail !== detail;
|
|
37103
|
+
const debounceElapsed = now - (this.lastDetailChangeAt.get(agentId) ?? 0) >= this.detailDebounceMs;
|
|
37104
|
+
const transitioned = previous === undefined || activityChanged || detailChanged && debounceElapsed;
|
|
37105
|
+
if (activityChanged || detailChanged && debounceElapsed) {
|
|
37106
|
+
this.lastDetailChangeAt.set(agentId, now);
|
|
37107
|
+
}
|
|
37108
|
+
const beat = {
|
|
37109
|
+
agentId,
|
|
37110
|
+
displayName: observation.displayName ?? previous?.displayName,
|
|
37111
|
+
activity: status.activity,
|
|
37112
|
+
phase: status.phase,
|
|
37113
|
+
detail,
|
|
37114
|
+
transitionAt,
|
|
37115
|
+
updatedAt,
|
|
37116
|
+
staleAt,
|
|
37117
|
+
confidence: status.confidence,
|
|
37118
|
+
needRef: observation.needRef,
|
|
37119
|
+
boundConversationId: observation.boundConversationId
|
|
37120
|
+
};
|
|
37121
|
+
this.beats.set(agentId, beat);
|
|
37122
|
+
return { beat, transitioned, previousActivity: previous?.activity };
|
|
37123
|
+
}
|
|
37124
|
+
snapshot(now) {
|
|
37125
|
+
this.prune(now);
|
|
37126
|
+
return { at: now, beats: [...this.beats.values()] };
|
|
37127
|
+
}
|
|
37128
|
+
get(agentId) {
|
|
37129
|
+
return this.beats.get(agentId);
|
|
37130
|
+
}
|
|
37131
|
+
prune(now) {
|
|
37132
|
+
const dropped = [];
|
|
37133
|
+
for (const [agentId, beat] of this.beats) {
|
|
37134
|
+
if (!isPresenceGone(beat, now, { goneAfterStaleMs: this.goneAfterStaleMs }))
|
|
37135
|
+
continue;
|
|
37136
|
+
this.beats.delete(agentId);
|
|
37137
|
+
this.lastDetailChangeAt.delete(agentId);
|
|
37138
|
+
this.transitions.forget(agentId);
|
|
37139
|
+
dropped.push(agentId);
|
|
37140
|
+
}
|
|
37141
|
+
return dropped;
|
|
37142
|
+
}
|
|
37143
|
+
forget(agentId) {
|
|
37144
|
+
this.beats.delete(agentId);
|
|
37145
|
+
this.lastDetailChangeAt.delete(agentId);
|
|
37146
|
+
this.transitions.forget(agentId);
|
|
37147
|
+
}
|
|
37148
|
+
clear() {
|
|
37149
|
+
this.beats.clear();
|
|
37150
|
+
this.lastDetailChangeAt.clear();
|
|
37151
|
+
this.transitions.clear();
|
|
37152
|
+
}
|
|
37153
|
+
size() {
|
|
37154
|
+
return this.beats.size;
|
|
37155
|
+
}
|
|
37156
|
+
}
|
|
37157
|
+
function isTransportInferredStall(status) {
|
|
37158
|
+
if (status.activity !== "stalled")
|
|
37159
|
+
return false;
|
|
37160
|
+
return status.provenance.some((entry) => entry.source === "staleness_inference");
|
|
37161
|
+
}
|
|
36978
37162
|
// ../runtime/dist/issue-runner.js
|
|
36979
37163
|
var CLAIM_TERMINAL_STATES = new Set(["released", "expired", "cancelled"]);
|
|
36980
37164
|
var ACTIVE_FLIGHT_STATES2 = new Set(["queued", "waking", "running", "waiting"]);
|