ryco-cli 0.1.26 → 0.1.27
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/dist/{AcpAdapter-CadxcdZV.cjs → AcpAdapter-CZc_JW7_.cjs} +5 -5
- package/dist/{AcpAdapter-BemMQNbj.mjs → AcpAdapter-DoRyx18Q.mjs} +5 -5
- package/dist/{AcpNativeLogging-BsbZRRD7.mjs → AcpNativeLogging-FscLjPYB.mjs} +2 -2
- package/dist/{AcpNativeLogging-DZPZNoju.cjs → AcpNativeLogging-WQZ0Jm4p.cjs} +1 -1
- package/dist/{AcpRegistryDriver-BpXCjh9I.mjs → AcpRegistryDriver-1FCrMtNw.mjs} +4 -4
- package/dist/{AcpRegistryDriver-BfCPf8FX.cjs → AcpRegistryDriver-BmdM0rgN.cjs} +5 -5
- package/dist/{AzureDevOpsSourceControlProvider-BcQO_CyW.mjs → AzureDevOpsSourceControlProvider-9bLYTK0M.mjs} +2 -3
- package/dist/{AzureDevOpsSourceControlProvider-B9N_8NJg.cjs → AzureDevOpsSourceControlProvider-DW5RKUeo.cjs} +6 -7
- package/dist/{BitbucketSourceControlProvider-C9WuwvY2.cjs → BitbucketSourceControlProvider-CMHRxVsd.cjs} +6 -7
- package/dist/{BitbucketSourceControlProvider-BTUY2ZT8.mjs → BitbucketSourceControlProvider-Cl3sSLIx.mjs} +2 -3
- package/dist/{BunPTY-DdnqQAdw.mjs → BunPTY-Dfgo5uCn.mjs} +1 -1
- package/dist/{ClaudeDriver-Csnp78qR.mjs → ClaudeDriver-B3h2ood6.mjs} +132 -30
- package/dist/{ClaudeDriver-BSTxNNGO.cjs → ClaudeDriver-CyPp-Fs3.cjs} +148 -45
- package/dist/{CodexDriver-BK4HVNV4.cjs → CodexDriver-BP3EtJ0S.cjs} +14 -14
- package/dist/{CodexDriver-fwcV84hX.mjs → CodexDriver-CN6idmnS.mjs} +6 -6
- package/dist/{CodexTextGeneration-Y2GSS7f1.cjs → CodexTextGeneration-B1kQOBKx.cjs} +8 -8
- package/dist/{CodexTextGeneration-_4aT5BHa.mjs → CodexTextGeneration-zuVszBVZ.mjs} +5 -5
- package/dist/{CopilotDriver-B12ZJ-L_.mjs → CopilotDriver-BYrkdbjf.mjs} +7 -7
- package/dist/{CopilotDriver-C7IyIwVW.cjs → CopilotDriver-DXAV2YFZ.cjs} +16 -16
- package/dist/{CursorDriver-C_p0v-ul.mjs → CursorDriver-BhxUUcPd.mjs} +7 -7
- package/dist/{CursorDriver-BWmCfJ-w.cjs → CursorDriver-DqFJ48VM.cjs} +15 -15
- package/dist/{ForgejoSourceControlProvider-DTRrllIH.cjs → ForgejoSourceControlProvider-BaX8QACC.cjs} +6 -7
- package/dist/{ForgejoSourceControlProvider-DmOGJEaJ.mjs → ForgejoSourceControlProvider-Dd70jIKU.mjs} +2 -3
- package/dist/{GitHubSourceControlProvider-sQGcwnr3.mjs → GitHubSourceControlProvider-C7BTtssl.mjs} +2 -3
- package/dist/{GitHubSourceControlProvider-D-YV8WP6.cjs → GitHubSourceControlProvider-bB3VvbjC.cjs} +4 -5
- package/dist/{GitLabSourceControlProvider-kKYYnpER.cjs → GitLabSourceControlProvider-CpPjVL2v.cjs} +6 -7
- package/dist/{GitLabSourceControlProvider-mIl-K-4F.mjs → GitLabSourceControlProvider-DtYBP_yY.mjs} +2 -3
- package/dist/{GrokDriver-BFOniP_K.cjs → GrokDriver-B66NTem3.cjs} +9 -9
- package/dist/{GrokDriver-CDcWkiAi.mjs → GrokDriver-DM1NdZRk.mjs} +6 -6
- package/dist/{NodePTY-DArvQ9bX.mjs → NodePTY-BtRL0A34.mjs} +1 -1
- package/dist/{OpenCodeDriver-CnWJHyDJ.mjs → OpenCodeDriver-DH41ibjc.mjs} +7 -7
- package/dist/{OpenCodeDriver-CckbFEQJ.cjs → OpenCodeDriver-DeSH_rjs.cjs} +17 -17
- package/dist/{SideQuestionIsolation-5eGFRW0t.mjs → SideQuestionIsolation-Dn-HWCtI.mjs} +1 -1
- package/dist/{SideQuestionIsolation-DvVKZWxi.cjs → SideQuestionIsolation-pW7UQKVD.cjs} +1 -1
- package/dist/bin.cjs +11516 -9316
- package/dist/bin.mjs +11166 -8960
- package/dist/client/assets/AccountSettings-CEf7oALI.js +1 -0
- package/dist/client/assets/AiFocusSettings-Bx0qzXZb.js +1 -0
- package/dist/client/assets/AnimatedHeight-BdPmCa-2.js +1 -0
- package/dist/client/assets/AppearanceSettings-dR9CQ8NA.js +1 -0
- package/dist/client/assets/BranchToolbar.logic-h0d4Ciue.js +3 -0
- package/dist/client/assets/BrowserPanel-D8lPv8fb.js +1 -0
- package/dist/client/assets/ChatRightPanel-Dn-7Xvyc.js +199 -0
- package/dist/client/assets/ChatThreadRouteView-DVBC81zl.js +1 -0
- package/dist/client/assets/CommandPaletteDialog-BNYMM9Z4.js +1 -0
- package/dist/client/assets/CompositeRoot-C2w3pPeh.js +1 -0
- package/dist/client/assets/ComputerUseSettings-Cs_Owo6-.js +1 -0
- package/dist/client/assets/ConnectionsSettings-DEi2p0zo.js +7 -0
- package/dist/client/assets/ContextHandoffEndpointLabel-DS0hRX6s.js +4 -0
- package/dist/client/assets/DiagnosticsSettings-YBPSnfRV.js +2 -0
- package/dist/client/assets/DialogHandle-4vx7sbjo.js +1 -0
- package/dist/client/assets/DialogPopup-B0PxwE99.js +1 -0
- package/dist/client/assets/DialogRoot-m4XA9S7t.js +1 -0
- package/dist/client/assets/DialogTitle-BYcCdrqC.js +1 -0
- package/dist/client/assets/DialogTrigger-DJWPHhX_.js +1 -0
- package/dist/client/assets/DialogViewport-UVYw-6p8.js +1 -0
- package/dist/client/assets/DraftChatThreadRouteView-BSqiqymo.js +1 -0
- package/dist/client/assets/{ExternalIdentityWeb.logic-CrcNfdHK.js → ExternalIdentityWeb.logic-BcfjLeSk.js} +1 -1
- package/dist/client/assets/{GlassSurface-CBIEgwt1.js → GlassSurface-YfHTds9q.js} +1 -1
- package/dist/client/assets/HostedConnectionControls-zCFvpOtX.js +1 -0
- package/dist/client/assets/HostedHubRoot-Dhp_vsh3.js +2 -0
- package/dist/client/assets/HostedNativeAuthorizationRoute-Dk-X6kyE.js +2 -0
- package/dist/client/assets/HostedNodeRenameDialog-BPmZUTA0.js +1 -0
- package/dist/client/assets/HostedRelayTrustNotice-9UBK7nWp.js +1 -0
- package/dist/client/assets/IntegrationsSettingsPanel-Dx_DA-GV.js +2 -0
- package/dist/client/assets/KeybindingsSettings-CXhTidkh.js +7 -0
- package/dist/client/assets/LazyBrowserPanel-B7krhylG.js +2 -0
- package/dist/client/assets/McpServersSettings-DaSVryrF.js +6 -0
- package/dist/client/assets/MobileSheet-CJK9LUkP.js +1 -0
- package/dist/client/assets/NodeSecuritySettings-D8-nbjl0.js +1 -0
- package/dist/client/assets/NullStore-B1qVh9r1.js +1 -0
- package/dist/client/assets/OnboardingDialog-BouStRFq.js +1 -0
- package/dist/client/assets/OpinionatedPluginsSettings-Dell0ad6.js +1 -0
- package/dist/client/assets/{PdfAttachmentPreview-BCMO9OHD.js → PdfAttachmentPreview-Cxmy8p4o.js} +3 -3
- package/dist/client/assets/PhoneGetAppInterstitial-DApTgg3Y.js +1 -0
- package/dist/client/assets/PhoneHome-Clzp8GJr.js +1 -0
- package/dist/client/assets/PhoneSettingsSurface-ByGQx_24.js +2 -0
- package/dist/client/assets/ProvidersSettingsPanel-BqIyPjmD.js +1 -0
- package/dist/client/assets/QuitShortcutFeedback-fpDQ3cUQ.js +1 -0
- package/dist/client/assets/RedactedSensitiveText-CcYd2px8.js +1 -0
- package/dist/client/assets/RootAppShell-CWZbIY7q.js +7 -0
- package/dist/client/assets/Separator-phTJr0Qx.js +1 -0
- package/dist/client/assets/SettingsDialog-TJfJzHN9.js +2 -0
- package/dist/client/assets/SettingsPanels-DWkzFTVO.js +3 -0
- package/dist/client/assets/SettingsPanels.editor-Cml3ZnL4.js +1 -0
- package/dist/client/assets/SourceControlSettings-C-4QtBJz.js +1 -0
- package/dist/client/assets/StatisticsPage-DcHPYglK.js +1 -0
- package/dist/client/assets/StatisticsPanel-BaobZm_7.js +1 -0
- package/dist/client/assets/StatisticsSettingsLink-D495bF8R.js +1 -0
- package/dist/client/assets/ThreadTerminalDrawer-erl6kZF6.js +18 -0
- package/dist/client/assets/ThreadWorkspacePanel-CdlvFu_u.js +2074 -0
- package/dist/client/assets/abnfDiagram-N423BO3Z-BAYNysM5.js +1 -0
- package/dist/client/assets/{activity-BmRcsTyL.js → activity-BdLqP9i_.js} +1 -1
- package/dist/client/assets/{alert-C5UiA2xk.js → alert-DPLHJUsX.js} +1 -1
- package/dist/client/assets/angular-html-B8mrqUL5.js +1 -0
- package/dist/client/assets/{angular-ts-BQK9km6-.js → angular-ts-Bzix210W.js} +1 -1
- package/dist/client/assets/{apl-C92MddLO.js → apl-Dhin1L29.js} +1 -1
- package/dist/client/assets/{appChrome-CsZ2ylc1.js → appChrome-DWDme9Dt.js} +1 -1
- package/dist/client/assets/arc-BbkdAXW7.js +1 -0
- package/dist/client/assets/architecture-7GRP2DOG-BJtkrWuJ.js +1 -0
- package/dist/client/assets/architectureDiagram-T3A2C74G-C8_Cvj7E.js +36 -0
- package/dist/client/assets/{arrow-left-CSz-z20j.js → arrow-left-BAJW4wtE.js} +1 -1
- package/dist/client/assets/{arrow-right-DEi91hao.js → arrow-right-Dns94Sea.js} +1 -1
- package/dist/client/assets/{arrow-up-right-D7SpcTV9.js → arrow-up-right-B4jqikrK.js} +1 -1
- package/dist/client/assets/{astro-CV97iv9o.js → astro-B-4NNgOP.js} +1 -1
- package/dist/client/assets/authorization-DMv-wK-V.js +1 -0
- package/dist/client/assets/badge-DLmSMsDm.js +1 -0
- package/dist/client/assets/band-DZ4Jagyz.js +1 -0
- package/dist/client/assets/{blade-yJCl9jZA.js → blade-C6Gedziy.js} +1 -1
- package/dist/client/assets/blockDiagram-VBNYF7ZC-B75XFMEV.js +132 -0
- package/dist/client/assets/{bot-SC4UGZyw.js → bot-Dv0XDWJs.js} +1 -1
- package/dist/client/assets/c-iCihek07.js +1 -0
- package/dist/client/assets/c4Diagram-5PPSVZJV-DwxLnQVX.js +10 -0
- package/dist/client/assets/capabilities-8t5cq9FQ.js +1 -0
- package/dist/client/assets/channel-BBNf4NuI.js +1 -0
- package/dist/client/assets/{chapel-B4wvmE90.js → chapel-DmtgEXO_.js} +1 -1
- package/dist/client/assets/{chart-column-C08MuLgY.js → chart-column-B_-qnXGB.js} +1 -1
- package/dist/client/assets/chevron-right-Cnb37R-Q.js +1 -0
- package/dist/client/assets/chunk-2GRJ4B5K-nG7WCf2t.js +1 -0
- package/dist/client/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
- package/dist/client/assets/chunk-4I5QYGJK-D3luggpT.js +1 -0
- package/dist/client/assets/chunk-5RXB4S5H-nhzQkmkg.js +231 -0
- package/dist/client/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
- package/dist/client/assets/chunk-6Q2QTUOP-dP86RxKA.js +88 -0
- package/dist/client/assets/chunk-7BUUIJ7U-Bb538aSH.js +1 -0
- package/dist/client/assets/chunk-7Z6QIM7H-DaMB-SqH.js +10 -0
- package/dist/client/assets/chunk-FOHPRMQF-CoA4358r.js +161 -0
- package/dist/client/assets/chunk-GF5L2VYU-asgcvCCI.js +206 -0
- package/dist/client/assets/chunk-I66GZJ75-CDkA1o_8.js +127 -0
- package/dist/client/assets/chunk-JQJVKLGR-Bw0X5Ip-.js +156 -0
- package/dist/client/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
- package/dist/client/assets/chunk-KBJHAD2P-dO_kTnL7.js +1 -0
- package/dist/client/assets/chunk-NSK5VX7P-BmceTTBR.js +2 -0
- package/dist/client/assets/chunk-QR6OTTB3-B5kA0ffj.js +62 -0
- package/dist/client/assets/chunk-RYQCIY6F-DwFgeAGr.js +1 -0
- package/dist/client/assets/chunk-UBXNYLIW-CDedwfvO.js +1 -0
- package/dist/client/assets/chunk-W5SLKNZC-CYitqjQA.js +1 -0
- package/dist/client/assets/chunk-WRU74C26-BuyHUiY3.js +70 -0
- package/dist/client/assets/chunk-XXDRQBXY-DKGD__ll.js +1 -0
- package/dist/client/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
- package/dist/client/assets/classDiagram-JCYQIIEL-CEJrTr5w.js +1 -0
- package/dist/client/assets/classDiagram-v2-OCEON4UE-CEJrTr5w.js +1 -0
- package/dist/client/assets/{clipboard-copy-D74Wvnon.js → clipboard-copy-m25MViws.js} +1 -1
- package/dist/client/assets/{cobol-NqUMvFU8.js → cobol-Cw2-KvLW.js} +1 -1
- package/dist/client/assets/{coffee-DVKhASwQ.js → coffee-CiiSLhB6.js} +1 -1
- package/dist/client/assets/compiler-runtime-C4g8XhC5.js +1 -0
- package/dist/client/assets/cose-bilkent-JH36ORCC-CQw99gYc.js +1 -0
- package/dist/client/assets/cpp-71xkOQct.js +1 -0
- package/dist/client/assets/{crystal-DTR4CTFy.js → crystal-DGPAtLeY.js} +1 -1
- package/dist/client/assets/css-CNuuLpMC.js +1 -0
- package/dist/client/assets/cynefin-OW5HDTMX-PI1jXfo9.js +1 -0
- package/dist/client/assets/cynefinDiagram-MW4NZA55-D9aXz2H3.js +62 -0
- package/dist/client/assets/cytoscape.esm-B-1iW2ft.js +321 -0
- package/dist/client/assets/dagre-VZM6K2ZE-DAkAWtHf.js +4 -0
- package/dist/client/assets/dagre-jnk0s9qx.js +1 -0
- package/dist/client/assets/{data-list-CZ4Utnfl.js → data-list-CzuRaMoY.js} +1 -1
- package/dist/client/assets/defaultLocale-BFoDCU3G.js +1 -0
- package/dist/client/assets/desktopWorkspace-DCXeateK.js +1 -0
- package/dist/client/assets/diagram-7IWD3JNH-D9Y5DAHG.js +30 -0
- package/dist/client/assets/diagram-B4RE2ZJO-pcVWvD1c.js +3 -0
- package/dist/client/assets/diagram-LBJQPF4R-CKQHNEf3.js +24 -0
- package/dist/client/assets/diagram-Q27KOJAE-DpUj2dlx.js +24 -0
- package/dist/client/assets/diagram-UB23O5K3-D9ixM4zK.js +41 -0
- package/dist/client/assets/dist-v5Q1xZ2K.js +1 -0
- package/dist/client/assets/{download-Dio40wIJ.js → download-BLSwvpO8.js} +1 -1
- package/dist/client/assets/ebnfDiagram-BXEA7PRR-DtVIaCAg.js +1 -0
- package/dist/client/assets/{edge-CpqhDICu.js → edge-DCY0a-ow.js} +1 -1
- package/dist/client/assets/editorPreferences-B9oRG3Zd.js +1 -0
- package/dist/client/assets/{elixir--isJgL2B.js → elixir-DP304Xio.js} +1 -1
- package/dist/client/assets/{elm-DgHzNgm_.js → elm-o4NJxfws.js} +1 -1
- package/dist/client/assets/{empty-6LExKYgQ.js → empty-DOy2mOw2.js} +1 -1
- package/dist/client/assets/erDiagram-JOGREHBK-BLKpTkcC.js +85 -0
- package/dist/client/assets/{erb-CXyXxaAM.js → erb-C7MPl934.js} +1 -1
- package/dist/client/assets/eventmodeling-NTZA5JFV-BwvZvQqc.js +1 -0
- package/dist/client/assets/flowDiagram-UKHOOZJN-BQ7PEPRm.js +1 -0
- package/dist/client/assets/ganttDiagram-PKOTCBZU-CnqZ0jmv.js +292 -0
- package/dist/client/assets/{git-rebase-BqNqx552.js → git-rebase-BDPpS8w6.js} +1 -1
- package/dist/client/assets/gitGraph-4MIJSDKK-CwCT0-s6.js +1 -0
- package/dist/client/assets/gitGraphDiagram-DS77QQ5N-s8lXhp4w.js +106 -0
- package/dist/client/assets/{glimmer-js-yZWXr7D1.js → glimmer-js-BONyzAsu.js} +1 -1
- package/dist/client/assets/{glimmer-ts-BgilwNe9.js → glimmer-ts-f9c0GCOe.js} +1 -1
- package/dist/client/assets/glsl-D5MA2a_X.js +1 -0
- package/dist/client/assets/graphlib-DS17s2tU.js +1 -0
- package/dist/client/assets/graphql-Ctjuxyvl.js +1 -0
- package/dist/client/assets/{group-D_mu0Kiq.js → group-CuoO9JnL.js} +1 -1
- package/dist/client/assets/{hack-Bw3mo9za.js → hack-Dh_ZLRbs.js} +1 -1
- package/dist/client/assets/haml-CwEpbK1d.js +1 -0
- package/dist/client/assets/{handlebars-D71nAVX4.js → handlebars-ryMP1rBR.js} +1 -1
- package/dist/client/assets/hostedConnectionCoordinator-BSJ_DOFJ.js +1 -0
- package/dist/client/assets/hostedPairing-CqhLPQqG.js +1 -0
- package/dist/client/assets/html-XwrE-1r6.js +1 -0
- package/dist/client/assets/{html-derivative-BwDrYmK9.js → html-derivative-i4STDFnl.js} +1 -1
- package/dist/client/assets/{http-BSiVGmrj.js → http-kmH8AyfE.js} +1 -1
- package/dist/client/assets/hubRoutes-21nfUON0.js +1 -0
- package/dist/client/assets/{hurl-BUTu-xdf.js → hurl-DCZHXKU4.js} +1 -1
- package/dist/client/assets/{index-7MTgf8YI.js → index-BwKpO5H0.js} +2 -2
- package/dist/client/assets/info-A6RAGUB7-BEii5_a7.js +1 -0
- package/dist/client/assets/infoDiagram-6WML65LV-BDA4ayxB.js +2 -0
- package/dist/client/assets/init-ZlXS9mIS.js +1 -0
- package/dist/client/assets/input-C7jwjNin.js +1 -0
- package/dist/client/assets/ishikawaDiagram-WSZJBQD7-Dg0BzsTT.js +70 -0
- package/dist/client/assets/java-DdHNQ9hk.js +1 -0
- package/dist/client/assets/javascript-obGGvMPs.js +1 -0
- package/dist/client/assets/{jinja-BA7hgfzz.js → jinja-B-tLrNsM.js} +1 -1
- package/dist/client/assets/{jison-CUMnSUVk.js → jison-CBjhYtSs.js} +1 -1
- package/dist/client/assets/journeyDiagram-NVQOT4AX-C8EwxR5-.js +139 -0
- package/dist/client/assets/json-DAgxKhMr.js +1 -0
- package/dist/client/assets/jsx-gTgmArGx.js +1 -0
- package/dist/client/assets/{julia-C-lBeOK5.js → julia-CXJVy74_.js} +1 -1
- package/dist/client/assets/{just-DfEtguTY.js → just-B9Xn_Dp4.js} +1 -1
- package/dist/client/assets/kanban-definition-27J2QSJJ-CwWIK4hH.js +89 -0
- package/dist/client/assets/katex-ZlcWpGUi.js +257 -0
- package/dist/client/assets/kbd-BkhO-OIB.js +1 -0
- package/dist/client/assets/{key-round-C-oUSjpF.js → key-round-QNi8vZ3o.js} +1 -1
- package/dist/client/assets/{latex-6oxeCMbP.js → latex-o9DRzaEe.js} +1 -1
- package/dist/client/assets/{layers-Co2a5C1k.js → layers-DxCncDg0.js} +1 -1
- package/dist/client/assets/linear-DCT4R0u9.js +1 -0
- package/dist/client/assets/{liquid-Cr73H0-U.js → liquid-G0MH4h_m.js} +1 -1
- package/dist/client/assets/liquidGlass-CA2o_Cq0.js +1 -0
- package/dist/client/assets/{log-out-pWFhbvwr.js → log-out-0cx8xYmG.js} +1 -1
- package/dist/client/assets/{logging-JMrwaeZh.js → logging-D0Z2ysS_.js} +1 -1
- package/dist/client/assets/lua-FONpmTUP.js +1 -0
- package/dist/client/assets/main-Bs1wRbtM.css +2 -0
- package/dist/client/assets/main-DRnQOdGw.js +9 -0
- package/dist/client/assets/map-CLsMSThe.js +1 -0
- package/dist/client/assets/{marko-8BhW8jZt.js → marko-DV5GrDmo.js} +1 -1
- package/dist/client/assets/{mdc-uTSeACfH.js → mdc-BKfPFPZw.js} +1 -1
- package/dist/client/assets/mermaid-parser.core-DFyHLivv.js +6 -0
- package/dist/client/assets/mermaidEngine-CFbqgukn.js +41 -0
- package/dist/client/assets/mindmap-definition-FAOFIHXS-DEUodh64.js +96 -0
- package/dist/client/assets/{nginx-BbzDIRDu.js → nginx-BTMw9COX.js} +1 -1
- package/dist/client/assets/{nim-C27DPxCt.js → nim-B6yJ_yaC.js} +1 -1
- package/dist/client/assets/noop-CdBy4H-p.js +1 -0
- package/dist/client/assets/ordinal-CPleeUAT.js +1 -0
- package/dist/client/assets/{org-DRYqs_wo.js → org-Ddi8Gs6E.js} +1 -1
- package/dist/client/assets/packet-AYTQ26CC-kDW4NC3U.js +1 -0
- package/dist/client/assets/{palette-B_6C4fD6.js → palette-DJP6HjoK.js} +1 -1
- package/dist/client/assets/pegDiagram-VL7TDLO6-DP6G624r.js +1 -0
- package/dist/client/assets/{perl-Dj7_nwz_.js → perl-DEgXgjuC.js} +1 -1
- package/dist/client/assets/{php-Xqfm-TjX.js → php-B9UPq-vz.js} +1 -1
- package/dist/client/assets/pie-WAS4IAKB-CkU95zMj.js +1 -0
- package/dist/client/assets/pieDiagram-7S7Q4E2Y-CbI-Me3X.js +39 -0
- package/dist/client/assets/{play-DFtc9zBy.js → play-D2dLXeYA.js} +1 -1
- package/dist/client/assets/primary-CTbs3K5y.js +5 -0
- package/dist/client/assets/providerDriverMeta-BufQsOt9.js +1 -0
- package/dist/client/assets/providerInstances-BsYOgLbA.js +1 -0
- package/dist/client/assets/providerModels-B6q2qkJn.js +1 -0
- package/dist/client/assets/providerStatus-DBGvvkyF.js +1 -0
- package/dist/client/assets/{pug-CKEc9v9y.js → pug-DkgDHZci.js} +1 -1
- package/dist/client/assets/{qml-C3bhdnuC.js → qml-_a-QhfPD.js} +1 -1
- package/dist/client/assets/qr-code-aWP2UC_0.js +1 -0
- package/dist/client/assets/{qr-code-DaHWf7Oq.js → qr-code-rHO2PSNK.js} +1 -1
- package/dist/client/assets/quadrantDiagram-CIZ2JOQS-DdT-PJym.js +7 -0
- package/dist/client/assets/r-BHcO8Vjq.js +1 -0
- package/dist/client/assets/radar-RG4KPBEZ-BCHjOI8k.js +1 -0
- package/dist/client/assets/radio-group-j7Aw0khh.js +2 -0
- package/dist/client/assets/railroad-74A4TZTK-Coyy1E7r.js +1 -0
- package/dist/client/assets/railroad-abnf-HS5TGJTU-vVvBZ7mV.js +1 -0
- package/dist/client/assets/railroad-ebnf-LZEXJU2U-DPhiX3AH.js +1 -0
- package/dist/client/assets/railroad-peg-WCYAUIDC-CE5r0-yf.js +1 -0
- package/dist/client/assets/railroadDiagram-AXF67PYL-BtotoGcb.js +1 -0
- package/dist/client/assets/{razor-CCBiKnb_.js → razor-BMJ0eI3p.js} +1 -1
- package/dist/client/assets/react-CwJFpaho.js +1 -0
- package/dist/client/assets/{refresh-cw-CY5BeUEr.js → refresh-cw-BvLhRgIT.js} +1 -1
- package/dist/client/assets/regexp-DR20uMnK.js +1 -0
- package/dist/client/assets/requirementDiagram-LRYGKXZP-CkRiHwnq.js +84 -0
- package/dist/client/assets/rolldown-runtime-hePW80VL.js +1 -0
- package/dist/client/assets/rough.esm-Dy-Kn_BL.js +1 -0
- package/dist/client/assets/{rst-DKqX_39h.js → rst-BQCbfb9V.js} +1 -1
- package/dist/client/assets/{ruby-CaU3RLfE.js → ruby-B8JcIHv0.js} +1 -1
- package/dist/client/assets/runtime-BmkVEPVk.js +17 -0
- package/dist/client/assets/sankeyDiagram-W5VNT64P-CRA3QeOy.js +40 -0
- package/dist/client/assets/{sas-Dq8EnVfj.js → sas-CBpMWA2M.js} +1 -1
- package/dist/client/assets/{save-DIHMjHXd.js → save-BS49-bF8.js} +1 -1
- package/dist/client/assets/scroll-area-DCAX5yOi.js +1 -0
- package/dist/client/assets/scrollEdges-BPCo6eoJ.js +1 -0
- package/dist/client/assets/scss-YesllqfO.js +1 -0
- package/dist/client/assets/separator-BzCfJfqt.js +1 -0
- package/dist/client/assets/sequenceDiagram-SI44F4Z6-C1NBZD9Z.js +162 -0
- package/dist/client/assets/settingsLayout-DsTnu1ag.js +1 -0
- package/dist/client/assets/{sheet-CFvRY7T6.js → sheet-B5Bho6hg.js} +1 -1
- package/dist/client/assets/shellscript-Da78Ox-3.js +1 -0
- package/dist/client/assets/{shellsession-26dOf2m0.js → shellsession-CVsQGYfZ.js} +1 -1
- package/dist/client/assets/{shield-Zn2kFj5M.js → shield-D8Js3j2m.js} +1 -1
- package/dist/client/assets/{shield-alert-DMB5gKiC.js → shield-alert-D5KtaxAD.js} +1 -1
- package/dist/client/assets/{shield-check-DyNf6Bky.js → shield-check-Bw3PFmc5.js} +1 -1
- package/dist/client/assets/sidebar-BgdP0aPP.js +1 -0
- package/dist/client/assets/sidebarProjectFolders-SidXpBYm.js +4 -0
- package/dist/client/assets/{sidebarStatusText-DCo-whyK.js → sidebarStatusText-CGlncYed.js} +1 -1
- package/dist/client/assets/sizeCapture-X5ZJPWSS-B0uUizjq.js +1 -0
- package/dist/client/assets/{skeleton-DEuowfjY.js → skeleton-D2DLiMeL.js} +1 -1
- package/dist/client/assets/{smartphone-BLWJ7C9-.js → smartphone-BxLjYoMC.js} +1 -1
- package/dist/client/assets/{soy-Bf3k5CrX.js → soy-DEd-qcad.js} +1 -1
- package/dist/client/assets/sql-DdD7vxS4.js +1 -0
- package/dist/client/assets/src-BISxbUej.js +1 -0
- package/dist/client/assets/{src-DPpEXU6w.js → src-DveUJAx7.js} +1 -1
- package/dist/client/assets/{star-CjQxHYbD.js → star-COJFLZTR.js} +1 -1
- package/dist/client/assets/{stata-DYvaCWJV.js → stata-CMv7m7Gi.js} +1 -1
- package/dist/client/assets/stateDiagram-OKZ733FA-Ds3WpAzo.js +1 -0
- package/dist/client/assets/stateDiagram-v2-UEYNNEHI-B1G6cGoL.js +1 -0
- package/dist/client/assets/{surrealql-CVtmRpY6.js → surrealql-BZoq2lXR.js} +1 -1
- package/dist/client/assets/{svelte-k_k4XYnr.js → svelte-Bj3Hmc9F.js} +1 -1
- package/dist/client/assets/swimlanes-SLNWSIFB-CBOT6h6D.js +1 -0
- package/dist/client/assets/swimlanesDiagram-ULZ7WXOC-C7dzqG68.js +8 -0
- package/dist/client/assets/switch-DRWMuFAB.js +48 -0
- package/dist/client/assets/{templ-CxD_nC0J.js → templ-TjxbArHn.js} +1 -1
- package/dist/client/assets/tex-BK-H2Wn4.js +1 -0
- package/dist/client/assets/time-DQ1f7CYz.js +1 -0
- package/dist/client/assets/timeline-definition-Z64GVDOM-BchFx9aU.js +120 -0
- package/dist/client/assets/toggle-BFimNtfd.js +1 -0
- package/dist/client/assets/toggle-group-DkiAyblO.js +1 -0
- package/dist/client/assets/{tokenModePresentation-CPUsUGY4.js → tokenModePresentation-CF3EmBbY.js} +1 -1
- package/dist/client/assets/tooltip-DCkohGhZ.js +1 -0
- package/dist/client/assets/treeView-Q6P3EWNA-CEV1Lb2d.js +1 -0
- package/dist/client/assets/treemap-WGGIJYW6-BmpcuJbz.js +1 -0
- package/dist/client/assets/{ts-tags-BriKwQve.js → ts-tags-Cc5do7zu.js} +1 -1
- package/dist/client/assets/tsx-CUOciP0b.js +1 -0
- package/dist/client/assets/{twig-DsmcR2eZ.js → twig-BVSnuTf-.js} +1 -1
- package/dist/client/assets/typescript-BydbNFcO.js +1 -0
- package/dist/client/assets/{typst-Drab9wKO.js → typst-C40W_gC6.js} +1 -1
- package/dist/client/assets/{unplug-Bjpxv8i0.js → unplug-8DPlQKIp.js} +1 -1
- package/dist/client/assets/{usage-8vQUo0mr.js → usage-C8xQ6Fzh.js} +1 -1
- package/dist/client/assets/useAppSidebarCollapsed-C2LlQGyO.js +1 -0
- package/dist/client/assets/useAppearancePreference-Dlh9P8iu.js +1 -0
- package/dist/client/assets/useBaseUiId-mt0hfEAe.js +1 -0
- package/dist/client/assets/useControlled-CgAAWIy9.js +1 -0
- package/dist/client/assets/useLabelableId-Cvt4WsTl.js +1 -0
- package/dist/client/assets/useLongPress-CUmLovQ7.js +1 -0
- package/dist/client/assets/useNavigate-C3GqcMfH.js +1 -0
- package/dist/client/assets/usePhoneThreadActions-D6vlUMhK.js +1 -0
- package/dist/client/assets/usePopupViewport-Do1Do_XW.js +1 -0
- package/dist/client/assets/usePresentationTier-hxB7Yv_Q.js +1 -0
- package/dist/client/assets/useScrollLock-CBkwVMhR.js +1 -0
- package/dist/client/assets/useStatistics-DVzBUtMo.js +55 -0
- package/dist/client/assets/useTheme-B441xg4F.js +1 -0
- package/dist/client/assets/useTriggerFocusGuards-CwCaKZe6.js +1 -0
- package/dist/client/assets/useValueChanged-DdYHxdoK.js +1 -0
- package/dist/client/assets/{user-round-DEWIPpNs.js → user-round-D4L0lVW8.js} +1 -1
- package/dist/client/assets/vennDiagram-T6HMQDX7-D5h4gL4M.js +34 -0
- package/dist/client/assets/{vscode-icons-DTH-Vj-_.js → vscode-icons-BKarOrEi.js} +1 -1
- package/dist/client/assets/{vue-Dt-rrFdH.js → vue-BNQF7r6F.js} +1 -1
- package/dist/client/assets/{vue-html-BrRsRUlP.js → vue-html-DkKkQnZL.js} +1 -1
- package/dist/client/assets/{vue-vine-CxnolnwP.js → vue-vine-DFaKYU4X.js} +1 -1
- package/dist/client/assets/wardley-WFR3VGLG-COhlspfw.js +1 -0
- package/dist/client/assets/wardleyDiagram-T6FBY63Y-WJNCmmcd.js +78 -0
- package/dist/client/assets/{workspaceMetadataProjection-BnpxBe8S.js → workspaceMetadataProjection-DGOQN5yh.js} +1 -1
- package/dist/client/assets/{wrench-36WYdK_a.js → wrench-B8Kn44An.js} +1 -1
- package/dist/client/assets/xml-BlnrEAEy.js +1 -0
- package/dist/client/assets/{xsl-BY-Cn9M_.js → xsl-BOPS8gLt.js} +1 -1
- package/dist/client/assets/xychartDiagram-ELKLHX3M-CabQ0hKy.js +7 -0
- package/dist/client/assets/yaml-Du_6cdrH.js +1 -0
- package/dist/client/index.html +1 -1
- package/dist/{deviceHostWorker-C-BSnmkn.mjs → deviceHostWorker-CV7GZgfH.mjs} +1 -1
- package/dist/{git-C4iJMbBu.mjs → git-BaEqFwDw.mjs} +1 -1
- package/dist/{git-irmB8_k7.cjs → git-VPCnunmz.cjs} +1 -1
- package/dist/{makeManagedServerProvider-BINne1KE.mjs → makeManagedServerProvider--SPw3bxe.mjs} +23 -19
- package/dist/{makeManagedServerProvider-DGbd8BhM.cjs → makeManagedServerProvider-A3NSgBwN.cjs} +23 -19
- package/dist/resource-monitor/ryco-resource-monitor +0 -0
- package/dist/resource-monitor/ryco-resource-monitor.exe +0 -0
- package/dist/resource-monitor/win32-arm64/ryco-resource-monitor.exe +0 -0
- package/dist/resource-monitor/win32-x64/ryco-resource-monitor.exe +0 -0
- package/dist/{Metrics-C-3MahDy.mjs → serverSettings-C7N2cm7C.mjs} +783 -8
- package/dist/{Metrics-DCKbdeoH.cjs → serverSettings-_fgQZNIb.cjs} +944 -11
- package/dist/{src-BlzIcnVG.cjs → src-CBu69HDR.cjs} +395 -20
- package/dist/{src-DtEOcXdl.mjs → src-D8uCtoDZ.mjs} +342 -15
- package/package.json +1 -1
- package/dist/SourceControlProviderDiscoveryCatalog-BVvq7liJ.mjs +0 -525
- package/dist/SourceControlProviderDiscoveryCatalog-CyUhKJLD.cjs +0 -614
- package/dist/client/assets/AccountSettings-DLbcE2w-.js +0 -1
- package/dist/client/assets/AiFocusSettings-FKvdkl4P.js +0 -1
- package/dist/client/assets/AnimatedHeight-CbIEyMLg.js +0 -1
- package/dist/client/assets/AppearanceSettings-B2LsGKmL.js +0 -1
- package/dist/client/assets/BranchToolbar.logic-BqkvYNPk.js +0 -1
- package/dist/client/assets/BrowserPanel-C_C4zjrh.js +0 -1
- package/dist/client/assets/ChatRightPanel-ibiQ79jI.js +0 -195
- package/dist/client/assets/ChatThreadRouteView-c7AXmbSk.js +0 -1
- package/dist/client/assets/CommandPaletteDialog-DdPKN6rv.js +0 -1
- package/dist/client/assets/CompositeRoot-DKwS-ADi.js +0 -1
- package/dist/client/assets/ComputerUseSettings-DM17BYP5.js +0 -1
- package/dist/client/assets/ConnectionsSettings-D6wysIC8.js +0 -7
- package/dist/client/assets/ContextHandoffEndpointLabel-CsF_maM_.js +0 -4
- package/dist/client/assets/DiagnosticsSettings-Bq2l-C4J.js +0 -2
- package/dist/client/assets/DialogHandle-DuKTleCw.js +0 -1
- package/dist/client/assets/DialogPopup-Dt7DzTWv.js +0 -1
- package/dist/client/assets/DialogRoot-DRyawL6l.js +0 -1
- package/dist/client/assets/DialogTitle-BaxfPC6e.js +0 -1
- package/dist/client/assets/DialogTrigger-D0PJ8bRT.js +0 -1
- package/dist/client/assets/DialogViewport-C3B2JZWQ.js +0 -1
- package/dist/client/assets/DraftChatThreadRouteView-B8YiD5NP.js +0 -1
- package/dist/client/assets/HostedConnectionControls-DOpTlXzE.js +0 -1
- package/dist/client/assets/HostedHubRoot-C1jq8cM6.js +0 -2
- package/dist/client/assets/HostedNativeAuthorizationRoute-Clw1DHQW.js +0 -2
- package/dist/client/assets/HostedNodeRenameDialog-Bd_Qu_ek.js +0 -1
- package/dist/client/assets/HostedRelayTrustNotice-CGcBpT9m.js +0 -1
- package/dist/client/assets/IntegrationsSettingsPanel-J0qODRW-.js +0 -2
- package/dist/client/assets/KeybindingsSettings-CwxIHsFy.js +0 -7
- package/dist/client/assets/LazyBrowserPanel-VNAn6AUL.js +0 -2
- package/dist/client/assets/McpServersSettings-1pkIeutq.js +0 -6
- package/dist/client/assets/MobileSheet-DddfN8c2.js +0 -1
- package/dist/client/assets/NodeSecuritySettings-BOIZeFZo.js +0 -1
- package/dist/client/assets/OpinionatedPluginsSettings-oTIrPtIb.js +0 -1
- package/dist/client/assets/PhoneGetAppInterstitial-0EOj-PbW.js +0 -1
- package/dist/client/assets/PhoneHome-Cg7l3b1T.js +0 -1
- package/dist/client/assets/PhoneSettingsSurface-BXAUtZ9M.js +0 -2
- package/dist/client/assets/ProvidersSettingsPanel-BaJgypXu.js +0 -1
- package/dist/client/assets/QuitShortcutFeedback-DgJFEd6b.js +0 -1
- package/dist/client/assets/RedactedSensitiveText-D1VC2xa7.js +0 -1
- package/dist/client/assets/RootAppShell-D2RjZ9jQ.js +0 -7
- package/dist/client/assets/Separator-CeMncdkm.js +0 -1
- package/dist/client/assets/SettingsDialog-B2hEb6u8.js +0 -2
- package/dist/client/assets/SettingsPanels-DtWLQDne.js +0 -3
- package/dist/client/assets/SettingsPanels.editor-DJRckD71.js +0 -1
- package/dist/client/assets/SourceControlSettings-IpoZrjt5.js +0 -1
- package/dist/client/assets/StatisticsPage-CUpE_5Gr.js +0 -1
- package/dist/client/assets/StatisticsPanel-CHrAY5AP.js +0 -1
- package/dist/client/assets/StatisticsSettingsLink-bGWuxNG3.js +0 -1
- package/dist/client/assets/ThreadTerminalDrawer-BEv83xrk.js +0 -18
- package/dist/client/assets/ThreadWorkspacePanel-BdMdJVHJ.js +0 -2073
- package/dist/client/assets/angular-html-Dht9YPGR.js +0 -1
- package/dist/client/assets/authorization-B1YXfej3.js +0 -1
- package/dist/client/assets/badge-BjvTY7-E.js +0 -1
- package/dist/client/assets/c-Baw6W2ff.js +0 -1
- package/dist/client/assets/capabilities-BCkDNe83.js +0 -1
- package/dist/client/assets/chevron-right-DgB53U1_.js +0 -1
- package/dist/client/assets/compiler-runtime-qmuS0Svy.js +0 -1
- package/dist/client/assets/cpp-C3nXdf7H.js +0 -1
- package/dist/client/assets/css-tyblAV2Z.js +0 -1
- package/dist/client/assets/desktopWorkspace-DVfn9ZT_.js +0 -1
- package/dist/client/assets/editorPreferences-2dG4uloq.js +0 -1
- package/dist/client/assets/glsl-CiPx7o44.js +0 -1
- package/dist/client/assets/graphql-dVCFBcPU.js +0 -1
- package/dist/client/assets/haml-Bvq_b7GQ.js +0 -1
- package/dist/client/assets/hostedConnectionCoordinator-YkDLnATK.js +0 -1
- package/dist/client/assets/hostedPairing-B_ylEEDa.js +0 -1
- package/dist/client/assets/html-CQCljoLJ.js +0 -1
- package/dist/client/assets/hubRoutes-D3quWvU7.js +0 -1
- package/dist/client/assets/input-CfVJycb1.js +0 -1
- package/dist/client/assets/java-DKLhoot1.js +0 -1
- package/dist/client/assets/javascript-BoDf_Xaa.js +0 -1
- package/dist/client/assets/json-D-CzDEr3.js +0 -1
- package/dist/client/assets/jsx-RPKfHBaT.js +0 -1
- package/dist/client/assets/kbd-uFa_tY-L.js +0 -1
- package/dist/client/assets/liquidGlass-Dbl4k51l.js +0 -1
- package/dist/client/assets/lua-BNklVDJF.js +0 -1
- package/dist/client/assets/main-BNPtp9Z0.css +0 -2
- package/dist/client/assets/main-CGeD6yVE.js +0 -9
- package/dist/client/assets/primary-CNUdEGcv.js +0 -2
- package/dist/client/assets/providerDriverMeta-Cg_XLUfo.js +0 -1
- package/dist/client/assets/providerInstances-JaDrOWPZ.js +0 -1
- package/dist/client/assets/providerModels-5uOq3qPC.js +0 -1
- package/dist/client/assets/qr-code-BU354aLS.js +0 -1
- package/dist/client/assets/r-B-BYV2IP.js +0 -1
- package/dist/client/assets/radio-group-DKaA1eey.js +0 -2
- package/dist/client/assets/react-SIfiwpqq.js +0 -1
- package/dist/client/assets/regexp-BG8FlKR9.js +0 -1
- package/dist/client/assets/runtime-BKneT96Q.js +0 -17
- package/dist/client/assets/scroll-area-Cq4SX9P8.js +0 -1
- package/dist/client/assets/scrollEdges-BaWRjrac.js +0 -1
- package/dist/client/assets/scss-CMpBj9xp.js +0 -1
- package/dist/client/assets/separator-BN705fC0.js +0 -1
- package/dist/client/assets/settingsLayout-DQERzSce.js +0 -1
- package/dist/client/assets/shellscript-C5MCrJaB.js +0 -1
- package/dist/client/assets/sidebar-Bsh64sLK.js +0 -1
- package/dist/client/assets/sidebarProjectFolders-CQbpO9ZI.js +0 -4
- package/dist/client/assets/sparkles-DAXDXp_s.js +0 -1
- package/dist/client/assets/sql-DcFiju6z.js +0 -1
- package/dist/client/assets/switch-LahPAvrd.js +0 -48
- package/dist/client/assets/tex-DOBpnpUK.js +0 -1
- package/dist/client/assets/toggle-45lsrmyi.js +0 -1
- package/dist/client/assets/toggle-group-D5pl24ED.js +0 -1
- package/dist/client/assets/tooltip-B8-izeMo.js +0 -1
- package/dist/client/assets/tsx-CltjRl2u.js +0 -1
- package/dist/client/assets/typescript-BwOcYJx4.js +0 -1
- package/dist/client/assets/useAppSidebarCollapsed-uwz9Hlgc.js +0 -1
- package/dist/client/assets/useAppearancePreference-BteoFdGa.js +0 -1
- package/dist/client/assets/useBaseUiId-BtuL7q77.js +0 -1
- package/dist/client/assets/useControlled-DQwgzrEC.js +0 -1
- package/dist/client/assets/useLabelableId-N_LsKNbf.js +0 -1
- package/dist/client/assets/useLongPress-DG1W7YqV.js +0 -1
- package/dist/client/assets/useNavigate-DADLi29i.js +0 -1
- package/dist/client/assets/usePhoneThreadActions-B9_HK7tn.js +0 -1
- package/dist/client/assets/usePopupViewport-w8BEny9j.js +0 -1
- package/dist/client/assets/usePresentationTier-B_SCFvN7.js +0 -1
- package/dist/client/assets/useScrollLock-bCmUzTgK.js +0 -1
- package/dist/client/assets/useStatistics-DJtONxT0.js +0 -55
- package/dist/client/assets/useTheme-CVNauCtz.js +0 -1
- package/dist/client/assets/useTriggerFocusGuards-C7JWO2LT.js +0 -1
- package/dist/client/assets/useValueChanged-DkoUO9bY.js +0 -1
- package/dist/client/assets/xml-DUCOjSp4.js +0 -1
- package/dist/client/assets/yaml-BONObsYN.js +0 -1
|
@@ -1,9 +1,244 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
3
|
+
import { Do as DEFAULT_GIT_TEXT_GENERATION_OPTIONS_BY_PROVIDER, Eo as DEFAULT_GIT_TEXT_GENERATION_MODEL_BY_PROVIDER, Hr as ServerSettings, Mo as ProviderInstanceId, Po as isProviderDriverKind, Rr as DEFAULT_SERVER_SETTINGS, Ur as ServerSettingsError, jo as ProviderDriverKind, ko as MODEL_SLUG_ALIASES_BY_PROVIDER } from "./src-D8uCtoDZ.mjs";
|
|
4
|
+
import { r as fromLenientJson } from "./schemaJson-CaG1bOvo.mjs";
|
|
5
|
+
import { Cache, Cause, Context, Data, DateTime, Deferred, Duration, Effect, Equal, Exit, FileSystem, Layer, Metric, Path, Predicate, PubSub, Ref, Schema, SchemaIssue, Scope, Stream } from "effect";
|
|
6
|
+
import * as P from "effect/Predicate";
|
|
7
|
+
import path, { join } from "node:path";
|
|
8
|
+
import * as Crypto from "node:crypto";
|
|
5
9
|
import { createHash, timingSafeEqual } from "node:crypto";
|
|
10
|
+
import { constants } from "node:fs";
|
|
11
|
+
import { homedir } from "node:os";
|
|
12
|
+
import { access, lstat, realpath } from "node:fs/promises";
|
|
6
13
|
import { dual } from "effect/Function";
|
|
14
|
+
import * as Semaphore$1 from "effect/Semaphore";
|
|
15
|
+
import "effect/PlatformError";
|
|
16
|
+
//#region ../../packages/shared/src/Struct.ts
|
|
17
|
+
function deepMerge(current, patch) {
|
|
18
|
+
if (!P.isObject(current) || !P.isObject(patch)) return patch;
|
|
19
|
+
const next = { ...current };
|
|
20
|
+
for (const [key, value] of Object.entries(patch)) {
|
|
21
|
+
if (value === void 0) continue;
|
|
22
|
+
const existing = next[key];
|
|
23
|
+
next[key] = P.isObject(existing) && P.isObject(value) ? deepMerge(existing, value) : value;
|
|
24
|
+
}
|
|
25
|
+
return next;
|
|
26
|
+
}
|
|
27
|
+
//#endregion
|
|
28
|
+
//#region ../../packages/shared/src/model.ts
|
|
29
|
+
const DEFAULT_PROVIDER_DRIVER_KIND = ProviderDriverKind.make("codex");
|
|
30
|
+
/**
|
|
31
|
+
* Resolve the human-readable model title used by picker surfaces and durable
|
|
32
|
+
* handoff presentation. Provider catalogs are authoritative when they carry a
|
|
33
|
+
* friendly name; the routing slug remains the deterministic final fallback.
|
|
34
|
+
*/
|
|
35
|
+
function getModelDisplayName(model, options) {
|
|
36
|
+
const shortName = trimOrNull(model.shortName);
|
|
37
|
+
const name = trimOrNull(model.name);
|
|
38
|
+
const slug = trimOrNull(model.slug) ?? model.slug;
|
|
39
|
+
return options?.preferShortName ? shortName ?? name ?? slug : name ?? shortName ?? slug;
|
|
40
|
+
}
|
|
41
|
+
/** Compose the optional sub-provider prefix exactly as the picker trigger does. */
|
|
42
|
+
function getModelDisplayLabel(model, options) {
|
|
43
|
+
const title = getModelDisplayName(model, options);
|
|
44
|
+
const subProvider = trimOrNull(model.subProvider);
|
|
45
|
+
return subProvider ? `${subProvider} · ${title}` : title;
|
|
46
|
+
}
|
|
47
|
+
function createModelCapabilities(input) {
|
|
48
|
+
return { optionDescriptors: input.optionDescriptors.map(cloneDescriptor) };
|
|
49
|
+
}
|
|
50
|
+
function getRawSelectionValueById(selections, id) {
|
|
51
|
+
return (selections?.find((candidate) => candidate.id === id))?.value;
|
|
52
|
+
}
|
|
53
|
+
function getProviderOptionSelectionValue(selections, id) {
|
|
54
|
+
return getRawSelectionValueById(selections, id);
|
|
55
|
+
}
|
|
56
|
+
function getProviderOptionStringSelectionValue(selections, id) {
|
|
57
|
+
const value = getProviderOptionSelectionValue(selections, id);
|
|
58
|
+
return typeof value === "string" ? value : void 0;
|
|
59
|
+
}
|
|
60
|
+
function getProviderOptionBooleanSelectionValue(selections, id) {
|
|
61
|
+
const value = getProviderOptionSelectionValue(selections, id);
|
|
62
|
+
return typeof value === "boolean" ? value : void 0;
|
|
63
|
+
}
|
|
64
|
+
function getModelSelectionStringOptionValue(modelSelection, id) {
|
|
65
|
+
return getProviderOptionStringSelectionValue(modelSelection?.options, id);
|
|
66
|
+
}
|
|
67
|
+
function getModelSelectionBooleanOptionValue(modelSelection, id) {
|
|
68
|
+
return getProviderOptionBooleanSelectionValue(modelSelection?.options, id);
|
|
69
|
+
}
|
|
70
|
+
function resolveDescriptorChoiceValue(descriptor, raw) {
|
|
71
|
+
const trimmed = trimOrNull(raw);
|
|
72
|
+
if (!trimmed) return descriptor.currentValue ?? descriptor.options.find((option) => option.isDefault)?.id;
|
|
73
|
+
if (descriptor.options.length === 0) return trimmed;
|
|
74
|
+
if (descriptor.promptInjectedValues?.includes(trimmed) && descriptor.options.some((option) => option.id === trimmed)) return descriptor.options.find((option) => option.isDefault)?.id;
|
|
75
|
+
if (descriptor.options.some((option) => option.id === trimmed)) return trimmed;
|
|
76
|
+
return descriptor.currentValue ?? descriptor.options.find((option) => option.isDefault)?.id;
|
|
77
|
+
}
|
|
78
|
+
function cloneDescriptor(descriptor) {
|
|
79
|
+
return descriptor.type === "select" ? {
|
|
80
|
+
...descriptor,
|
|
81
|
+
options: [...descriptor.options],
|
|
82
|
+
...descriptor.promptInjectedValues ? { promptInjectedValues: [...descriptor.promptInjectedValues] } : {}
|
|
83
|
+
} : { ...descriptor };
|
|
84
|
+
}
|
|
85
|
+
function cloneSelection(selection) {
|
|
86
|
+
return { ...selection };
|
|
87
|
+
}
|
|
88
|
+
function withDescriptorCurrentValue(descriptor, rawCurrentValue) {
|
|
89
|
+
if (descriptor.type === "boolean") {
|
|
90
|
+
if (typeof rawCurrentValue === "boolean") return {
|
|
91
|
+
...descriptor,
|
|
92
|
+
currentValue: rawCurrentValue
|
|
93
|
+
};
|
|
94
|
+
return descriptor;
|
|
95
|
+
}
|
|
96
|
+
const currentValue = typeof rawCurrentValue === "string" ? resolveDescriptorChoiceValue(descriptor, rawCurrentValue) : resolveDescriptorChoiceValue(descriptor, descriptor.currentValue);
|
|
97
|
+
if (!currentValue) {
|
|
98
|
+
const { currentValue: _unusedCurrentValue, ...rest } = descriptor;
|
|
99
|
+
return rest;
|
|
100
|
+
}
|
|
101
|
+
return {
|
|
102
|
+
...descriptor,
|
|
103
|
+
currentValue
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
function getProviderOptionDescriptors(input) {
|
|
107
|
+
const { caps, selections } = input;
|
|
108
|
+
return (caps.optionDescriptors ?? []).map(cloneDescriptor).map((descriptor) => withDescriptorCurrentValue(descriptor, getRawSelectionValueById(selections, descriptor.id) ?? descriptor.currentValue));
|
|
109
|
+
}
|
|
110
|
+
function getProviderOptionCurrentValue(descriptor) {
|
|
111
|
+
if (!descriptor) return;
|
|
112
|
+
if (descriptor.type === "boolean") return descriptor.currentValue;
|
|
113
|
+
if (descriptor.currentValue) return descriptor.currentValue;
|
|
114
|
+
return descriptor.options.find((option) => option.isDefault)?.id;
|
|
115
|
+
}
|
|
116
|
+
function normalizeModelSlug(model, provider = DEFAULT_PROVIDER_DRIVER_KIND) {
|
|
117
|
+
if (typeof model !== "string") return null;
|
|
118
|
+
const trimmed = model.trim();
|
|
119
|
+
if (!trimmed) return null;
|
|
120
|
+
const aliases = MODEL_SLUG_ALIASES_BY_PROVIDER[provider] ?? {};
|
|
121
|
+
const aliased = Object.prototype.hasOwnProperty.call(aliases, trimmed) ? aliases[trimmed] : void 0;
|
|
122
|
+
return typeof aliased === "string" ? aliased : trimmed;
|
|
123
|
+
}
|
|
124
|
+
/** Trim a string, returning null for empty/missing values. */
|
|
125
|
+
function trimOrNull(value) {
|
|
126
|
+
if (typeof value !== "string") return null;
|
|
127
|
+
return value.trim() || null;
|
|
128
|
+
}
|
|
129
|
+
function cloneSelections(selections) {
|
|
130
|
+
return selections.map(cloneSelection);
|
|
131
|
+
}
|
|
132
|
+
function createModelSelection(instanceId, model, options) {
|
|
133
|
+
const selections = options ? cloneSelections(options) : [];
|
|
134
|
+
const base = {
|
|
135
|
+
instanceId,
|
|
136
|
+
model
|
|
137
|
+
};
|
|
138
|
+
return selections.length > 0 ? {
|
|
139
|
+
...base,
|
|
140
|
+
options: selections
|
|
141
|
+
} : base;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Context handoff is a provider-instance boundary. Model and option changes
|
|
145
|
+
* within one configured instance remain on that provider's normal turn path.
|
|
146
|
+
*/
|
|
147
|
+
function modelSelectionRequiresContextHandoff(input) {
|
|
148
|
+
return input.canonicalSelection.instanceId !== input.targetSelection.instanceId;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Returns the effort value if it is a prompt-injected value according to
|
|
152
|
+
* any select descriptor in the given capabilities, or null otherwise.
|
|
153
|
+
*
|
|
154
|
+
* Unlike a single `find`, this checks every descriptor so that the
|
|
155
|
+
* correct descriptor's `promptInjectedValues` list is consulted even when
|
|
156
|
+
* multiple select descriptors exist.
|
|
157
|
+
*/
|
|
158
|
+
function resolvePromptInjectedEffort(caps, rawEffort) {
|
|
159
|
+
const trimmed = trimOrNull(rawEffort);
|
|
160
|
+
if (!trimmed) return null;
|
|
161
|
+
const descriptors = getProviderOptionDescriptors({ caps });
|
|
162
|
+
for (const descriptor of descriptors) if (descriptor.type === "select" && descriptor.promptInjectedValues?.includes(trimmed)) return trimmed;
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
function applyClaudePromptEffortPrefix(text, effort) {
|
|
166
|
+
const trimmed = text.trim();
|
|
167
|
+
if (!trimmed) return trimmed;
|
|
168
|
+
if (effort !== "ultrathink") return trimmed;
|
|
169
|
+
if (trimmed.startsWith("Ultrathink:")) return trimmed;
|
|
170
|
+
return `Ultrathink:\n${trimmed}`;
|
|
171
|
+
}
|
|
172
|
+
//#endregion
|
|
173
|
+
//#region ../../packages/shared/src/serverSettings.ts
|
|
174
|
+
const ServerSettingsJson$1 = fromLenientJson(ServerSettings);
|
|
175
|
+
function normalizePersistedServerSettingString(value) {
|
|
176
|
+
const trimmed = value?.trim();
|
|
177
|
+
return trimmed && trimmed.length > 0 ? trimmed : void 0;
|
|
178
|
+
}
|
|
179
|
+
function extractPersistedServerObservabilitySettings(input) {
|
|
180
|
+
return {
|
|
181
|
+
otlpTracesUrl: normalizePersistedServerSettingString(input.observability?.otlpTracesUrl),
|
|
182
|
+
otlpMetricsUrl: normalizePersistedServerSettingString(input.observability?.otlpMetricsUrl)
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
function parsePersistedServerObservabilitySettings(raw) {
|
|
186
|
+
try {
|
|
187
|
+
return extractPersistedServerObservabilitySettings(Schema.decodeUnknownSync(ServerSettingsJson$1)(raw));
|
|
188
|
+
} catch {
|
|
189
|
+
return {
|
|
190
|
+
otlpTracesUrl: void 0,
|
|
191
|
+
otlpMetricsUrl: void 0
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
function shouldReplaceTextGenerationModelSelection(patch) {
|
|
196
|
+
return Boolean(patch && (patch.instanceId !== void 0 || patch.model !== void 0));
|
|
197
|
+
}
|
|
198
|
+
function mergeModelSelectionOptionsById(input) {
|
|
199
|
+
if (input.patch === void 0) return input.current ? [...input.current] : void 0;
|
|
200
|
+
if (input.patch.length === 0) return;
|
|
201
|
+
const merged = new Map((input.current ?? []).map((selection) => [selection.id, selection.value]));
|
|
202
|
+
for (const selection of input.patch) merged.set(selection.id, selection.value);
|
|
203
|
+
return [...merged.entries()].map(([id, value]) => ({
|
|
204
|
+
id,
|
|
205
|
+
value
|
|
206
|
+
}));
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Applies a server settings patch while treating textGenerationModelSelection as
|
|
210
|
+
* replace-on-provider/model updates. This prevents stale nested options from
|
|
211
|
+
* surviving a reset patch that intentionally omits options.
|
|
212
|
+
*/
|
|
213
|
+
function applyServerSettingsPatch(current, patch) {
|
|
214
|
+
const selectionPatch = patch.textGenerationModelSelection;
|
|
215
|
+
let next = deepMerge(current, patch);
|
|
216
|
+
if (patch.projectWorktreeRoots !== void 0) {
|
|
217
|
+
const roots = new Map(Object.entries(current.projectWorktreeRoots));
|
|
218
|
+
for (const [projectId, root] of Object.entries(patch.projectWorktreeRoots)) if (root === null || root === "") roots.delete(projectId);
|
|
219
|
+
else roots.set(projectId, root);
|
|
220
|
+
next = {
|
|
221
|
+
...next,
|
|
222
|
+
projectWorktreeRoots: Object.fromEntries(roots)
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
const nextWithReplacements = patch.providerInstances !== void 0 ? {
|
|
226
|
+
...next,
|
|
227
|
+
providerInstances: patch.providerInstances
|
|
228
|
+
} : next;
|
|
229
|
+
if (!selectionPatch) return nextWithReplacements;
|
|
230
|
+
const instanceId = selectionPatch.instanceId ?? current.textGenerationModelSelection.instanceId;
|
|
231
|
+
const model = selectionPatch.model ?? current.textGenerationModelSelection.model;
|
|
232
|
+
const options = shouldReplaceTextGenerationModelSelection(selectionPatch) ? selectionPatch.options : mergeModelSelectionOptionsById({
|
|
233
|
+
current: current.textGenerationModelSelection.options,
|
|
234
|
+
patch: selectionPatch.options
|
|
235
|
+
});
|
|
236
|
+
return {
|
|
237
|
+
...nextWithReplacements,
|
|
238
|
+
textGenerationModelSelection: createModelSelection(instanceId, model, options)
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
//#endregion
|
|
7
242
|
//#region ../../node_modules/.bun/cborg@6.1.2/node_modules/cborg/lib/is.js
|
|
8
243
|
const objectTypeNames = [
|
|
9
244
|
"Object",
|
|
@@ -129,7 +364,7 @@ var Token = class {
|
|
|
129
364
|
//#endregion
|
|
130
365
|
//#region ../../node_modules/.bun/cborg@6.1.2/node_modules/cborg/lib/byte-utils.js
|
|
131
366
|
const useBuffer = globalThis.process && !globalThis.process.browser && globalThis.Buffer && typeof globalThis.Buffer.isBuffer === "function";
|
|
132
|
-
const textEncoder = new TextEncoder();
|
|
367
|
+
const textEncoder$1 = new TextEncoder();
|
|
133
368
|
/**
|
|
134
369
|
* @typedef {import('../interface.js').ByteView} ByteView
|
|
135
370
|
* @typedef {import('../interface.js').AllocatedByteView} AllocatedByteView
|
|
@@ -158,7 +393,7 @@ const fromString = useBuffer ? (string) => {
|
|
|
158
393
|
* @param {string} string
|
|
159
394
|
*/
|
|
160
395
|
(string) => {
|
|
161
|
-
return string.length >= FROM_STRING_THRESHOLD_TEXTENCODER ? textEncoder.encode(string) : utf8ToBytes(string);
|
|
396
|
+
return string.length >= FROM_STRING_THRESHOLD_TEXTENCODER ? textEncoder$1.encode(string) : utf8ToBytes(string);
|
|
162
397
|
};
|
|
163
398
|
/**
|
|
164
399
|
* Buffer variant not fast enough for what we need
|
|
@@ -819,7 +1054,7 @@ function compareBytes(b1, b2) {
|
|
|
819
1054
|
}
|
|
820
1055
|
//#endregion
|
|
821
1056
|
//#region ../../node_modules/.bun/cborg@6.1.2/node_modules/cborg/lib/3string.js
|
|
822
|
-
const textDecoder = new TextDecoder();
|
|
1057
|
+
const textDecoder$1 = new TextDecoder();
|
|
823
1058
|
const ASCII_THRESHOLD = 32;
|
|
824
1059
|
/**
|
|
825
1060
|
* @typedef {import('../interface.js').ByteWriter} ByteWriter
|
|
@@ -838,12 +1073,12 @@ function toStr(bytes, start, end) {
|
|
|
838
1073
|
let str = "";
|
|
839
1074
|
for (let i = start; i < end; i++) {
|
|
840
1075
|
const c = bytes[i];
|
|
841
|
-
if (c & 128) return textDecoder.decode(bytes.subarray(start, end));
|
|
1076
|
+
if (c & 128) return textDecoder$1.decode(bytes.subarray(start, end));
|
|
842
1077
|
str += String.fromCharCode(c);
|
|
843
1078
|
}
|
|
844
1079
|
return str;
|
|
845
1080
|
}
|
|
846
|
-
return textDecoder.decode(bytes.subarray(start, end));
|
|
1081
|
+
return textDecoder$1.decode(bytes.subarray(start, end));
|
|
847
1082
|
}
|
|
848
1083
|
/**
|
|
849
1084
|
* @param {Uint8Array} data
|
|
@@ -2739,6 +2974,27 @@ const resolveStaticDir = Effect.fn(function* () {
|
|
|
2739
2974
|
if (yield* exists(join(monorepoClient, "index.html")).pipe(Effect.orElseSucceed(() => false))) return monorepoClient;
|
|
2740
2975
|
});
|
|
2741
2976
|
//#endregion
|
|
2977
|
+
//#region src/workspace/Services/WorkspaceAccessPolicy.ts
|
|
2978
|
+
/**
|
|
2979
|
+
* WorkspaceAccessPolicy - Process-wide boundary for Ryco-managed workspace paths.
|
|
2980
|
+
*
|
|
2981
|
+
* This service constrains paths accepted by Ryco RPCs. It does not sandbox child
|
|
2982
|
+
* processes such as terminals or coding-agent runtimes.
|
|
2983
|
+
*
|
|
2984
|
+
* @module WorkspaceAccessPolicy
|
|
2985
|
+
*/
|
|
2986
|
+
var WorkspaceAccessDeniedError = class extends Schema.TaggedError()("WorkspaceAccessDeniedError", {
|
|
2987
|
+
operation: Schema.String,
|
|
2988
|
+
requestedPath: Schema.String,
|
|
2989
|
+
accessRoot: Schema.String,
|
|
2990
|
+
reason: Schema.Literals(["outsideRoot", "unresolvable"])
|
|
2991
|
+
}) {
|
|
2992
|
+
get message() {
|
|
2993
|
+
return `Workspace path is not available for ${this.operation}; access is restricted to '${this.accessRoot}'.`;
|
|
2994
|
+
}
|
|
2995
|
+
};
|
|
2996
|
+
var WorkspaceAccessPolicy = class extends Context.Service()("ryco/workspace/Services/WorkspaceAccessPolicy") {};
|
|
2997
|
+
//#endregion
|
|
2742
2998
|
//#region src/observability/Attributes.ts
|
|
2743
2999
|
function isPlainObject(value) {
|
|
2744
3000
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
@@ -3006,4 +3262,523 @@ const providerTurnMetricAttributes = (input) => {
|
|
|
3006
3262
|
});
|
|
3007
3263
|
};
|
|
3008
3264
|
//#endregion
|
|
3009
|
-
|
|
3265
|
+
//#region src/atomicWrite.ts
|
|
3266
|
+
const writeFileStringAtomically = (input) => Effect.scoped(Effect.gen(function* () {
|
|
3267
|
+
const fs = yield* FileSystem.FileSystem;
|
|
3268
|
+
const path = yield* Path.Path;
|
|
3269
|
+
const tempFileId = yield* Effect.sync(() => crypto.randomUUID());
|
|
3270
|
+
const targetDirectory = path.dirname(input.filePath);
|
|
3271
|
+
yield* fs.makeDirectory(targetDirectory, { recursive: true });
|
|
3272
|
+
const tempDirectory = yield* fs.makeTempDirectoryScoped({
|
|
3273
|
+
directory: targetDirectory,
|
|
3274
|
+
prefix: `${path.basename(input.filePath)}.`
|
|
3275
|
+
});
|
|
3276
|
+
const tempPath = path.join(tempDirectory, `${tempFileId}.tmp`);
|
|
3277
|
+
yield* fs.writeFileString(tempPath, input.contents);
|
|
3278
|
+
yield* fs.rename(tempPath, input.filePath);
|
|
3279
|
+
}));
|
|
3280
|
+
//#endregion
|
|
3281
|
+
//#region src/auth/Services/ServerSecretStore.ts
|
|
3282
|
+
var SecretStoreError = class extends Data.TaggedError("SecretStoreError") {};
|
|
3283
|
+
var ServerSecretStore = class extends Context.Service()("ryco/auth/Services/ServerSecretStore") {};
|
|
3284
|
+
//#endregion
|
|
3285
|
+
//#region src/auth/Layers/ServerSecretStore.ts
|
|
3286
|
+
const makeServerSecretStore = Effect.gen(function* () {
|
|
3287
|
+
const fileSystem = yield* FileSystem.FileSystem;
|
|
3288
|
+
const path = yield* Path.Path;
|
|
3289
|
+
const serverConfig = yield* ServerConfig;
|
|
3290
|
+
yield* fileSystem.makeDirectory(serverConfig.secretsDir, { recursive: true });
|
|
3291
|
+
yield* fileSystem.chmod(serverConfig.secretsDir, 448).pipe(Effect.mapError((cause) => new SecretStoreError({
|
|
3292
|
+
message: `Failed to secure secrets directory ${serverConfig.secretsDir}.`,
|
|
3293
|
+
cause
|
|
3294
|
+
})));
|
|
3295
|
+
const resolveSecretPath = (name) => path.join(serverConfig.secretsDir, `${name}.bin`);
|
|
3296
|
+
const ensureSecretDirectory = (secretPath) => {
|
|
3297
|
+
const directory = path.dirname(secretPath);
|
|
3298
|
+
return fileSystem.makeDirectory(directory, { recursive: true }).pipe(Effect.flatMap(() => fileSystem.chmod(directory, 448)));
|
|
3299
|
+
};
|
|
3300
|
+
const isPlatformError = (u) => Predicate.isTagged(u, "PlatformError");
|
|
3301
|
+
const get = (name) => fileSystem.readFile(resolveSecretPath(name)).pipe(Effect.map((bytes) => Uint8Array.from(bytes)), Effect.catch((cause) => cause.reason._tag === "NotFound" ? Effect.succeed(null) : Effect.fail(new SecretStoreError({
|
|
3302
|
+
message: `Failed to read secret ${name}.`,
|
|
3303
|
+
cause
|
|
3304
|
+
}))));
|
|
3305
|
+
const set = (name, value) => {
|
|
3306
|
+
const secretPath = resolveSecretPath(name);
|
|
3307
|
+
const tempPath = `${secretPath}.${Crypto.randomUUID()}.tmp`;
|
|
3308
|
+
return Effect.gen(function* () {
|
|
3309
|
+
yield* ensureSecretDirectory(secretPath);
|
|
3310
|
+
yield* fileSystem.writeFile(tempPath, value);
|
|
3311
|
+
yield* fileSystem.chmod(tempPath, 384);
|
|
3312
|
+
yield* fileSystem.rename(tempPath, secretPath);
|
|
3313
|
+
yield* fileSystem.chmod(secretPath, 384);
|
|
3314
|
+
}).pipe(Effect.catch((cause) => fileSystem.remove(tempPath).pipe(Effect.ignore, Effect.flatMap(() => Effect.fail(new SecretStoreError({
|
|
3315
|
+
message: `Failed to persist secret ${name}.`,
|
|
3316
|
+
cause
|
|
3317
|
+
}))))));
|
|
3318
|
+
};
|
|
3319
|
+
const create = (name, value) => {
|
|
3320
|
+
const secretPath = resolveSecretPath(name);
|
|
3321
|
+
return Effect.scoped(Effect.gen(function* () {
|
|
3322
|
+
yield* ensureSecretDirectory(secretPath);
|
|
3323
|
+
const file = yield* fileSystem.open(secretPath, {
|
|
3324
|
+
flag: "wx",
|
|
3325
|
+
mode: 384
|
|
3326
|
+
});
|
|
3327
|
+
yield* file.writeAll(value);
|
|
3328
|
+
yield* file.sync;
|
|
3329
|
+
yield* fileSystem.chmod(secretPath, 384);
|
|
3330
|
+
})).pipe(Effect.mapError((cause) => new SecretStoreError({
|
|
3331
|
+
message: `Failed to persist secret ${name}.`,
|
|
3332
|
+
cause
|
|
3333
|
+
})));
|
|
3334
|
+
};
|
|
3335
|
+
const getOrCreateRandom = (name, bytes) => get(name).pipe(Effect.flatMap((existing) => {
|
|
3336
|
+
if (existing) return Effect.succeed(existing);
|
|
3337
|
+
const generated = Crypto.randomBytes(bytes);
|
|
3338
|
+
return create(name, generated).pipe(Effect.as(Uint8Array.from(generated)), Effect.catchTag("SecretStoreError", (error) => isPlatformError(error.cause) && error.cause.reason._tag === "AlreadyExists" ? get(name).pipe(Effect.flatMap((created) => created !== null ? Effect.succeed(created) : Effect.fail(new SecretStoreError({ message: `Failed to read secret ${name} after concurrent creation.` })))) : Effect.fail(error)));
|
|
3339
|
+
}));
|
|
3340
|
+
const remove = (name) => fileSystem.remove(resolveSecretPath(name)).pipe(Effect.catch((cause) => cause.reason._tag === "NotFound" ? Effect.void : Effect.fail(new SecretStoreError({
|
|
3341
|
+
message: `Failed to remove secret ${name}.`,
|
|
3342
|
+
cause
|
|
3343
|
+
}))));
|
|
3344
|
+
return {
|
|
3345
|
+
get,
|
|
3346
|
+
set,
|
|
3347
|
+
getOrCreateRandom,
|
|
3348
|
+
remove
|
|
3349
|
+
};
|
|
3350
|
+
});
|
|
3351
|
+
const ServerSecretStoreLive = Layer.effect(ServerSecretStore, makeServerSecretStore);
|
|
3352
|
+
//#endregion
|
|
3353
|
+
//#region src/pathExpansion.ts
|
|
3354
|
+
/**
|
|
3355
|
+
* Expand a leading `~` (or `~/…`, `~\…`) in a user-supplied path to the
|
|
3356
|
+
* current user's home directory. Spawned processes don't get shell
|
|
3357
|
+
* expansion, so env vars like `CODEX_HOME=~/.codex-work` would be passed
|
|
3358
|
+
* verbatim and treated as relative paths by the receiver.
|
|
3359
|
+
*
|
|
3360
|
+
* Matches the behavior of the other `expandHomePath` helpers in the
|
|
3361
|
+
* workspace layers and CLI bootstrap: `~` alone and both `~/` and `~\`
|
|
3362
|
+
* separators are handled. Returns the input unchanged if it doesn't
|
|
3363
|
+
* start with `~` or is empty. Does not handle `~user` (other-user)
|
|
3364
|
+
* expansion.
|
|
3365
|
+
*/
|
|
3366
|
+
function expandHomePath(value) {
|
|
3367
|
+
if (!value) return value;
|
|
3368
|
+
if (value === "~") return homedir();
|
|
3369
|
+
if (value.startsWith("~/") || value.startsWith("~\\")) return join(homedir(), value.slice(2));
|
|
3370
|
+
return value;
|
|
3371
|
+
}
|
|
3372
|
+
//#endregion
|
|
3373
|
+
//#region src/project/worktreeRoot.ts
|
|
3374
|
+
var WorktreeRootError = class extends Schema.TaggedError()("WorktreeRootError", { detail: Schema.String }) {
|
|
3375
|
+
get message() {
|
|
3376
|
+
return this.detail;
|
|
3377
|
+
}
|
|
3378
|
+
};
|
|
3379
|
+
/** Resolve missing descendants through the nearest existing directory, including symlink aliases.
|
|
3380
|
+
* Do not turn permission errors or dangling symlinks into nonexistent ancestors.
|
|
3381
|
+
* No directories are created while validating a preference.
|
|
3382
|
+
*/
|
|
3383
|
+
async function canonicalizeWorktreeDirectory(candidate) {
|
|
3384
|
+
let ancestor = candidate;
|
|
3385
|
+
while (true) try {
|
|
3386
|
+
await lstat(ancestor);
|
|
3387
|
+
const canonical = await realpath(ancestor);
|
|
3388
|
+
if (!(await lstat(canonical)).isDirectory()) throw new Error("Worktree root must be a directory.");
|
|
3389
|
+
await access(canonical, constants.W_OK | constants.X_OK);
|
|
3390
|
+
return path.join(canonical, path.relative(ancestor, candidate));
|
|
3391
|
+
} catch (cause) {
|
|
3392
|
+
if (cause.code !== "ENOENT") throw cause;
|
|
3393
|
+
if (await lstat(ancestor).catch((error) => {
|
|
3394
|
+
if (error.code !== "ENOENT") throw error;
|
|
3395
|
+
return null;
|
|
3396
|
+
}) !== null) throw new Error("Worktree root contains a dangling symlink.", { cause });
|
|
3397
|
+
const parent = path.dirname(ancestor);
|
|
3398
|
+
if (parent === ancestor) throw cause;
|
|
3399
|
+
ancestor = parent;
|
|
3400
|
+
}
|
|
3401
|
+
}
|
|
3402
|
+
const validateWorktreeRoot = (value, policy) => Effect.gen(function* () {
|
|
3403
|
+
const trimmed = value.trim();
|
|
3404
|
+
const expanded = expandHomePath(trimmed);
|
|
3405
|
+
if (!trimmed || /[\x00-\x1f\x7f]/.test(trimmed) || !path.isAbsolute(expanded) || process.platform === "win32" && !/^(?:[A-Za-z]:[\\/]|\\\\[^\\]+\\[^\\]+)/.test(expanded)) return yield* new WorktreeRootError({ detail: "Worktree root must be an absolute directory on this node or start with ~/." });
|
|
3406
|
+
const operation = "worktree root";
|
|
3407
|
+
const authorized = yield* policy.assertPath({
|
|
3408
|
+
path: path.normalize(expanded),
|
|
3409
|
+
operation
|
|
3410
|
+
}).pipe(Effect.mapError((cause) => new WorktreeRootError({ detail: cause.message })));
|
|
3411
|
+
const canonical = yield* Effect.tryPromise({
|
|
3412
|
+
try: () => canonicalizeWorktreeDirectory(authorized),
|
|
3413
|
+
catch: () => new WorktreeRootError({ detail: "Worktree root must resolve to a writable directory (or have a writable existing parent), without broken symlinks." })
|
|
3414
|
+
});
|
|
3415
|
+
return yield* policy.assertPath({
|
|
3416
|
+
path: canonical,
|
|
3417
|
+
operation
|
|
3418
|
+
}).pipe(Effect.mapError((cause) => new WorktreeRootError({ detail: cause.message })));
|
|
3419
|
+
});
|
|
3420
|
+
/** Storage selection only: this never grants access to the selected directory's contents. */
|
|
3421
|
+
const selectConfiguredWorktreeRoot = (input) => (input.projectId && Object.hasOwn(input.settings.projectWorktreeRoots, input.projectId) ? input.settings.projectWorktreeRoots[input.projectId] : null) || input.settings.worktreeRoot || resolveManagedWorktreesRoot(input.config);
|
|
3422
|
+
const resolveConfiguredWorktreeRoot = (input) => validateWorktreeRoot(selectConfiguredWorktreeRoot(input), input.policy);
|
|
3423
|
+
//#endregion
|
|
3424
|
+
//#region src/workspace/Layers/WorkspaceAccessPolicy.ts
|
|
3425
|
+
function isWithinOrEqual(path, root, target) {
|
|
3426
|
+
const relative = path.relative(root, target);
|
|
3427
|
+
return relative.length === 0 || relative === "." || !relative.startsWith(`..${path.sep}`) && relative !== ".." && !path.isAbsolute(relative);
|
|
3428
|
+
}
|
|
3429
|
+
const makeWorkspaceAccessPolicy = (configuredRoot) => Effect.gen(function* () {
|
|
3430
|
+
const fileSystem = yield* FileSystem.FileSystem;
|
|
3431
|
+
const path = yield* Path.Path;
|
|
3432
|
+
const accessRoot = configuredRoot === void 0 ? void 0 : yield* fileSystem.realPath(configuredRoot);
|
|
3433
|
+
const denied = (input, reason) => new WorkspaceAccessDeniedError({
|
|
3434
|
+
operation: input.operation,
|
|
3435
|
+
requestedPath: input.path,
|
|
3436
|
+
accessRoot: accessRoot ?? "",
|
|
3437
|
+
reason
|
|
3438
|
+
});
|
|
3439
|
+
const assertInside = (input, target) => {
|
|
3440
|
+
if (accessRoot === void 0 || isWithinOrEqual(path, accessRoot, target)) return Effect.succeed(target);
|
|
3441
|
+
return Effect.fail(denied(input, "outsideRoot"));
|
|
3442
|
+
};
|
|
3443
|
+
const assertExistingPath = Effect.fn("WorkspaceAccessPolicy.assertExistingPath")(function* (input) {
|
|
3444
|
+
const normalized = path.resolve(input.path);
|
|
3445
|
+
if (accessRoot === void 0) return normalized;
|
|
3446
|
+
const canonical = yield* fileSystem.realPath(normalized).pipe(Effect.mapError(() => denied(input, "unresolvable")));
|
|
3447
|
+
return yield* assertInside(input, canonical);
|
|
3448
|
+
});
|
|
3449
|
+
const assertPath = Effect.fn("WorkspaceAccessPolicy.assertPath")(function* (input) {
|
|
3450
|
+
const normalized = path.resolve(input.path);
|
|
3451
|
+
if (accessRoot === void 0) return normalized;
|
|
3452
|
+
let ancestor = normalized;
|
|
3453
|
+
while (!(yield* fileSystem.exists(ancestor).pipe(Effect.orElseSucceed(() => false)))) {
|
|
3454
|
+
const parent = path.dirname(ancestor);
|
|
3455
|
+
if (parent === ancestor) return yield* denied(input, "unresolvable");
|
|
3456
|
+
ancestor = parent;
|
|
3457
|
+
}
|
|
3458
|
+
const canonicalAncestor = yield* fileSystem.realPath(ancestor).pipe(Effect.mapError(() => denied(input, "unresolvable")));
|
|
3459
|
+
const canonicalTarget = path.resolve(canonicalAncestor, path.relative(ancestor, normalized));
|
|
3460
|
+
return yield* assertInside(input, canonicalTarget);
|
|
3461
|
+
});
|
|
3462
|
+
return {
|
|
3463
|
+
accessRoot,
|
|
3464
|
+
isRestricted: accessRoot !== void 0,
|
|
3465
|
+
assertPath,
|
|
3466
|
+
assertExistingPath
|
|
3467
|
+
};
|
|
3468
|
+
});
|
|
3469
|
+
const WorkspaceAccessPolicyLive = Layer.effect(WorkspaceAccessPolicy, Effect.gen(function* () {
|
|
3470
|
+
const config = yield* ServerConfig;
|
|
3471
|
+
return yield* makeWorkspaceAccessPolicy(config.workspaceAccessRoot);
|
|
3472
|
+
}));
|
|
3473
|
+
//#endregion
|
|
3474
|
+
//#region src/serverSettings.ts
|
|
3475
|
+
/**
|
|
3476
|
+
* ServerSettings - Server-authoritative settings service.
|
|
3477
|
+
*
|
|
3478
|
+
* Owns persistence, validation, and change notification of settings that affect
|
|
3479
|
+
* server-side behavior (binary paths, streaming mode, env mode, custom models,
|
|
3480
|
+
* text generation model selection).
|
|
3481
|
+
*
|
|
3482
|
+
* Follows the same pattern as `keybindings.ts`: JSON file + Cache + PubSub +
|
|
3483
|
+
* Semaphore + FileSystem.watch for concurrency and external edit detection.
|
|
3484
|
+
*
|
|
3485
|
+
* @module ServerSettings
|
|
3486
|
+
*/
|
|
3487
|
+
const textEncoder = new TextEncoder();
|
|
3488
|
+
const textDecoder = new TextDecoder();
|
|
3489
|
+
function providerEnvironmentSecretName(input) {
|
|
3490
|
+
return `provider-env-${Buffer.from(input.instanceId, "utf8").toString("base64url")}-${Buffer.from(input.name, "utf8").toString("base64url")}`;
|
|
3491
|
+
}
|
|
3492
|
+
function redactProviderEnvironmentVariable(variable) {
|
|
3493
|
+
if (!variable.sensitive) {
|
|
3494
|
+
const { valueRedacted: _omit, ...rest } = variable;
|
|
3495
|
+
return rest;
|
|
3496
|
+
}
|
|
3497
|
+
return {
|
|
3498
|
+
...variable,
|
|
3499
|
+
value: "",
|
|
3500
|
+
...variable.value.length > 0 || variable.valueRedacted ? { valueRedacted: true } : {}
|
|
3501
|
+
};
|
|
3502
|
+
}
|
|
3503
|
+
function redactServerSettingsForClient(settings) {
|
|
3504
|
+
const providerInstances = Object.fromEntries(Object.entries(settings.providerInstances).map(([instanceId, instance]) => [instanceId, instance.environment ? {
|
|
3505
|
+
...instance,
|
|
3506
|
+
environment: instance.environment.map(redactProviderEnvironmentVariable)
|
|
3507
|
+
} : instance]));
|
|
3508
|
+
return {
|
|
3509
|
+
...settings,
|
|
3510
|
+
providerInstances
|
|
3511
|
+
};
|
|
3512
|
+
}
|
|
3513
|
+
var ServerSettingsService = class ServerSettingsService extends Context.Service()("ryco/serverSettings/ServerSettingsService") {
|
|
3514
|
+
static layerTest = (overrides = {}) => Layer.effect(ServerSettingsService, Effect.gen(function* () {
|
|
3515
|
+
const currentSettingsRef = yield* Ref.make(deepMerge(DEFAULT_SERVER_SETTINGS, overrides));
|
|
3516
|
+
return {
|
|
3517
|
+
start: Effect.void,
|
|
3518
|
+
ready: Effect.void,
|
|
3519
|
+
getSettings: Ref.get(currentSettingsRef),
|
|
3520
|
+
updateSettings: (patch) => Ref.get(currentSettingsRef).pipe(Effect.flatMap((currentSettings) => Schema.decodeEffect(ServerSettings)(applyServerSettingsPatch(currentSettings, patch)).pipe(Effect.mapError((cause) => new ServerSettingsError({
|
|
3521
|
+
settingsPath: "<memory>",
|
|
3522
|
+
detail: `failed to normalize server settings: ${SchemaIssue.makeFormatterDefault()(cause.issue)}`,
|
|
3523
|
+
cause
|
|
3524
|
+
})))), Effect.tap((nextSettings) => Ref.set(currentSettingsRef, nextSettings))),
|
|
3525
|
+
streamChanges: Stream.empty
|
|
3526
|
+
};
|
|
3527
|
+
}));
|
|
3528
|
+
};
|
|
3529
|
+
const ServerSettingsJson = fromLenientJson(ServerSettings);
|
|
3530
|
+
const getLegacyProviderSettings = (settings, provider) => settings.providers[provider];
|
|
3531
|
+
/**
|
|
3532
|
+
* Ensure the `textGenerationModelSelection` points to an enabled provider.
|
|
3533
|
+
* If the selected provider is disabled, fall back to the first enabled
|
|
3534
|
+
* provider with its default model. This is applied at read-time so the
|
|
3535
|
+
* persisted preference is preserved for when a provider is re-enabled.
|
|
3536
|
+
*/
|
|
3537
|
+
function resolveTextGenerationProvider(settings) {
|
|
3538
|
+
const selection = settings.textGenerationModelSelection;
|
|
3539
|
+
const instanceConfig = settings.providerInstances[selection.instanceId];
|
|
3540
|
+
if (instanceConfig !== void 0) return instanceConfig.enabled ?? true ? settings : fallbackTextGenerationProvider(settings);
|
|
3541
|
+
if (isProviderDriverKind(selection.instanceId) && getLegacyProviderSettings(settings, selection.instanceId)?.enabled) return settings;
|
|
3542
|
+
return fallbackTextGenerationProvider(settings);
|
|
3543
|
+
}
|
|
3544
|
+
function fallbackTextGenerationProvider(settings) {
|
|
3545
|
+
const fallbackEntry = Object.entries(settings.providers).find(([, provider]) => provider.enabled);
|
|
3546
|
+
const fallback = fallbackEntry ? ProviderDriverKind.make(fallbackEntry[0]) : void 0;
|
|
3547
|
+
if (!fallback) return settings;
|
|
3548
|
+
const defaultOptions = DEFAULT_GIT_TEXT_GENERATION_OPTIONS_BY_PROVIDER[fallback];
|
|
3549
|
+
return {
|
|
3550
|
+
...settings,
|
|
3551
|
+
textGenerationModelSelection: {
|
|
3552
|
+
instanceId: ProviderInstanceId.make(fallback),
|
|
3553
|
+
model: DEFAULT_GIT_TEXT_GENERATION_MODEL_BY_PROVIDER[fallback] ?? "gpt-5.6-luna",
|
|
3554
|
+
...defaultOptions ? { options: defaultOptions } : {}
|
|
3555
|
+
}
|
|
3556
|
+
};
|
|
3557
|
+
}
|
|
3558
|
+
const ATOMIC_SETTINGS_KEYS = /* @__PURE__ */ new Set(["textGenerationModelSelection"]);
|
|
3559
|
+
function stripDefaultServerSettings(current, defaults) {
|
|
3560
|
+
if (Array.isArray(current) || Array.isArray(defaults)) return Equal.equals(current, defaults) ? void 0 : current;
|
|
3561
|
+
if (current !== null && defaults !== null && typeof current === "object" && typeof defaults === "object") {
|
|
3562
|
+
const currentRecord = current;
|
|
3563
|
+
const defaultsRecord = defaults;
|
|
3564
|
+
const next = {};
|
|
3565
|
+
for (const key of Object.keys(currentRecord)) if (ATOMIC_SETTINGS_KEYS.has(key)) {
|
|
3566
|
+
if (!Equal.equals(currentRecord[key], defaultsRecord[key])) next[key] = currentRecord[key];
|
|
3567
|
+
} else {
|
|
3568
|
+
const stripped = stripDefaultServerSettings(currentRecord[key], defaultsRecord[key]);
|
|
3569
|
+
if (stripped !== void 0) next[key] = stripped;
|
|
3570
|
+
}
|
|
3571
|
+
return Object.keys(next).length > 0 ? next : void 0;
|
|
3572
|
+
}
|
|
3573
|
+
return Object.is(current, defaults) ? void 0 : current;
|
|
3574
|
+
}
|
|
3575
|
+
const makeServerSettings = Effect.gen(function* () {
|
|
3576
|
+
const { settingsPath, workspaceAccessRoot } = yield* ServerConfig;
|
|
3577
|
+
const worktreeAccessPolicy = yield* makeWorkspaceAccessPolicy(workspaceAccessRoot);
|
|
3578
|
+
const fs = yield* FileSystem.FileSystem;
|
|
3579
|
+
const pathService = yield* Path.Path;
|
|
3580
|
+
const secretStore = yield* ServerSecretStore;
|
|
3581
|
+
const writeSemaphore = yield* Semaphore$1.make(1);
|
|
3582
|
+
const cacheKey = "settings";
|
|
3583
|
+
const changesPubSub = yield* PubSub.unbounded();
|
|
3584
|
+
const startedRef = yield* Ref.make(false);
|
|
3585
|
+
const startedDeferred = yield* Deferred.make();
|
|
3586
|
+
const watcherScope = yield* Scope.make("sequential");
|
|
3587
|
+
yield* Effect.addFinalizer(() => Scope.close(watcherScope, Exit.void));
|
|
3588
|
+
const emitChange = (settings) => PubSub.publish(changesPubSub, settings).pipe(Effect.asVoid);
|
|
3589
|
+
const readConfigExists = fs.exists(settingsPath).pipe(Effect.mapError((cause) => new ServerSettingsError({
|
|
3590
|
+
settingsPath,
|
|
3591
|
+
detail: "failed to check settings file existence",
|
|
3592
|
+
cause
|
|
3593
|
+
})));
|
|
3594
|
+
const readRawConfig = fs.readFileString(settingsPath).pipe(Effect.mapError((cause) => new ServerSettingsError({
|
|
3595
|
+
settingsPath,
|
|
3596
|
+
detail: "failed to read settings file",
|
|
3597
|
+
cause
|
|
3598
|
+
})));
|
|
3599
|
+
const loadSettingsFromDisk = Effect.gen(function* () {
|
|
3600
|
+
if (!(yield* readConfigExists)) return DEFAULT_SERVER_SETTINGS;
|
|
3601
|
+
const raw = yield* readRawConfig;
|
|
3602
|
+
const decoded = Schema.decodeUnknownExit(ServerSettingsJson)(raw);
|
|
3603
|
+
if (decoded._tag === "Failure") {
|
|
3604
|
+
yield* Effect.logWarning("failed to parse settings.json, using defaults", {
|
|
3605
|
+
path: settingsPath,
|
|
3606
|
+
issues: Cause.pretty(decoded.cause)
|
|
3607
|
+
});
|
|
3608
|
+
return DEFAULT_SERVER_SETTINGS;
|
|
3609
|
+
}
|
|
3610
|
+
return decoded.value;
|
|
3611
|
+
});
|
|
3612
|
+
const settingsCache = yield* Cache.make({
|
|
3613
|
+
capacity: 1,
|
|
3614
|
+
lookup: () => loadSettingsFromDisk
|
|
3615
|
+
});
|
|
3616
|
+
const getSettingsFromCache = Cache.get(settingsCache, cacheKey);
|
|
3617
|
+
const toSettingsError = (detail, cause) => new ServerSettingsError({
|
|
3618
|
+
settingsPath,
|
|
3619
|
+
detail,
|
|
3620
|
+
cause
|
|
3621
|
+
});
|
|
3622
|
+
const materializeProviderEnvironmentSecrets = (settings) => Effect.gen(function* () {
|
|
3623
|
+
const providerInstances = { ...settings.providerInstances };
|
|
3624
|
+
for (const [instanceId, instance] of Object.entries(settings.providerInstances)) {
|
|
3625
|
+
if (!instance.environment) continue;
|
|
3626
|
+
const environment = [];
|
|
3627
|
+
for (const variable of instance.environment) {
|
|
3628
|
+
if (!variable.sensitive || !variable.valueRedacted) {
|
|
3629
|
+
environment.push(variable);
|
|
3630
|
+
continue;
|
|
3631
|
+
}
|
|
3632
|
+
const secret = yield* secretStore.get(providerEnvironmentSecretName({
|
|
3633
|
+
instanceId,
|
|
3634
|
+
name: variable.name
|
|
3635
|
+
})).pipe(Effect.mapError((cause) => toSettingsError(`failed to read sensitive environment variable ${variable.name}`, cause)));
|
|
3636
|
+
environment.push({
|
|
3637
|
+
...variable,
|
|
3638
|
+
value: secret ? textDecoder.decode(secret) : ""
|
|
3639
|
+
});
|
|
3640
|
+
}
|
|
3641
|
+
providerInstances[instanceId] = {
|
|
3642
|
+
...instance,
|
|
3643
|
+
environment
|
|
3644
|
+
};
|
|
3645
|
+
}
|
|
3646
|
+
return {
|
|
3647
|
+
...settings,
|
|
3648
|
+
providerInstances
|
|
3649
|
+
};
|
|
3650
|
+
});
|
|
3651
|
+
const persistProviderEnvironmentSecrets = (current, next) => Effect.gen(function* () {
|
|
3652
|
+
const providerInstances = { ...next.providerInstances };
|
|
3653
|
+
const nextSecretKeys = /* @__PURE__ */ new Set();
|
|
3654
|
+
for (const [instanceId, instance] of Object.entries(next.providerInstances)) {
|
|
3655
|
+
if (!instance.environment) continue;
|
|
3656
|
+
const environment = [];
|
|
3657
|
+
for (const variable of instance.environment) {
|
|
3658
|
+
const secretName = providerEnvironmentSecretName({
|
|
3659
|
+
instanceId,
|
|
3660
|
+
name: variable.name
|
|
3661
|
+
});
|
|
3662
|
+
if (!variable.sensitive) {
|
|
3663
|
+
yield* secretStore.remove(secretName).pipe(Effect.mapError((cause) => toSettingsError(`failed to remove environment secret ${variable.name}`, cause)));
|
|
3664
|
+
environment.push(redactProviderEnvironmentVariable(variable));
|
|
3665
|
+
continue;
|
|
3666
|
+
}
|
|
3667
|
+
nextSecretKeys.add(secretName);
|
|
3668
|
+
if (!variable.valueRedacted) {
|
|
3669
|
+
if (variable.value.length > 0) {
|
|
3670
|
+
yield* secretStore.set(secretName, textEncoder.encode(variable.value)).pipe(Effect.mapError((cause) => toSettingsError(`failed to persist environment secret ${variable.name}`, cause)));
|
|
3671
|
+
environment.push({
|
|
3672
|
+
...variable,
|
|
3673
|
+
value: "",
|
|
3674
|
+
valueRedacted: true
|
|
3675
|
+
});
|
|
3676
|
+
} else {
|
|
3677
|
+
yield* secretStore.remove(secretName).pipe(Effect.mapError((cause) => toSettingsError(`failed to remove environment secret ${variable.name}`, cause)));
|
|
3678
|
+
const { valueRedacted: _omit, ...rest } = variable;
|
|
3679
|
+
environment.push(rest);
|
|
3680
|
+
}
|
|
3681
|
+
continue;
|
|
3682
|
+
}
|
|
3683
|
+
environment.push(redactProviderEnvironmentVariable(variable));
|
|
3684
|
+
}
|
|
3685
|
+
providerInstances[instanceId] = {
|
|
3686
|
+
...instance,
|
|
3687
|
+
environment
|
|
3688
|
+
};
|
|
3689
|
+
}
|
|
3690
|
+
for (const [instanceId, instance] of Object.entries(current.providerInstances)) for (const variable of instance.environment ?? []) {
|
|
3691
|
+
if (!variable.sensitive) continue;
|
|
3692
|
+
const secretName = providerEnvironmentSecretName({
|
|
3693
|
+
instanceId,
|
|
3694
|
+
name: variable.name
|
|
3695
|
+
});
|
|
3696
|
+
if (nextSecretKeys.has(secretName)) continue;
|
|
3697
|
+
yield* secretStore.remove(secretName).pipe(Effect.mapError((cause) => toSettingsError(`failed to remove stale environment secret ${variable.name}`, cause)));
|
|
3698
|
+
}
|
|
3699
|
+
return {
|
|
3700
|
+
...next,
|
|
3701
|
+
providerInstances
|
|
3702
|
+
};
|
|
3703
|
+
});
|
|
3704
|
+
const writeSettingsAtomically = (settings) => {
|
|
3705
|
+
const sparseSettings = stripDefaultServerSettings(settings, DEFAULT_SERVER_SETTINGS) ?? {};
|
|
3706
|
+
return writeFileStringAtomically({
|
|
3707
|
+
filePath: settingsPath,
|
|
3708
|
+
contents: `${JSON.stringify(sparseSettings, null, 2)}\n`
|
|
3709
|
+
}).pipe(Effect.provideService(FileSystem.FileSystem, fs), Effect.provideService(Path.Path, pathService), Effect.mapError((cause) => new ServerSettingsError({
|
|
3710
|
+
settingsPath,
|
|
3711
|
+
detail: "failed to write settings file",
|
|
3712
|
+
cause
|
|
3713
|
+
})));
|
|
3714
|
+
};
|
|
3715
|
+
const revalidateAndEmit = writeSemaphore.withPermits(1)(Effect.gen(function* () {
|
|
3716
|
+
yield* Cache.invalidate(settingsCache, cacheKey);
|
|
3717
|
+
const settings = yield* getSettingsFromCache;
|
|
3718
|
+
yield* emitChange(settings);
|
|
3719
|
+
}));
|
|
3720
|
+
const startWatcher = Effect.gen(function* () {
|
|
3721
|
+
const settingsDir = pathService.dirname(settingsPath);
|
|
3722
|
+
const settingsFile = pathService.basename(settingsPath);
|
|
3723
|
+
const settingsPathResolved = pathService.resolve(settingsPath);
|
|
3724
|
+
yield* fs.makeDirectory(settingsDir, { recursive: true }).pipe(Effect.mapError((cause) => new ServerSettingsError({
|
|
3725
|
+
settingsPath,
|
|
3726
|
+
detail: "failed to prepare settings directory",
|
|
3727
|
+
cause
|
|
3728
|
+
})));
|
|
3729
|
+
const revalidateAndEmitSafely = revalidateAndEmit.pipe(Effect.ignoreCause({ log: true }));
|
|
3730
|
+
const debouncedSettingsEvents = fs.watch(settingsDir).pipe(Stream.filter((event) => {
|
|
3731
|
+
return event.path === settingsFile || event.path === settingsPath || pathService.resolve(settingsDir, event.path) === settingsPathResolved;
|
|
3732
|
+
}), Stream.debounce(Duration.millis(100)));
|
|
3733
|
+
yield* Stream.runForEach(debouncedSettingsEvents, () => revalidateAndEmitSafely).pipe(Effect.ignoreCause({ log: true }), Effect.forkIn(watcherScope), Effect.asVoid);
|
|
3734
|
+
});
|
|
3735
|
+
return {
|
|
3736
|
+
start: Effect.gen(function* () {
|
|
3737
|
+
if (!(yield* Ref.modify(startedRef, (started) => [!started, true]))) return yield* Deferred.await(startedDeferred);
|
|
3738
|
+
const startup = Effect.gen(function* () {
|
|
3739
|
+
yield* startWatcher;
|
|
3740
|
+
yield* Cache.invalidate(settingsCache, cacheKey);
|
|
3741
|
+
yield* getSettingsFromCache;
|
|
3742
|
+
});
|
|
3743
|
+
const startupExit = yield* Effect.exit(startup);
|
|
3744
|
+
if (startupExit._tag === "Failure") {
|
|
3745
|
+
yield* Deferred.failCause(startedDeferred, startupExit.cause).pipe(Effect.orDie);
|
|
3746
|
+
return yield* Effect.failCause(startupExit.cause);
|
|
3747
|
+
}
|
|
3748
|
+
yield* Deferred.succeed(startedDeferred, void 0).pipe(Effect.orDie);
|
|
3749
|
+
}),
|
|
3750
|
+
ready: Deferred.await(startedDeferred),
|
|
3751
|
+
getSettings: getSettingsFromCache.pipe(Effect.flatMap(materializeProviderEnvironmentSecrets), Effect.map(resolveTextGenerationProvider)),
|
|
3752
|
+
updateSettings: (patch) => writeSemaphore.withPermits(1)(Effect.gen(function* () {
|
|
3753
|
+
const current = yield* getSettingsFromCache;
|
|
3754
|
+
const normalizedPatch = { ...patch };
|
|
3755
|
+
const validateRoot = (root) => validateWorktreeRoot(root, worktreeAccessPolicy).pipe(Effect.mapError((cause) => new ServerSettingsError({
|
|
3756
|
+
settingsPath,
|
|
3757
|
+
detail: cause.message,
|
|
3758
|
+
cause
|
|
3759
|
+
})));
|
|
3760
|
+
if (patch.worktreeRoot) normalizedPatch.worktreeRoot = yield* validateRoot(patch.worktreeRoot);
|
|
3761
|
+
if (patch.projectWorktreeRoots !== void 0) {
|
|
3762
|
+
const roots = [];
|
|
3763
|
+
for (const [id, root] of Object.entries(patch.projectWorktreeRoots)) roots.push([id, root ? yield* validateRoot(root) : null]);
|
|
3764
|
+
normalizedPatch.projectWorktreeRoots = Object.fromEntries(roots);
|
|
3765
|
+
}
|
|
3766
|
+
const nextPersisted = yield* persistProviderEnvironmentSecrets(current, applyServerSettingsPatch(current, normalizedPatch));
|
|
3767
|
+
const next = yield* Schema.decodeEffect(ServerSettings)(nextPersisted).pipe(Effect.mapError((cause) => new ServerSettingsError({
|
|
3768
|
+
settingsPath: "<memory>",
|
|
3769
|
+
detail: `failed to normalize server settings: ${SchemaIssue.makeFormatterDefault()(cause.issue)}`,
|
|
3770
|
+
cause
|
|
3771
|
+
})));
|
|
3772
|
+
yield* writeSettingsAtomically(next);
|
|
3773
|
+
yield* Cache.set(settingsCache, cacheKey, next);
|
|
3774
|
+
yield* emitChange(next);
|
|
3775
|
+
return resolveTextGenerationProvider(yield* materializeProviderEnvironmentSecrets(next));
|
|
3776
|
+
})),
|
|
3777
|
+
get streamChanges() {
|
|
3778
|
+
return Stream.fromPubSub(changesPubSub).pipe(Stream.mapEffect((settings) => materializeProviderEnvironmentSecrets(settings).pipe(Effect.catch((error) => Effect.logWarning("failed to materialize provider environment secrets", { detail: error.detail }).pipe(Effect.as(settings))))), Stream.map(resolveTextGenerationProvider));
|
|
3779
|
+
}
|
|
3780
|
+
};
|
|
3781
|
+
});
|
|
3782
|
+
const ServerSettingsLive = Layer.effect(ServerSettingsService, makeServerSettings).pipe(Layer.provide(ServerSecretStoreLive));
|
|
3783
|
+
//#endregion
|
|
3784
|
+
export { startupCommandGateQueueWaitDuration as $, providerRuntimeStaleEventsTotal as A, parsePersistedServerObservabilitySettings as At, rpcRequestDuration as B, modelSelectionRequiresContextHandoff as Bt, orchestrationCommandAckDuration as C, formatNodePublicKeyFingerprint as Ct, providerEventLogRecordsDroppedTotal as D, encode as Dt, orchestrationEventsProcessedTotal as E, decode as Et, providerStartupQueueHighWater as F, getModelSelectionStringOptionValue as Ft, runtimeQueueDequeuesTotal as G, runtimeQueueBlockedDuration as H, resolvePromptInjectedEffort as Ht, providerStartupQueueWaitDuration as I, getProviderOptionBooleanSelectionValue as It, runtimeQueueOverflowsTotal as J, runtimeQueueEnqueuesTotal as K, providerTurnDuration as L, getProviderOptionCurrentValue as Lt, providerStaleStopTimeoutsTotal as M, createModelCapabilities as Mt, providerStartupAdmissionTotal as N, getModelDisplayLabel as Nt, providerMetricAttributes as O, rfc8949EncodeOptions as Ot, providerStartupQueueDepth as P, getModelSelectionBooleanOptionValue as Pt, startupCommandGateQueueHighWater as Q, providerTurnMetricAttributes as R, getProviderOptionDescriptors as Rt, metricNames as S, fingerprintNodePublicKey as St, orchestrationCommandsTotal as T, Tokeniser as Tt, runtimeQueueCoalescedTotal as U, rpcRequestsTotal as V, normalizeModelSlug as Vt, runtimeQueueDepth as W, startupCommandGateEnqueuesTotal as X, runtimeQueueRecoveriesTotal as Y, startupCommandGateQueueDepth as Z, contextHandoffsTotal as _, canonicalizeHubOrigin as _t, makeWorkspaceAccessPolicy as a, compactTraceAttributes as at, increment as b, encodeNodeKeyRotationTranscript as bt, validateWorktreeRoot as c, DEFAULT_PORT as ct, ServerSecretStore as d, deriveServerPaths as dt, terminalRestartsTotal as et, writeFileStringAtomically as f, ensureServerDirectories as ft, contextHandoffPreparationDuration as g, resolveStaticDir as gt, contextHandoffDispatchDuration as h, resolveNodeE2eePolicyConfig as ht, WorkspaceAccessPolicyLive as i, LocalDiagnosticsMetricsLive as it, providerSessionsTotal as j, applyClaudePromptEffortPrefix as jt, providerRuntimeEventsTotal as k, Type as kt, expandHomePath as l, RuntimeMode as lt, contextHandoffContextEntriesTotal as m, resolveManagedWorktreesRoot as mt, ServerSettingsService as n, withMetrics as nt, resolveConfiguredWorktreeRoot as o, outcomeFromExit as ot, contextHandoffContextBytesTotal as p, resolveHubConnectorConfig as pt, runtimeQueueHighWater as q, redactServerSettingsForClient as r, LocalDiagnosticsMetrics as rt, selectConfiguredWorktreeRoot as s, WorkspaceAccessPolicy as st, ServerSettingsLive as t, terminalSessionsTotal as tt, ServerSecretStoreLive as u, ServerConfig as ut, gitCommandDuration as v, encodeNativeNodeClaimTranscript as vt, orchestrationCommandDuration as w, normalizeHubNodeName as wt, metricAttributes as x, equalNodeIdentityBytes as xt, gitCommandsTotal as y, encodeNodeAuthenticationTranscript as yt, providerTurnsTotal as z, getProviderOptionStringSelectionValue as zt };
|