@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
|
@@ -18,10 +18,11 @@ import type {
|
|
|
18
18
|
ModelOption,
|
|
19
19
|
} from "./provider.interface.ts";
|
|
20
20
|
import { configService } from "../services/config.service.ts";
|
|
21
|
+
import { withSharedContext, stripSharedContext } from "../shared/provider-context.ts";
|
|
21
22
|
import { mcpConfigService } from "../services/mcp-config.service.ts";
|
|
22
23
|
import { listInheritedClaudeMcpServers } from "../services/claude-code-mcp.service.ts";
|
|
23
24
|
import { updateFromSdkEvent } from "../services/claude-usage.service.ts";
|
|
24
|
-
import { getSessionProjectPath, setSessionMetadata, getSessionTitles, insertTurnUsage, getSessionAccount } from "../services/db.service.ts";
|
|
25
|
+
import { getSessionProjectPath, setSessionMetadata, getSessionTitle, setSessionTitle, getSessionTitles, insertTurnUsage, getSessionAccount } from "../services/db.service.ts";
|
|
25
26
|
import { SUBSCRIPTION_PROMPT_CACHE_TTL_MS, API_KEY_PROMPT_CACHE_TTL_MS } from "../services/subprocess-retention.ts";
|
|
26
27
|
import { buildTurnUsage, formatTurnUsageLog } from "../shared/turn-usage.ts";
|
|
27
28
|
import { accountSelector } from "../services/account-selector.service.ts";
|
|
@@ -213,6 +214,7 @@ interface PendingApproval {
|
|
|
213
214
|
* Uses canUseTool callback for tool approvals and AskUserQuestion.
|
|
214
215
|
*/
|
|
215
216
|
export class ClaudeAgentSdkProvider implements AIProvider {
|
|
217
|
+
readonly supportsSharedContext = true;
|
|
216
218
|
id = "claude";
|
|
217
219
|
name = "Claude";
|
|
218
220
|
|
|
@@ -571,7 +573,7 @@ export class ClaudeAgentSdkProvider implements AIProvider {
|
|
|
571
573
|
const sessions: SessionInfo[] = sdkSessions.map((s) => ({
|
|
572
574
|
id: s.sessionId,
|
|
573
575
|
providerId: this.id,
|
|
574
|
-
title: dbTitles[s.sessionId] ?? s.customTitle ?? s.summary ?? s.firstPrompt ?? "Chat",
|
|
576
|
+
title: dbTitles[s.sessionId] ?? s.customTitle ?? s.summary ?? (stripSharedContext(s.firstPrompt ?? "") || "Chat"),
|
|
575
577
|
createdAt: new Date(s.lastModified).toISOString(),
|
|
576
578
|
updatedAt: new Date(s.lastModified).toISOString(),
|
|
577
579
|
}));
|
|
@@ -619,7 +621,7 @@ export class ClaudeAgentSdkProvider implements AIProvider {
|
|
|
619
621
|
return {
|
|
620
622
|
id: info.sessionId,
|
|
621
623
|
providerId: this.id,
|
|
622
|
-
title: dbTitles[info.sessionId] ?? info.customTitle ?? info.summary ?? info.firstPrompt ?? "Chat",
|
|
624
|
+
title: dbTitles[info.sessionId] ?? info.customTitle ?? info.summary ?? (stripSharedContext(info.firstPrompt ?? "") || "Chat"),
|
|
623
625
|
createdAt: new Date(info.lastModified).toISOString(),
|
|
624
626
|
updatedAt: new Date(info.lastModified).toISOString(),
|
|
625
627
|
};
|
|
@@ -725,13 +727,14 @@ export class ClaudeAgentSdkProvider implements AIProvider {
|
|
|
725
727
|
* Push a follow-up message into an existing streaming session's generator.
|
|
726
728
|
* Called by WS handler for follow-up messages (Phase 2).
|
|
727
729
|
*/
|
|
728
|
-
pushMessage(sessionId: string, content: string, opts?:
|
|
730
|
+
pushMessage(sessionId: string, content: string, opts?: import("./provider.interface.ts").SendMessageOpts): void {
|
|
729
731
|
const ss = this.streamingSessions.get(sessionId);
|
|
730
732
|
if (!ss) {
|
|
731
733
|
console.warn(`[sdk] pushMessage: no streaming session for ${sessionId}`);
|
|
732
734
|
return;
|
|
733
735
|
}
|
|
734
|
-
const
|
|
736
|
+
const modelInput = withSharedContext(content, opts?.sharedContext);
|
|
737
|
+
const msgContent = buildMessageParam(modelInput, opts?.images);
|
|
735
738
|
ss.controller.push({
|
|
736
739
|
type: 'user',
|
|
737
740
|
message: msgContent,
|
|
@@ -740,7 +743,7 @@ export class ClaudeAgentSdkProvider implements AIProvider {
|
|
|
740
743
|
priority: opts?.priority ?? 'next',
|
|
741
744
|
});
|
|
742
745
|
// Track latest message for retry paths (fixes stale firstMsg bug)
|
|
743
|
-
ss.lastUserContent =
|
|
746
|
+
ss.lastUserContent = modelInput;
|
|
744
747
|
ss.lastUserImages = opts?.images;
|
|
745
748
|
console.log(`[sdk] pushMessage: session=${sessionId} priority=${opts?.priority ?? 'next'}`);
|
|
746
749
|
}
|
|
@@ -794,6 +797,7 @@ export class ClaudeAgentSdkProvider implements AIProvider {
|
|
|
794
797
|
message: string,
|
|
795
798
|
opts?: import("./provider.interface.ts").SendMessageOpts & { forkSession?: boolean; priority?: 'now' | 'next' | 'later'; images?: Array<{ data: string; mediaType: string }> },
|
|
796
799
|
): AsyncIterable<ChatEvent> {
|
|
800
|
+
const modelInput = withSharedContext(message, opts?.sharedContext);
|
|
797
801
|
// SDK requires valid UUID session IDs. Short/random IDs can leak from
|
|
798
802
|
// tab derivation or URL parsing — migrate to a real UUID early.
|
|
799
803
|
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
@@ -826,7 +830,7 @@ export class ClaudeAgentSdkProvider implements AIProvider {
|
|
|
826
830
|
// Follow-up: push into existing streaming session, yield nothing
|
|
827
831
|
const existingStream = this.streamingSessions.get(sessionId);
|
|
828
832
|
if (existingStream) {
|
|
829
|
-
const msgContent = buildMessageParam(
|
|
833
|
+
const msgContent = buildMessageParam(modelInput, opts?.images);
|
|
830
834
|
existingStream.controller.push({
|
|
831
835
|
type: 'user',
|
|
832
836
|
message: msgContent,
|
|
@@ -835,7 +839,7 @@ export class ClaudeAgentSdkProvider implements AIProvider {
|
|
|
835
839
|
priority: opts?.priority ?? 'next',
|
|
836
840
|
});
|
|
837
841
|
// Track latest message for retry paths (fixes stale firstMsg bug)
|
|
838
|
-
existingStream.lastUserContent =
|
|
842
|
+
existingStream.lastUserContent = modelInput;
|
|
839
843
|
existingStream.lastUserImages = opts?.images;
|
|
840
844
|
console.log(`[sdk] sendMessage follow-up: session=${sessionId} pushed to generator`);
|
|
841
845
|
return; // Events flow through first-message's consumer loop
|
|
@@ -853,6 +857,11 @@ export class ClaudeAgentSdkProvider implements AIProvider {
|
|
|
853
857
|
const count = this.messageCount.get(sessionId) ?? 0;
|
|
854
858
|
const isFirstMessage = count === 0;
|
|
855
859
|
this.messageCount.set(sessionId, count + 1);
|
|
860
|
+
// Native firstPrompt may truncate before the shared-context block ends.
|
|
861
|
+
// Keep the opening user title available after restart without replacing a rename.
|
|
862
|
+
if (isFirstMessage && opts?.sharedContext && getSessionTitle(sessionId) === null) {
|
|
863
|
+
setSessionTitle(sessionId, meta.title);
|
|
864
|
+
}
|
|
856
865
|
|
|
857
866
|
// Check if this session should fork from another
|
|
858
867
|
const forkSourceId = this.forkSources.get(sessionId);
|
|
@@ -1145,7 +1154,7 @@ export class ClaudeAgentSdkProvider implements AIProvider {
|
|
|
1145
1154
|
// model a bare path instead — the round trip the caller passed them in to avoid.
|
|
1146
1155
|
const firstMsg = {
|
|
1147
1156
|
type: 'user' as const,
|
|
1148
|
-
message: buildMessageParam(
|
|
1157
|
+
message: buildMessageParam(modelInput, opts?.images),
|
|
1149
1158
|
parent_tool_use_id: null,
|
|
1150
1159
|
session_id: sessionId,
|
|
1151
1160
|
};
|
|
@@ -1165,7 +1174,7 @@ export class ClaudeAgentSdkProvider implements AIProvider {
|
|
|
1165
1174
|
// Also returns the raw content/images for re-populating the new streaming session.
|
|
1166
1175
|
const buildRetryMsg = () => {
|
|
1167
1176
|
const ss = this.streamingSessions.get(sessionId);
|
|
1168
|
-
const content = ss?.lastUserContent ??
|
|
1177
|
+
const content = ss?.lastUserContent ?? modelInput;
|
|
1169
1178
|
const images = ss?.lastUserImages;
|
|
1170
1179
|
const retryContent = turnProgressed ? "Continue from where you left off." : content;
|
|
1171
1180
|
return {
|
|
@@ -1184,7 +1193,7 @@ export class ClaudeAgentSdkProvider implements AIProvider {
|
|
|
1184
1193
|
// On crash retry, use buildRetryMsg to get the latest user message (not the stale firstMsg)
|
|
1185
1194
|
const initRetry = crashRetryCount > 0 ? buildRetryMsg() : null;
|
|
1186
1195
|
initialCtrl.push(initRetry?.msg ?? firstMsg);
|
|
1187
|
-
const initContent = initRetry?.lastUserContent ??
|
|
1196
|
+
const initContent = initRetry?.lastUserContent ?? modelInput;
|
|
1188
1197
|
const initImages = initRetry?.lastUserImages ?? opts?.images;
|
|
1189
1198
|
|
|
1190
1199
|
const initialQuery = query({
|
|
@@ -2219,7 +2228,7 @@ function findMissingSessions(
|
|
|
2219
2228
|
if (head[end] === '"') break;
|
|
2220
2229
|
end++;
|
|
2221
2230
|
}
|
|
2222
|
-
const raw = head.slice(start, end).replace(/\\n/g, "
|
|
2231
|
+
const raw = stripSharedContext(head.slice(start, end).replace(/\\n/g, "\n").replace(/\\"/g, '"').trim()).replace(/\n/g, " ");
|
|
2223
2232
|
if (raw.length > 0) {
|
|
2224
2233
|
title = raw.length > 120 ? raw.slice(0, 120) + "…" : raw;
|
|
2225
2234
|
}
|
|
@@ -2236,4 +2245,3 @@ function findMissingSessions(
|
|
|
2236
2245
|
}
|
|
2237
2246
|
return results;
|
|
2238
2247
|
}
|
|
2239
|
-
|
|
@@ -9,6 +9,7 @@ import type {
|
|
|
9
9
|
import { spawn, type ChildProcess } from "node:child_process";
|
|
10
10
|
import { parseNdjsonLines } from "../utils/ndjson-line-parser.ts";
|
|
11
11
|
import { configService } from "../services/config.service.ts";
|
|
12
|
+
import { withSharedContext } from "../shared/provider-context.ts";
|
|
12
13
|
|
|
13
14
|
/**
|
|
14
15
|
* Abstract base class for CLI-spawning AI providers.
|
|
@@ -16,6 +17,7 @@ import { configService } from "../services/config.service.ts";
|
|
|
16
17
|
* Subclasses only implement event mapping + arg building.
|
|
17
18
|
*/
|
|
18
19
|
export abstract class CliProvider implements AIProvider {
|
|
20
|
+
readonly supportsSharedContext = true;
|
|
19
21
|
abstract readonly id: string;
|
|
20
22
|
abstract readonly name: string;
|
|
21
23
|
abstract readonly cliCommand: string;
|
|
@@ -118,7 +120,7 @@ export abstract class CliProvider implements AIProvider {
|
|
|
118
120
|
const config = this.getProviderConfig();
|
|
119
121
|
const args = this.buildArgs({
|
|
120
122
|
sessionId: isResume ? sessionId : undefined,
|
|
121
|
-
message,
|
|
123
|
+
message: withSharedContext(message, opts?.sharedContext),
|
|
122
124
|
model: config?.model,
|
|
123
125
|
permissionMode: opts?.permissionMode || config?.permission_mode,
|
|
124
126
|
isResume,
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ChatMessage, ChatEvent, SessionInfo } from "../provider.interface.ts";
|
|
2
|
+
import { stripSharedContext } from "../../shared/provider-context.ts";
|
|
2
3
|
import { readdirSync, readFileSync, statSync } from "node:fs";
|
|
3
4
|
import { join, resolve } from "node:path";
|
|
4
5
|
import { homedir } from "node:os";
|
|
@@ -135,7 +136,7 @@ export function parseRolloutJsonl(
|
|
|
135
136
|
if (rec.type === "event_msg") {
|
|
136
137
|
if (p.type === "user_message" && typeof p.message === "string") {
|
|
137
138
|
if (pendingEvents.length) flushAssistant("", ts); // tools with no final text
|
|
138
|
-
messages.push({ id: `rollout-${i++}`, role: "user", content: p.message, timestamp: ts });
|
|
139
|
+
messages.push({ id: `rollout-${i++}`, role: "user", content: stripSharedContext(p.message), timestamp: ts });
|
|
139
140
|
} else if (p.type === "agent_message" && typeof p.message === "string") {
|
|
140
141
|
flushAssistant(p.message, ts);
|
|
141
142
|
} else if (p.type === "item_completed") {
|
|
@@ -145,7 +146,7 @@ export function parseRolloutJsonl(
|
|
|
145
146
|
const mapped = mapRolloutItem(p.item);
|
|
146
147
|
if (mapped.kind === "user") {
|
|
147
148
|
if (pendingEvents.length) flushAssistant("", ts);
|
|
148
|
-
messages.push({ id: `rollout-${i++}`, role: "user", content: mapped.text, timestamp: ts });
|
|
149
|
+
messages.push({ id: `rollout-${i++}`, role: "user", content: stripSharedContext(mapped.text), timestamp: ts });
|
|
149
150
|
} else if (mapped.kind === "assistant") {
|
|
150
151
|
flushAssistant(mapped.text, ts);
|
|
151
152
|
} else if (mapped.kind === "events") {
|
|
@@ -196,7 +197,8 @@ export function parseRolloutJsonl(
|
|
|
196
197
|
if (item.type !== "message") continue;
|
|
197
198
|
const role = item.role === "assistant" ? "assistant" : item.role === "user" ? "user" : null;
|
|
198
199
|
if (!role) continue;
|
|
199
|
-
const
|
|
200
|
+
const rawContent = contentToText(item.content);
|
|
201
|
+
const content = role === "user" ? stripSharedContext(rawContent) : rawContent;
|
|
200
202
|
if (content) messages.push({ id: `rollout-${i++}`, role, content, timestamp: ts });
|
|
201
203
|
}
|
|
202
204
|
}
|
|
@@ -10,6 +10,7 @@ import type {
|
|
|
10
10
|
UsageInfo,
|
|
11
11
|
} from "../provider.interface.ts";
|
|
12
12
|
import { configService } from "../../services/config.service.ts";
|
|
13
|
+
import { withSharedContext } from "../../shared/provider-context.ts";
|
|
13
14
|
import { setSessionMetadata, getSessionProjectPath, setSessionProvider, setSessionCodexAccount, getSessionCodexAccount, getSessionTitles, insertTurnUsage } from "../../services/db.service.ts";
|
|
14
15
|
import {
|
|
15
16
|
resolveCodexAccountForSession,
|
|
@@ -291,6 +292,7 @@ function buildUserInputResponse(questions: unknown, data: unknown): ToolRequestU
|
|
|
291
292
|
* notification stream. Token-by-token streaming is the load-bearing capability.
|
|
292
293
|
*/
|
|
293
294
|
export class CodexAppServerProvider implements AIProvider {
|
|
295
|
+
readonly supportsSharedContext = true;
|
|
294
296
|
readonly id = "codex";
|
|
295
297
|
readonly name = "Codex";
|
|
296
298
|
|
|
@@ -448,7 +450,7 @@ export class CodexAppServerProvider implements AIProvider {
|
|
|
448
450
|
// gets. Images lead: the text usually refers to them ("what is this?").
|
|
449
451
|
const input: UserInput[] = [
|
|
450
452
|
...(opts?.imagePaths ?? []).map((path) => ({ type: "localImage" as const, path })),
|
|
451
|
-
{ type: "text" as const, text: message, text_elements: [] },
|
|
453
|
+
{ type: "text" as const, text: withSharedContext(message, opts?.sharedContext), text_elements: [] },
|
|
452
454
|
];
|
|
453
455
|
const turnModel = codexModel(opts?.model);
|
|
454
456
|
const turnEffort = opts?.effort ?? this.config?.effort;
|
|
@@ -651,6 +653,7 @@ export class CodexAppServerProvider implements AIProvider {
|
|
|
651
653
|
client.notify("initialized");
|
|
652
654
|
|
|
653
655
|
const resumeBase = {
|
|
656
|
+
...this.contextConfigOverrides(),
|
|
654
657
|
cwd: live.cwd,
|
|
655
658
|
sandbox: live.permission.sandbox,
|
|
656
659
|
approvalPolicy: live.permission.approvalPolicy,
|
|
@@ -687,6 +690,17 @@ export class CodexAppServerProvider implements AIProvider {
|
|
|
687
690
|
return client.request("thread/resume", { threadId, path, ...resumeBase });
|
|
688
691
|
}
|
|
689
692
|
|
|
693
|
+
/** Read on connect/resume only; changing settings never interrupts a live turn. */
|
|
694
|
+
private contextConfigOverrides(): { config?: Record<string, number> } {
|
|
695
|
+
const providerConfig = this.config;
|
|
696
|
+
const config: Record<string, number> = {};
|
|
697
|
+
for (const key of ["model_context_window", "model_auto_compact_token_limit"] as const) {
|
|
698
|
+
const value = providerConfig?.[key];
|
|
699
|
+
if (value != null) config[key] = value;
|
|
700
|
+
}
|
|
701
|
+
return Object.keys(config).length ? { config } : {};
|
|
702
|
+
}
|
|
703
|
+
|
|
690
704
|
private async connect(sessionId: string, opts?: SendMessageOpts): Promise<LiveSession> {
|
|
691
705
|
const meta = this.sessions.get(sessionId);
|
|
692
706
|
const cwd = meta?.projectPath || getSessionProjectPath(sessionId) || process.cwd();
|
|
@@ -720,7 +734,7 @@ export class CodexAppServerProvider implements AIProvider {
|
|
|
720
734
|
await client.request("initialize", { clientInfo: CLIENT_INFO, capabilities: CAPABILITIES }, CONTROL_REQUEST_TIMEOUT_MS);
|
|
721
735
|
client.notify("initialized");
|
|
722
736
|
|
|
723
|
-
const resumeBase = { cwd, sandbox: permission.sandbox, approvalPolicy: permission.approvalPolicy, ...(model ? { model } : {}) };
|
|
737
|
+
const resumeBase = { cwd, sandbox: permission.sandbox, approvalPolicy: permission.approvalPolicy, ...(model ? { model } : {}), ...this.contextConfigOverrides() };
|
|
724
738
|
// Only treat as a resume when a rollout for this id is attributable to THIS
|
|
725
739
|
// project (fail-closed cwd guard) — never resume another project's thread.
|
|
726
740
|
const result = found
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { mapRolloutItem } from "./codex-rollout-items.ts";
|
|
2
|
+
import { stripSharedContext } from "../../shared/provider-context.ts";
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* Line primitives for a codex rollout JSONL, plus the header a session list
|
|
@@ -49,7 +50,7 @@ const TITLE_MAX_CHARS = 80;
|
|
|
49
50
|
|
|
50
51
|
/** First user prompt → a one-line label. */
|
|
51
52
|
function toTitle(text: string): string | undefined {
|
|
52
|
-
const flat = text.replace(/\s+/g, " ").trim();
|
|
53
|
+
const flat = stripSharedContext(text).replace(/\s+/g, " ").trim();
|
|
53
54
|
if (!flat) return undefined;
|
|
54
55
|
return flat.length > TITLE_MAX_CHARS ? `${flat.slice(0, TITLE_MAX_CHARS - 1)}…` : flat;
|
|
55
56
|
}
|
|
@@ -3,6 +3,7 @@ import { homedir } from "node:os";
|
|
|
3
3
|
import { join } from "node:path";
|
|
4
4
|
import { existsSync, readdirSync } from "node:fs";
|
|
5
5
|
import type { ChatMessage, SessionInfo } from "../provider.interface.ts";
|
|
6
|
+
import { stripSharedContext } from "../../shared/provider-context.ts";
|
|
6
7
|
|
|
7
8
|
const DEFAULT_CHATS_DIR = join(homedir(), ".cursor", "chats");
|
|
8
9
|
|
|
@@ -38,7 +39,7 @@ export async function listCursorSessions(providerId: string, chatsDir?: string):
|
|
|
38
39
|
const hex = typeof row.value === "string" ? row.value : Buffer.from(row.value).toString("utf-8");
|
|
39
40
|
const json = Buffer.from(hex, "hex").toString("utf-8");
|
|
40
41
|
const meta = JSON.parse(json);
|
|
41
|
-
if (meta.name) title = meta.name.split("\n")[0]
|
|
42
|
+
if (meta.name) title = stripSharedContext(meta.name).split("\n")[0]?.slice(0, 80) || title;
|
|
42
43
|
if (meta.createdAt) createdAt = new Date(meta.createdAt).toISOString();
|
|
43
44
|
}
|
|
44
45
|
} catch { /* use defaults */ }
|
|
@@ -139,6 +140,7 @@ function parseDagBlobs(
|
|
|
139
140
|
if (parsed.role === "user") {
|
|
140
141
|
const match = content.match(/<user_query>\s*([\s\S]*?)\s*<\/user_query>/);
|
|
141
142
|
if (match?.[1]) content = match[1];
|
|
143
|
+
content = stripSharedContext(content);
|
|
142
144
|
}
|
|
143
145
|
messages.push({
|
|
144
146
|
id: blob.id,
|
|
@@ -159,7 +161,7 @@ function parseDagBlobs(
|
|
|
159
161
|
messages.push({
|
|
160
162
|
id: blob.id,
|
|
161
163
|
role: messages.length % 2 === 0 ? "user" : "assistant",
|
|
162
|
-
content: textParts,
|
|
164
|
+
content: messages.length % 2 === 0 ? stripSharedContext(textParts) : textParts,
|
|
163
165
|
timestamp: new Date().toISOString(),
|
|
164
166
|
});
|
|
165
167
|
continue;
|
|
@@ -3,6 +3,7 @@ import { configService, FILE_CONFIG_KEYS } from "../../services/config.service.t
|
|
|
3
3
|
import { getConfigValue, setConfigValue, listPairedChats, getPairingByCode, approvePairing, revokePairing, getPPMBotMemories, getDb } from "../../services/db.service.ts";
|
|
4
4
|
import {
|
|
5
5
|
validateAIProviderConfig,
|
|
6
|
+
validateCodexContextConfig,
|
|
6
7
|
validateDefaultProvider,
|
|
7
8
|
VALID_PROVIDERS,
|
|
8
9
|
DEFAULT_CONFIG,
|
|
@@ -178,16 +179,21 @@ settingsRoutes.get("/ai", (c) => {
|
|
|
178
179
|
return c.json(ok(stripSensitiveFields(ai)));
|
|
179
180
|
});
|
|
180
181
|
|
|
181
|
-
/** PUT /settings/ai — update AI
|
|
182
|
+
/** PUT /settings/ai — update AI settings, persists to SQLite */
|
|
182
183
|
settingsRoutes.put("/ai", async (c) => {
|
|
183
184
|
try {
|
|
184
185
|
const body = await c.req.json<{
|
|
185
186
|
default_provider?: string;
|
|
187
|
+
share_provider_context?: boolean;
|
|
186
188
|
providers?: Record<string, Partial<AIProviderConfig>>;
|
|
187
189
|
}>();
|
|
188
190
|
|
|
189
191
|
const currentAi = configService.get("ai");
|
|
190
192
|
|
|
193
|
+
if ("share_provider_context" in body && typeof body.share_provider_context !== "boolean") {
|
|
194
|
+
return c.json(err("share_provider_context must be a boolean"), 400);
|
|
195
|
+
}
|
|
196
|
+
|
|
191
197
|
// Validate each provider config
|
|
192
198
|
if (body.providers) {
|
|
193
199
|
for (const [name, providerConfig] of Object.entries(body.providers)) {
|
|
@@ -201,6 +207,7 @@ settingsRoutes.put("/ai", async (c) => {
|
|
|
201
207
|
// Merge: body overrides current values (shallow merge per provider)
|
|
202
208
|
const updated = {
|
|
203
209
|
...currentAi,
|
|
210
|
+
share_provider_context: body.share_provider_context ?? currentAi.share_provider_context ?? true,
|
|
204
211
|
...(body.default_provider && { default_provider: body.default_provider }),
|
|
205
212
|
};
|
|
206
213
|
if (body.providers) {
|
|
@@ -214,6 +221,13 @@ settingsRoutes.put("/ai", async (c) => {
|
|
|
214
221
|
...currentAi.providers[name],
|
|
215
222
|
...config,
|
|
216
223
|
} as AIProviderConfig;
|
|
224
|
+
for (const key of ["model_context_window", "model_auto_compact_token_limit"] as const) {
|
|
225
|
+
if (updated.providers[name]![key] === null) delete updated.providers[name]![key];
|
|
226
|
+
}
|
|
227
|
+
const contextErrors = validateCodexContextConfig(updated.providers[name]!);
|
|
228
|
+
if (contextErrors.length) {
|
|
229
|
+
return c.json(err(`Provider "${name}": ${contextErrors.join(", ")}`), 400);
|
|
230
|
+
}
|
|
217
231
|
}
|
|
218
232
|
}
|
|
219
233
|
|
package/src/server/ws/chat.ts
CHANGED
|
@@ -1288,7 +1288,7 @@ export const chatWebSocket = {
|
|
|
1288
1288
|
if (provider && "pushMessage" in provider && parsed.type === "message") {
|
|
1289
1289
|
const effort = getSessionEffort(sessionId) ?? undefined;
|
|
1290
1290
|
const thinkingBudget = getSessionThinking(sessionId);
|
|
1291
|
-
|
|
1291
|
+
await chatService.pushMessage(providerId, sessionId, parsed.content, {
|
|
1292
1292
|
priority: parsed.priority ?? 'next',
|
|
1293
1293
|
images: parsed.images,
|
|
1294
1294
|
imagePaths: parsed.imagePaths,
|
|
@@ -1413,7 +1413,7 @@ export const chatWebSocket = {
|
|
|
1413
1413
|
}, 0);
|
|
1414
1414
|
});
|
|
1415
1415
|
} else if (provider && "pushMessage" in provider) {
|
|
1416
|
-
|
|
1416
|
+
await chatService.pushMessage(providerId, sessionId, instruction, { priority: "next" });
|
|
1417
1417
|
entry.turnEvents = [];
|
|
1418
1418
|
entry.pendingApprovalEvent = undefined;
|
|
1419
1419
|
setPhase(sessionId, "thinking");
|
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import { providerRegistry } from "../providers/registry.ts";
|
|
2
|
+
import { configService } from "./config.service.ts";
|
|
3
|
+
import { createHash } from "node:crypto";
|
|
4
|
+
import { buildSharedProviderContext } from "./provider-shared-context.ts";
|
|
5
|
+
import { stripSharedContext, withSharedContext } from "../shared/provider-context.ts";
|
|
2
6
|
import type {
|
|
3
7
|
Session,
|
|
4
8
|
SessionConfig,
|
|
@@ -9,6 +13,20 @@ import type {
|
|
|
9
13
|
} from "../providers/provider.interface.ts";
|
|
10
14
|
|
|
11
15
|
class ChatService {
|
|
16
|
+
// Delivery hints only: a restart/eviction safely sends a fresh snapshot.
|
|
17
|
+
private sharedSnapshots = new Map<string, string>();
|
|
18
|
+
|
|
19
|
+
private rememberSharedContext(providerId: string, sessionId: string, context?: string): void {
|
|
20
|
+
if (!context) return;
|
|
21
|
+
const key = `${providerId}:${sessionId}`;
|
|
22
|
+
this.sharedSnapshots.delete(key);
|
|
23
|
+
this.sharedSnapshots.set(key, createHash("sha256").update(context).digest("hex"));
|
|
24
|
+
if (this.sharedSnapshots.size > 512) this.sharedSnapshots.delete(this.sharedSnapshots.keys().next().value!);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
invalidateSharedContext(providerId: string, sessionId: string): void {
|
|
28
|
+
this.sharedSnapshots.delete(`${providerId}:${sessionId}`);
|
|
29
|
+
}
|
|
12
30
|
async createSession(
|
|
13
31
|
providerId?: string,
|
|
14
32
|
config: SessionConfig = {},
|
|
@@ -32,6 +50,7 @@ class ChatService {
|
|
|
32
50
|
): Promise<Session> {
|
|
33
51
|
const provider = providerRegistry.get(providerId);
|
|
34
52
|
if (!provider) throw new Error(`Provider "${providerId}" not found`);
|
|
53
|
+
this.invalidateSharedContext(providerId, sessionId);
|
|
35
54
|
return provider.resumeSession(sessionId);
|
|
36
55
|
}
|
|
37
56
|
|
|
@@ -68,6 +87,7 @@ class ChatService {
|
|
|
68
87
|
): Promise<void> {
|
|
69
88
|
const provider = providerRegistry.get(providerId);
|
|
70
89
|
if (!provider) throw new Error(`Provider "${providerId}" not found`);
|
|
90
|
+
this.invalidateSharedContext(providerId, sessionId);
|
|
71
91
|
return provider.deleteSession(sessionId);
|
|
72
92
|
}
|
|
73
93
|
|
|
@@ -82,7 +102,77 @@ class ChatService {
|
|
|
82
102
|
yield { type: "error", message: `Provider "${providerId}" not found` };
|
|
83
103
|
return;
|
|
84
104
|
}
|
|
85
|
-
|
|
105
|
+
const prepared = await this.prepareSendOptions(providerId, sessionId, message, opts);
|
|
106
|
+
this.rememberSharedContext(providerId, sessionId, prepared.sharedContext);
|
|
107
|
+
let finished = false;
|
|
108
|
+
let activeSessionId = sessionId;
|
|
109
|
+
try {
|
|
110
|
+
for await (const event of provider.sendMessage(sessionId,
|
|
111
|
+
provider.supportsSharedContext ? message : withSharedContext(message, prepared.sharedContext),
|
|
112
|
+
{ ...prepared, sharedContext: provider.supportsSharedContext ? prepared.sharedContext : undefined })) {
|
|
113
|
+
if (event.type === "error" || (event.type === "done" && event.resultSubtype?.startsWith("error")) || (event.type === "system" && event.subtype === "compact_done")) {
|
|
114
|
+
this.invalidateSharedContext(providerId, activeSessionId);
|
|
115
|
+
}
|
|
116
|
+
const migratedId = event.type === "session_migrated" ? event.newSessionId : event.type === "done" ? event.sessionId : undefined;
|
|
117
|
+
if (migratedId && migratedId !== activeSessionId) {
|
|
118
|
+
const snapshot = this.sharedSnapshots.get(`${providerId}:${activeSessionId}`);
|
|
119
|
+
if (snapshot) {
|
|
120
|
+
this.sharedSnapshots.set(`${providerId}:${migratedId}`, snapshot);
|
|
121
|
+
this.invalidateSharedContext(providerId, activeSessionId);
|
|
122
|
+
}
|
|
123
|
+
activeSessionId = migratedId;
|
|
124
|
+
}
|
|
125
|
+
yield event;
|
|
126
|
+
}
|
|
127
|
+
finished = true;
|
|
128
|
+
} finally {
|
|
129
|
+
if (!finished) this.invalidateSharedContext(providerId, activeSessionId);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/** Prepare context for both a new stream and a live stream's follow-up turn. */
|
|
134
|
+
async prepareSendOptions(
|
|
135
|
+
providerId: string,
|
|
136
|
+
sessionId: string,
|
|
137
|
+
message: string,
|
|
138
|
+
opts?: SendMessageOpts,
|
|
139
|
+
): Promise<SendMessageOpts> {
|
|
140
|
+
if (!providerRegistry.get(providerId)) throw new Error(`Provider "${providerId}" not found`);
|
|
141
|
+
let sharedContext: string | undefined;
|
|
142
|
+
if (configService.get("ai").share_provider_context === false || /^\s*\/(compact|clear|new)(\s|$)/i.test(message)) {
|
|
143
|
+
this.invalidateSharedContext(providerId, sessionId);
|
|
144
|
+
}
|
|
145
|
+
// Slash commands belong to the runtime parser. A context prefix would turn
|
|
146
|
+
// /compact (or a provider skill) into an ordinary prompt.
|
|
147
|
+
if (configService.get("ai").share_provider_context !== false && !message.trimStart().startsWith("/")) {
|
|
148
|
+
const { getSessionProjectPath } = await import("./db.service.ts");
|
|
149
|
+
const projectPath = this.getSession(sessionId)?.projectPath ?? getSessionProjectPath(sessionId);
|
|
150
|
+
if (projectPath) {
|
|
151
|
+
const providers = providerRegistry.listAll().flatMap(({ id }) => {
|
|
152
|
+
const item = providerRegistry.get(id);
|
|
153
|
+
return item ? [item] : [];
|
|
154
|
+
});
|
|
155
|
+
sharedContext = await buildSharedProviderContext(projectPath, providers, { recipientProviderId: providerId });
|
|
156
|
+
const hash = createHash("sha256").update(sharedContext).digest("hex");
|
|
157
|
+
if (this.sharedSnapshots.get(`${providerId}:${sessionId}`) === hash) sharedContext = undefined;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return { ...opts, sharedContext };
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/** Push a live follow-up through the same context policy as sendMessage. */
|
|
164
|
+
async pushMessage(providerId: string, sessionId: string, message: string, opts?: SendMessageOpts): Promise<void> {
|
|
165
|
+
const provider = providerRegistry.get(providerId);
|
|
166
|
+
if (!provider) throw new Error(`Provider "${providerId}" not found`);
|
|
167
|
+
const streaming = provider as typeof provider & {
|
|
168
|
+
pushMessage?: (id: string, content: string, options: SendMessageOpts) => void;
|
|
169
|
+
};
|
|
170
|
+
if (!streaming.pushMessage) return;
|
|
171
|
+
const prepared = await this.prepareSendOptions(providerId, sessionId, message, opts);
|
|
172
|
+
streaming.pushMessage(sessionId,
|
|
173
|
+
provider.supportsSharedContext ? message : withSharedContext(message, prepared.sharedContext),
|
|
174
|
+
{ ...prepared, sharedContext: provider.supportsSharedContext ? prepared.sharedContext : undefined });
|
|
175
|
+
this.rememberSharedContext(providerId, sessionId, prepared.sharedContext);
|
|
86
176
|
}
|
|
87
177
|
|
|
88
178
|
/** Look up a session across all providers (for WS handler) */
|
|
@@ -106,7 +196,10 @@ class ChatService {
|
|
|
106
196
|
async getMessages(providerId: string, sessionId: string): Promise<ChatMessage[]> {
|
|
107
197
|
const provider = providerRegistry.get(providerId);
|
|
108
198
|
if (!provider) return [];
|
|
109
|
-
|
|
199
|
+
const messages = await provider.getMessages?.(sessionId) ?? [];
|
|
200
|
+
return messages.map((message) => message.role === "user"
|
|
201
|
+
? { ...message, content: stripSharedContext(message.content) }
|
|
202
|
+
: message);
|
|
110
203
|
}
|
|
111
204
|
}
|
|
112
205
|
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { Database } from "bun:sqlite";
|
|
2
|
+
import { readdirSync, realpathSync } from "node:fs";
|
|
3
|
+
import { join, resolve } from "node:path";
|
|
4
|
+
|
|
5
|
+
const MAX_MEMORIES = 24;
|
|
6
|
+
const MAX_CHARS = 24_000;
|
|
7
|
+
|
|
8
|
+
function latestDatabase(home: string, name: string): string | undefined {
|
|
9
|
+
try {
|
|
10
|
+
const candidates = readdirSync(home).filter((file) => new RegExp(`^${name}_\\d+\\.sqlite$`).test(file));
|
|
11
|
+
candidates.sort((a, b) => Number(b.match(/_(\d+)/)?.[1]) - Number(a.match(/_(\d+)/)?.[1]));
|
|
12
|
+
return candidates[0] ? join(home, candidates[0]) : undefined;
|
|
13
|
+
} catch { return undefined; }
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/** Read native distilled memories only for threads belonging to this exact project. */
|
|
17
|
+
export function readCodexNativeMemory(projectPath: string, codexHomes: string[]): Array<{ path: string; content: string }> {
|
|
18
|
+
const result: Array<{ path: string; content: string }> = [];
|
|
19
|
+
const windows = process.platform === "win32";
|
|
20
|
+
let canonicalProject = resolve(projectPath);
|
|
21
|
+
try { canonicalProject = realpathSync(canonicalProject); } catch { /* A deleted project can still have native memory. */ }
|
|
22
|
+
const project = canonicalProject.replaceAll("\\", "/").replace(/\/+$/, "");
|
|
23
|
+
let remaining = MAX_CHARS;
|
|
24
|
+
const seen = new Set<string>();
|
|
25
|
+
for (const home of new Set(codexHomes)) {
|
|
26
|
+
if (!remaining || result.length >= MAX_MEMORIES) break;
|
|
27
|
+
const statePath = latestDatabase(home, "state");
|
|
28
|
+
if (!statePath) continue;
|
|
29
|
+
// Older native releases stored stage1_outputs in the state database itself.
|
|
30
|
+
const memoryPath = latestDatabase(home, "memories") ?? statePath;
|
|
31
|
+
let state: Database | undefined;
|
|
32
|
+
let memories: Database | undefined;
|
|
33
|
+
try {
|
|
34
|
+
state = new Database(statePath, { readonly: true });
|
|
35
|
+
const columns = state.query("PRAGMA table_info(threads)").all() as Array<{ name: string }>;
|
|
36
|
+
const cwd = "rtrim(replace(cwd, char(92), '/'), '/')";
|
|
37
|
+
const enabled = columns.some((column) => column.name === "memory_mode") ? " AND memory_mode != 'disabled'" : "";
|
|
38
|
+
const recent = columns.some((column) => column.name === "updated_at") ? " ORDER BY updated_at DESC" : "";
|
|
39
|
+
const threads = state.query(`SELECT id FROM threads WHERE ${windows ? `lower(${cwd})` : cwd} = ?${enabled}${recent} LIMIT 256`)
|
|
40
|
+
.all(windows ? project.toLowerCase() : project) as Array<{ id: string }>;
|
|
41
|
+
if (!threads.length) continue;
|
|
42
|
+
memories = new Database(memoryPath, { readonly: true });
|
|
43
|
+
const placeholders = threads.map(() => "?").join(",");
|
|
44
|
+
const rows = memories.query(`SELECT thread_id, substr(raw_memory, 1, 12000) AS raw_memory, length(raw_memory) AS full_length FROM stage1_outputs WHERE thread_id IN (${placeholders}) ORDER BY generated_at DESC LIMIT ?`)
|
|
45
|
+
.all(...threads.map((thread) => thread.id), MAX_MEMORIES) as Array<{ thread_id: string; raw_memory: string; full_length: number }>;
|
|
46
|
+
for (const row of rows) {
|
|
47
|
+
const raw = row.raw_memory?.trim();
|
|
48
|
+
if (!raw || raw.includes("\0") || seen.has(raw) || remaining < 200) continue;
|
|
49
|
+
const path = `${memoryPath}#stage1_outputs/${row.thread_id}`;
|
|
50
|
+
const excerpt = raw.slice(0, Math.max(0, remaining - 180));
|
|
51
|
+
const truncated = row.full_length > excerpt.length;
|
|
52
|
+
const content = excerpt + (truncated ? "\n[Excerpt truncated. Read the raw_memory column of this source database row for the remaining native memory.]" : "");
|
|
53
|
+
seen.add(raw);
|
|
54
|
+
result.push({ path, content });
|
|
55
|
+
remaining -= content.length;
|
|
56
|
+
if (result.length >= MAX_MEMORIES) break;
|
|
57
|
+
}
|
|
58
|
+
} catch {
|
|
59
|
+
// Missing, locked, or newer incompatible native schemas must not block chat.
|
|
60
|
+
} finally {
|
|
61
|
+
memories?.close();
|
|
62
|
+
state?.close();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return result;
|
|
66
|
+
}
|
|
@@ -1301,10 +1301,24 @@ export function deleteSessionMetadata(sessionId: string): void {
|
|
|
1301
1301
|
*/
|
|
1302
1302
|
export function setSessionMigratedTo(oldSessionId: string, newSessionId: string): void {
|
|
1303
1303
|
if (oldSessionId === newSessionId) return;
|
|
1304
|
-
getDb()
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1304
|
+
const database = getDb();
|
|
1305
|
+
database.transaction(() => {
|
|
1306
|
+
// A provider's real thread id replaces the draft id on the first turn.
|
|
1307
|
+
// Carry explicit choices with it before reconnect reads session_state.
|
|
1308
|
+
// Keep any choices already made on the destination (including thinking OFF).
|
|
1309
|
+
database.query(`
|
|
1310
|
+
INSERT INTO session_metadata (session_id, model, effort, thinking_budget)
|
|
1311
|
+
SELECT ?, model, effort, thinking_budget FROM session_metadata WHERE session_id = ?
|
|
1312
|
+
ON CONFLICT(session_id) DO UPDATE SET
|
|
1313
|
+
model = COALESCE(session_metadata.model, excluded.model),
|
|
1314
|
+
effort = COALESCE(session_metadata.effort, excluded.effort),
|
|
1315
|
+
thinking_budget = COALESCE(session_metadata.thinking_budget, excluded.thinking_budget)
|
|
1316
|
+
`).run(newSessionId, oldSessionId);
|
|
1317
|
+
database.query(
|
|
1318
|
+
"INSERT INTO session_metadata (session_id, migrated_to) VALUES (?, ?) " +
|
|
1319
|
+
"ON CONFLICT(session_id) DO UPDATE SET migrated_to = excluded.migrated_to",
|
|
1320
|
+
).run(oldSessionId, newSessionId);
|
|
1321
|
+
})();
|
|
1308
1322
|
}
|
|
1309
1323
|
|
|
1310
1324
|
/**
|
|
@@ -8,6 +8,7 @@ import { resolve } from "node:path";
|
|
|
8
8
|
import { homedir } from "node:os";
|
|
9
9
|
import type { ChatEvent, ChatMessage } from "../types/chat.ts";
|
|
10
10
|
import { stringifyToolResultContent } from "../shared/tool-result-content.ts";
|
|
11
|
+
import { stripSharedContext } from "../shared/provider-context.ts";
|
|
11
12
|
|
|
12
13
|
const MAX_FILE_SIZE = 50 * 1024 * 1024; // 50MB
|
|
13
14
|
const TEAMMATE_MSG_RE = /<teammate-message[^>]*>[\s\S]*?<\/teammate-message>/g;
|
|
@@ -117,7 +118,7 @@ export function parseSessionMessage(
|
|
|
117
118
|
return {
|
|
118
119
|
id: msg.uuid,
|
|
119
120
|
role,
|
|
120
|
-
content: textContent,
|
|
121
|
+
content: role === "user" ? stripSharedContext(textContent) : textContent,
|
|
121
122
|
events: events.length > 0 ? events : undefined,
|
|
122
123
|
timestamp: msg.timestamp ?? new Date().toISOString(),
|
|
123
124
|
sdkUuid: msg.uuid,
|