@hienlh/ppm 0.20.5 → 0.20.7
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 +16 -0
- package/assets/skills/ppm/SKILL.md +1 -1
- package/assets/skills/ppm/references/cli-reference.md +4 -4
- package/assets/skills/ppm/references/http-api.md +1 -1
- package/dist/web/assets/{accounts-settings-section-Cmmozwer.js → accounts-settings-section-Df1KoGg7.js} +1 -1
- package/dist/web/assets/{ai-resource-editor-BlrWV3xU.js → ai-resource-editor-C6s6A57b.js} +1 -1
- package/dist/web/assets/ai-settings-section-BQTsEJzp.js +1 -0
- package/dist/web/assets/{ai-settings-section-dDsgddSt.js → ai-settings-section-CMIkIxZU.js} +1 -1
- package/dist/web/assets/{angular-html-BtJLNcMw.js → angular-html-K0aKyuHe.js} +1 -1
- package/dist/web/assets/{angular-ts-CQiu5F_W.js → angular-ts-CLY0DVNM.js} +1 -1
- package/dist/web/assets/{apl-CKZvgs-w.js → apl-Cl1oeOZc.js} +1 -1
- package/dist/web/assets/{appearance-settings-section-DRxziHFt.js → appearance-settings-section-B7CwHA7Y.js} +1 -1
- package/dist/web/assets/architecture-PBZL5I3N-CkWx_Sv3.js +1 -0
- package/dist/web/assets/{astro-D0b8ssLD.js → astro-S8gLldib.js} +1 -1
- package/dist/web/assets/{audio-preview-B4E5_7TW.js → audio-preview-C2PCzvr5.js} +1 -1
- package/dist/web/assets/{blade-DOIpINLw.js → blade-DZ96Anzi.js} +1 -1
- package/dist/web/assets/{bsl-CJ7_JlQ8.js → bsl-BrlZLefQ.js} +1 -1
- package/dist/web/assets/{cairo-5CpV2T1P.js → cairo-B0UdH8CG.js} +1 -1
- package/dist/web/assets/chat-tab-BJokwok-.js +15 -0
- package/dist/web/assets/click-outside-container-XmmmdSm7.js +1 -0
- package/dist/web/assets/{cobol-BreMVrtc.js → cobol-DCeQgIC6.js} +1 -1
- package/dist/web/assets/code-editor-BVyFjaoM.js +7 -0
- package/dist/web/assets/{coffee-D7DoKh5b.js → coffee-D3V0ISG7.js} +1 -1
- package/dist/web/assets/{conflict-editor-D9_sr59D.js → conflict-editor-hGsVMmtG.js} +1 -1
- package/dist/web/assets/{cpp-BnWeWAoE.js → cpp-UPgqRL5h.js} +1 -1
- package/dist/web/assets/{crystal-D2pJbFUn.js → crystal-B7BOJUR4.js} +1 -1
- package/dist/web/assets/{csv-preview-BMC8jnpF.js → csv-preview-DiSiq6UJ.js} +1 -1
- package/dist/web/assets/data-grid-overlay-editor-QyH_oklj.js +1 -0
- package/dist/web/assets/database-viewer-BWQMTwjf.js +1 -0
- package/dist/web/assets/{diff-viewer-B4PlZ1Dt.js → diff-viewer-Usuuf35X.js} +1 -1
- package/dist/web/assets/dist-CQbltjRp.js +11 -0
- package/dist/web/assets/{edge-aqGMtbY3.js → edge-Dw-s4XKj.js} +1 -1
- package/dist/web/assets/{edit-diff-preview-xdDQvPhs.js → edit-diff-preview-F7YlT9fY.js} +1 -1
- package/dist/web/assets/{elixir-CsYMBLc5.js → elixir-Dntyzyed.js} +1 -1
- package/dist/web/assets/{elm-BU8C2gFp.js → elm-C83eppJ0.js} +1 -1
- package/dist/web/assets/{erb-Z_E49ab8.js → erb-Bjv2Lozz.js} +1 -1
- package/dist/web/assets/{erlang-BRqOjXH9.js → erlang-5PAcE8_t.js} +1 -1
- package/dist/web/assets/esm-Brdy2Atb.js +2 -0
- package/dist/web/assets/{explorer-body-SvWDS84f.js → explorer-body-BL9hg1yr.js} +1 -1
- package/dist/web/assets/{explorer-window-content-DBHBTA7B.js → explorer-window-content-C3BSd4Qf.js} +1 -1
- package/dist/web/assets/{extension-manager-section-BSt5I_H8.js → extension-manager-section-CE0aB9ed.js} +1 -1
- package/dist/web/assets/{extension-webview-DBGMUU97.js → extension-webview-CGhuot2v.js} +1 -1
- package/dist/web/assets/{files-settings-section-0dwYLZou.js → files-settings-section-D_sgDKwF.js} +1 -1
- package/dist/web/assets/{fortran-fixed-form-CWbxmDGR.js → fortran-fixed-form-Di9Yw_ao.js} +1 -1
- package/dist/web/assets/{fsharp-DKMYbq6I.js → fsharp-IRAdAkHt.js} +1 -1
- package/dist/web/assets/{gdresource-B3yFau4V.js → gdresource-DVdwnvP-.js} +1 -1
- package/dist/web/assets/{general-settings-section-BgLy_6yj.js → general-settings-section-D7DMjoNj.js} +1 -1
- package/dist/web/assets/{git-commit-BW0p3Ekk.js → git-commit-CD6jLHvg.js} +1 -1
- package/dist/web/assets/{git-log-panel-BkgmcWk1.js → git-log-panel-prL5-n-F.js} +1 -1
- package/dist/web/assets/{git-rebase-DrvmQCS7.js → git-rebase-DvxNkg7t.js} +1 -1
- package/dist/web/assets/gitGraph-HDMCJU4V-BUlbZgyf.js +1 -0
- package/dist/web/assets/glide-data-grid-lbUFJwCD.js +141 -0
- package/dist/web/assets/{glimmer-js-BY1XApJJ.js → glimmer-js-aM9jbY2M.js} +1 -1
- package/dist/web/assets/{glimmer-ts-DPZtxF8N.js → glimmer-ts-Bd4jKeuF.js} +1 -1
- package/dist/web/assets/{glsl-DZ8G_Hvf.js → glsl-CUUtWNTx.js} +1 -1
- package/dist/web/assets/{graphql-Ck06uCZy.js → graphql-DkY6xCcc.js} +1 -1
- package/dist/web/assets/{group-chat-tab-Cy9zIynj.js → group-chat-tab-C4oY3IKi.js} +1 -1
- package/dist/web/assets/{hack-pLogDwAs.js → hack-DnaR9DJk.js} +1 -1
- package/dist/web/assets/{haml-CBqeCQ2A.js → haml-BDubxAIK.js} +1 -1
- package/dist/web/assets/{handlebars-B66JmVtp.js → handlebars-OxsbI1gt.js} +1 -1
- package/dist/web/assets/{html-Dk4wmfwC.js → html-Cjiwd8dp.js} +1 -1
- package/dist/web/assets/{html-derivative-CJWqfN51.js → html-derivative-CfzXt9Cs.js} +1 -1
- package/dist/web/assets/{http-CexhotTh.js → http-DRF6Wp6Y.js} +1 -1
- package/dist/web/assets/{hurl-BScKFk3Z.js → hurl-6SunVID_.js} +1 -1
- package/dist/web/assets/{hxml-DAle7vtu.js → hxml-CR72N708.js} +1 -1
- package/dist/web/assets/{image-preview-fuU4h2nr.js → image-preview-C7dCEQCx.js} +1 -1
- package/dist/web/assets/{index-DYGLdCpe.js → index-A3ripVe5.js} +6 -6
- package/dist/web/assets/{index-CuYtJ5xF.css → index-B9Wbjl0o.css} +1 -1
- package/dist/web/assets/info-3K5VOQVL-DXzjBxZf.js +1 -0
- package/dist/web/assets/{jinja-yHpyD80t.js → jinja-CYjAWnk3.js} +1 -1
- package/dist/web/assets/{jira-watcher-section-DRQx632s.js → jira-watcher-section-DvKEiqtb.js} +1 -1
- package/dist/web/assets/{jison-BY6WLJVu.js → jison-UERnq4ds.js} +1 -1
- package/dist/web/assets/{julia-Dd_iYQDT.js → julia-WAZzVFSs.js} +1 -1
- package/dist/web/assets/{just-BTuUKpxF.js → just-B1YYfl1D.js} +1 -1
- package/dist/web/assets/{keybindings-store-C2HZ1mT4.js → keybindings-store-BOJPwIOB.js} +1 -1
- package/dist/web/assets/{keyboard-shortcuts-section-WiZSZ-Wr.js → keyboard-shortcuts-section-CPsFUned.js} +1 -1
- package/dist/web/assets/{latex-Dt3OUlMZ.js → latex-B6zwM9GI.js} +1 -1
- package/dist/web/assets/{liquid-BxPJU2ix.js → liquid-n4OK-yxz.js} +1 -1
- package/dist/web/assets/{lua-DEGIvn7d.js → lua-DJYn-zFg.js} +1 -1
- package/dist/web/assets/{markdown-renderer-BFYBVcZP.js → markdown-renderer-C1KVXiXr.js} +3 -3
- package/dist/web/assets/{markdown-renderer-CklcWnd6.js → markdown-renderer-HPQE8ilD.js} +1 -1
- package/dist/web/assets/{marko-BDxwBJur.js → marko-C27Qtq0P.js} +1 -1
- package/dist/web/assets/{mdc-B8aXPTg7.js → mdc-CypKG7qW.js} +1 -1
- package/dist/web/assets/{mobile-explorer-sheet-D1OXw7op.js → mobile-explorer-sheet-DkvtLBgs.js} +1 -1
- package/dist/web/assets/{nextflow-DBVZnnT_.js → nextflow-DuRHA0PY.js} +1 -1
- package/dist/web/assets/{nginx-Crpyd-Do.js → nginx-vxFTb1fh.js} +1 -1
- package/dist/web/assets/{nim-BSqTBYDj.js → nim-ChQDNOKe.js} +1 -1
- package/dist/web/assets/{notification-store-DyKshGRs.js → notification-store-B1pBUO0W.js} +1 -1
- package/dist/web/assets/{notifications-settings-section-BEQEjvan.js → notifications-settings-section-CaQVTa3a.js} +1 -1
- package/dist/web/assets/{number-overlay-editor-DRjTIcPH.js → number-overlay-editor-HmOZ3ETg.js} +1 -1
- package/dist/web/assets/{overview-panel-DiiA3B_Z.js → overview-panel-CaU5AtCB.js} +1 -1
- package/dist/web/assets/packet-RMMSAZCW-DrX3I-bv.js +1 -0
- package/dist/web/assets/{pdf-preview-DmQazeeV.js → pdf-preview-QeXX_VpL.js} +1 -1
- package/dist/web/assets/{perl-BU0kbB-K.js → perl-BKH-mNmF.js} +1 -1
- package/dist/web/assets/{php-D9n1ikHN.js → php-W3oWF62o.js} +1 -1
- package/dist/web/assets/pie-UPGHQEXC-czhViDrP.js +1 -0
- package/dist/web/assets/postgres-viewer-DO50GwMs.js +3 -0
- package/dist/web/assets/{ppmbot-settings-section-PzCLPm8a.js → ppmbot-settings-section-B_00Zb-K.js} +1 -1
- package/dist/web/assets/{process-table-C2TdkJck.js → process-table-DweR4FR3.js} +1 -1
- package/dist/web/assets/{proxy-settings-section-DsZ6KcHD.js → proxy-settings-section-sGhA3t_m.js} +1 -1
- package/dist/web/assets/{pug-BOpaczDr.js → pug-DscH2YvH.js} +1 -1
- package/dist/web/assets/{qml-B-cQXhrg.js → qml-CbBrfy74.js} +1 -1
- package/dist/web/assets/{query-audit-section-2eX9-6mO.js → query-audit-section-BtqND9WE.js} +1 -1
- package/dist/web/assets/radar-KQ55EAFF-BAHP0n2V.js +1 -0
- package/dist/web/assets/{razor-DFB0pNCh.js → razor-_oKX4NEv.js} +1 -1
- package/dist/web/assets/remote-desktop-mobile-sheet-DMn2uDXn.js +2 -0
- package/dist/web/assets/{remote-desktop-mobile-view-Bw6p5ikf.js → remote-desktop-mobile-view-xlO-gk_f.js} +1 -1
- package/dist/web/assets/{remote-desktop-readiness-gate-W0lAhHq9.js → remote-desktop-readiness-gate-BmyUd1vt.js} +1 -1
- package/dist/web/assets/{remote-desktop-window-content-P888YEqm.js → remote-desktop-window-content-BaPixhFs.js} +1 -1
- package/dist/web/assets/{rst-DAXedsgm.js → rst-C3yqfWYA.js} +1 -1
- package/dist/web/assets/{ruby-BCO4polC.js → ruby-BaanPyyv.js} +1 -1
- package/dist/web/assets/{sas-DfB5dcFC.js → sas-DQg1FY8E.js} +1 -1
- package/dist/web/assets/{schedules-settings-section-C8YDAxlo.js → schedules-settings-section-Ctu9STMV.js} +1 -1
- package/dist/web/assets/{scss-BknIVgn7.js → scss-N-LxVilh.js} +1 -1
- package/dist/web/assets/{settings-body-B5v3_Tnb.js → settings-body-B0ZdO6qx.js} +2 -2
- package/dist/web/assets/{settings-store-CzLnTR8p.js → settings-store-Bsu_5zIU.js} +2 -2
- package/dist/web/assets/settings-tab-BQvukPz5.js +1 -0
- package/dist/web/assets/{settings-window-content-BIosR7RY.js → settings-window-content-DUmULFsq.js} +1 -1
- package/dist/web/assets/{shaderlab-CPu31TpY.js → shaderlab-BShqbudx.js} +1 -1
- package/dist/web/assets/{shellsession-CFX4c_TM.js → shellsession-B8_nNEok.js} +1 -1
- package/dist/web/assets/{soy-rz9hilgm.js → soy-CW5oqa-M.js} +1 -1
- package/dist/web/assets/{sparql-Bo8ZDeqE.js → sparql-BJFHPosZ.js} +1 -1
- package/dist/web/assets/{sql-query-editor-DMihDPnw.js → sql-query-editor-DPtExW0C.js} +1 -1
- package/dist/web/assets/sqlite-viewer-DkzvIzyG.js +1 -0
- package/dist/web/assets/{stata-B5J-QMyE.js → stata-twP3WAnN.js} +1 -1
- package/dist/web/assets/{surrealql-Caw1ADnG.js → surrealql-CqwoQxwG.js} +1 -1
- package/dist/web/assets/{svelte-D3oMVcxz.js → svelte-CoTGkG7y.js} +1 -1
- package/dist/web/assets/{system-monitor-body-IUamfS5w.js → system-monitor-body-Bfx7yImc.js} +2 -2
- package/dist/web/assets/system-monitor-tab-Bn7sDAiO.js +1 -0
- package/dist/web/assets/{system-monitor-window-content-Bq3BS7Mg.js → system-monitor-window-content-DVwdAvly.js} +1 -1
- package/dist/web/assets/{tab-host-window-content-vfYLLIKU.js → tab-host-window-content-By35Ri11.js} +1 -1
- package/dist/web/assets/team-member-sheet-B8vZnJrJ.js +2 -0
- package/dist/web/assets/{team-member-window-content-D5cYZzBq.js → team-member-window-content-2_P22CXN.js} +1 -1
- package/dist/web/assets/{templ-BAdNyIOL.js → templ-BSuNrgD0.js} +1 -1
- package/dist/web/assets/{terminal-tab-C89DQllY.js → terminal-tab-DqAZMwhA.js} +1 -1
- package/dist/web/assets/{tex-IQ8mELOR.js → tex-DTdKTZSa.js} +1 -1
- package/dist/web/assets/{tool-cards-CWotDH_2.js → tool-cards-CiCZqw1w.js} +3 -3
- package/dist/web/assets/treemap-KZPCXAKY-DL_-JS7u.js +1 -0
- package/dist/web/assets/{ts-tags-D1DDO2jl.js → ts-tags-jpjff8fb.js} +1 -1
- package/dist/web/assets/{twig-C8Fd5RvV.js → twig-Utgjq3Am.js} +1 -1
- package/dist/web/assets/{use-accounts-data-lmmmG4ep.js → use-accounts-data-DMQAUXSO.js} +1 -1
- package/dist/web/assets/{use-monaco-theme-0ziS4xlp.js → use-monaco-theme-Ck1i7NEe.js} +1 -1
- package/dist/web/assets/{use-remote-desktop-display-choice-qBZ8ej7J.js → use-remote-desktop-display-choice-DVDOUQg2.js} +1 -1
- package/dist/web/assets/use-websocket-BkBvJbEt.js +1 -0
- package/dist/web/assets/{vendor-mermaid-CfY1-PkA.js → vendor-mermaid-CXxglerV.js} +193 -193
- package/dist/web/assets/{video-preview-B8xALVkh.js → video-preview-DzzFr0gI.js} +1 -1
- package/dist/web/assets/{vue-EvccXlkP.js → vue-CUms54DI.js} +1 -1
- package/dist/web/assets/{vue-html-Dg0xUJCh.js → vue-html-D7fbWTZW.js} +1 -1
- package/dist/web/assets/{vue-vine-BdrMg72k.js → vue-vine-BontZ1iR.js} +1 -1
- package/dist/web/assets/{xml-MmDclzxK.js → xml-CVHJ-Tda.js} +1 -1
- package/dist/web/assets/{xsl-DQEFs6Dd.js → xsl-BUDXwDuV.js} +1 -1
- package/dist/web/index.html +25 -25
- package/dist/web/sw.js +1 -1
- package/docs/architecture/ai-chat-and-providers.md +92 -0
- package/package.json +1 -1
- package/schemas/ppm-config.schema.json +18 -1
- package/src/providers/claude-agent-sdk.ts +21 -13
- package/src/providers/cli-provider-base.ts +3 -1
- package/src/providers/codex-app-server/codex-history.ts +5 -3
- package/src/providers/codex-app-server/codex-provider.ts +16 -2
- package/src/providers/codex-app-server/codex-rollout-header.ts +2 -1
- package/src/providers/cursor-cli/cursor-history.ts +4 -2
- package/src/server/routes/settings.ts +15 -1
- package/src/server/ws/chat.ts +2 -2
- package/src/services/chat.service.ts +95 -2
- package/src/services/codex-native-memory.ts +66 -0
- package/src/services/db.service.ts +18 -4
- package/src/services/jsonl-transcript-parser.ts +2 -1
- package/src/services/provider-shared-context.ts +152 -0
- package/src/shared/provider-context.ts +13 -0
- package/src/types/chat.ts +6 -0
- package/src/types/config.ts +29 -0
- package/src/web/components/chat/chat-history-bar.tsx +6 -3
- package/src/web/components/chat/chat-tab.tsx +7 -0
- package/src/web/components/settings/ai-settings-section.tsx +34 -5
- package/src/web/components/settings/codex-context-settings.tsx +100 -0
- package/src/web/hooks/use-chat.ts +75 -14
- package/src/web/hooks/use-websocket.ts +20 -7
- package/src/web/lib/api-settings.ts +3 -0
- package/src/web/lib/ws-client.ts +55 -4
- package/.release-bin/zip +0 -15
- package/.release-node-shim.sh +0 -11
- package/dist/web/assets/ai-settings-section-PaEh_o0w.js +0 -1
- package/dist/web/assets/architecture-PBZL5I3N-DfR8k8Bc.js +0 -1
- package/dist/web/assets/chat-tab-MNuc18Os.js +0 -15
- package/dist/web/assets/code-editor-DYkmDRRF.js +0 -7
- package/dist/web/assets/data-grid-overlay-editor-CbBkhhJa.js +0 -1
- package/dist/web/assets/data-grid-types-DeY60CLU.js +0 -1
- package/dist/web/assets/database-viewer-Box3z5-Q.js +0 -1
- package/dist/web/assets/dist-BKOM_AoT.js +0 -11
- package/dist/web/assets/esm-B-vXxHUd.js +0 -2
- package/dist/web/assets/gitGraph-HDMCJU4V-CPd78aaT.js +0 -1
- package/dist/web/assets/glide-data-grid-CZVu-zCw.js +0 -141
- package/dist/web/assets/info-3K5VOQVL-BciNds6R.js +0 -1
- package/dist/web/assets/packet-RMMSAZCW-ClD3l2Bs.js +0 -1
- package/dist/web/assets/pie-UPGHQEXC-PU6kD0rW.js +0 -1
- package/dist/web/assets/postgres-viewer-Cd_wXjkT.js +0 -3
- package/dist/web/assets/radar-KQ55EAFF-4LzjL0Zt.js +0 -1
- package/dist/web/assets/remote-desktop-mobile-sheet-CMXSUcAN.js +0 -2
- package/dist/web/assets/settings-tab-CauShulf.js +0 -1
- package/dist/web/assets/sqlite-viewer-jCIGt2GP.js +0 -1
- package/dist/web/assets/system-monitor-tab-DaWeif4k.js +0 -1
- package/dist/web/assets/team-member-sheet-Be7OSGMT.js +0 -2
- package/dist/web/assets/treemap-KZPCXAKY-DiumLNMg.js +0 -1
- package/dist/web/assets/use-websocket-DAvfbjxh.js +0 -1
- /package/dist/web/assets/{abap-D-o-bvtI.js → abap-BGbkXtK3.js} +0 -0
- /package/dist/web/assets/{actionscript-3-D2tIzAm8.js → actionscript-3-CTWUcAG5.js} +0 -0
- /package/dist/web/assets/{ada-DxatBcxS.js → ada-2xQ2Am_-.js} +0 -0
- /package/dist/web/assets/{andromeeda-D0LK9YJ3.js → andromeeda-DfXLrHKa.js} +0 -0
- /package/dist/web/assets/{apache-B7uMPNiW.js → apache-CBLZGsyo.js} +0 -0
- /package/dist/web/assets/{apex-B7GiXrAr.js → apex-UYnVUoc7.js} +0 -0
- /package/dist/web/assets/{api-settings-D18Q4Ocp.js → api-settings-ClKLkiR9.js} +0 -0
- /package/dist/web/assets/{api-themes-sSv-6OLk.js → api-themes-B_Za9tdP.js} +0 -0
- /package/dist/web/assets/{applescript-D_SIFkKe.js → applescript-9me9Xoqf.js} +0 -0
- /package/dist/web/assets/{ara-C3iECgdg.js → ara-CHhiJzie.js} +0 -0
- /package/dist/web/assets/{asciidoc-gc8z_MMY.js → asciidoc-CKk0H4sD.js} +0 -0
- /package/dist/web/assets/{asm-27qeoPOI.js → asm-CVc_SeQB.js} +0 -0
- /package/dist/web/assets/{aurora-x-C5J9fWe1.js → aurora-x-BRYBKvUk.js} +0 -0
- /package/dist/web/assets/{awk-B7GBzF92.js → awk-BsBtss7k.js} +0 -0
- /package/dist/web/assets/{ayu-dark-XlnQhuLL.js → ayu-dark-x3ChmRrr.js} +0 -0
- /package/dist/web/assets/{ayu-light-DKLLilkU.js → ayu-light-DUbhGec6.js} +0 -0
- /package/dist/web/assets/{ayu-mirage-Dv-XOprJ.js → ayu-mirage-Bc9Dyu4v.js} +0 -0
- /package/dist/web/assets/{ballerina-DACRT-sT.js → ballerina-B0CV6yyC.js} +0 -0
- /package/dist/web/assets/{bat-BlQCq2XE.js → bat-BmukVhcd.js} +0 -0
- /package/dist/web/assets/{beancount-DYDztRI0.js → beancount-DfRKW4qX.js} +0 -0
- /package/dist/web/assets/{berry-BE5YKqvx.js → berry-BXO-GbOz.js} +0 -0
- /package/dist/web/assets/{bibtex-CAm7mgEm.js → bibtex-BIMgGN81.js} +0 -0
- /package/dist/web/assets/{bicep-BKgAbfVa.js → bicep-CIaj_N_V.js} +0 -0
- /package/dist/web/assets/{bird2-yrBNbW1G.js → bird2-Ca5CJ-1r.js} +0 -0
- /package/dist/web/assets/{c-txZFr4RM.js → c-BgN-FzVO.js} +0 -0
- /package/dist/web/assets/{c3-D_DrzBUd.js → c3-B366g85t.js} +0 -0
- /package/dist/web/assets/{cadence-CUFCEgG9.js → cadence-BDCY3xvX.js} +0 -0
- /package/dist/web/assets/{can-open-in-ppm-_yqa69dV.js → can-open-in-ppm-DyFXJvuW.js} +0 -0
- /package/dist/web/assets/{catppuccin-frappe-Dn32MuhA.js → catppuccin-frappe-C2dWlEOM.js} +0 -0
- /package/dist/web/assets/{catppuccin-latte-Dewo7yDf.js → catppuccin-latte-B6AgUzC2.js} +0 -0
- /package/dist/web/assets/{catppuccin-macchiato-D8WOWZeo.js → catppuccin-macchiato-D2r_sUYa.js} +0 -0
- /package/dist/web/assets/{catppuccin-mocha-b0md48XM.js → catppuccin-mocha-CCJOmGcr.js} +0 -0
- /package/dist/web/assets/{clarity-Ct3UqLBj.js → clarity-7c_yM38y.js} +0 -0
- /package/dist/web/assets/{clojure-CwP5aPEo.js → clojure-Cx30u1gg.js} +0 -0
- /package/dist/web/assets/{cmake-D5RF49e5.js → cmake-D8nfcw9r.js} +0 -0
- /package/dist/web/assets/{codeowners-Cl5897L_.js → codeowners-z9VeFgy0.js} +0 -0
- /package/dist/web/assets/{codeql-BKh1RCg0.js → codeql-DXYEc0p7.js} +0 -0
- /package/dist/web/assets/{common-lisp-BhHuD6t0.js → common-lisp-QB2DYRB7.js} +0 -0
- /package/dist/web/assets/{coq-Dco3qwD8.js → coq-DC4-vZSI.js} +0 -0
- /package/dist/web/assets/{csharp-Dpjw9ZA9.js → csharp-iBJcXIuz.js} +0 -0
- /package/dist/web/assets/{css-CPe4cabH.js → css-DzLteUnC.js} +0 -0
- /package/dist/web/assets/{csv-parser-DbxGKdMG.js → csv-parser-0OmrzV4G.js} +0 -0
- /package/dist/web/assets/{csv-BAcTN8Kt.js → csv-plVZ5iV_.js} +0 -0
- /package/dist/web/assets/{cue-Cr6y60TA.js → cue-MFyM4FwJ.js} +0 -0
- /package/dist/web/assets/{cypher-DWtqXXFP.js → cypher-BmV76dTw.js} +0 -0
- /package/dist/web/assets/{d-BASiTZk4.js → d-CukQ97B6.js} +0 -0
- /package/dist/web/assets/{dark-plus-56kmnrcl.js → dark-plus-BDhlhnd-.js} +0 -0
- /package/dist/web/assets/{dart-C5mZnjoE.js → dart-BEDiNp89.js} +0 -0
- /package/dist/web/assets/{dax-B4I2e7d8.js → dax-CKMJPpmb.js} +0 -0
- /package/dist/web/assets/{desktop-DekGg0BT.js → desktop-CjjGerHK.js} +0 -0
- /package/dist/web/assets/{diff-CWnJBd73.js → diff-CuRWQEJk.js} +0 -0
- /package/dist/web/assets/{dist-B0J2eYBz.js → dist-BuUB-Gou.js} +0 -0
- /package/dist/web/assets/{docker-DevchDxK.js → docker-BzeqNwXY.js} +0 -0
- /package/dist/web/assets/{docx-preview-Xy7SZ7Vf.js → docx-preview-Dg8lD3f3.js} +0 -0
- /package/dist/web/assets/{dotenv-DCvtdaGJ.js → dotenv-maAByz4s.js} +0 -0
- /package/dist/web/assets/{dracula-8U6Vkk3l.js → dracula-BK-58eQL.js} +0 -0
- /package/dist/web/assets/{dracula-soft-Bfeew5Wg.js → dracula-soft-BiBFiJ4B.js} +0 -0
- /package/dist/web/assets/{dream-maker-DDTJVuoy.js → dream-maker-SLz866k9.js} +0 -0
- /package/dist/web/assets/{emacs-lisp-CEHJqI4m.js → emacs-lisp-DVVSBvYb.js} +0 -0
- /package/dist/web/assets/{everforest-dark-CHHLt7cq.js → everforest-dark-B3wCaZGh.js} +0 -0
- /package/dist/web/assets/{everforest-light-TcTbK1sM.js → everforest-light-BOv6DEcT.js} +0 -0
- /package/dist/web/assets/{fennel-Bh4vsA1A.js → fennel-mxeAVgSR.js} +0 -0
- /package/dist/web/assets/{fish-D0T0fILG.js → fish-CNPEh-7O.js} +0 -0
- /package/dist/web/assets/{fluent-CgXDXdyy.js → fluent-DzjF371g.js} +0 -0
- /package/dist/web/assets/{format-bytes-Bc6SqF7M.js → format-bytes-BxBoqnS1.js} +0 -0
- /package/dist/web/assets/{fortran-free-form-CUg3Xhz4.js → fortran-free-form-BwcDAA-k.js} +0 -0
- /package/dist/web/assets/{gdscript-Cx056p_k.js → gdscript-Dw53oyoq.js} +0 -0
- /package/dist/web/assets/{gdshader-Dj1qP4I5.js → gdshader-Ch4uX8TL.js} +0 -0
- /package/dist/web/assets/{genie-SBt15wn7.js → genie-BmyA3sav.js} +0 -0
- /package/dist/web/assets/{gherkin-bTJiHIrB.js → gherkin-TJfGbfw6.js} +0 -0
- /package/dist/web/assets/{github-dark-BOPhyugs.js → github-dark-DfjGEBZm.js} +0 -0
- /package/dist/web/assets/{github-dark-default-Cktqe6NF.js → github-dark-default-C05CO5WG.js} +0 -0
- /package/dist/web/assets/{github-dark-dimmed-CeWfII_B.js → github-dark-dimmed-tc58hIbY.js} +0 -0
- /package/dist/web/assets/{github-dark-high-contrast-CTx8LpdV.js → github-dark-high-contrast-Cbjouhax.js} +0 -0
- /package/dist/web/assets/{github-light-DVsO5Un1.js → github-light-DyPx5kxT.js} +0 -0
- /package/dist/web/assets/{github-light-default-BiyPxicr.js → github-light-default-CwQhvvq0.js} +0 -0
- /package/dist/web/assets/{github-light-high-contrast-BPlnke0a.js → github-light-high-contrast-BSEfGuGA.js} +0 -0
- /package/dist/web/assets/{gleam-CWSxvD0C.js → gleam-CO9BliEd.js} +0 -0
- /package/dist/web/assets/{gn-D7NUVJuv.js → gn-3w7c2jXR.js} +0 -0
- /package/dist/web/assets/{gnuplot-c5uXmJKc.js → gnuplot-B9V8Da0h.js} +0 -0
- /package/dist/web/assets/{go-CRsHi4Cw.js → go-DZFS3BH_.js} +0 -0
- /package/dist/web/assets/{groovy-DpV0RA5r.js → groovy-BoXoCYbJ.js} +0 -0
- /package/dist/web/assets/{gruvbox-dark-hard-DD9fguUN.js → gruvbox-dark-hard-PlwQadvn.js} +0 -0
- /package/dist/web/assets/{gruvbox-dark-medium-BvcwpYJ-.js → gruvbox-dark-medium-BCuSx7jF.js} +0 -0
- /package/dist/web/assets/{gruvbox-dark-soft-48dCxX9M.js → gruvbox-dark-soft-BxNVGg5m.js} +0 -0
- /package/dist/web/assets/{gruvbox-light-hard-CjJ994Ip.js → gruvbox-light-hard-Caj_mHvE.js} +0 -0
- /package/dist/web/assets/{gruvbox-light-medium-DQJQZ_rV.js → gruvbox-light-medium-BbWauaVM.js} +0 -0
- /package/dist/web/assets/{gruvbox-light-soft-AqsC9mKw.js → gruvbox-light-soft-sTtAiBhF.js} +0 -0
- /package/dist/web/assets/{haskell-B5V7yvmh.js → haskell-DdAcCutT.js} +0 -0
- /package/dist/web/assets/{haxe-LWTKfPKr.js → haxe-CAaBQSbQ.js} +0 -0
- /package/dist/web/assets/{hcl-QmNZdAtI.js → hcl-D1Y6h8Ni.js} +0 -0
- /package/dist/web/assets/{hjson-CboJsAzK.js → hjson-C7gAy4J-.js} +0 -0
- /package/dist/web/assets/{hlsl-Bd-DO_WL.js → hlsl-BLCpvTDs.js} +0 -0
- /package/dist/web/assets/{horizon-CU8Bi_ss.js → horizon-A4TcfP_V.js} +0 -0
- /package/dist/web/assets/{horizon-bright-iSQ3_3jP.js → horizon-bright-D4gSyLkJ.js} +0 -0
- /package/dist/web/assets/{houston-CTXv3Puz.js → houston-B57jZ5OJ.js} +0 -0
- /package/dist/web/assets/{hy-Cd4hTidD.js → hy-C-_Ikdzx.js} +0 -0
- /package/dist/web/assets/{image-gallery-J8h8IY0c.js → image-gallery-DZFo6X0Q.js} +0 -0
- /package/dist/web/assets/{imba-BipCHEY2.js → imba-BwypdGq0.js} +0 -0
- /package/dist/web/assets/{ini-Dd1KkMrB.js → ini-DFC2fVTV.js} +0 -0
- /package/dist/web/assets/{java-rGr0OQD8.js → java-K2R-OeI_.js} +0 -0
- /package/dist/web/assets/{javascript-DHhCH2TN.js → javascript-Dwc_x-Qy.js} +0 -0
- /package/dist/web/assets/{json-CMMLBCUf.js → json-BWJ0jCOR.js} +0 -0
- /package/dist/web/assets/{json5-mPOwTOsB.js → json5-CyjYMs2j.js} +0 -0
- /package/dist/web/assets/{jsonc-Bie0E6D3.js → jsonc-DpY-971T.js} +0 -0
- /package/dist/web/assets/{jsonl-CpqHmtC1.js → jsonl-MOid1Cv5.js} +0 -0
- /package/dist/web/assets/{jsonnet-D21Ms51e.js → jsonnet-C8r7u8hK.js} +0 -0
- /package/dist/web/assets/{jssm-BXnl1nur.js → jssm-aiVzgRKq.js} +0 -0
- /package/dist/web/assets/{jsx-Chnii_vB.js → jsx-BouDi2uL.js} +0 -0
- /package/dist/web/assets/{kanagawa-dragon-DhxR0UjL.js → kanagawa-dragon-BDBacW42.js} +0 -0
- /package/dist/web/assets/{kanagawa-lotus-fupRg5wp.js → kanagawa-lotus-Bjc_h4S5.js} +0 -0
- /package/dist/web/assets/{kanagawa-wave-DSWbRS9M.js → kanagawa-wave-h12w2GK-.js} +0 -0
- /package/dist/web/assets/{kdl-DirGHqUy.js → kdl-By4Gal6E.js} +0 -0
- /package/dist/web/assets/{kotlin-DkhUVMDC.js → kotlin-BaieUpjq.js} +0 -0
- /package/dist/web/assets/{kusto-DU7OpovF.js → kusto-bFewy_Sb.js} +0 -0
- /package/dist/web/assets/{laserwave-iLKb1ZCT.js → laserwave-DpFhqINu.js} +0 -0
- /package/dist/web/assets/{lean-Cuvh_QAP.js → lean-DDn2i30H.js} +0 -0
- /package/dist/web/assets/{less-B5tQZOdI.js → less-DtaLKtJv.js} +0 -0
- /package/dist/web/assets/{lib-el9rA30D.js → lib-Bss7BrXJ.js} +0 -0
- /package/dist/web/assets/{libesm-CdttTIAd.js → libesm-DJd6dkYL.js} +0 -0
- /package/dist/web/assets/{light-plus-DiHU2KL5.js → light-plus-BiMMZ8in.js} +0 -0
- /package/dist/web/assets/{llvm-sCBTKCKN.js → llvm-BI0xMYjk.js} +0 -0
- /package/dist/web/assets/{log-DtyR34Ie.js → log-BDnXCvPh.js} +0 -0
- /package/dist/web/assets/{logo-CP91aQyG.js → logo-DeOTbfcP.js} +0 -0
- /package/dist/web/assets/{luau-nfGo2ulP.js → luau-C8pWPPhP.js} +0 -0
- /package/dist/web/assets/{make-XbDn9GHe.js → make-Du6n4Vqb.js} +0 -0
- /package/dist/web/assets/{markdown-BB1_3xLr.js → markdown-CQOwzr1d.js} +0 -0
- /package/dist/web/assets/{material-theme-CIx_sxAy.js → material-theme-V1uvvG3T.js} +0 -0
- /package/dist/web/assets/{material-theme-darker-DsQeueDD.js → material-theme-darker-YOeOea0A.js} +0 -0
- /package/dist/web/assets/{material-theme-lighter-x_lMi74j.js → material-theme-lighter-gsPcqGZh.js} +0 -0
- /package/dist/web/assets/{material-theme-ocean-Bkgh25P8.js → material-theme-ocean-DXpcGhUO.js} +0 -0
- /package/dist/web/assets/{material-theme-palenight-CoOjdbti.js → material-theme-palenight-CuXKc4Kv.js} +0 -0
- /package/dist/web/assets/{matlab-D6xZas_8.js → matlab-DKfAoKWM.js} +0 -0
- /package/dist/web/assets/{mdx-Cl5_YNoz.js → mdx-B3lHrBfA.js} +0 -0
- /package/dist/web/assets/{media-url-BMeBaB0q.js → media-url-TGgkntUW.js} +0 -0
- /package/dist/web/assets/{mermaid-8Eow4jz_.js → mermaid-aFxjKRiq.js} +0 -0
- /package/dist/web/assets/{min-dark-D4DhjgRE.js → min-dark-z_K9sY1g.js} +0 -0
- /package/dist/web/assets/{min-light-DzAckd0t.js → min-light-CKEPOwP-.js} +0 -0
- /package/dist/web/assets/{mipsasm-zI_zu0tj.js → mipsasm-Czl4687V.js} +0 -0
- /package/dist/web/assets/{mojo-DQnGGPHf.js → mojo-XEmb6dMz.js} +0 -0
- /package/dist/web/assets/{monokai-CrFoD2VD.js → monokai-CeewfP-T.js} +0 -0
- /package/dist/web/assets/{moonbit-DdphIGs6.js → moonbit-BFs6rC9o.js} +0 -0
- /package/dist/web/assets/{move-BUlkn0xW.js → move-Dru-OXAq.js} +0 -0
- /package/dist/web/assets/{narrat-CbOBdtCn.js → narrat-C6i2yGbz.js} +0 -0
- /package/dist/web/assets/{nextflow-groovy-CeVLUTuQ.js → nextflow-groovy-CNbSHaJ-.js} +0 -0
- /package/dist/web/assets/{night-owl-Bm4LhUR1.js → night-owl-XXoqvAPs.js} +0 -0
- /package/dist/web/assets/{night-owl-light-DtcBiMEf.js → night-owl-light-Dm8251t1.js} +0 -0
- /package/dist/web/assets/{nix-DrdwQ70g.js → nix-DUvtyLsY.js} +0 -0
- /package/dist/web/assets/{nord-B0Head1v.js → nord-DapQODEA.js} +0 -0
- /package/dist/web/assets/{nushell-CmUdltKn.js → nushell-WDWgg9A2.js} +0 -0
- /package/dist/web/assets/{objective-c-BGDR33XN.js → objective-c-Dg6Li1Kw.js} +0 -0
- /package/dist/web/assets/{objective-cpp-Buc1Zhd0.js → objective-cpp-DLTQ4Pyg.js} +0 -0
- /package/dist/web/assets/{ocaml-xdzl9rRD.js → ocaml-gH2M-t6b.js} +0 -0
- /package/dist/web/assets/{odin-DiUFngnd.js → odin-BBj0SPaN.js} +0 -0
- /package/dist/web/assets/{one-dark-pro-BURxmIp3.js → one-dark-pro-C8irccD3.js} +0 -0
- /package/dist/web/assets/{one-light-BMRMInAj.js → one-light-THMntV-R.js} +0 -0
- /package/dist/web/assets/{openscad-DAgLA5J3.js → openscad-BEjRF8ZV.js} +0 -0
- /package/dist/web/assets/{pascal-CoDZxcRB.js → pascal-C7Kr1uH_.js} +0 -0
- /package/dist/web/assets/{pkl-DzKM6BuM.js → pkl-CBAaOrr-.js} +0 -0
- /package/dist/web/assets/{plastic-vF15LmNS.js → plastic-B1qtUEVU.js} +0 -0
- /package/dist/web/assets/{plsql-C1v07teA.js → plsql-KzVm4VQQ.js} +0 -0
- /package/dist/web/assets/{po-CLLC8BuA.js → po-BDthh1AB.js} +0 -0
- /package/dist/web/assets/{poimandres-Uq0xysxM.js → poimandres-DIsV0oVO.js} +0 -0
- /package/dist/web/assets/{polar-2-luY1Pc.js → polar-HfZSDZob.js} +0 -0
- /package/dist/web/assets/{postcss-lbFhe0rz.js → postcss-D2mpQWcD.js} +0 -0
- /package/dist/web/assets/{powerquery-RL8O9Wie.js → powerquery-BmWOahNZ.js} +0 -0
- /package/dist/web/assets/{powershell-upFWhb-b.js → powershell-DuBkKB6U.js} +0 -0
- /package/dist/web/assets/{prisma-DBtYaWFk.js → prisma-DMOCr8t3.js} +0 -0
- /package/dist/web/assets/{prolog-D8jSMykJ.js → prolog-OntlFpI5.js} +0 -0
- /package/dist/web/assets/{proto-BM4eadF7.js → proto-kD5tYlX3.js} +0 -0
- /package/dist/web/assets/{puppet-BQDQ3Snu.js → puppet-CO4XS5MF.js} +0 -0
- /package/dist/web/assets/{purescript-Cj2aTX4s.js → purescript-D_e2LzQx.js} +0 -0
- /package/dist/web/assets/{python-BYpqq6u4.js → python-BcK-Cw6k.js} +0 -0
- /package/dist/web/assets/{qmldir-4uiTcwAu.js → qmldir-B-9b87fC.js} +0 -0
- /package/dist/web/assets/{qss-D5xB-Mqo.js → qss-hWjUDAxi.js} +0 -0
- /package/dist/web/assets/{r-P6Ujy8rf.js → r-D0sNqudq.js} +0 -0
- /package/dist/web/assets/{racket-COKgCFuM.js → racket-9cjYYXcq.js} +0 -0
- /package/dist/web/assets/{raku-z14Q9i7K.js → raku-ntPupo_R.js} +0 -0
- /package/dist/web/assets/{red-ObAvgvQ5.js → red-D814sEjX.js} +0 -0
- /package/dist/web/assets/{reg-Qv4f0JFA.js → reg-bPzNEQh4.js} +0 -0
- /package/dist/web/assets/{regexp-CEOVGIzy.js → regexp-B_zg64Ge.js} +0 -0
- /package/dist/web/assets/{rel-cWOyTUwd.js → rel-CoB0Qjm-.js} +0 -0
- /package/dist/web/assets/{riscv-BZDwx-lv.js → riscv-DcVTEi_B.js} +0 -0
- /package/dist/web/assets/{ron-BpjosPS0.js → ron-CcAQMYzM.js} +0 -0
- /package/dist/web/assets/{rose-pine-dawn-BbGt9Wy_.js → rose-pine-dawn-DkSLvjDV.js} +0 -0
- /package/dist/web/assets/{rose-pine-DhxfJWcm.js → rose-pine-jtG38kvA.js} +0 -0
- /package/dist/web/assets/{rose-pine-moon-dj4Zxgik.js → rose-pine-moon-DJx8AxMs.js} +0 -0
- /package/dist/web/assets/{rosmsg-EciOaHo2.js → rosmsg-BnfYFiWk.js} +0 -0
- /package/dist/web/assets/{run-in-terminal-wHKwAnWP.js → run-in-terminal-Sb6TFU4f.js} +0 -0
- /package/dist/web/assets/{rust-C_eH59O_.js → rust-DxgQnpfl.js} +0 -0
- /package/dist/web/assets/{sass-Dos3R5lL.js → sass-DTgjjspH.js} +0 -0
- /package/dist/web/assets/{scala-8lVKsTvf.js → scala-xEozebyS.js} +0 -0
- /package/dist/web/assets/{scheme-Bd3VdaZj.js → scheme-sfgxdr_D.js} +0 -0
- /package/dist/web/assets/{sdbl-C4Yrjlgh.js → sdbl-BpdzD-Uv.js} +0 -0
- /package/dist/web/assets/{send-to-chat-BI7-fFpG.js → send-to-chat-BDws0-k0.js} +0 -0
- /package/dist/web/assets/{separator-W_hJcXPk.js → separator-GeVzERIl.js} +0 -0
- /package/dist/web/assets/{shellscript-OFZbPKZH.js → shellscript-B2o7zCrN.js} +0 -0
- /package/dist/web/assets/{slack-dark-aL6vlxZs.js → slack-dark-DxfgNfgJ.js} +0 -0
- /package/dist/web/assets/{slack-ochin-BKt1E7sL.js → slack-ochin-BMSGMkt8.js} +0 -0
- /package/dist/web/assets/{smalltalk-D6qVBL1U.js → smalltalk-DCb8haRt.js} +0 -0
- /package/dist/web/assets/{snazzy-light-BrWerT0t.js → snazzy-light-Y06j56Vj.js} +0 -0
- /package/dist/web/assets/{solarized-dark-CzxTJgVQ.js → solarized-dark-z1W-RVhp.js} +0 -0
- /package/dist/web/assets/{solarized-light-BecaDAnG.js → solarized-light-BRAGTpW5.js} +0 -0
- /package/dist/web/assets/{solidity-C9t7pZ84.js → solidity-CDTZVMHy.js} +0 -0
- /package/dist/web/assets/{splunk-CtxfFKtF.js → splunk-CFjv6-V_.js} +0 -0
- /package/dist/web/assets/{sql-7FE_Duz0.js → sql-Ce-1ETwT.js} +0 -0
- /package/dist/web/assets/{ssh-config-3Fr37ACC.js → ssh-config-Bcs3SD-x.js} +0 -0
- /package/dist/web/assets/{stylus-BP4mE1sO.js → stylus-Co5Var6O.js} +0 -0
- /package/dist/web/assets/{swift-0uqTFouD.js → swift-Irt_r7Fy.js} +0 -0
- /package/dist/web/assets/{synthwave-84-DQaNM3DI.js → synthwave-84-BOgCDIL-.js} +0 -0
- /package/dist/web/assets/{system-verilog-DUIVrZHZ.js → system-verilog-DSwfS0ci.js} +0 -0
- /package/dist/web/assets/{systemd-CtNo_WIh.js → systemd-C-HqVFLV.js} +0 -0
- /package/dist/web/assets/{talonscript-B0HXaCVT.js → talonscript-B7lshRGY.js} +0 -0
- /package/dist/web/assets/{tasl-Cb7RAl11.js → tasl-BZXSTCA-.js} +0 -0
- /package/dist/web/assets/{tcl-B79aC6l5.js → tcl-B_vaMM01.js} +0 -0
- /package/dist/web/assets/{terraform-75jJDjpW.js → terraform-B7kDBVtX.js} +0 -0
- /package/dist/web/assets/{tokyo-night-Cz9Uh9qb.js → tokyo-night-CW1uC1bG.js} +0 -0
- /package/dist/web/assets/{toml-CD6y9A-z.js → toml-Af6Dxufp.js} +0 -0
- /package/dist/web/assets/{tsv-CXJMbBrb.js → tsv-BSFZ-g3s.js} +0 -0
- /package/dist/web/assets/{tsx-BuYN0I2t.js → tsx-CN8kIwG_.js} +0 -0
- /package/dist/web/assets/{turtle-DWH-Rjse.js → turtle-BSUyR8DV.js} +0 -0
- /package/dist/web/assets/{typescript-BPd-hsrR.js → typescript-2AZeIhCA.js} +0 -0
- /package/dist/web/assets/{typespec-B0wvVykx.js → typespec-DRZ0XiHC.js} +0 -0
- /package/dist/web/assets/{typst-DWG2c48-.js → typst-p1gfDr4O.js} +0 -0
- /package/dist/web/assets/{use-blob-url-CrwoZJUJ.js → use-blob-url-BMtoAEL4.js} +0 -0
- /package/dist/web/assets/{use-open-team-member-CSUU7Z8N.js → use-open-team-member-C9EUqPvl.js} +0 -0
- /package/dist/web/assets/{v-Ch6E4Egd.js → v-B705HYgD.js} +0 -0
- /package/dist/web/assets/{vala-CGVKwbPx.js → vala-CyU0S4KW.js} +0 -0
- /package/dist/web/assets/{vb-BIEbSxyT.js → vb-DCWUzR_1.js} +0 -0
- /package/dist/web/assets/{vendor-xterm-YQlzIWv2.js → vendor-xterm-MrmaYoD2.js} +0 -0
- /package/dist/web/assets/{verilog-A-3pYPad.js → verilog-CrRE3TC7.js} +0 -0
- /package/dist/web/assets/{vesper-CK1naZAV.js → vesper-BH5N5eRr.js} +0 -0
- /package/dist/web/assets/{vhdl-CVawmgMg.js → vhdl-CT1Mz-fu.js} +0 -0
- /package/dist/web/assets/{viml-CiWjaqBY.js → viml-B0LtAesb.js} +0 -0
- /package/dist/web/assets/{vitesse-black-PYXW4-BO.js → vitesse-black-DqQvxGCJ.js} +0 -0
- /package/dist/web/assets/{vitesse-dark-BU5s4AuG.js → vitesse-dark-C6MRSe2N.js} +0 -0
- /package/dist/web/assets/{vitesse-light-DgkIT-N7.js → vitesse-light-B-8DQ5R9.js} +0 -0
- /package/dist/web/assets/{vyper-D8cRDPp3.js → vyper-D7YgYuMk.js} +0 -0
- /package/dist/web/assets/{wasm-ClFJgzmT.js → wasm-BgEp8ivq.js} +0 -0
- /package/dist/web/assets/{wasm-C02wlRbP.js → wasm-Dj9JHuDf.js} +0 -0
- /package/dist/web/assets/{wenyan-B8plxIr8.js → wenyan-CLcU30u4.js} +0 -0
- /package/dist/web/assets/{wgsl-CVujtm3V.js → wgsl-DEtNo0DR.js} +0 -0
- /package/dist/web/assets/{wikitext-CmcG9B69.js → wikitext-CXiDN9zY.js} +0 -0
- /package/dist/web/assets/{wit--gl2Jium.js → wit-0hROlx_P.js} +0 -0
- /package/dist/web/assets/{wolfram-6T_1D-NS.js → wolfram-nhKFI8Qz.js} +0 -0
- /package/dist/web/assets/{yaml-CIVV9uA1.js → yaml-CNoUgoPD.js} +0 -0
- /package/dist/web/assets/{zenscript-CoT4yNdA.js → zenscript-BgGAyJ15.js} +0 -0
- /package/dist/web/assets/{zig-BWs2Qo3G.js → zig-Be_I-6Rs.js} +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useState, useCallback, useRef, useEffect, useMemo, startTransition } from "react";
|
|
2
2
|
import { useWebSocket } from "./use-websocket";
|
|
3
|
-
import { api,
|
|
3
|
+
import { api, projectUrl } from "@/lib/api-client";
|
|
4
4
|
import { flattenWithExpansions, prefixPreCompactIds } from "@/lib/flatten-expansions";
|
|
5
5
|
import { useStreamingStore } from "@/stores/streaming-store";
|
|
6
6
|
import { usePanelStore } from "@/stores/panel-store";
|
|
@@ -188,6 +188,12 @@ export function useChat(
|
|
|
188
188
|
const pendingMessageRef = useRef<string | null>(null);
|
|
189
189
|
const sendRef = useRef<(data: string) => void>(() => {});
|
|
190
190
|
const refetchRef = useRef<(() => void) | null>(null);
|
|
191
|
+
const historyActivityRef = useRef(0);
|
|
192
|
+
const historyReconciledRef = useRef(0);
|
|
193
|
+
const turnFinalizedRef = useRef(false);
|
|
194
|
+
const historyRequestRef = useRef<AbortController | null>(null);
|
|
195
|
+
const queuedReplayMessagesRef = useRef<MessageEvent[]>([]);
|
|
196
|
+
const handleMessageRef = useRef<((event: MessageEvent) => void) | null>(null);
|
|
191
197
|
/** True while replaying turn_events — suppresses setPendingApproval */
|
|
192
198
|
const isReplayingRef = useRef(false);
|
|
193
199
|
/** toolUseIds of AskUserQuestion tool_use events. The approval_request event
|
|
@@ -712,6 +718,7 @@ export function useChat(
|
|
|
712
718
|
const finalContent = streamingContentRef.current;
|
|
713
719
|
const finalEvents = [...streamingEventsRef.current];
|
|
714
720
|
const finalAccount = streamingAccountRef.current;
|
|
721
|
+
turnFinalizedRef.current = !!finalContent || finalEvents.length > 0;
|
|
715
722
|
const doneUuid = ev.lastMessageUuid as string | undefined;
|
|
716
723
|
const doneUsage = ev.usage;
|
|
717
724
|
setMessages((prev) => {
|
|
@@ -765,6 +772,11 @@ export function useChat(
|
|
|
765
772
|
// Ignore keepalive pings
|
|
766
773
|
if ((data as any).type === "ping") return;
|
|
767
774
|
|
|
775
|
+
if (isReplayingRef.current) {
|
|
776
|
+
queuedReplayMessagesRef.current.push(event);
|
|
777
|
+
return;
|
|
778
|
+
}
|
|
779
|
+
|
|
768
780
|
// file:changed, session:unread_changed and jira:* are app-wide and now arrive
|
|
769
781
|
// on the global bus (`use-global-events.ts`) instead of here — a chat socket is
|
|
770
782
|
// not guaranteed to exist since chat tabs mount lazily.
|
|
@@ -773,6 +785,7 @@ export function useChat(
|
|
|
773
785
|
// bubble. The sender never receives this echo (server excludes the sender),
|
|
774
786
|
// so no dedupe against the optimistic append is needed.
|
|
775
787
|
if ((data as any).type === "user_message") {
|
|
788
|
+
historyActivityRef.current++;
|
|
776
789
|
const content = (data as any).content as string;
|
|
777
790
|
setMessages((prev) => {
|
|
778
791
|
const last = prev[prev.length - 1];
|
|
@@ -829,22 +842,36 @@ export function useChat(
|
|
|
829
842
|
// Handle phase transitions from BE
|
|
830
843
|
if ((data as any).type === "phase_changed") {
|
|
831
844
|
const p = (data as any).phase as SessionPhase;
|
|
845
|
+
const wasActive = phaseRef.current !== "idle";
|
|
846
|
+
if (!wasActive && p !== "idle") turnFinalizedRef.current = false;
|
|
847
|
+
if (p !== "idle") historyActivityRef.current++;
|
|
832
848
|
setPhase(p);
|
|
833
849
|
phaseRef.current = p;
|
|
834
850
|
setConnectingElapsed(p === "connecting" ? ((data as any).elapsed ?? 0) : 0);
|
|
835
851
|
// Safety: idle phase means no turn running — ensure compact indicator does not linger.
|
|
836
852
|
// BE should broadcast compact_status=done too, but this is a belt-and-braces clear.
|
|
837
|
-
if (p === "idle")
|
|
853
|
+
if (p === "idle") {
|
|
854
|
+
setCompactStatus(null);
|
|
855
|
+
setStatusMessage(null);
|
|
856
|
+
// Completion can arrive after lost content/done frames. Reconcile once
|
|
857
|
+
// the turn is idle so the answer appears without a manual reload.
|
|
858
|
+
if (wasActive && !turnFinalizedRef.current) refetchRef.current?.();
|
|
859
|
+
}
|
|
838
860
|
return;
|
|
839
861
|
}
|
|
840
862
|
|
|
841
863
|
// Handle session state (replaces connected + status)
|
|
842
864
|
if ((data as any).type === "session_state") {
|
|
843
865
|
setIsConnected(true);
|
|
866
|
+
// A live session may have no buffered events yet, so no turn_events frame
|
|
867
|
+
// will follow. This acknowledgement already confirms the connection.
|
|
868
|
+
setIsReconnecting(false);
|
|
844
869
|
setConnectedSessionId((data as any).sessionId ?? sessionIdRef.current);
|
|
845
870
|
const state = data as any;
|
|
846
871
|
const p = state.phase as SessionPhase;
|
|
872
|
+
if (p !== "idle") historyActivityRef.current++;
|
|
847
873
|
const wasIdle = phaseRef.current === "idle";
|
|
874
|
+
if (wasIdle && p !== "idle") turnFinalizedRef.current = false;
|
|
848
875
|
setPhase(p);
|
|
849
876
|
phaseRef.current = p;
|
|
850
877
|
if (state.sessionTitle) setSessionTitle(state.sessionTitle);
|
|
@@ -895,6 +922,7 @@ export function useChat(
|
|
|
895
922
|
|
|
896
923
|
// Handle turn_events (reconnect sync with rAF chunking)
|
|
897
924
|
if ((data as any).type === "turn_events") {
|
|
925
|
+
historyActivityRef.current++;
|
|
898
926
|
const events = (data as any).events as unknown[];
|
|
899
927
|
const userMessage = (data as any).userMessage as string | null;
|
|
900
928
|
if (!events?.length && !userMessage) { setIsReconnecting(false); return; }
|
|
@@ -961,6 +989,10 @@ export function useChat(
|
|
|
961
989
|
replayRafRef.current = 0;
|
|
962
990
|
isReplayingRef.current = false;
|
|
963
991
|
setIsReconnecting(false);
|
|
992
|
+
// Preserve websocket order: live text/done must follow the snapshot,
|
|
993
|
+
// even when rebuilding a large snapshot takes several frames.
|
|
994
|
+
const queued = queuedReplayMessagesRef.current.splice(0);
|
|
995
|
+
for (const message of queued) handleMessageRef.current?.(message);
|
|
964
996
|
}
|
|
965
997
|
};
|
|
966
998
|
replayRafRef.current = requestAnimationFrame(processChunk);
|
|
@@ -970,6 +1002,7 @@ export function useChat(
|
|
|
970
1002
|
// Route content events through processStreamEvent
|
|
971
1003
|
processStreamEvent(data);
|
|
972
1004
|
}, [processStreamEvent]);
|
|
1005
|
+
handleMessageRef.current = handleMessage;
|
|
973
1006
|
|
|
974
1007
|
const wsUrl = sessionId && projectName
|
|
975
1008
|
? `/ws/project/${encodeURIComponent(projectName)}/chat/${sessionId}`
|
|
@@ -979,6 +1012,14 @@ export function useChat(
|
|
|
979
1012
|
url: wsUrl,
|
|
980
1013
|
onMessage: handleMessage,
|
|
981
1014
|
autoConnect: !!sessionId && !!projectName,
|
|
1015
|
+
idleTimeoutMs: 45_000, // Server sends a heartbeat every 15 seconds.
|
|
1016
|
+
onConnectionChange: (connected) => {
|
|
1017
|
+
if (!connected) {
|
|
1018
|
+
setIsConnected(false);
|
|
1019
|
+
setIsReconnecting(true);
|
|
1020
|
+
}
|
|
1021
|
+
// session_state, rather than TCP open, confirms chat synchronization.
|
|
1022
|
+
},
|
|
982
1023
|
});
|
|
983
1024
|
|
|
984
1025
|
// Keep sendRef in sync so handleMessage can flush queued messages
|
|
@@ -987,6 +1028,9 @@ export function useChat(
|
|
|
987
1028
|
// Load history and reset state when session changes
|
|
988
1029
|
useEffect(() => {
|
|
989
1030
|
let cancelled = false;
|
|
1031
|
+
const historyReconciled = historyReconciledRef.current;
|
|
1032
|
+
turnFinalizedRef.current = false;
|
|
1033
|
+
historyActivityRef.current++;
|
|
990
1034
|
|
|
991
1035
|
// Keep the user's unconfirmed model/thinking picks across the draft→real transition
|
|
992
1036
|
// (null → id), but drop them when switching between two existing sessions so one
|
|
@@ -1019,6 +1063,7 @@ export function useChat(
|
|
|
1019
1063
|
if (syncRafRef.current) { clearTimeout(syncRafRef.current); syncRafRef.current = 0; }
|
|
1020
1064
|
setIsConnected(false);
|
|
1021
1065
|
setConnectedSessionId(null);
|
|
1066
|
+
setIsReconnecting(false);
|
|
1022
1067
|
// Reset team state
|
|
1023
1068
|
teamActivityRef.current = { teamNames: new Set(), messages: [] };
|
|
1024
1069
|
teamUnreadRef.current = 0;
|
|
@@ -1060,7 +1105,7 @@ export function useChat(
|
|
|
1060
1105
|
`${projectUrl(projectName)}/chat/sessions/${sessionId}/messages?providerId=${providerId}`,
|
|
1061
1106
|
)
|
|
1062
1107
|
.then((data: any) => {
|
|
1063
|
-
if (cancelled) return;
|
|
1108
|
+
if (cancelled || historyReconciledRef.current !== historyReconciled) return;
|
|
1064
1109
|
// Tolerate the pre-versionMap shape (a bare array): a browser running a
|
|
1065
1110
|
// cached bundle from before the upgrade would otherwise render an empty
|
|
1066
1111
|
// history with no error.
|
|
@@ -1093,7 +1138,9 @@ export function useChat(
|
|
|
1093
1138
|
historyLoadedAtRef.current = Date.now();
|
|
1094
1139
|
})
|
|
1095
1140
|
.catch(() => {
|
|
1096
|
-
if (!cancelled
|
|
1141
|
+
if (!cancelled && historyReconciledRef.current === historyReconciled) {
|
|
1142
|
+
setMessages((prev) => prev.filter((m) => !staleIds.has(m.id)));
|
|
1143
|
+
}
|
|
1097
1144
|
})
|
|
1098
1145
|
.finally(() => {
|
|
1099
1146
|
if (!cancelled) setMessagesLoading(false);
|
|
@@ -1104,6 +1151,14 @@ export function useChat(
|
|
|
1104
1151
|
|
|
1105
1152
|
return () => {
|
|
1106
1153
|
cancelled = true;
|
|
1154
|
+
historyRequestRef.current?.abort();
|
|
1155
|
+
historyRequestRef.current = null;
|
|
1156
|
+
if (syncRafRef.current) clearTimeout(syncRafRef.current);
|
|
1157
|
+
syncRafRef.current = 0;
|
|
1158
|
+
if (replayRafRef.current) cancelAnimationFrame(replayRafRef.current);
|
|
1159
|
+
replayRafRef.current = 0;
|
|
1160
|
+
isReplayingRef.current = false;
|
|
1161
|
+
queuedReplayMessagesRef.current = [];
|
|
1107
1162
|
};
|
|
1108
1163
|
}, [sessionId, providerId, projectName, updateTeamActivity, loadTeamDetail]);
|
|
1109
1164
|
|
|
@@ -1112,8 +1167,10 @@ export function useChat(
|
|
|
1112
1167
|
// An attachment-only message is legitimate now that images travel with it: the
|
|
1113
1168
|
// caller may have nothing to say beyond the picture.
|
|
1114
1169
|
if (!content.trim() && !opts?.images?.length) return;
|
|
1170
|
+
historyActivityRef.current++;
|
|
1115
1171
|
|
|
1116
1172
|
const isFollowUp = phaseRef.current !== "idle";
|
|
1173
|
+
turnFinalizedRef.current = false;
|
|
1117
1174
|
|
|
1118
1175
|
if (isFollowUp) {
|
|
1119
1176
|
// Cancel pending throttled sync before finalizing
|
|
@@ -1302,30 +1359,34 @@ export function useChat(
|
|
|
1302
1359
|
}, [wsReconnect]);
|
|
1303
1360
|
|
|
1304
1361
|
const refetchMessages = useCallback(() => {
|
|
1305
|
-
if (!sessionId || !projectName) return;
|
|
1362
|
+
if (!sessionId || !projectName || phaseRef.current !== "idle") return;
|
|
1363
|
+
historyRequestRef.current?.abort();
|
|
1364
|
+
const request = new AbortController();
|
|
1365
|
+
historyRequestRef.current = request;
|
|
1366
|
+
const activity = historyActivityRef.current;
|
|
1306
1367
|
// No setMessagesLoading(true) here — keep current messages visible while
|
|
1307
1368
|
// fetching in the background (stale-while-revalidate). The initial load
|
|
1308
1369
|
// in the session-change useEffect already handles the first-time loading screen.
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
})
|
|
1312
|
-
.then((r) => r.json())
|
|
1313
|
-
.then((json: any) => {
|
|
1370
|
+
api.get<any>(`${projectUrl(projectName)}/chat/sessions/${sessionId}/messages?providerId=${providerId}`, { signal: request.signal })
|
|
1371
|
+
.then((data: any) => {
|
|
1314
1372
|
// A turn may have started while this fetch was in flight (e.g. edit→fork
|
|
1315
1373
|
// swaps the session, session_state arrives idle and triggers this refetch,
|
|
1316
1374
|
// then the queued edited message sends and moves phase off idle). The
|
|
1317
1375
|
// fetched history predates that send, so replacing now would drop the
|
|
1318
1376
|
// just-sent user message — leaving it missing until a manual reload.
|
|
1319
|
-
if (
|
|
1377
|
+
if (request.signal.aborted || historyRequestRef.current !== request
|
|
1378
|
+
|| historyActivityRef.current !== activity || phaseRef.current !== "idle"
|
|
1379
|
+
|| sessionIdRef.current !== sessionId || projectNameRef.current !== projectName
|
|
1380
|
+
|| isReplayingRef.current) return;
|
|
1320
1381
|
// Same back-compat unwrap as the initial load above.
|
|
1321
|
-
const payload =
|
|
1322
|
-
? (Array.isArray(json.data) ? { messages: json.data, versionMap: undefined } : json.data)
|
|
1323
|
-
: null;
|
|
1382
|
+
const payload = Array.isArray(data) ? { messages: data, versionMap: undefined } : data;
|
|
1324
1383
|
// versionMap is refreshed independently of the length guard below: an
|
|
1325
1384
|
// edit changes the branch tree without necessarily changing history
|
|
1326
1385
|
// length, and the `n/m` counts must not go stale.
|
|
1327
1386
|
if (payload?.versionMap) setVersionMap(payload.versionMap);
|
|
1328
1387
|
if (Array.isArray(payload?.messages) && payload.messages.length > 0) {
|
|
1388
|
+
historyReconciledRef.current++;
|
|
1389
|
+
if (syncRafRef.current) { clearTimeout(syncRafRef.current); syncRafRef.current = 0; }
|
|
1329
1390
|
setMessages(payload.messages);
|
|
1330
1391
|
streamingContentRef.current = "";
|
|
1331
1392
|
streamingEventsRef.current = [];
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { useEffect, useRef, useCallback } from "react";
|
|
2
|
-
import { WsClient } from "@/lib/ws-client";
|
|
2
|
+
import { WsClient, type WsClientOptions } from "@/lib/ws-client";
|
|
3
3
|
|
|
4
|
-
interface UseWebSocketOptions {
|
|
4
|
+
interface UseWebSocketOptions extends WsClientOptions {
|
|
5
5
|
url: string;
|
|
6
6
|
onMessage?: (event: MessageEvent) => void;
|
|
7
7
|
autoConnect?: boolean;
|
|
@@ -11,26 +11,39 @@ export function useWebSocket({
|
|
|
11
11
|
url,
|
|
12
12
|
onMessage,
|
|
13
13
|
autoConnect = true,
|
|
14
|
+
idleTimeoutMs,
|
|
15
|
+
onConnectionChange,
|
|
14
16
|
}: UseWebSocketOptions) {
|
|
15
17
|
const clientRef = useRef<WsClient | null>(null);
|
|
18
|
+
const onMessageRef = useRef(onMessage);
|
|
19
|
+
const onConnectionChangeRef = useRef(onConnectionChange);
|
|
20
|
+
onMessageRef.current = onMessage;
|
|
21
|
+
onConnectionChangeRef.current = onConnectionChange;
|
|
16
22
|
|
|
17
23
|
useEffect(() => {
|
|
18
|
-
|
|
24
|
+
let active = true;
|
|
25
|
+
const client = new WsClient(url, {
|
|
26
|
+
idleTimeoutMs,
|
|
27
|
+
onConnectionChange: (connected) => {
|
|
28
|
+
if (active) onConnectionChangeRef.current?.(connected);
|
|
29
|
+
},
|
|
30
|
+
});
|
|
19
31
|
clientRef.current = client;
|
|
20
32
|
|
|
21
|
-
|
|
22
|
-
client.onMessage(onMessage);
|
|
23
|
-
}
|
|
33
|
+
client.onMessage((event) => onMessageRef.current?.(event));
|
|
24
34
|
|
|
25
35
|
if (autoConnect) {
|
|
26
36
|
client.connect();
|
|
27
37
|
}
|
|
28
38
|
|
|
29
39
|
return () => {
|
|
40
|
+
// Replacing a session socket is intentional, not a connection failure.
|
|
41
|
+
// The old client's cleanup must not update the new session's UI.
|
|
42
|
+
active = false;
|
|
30
43
|
client.disconnect();
|
|
31
44
|
clientRef.current = null;
|
|
32
45
|
};
|
|
33
|
-
}, [url, autoConnect]);
|
|
46
|
+
}, [url, autoConnect, idleTimeoutMs]);
|
|
34
47
|
|
|
35
48
|
const send = useCallback((data: string | ArrayBuffer) => {
|
|
36
49
|
clientRef.current?.send(data);
|
|
@@ -205,11 +205,14 @@ export interface AIProviderSettings {
|
|
|
205
205
|
system_prompt?: string;
|
|
206
206
|
agent_teams?: boolean;
|
|
207
207
|
context_1m?: boolean;
|
|
208
|
+
model_context_window?: number | null;
|
|
209
|
+
model_auto_compact_token_limit?: number | null;
|
|
208
210
|
inherit_claude_mcp?: boolean;
|
|
209
211
|
}
|
|
210
212
|
|
|
211
213
|
export interface AISettings {
|
|
212
214
|
default_provider: string;
|
|
215
|
+
share_provider_context?: boolean;
|
|
213
216
|
providers: Record<string, AIProviderSettings>;
|
|
214
217
|
}
|
|
215
218
|
|
package/src/web/lib/ws-client.ts
CHANGED
|
@@ -5,6 +5,12 @@ type MessageHandler = (data: MessageEvent) => void;
|
|
|
5
5
|
const MAX_RECONNECT_DELAY = 30_000;
|
|
6
6
|
const BASE_DELAY = 1_000;
|
|
7
7
|
|
|
8
|
+
export interface WsClientOptions {
|
|
9
|
+
/** Opt in only for protocols that regularly send heartbeat messages. */
|
|
10
|
+
idleTimeoutMs?: number;
|
|
11
|
+
onConnectionChange?: (connected: boolean) => void;
|
|
12
|
+
}
|
|
13
|
+
|
|
8
14
|
export class WsClient {
|
|
9
15
|
private ws: WebSocket | null = null;
|
|
10
16
|
private url: string;
|
|
@@ -15,14 +21,18 @@ export class WsClient {
|
|
|
15
21
|
/** Messages queued while WS is still CONNECTING — flushed on open */
|
|
16
22
|
private pendingMessages: (string | ArrayBuffer)[] = [];
|
|
17
23
|
private visibilityHandler: (() => void) | null = null;
|
|
24
|
+
private idleTimer: ReturnType<typeof setTimeout> | null = null;
|
|
25
|
+
private lastReceivedAt = 0;
|
|
26
|
+
private connected = false;
|
|
18
27
|
|
|
19
|
-
constructor(url: string) {
|
|
28
|
+
constructor(url: string, private options: WsClientOptions = {}) {
|
|
20
29
|
this.url = url;
|
|
21
30
|
// Reconnect immediately when page becomes visible (e.g. iPad wake from sleep)
|
|
22
31
|
this.visibilityHandler = () => {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
32
|
+
const state = this.ws?.readyState;
|
|
33
|
+
const stale = !!this.options.idleTimeoutMs && Date.now() - this.lastReceivedAt >= this.options.idleTimeoutMs;
|
|
34
|
+
if (document.visibilityState === "visible" && !this.intentionalClose
|
|
35
|
+
&& (stale || (state !== WebSocket.OPEN && state !== WebSocket.CONNECTING))) {
|
|
26
36
|
this.reconnectAttempts = 0;
|
|
27
37
|
this.connect();
|
|
28
38
|
}
|
|
@@ -32,6 +42,8 @@ export class WsClient {
|
|
|
32
42
|
|
|
33
43
|
connect(): void {
|
|
34
44
|
this.intentionalClose = false;
|
|
45
|
+
if (this.reconnectTimer) clearTimeout(this.reconnectTimer);
|
|
46
|
+
this.reconnectTimer = null;
|
|
35
47
|
this.cleanup();
|
|
36
48
|
|
|
37
49
|
const protocol = window.location.protocol === "https:" ? "wss:" : "ws:";
|
|
@@ -52,9 +64,13 @@ export class WsClient {
|
|
|
52
64
|
}
|
|
53
65
|
|
|
54
66
|
this.ws = new WebSocket(fullUrl);
|
|
67
|
+
this.lastReceivedAt = Date.now();
|
|
68
|
+
this.armIdleCheck();
|
|
55
69
|
|
|
56
70
|
this.ws.onopen = () => {
|
|
57
71
|
this.reconnectAttempts = 0;
|
|
72
|
+
this.lastReceivedAt = Date.now();
|
|
73
|
+
this.setConnected(true);
|
|
58
74
|
// Send "ready" handshake — triggers server to send status/connected.
|
|
59
75
|
// Through Cloudflare tunnels, the server's open-handler message may not
|
|
60
76
|
// arrive because the end-to-end data path isn't fully established yet.
|
|
@@ -71,12 +87,15 @@ export class WsClient {
|
|
|
71
87
|
};
|
|
72
88
|
|
|
73
89
|
this.ws.onmessage = (event) => {
|
|
90
|
+
this.lastReceivedAt = Date.now();
|
|
74
91
|
for (const handler of this.handlers) {
|
|
75
92
|
handler(event);
|
|
76
93
|
}
|
|
77
94
|
};
|
|
78
95
|
|
|
79
96
|
this.ws.onclose = () => {
|
|
97
|
+
this.clearIdleCheck();
|
|
98
|
+
this.setConnected(false);
|
|
80
99
|
if (!this.intentionalClose) {
|
|
81
100
|
this.scheduleReconnect();
|
|
82
101
|
}
|
|
@@ -125,6 +144,8 @@ export class WsClient {
|
|
|
125
144
|
}
|
|
126
145
|
|
|
127
146
|
private cleanup(): void {
|
|
147
|
+
this.clearIdleCheck();
|
|
148
|
+
this.setConnected(false);
|
|
128
149
|
if (this.ws) {
|
|
129
150
|
this.ws.onopen = null;
|
|
130
151
|
this.ws.onclose = null;
|
|
@@ -141,6 +162,7 @@ export class WsClient {
|
|
|
141
162
|
}
|
|
142
163
|
|
|
143
164
|
private scheduleReconnect(): void {
|
|
165
|
+
if (this.reconnectTimer) clearTimeout(this.reconnectTimer);
|
|
144
166
|
const delay = Math.min(
|
|
145
167
|
BASE_DELAY * Math.pow(2, this.reconnectAttempts),
|
|
146
168
|
MAX_RECONNECT_DELAY,
|
|
@@ -148,4 +170,33 @@ export class WsClient {
|
|
|
148
170
|
this.reconnectAttempts++;
|
|
149
171
|
this.reconnectTimer = setTimeout(() => this.connect(), delay);
|
|
150
172
|
}
|
|
173
|
+
|
|
174
|
+
private setConnected(connected: boolean): void {
|
|
175
|
+
if (this.connected === connected) return;
|
|
176
|
+
this.connected = connected;
|
|
177
|
+
this.options.onConnectionChange?.(connected);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
private clearIdleCheck(): void {
|
|
181
|
+
if (this.idleTimer) clearTimeout(this.idleTimer);
|
|
182
|
+
this.idleTimer = null;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
private armIdleCheck(): void {
|
|
186
|
+
this.clearIdleCheck();
|
|
187
|
+
const timeout = this.options.idleTimeoutMs;
|
|
188
|
+
if (!timeout || timeout <= 0 || !Number.isFinite(timeout)) return;
|
|
189
|
+
const remaining = Math.max(0, timeout - (Date.now() - this.lastReceivedAt));
|
|
190
|
+
this.idleTimer = setTimeout(() => {
|
|
191
|
+
this.idleTimer = null;
|
|
192
|
+
if (this.intentionalClose) return;
|
|
193
|
+
if (Date.now() - this.lastReceivedAt >= timeout) {
|
|
194
|
+
// An OPEN socket can have a dead downstream without firing close/error.
|
|
195
|
+
// A fresh handshake lets the server replay the active turn or idle history.
|
|
196
|
+
this.connect();
|
|
197
|
+
} else {
|
|
198
|
+
this.armIdleCheck();
|
|
199
|
+
}
|
|
200
|
+
}, remaining);
|
|
201
|
+
}
|
|
151
202
|
}
|
package/.release-bin/zip
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
set -euo pipefail
|
|
3
|
-
while [[ "$#" -gt 0 && "$1" == -* ]]; do shift; done
|
|
4
|
-
archive="$1"
|
|
5
|
-
root="$2"
|
|
6
|
-
python.exe - "$archive" "$root" <<'PY'
|
|
7
|
-
import os, sys, zipfile
|
|
8
|
-
archive, root = sys.argv[1:3]
|
|
9
|
-
base = os.path.dirname(root)
|
|
10
|
-
with zipfile.ZipFile(archive, "w", zipfile.ZIP_DEFLATED) as z:
|
|
11
|
-
for current, _, files in os.walk(root):
|
|
12
|
-
for filename in files:
|
|
13
|
-
path = os.path.join(current, filename)
|
|
14
|
-
z.write(path, os.path.relpath(path, base))
|
|
15
|
-
PY
|
package/.release-node-shim.sh
DELETED
|
@@ -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{n as r}from"./api-client-CEYCBt_0.js";import{B as i,Dr as a,G as o,H as s,Ln as c,M as l,U as u,V as d,W as f,X as p,Xn as m,Y as h,cn as g}from"./index-DYGLdCpe.js";import{getAISettings as _,updateAISettings as v}from"./api-settings-D18Q4Ocp.js";var y=e(t(),1),b=n(),x=[{value:`low`,label:`Low`},{value:`medium`,label:`Medium`},{value:`high`,label:`High`},{value:`xhigh`,label:`Extra`},{value:`max`,label:`Max`}],S=[{value:`bypassPermissions`,label:`Bypass permissions (default)`},{value:`default`,label:`Ask before edits`},{value:`acceptEdits`,label:`Edit automatically`},{value:`plan`,label:`Plan mode`}],C={claude:`Claude`,cursor:`Cursor`,codex:`Codex`,gemini:`Gemini`};function w({compact:e}={}){let[t,n]=(0,y.useState)(null),[c,m]=(0,y.useState)(``),[w,E]=(0,y.useState)([]),[D,O]=(0,y.useState)(!1),[k,A]=(0,y.useState)(!1),[j,M]=(0,y.useState)(null),[N,P]=(0,y.useState)(0);(0,y.useEffect)(()=>{_().then(e=>{n(e),m(e.default_provider??`claude`)}).catch(e=>M(e.message))},[]),(0,y.useEffect)(()=>{c&&(O(!0),r.get(`/api/settings/ai/providers/${c}/models`).then(E).catch(()=>E([])).finally(()=>O(!1)))},[c]);let F=t?Object.keys(t.providers).filter(e=>e!==`mock`).map(e=>({id:e,name:C[e]??e})):[],I=t?.providers[c],L=I?.type===`agent-sdk`||!I?.type&&c===`claude`,R=async(e,r)=>{if(t){A(!0),M(null);try{n(await v({providers:{[c]:{[e]:r}}})),P(e=>e+1)}catch(e){M(e.message)}finally{A(!1)}}},z=e?`text-[11px]`:`text-sm`,B=e?`text-xs`:`text-sm`,V=e?`space-y-2`:`space-y-4`,H=e?`space-y-1.5`:`space-y-3`,U=e?`space-y-1`:`space-y-1.5`;if(!t)return(0,b.jsxs)(`div`,{className:H,children:[(0,b.jsx)(`h3`,{className:`${B} font-medium text-text-secondary`,children:`AI Settings`}),(0,b.jsx)(`p`,{className:`${z} text-text-subtle`,children:j?`Error: ${j}`:`Loading...`})]});let W=L?w:[{value:`__default__`,label:`Auto (default)`},...w];return(0,b.jsxs)(`div`,{className:V,children:[(0,b.jsx)(`h3`,{className:`${B} font-medium text-text-secondary`,children:`AI Settings`}),F.length>1&&(0,b.jsx)(`div`,{className:`flex gap-0.5 border-b border-border/50 -mx-1 px-1`,children:F.map(e=>(0,b.jsxs)(`button`,{onClick:()=>m(e.id),className:`flex items-center gap-1 px-2 py-1 text-[11px] rounded-t transition-colors ${c===e.id?`text-primary border-b-2 border-primary font-medium`:`text-text-subtle hover:text-text-secondary`}`,children:[(0,b.jsx)(l,{providerId:e.id}),(0,b.jsx)(`span`,{className:`capitalize`,children:e.name})]},e.id))}),(0,b.jsxs)(`div`,{className:H,children:[c===`codex`&&(0,b.jsxs)(`button`,{type:`button`,onClick:()=>g(`accounts`),className:`w-full flex items-center justify-between gap-2 rounded-md border border-border px-2.5 py-2 text-left cursor-pointer hover:bg-surface-elevated transition-colors`,children:[(0,b.jsx)(`span`,{className:`${z} text-text-secondary`,children:`Codex accounts & login`}),(0,b.jsx)(a,{className:`size-3.5 text-text-subtle shrink-0`})]}),w.length>0&&(0,b.jsxs)(`div`,{className:U,children:[(0,b.jsx)(h,{htmlFor:`ai-model`,className:e?z:void 0,children:`Model`}),(0,b.jsxs)(i,{value:L?I?.model??w[0]?.value:I?.model||`__default__`,onValueChange:e=>R(`model`,e===`__default__`?void 0:e),disabled:D,children:[(0,b.jsx)(u,{id:`ai-model`,className:`w-full ${e?`h-7 text-[11px]`:``}`,children:(0,b.jsx)(f,{placeholder:D?`Loading models...`:`Select model`})}),(0,b.jsx)(d,{className:`max-h-[300px]`,children:W.map(e=>(0,b.jsx)(s,{value:e.value,children:e.label},e.value))})]})]}),L&&(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)(`div`,{className:U,children:[(0,b.jsx)(h,{htmlFor:`ai-base-url`,className:e?z:void 0,children:`Base URL`}),(0,b.jsx)(p,{id:`ai-base-url`,type:`url`,defaultValue:I?.base_url??``,placeholder:`https://api.anthropic.com (default)`,className:e?`h-7 text-[11px]`:void 0,onBlur:e=>{R(`base_url`,e.target.value.trim()||void 0)}},`baseurl-${c}-${N}`)]}),(0,b.jsxs)(`div`,{className:U,children:[(0,b.jsx)(h,{htmlFor:`ai-api-key`,className:e?z:void 0,children:`API Key / Token`}),(0,b.jsx)(p,{id:`ai-api-key`,type:`password`,defaultValue:I?.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(`••••`)||R(`api_key`,t||void 0)}},`apikey-${c}-${N}`),(0,b.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,b.jsxs)(`div`,{className:U,children:[(0,b.jsx)(h,{htmlFor:`ai-effort`,className:e?z:void 0,children:`Effort`}),(0,b.jsxs)(i,{value:I?.effort??`high`,onValueChange:e=>R(`effort`,e),children:[(0,b.jsx)(u,{id:`ai-effort`,className:`w-full ${e?`h-7 text-[11px]`:``}`,children:(0,b.jsx)(f,{})}),(0,b.jsx)(d,{children:x.map(e=>(0,b.jsx)(s,{value:e.value,children:e.label},e.value))})]})]}),(0,b.jsxs)(`div`,{className:U,children:[(0,b.jsx)(h,{htmlFor:`ai-max-turns`,className:e?z:void 0,children:`Max Turns (1-500)`}),(0,b.jsx)(p,{id:`ai-max-turns`,type:`number`,min:1,max:500,defaultValue:I?.max_turns??100,className:e?`h-7 text-[11px]`:void 0,onBlur:e=>{let t=parseInt(e.target.value);isNaN(t)||R(`max_turns`,t)}},`turns-${c}-${N}`)]}),(0,b.jsxs)(`div`,{className:U,children:[(0,b.jsx)(h,{htmlFor:`ai-budget`,className:e?z:void 0,children:`Max Budget (USD)`}),(0,b.jsx)(p,{id:`ai-budget`,type:`number`,step:.1,min:.01,max:50,defaultValue:I?.max_budget_usd??``,placeholder:`No limit`,className:e?`h-7 text-[11px]`:void 0,onBlur:e=>{let t=parseFloat(e.target.value);R(`max_budget_usd`,isNaN(t)?void 0:t)}},`budget-${c}-${N}`)]}),(0,b.jsxs)(`div`,{className:U,children:[(0,b.jsx)(h,{htmlFor:`ai-thinking`,className:e?z:void 0,children:`Thinking Budget (tokens)`}),(0,b.jsx)(p,{id:`ai-thinking`,type:`number`,min:0,defaultValue:I?.thinking_budget_tokens??``,placeholder:`Adaptive (model decides)`,className:e?`h-7 text-[11px]`:void 0,onBlur:e=>{let t=parseInt(e.target.value);R(`thinking_budget_tokens`,isNaN(t)?void 0:t)}},`thinking-${c}-${N}`)]}),(0,b.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsx)(h,{htmlFor:`ai-agent-teams`,className:e?z:void 0,children:`Agent Teams`}),(0,b.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,b.jsx)(o,{id:`ai-agent-teams`,checked:I?.agent_teams??!1,onCheckedChange:e=>R(`agent_teams`,e)})]}),I?.agent_teams&&(0,b.jsx)(T,{compact:e}),(0,b.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsx)(h,{htmlFor:`ai-context-1m`,className:e?z:void 0,children:`1M Context Window`}),(0,b.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,b.jsx)(o,{id:`ai-context-1m`,checked:I?.context_1m??!1,onCheckedChange:e=>R(`context_1m`,e)})]}),(0,b.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsx)(h,{htmlFor:`ai-inherit-mcp`,className:e?z:void 0,children:`Inherit Claude Code MCP`}),(0,b.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,b.jsx)(o,{id:`ai-inherit-mcp`,checked:I?.inherit_claude_mcp??!0,onCheckedChange:e=>R(`inherit_claude_mcp`,e)})]})]}),(0,b.jsxs)(`div`,{className:U,children:[(0,b.jsx)(h,{htmlFor:`ai-permission-mode`,className:e?z:void 0,children:`Default Permission Mode`}),(0,b.jsxs)(i,{value:I?.permission_mode??`bypassPermissions`,onValueChange:e=>R(`permission_mode`,e),children:[(0,b.jsx)(u,{id:`ai-permission-mode`,className:`w-full ${e?`h-7 text-[11px]`:``}`,children:(0,b.jsx)(f,{})}),(0,b.jsx)(d,{children:S.map(e=>(0,b.jsx)(s,{value:e.value,children:e.label},e.value))})]})]}),(0,b.jsxs)(`div`,{className:U,children:[(0,b.jsx)(h,{htmlFor:`ai-system-prompt`,className:e?z:void 0,children:`Additional Instructions`}),(0,b.jsx)(`textarea`,{id:`ai-system-prompt`,rows:e?3:4,defaultValue:I?.system_prompt??``,placeholder:`Enter additional instructions for ${c}...`,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=>{R(`system_prompt`,e.target.value.trim()||void 0)}},`sysprompt-${c}-${N}`)]})]}),k&&(0,b.jsx)(`p`,{className:`text-xs text-text-subtle`,children:`Saving...`}),j&&(0,b.jsx)(`p`,{className:`text-xs text-error`,children:j})]})}function T({compact:e}){let[t,n]=(0,y.useState)([]),[i,a]=(0,y.useState)(!1),[o,s]=(0,y.useState)(null),l=(0,y.useCallback)(async()=>{a(!0);try{n(await r.get(`/api/teams`)??[])}catch{}a(!1)},[]);(0,y.useEffect)(()=>{l()},[l]);let u=async e=>{try{await r.del(`/api/teams/${encodeURIComponent(e)}`),n(t=>t.filter(t=>t.name!==e)),s(null)}catch{}};return t.length===0&&!i?null:(0,b.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,b.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,b.jsxs)(h,{className:e?`text-[11px]`:void 0,children:[`Teams (`,t.length,`)`]}),(0,b.jsx)(`button`,{onClick:l,className:`text-text-subtle hover:text-foreground p-1`,"aria-label":`Refresh teams`,children:(0,b.jsx)(m,{className:`size-3 ${i?`animate-spin`:``}`})})]}),t.map(e=>(0,b.jsxs)(`div`,{className:`flex items-center justify-between p-2 rounded bg-surface-elevated text-xs`,children:[(0,b.jsxs)(`div`,{className:`min-w-0`,children:[(0,b.jsx)(`div`,{className:`font-medium truncate`,children:e.name}),e.description&&(0,b.jsx)(`div`,{className:`text-text-subtle truncate`,children:e.description}),(0,b.jsxs)(`div`,{className:`text-text-subtle`,children:[e.members?.length??e.memberCount??0,` members`,e.createdAt?` · ${new Date(e.createdAt).toLocaleDateString()}`:``]})]}),o===e.name?(0,b.jsxs)(`div`,{className:`flex gap-1 shrink-0 ml-2`,children:[(0,b.jsx)(`button`,{onClick:()=>u(e.name),className:`px-2 py-1 bg-error text-white rounded text-[10px]`,children:`Delete`}),(0,b.jsx)(`button`,{onClick:()=>s(null),className:`px-2 py-1 bg-panel-2 text-text rounded text-[10px]`,children:`Cancel`})]}):(0,b.jsx)(`button`,{onClick:()=>s(e.name),className:`shrink-0 text-text-subtle hover:text-error p-1 ml-2`,"aria-label":`Delete team ${e.name}`,children:(0,b.jsx)(c,{className:`size-3.5`})})]},e.name))]})}export{w as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{K as e}from"./vendor-mermaid-CfY1-PkA.js";export{e as createArchitectureServices};
|