@openscout/scout 0.2.102 → 0.2.105
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 +37 -0
- package/bin/scout.mjs +6 -0
- package/bin/scoutd +0 -0
- package/dist/build-manifest.json +4 -4
- package/dist/chat.mjs +285 -0
- package/dist/client/assets/ActivityScreen-CcDdQTBK.js +1 -0
- package/dist/client/assets/{AddProjectForm-DfbjlFfy.js → AddProjectForm-CHNJ4NnS.js} +1 -1
- package/dist/client/assets/{AdventureEvidence-Dzz9VbuE.js → AdventureEvidence-B4mEvXeD.js} +1 -1
- package/dist/client/assets/{AdventureReader-ClMxT0e4.js → AdventureReader-ZsBDQITY.js} +1 -1
- package/dist/client/assets/{AdventureScenery-D548O0x4.js → AdventureScenery-DSxDlqG1.js} +1 -1
- package/dist/client/assets/AgentAdventures-BxrYq_2v.js +1 -0
- package/dist/client/assets/{AgentAvatar-BIwg54Tj.js → AgentAvatar-NZOqcsB2.js} +1 -1
- package/dist/client/assets/AgentConfigurationScreen-BhD1PEAM.js +1 -0
- package/dist/client/assets/AgentDefinitionsWorkspace-BqS6MXqF.js +1 -0
- package/dist/client/assets/{AgentDetailCard-CFDE8TLi.js → AgentDetailCard-MIEBKw_S.js} +1 -1
- package/dist/client/assets/AgentFloorView-A0dDRlRV.js +1 -0
- package/dist/client/assets/{AgentFloorWorld-BDJmXl3C.js → AgentFloorWorld-BTqwmK5G.js} +1 -1
- package/dist/client/assets/AgentInfoScreen-DuaN0sgE.js +1 -0
- package/dist/client/assets/{AgentLaneCard-C6YmwPxQ.js → AgentLaneCard-C4rKLLdT.js} +1 -1
- package/dist/client/assets/{AgentLaneChrome-D9uJ4QY7.js → AgentLaneChrome-fGC-ZrJS.js} +1 -1
- package/dist/client/assets/{AgentLaneDetailSheet-KYckCBCX.js → AgentLaneDetailSheet-BTF4_th9.js} +1 -1
- package/dist/client/assets/{AgentLaneSummaryResize-BBYBS3DO.js → AgentLaneSummaryResize-DgSeA_vS.js} +1 -1
- package/dist/client/assets/AgentLanesEmbedScreen-CeNiaZ9_.js +1 -0
- package/dist/client/assets/{AgentLanesPreflight-pw2vMO3Q.js → AgentLanesPreflight-CcS23wij.js} +1 -1
- package/dist/client/assets/{AgentLanesView-aAyC7lHf.js → AgentLanesView-WZhEDBFE.js} +1 -1
- package/dist/client/assets/{AgentLiveActions-lYzicnNa.js → AgentLiveActions-6Kfr1uOT.js} +1 -1
- package/dist/client/assets/AgentMasterScreen-DUDUTAnU.js +1 -0
- package/dist/client/assets/{AgentSessions-Cox2zS-e.js → AgentSessions-CO1WGa8Z.js} +2 -2
- package/dist/client/assets/AgentsConsole-BQOWkj35.js +1 -0
- package/dist/client/assets/AgentsScreen-BMNAj1PH.js +1 -0
- package/dist/client/assets/AgentsSubnav-CeHhuzyM.js +1 -0
- package/dist/client/assets/{AstronautSuit-C-4I5YKi.js → AstronautSuit-D67fIBdR.js} +1 -1
- package/dist/client/assets/{AtopView-DKm-ERYC.js → AtopView-Ck30FbzG.js} +1 -1
- package/dist/client/assets/{BackToPicker-Bys9ColC.js → BackToPicker-CkBhGRlD.js} +1 -1
- package/dist/client/assets/BriefingDetailScreen-yZG8_m4h.js +1 -0
- package/dist/client/assets/{BriefingsScreen-D4Zf31Y6.js → BriefingsScreen-DTxYMr3a.js} +1 -1
- package/dist/client/assets/{BrokerMetadataPanel-1GoSl2BV.js → BrokerMetadataPanel-crirZCdo.js} +1 -1
- package/dist/client/assets/BrokerScreen-CT37VQiL.js +8 -0
- package/dist/client/assets/Canvas-CRP0KjKb.js +1 -0
- package/dist/client/assets/{CastPicker-BuwE_JQp.js → CastPicker-ZPomvOf-.js} +1 -1
- package/dist/client/assets/ChannelComposer-BVItWlEz.js +1 -0
- package/dist/client/assets/ChannelSidebar-B-2spawY.js +1 -0
- package/dist/client/assets/{CharacterFamilyPreview-CfO3j8Of.js → CharacterFamilyPreview-ckVkecDO.js} +1 -1
- package/dist/client/assets/ChatAvatar-DKBsbOqk.js +1 -0
- package/dist/client/assets/ChatBits-CLJ71hTY.js +1 -0
- package/dist/client/assets/{ChatCollapsedStrip-TV0j1xTB.js → ChatCollapsedStrip-Co0NmqOO.js} +1 -1
- package/dist/client/assets/ChatRightPanel-pKQtkAgl.js +1 -0
- package/dist/client/assets/ChatSpaceSurface-NrLwdPkE.js +1 -0
- package/dist/client/assets/ChatSpaceTheme-BPMgPdVK.css +1 -0
- package/dist/client/assets/ChatSpaceTheme-D37Jk7bl.js +1 -0
- package/dist/client/assets/{CodeDiffPane-DB6-mqtX.js → CodeDiffPane-D-iv28LJ.js} +1 -1
- package/dist/client/assets/{CodeProjectPicker-B_LNLpIK.js → CodeProjectPicker-CZ3gDdiT.js} +1 -1
- package/dist/client/assets/{CodeScreen-C9H160XS.js → CodeScreen-CSC-zbP9.js} +1 -1
- package/dist/client/assets/{CommsCanvas-DOKw3Q8i.js → CommsCanvas-DdNAwjGW.js} +1 -1
- package/dist/client/assets/{CommsDeck-C18JA7rK.js → CommsDeck-mGWY7Ivi.js} +1 -1
- package/dist/client/assets/{CommsFlowGraph-Czg-KTS0.js → CommsFlowGraph-voDD9M5R.js} +1 -1
- package/dist/client/assets/{CommsFlowMap-CzBWvSa5.js → CommsFlowMap-C33sgD48.js} +1 -1
- package/dist/client/assets/{CommsSelection-g1twA-Lb.js → CommsSelection-BL8aYD7z.js} +1 -1
- package/dist/client/assets/{ConversationComposer-B7RU6LKd.js → ConversationComposer-DNcn5U6D.js} +1 -1
- package/dist/client/assets/ConversationFeedRows-RnYSa7Io.js +1 -0
- package/dist/client/assets/ConversationHeader-Y9TEJxP_.js +1 -0
- package/dist/client/assets/{ConversationPanels-C9yCAoJy.js → ConversationPanels-6pprBpmq.js} +2 -2
- package/dist/client/assets/ConversationScreen-tpj4cqWs.js +2 -0
- package/dist/client/assets/{ConversationStatus-CK-YfLpi.js → ConversationStatus-Cv-7hErW.js} +1 -1
- package/dist/client/assets/{CrewAvatar-CJhuqTsJ.js → CrewAvatar-zgzC3cbU.js} +1 -1
- package/dist/client/assets/{CrewSprite-hgpA3SWB.js → CrewSprite-Dp9KBBGY.js} +1 -1
- package/dist/client/assets/CrewWorkspaces-DDuYMByu.css +1 -0
- package/dist/client/assets/CrewWorkspaces-K2jcyLec.js +1 -0
- package/dist/client/assets/{DataTable-BMOZ1-z8.js → DataTable-av71ehJV.js} +1 -1
- package/dist/client/assets/{DispatchAftermath-DDlwqSCY.js → DispatchAftermath-CcYGUB10.js} +1 -1
- package/dist/client/assets/{DocumentFocusViewer-f12RRQpV.js → DocumentFocusViewer-DlMiEALb.js} +1 -1
- package/dist/client/assets/{EmbeddableSurfacesLab-DGl9EMRV.js → EmbeddableSurfacesLab-CTkO_tQR.js} +1 -1
- package/dist/client/assets/{EmptyState-uyYN5piI.js → EmptyState-CYUwYyAW.js} +1 -1
- package/dist/client/assets/{FileViewerPane-HtiDbj9N.js → FileViewerPane-Cxhixtks.js} +1 -1
- package/dist/client/assets/FlightObserveScreen-CvzhzuWc.js +1 -0
- package/dist/client/assets/{FloorContextSheet-DV-SYA0K.js → FloorContextSheet-Vj_wVZq1.js} +1 -1
- package/dist/client/assets/{FloorExchangePanel-D59nvRCF.js → FloorExchangePanel-CjHSDXad.js} +1 -1
- package/dist/client/assets/{FloorMessagePasses-BCwsz9VS.js → FloorMessagePasses-BG4ebnX5.js} +1 -1
- package/dist/client/assets/{FloorReplay-BHo79HCD.js → FloorReplay-BoYaGY9t.js} +1 -1
- package/dist/client/assets/FloorResourcesSheet-_Iy5UqgY.js +1 -0
- package/dist/client/assets/{FloorSavedWork-2tjBoy06.js → FloorSavedWork-jbtRs-YE.js} +1 -1
- package/dist/client/assets/{FloorTacticalHUD-Bngao6sn.js → FloorTacticalHUD-BhyOqlL5.js} +1 -1
- package/dist/client/assets/{FollowScreen-eHXOlK-u.js → FollowScreen-CupyOgt4.js} +1 -1
- package/dist/client/assets/HarnessMark-DSvM_H7H.js +1 -0
- package/dist/client/assets/HarnessesScreen-DyjqbZ4k.js +1 -0
- package/dist/client/assets/{HerdrSession-CtJOUn7H.js → HerdrSession-Dcm3vf9U.js} +1 -1
- package/dist/client/assets/{HomeHero-Cvwx2H0w.js → HomeHero-pIZtE1cC.js} +1 -1
- package/dist/client/assets/{HostAdvisorView-CTJXIc1Q.js → HostAdvisorView-Dv5meXo2.js} +1 -1
- package/dist/client/assets/InviteLandingScreen-xZQ2na1z.js +1 -0
- package/dist/client/assets/InviteSheet--5Zjct25.js +1 -0
- package/dist/client/assets/JumpPalette-BmiSOEmp.js +1 -0
- package/dist/client/assets/{KnowledgeSearchInspector-DwGMVmFL.js → KnowledgeSearchInspector-B8yiM524.js} +1 -1
- package/dist/client/assets/KnowledgeSearchScreen-BPqAjHnH.js +1 -0
- package/dist/client/assets/{LaneToolHoverCard-C6YehJqD.js → LaneToolHoverCard-D2cnTeUd.js} +1 -1
- package/dist/client/assets/LaneTraceDetailSheet-jl4XQmEx.js +1 -0
- package/dist/client/assets/{LaneTraceEventFocus-WLNZZVi_.js → LaneTraceEventFocus-BLhVHwff.js} +1 -1
- package/dist/client/assets/{MeshCanvas-FDDGE69h.js → MeshCanvas-BR25OBTJ.js} +1 -1
- package/dist/client/assets/{MeshCanvasMinimap-CGRzQCac.js → MeshCanvasMinimap-ClVolr4-.js} +1 -1
- package/dist/client/assets/MeshScreen-BW1dMFWF.js +1 -0
- package/dist/client/assets/{MeshTopologyView-C2Cv_2gx.js → MeshTopologyView-BT3ke2D1.js} +2 -2
- package/dist/client/assets/MessagesScreen-CtNMfIvC.js +1 -0
- package/dist/client/assets/{MissionContextRail-CVSZJnvX.js → MissionContextRail-CafjuseK.js} +1 -1
- package/dist/client/assets/MissionControlView-BjPOViGY.js +1 -0
- package/dist/client/assets/{MissionFocusOverlay-B9SiuO-i.js → MissionFocusOverlay-nhy3hkxQ.js} +1 -1
- package/dist/client/assets/MissionLeftAgentRow-Dms0DBjO.js +1 -0
- package/dist/client/assets/{MissionLogPane-CMBiI29U.js → MissionLogPane-DiUf3vWW.js} +1 -1
- package/dist/client/assets/NativeAreaScreen-BQSTo8As.js +1 -0
- package/dist/client/assets/NativeAreaScreen-Brix6xDB.js +1 -0
- package/dist/client/assets/NativeAreaScreen-D7HyQNlM.js +1 -0
- package/dist/client/assets/{NewAgentModal-Cl4nsGhu.js → NewAgentModal-BQ2wQ5gp.js} +1 -1
- package/dist/client/assets/NewChatComposer-BEXS8vV6.js +19 -0
- package/dist/client/assets/{NewChatOrigin-CyPPWTJP.js → NewChatOrigin-C8ROO4ps.js} +1 -1
- package/dist/client/assets/{NodeDetailPanel-BUG8rOb-.js → NodeDetailPanel-BNTqYC7m.js} +1 -1
- package/dist/client/assets/{NodeMenu-Fw8ATWQA.js → NodeMenu-CcOeFRCB.js} +1 -1
- package/dist/client/assets/{ObserveEmbedScreen-BPiSXXvm.js → ObserveEmbedScreen-Dh30EjAQ.js} +2 -2
- package/dist/client/assets/{ObserveTextFlow-ET0dD1wO.js → ObserveTextFlow-CC5mnngm.js} +2 -2
- package/dist/client/assets/{ObservedTopologyPanel-DkEkQzo-.js → ObservedTopologyPanel-DF6tRZL_.js} +1 -1
- package/dist/client/assets/OpenScoutAppShell-D9pgw36i.js +31 -0
- package/dist/client/assets/OpsAgentsView-D3rM0udq.js +1 -0
- package/dist/client/assets/OpsScreen-DySeNQ1V.js +1 -0
- package/dist/client/assets/OpsSubnav-C9E0r3GZ.js +1 -0
- package/dist/client/assets/ProjectAgentProfile-FUav75j2.js +1 -0
- package/dist/client/assets/{ProjectAgentProfileBar-C1fR65Eh.js → ProjectAgentProfileBar-C8z22pJ2.js} +1 -1
- package/dist/client/assets/ProjectAgentProfileHero-BLK0EwMg.js +1 -0
- package/dist/client/assets/ProjectsInbox-DfCXReZK.js +2 -0
- package/dist/client/assets/ProjectsRail-CELVubfJ.js +1 -0
- package/dist/client/assets/ProjectsScreen-DMw4TLKy.js +1 -0
- package/dist/client/assets/ProjectsThreadAside-D1Sh4fnX.js +1 -0
- package/dist/client/assets/{Provider-5Hotn7NQ.js → Provider-CNZluAZb.js} +2 -2
- package/dist/client/assets/{RailRow-BYguXNm4.js → RailRow-DUPqXMZh.js} +1 -1
- package/dist/client/assets/RailToggle-BwmY70B8.js +1 -0
- package/dist/client/assets/RawSessionsTable-6OVJq0JZ.js +1 -0
- package/dist/client/assets/RealtimeVoiceScreen-D41TYY0x.js +9 -0
- package/dist/client/assets/{RenderedWorkerSprite-CvdWO32C.js → RenderedWorkerSprite-C8fxndAh.js} +1 -1
- package/dist/client/assets/{ReplayClock-B7JLTp8A.js → ReplayClock-DUVJjrIu.js} +1 -1
- package/dist/client/assets/{ReplayLog-DZTpf2CW.js → ReplayLog-Bek1Vc4W.js} +1 -1
- package/dist/client/assets/{ReplayOutpost-CvWQa30T.js → ReplayOutpost-DlRg3172.js} +1 -1
- package/dist/client/assets/{RepoDiffEmbedScreen-Cbu0_PJW.js → RepoDiffEmbedScreen-CVUMnt6A.js} +1 -1
- package/dist/client/assets/{RepoDiffPageScreen-Chwm6GXL.js → RepoDiffPageScreen-D9-s5PyB.js} +1 -1
- package/dist/client/assets/{RepoDiffViewer-C2mb0Wj-.js → RepoDiffViewer-D7FN-oyY.js} +1 -1
- package/dist/client/assets/RepoDiffViewerLazy-BpMR7tlx.js +2 -0
- package/dist/client/assets/{ReposScreen-C7JZQmyh.js → ReposScreen-BQ7HO1om.js} +2 -2
- package/dist/client/assets/{RiggedWorkerCharacter-DNe731GE.js → RiggedWorkerCharacter-CJMWlvV-.js} +1 -1
- package/dist/client/assets/{SageModelStudio-BR1J2D4R.js → SageModelStudio-B526NSnw.js} +1 -1
- package/dist/client/assets/{ScoutDeckSurface-flRamdvE.js → ScoutDeckSurface-ChkvGyEW.js} +1 -1
- package/dist/client/assets/{ScoutSurface-BpklGmDL.js → ScoutSurface-6g1f5chk.js} +1 -1
- package/dist/client/assets/{ScoutbotFxLab-DeK7ySWZ.js → ScoutbotFxLab-BuwBdnPf.js} +1 -1
- package/dist/client/assets/{SecondaryNav-BkTn5tkq.js → SecondaryNav-Bs-_VwTC.js} +1 -1
- package/dist/client/assets/{SessionEmbedScreen-CcQN6xlo.js → SessionEmbedScreen-C2wf35-P.js} +1 -1
- package/dist/client/assets/{SessionObserve-DaqDhqDI.js → SessionObserve-B64YsYhy.js} +9 -9
- package/dist/client/assets/{SessionObserve-BOBJSfs0.css → SessionObserve-CDdJ7fAE.css} +1 -1
- package/dist/client/assets/{SessionObserveEvidence-Drv-D8Oh.js → SessionObserveEvidence-CS1aQBpQ.js} +1 -1
- package/dist/client/assets/SessionRefScreen-DURV0MpF.js +1 -0
- package/dist/client/assets/SessionsScreen-D71ZR-8t.js +1 -0
- package/dist/client/assets/{SettingsDrawer-BDapR4E9.js → SettingsDrawer-Nz98oBVl.js} +3 -3
- package/dist/client/assets/SettingsScreen-CYBHal6y.js +1 -0
- package/dist/client/assets/{SharedFloorCharacter-CSYG_t9t.js → SharedFloorCharacter-V04kD5T9.js} +1 -1
- package/dist/client/assets/SharedWorkFloor-C0xxW4SN.js +2 -0
- package/dist/client/assets/{ShikiPane-BudrOxNK.js → ShikiPane-XwFI-pCp.js} +1 -1
- package/dist/client/assets/{SlidePanel-Datu7XG4.js → SlidePanel-BMpkXai_.js} +1 -1
- package/dist/client/assets/SpaceSwitcher-BfeIf-ad.js +1 -0
- package/dist/client/assets/{SpriteAvatar-BW1JzkDt.js → SpriteAvatar-aHeF4ZQZ.js} +1 -1
- package/dist/client/assets/{SproutActionSprite-DveCzg6l.js → SproutActionSprite-DI5N3gOj.js} +1 -1
- package/dist/client/assets/{StatusPill-MxYClPG5.js → StatusPill-Dw4LP7wu.js} +1 -1
- package/dist/client/assets/{TailView-Dn7uWmPz.js → TailView-BofjmUMJ.js} +2 -2
- package/dist/client/assets/Terminal-jIqnIZZ6.js +4 -0
- package/dist/client/assets/TerminalEmbedScreen-3XsjuySR.js +1 -0
- package/dist/client/assets/{TerminalHeaderMount-DCGstkZ4.js → TerminalHeaderMount-CwbQhXcI.js} +1 -1
- package/dist/client/assets/TerminalRelay--qOBwnbR.js +46 -0
- package/dist/client/assets/{TextDocumentSurface-BhYvAB0o.js → TextDocumentSurface-BK6Qy41F.js} +1 -1
- package/dist/client/assets/{TmuxPeek-BhK0V9Qt.js → TmuxPeek-DpUT9Tpc.js} +1 -1
- package/dist/client/assets/{VoicePermissionsPanel-CecFWzva.js → VoicePermissionsPanel-D35fOnQj.js} +1 -1
- package/dist/client/assets/{WorkDetailScreen-CwtRCm_-.js → WorkDetailScreen-Bcf_yHhU.js} +2 -2
- package/dist/client/assets/{WorkFilesViewer-DJHftsH9.js → WorkFilesViewer-t8AEyx3Q.js} +1 -1
- package/dist/client/assets/{WorkRunView-x5PH1byG.js → WorkRunView-_mhG_FR2.js} +1 -1
- package/dist/client/assets/WorldActorTalk-CKerDikx.js +1 -0
- package/dist/client/assets/{WorldCharacter-Dn4sIXNP.js → WorldCharacter-BRrj3MQN.js} +1 -1
- package/dist/client/assets/{WorldMinimap-Blqg0d5r.js → WorldMinimap-DOptgrc4.js} +1 -1
- package/dist/client/assets/{WorldSky-DV9bpvXj.js → WorldSky-D-RJzSa6.js} +1 -1
- package/dist/client/assets/{activity-CSUhvjD0.js → activity-BJqFrZyB.js} +1 -1
- package/dist/client/assets/{addon-fit-MR98IWES.js → addon-fit-CHohcvS3.js} +1 -1
- package/dist/client/assets/{addon-webgl-CIIKXrvK.js → addon-webgl-CaRy2x2b.js} +1 -1
- package/dist/client/assets/agent-autocomplete-_u9o5EZu.js +2 -0
- package/dist/client/assets/{agent-essentials-8t2il7PV.js → agent-essentials-bKWYOZaH.js} +1 -1
- package/dist/client/assets/{agent-floor-actor-3v9drnxh.js → agent-floor-actor-DW8zLht0.js} +1 -1
- package/dist/client/assets/{agent-lane-card-model-l0stnU9N.js → agent-lane-card-model-CeqQGp-8.js} +1 -1
- package/dist/client/assets/{agent-lane-detail-Db7KyAlf.js → agent-lane-detail-Ti3trpfH.js} +1 -1
- package/dist/client/assets/{agent-lane-preview-B8lsQJOQ.js → agent-lane-preview-Dpa3DuOn.js} +1 -1
- package/dist/client/assets/{agent-lanes-model-CX0wTcnF.js → agent-lanes-model-DMAdqCmK.js} +1 -1
- package/dist/client/assets/{agent-specialization-CiVxQsFT.js → agent-specialization-BplZUa_0.js} +1 -1
- package/dist/client/assets/{api-B9_IqFKY.js → api-BQYTwoz6.js} +1 -1
- package/dist/client/assets/{api-CaROe5_H.js → api-DSqpVKC7.js} +1 -1
- package/dist/client/assets/{arc.es-BzhWalCl.js → arc.es-CubLvQ4W.js} +1 -1
- package/dist/client/assets/{arrow-left-PuKdO3NM.js → arrow-left-DFfKAq0d.js} +1 -1
- package/dist/client/assets/{arrow-right-ldbfp4SZ.js → arrow-right-DmAWnyAH.js} +1 -1
- package/dist/client/assets/{arrow-up-right-Hn754ybA.js → arrow-up-right-B0aLKiyF.js} +1 -1
- package/dist/client/assets/at-sign-DM7xeppo.js +1 -0
- package/dist/client/assets/{book-open-BlJnpf2U.js → book-open-BL9qvhEI.js} +1 -1
- package/dist/client/assets/{bot-CfN9PSBF.js → bot-BhAVbcCA.js} +1 -1
- package/dist/client/assets/{cache-DEy9E34b.js → cache-DGBo3vIf.js} +1 -1
- package/dist/client/assets/chat-api-BPVC0asu.js +1 -0
- package/dist/client/assets/chat-space-model-B6Jg2CY4.js +4 -0
- package/dist/client/assets/{check-B8dMv3Is.js → check-g7D7-c1J.js} +1 -1
- package/dist/client/assets/{chevron-down-B5eMsn5c.js → chevron-down-CDzRQQGl.js} +1 -1
- package/dist/client/assets/{chevron-right-C7UGFpkl.js → chevron-right-DKGTLiqc.js} +1 -1
- package/dist/client/assets/{chevron-up-BHOEgHcn.js → chevron-up-DX7R6KY2.js} +1 -1
- package/dist/client/assets/{chunk-HRAB3GC3-C5X-kFhb.js → chunk-HRAB3GC3-Dvk_QpRq.js} +1 -1
- package/dist/client/assets/{clock-DFcRbtrl.js → clock-CQb4FeMf.js} +1 -1
- package/dist/client/assets/{code-xml-BmyLM0I2.js → code-xml-Cmadr3pQ.js} +1 -1
- package/dist/client/assets/{coffee-C_D9zooM.js → coffee-ljG1_krY.js} +1 -1
- package/dist/client/assets/{compass-DTZdCpv9.js → compass-CvzkzkIh.js} +1 -1
- package/dist/client/assets/content-0AXa0klu.js +1 -0
- package/dist/client/assets/content-BEyJ19Lx.js +1 -0
- package/dist/client/assets/content-BN5weWKW.js +1 -0
- package/dist/client/assets/content-BNokkm7C.js +1 -0
- package/dist/client/assets/content-BV4PUM9q.js +1 -0
- package/dist/client/assets/content-BxUPlcx5.js +1 -0
- package/dist/client/assets/content-CIC5sku8.js +1 -0
- package/dist/client/assets/content-CKJ9zb7Z.js +1 -0
- package/dist/client/assets/content-CdkTyxqk.js +1 -0
- package/dist/client/assets/content-CnhhSCZq.js +1 -0
- package/dist/client/assets/content-D1Ze_FG9.js +1 -0
- package/dist/client/assets/content-DY3F9Vfr.js +1 -0
- package/dist/client/assets/content-DrKBYpcb.js +1 -0
- package/dist/client/assets/content-LSStQYj5.js +1 -0
- package/dist/client/assets/content-YvU-D0hF.js +1 -0
- package/dist/client/assets/content-oKQMyVnH.js +1 -0
- package/dist/client/assets/{context-budget-DemtXu7E.js → context-budget-8qFKqM-j.js} +1 -1
- package/dist/client/assets/{conversation-icons-BQ4OeOmr.js → conversation-icons-CIRaxmid.js} +1 -1
- package/dist/client/assets/{conversation-model-BGFHoxQ0.js → conversation-model-m8HhzroS.js} +1 -1
- package/dist/client/assets/conversation-motion-features-D9PxLoDt.js +1 -0
- package/dist/client/assets/{copy-D9WUpQRf.js → copy-BGOC1tJB.js} +1 -1
- package/dist/client/assets/{cpu-Ck_4tB_-.js → cpu-Q6nrHFTN.js} +1 -1
- package/dist/client/assets/{createLucideIcon-DkjnzvcJ.js → createLucideIcon-ChvMq-zl.js} +1 -1
- package/dist/client/assets/{credentials-C4VXz2hr.js → credentials-OeoF-VKJ.js} +1 -1
- package/dist/client/assets/discover-DlwbftpC.js +2 -0
- package/dist/client/assets/embed-entry-c0lwtjBG.js +2 -0
- package/dist/client/assets/{external-link-RT4Ph-6-.js → external-link-BVccgH0n.js} +1 -1
- package/dist/client/assets/{eye-CtqSV8BS.js → eye-CsGfEVR6.js} +1 -1
- package/dist/client/assets/{file-code-corner-D_Aptal2.js → file-code-corner-Be6da5l3.js} +1 -1
- package/dist/client/assets/{file-text-ChtICwub.js → file-text-DP6txVW-.js} +1 -1
- package/dist/client/assets/{flag-CqdOxVkI.js → flag-DAFE2wZ5.js} +1 -1
- package/dist/client/assets/{floor-context-model-DZBpo_oD.js → floor-context-model-rWKqaKmV.js} +1 -1
- package/dist/client/assets/{floor-message-passes-CJh9f8Jp.js → floor-message-passes-CO3Ix_wR.js} +1 -1
- package/dist/client/assets/{folder-0fWevPvQ.js → folder-B_S7gBVr.js} +1 -1
- package/dist/client/assets/{gauge-Dgtfxf_o.js → gauge-DQCGlE3o.js} +1 -1
- package/dist/client/assets/{gestures-BDCZ1FRG.js → gestures-CofqY4Km.js} +1 -1
- package/dist/client/assets/{git-branch-CA3cHKCI.js → git-branch-DcUCsWdJ.js} +1 -1
- package/dist/client/assets/{go-shortcuts-DKtw4qYx.js → go-shortcuts-KQy-ZOpV.js} +1 -1
- package/dist/client/assets/{home-moving-signal-B7m-ngb2.js → home-moving-signal-BIHUGNfI.js} +1 -1
- package/dist/client/assets/home-now-card-CaLgZze2.js +1 -0
- package/dist/client/assets/{home-now-card-nano-D1ScGrgv.js → home-now-card-nano-CvU8B61b.js} +1 -1
- package/dist/client/assets/hooks-DaUOREpP.js +2 -0
- package/dist/client/assets/index-CGbs0SBm.css +1 -0
- package/dist/client/assets/index-CbqBwfIW.js +1 -0
- package/dist/client/assets/index-CyPMl7Up.js +1 -0
- package/dist/client/assets/index-DReVb7jZ.js +10 -0
- package/dist/client/assets/index-PQpJveGO.js +1 -0
- package/dist/client/assets/{index-CvsM3jm8.js → index-kkXUq-zf.js} +1 -1
- package/dist/client/assets/{inspector-panel-BLhDODb3.js → inspector-panel-CLU7wjnT.js} +2 -2
- package/dist/client/assets/{keyboard-nav-CXfav14z.js → keyboard-nav-CJXPaHXj.js} +1 -1
- package/dist/client/assets/lane-ask-display-BTVSakyo.js +18 -0
- package/dist/client/assets/{lane-observe-BD21P8BB.js → lane-observe-CteDwdD-.js} +3 -3
- package/dist/client/assets/{lane-roster-store-DzNHP392.js → lane-roster-store-Ch9t6lb0.js} +1 -1
- package/dist/client/assets/{layers-Bolb8ejU.js → layers-BOwyWodP.js} +1 -1
- package/dist/client/assets/{layout-grid-DI9tVJ2E.js → layout-grid-B36Qsh0y.js} +1 -1
- package/dist/client/assets/left-0vBrvrBG.js +2 -0
- package/dist/client/assets/left-C6SyaqlJ.js +1 -0
- package/dist/client/assets/left-CTuXysZR.js +2 -0
- package/dist/client/assets/left-Cc6s4DT2.js +1 -0
- package/dist/client/assets/left-DF5caiyh.js +1 -0
- package/dist/client/assets/left-DgT4tWCx.js +1 -0
- package/dist/client/assets/left-R0wppTTr.js +1 -0
- package/dist/client/assets/left-advisor-C-kt8V28.js +1 -0
- package/dist/client/assets/left-agents-thnBO156.js +1 -0
- package/dist/client/assets/left-default-CT42fnpF.js +1 -0
- package/dist/client/assets/left-lanes-CSmZgciK.js +1 -0
- package/dist/client/assets/left-mission-C86x6i9h.js +1 -0
- package/dist/client/assets/library-DdhYL_9v.js +1 -0
- package/dist/client/assets/{loader-circle-DurUYl7E.js → loader-circle-DNUsuPWz.js} +1 -1
- package/dist/client/assets/{local-agents-D9fYYRyj.js → local-agents-I40PawYA.js} +1 -1
- package/dist/client/assets/{machine-children-RGS4Q0r6.js → machine-children-CdhNzDF0.js} +1 -1
- package/dist/client/assets/{mentions-Ctw1ECUC.js → mentions-Ck_Vjnyp.js} +1 -1
- package/dist/client/assets/{mesh-ops-CGpRk4ik.js → mesh-ops-DSlvHp-D.js} +1 -1
- package/dist/client/assets/{mesh-view-store-CliSYsmt.js → mesh-view-store-C1-mdP3P.js} +1 -1
- package/dist/client/assets/{message-circle-CSiJj6yo.js → message-circle-cI5_A5mj.js} +1 -1
- package/dist/client/assets/{message-markup-DgFSyb3f.js → message-markup-6Tgo4qFJ.js} +1 -1
- package/dist/client/assets/{message-square-NmXWtWLR.js → message-square-CJW4WRlo.js} +1 -1
- package/dist/client/assets/{mission-control-store-DZ29Mlj1.js → mission-control-store-p_cboAm4.js} +1 -1
- package/dist/client/assets/monitor-C7_cHlkC.js +1 -0
- package/dist/client/assets/{nav-destinations-CyXnw9kh.js → nav-destinations-CU_euC-Q.js} +1 -1
- package/dist/client/assets/{observe-CkfOxYx_.js → observe-CtS0l3zu.js} +1 -1
- package/dist/client/assets/{operator-attention-DGR4kOog.js → operator-attention-DBaRg5ep.js} +1 -1
- package/dist/client/assets/{page-status-CkS3SZu-.js → page-status-DwFR4wSw.js} +1 -1
- package/dist/client/assets/{panel-right-BNTJhy8M.js → panel-right-qP17MwMl.js} +1 -1
- package/dist/client/assets/{pause-DWS7YGQ3.js → pause-B_hliKuR.js} +1 -1
- package/dist/client/assets/{persistent-state-xsuk6Kc-.js → persistent-state-BUsTTZFE.js} +1 -1
- package/dist/client/assets/{pin-DWlD1BOF.js → pin-Oi4qHR6M.js} +1 -1
- package/dist/client/assets/{play-D_Pggug4.js → play-CVeRmqLH.js} +1 -1
- package/dist/client/assets/{plus-D_wLGJGT.js → plus-D5NLH_fM.js} +1 -1
- package/dist/client/assets/profile-BegEUmB7.js +1 -0
- package/dist/client/assets/projects-inbox-CKPLZN8s.css +1 -0
- package/dist/client/assets/{projects-inbox-DvbqJO3q.js → projects-inbox-CfwxCTdN.js} +1 -1
- package/dist/client/assets/provider-DwmCoSlc.js +1 -0
- package/dist/client/assets/{proxy-DOG46ja4.js → proxy-DgzP27W8.js} +1 -1
- package/dist/client/assets/{radio-C_jtwbFP.js → radio-Cas2qg1D.js} +1 -1
- package/dist/client/assets/{refresh-cw-Da9DDLk2.js → refresh-cw-IcD2lPoT.js} +1 -1
- package/dist/client/assets/resolve-panes-pfZTezKo.js +1 -0
- package/dist/client/assets/resolve-sidebar-context-D5ksvrb_.js +1 -0
- package/dist/client/assets/right-BDaCJ0CF.js +1 -0
- package/dist/client/assets/right-BP6lXRFS.js +1 -0
- package/dist/client/assets/right-Cb1VCrdj.js +1 -0
- package/dist/client/assets/right-CeFaxfBo.js +1 -0
- package/dist/client/assets/right-Ck2SrYCj.js +1 -0
- package/dist/client/assets/right-D-uv5YfF.js +1 -0
- package/dist/client/assets/right-DJMSICky.js +1 -0
- package/dist/client/assets/right-Dnljs8ah.js +1 -0
- package/dist/client/assets/right-SdCSF8PP.js +1 -0
- package/dist/client/assets/{right-BLJsc2-p.js → right-cjPTwPXS.js} +1 -1
- package/dist/client/assets/{rocket-DyrYDo8V.js → rocket-DAqYvu8I.js} +1 -1
- package/dist/client/assets/router-C-MF5-mb.js +1 -0
- package/dist/client/assets/{runtime-picker-DdsttHHc.js → runtime-picker-C_AVYF63.js} +1 -1
- package/dist/client/assets/{scope-views-B7PZGlhY.js → scope-views-Dl3ml9OZ.js} +1 -1
- package/dist/client/assets/{scout-voice-DOQ_B77g.js → scout-voice-CqAyfblr.js} +1 -1
- package/dist/client/assets/{scoutbot-markdown-Bz0Vbto2.js → scoutbot-markdown-DwvGQOWo.js} +1 -1
- package/dist/client/assets/{scroll-text-DwC8r2g6.js → scroll-text-B0tKI9Sg.js} +1 -1
- package/dist/client/assets/{search-C4VlW_0l.js → search-UsM-9-_W.js} +1 -1
- package/dist/client/assets/secondaryNavConfig-D15P1Y9k.css +1 -0
- package/dist/client/assets/secondaryNavConfig-DzNHk6IH.js +1 -0
- package/dist/client/assets/{selection-bridge-B5jqyMR9.js → selection-bridge-OTS2iFkt.js} +1 -1
- package/dist/client/assets/{send-horizontal-pOtGI7FM.js → send-horizontal-BlQsRK6C.js} +1 -1
- package/dist/client/assets/{send-to-agent-session-BZGq_ycy.js → send-to-agent-session-C1mgqdow.js} +1 -1
- package/dist/client/assets/{server-ms1yxUYJ.js → server-DBlPW0Mp.js} +1 -1
- package/dist/client/assets/{session-catalog-s-T_w41t.js → session-catalog-CnpZMB7C.js} +1 -1
- package/dist/client/assets/{session-table-CDx_16xf.js → session-table-CGkfG5Yd.js} +1 -1
- package/dist/client/assets/{sessions-view-DzYGsKWS.js → sessions-view-Bge4XZ4I.js} +1 -1
- package/dist/client/assets/{settings-TJIkkZ0P.js → settings-C69Zjrpq.js} +1 -1
- package/dist/client/assets/{shared-work-artifacts-4IIQXQfc.js → shared-work-artifacts-DfNl9KTo.js} +1 -1
- package/dist/client/assets/{sliders-horizontal-CHf3ntw0.js → sliders-horizontal-6bzeod7c.js} +1 -1
- package/dist/client/assets/{sparkles-BbOFw3d0.js → sparkles-Cc5lPZRv.js} +1 -1
- package/dist/client/assets/{sse-v5QLsOHV.js → sse-A8AyLH0g.js} +1 -1
- package/dist/client/assets/{tail-events-DQ46QBW1.js → tail-events-C4WdhVeK.js} +1 -1
- package/dist/client/assets/{terminal-96JWDYDL.js → terminal-DMZjX1es.js} +1 -1
- package/dist/client/assets/{terminal-relay-Bfx8pg80.js → terminal-relay-mO89dX-Y.js} +1 -1
- package/dist/client/assets/{terminal-sessions-Ch9aYlgi.js → terminal-sessions-3RfJpen8.js} +1 -1
- package/dist/client/assets/{terminal-takeover-BlpxpvSp.js → terminal-takeover-CZZsnPzj.js} +1 -1
- package/dist/client/assets/use-beside-D3cJpA5p.js +1 -0
- package/dist/client/assets/{use-conversation-list-A_YUf8lo.js → use-conversation-list-D5EnpVba.js} +1 -1
- package/dist/client/assets/{use-fleet-active-asks-DFs_u-vM.js → use-fleet-active-asks-D_QOmjg5.js} +1 -1
- package/dist/client/assets/{use-mesh-node-state-Ck9CYplv.js → use-mesh-node-state-3V3ADQ-G.js} +1 -1
- package/dist/client/assets/{use-mesh-ops-items-Be1WmwCg.js → use-mesh-ops-items-DI9GKWlF.js} +1 -1
- package/dist/client/assets/{use-reduced-motion-D7n3vK8t.js → use-reduced-motion-CiaZHMnk.js} +1 -1
- package/dist/client/assets/use-scout-dev-flags-CkdAHlDR.js +1 -0
- package/dist/client/assets/{useAgentHoverCard-Dr-OjNFF.js → useAgentHoverCard-A3QGXqIy.js} +1 -1
- package/dist/client/assets/useContentSecondaryNav-DrL_nkCZ.js +1 -0
- package/dist/client/assets/{useEmbedHeadline-BL8wQawZ.js → useEmbedHeadline-atkQVfGw.js} +1 -1
- package/dist/client/assets/usePersistentState-Y8XwSTg-.js +1 -0
- package/dist/client/assets/{usePierreRuntime-DJkRHMoe.js → usePierreRuntime-DTvcwISe.js} +1 -1
- package/dist/client/assets/users-RLK3P5U4.js +1 -0
- package/dist/client/assets/{wrench-BsMTSeji.js → wrench-B4maQJai.js} +1 -1
- package/dist/client/assets/{x-DI1ktCYb.js → x-rlMdRqJF.js} +1 -1
- package/dist/client/assets/{xterm-B1YBE4Gq.js → xterm-B1zHHOLQ.js} +1 -1
- package/dist/client/assets/{zap-sKPkh4sQ.js → zap-B4X0OrEw.js} +1 -1
- package/dist/client/index.html +15 -3
- package/dist/drizzle/0019_session_actor_targets.sql +227 -0
- package/dist/drizzle/README.md +19 -0
- package/dist/drizzle/meta/0019_snapshot.json +6804 -0
- package/dist/drizzle/meta/_journal.json +7 -0
- package/dist/highlights-eq9cgrbb.scm +604 -0
- package/dist/highlights-ghv9g403.scm +205 -0
- package/dist/highlights-hk7bwhj4.scm +284 -0
- package/dist/highlights-r812a2qc.scm +150 -0
- package/dist/highlights-x6tmsnaa.scm +115 -0
- package/dist/injections-73j83es3.scm +27 -0
- package/dist/main.mjs +1214 -722
- package/dist/node/main.mjs +133 -22
- package/dist/pairing-runtime-controller.mjs +715 -492
- package/dist/runtime/base-daemon.mjs +14176 -58
- package/dist/runtime/broker-daemon.mjs +15520 -445
- package/dist/runtime/broker-process-manager.mjs +5 -3
- package/dist/runtime/mesh-discover.mjs +5 -3
- package/dist/scout-control-plane-web.mjs +21065 -3387
- package/dist/tree-sitter-javascript-nd0q4pe9.wasm +0 -0
- package/dist/tree-sitter-markdown-411r6y9b.wasm +0 -0
- package/dist/tree-sitter-markdown_inline-j5349f42.wasm +0 -0
- package/dist/tree-sitter-typescript-zxjzwt75.wasm +0 -0
- package/dist/tree-sitter-zig-e78zbjpm.wasm +0 -0
- package/dist/update-helper.mjs +83 -17
- package/package.json +2 -2
- package/dist/client/assets/ActivityScreen-DCALiEXY.js +0 -1
- package/dist/client/assets/AgentAdventures-NwTKeF0F.js +0 -1
- package/dist/client/assets/AgentConfigurationScreen-B2Hw0ce1.js +0 -1
- package/dist/client/assets/AgentDefinitionsWorkspace-CwZJ833X.js +0 -1
- package/dist/client/assets/AgentFloorView-l2wNKFob.js +0 -1
- package/dist/client/assets/AgentInfoScreen-ClZM1wQb.js +0 -1
- package/dist/client/assets/AgentLanesEmbedScreen-DqHwqY0X.js +0 -1
- package/dist/client/assets/AgentMasterScreen-By6DN0jF.js +0 -1
- package/dist/client/assets/AgentsConsole-Dq0S_hRA.js +0 -1
- package/dist/client/assets/AgentsScreen-Bi9Lx47B.js +0 -1
- package/dist/client/assets/AgentsSubnav-BOobgtGE.js +0 -1
- package/dist/client/assets/BriefingDetailScreen-sprFl4Nk.js +0 -1
- package/dist/client/assets/BrokerScreen-CejzhRsB.js +0 -8
- package/dist/client/assets/ConversationFeedRows-DVqnZQH0.js +0 -1
- package/dist/client/assets/ConversationHeader-CCSU8uo_.js +0 -1
- package/dist/client/assets/ConversationScreen-tTP6B_F-.js +0 -2
- package/dist/client/assets/CrewWorkspaces-4O8dgRUD.js +0 -1
- package/dist/client/assets/CrewWorkspaces-Diq11KDq.css +0 -1
- package/dist/client/assets/FlightObserveScreen-DDXfNbsw.js +0 -1
- package/dist/client/assets/FloorResourcesSheet-Djrgd_ZU.js +0 -1
- package/dist/client/assets/HarnessMark-Bt47OeHy.js +0 -1
- package/dist/client/assets/HarnessesScreen-M84sFjWY.js +0 -1
- package/dist/client/assets/KnowledgeSearchScreen-WC0WhFio.js +0 -1
- package/dist/client/assets/LaneTraceDetailSheet-mAhj7MJi.js +0 -1
- package/dist/client/assets/MeshScreen-DlfiMlaR.js +0 -1
- package/dist/client/assets/MessagesScreen-BZ7yaGJx.js +0 -1
- package/dist/client/assets/MissionControlView-DpGhxG4a.js +0 -1
- package/dist/client/assets/MissionLeftAgentRow-DhhRRim0.js +0 -1
- package/dist/client/assets/NativeAreaScreen-BQyHHRAM.js +0 -1
- package/dist/client/assets/NativeAreaScreen-Ditv-TYW.js +0 -1
- package/dist/client/assets/NativeAreaScreen-Dq3uPSEI.js +0 -1
- package/dist/client/assets/NewChatComposer-JjLbm3W2.js +0 -19
- package/dist/client/assets/OpenScoutAppShell-CzKbjwCA.js +0 -22
- package/dist/client/assets/OpsAgentsView-CZbtkcQH.js +0 -1
- package/dist/client/assets/OpsScreen-DJq-aBmX.js +0 -1
- package/dist/client/assets/OpsSubnav-9sURjajO.js +0 -1
- package/dist/client/assets/ProjectAgentProfile-q_1tMJIL.js +0 -1
- package/dist/client/assets/ProjectAgentProfileHero-DyEFyTFs.js +0 -1
- package/dist/client/assets/ProjectsInbox-Bs8I__my.js +0 -2
- package/dist/client/assets/ProjectsRail-Deb38OJ1.js +0 -1
- package/dist/client/assets/ProjectsScreen-CgLiYiss.js +0 -1
- package/dist/client/assets/ProjectsThreadAside-C0Yw3yIL.js +0 -1
- package/dist/client/assets/RawSessionsTable-DIhmlvk-.js +0 -1
- package/dist/client/assets/RealtimeVoiceScreen-3oU7b7V5.js +0 -1
- package/dist/client/assets/RepoDiffViewerLazy-BQ6ZCrsq.js +0 -2
- package/dist/client/assets/SessionRefScreen-BOQ1_ydg.js +0 -1
- package/dist/client/assets/SessionsScreen-R8QKvoey.js +0 -1
- package/dist/client/assets/SettingsScreen-DirtO7Z0.js +0 -1
- package/dist/client/assets/SharedWorkFloor-yPWFLZwX.js +0 -2
- package/dist/client/assets/Terminal-D-DsQlmV.js +0 -4
- package/dist/client/assets/TerminalEmbedScreen-9Gmln759.js +0 -1
- package/dist/client/assets/WorldActorTalk-uIH2jGqA.js +0 -1
- package/dist/client/assets/agent-autocomplete-CeHQpuG9.js +0 -10
- package/dist/client/assets/arrow-down-WoVlkUmg.js +0 -1
- package/dist/client/assets/chunk-JTPDIGGW-ZC-98AHT.js +0 -46
- package/dist/client/assets/chunk-T65CQEWV-CSVUz2rY.js +0 -1
- package/dist/client/assets/chunk-YOZR3KYS-B59jqwO0.js +0 -2
- package/dist/client/assets/content-B5Q4pb9R.js +0 -1
- package/dist/client/assets/content-BK1IfOZs.js +0 -1
- package/dist/client/assets/content-BeEsWLEm.js +0 -1
- package/dist/client/assets/content-BkOwEknW.js +0 -1
- package/dist/client/assets/content-C32W5kAG.js +0 -1
- package/dist/client/assets/content-CoqyLs9v.js +0 -1
- package/dist/client/assets/content-CwpdIS5b.js +0 -1
- package/dist/client/assets/content-DS2OkJ3Q.js +0 -1
- package/dist/client/assets/content-DXKaPDfn.js +0 -1
- package/dist/client/assets/content-DZt5-dkI.js +0 -1
- package/dist/client/assets/content-DbQJH8L1.js +0 -1
- package/dist/client/assets/content-DetoiaHq.js +0 -1
- package/dist/client/assets/content-Dhu3wL7J.js +0 -1
- package/dist/client/assets/content-Dpv34iZu.js +0 -1
- package/dist/client/assets/content-TtQJb61D.js +0 -1
- package/dist/client/assets/content-ymNb2R7g.js +0 -1
- package/dist/client/assets/conversation-motion-features-9x8uZpwh.js +0 -1
- package/dist/client/assets/discover-C8IOY7_K.js +0 -2
- package/dist/client/assets/embed-entry-CG3CfCbm.js +0 -2
- package/dist/client/assets/home-now-card-DduXkHRR.js +0 -1
- package/dist/client/assets/hooks-C6VyQTQe.js +0 -2
- package/dist/client/assets/index-C5cX8dkl.js +0 -1
- package/dist/client/assets/index-C8uS5szO.js +0 -10
- package/dist/client/assets/index-Ck1__1yL.css +0 -1
- package/dist/client/assets/index-ClOOrVG1.js +0 -1
- package/dist/client/assets/index-Crtgfc9I.js +0 -1
- package/dist/client/assets/lane-ask-display-B6iCAVcd.js +0 -18
- package/dist/client/assets/left-B-_z_nqj.js +0 -2
- package/dist/client/assets/left-B1LY7rJc.js +0 -1
- package/dist/client/assets/left-C6bdjWcG.js +0 -2
- package/dist/client/assets/left-CF4iuqlz.js +0 -1
- package/dist/client/assets/left-DLtNyZl1.js +0 -1
- package/dist/client/assets/left-Fpxoq-VY.js +0 -1
- package/dist/client/assets/left-N2wXfTlp.js +0 -1
- package/dist/client/assets/left-advisor-CeIjCKbd.js +0 -1
- package/dist/client/assets/left-agents-upjHVlOj.js +0 -1
- package/dist/client/assets/left-default-08gmdCtb.js +0 -1
- package/dist/client/assets/left-lanes-Cvsp73Hw.js +0 -1
- package/dist/client/assets/left-mission-W1LLaz74.js +0 -1
- package/dist/client/assets/library-DLKBVUJ6.js +0 -1
- package/dist/client/assets/profile-C3KgiZvc.js +0 -1
- package/dist/client/assets/projects-inbox-BIW7nv-H.css +0 -1
- package/dist/client/assets/resolve-panes-DuowGRTk.js +0 -1
- package/dist/client/assets/resolve-sidebar-context-BkTbqteq.js +0 -1
- package/dist/client/assets/right-B9OUA6Ho.js +0 -1
- package/dist/client/assets/right-BDQnjetX.js +0 -1
- package/dist/client/assets/right-BUbKHmRH.js +0 -1
- package/dist/client/assets/right-Ci2IcD4s.js +0 -1
- package/dist/client/assets/right-CmCce3e5.js +0 -1
- package/dist/client/assets/right-D7w0zM5a.js +0 -1
- package/dist/client/assets/right-DIoON_bv.js +0 -1
- package/dist/client/assets/right-E0Jr3VN5.js +0 -1
- package/dist/client/assets/right-lCdAk9dW.js +0 -1
- package/dist/client/assets/router-BKiMcYa7.js +0 -1
- package/dist/client/assets/secondaryNavConfig-DAXIFtVd.js +0 -1
- package/dist/client/assets/secondaryNavConfig-xssF_ubT.css +0 -1
- package/dist/client/assets/use-beside-Df-F2Uvg.js +0 -1
- package/dist/client/assets/use-scout-dev-flags-0TXfQcG0.js +0 -1
- package/dist/client/assets/useContentSecondaryNav-CGvMOVGY.js +0 -1
|
@@ -368,7 +368,7 @@ function validateLocalConfig(input) {
|
|
|
368
368
|
if (typeof raw.webLocalName === "string" && raw.webLocalName.trim().length > 0) {
|
|
369
369
|
out.webLocalName = raw.webLocalName.trim();
|
|
370
370
|
}
|
|
371
|
-
if (raw.webLanScope === "full" || raw.webLanScope === "pairing") {
|
|
371
|
+
if (raw.webLanScope === "full" || raw.webLanScope === "pairing" || raw.webLanScope === "chat") {
|
|
372
372
|
out.webLanScope = raw.webLanScope;
|
|
373
373
|
}
|
|
374
374
|
if (raw.ports && typeof raw.ports === "object") {
|
|
@@ -449,7 +449,9 @@ var init_local_config = __esm(() => {
|
|
|
449
449
|
pairingBridge: 43130,
|
|
450
450
|
pairingRelay: 43131,
|
|
451
451
|
pairingFileServer: 43132,
|
|
452
|
-
studio: 43140
|
|
452
|
+
studio: 43140,
|
|
453
|
+
jetstream: 43150,
|
|
454
|
+
jetstreamMonitor: 43151
|
|
453
455
|
};
|
|
454
456
|
DEFAULT_LOCAL_CONFIG = {
|
|
455
457
|
version: LOCAL_CONFIG_VERSION,
|
|
@@ -783,6 +785,13 @@ var init_domains = __esm(() => {
|
|
|
783
785
|
]
|
|
784
786
|
},
|
|
785
787
|
groq: { id: "groq", label: "Groq", env: [envCredential("GROQ_API_KEY")] },
|
|
788
|
+
devin: {
|
|
789
|
+
id: "devin",
|
|
790
|
+
label: "Cognition / Devin",
|
|
791
|
+
env: [
|
|
792
|
+
envCredential("WINDSURF_API_KEY", { billing: "subscription" })
|
|
793
|
+
]
|
|
794
|
+
},
|
|
786
795
|
cerebras: { id: "cerebras", label: "Cerebras", env: [envCredential("CEREBRAS_API_KEY")] },
|
|
787
796
|
mistral: { id: "mistral", label: "Mistral", env: [envCredential("MISTRAL_API_KEY")] },
|
|
788
797
|
zai: { id: "zai", label: "Z.ai", env: [envCredential("ZAI_API_KEY")] },
|
|
@@ -863,6 +872,22 @@ var init_domains = __esm(() => {
|
|
|
863
872
|
],
|
|
864
873
|
login: { command: "grok login", interactive: true },
|
|
865
874
|
notReadyMessage: "Grok is installed but not authenticated yet."
|
|
875
|
+
},
|
|
876
|
+
devin: {
|
|
877
|
+
harness: "devin",
|
|
878
|
+
mode: "hybrid",
|
|
879
|
+
domains: ["devin"],
|
|
880
|
+
credentials: [
|
|
881
|
+
{
|
|
882
|
+
kind: "file",
|
|
883
|
+
path: "~/.local/share/devin/credentials.toml",
|
|
884
|
+
portable: false,
|
|
885
|
+
fileType: "file"
|
|
886
|
+
},
|
|
887
|
+
...domainEnv("devin")
|
|
888
|
+
],
|
|
889
|
+
login: { command: "devin auth login", interactive: true },
|
|
890
|
+
notReadyMessage: "Devin is installed but still needs devin auth login or WINDSURF_API_KEY."
|
|
866
891
|
}
|
|
867
892
|
};
|
|
868
893
|
HARNESS_AUTH_MODELS["grok-acp"] = {
|
|
@@ -1471,6 +1496,39 @@ var init_harness_catalog = __esm(() => {
|
|
|
1471
1496
|
transport: "acp_stdio"
|
|
1472
1497
|
}
|
|
1473
1498
|
},
|
|
1499
|
+
{
|
|
1500
|
+
name: "devin",
|
|
1501
|
+
harness: "devin",
|
|
1502
|
+
label: "Devin",
|
|
1503
|
+
description: "Cognition's Devin CLI coding agent over ACP",
|
|
1504
|
+
homepage: "https://docs.devin.ai/cli",
|
|
1505
|
+
tags: ["coding", "cli", "devin", "cognition", "acp"],
|
|
1506
|
+
featured: true,
|
|
1507
|
+
order: 4,
|
|
1508
|
+
support: {
|
|
1509
|
+
...DEFAULT_SUPPORT,
|
|
1510
|
+
workspace: true,
|
|
1511
|
+
collaboration: true,
|
|
1512
|
+
files: true
|
|
1513
|
+
},
|
|
1514
|
+
install: {
|
|
1515
|
+
binary: "devin",
|
|
1516
|
+
requires: ["curl"],
|
|
1517
|
+
macos: "brew install --cask devin-cli",
|
|
1518
|
+
linux: "curl -fsSL https://cli.devin.ai/install.sh | bash",
|
|
1519
|
+
windows: "irm https://cli.devin.ai/install.ps1 | iex",
|
|
1520
|
+
verify: "devin --version >/dev/null 2>&1"
|
|
1521
|
+
},
|
|
1522
|
+
readiness: readinessFromAuthModel("devin"),
|
|
1523
|
+
sessionDefaults: {
|
|
1524
|
+
defaultTransport: "devin_acp"
|
|
1525
|
+
},
|
|
1526
|
+
capabilities: ["chat", "invoke", "deliver", "review", "execute"],
|
|
1527
|
+
metadata: {
|
|
1528
|
+
adapterType: "devin-acp",
|
|
1529
|
+
transport: "acp_stdio"
|
|
1530
|
+
}
|
|
1531
|
+
},
|
|
1474
1532
|
{
|
|
1475
1533
|
name: "flue",
|
|
1476
1534
|
harness: "flue",
|
|
@@ -1549,7 +1607,7 @@ var init_harness_catalog = __esm(() => {
|
|
|
1549
1607
|
});
|
|
1550
1608
|
|
|
1551
1609
|
// ../runtime/src/schema-version.ts
|
|
1552
|
-
var CONTROL_PLANE_SCHEMA_VERSION =
|
|
1610
|
+
var CONTROL_PLANE_SCHEMA_VERSION = 18;
|
|
1553
1611
|
|
|
1554
1612
|
// ../protocol/src/time.ts
|
|
1555
1613
|
function isFinitePositive(value) {
|
|
@@ -1576,6 +1634,7 @@ var init_actors = __esm(() => {
|
|
|
1576
1634
|
"flue",
|
|
1577
1635
|
"cursor",
|
|
1578
1636
|
"opencode",
|
|
1637
|
+
"devin",
|
|
1579
1638
|
"native",
|
|
1580
1639
|
"worker",
|
|
1581
1640
|
"bridge",
|
|
@@ -2444,6 +2503,28 @@ var init_channel_identity = __esm(() => {
|
|
|
2444
2503
|
CHAT_ID_PREFIX = CHANNEL_ID_PREFIX;
|
|
2445
2504
|
});
|
|
2446
2505
|
|
|
2506
|
+
// ../protocol/src/channel-reception.ts
|
|
2507
|
+
var PERSISTENT_RECEIVE_TRANSPORTS, CHANNEL_RECEPTION_STALE_AFTER_MS;
|
|
2508
|
+
var init_channel_reception = __esm(() => {
|
|
2509
|
+
PERSISTENT_RECEIVE_TRANSPORTS = new Set([
|
|
2510
|
+
"local_socket",
|
|
2511
|
+
"websocket",
|
|
2512
|
+
"pairing_bridge",
|
|
2513
|
+
"peer_broker",
|
|
2514
|
+
"claude_channel",
|
|
2515
|
+
"claude_stream_json",
|
|
2516
|
+
"codex_app_server",
|
|
2517
|
+
"pi_rpc",
|
|
2518
|
+
"grok_acp",
|
|
2519
|
+
"kimi_acp",
|
|
2520
|
+
"cursor_acp",
|
|
2521
|
+
"opencode_acp",
|
|
2522
|
+
"devin_acp",
|
|
2523
|
+
"cursor_sdk_local"
|
|
2524
|
+
]);
|
|
2525
|
+
CHANNEL_RECEPTION_STALE_AFTER_MS = 10 * 60 * 1000;
|
|
2526
|
+
});
|
|
2527
|
+
|
|
2447
2528
|
// ../protocol/src/collaboration.ts
|
|
2448
2529
|
function isWorkItemTerminalState(state) {
|
|
2449
2530
|
return state === "done" || state === "cancelled";
|
|
@@ -2730,7 +2811,7 @@ var SCOUT_RUNTIME_CATALOG_DATA;
|
|
|
2730
2811
|
var init_runtime_catalog_generated = __esm(() => {
|
|
2731
2812
|
SCOUT_RUNTIME_CATALOG_DATA = {
|
|
2732
2813
|
schemaVersion: "openscout.runtime-catalog.v1",
|
|
2733
|
-
revision: "2026-09-
|
|
2814
|
+
revision: "2026-09-14.1",
|
|
2734
2815
|
harnesses: [
|
|
2735
2816
|
{
|
|
2736
2817
|
id: "claude",
|
|
@@ -3040,6 +3121,39 @@ var init_runtime_catalog_generated = __esm(() => {
|
|
|
3040
3121
|
enabled: true,
|
|
3041
3122
|
reasoningEfforts: null,
|
|
3042
3123
|
models: []
|
|
3124
|
+
},
|
|
3125
|
+
{
|
|
3126
|
+
id: "devin",
|
|
3127
|
+
label: "Devin",
|
|
3128
|
+
enabled: true,
|
|
3129
|
+
reasoningEfforts: null,
|
|
3130
|
+
models: [
|
|
3131
|
+
{
|
|
3132
|
+
id: "swe-2-high",
|
|
3133
|
+
label: "SWE-2 High",
|
|
3134
|
+
enabled: true,
|
|
3135
|
+
default: true,
|
|
3136
|
+
family: "SWE",
|
|
3137
|
+
version: "2 High",
|
|
3138
|
+
contextWindowTokens: 262000
|
|
3139
|
+
},
|
|
3140
|
+
{
|
|
3141
|
+
id: "swe-2-medium",
|
|
3142
|
+
label: "SWE-2 Medium",
|
|
3143
|
+
enabled: true,
|
|
3144
|
+
family: "SWE",
|
|
3145
|
+
version: "2 Medium",
|
|
3146
|
+
contextWindowTokens: 262000
|
|
3147
|
+
},
|
|
3148
|
+
{
|
|
3149
|
+
id: "swe-2-max",
|
|
3150
|
+
label: "SWE-2 Max",
|
|
3151
|
+
enabled: true,
|
|
3152
|
+
family: "SWE",
|
|
3153
|
+
version: "2 Max",
|
|
3154
|
+
contextWindowTokens: 262000
|
|
3155
|
+
}
|
|
3156
|
+
]
|
|
3043
3157
|
}
|
|
3044
3158
|
]
|
|
3045
3159
|
};
|
|
@@ -3057,7 +3171,8 @@ var init_runtime_catalog_contract = __esm(() => {
|
|
|
3057
3171
|
"flue",
|
|
3058
3172
|
"cursor",
|
|
3059
3173
|
"opencode",
|
|
3060
|
-
"pi"
|
|
3174
|
+
"pi",
|
|
3175
|
+
"devin"
|
|
3061
3176
|
];
|
|
3062
3177
|
SCOUT_REASONING_EFFORTS = [
|
|
3063
3178
|
"none",
|
|
@@ -3467,6 +3582,7 @@ var init_broker_routes = __esm(() => {
|
|
|
3467
3582
|
messages: "/v1/messages",
|
|
3468
3583
|
brokerMessages: "/v1/broker/messages",
|
|
3469
3584
|
eventsStream: "/v1/events/stream",
|
|
3585
|
+
commands: "/v1/commands",
|
|
3470
3586
|
actors: "/v1/actors",
|
|
3471
3587
|
agents: "/v1/agents",
|
|
3472
3588
|
endpoints: "/v1/endpoints",
|
|
@@ -3520,6 +3636,7 @@ var init_src = __esm(() => {
|
|
|
3520
3636
|
init_a2a();
|
|
3521
3637
|
init_machines();
|
|
3522
3638
|
init_channel_identity();
|
|
3639
|
+
init_channel_reception();
|
|
3523
3640
|
init_assigned_roles();
|
|
3524
3641
|
init_orchestrator_prompt();
|
|
3525
3642
|
init_orchestration_provider_map();
|
|
@@ -12573,6 +12690,76 @@ var init_opencode_acp = __esm(() => {
|
|
|
12573
12690
|
init_adapter4();
|
|
12574
12691
|
});
|
|
12575
12692
|
|
|
12693
|
+
// ../agent-sessions/src/adapters/devin-acp/adapter.ts
|
|
12694
|
+
import { existsSync as existsSync18 } from "fs";
|
|
12695
|
+
import { homedir as homedir15 } from "os";
|
|
12696
|
+
import { join as join16 } from "path";
|
|
12697
|
+
function isRecord9(value) {
|
|
12698
|
+
return Boolean(value && typeof value === "object" && !Array.isArray(value));
|
|
12699
|
+
}
|
|
12700
|
+
function stringValue5(value) {
|
|
12701
|
+
return typeof value === "string" && value.trim() ? value.trim() : null;
|
|
12702
|
+
}
|
|
12703
|
+
function stringArray5(value) {
|
|
12704
|
+
if (!Array.isArray(value))
|
|
12705
|
+
return null;
|
|
12706
|
+
const entries = value.filter((entry) => typeof entry === "string");
|
|
12707
|
+
return entries.length === value.length ? entries : null;
|
|
12708
|
+
}
|
|
12709
|
+
function firstNonEmptyString4(...values) {
|
|
12710
|
+
for (const value of values) {
|
|
12711
|
+
const trimmed = value?.trim();
|
|
12712
|
+
if (trimmed)
|
|
12713
|
+
return trimmed;
|
|
12714
|
+
}
|
|
12715
|
+
return null;
|
|
12716
|
+
}
|
|
12717
|
+
function defaultDevinCommand(env) {
|
|
12718
|
+
const override = firstNonEmptyString4(env?.DEVIN_CLI_BIN, env?.OPENSCOUT_DEVIN_BIN, process.env.DEVIN_CLI_BIN, process.env.OPENSCOUT_DEVIN_BIN);
|
|
12719
|
+
if (override)
|
|
12720
|
+
return override;
|
|
12721
|
+
const installed = join16(homedir15(), ".local", "bin", "devin");
|
|
12722
|
+
return existsSync18(installed) ? installed : "devin";
|
|
12723
|
+
}
|
|
12724
|
+
function devinArgs(rawOptions) {
|
|
12725
|
+
const explicit = stringArray5(rawOptions.args);
|
|
12726
|
+
if (explicit)
|
|
12727
|
+
return explicit;
|
|
12728
|
+
const args = ["acp"];
|
|
12729
|
+
const model = stringValue5(rawOptions.model);
|
|
12730
|
+
if (model)
|
|
12731
|
+
args.push("--model", model);
|
|
12732
|
+
return args;
|
|
12733
|
+
}
|
|
12734
|
+
var DEVIN_ACP_ADAPTER_TYPE = "devin-acp", DEFAULT_DEVIN_STARTUP_TIMEOUT_MS = 60000, createAdapter5 = (config) => {
|
|
12735
|
+
const rawOptions = isRecord9(config.options) ? config.options : {};
|
|
12736
|
+
const command = stringValue5(rawOptions.command) ?? defaultDevinCommand(config.env);
|
|
12737
|
+
const args = devinArgs(rawOptions);
|
|
12738
|
+
const authMethodPreference = stringArray5(rawOptions.authMethodPreference) ?? [];
|
|
12739
|
+
return new AcpAdapter({
|
|
12740
|
+
...config,
|
|
12741
|
+
options: {
|
|
12742
|
+
clientName: "openscout",
|
|
12743
|
+
clientTitle: "OpenScout",
|
|
12744
|
+
...rawOptions,
|
|
12745
|
+
adapterType: DEVIN_ACP_ADAPTER_TYPE,
|
|
12746
|
+
command,
|
|
12747
|
+
args,
|
|
12748
|
+
startupTimeoutMs: typeof rawOptions.startupTimeoutMs === "number" ? rawOptions.startupTimeoutMs : DEFAULT_DEVIN_STARTUP_TIMEOUT_MS,
|
|
12749
|
+
requireAuth: typeof rawOptions.requireAuth === "boolean" ? rawOptions.requireAuth : false,
|
|
12750
|
+
authMethodPreference
|
|
12751
|
+
}
|
|
12752
|
+
});
|
|
12753
|
+
};
|
|
12754
|
+
var init_adapter5 = __esm(() => {
|
|
12755
|
+
init_adapter();
|
|
12756
|
+
});
|
|
12757
|
+
|
|
12758
|
+
// ../agent-sessions/src/adapters/devin-acp/index.ts
|
|
12759
|
+
var init_devin_acp = __esm(() => {
|
|
12760
|
+
init_adapter5();
|
|
12761
|
+
});
|
|
12762
|
+
|
|
12576
12763
|
// ../agent-sessions/src/runtime/process.ts
|
|
12577
12764
|
async function spawnHarnessProcess(command, args, options) {
|
|
12578
12765
|
if (typeof Bun !== "undefined") {
|
|
@@ -12891,8 +13078,8 @@ function buildPiProcessEnv(config, sourceEnv = process.env) {
|
|
|
12891
13078
|
}
|
|
12892
13079
|
return env;
|
|
12893
13080
|
}
|
|
12894
|
-
var BASE_PROCESS_ENV_KEYS, PROVIDER_CREDENTIAL_ENV, MAX_PI_STDERR_CHARS = 4096, PiAdapter,
|
|
12895
|
-
var
|
|
13081
|
+
var BASE_PROCESS_ENV_KEYS, PROVIDER_CREDENTIAL_ENV, MAX_PI_STDERR_CHARS = 4096, PiAdapter, createAdapter6 = (config) => new PiAdapter(config);
|
|
13082
|
+
var init_adapter6 = __esm(() => {
|
|
12896
13083
|
init_secret_redaction();
|
|
12897
13084
|
BASE_PROCESS_ENV_KEYS = [
|
|
12898
13085
|
"PATH",
|
|
@@ -13741,7 +13928,7 @@ var init_adapter5 = __esm(() => {
|
|
|
13741
13928
|
|
|
13742
13929
|
// ../agent-sessions/src/adapters/pi/index.ts
|
|
13743
13930
|
var init_pi = __esm(() => {
|
|
13744
|
-
|
|
13931
|
+
init_adapter6();
|
|
13745
13932
|
});
|
|
13746
13933
|
|
|
13747
13934
|
// ../agent-sessions/src/buffer.ts
|
|
@@ -14397,9 +14584,9 @@ var init_registry2 = __esm(() => {
|
|
|
14397
14584
|
});
|
|
14398
14585
|
|
|
14399
14586
|
// ../agent-sessions/src/codex-launch-config.ts
|
|
14400
|
-
import { accessSync as accessSync3, constants as constants3, existsSync as
|
|
14401
|
-
import { homedir as
|
|
14402
|
-
import { basename as basename7, delimiter as delimiter2, dirname as dirname11, join as
|
|
14587
|
+
import { accessSync as accessSync3, constants as constants3, existsSync as existsSync19 } from "fs";
|
|
14588
|
+
import { homedir as homedir16 } from "os";
|
|
14589
|
+
import { basename as basename7, delimiter as delimiter2, dirname as dirname11, join as join17, resolve as resolve9 } from "path";
|
|
14403
14590
|
import { fileURLToPath as fileURLToPath2 } from "url";
|
|
14404
14591
|
function isExecutable2(filePath) {
|
|
14405
14592
|
if (!filePath) {
|
|
@@ -14430,14 +14617,14 @@ function ancestorChain(start) {
|
|
|
14430
14617
|
function resolveExecutableFromSearchPath(names2, env) {
|
|
14431
14618
|
const pathEntries = (env.PATH ?? "").split(delimiter2).filter(Boolean);
|
|
14432
14619
|
const commonDirectories = [
|
|
14433
|
-
|
|
14434
|
-
|
|
14620
|
+
join17(homedir16(), ".local", "bin"),
|
|
14621
|
+
join17(homedir16(), ".bun", "bin"),
|
|
14435
14622
|
"/opt/homebrew/bin",
|
|
14436
14623
|
"/usr/local/bin"
|
|
14437
14624
|
];
|
|
14438
14625
|
for (const directory of [...pathEntries, ...commonDirectories]) {
|
|
14439
14626
|
for (const name2 of names2) {
|
|
14440
|
-
const candidate =
|
|
14627
|
+
const candidate = join17(directory, name2);
|
|
14441
14628
|
if (isExecutable2(candidate)) {
|
|
14442
14629
|
return candidate;
|
|
14443
14630
|
}
|
|
@@ -14480,8 +14667,8 @@ function resolveRepoScoutScript(currentDirectory) {
|
|
|
14480
14667
|
const starts = uniquePaths([currentDirectory, moduleDirectory]);
|
|
14481
14668
|
for (const start of starts) {
|
|
14482
14669
|
for (const candidate of ancestorChain(start)) {
|
|
14483
|
-
const scriptPath =
|
|
14484
|
-
if (
|
|
14670
|
+
const scriptPath = join17(candidate, "apps", "desktop", "bin", "scout.ts");
|
|
14671
|
+
if (existsSync19(scriptPath)) {
|
|
14485
14672
|
return scriptPath;
|
|
14486
14673
|
}
|
|
14487
14674
|
}
|
|
@@ -14533,7 +14720,7 @@ var init_codex_launch_config = () => {};
|
|
|
14533
14720
|
// ../agent-sessions/src/local/transports/codex-app-server.ts
|
|
14534
14721
|
import { spawn as spawn5 } from "child_process";
|
|
14535
14722
|
import { appendFile, mkdir as mkdir3, readFile as readFile4, rm, stat as stat2, writeFile as writeFile3 } from "fs/promises";
|
|
14536
|
-
import { join as
|
|
14723
|
+
import { join as join18 } from "path";
|
|
14537
14724
|
function codexAppServerExitMessage(input) {
|
|
14538
14725
|
if (input.exitKind === "proactive_shutdown") {
|
|
14539
14726
|
return `Codex app-server session for ${input.agentName} was stopped by OpenScout` + (input.reason ? `: ${input.reason}` : "") + ".";
|
|
@@ -14851,7 +15038,7 @@ function parseCodexMaybeJson(value) {
|
|
|
14851
15038
|
}
|
|
14852
15039
|
}
|
|
14853
15040
|
async function readCodexSessionCatalog(runtimeDirectory) {
|
|
14854
|
-
const raw = await readOptionalFile(
|
|
15041
|
+
const raw = await readOptionalFile(join18(runtimeDirectory, SESSION_CATALOG_FILENAME));
|
|
14855
15042
|
if (!raw) {
|
|
14856
15043
|
return { activeSessionId: null, sessions: [] };
|
|
14857
15044
|
}
|
|
@@ -14866,7 +15053,7 @@ async function readCodexSessionCatalog(runtimeDirectory) {
|
|
|
14866
15053
|
}
|
|
14867
15054
|
async function writeCodexSessionCatalog(runtimeDirectory, catalog) {
|
|
14868
15055
|
await mkdir3(runtimeDirectory, { recursive: true });
|
|
14869
|
-
await writeFile3(
|
|
15056
|
+
await writeFile3(join18(runtimeDirectory, SESSION_CATALOG_FILENAME), JSON.stringify(catalog, null, 2) + `
|
|
14870
15057
|
`);
|
|
14871
15058
|
}
|
|
14872
15059
|
async function recordCodexSessionCatalog(runtimeDirectory, threadId, input) {
|
|
@@ -14939,10 +15126,10 @@ class CodexAppServerTransport {
|
|
|
14939
15126
|
errorListeners = new Set;
|
|
14940
15127
|
constructor(options) {
|
|
14941
15128
|
this.options = options;
|
|
14942
|
-
this.threadIdPath =
|
|
14943
|
-
this.statePath =
|
|
14944
|
-
this.stdoutLogPath =
|
|
14945
|
-
this.stderrLogPath =
|
|
15129
|
+
this.threadIdPath = join18(options.runtimeDirectory, "codex-thread-id.txt");
|
|
15130
|
+
this.statePath = join18(options.runtimeDirectory, "state.json");
|
|
15131
|
+
this.stdoutLogPath = join18(options.logsDirectory, "stdout.log");
|
|
15132
|
+
this.stderrLogPath = join18(options.logsDirectory, "stderr.log");
|
|
14946
15133
|
this.lastConfigSignature = this.configSignature(options);
|
|
14947
15134
|
}
|
|
14948
15135
|
get currentThreadId() {
|
|
@@ -15103,7 +15290,7 @@ class CodexAppServerTransport {
|
|
|
15103
15290
|
async startSession() {
|
|
15104
15291
|
await mkdir3(this.options.runtimeDirectory, { recursive: true });
|
|
15105
15292
|
await mkdir3(this.options.logsDirectory, { recursive: true });
|
|
15106
|
-
await writeFile3(
|
|
15293
|
+
await writeFile3(join18(this.options.runtimeDirectory, "prompt.txt"), this.options.systemPrompt);
|
|
15107
15294
|
this.proactiveShutdown = null;
|
|
15108
15295
|
try {
|
|
15109
15296
|
await assertCodexWorkingDirectory(this.options.cwd, this.options.agentName);
|
|
@@ -15855,9 +16042,9 @@ async function shutdownCodexAppServerLocalAgent(options, shutdownOptions = {}) {
|
|
|
15855
16042
|
const session = codexAppServerClients.get(key);
|
|
15856
16043
|
if (!session) {
|
|
15857
16044
|
if (shutdownOptions.resetThread) {
|
|
15858
|
-
const threadId = await readOptionalFile(
|
|
16045
|
+
const threadId = await readOptionalFile(join18(options.runtimeDirectory, "codex-thread-id.txt"));
|
|
15859
16046
|
await closeCodexSessionCatalog(options.runtimeDirectory, threadId);
|
|
15860
|
-
await rm(
|
|
16047
|
+
await rm(join18(options.runtimeDirectory, "codex-thread-id.txt"), { force: true });
|
|
15861
16048
|
}
|
|
15862
16049
|
return;
|
|
15863
16050
|
}
|
|
@@ -15982,6 +16169,11 @@ var init_opencode_acp_invocation = __esm(() => {
|
|
|
15982
16169
|
init_acp_agent_invocation();
|
|
15983
16170
|
});
|
|
15984
16171
|
|
|
16172
|
+
// ../runtime/src/devin-acp-invocation.ts
|
|
16173
|
+
var init_devin_acp_invocation = __esm(() => {
|
|
16174
|
+
init_acp_agent_invocation();
|
|
16175
|
+
});
|
|
16176
|
+
|
|
15985
16177
|
// ../runtime/src/managed-agent-environment.ts
|
|
15986
16178
|
function managedAgentEnvironmentEntries(options) {
|
|
15987
16179
|
const agentName = options.agentName.trim();
|
|
@@ -16010,8 +16202,8 @@ function buildManagedAgentShellExports(options) {
|
|
|
16010
16202
|
import { randomUUID as randomUUID2 } from "crypto";
|
|
16011
16203
|
import { spawn as spawn6 } from "child_process";
|
|
16012
16204
|
import { appendFile as appendFile2, mkdir as mkdir4, readFile as readFile5, writeFile as writeFile4 } from "fs/promises";
|
|
16013
|
-
import { existsSync as
|
|
16014
|
-
import { join as
|
|
16205
|
+
import { existsSync as existsSync20, readFileSync as readFileSync8 } from "fs";
|
|
16206
|
+
import { join as join19 } from "path";
|
|
16015
16207
|
function resolveRequesterTimeoutMs2(timeoutMs) {
|
|
16016
16208
|
if (typeof timeoutMs === "number" && Number.isFinite(timeoutMs) && timeoutMs > 0) {
|
|
16017
16209
|
return timeoutMs;
|
|
@@ -16062,11 +16254,11 @@ function errorMessage4(error) {
|
|
|
16062
16254
|
return error instanceof Error ? error.message : String(error);
|
|
16063
16255
|
}
|
|
16064
16256
|
function readSessionCatalogSync(runtimeDirectory) {
|
|
16065
|
-
const catalogPath =
|
|
16257
|
+
const catalogPath = join19(runtimeDirectory, SESSION_CATALOG_FILENAME2);
|
|
16066
16258
|
try {
|
|
16067
|
-
if (!
|
|
16068
|
-
const legacyPath =
|
|
16069
|
-
if (
|
|
16259
|
+
if (!existsSync20(catalogPath)) {
|
|
16260
|
+
const legacyPath = join19(runtimeDirectory, "claude-session-id.txt");
|
|
16261
|
+
if (existsSync20(legacyPath)) {
|
|
16070
16262
|
const legacyId = readFileSync8(legacyPath, "utf8").trim();
|
|
16071
16263
|
if (legacyId) {
|
|
16072
16264
|
return {
|
|
@@ -16093,7 +16285,7 @@ async function readSessionCatalog(runtimeDirectory) {
|
|
|
16093
16285
|
return readSessionCatalogSync(runtimeDirectory);
|
|
16094
16286
|
}
|
|
16095
16287
|
async function writeSessionCatalog(runtimeDirectory, catalog) {
|
|
16096
|
-
const catalogPath =
|
|
16288
|
+
const catalogPath = join19(runtimeDirectory, SESSION_CATALOG_FILENAME2);
|
|
16097
16289
|
await mkdir4(runtimeDirectory, { recursive: true });
|
|
16098
16290
|
await writeFile4(catalogPath, JSON.stringify(catalog, null, 2) + `
|
|
16099
16291
|
`);
|
|
@@ -16126,8 +16318,8 @@ class ClaudeStreamJsonSession {
|
|
|
16126
16318
|
constructor(options) {
|
|
16127
16319
|
this.options = options;
|
|
16128
16320
|
this.catalogDirectory = options.runtimeDirectory;
|
|
16129
|
-
this.stdoutLogPath =
|
|
16130
|
-
this.stderrLogPath =
|
|
16321
|
+
this.stdoutLogPath = join19(options.logsDirectory, "stdout.log");
|
|
16322
|
+
this.stderrLogPath = join19(options.logsDirectory, "stderr.log");
|
|
16131
16323
|
this.lastConfigSignature = this.configSignature(options);
|
|
16132
16324
|
}
|
|
16133
16325
|
matches(options) {
|
|
@@ -16283,7 +16475,7 @@ class ClaudeStreamJsonSession {
|
|
|
16283
16475
|
async startSession() {
|
|
16284
16476
|
await mkdir4(this.options.runtimeDirectory, { recursive: true });
|
|
16285
16477
|
await mkdir4(this.options.logsDirectory, { recursive: true });
|
|
16286
|
-
await writeFile4(
|
|
16478
|
+
await writeFile4(join19(this.options.runtimeDirectory, "prompt.txt"), this.options.systemPrompt);
|
|
16287
16479
|
const catalog = await readSessionCatalog(this.catalogDirectory);
|
|
16288
16480
|
this.claudeSessionId = catalog.activeSessionId;
|
|
16289
16481
|
this.resumedSessionId = this.claudeSessionId;
|
|
@@ -16468,13 +16660,13 @@ var init_claude_stream_json = __esm(() => {
|
|
|
16468
16660
|
});
|
|
16469
16661
|
|
|
16470
16662
|
// ../agent-sessions/src/adapters/codex/topology.ts
|
|
16471
|
-
import { existsSync as
|
|
16472
|
-
import { homedir as
|
|
16473
|
-
import { basename as basename8, join as
|
|
16663
|
+
import { existsSync as existsSync21, readdirSync as readdirSync2, readFileSync as readFileSync9, statSync as statSync4 } from "fs";
|
|
16664
|
+
import { homedir as homedir17 } from "os";
|
|
16665
|
+
import { basename as basename8, join as join20 } from "path";
|
|
16474
16666
|
function isObject(value) {
|
|
16475
16667
|
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
16476
16668
|
}
|
|
16477
|
-
function
|
|
16669
|
+
function stringValue6(value) {
|
|
16478
16670
|
return typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined;
|
|
16479
16671
|
}
|
|
16480
16672
|
function numberValue2(value) {
|
|
@@ -16594,15 +16786,15 @@ function readTomlKeyValues(path2) {
|
|
|
16594
16786
|
}
|
|
16595
16787
|
function firstString(record, keys) {
|
|
16596
16788
|
for (const key of keys) {
|
|
16597
|
-
const value =
|
|
16789
|
+
const value = stringValue6(record[key]);
|
|
16598
16790
|
if (value)
|
|
16599
16791
|
return value;
|
|
16600
16792
|
}
|
|
16601
16793
|
return;
|
|
16602
16794
|
}
|
|
16603
16795
|
function readAgentDefinitions(root, scope) {
|
|
16604
|
-
const agentsDir =
|
|
16605
|
-
if (!
|
|
16796
|
+
const agentsDir = join20(root, ".codex", "agents");
|
|
16797
|
+
if (!existsSync21(agentsDir) || !statIsDirectory(agentsDir)) {
|
|
16606
16798
|
return { agents: [], sourceRefs: [] };
|
|
16607
16799
|
}
|
|
16608
16800
|
const agents = [];
|
|
@@ -16610,7 +16802,7 @@ function readAgentDefinitions(root, scope) {
|
|
|
16610
16802
|
for (const entry of readdirSync2(agentsDir).sort()) {
|
|
16611
16803
|
if (!entry.endsWith(".toml"))
|
|
16612
16804
|
continue;
|
|
16613
|
-
const path2 =
|
|
16805
|
+
const path2 = join20(agentsDir, entry);
|
|
16614
16806
|
if (!statIsFile(path2))
|
|
16615
16807
|
continue;
|
|
16616
16808
|
const parsed = readTomlKeyValues(path2);
|
|
@@ -16649,8 +16841,8 @@ function readAgentDefinitions(root, scope) {
|
|
|
16649
16841
|
function readProjectAgentsConfig(cwd) {
|
|
16650
16842
|
if (!cwd)
|
|
16651
16843
|
return {};
|
|
16652
|
-
const configPath =
|
|
16653
|
-
if (!
|
|
16844
|
+
const configPath = join20(cwd, ".codex", "config.toml");
|
|
16845
|
+
if (!existsSync21(configPath) || !statIsFile(configPath)) {
|
|
16654
16846
|
return {};
|
|
16655
16847
|
}
|
|
16656
16848
|
const parsed = readTomlKeyValues(configPath);
|
|
@@ -16683,7 +16875,7 @@ function taskStateFromStatus(value, fallback = "running") {
|
|
|
16683
16875
|
if (typeof value === "string" && value.trim())
|
|
16684
16876
|
return value.trim();
|
|
16685
16877
|
if (isObject(value)) {
|
|
16686
|
-
const nested =
|
|
16878
|
+
const nested = stringValue6(value.type) ?? stringValue6(value.status);
|
|
16687
16879
|
if (nested)
|
|
16688
16880
|
return nested;
|
|
16689
16881
|
}
|
|
@@ -16709,14 +16901,14 @@ class CodexObservedTopologyTracker {
|
|
|
16709
16901
|
this.threadPath = options.threadPath?.trim() || null;
|
|
16710
16902
|
this.cwd = options.cwd;
|
|
16711
16903
|
this.sessionName = options.sessionName;
|
|
16712
|
-
this.homeDir = options.homeDir ??
|
|
16904
|
+
this.homeDir = options.homeDir ?? homedir17();
|
|
16713
16905
|
this.now = options.now ?? (() => new Date);
|
|
16714
16906
|
}
|
|
16715
16907
|
updateThread(thread) {
|
|
16716
|
-
const threadId =
|
|
16717
|
-
const threadPath =
|
|
16718
|
-
const cwd =
|
|
16719
|
-
const name2 =
|
|
16908
|
+
const threadId = stringValue6(thread.id);
|
|
16909
|
+
const threadPath = stringValue6(thread.path);
|
|
16910
|
+
const cwd = stringValue6(thread.cwd);
|
|
16911
|
+
const name2 = stringValue6(thread.name);
|
|
16720
16912
|
if (threadId)
|
|
16721
16913
|
this.threadId = threadId;
|
|
16722
16914
|
if (threadPath)
|
|
@@ -16727,7 +16919,7 @@ class CodexObservedTopologyTracker {
|
|
|
16727
16919
|
this.sessionName = name2;
|
|
16728
16920
|
}
|
|
16729
16921
|
observeItem(item, phase) {
|
|
16730
|
-
const type =
|
|
16922
|
+
const type = stringValue6(item.type);
|
|
16731
16923
|
if (!type)
|
|
16732
16924
|
return false;
|
|
16733
16925
|
if (type === "subagent") {
|
|
@@ -16916,7 +17108,7 @@ var OBSERVED_HARNESS_TOPOLOGY_META_KEY = "observedTopology";
|
|
|
16916
17108
|
|
|
16917
17109
|
// ../runtime/src/codex-app-server.ts
|
|
16918
17110
|
import { lstat, mkdir as mkdir5, readFile as readFile6, symlink } from "fs/promises";
|
|
16919
|
-
import { join as
|
|
17111
|
+
import { join as join21 } from "path";
|
|
16920
17112
|
function isCodexThreadGlobalMessage(message) {
|
|
16921
17113
|
const result = message.result;
|
|
16922
17114
|
const thread = result?.thread;
|
|
@@ -17761,7 +17953,7 @@ async function prepareManagedCodexAuthentication(options) {
|
|
|
17761
17953
|
const authSource = options.env?.OPENSCOUT_CODEX_AUTH_SOURCE?.trim();
|
|
17762
17954
|
if (!codexHome || !authSource || options.env?.OPENAI_API_KEY?.trim() || process.env.OPENAI_API_KEY?.trim())
|
|
17763
17955
|
return;
|
|
17764
|
-
const authTarget =
|
|
17956
|
+
const authTarget = join21(codexHome, "auth.json");
|
|
17765
17957
|
try {
|
|
17766
17958
|
await lstat(authTarget);
|
|
17767
17959
|
return;
|
|
@@ -17805,9 +17997,9 @@ function isCodexAppServerAgentAlive(options) {
|
|
|
17805
17997
|
return isCodexAppServerLocalAgentAlive(options);
|
|
17806
17998
|
}
|
|
17807
17999
|
async function getCodexAppServerAgentSnapshot(options) {
|
|
17808
|
-
const stdoutLogPath =
|
|
17809
|
-
const threadIdPath =
|
|
17810
|
-
const statePath =
|
|
18000
|
+
const stdoutLogPath = join21(options.logsDirectory, "stdout.log");
|
|
18001
|
+
const threadIdPath = join21(options.runtimeDirectory, "codex-thread-id.txt");
|
|
18002
|
+
const statePath = join21(options.runtimeDirectory, "state.json");
|
|
17811
18003
|
const [rawLog, persistedThreadId, persistedState] = await Promise.all([
|
|
17812
18004
|
readOptionalFile2(stdoutLogPath),
|
|
17813
18005
|
readOptionalFile2(threadIdPath),
|
|
@@ -17874,11 +18066,11 @@ function buildCollaborationContractPrompt(agentId) {
|
|
|
17874
18066
|
}
|
|
17875
18067
|
|
|
17876
18068
|
// ../runtime/src/pi-rpc.ts
|
|
17877
|
-
import { existsSync as
|
|
18069
|
+
import { existsSync as existsSync22, readFileSync as readFileSync10, statSync as statSync5 } from "fs";
|
|
17878
18070
|
import { mkdir as mkdir6, writeFile as writeFile5 } from "fs/promises";
|
|
17879
18071
|
import { execFileSync as execFileSync4 } from "child_process";
|
|
17880
|
-
import { homedir as
|
|
17881
|
-
import { join as
|
|
18072
|
+
import { homedir as homedir18 } from "os";
|
|
18073
|
+
import { join as join22 } from "path";
|
|
17882
18074
|
function normalizeOptionalString(value) {
|
|
17883
18075
|
const trimmed = value?.trim();
|
|
17884
18076
|
return trimmed ? trimmed : undefined;
|
|
@@ -17899,7 +18091,7 @@ function resolveDefaultPiScoutExtension() {
|
|
|
17899
18091
|
return null;
|
|
17900
18092
|
}
|
|
17901
18093
|
for (const candidate of PI_SCOUT_EXTENSION_CANDIDATES) {
|
|
17902
|
-
if (
|
|
18094
|
+
if (existsSync22(candidate)) {
|
|
17903
18095
|
return candidate;
|
|
17904
18096
|
}
|
|
17905
18097
|
}
|
|
@@ -17938,7 +18130,7 @@ function readPiRpcCredentialFile(name2, options = {}) {
|
|
|
17938
18130
|
}
|
|
17939
18131
|
const env = options.env ?? process.env;
|
|
17940
18132
|
const platform = options.platform ?? process.platform;
|
|
17941
|
-
const directory = normalizeOptionalString(env.CREDENTIALS_DIRECTORY) ?? normalizeOptionalString(env.OPENSCOUT_CREDENTIALS_DIRECTORY) ?? (platform === "linux" ?
|
|
18133
|
+
const directory = normalizeOptionalString(env.CREDENTIALS_DIRECTORY) ?? normalizeOptionalString(env.OPENSCOUT_CREDENTIALS_DIRECTORY) ?? (platform === "linux" ? join22(normalizeOptionalString(env.XDG_CONFIG_HOME) ?? join22(options.homedir ?? homedir18(), ".config"), "openscout", "credentials") : undefined);
|
|
17942
18134
|
if (!directory) {
|
|
17943
18135
|
return;
|
|
17944
18136
|
}
|
|
@@ -17947,7 +18139,7 @@ function readPiRpcCredentialFile(name2, options = {}) {
|
|
|
17947
18139
|
if (!directoryStat.isDirectory() || (directoryStat.mode & 63) !== 0) {
|
|
17948
18140
|
return;
|
|
17949
18141
|
}
|
|
17950
|
-
const path2 =
|
|
18142
|
+
const path2 = join22(directory, name2);
|
|
17951
18143
|
const stat3 = statSync5(path2);
|
|
17952
18144
|
if (!stat3.isFile() || (stat3.mode & 63) !== 0 || stat3.size > 16 * 1024) {
|
|
17953
18145
|
return;
|
|
@@ -18010,7 +18202,7 @@ function parsePiRpcLaunchArgs(launchArgs, options) {
|
|
|
18010
18202
|
const parsed = {
|
|
18011
18203
|
extensions: [],
|
|
18012
18204
|
extraArgs: [],
|
|
18013
|
-
sessionDir:
|
|
18205
|
+
sessionDir: join22(options.runtimeDirectory, "pi-sessions")
|
|
18014
18206
|
};
|
|
18015
18207
|
for (let index2 = 0;index2 < launchArgs.length; index2 += 1) {
|
|
18016
18208
|
const current = launchArgs[index2] ?? "";
|
|
@@ -18129,11 +18321,11 @@ class PiRpcAgentSession {
|
|
|
18129
18321
|
}
|
|
18130
18322
|
await mkdir6(this.options.runtimeDirectory, { recursive: true });
|
|
18131
18323
|
await mkdir6(this.options.logsDirectory, { recursive: true });
|
|
18132
|
-
await writeFile5(
|
|
18324
|
+
await writeFile5(join22(this.options.runtimeDirectory, "prompt.txt"), this.options.systemPrompt);
|
|
18133
18325
|
const launch = parsePiRpcLaunchArgs(this.options.launchArgs, {
|
|
18134
18326
|
runtimeDirectory: this.options.runtimeDirectory
|
|
18135
18327
|
});
|
|
18136
|
-
const adapter =
|
|
18328
|
+
const adapter = createAdapter6({
|
|
18137
18329
|
sessionId: this.options.sessionId,
|
|
18138
18330
|
name: `${this.options.agentName} Pi RPC`,
|
|
18139
18331
|
cwd: this.options.cwd,
|
|
@@ -18290,8 +18482,8 @@ var init_pi_rpc = __esm(() => {
|
|
|
18290
18482
|
init_pi();
|
|
18291
18483
|
PI_SCOUT_EXTENSION_CANDIDATES = [
|
|
18292
18484
|
process.env.OPENSCOUT_PI_SCOUT_EXTENSION_PATH,
|
|
18293
|
-
|
|
18294
|
-
|
|
18485
|
+
join22(homedir18(), ".pi", "agent", "extensions", "pi-scout"),
|
|
18486
|
+
join22(homedir18(), "dev", "pi-scout")
|
|
18295
18487
|
].filter((candidate) => Boolean(candidate));
|
|
18296
18488
|
PI_RPC_FLAGS_WITH_VALUES = new Set([
|
|
18297
18489
|
"--model",
|
|
@@ -19321,8 +19513,8 @@ var init_managed_installs = __esm(() => {
|
|
|
19321
19513
|
|
|
19322
19514
|
// ../runtime/src/user-project-hints.ts
|
|
19323
19515
|
import { readdir as readdir2, readFile as readFile7, stat as stat3 } from "fs/promises";
|
|
19324
|
-
import { homedir as
|
|
19325
|
-
import { dirname as dirname12, join as
|
|
19516
|
+
import { homedir as homedir19 } from "os";
|
|
19517
|
+
import { dirname as dirname12, join as join23, resolve as resolve10 } from "path";
|
|
19326
19518
|
import { fileURLToPath as fileURLToPath3 } from "url";
|
|
19327
19519
|
function decodeClaudeProjectsSlug(name2) {
|
|
19328
19520
|
if (!name2 || name2 === "." || name2 === "..") {
|
|
@@ -19369,7 +19561,7 @@ async function findLikelyProjectRoot(absolutePath) {
|
|
|
19369
19561
|
let lastCandidate = null;
|
|
19370
19562
|
while (true) {
|
|
19371
19563
|
for (const marker of PROJECT_HINT_MARKERS) {
|
|
19372
|
-
if (await pathExists(
|
|
19564
|
+
if (await pathExists(join23(current, marker))) {
|
|
19373
19565
|
lastCandidate = current;
|
|
19374
19566
|
if (marker === ".git" || marker === ".openscout/project.json") {
|
|
19375
19567
|
return current;
|
|
@@ -19392,16 +19584,16 @@ async function appendPathHint(pathLike, roots) {
|
|
|
19392
19584
|
}
|
|
19393
19585
|
function cursorWorkspaceStoragePath(home) {
|
|
19394
19586
|
if (process.platform === "darwin") {
|
|
19395
|
-
return
|
|
19587
|
+
return join23(home, "Library", "Application Support", "Cursor", "User", "workspaceStorage");
|
|
19396
19588
|
}
|
|
19397
19589
|
if (process.platform === "win32") {
|
|
19398
19590
|
const appData = process.env.APPDATA;
|
|
19399
19591
|
if (appData) {
|
|
19400
|
-
return
|
|
19592
|
+
return join23(appData, "Cursor", "User", "workspaceStorage");
|
|
19401
19593
|
}
|
|
19402
|
-
return
|
|
19594
|
+
return join23(home, "AppData", "Roaming", "Cursor", "User", "workspaceStorage");
|
|
19403
19595
|
}
|
|
19404
|
-
return
|
|
19596
|
+
return join23(home, ".config", "Cursor", "User", "workspaceStorage");
|
|
19405
19597
|
}
|
|
19406
19598
|
function collectPathLikeStrings(value, out, depth) {
|
|
19407
19599
|
if (depth > 4 || value === null || value === undefined) {
|
|
@@ -19430,7 +19622,7 @@ function collectPathLikeStrings(value, out, depth) {
|
|
|
19430
19622
|
}
|
|
19431
19623
|
}
|
|
19432
19624
|
async function appendCodexHistoryPaths(home, roots) {
|
|
19433
|
-
const candidates = [
|
|
19625
|
+
const candidates = [join23(home, ".codex", "history.jsonl"), join23(home, ".openai-codex", "history.jsonl")];
|
|
19434
19626
|
const maxLines = 2500;
|
|
19435
19627
|
const maxBytes = 4 * 1024 * 1024;
|
|
19436
19628
|
for (const filePath of candidates) {
|
|
@@ -19481,7 +19673,7 @@ async function appendCursorWorkspacePaths(home, roots) {
|
|
|
19481
19673
|
return;
|
|
19482
19674
|
}
|
|
19483
19675
|
for (const id of ids) {
|
|
19484
|
-
const workspaceJsonPath =
|
|
19676
|
+
const workspaceJsonPath = join23(base, id, "workspace.json");
|
|
19485
19677
|
let raw;
|
|
19486
19678
|
try {
|
|
19487
19679
|
raw = await readFile7(workspaceJsonPath, "utf8");
|
|
@@ -19530,7 +19722,7 @@ async function appendCursorWorkspacePaths(home, roots) {
|
|
|
19530
19722
|
}
|
|
19531
19723
|
}
|
|
19532
19724
|
async function appendClaudeProjectSlugs(home, roots) {
|
|
19533
|
-
const projectsDir =
|
|
19725
|
+
const projectsDir = join23(home, ".claude", "projects");
|
|
19534
19726
|
let names2 = [];
|
|
19535
19727
|
try {
|
|
19536
19728
|
names2 = await readdir2(projectsDir, { withFileTypes: false });
|
|
@@ -19546,7 +19738,7 @@ async function appendClaudeProjectSlugs(home, roots) {
|
|
|
19546
19738
|
}
|
|
19547
19739
|
}
|
|
19548
19740
|
async function appendClaudeSessionPaths(home, roots) {
|
|
19549
|
-
const projectsDir =
|
|
19741
|
+
const projectsDir = join23(home, ".claude", "projects");
|
|
19550
19742
|
const maxProjectDirectories = 200;
|
|
19551
19743
|
const maxSessionFiles = 400;
|
|
19552
19744
|
const maxLinesPerFile = 400;
|
|
@@ -19561,7 +19753,7 @@ async function appendClaudeSessionPaths(home, roots) {
|
|
|
19561
19753
|
for (const projectName of projectNames) {
|
|
19562
19754
|
let entries = [];
|
|
19563
19755
|
try {
|
|
19564
|
-
entries = await readdir2(
|
|
19756
|
+
entries = await readdir2(join23(projectsDir, projectName), { withFileTypes: false });
|
|
19565
19757
|
} catch {
|
|
19566
19758
|
continue;
|
|
19567
19759
|
}
|
|
@@ -19572,7 +19764,7 @@ async function appendClaudeSessionPaths(home, roots) {
|
|
|
19572
19764
|
if (!entry.endsWith(".jsonl")) {
|
|
19573
19765
|
continue;
|
|
19574
19766
|
}
|
|
19575
|
-
const sessionPath =
|
|
19767
|
+
const sessionPath = join23(projectsDir, projectName, entry);
|
|
19576
19768
|
let info;
|
|
19577
19769
|
try {
|
|
19578
19770
|
info = await stat3(sessionPath);
|
|
@@ -19614,7 +19806,7 @@ async function appendClaudeSessionPaths(home, roots) {
|
|
|
19614
19806
|
}
|
|
19615
19807
|
}
|
|
19616
19808
|
async function collectUserLevelProjectRootHints(options = {}) {
|
|
19617
|
-
const home = options.home ??
|
|
19809
|
+
const home = options.home ?? homedir19();
|
|
19618
19810
|
const roots = new Set;
|
|
19619
19811
|
try {
|
|
19620
19812
|
await appendClaudeProjectSlugs(home, roots);
|
|
@@ -19646,10 +19838,10 @@ var init_user_project_hints = __esm(() => {
|
|
|
19646
19838
|
|
|
19647
19839
|
// ../runtime/src/setup.ts
|
|
19648
19840
|
import { execFileSync as execFileSync5 } from "child_process";
|
|
19649
|
-
import { existsSync as
|
|
19841
|
+
import { existsSync as existsSync23, readFileSync as readFileSync11 } from "fs";
|
|
19650
19842
|
import { access, chmod, mkdir as mkdir7, readdir as readdir3, readFile as readFile8, realpath, rm as rm3, stat as stat4, writeFile as writeFile6 } from "fs/promises";
|
|
19651
|
-
import { homedir as
|
|
19652
|
-
import { basename as basename9, dirname as dirname13, isAbsolute as isAbsolute2, join as
|
|
19843
|
+
import { homedir as homedir20, hostname, userInfo } from "os";
|
|
19844
|
+
import { basename as basename9, dirname as dirname13, isAbsolute as isAbsolute2, join as join24, relative as relative2, resolve as resolve11 } from "path";
|
|
19653
19845
|
import { fileURLToPath as fileURLToPath4 } from "url";
|
|
19654
19846
|
function titleCaseWords(value) {
|
|
19655
19847
|
return value.split(/[\s._-]+/).map((part) => part.trim()).filter(Boolean).map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join(" ");
|
|
@@ -19705,7 +19897,7 @@ async function matchNestedMarkers(projectRoot, nestedMarkers) {
|
|
|
19705
19897
|
if (nestedMarkers.length === 0) {
|
|
19706
19898
|
return [];
|
|
19707
19899
|
}
|
|
19708
|
-
const hits = await Promise.all(nestedMarkers.map(async (marker) => await pathExists2(
|
|
19900
|
+
const hits = await Promise.all(nestedMarkers.map(async (marker) => await pathExists2(join24(projectRoot, marker)) ? marker : null));
|
|
19709
19901
|
return hits.filter((marker) => Boolean(marker));
|
|
19710
19902
|
}
|
|
19711
19903
|
function nowSeconds() {
|
|
@@ -19713,10 +19905,10 @@ function nowSeconds() {
|
|
|
19713
19905
|
}
|
|
19714
19906
|
function expandHomePath3(value) {
|
|
19715
19907
|
if (value === "~") {
|
|
19716
|
-
return
|
|
19908
|
+
return homedir20();
|
|
19717
19909
|
}
|
|
19718
19910
|
if (value.startsWith("~/")) {
|
|
19719
|
-
return
|
|
19911
|
+
return join24(homedir20(), value.slice(2));
|
|
19720
19912
|
}
|
|
19721
19913
|
return value;
|
|
19722
19914
|
}
|
|
@@ -19754,6 +19946,9 @@ function normalizeManagedHarness(value, fallback) {
|
|
|
19754
19946
|
if (value === "cursor") {
|
|
19755
19947
|
return "cursor";
|
|
19756
19948
|
}
|
|
19949
|
+
if (value === "devin") {
|
|
19950
|
+
return "devin";
|
|
19951
|
+
}
|
|
19757
19952
|
if (value === "grok") {
|
|
19758
19953
|
return "grok";
|
|
19759
19954
|
}
|
|
@@ -19823,16 +20018,16 @@ function resolveTelegramConfigSeedValue(key, currentDirectory) {
|
|
|
19823
20018
|
return envValue;
|
|
19824
20019
|
}
|
|
19825
20020
|
if (currentDirectory) {
|
|
19826
|
-
const currentDirValue = readEnvFileValue(
|
|
20021
|
+
const currentDirValue = readEnvFileValue(join24(currentDirectory, ".env.local"), key).trim();
|
|
19827
20022
|
if (currentDirValue) {
|
|
19828
20023
|
return currentDirValue;
|
|
19829
20024
|
}
|
|
19830
20025
|
}
|
|
19831
|
-
const home =
|
|
20026
|
+
const home = homedir20();
|
|
19832
20027
|
if (!home) {
|
|
19833
20028
|
return "";
|
|
19834
20029
|
}
|
|
19835
|
-
return readEnvFileValue(
|
|
20030
|
+
return readEnvFileValue(join24(home, ".env.local"), key).trim();
|
|
19836
20031
|
}
|
|
19837
20032
|
function normalizeTelegramBridgeMode(value) {
|
|
19838
20033
|
const normalized = typeof value === "string" ? value.trim().toLowerCase() : "";
|
|
@@ -19875,7 +20070,7 @@ function readNodeAliasSync() {
|
|
|
19875
20070
|
}
|
|
19876
20071
|
}
|
|
19877
20072
|
function readGitHeadBranch(projectRoot) {
|
|
19878
|
-
const dotGitPath =
|
|
20073
|
+
const dotGitPath = join24(projectRoot, ".git");
|
|
19879
20074
|
let gitDirectory = dotGitPath;
|
|
19880
20075
|
try {
|
|
19881
20076
|
const marker = readFileSync11(dotGitPath, "utf8");
|
|
@@ -19885,7 +20080,7 @@ function readGitHeadBranch(projectRoot) {
|
|
|
19885
20080
|
gitDirectory = isAbsolute2(match[1]) ? match[1] : resolve11(projectRoot, match[1]);
|
|
19886
20081
|
} catch {}
|
|
19887
20082
|
try {
|
|
19888
|
-
const head = readFileSync11(
|
|
20083
|
+
const head = readFileSync11(join24(gitDirectory, "HEAD"), "utf8").trim();
|
|
19889
20084
|
const match = /^ref:\s*refs\/heads\/(.+)$/u.exec(head);
|
|
19890
20085
|
return { found: true, branch: match?.[1]?.trim() || null };
|
|
19891
20086
|
} catch {
|
|
@@ -19972,6 +20167,9 @@ function normalizeTransport(value, harness, fallback) {
|
|
|
19972
20167
|
if (harness === "cursor") {
|
|
19973
20168
|
return "cursor_acp";
|
|
19974
20169
|
}
|
|
20170
|
+
if (harness === "devin") {
|
|
20171
|
+
return "devin_acp";
|
|
20172
|
+
}
|
|
19975
20173
|
if (harness === "opencode") {
|
|
19976
20174
|
return "opencode_acp";
|
|
19977
20175
|
}
|
|
@@ -19987,7 +20185,7 @@ function normalizeTransport(value, harness, fallback) {
|
|
|
19987
20185
|
if (value === "pi_rpc") {
|
|
19988
20186
|
return "pi_rpc";
|
|
19989
20187
|
}
|
|
19990
|
-
if (value === "grok_acp" || value === "kimi_acp" || value === "cursor_acp" || value === "opencode_acp") {
|
|
20188
|
+
if (value === "grok_acp" || value === "kimi_acp" || value === "cursor_acp" || value === "opencode_acp" || value === "devin_acp") {
|
|
19991
20189
|
return value;
|
|
19992
20190
|
}
|
|
19993
20191
|
if (value === "cursor_exec") {
|
|
@@ -20168,13 +20366,13 @@ function defaultSettings() {
|
|
|
20168
20366
|
};
|
|
20169
20367
|
}
|
|
20170
20368
|
function projectConfigPath(projectRoot) {
|
|
20171
|
-
return
|
|
20369
|
+
return join24(projectRoot, ".openscout", "project.json");
|
|
20172
20370
|
}
|
|
20173
20371
|
function projectGitignorePath(projectRoot) {
|
|
20174
|
-
return
|
|
20372
|
+
return join24(projectRoot, ".gitignore");
|
|
20175
20373
|
}
|
|
20176
20374
|
function legacyLocalRelayLinkPath(projectRoot) {
|
|
20177
|
-
return
|
|
20375
|
+
return join24(projectRoot, ".openscout", "relay.json");
|
|
20178
20376
|
}
|
|
20179
20377
|
async function pathExists2(filePath) {
|
|
20180
20378
|
try {
|
|
@@ -20205,10 +20403,10 @@ async function writeJsonFile(filePath, value) {
|
|
|
20205
20403
|
`, "utf8");
|
|
20206
20404
|
}
|
|
20207
20405
|
function codexEnvironmentPath(projectRoot) {
|
|
20208
|
-
return
|
|
20406
|
+
return join24(projectRoot, ".codex", "environments", "environment.toml");
|
|
20209
20407
|
}
|
|
20210
20408
|
function currentHomeDirectory() {
|
|
20211
|
-
return process.env.HOME?.trim() ||
|
|
20409
|
+
return process.env.HOME?.trim() || homedir20();
|
|
20212
20410
|
}
|
|
20213
20411
|
function normalizeProjectScriptSet(value) {
|
|
20214
20412
|
if (typeof value !== "object" || !value) {
|
|
@@ -20364,11 +20562,11 @@ async function readCodexEnvironmentImport(projectRoot) {
|
|
|
20364
20562
|
}
|
|
20365
20563
|
async function readClaudeProjectImport(projectRoot) {
|
|
20366
20564
|
const slug = encodeClaudeProjectsSlug(projectRoot);
|
|
20367
|
-
const sourcePath =
|
|
20565
|
+
const sourcePath = join24(currentHomeDirectory(), ".claude", "projects", slug);
|
|
20368
20566
|
if (!await isDirectory(sourcePath)) {
|
|
20369
20567
|
return null;
|
|
20370
20568
|
}
|
|
20371
|
-
const memoryPath = await pathExists2(
|
|
20569
|
+
const memoryPath = await pathExists2(join24(sourcePath, "memory", "MEMORY.md")) ? join24(sourcePath, "memory", "MEMORY.md") : undefined;
|
|
20372
20570
|
let entries = [];
|
|
20373
20571
|
try {
|
|
20374
20572
|
entries = await readdir3(sourcePath, { withFileTypes: false });
|
|
@@ -20383,7 +20581,7 @@ async function readClaudeProjectImport(projectRoot) {
|
|
|
20383
20581
|
continue;
|
|
20384
20582
|
}
|
|
20385
20583
|
sessionCount += 1;
|
|
20386
|
-
const sessionPath =
|
|
20584
|
+
const sessionPath = join24(sourcePath, entry);
|
|
20387
20585
|
let body;
|
|
20388
20586
|
try {
|
|
20389
20587
|
body = await readFile8(sessionPath, "utf8");
|
|
@@ -20498,17 +20696,18 @@ async function ensureProjectConfigIgnored(projectRoot) {
|
|
|
20498
20696
|
}
|
|
20499
20697
|
async function readLegacyRelayConfig() {
|
|
20500
20698
|
const relayHub = resolveOpenScoutSupportPaths().relayHubDirectory;
|
|
20501
|
-
return readJsonFile(
|
|
20699
|
+
return readJsonFile(join24(relayHub, "config.json"));
|
|
20502
20700
|
}
|
|
20503
20701
|
async function readLegacyAgentRegistry() {
|
|
20504
20702
|
const relayHub = resolveOpenScoutSupportPaths().relayHubDirectory;
|
|
20505
|
-
return await readJsonFile(
|
|
20703
|
+
return await readJsonFile(join24(relayHub, "agents.json")) ?? {};
|
|
20506
20704
|
}
|
|
20507
20705
|
async function detectHarnessMarkers(projectRoot) {
|
|
20508
20706
|
const detected = {
|
|
20509
20707
|
claude: [],
|
|
20510
20708
|
codex: [],
|
|
20511
20709
|
cursor: [],
|
|
20710
|
+
devin: [],
|
|
20512
20711
|
grok: [],
|
|
20513
20712
|
"grok-acp": [],
|
|
20514
20713
|
kimi: [],
|
|
@@ -20517,7 +20716,7 @@ async function detectHarnessMarkers(projectRoot) {
|
|
|
20517
20716
|
};
|
|
20518
20717
|
for (const harness of MANAGED_AGENT_HARNESSES) {
|
|
20519
20718
|
for (const marker of PROJECT_HARNESS_MARKERS[harness]) {
|
|
20520
|
-
if (await pathExists2(
|
|
20719
|
+
if (await pathExists2(join24(projectRoot, marker))) {
|
|
20521
20720
|
detected[harness].push(marker);
|
|
20522
20721
|
}
|
|
20523
20722
|
}
|
|
@@ -20681,7 +20880,7 @@ async function seedWorkspaceRoots(options) {
|
|
|
20681
20880
|
}
|
|
20682
20881
|
}
|
|
20683
20882
|
if (roots.size === 0) {
|
|
20684
|
-
roots.add(
|
|
20883
|
+
roots.add(join24(homedir20(), "dev"));
|
|
20685
20884
|
}
|
|
20686
20885
|
return Array.from(roots);
|
|
20687
20886
|
}
|
|
@@ -20783,10 +20982,10 @@ async function findNearestProjectRoot(startDirectory) {
|
|
|
20783
20982
|
let current = normalizePath(startDirectory);
|
|
20784
20983
|
let lastCandidate = null;
|
|
20785
20984
|
while (true) {
|
|
20786
|
-
if (await pathExists2(
|
|
20985
|
+
if (await pathExists2(join24(current, ".git"))) {
|
|
20787
20986
|
return current;
|
|
20788
20987
|
}
|
|
20789
|
-
if (await pathExists2(projectConfigPath(current)) || await pathExists2(
|
|
20988
|
+
if (await pathExists2(projectConfigPath(current)) || await pathExists2(join24(current, "package.json")) || await pathExists2(join24(current, "AGENTS.md")) || await pathExists2(join24(current, "CLAUDE.md"))) {
|
|
20790
20989
|
lastCandidate = current;
|
|
20791
20990
|
}
|
|
20792
20991
|
const parent = dirname13(current);
|
|
@@ -20970,7 +21169,7 @@ async function scanSourceRoot(sourceRoot) {
|
|
|
20970
21169
|
if (PROJECT_SCAN_SKIP_DIRECTORIES.has(entry.name)) {
|
|
20971
21170
|
continue;
|
|
20972
21171
|
}
|
|
20973
|
-
const nextPath =
|
|
21172
|
+
const nextPath = join24(currentDirectory, entry.name);
|
|
20974
21173
|
if (entry.isSymbolicLink()) {
|
|
20975
21174
|
if (!await isDirectory(nextPath)) {
|
|
20976
21175
|
continue;
|
|
@@ -21011,7 +21210,7 @@ function relativeProjectPath(projectRoot, sourceRoot) {
|
|
|
21011
21210
|
return relative2(sourceRoot, projectRoot) || ".";
|
|
21012
21211
|
}
|
|
21013
21212
|
function resolveProjectRootFromConfig(projectRoot, config) {
|
|
21014
|
-
return normalizePath(
|
|
21213
|
+
return normalizePath(join24(projectRoot, config.project.root ?? "."));
|
|
21015
21214
|
}
|
|
21016
21215
|
function mergeResolvedAgentConfig(base, override, settings) {
|
|
21017
21216
|
if (!override) {
|
|
@@ -21204,7 +21403,7 @@ async function resolveInferredAgent(projectRoot, settings, override) {
|
|
|
21204
21403
|
return mergeResolvedAgentConfig(base, override, settings);
|
|
21205
21404
|
}
|
|
21206
21405
|
async function buildProjectInventoryEntry(agent, sourceRoot) {
|
|
21207
|
-
const manifestRoot = agent.projectConfigPath ? normalizePath(
|
|
21406
|
+
const manifestRoot = agent.projectConfigPath ? normalizePath(join24(dirname13(agent.projectConfigPath), "..")) : null;
|
|
21208
21407
|
const manifest = manifestRoot ? await readProjectConfig(manifestRoot) : null;
|
|
21209
21408
|
const markers = await detectHarnessMarkers(agent.projectRoot);
|
|
21210
21409
|
const harnesses = new Map;
|
|
@@ -21313,7 +21512,7 @@ async function loadResolvedRelayAgents(options = {}) {
|
|
|
21313
21512
|
const sourceRootByProject = new Map(workspaceCandidates.map((candidate) => [candidate.projectRoot, candidate.sourceRoot]));
|
|
21314
21513
|
if (process.env.OPENSCOUT_SKIP_USER_PROJECT_HINTS !== "1") {
|
|
21315
21514
|
try {
|
|
21316
|
-
const hintHome = options.userLevelHintsHome ??
|
|
21515
|
+
const hintHome = options.userLevelHintsHome ?? homedir20();
|
|
21317
21516
|
const userHints = await collectUserLevelProjectRootHints({ home: hintHome });
|
|
21318
21517
|
for (const hint of userHints) {
|
|
21319
21518
|
const normalized = normalizePath(hint);
|
|
@@ -21502,7 +21701,7 @@ var init_setup = __esm(() => {
|
|
|
21502
21701
|
init_open_scout_network();
|
|
21503
21702
|
init_support_paths();
|
|
21504
21703
|
init_user_project_hints();
|
|
21505
|
-
MANAGED_AGENT_HARNESSES = ["claude", "codex", "cursor", "grok", "grok-acp", "kimi", "pi", "opencode"];
|
|
21704
|
+
MANAGED_AGENT_HARNESSES = ["claude", "codex", "cursor", "devin", "grok", "grok-acp", "kimi", "pi", "opencode"];
|
|
21506
21705
|
DEFAULT_OPERATOR_NAME = guessedOperatorName();
|
|
21507
21706
|
DEFAULT_CAPABILITIES = ["chat", "invoke", "deliver"];
|
|
21508
21707
|
PROJECT_SCAN_SKIP_DIRECTORIES = new Set([
|
|
@@ -21591,6 +21790,9 @@ var init_setup = __esm(() => {
|
|
|
21591
21790
|
".cursor",
|
|
21592
21791
|
".cursorrules"
|
|
21593
21792
|
],
|
|
21793
|
+
devin: [
|
|
21794
|
+
".devin"
|
|
21795
|
+
],
|
|
21594
21796
|
grok: [
|
|
21595
21797
|
"AGENTS.md",
|
|
21596
21798
|
"Grok.md",
|
|
@@ -21682,17 +21884,17 @@ var init_local_agent_template = __esm(() => {
|
|
|
21682
21884
|
});
|
|
21683
21885
|
|
|
21684
21886
|
// ../runtime/src/relay-agent-process-leases.ts
|
|
21685
|
-
import { existsSync as
|
|
21686
|
-
import { join as
|
|
21887
|
+
import { existsSync as existsSync24, mkdirSync as mkdirSync7, readdirSync as readdirSync3, readFileSync as readFileSync12, rmSync as rmSync4, writeFileSync as writeFileSync7 } from "fs";
|
|
21888
|
+
import { join as join25 } from "path";
|
|
21687
21889
|
function processLeasesDirectory() {
|
|
21688
|
-
return
|
|
21890
|
+
return join25(resolveOpenScoutSupportPaths().runtimeDirectory, "process-leases");
|
|
21689
21891
|
}
|
|
21690
21892
|
function leaseFileName(sessionName) {
|
|
21691
21893
|
const safe = sessionName.trim().replace(/[^\w.-]+/g, "-");
|
|
21692
21894
|
return `${RELAY_AGENT_PROCESS_LEASE_PREFIX}${safe}.json`;
|
|
21693
21895
|
}
|
|
21694
21896
|
function relayAgentProcessLeasePath(sessionName) {
|
|
21695
|
-
return
|
|
21897
|
+
return join25(processLeasesDirectory(), leaseFileName(sessionName));
|
|
21696
21898
|
}
|
|
21697
21899
|
function writeRelayAgentProcessLease(lease) {
|
|
21698
21900
|
assertTestIsolatedUserData("write a relay-agent process lease", "OPENSCOUT_SUPPORT_DIRECTORY");
|
|
@@ -21717,9 +21919,9 @@ var init_relay_agent_process_leases = __esm(() => {
|
|
|
21717
21919
|
});
|
|
21718
21920
|
|
|
21719
21921
|
// ../runtime/src/relay-agent-watchdog.ts
|
|
21720
|
-
import { dirname as dirname14, join as
|
|
21922
|
+
import { dirname as dirname14, join as join26 } from "path";
|
|
21721
21923
|
function brokerRuntimeHeartbeatPath() {
|
|
21722
|
-
return
|
|
21924
|
+
return join26(resolveOpenScoutSupportPaths().runtimeDirectory, BROKER_RUNTIME_HEARTBEAT_FILENAME);
|
|
21723
21925
|
}
|
|
21724
21926
|
function resolveRelayAgentOrphanGraceMs(env = process.env) {
|
|
21725
21927
|
const raw = env.OPENSCOUT_RELAY_AGENT_ORPHAN_GRACE_MS?.trim();
|
|
@@ -21834,11 +22036,11 @@ var init_permission_policy2 = __esm(() => {
|
|
|
21834
22036
|
});
|
|
21835
22037
|
|
|
21836
22038
|
// ../runtime/src/user-config.ts
|
|
21837
|
-
import { existsSync as
|
|
21838
|
-
import { homedir as
|
|
21839
|
-
import { dirname as dirname15, join as
|
|
22039
|
+
import { existsSync as existsSync25, readFileSync as readFileSync13, statSync as statSync6, writeFileSync as writeFileSync8, mkdirSync as mkdirSync8 } from "fs";
|
|
22040
|
+
import { homedir as homedir21 } from "os";
|
|
22041
|
+
import { dirname as dirname15, join as join27 } from "path";
|
|
21840
22042
|
function userConfigPath() {
|
|
21841
|
-
return
|
|
22043
|
+
return join27(process.env.OPENSCOUT_HOME ?? join27(homedir21(), ".openscout"), "user.json");
|
|
21842
22044
|
}
|
|
21843
22045
|
function userConfigFileKey(configPath) {
|
|
21844
22046
|
try {
|
|
@@ -21851,7 +22053,7 @@ function userConfigFileKey(configPath) {
|
|
|
21851
22053
|
function readUserConfigFromDisk(configPath, now) {
|
|
21852
22054
|
const fileKey = userConfigFileKey(configPath);
|
|
21853
22055
|
let value = {};
|
|
21854
|
-
if (
|
|
22056
|
+
if (existsSync25(configPath)) {
|
|
21855
22057
|
try {
|
|
21856
22058
|
value = JSON.parse(readFileSync13(configPath, "utf8"));
|
|
21857
22059
|
} catch {
|
|
@@ -21876,7 +22078,7 @@ function loadUserConfig(now = Date.now()) {
|
|
|
21876
22078
|
}
|
|
21877
22079
|
function readSettingsOperatorName() {
|
|
21878
22080
|
const settingsPath = resolveOpenScoutSupportPaths().settingsPath;
|
|
21879
|
-
if (!
|
|
22081
|
+
if (!existsSync25(settingsPath))
|
|
21880
22082
|
return "";
|
|
21881
22083
|
try {
|
|
21882
22084
|
const settings = JSON.parse(readFileSync13(settingsPath, "utf8"));
|
|
@@ -21903,9 +22105,9 @@ var init_user_config = __esm(() => {
|
|
|
21903
22105
|
});
|
|
21904
22106
|
|
|
21905
22107
|
// ../runtime/src/local-agents.ts
|
|
21906
|
-
import { existsSync as
|
|
22108
|
+
import { existsSync as existsSync26, readFileSync as readFileSync14 } from "fs";
|
|
21907
22109
|
import { mkdir as mkdir8, readFile as readFile9, rm as rm4, stat as stat5, writeFile as writeFile7 } from "fs/promises";
|
|
21908
|
-
import { dirname as dirname16, join as
|
|
22110
|
+
import { dirname as dirname16, join as join28, resolve as resolve12 } from "path";
|
|
21909
22111
|
import { fileURLToPath as fileURLToPath5 } from "url";
|
|
21910
22112
|
function resolveRelayHub() {
|
|
21911
22113
|
return resolveOpenScoutSupportPaths().relayHubDirectory;
|
|
@@ -21916,7 +22118,7 @@ function resolveProjectsRoot(projectPath) {
|
|
|
21916
22118
|
}
|
|
21917
22119
|
try {
|
|
21918
22120
|
const supportPaths = resolveOpenScoutSupportPaths();
|
|
21919
|
-
if (!
|
|
22121
|
+
if (!existsSync26(supportPaths.settingsPath)) {
|
|
21920
22122
|
return dirname16(projectPath);
|
|
21921
22123
|
}
|
|
21922
22124
|
const raw = JSON.parse(readFileSync14(supportPaths.settingsPath, "utf8"));
|
|
@@ -21940,27 +22142,30 @@ function parseNonNegativeInteger(value, fallback) {
|
|
|
21940
22142
|
const parsed = Number.parseInt(value ?? "", 10);
|
|
21941
22143
|
return Number.isFinite(parsed) && parsed >= 0 ? parsed : fallback;
|
|
21942
22144
|
}
|
|
21943
|
-
function
|
|
21944
|
-
|
|
22145
|
+
function resolveLocalAgentScoutCliPath(moduleDirectory = MODULE_DIRECTORY) {
|
|
22146
|
+
const packagedCli = resolve12(moduleDirectory, "..", "..", "bin", "scout.mjs");
|
|
22147
|
+
if (existsSync26(packagedCli))
|
|
22148
|
+
return packagedCli;
|
|
22149
|
+
return resolve12(moduleDirectory, "..", "..", "..", "packages", "cli", "bin", "scout.mjs");
|
|
21945
22150
|
}
|
|
21946
22151
|
function legacyNodeBrokerRelayCommand() {
|
|
21947
|
-
return `node ${JSON.stringify(
|
|
22152
|
+
return `node ${JSON.stringify(resolveLocalAgentScoutCliPath())}`;
|
|
21948
22153
|
}
|
|
21949
22154
|
function brokerRelayCommand() {
|
|
21950
|
-
return `bun ${JSON.stringify(
|
|
22155
|
+
return `bun ${JSON.stringify(resolveLocalAgentScoutCliPath())}`;
|
|
21951
22156
|
}
|
|
21952
22157
|
function titleCaseLocalAgentName(value) {
|
|
21953
22158
|
return value.split(/[-_.\s]+/).filter(Boolean).map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1)).join(" ");
|
|
21954
22159
|
}
|
|
21955
22160
|
function resolveScoutSkillPath() {
|
|
21956
22161
|
const candidatePaths = [
|
|
21957
|
-
|
|
21958
|
-
|
|
21959
|
-
|
|
21960
|
-
|
|
22162
|
+
join28(OPENSCOUT_REPO_ROOT, ".agents", "skills", "scout", "SKILL.md"),
|
|
22163
|
+
join28(process.env.HOME ?? "", ".agents", "skills", "scout", "SKILL.md"),
|
|
22164
|
+
join28(OPENSCOUT_REPO_ROOT, ".agents", "skills", "relay-agent-comms", "SKILL.md"),
|
|
22165
|
+
join28(process.env.HOME ?? "", ".agents", "skills", "relay-agent-comms", "SKILL.md")
|
|
21961
22166
|
];
|
|
21962
22167
|
for (const path2 of candidatePaths) {
|
|
21963
|
-
if (
|
|
22168
|
+
if (existsSync26(path2)) {
|
|
21964
22169
|
return path2;
|
|
21965
22170
|
}
|
|
21966
22171
|
}
|
|
@@ -22157,7 +22362,7 @@ function renderLocalAgentSystemPromptTemplate(template, context, options = {}) {
|
|
|
22157
22362
|
const basePrompt = buildLocalAgentBasePrompt(context);
|
|
22158
22363
|
const projectContext = buildLocalAgentProjectContextPrompt(context);
|
|
22159
22364
|
const collaborationPrompt = buildLocalAgentCollaborationPrompt(context);
|
|
22160
|
-
const protocolPrompt = options.transport === "codex_app_server" || options.transport === "claude_stream_json" || options.transport === "pi_rpc" || options.transport === "grok_acp" || options.transport === "kimi_acp" ? buildLocalAgentDirectProtocolPrompt(context) : buildLocalAgentTmuxProtocolPrompt(context);
|
|
22365
|
+
const protocolPrompt = options.transport === "codex_app_server" || options.transport === "claude_stream_json" || options.transport === "pi_rpc" || options.transport === "grok_acp" || options.transport === "kimi_acp" || options.transport === "devin_acp" ? buildLocalAgentDirectProtocolPrompt(context) : buildLocalAgentTmuxProtocolPrompt(context);
|
|
22161
22366
|
const variables = {
|
|
22162
22367
|
agent_id: context.agentId,
|
|
22163
22368
|
display_name: context.displayName,
|
|
@@ -22269,7 +22474,8 @@ function generatedLocalAgentSystemPromptCandidates(agentId, projectName, project
|
|
|
22269
22474
|
"claude_stream_json",
|
|
22270
22475
|
"pi_rpc",
|
|
22271
22476
|
"grok_acp",
|
|
22272
|
-
"kimi_acp"
|
|
22477
|
+
"kimi_acp",
|
|
22478
|
+
"devin_acp"
|
|
22273
22479
|
];
|
|
22274
22480
|
const candidates = new Set;
|
|
22275
22481
|
for (const relayCommand of relayCommands) {
|
|
@@ -22322,7 +22528,7 @@ function expandHomePath4(value) {
|
|
|
22322
22528
|
return process.env.HOME ?? process.cwd();
|
|
22323
22529
|
}
|
|
22324
22530
|
if (value.startsWith("~/")) {
|
|
22325
|
-
return
|
|
22531
|
+
return join28(process.env.HOME ?? process.cwd(), value.slice(2));
|
|
22326
22532
|
}
|
|
22327
22533
|
return value;
|
|
22328
22534
|
}
|
|
@@ -22346,7 +22552,7 @@ function normalizeTmuxSessionName2(value, agentId) {
|
|
|
22346
22552
|
return normalized || fallback.replace(/[^\w-]+/g, "-").replace(/^-+|-+$/g, "") || "relay-agent";
|
|
22347
22553
|
}
|
|
22348
22554
|
function normalizeLocalAgentHarness(value) {
|
|
22349
|
-
if (value === "codex" || value === "claude" || value === "grok" || value === "grok-acp" || value === "kimi" || value === "pi" || value === "cursor") {
|
|
22555
|
+
if (value === "codex" || value === "claude" || value === "grok" || value === "grok-acp" || value === "kimi" || value === "pi" || value === "cursor" || value === "devin") {
|
|
22350
22556
|
return value;
|
|
22351
22557
|
}
|
|
22352
22558
|
return DEFAULT_LOCAL_AGENT_HARNESS;
|
|
@@ -22361,6 +22567,9 @@ function normalizeLocalAgentTransport(value, harness) {
|
|
|
22361
22567
|
if (harness === "cursor") {
|
|
22362
22568
|
return "cursor_acp";
|
|
22363
22569
|
}
|
|
22570
|
+
if (harness === "devin") {
|
|
22571
|
+
return "devin_acp";
|
|
22572
|
+
}
|
|
22364
22573
|
if (harness === "grok-acp") {
|
|
22365
22574
|
return "grok_acp";
|
|
22366
22575
|
}
|
|
@@ -22376,7 +22585,7 @@ function normalizeLocalAgentTransport(value, harness) {
|
|
|
22376
22585
|
if (value === "pi_rpc") {
|
|
22377
22586
|
return "pi_rpc";
|
|
22378
22587
|
}
|
|
22379
|
-
if (value === "grok_acp" || value === "kimi_acp" || value === "cursor_acp" || value === "opencode_acp") {
|
|
22588
|
+
if (value === "grok_acp" || value === "kimi_acp" || value === "cursor_acp" || value === "opencode_acp" || value === "devin_acp") {
|
|
22380
22589
|
return value;
|
|
22381
22590
|
}
|
|
22382
22591
|
if (value === "cursor_exec") {
|
|
@@ -22739,7 +22948,7 @@ function overrideHarnessProfile(override, harness) {
|
|
|
22739
22948
|
};
|
|
22740
22949
|
}
|
|
22741
22950
|
function normalizeManagedHarness2(value, fallback) {
|
|
22742
|
-
return value === "codex" ? "codex" : value === "claude" ? "claude" : value === "cursor" ? "cursor" : value === "grok" ? "grok" : value === "grok-acp" ? "grok-acp" : value === "kimi" ? "kimi" : value === "pi" ? "pi" : fallback;
|
|
22951
|
+
return value === "codex" ? "codex" : value === "claude" ? "claude" : value === "cursor" ? "cursor" : value === "devin" ? "devin" : value === "grok" ? "grok" : value === "grok-acp" ? "grok-acp" : value === "kimi" ? "kimi" : value === "pi" ? "pi" : fallback;
|
|
22743
22952
|
}
|
|
22744
22953
|
function normalizeLocalHarnessProfiles(agentId, record) {
|
|
22745
22954
|
const defaultHarness = normalizeManagedHarness2(typeof record.defaultHarness === "string" ? record.defaultHarness : record.harness, "claude");
|
|
@@ -23341,7 +23550,7 @@ function isLocalAgentRecordOnline(agentName, record) {
|
|
|
23341
23550
|
if (normalizedRecord.transport === "pi_rpc") {
|
|
23342
23551
|
return isPiRpcAgentAlive(buildPiAgentSessionOptions(agentName, normalizedRecord));
|
|
23343
23552
|
}
|
|
23344
|
-
if (normalizedRecord.transport === "grok_acp" || normalizedRecord.transport === "kimi_acp" || normalizedRecord.transport === "cursor_acp" || normalizedRecord.transport === "opencode_acp") {
|
|
23553
|
+
if (normalizedRecord.transport === "grok_acp" || normalizedRecord.transport === "kimi_acp" || normalizedRecord.transport === "cursor_acp" || normalizedRecord.transport === "opencode_acp" || normalizedRecord.transport === "devin_acp") {
|
|
23345
23554
|
return areHarnessBinariesAvailable(normalizedRecord);
|
|
23346
23555
|
}
|
|
23347
23556
|
return isLocalAgentSessionAlive(normalizedRecord.tmuxSession);
|
|
@@ -23362,7 +23571,7 @@ function buildLocalAgentInitialMessage(projectName, agentName) {
|
|
|
23362
23571
|
return `You are now online as the ${agentName} relay agent for ${projectName}. Announce yourself on the relay with: ${brokerRelayCommand()} send --as ${agentName} "relay agent online \u2014 ready to assist with ${projectName}"`;
|
|
23363
23572
|
}
|
|
23364
23573
|
function scoutReplyContextPath(runtimeDirectory) {
|
|
23365
|
-
return
|
|
23574
|
+
return join28(runtimeDirectory, "scout-reply-context.json");
|
|
23366
23575
|
}
|
|
23367
23576
|
function withScoutReplyContextEnvironment(options) {
|
|
23368
23577
|
return {
|
|
@@ -23469,10 +23678,10 @@ function buildLocalAgentLaunchCommand(agentName, record, projectPath, promptFile
|
|
|
23469
23678
|
const harness = normalizeLocalAgentHarness(record.harness);
|
|
23470
23679
|
const extraArgs = shellQuoteArguments(harness === "claude" ? normalizeClaudeRuntimeLaunchArgs(record.launchArgs) : harness === "grok" ? normalizeGrokRuntimeLaunchArgs(record.launchArgs) : normalizeLaunchArgsForHarness(harness, record.launchArgs));
|
|
23471
23680
|
if (harness === "codex") {
|
|
23472
|
-
return `exec bash ${JSON.stringify(workerScript ??
|
|
23681
|
+
return `exec bash ${JSON.stringify(workerScript ?? join28(relayAgentRuntimeDirectory(agentName), "codex-worker.sh"))}`;
|
|
23473
23682
|
}
|
|
23474
23683
|
if (harness === "pi") {
|
|
23475
|
-
const sessionDir =
|
|
23684
|
+
const sessionDir = join28(relayAgentRuntimeDirectory(agentName), "pi-sessions");
|
|
23476
23685
|
return [
|
|
23477
23686
|
"exec pi",
|
|
23478
23687
|
`--append-system-prompt "$(cat ${JSON.stringify(promptFile)})"`,
|
|
@@ -23512,12 +23721,12 @@ function isShellCommandAvailable(binary) {
|
|
|
23512
23721
|
if (!binary.trim())
|
|
23513
23722
|
return false;
|
|
23514
23723
|
if (binary.includes("/"))
|
|
23515
|
-
return
|
|
23724
|
+
return existsSync26(binary);
|
|
23516
23725
|
const pathValue = process.env.PATH ?? "";
|
|
23517
23726
|
for (const directory of pathValue.split(":")) {
|
|
23518
23727
|
if (!directory)
|
|
23519
23728
|
continue;
|
|
23520
|
-
if (
|
|
23729
|
+
if (existsSync26(join28(directory, binary)))
|
|
23521
23730
|
return true;
|
|
23522
23731
|
}
|
|
23523
23732
|
return false;
|
|
@@ -23557,6 +23766,8 @@ function areHarnessBinariesAvailable(record) {
|
|
|
23557
23766
|
binaries.add("cursor-agent");
|
|
23558
23767
|
if (record.transport === "opencode_acp")
|
|
23559
23768
|
binaries.add("opencode");
|
|
23769
|
+
if (record.transport === "devin_acp")
|
|
23770
|
+
binaries.add("devin");
|
|
23560
23771
|
if (record.transport === "tmux") {
|
|
23561
23772
|
binaries.add("tmux");
|
|
23562
23773
|
}
|
|
@@ -23587,7 +23798,7 @@ async function ensureLocalAgentOnline(agentName, record) {
|
|
|
23587
23798
|
async function ensureLocalAgentOnlineOnce(agentName, record) {
|
|
23588
23799
|
const normalizedRecord = normalizeLocalAgentRecord(agentName, record);
|
|
23589
23800
|
if (isLocalAgentRecordOnline(agentName, normalizedRecord)) {
|
|
23590
|
-
if (normalizedRecord.transport === "grok_acp" || normalizedRecord.transport === "kimi_acp") {
|
|
23801
|
+
if (normalizedRecord.transport === "grok_acp" || normalizedRecord.transport === "kimi_acp" || normalizedRecord.transport === "devin_acp") {
|
|
23591
23802
|
const registry3 = await readLocalAgentRegistry();
|
|
23592
23803
|
registry3[agentName] = {
|
|
23593
23804
|
...normalizedRecord,
|
|
@@ -23612,7 +23823,7 @@ async function ensureLocalAgentOnlineOnce(agentName, record) {
|
|
|
23612
23823
|
await mkdir8(agentRuntimeDir, { recursive: true });
|
|
23613
23824
|
await mkdir8(logsDir, { recursive: true });
|
|
23614
23825
|
if (normalizedRecord.transport === "codex_app_server") {
|
|
23615
|
-
await writeFile7(
|
|
23826
|
+
await writeFile7(join28(agentRuntimeDir, "prompt.txt"), systemPrompt);
|
|
23616
23827
|
await ensureCodexAppServerAgentOnline(buildCodexAgentSessionOptions(agentName, normalizedRecord, systemPrompt));
|
|
23617
23828
|
const registry3 = await readLocalAgentRegistry();
|
|
23618
23829
|
registry3[agentName] = {
|
|
@@ -23624,7 +23835,7 @@ async function ensureLocalAgentOnlineOnce(agentName, record) {
|
|
|
23624
23835
|
return registry3[agentName];
|
|
23625
23836
|
}
|
|
23626
23837
|
if (normalizedRecord.transport === "claude_stream_json") {
|
|
23627
|
-
await writeFile7(
|
|
23838
|
+
await writeFile7(join28(agentRuntimeDir, "prompt.txt"), systemPrompt);
|
|
23628
23839
|
await ensureClaudeStreamJsonAgentOnline(buildClaudeAgentSessionOptions(agentName, normalizedRecord, systemPrompt));
|
|
23629
23840
|
const registry3 = await readLocalAgentRegistry();
|
|
23630
23841
|
registry3[agentName] = {
|
|
@@ -23636,7 +23847,7 @@ async function ensureLocalAgentOnlineOnce(agentName, record) {
|
|
|
23636
23847
|
return registry3[agentName];
|
|
23637
23848
|
}
|
|
23638
23849
|
if (normalizedRecord.transport === "pi_rpc") {
|
|
23639
|
-
await writeFile7(
|
|
23850
|
+
await writeFile7(join28(agentRuntimeDir, "prompt.txt"), systemPrompt);
|
|
23640
23851
|
await ensurePiRpcAgentOnline(buildPiAgentSessionOptions(agentName, normalizedRecord, systemPrompt));
|
|
23641
23852
|
const registry3 = await readLocalAgentRegistry();
|
|
23642
23853
|
registry3[agentName] = {
|
|
@@ -23653,17 +23864,17 @@ async function ensureLocalAgentOnlineOnce(agentName, record) {
|
|
|
23653
23864
|
}
|
|
23654
23865
|
const initialMessage = buildLocalAgentInitialMessage(projectName, agentName);
|
|
23655
23866
|
const bootstrapPrompt = buildLocalAgentBootstrapPrompt(normalizeLocalAgentHarness(normalizedRecord.harness), systemPrompt, initialMessage);
|
|
23656
|
-
const queueDirectory =
|
|
23657
|
-
const processingDirectory =
|
|
23658
|
-
const processedDirectory =
|
|
23659
|
-
const promptFile =
|
|
23660
|
-
const initialFile =
|
|
23661
|
-
const launchScript =
|
|
23662
|
-
const workerScript =
|
|
23663
|
-
const codexSessionIdFile =
|
|
23664
|
-
const stateFile =
|
|
23665
|
-
const stdoutLogFile =
|
|
23666
|
-
const stderrLogFile =
|
|
23867
|
+
const queueDirectory = join28(agentRuntimeDir, "queue");
|
|
23868
|
+
const processingDirectory = join28(queueDirectory, "processing");
|
|
23869
|
+
const processedDirectory = join28(queueDirectory, "processed");
|
|
23870
|
+
const promptFile = join28(agentRuntimeDir, "prompt.txt");
|
|
23871
|
+
const initialFile = join28(agentRuntimeDir, "initial.txt");
|
|
23872
|
+
const launchScript = join28(agentRuntimeDir, "launch.sh");
|
|
23873
|
+
const workerScript = join28(agentRuntimeDir, "codex-worker.sh");
|
|
23874
|
+
const codexSessionIdFile = join28(agentRuntimeDir, "codex-session-id.txt");
|
|
23875
|
+
const stateFile = join28(agentRuntimeDir, "state.json");
|
|
23876
|
+
const stdoutLogFile = join28(logsDir, "stdout.log");
|
|
23877
|
+
const stderrLogFile = join28(logsDir, "stderr.log");
|
|
23667
23878
|
await writeFile7(promptFile, systemPrompt);
|
|
23668
23879
|
await writeFile7(initialFile, bootstrapPrompt);
|
|
23669
23880
|
await writeFile7(stderrLogFile, "");
|
|
@@ -23768,7 +23979,7 @@ async function ensureLocalAgentOnlineOnce(agentName, record) {
|
|
|
23768
23979
|
}
|
|
23769
23980
|
}
|
|
23770
23981
|
if (!sessionOnline) {
|
|
23771
|
-
const stderrTail =
|
|
23982
|
+
const stderrTail = existsSync26(stderrLogFile) ? readFileSync14(stderrLogFile, "utf8").trim().split(/\r?\n/).slice(-10).join(`
|
|
23772
23983
|
`).trim() : "";
|
|
23773
23984
|
throw new Error(stderrTail ? `Relay agent ${agentName} failed to stay online:
|
|
23774
23985
|
${redactSecrets(stderrTail)}` : `Relay agent ${agentName} failed to stay online.`);
|
|
@@ -23831,10 +24042,10 @@ async function restartLocalAgent(agentId, options = {}) {
|
|
|
23831
24042
|
sessionId: sessionName
|
|
23832
24043
|
});
|
|
23833
24044
|
}
|
|
23834
|
-
} else if (normalizedRecord.transport === "grok_acp" || normalizedRecord.transport === "kimi_acp") {
|
|
24045
|
+
} else if (normalizedRecord.transport === "grok_acp" || normalizedRecord.transport === "kimi_acp" || normalizedRecord.transport === "devin_acp") {
|
|
23835
24046
|
for (const sessionName of sessionsToStop) {
|
|
23836
24047
|
await shutdownAcpAgentSession({
|
|
23837
|
-
adapterType: normalizedRecord.transport === "grok_acp" ? "grok-acp" : "kimi-acp",
|
|
24048
|
+
adapterType: normalizedRecord.transport === "grok_acp" ? "grok-acp" : normalizedRecord.transport === "devin_acp" ? "devin-acp" : "kimi-acp",
|
|
23838
24049
|
sessionId: sessionName,
|
|
23839
24050
|
poolKey: localAgentAcpPoolKey(agentId, normalizedRecord)
|
|
23840
24051
|
});
|
|
@@ -24107,10 +24318,10 @@ async function stopLocalAgent(agentId) {
|
|
|
24107
24318
|
sessionId: sessionName
|
|
24108
24319
|
});
|
|
24109
24320
|
}
|
|
24110
|
-
} else if (normalizedRecord.transport === "grok_acp" || normalizedRecord.transport === "kimi_acp") {
|
|
24321
|
+
} else if (normalizedRecord.transport === "grok_acp" || normalizedRecord.transport === "kimi_acp" || normalizedRecord.transport === "devin_acp") {
|
|
24111
24322
|
for (const sessionName of sessionsToStop) {
|
|
24112
24323
|
await shutdownAcpAgentSession({
|
|
24113
|
-
adapterType: normalizedRecord.transport === "grok_acp" ? "grok-acp" : "kimi-acp",
|
|
24324
|
+
adapterType: normalizedRecord.transport === "grok_acp" ? "grok-acp" : normalizedRecord.transport === "devin_acp" ? "devin-acp" : "kimi-acp",
|
|
24114
24325
|
sessionId: sessionName,
|
|
24115
24326
|
poolKey: localAgentAcpPoolKey(agentId, normalizedRecord)
|
|
24116
24327
|
});
|
|
@@ -24159,8 +24370,8 @@ async function restartAllLocalAgents(options = {}) {
|
|
|
24159
24370
|
}
|
|
24160
24371
|
function readPersistedSessionCatalogId(runtimeDir) {
|
|
24161
24372
|
try {
|
|
24162
|
-
const catalogPath =
|
|
24163
|
-
if (
|
|
24373
|
+
const catalogPath = join28(runtimeDir, "session-catalog.json");
|
|
24374
|
+
if (existsSync26(catalogPath)) {
|
|
24164
24375
|
const raw = readFileSync14(catalogPath, "utf8").trim();
|
|
24165
24376
|
if (raw) {
|
|
24166
24377
|
const catalog = JSON.parse(raw);
|
|
@@ -24176,8 +24387,8 @@ function readPersistedSessionCatalogId(runtimeDir) {
|
|
|
24176
24387
|
}
|
|
24177
24388
|
function readPersistedLegacySessionId(runtimeDir, filename) {
|
|
24178
24389
|
try {
|
|
24179
|
-
const legacyPath =
|
|
24180
|
-
if (
|
|
24390
|
+
const legacyPath = join28(runtimeDir, filename);
|
|
24391
|
+
if (existsSync26(legacyPath)) {
|
|
24181
24392
|
const value = readFileSync14(legacyPath, "utf8").trim();
|
|
24182
24393
|
return value || null;
|
|
24183
24394
|
}
|
|
@@ -24453,6 +24664,7 @@ var init_local_agents = __esm(() => {
|
|
|
24453
24664
|
init_kimi_acp_invocation();
|
|
24454
24665
|
init_cursor_acp_invocation();
|
|
24455
24666
|
init_opencode_acp_invocation();
|
|
24667
|
+
init_devin_acp_invocation();
|
|
24456
24668
|
init_acp_agent_invocation();
|
|
24457
24669
|
init_claude_stream_json();
|
|
24458
24670
|
init_codex_app_server2();
|
|
@@ -26781,7 +26993,7 @@ var agentsTable = sqliteTable("agents", {
|
|
|
26781
26993
|
]);
|
|
26782
26994
|
var agentEndpointsTable = sqliteTable("agent_endpoints", {
|
|
26783
26995
|
id: text("id").primaryKey(),
|
|
26784
|
-
agentId: text("agent_id").notNull().references(() =>
|
|
26996
|
+
agentId: text("agent_id").notNull().references(() => actorsTable.id, { onDelete: "cascade" }),
|
|
26785
26997
|
nodeId: text("node_id").notNull().references(() => nodesTable.id, { onDelete: "restrict" }),
|
|
26786
26998
|
harness: text("harness").notNull(),
|
|
26787
26999
|
transport: text("transport").notNull(),
|
|
@@ -26805,7 +27017,7 @@ var agentEndpointsTable = sqliteTable("agent_endpoints", {
|
|
|
26805
27017
|
]);
|
|
26806
27018
|
var runtimeSessionsTable = sqliteTable("runtime_sessions", {
|
|
26807
27019
|
id: text("id").primaryKey(),
|
|
26808
|
-
agentId: text("agent_id").notNull().references(() =>
|
|
27020
|
+
agentId: text("agent_id").notNull().references(() => actorsTable.id, { onDelete: "cascade" }),
|
|
26809
27021
|
endpointId: text("endpoint_id").notNull().references(() => agentEndpointsTable.id, { onDelete: "cascade" }),
|
|
26810
27022
|
nodeId: text("node_id").notNull().references(() => nodesTable.id, { onDelete: "restrict" }),
|
|
26811
27023
|
harness: text("harness").notNull(),
|
|
@@ -26833,7 +27045,7 @@ var runtimeSessionAliasesTable = sqliteTable("runtime_session_aliases", {
|
|
|
26833
27045
|
alias: text("alias").notNull(),
|
|
26834
27046
|
sessionId: text("session_id").notNull().references(() => runtimeSessionsTable.id, { onDelete: "cascade" }),
|
|
26835
27047
|
aliasKind: text("alias_kind").notNull(),
|
|
26836
|
-
agentId: text("agent_id").notNull().references(() =>
|
|
27048
|
+
agentId: text("agent_id").notNull().references(() => actorsTable.id, { onDelete: "cascade" }),
|
|
26837
27049
|
endpointId: text("endpoint_id").notNull().references(() => agentEndpointsTable.id, { onDelete: "cascade" }),
|
|
26838
27050
|
nodeId: text("node_id").notNull().references(() => nodesTable.id, { onDelete: "restrict" }),
|
|
26839
27051
|
harness: text("harness").notNull(),
|
|
@@ -27079,7 +27291,7 @@ var invocationsTable = sqliteTable("invocations", {
|
|
|
27079
27291
|
id: text("id").primaryKey(),
|
|
27080
27292
|
requesterId: text("requester_id").notNull().references(() => actorsTable.id, { onDelete: "restrict" }),
|
|
27081
27293
|
requesterNodeId: text("requester_node_id").notNull().references(() => nodesTable.id, { onDelete: "restrict" }),
|
|
27082
|
-
targetAgentId: text("target_agent_id").notNull().references(() =>
|
|
27294
|
+
targetAgentId: text("target_agent_id").notNull().references(() => actorsTable.id, { onDelete: "restrict" }),
|
|
27083
27295
|
targetNodeId: text("target_node_id").references(() => nodesTable.id, { onDelete: "set null" }),
|
|
27084
27296
|
action: text("action").notNull(),
|
|
27085
27297
|
task: text("task").notNull(),
|
|
@@ -27114,7 +27326,7 @@ var flightsTable = sqliteTable("flights", {
|
|
|
27114
27326
|
id: text("id").primaryKey(),
|
|
27115
27327
|
invocationId: text("invocation_id").notNull().references(() => invocationsTable.id, { onDelete: "cascade" }),
|
|
27116
27328
|
requesterId: text("requester_id").notNull().references(() => actorsTable.id, { onDelete: "restrict" }),
|
|
27117
|
-
targetAgentId: text("target_agent_id").notNull().references(() =>
|
|
27329
|
+
targetAgentId: text("target_agent_id").notNull().references(() => actorsTable.id, { onDelete: "restrict" }),
|
|
27118
27330
|
state: text("state").notNull(),
|
|
27119
27331
|
summary: text("summary"),
|
|
27120
27332
|
output: text("output"),
|
|
@@ -27363,7 +27575,7 @@ var activityItemsTable = sqliteTable("activity_items", {
|
|
|
27363
27575
|
recordId: text("record_id").references(() => collaborationRecordsTable.id, { onDelete: "cascade" }),
|
|
27364
27576
|
actorId: text("actor_id").references(() => actorsTable.id, { onDelete: "set null" }),
|
|
27365
27577
|
counterpartId: text("counterpart_id").references(() => actorsTable.id, { onDelete: "set null" }),
|
|
27366
|
-
agentId: text("agent_id").references(() =>
|
|
27578
|
+
agentId: text("agent_id").references(() => actorsTable.id, { onDelete: "set null" }),
|
|
27367
27579
|
workspaceRoot: text("workspace_root"),
|
|
27368
27580
|
sessionId: text("session_id"),
|
|
27369
27581
|
title: text("title"),
|
|
@@ -27525,7 +27737,7 @@ var missionLogEntriesTable = sqliteTable("mission_log_entries", {
|
|
|
27525
27737
|
var CONTROL_PLANE_RUNTIME_SESSION_SQLITE_SCHEMA = `
|
|
27526
27738
|
CREATE TABLE IF NOT EXISTS runtime_sessions (
|
|
27527
27739
|
id TEXT PRIMARY KEY,
|
|
27528
|
-
agent_id TEXT NOT NULL REFERENCES
|
|
27740
|
+
agent_id TEXT NOT NULL REFERENCES actors(id) ON DELETE CASCADE,
|
|
27529
27741
|
endpoint_id TEXT NOT NULL REFERENCES agent_endpoints(id) ON DELETE CASCADE,
|
|
27530
27742
|
node_id TEXT NOT NULL REFERENCES nodes(id) ON DELETE RESTRICT,
|
|
27531
27743
|
harness TEXT NOT NULL,
|
|
@@ -27548,7 +27760,7 @@ CREATE TABLE IF NOT EXISTS runtime_session_aliases (
|
|
|
27548
27760
|
alias TEXT NOT NULL,
|
|
27549
27761
|
session_id TEXT NOT NULL REFERENCES runtime_sessions(id) ON DELETE CASCADE,
|
|
27550
27762
|
alias_kind TEXT NOT NULL,
|
|
27551
|
-
agent_id TEXT NOT NULL REFERENCES
|
|
27763
|
+
agent_id TEXT NOT NULL REFERENCES actors(id) ON DELETE CASCADE,
|
|
27552
27764
|
endpoint_id TEXT NOT NULL REFERENCES agent_endpoints(id) ON DELETE CASCADE,
|
|
27553
27765
|
node_id TEXT NOT NULL REFERENCES nodes(id) ON DELETE RESTRICT,
|
|
27554
27766
|
harness TEXT NOT NULL,
|
|
@@ -27744,7 +27956,7 @@ CREATE TABLE IF NOT EXISTS agents (
|
|
|
27744
27956
|
|
|
27745
27957
|
CREATE TABLE IF NOT EXISTS agent_endpoints (
|
|
27746
27958
|
id TEXT PRIMARY KEY,
|
|
27747
|
-
agent_id TEXT NOT NULL REFERENCES
|
|
27959
|
+
agent_id TEXT NOT NULL REFERENCES actors(id) ON DELETE CASCADE,
|
|
27748
27960
|
node_id TEXT NOT NULL REFERENCES nodes(id) ON DELETE RESTRICT,
|
|
27749
27961
|
harness TEXT NOT NULL,
|
|
27750
27962
|
transport TEXT NOT NULL,
|
|
@@ -27918,7 +28130,7 @@ CREATE TABLE IF NOT EXISTS invocations (
|
|
|
27918
28130
|
id TEXT PRIMARY KEY,
|
|
27919
28131
|
requester_id TEXT NOT NULL REFERENCES actors(id) ON DELETE RESTRICT,
|
|
27920
28132
|
requester_node_id TEXT NOT NULL REFERENCES nodes(id) ON DELETE RESTRICT,
|
|
27921
|
-
target_agent_id TEXT NOT NULL REFERENCES
|
|
28133
|
+
target_agent_id TEXT NOT NULL REFERENCES actors(id) ON DELETE RESTRICT,
|
|
27922
28134
|
target_node_id TEXT REFERENCES nodes(id) ON DELETE SET NULL,
|
|
27923
28135
|
action TEXT NOT NULL,
|
|
27924
28136
|
task TEXT NOT NULL,
|
|
@@ -27948,7 +28160,7 @@ CREATE TABLE IF NOT EXISTS flights (
|
|
|
27948
28160
|
id TEXT PRIMARY KEY,
|
|
27949
28161
|
invocation_id TEXT NOT NULL REFERENCES invocations(id) ON DELETE CASCADE,
|
|
27950
28162
|
requester_id TEXT NOT NULL REFERENCES actors(id) ON DELETE RESTRICT,
|
|
27951
|
-
target_agent_id TEXT NOT NULL REFERENCES
|
|
28163
|
+
target_agent_id TEXT NOT NULL REFERENCES actors(id) ON DELETE RESTRICT,
|
|
27952
28164
|
state TEXT NOT NULL,
|
|
27953
28165
|
summary TEXT,
|
|
27954
28166
|
output TEXT,
|
|
@@ -28170,7 +28382,7 @@ CREATE TABLE IF NOT EXISTS activity_items (
|
|
|
28170
28382
|
record_id TEXT REFERENCES collaboration_records(id) ON DELETE CASCADE,
|
|
28171
28383
|
actor_id TEXT REFERENCES actors(id) ON DELETE SET NULL,
|
|
28172
28384
|
counterpart_id TEXT REFERENCES actors(id) ON DELETE SET NULL,
|
|
28173
|
-
agent_id TEXT REFERENCES
|
|
28385
|
+
agent_id TEXT REFERENCES actors(id) ON DELETE SET NULL,
|
|
28174
28386
|
workspace_root TEXT,
|
|
28175
28387
|
session_id TEXT,
|
|
28176
28388
|
title TEXT,
|
|
@@ -28757,6 +28969,10 @@ class InMemoryControlRuntime {
|
|
|
28757
28969
|
return;
|
|
28758
28970
|
case "stream.subscribe":
|
|
28759
28971
|
return;
|
|
28972
|
+
case "channel.invite.create":
|
|
28973
|
+
case "channel.invite.revoke":
|
|
28974
|
+
case "channel.invite.redeem":
|
|
28975
|
+
throw new Error(`${command.kind} must be executed by the durable broker command service, not the in-memory registry.`);
|
|
28760
28976
|
default: {
|
|
28761
28977
|
const exhaustive = command;
|
|
28762
28978
|
return exhaustive;
|
|
@@ -44137,7 +44353,10 @@ var MODEL_CONTEXT_WINDOWS = {
|
|
|
44137
44353
|
var RUNTIME_MODEL_CONTEXT_WINDOWS = {
|
|
44138
44354
|
"gpt-6-astra": 1050000,
|
|
44139
44355
|
"grok-4-6": 500000,
|
|
44140
|
-
"grok-4-5": 500000
|
|
44356
|
+
"grok-4-5": 500000,
|
|
44357
|
+
"swe-2-high": 262000,
|
|
44358
|
+
"swe-2-medium": 262000,
|
|
44359
|
+
"swe-2-max": 262000
|
|
44141
44360
|
};
|
|
44142
44361
|
|
|
44143
44362
|
// ../agent-sessions/src/model-catalog.ts
|
|
@@ -44573,14 +44792,14 @@ init_src();
|
|
|
44573
44792
|
// ../runtime/src/provisional-agent-names-config.ts
|
|
44574
44793
|
init_src();
|
|
44575
44794
|
init_user_config();
|
|
44576
|
-
import { existsSync as
|
|
44577
|
-
import { homedir as
|
|
44578
|
-
import { isAbsolute as isAbsolute3, join as
|
|
44795
|
+
import { existsSync as existsSync27, readFileSync as readFileSync15, writeFileSync as writeFileSync9, mkdirSync as mkdirSync9 } from "fs";
|
|
44796
|
+
import { homedir as homedir22 } from "os";
|
|
44797
|
+
import { isAbsolute as isAbsolute3, join as join29, resolve as resolve13 } from "path";
|
|
44579
44798
|
function openScoutHome() {
|
|
44580
|
-
return process.env.OPENSCOUT_HOME ??
|
|
44799
|
+
return process.env.OPENSCOUT_HOME ?? join29(homedir22(), ".openscout");
|
|
44581
44800
|
}
|
|
44582
44801
|
function defaultProvisionalAgentNamesPath() {
|
|
44583
|
-
return
|
|
44802
|
+
return join29(openScoutHome(), "provisional-agent-names.json");
|
|
44584
44803
|
}
|
|
44585
44804
|
function resolveProvisionalAgentNamesMode(config) {
|
|
44586
44805
|
return config.provisionalAgentNamesMode === "extend" ? "extend" : "replace";
|
|
@@ -44625,7 +44844,7 @@ function loadInlineProvisionalAgentNames(config) {
|
|
|
44625
44844
|
}
|
|
44626
44845
|
function loadFileProvisionalAgentNames(config = loadUserConfig()) {
|
|
44627
44846
|
const envFile = process.env.OPENSCOUT_PROVISIONAL_AGENT_NAMES_FILE?.trim();
|
|
44628
|
-
if (envFile &&
|
|
44847
|
+
if (envFile && existsSync27(envFile)) {
|
|
44629
44848
|
const names2 = readProvisionalAgentNamesJsonFile(envFile);
|
|
44630
44849
|
if (names2.length > 0) {
|
|
44631
44850
|
return { names: names2, source: "env-file", sourcePath: envFile };
|
|
@@ -44633,7 +44852,7 @@ function loadFileProvisionalAgentNames(config = loadUserConfig()) {
|
|
|
44633
44852
|
}
|
|
44634
44853
|
if (config.provisionalAgentNamesFile?.trim()) {
|
|
44635
44854
|
const filePath = resolvePoolFilePath(config.provisionalAgentNamesFile);
|
|
44636
|
-
if (
|
|
44855
|
+
if (existsSync27(filePath)) {
|
|
44637
44856
|
const names2 = readProvisionalAgentNamesJsonFile(filePath);
|
|
44638
44857
|
if (names2.length > 0) {
|
|
44639
44858
|
return { names: names2, source: "user-config-file", sourcePath: filePath };
|
|
@@ -44641,7 +44860,7 @@ function loadFileProvisionalAgentNames(config = loadUserConfig()) {
|
|
|
44641
44860
|
}
|
|
44642
44861
|
}
|
|
44643
44862
|
const homeJson = defaultProvisionalAgentNamesPath();
|
|
44644
|
-
if (
|
|
44863
|
+
if (existsSync27(homeJson)) {
|
|
44645
44864
|
const names2 = readProvisionalAgentNamesJsonFile(homeJson);
|
|
44646
44865
|
if (names2.length > 0) {
|
|
44647
44866
|
return { names: names2, source: "home-json", sourcePath: homeJson };
|
|
@@ -45059,7 +45278,8 @@ var directLocalAgentTransports = new Set([
|
|
|
45059
45278
|
"grok_acp",
|
|
45060
45279
|
"kimi_acp",
|
|
45061
45280
|
"cursor_acp",
|
|
45062
|
-
"opencode_acp"
|
|
45281
|
+
"opencode_acp",
|
|
45282
|
+
"devin_acp"
|
|
45063
45283
|
]);
|
|
45064
45284
|
|
|
45065
45285
|
// ../runtime/src/broker-endpoint-selection.ts
|
|
@@ -45625,7 +45845,7 @@ import { Database } from "bun:sqlite";
|
|
|
45625
45845
|
import { mkdirSync as mkdirSync10, readFileSync as readFileSync16 } from "fs";
|
|
45626
45846
|
import { connect as connectHttp2 } from "http2";
|
|
45627
45847
|
import { createPrivateKey as createPrivateKey3, sign as signWithKey } from "crypto";
|
|
45628
|
-
import { dirname as dirname17, join as
|
|
45848
|
+
import { dirname as dirname17, join as join30 } from "path";
|
|
45629
45849
|
var MOBILE_PUSH_SCHEMA = `
|
|
45630
45850
|
CREATE TABLE IF NOT EXISTS mobile_push_registrations (
|
|
45631
45851
|
id TEXT PRIMARY KEY,
|
|
@@ -45653,7 +45873,7 @@ var dbHandle = null;
|
|
|
45653
45873
|
var dbPath = null;
|
|
45654
45874
|
var cachedApnsJwt = null;
|
|
45655
45875
|
function resolveControlPlaneDbPath() {
|
|
45656
|
-
return
|
|
45876
|
+
return join30(resolveOpenScoutSupportPaths().controlHome, "control-plane.sqlite");
|
|
45657
45877
|
}
|
|
45658
45878
|
function ensureMobilePushSchema(database) {
|
|
45659
45879
|
database.exec("PRAGMA busy_timeout = 5000;");
|
|
@@ -46821,9 +47041,9 @@ function normalizeNodeId(value) {
|
|
|
46821
47041
|
|
|
46822
47042
|
// ../web/server/core/pairing/runtime/relay-runtime.ts
|
|
46823
47043
|
init_system_probes();
|
|
46824
|
-
import { existsSync as
|
|
46825
|
-
import { homedir as
|
|
46826
|
-
import { join as
|
|
47044
|
+
import { existsSync as existsSync28, mkdirSync as mkdirSync12 } from "fs";
|
|
47045
|
+
import { homedir as homedir23, networkInterfaces as networkInterfaces2 } from "os";
|
|
47046
|
+
import { join as join31 } from "path";
|
|
46827
47047
|
|
|
46828
47048
|
// ../web/server/core/pairing/runtime/log.ts
|
|
46829
47049
|
import { appendFileSync, mkdirSync as mkdirSync11 } from "fs";
|
|
@@ -47115,14 +47335,14 @@ function parseRelayEnvelope(data) {
|
|
|
47115
47335
|
}
|
|
47116
47336
|
|
|
47117
47337
|
// ../web/server/core/pairing/runtime/relay-runtime.ts
|
|
47118
|
-
var PAIRING_DIR =
|
|
47338
|
+
var PAIRING_DIR = join31(homedir23(), ".scout/pairing");
|
|
47119
47339
|
async function findStoredTailscaleCert(hostname3) {
|
|
47120
|
-
if (!
|
|
47340
|
+
if (!existsSync28(PAIRING_DIR)) {
|
|
47121
47341
|
return null;
|
|
47122
47342
|
}
|
|
47123
|
-
const certPath =
|
|
47124
|
-
const keyPath =
|
|
47125
|
-
if (!
|
|
47343
|
+
const certPath = join31(PAIRING_DIR, `${hostname3}.crt`);
|
|
47344
|
+
const keyPath = join31(PAIRING_DIR, `${hostname3}.key`);
|
|
47345
|
+
if (!existsSync28(certPath) || !existsSync28(keyPath)) {
|
|
47126
47346
|
return null;
|
|
47127
47347
|
}
|
|
47128
47348
|
if (!await storedCertificateLooksPubliclyTrusted(certPath)) {
|
|
@@ -47206,8 +47426,8 @@ function resolveRelayEndpointForTailscaleStatus(port, tailscale2, options = {})
|
|
|
47206
47426
|
}
|
|
47207
47427
|
async function generateTailscaleCerts(hostname3) {
|
|
47208
47428
|
mkdirSync12(PAIRING_DIR, { recursive: true });
|
|
47209
|
-
const certPath =
|
|
47210
|
-
const keyPath =
|
|
47429
|
+
const certPath = join31(PAIRING_DIR, `${hostname3}.crt`);
|
|
47430
|
+
const keyPath = join31(PAIRING_DIR, `${hostname3}.key`);
|
|
47211
47431
|
try {
|
|
47212
47432
|
pairingLog.info("relay", "generating tailscale TLS cert", { hostname: hostname3 });
|
|
47213
47433
|
await execSystemFile("tailscale", ["cert", "--cert-file", certPath, "--key-file", keyPath, hostname3], {
|
|
@@ -47332,7 +47552,7 @@ function parseIPv42(address) {
|
|
|
47332
47552
|
}
|
|
47333
47553
|
|
|
47334
47554
|
// ../web/server/core/pairing/runtime/runtime-state.ts
|
|
47335
|
-
import { existsSync as
|
|
47555
|
+
import { existsSync as existsSync30, mkdirSync as mkdirSync14, readFileSync as readFileSync18, renameSync as renameSync5, unlinkSync, writeFileSync as writeFileSync11 } from "fs";
|
|
47336
47556
|
|
|
47337
47557
|
// ../../node_modules/.bun/@noble+hashes@2.0.1/node_modules/@noble/hashes/utils.js
|
|
47338
47558
|
/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
|
@@ -49368,14 +49588,14 @@ function concat3(...arrays) {
|
|
|
49368
49588
|
return result;
|
|
49369
49589
|
}
|
|
49370
49590
|
// ../web/server/core/pairing/runtime/security/identity.ts
|
|
49371
|
-
import { existsSync as
|
|
49372
|
-
import { join as
|
|
49373
|
-
import { homedir as
|
|
49374
|
-
var PAIRING_DIR2 =
|
|
49375
|
-
var IDENTITY_FILE =
|
|
49376
|
-
var TRUSTED_PEERS_FILE =
|
|
49591
|
+
import { existsSync as existsSync29, mkdirSync as mkdirSync13, readFileSync as readFileSync17, writeFileSync as writeFileSync10 } from "fs";
|
|
49592
|
+
import { join as join32 } from "path";
|
|
49593
|
+
import { homedir as homedir24 } from "os";
|
|
49594
|
+
var PAIRING_DIR2 = join32(homedir24(), ".scout/pairing");
|
|
49595
|
+
var IDENTITY_FILE = join32(PAIRING_DIR2, "identity.json");
|
|
49596
|
+
var TRUSTED_PEERS_FILE = join32(PAIRING_DIR2, "trusted-peers.json");
|
|
49377
49597
|
function loadOrCreateIdentity() {
|
|
49378
|
-
if (
|
|
49598
|
+
if (existsSync29(IDENTITY_FILE)) {
|
|
49379
49599
|
return loadIdentity();
|
|
49380
49600
|
}
|
|
49381
49601
|
return createAndSaveIdentity();
|
|
@@ -49399,7 +49619,7 @@ function createAndSaveIdentity() {
|
|
|
49399
49619
|
return keyPair;
|
|
49400
49620
|
}
|
|
49401
49621
|
function loadTrustedPeers() {
|
|
49402
|
-
if (!
|
|
49622
|
+
if (!existsSync29(TRUSTED_PEERS_FILE))
|
|
49403
49623
|
return new Map;
|
|
49404
49624
|
const data = JSON.parse(readFileSync17(TRUSTED_PEERS_FILE, "utf8"));
|
|
49405
49625
|
return new Map(data.map((p) => [p.publicKey, p]));
|
|
@@ -49593,7 +49813,7 @@ function trustedPeerCount() {
|
|
|
49593
49813
|
// ../web/server/core/pairing/runtime/runtime-state.ts
|
|
49594
49814
|
function readPairingRuntimeSnapshot() {
|
|
49595
49815
|
const { runtimeStatePath } = pairingPaths();
|
|
49596
|
-
if (!
|
|
49816
|
+
if (!existsSync30(runtimeStatePath)) {
|
|
49597
49817
|
return null;
|
|
49598
49818
|
}
|
|
49599
49819
|
try {
|
|
@@ -49622,7 +49842,7 @@ function clearPairingRuntimeSnapshot() {
|
|
|
49622
49842
|
}
|
|
49623
49843
|
function readPairingRuntimePid() {
|
|
49624
49844
|
const { runtimePidPath } = pairingPaths();
|
|
49625
|
-
if (!
|
|
49845
|
+
if (!existsSync30(runtimePidPath)) {
|
|
49626
49846
|
return null;
|
|
49627
49847
|
}
|
|
49628
49848
|
try {
|
|
@@ -49702,7 +49922,7 @@ function writeJsonAtomically(filePath, value) {
|
|
|
49702
49922
|
}
|
|
49703
49923
|
|
|
49704
49924
|
// ../web/server/core/pairing/runtime/runtime.ts
|
|
49705
|
-
import { homedir as
|
|
49925
|
+
import { homedir as homedir42 } from "os";
|
|
49706
49926
|
|
|
49707
49927
|
// ../agent-sessions/src/index.ts
|
|
49708
49928
|
init_registry2();
|
|
@@ -49932,7 +50152,7 @@ function stringifyUnknown(value) {
|
|
|
49932
50152
|
return String(value);
|
|
49933
50153
|
}
|
|
49934
50154
|
}
|
|
49935
|
-
function
|
|
50155
|
+
function isRecord10(value) {
|
|
49936
50156
|
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
49937
50157
|
}
|
|
49938
50158
|
function maybeString(value) {
|
|
@@ -49975,7 +50195,7 @@ function renderContentPartsText(content) {
|
|
|
49975
50195
|
if (typeof entry === "string") {
|
|
49976
50196
|
return entry;
|
|
49977
50197
|
}
|
|
49978
|
-
if (!
|
|
50198
|
+
if (!isRecord10(entry)) {
|
|
49979
50199
|
return "";
|
|
49980
50200
|
}
|
|
49981
50201
|
if (typeof entry.text === "string") {
|
|
@@ -50188,7 +50408,7 @@ class ClaudeCodeHistoryParser {
|
|
|
50188
50408
|
if (recordCwd && !this.session.cwd) {
|
|
50189
50409
|
this.session.cwd = recordCwd;
|
|
50190
50410
|
}
|
|
50191
|
-
const message =
|
|
50411
|
+
const message = isRecord10(record.message) ? record.message : null;
|
|
50192
50412
|
const model = maybeString(message?.model);
|
|
50193
50413
|
if (model && this.session.model !== model) {
|
|
50194
50414
|
this.session.model = model;
|
|
@@ -50207,13 +50427,13 @@ class ClaudeCodeHistoryParser {
|
|
|
50207
50427
|
}
|
|
50208
50428
|
readClaudeUsageEntry(record) {
|
|
50209
50429
|
const type = maybeString(record.type);
|
|
50210
|
-
const message =
|
|
50430
|
+
const message = isRecord10(record.message) ? record.message : null;
|
|
50211
50431
|
const role = maybeString(message?.role);
|
|
50212
50432
|
if (type !== "assistant" && role !== "assistant") {
|
|
50213
50433
|
return null;
|
|
50214
50434
|
}
|
|
50215
|
-
const usage =
|
|
50216
|
-
const serverToolUse =
|
|
50435
|
+
const usage = isRecord10(message?.usage) ? message.usage : null;
|
|
50436
|
+
const serverToolUse = isRecord10(usage?.server_tool_use) ? usage.server_tool_use : null;
|
|
50217
50437
|
const inputTokens = maybeNumber(usage?.input_tokens) ?? 0;
|
|
50218
50438
|
const cacheReadInputTokens = maybeNumber(usage?.cache_read_input_tokens) ?? 0;
|
|
50219
50439
|
const cacheCreationInputTokens = maybeNumber(usage?.cache_creation_input_tokens) ?? 0;
|
|
@@ -50312,10 +50532,10 @@ class ClaudeCodeHistoryParser {
|
|
|
50312
50532
|
return changed;
|
|
50313
50533
|
}
|
|
50314
50534
|
ensureObserveMetaRecord(key) {
|
|
50315
|
-
const providerMeta =
|
|
50535
|
+
const providerMeta = isRecord10(this.session.providerMeta) ? this.session.providerMeta : {};
|
|
50316
50536
|
this.session.providerMeta = providerMeta;
|
|
50317
50537
|
const existing = providerMeta[key];
|
|
50318
|
-
if (
|
|
50538
|
+
if (isRecord10(existing)) {
|
|
50319
50539
|
return existing;
|
|
50320
50540
|
}
|
|
50321
50541
|
const next = {};
|
|
@@ -50788,7 +51008,7 @@ class PiHistoryParser {
|
|
|
50788
51008
|
let record;
|
|
50789
51009
|
try {
|
|
50790
51010
|
const parsed = JSON.parse(trimmed);
|
|
50791
|
-
if (!
|
|
51011
|
+
if (!isRecord10(parsed)) {
|
|
50792
51012
|
this.skippedLineCount += 1;
|
|
50793
51013
|
return;
|
|
50794
51014
|
}
|
|
@@ -50831,7 +51051,7 @@ class PiHistoryParser {
|
|
|
50831
51051
|
}
|
|
50832
51052
|
return true;
|
|
50833
51053
|
}
|
|
50834
|
-
if (type !== "message" || !
|
|
51054
|
+
if (type !== "message" || !isRecord10(record.message)) {
|
|
50835
51055
|
return false;
|
|
50836
51056
|
}
|
|
50837
51057
|
const message = record.message;
|
|
@@ -50887,7 +51107,7 @@ class PiHistoryParser {
|
|
|
50887
51107
|
const content = Array.isArray(message.content) ? message.content : [];
|
|
50888
51108
|
let hasOpenToolCall = false;
|
|
50889
51109
|
for (const part of content) {
|
|
50890
|
-
if (!
|
|
51110
|
+
if (!isRecord10(part))
|
|
50891
51111
|
continue;
|
|
50892
51112
|
const type = maybeString(part.type);
|
|
50893
51113
|
if (type === "thinking") {
|
|
@@ -50959,7 +51179,7 @@ class PiHistoryParser {
|
|
|
50959
51179
|
providerMeta.provider = provider;
|
|
50960
51180
|
changed = true;
|
|
50961
51181
|
}
|
|
50962
|
-
if (
|
|
51182
|
+
if (isRecord10(message.usage)) {
|
|
50963
51183
|
const usage = this.ensureObserveMetaRecord("observeUsage");
|
|
50964
51184
|
const inputTokens = maybeNumber(message.usage.input);
|
|
50965
51185
|
const outputTokens = maybeNumber(message.usage.output);
|
|
@@ -51055,7 +51275,7 @@ class PiHistoryParser {
|
|
|
51055
51275
|
});
|
|
51056
51276
|
}
|
|
51057
51277
|
buildAction(toolName2, toolCallId, input) {
|
|
51058
|
-
if (toolName2 === "bash" &&
|
|
51278
|
+
if (toolName2 === "bash" && isRecord10(input)) {
|
|
51059
51279
|
return {
|
|
51060
51280
|
kind: "command",
|
|
51061
51281
|
command: maybeString(input.command) ?? "",
|
|
@@ -51063,7 +51283,7 @@ class PiHistoryParser {
|
|
|
51063
51283
|
output: ""
|
|
51064
51284
|
};
|
|
51065
51285
|
}
|
|
51066
|
-
if ((toolName2 === "edit" || toolName2 === "write") &&
|
|
51286
|
+
if ((toolName2 === "edit" || toolName2 === "write") && isRecord10(input)) {
|
|
51067
51287
|
return {
|
|
51068
51288
|
kind: "file_change",
|
|
51069
51289
|
path: maybeString(input.file_path) ?? maybeString(input.path) ?? "",
|
|
@@ -51082,14 +51302,14 @@ class PiHistoryParser {
|
|
|
51082
51302
|
};
|
|
51083
51303
|
}
|
|
51084
51304
|
ensureProviderMeta() {
|
|
51085
|
-
const providerMeta =
|
|
51305
|
+
const providerMeta = isRecord10(this.session.providerMeta) ? this.session.providerMeta : {};
|
|
51086
51306
|
this.session.providerMeta = providerMeta;
|
|
51087
51307
|
return providerMeta;
|
|
51088
51308
|
}
|
|
51089
51309
|
ensureObserveMetaRecord(key) {
|
|
51090
51310
|
const providerMeta = this.ensureProviderMeta();
|
|
51091
51311
|
const existing = providerMeta[key];
|
|
51092
|
-
if (
|
|
51312
|
+
if (isRecord10(existing)) {
|
|
51093
51313
|
return existing;
|
|
51094
51314
|
}
|
|
51095
51315
|
const next = {};
|
|
@@ -51161,7 +51381,7 @@ class CodexHistoryParser {
|
|
|
51161
51381
|
let record;
|
|
51162
51382
|
try {
|
|
51163
51383
|
const parsed = JSON.parse(trimmed);
|
|
51164
|
-
if (!
|
|
51384
|
+
if (!isRecord10(parsed)) {
|
|
51165
51385
|
skippedLineCount += 1;
|
|
51166
51386
|
continue;
|
|
51167
51387
|
}
|
|
@@ -51213,7 +51433,7 @@ class CodexHistoryParser {
|
|
|
51213
51433
|
}
|
|
51214
51434
|
}
|
|
51215
51435
|
handleSessionMeta(record, capturedAt) {
|
|
51216
|
-
const payload =
|
|
51436
|
+
const payload = isRecord10(record.payload) ? record.payload : {};
|
|
51217
51437
|
let changed = false;
|
|
51218
51438
|
const providerMeta = this.ensureProviderMeta();
|
|
51219
51439
|
const externalSessionId = maybeString(payload.id);
|
|
@@ -51229,7 +51449,7 @@ class CodexHistoryParser {
|
|
|
51229
51449
|
}
|
|
51230
51450
|
changed = true;
|
|
51231
51451
|
}
|
|
51232
|
-
const git2 =
|
|
51452
|
+
const git2 = isRecord10(payload.git) ? payload.git : null;
|
|
51233
51453
|
const runtime = this.ensureObserveMetaRecord("observeRuntime");
|
|
51234
51454
|
changed = this.assignObserveString(runtime, "originator", payload.originator) || changed;
|
|
51235
51455
|
changed = this.assignObserveString(runtime, "cliVersion", payload.cli_version) || changed;
|
|
@@ -51244,7 +51464,7 @@ class CodexHistoryParser {
|
|
|
51244
51464
|
}
|
|
51245
51465
|
}
|
|
51246
51466
|
handleTurnContext(record, capturedAt) {
|
|
51247
|
-
const payload =
|
|
51467
|
+
const payload = isRecord10(record.payload) ? record.payload : {};
|
|
51248
51468
|
let changed = false;
|
|
51249
51469
|
const cwd = maybeString(payload.cwd);
|
|
51250
51470
|
if (cwd && this.session.cwd !== cwd) {
|
|
@@ -51262,7 +51482,7 @@ class CodexHistoryParser {
|
|
|
51262
51482
|
changed = this.assignObserveString(runtime, "timezone", payload.timezone) || changed;
|
|
51263
51483
|
changed = this.assignObserveString(runtime, "effort", payload.effort) || changed;
|
|
51264
51484
|
changed = this.assignObserveString(runtime, "personality", payload.personality) || changed;
|
|
51265
|
-
if (
|
|
51485
|
+
if (isRecord10(payload.sandbox_policy) && runtime.sandboxPolicy !== payload.sandbox_policy) {
|
|
51266
51486
|
runtime.sandboxPolicy = payload.sandbox_policy;
|
|
51267
51487
|
changed = true;
|
|
51268
51488
|
}
|
|
@@ -51271,7 +51491,7 @@ class CodexHistoryParser {
|
|
|
51271
51491
|
}
|
|
51272
51492
|
}
|
|
51273
51493
|
handleEventMessage(record, capturedAt) {
|
|
51274
|
-
const payload =
|
|
51494
|
+
const payload = isRecord10(record.payload) ? record.payload : {};
|
|
51275
51495
|
const eventType = maybeString(payload.type);
|
|
51276
51496
|
if (!eventType) {
|
|
51277
51497
|
return;
|
|
@@ -51310,7 +51530,7 @@ class CodexHistoryParser {
|
|
|
51310
51530
|
}
|
|
51311
51531
|
}
|
|
51312
51532
|
handleResponseItem(record, capturedAt) {
|
|
51313
|
-
const payload =
|
|
51533
|
+
const payload = isRecord10(record.payload) ? record.payload : {};
|
|
51314
51534
|
const itemType = maybeString(payload.type);
|
|
51315
51535
|
if (!itemType) {
|
|
51316
51536
|
return;
|
|
@@ -51410,7 +51630,7 @@ class CodexHistoryParser {
|
|
|
51410
51630
|
}
|
|
51411
51631
|
}
|
|
51412
51632
|
buildAction(toolName2, toolCallId, input) {
|
|
51413
|
-
const inputRecord =
|
|
51633
|
+
const inputRecord = isRecord10(input) ? input : {};
|
|
51414
51634
|
if (toolName2 === "exec_command") {
|
|
51415
51635
|
return {
|
|
51416
51636
|
kind: "command",
|
|
@@ -51635,8 +51855,8 @@ class CodexHistoryParser {
|
|
|
51635
51855
|
return false;
|
|
51636
51856
|
}
|
|
51637
51857
|
const metadata = this.ensureObserveMetaRecord("observeHostMetadata");
|
|
51638
|
-
const directives = Array.isArray(metadata.directives) ? metadata.directives.filter(
|
|
51639
|
-
const memoryCitations = Array.isArray(metadata.memoryCitations) ? metadata.memoryCitations.filter(
|
|
51858
|
+
const directives = Array.isArray(metadata.directives) ? metadata.directives.filter(isRecord10) : [];
|
|
51859
|
+
const memoryCitations = Array.isArray(metadata.memoryCitations) ? metadata.memoryCitations.filter(isRecord10) : [];
|
|
51640
51860
|
for (const entry of fresh) {
|
|
51641
51861
|
if (entry.kind === "directive") {
|
|
51642
51862
|
directives.push({
|
|
@@ -51688,14 +51908,14 @@ class CodexHistoryParser {
|
|
|
51688
51908
|
});
|
|
51689
51909
|
}
|
|
51690
51910
|
ensureProviderMeta() {
|
|
51691
|
-
const providerMeta =
|
|
51911
|
+
const providerMeta = isRecord10(this.session.providerMeta) ? this.session.providerMeta : {};
|
|
51692
51912
|
this.session.providerMeta = providerMeta;
|
|
51693
51913
|
return providerMeta;
|
|
51694
51914
|
}
|
|
51695
51915
|
ensureObserveMetaRecord(key) {
|
|
51696
51916
|
const providerMeta = this.ensureProviderMeta();
|
|
51697
51917
|
const existing = providerMeta[key];
|
|
51698
|
-
if (
|
|
51918
|
+
if (isRecord10(existing)) {
|
|
51699
51919
|
return existing;
|
|
51700
51920
|
}
|
|
51701
51921
|
const next = {};
|
|
@@ -51758,9 +51978,9 @@ function createHistorySessionSnapshot(input) {
|
|
|
51758
51978
|
};
|
|
51759
51979
|
}
|
|
51760
51980
|
// ../agent-sessions/src/adapters/claude-code/adapter.ts
|
|
51761
|
-
import { existsSync as
|
|
51762
|
-
import { homedir as
|
|
51763
|
-
import { delimiter as delimiter3, join as
|
|
51981
|
+
import { existsSync as existsSync32, readdirSync as readdirSync5, statSync as statSync8 } from "fs";
|
|
51982
|
+
import { homedir as homedir26 } from "os";
|
|
51983
|
+
import { delimiter as delimiter3, join as join34 } from "path";
|
|
51764
51984
|
|
|
51765
51985
|
// ../agent-sessions/src/protocol/live-normalizer-context.ts
|
|
51766
51986
|
function createLiveNormalizerContext(sessionId) {
|
|
@@ -51772,9 +51992,9 @@ function createLiveNormalizerContext(sessionId) {
|
|
|
51772
51992
|
}
|
|
51773
51993
|
|
|
51774
51994
|
// ../agent-sessions/src/adapters/claude-code/team-topology.ts
|
|
51775
|
-
import { existsSync as
|
|
51776
|
-
import { homedir as
|
|
51777
|
-
import { basename as basename12, dirname as dirname19, join as
|
|
51995
|
+
import { existsSync as existsSync31, readdirSync as readdirSync4, readFileSync as readFileSync19, statSync as statSync7 } from "fs";
|
|
51996
|
+
import { homedir as homedir25 } from "os";
|
|
51997
|
+
import { basename as basename12, dirname as dirname19, join as join33, relative as relative3 } from "path";
|
|
51778
51998
|
var TOPOLOGY_SCHEMA_VERSION2 = "openscout.observed-harness-topology.v1";
|
|
51779
51999
|
var CLAUDE_TOPOLOGY_SOURCE = "claude-code-agent-teams";
|
|
51780
52000
|
var SESSION_ID_KEYS = new Set([
|
|
@@ -51798,13 +52018,13 @@ var CWD_KEYS = new Set([
|
|
|
51798
52018
|
function isObject2(value) {
|
|
51799
52019
|
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
51800
52020
|
}
|
|
51801
|
-
function
|
|
52021
|
+
function stringValue7(value) {
|
|
51802
52022
|
return typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined;
|
|
51803
52023
|
}
|
|
51804
|
-
function
|
|
52024
|
+
function stringArray6(value) {
|
|
51805
52025
|
if (!Array.isArray(value))
|
|
51806
52026
|
return [];
|
|
51807
|
-
return value.map((entry) =>
|
|
52027
|
+
return value.map((entry) => stringValue7(entry)).filter((entry) => Boolean(entry));
|
|
51808
52028
|
}
|
|
51809
52029
|
function keyToken(key) {
|
|
51810
52030
|
return key.replace(/[^a-zA-Z0-9_]/g, "").toLowerCase();
|
|
@@ -51838,23 +52058,23 @@ function statIsFile2(path2) {
|
|
|
51838
52058
|
}
|
|
51839
52059
|
}
|
|
51840
52060
|
function readTeamConfigs(homeDir) {
|
|
51841
|
-
const teamsRoot =
|
|
51842
|
-
if (!
|
|
52061
|
+
const teamsRoot = join33(homeDir, ".claude", "teams");
|
|
52062
|
+
if (!existsSync31(teamsRoot) || !statIsDirectory2(teamsRoot)) {
|
|
51843
52063
|
return [];
|
|
51844
52064
|
}
|
|
51845
52065
|
const teams = [];
|
|
51846
52066
|
for (const entry of readdirSync4(teamsRoot)) {
|
|
51847
|
-
const teamDir =
|
|
52067
|
+
const teamDir = join33(teamsRoot, entry);
|
|
51848
52068
|
if (!statIsDirectory2(teamDir)) {
|
|
51849
52069
|
continue;
|
|
51850
52070
|
}
|
|
51851
|
-
const configPath =
|
|
52071
|
+
const configPath = join33(teamDir, "config.json");
|
|
51852
52072
|
const config = readJsonObject(configPath);
|
|
51853
52073
|
if (!config) {
|
|
51854
52074
|
continue;
|
|
51855
52075
|
}
|
|
51856
52076
|
teams.push({
|
|
51857
|
-
teamName:
|
|
52077
|
+
teamName: stringValue7(config.name) ?? stringValue7(config.teamName) ?? entry,
|
|
51858
52078
|
configPath,
|
|
51859
52079
|
config
|
|
51860
52080
|
});
|
|
@@ -51878,7 +52098,7 @@ function objectContainsKeyedValue(value, expected, keys, seen = new Set) {
|
|
|
51878
52098
|
seen.add(value);
|
|
51879
52099
|
for (const [key, nested] of Object.entries(value)) {
|
|
51880
52100
|
const normalizedKey = keyToken(key);
|
|
51881
|
-
if (keys.has(normalizedKey) &&
|
|
52101
|
+
if (keys.has(normalizedKey) && stringValue7(nested) === expected) {
|
|
51882
52102
|
return true;
|
|
51883
52103
|
}
|
|
51884
52104
|
if (objectContainsKeyedValue(nested, expected, keys, seen)) {
|
|
@@ -51912,7 +52132,7 @@ function asMemberEntries(value) {
|
|
|
51912
52132
|
}
|
|
51913
52133
|
function firstString2(record, keys) {
|
|
51914
52134
|
for (const key of keys) {
|
|
51915
|
-
const value =
|
|
52135
|
+
const value = stringValue7(record[key]);
|
|
51916
52136
|
if (value)
|
|
51917
52137
|
return value;
|
|
51918
52138
|
}
|
|
@@ -51937,7 +52157,7 @@ function firstStringDeepForKeys(value, keys, seen = new Set) {
|
|
|
51937
52157
|
seen.add(value);
|
|
51938
52158
|
for (const [key, nested] of Object.entries(value)) {
|
|
51939
52159
|
if (keys.has(keyToken(key))) {
|
|
51940
|
-
const direct =
|
|
52160
|
+
const direct = stringValue7(nested);
|
|
51941
52161
|
if (direct)
|
|
51942
52162
|
return direct;
|
|
51943
52163
|
}
|
|
@@ -51986,8 +52206,8 @@ function membersFromConfig(team, groupId, configRefId) {
|
|
|
51986
52206
|
return { agents, relationships, agentByExternal };
|
|
51987
52207
|
}
|
|
51988
52208
|
function readTaskFiles(tasksRoot, teamName) {
|
|
51989
|
-
const teamTasksRoot =
|
|
51990
|
-
if (!
|
|
52209
|
+
const teamTasksRoot = join33(tasksRoot, teamName);
|
|
52210
|
+
if (!existsSync31(teamTasksRoot) || !statIsDirectory2(teamTasksRoot)) {
|
|
51991
52211
|
return [];
|
|
51992
52212
|
}
|
|
51993
52213
|
const result = [];
|
|
@@ -51997,7 +52217,7 @@ function readTaskFiles(tasksRoot, teamName) {
|
|
|
51997
52217
|
if (!current)
|
|
51998
52218
|
continue;
|
|
51999
52219
|
for (const entry of readdirSync4(current)) {
|
|
52000
|
-
const path2 =
|
|
52220
|
+
const path2 = join33(current, entry);
|
|
52001
52221
|
if (statIsDirectory2(path2)) {
|
|
52002
52222
|
stack.push(path2);
|
|
52003
52223
|
} else if (statIsFile2(path2)) {
|
|
@@ -52032,7 +52252,7 @@ function parseTaskFile(taskPath, teamName, tasksRoot, sourceRef) {
|
|
|
52032
52252
|
} catch {
|
|
52033
52253
|
return null;
|
|
52034
52254
|
}
|
|
52035
|
-
const relativePath = relative3(
|
|
52255
|
+
const relativePath = relative3(join33(tasksRoot, teamName), taskPath);
|
|
52036
52256
|
const fallbackId = relativePath.replace(/\.[^.]+$/u, "");
|
|
52037
52257
|
const fallbackTitle = firstMarkdownTitle(raw) ?? basename12(fallbackId);
|
|
52038
52258
|
const inferredState = inferTaskStateFromPath(dirname19(relativePath));
|
|
@@ -52048,9 +52268,9 @@ function parseTaskFile(taskPath, teamName, tasksRoot, sourceRef) {
|
|
|
52048
52268
|
const state = parsed ? firstString2(parsed, ["state", "status"]) ?? inferredState : inferredState;
|
|
52049
52269
|
const rawAssignee = parsed ? firstString2(parsed, ["assigneeId", "assignee", "owner", "ownerId", "agentId", "assignedTo"]) : undefined;
|
|
52050
52270
|
const rawDependencies = parsed ? [
|
|
52051
|
-
...
|
|
52052
|
-
...
|
|
52053
|
-
...
|
|
52271
|
+
...stringArray6(parsed.dependencies),
|
|
52272
|
+
...stringArray6(parsed.dependsOn),
|
|
52273
|
+
...stringArray6(parsed.blockedBy)
|
|
52054
52274
|
] : [];
|
|
52055
52275
|
return {
|
|
52056
52276
|
id: `claude-task:${stableSegment2(teamName)}:${stableSegment2(externalId)}`,
|
|
@@ -52066,7 +52286,7 @@ function parseTaskFile(taskPath, teamName, tasksRoot, sourceRef) {
|
|
|
52066
52286
|
};
|
|
52067
52287
|
}
|
|
52068
52288
|
function tasksFromFiles(homeDir, teamName, agentByExternal) {
|
|
52069
|
-
const tasksRoot =
|
|
52289
|
+
const tasksRoot = join33(homeDir, ".claude", "tasks");
|
|
52070
52290
|
const taskFiles = readTaskFiles(tasksRoot, teamName);
|
|
52071
52291
|
const sourceRefs = [];
|
|
52072
52292
|
const parsedTasks = [];
|
|
@@ -52154,7 +52374,7 @@ function leaderAgentForTeam(team, groupId, configRefId, options) {
|
|
|
52154
52374
|
};
|
|
52155
52375
|
}
|
|
52156
52376
|
function readClaudeAgentTeamTopology(options = {}) {
|
|
52157
|
-
const homeDir = options.homeDir ??
|
|
52377
|
+
const homeDir = options.homeDir ?? homedir25();
|
|
52158
52378
|
const teams = readTeamConfigs(homeDir).filter((team) => teamMatches(team, options));
|
|
52159
52379
|
if (teams.length === 0) {
|
|
52160
52380
|
return null;
|
|
@@ -52232,7 +52452,7 @@ function record(value) {
|
|
|
52232
52452
|
function arrayValue(value) {
|
|
52233
52453
|
return Array.isArray(value) ? value : [];
|
|
52234
52454
|
}
|
|
52235
|
-
function
|
|
52455
|
+
function stringValue8(value) {
|
|
52236
52456
|
return typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined;
|
|
52237
52457
|
}
|
|
52238
52458
|
function numberValue3(value) {
|
|
@@ -52259,7 +52479,7 @@ function readString4(source, keys) {
|
|
|
52259
52479
|
if (!source)
|
|
52260
52480
|
return;
|
|
52261
52481
|
for (const key of keys) {
|
|
52262
|
-
const value =
|
|
52482
|
+
const value = stringValue8(source[key]);
|
|
52263
52483
|
if (value !== undefined)
|
|
52264
52484
|
return value;
|
|
52265
52485
|
}
|
|
@@ -52270,7 +52490,7 @@ function timestampValue(value) {
|
|
|
52270
52490
|
if (parsedEpoch !== undefined) {
|
|
52271
52491
|
return parsedEpoch;
|
|
52272
52492
|
}
|
|
52273
|
-
const text2 =
|
|
52493
|
+
const text2 = stringValue8(value);
|
|
52274
52494
|
if (!text2)
|
|
52275
52495
|
return;
|
|
52276
52496
|
const parsed = Date.parse(text2);
|
|
@@ -53361,7 +53581,7 @@ Referenced files: ${prompt.files.join(", ")}` });
|
|
|
53361
53581
|
this.setStatus("error");
|
|
53362
53582
|
}
|
|
53363
53583
|
}
|
|
53364
|
-
var
|
|
53584
|
+
var createAdapter7 = (config) => new ClaudeCodeAdapter(config);
|
|
53365
53585
|
async function waitForSubprocessExit(child, timeoutMs) {
|
|
53366
53586
|
return await child.waitForExit(timeoutMs);
|
|
53367
53587
|
}
|
|
@@ -53371,8 +53591,8 @@ function resolveClaudeResumeContext(config) {
|
|
|
53371
53591
|
if (!resumeId) {
|
|
53372
53592
|
return null;
|
|
53373
53593
|
}
|
|
53374
|
-
const projectsRoot =
|
|
53375
|
-
if (!
|
|
53594
|
+
const projectsRoot = join34(homedir26(), ".claude", "projects");
|
|
53595
|
+
if (!existsSync32(projectsRoot)) {
|
|
53376
53596
|
return null;
|
|
53377
53597
|
}
|
|
53378
53598
|
let projectSlugs;
|
|
@@ -53382,8 +53602,8 @@ function resolveClaudeResumeContext(config) {
|
|
|
53382
53602
|
return null;
|
|
53383
53603
|
}
|
|
53384
53604
|
for (const slug of projectSlugs) {
|
|
53385
|
-
const sessionPath =
|
|
53386
|
-
if (!
|
|
53605
|
+
const sessionPath = join34(projectsRoot, slug, `${resumeId}.jsonl`);
|
|
53606
|
+
if (!existsSync32(sessionPath)) {
|
|
53387
53607
|
continue;
|
|
53388
53608
|
}
|
|
53389
53609
|
const cwd = decodeClaudeProjectsSlug3(slug);
|
|
@@ -53423,7 +53643,7 @@ function resolveExecutableFromPath(command, env) {
|
|
|
53423
53643
|
for (const directory of pathValue.split(delimiter3)) {
|
|
53424
53644
|
if (!directory)
|
|
53425
53645
|
continue;
|
|
53426
|
-
const candidate =
|
|
53646
|
+
const candidate = join34(directory, command);
|
|
53427
53647
|
try {
|
|
53428
53648
|
if (statSync8(candidate).isFile()) {
|
|
53429
53649
|
return candidate;
|
|
@@ -53434,8 +53654,8 @@ function resolveExecutableFromPath(command, env) {
|
|
|
53434
53654
|
}
|
|
53435
53655
|
// ../agent-sessions/src/adapters/codex/adapter.ts
|
|
53436
53656
|
init_codex_app_server();
|
|
53437
|
-
import { homedir as
|
|
53438
|
-
import { join as
|
|
53657
|
+
import { homedir as homedir27 } from "os";
|
|
53658
|
+
import { join as join35 } from "path";
|
|
53439
53659
|
|
|
53440
53660
|
// ../agent-sessions/src/adapters/codex/normalizer.ts
|
|
53441
53661
|
init_normalizer();
|
|
@@ -54283,7 +54503,7 @@ class CodexAdapter extends BaseAdapter {
|
|
|
54283
54503
|
sequence = 0;
|
|
54284
54504
|
constructor(config) {
|
|
54285
54505
|
super(config);
|
|
54286
|
-
const runtimeRoot =
|
|
54506
|
+
const runtimeRoot = join35(homedir27(), ".scout/pairing", "codex", this.session.id);
|
|
54287
54507
|
this.observedTopology = new CodexObservedTopologyTracker({
|
|
54288
54508
|
cwd: config.cwd ?? process.cwd(),
|
|
54289
54509
|
homeDir: config.env?.HOME,
|
|
@@ -54295,8 +54515,8 @@ class CodexAdapter extends BaseAdapter {
|
|
|
54295
54515
|
model: this.session.model,
|
|
54296
54516
|
providerMeta: {
|
|
54297
54517
|
...this.session.providerMeta ?? {},
|
|
54298
|
-
stdoutLogFile:
|
|
54299
|
-
stderrLogFile:
|
|
54518
|
+
stdoutLogFile: join35(runtimeRoot, "logs/stdout.log"),
|
|
54519
|
+
stderrLogFile: join35(runtimeRoot, "logs/stderr.log")
|
|
54300
54520
|
}
|
|
54301
54521
|
});
|
|
54302
54522
|
}
|
|
@@ -54355,7 +54575,7 @@ class CodexAdapter extends BaseAdapter {
|
|
|
54355
54575
|
this.setStatus("closed");
|
|
54356
54576
|
}
|
|
54357
54577
|
get codexOptions() {
|
|
54358
|
-
const runtimeRoot =
|
|
54578
|
+
const runtimeRoot = join35(homedir27(), ".scout/pairing", "codex", this.session.id);
|
|
54359
54579
|
const configuredThreadId = this.config.options?.["threadId"];
|
|
54360
54580
|
const requireExistingThread = this.config.options?.["requireExistingThread"];
|
|
54361
54581
|
const rawLaunchArgs = this.config.options?.["launchArgs"];
|
|
@@ -54367,8 +54587,8 @@ class CodexAdapter extends BaseAdapter {
|
|
|
54367
54587
|
sessionId: this.session.id,
|
|
54368
54588
|
cwd: this.config.cwd ?? process.cwd(),
|
|
54369
54589
|
systemPrompt: this.systemPrompt,
|
|
54370
|
-
runtimeDirectory:
|
|
54371
|
-
logsDirectory:
|
|
54590
|
+
runtimeDirectory: join35(runtimeRoot, "runtime"),
|
|
54591
|
+
logsDirectory: join35(runtimeRoot, "logs"),
|
|
54372
54592
|
env: this.config.env,
|
|
54373
54593
|
launchArgs,
|
|
54374
54594
|
threadId: typeof configuredThreadId === "string" && configuredThreadId.trim().length > 0 ? configuredThreadId.trim() : undefined,
|
|
@@ -54387,10 +54607,10 @@ class CodexAdapter extends BaseAdapter {
|
|
|
54387
54607
|
return typeof raw === "string" && raw.trim().length > 0 ? raw : "You are a helpful agent working through Pairing.";
|
|
54388
54608
|
}
|
|
54389
54609
|
get stdoutLogPath() {
|
|
54390
|
-
return this.transport?.stdoutLogFile ??
|
|
54610
|
+
return this.transport?.stdoutLogFile ?? join35(this.codexOptions.logsDirectory, "stdout.log");
|
|
54391
54611
|
}
|
|
54392
54612
|
get stderrLogPath() {
|
|
54393
|
-
return this.transport?.stderrLogFile ??
|
|
54613
|
+
return this.transport?.stderrLogFile ?? join35(this.codexOptions.logsDirectory, "stderr.log");
|
|
54394
54614
|
}
|
|
54395
54615
|
enqueue(task) {
|
|
54396
54616
|
const next = this.serialized.then(task, task);
|
|
@@ -54549,8 +54769,9 @@ class CodexAdapter extends BaseAdapter {
|
|
|
54549
54769
|
this.setStatus("error");
|
|
54550
54770
|
}
|
|
54551
54771
|
}
|
|
54552
|
-
var
|
|
54772
|
+
var createAdapter8 = (config) => new CodexAdapter(config);
|
|
54553
54773
|
// ../agent-sessions/src/index.ts
|
|
54774
|
+
init_devin_acp();
|
|
54554
54775
|
init_usage();
|
|
54555
54776
|
|
|
54556
54777
|
// ../agent-sessions/src/adapters/acp/index.ts
|
|
@@ -54934,7 +55155,7 @@ Referenced files: ${prompt.files.join(", ")}`
|
|
|
54934
55155
|
});
|
|
54935
55156
|
}
|
|
54936
55157
|
}
|
|
54937
|
-
var
|
|
55158
|
+
var createAdapter9 = (config) => new OpenAICompatAdapter(config);
|
|
54938
55159
|
// ../agent-sessions/src/adapters/opencode/adapter.ts
|
|
54939
55160
|
class OpenCodeAdapter extends BaseAdapter {
|
|
54940
55161
|
type = "opencode";
|
|
@@ -55385,7 +55606,7 @@ class OpenCodeAdapter extends BaseAdapter {
|
|
|
55385
55606
|
});
|
|
55386
55607
|
}
|
|
55387
55608
|
}
|
|
55388
|
-
var
|
|
55609
|
+
var createAdapter10 = (config) => new OpenCodeAdapter(config);
|
|
55389
55610
|
function throwIfAborted(signal) {
|
|
55390
55611
|
if (signal?.aborted) {
|
|
55391
55612
|
throw abortReason(signal);
|
|
@@ -55412,9 +55633,9 @@ function delay2(ms, signal) {
|
|
|
55412
55633
|
});
|
|
55413
55634
|
}
|
|
55414
55635
|
// ../agent-sessions/src/adapters/opencode-v2/adapter.ts
|
|
55415
|
-
import { existsSync as
|
|
55416
|
-
import { homedir as
|
|
55417
|
-
import { basename as basename13, isAbsolute as isAbsolute4, join as
|
|
55636
|
+
import { existsSync as existsSync33 } from "fs";
|
|
55637
|
+
import { homedir as homedir29 } from "os";
|
|
55638
|
+
import { basename as basename13, isAbsolute as isAbsolute4, join as join37, resolve as resolve14 } from "path";
|
|
55418
55639
|
import { pathToFileURL as pathToFileURL2 } from "url";
|
|
55419
55640
|
|
|
55420
55641
|
// ../../node_modules/.bun/@opencode-ai+client@0.0.0-next-17226+b8d34c012796aeeb/node_modules/@opencode-ai/client/dist/promise/generated/client-error.js
|
|
@@ -56667,8 +56888,8 @@ function isContentType(response, expected) {
|
|
|
56667
56888
|
// ../../node_modules/.bun/@opencode-ai+client@0.0.0-next-17226+b8d34c012796aeeb/node_modules/@opencode-ai/client/dist/promise/service.js
|
|
56668
56889
|
import { readFile as readFile10 } from "fs/promises";
|
|
56669
56890
|
import { spawn as spawn7 } from "child_process";
|
|
56670
|
-
import { homedir as
|
|
56671
|
-
import { join as
|
|
56891
|
+
import { homedir as homedir28 } from "os";
|
|
56892
|
+
import { join as join36 } from "path";
|
|
56672
56893
|
async function discover(options = {}) {
|
|
56673
56894
|
return (await discoverLocal(options))?.endpoint;
|
|
56674
56895
|
}
|
|
@@ -56780,7 +57001,7 @@ async function stop(options = {}) {
|
|
|
56780
57001
|
await kill(existing, options);
|
|
56781
57002
|
}
|
|
56782
57003
|
function fallback() {
|
|
56783
|
-
return
|
|
57004
|
+
return join36(process.env["XDG_STATE_HOME"] ?? join36(homedir28(), ".local", "state"), "opencode", "service.json");
|
|
56784
57005
|
}
|
|
56785
57006
|
function headers(endpoint) {
|
|
56786
57007
|
if (endpoint.auth === undefined)
|
|
@@ -56947,10 +57168,10 @@ var MAX_FILE_DATA_UTF8_BYTES = 48 * 1024;
|
|
|
56947
57168
|
var MAX_QUESTION_OPTIONS = 16;
|
|
56948
57169
|
var MAX_QUESTION_OPTION_TEXT_UTF8_BYTES = 1024;
|
|
56949
57170
|
var MAX_SEEN_EVENT_IDS = 4096;
|
|
56950
|
-
function
|
|
57171
|
+
function isRecord11(value) {
|
|
56951
57172
|
return Boolean(value && typeof value === "object" && !Array.isArray(value));
|
|
56952
57173
|
}
|
|
56953
|
-
function
|
|
57174
|
+
function stringValue9(value) {
|
|
56954
57175
|
return typeof value === "string" && value.trim() ? value : undefined;
|
|
56955
57176
|
}
|
|
56956
57177
|
function stringify2(value) {
|
|
@@ -56965,13 +57186,13 @@ function stringify2(value) {
|
|
|
56965
57186
|
}
|
|
56966
57187
|
}
|
|
56967
57188
|
function eventShape(value) {
|
|
56968
|
-
if (!
|
|
57189
|
+
if (!isRecord11(value) || typeof value.type !== "string" || !isRecord11(value.data)) {
|
|
56969
57190
|
return null;
|
|
56970
57191
|
}
|
|
56971
57192
|
return value;
|
|
56972
57193
|
}
|
|
56973
57194
|
function eventSessionId(event) {
|
|
56974
|
-
return
|
|
57195
|
+
return stringValue9(event.data.sessionID);
|
|
56975
57196
|
}
|
|
56976
57197
|
function streamKey(kind, data) {
|
|
56977
57198
|
return `${kind}:${data.assistantMessageID}:${data.ordinal}`;
|
|
@@ -56986,10 +57207,10 @@ function toolNameLooksLikeSubagent(name2) {
|
|
|
56986
57207
|
return ["agent", "subagent", "task"].includes(name2.toLowerCase());
|
|
56987
57208
|
}
|
|
56988
57209
|
function actionForTool(name2, id, inputValue) {
|
|
56989
|
-
const input =
|
|
57210
|
+
const input = isRecord11(inputValue) ? inputValue : {};
|
|
56990
57211
|
const boundedInput = boundOpaqueValue(inputValue, MAX_TOOL_INPUT_UTF8_BYTES, `opencode-v2:tool:${id}:input`);
|
|
56991
57212
|
if (toolNameLooksLikeCommand(name2)) {
|
|
56992
|
-
const command =
|
|
57213
|
+
const command = stringValue9(input.command) ?? (Array.isArray(input.command) ? input.command.filter((entry) => typeof entry === "string").join(" ") : stringify2(inputValue));
|
|
56993
57214
|
return {
|
|
56994
57215
|
kind: "command",
|
|
56995
57216
|
command,
|
|
@@ -56998,8 +57219,8 @@ function actionForTool(name2, id, inputValue) {
|
|
|
56998
57219
|
};
|
|
56999
57220
|
}
|
|
57000
57221
|
if (toolNameLooksLikeFileChange(name2)) {
|
|
57001
|
-
const path2 =
|
|
57002
|
-
const diff =
|
|
57222
|
+
const path2 = stringValue9(input.filePath) ?? stringValue9(input.file_path) ?? stringValue9(input.path) ?? stringValue9(input.file) ?? "";
|
|
57223
|
+
const diff = stringValue9(input.diff) ?? stringValue9(input.patch);
|
|
57003
57224
|
if (path2) {
|
|
57004
57225
|
return {
|
|
57005
57226
|
kind: "file_change",
|
|
@@ -57013,9 +57234,9 @@ function actionForTool(name2, id, inputValue) {
|
|
|
57013
57234
|
if (toolNameLooksLikeSubagent(name2)) {
|
|
57014
57235
|
return {
|
|
57015
57236
|
kind: "subagent",
|
|
57016
|
-
agentId:
|
|
57017
|
-
agentName:
|
|
57018
|
-
prompt:
|
|
57237
|
+
agentId: stringValue9(input.agentId) ?? stringValue9(input.agent) ?? id,
|
|
57238
|
+
agentName: stringValue9(input.agentName) ?? stringValue9(input.name),
|
|
57239
|
+
prompt: stringValue9(input.prompt),
|
|
57019
57240
|
status: "running",
|
|
57020
57241
|
output: ""
|
|
57021
57242
|
};
|
|
@@ -57030,10 +57251,10 @@ function actionForTool(name2, id, inputValue) {
|
|
|
57030
57251
|
};
|
|
57031
57252
|
}
|
|
57032
57253
|
function structuredErrorMessage(value) {
|
|
57033
|
-
if (!
|
|
57254
|
+
if (!isRecord11(value))
|
|
57034
57255
|
return stringify2(value) || "OpenCode execution failed.";
|
|
57035
|
-
const message =
|
|
57036
|
-
const type =
|
|
57256
|
+
const message = stringValue9(value.message) ?? "OpenCode execution failed.";
|
|
57257
|
+
const type = stringValue9(value.type);
|
|
57037
57258
|
return type && !message.includes(type) ? `${message} (${type})` : message;
|
|
57038
57259
|
}
|
|
57039
57260
|
function boundedText(value, maxBytes) {
|
|
@@ -57216,8 +57437,8 @@ class OpenCodeV2EventNormalizer {
|
|
|
57216
57437
|
}
|
|
57217
57438
|
ingestControl(record2) {
|
|
57218
57439
|
if (record2.event === "prompt_accepted") {
|
|
57219
|
-
const payload =
|
|
57220
|
-
const remoteSessionId =
|
|
57440
|
+
const payload = isRecord11(record2.payload) ? record2.payload : {};
|
|
57441
|
+
const remoteSessionId = stringValue9(payload.remoteSessionId);
|
|
57221
57442
|
if (remoteSessionId)
|
|
57222
57443
|
this.remoteSessionId = remoteSessionId;
|
|
57223
57444
|
const events2 = this.current ? [...this.finishTurn("failed", "A new prompt replaced an unfinished OpenCode turn.")] : [];
|
|
@@ -57253,11 +57474,11 @@ class OpenCodeV2EventNormalizer {
|
|
|
57253
57474
|
return this.finishTurn("stopped");
|
|
57254
57475
|
}
|
|
57255
57476
|
if (record2.event === "transport_error") {
|
|
57256
|
-
const message =
|
|
57477
|
+
const message = isRecord11(record2.payload) ? stringValue9(record2.payload.message) : stringValue9(record2.payload);
|
|
57257
57478
|
return this.finishTurn("failed", message ?? "OpenCode event transport failed.");
|
|
57258
57479
|
}
|
|
57259
|
-
if (record2.event === "question_answered" &&
|
|
57260
|
-
const blockId =
|
|
57480
|
+
if (record2.event === "question_answered" && isRecord11(record2.payload)) {
|
|
57481
|
+
const blockId = stringValue9(record2.payload.blockId);
|
|
57261
57482
|
const answer = Array.isArray(record2.payload.answer) ? record2.payload.answer.filter((entry) => typeof entry === "string") : [];
|
|
57262
57483
|
const request = blockId ? this.questionRequestForBlock(blockId) : undefined;
|
|
57263
57484
|
return request ? this.resolveQuestions(request.requestId, [answer]) : [];
|
|
@@ -57409,7 +57630,7 @@ class OpenCodeV2EventNormalizer {
|
|
|
57409
57630
|
data: boundedFileData(item.uri, `opencode-v2:tool:${id}:file:${index2}`)
|
|
57410
57631
|
}));
|
|
57411
57632
|
}
|
|
57412
|
-
const meta =
|
|
57633
|
+
const meta = isRecord11(metadata) ? boundOpaqueValue(metadata, MAX_TOOL_METADATA_UTF8_BYTES, `opencode-v2:tool:${id}:metadata`) : undefined;
|
|
57413
57634
|
events2.push({
|
|
57414
57635
|
event: "block:action:status",
|
|
57415
57636
|
sessionId: this.context.sessionId,
|
|
@@ -57630,69 +57851,69 @@ function deferred() {
|
|
|
57630
57851
|
});
|
|
57631
57852
|
return { promise, resolve: resolvePromise, reject: rejectPromise };
|
|
57632
57853
|
}
|
|
57633
|
-
function
|
|
57854
|
+
function isRecord12(value) {
|
|
57634
57855
|
return Boolean(value && typeof value === "object" && !Array.isArray(value));
|
|
57635
57856
|
}
|
|
57636
|
-
function
|
|
57857
|
+
function stringValue10(value) {
|
|
57637
57858
|
return typeof value === "string" && value.trim() ? value.trim() : undefined;
|
|
57638
57859
|
}
|
|
57639
57860
|
function numberValue4(value, fallback2) {
|
|
57640
57861
|
return typeof value === "number" && Number.isFinite(value) && value > 0 ? Math.floor(value) : fallback2;
|
|
57641
57862
|
}
|
|
57642
|
-
function
|
|
57863
|
+
function stringArray7(value) {
|
|
57643
57864
|
if (!Array.isArray(value) || value.some((entry) => typeof entry !== "string" || !entry.trim())) {
|
|
57644
57865
|
return;
|
|
57645
57866
|
}
|
|
57646
57867
|
return value.map((entry) => entry.trim());
|
|
57647
57868
|
}
|
|
57648
57869
|
function defaultOpenCodeV2Binary(env) {
|
|
57649
|
-
const override =
|
|
57870
|
+
const override = stringValue10(env?.OPENCODE_V2_BIN) ?? stringValue10(process.env.OPENCODE_V2_BIN);
|
|
57650
57871
|
if (override)
|
|
57651
57872
|
return override;
|
|
57652
|
-
const home =
|
|
57873
|
+
const home = stringValue10(env?.HOME) ?? homedir29();
|
|
57653
57874
|
const candidates = [
|
|
57654
57875
|
"/opt/homebrew/bin/opencode2",
|
|
57655
57876
|
"/usr/local/bin/opencode2",
|
|
57656
|
-
|
|
57657
|
-
|
|
57877
|
+
join37(home, ".opencode", "bin", "opencode2"),
|
|
57878
|
+
join37(home, ".local", "bin", "opencode2")
|
|
57658
57879
|
];
|
|
57659
|
-
return candidates.find((candidate) =>
|
|
57880
|
+
return candidates.find((candidate) => existsSync33(candidate)) ?? "opencode2";
|
|
57660
57881
|
}
|
|
57661
57882
|
function modelRef(value, variantValue) {
|
|
57662
|
-
const raw =
|
|
57883
|
+
const raw = stringValue10(value);
|
|
57663
57884
|
if (!raw)
|
|
57664
57885
|
return;
|
|
57665
57886
|
const hash = raw.lastIndexOf("#");
|
|
57666
57887
|
const withoutVariant = hash > 0 ? raw.slice(0, hash) : raw;
|
|
57667
|
-
const inlineVariant = hash > 0 ?
|
|
57888
|
+
const inlineVariant = hash > 0 ? stringValue10(raw.slice(hash + 1)) : undefined;
|
|
57668
57889
|
const slash = withoutVariant.indexOf("/");
|
|
57669
57890
|
const providerID = slash > 0 ? withoutVariant.slice(0, slash) : "opencode";
|
|
57670
57891
|
const id = slash > 0 ? withoutVariant.slice(slash + 1) : withoutVariant;
|
|
57671
57892
|
if (!id)
|
|
57672
57893
|
return;
|
|
57673
|
-
const variant =
|
|
57894
|
+
const variant = stringValue10(variantValue) ?? inlineVariant;
|
|
57674
57895
|
return { id, providerID, ...variant ? { variant } : {} };
|
|
57675
57896
|
}
|
|
57676
57897
|
function parseOptions3(config) {
|
|
57677
|
-
const raw =
|
|
57678
|
-
const explicitCommand =
|
|
57679
|
-
const binary =
|
|
57680
|
-
const args =
|
|
57681
|
-
const requiredVersion = raw.requiredVersion === false ? null :
|
|
57898
|
+
const raw = isRecord12(config.options) ? config.options : {};
|
|
57899
|
+
const explicitCommand = stringArray7(raw.command);
|
|
57900
|
+
const binary = stringValue10(raw.command) ?? defaultOpenCodeV2Binary(config.env);
|
|
57901
|
+
const args = stringArray7(raw.args) ?? ["serve", "--service"];
|
|
57902
|
+
const requiredVersion = raw.requiredVersion === false ? null : stringValue10(raw.requiredVersion) ?? OPENCODE_V2_CLIENT_VERSION;
|
|
57682
57903
|
return {
|
|
57683
|
-
serverUrl:
|
|
57684
|
-
serverUsername:
|
|
57685
|
-
serverPassword:
|
|
57686
|
-
serviceFile:
|
|
57904
|
+
serverUrl: stringValue10(raw.serverUrl) ?? stringValue10(raw.url),
|
|
57905
|
+
serverUsername: stringValue10(raw.serverUsername) ?? "opencode",
|
|
57906
|
+
serverPassword: stringValue10(raw.serverPassword) ?? stringValue10(config.env?.OPENCODE_PASSWORD) ?? stringValue10(process.env.OPENCODE_PASSWORD),
|
|
57907
|
+
serviceFile: stringValue10(raw.serviceFile),
|
|
57687
57908
|
autoStart: raw.autoStart !== false,
|
|
57688
57909
|
command: explicitCommand ?? [binary, ...args],
|
|
57689
57910
|
requiredVersion,
|
|
57690
57911
|
startupTimeoutMs: numberValue4(raw.startupTimeoutMs, DEFAULT_STARTUP_TIMEOUT_MS2),
|
|
57691
57912
|
reconnectDelayMs: numberValue4(raw.reconnectDelayMs, DEFAULT_RECONNECT_DELAY_MS),
|
|
57692
|
-
remoteSessionId:
|
|
57913
|
+
remoteSessionId: stringValue10(raw.sessionId) ?? stringValue10(raw.session),
|
|
57693
57914
|
allowCrossDirectoryResume: raw.allowCrossDirectoryResume === true,
|
|
57694
|
-
title:
|
|
57695
|
-
agent:
|
|
57915
|
+
title: stringValue10(raw.title) ?? stringValue10(config.name),
|
|
57916
|
+
agent: stringValue10(raw.agent),
|
|
57696
57917
|
model: modelRef(raw.model, raw.variant)
|
|
57697
57918
|
};
|
|
57698
57919
|
}
|
|
@@ -57776,20 +57997,20 @@ function observeWithinSignal(promise, signal2) {
|
|
|
57776
57997
|
function normalizedError(error, fallback2) {
|
|
57777
57998
|
if (error instanceof Error)
|
|
57778
57999
|
return new Error(redactSecrets(error.message || fallback2), { cause: error });
|
|
57779
|
-
if (
|
|
57780
|
-
const tag =
|
|
57781
|
-
const message =
|
|
58000
|
+
if (isRecord12(error)) {
|
|
58001
|
+
const tag = stringValue10(error._tag);
|
|
58002
|
+
const message = stringValue10(error.message) ?? fallback2;
|
|
57782
58003
|
return new Error(redactSecrets(tag ? `${message} (${tag})` : message));
|
|
57783
58004
|
}
|
|
57784
58005
|
return new Error(redactSecrets(typeof error === "string" ? error : fallback2));
|
|
57785
58006
|
}
|
|
57786
58007
|
function isAuthoritativePromptRejection(error) {
|
|
57787
|
-
if (!
|
|
58008
|
+
if (!isRecord12(error))
|
|
57788
58009
|
return false;
|
|
57789
58010
|
return error._tag === "InvalidRequestError" || error._tag === "UnauthorizedError" || error._tag === "SessionNotFoundError";
|
|
57790
58011
|
}
|
|
57791
58012
|
function httpServerResponseObserved(error) {
|
|
57792
|
-
if (!
|
|
58013
|
+
if (!isRecord12(error))
|
|
57793
58014
|
return false;
|
|
57794
58015
|
if (typeof error._tag === "string")
|
|
57795
58016
|
return true;
|
|
@@ -58657,7 +58878,7 @@ class OpenCodeV2Adapter extends BaseAdapter {
|
|
|
58657
58878
|
return this.nativeSessionId;
|
|
58658
58879
|
}
|
|
58659
58880
|
}
|
|
58660
|
-
var
|
|
58881
|
+
var createAdapter11 = (config) => new OpenCodeV2Adapter(config);
|
|
58661
58882
|
var OPENCODE_V2_CAPABILITIES = Object.freeze({
|
|
58662
58883
|
protocolVersion: "v2",
|
|
58663
58884
|
transport: "http-sse",
|
|
@@ -58679,10 +58900,10 @@ init_pi();
|
|
|
58679
58900
|
|
|
58680
58901
|
// ../web/server/core/pairing/runtime/bridge/log.ts
|
|
58681
58902
|
import { appendFileSync as appendFileSync2, mkdirSync as mkdirSync15 } from "fs";
|
|
58682
|
-
import { join as
|
|
58683
|
-
import { homedir as
|
|
58684
|
-
var LOG_DIR =
|
|
58685
|
-
var LOG_FILE =
|
|
58903
|
+
import { join as join38 } from "path";
|
|
58904
|
+
import { homedir as homedir30 } from "os";
|
|
58905
|
+
var LOG_DIR = join38(homedir30(), ".scout/pairing");
|
|
58906
|
+
var LOG_FILE = join38(LOG_DIR, "bridge.log");
|
|
58686
58907
|
mkdirSync15(LOG_DIR, { recursive: true });
|
|
58687
58908
|
function write2(level, category, message, data) {
|
|
58688
58909
|
const ts = new Date().toISOString().slice(11, 23);
|
|
@@ -58767,17 +58988,17 @@ class Bridge {
|
|
|
58767
58988
|
|
|
58768
58989
|
// ../web/server/core/pairing/runtime/bridge/config.ts
|
|
58769
58990
|
init_local_config();
|
|
58770
|
-
import { existsSync as
|
|
58771
|
-
import { join as
|
|
58772
|
-
import { homedir as
|
|
58991
|
+
import { existsSync as existsSync34, readFileSync as readFileSync20 } from "fs";
|
|
58992
|
+
import { join as join39 } from "path";
|
|
58993
|
+
import { homedir as homedir31 } from "os";
|
|
58773
58994
|
var DEFAULTS = {
|
|
58774
58995
|
port: 43130,
|
|
58775
58996
|
secure: true
|
|
58776
58997
|
};
|
|
58777
|
-
var CONFIG_DIR =
|
|
58778
|
-
var CONFIG_FILE =
|
|
58998
|
+
var CONFIG_DIR = join39(homedir31(), ".scout/pairing");
|
|
58999
|
+
var CONFIG_FILE = join39(CONFIG_DIR, "config.json");
|
|
58779
59000
|
function loadConfigFile() {
|
|
58780
|
-
if (!
|
|
59001
|
+
if (!existsSync34(CONFIG_FILE)) {
|
|
58781
59002
|
return {};
|
|
58782
59003
|
}
|
|
58783
59004
|
try {
|
|
@@ -58847,10 +59068,10 @@ function resolveConfig() {
|
|
|
58847
59068
|
|
|
58848
59069
|
// ../web/server/core/pairing/runtime/bridge/fileserver.ts
|
|
58849
59070
|
import { randomUUID as randomUUID3 } from "crypto";
|
|
58850
|
-
import { existsSync as
|
|
59071
|
+
import { existsSync as existsSync35, mkdirSync as mkdirSync16, readFileSync as readFileSync21, realpathSync as realpathSync4, statSync as statSync10, unlinkSync as unlinkSync2, writeFileSync as writeFileSync12 } from "fs";
|
|
58851
59072
|
import { BlockList, isIP } from "net";
|
|
58852
|
-
import { isAbsolute as isAbsolute6, join as
|
|
58853
|
-
import { homedir as
|
|
59073
|
+
import { isAbsolute as isAbsolute6, join as join40, relative as relative5, sep as sep2 } from "path";
|
|
59074
|
+
import { homedir as homedir32 } from "os";
|
|
58854
59075
|
|
|
58855
59076
|
// ../web/server/core/pairing/runtime/bridge/web-handoff.ts
|
|
58856
59077
|
import { randomBytes as randomBytes7 } from "crypto";
|
|
@@ -59099,12 +59320,12 @@ function presentationResponse(body, status, headers2 = {}) {
|
|
|
59099
59320
|
}
|
|
59100
59321
|
|
|
59101
59322
|
// ../web/server/core/pairing/runtime/bridge/fileserver.ts
|
|
59102
|
-
var ALLOWED_ROOTS = [
|
|
59323
|
+
var ALLOWED_ROOTS = [homedir32(), "/tmp"];
|
|
59103
59324
|
var LOOPBACK_PEERS = new BlockList;
|
|
59104
59325
|
LOOPBACK_PEERS.addSubnet("127.0.0.0", 8, "ipv4");
|
|
59105
59326
|
LOOPBACK_PEERS.addAddress("::1", "ipv6");
|
|
59106
59327
|
LOOPBACK_PEERS.addSubnet("::ffff:127.0.0.0", 104, "ipv6");
|
|
59107
|
-
var PAIRING_ATTACHMENT_ROOT =
|
|
59328
|
+
var PAIRING_ATTACHMENT_ROOT = join40(homedir32(), ".scout", "pairing", "attachments");
|
|
59108
59329
|
var PAIRING_ATTACHMENT_TTL_MS = 6 * 60 * 60 * 1000;
|
|
59109
59330
|
var PAIRING_ATTACHMENT_MAX_BYTES = 25 * 1024 * 1024;
|
|
59110
59331
|
var PAIRING_ATTACHMENT_PATH_PREFIX = "/attachments/";
|
|
@@ -59127,7 +59348,7 @@ function storePairingAttachmentBlob(input, options) {
|
|
|
59127
59348
|
mkdirSync16(PAIRING_ATTACHMENT_ROOT, { recursive: true, mode: 448 });
|
|
59128
59349
|
purgeExpiredPairingAttachments(options.now);
|
|
59129
59350
|
const id = `att-${randomUUID3()}`;
|
|
59130
|
-
const path2 =
|
|
59351
|
+
const path2 = join40(PAIRING_ATTACHMENT_ROOT, id);
|
|
59131
59352
|
writeFileSync12(path2, data, { mode: 384 });
|
|
59132
59353
|
const now = options.now ?? Date.now();
|
|
59133
59354
|
const entry = {
|
|
@@ -59176,21 +59397,21 @@ function resolvePairingAttachment(id, now) {
|
|
|
59176
59397
|
}
|
|
59177
59398
|
const known = attachmentBlobs.get(id);
|
|
59178
59399
|
if (known) {
|
|
59179
|
-
if (known.expiresAt <= now || !
|
|
59400
|
+
if (known.expiresAt <= now || !existsSync35(known.path)) {
|
|
59180
59401
|
forgetPairingAttachment(id);
|
|
59181
59402
|
return null;
|
|
59182
59403
|
}
|
|
59183
59404
|
return known;
|
|
59184
59405
|
}
|
|
59185
59406
|
const rehydrated = readAttachmentSidecar(id);
|
|
59186
|
-
if (!rehydrated || rehydrated.expiresAt <= now || !
|
|
59407
|
+
if (!rehydrated || rehydrated.expiresAt <= now || !existsSync35(rehydrated.path)) {
|
|
59187
59408
|
return null;
|
|
59188
59409
|
}
|
|
59189
59410
|
attachmentBlobs.set(id, rehydrated);
|
|
59190
59411
|
return rehydrated;
|
|
59191
59412
|
}
|
|
59192
59413
|
function attachmentSidecarPath(id) {
|
|
59193
|
-
return
|
|
59414
|
+
return join40(PAIRING_ATTACHMENT_ROOT, `${id}.json`);
|
|
59194
59415
|
}
|
|
59195
59416
|
function writeAttachmentSidecar(entry) {
|
|
59196
59417
|
try {
|
|
@@ -59212,7 +59433,7 @@ function readAttachmentSidecar(id) {
|
|
|
59212
59433
|
}
|
|
59213
59434
|
return {
|
|
59214
59435
|
id,
|
|
59215
|
-
path:
|
|
59436
|
+
path: join40(PAIRING_ATTACHMENT_ROOT, id),
|
|
59216
59437
|
mediaType,
|
|
59217
59438
|
fileName: sanitizeAttachmentFileName(raw.fileName),
|
|
59218
59439
|
size: typeof raw.size === "number" ? raw.size : 0,
|
|
@@ -59224,7 +59445,7 @@ function readAttachmentSidecar(id) {
|
|
|
59224
59445
|
}
|
|
59225
59446
|
function forgetPairingAttachment(id) {
|
|
59226
59447
|
attachmentBlobs.delete(id);
|
|
59227
|
-
for (const path2 of [
|
|
59448
|
+
for (const path2 of [join40(PAIRING_ATTACHMENT_ROOT, id), attachmentSidecarPath(id)]) {
|
|
59228
59449
|
try {
|
|
59229
59450
|
unlinkSync2(path2);
|
|
59230
59451
|
} catch {}
|
|
@@ -59276,7 +59497,7 @@ function isInsideRoot(root, candidate) {
|
|
|
59276
59497
|
function isAllowedHomeRelativePath(rel) {
|
|
59277
59498
|
if (!rel.startsWith("."))
|
|
59278
59499
|
return true;
|
|
59279
|
-
return rel === ".claude" || rel.startsWith(`.claude${sep2}`) || rel ===
|
|
59500
|
+
return rel === ".claude" || rel.startsWith(`.claude${sep2}`) || rel === join40(".scout", "pairing") || rel.startsWith(`${join40(".scout", "pairing")}${sep2}`);
|
|
59280
59501
|
}
|
|
59281
59502
|
function resolveAllowedFile(filePath) {
|
|
59282
59503
|
if (!isAbsolute6(filePath))
|
|
@@ -59287,7 +59508,7 @@ function resolveAllowedFile(filePath) {
|
|
|
59287
59508
|
} catch {
|
|
59288
59509
|
return { status: "missing" };
|
|
59289
59510
|
}
|
|
59290
|
-
const canonicalHome = realpathSync4(
|
|
59511
|
+
const canonicalHome = realpathSync4(homedir32());
|
|
59291
59512
|
for (const configuredRoot of ALLOWED_ROOTS) {
|
|
59292
59513
|
const root = realpathSync4(configuredRoot);
|
|
59293
59514
|
if (!isInsideRoot(root, candidate))
|
|
@@ -61345,7 +61566,8 @@ async function sendScoutConversationMessage(input) {
|
|
|
61345
61566
|
const currentDirectory = input.currentDirectory ?? process.cwd();
|
|
61346
61567
|
const createdAtMs = input.createdAtMs ?? Date.now();
|
|
61347
61568
|
const senderId = await resolveConversationActorId(broker2.baseUrl, broker2.snapshot, broker2.node.id, input.senderId, currentDirectory);
|
|
61348
|
-
const
|
|
61569
|
+
const routeBodyMentions = input.resolveMentionsFromBody !== false;
|
|
61570
|
+
const mentionResolution = routeBodyMentions ? await resolveMentionTargets(broker2.snapshot, input.body, currentDirectory) : { resolved: [], unresolved: [], ambiguous: [] };
|
|
61349
61571
|
const mentionedTargetIds = new Set(mentionResolution.resolved.map((target2) => target2.agentId));
|
|
61350
61572
|
const participantTargetIds = input.notifyParticipantAgents && (conversation.kind === "channel" || conversation.kind === "group_direct" || conversation.kind === "thread") ? conversation.participantIds.filter((participantId) => isSteerableParticipant(broker2.snapshot, participantId, senderId)) : [];
|
|
61351
61573
|
const candidateTargetIds = [...new Set([
|
|
@@ -61732,8 +61954,8 @@ var watchSharedScoutMessages = createBrokerMessageFanout();
|
|
|
61732
61954
|
// ../web/server/core/pairing/runtime/bridge/server.ts
|
|
61733
61955
|
init_system_probes();
|
|
61734
61956
|
import { readdirSync as readdirSync7, readFileSync as readFileSync25, realpathSync as realpathSync5, statSync as statSync14 } from "fs";
|
|
61735
|
-
import { basename as basename16, isAbsolute as isAbsolute7, join as
|
|
61736
|
-
import { homedir as
|
|
61957
|
+
import { basename as basename16, isAbsolute as isAbsolute7, join as join48, relative as relative6, resolve as resolve19 } from "path";
|
|
61958
|
+
import { homedir as homedir39 } from "os";
|
|
61737
61959
|
|
|
61738
61960
|
// ../web/server/core/mobile/service.ts
|
|
61739
61961
|
init_src();
|
|
@@ -61744,9 +61966,9 @@ init_setup();
|
|
|
61744
61966
|
|
|
61745
61967
|
// ../runtime/src/agent-workspace.ts
|
|
61746
61968
|
init_exec();
|
|
61747
|
-
import { existsSync as
|
|
61969
|
+
import { existsSync as existsSync36 } from "fs";
|
|
61748
61970
|
import { mkdir as mkdir9 } from "fs/promises";
|
|
61749
|
-
import { join as
|
|
61971
|
+
import { join as join41 } from "path";
|
|
61750
61972
|
var SCOUT_WORKSPACES_DIRNAME = ".scout-worktrees";
|
|
61751
61973
|
async function isGitRepo(projectRoot) {
|
|
61752
61974
|
try {
|
|
@@ -61767,9 +61989,9 @@ async function createAgentWorkspace(projectRoot, agentName, requestedBranch) {
|
|
|
61767
61989
|
}
|
|
61768
61990
|
const branch = requestedBranch?.trim() || `scout/${agentName}`;
|
|
61769
61991
|
validateWorktreeBranch(branch);
|
|
61770
|
-
const workspaceDir =
|
|
61771
|
-
const workspacePath =
|
|
61772
|
-
if (
|
|
61992
|
+
const workspaceDir = join41(projectRoot, SCOUT_WORKSPACES_DIRNAME);
|
|
61993
|
+
const workspacePath = join41(workspaceDir, agentName);
|
|
61994
|
+
if (existsSync36(workspacePath)) {
|
|
61773
61995
|
return { path: workspacePath, branch };
|
|
61774
61996
|
}
|
|
61775
61997
|
await mkdir9(workspaceDir, { recursive: true });
|
|
@@ -61807,11 +62029,11 @@ var {
|
|
|
61807
62029
|
|
|
61808
62030
|
// ../web/server/db/internal/db.ts
|
|
61809
62031
|
import { Database as Database2 } from "bun:sqlite";
|
|
61810
|
-
import { homedir as
|
|
61811
|
-
import { join as
|
|
62032
|
+
import { homedir as homedir33 } from "os";
|
|
62033
|
+
import { join as join42 } from "path";
|
|
61812
62034
|
function resolveDbPath() {
|
|
61813
|
-
const controlHome = process.env.OPENSCOUT_CONTROL_HOME ??
|
|
61814
|
-
return
|
|
62035
|
+
const controlHome = process.env.OPENSCOUT_CONTROL_HOME ?? join42(homedir33(), ".openscout", "control-plane");
|
|
62036
|
+
return join42(controlHome, "control-plane.sqlite");
|
|
61815
62037
|
}
|
|
61816
62038
|
var _db = null;
|
|
61817
62039
|
var DB_BUSY_TIMEOUT_MS = 250;
|
|
@@ -61833,9 +62055,9 @@ function normalizeTimestampMs(value) {
|
|
|
61833
62055
|
}
|
|
61834
62056
|
|
|
61835
62057
|
// ../web/server/db/internal/paths.ts
|
|
61836
|
-
import { homedir as
|
|
62058
|
+
import { homedir as homedir34 } from "os";
|
|
61837
62059
|
init_support_paths();
|
|
61838
|
-
var HOME =
|
|
62060
|
+
var HOME = homedir34();
|
|
61839
62061
|
function compact(p) {
|
|
61840
62062
|
if (!p)
|
|
61841
62063
|
return null;
|
|
@@ -62556,10 +62778,10 @@ function isMissingTerminalSessionRegistryError(error) {
|
|
|
62556
62778
|
}
|
|
62557
62779
|
// ../web/server/service-budgets.ts
|
|
62558
62780
|
import { createHash as createHash7 } from "crypto";
|
|
62559
|
-
import { existsSync as
|
|
62781
|
+
import { existsSync as existsSync37, mkdirSync as mkdirSync17, readdirSync as readdirSync6, readFileSync as readFileSync22, renameSync as renameSync6, statSync as statSync11, writeFileSync as writeFileSync13 } from "fs";
|
|
62560
62782
|
import { open, readdir as readdir4, stat as stat6 } from "fs/promises";
|
|
62561
|
-
import { homedir as
|
|
62562
|
-
import { dirname as dirname22, join as
|
|
62783
|
+
import { homedir as homedir35 } from "os";
|
|
62784
|
+
import { dirname as dirname22, join as join43 } from "path";
|
|
62563
62785
|
import { createInterface as createInterface2 } from "readline";
|
|
62564
62786
|
init_src();
|
|
62565
62787
|
init_claude_statusline();
|
|
@@ -62668,8 +62890,8 @@ async function loadCodexGauge(forceRefresh = false) {
|
|
|
62668
62890
|
harness: "codex",
|
|
62669
62891
|
maxAgeMs: WEEK_MS
|
|
62670
62892
|
});
|
|
62671
|
-
const root =
|
|
62672
|
-
if (!
|
|
62893
|
+
const root = join43(homeDir(), ".codex", "sessions");
|
|
62894
|
+
if (!existsSync37(root))
|
|
62673
62895
|
return fallback2;
|
|
62674
62896
|
const candidates = await findRecentCodexJsonl(root, CODEX_LOOKBACK_DAYS);
|
|
62675
62897
|
if (candidates.length === 0)
|
|
@@ -62726,7 +62948,7 @@ function codexQuotaSnapshotsFromObservation(usage, capturedAt) {
|
|
|
62726
62948
|
return usage.quotaWindows.map((window2) => codexQuotaSnapshot(window2, capturedAt, usage.planType, usage.limitId)).filter((entry) => entry !== null);
|
|
62727
62949
|
}
|
|
62728
62950
|
function bindingCodexPoolSnapshots(snapshots) {
|
|
62729
|
-
const poolIdOf = (row) =>
|
|
62951
|
+
const poolIdOf = (row) => stringValue11(row.metadata?.limitId) ?? "";
|
|
62730
62952
|
const pools = new Set(snapshots.map(poolIdOf));
|
|
62731
62953
|
if (pools.size <= 1)
|
|
62732
62954
|
return snapshots;
|
|
@@ -62771,7 +62993,7 @@ async function findRecentCodexJsonl(root, lookbackDays) {
|
|
|
62771
62993
|
continue;
|
|
62772
62994
|
}
|
|
62773
62995
|
for (const entry of entries) {
|
|
62774
|
-
const full =
|
|
62996
|
+
const full = join43(dir, entry.name);
|
|
62775
62997
|
if (entry.isDirectory()) {
|
|
62776
62998
|
pending.push(full);
|
|
62777
62999
|
} else if (entry.isFile() && entry.name.endsWith(".jsonl")) {
|
|
@@ -62896,7 +63118,7 @@ function claudeStatuslineDir() {
|
|
|
62896
63118
|
return resolveClaudeStatuslineDirectory();
|
|
62897
63119
|
}
|
|
62898
63120
|
function readClaudeStatuslineLatest() {
|
|
62899
|
-
return readJsonRecord(
|
|
63121
|
+
return readJsonRecord(join43(claudeStatuslineDir(), "claude-latest.json"));
|
|
62900
63122
|
}
|
|
62901
63123
|
function loadClaudeStatuslineQuotaSnapshots() {
|
|
62902
63124
|
const now = Date.now();
|
|
@@ -62908,7 +63130,7 @@ function loadClaudeStatuslineQuotaSnapshots() {
|
|
|
62908
63130
|
].flatMap((record2) => claudeQuotaSnapshotsFromStatusline(record2)).sort((a, b) => b.capturedAt - a.capturedAt).slice(0, PERSISTED_QUOTA_ROW_LIMIT);
|
|
62909
63131
|
}
|
|
62910
63132
|
function readClaudeStatuslineHistory(minCapturedAt) {
|
|
62911
|
-
const path2 =
|
|
63133
|
+
const path2 = join43(claudeStatuslineDir(), "claude-history.jsonl");
|
|
62912
63134
|
const stat7 = safeStat(path2);
|
|
62913
63135
|
if (!stat7)
|
|
62914
63136
|
return [];
|
|
@@ -62982,8 +63204,8 @@ function claudeQuotaSnapshotFromStatuslineWindow(record2, value, options) {
|
|
|
62982
63204
|
capturedAt: options.capturedAt,
|
|
62983
63205
|
metadata: {
|
|
62984
63206
|
source: "service-budgets.claude-statusline",
|
|
62985
|
-
sessionId:
|
|
62986
|
-
cwd:
|
|
63207
|
+
sessionId: stringValue11(record2.session_id),
|
|
63208
|
+
cwd: stringValue11(record2.cwd),
|
|
62987
63209
|
model: claudeStatuslineModel(record2)
|
|
62988
63210
|
}
|
|
62989
63211
|
};
|
|
@@ -62993,7 +63215,7 @@ function claudeStatuslineCapturedAt(record2) {
|
|
|
62993
63215
|
}
|
|
62994
63216
|
function claudeStatuslineModel(record2) {
|
|
62995
63217
|
const model = recordValue(record2.model);
|
|
62996
|
-
return
|
|
63218
|
+
return stringValue11(model?.id) ?? stringValue11(model?.display_name);
|
|
62997
63219
|
}
|
|
62998
63220
|
function loadPersistedProviderQuotaGauge(input) {
|
|
62999
63221
|
return quotaGaugeFromSnapshots({
|
|
@@ -63076,7 +63298,7 @@ function quotaGaugeFromSnapshots(input, snapshots) {
|
|
|
63076
63298
|
return null;
|
|
63077
63299
|
const displayWindow = windows.find((window2) => window2.label === "7d") ?? windows[windows.length - 1];
|
|
63078
63300
|
const fill = Math.max(...windows.map((window2) => window2.fill));
|
|
63079
|
-
const plan = snapshots.filter((snapshot) => snapshot.capturedAt >= minCurrentCapturedAt).sort((a, b) => b.capturedAt - a.capturedAt).map((snapshot) =>
|
|
63301
|
+
const plan = snapshots.filter((snapshot) => snapshot.capturedAt >= minCurrentCapturedAt).sort((a, b) => b.capturedAt - a.capturedAt).map((snapshot) => stringValue11(snapshot.planType)).find((value) => Boolean(value));
|
|
63080
63302
|
return {
|
|
63081
63303
|
id: input.id,
|
|
63082
63304
|
label: input.label,
|
|
@@ -63127,7 +63349,7 @@ function quotaHistoryByWindow(snapshots) {
|
|
|
63127
63349
|
return out;
|
|
63128
63350
|
}
|
|
63129
63351
|
function quotaSnapshotWindowKey(row) {
|
|
63130
|
-
const resource =
|
|
63352
|
+
const resource = stringValue11(row.metadata?.resource) ?? stringValue11(row.metadata?.modelName) ?? "";
|
|
63131
63353
|
return [resource, formatStoredQuotaWindowLabel(row)].join(":");
|
|
63132
63354
|
}
|
|
63133
63355
|
function quotaSnapshotIsExpired(row, now) {
|
|
@@ -63271,7 +63493,7 @@ async function readKimiUsageResponse() {
|
|
|
63271
63493
|
return parsed;
|
|
63272
63494
|
}
|
|
63273
63495
|
const credentials = readKimiCredentials();
|
|
63274
|
-
const accessToken =
|
|
63496
|
+
const accessToken = stringValue11(credentials?.access_token);
|
|
63275
63497
|
if (!accessToken)
|
|
63276
63498
|
return null;
|
|
63277
63499
|
let response;
|
|
@@ -63302,12 +63524,12 @@ async function readKimiUsageResponse() {
|
|
|
63302
63524
|
}
|
|
63303
63525
|
}
|
|
63304
63526
|
function kimiCodeHome() {
|
|
63305
|
-
return process.env.KIMI_CODE_HOME?.trim() ||
|
|
63527
|
+
return process.env.KIMI_CODE_HOME?.trim() || join43(homeDir(), ".kimi-code");
|
|
63306
63528
|
}
|
|
63307
63529
|
function readKimiCredentials() {
|
|
63308
|
-
const candidates = [
|
|
63530
|
+
const candidates = [join43(kimiCodeHome(), "credentials", "kimi-code.json")];
|
|
63309
63531
|
if (!process.env.KIMI_CODE_HOME?.trim()) {
|
|
63310
|
-
candidates.push(
|
|
63532
|
+
candidates.push(join43(homeDir(), ".kimi", "credentials", "kimi-code.json"));
|
|
63311
63533
|
}
|
|
63312
63534
|
for (const path2 of candidates) {
|
|
63313
63535
|
const credentials = readJsonRecord(path2);
|
|
@@ -63374,7 +63596,7 @@ function kimiWindowMs(window2) {
|
|
|
63374
63596
|
const duration = numericValue(window2?.duration);
|
|
63375
63597
|
if (duration === undefined || duration <= 0)
|
|
63376
63598
|
return null;
|
|
63377
|
-
const unit =
|
|
63599
|
+
const unit = stringValue11(window2?.timeUnit)?.toUpperCase() ?? "";
|
|
63378
63600
|
if (unit.includes("MINUTE"))
|
|
63379
63601
|
return duration * 60000;
|
|
63380
63602
|
if (unit.includes("HOUR"))
|
|
@@ -63386,13 +63608,13 @@ function kimiWindowMs(window2) {
|
|
|
63386
63608
|
return null;
|
|
63387
63609
|
}
|
|
63388
63610
|
function kimiMembershipPlan(payload) {
|
|
63389
|
-
const raw2 =
|
|
63611
|
+
const raw2 = stringValue11(payload.user?.membership?.level);
|
|
63390
63612
|
if (!raw2)
|
|
63391
63613
|
return;
|
|
63392
63614
|
return raw2.replace(/^LEVEL_/u, "").toLowerCase().replace(/(^|_)([a-z])/gu, (_match, prefix, letter) => `${prefix ? " " : ""}${letter.toUpperCase()}`);
|
|
63393
63615
|
}
|
|
63394
63616
|
function dashboardImportPath() {
|
|
63395
|
-
return
|
|
63617
|
+
return join43(dirname22(resolveDbPath()), "provider-usage-snapshots.json");
|
|
63396
63618
|
}
|
|
63397
63619
|
function readDashboardUsageStore() {
|
|
63398
63620
|
const record2 = readJsonRecord(dashboardImportPath());
|
|
@@ -63406,8 +63628,8 @@ function readDashboardUsageStore() {
|
|
|
63406
63628
|
store2.providers[provider] = {
|
|
63407
63629
|
provider,
|
|
63408
63630
|
capturedAt,
|
|
63409
|
-
plan:
|
|
63410
|
-
periodLabel:
|
|
63631
|
+
plan: stringValue11(value?.plan),
|
|
63632
|
+
periodLabel: stringValue11(value?.periodLabel),
|
|
63411
63633
|
usedPercent: numericValue(value?.usedPercent),
|
|
63412
63634
|
resetAt: numericValue(value?.resetAt),
|
|
63413
63635
|
totalTokens: numericValue(value?.totalTokens),
|
|
@@ -63496,7 +63718,7 @@ async function loadGrokGauge() {
|
|
|
63496
63718
|
};
|
|
63497
63719
|
}
|
|
63498
63720
|
async function loadGrokBillingQuotaSnapshots() {
|
|
63499
|
-
const path2 =
|
|
63721
|
+
const path2 = join43(homeDir(), ".grok", "logs", "unified.jsonl");
|
|
63500
63722
|
const stat7 = safeStat(path2);
|
|
63501
63723
|
if (!stat7 || stat7.size <= 0)
|
|
63502
63724
|
return [];
|
|
@@ -63534,7 +63756,7 @@ async function loadGrokBillingQuotaSnapshots() {
|
|
|
63534
63756
|
}).sort((left, right) => left.capturedAt - right.capturedAt).slice(-PERSISTED_QUOTA_ROW_LIMIT);
|
|
63535
63757
|
}
|
|
63536
63758
|
function grokBillingQuotaSnapshot(record2) {
|
|
63537
|
-
if (!record2 ||
|
|
63759
|
+
if (!record2 || stringValue11(record2.msg) !== "billing: fetched credits config")
|
|
63538
63760
|
return null;
|
|
63539
63761
|
const context = recordValue(record2.ctx);
|
|
63540
63762
|
const config = recordValue(context?.config);
|
|
@@ -63545,7 +63767,7 @@ function grokBillingQuotaSnapshot(record2) {
|
|
|
63545
63767
|
const period = recordValue(config?.currentPeriod);
|
|
63546
63768
|
const startAt = timestampMs(period?.start) ?? timestampMs(config?.billingPeriodStart);
|
|
63547
63769
|
const resetAt = timestampMs(period?.end) ?? timestampMs(config?.billingPeriodEnd);
|
|
63548
|
-
const periodType =
|
|
63770
|
+
const periodType = stringValue11(period?.type)?.toUpperCase() ?? "";
|
|
63549
63771
|
const inferredWindowMs = periodType.includes("MONTH") ? 30 * 24 * 3600000 : WEEK_MS;
|
|
63550
63772
|
const windowMs = startAt !== undefined && resetAt !== undefined && resetAt > startAt ? resetAt - startAt : inferredWindowMs;
|
|
63551
63773
|
const label = periodType.includes("MONTH") ? "30d" : periodType.includes("WEEK") ? "7d" : formatWindowMs(windowMs) ?? "quota";
|
|
@@ -63554,7 +63776,7 @@ function grokBillingQuotaSnapshot(record2) {
|
|
|
63554
63776
|
provider: "xai",
|
|
63555
63777
|
harness: "grok",
|
|
63556
63778
|
transport: "grok_local_log",
|
|
63557
|
-
planType:
|
|
63779
|
+
planType: stringValue11(context?.subscriptionTier) ?? stringValue11(config?.subscriptionTier),
|
|
63558
63780
|
label,
|
|
63559
63781
|
windowKind: "subscription",
|
|
63560
63782
|
usedPercent,
|
|
@@ -63574,8 +63796,8 @@ function loadGrokLocalUsage() {
|
|
|
63574
63796
|
const usage = grokUsageFromRecord(parsed, Date.now());
|
|
63575
63797
|
return usage ? [usage] : [];
|
|
63576
63798
|
}
|
|
63577
|
-
const root =
|
|
63578
|
-
if (!
|
|
63799
|
+
const root = join43(homeDir(), ".grok", "sessions");
|
|
63800
|
+
if (!existsSync37(root))
|
|
63579
63801
|
return [];
|
|
63580
63802
|
const cutoff = Date.now() - WEEK_MS;
|
|
63581
63803
|
const paths2 = [];
|
|
@@ -63587,7 +63809,7 @@ function loadGrokLocalUsage() {
|
|
|
63587
63809
|
return;
|
|
63588
63810
|
}
|
|
63589
63811
|
for (const entry of entries) {
|
|
63590
|
-
const path2 =
|
|
63812
|
+
const path2 = join43(directory, entry.name);
|
|
63591
63813
|
if (entry.isDirectory())
|
|
63592
63814
|
walk(path2);
|
|
63593
63815
|
else if (entry.isFile() && entry.name === "updates.jsonl" && (safeStat(path2)?.mtimeMs ?? 0) >= cutoff)
|
|
@@ -63639,8 +63861,8 @@ function formatTokenCount(value) {
|
|
|
63639
63861
|
}
|
|
63640
63862
|
async function loadCursorGauge() {
|
|
63641
63863
|
const state = readCursorSubscriptionState();
|
|
63642
|
-
const membership =
|
|
63643
|
-
const subscriptionStatus =
|
|
63864
|
+
const membership = stringValue11(state?.membershipType);
|
|
63865
|
+
const subscriptionStatus = stringValue11(state?.subscriptionStatus);
|
|
63644
63866
|
const imported = readDashboardUsageStore().providers.cursor;
|
|
63645
63867
|
const dashboard = imported ? dashboardGauge(imported) : null;
|
|
63646
63868
|
if (!membership && !subscriptionStatus)
|
|
@@ -63665,11 +63887,11 @@ function readCursorSubscriptionState() {
|
|
|
63665
63887
|
return parseJsonRecord2(fixtureJson);
|
|
63666
63888
|
}
|
|
63667
63889
|
const candidates = [
|
|
63668
|
-
|
|
63669
|
-
|
|
63890
|
+
join43(homeDir(), "Library", "Application Support", "Cursor", "User", "globalStorage", "state.vscdb"),
|
|
63891
|
+
join43(homeDir(), ".config", "Cursor", "User", "globalStorage", "state.vscdb")
|
|
63670
63892
|
];
|
|
63671
63893
|
for (const path2 of candidates) {
|
|
63672
|
-
if (!
|
|
63894
|
+
if (!existsSync37(path2))
|
|
63673
63895
|
continue;
|
|
63674
63896
|
let cursorDb = null;
|
|
63675
63897
|
try {
|
|
@@ -63768,7 +63990,7 @@ async function readMinimaxRemainsResponse() {
|
|
|
63768
63990
|
}
|
|
63769
63991
|
function minimaxQuotaSnapshots(payload, capturedAt) {
|
|
63770
63992
|
return (Array.isArray(payload.model_remains) ? payload.model_remains : []).flatMap((model, index2) => {
|
|
63771
|
-
const modelName2 =
|
|
63993
|
+
const modelName2 = stringValue11(model.model_name) ?? `model-${index2 + 1}`;
|
|
63772
63994
|
const prefix = modelName2.toLowerCase() === "general" ? "" : `${modelName2} `;
|
|
63773
63995
|
const intervalStartAt = timestampMs(model.start_time);
|
|
63774
63996
|
const intervalEndAt = timestampMs(model.end_time);
|
|
@@ -63822,7 +64044,7 @@ function minimaxQuotaSnapshot(model, input) {
|
|
|
63822
64044
|
capturedAt: input.capturedAt,
|
|
63823
64045
|
metadata: {
|
|
63824
64046
|
source: "service-budgets.minimax-token-plan",
|
|
63825
|
-
modelName:
|
|
64047
|
+
modelName: stringValue11(model.model_name)
|
|
63826
64048
|
}
|
|
63827
64049
|
};
|
|
63828
64050
|
}
|
|
@@ -63916,20 +64138,20 @@ function githubQuotaSnapshot(core, capturedAt) {
|
|
|
63916
64138
|
}
|
|
63917
64139
|
function detectCloudAccounts() {
|
|
63918
64140
|
const accounts = [];
|
|
63919
|
-
const declaredAccounts = readJsonRecord(
|
|
64141
|
+
const declaredAccounts = readJsonRecord(join43(homeDir(), ".scout", "provider-accounts.json"));
|
|
63920
64142
|
const exeAccount = recordValue(declaredAccounts?.exe);
|
|
63921
|
-
if (exeAccount &&
|
|
64143
|
+
if (exeAccount && stringValue11(exeAccount.status)?.toLowerCase() !== "inactive") {
|
|
63922
64144
|
accounts.push({
|
|
63923
64145
|
id: "exe",
|
|
63924
64146
|
label: "exe.dev",
|
|
63925
64147
|
statusLabel: "Connected",
|
|
63926
|
-
detailLabel:
|
|
64148
|
+
detailLabel: stringValue11(exeAccount.detail) ?? "Persistent VMs for remote agents"
|
|
63927
64149
|
});
|
|
63928
64150
|
}
|
|
63929
64151
|
const cloudflareConfig = [
|
|
63930
|
-
|
|
63931
|
-
|
|
63932
|
-
|
|
64152
|
+
join43(homeDir(), "Library", "Preferences", ".wrangler", "config", "default.toml"),
|
|
64153
|
+
join43(homeDir(), ".wrangler", "config", "default.toml"),
|
|
64154
|
+
join43(homeDir(), ".config", ".wrangler", "config", "default.toml")
|
|
63933
64155
|
].find((path2) => fileContainsAny(path2, ["oauth_token", "api_token"]));
|
|
63934
64156
|
if (cloudflareConfig) {
|
|
63935
64157
|
accounts.push({
|
|
@@ -63940,10 +64162,10 @@ function detectCloudAccounts() {
|
|
|
63940
64162
|
});
|
|
63941
64163
|
}
|
|
63942
64164
|
const vercelConfig = [
|
|
63943
|
-
|
|
63944
|
-
|
|
63945
|
-
].map((path2) => readJsonRecord(path2)).find((record2) => Boolean(
|
|
63946
|
-
const vercelAuth =
|
|
64165
|
+
join43(homeDir(), "Library", "Application Support", "com.vercel.cli", "config.json"),
|
|
64166
|
+
join43(homeDir(), ".config", "com.vercel.cli", "config.json")
|
|
64167
|
+
].map((path2) => readJsonRecord(path2)).find((record2) => Boolean(stringValue11(record2?.currentTeam)));
|
|
64168
|
+
const vercelAuth = existsSync37(join43(homeDir(), ".local", "share", "com.vercel.cli", "auth.json"));
|
|
63947
64169
|
if (vercelConfig || vercelAuth) {
|
|
63948
64170
|
accounts.push({
|
|
63949
64171
|
id: "vercel",
|
|
@@ -64099,7 +64321,7 @@ function numericValue(value) {
|
|
|
64099
64321
|
}
|
|
64100
64322
|
return;
|
|
64101
64323
|
}
|
|
64102
|
-
function
|
|
64324
|
+
function stringValue11(value) {
|
|
64103
64325
|
return typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined;
|
|
64104
64326
|
}
|
|
64105
64327
|
function recordValue(value) {
|
|
@@ -64130,7 +64352,7 @@ function parseMetadataJson(value) {
|
|
|
64130
64352
|
}
|
|
64131
64353
|
}
|
|
64132
64354
|
function homeDir() {
|
|
64133
|
-
return process.env.HOME?.trim() ||
|
|
64355
|
+
return process.env.HOME?.trim() || homedir35();
|
|
64134
64356
|
}
|
|
64135
64357
|
function safeStat(path2) {
|
|
64136
64358
|
try {
|
|
@@ -64438,7 +64660,7 @@ init_src();
|
|
|
64438
64660
|
init_support_paths();
|
|
64439
64661
|
import { mkdir as mkdir10, readFile as readFile11, rename, writeFile as writeFile8 } from "fs/promises";
|
|
64440
64662
|
import { randomUUID as randomUUID5 } from "crypto";
|
|
64441
|
-
import { dirname as dirname23, join as
|
|
64663
|
+
import { dirname as dirname23, join as join44 } from "path";
|
|
64442
64664
|
class ScoutbotThreadMapStore {
|
|
64443
64665
|
filePath;
|
|
64444
64666
|
constructor(filePath = defaultScoutbotThreadMapPath()) {
|
|
@@ -64593,7 +64815,7 @@ class ScoutbotThreadMapStore {
|
|
|
64593
64815
|
}
|
|
64594
64816
|
}
|
|
64595
64817
|
function defaultScoutbotThreadMapPath() {
|
|
64596
|
-
return
|
|
64818
|
+
return join44(resolveOpenScoutSupportPaths().supportDirectory, "scoutbot-threads.json");
|
|
64597
64819
|
}
|
|
64598
64820
|
function chooseDefaultConversationId(snapshot) {
|
|
64599
64821
|
const existing = Object.values(snapshot?.conversations ?? {}).find((conversation) => conversation.metadata?.scoutbotThreadId === SCOUTBOT_DEFAULT_THREAD_ID && isOpaqueChannelId(conversation.id));
|
|
@@ -65081,7 +65303,7 @@ async function admitScoutbotTurn(key, thread, snapshot, post) {
|
|
|
65081
65303
|
// ../web/server/pairing.ts
|
|
65082
65304
|
import {
|
|
65083
65305
|
closeSync,
|
|
65084
|
-
existsSync as
|
|
65306
|
+
existsSync as existsSync38,
|
|
65085
65307
|
mkdirSync as mkdirSync18,
|
|
65086
65308
|
openSync,
|
|
65087
65309
|
readFileSync as readFileSync23,
|
|
@@ -65090,8 +65312,8 @@ import {
|
|
|
65090
65312
|
unlinkSync as unlinkSync3,
|
|
65091
65313
|
writeFileSync as writeFileSync14
|
|
65092
65314
|
} from "fs";
|
|
65093
|
-
import { homedir as
|
|
65094
|
-
import { dirname as dirname24, join as
|
|
65315
|
+
import { homedir as homedir36 } from "os";
|
|
65316
|
+
import { dirname as dirname24, join as join45, resolve as resolve16 } from "path";
|
|
65095
65317
|
init_setup();
|
|
65096
65318
|
init_local_config();
|
|
65097
65319
|
init_tool_resolution();
|
|
@@ -65108,18 +65330,18 @@ var SCOUT_PAIRING_BRIDGE_CONNECT_TIMEOUT_MS = 1500;
|
|
|
65108
65330
|
var SCOUT_PAIRING_BRIDGE_REQUEST_TIMEOUT_MS = 2500;
|
|
65109
65331
|
function resolveScoutPairingHomeDirectory() {
|
|
65110
65332
|
const configured = process.env.OPENSCOUT_PAIRING_HOME?.trim() || process.env.SCOUT_PAIRING_HOME?.trim();
|
|
65111
|
-
return configured ||
|
|
65333
|
+
return configured || join45(homedir36(), SCOUT_PAIRING_HOME_DIRECTORY);
|
|
65112
65334
|
}
|
|
65113
65335
|
function resolveScoutPairingPaths() {
|
|
65114
65336
|
const rootDir = resolveScoutPairingHomeDirectory();
|
|
65115
65337
|
return {
|
|
65116
65338
|
rootDir,
|
|
65117
|
-
configPath:
|
|
65118
|
-
identityPath:
|
|
65119
|
-
trustedPeersPath:
|
|
65120
|
-
logPath:
|
|
65121
|
-
runtimeStatePath:
|
|
65122
|
-
runtimePidPath:
|
|
65339
|
+
configPath: join45(rootDir, SCOUT_PAIRING_CONFIG_FILE),
|
|
65340
|
+
identityPath: join45(rootDir, SCOUT_PAIRING_IDENTITY_FILE),
|
|
65341
|
+
trustedPeersPath: join45(rootDir, SCOUT_PAIRING_TRUSTED_PEERS_FILE),
|
|
65342
|
+
logPath: join45(rootDir, SCOUT_PAIRING_LOG_FILE),
|
|
65343
|
+
runtimeStatePath: join45(rootDir, SCOUT_PAIRING_RUNTIME_STATE_FILE),
|
|
65344
|
+
runtimePidPath: join45(rootDir, SCOUT_PAIRING_RUNTIME_PID_FILE)
|
|
65123
65345
|
};
|
|
65124
65346
|
}
|
|
65125
65347
|
function createScoutPairingBridgeUrl(port) {
|
|
@@ -65280,7 +65502,7 @@ async function readScoutPairingSessionSnapshots(port) {
|
|
|
65280
65502
|
}
|
|
65281
65503
|
function loadScoutPairingConfig() {
|
|
65282
65504
|
const { configPath } = resolveScoutPairingPaths();
|
|
65283
|
-
if (!
|
|
65505
|
+
if (!existsSync38(configPath)) {
|
|
65284
65506
|
return {};
|
|
65285
65507
|
}
|
|
65286
65508
|
try {
|
|
@@ -65305,7 +65527,7 @@ function resolveScoutPairingConfig() {
|
|
|
65305
65527
|
}
|
|
65306
65528
|
function readScoutPairingRuntimeSnapshot() {
|
|
65307
65529
|
const { runtimeStatePath } = resolveScoutPairingPaths();
|
|
65308
|
-
if (!
|
|
65530
|
+
if (!existsSync38(runtimeStatePath)) {
|
|
65309
65531
|
return null;
|
|
65310
65532
|
}
|
|
65311
65533
|
try {
|
|
@@ -65317,7 +65539,7 @@ function readScoutPairingRuntimeSnapshot() {
|
|
|
65317
65539
|
}
|
|
65318
65540
|
function readScoutPairingRuntimePid() {
|
|
65319
65541
|
const { runtimePidPath } = resolveScoutPairingPaths();
|
|
65320
|
-
if (!
|
|
65542
|
+
if (!existsSync38(runtimePidPath)) {
|
|
65321
65543
|
return null;
|
|
65322
65544
|
}
|
|
65323
65545
|
try {
|
|
@@ -65360,8 +65582,8 @@ async function getScoutWebPairingSessionSnapshots() {
|
|
|
65360
65582
|
|
|
65361
65583
|
// ../web/server/core/agent-endpoints.ts
|
|
65362
65584
|
init_src();
|
|
65363
|
-
import { homedir as
|
|
65364
|
-
import { join as
|
|
65585
|
+
import { homedir as homedir37 } from "os";
|
|
65586
|
+
import { join as join46, resolve as resolve17 } from "path";
|
|
65365
65587
|
function endpointMetadataRecord(endpoint) {
|
|
65366
65588
|
return endpoint?.metadata && typeof endpoint.metadata === "object" && !Array.isArray(endpoint.metadata) ? endpoint.metadata : {};
|
|
65367
65589
|
}
|
|
@@ -65395,10 +65617,10 @@ function endpointSessionAliases(endpoint) {
|
|
|
65395
65617
|
}
|
|
65396
65618
|
function expandHomePath5(value) {
|
|
65397
65619
|
if (value === "~") {
|
|
65398
|
-
return
|
|
65620
|
+
return homedir37();
|
|
65399
65621
|
}
|
|
65400
65622
|
if (value.startsWith("~/")) {
|
|
65401
|
-
return
|
|
65623
|
+
return join46(homedir37(), value.slice(2));
|
|
65402
65624
|
}
|
|
65403
65625
|
return value;
|
|
65404
65626
|
}
|
|
@@ -66737,7 +66959,7 @@ import { createHash as createHash10 } from "crypto";
|
|
|
66737
66959
|
import {
|
|
66738
66960
|
chmodSync as chmodSync2,
|
|
66739
66961
|
closeSync as closeSync2,
|
|
66740
|
-
existsSync as
|
|
66962
|
+
existsSync as existsSync39,
|
|
66741
66963
|
mkdirSync as mkdirSync19,
|
|
66742
66964
|
openSync as openSync2,
|
|
66743
66965
|
readFileSync as readFileSync24,
|
|
@@ -66745,8 +66967,8 @@ import {
|
|
|
66745
66967
|
unlinkSync as unlinkSync4,
|
|
66746
66968
|
writeFileSync as writeFileSync15
|
|
66747
66969
|
} from "fs";
|
|
66748
|
-
import { homedir as
|
|
66749
|
-
import { join as
|
|
66970
|
+
import { homedir as homedir38, hostname as hostname3, userInfo as userInfo2 } from "os";
|
|
66971
|
+
import { join as join47 } from "path";
|
|
66750
66972
|
|
|
66751
66973
|
// ../web/server/core/pairing/runtime/bridge/ssh-terminal-access.ts
|
|
66752
66974
|
import { createHash as createHash8 } from "crypto";
|
|
@@ -66973,8 +67195,8 @@ function authorizedMobileTerminalSessionName(requestedSessionName, provisionedSe
|
|
|
66973
67195
|
|
|
66974
67196
|
// ../web/server/core/pairing/runtime/bridge/mobile-terminal-provision.ts
|
|
66975
67197
|
async function readMobileTerminalStatus(requestedSessionName, deviceId) {
|
|
66976
|
-
const authorizedKeysPath =
|
|
66977
|
-
const authorizedKeys =
|
|
67198
|
+
const authorizedKeysPath = join47(homedir38(), ".ssh", "authorized_keys");
|
|
67199
|
+
const authorizedKeys = existsSync39(authorizedKeysPath) ? readFileSync24(authorizedKeysPath, "utf8") : "";
|
|
66978
67200
|
const provisionedSessionName = findSshTerminalSessionForDevice(authorizedKeys, deviceId);
|
|
66979
67201
|
const sessionName = authorizedMobileTerminalSessionName(requestedSessionName, provisionedSessionName);
|
|
66980
67202
|
const base = {
|
|
@@ -67046,17 +67268,17 @@ async function readMobileTerminalStatus(requestedSessionName, deviceId) {
|
|
|
67046
67268
|
async function provisionMobileTerminalAccess(sshPublicKey, deviceId, deviceClass = undefined) {
|
|
67047
67269
|
const id = deviceId?.trim() || "scout-ios-device";
|
|
67048
67270
|
const sessionName = provisionedMobileTerminalSessionName(sshPublicKey, deviceClass);
|
|
67049
|
-
const sshDir =
|
|
67050
|
-
const authorizedKeysPath =
|
|
67271
|
+
const sshDir = join47(homedir38(), ".ssh");
|
|
67272
|
+
const authorizedKeysPath = join47(sshDir, "authorized_keys");
|
|
67051
67273
|
const hostKeyFingerprint = readRequiredHostKeyFingerprint();
|
|
67052
67274
|
const result = withAuthorizedKeysLock(sshDir, () => {
|
|
67053
|
-
if (!
|
|
67275
|
+
if (!existsSync39(sshDir)) {
|
|
67054
67276
|
mkdirSync19(sshDir, { recursive: true, mode: 448 });
|
|
67055
67277
|
}
|
|
67056
67278
|
try {
|
|
67057
67279
|
chmodSync2(sshDir, 448);
|
|
67058
67280
|
} catch {}
|
|
67059
|
-
const existing =
|
|
67281
|
+
const existing = existsSync39(authorizedKeysPath) ? readFileSync24(authorizedKeysPath, "utf8") : "";
|
|
67060
67282
|
const result2 = provisionSshTerminalAccess({
|
|
67061
67283
|
authorizedKeys: existing,
|
|
67062
67284
|
deviceId: id,
|
|
@@ -67128,10 +67350,10 @@ function writeAuthorizedKeysAtomically(path2, contents) {
|
|
|
67128
67350
|
}
|
|
67129
67351
|
}
|
|
67130
67352
|
function withAuthorizedKeysLock(sshDir, action) {
|
|
67131
|
-
if (!
|
|
67353
|
+
if (!existsSync39(sshDir)) {
|
|
67132
67354
|
mkdirSync19(sshDir, { recursive: true, mode: 448 });
|
|
67133
67355
|
}
|
|
67134
|
-
const lockPath =
|
|
67356
|
+
const lockPath = join47(sshDir, ".scout-authorized-keys.lock");
|
|
67135
67357
|
const deadline = Date.now() + 5000;
|
|
67136
67358
|
let fd = null;
|
|
67137
67359
|
while (fd === null) {
|
|
@@ -67724,7 +67946,7 @@ async function handleRPCInner(bridge, req, rpcContext = {}) {
|
|
|
67724
67946
|
const config = resolveConfig();
|
|
67725
67947
|
const workspaceRoot = config.workspace?.root ? resolveWorkspaceRoot(config.workspace.root) : null;
|
|
67726
67948
|
const matches = await readSessionSearch({
|
|
67727
|
-
home:
|
|
67949
|
+
home: homedir39(),
|
|
67728
67950
|
workspaceRoot,
|
|
67729
67951
|
maxAgeDays: maxAge,
|
|
67730
67952
|
limit,
|
|
@@ -67860,13 +68082,13 @@ function resolveMobileCurrentDirectory() {
|
|
|
67860
68082
|
}
|
|
67861
68083
|
}
|
|
67862
68084
|
function resolveWorkspaceRoot(root) {
|
|
67863
|
-
const expandedRoot = root.replace(/^~/,
|
|
68085
|
+
const expandedRoot = root.replace(/^~/, homedir39());
|
|
67864
68086
|
return realpathSync5(expandedRoot);
|
|
67865
68087
|
}
|
|
67866
68088
|
function resolveWorkspacePath(root, requestedPath) {
|
|
67867
68089
|
const normalizedRoot = resolveWorkspaceRoot(root);
|
|
67868
|
-
const expandedPath = requestedPath?.replace(/^~/,
|
|
67869
|
-
const candidate = expandedPath ? isAbsolute7(expandedPath) ? expandedPath :
|
|
68090
|
+
const expandedPath = requestedPath?.replace(/^~/, homedir39());
|
|
68091
|
+
const candidate = expandedPath ? isAbsolute7(expandedPath) ? expandedPath : join48(normalizedRoot, expandedPath) : normalizedRoot;
|
|
67870
68092
|
const resolvedCandidate = realpathSync5(candidate);
|
|
67871
68093
|
const rel = relative6(normalizedRoot, resolvedCandidate);
|
|
67872
68094
|
if (rel === "" || !rel.startsWith("..") && !isAbsolute7(rel)) {
|
|
@@ -67896,7 +68118,7 @@ function listDirectories(dirPath) {
|
|
|
67896
68118
|
continue;
|
|
67897
68119
|
if (name2 === "node_modules" || name2 === ".build" || name2 === "target")
|
|
67898
68120
|
continue;
|
|
67899
|
-
const fullPath =
|
|
68121
|
+
const fullPath = join48(dirPath, name2);
|
|
67900
68122
|
try {
|
|
67901
68123
|
const stat7 = statSync14(fullPath);
|
|
67902
68124
|
if (!stat7.isDirectory())
|
|
@@ -67922,7 +68144,7 @@ async function discoverSessionFiles(maxAgeDays, limit) {
|
|
|
67922
68144
|
const config = resolveConfig();
|
|
67923
68145
|
const workspaceRoot = config.workspace?.root ? resolveWorkspaceRoot(config.workspace.root) : null;
|
|
67924
68146
|
const sessions4 = await readSessionFileScan({
|
|
67925
|
-
home:
|
|
68147
|
+
home: homedir39(),
|
|
67926
68148
|
workspaceRoot,
|
|
67927
68149
|
maxAgeDays,
|
|
67928
68150
|
limit
|
|
@@ -79730,7 +79952,7 @@ function finalize(ctx, schema2) {
|
|
|
79730
79952
|
result.$schema = "http://json-schema.org/draft-07/schema#";
|
|
79731
79953
|
} else if (ctx.target === "draft-04") {
|
|
79732
79954
|
result.$schema = "http://json-schema.org/draft-04/schema#";
|
|
79733
|
-
} else if (ctx.target === "openapi-3.0") {}
|
|
79955
|
+
} else if (ctx.target === "openapi-3.0") {}
|
|
79734
79956
|
if (ctx.external?.uri) {
|
|
79735
79957
|
const id = ctx.external.registry.get(schema2)?.id;
|
|
79736
79958
|
if (!id)
|
|
@@ -79978,7 +80200,7 @@ var literalProcessor = (schema2, ctx, json2, _params) => {
|
|
|
79978
80200
|
if (val === undefined) {
|
|
79979
80201
|
if (ctx.unrepresentable === "throw") {
|
|
79980
80202
|
throw new Error("Literal `undefined` cannot be represented in JSON Schema");
|
|
79981
|
-
}
|
|
80203
|
+
}
|
|
79982
80204
|
} else if (typeof val === "bigint") {
|
|
79983
80205
|
if (ctx.unrepresentable === "throw") {
|
|
79984
80206
|
throw new Error("BigInt literals cannot be represented in JSON Schema");
|
|
@@ -82328,8 +82550,8 @@ init_system_probes();
|
|
|
82328
82550
|
init_local_config();
|
|
82329
82551
|
init_local_agents();
|
|
82330
82552
|
import { readFileSync as readFileSync26, readdirSync as readdirSync8, realpathSync as realpathSync6, statSync as statSync15 } from "fs";
|
|
82331
|
-
import { basename as basename17, isAbsolute as isAbsolute8, join as
|
|
82332
|
-
import { homedir as
|
|
82553
|
+
import { basename as basename17, isAbsolute as isAbsolute8, join as join49, relative as relative7, resolve as resolve20 } from "path";
|
|
82554
|
+
import { homedir as homedir40 } from "os";
|
|
82333
82555
|
var t = initTRPC.context().create();
|
|
82334
82556
|
var logged = t.middleware(async ({ path: path2, type, next }) => {
|
|
82335
82557
|
const start = Date.now();
|
|
@@ -82495,13 +82717,13 @@ function resolveMobileCurrentDirectory2() {
|
|
|
82495
82717
|
}
|
|
82496
82718
|
}
|
|
82497
82719
|
function resolveWorkspaceRoot2(root) {
|
|
82498
|
-
const expandedRoot = root.replace(/^~/,
|
|
82720
|
+
const expandedRoot = root.replace(/^~/, homedir40());
|
|
82499
82721
|
return realpathSync6(expandedRoot);
|
|
82500
82722
|
}
|
|
82501
82723
|
function resolveWorkspacePath2(root, requestedPath) {
|
|
82502
82724
|
const normalizedRoot = resolveWorkspaceRoot2(root);
|
|
82503
|
-
const expandedPath = requestedPath?.replace(/^~/,
|
|
82504
|
-
const candidate = expandedPath ? isAbsolute8(expandedPath) ? expandedPath :
|
|
82725
|
+
const expandedPath = requestedPath?.replace(/^~/, homedir40());
|
|
82726
|
+
const candidate = expandedPath ? isAbsolute8(expandedPath) ? expandedPath : join49(normalizedRoot, expandedPath) : normalizedRoot;
|
|
82505
82727
|
const resolvedCandidate = realpathSync6(candidate);
|
|
82506
82728
|
const rel = relative7(normalizedRoot, resolvedCandidate);
|
|
82507
82729
|
if (rel === "" || !rel.startsWith("..") && !isAbsolute8(rel)) {
|
|
@@ -82531,7 +82753,7 @@ function listDirectories2(dirPath) {
|
|
|
82531
82753
|
continue;
|
|
82532
82754
|
if (name2 === "node_modules" || name2 === ".build" || name2 === "target")
|
|
82533
82755
|
continue;
|
|
82534
|
-
const fullPath =
|
|
82756
|
+
const fullPath = join49(dirPath, name2);
|
|
82535
82757
|
try {
|
|
82536
82758
|
const stat7 = statSync15(fullPath);
|
|
82537
82759
|
if (!stat7.isDirectory())
|
|
@@ -82564,7 +82786,7 @@ async function discoverSessionFiles2(maxAgeDays, limit) {
|
|
|
82564
82786
|
const config2 = resolveConfig();
|
|
82565
82787
|
const workspaceRoot = config2.workspace?.root ? resolveWorkspaceRoot2(config2.workspace.root) : null;
|
|
82566
82788
|
const sessions4 = await readSessionFileScan({
|
|
82567
|
-
home:
|
|
82789
|
+
home: homedir40(),
|
|
82568
82790
|
workspaceRoot,
|
|
82569
82791
|
maxAgeDays,
|
|
82570
82792
|
limit
|
|
@@ -83253,7 +83475,7 @@ var historyRouter = t.router({
|
|
|
83253
83475
|
const config2 = resolveConfig();
|
|
83254
83476
|
const workspaceRoot = config2.workspace?.root ? resolveWorkspaceRoot2(config2.workspace.root) : null;
|
|
83255
83477
|
const matches = await readSessionSearch({
|
|
83256
|
-
home:
|
|
83478
|
+
home: homedir40(),
|
|
83257
83479
|
workspaceRoot,
|
|
83258
83480
|
maxAgeDays: maxAge,
|
|
83259
83481
|
limit,
|
|
@@ -85418,14 +85640,14 @@ function observableToAsyncIterable(observable$1, signal2) {
|
|
|
85418
85640
|
}
|
|
85419
85641
|
// ../web/server/core/pairing/runtime/bridge/server-trpc.ts
|
|
85420
85642
|
import { realpathSync as realpathSync7 } from "fs";
|
|
85421
|
-
import { homedir as
|
|
85643
|
+
import { homedir as homedir41 } from "os";
|
|
85422
85644
|
function resolveCurrentDirectory() {
|
|
85423
85645
|
try {
|
|
85424
85646
|
const config2 = resolveConfig();
|
|
85425
85647
|
const configuredRoot = config2.workspace?.root;
|
|
85426
85648
|
if (!configuredRoot)
|
|
85427
85649
|
return process.cwd();
|
|
85428
|
-
const expanded = configuredRoot.replace(/^~/,
|
|
85650
|
+
const expanded = configuredRoot.replace(/^~/, homedir41());
|
|
85429
85651
|
return realpathSync7(expanded);
|
|
85430
85652
|
} catch {
|
|
85431
85653
|
return process.cwd();
|
|
@@ -85960,16 +86182,17 @@ function isAsyncIterable(value) {
|
|
|
85960
86182
|
// ../web/server/core/pairing/runtime/runtime.ts
|
|
85961
86183
|
function createPairingAdapterRegistry(configAdapters) {
|
|
85962
86184
|
const adapters = {
|
|
85963
|
-
"claude-code":
|
|
86185
|
+
"claude-code": createAdapter7,
|
|
85964
86186
|
acp: createAdapter,
|
|
85965
|
-
codex:
|
|
86187
|
+
codex: createAdapter8,
|
|
86188
|
+
"devin-acp": createAdapter5,
|
|
85966
86189
|
"grok-acp": createAdapter2,
|
|
85967
86190
|
"kimi-acp": createAdapter3,
|
|
85968
|
-
pi:
|
|
85969
|
-
opencode:
|
|
86191
|
+
pi: createAdapter6,
|
|
86192
|
+
opencode: createAdapter10,
|
|
85970
86193
|
"opencode-acp": createAdapter4,
|
|
85971
|
-
"opencode-v2":
|
|
85972
|
-
openai:
|
|
86194
|
+
"opencode-v2": createAdapter11,
|
|
86195
|
+
openai: createAdapter9
|
|
85973
86196
|
};
|
|
85974
86197
|
if (configAdapters) {
|
|
85975
86198
|
for (const [name2, entry] of Object.entries(configAdapters)) {
|
|
@@ -86112,7 +86335,7 @@ async function autoStartConfiguredSessions(bridge, sessions4) {
|
|
|
86112
86335
|
try {
|
|
86113
86336
|
const session = await bridge.createSession(entry.adapter, {
|
|
86114
86337
|
name: entry.name,
|
|
86115
|
-
cwd: entry.cwd?.replace(/^~/,
|
|
86338
|
+
cwd: entry.cwd?.replace(/^~/, homedir42()),
|
|
86116
86339
|
options: entry.options
|
|
86117
86340
|
});
|
|
86118
86341
|
console.log(`[bridge] session started: ${session.name} (${entry.adapter})`);
|