@hienlh/ppm 0.18.15 → 0.18.16
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/CHANGELOG.md +8 -0
- package/assets/skills/ppm/SKILL.md +1 -1
- package/assets/skills/ppm/references/http-api.md +1 -1
- package/dist/web/assets/{adaptive-context-menu-ChBZWLLq.js → adaptive-context-menu-BbuRVTLn.js} +1 -1
- package/dist/web/assets/{ai-resource-editor-C8aAY8Po.js → ai-resource-editor-Cm4n3VXt.js} +1 -1
- package/dist/web/assets/ai-settings-section-BEM1z7kp.js +1 -0
- package/dist/web/assets/{angular-html-CXgHIQ2U.js → angular-html-BlcrLjUx.js} +1 -1
- package/dist/web/assets/{angular-ts-C8renMV9.js → angular-ts-BUjtceAJ.js} +1 -1
- package/dist/web/assets/api-client-D1CePgQ4.js +1 -0
- package/dist/web/assets/api-settings-CNtKkHqW.js +1 -0
- package/dist/web/assets/{api-settings-R59c66DE.js → api-settings-Cubuqjsu.js} +1 -1
- package/dist/web/assets/{api-themes-DKxrwJda.js → api-themes-YsZgf6Xj.js} +1 -1
- package/dist/web/assets/{apl-DkGH8laI.js → apl-B3g0v1pk.js} +1 -1
- package/dist/web/assets/architecture-PBZL5I3N-6konx-J1.js +1 -0
- package/dist/web/assets/{astro-tHUd8Zlg.js → astro-FRnyn7cH.js} +1 -1
- package/dist/web/assets/{audio-preview-B_C6Dpvz.js → audio-preview-DWTRm4HC.js} +1 -1
- package/dist/web/assets/{blade-BbKpjIYK.js → blade-NLdOqUKw.js} +1 -1
- package/dist/web/assets/{bsl-DA0UYto0.js → bsl-CenHZfaU.js} +1 -1
- package/dist/web/assets/{button-DBSpDPS0.js → button-Cq8yixjf.js} +1 -1
- package/dist/web/assets/{cairo-79ayucbB.js → cairo-B_WR0aiQ.js} +1 -1
- package/dist/web/assets/{chat-tab-BraiJsYG.js → chat-tab-C2e6Pwc2.js} +4 -4
- package/dist/web/assets/{cobol-DSS2EOYo.js → cobol-DOynhWYj.js} +1 -1
- package/dist/web/assets/{code-editor-lhmLNhXu.js → code-editor-DWtv_VDo.js} +2 -2
- package/dist/web/assets/{coffee-DvSxq2iD.js → coffee-Bn6dbw4P.js} +1 -1
- package/dist/web/assets/{conflict-editor-C4VCv51R.js → conflict-editor-Bi2RWfKQ.js} +1 -1
- package/dist/web/assets/{context-menu-BpwUny-o.js → context-menu-DfWZAxQy.js} +1 -1
- package/dist/web/assets/{cpp-BhWZ-FSn.js → cpp-CoZR9t8r.js} +1 -1
- package/dist/web/assets/{crystal-yP2OeF-f.js → crystal-BSheONSg.js} +1 -1
- package/dist/web/assets/{csv-preview-D46W_icb.js → csv-preview-DxGZ1qg5.js} +1 -1
- package/dist/web/assets/{data-grid-overlay-editor-DeGkPYtA.js → data-grid-overlay-editor-gwPoVSCU.js} +1 -1
- package/dist/web/assets/{database-viewer-DFI4YtrH.js → database-viewer-DSPRzZny.js} +1 -1
- package/dist/web/assets/{dialog-RIpeb87v.js → dialog-BSfuiTkJ.js} +1 -1
- package/dist/web/assets/{diff-viewer-eaNOLcBL.js → diff-viewer-YbpnNv5Y.js} +1 -1
- package/dist/web/assets/{docx-preview-Cbj-pOK3.js → docx-preview-DqVDOMmv.js} +1 -1
- package/dist/web/assets/{edge-D3K9cd-p.js → edge-DTtoslQu.js} +1 -1
- package/dist/web/assets/{edit-diff-preview-DDqy3KLA.js → edit-diff-preview-CXSbSUBX.js} +1 -1
- package/dist/web/assets/{elixir-D4PBmsLp.js → elixir-CIBCZ3Zi.js} +1 -1
- package/dist/web/assets/{elm-DSpXjuaH.js → elm-BLmb7K1H.js} +1 -1
- package/dist/web/assets/{erb-CaYZMTJW.js → erb-BBY8ApRd.js} +1 -1
- package/dist/web/assets/{erlang-DX5BFqJj.js → erlang-D5Zb5_P0.js} +1 -1
- package/dist/web/assets/{esm-Cv7HsFnk.js → esm-6F8v1jLL.js} +1 -1
- package/dist/web/assets/{explorer-body-BxbSttfl.js → explorer-body-DpQndBVw.js} +1 -1
- package/dist/web/assets/explorer-window-content-m0K6Mtcg.js +1 -0
- package/dist/web/assets/{extension-store-B1EClUAr.js → extension-store-Bhu--fPX.js} +1 -1
- package/dist/web/assets/{extension-webview-BaGvDk8v.js → extension-webview-BSh6KGd7.js} +1 -1
- package/dist/web/assets/{file-store-m9crh6uq.js → file-store-6HW2Lfl4.js} +1 -1
- package/dist/web/assets/{fortran-fixed-form-B0bAufUe.js → fortran-fixed-form-CBdwkEUJ.js} +1 -1
- package/dist/web/assets/{fsharp-C2AL2b1M.js → fsharp-AT4XdVYH.js} +1 -1
- package/dist/web/assets/{gdresource-DRQsDMNI.js → gdresource-D852fWBR.js} +1 -1
- package/dist/web/assets/{git-commit-GtBdnrzk.js → git-commit-DWfWAyxy.js} +1 -1
- package/dist/web/assets/{git-log-panel-hwV1flSO.js → git-log-panel-CkTiR70w.js} +1 -1
- package/dist/web/assets/{git-rebase-h_0CGA6F.js → git-rebase-C6opk8gr.js} +1 -1
- package/dist/web/assets/gitGraph-HDMCJU4V-ikUwsekd.js +1 -0
- package/dist/web/assets/{glide-data-grid-YsN-xm6x.js → glide-data-grid-BB5mCaCD.js} +4 -4
- package/dist/web/assets/{glimmer-js-Bxwu93bS.js → glimmer-js-DLi5mWYO.js} +1 -1
- package/dist/web/assets/{glimmer-ts-CIUYdR4E.js → glimmer-ts-D-scFX30.js} +1 -1
- package/dist/web/assets/{glsl-CfxLI5jn.js → glsl-dbQzF4iA.js} +1 -1
- package/dist/web/assets/{graphql-CstqDPde.js → graphql-D1m5Wen2.js} +1 -1
- package/dist/web/assets/{group-chat-tab-B7mJO1gG.js → group-chat-tab-BPIOdFJw.js} +1 -1
- package/dist/web/assets/{hack-Bjqnssb5.js → hack-CqYmpO7u.js} +1 -1
- package/dist/web/assets/{haml-lVc-DfbM.js → haml-BXzKWEag.js} +1 -1
- package/dist/web/assets/{handlebars-Yy6fPQI_.js → handlebars-DXnrtHtq.js} +1 -1
- package/dist/web/assets/{html-lqtcy6-2.js → html-DhgQJ-xL.js} +1 -1
- package/dist/web/assets/{html-derivative-CchzCY1z.js → html-derivative-xZRft-YE.js} +1 -1
- package/dist/web/assets/{http-ChclRrko.js → http-B53mSj14.js} +1 -1
- package/dist/web/assets/{hurl-CoOK7sXa.js → hurl-CsomVy04.js} +1 -1
- package/dist/web/assets/{hxml-fZSZ7Iyt.js → hxml-LffjWwKA.js} +1 -1
- package/dist/web/assets/{image-preview-ClAcqDlL.js → image-preview-CNA6XMNS.js} +1 -1
- package/dist/web/assets/index-BHdtSKzb.js +52 -0
- package/dist/web/assets/index-DN9XUQ8D.css +2 -0
- package/dist/web/assets/info-3K5VOQVL-BAgmboBp.js +1 -0
- package/dist/web/assets/{input-DXPgUtxi.js → input-D0ol5jW0.js} +1 -1
- package/dist/web/assets/{jinja-Y0w_KBdE.js → jinja-CCHURl7V.js} +1 -1
- package/dist/web/assets/{jison-BILj3F2e.js → jison-7qBd8dnR.js} +1 -1
- package/dist/web/assets/{julia-DRfOPDts.js → julia-BY9pnTcy.js} +1 -1
- package/dist/web/assets/{just-n3U_oODO.js → just-D7wRSNRr.js} +1 -1
- package/dist/web/assets/{keybindings-store-D-CHdq-G.js → keybindings-store-BGkB72gM.js} +1 -1
- package/dist/web/assets/keybindings-store-Bq6VWl5X.js +1 -0
- package/dist/web/assets/{latex-D6gztEOL.js → latex-RgsCae55.js} +1 -1
- package/dist/web/assets/{liquid-DPqCEVb9.js → liquid-CnDFzvOZ.js} +1 -1
- package/dist/web/assets/{lua-I40KPUm-.js → lua-0lj5W8sm.js} +1 -1
- package/dist/web/assets/{markdown-renderer-oJ9jPdQ2.js → markdown-renderer-B9wzBWm9.js} +3 -3
- package/dist/web/assets/markdown-renderer-DeSV1CCQ.js +1 -0
- package/dist/web/assets/{marko-DMjsThSW.js → marko-CQgqAhbV.js} +1 -1
- package/dist/web/assets/{mdc-CN2alsbo.js → mdc-BkIcTiIy.js} +1 -1
- package/dist/web/assets/{media-url-COUvasjn.js → media-url-DDciwvLU.js} +1 -1
- package/dist/web/assets/{mobile-bottom-sheet-Cj1YBq-c.js → mobile-bottom-sheet-pjcHKorA.js} +1 -1
- package/dist/web/assets/mobile-explorer-sheet-DPdxpnKh.js +1 -0
- package/dist/web/assets/monitor-smartphone-DLZ6Q05s.js +1 -0
- package/dist/web/assets/{nextflow-CGa4JeZ6.js → nextflow-DvIW68DS.js} +1 -1
- package/dist/web/assets/{nginx-CmqrIj84.js → nginx-O-hft0gG.js} +1 -1
- package/dist/web/assets/{nim-CqhmTeMa.js → nim-BxrR4HwQ.js} +1 -1
- package/dist/web/assets/notification-store-BtijuGez.js +1 -0
- package/dist/web/assets/{number-overlay-editor-BEzJ1YeD.js → number-overlay-editor-BoLRYuZT.js} +1 -1
- package/dist/web/assets/{overview-panel-Bf9Gn8qV.js → overview-panel-l3g1gT5e.js} +1 -1
- package/dist/web/assets/packet-RMMSAZCW-RVlbbDRS.js +1 -0
- package/dist/web/assets/{panel-store-UWCH6B-_.js → panel-store-UOV8wrfR.js} +1 -1
- package/dist/web/assets/{pdf-preview-BMHM5cR2.js → pdf-preview-B2CJ_EKv.js} +1 -1
- package/dist/web/assets/{perl-BOwpb6Tb.js → perl-Da-uNqmL.js} +1 -1
- package/dist/web/assets/{php-wT9fVxxu.js → php-JMu45mEx.js} +1 -1
- package/dist/web/assets/pie-UPGHQEXC-ZWb4izpk.js +1 -0
- package/dist/web/assets/{postgres-viewer-D8rfEY5b.js → postgres-viewer-23xdZYxp.js} +3 -3
- package/dist/web/assets/{process-table-CsQ-hDJr.js → process-table-CUsPf7wv.js} +1 -1
- package/dist/web/assets/{project-store-CKAOr23O.js → project-store-DTUCS65m.js} +1 -1
- package/dist/web/assets/{pug-DdlNnj-p.js → pug-CLzyQhia.js} +1 -1
- package/dist/web/assets/{qml-C5zBdydf.js → qml-BHXfGB1l.js} +1 -1
- package/dist/web/assets/radar-KQ55EAFF-bsP5x1Bx.js +1 -0
- package/dist/web/assets/{razor-DqcJX4iq.js → razor-BqetJLN3.js} +1 -1
- package/dist/web/assets/remote-desktop-mobile-sheet-FTF6IBhF.js +2 -0
- package/dist/web/assets/{remote-desktop-mobile-view-Cf5B0dKo.js → remote-desktop-mobile-view-DSwG4OSk.js} +1 -1
- package/dist/web/assets/{remote-desktop-stats-overlay-vhJBIW7s.js → remote-desktop-stats-overlay-Bz6xZ5y9.js} +1 -1
- package/dist/web/assets/remote-desktop-warning-gate-DrYySLZ5.js +1 -0
- package/dist/web/assets/remote-desktop-window-content-Ndvezorb.js +1 -0
- package/dist/web/assets/{rst-DiMiMYUO.js → rst-iQdJZ0BP.js} +1 -1
- package/dist/web/assets/{ruby-DK62iflA.js → ruby-CNwzZGdH.js} +1 -1
- package/dist/web/assets/{run-in-terminal-DJSL6nwZ.js → run-in-terminal-CBXmVGWa.js} +1 -1
- package/dist/web/assets/{sas-6QPGJRa5.js → sas-BpBIT2eR.js} +1 -1
- package/dist/web/assets/{scroll-area-DXGXeiRz.js → scroll-area-lc0ZHORr.js} +1 -1
- package/dist/web/assets/{scss-DmUqh48_.js → scss-D1MotuEp.js} +1 -1
- package/dist/web/assets/{send-to-chat-BOony0sO.js → send-to-chat-DJAdlvJ8.js} +1 -1
- package/dist/web/assets/settings-store-zbPkG7o-.js +2 -0
- package/dist/web/assets/settings-tab-Cn-AqUP_.js +1 -0
- package/dist/web/assets/settings-tab-xyRpt2gq.js +3 -0
- package/dist/web/assets/{shaderlab-DopFR1mi.js → shaderlab-BNqmcPQi.js} +1 -1
- package/dist/web/assets/{shellsession-Bp_TGuXb.js → shellsession-BBLOVOO-.js} +1 -1
- package/dist/web/assets/{soy-DEB9KEFb.js → soy-BpTGo9uy.js} +1 -1
- package/dist/web/assets/{sparql-C8lEwO1p.js → sparql-D7A3yKob.js} +1 -1
- package/dist/web/assets/{sql-query-editor-MMfk0Kbz.js → sql-query-editor-BE3mLYyz.js} +1 -1
- package/dist/web/assets/{sqlite-viewer-vglzrgnZ.js → sqlite-viewer-wN5RP8sd.js} +1 -1
- package/dist/web/assets/{stata-DVep4apN.js → stata-B7N56ptS.js} +1 -1
- package/dist/web/assets/{surrealql-fSlJApOA.js → surrealql-CTmnD-lv.js} +1 -1
- package/dist/web/assets/{svelte-DezWBEDi.js → svelte-BppwY9TR.js} +1 -1
- package/dist/web/assets/{switch-DqL_ZjB_.js → switch-BmjKoIpR.js} +1 -1
- package/dist/web/assets/system-monitor-body-B2M0MC6y.js +2 -0
- package/dist/web/assets/system-monitor-tab-OYca4qaf.js +1 -0
- package/dist/web/assets/{system-monitor-window-content-CiJ2yIsr.js → system-monitor-window-content-CHz9WdTm.js} +1 -1
- package/dist/web/assets/{tab-host-window-content-DYlXR0cg.js → tab-host-window-content-DKev3GJz.js} +1 -1
- package/dist/web/assets/{tab-store-D2thn4Vv.js → tab-store-DzYSsw5a.js} +1 -1
- package/dist/web/assets/team-member-sheet-BQ738Lli.js +2 -0
- package/dist/web/assets/{team-member-window-content-qrgFTC96.js → team-member-window-content-CK08f5cK.js} +1 -1
- package/dist/web/assets/{templ-D0zB42a9.js → templ-CvTMKKra.js} +1 -1
- package/dist/web/assets/{terminal-tab-D_-R5rGm.js → terminal-tab-DZ3QiYcs.js} +1 -1
- package/dist/web/assets/{tex-BJiPijcH.js → tex--c4POEUE.js} +1 -1
- package/dist/web/assets/{tool-cards-BW7Xc20J.js → tool-cards-Bw1P0MKU.js} +3 -3
- package/dist/web/assets/treemap-KZPCXAKY-Dh1oxNdQ.js +1 -0
- package/dist/web/assets/{ts-tags-Dcr4u6y5.js → ts-tags--kx7D-Hw.js} +1 -1
- package/dist/web/assets/{twig-B-SQU0bg.js → twig-UG9uMHGd.js} +1 -1
- package/dist/web/assets/{use-blob-url-BtPlqwLr.js → use-blob-url-Bdxopwwc.js} +1 -1
- package/dist/web/assets/{use-monaco-theme-DQY1ZSaf.js → use-monaco-theme-BOmd2wpe.js} +1 -1
- package/dist/web/assets/{use-open-team-member-C5LQ_TCM.js → use-open-team-member-D9EOB8-i.js} +1 -1
- package/dist/web/assets/{use-websocket-l39Odhlp.js → use-websocket-B7Xj-Q4W.js} +1 -1
- package/dist/web/assets/{vendor-mermaid-CtDsSxbM.js → vendor-mermaid-0Nt-ew76.js} +1 -1
- package/dist/web/assets/{video-preview-C5AhkIDl.js → video-preview-B0nbTGjQ.js} +1 -1
- package/dist/web/assets/{vue-html-Cc5C_Z_w.js → vue-html-8KEW6-I9.js} +1 -1
- package/dist/web/assets/{vue-Cw10Sfbh.js → vue-jjTomlbt.js} +1 -1
- package/dist/web/assets/{vue-vine-BuNMlnvu.js → vue-vine-C5tohCkU.js} +1 -1
- package/dist/web/assets/{window-pip-registry-C7oz3Dfy.js → window-pip-registry-FdZdGF7h.js} +1 -1
- package/dist/web/assets/{window-store-B5ZswdYg.js → window-store-D0x_fxr0.js} +1 -1
- package/dist/web/assets/{xml-DqT1wkky.js → xml-ByFFosqL.js} +1 -1
- package/dist/web/assets/{xsl-DLkge3A2.js → xsl-CZUwiLkj.js} +1 -1
- package/dist/web/index.html +42 -41
- package/dist/web/sw.js +1 -1
- package/package.json +1 -1
- package/src/server/index.ts +1 -1
- package/src/server/routes/remote-desktop.ts +1 -1
- package/src/server/routes/settings.ts +1 -0
- package/src/services/named-tunnel/cloudflare-dns-api.ts +20 -4
- package/src/services/named-tunnel/named-tunnel-args.ts +17 -3
- package/src/services/named-tunnel/named-tunnel-setup.service.ts +20 -2
- package/src/services/remote-desktop/remote-desktop-flag.ts +8 -6
- package/src/web/components/remote-desktop/remote-desktop-mobile-sheet.tsx +9 -4
- package/src/web/components/remote-desktop/remote-desktop-warning-gate.tsx +106 -0
- package/src/web/components/remote-desktop/remote-desktop-window-content.tsx +17 -3
- package/src/web/components/remote-desktop/use-remote-desktop-available.ts +3 -3
- package/src/web/stores/settings-store.ts +12 -0
- package/dist/web/assets/ai-settings-section-ERu1WiZc.js +0 -1
- package/dist/web/assets/api-client-WpZ2FDHg.js +0 -1
- package/dist/web/assets/api-settings-BgSEE6et.js +0 -1
- package/dist/web/assets/architecture-PBZL5I3N-CCalSKAt.js +0 -1
- package/dist/web/assets/explorer-window-content-DUqQCC7A.js +0 -1
- package/dist/web/assets/gitGraph-HDMCJU4V-DAUrJCqi.js +0 -1
- package/dist/web/assets/index-CtJbMNNI.css +0 -2
- package/dist/web/assets/index-H_gScEOk.js +0 -52
- package/dist/web/assets/info-3K5VOQVL-Cx1ZfJbp.js +0 -1
- package/dist/web/assets/keybindings-store-BqctreaI.js +0 -1
- package/dist/web/assets/markdown-renderer-BwOkiZC1.js +0 -1
- package/dist/web/assets/mobile-explorer-sheet-D1nM0Ik1.js +0 -1
- package/dist/web/assets/notification-store-n-XEQ5pH.js +0 -1
- package/dist/web/assets/packet-RMMSAZCW-Bqwiy7dz.js +0 -1
- package/dist/web/assets/pie-UPGHQEXC-BXSJ2God.js +0 -1
- package/dist/web/assets/radar-KQ55EAFF-D6XrM7HH.js +0 -1
- package/dist/web/assets/remote-desktop-mobile-sheet-CTiipn4k.js +0 -2
- package/dist/web/assets/remote-desktop-window-content-wCJUfI6G.js +0 -1
- package/dist/web/assets/settings-store-BpcY5aYE.js +0 -2
- package/dist/web/assets/settings-tab-BVqRO01j.js +0 -1
- package/dist/web/assets/settings-tab-FH581A_i.js +0 -3
- package/dist/web/assets/system-monitor-body-BYUfyF8f.js +0 -2
- package/dist/web/assets/system-monitor-tab-CKGXB8lH.js +0 -1
- package/dist/web/assets/team-member-sheet-Bnygu7Xw.js +0 -2
- package/dist/web/assets/treemap-KZPCXAKY-BobWhcHN.js +0 -1
- /package/dist/web/assets/{abap-CKgBNk5K.js → abap-C5DFF0s3.js} +0 -0
- /package/dist/web/assets/{actionscript-3-oARhAY6c.js → actionscript-3-B0qyRNbc.js} +0 -0
- /package/dist/web/assets/{ada-2vi8ASy3.js → ada-bAJzplug.js} +0 -0
- /package/dist/web/assets/{andromeeda-B3vMjPKd.js → andromeeda-DUCpISy6.js} +0 -0
- /package/dist/web/assets/{apache-DnIEr338.js → apache-BhAr84Z_.js} +0 -0
- /package/dist/web/assets/{apex-B7Qs5AY5.js → apex-CRv8YnNq.js} +0 -0
- /package/dist/web/assets/{api-client-BkGKTjsq.js → api-client-BzWM7XPR.js} +0 -0
- /package/dist/web/assets/{applescript-EbQNUCWb.js → applescript-CD-Cw8bt.js} +0 -0
- /package/dist/web/assets/{apply-theme-Dd_cqGa-.js → apply-theme-DJ794zSQ.js} +0 -0
- /package/dist/web/assets/{ara-CtHdhFRw.js → ara-BUzeQYoG.js} +0 -0
- /package/dist/web/assets/{asciidoc-BH6qin_O.js → asciidoc-CT2hTg-v.js} +0 -0
- /package/dist/web/assets/{asm-D1XU1ACk.js → asm-CAu35JeY.js} +0 -0
- /package/dist/web/assets/{aurora-x-BkhcxkuS.js → aurora-x-BeFJoIA1.js} +0 -0
- /package/dist/web/assets/{awk-DijzB6o7.js → awk-Vau-DrGN.js} +0 -0
- /package/dist/web/assets/{ayu-dark-tysG77WC.js → ayu-dark-CLe-OTsQ.js} +0 -0
- /package/dist/web/assets/{ayu-light-Dg0WMETC.js → ayu-light-CJbQfu4M.js} +0 -0
- /package/dist/web/assets/{ayu-mirage--RsJCjC4.js → ayu-mirage-GWaKwdrx.js} +0 -0
- /package/dist/web/assets/{ballerina-DT_5-l82.js → ballerina-DWu0USI5.js} +0 -0
- /package/dist/web/assets/{bat-BRpDlkv0.js → bat-_07Huw7E.js} +0 -0
- /package/dist/web/assets/{beancount--8Df-WGG.js → beancount-EcvogrcF.js} +0 -0
- /package/dist/web/assets/{berry-Bc9fo35J.js → berry-BBB87SY7.js} +0 -0
- /package/dist/web/assets/{bibtex-CwyBpp9X.js → bibtex-DbueS87A.js} +0 -0
- /package/dist/web/assets/{bicep-DiyH2Bs7.js → bicep-tcmXnUo4.js} +0 -0
- /package/dist/web/assets/{bird2-CHgK4a2A.js → bird2-B2qwilIR.js} +0 -0
- /package/dist/web/assets/{c-BM1qL6-f.js → c-Z58oivSt.js} +0 -0
- /package/dist/web/assets/{c3-D2oOjrP7.js → c3-U40cGT9p.js} +0 -0
- /package/dist/web/assets/{cadence-nS45wqF6.js → cadence-BFcD-LyM.js} +0 -0
- /package/dist/web/assets/{can-open-in-ppm-DwP9KU8o.js → can-open-in-ppm-CdCK2c2a.js} +0 -0
- /package/dist/web/assets/{catppuccin-frappe-BpnJHiCj.js → catppuccin-frappe-RkC9AX6J.js} +0 -0
- /package/dist/web/assets/{catppuccin-latte-Bb95Wj3h.js → catppuccin-latte-Bsi4l-nO.js} +0 -0
- /package/dist/web/assets/{catppuccin-macchiato-Btx8c17W.js → catppuccin-macchiato-B8JIdTW-.js} +0 -0
- /package/dist/web/assets/{catppuccin-mocha-B4DZOUGI.js → catppuccin-mocha-oH8wwrDj.js} +0 -0
- /package/dist/web/assets/{clarity-1ps69jU6.js → clarity-C3WNeRCR.js} +0 -0
- /package/dist/web/assets/{clipboard-CrHX8AYw.js → clipboard-B-gwJ8DF.js} +0 -0
- /package/dist/web/assets/{clojure-BklC0hKV.js → clojure-CFoAz7u9.js} +0 -0
- /package/dist/web/assets/{cmake-B573LYAQ.js → cmake-Bcsqp9yR.js} +0 -0
- /package/dist/web/assets/{codeowners-BoYeX89M.js → codeowners-DC2Z7heP.js} +0 -0
- /package/dist/web/assets/{codeql-7Dhf5Udk.js → codeql-BfG68Al5.js} +0 -0
- /package/dist/web/assets/{common-lisp-m1nxlthv.js → common-lisp-Z5P-lKQe.js} +0 -0
- /package/dist/web/assets/{coq-DNhGmd4a.js → coq-BJslqrnv.js} +0 -0
- /package/dist/web/assets/{csharp-P-nAurtS.js → csharp-DhhZTOTs.js} +0 -0
- /package/dist/web/assets/{css-LYbSeh3-.js → css-DiFIpMfE.js} +0 -0
- /package/dist/web/assets/{csv-DHZZZm7X.js → csv-DViLbHxI.js} +0 -0
- /package/dist/web/assets/{csv-parser-CY9Ggtg5.js → csv-parser-B2v8MoUy.js} +0 -0
- /package/dist/web/assets/{cue-D8yLUOle.js → cue-CoG3mg2I.js} +0 -0
- /package/dist/web/assets/{cypher-9cbW8RYA.js → cypher-jTxC8NAB.js} +0 -0
- /package/dist/web/assets/{d-ZihzhxqI.js → d-6hKIUAbU.js} +0 -0
- /package/dist/web/assets/{dark-plus-C8xIA1u3.js → dark-plus-D_-np2Sr.js} +0 -0
- /package/dist/web/assets/{dart-CBm6jKc7.js → dart-CVpxLpVn.js} +0 -0
- /package/dist/web/assets/{data-grid-types-DkEQ-Na9.js → data-grid-types-Dq_H1IPa.js} +0 -0
- /package/dist/web/assets/{dax-B3cx6YeV.js → dax-BPqJ8qIY.js} +0 -0
- /package/dist/web/assets/{desktop-C03SpXth.js → desktop-u_y5_Hr5.js} +0 -0
- /package/dist/web/assets/{diff-D8LnnvFY.js → diff-Duj1XMrd.js} +0 -0
- /package/dist/web/assets/{dist-C4XoS_zo.js → dist-CEZ4plgH.js} +0 -0
- /package/dist/web/assets/{dist-Do3fljss.js → dist-aDSxTR_v.js} +0 -0
- /package/dist/web/assets/{docker-DwFiOQWW.js → docker-8UGSCc7N.js} +0 -0
- /package/dist/web/assets/{dotenv-CVJ_vFSQ.js → dotenv-DVnj8kyR.js} +0 -0
- /package/dist/web/assets/{dracula-DMw8UACY.js → dracula-D0cEmSg7.js} +0 -0
- /package/dist/web/assets/{dracula-soft-BnB3nDrA.js → dracula-soft-DfGS5Yfr.js} +0 -0
- /package/dist/web/assets/{dream-maker-2riXUQXo.js → dream-maker-qG8kMGTF.js} +0 -0
- /package/dist/web/assets/{emacs-lisp-BQdYaiB5.js → emacs-lisp-iVqyMLyT.js} +0 -0
- /package/dist/web/assets/{everforest-dark-C2FPIWdj.js → everforest-dark-Cruygd5U.js} +0 -0
- /package/dist/web/assets/{everforest-light-DMOWf9sD.js → everforest-light-BiJa8RHL.js} +0 -0
- /package/dist/web/assets/{fennel-JtSHp0vW.js → fennel-H6XSEIoz.js} +0 -0
- /package/dist/web/assets/{fish-CflDcRfe.js → fish-ho_7CxX6.js} +0 -0
- /package/dist/web/assets/{fluent-D4eu6Vac.js → fluent-1l5ssJTF.js} +0 -0
- /package/dist/web/assets/{format-bytes-DR3228bu.js → format-bytes-gQw5wzqa.js} +0 -0
- /package/dist/web/assets/{fortran-free-form-hO4RuC9Z.js → fortran-free-form-Bo1x233A.js} +0 -0
- /package/dist/web/assets/{gdscript-D7n3a8VM.js → gdscript-DffFMp_k.js} +0 -0
- /package/dist/web/assets/{gdshader-BhUmrlzG.js → gdshader-CvnpAiAF.js} +0 -0
- /package/dist/web/assets/{genie-VbyftqBp.js → genie-2eOvAEzW.js} +0 -0
- /package/dist/web/assets/{gherkin-BZzhvUUb.js → gherkin-DL-5OUlV.js} +0 -0
- /package/dist/web/assets/{github-dark-C4q41woW.js → github-dark-DrTZprgG.js} +0 -0
- /package/dist/web/assets/{github-dark-default-CMNi7dQX.js → github-dark-default-_mDH8IMP.js} +0 -0
- /package/dist/web/assets/{github-dark-dimmed-BRf_-LlY.js → github-dark-dimmed-C48hJuLn.js} +0 -0
- /package/dist/web/assets/{github-dark-high-contrast-xanKBsRI.js → github-dark-high-contrast-BQ-zGGNe.js} +0 -0
- /package/dist/web/assets/{github-light-BEQeNQCs.js → github-light-BYc90Yx8.js} +0 -0
- /package/dist/web/assets/{github-light-default-ceQrtdXg.js → github-light-default-Daecj4J5.js} +0 -0
- /package/dist/web/assets/{github-light-high-contrast-doKbXzgW.js → github-light-high-contrast-DoafCbsU.js} +0 -0
- /package/dist/web/assets/{gleam-Chzqf4fT.js → gleam-hUWWjmnp.js} +0 -0
- /package/dist/web/assets/{gn-CCN_-6fp.js → gn-7PJ3R70o.js} +0 -0
- /package/dist/web/assets/{gnuplot-CIplgwwP.js → gnuplot-V-Pxck7b.js} +0 -0
- /package/dist/web/assets/{go-Cjj-9dRs.js → go-ARF6DprD.js} +0 -0
- /package/dist/web/assets/{groovy-PqD4K7X1.js → groovy-CKGBIPOz.js} +0 -0
- /package/dist/web/assets/{gruvbox-dark-hard-BAbpUSF-.js → gruvbox-dark-hard-Cm9wqdI3.js} +0 -0
- /package/dist/web/assets/{gruvbox-dark-medium-BWcWXDBB.js → gruvbox-dark-medium-Cmsd6dG8.js} +0 -0
- /package/dist/web/assets/{gruvbox-dark-soft-Dkx1okkk.js → gruvbox-dark-soft-BBGlGGCz.js} +0 -0
- /package/dist/web/assets/{gruvbox-light-hard-WVsDK0MM.js → gruvbox-light-hard-BCR7KmqG.js} +0 -0
- /package/dist/web/assets/{gruvbox-light-medium-tiR9t7gr.js → gruvbox-light-medium-CP32bga8.js} +0 -0
- /package/dist/web/assets/{gruvbox-light-soft-HzHohaX6.js → gruvbox-light-soft-qjxk8ps6.js} +0 -0
- /package/dist/web/assets/{haskell-B1eIZfr6.js → haskell-C5DzwGRa.js} +0 -0
- /package/dist/web/assets/{haxe-BcDdi5xr.js → haxe-C8f_jCVv.js} +0 -0
- /package/dist/web/assets/{hcl-Dq-HKVni.js → hcl-DetJkf6E.js} +0 -0
- /package/dist/web/assets/{hjson-Dr9D9WVU.js → hjson-DeZhwIdo.js} +0 -0
- /package/dist/web/assets/{hlsl-Bo8t2FuZ.js → hlsl-SMIDLRyX.js} +0 -0
- /package/dist/web/assets/{horizon-DWG5IXc-.js → horizon-BMAVDxMx.js} +0 -0
- /package/dist/web/assets/{horizon-bright-DFr9wTTx.js → horizon-bright-3BaV_VGD.js} +0 -0
- /package/dist/web/assets/{houston-NAVNhkup.js → houston-BWBbEPvb.js} +0 -0
- /package/dist/web/assets/{hy-DnyvUk3B.js → hy-DcsmE-Nm.js} +0 -0
- /package/dist/web/assets/{image-gallery-DoFdNF9i.js → image-gallery-Bqb-wjNw.js} +0 -0
- /package/dist/web/assets/{imba-CPbR5W_A.js → imba-CnkgnYMf.js} +0 -0
- /package/dist/web/assets/{ini-lc8_Lt0y.js → ini-BnvTdau7.js} +0 -0
- /package/dist/web/assets/{java-B0KCo2vK.js → java-BLFACXat.js} +0 -0
- /package/dist/web/assets/{javascript-YqEbNRpd.js → javascript-BKcFWENk.js} +0 -0
- /package/dist/web/assets/{json-Co0WtOlh.js → json-3AJtJADf.js} +0 -0
- /package/dist/web/assets/{json5-2Jhb0QUN.js → json5-DLyDVlwe.js} +0 -0
- /package/dist/web/assets/{jsonc-e72F11nU.js → jsonc-B5DgF1jW.js} +0 -0
- /package/dist/web/assets/{jsonl-Bff8IPye.js → jsonl-CV_O71a2.js} +0 -0
- /package/dist/web/assets/{jsonnet-DRCkb-_H.js → jsonnet-DZfPLgYz.js} +0 -0
- /package/dist/web/assets/{jssm-C6UiwVEm.js → jssm-Cr1zYOsY.js} +0 -0
- /package/dist/web/assets/{jsx-u1aZlnfA.js → jsx-VN-JS2_q.js} +0 -0
- /package/dist/web/assets/{kanagawa-dragon-De-RQFV3.js → kanagawa-dragon-D9CcT3xg.js} +0 -0
- /package/dist/web/assets/{kanagawa-lotus-K8elE4QU.js → kanagawa-lotus-DLXsB8fr.js} +0 -0
- /package/dist/web/assets/{kanagawa-wave-BrStl_zx.js → kanagawa-wave-weDs3Wjz.js} +0 -0
- /package/dist/web/assets/{kdl-CLCfMeZy.js → kdl-0XF56jnT.js} +0 -0
- /package/dist/web/assets/{kotlin-DEEC3pNh.js → kotlin-BPkH9vzk.js} +0 -0
- /package/dist/web/assets/{kusto-DTqRhCup.js → kusto-DMVpADb9.js} +0 -0
- /package/dist/web/assets/{laserwave-DsgpUSbA.js → laserwave-Cl6T2cGP.js} +0 -0
- /package/dist/web/assets/{lean-Dl9MI0Y3.js → lean-BvwzQGl1.js} +0 -0
- /package/dist/web/assets/{less-Bg21rao6.js → less-DI_03xkC.js} +0 -0
- /package/dist/web/assets/{lib-CXUwxw1M.js → lib-v9x_qXgI.js} +0 -0
- /package/dist/web/assets/{libesm-CVkncAQz.js → libesm-dcbw4_18.js} +0 -0
- /package/dist/web/assets/{light-plus-DGNbbK1V.js → light-plus-hIiIsQN_.js} +0 -0
- /package/dist/web/assets/{llvm-91_ZX3p-.js → llvm-B5hjjSWc.js} +0 -0
- /package/dist/web/assets/{log-DSXzbq8u.js → log-D28raQiE.js} +0 -0
- /package/dist/web/assets/{logo-BQRNd4tc.js → logo-6Cdd4ASb.js} +0 -0
- /package/dist/web/assets/{luau-BE-TMpiZ.js → luau-CK9nKpOX.js} +0 -0
- /package/dist/web/assets/{make-ePYGKTpc.js → make-CVnxKCB6.js} +0 -0
- /package/dist/web/assets/{markdown-Cst3wgMW.js → markdown-B9mMQzD5.js} +0 -0
- /package/dist/web/assets/{material-theme-9XyvnNLb.js → material-theme-BZSs2o0j.js} +0 -0
- /package/dist/web/assets/{material-theme-darker-H1VN4MTS.js → material-theme-darker-BeAQBzQ_.js} +0 -0
- /package/dist/web/assets/{material-theme-lighter-DAreBbuF.js → material-theme-lighter-BAe0IXcs.js} +0 -0
- /package/dist/web/assets/{material-theme-ocean-BpTR-3II.js → material-theme-ocean-CiPIf0Np.js} +0 -0
- /package/dist/web/assets/{material-theme-palenight-DUNzX711.js → material-theme-palenight-DJBb4_XN.js} +0 -0
- /package/dist/web/assets/{matlab-BpYNufBU.js → matlab-CY0dbp_s.js} +0 -0
- /package/dist/web/assets/{mdx-BYjfe1DK.js → mdx-DU9zbF7h.js} +0 -0
- /package/dist/web/assets/{mermaid-DPCcIW9B.js → mermaid-UmmjGwdh.js} +0 -0
- /package/dist/web/assets/{min-dark-DnGOAGCo.js → min-dark-C59GkzOm.js} +0 -0
- /package/dist/web/assets/{min-light-CwV-o31y.js → min-light-B9QglrdQ.js} +0 -0
- /package/dist/web/assets/{mipsasm-DdeCPC97.js → mipsasm-Dc6Jsr_D.js} +0 -0
- /package/dist/web/assets/{mojo-BmxxZ3iM.js → mojo-D5ij-nGW.js} +0 -0
- /package/dist/web/assets/{monitor-C835ucWH.js → monitor-CxPV_fQI.js} +0 -0
- /package/dist/web/assets/{monokai-Cx6cQ-MA.js → monokai-QAtE_yCP.js} +0 -0
- /package/dist/web/assets/{moonbit-D2-Gj5vj.js → moonbit-BMtIdiTL.js} +0 -0
- /package/dist/web/assets/{move-DSWGoQa8.js → move-BB_jMHYZ.js} +0 -0
- /package/dist/web/assets/{narrat-D9TnZSSu.js → narrat-BvvoKGVn.js} +0 -0
- /package/dist/web/assets/{nextflow-groovy-BbL-8PwD.js → nextflow-groovy-CqxtAsnF.js} +0 -0
- /package/dist/web/assets/{night-owl-CZitKm5d.js → night-owl-CLoE9kjt.js} +0 -0
- /package/dist/web/assets/{night-owl-light-DJVX1Pno.js → night-owl-light-BwIFT5Xd.js} +0 -0
- /package/dist/web/assets/{nix-R6hr3oln.js → nix-BKlnVT9r.js} +0 -0
- /package/dist/web/assets/{nord-ChGHya3l.js → nord-B7R1KRAK.js} +0 -0
- /package/dist/web/assets/{nushell-QQWB-GWx.js → nushell-CzUme-NJ.js} +0 -0
- /package/dist/web/assets/{objective-c-C0pZ6y73.js → objective-c-D-UKKiOc.js} +0 -0
- /package/dist/web/assets/{objective-cpp-BdzVM31a.js → objective-cpp-BucWn4Fx.js} +0 -0
- /package/dist/web/assets/{ocaml-D4KktNlS.js → ocaml-EJCNXMGo.js} +0 -0
- /package/dist/web/assets/{odin-Y-fypmGT.js → odin-CEjnRU_3.js} +0 -0
- /package/dist/web/assets/{one-dark-pro-BwecIxQL.js → one-dark-pro-Bv469NX5.js} +0 -0
- /package/dist/web/assets/{one-light-Cz7UVzLU.js → one-light-BlzO5RWI.js} +0 -0
- /package/dist/web/assets/{openscad-DtRe3qYD.js → openscad-Czl6alLw.js} +0 -0
- /package/dist/web/assets/{pascal-Ck6I1fGG.js → pascal-BI9fLvG4.js} +0 -0
- /package/dist/web/assets/{pkl-DdFK94VW.js → pkl-ChQLsyjU.js} +0 -0
- /package/dist/web/assets/{plastic-BQSAzZwR.js → plastic-DGL3mtdL.js} +0 -0
- /package/dist/web/assets/{play-CJlWpVMw.js → play-DpEEBJTT.js} +0 -0
- /package/dist/web/assets/{plsql-DjXg_CP0.js → plsql-BJDjqcWp.js} +0 -0
- /package/dist/web/assets/{po-Bw2SuM4r.js → po-DK5O3OpF.js} +0 -0
- /package/dist/web/assets/{poimandres-YMK6c5VN.js → poimandres-CnuqZT4T.js} +0 -0
- /package/dist/web/assets/{polar-BMu17-O0.js → polar-DCsUxSsQ.js} +0 -0
- /package/dist/web/assets/{portal-container-context-DSGdlXrJ.js → portal-container-context-D-495m5C.js} +0 -0
- /package/dist/web/assets/{postcss-DWib10RZ.js → postcss-8UjdFmis.js} +0 -0
- /package/dist/web/assets/{powerquery-Dht4CK0b.js → powerquery-CAp0CGQj.js} +0 -0
- /package/dist/web/assets/{powershell-DvrCg8ji.js → powershell-CbBsKZJP.js} +0 -0
- /package/dist/web/assets/{prisma-DbodYvCM.js → prisma-BnNpXCJN.js} +0 -0
- /package/dist/web/assets/{prolog-DZ-m6ysB.js → prolog-CC-l9E8Y.js} +0 -0
- /package/dist/web/assets/{proto-HHpG3tGO.js → proto-CV_1k2rL.js} +0 -0
- /package/dist/web/assets/{puppet-BljHe_75.js → puppet-2D8HU2bv.js} +0 -0
- /package/dist/web/assets/{purescript-DzCiFR0B.js → purescript-BEJAORgU.js} +0 -0
- /package/dist/web/assets/{python-B5BQ27cC.js → python-BBdbb7nn.js} +0 -0
- /package/dist/web/assets/{qmldir-CYlcXrnn.js → qmldir-D5ZYI4Ie.js} +0 -0
- /package/dist/web/assets/{qss-Ce7T_TEg.js → qss-BOJVGyXE.js} +0 -0
- /package/dist/web/assets/{r-Bku-2Jp_.js → r-B5dlEtkj.js} +0 -0
- /package/dist/web/assets/{racket-DtfSL3WR.js → racket-BUAEygJ6.js} +0 -0
- /package/dist/web/assets/{raku-CnDLsBJr.js → raku-BG0Ss0ID.js} +0 -0
- /package/dist/web/assets/{react-Dfio3PfK.js → react-B549sK_T.js} +0 -0
- /package/dist/web/assets/{red-vbqcE9b-.js → red-C5yyQbtG.js} +0 -0
- /package/dist/web/assets/{refresh-cw-84mz8aOE.js → refresh-cw-BQU5g2CY.js} +0 -0
- /package/dist/web/assets/{reg-DIDLT8-A.js → reg-DHoBWtLf.js} +0 -0
- /package/dist/web/assets/{regexp-CB4h-VPu.js → regexp-DDtJrlKv.js} +0 -0
- /package/dist/web/assets/{rel-CiQEnWXa.js → rel-CR6WJDRD.js} +0 -0
- /package/dist/web/assets/{resolve-theme-DPTQHAy1.js → resolve-theme-4fexHWl6.js} +0 -0
- /package/dist/web/assets/{riscv-R78iq5Rf.js → riscv-2V9tC-nx.js} +0 -0
- /package/dist/web/assets/{ron-DhYENxc4.js → ron-QLTmqGUw.js} +0 -0
- /package/dist/web/assets/{rose-pine-5wBeyjfJ.js → rose-pine-be0__X3A.js} +0 -0
- /package/dist/web/assets/{rose-pine-dawn-FpKtPCuH.js → rose-pine-dawn-n_WQJwsW.js} +0 -0
- /package/dist/web/assets/{rose-pine-moon-BwcIYc7C.js → rose-pine-moon-t2aLtzgB.js} +0 -0
- /package/dist/web/assets/{rosmsg-DWIGAYMl.js → rosmsg-Ce1JD8vt.js} +0 -0
- /package/dist/web/assets/{rotate-ccw-CNTk2J7l.js → rotate-ccw-CpjRo90J.js} +0 -0
- /package/dist/web/assets/{rust-DU_ofKgt.js → rust-5fHH-ZoW.js} +0 -0
- /package/dist/web/assets/{sass-U9SUuYEy.js → sass-DPmGFiOJ.js} +0 -0
- /package/dist/web/assets/{save-CtW9ojKk.js → save-DYLiVzU8.js} +0 -0
- /package/dist/web/assets/{scala-op4gjA6j.js → scala-BRMVFbZF.js} +0 -0
- /package/dist/web/assets/{scheme-tEjkR8rL.js → scheme-BMSJWevF.js} +0 -0
- /package/dist/web/assets/{sdbl-C6SSRmZg.js → sdbl-DTZ-pEHI.js} +0 -0
- /package/dist/web/assets/{shallow-C1YoJQA-.js → shallow-CmPMAPte.js} +0 -0
- /package/dist/web/assets/{shellscript-Bf2KiwQj.js → shellscript-6-9yg5Cz.js} +0 -0
- /package/dist/web/assets/{shield-check-Du6HKYn9.js → shield-check-CUI36aSc.js} +0 -0
- /package/dist/web/assets/{shield-off-CWKb1MQL.js → shield-off-GdkkVhb3.js} +0 -0
- /package/dist/web/assets/{slack-dark-oGgCey8r.js → slack-dark-DKJgiR7e.js} +0 -0
- /package/dist/web/assets/{slack-ochin-CemlB8cE.js → slack-ochin-WjehVgyK.js} +0 -0
- /package/dist/web/assets/{smalltalk-CTE-6jrZ.js → smalltalk-BChf4SN1.js} +0 -0
- /package/dist/web/assets/{snazzy-light-DoEIGnmz.js → snazzy-light-C1WAwOx6.js} +0 -0
- /package/dist/web/assets/{solarized-dark-CStiJyBg.js → solarized-dark-BxREZrGx.js} +0 -0
- /package/dist/web/assets/{solarized-light-CfuNycS9.js → solarized-light-DG29B1pR.js} +0 -0
- /package/dist/web/assets/{solidity-DL6sO5rd.js → solidity-bDbtGwdR.js} +0 -0
- /package/dist/web/assets/{splunk-yK4ZUFBB.js → splunk-Ceqx5njI.js} +0 -0
- /package/dist/web/assets/{sql-Lw03eoN8.js → sql-OwMEKbz8.js} +0 -0
- /package/dist/web/assets/{ssh-config-DeRp25TR.js → ssh-config-WAR3lu2k.js} +0 -0
- /package/dist/web/assets/{stylus-D8OMsPh-.js → stylus-Cjmoz3d8.js} +0 -0
- /package/dist/web/assets/{swift-nsl9stPV.js → swift-S_ZSBG1q.js} +0 -0
- /package/dist/web/assets/{synthwave-84-exAgsgpf.js → synthwave-84-DiUeWMSh.js} +0 -0
- /package/dist/web/assets/{system-verilog-DBWf00T6.js → system-verilog-RRjqPjUV.js} +0 -0
- /package/dist/web/assets/{systemd-nhu27Dw5.js → systemd-BD3SkXoU.js} +0 -0
- /package/dist/web/assets/{table-GAR4upb6.js → table-D5Q4ap4W.js} +0 -0
- /package/dist/web/assets/{talonscript-CNOEcGDc.js → talonscript-DWefISOm.js} +0 -0
- /package/dist/web/assets/{tasl-CjYZenSH.js → tasl-DCjSS-09.js} +0 -0
- /package/dist/web/assets/{tcl-BVA09RDz.js → tcl-DTYqT_66.js} +0 -0
- /package/dist/web/assets/{terraform-C5EloH1q.js → terraform-CkbP5QnR.js} +0 -0
- /package/dist/web/assets/{text-wrap-D71Jqz5U.js → text-wrap-DBvQD3kc.js} +0 -0
- /package/dist/web/assets/{tokyo-night-D764DdhO.js → tokyo-night-qVSqO9xy.js} +0 -0
- /package/dist/web/assets/{toml-CCDYblSB.js → toml-D9F5Osqs.js} +0 -0
- /package/dist/web/assets/{trash-2-C08fhIg1.js → trash-2-By4VMbC4.js} +0 -0
- /package/dist/web/assets/{triangle-alert-85BQgs3T.js → triangle-alert-CUTURFbG.js} +0 -0
- /package/dist/web/assets/{tsv-BZ4sA05e.js → tsv-C5tpHoxm.js} +0 -0
- /package/dist/web/assets/{tsx-DPLBzAt5.js → tsx-CMWkGtGm.js} +0 -0
- /package/dist/web/assets/{turtle-CwGHCq40.js → turtle-Cn4z3xOi.js} +0 -0
- /package/dist/web/assets/{typescript-CUH0vBAl.js → typescript-DSyAEWsn.js} +0 -0
- /package/dist/web/assets/{typespec-Bq31Vq4u.js → typespec-B93Qap7y.js} +0 -0
- /package/dist/web/assets/{typst-MD9BR9W5.js → typst-DtlOmFlX.js} +0 -0
- /package/dist/web/assets/{use-is-mobile-DUuki97q.js → use-is-mobile-B9UZNwSm.js} +0 -0
- /package/dist/web/assets/{use-visual-viewport-pVxLfE5B.js → use-visual-viewport-Sfb6CZ80.js} +0 -0
- /package/dist/web/assets/{utils-u2fbYPrY.js → utils-QHe_Q6UF.js} +0 -0
- /package/dist/web/assets/{v-DZV7IxIT.js → v-Dfzf-szS.js} +0 -0
- /package/dist/web/assets/{vala-urd1zi9S.js → vala-CyiQZQ9f.js} +0 -0
- /package/dist/web/assets/{vb-DIZU3zbJ.js → vb-C7DGSldd.js} +0 -0
- /package/dist/web/assets/{vendor-xterm-DCj0zgSC.js → vendor-xterm-BHKF_Nsf.js} +0 -0
- /package/dist/web/assets/{verilog-Ndz_ciTA.js → verilog-kF-hClY2.js} +0 -0
- /package/dist/web/assets/{vesper-C86M7LJp.js → vesper-BmKcADuz.js} +0 -0
- /package/dist/web/assets/{vhdl-_klwDUjd.js → vhdl-CDnb16KJ.js} +0 -0
- /package/dist/web/assets/{viml-DzRXWoQh.js → viml-B8cs6Ady.js} +0 -0
- /package/dist/web/assets/{vitesse-black-TWZ20_3U.js → vitesse-black-BR6o9Gto.js} +0 -0
- /package/dist/web/assets/{vitesse-dark-Dl7R6fy9.js → vitesse-dark-Dye14-KB.js} +0 -0
- /package/dist/web/assets/{vitesse-light-Cs0Dt2_n.js → vitesse-light-BLpswIxf.js} +0 -0
- /package/dist/web/assets/{vyper-qnCVj8ia.js → vyper-DU51Z97W.js} +0 -0
- /package/dist/web/assets/{wasm-Dy-SJ3W9.js → wasm-CVqlJAR2.js} +0 -0
- /package/dist/web/assets/{wasm-Ckx9jBPe.js → wasm-ChtccNfv.js} +0 -0
- /package/dist/web/assets/{wenyan-DTEy2Lx-.js → wenyan-DhCa3hCn.js} +0 -0
- /package/dist/web/assets/{wgsl-DC7n63Sy.js → wgsl-Bj1Ec4vv.js} +0 -0
- /package/dist/web/assets/{wikitext-1zFoZiW6.js → wikitext-C90DHNa0.js} +0 -0
- /package/dist/web/assets/{wit-DtTfCRph.js → wit-DUgbOD7Z.js} +0 -0
- /package/dist/web/assets/{wolfram-B2Bgu1KL.js → wolfram-BgwUqD1I.js} +0 -0
- /package/dist/web/assets/{x-CeN0Qybc.js → x-DiOUR_mp.js} +0 -0
- /package/dist/web/assets/{yaml-B-Jxk0IQ.js → yaml-DEQulj-8.js} +0 -0
- /package/dist/web/assets/{zenscript-BWRfvNER.js → zenscript-C7Jp7TgT.js} +0 -0
- /package/dist/web/assets/{zig-CkwuvETm.js → zig-9x4qXYLg.js} +0 -0
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import { readOriginCertState } from "./cloudflared-cert.ts";
|
|
10
10
|
import { fetchZoneName } from "./cloudflare-zone-api.ts";
|
|
11
|
-
import { fetchDnsRecords,
|
|
11
|
+
import { fetchDnsRecords, fetchTunnelByName } from "./cloudflare-dns-api.ts";
|
|
12
12
|
import { proposeHostname, validateHostname } from "./hostname-rules.ts";
|
|
13
13
|
import { createTunnelArgs, routeDnsArgs, tunnelTokenArgs, tunnelNameForHost } from "./named-tunnel-args.ts";
|
|
14
14
|
import { runCloudflared } from "./cloudflared-exec.ts";
|
|
@@ -110,7 +110,25 @@ async function runSetupInner(hostname: string): Promise<SetupOutcome> {
|
|
|
110
110
|
const tunnelName = tunnelNameForHost();
|
|
111
111
|
|
|
112
112
|
broadcastGlobalEvent({ type: "tunnel:setup_step", step: "precheck", message: "checking for a DNS collision" });
|
|
113
|
-
const
|
|
113
|
+
const existing = await fetchTunnelByName(accountID, apiToken, tunnelName);
|
|
114
|
+
const existingId = existing?.id ?? null;
|
|
115
|
+
|
|
116
|
+
// Reusing a same-named tunnel is normal (re-running setup, changing the
|
|
117
|
+
// prefix). Reusing one that ANOTHER PPM is currently serving is not: both
|
|
118
|
+
// connectors register on the same tunnel and Cloudflare spreads requests
|
|
119
|
+
// across them, so each hostname on that tunnel intermittently answers from
|
|
120
|
+
// the wrong instance. Only the installation that already owns this tunnel in
|
|
121
|
+
// its own config may take it over.
|
|
122
|
+
// Read the raw row, not `resolveTunnelConfig`: that degrades to "quick" when
|
|
123
|
+
// named mode is off, which would hide the fact that this installation still
|
|
124
|
+
// owns the tunnel and would wrongly block its own re-setup.
|
|
125
|
+
const ownsTunnelAlready = configService.get("tunnel")?.namedTunnelName === tunnelName;
|
|
126
|
+
if (existing && existing.activeConnections > 0 && !ownsTunnelAlready) {
|
|
127
|
+
throw new SetupError(
|
|
128
|
+
409,
|
|
129
|
+
`a tunnel named "${tunnelName}" is already running elsewhere — stop that PPM instance first, or run this one with its own PPM_HOME`,
|
|
130
|
+
);
|
|
131
|
+
}
|
|
114
132
|
const records = await fetchDnsRecords(zoneID, apiToken, hostname);
|
|
115
133
|
let overwrite = false;
|
|
116
134
|
if (records.length > 0) {
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Feature
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
2
|
+
* Feature switch. Remote desktop is ON by default — the viewer itself shows a warning before
|
|
3
|
+
* the first frame is streamed (`remote-desktop-warning-gate.tsx`) and every entry point still
|
|
4
|
+
* sits behind PPM auth. `REMOTE_DESKTOP_ENABLED=0` (or `false`) turns the whole surface off for
|
|
5
|
+
* hosts that never want a live video+input channel reachable, e.g. one exposed on a public
|
|
6
|
+
* tunnel. Every entry point (REST routes, WS upgrade) checks this independently rather than
|
|
7
|
+
* trusting a single call site.
|
|
6
8
|
*/
|
|
7
9
|
export function isRemoteDesktopEnabled(): boolean {
|
|
8
|
-
const v = process.env.REMOTE_DESKTOP_ENABLED;
|
|
9
|
-
return v === "
|
|
10
|
+
const v = process.env.REMOTE_DESKTOP_ENABLED?.trim().toLowerCase();
|
|
11
|
+
return !(v === "0" || v === "false");
|
|
10
12
|
}
|
|
@@ -16,12 +16,15 @@
|
|
|
16
16
|
* reads `visualViewport` itself and floats just its toolbar/key-bar row above the keyboard.
|
|
17
17
|
*
|
|
18
18
|
* The heavy viewer (canvas, WebCodecs decoder, gesture engine) is a nested lazy import, same as
|
|
19
|
-
* `TeamMemberSheet` does for its content — nothing here loads until the sheet actually opens
|
|
19
|
+
* `TeamMemberSheet` does for its content — nothing here loads until the sheet actually opens,
|
|
20
|
+
* and the lazy chunk itself sits behind `RemoteDesktopWarningGate`, so it isn't even fetched
|
|
21
|
+
* until the user continues past the warning.
|
|
20
22
|
*/
|
|
21
23
|
import { Suspense, lazy } from "react";
|
|
22
24
|
import { createPortal } from "react-dom";
|
|
23
25
|
import { usePortalContainer } from "@/components/ui/portal-container-context";
|
|
24
26
|
import { useRemoteDesktopMobileOpenState } from "./use-remote-desktop-mobile-open-state";
|
|
27
|
+
import { RemoteDesktopWarningGate } from "./remote-desktop-warning-gate";
|
|
25
28
|
|
|
26
29
|
const RemoteDesktopMobileView = lazy(() => import("./remote-desktop-mobile-view"));
|
|
27
30
|
|
|
@@ -34,9 +37,11 @@ export function RemoteDesktopMobileSheet() {
|
|
|
34
37
|
|
|
35
38
|
return createPortal(
|
|
36
39
|
<div className="fixed inset-0 z-[45] bg-black" data-testid="remote-desktop-mobile-sheet">
|
|
37
|
-
<
|
|
38
|
-
<
|
|
39
|
-
|
|
40
|
+
<RemoteDesktopWarningGate onCancel={close}>
|
|
41
|
+
<Suspense fallback={<div className="flex h-full items-center justify-center text-sm text-text-2">Loading…</div>}>
|
|
42
|
+
<RemoteDesktopMobileView onClose={close} />
|
|
43
|
+
</Suspense>
|
|
44
|
+
</RemoteDesktopWarningGate>
|
|
40
45
|
</div>,
|
|
41
46
|
portalContainer ?? document.getElementById("root") ?? document.body,
|
|
42
47
|
);
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Warning shown before the Remote Desktop viewer connects — wraps both the desktop window body
|
|
3
|
+
* (`remote-desktop-window-content.tsx`) and the mobile full-screen view
|
|
4
|
+
* (`remote-desktop-mobile-sheet.tsx`). The viewer is only mounted after the user continues, so
|
|
5
|
+
* no session nonce is minted and no frame is captured while the warning is up.
|
|
6
|
+
*
|
|
7
|
+
* Shown on every open until the user ticks "don't show again", which persists via the shared
|
|
8
|
+
* `remoteDesktopWarningDismissed` UI pref (server-side, like the stats-overlay toggle) so the
|
|
9
|
+
* choice follows them across devices. Dark chrome on purpose: it sits where the black canvas
|
|
10
|
+
* will be, on both surfaces.
|
|
11
|
+
*/
|
|
12
|
+
import { useState, type ReactNode } from "react";
|
|
13
|
+
import { MonitorSmartphone, ShieldAlert } from "lucide-react";
|
|
14
|
+
import { useSettingsStore } from "@/stores/settings-store";
|
|
15
|
+
|
|
16
|
+
export interface RemoteDesktopWarningGateProps {
|
|
17
|
+
/** Called when the user backs out instead of continuing — close the window/sheet. */
|
|
18
|
+
onCancel: () => void;
|
|
19
|
+
children: ReactNode;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function RemoteDesktopWarningGate({ onCancel, children }: RemoteDesktopWarningGateProps) {
|
|
23
|
+
const dismissed = useSettingsStore((s) => s.remoteDesktopWarningDismissed);
|
|
24
|
+
const setDismissed = useSettingsStore((s) => s.setRemoteDesktopWarningDismissed);
|
|
25
|
+
const [accepted, setAccepted] = useState(false);
|
|
26
|
+
const [dontShowAgain, setDontShowAgain] = useState(false);
|
|
27
|
+
|
|
28
|
+
if (dismissed || accepted) return <>{children}</>;
|
|
29
|
+
|
|
30
|
+
const onContinue = () => {
|
|
31
|
+
if (dontShowAgain) setDismissed(true);
|
|
32
|
+
setAccepted(true);
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
return (
|
|
36
|
+
<div
|
|
37
|
+
className="flex h-full w-full items-center justify-center overflow-y-auto bg-black p-4 text-white"
|
|
38
|
+
data-testid="remote-desktop-warning-gate"
|
|
39
|
+
>
|
|
40
|
+
<div className="flex w-full max-w-sm flex-col gap-4 rounded-xl border border-white/10 bg-white/5 p-5">
|
|
41
|
+
<div className="flex items-center gap-2">
|
|
42
|
+
<MonitorSmartphone className="size-5 shrink-0 text-primary" />
|
|
43
|
+
<h2 className="text-base font-semibold">Remote Desktop</h2>
|
|
44
|
+
<span className="ml-auto rounded-full bg-amber-500/20 px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wide text-amber-300">
|
|
45
|
+
Beta
|
|
46
|
+
</span>
|
|
47
|
+
</div>
|
|
48
|
+
|
|
49
|
+
<ul className="flex flex-col gap-2 text-sm text-white/80">
|
|
50
|
+
<li className="flex gap-2">
|
|
51
|
+
<ShieldAlert className="mt-0.5 size-4 shrink-0 text-amber-300" />
|
|
52
|
+
<span>
|
|
53
|
+
This streams the host's <strong>whole screen</strong> and lets you <strong>move its mouse and type</strong> as if
|
|
54
|
+
you were sitting at it. Anything you do here happens on the real desktop.
|
|
55
|
+
</span>
|
|
56
|
+
</li>
|
|
57
|
+
<li className="flex gap-2">
|
|
58
|
+
<ShieldAlert className="mt-0.5 size-4 shrink-0 text-amber-300" />
|
|
59
|
+
<span>
|
|
60
|
+
Anyone signed in to this PPM can do the same. Avoid opening it over a public share link you don't fully
|
|
61
|
+
trust; a private network (Tailscale, LAN) is safer.
|
|
62
|
+
</span>
|
|
63
|
+
</li>
|
|
64
|
+
<li className="flex gap-2">
|
|
65
|
+
<ShieldAlert className="mt-0.5 size-4 shrink-0 text-amber-300" />
|
|
66
|
+
<span>
|
|
67
|
+
Still beta: the host must be unlocked with an active session, UAC prompts stay hidden, and a person at the
|
|
68
|
+
host will fight you for the cursor.
|
|
69
|
+
</span>
|
|
70
|
+
</li>
|
|
71
|
+
</ul>
|
|
72
|
+
|
|
73
|
+
<label className="flex min-h-11 cursor-pointer items-center gap-2 text-sm text-white/70">
|
|
74
|
+
<input
|
|
75
|
+
type="checkbox"
|
|
76
|
+
checked={dontShowAgain}
|
|
77
|
+
onChange={(e) => setDontShowAgain(e.target.checked)}
|
|
78
|
+
className="size-4 accent-primary"
|
|
79
|
+
data-testid="remote-desktop-warning-dont-show"
|
|
80
|
+
/>
|
|
81
|
+
Don't show this again
|
|
82
|
+
</label>
|
|
83
|
+
|
|
84
|
+
{/* Primary action last (thumb zone on mobile); both ≥44px tall. */}
|
|
85
|
+
<div className="flex gap-2">
|
|
86
|
+
<button
|
|
87
|
+
type="button"
|
|
88
|
+
onClick={onCancel}
|
|
89
|
+
className="min-h-11 flex-1 rounded-md bg-white/10 px-3 text-sm hover:bg-white/20"
|
|
90
|
+
data-testid="remote-desktop-warning-cancel"
|
|
91
|
+
>
|
|
92
|
+
Cancel
|
|
93
|
+
</button>
|
|
94
|
+
<button
|
|
95
|
+
type="button"
|
|
96
|
+
onClick={onContinue}
|
|
97
|
+
className="min-h-11 flex-1 rounded-md bg-primary px-3 text-sm font-medium text-primary-foreground hover:bg-primary/90"
|
|
98
|
+
data-testid="remote-desktop-warning-continue"
|
|
99
|
+
>
|
|
100
|
+
Continue
|
|
101
|
+
</button>
|
|
102
|
+
</div>
|
|
103
|
+
</div>
|
|
104
|
+
</div>
|
|
105
|
+
);
|
|
106
|
+
}
|
|
@@ -1,18 +1,32 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Remote Desktop window body: thin wrapper around `useRemoteDesktopConnection` (WS/nonce/ping/
|
|
3
3
|
* decode, shared with the mobile viewer) that renders the canvas, overlay states, and wires
|
|
4
|
-
* pointer/keyboard capture over the connection's `sendMessage`.
|
|
4
|
+
* pointer/keyboard capture over the connection's `sendMessage`. Sits behind
|
|
5
|
+
* `RemoteDesktopWarningGate`, so the connection hook (and its session nonce) only runs once the
|
|
6
|
+
* user has read the warning.
|
|
5
7
|
*/
|
|
6
|
-
import { useRef } from "react";
|
|
8
|
+
import { useCallback, useRef } from "react";
|
|
7
9
|
import { RotateCw, MonitorX, Gauge } from "lucide-react";
|
|
8
10
|
import type { WindowContentProps } from "@/components/floating-window/window-content-registry";
|
|
11
|
+
import { useWindowStore } from "@/components/floating-window/window-store";
|
|
9
12
|
import { useSettingsStore } from "@/stores/settings-store";
|
|
10
13
|
import { cn } from "@/lib/utils";
|
|
11
14
|
import { useRemoteDesktopConnection } from "./use-remote-desktop-connection";
|
|
12
15
|
import { useRemoteInputCapture } from "./use-remote-input-capture";
|
|
13
16
|
import { RemoteDesktopStatsOverlay } from "./remote-desktop-stats-overlay";
|
|
17
|
+
import { RemoteDesktopWarningGate } from "./remote-desktop-warning-gate";
|
|
14
18
|
|
|
15
|
-
export default function RemoteDesktopWindowContent(
|
|
19
|
+
export default function RemoteDesktopWindowContent({ id }: WindowContentProps) {
|
|
20
|
+
const closeWindow = useWindowStore((s) => s.close);
|
|
21
|
+
const onCancel = useCallback(() => closeWindow(id), [closeWindow, id]);
|
|
22
|
+
return (
|
|
23
|
+
<RemoteDesktopWarningGate onCancel={onCancel}>
|
|
24
|
+
<RemoteDesktopViewer />
|
|
25
|
+
</RemoteDesktopWarningGate>
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function RemoteDesktopViewer() {
|
|
16
30
|
const canvasRef = useRef<HTMLCanvasElement | null>(null);
|
|
17
31
|
const { connState, errorMessage, decoderStatus, decoderErrorMessage, sendMessage, reconnect, getFrameCount, getTotalBytes } =
|
|
18
32
|
useRemoteDesktopConnection(canvasRef);
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Fetches remote-desktop capabilities once and reports whether the feature should surface in
|
|
3
|
-
* the UI. Returns `available=false` when the
|
|
4
|
-
* video capture is unavailable, so the nav entry stays hidden
|
|
5
|
-
*
|
|
3
|
+
* the UI. Returns `available=false` when the host opted out (`REMOTE_DESKTOP_ENABLED=0` — the
|
|
4
|
+
* endpoint 404s) or video capture is unavailable (no ffmpeg), so the nav entry stays hidden on
|
|
5
|
+
* hosts that can't or won't stream.
|
|
6
6
|
*/
|
|
7
7
|
import { useEffect, useState } from "react";
|
|
8
8
|
import { api } from "@/lib/api-client";
|
|
@@ -42,6 +42,9 @@ interface SettingsState {
|
|
|
42
42
|
/** Show/hide the small fps/KB-per-s/resolution overlay on the remote-desktop viewer
|
|
43
43
|
* (desktop window and mobile full-screen view both read this same flag). */
|
|
44
44
|
remoteDesktopStatsVisible: boolean;
|
|
45
|
+
/** User ticked "don't show again" on the remote-desktop warning that precedes every open
|
|
46
|
+
* (`remote-desktop-warning-gate.tsx`); once true the viewer connects straight away. */
|
|
47
|
+
remoteDesktopWarningDismissed: boolean;
|
|
45
48
|
deviceName: string | null;
|
|
46
49
|
version: string | null;
|
|
47
50
|
tunnelActive: boolean;
|
|
@@ -67,6 +70,7 @@ interface SettingsState {
|
|
|
67
70
|
setDbSidebarExpanded: (next: DbSidebarExpanded) => void;
|
|
68
71
|
setExplorerSkin: (pref: ExplorerSkinPref) => void;
|
|
69
72
|
toggleRemoteDesktopStatsVisible: () => void;
|
|
73
|
+
setRemoteDesktopWarningDismissed: (dismissed: boolean) => void;
|
|
70
74
|
fetchServerInfo: () => Promise<void>;
|
|
71
75
|
/** Re-push the in-memory theme selection to the server (see the action for why). */
|
|
72
76
|
syncThemeToServer: () => Promise<void>;
|
|
@@ -91,6 +95,7 @@ interface PersistedSettings {
|
|
|
91
95
|
dbSidebarExpanded?: DbSidebarExpanded;
|
|
92
96
|
explorerSkin?: ExplorerSkinPref;
|
|
93
97
|
remoteDesktopStatsVisible?: boolean;
|
|
98
|
+
remoteDesktopWarningDismissed?: boolean;
|
|
94
99
|
}
|
|
95
100
|
|
|
96
101
|
const VALID_STYLES: PpmThemeStyle[] = ["aurora", "slate", "precision", "custom"];
|
|
@@ -244,6 +249,7 @@ function applyServerUiPrefs(data: Record<string, unknown>) {
|
|
|
244
249
|
patch.explorerSkin = data.explorerSkin;
|
|
245
250
|
}
|
|
246
251
|
if (typeof data.remoteDesktopStatsVisible === "boolean") patch.remoteDesktopStatsVisible = data.remoteDesktopStatsVisible;
|
|
252
|
+
if (typeof data.remoteDesktopWarningDismissed === "boolean") patch.remoteDesktopWarningDismissed = data.remoteDesktopWarningDismissed;
|
|
247
253
|
const dbExpanded = sanitizeDbExpanded(data.dbSidebarExpanded);
|
|
248
254
|
if (dbExpanded) patch.dbSidebarExpanded = dbExpanded;
|
|
249
255
|
if (Object.keys(patch).length === 0) return;
|
|
@@ -272,6 +278,7 @@ export const useSettingsStore = create<SettingsState>((set, get) => ({
|
|
|
272
278
|
dbSidebarExpanded: sanitizeDbExpanded(_initial.dbSidebarExpanded) ?? DEFAULT_DB_EXPANDED,
|
|
273
279
|
explorerSkin: (_initial.explorerSkin === "windows" || _initial.explorerSkin === "macos") ? _initial.explorerSkin : "auto",
|
|
274
280
|
remoteDesktopStatsVisible: _initial.remoteDesktopStatsVisible ?? false,
|
|
281
|
+
remoteDesktopWarningDismissed: _initial.remoteDesktopWarningDismissed ?? false,
|
|
275
282
|
deviceName: null,
|
|
276
283
|
version: null,
|
|
277
284
|
tunnelActive: false,
|
|
@@ -391,6 +398,11 @@ export const useSettingsStore = create<SettingsState>((set, get) => ({
|
|
|
391
398
|
set({ remoteDesktopStatsVisible: next });
|
|
392
399
|
},
|
|
393
400
|
|
|
401
|
+
setRemoteDesktopWarningDismissed: (dismissed) => {
|
|
402
|
+
persistUiPref({ remoteDesktopWarningDismissed: dismissed });
|
|
403
|
+
set({ remoteDesktopWarningDismissed: dismissed });
|
|
404
|
+
},
|
|
405
|
+
|
|
394
406
|
setEditorTabStyle: (style) => {
|
|
395
407
|
persistUiPref({ editorTabStyle: style });
|
|
396
408
|
set({ editorTabStyle: style });
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{o as e}from"./rolldown-runtime-FhOqtrmT.js";import{S as t,x as n}from"./vendor-markdown-Ls5AcU91.js";import{C as r,S as i,T as a,_ as o,b as s,g as c,h as l,j as u,m as d,v as f,w as p,x as m,y as h}from"./vendor-ui-CaeeFO0B.js";import{t as g}from"./createLucideIcon-D8pyde1A.js";import{d as _}from"./context-menu-BpwUny-o.js";import{t as v}from"./chevron-down-Dp0rpHb8.js";import{n as y,t as b}from"./upload-BNlX8D07.js";import{t as x}from"./download-DG3_9xXy.js";import{t as S}from"./external-link-B6Hl0U4X.js";import{t as C}from"./loader-circle-DouKgIXy.js";import{t as w}from"./refresh-cw-84mz8aOE.js";import{t as T}from"./trash-2-C08fhIg1.js";import{i as E,n as D,r as O}from"./api-client-BkGKTjsq.js";import{n as k}from"./utils-u2fbYPrY.js";import{n as A}from"./portal-container-context-DSGdlXrJ.js";import{t as j}from"./input-DXPgUtxi.js";import{t as M}from"./switch-DqL_ZjB_.js";import{a as N,g as P}from"./api-settings-R59c66DE.js";var F=g(`bug`,[[`path`,{d:`M12 20v-9`,key:`1qisl0`}],[`path`,{d:`M14 7a4 4 0 0 1 4 4v3a6 6 0 0 1-12 0v-3a4 4 0 0 1 4-4z`,key:`uouzyp`}],[`path`,{d:`M14.12 3.88 16 2`,key:`qol33r`}],[`path`,{d:`M21 21a4 4 0 0 0-3.81-4`,key:`1b0z45`}],[`path`,{d:`M21 5a4 4 0 0 1-3.55 3.97`,key:`5cxbf6`}],[`path`,{d:`M22 13h-4`,key:`1jl80f`}],[`path`,{d:`M3 21a4 4 0 0 1 3.81-4`,key:`1fjd4g`}],[`path`,{d:`M3 5a4 4 0 0 0 3.55 3.97`,key:`1d7oge`}],[`path`,{d:`M6 13H2`,key:`82j7cp`}],[`path`,{d:`m8 2 1.88 1.88`,key:`fmnt4t`}],[`path`,{d:`M9 7.13V6a3 3 0 1 1 6 0v1.13`,key:`1vgav8`}]]),I=g(`key-round`,[[`path`,{d:`M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z`,key:`1s6t7t`}],[`circle`,{cx:`16.5`,cy:`7.5`,r:`.5`,fill:`currentColor`,key:`w0ekpg`}]]),L=g(`monitor-smartphone`,[[`path`,{d:`M18 8V6a2 2 0 0 0-2-2H4a2 2 0 0 0-2 2v7a2 2 0 0 0 2 2h8`,key:`10dyio`}],[`path`,{d:`M10 19v-3.96 3.15`,key:`1irgej`}],[`path`,{d:`M7 19h5`,key:`qswx4l`}],[`rect`,{width:`6`,height:`10`,x:`16`,y:`12`,rx:`2`,key:`1egngj`}]]),R=e(t(),1),z=n();function B({className:e,...t}){return(0,z.jsx)(u,{"data-slot":`label`,className:k(`flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50`,e),...t})}function V({...e}){return(0,z.jsx)(s,{"data-slot":`select`,...e})}function H({...e}){return(0,z.jsx)(p,{"data-slot":`select-value`,...e})}function U({className:e,size:t=`default`,children:n,...i}){return(0,z.jsxs)(r,{"data-slot":`select-trigger`,"data-size":t,className:k(`flex w-fit items-center justify-between gap-2 rounded-md border border-input bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[placeholder]:text-muted-foreground data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground`,e),...i,children:[n,(0,z.jsx)(l,{asChild:!0,children:(0,z.jsx)(v,{className:`size-4 opacity-50`})})]})}function W({className:e,children:t,position:n=`item-aligned`,align:r=`center`,...i}){let o=A();return(0,z.jsx)(h,{container:o,children:(0,z.jsxs)(d,{"data-slot":`select-content`,className:k(`relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border bg-popover text-popover-foreground shadow-md data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95`,n===`popper`&&`data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1`,e),position:n,align:r,...i,children:[(0,z.jsx)(K,{}),(0,z.jsx)(a,{className:k(`p-1`,n===`popper`&&`h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1`),children:t}),(0,z.jsx)(q,{})]})})}function G({className:e,children:t,...n}){return(0,z.jsxs)(c,{"data-slot":`select-item`,className:k(`relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2`,e),...n,children:[(0,z.jsx)(`span`,{"data-slot":`select-item-indicator`,className:`absolute right-2 flex size-3.5 items-center justify-center`,children:(0,z.jsx)(o,{children:(0,z.jsx)(_,{className:`size-4`})})}),(0,z.jsx)(f,{children:t})]})}function K({className:e,...t}){return(0,z.jsx)(i,{"data-slot":`select-scroll-up-button`,className:k(`flex cursor-default items-center justify-center py-1`,e),...t,children:(0,z.jsx)(y,{className:`size-4`})})}function q({className:e,...t}){return(0,z.jsx)(m,{"data-slot":`select-scroll-down-button`,className:k(`flex cursor-default items-center justify-center py-1`,e),...t,children:(0,z.jsx)(v,{className:`size-4`})})}var J={claude:`C`,cursor:`▶`,codex:`◆`,gemini:`G`};function Y({value:e,onChange:t,projectName:n}){let[r,i]=(0,R.useState)([]),[a,o]=(0,R.useState)(!1),s=(0,R.useRef)(null),c=(0,R.useRef)(0);(0,R.useEffect)(()=>{n&&D.get(`${E(n)}/chat/providers`).then(i).catch(()=>{})},[n]),(0,R.useEffect)(()=>{if(!a)return;let e=e=>{s.current&&!s.current.contains(e.target)&&o(!1)},t=s.current?.ownerDocument??document;return t.addEventListener(`mousedown`,e),()=>t.removeEventListener(`mousedown`,e)},[a]),(0,R.useEffect)(()=>{a&&(c.current=Math.max(0,r.findIndex(t=>t.id===e)))},[a,e,r]);let l=(0,R.useCallback)(e=>{if(e.key===`Escape`){o(!1);return}if(e.key===`ArrowDown`||e.key===`ArrowUp`){e.preventDefault();let t=e.key===`ArrowDown`?1:-1;c.current=(c.current+t+r.length)%r.length,(s.current?.querySelector(`[data-idx="${c.current}"]`))?.focus()}if(e.key===`Enter`){e.preventDefault();let n=r[c.current];n&&(t(n.id),o(!1))}},[t,r]);if(r.length<=1)return null;let u=r.find(t=>t.id===e),d=J[e]||`?`;return(0,z.jsxs)(`div`,{className:`relative`,children:[(0,z.jsxs)(`button`,{type:`button`,onClick:e=>{e.stopPropagation(),o(e=>!e)},className:`inline-flex items-center gap-1.5 px-[9px] py-1 rounded-full text-[11.5px] text-text-2 bg-panel-2 border border-border-soft hover:text-text-primary hover:border-border transition-colors`,"aria-label":`AI Provider: ${u?.name??e}`,children:[(0,z.jsx)(`span`,{className:`inline-flex h-3.5 w-3.5 items-center justify-center rounded text-[9px] font-bold bg-surface-elevated shrink-0`,children:d}),(0,z.jsx)(`span`,{className:`max-w-[80px] truncate capitalize`,children:u?.name??e})]}),a&&(0,z.jsxs)(`div`,{ref:s,role:`listbox`,"aria-label":`AI Providers`,onKeyDown:l,onMouseDown:e=>e.stopPropagation(),onClick:e=>e.stopPropagation(),className:`absolute bottom-full left-0 mb-1 z-50 w-56 rounded-lg border border-border popover-solid shadow-[var(--shadow-panel)]`,children:[(0,z.jsx)(`div`,{className:`px-3 py-2 border-b border-border`,children:(0,z.jsx)(`span`,{className:`text-xs font-medium text-text-secondary`,children:`Provider`})}),(0,z.jsx)(`div`,{className:`py-1`,children:r.map((n,r)=>{let i=J[n.id]||`?`,a=n.id===e;return(0,z.jsxs)(`button`,{"data-idx":r,role:`option`,"aria-selected":a,tabIndex:0,onClick:()=>{t(n.id),o(!1)},className:`w-full flex items-center gap-3 px-3 py-2 text-left transition-colors hover:bg-surface-elevated focus:bg-surface-elevated focus:outline-none ${a?`bg-surface-elevated`:``}`,children:[(0,z.jsx)(`span`,{className:`inline-flex h-5 w-5 items-center justify-center rounded text-[11px] font-bold bg-surface-elevated text-text-subtle shrink-0`,children:i}),(0,z.jsx)(`span`,{className:`flex-1 text-sm font-medium text-text-primary capitalize`,children:n.name}),a&&(0,z.jsx)(_,{className:`size-4 shrink-0 text-primary`})]},n.id)})})]})]})}function X({providerId:e}){return(0,z.jsx)(`span`,{className:`inline-flex h-4 w-4 items-center justify-center rounded text-[10px] font-bold bg-surface-elevated text-text-subtle shrink-0`,title:e,children:J[e]||`?`})}var Z=[{value:`round-robin`,label:`Round-robin`},{value:`fill-first`,label:`Fill-first`},{value:`lowest-usage`,label:`Lowest usage`}];function Q(e){return e==null?`—`:`${Math.round(e*100)}%`}function $(){let[e,t]=(0,R.useState)([]),[n,r]=(0,R.useState)(`round-robin`),[i,a]=(0,R.useState)({}),[o,s]=(0,R.useState)(!1),[c,l]=(0,R.useState)(``),[u,d]=(0,R.useState)(``),[f,p]=(0,R.useState)(!1),[m,h]=(0,R.useState)(null),[g,_]=(0,R.useState)(null),[v,y]=(0,R.useState)(!1),[w,E]=(0,R.useState)(``),[k,A]=(0,R.useState)(!1),[j,M]=(0,R.useState)(!1),[N,P]=(0,R.useState)(null),F=(0,R.useRef)(null),B=(0,R.useCallback)(async()=>{s(!0);try{let e=await D.get(`/api/codex-accounts`);t(e.accounts),r(e.strategy),D.get(`/api/codex-accounts/usage`).then(a).catch(()=>{})}finally{s(!1)}},[]);(0,R.useEffect)(()=>{B()},[B]);let V=async()=>{if(c.trim()){p(!0),h(null);try{await D.post(`/api/codex-accounts/api-key`,{apiKey:c.trim(),label:u.trim()||void 0}),l(``),d(``),await B()}catch(e){h(e.message)}finally{p(!1)}}},H=async()=>{h(null);try{let e=await D.post(`/api/codex-accounts/device-login`,{label:u.trim()||void 0});_(e),y(!0),D.post(`/api/codex-accounts/device-login/${e.id}/await`).then(async()=>{_(null),y(!1),d(``),await B()}).catch(e=>{h(e.message),_(null),y(!1)})}catch(e){h(e.message)}},U=async e=>{await D.del(`/api/codex-accounts/${e}`),await B()},W=async e=>{r(e);try{await D.put(`/api/codex-accounts/strategy`,{strategy:e})}catch{}},G=async()=>{if(!w.trim()){h(`Set a backup password first.`);return}A(!0),h(null),P(null);try{let e={"Content-Type":`application/json`},t=O();t&&(e.Authorization=`Bearer ${t}`);let n=await fetch(`/api/codex-accounts/export`,{method:`POST`,headers:e,body:JSON.stringify({password:w})});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(e.error??`Export failed: ${n.status}`)}let r=await n.text(),i=new Blob([r],{type:`application/json`}),a=document.createElement(`a`);a.href=URL.createObjectURL(i),a.download=`ppm-codex-accounts-backup.json`,a.click(),URL.revokeObjectURL(a.href),P(`Backup downloaded.`)}catch(e){h(e.message)}finally{A(!1)}},K=async e=>{if(!w.trim()){h(`Enter the backup password first.`);return}M(!0),h(null),P(null);try{let t=await e.text(),n=await D.post(`/api/codex-accounts/import`,{data:t,password:w});P(`Imported ${n.imported}${n.skipped?`, skipped ${n.skipped}`:``}.`),await B()}catch(e){h(e.message)}finally{M(!1),F.current&&(F.current.value=``)}};return(0,z.jsxs)(`div`,{className:`space-y-4`,children:[(0,z.jsxs)(`div`,{children:[(0,z.jsx)(`h3`,{className:`text-sm font-semibold text-text-primary`,children:`Codex Accounts`}),(0,z.jsx)(`p`,{className:`text-xs text-text-subtle mt-0.5`,children:`Each account uses its own login (CODEX_HOME). One is selected per chat by the strategy below.`})]}),m&&(0,z.jsx)(`div`,{className:`text-xs text-error bg-error/10 border border-error/30 rounded-md p-2`,children:m}),N&&(0,z.jsx)(`div`,{className:`text-xs text-success bg-success/10 border border-success/30 rounded-md p-2`,children:N}),(0,z.jsxs)(`div`,{className:`flex items-center gap-2 flex-wrap`,children:[(0,z.jsx)(`span`,{className:`text-xs text-text-secondary`,children:`Selection strategy:`}),Z.map(e=>(0,z.jsx)(`button`,{type:`button`,onClick:()=>W(e.value),className:`text-xs px-3 min-h-[36px] rounded-md border transition-colors ${n===e.value?`border-primary bg-primary/15 text-text-primary`:`border-border bg-surface/50 text-text-secondary hover:bg-surface`}`,children:e.label},e.value))]}),(0,z.jsxs)(`div`,{className:`space-y-2`,children:[o&&e.length===0&&(0,z.jsxs)(`div`,{className:`text-xs text-text-subtle flex items-center gap-2`,children:[(0,z.jsx)(C,{className:`size-3 animate-spin`}),` Loading…`]}),!o&&e.length===0&&(0,z.jsxs)(`div`,{className:`text-xs text-text-subtle`,children:[`No codex accounts yet — add one below. (With none, chats use your default `,(0,z.jsx)(`code`,{children:`~/.codex`}),` login.)`]}),e.map(e=>{let t=i[e.id]??{};return(0,z.jsxs)(`div`,{className:`flex items-center gap-3 border border-border rounded-md bg-surface/40 p-2.5`,children:[(0,z.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,z.jsx)(`span`,{className:`text-sm text-text-primary truncate`,children:e.label}),(0,z.jsx)(`span`,{className:`text-[10px] uppercase tracking-wide text-text-subtle border border-border rounded px-1`,children:e.type}),e.planType&&(0,z.jsx)(`span`,{className:`text-[10px] text-text-subtle`,children:e.planType})]}),(0,z.jsxs)(`div`,{className:`text-[11px] text-text-subtle mt-0.5`,children:[`5h `,Q(t.fiveHour),` · weekly `,Q(t.sevenDay)]})]}),(0,z.jsx)(`button`,{type:`button`,onClick:()=>U(e.id),title:`Remove account`,className:`p-2 min-h-[44px] min-w-[44px] flex items-center justify-center text-text-subtle hover:text-error transition-colors`,children:(0,z.jsx)(T,{className:`size-4`})})]},e.id)})]}),(0,z.jsxs)(`div`,{className:`border border-border rounded-md p-3 space-y-2`,children:[(0,z.jsx)(`input`,{value:u,onChange:e=>d(e.target.value),placeholder:`Label (optional)`,className:`w-full text-sm bg-surface border border-border rounded-md px-3 min-h-[40px] text-text-primary placeholder:text-text-subtle`}),(0,z.jsxs)(`div`,{className:`flex gap-2 flex-col sm:flex-row`,children:[(0,z.jsx)(`input`,{value:c,onChange:e=>l(e.target.value),type:`password`,placeholder:`OpenAI API key (sk-…)`,className:`flex-1 text-sm bg-surface border border-border rounded-md px-3 min-h-[44px] text-text-primary placeholder:text-text-subtle font-mono`}),(0,z.jsxs)(`button`,{type:`button`,onClick:V,disabled:f||!c.trim(),className:`inline-flex items-center justify-center gap-2 text-sm px-4 min-h-[44px] rounded-md border border-border bg-surface/50 hover:bg-surface text-text-primary disabled:opacity-60`,children:[f?(0,z.jsx)(C,{className:`size-4 animate-spin`}):(0,z.jsx)(I,{className:`size-4`}),` Add key`]})]}),(0,z.jsxs)(`button`,{type:`button`,onClick:H,disabled:v,className:`inline-flex items-center justify-center gap-2 text-sm px-4 min-h-[44px] w-full sm:w-auto rounded-md border border-border bg-surface/50 hover:bg-surface text-text-primary disabled:opacity-60`,children:[v?(0,z.jsx)(C,{className:`size-4 animate-spin`}):(0,z.jsx)(L,{className:`size-4`}),` Sign in with ChatGPT (device code)`]})]}),(0,z.jsxs)(`div`,{className:`border border-border rounded-md p-3 space-y-2`,children:[(0,z.jsx)(`p`,{className:`text-xs text-text-secondary`,children:`Backup & transfer — password-encrypted file with each account's login.`}),(0,z.jsx)(`input`,{value:w,onChange:e=>E(e.target.value),type:`password`,placeholder:`Backup password`,className:`w-full text-sm bg-surface border border-border rounded-md px-3 min-h-[44px] text-text-primary placeholder:text-text-subtle`}),(0,z.jsxs)(`div`,{className:`flex gap-2 flex-col sm:flex-row`,children:[(0,z.jsxs)(`button`,{type:`button`,onClick:G,disabled:k||!w.trim(),className:`flex-1 inline-flex items-center justify-center gap-2 text-sm px-4 min-h-[44px] rounded-md border border-border bg-surface/50 hover:bg-surface text-text-primary disabled:opacity-60`,children:[k?(0,z.jsx)(C,{className:`size-4 animate-spin`}):(0,z.jsx)(x,{className:`size-4`}),` Export`]}),(0,z.jsxs)(`button`,{type:`button`,onClick:()=>F.current?.click(),disabled:j||!w.trim(),className:`flex-1 inline-flex items-center justify-center gap-2 text-sm px-4 min-h-[44px] rounded-md border border-border bg-surface/50 hover:bg-surface text-text-primary disabled:opacity-60`,children:[j?(0,z.jsx)(C,{className:`size-4 animate-spin`}):(0,z.jsx)(b,{className:`size-4`}),` Import`]}),(0,z.jsx)(`input`,{ref:F,type:`file`,accept:`application/json,.json`,className:`hidden`,onChange:e=>{let t=e.target.files?.[0];t&&K(t)}})]})]}),g&&(0,z.jsxs)(`div`,{className:`border border-primary/40 bg-primary/10 rounded-md p-3 space-y-2 text-sm`,children:[(0,z.jsx)(`p`,{className:`text-text-primary`,children:`Enter this code to authorize:`}),(0,z.jsx)(`div`,{className:`font-mono text-lg tracking-widest text-text-primary`,children:g.userCode}),(0,z.jsxs)(`a`,{href:g.verificationUrl,target:`_blank`,rel:`noreferrer`,className:`inline-flex items-center gap-1 text-primary hover:underline text-xs`,children:[(0,z.jsx)(S,{className:`size-3`}),` `,g.verificationUrl]}),(0,z.jsxs)(`p`,{className:`text-xs text-text-subtle flex items-center gap-2`,children:[(0,z.jsx)(C,{className:`size-3 animate-spin`}),` Waiting for authorization…`]})]})]})}var ee=[{value:`low`,label:`Low`},{value:`medium`,label:`Medium`},{value:`high`,label:`High`},{value:`xhigh`,label:`Extra`},{value:`max`,label:`Max`}],te=[{value:`bypassPermissions`,label:`Bypass permissions (default)`},{value:`default`,label:`Ask before edits`},{value:`acceptEdits`,label:`Edit automatically`},{value:`plan`,label:`Plan mode`}],ne={claude:`Claude`,cursor:`Cursor`,codex:`Codex`,gemini:`Gemini`};function re({compact:e}={}){let[t,n]=(0,R.useState)(null),[r,i]=(0,R.useState)(``),[a,o]=(0,R.useState)([]),[s,c]=(0,R.useState)(!1),[l,u]=(0,R.useState)(!1),[d,f]=(0,R.useState)(null),[p,m]=(0,R.useState)(0);(0,R.useEffect)(()=>{N().then(e=>{n(e),i(e.default_provider??`claude`)}).catch(e=>f(e.message))},[]),(0,R.useEffect)(()=>{r&&(c(!0),D.get(`/api/settings/ai/providers/${r}/models`).then(o).catch(()=>o([])).finally(()=>c(!1)))},[r]);let h=t?Object.keys(t.providers).filter(e=>e!==`mock`).map(e=>({id:e,name:ne[e]??e})):[],g=t?.providers[r],_=g?.type===`agent-sdk`||!g?.type&&r===`claude`,v=async(e,i)=>{if(t){u(!0),f(null);try{n(await P({providers:{[r]:{[e]:i}}})),m(e=>e+1)}catch(e){f(e.message)}finally{u(!1)}}},y=e?`text-[11px]`:`text-sm`,b=e?`text-xs`:`text-sm`,x=e?`space-y-2`:`space-y-4`,S=e?`space-y-1.5`:`space-y-3`,C=e?`space-y-1`:`space-y-1.5`;if(!t)return(0,z.jsxs)(`div`,{className:S,children:[(0,z.jsx)(`h3`,{className:`${b} font-medium text-text-secondary`,children:`AI Settings`}),(0,z.jsx)(`p`,{className:`${y} text-text-subtle`,children:d?`Error: ${d}`:`Loading...`})]});let w=_?a:[{value:`__default__`,label:`Auto (default)`},...a];return(0,z.jsxs)(`div`,{className:x,children:[(0,z.jsx)(`h3`,{className:`${b} font-medium text-text-secondary`,children:`AI Settings`}),h.length>1&&(0,z.jsx)(`div`,{className:`flex gap-0.5 border-b border-border/50 -mx-1 px-1`,children:h.map(e=>(0,z.jsxs)(`button`,{onClick:()=>i(e.id),className:`flex items-center gap-1 px-2 py-1 text-[11px] rounded-t transition-colors ${r===e.id?`text-primary border-b-2 border-primary font-medium`:`text-text-subtle hover:text-text-secondary`}`,children:[(0,z.jsx)(X,{providerId:e.id}),(0,z.jsx)(`span`,{className:`capitalize`,children:e.name})]},e.id))}),(0,z.jsxs)(`div`,{className:S,children:[r===`codex`&&(0,z.jsx)($,{}),a.length>0&&(0,z.jsxs)(`div`,{className:C,children:[(0,z.jsx)(B,{htmlFor:`ai-model`,className:e?y:void 0,children:`Model`}),(0,z.jsxs)(V,{value:_?g?.model??a[0]?.value:g?.model||`__default__`,onValueChange:e=>v(`model`,e===`__default__`?void 0:e),disabled:s,children:[(0,z.jsx)(U,{id:`ai-model`,className:`w-full ${e?`h-7 text-[11px]`:``}`,children:(0,z.jsx)(H,{placeholder:s?`Loading models...`:`Select model`})}),(0,z.jsx)(W,{className:`max-h-[300px]`,children:w.map(e=>(0,z.jsx)(G,{value:e.value,children:e.label},e.value))})]})]}),_&&(0,z.jsxs)(z.Fragment,{children:[(0,z.jsxs)(`div`,{className:C,children:[(0,z.jsx)(B,{htmlFor:`ai-base-url`,className:e?y:void 0,children:`Base URL`}),(0,z.jsx)(j,{id:`ai-base-url`,type:`url`,defaultValue:g?.base_url??``,placeholder:`https://api.anthropic.com (default)`,className:e?`h-7 text-[11px]`:void 0,onBlur:e=>{v(`base_url`,e.target.value.trim()||void 0)}},`baseurl-${r}-${p}`)]}),(0,z.jsxs)(`div`,{className:C,children:[(0,z.jsx)(B,{htmlFor:`ai-api-key`,className:e?y:void 0,children:`API Key / Token`}),(0,z.jsx)(j,{id:`ai-api-key`,type:`password`,defaultValue:g?.api_key??``,placeholder:`sk-ant-... (optional, overrides accounts)`,className:e?`h-7 text-[11px] font-mono`:`font-mono`,onBlur:e=>{let t=e.target.value.trim();t.startsWith(`••••`)||v(`api_key`,t||void 0)}},`apikey-${r}-${p}`),(0,z.jsx)(`p`,{className:`${e?`text-[9px]`:`text-[11px]`} text-muted-foreground`,children:`Direct API key or OAuth token. Leave empty to use connected accounts.`})]}),(0,z.jsxs)(`div`,{className:C,children:[(0,z.jsx)(B,{htmlFor:`ai-effort`,className:e?y:void 0,children:`Effort`}),(0,z.jsxs)(V,{value:g?.effort??`high`,onValueChange:e=>v(`effort`,e),children:[(0,z.jsx)(U,{id:`ai-effort`,className:`w-full ${e?`h-7 text-[11px]`:``}`,children:(0,z.jsx)(H,{})}),(0,z.jsx)(W,{children:ee.map(e=>(0,z.jsx)(G,{value:e.value,children:e.label},e.value))})]})]}),(0,z.jsxs)(`div`,{className:C,children:[(0,z.jsx)(B,{htmlFor:`ai-max-turns`,className:e?y:void 0,children:`Max Turns (1-500)`}),(0,z.jsx)(j,{id:`ai-max-turns`,type:`number`,min:1,max:500,defaultValue:g?.max_turns??100,className:e?`h-7 text-[11px]`:void 0,onBlur:e=>{let t=parseInt(e.target.value);isNaN(t)||v(`max_turns`,t)}},`turns-${r}-${p}`)]}),(0,z.jsxs)(`div`,{className:C,children:[(0,z.jsx)(B,{htmlFor:`ai-budget`,className:e?y:void 0,children:`Max Budget (USD)`}),(0,z.jsx)(j,{id:`ai-budget`,type:`number`,step:.1,min:.01,max:50,defaultValue:g?.max_budget_usd??``,placeholder:`No limit`,className:e?`h-7 text-[11px]`:void 0,onBlur:e=>{let t=parseFloat(e.target.value);v(`max_budget_usd`,isNaN(t)?void 0:t)}},`budget-${r}-${p}`)]}),(0,z.jsxs)(`div`,{className:C,children:[(0,z.jsx)(B,{htmlFor:`ai-thinking`,className:e?y:void 0,children:`Thinking Budget (tokens)`}),(0,z.jsx)(j,{id:`ai-thinking`,type:`number`,min:0,defaultValue:g?.thinking_budget_tokens??``,placeholder:`Adaptive (model decides)`,className:e?`h-7 text-[11px]`:void 0,onBlur:e=>{let t=parseInt(e.target.value);v(`thinking_budget_tokens`,isNaN(t)?void 0:t)}},`thinking-${r}-${p}`)]}),(0,z.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,z.jsxs)(`div`,{children:[(0,z.jsx)(B,{htmlFor:`ai-agent-teams`,className:e?y:void 0,children:`Agent Teams`}),(0,z.jsx)(`p`,{className:`${e?`text-[9px]`:`text-[11px]`} text-muted-foreground`,children:`Experimental. Enables multi-agent collaboration with shared tasks and messaging. Uses ~7x more tokens.`})]}),(0,z.jsx)(M,{id:`ai-agent-teams`,checked:g?.agent_teams??!1,onCheckedChange:e=>v(`agent_teams`,e)})]}),g?.agent_teams&&(0,z.jsx)(ie,{compact:e}),(0,z.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,z.jsxs)(`div`,{children:[(0,z.jsx)(B,{htmlFor:`ai-context-1m`,className:e?y:void 0,children:`1M Context Window`}),(0,z.jsx)(`p`,{className:`${e?`text-[9px]`:`text-[11px]`} text-muted-foreground`,children:`Requires an entitled account (Max/Team/Enterprise) and an Opus 4 / Sonnet 4 model. Other accounts will error.`})]}),(0,z.jsx)(M,{id:`ai-context-1m`,checked:g?.context_1m??!1,onCheckedChange:e=>v(`context_1m`,e)})]}),(0,z.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,z.jsxs)(`div`,{children:[(0,z.jsx)(B,{htmlFor:`ai-inherit-mcp`,className:e?y:void 0,children:`Inherit Claude Code MCP`}),(0,z.jsx)(`p`,{className:`${e?`text-[9px]`:`text-[11px]`} text-muted-foreground`,children:`Auto-load MCP servers from Claude Code's ~/.claude.json (global + per-project). Your own MCP servers override inherited ones.`})]}),(0,z.jsx)(M,{id:`ai-inherit-mcp`,checked:g?.inherit_claude_mcp??!0,onCheckedChange:e=>v(`inherit_claude_mcp`,e)})]})]}),(0,z.jsxs)(`div`,{className:C,children:[(0,z.jsx)(B,{htmlFor:`ai-permission-mode`,className:e?y:void 0,children:`Default Permission Mode`}),(0,z.jsxs)(V,{value:g?.permission_mode??`bypassPermissions`,onValueChange:e=>v(`permission_mode`,e),children:[(0,z.jsx)(U,{id:`ai-permission-mode`,className:`w-full ${e?`h-7 text-[11px]`:``}`,children:(0,z.jsx)(H,{})}),(0,z.jsx)(W,{children:te.map(e=>(0,z.jsx)(G,{value:e.value,children:e.label},e.value))})]})]}),(0,z.jsxs)(`div`,{className:C,children:[(0,z.jsx)(B,{htmlFor:`ai-system-prompt`,className:e?y:void 0,children:`Additional Instructions`}),(0,z.jsx)(`textarea`,{id:`ai-system-prompt`,rows:e?3:4,defaultValue:g?.system_prompt??``,placeholder:`Enter additional instructions for ${r}...`,className:`w-full rounded-md border border-input bg-background px-3 py-2 ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 ${e?`text-[11px]`:`text-sm`}`,onBlur:e=>{v(`system_prompt`,e.target.value.trim()||void 0)}},`sysprompt-${r}-${p}`)]})]}),l&&(0,z.jsx)(`p`,{className:`text-xs text-text-subtle`,children:`Saving...`}),d&&(0,z.jsx)(`p`,{className:`text-xs text-error`,children:d})]})}function ie({compact:e}){let[t,n]=(0,R.useState)([]),[r,i]=(0,R.useState)(!1),[a,o]=(0,R.useState)(null),s=(0,R.useCallback)(async()=>{i(!0);try{n(await D.get(`/api/teams`)??[])}catch{}i(!1)},[]);(0,R.useEffect)(()=>{s()},[s]);let c=async e=>{try{await D.del(`/api/teams/${encodeURIComponent(e)}`),n(t=>t.filter(t=>t.name!==e)),o(null)}catch{}};return t.length===0&&!r?null:(0,z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,z.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,z.jsxs)(B,{className:e?`text-[11px]`:void 0,children:[`Teams (`,t.length,`)`]}),(0,z.jsx)(`button`,{onClick:s,className:`text-text-subtle hover:text-foreground p-1`,"aria-label":`Refresh teams`,children:(0,z.jsx)(w,{className:`size-3 ${r?`animate-spin`:``}`})})]}),t.map(e=>(0,z.jsxs)(`div`,{className:`flex items-center justify-between p-2 rounded bg-surface-elevated text-xs`,children:[(0,z.jsxs)(`div`,{className:`min-w-0`,children:[(0,z.jsx)(`div`,{className:`font-medium truncate`,children:e.name}),e.description&&(0,z.jsx)(`div`,{className:`text-text-subtle truncate`,children:e.description}),(0,z.jsxs)(`div`,{className:`text-text-subtle`,children:[e.members?.length??e.memberCount??0,` members`,e.createdAt?` · ${new Date(e.createdAt).toLocaleDateString()}`:``]})]}),a===e.name?(0,z.jsxs)(`div`,{className:`flex gap-1 shrink-0 ml-2`,children:[(0,z.jsx)(`button`,{onClick:()=>c(e.name),className:`px-2 py-1 bg-error text-white rounded text-[10px]`,children:`Delete`}),(0,z.jsx)(`button`,{onClick:()=>o(null),className:`px-2 py-1 bg-panel-2 text-text rounded text-[10px]`,children:`Cancel`})]}):(0,z.jsx)(`button`,{onClick:()=>o(e.name),className:`shrink-0 text-text-subtle hover:text-error p-1 ml-2`,"aria-label":`Delete team ${e.name}`,children:(0,z.jsx)(T,{className:`size-3.5`})})]},e.name))]})}export{W as a,H as c,I as d,F as f,V as i,B as l,X as n,G as o,Y as r,U as s,re as t,L as u};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./vendor-markdown-Ls5AcU91.js";import"./vendor-ui-CaeeFO0B.js";import{i as e,n as t}from"./api-client-BkGKTjsq.js";export{t as api,e as projectUrl};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./vendor-markdown-Ls5AcU91.js";import"./vendor-ui-CaeeFO0B.js";import"./api-client-BkGKTjsq.js";import{v as e}from"./api-settings-R59c66DE.js";export{e as updateDeviceName};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{K as e}from"./vendor-mermaid-CtDsSxbM.js";export{e as createArchitectureServices};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{o as e}from"./rolldown-runtime-FhOqtrmT.js";import{S as t,x as n}from"./vendor-markdown-Ls5AcU91.js";import"./vendor-ui-CaeeFO0B.js";import{t as r}from"./explorer-body-BxbSttfl.js";import"./context-menu-BpwUny-o.js";import"./use-coarse-long-press-BmI_GVW5.js";import"./api-client-BkGKTjsq.js";import"./vendor-mermaid-CtDsSxbM.js";import"./settings-store-BpcY5aYE.js";import"./portal-container-context-DSGdlXrJ.js";import"./panel-store-UWCH6B-_.js";import"./window-store-B5ZswdYg.js";import"./tab-store-D2thn4Vv.js";import"./file-store-m9crh6uq.js";import"./window-pip-registry-C7oz3Dfy.js";import"./use-is-mobile-DUuki97q.js";import"./button-DBSpDPS0.js";import"./dialog-RIpeb87v.js";import"./mobile-bottom-sheet-Cj1YBq-c.js";import"./use-visual-viewport-pVxLfE5B.js";import"./adaptive-context-menu-ChBZWLLq.js";import{J as i,lt as a,q as o}from"./index-H_gScEOk.js";var s=e(t(),1),c=n();function l({id:e,payload:t}){let{host:n,error:l}=i(),u=a(e=>e.discard);(0,s.useEffect)(()=>()=>u(e),[e,u]);let d=(typeof t?.path==`string`?t.path:``)||o()||n?.homedir||``;return d?(0,c.jsx)(r,{windowId:e,initialPath:d}):(0,c.jsx)(`div`,{className:`flex h-full items-center justify-center p-4 text-xs text-text-2`,children:l?`Could not reach the host: ${l}`:`Loading…`})}export{l as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{W as e}from"./vendor-mermaid-CtDsSxbM.js";export{e as createGitGraphServices};
|