@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.
Files changed (453) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/assets/skills/ppm/SKILL.md +1 -1
  3. package/assets/skills/ppm/references/cli-reference.md +4 -4
  4. package/assets/skills/ppm/references/http-api.md +1 -1
  5. package/dist/web/assets/{accounts-settings-section-Cmmozwer.js → accounts-settings-section-Df1KoGg7.js} +1 -1
  6. package/dist/web/assets/{ai-resource-editor-BlrWV3xU.js → ai-resource-editor-C6s6A57b.js} +1 -1
  7. package/dist/web/assets/ai-settings-section-BQTsEJzp.js +1 -0
  8. package/dist/web/assets/{ai-settings-section-dDsgddSt.js → ai-settings-section-CMIkIxZU.js} +1 -1
  9. package/dist/web/assets/{angular-html-BtJLNcMw.js → angular-html-K0aKyuHe.js} +1 -1
  10. package/dist/web/assets/{angular-ts-CQiu5F_W.js → angular-ts-CLY0DVNM.js} +1 -1
  11. package/dist/web/assets/{apl-CKZvgs-w.js → apl-Cl1oeOZc.js} +1 -1
  12. package/dist/web/assets/{appearance-settings-section-DRxziHFt.js → appearance-settings-section-B7CwHA7Y.js} +1 -1
  13. package/dist/web/assets/architecture-PBZL5I3N-CkWx_Sv3.js +1 -0
  14. package/dist/web/assets/{astro-D0b8ssLD.js → astro-S8gLldib.js} +1 -1
  15. package/dist/web/assets/{audio-preview-B4E5_7TW.js → audio-preview-C2PCzvr5.js} +1 -1
  16. package/dist/web/assets/{blade-DOIpINLw.js → blade-DZ96Anzi.js} +1 -1
  17. package/dist/web/assets/{bsl-CJ7_JlQ8.js → bsl-BrlZLefQ.js} +1 -1
  18. package/dist/web/assets/{cairo-5CpV2T1P.js → cairo-B0UdH8CG.js} +1 -1
  19. package/dist/web/assets/chat-tab-BJokwok-.js +15 -0
  20. package/dist/web/assets/click-outside-container-XmmmdSm7.js +1 -0
  21. package/dist/web/assets/{cobol-BreMVrtc.js → cobol-DCeQgIC6.js} +1 -1
  22. package/dist/web/assets/code-editor-BVyFjaoM.js +7 -0
  23. package/dist/web/assets/{coffee-D7DoKh5b.js → coffee-D3V0ISG7.js} +1 -1
  24. package/dist/web/assets/{conflict-editor-D9_sr59D.js → conflict-editor-hGsVMmtG.js} +1 -1
  25. package/dist/web/assets/{cpp-BnWeWAoE.js → cpp-UPgqRL5h.js} +1 -1
  26. package/dist/web/assets/{crystal-D2pJbFUn.js → crystal-B7BOJUR4.js} +1 -1
  27. package/dist/web/assets/{csv-preview-BMC8jnpF.js → csv-preview-DiSiq6UJ.js} +1 -1
  28. package/dist/web/assets/data-grid-overlay-editor-QyH_oklj.js +1 -0
  29. package/dist/web/assets/database-viewer-BWQMTwjf.js +1 -0
  30. package/dist/web/assets/{diff-viewer-B4PlZ1Dt.js → diff-viewer-Usuuf35X.js} +1 -1
  31. package/dist/web/assets/dist-CQbltjRp.js +11 -0
  32. package/dist/web/assets/{edge-aqGMtbY3.js → edge-Dw-s4XKj.js} +1 -1
  33. package/dist/web/assets/{edit-diff-preview-xdDQvPhs.js → edit-diff-preview-F7YlT9fY.js} +1 -1
  34. package/dist/web/assets/{elixir-CsYMBLc5.js → elixir-Dntyzyed.js} +1 -1
  35. package/dist/web/assets/{elm-BU8C2gFp.js → elm-C83eppJ0.js} +1 -1
  36. package/dist/web/assets/{erb-Z_E49ab8.js → erb-Bjv2Lozz.js} +1 -1
  37. package/dist/web/assets/{erlang-BRqOjXH9.js → erlang-5PAcE8_t.js} +1 -1
  38. package/dist/web/assets/esm-Brdy2Atb.js +2 -0
  39. package/dist/web/assets/{explorer-body-SvWDS84f.js → explorer-body-BL9hg1yr.js} +1 -1
  40. package/dist/web/assets/{explorer-window-content-DBHBTA7B.js → explorer-window-content-C3BSd4Qf.js} +1 -1
  41. package/dist/web/assets/{extension-manager-section-BSt5I_H8.js → extension-manager-section-CE0aB9ed.js} +1 -1
  42. package/dist/web/assets/{extension-webview-DBGMUU97.js → extension-webview-CGhuot2v.js} +1 -1
  43. package/dist/web/assets/{files-settings-section-0dwYLZou.js → files-settings-section-D_sgDKwF.js} +1 -1
  44. package/dist/web/assets/{fortran-fixed-form-CWbxmDGR.js → fortran-fixed-form-Di9Yw_ao.js} +1 -1
  45. package/dist/web/assets/{fsharp-DKMYbq6I.js → fsharp-IRAdAkHt.js} +1 -1
  46. package/dist/web/assets/{gdresource-B3yFau4V.js → gdresource-DVdwnvP-.js} +1 -1
  47. package/dist/web/assets/{general-settings-section-BgLy_6yj.js → general-settings-section-D7DMjoNj.js} +1 -1
  48. package/dist/web/assets/{git-commit-BW0p3Ekk.js → git-commit-CD6jLHvg.js} +1 -1
  49. package/dist/web/assets/{git-log-panel-BkgmcWk1.js → git-log-panel-prL5-n-F.js} +1 -1
  50. package/dist/web/assets/{git-rebase-DrvmQCS7.js → git-rebase-DvxNkg7t.js} +1 -1
  51. package/dist/web/assets/gitGraph-HDMCJU4V-BUlbZgyf.js +1 -0
  52. package/dist/web/assets/glide-data-grid-lbUFJwCD.js +141 -0
  53. package/dist/web/assets/{glimmer-js-BY1XApJJ.js → glimmer-js-aM9jbY2M.js} +1 -1
  54. package/dist/web/assets/{glimmer-ts-DPZtxF8N.js → glimmer-ts-Bd4jKeuF.js} +1 -1
  55. package/dist/web/assets/{glsl-DZ8G_Hvf.js → glsl-CUUtWNTx.js} +1 -1
  56. package/dist/web/assets/{graphql-Ck06uCZy.js → graphql-DkY6xCcc.js} +1 -1
  57. package/dist/web/assets/{group-chat-tab-Cy9zIynj.js → group-chat-tab-C4oY3IKi.js} +1 -1
  58. package/dist/web/assets/{hack-pLogDwAs.js → hack-DnaR9DJk.js} +1 -1
  59. package/dist/web/assets/{haml-CBqeCQ2A.js → haml-BDubxAIK.js} +1 -1
  60. package/dist/web/assets/{handlebars-B66JmVtp.js → handlebars-OxsbI1gt.js} +1 -1
  61. package/dist/web/assets/{html-Dk4wmfwC.js → html-Cjiwd8dp.js} +1 -1
  62. package/dist/web/assets/{html-derivative-CJWqfN51.js → html-derivative-CfzXt9Cs.js} +1 -1
  63. package/dist/web/assets/{http-CexhotTh.js → http-DRF6Wp6Y.js} +1 -1
  64. package/dist/web/assets/{hurl-BScKFk3Z.js → hurl-6SunVID_.js} +1 -1
  65. package/dist/web/assets/{hxml-DAle7vtu.js → hxml-CR72N708.js} +1 -1
  66. package/dist/web/assets/{image-preview-fuU4h2nr.js → image-preview-C7dCEQCx.js} +1 -1
  67. package/dist/web/assets/{index-DYGLdCpe.js → index-A3ripVe5.js} +6 -6
  68. package/dist/web/assets/{index-CuYtJ5xF.css → index-B9Wbjl0o.css} +1 -1
  69. package/dist/web/assets/info-3K5VOQVL-DXzjBxZf.js +1 -0
  70. package/dist/web/assets/{jinja-yHpyD80t.js → jinja-CYjAWnk3.js} +1 -1
  71. package/dist/web/assets/{jira-watcher-section-DRQx632s.js → jira-watcher-section-DvKEiqtb.js} +1 -1
  72. package/dist/web/assets/{jison-BY6WLJVu.js → jison-UERnq4ds.js} +1 -1
  73. package/dist/web/assets/{julia-Dd_iYQDT.js → julia-WAZzVFSs.js} +1 -1
  74. package/dist/web/assets/{just-BTuUKpxF.js → just-B1YYfl1D.js} +1 -1
  75. package/dist/web/assets/{keybindings-store-C2HZ1mT4.js → keybindings-store-BOJPwIOB.js} +1 -1
  76. package/dist/web/assets/{keyboard-shortcuts-section-WiZSZ-Wr.js → keyboard-shortcuts-section-CPsFUned.js} +1 -1
  77. package/dist/web/assets/{latex-Dt3OUlMZ.js → latex-B6zwM9GI.js} +1 -1
  78. package/dist/web/assets/{liquid-BxPJU2ix.js → liquid-n4OK-yxz.js} +1 -1
  79. package/dist/web/assets/{lua-DEGIvn7d.js → lua-DJYn-zFg.js} +1 -1
  80. package/dist/web/assets/{markdown-renderer-BFYBVcZP.js → markdown-renderer-C1KVXiXr.js} +3 -3
  81. package/dist/web/assets/{markdown-renderer-CklcWnd6.js → markdown-renderer-HPQE8ilD.js} +1 -1
  82. package/dist/web/assets/{marko-BDxwBJur.js → marko-C27Qtq0P.js} +1 -1
  83. package/dist/web/assets/{mdc-B8aXPTg7.js → mdc-CypKG7qW.js} +1 -1
  84. package/dist/web/assets/{mobile-explorer-sheet-D1OXw7op.js → mobile-explorer-sheet-DkvtLBgs.js} +1 -1
  85. package/dist/web/assets/{nextflow-DBVZnnT_.js → nextflow-DuRHA0PY.js} +1 -1
  86. package/dist/web/assets/{nginx-Crpyd-Do.js → nginx-vxFTb1fh.js} +1 -1
  87. package/dist/web/assets/{nim-BSqTBYDj.js → nim-ChQDNOKe.js} +1 -1
  88. package/dist/web/assets/{notification-store-DyKshGRs.js → notification-store-B1pBUO0W.js} +1 -1
  89. package/dist/web/assets/{notifications-settings-section-BEQEjvan.js → notifications-settings-section-CaQVTa3a.js} +1 -1
  90. package/dist/web/assets/{number-overlay-editor-DRjTIcPH.js → number-overlay-editor-HmOZ3ETg.js} +1 -1
  91. package/dist/web/assets/{overview-panel-DiiA3B_Z.js → overview-panel-CaU5AtCB.js} +1 -1
  92. package/dist/web/assets/packet-RMMSAZCW-DrX3I-bv.js +1 -0
  93. package/dist/web/assets/{pdf-preview-DmQazeeV.js → pdf-preview-QeXX_VpL.js} +1 -1
  94. package/dist/web/assets/{perl-BU0kbB-K.js → perl-BKH-mNmF.js} +1 -1
  95. package/dist/web/assets/{php-D9n1ikHN.js → php-W3oWF62o.js} +1 -1
  96. package/dist/web/assets/pie-UPGHQEXC-czhViDrP.js +1 -0
  97. package/dist/web/assets/postgres-viewer-DO50GwMs.js +3 -0
  98. package/dist/web/assets/{ppmbot-settings-section-PzCLPm8a.js → ppmbot-settings-section-B_00Zb-K.js} +1 -1
  99. package/dist/web/assets/{process-table-C2TdkJck.js → process-table-DweR4FR3.js} +1 -1
  100. package/dist/web/assets/{proxy-settings-section-DsZ6KcHD.js → proxy-settings-section-sGhA3t_m.js} +1 -1
  101. package/dist/web/assets/{pug-BOpaczDr.js → pug-DscH2YvH.js} +1 -1
  102. package/dist/web/assets/{qml-B-cQXhrg.js → qml-CbBrfy74.js} +1 -1
  103. package/dist/web/assets/{query-audit-section-2eX9-6mO.js → query-audit-section-BtqND9WE.js} +1 -1
  104. package/dist/web/assets/radar-KQ55EAFF-BAHP0n2V.js +1 -0
  105. package/dist/web/assets/{razor-DFB0pNCh.js → razor-_oKX4NEv.js} +1 -1
  106. package/dist/web/assets/remote-desktop-mobile-sheet-DMn2uDXn.js +2 -0
  107. package/dist/web/assets/{remote-desktop-mobile-view-Bw6p5ikf.js → remote-desktop-mobile-view-xlO-gk_f.js} +1 -1
  108. package/dist/web/assets/{remote-desktop-readiness-gate-W0lAhHq9.js → remote-desktop-readiness-gate-BmyUd1vt.js} +1 -1
  109. package/dist/web/assets/{remote-desktop-window-content-P888YEqm.js → remote-desktop-window-content-BaPixhFs.js} +1 -1
  110. package/dist/web/assets/{rst-DAXedsgm.js → rst-C3yqfWYA.js} +1 -1
  111. package/dist/web/assets/{ruby-BCO4polC.js → ruby-BaanPyyv.js} +1 -1
  112. package/dist/web/assets/{sas-DfB5dcFC.js → sas-DQg1FY8E.js} +1 -1
  113. package/dist/web/assets/{schedules-settings-section-C8YDAxlo.js → schedules-settings-section-Ctu9STMV.js} +1 -1
  114. package/dist/web/assets/{scss-BknIVgn7.js → scss-N-LxVilh.js} +1 -1
  115. package/dist/web/assets/{settings-body-B5v3_Tnb.js → settings-body-B0ZdO6qx.js} +2 -2
  116. package/dist/web/assets/{settings-store-CzLnTR8p.js → settings-store-Bsu_5zIU.js} +2 -2
  117. package/dist/web/assets/settings-tab-BQvukPz5.js +1 -0
  118. package/dist/web/assets/{settings-window-content-BIosR7RY.js → settings-window-content-DUmULFsq.js} +1 -1
  119. package/dist/web/assets/{shaderlab-CPu31TpY.js → shaderlab-BShqbudx.js} +1 -1
  120. package/dist/web/assets/{shellsession-CFX4c_TM.js → shellsession-B8_nNEok.js} +1 -1
  121. package/dist/web/assets/{soy-rz9hilgm.js → soy-CW5oqa-M.js} +1 -1
  122. package/dist/web/assets/{sparql-Bo8ZDeqE.js → sparql-BJFHPosZ.js} +1 -1
  123. package/dist/web/assets/{sql-query-editor-DMihDPnw.js → sql-query-editor-DPtExW0C.js} +1 -1
  124. package/dist/web/assets/sqlite-viewer-DkzvIzyG.js +1 -0
  125. package/dist/web/assets/{stata-B5J-QMyE.js → stata-twP3WAnN.js} +1 -1
  126. package/dist/web/assets/{surrealql-Caw1ADnG.js → surrealql-CqwoQxwG.js} +1 -1
  127. package/dist/web/assets/{svelte-D3oMVcxz.js → svelte-CoTGkG7y.js} +1 -1
  128. package/dist/web/assets/{system-monitor-body-IUamfS5w.js → system-monitor-body-Bfx7yImc.js} +2 -2
  129. package/dist/web/assets/system-monitor-tab-Bn7sDAiO.js +1 -0
  130. package/dist/web/assets/{system-monitor-window-content-Bq3BS7Mg.js → system-monitor-window-content-DVwdAvly.js} +1 -1
  131. package/dist/web/assets/{tab-host-window-content-vfYLLIKU.js → tab-host-window-content-By35Ri11.js} +1 -1
  132. package/dist/web/assets/team-member-sheet-B8vZnJrJ.js +2 -0
  133. package/dist/web/assets/{team-member-window-content-D5cYZzBq.js → team-member-window-content-2_P22CXN.js} +1 -1
  134. package/dist/web/assets/{templ-BAdNyIOL.js → templ-BSuNrgD0.js} +1 -1
  135. package/dist/web/assets/{terminal-tab-C89DQllY.js → terminal-tab-DqAZMwhA.js} +1 -1
  136. package/dist/web/assets/{tex-IQ8mELOR.js → tex-DTdKTZSa.js} +1 -1
  137. package/dist/web/assets/{tool-cards-CWotDH_2.js → tool-cards-CiCZqw1w.js} +3 -3
  138. package/dist/web/assets/treemap-KZPCXAKY-DL_-JS7u.js +1 -0
  139. package/dist/web/assets/{ts-tags-D1DDO2jl.js → ts-tags-jpjff8fb.js} +1 -1
  140. package/dist/web/assets/{twig-C8Fd5RvV.js → twig-Utgjq3Am.js} +1 -1
  141. package/dist/web/assets/{use-accounts-data-lmmmG4ep.js → use-accounts-data-DMQAUXSO.js} +1 -1
  142. package/dist/web/assets/{use-monaco-theme-0ziS4xlp.js → use-monaco-theme-Ck1i7NEe.js} +1 -1
  143. package/dist/web/assets/{use-remote-desktop-display-choice-qBZ8ej7J.js → use-remote-desktop-display-choice-DVDOUQg2.js} +1 -1
  144. package/dist/web/assets/use-websocket-BkBvJbEt.js +1 -0
  145. package/dist/web/assets/{vendor-mermaid-CfY1-PkA.js → vendor-mermaid-CXxglerV.js} +193 -193
  146. package/dist/web/assets/{video-preview-B8xALVkh.js → video-preview-DzzFr0gI.js} +1 -1
  147. package/dist/web/assets/{vue-EvccXlkP.js → vue-CUms54DI.js} +1 -1
  148. package/dist/web/assets/{vue-html-Dg0xUJCh.js → vue-html-D7fbWTZW.js} +1 -1
  149. package/dist/web/assets/{vue-vine-BdrMg72k.js → vue-vine-BontZ1iR.js} +1 -1
  150. package/dist/web/assets/{xml-MmDclzxK.js → xml-CVHJ-Tda.js} +1 -1
  151. package/dist/web/assets/{xsl-DQEFs6Dd.js → xsl-BUDXwDuV.js} +1 -1
  152. package/dist/web/index.html +25 -25
  153. package/dist/web/sw.js +1 -1
  154. package/docs/architecture/ai-chat-and-providers.md +92 -0
  155. package/package.json +1 -1
  156. package/schemas/ppm-config.schema.json +18 -1
  157. package/src/providers/claude-agent-sdk.ts +21 -13
  158. package/src/providers/cli-provider-base.ts +3 -1
  159. package/src/providers/codex-app-server/codex-history.ts +5 -3
  160. package/src/providers/codex-app-server/codex-provider.ts +16 -2
  161. package/src/providers/codex-app-server/codex-rollout-header.ts +2 -1
  162. package/src/providers/cursor-cli/cursor-history.ts +4 -2
  163. package/src/server/routes/settings.ts +15 -1
  164. package/src/server/ws/chat.ts +2 -2
  165. package/src/services/chat.service.ts +95 -2
  166. package/src/services/codex-native-memory.ts +66 -0
  167. package/src/services/db.service.ts +18 -4
  168. package/src/services/jsonl-transcript-parser.ts +2 -1
  169. package/src/services/provider-shared-context.ts +152 -0
  170. package/src/shared/provider-context.ts +13 -0
  171. package/src/types/chat.ts +6 -0
  172. package/src/types/config.ts +29 -0
  173. package/src/web/components/chat/chat-history-bar.tsx +6 -3
  174. package/src/web/components/chat/chat-tab.tsx +7 -0
  175. package/src/web/components/settings/ai-settings-section.tsx +34 -5
  176. package/src/web/components/settings/codex-context-settings.tsx +100 -0
  177. package/src/web/hooks/use-chat.ts +75 -14
  178. package/src/web/hooks/use-websocket.ts +20 -7
  179. package/src/web/lib/api-settings.ts +3 -0
  180. package/src/web/lib/ws-client.ts +55 -4
  181. package/.release-bin/zip +0 -15
  182. package/.release-node-shim.sh +0 -11
  183. package/dist/web/assets/ai-settings-section-PaEh_o0w.js +0 -1
  184. package/dist/web/assets/architecture-PBZL5I3N-DfR8k8Bc.js +0 -1
  185. package/dist/web/assets/chat-tab-MNuc18Os.js +0 -15
  186. package/dist/web/assets/code-editor-DYkmDRRF.js +0 -7
  187. package/dist/web/assets/data-grid-overlay-editor-CbBkhhJa.js +0 -1
  188. package/dist/web/assets/data-grid-types-DeY60CLU.js +0 -1
  189. package/dist/web/assets/database-viewer-Box3z5-Q.js +0 -1
  190. package/dist/web/assets/dist-BKOM_AoT.js +0 -11
  191. package/dist/web/assets/esm-B-vXxHUd.js +0 -2
  192. package/dist/web/assets/gitGraph-HDMCJU4V-CPd78aaT.js +0 -1
  193. package/dist/web/assets/glide-data-grid-CZVu-zCw.js +0 -141
  194. package/dist/web/assets/info-3K5VOQVL-BciNds6R.js +0 -1
  195. package/dist/web/assets/packet-RMMSAZCW-ClD3l2Bs.js +0 -1
  196. package/dist/web/assets/pie-UPGHQEXC-PU6kD0rW.js +0 -1
  197. package/dist/web/assets/postgres-viewer-Cd_wXjkT.js +0 -3
  198. package/dist/web/assets/radar-KQ55EAFF-4LzjL0Zt.js +0 -1
  199. package/dist/web/assets/remote-desktop-mobile-sheet-CMXSUcAN.js +0 -2
  200. package/dist/web/assets/settings-tab-CauShulf.js +0 -1
  201. package/dist/web/assets/sqlite-viewer-jCIGt2GP.js +0 -1
  202. package/dist/web/assets/system-monitor-tab-DaWeif4k.js +0 -1
  203. package/dist/web/assets/team-member-sheet-Be7OSGMT.js +0 -2
  204. package/dist/web/assets/treemap-KZPCXAKY-DiumLNMg.js +0 -1
  205. package/dist/web/assets/use-websocket-DAvfbjxh.js +0 -1
  206. /package/dist/web/assets/{abap-D-o-bvtI.js → abap-BGbkXtK3.js} +0 -0
  207. /package/dist/web/assets/{actionscript-3-D2tIzAm8.js → actionscript-3-CTWUcAG5.js} +0 -0
  208. /package/dist/web/assets/{ada-DxatBcxS.js → ada-2xQ2Am_-.js} +0 -0
  209. /package/dist/web/assets/{andromeeda-D0LK9YJ3.js → andromeeda-DfXLrHKa.js} +0 -0
  210. /package/dist/web/assets/{apache-B7uMPNiW.js → apache-CBLZGsyo.js} +0 -0
  211. /package/dist/web/assets/{apex-B7GiXrAr.js → apex-UYnVUoc7.js} +0 -0
  212. /package/dist/web/assets/{api-settings-D18Q4Ocp.js → api-settings-ClKLkiR9.js} +0 -0
  213. /package/dist/web/assets/{api-themes-sSv-6OLk.js → api-themes-B_Za9tdP.js} +0 -0
  214. /package/dist/web/assets/{applescript-D_SIFkKe.js → applescript-9me9Xoqf.js} +0 -0
  215. /package/dist/web/assets/{ara-C3iECgdg.js → ara-CHhiJzie.js} +0 -0
  216. /package/dist/web/assets/{asciidoc-gc8z_MMY.js → asciidoc-CKk0H4sD.js} +0 -0
  217. /package/dist/web/assets/{asm-27qeoPOI.js → asm-CVc_SeQB.js} +0 -0
  218. /package/dist/web/assets/{aurora-x-C5J9fWe1.js → aurora-x-BRYBKvUk.js} +0 -0
  219. /package/dist/web/assets/{awk-B7GBzF92.js → awk-BsBtss7k.js} +0 -0
  220. /package/dist/web/assets/{ayu-dark-XlnQhuLL.js → ayu-dark-x3ChmRrr.js} +0 -0
  221. /package/dist/web/assets/{ayu-light-DKLLilkU.js → ayu-light-DUbhGec6.js} +0 -0
  222. /package/dist/web/assets/{ayu-mirage-Dv-XOprJ.js → ayu-mirage-Bc9Dyu4v.js} +0 -0
  223. /package/dist/web/assets/{ballerina-DACRT-sT.js → ballerina-B0CV6yyC.js} +0 -0
  224. /package/dist/web/assets/{bat-BlQCq2XE.js → bat-BmukVhcd.js} +0 -0
  225. /package/dist/web/assets/{beancount-DYDztRI0.js → beancount-DfRKW4qX.js} +0 -0
  226. /package/dist/web/assets/{berry-BE5YKqvx.js → berry-BXO-GbOz.js} +0 -0
  227. /package/dist/web/assets/{bibtex-CAm7mgEm.js → bibtex-BIMgGN81.js} +0 -0
  228. /package/dist/web/assets/{bicep-BKgAbfVa.js → bicep-CIaj_N_V.js} +0 -0
  229. /package/dist/web/assets/{bird2-yrBNbW1G.js → bird2-Ca5CJ-1r.js} +0 -0
  230. /package/dist/web/assets/{c-txZFr4RM.js → c-BgN-FzVO.js} +0 -0
  231. /package/dist/web/assets/{c3-D_DrzBUd.js → c3-B366g85t.js} +0 -0
  232. /package/dist/web/assets/{cadence-CUFCEgG9.js → cadence-BDCY3xvX.js} +0 -0
  233. /package/dist/web/assets/{can-open-in-ppm-_yqa69dV.js → can-open-in-ppm-DyFXJvuW.js} +0 -0
  234. /package/dist/web/assets/{catppuccin-frappe-Dn32MuhA.js → catppuccin-frappe-C2dWlEOM.js} +0 -0
  235. /package/dist/web/assets/{catppuccin-latte-Dewo7yDf.js → catppuccin-latte-B6AgUzC2.js} +0 -0
  236. /package/dist/web/assets/{catppuccin-macchiato-D8WOWZeo.js → catppuccin-macchiato-D2r_sUYa.js} +0 -0
  237. /package/dist/web/assets/{catppuccin-mocha-b0md48XM.js → catppuccin-mocha-CCJOmGcr.js} +0 -0
  238. /package/dist/web/assets/{clarity-Ct3UqLBj.js → clarity-7c_yM38y.js} +0 -0
  239. /package/dist/web/assets/{clojure-CwP5aPEo.js → clojure-Cx30u1gg.js} +0 -0
  240. /package/dist/web/assets/{cmake-D5RF49e5.js → cmake-D8nfcw9r.js} +0 -0
  241. /package/dist/web/assets/{codeowners-Cl5897L_.js → codeowners-z9VeFgy0.js} +0 -0
  242. /package/dist/web/assets/{codeql-BKh1RCg0.js → codeql-DXYEc0p7.js} +0 -0
  243. /package/dist/web/assets/{common-lisp-BhHuD6t0.js → common-lisp-QB2DYRB7.js} +0 -0
  244. /package/dist/web/assets/{coq-Dco3qwD8.js → coq-DC4-vZSI.js} +0 -0
  245. /package/dist/web/assets/{csharp-Dpjw9ZA9.js → csharp-iBJcXIuz.js} +0 -0
  246. /package/dist/web/assets/{css-CPe4cabH.js → css-DzLteUnC.js} +0 -0
  247. /package/dist/web/assets/{csv-parser-DbxGKdMG.js → csv-parser-0OmrzV4G.js} +0 -0
  248. /package/dist/web/assets/{csv-BAcTN8Kt.js → csv-plVZ5iV_.js} +0 -0
  249. /package/dist/web/assets/{cue-Cr6y60TA.js → cue-MFyM4FwJ.js} +0 -0
  250. /package/dist/web/assets/{cypher-DWtqXXFP.js → cypher-BmV76dTw.js} +0 -0
  251. /package/dist/web/assets/{d-BASiTZk4.js → d-CukQ97B6.js} +0 -0
  252. /package/dist/web/assets/{dark-plus-56kmnrcl.js → dark-plus-BDhlhnd-.js} +0 -0
  253. /package/dist/web/assets/{dart-C5mZnjoE.js → dart-BEDiNp89.js} +0 -0
  254. /package/dist/web/assets/{dax-B4I2e7d8.js → dax-CKMJPpmb.js} +0 -0
  255. /package/dist/web/assets/{desktop-DekGg0BT.js → desktop-CjjGerHK.js} +0 -0
  256. /package/dist/web/assets/{diff-CWnJBd73.js → diff-CuRWQEJk.js} +0 -0
  257. /package/dist/web/assets/{dist-B0J2eYBz.js → dist-BuUB-Gou.js} +0 -0
  258. /package/dist/web/assets/{docker-DevchDxK.js → docker-BzeqNwXY.js} +0 -0
  259. /package/dist/web/assets/{docx-preview-Xy7SZ7Vf.js → docx-preview-Dg8lD3f3.js} +0 -0
  260. /package/dist/web/assets/{dotenv-DCvtdaGJ.js → dotenv-maAByz4s.js} +0 -0
  261. /package/dist/web/assets/{dracula-8U6Vkk3l.js → dracula-BK-58eQL.js} +0 -0
  262. /package/dist/web/assets/{dracula-soft-Bfeew5Wg.js → dracula-soft-BiBFiJ4B.js} +0 -0
  263. /package/dist/web/assets/{dream-maker-DDTJVuoy.js → dream-maker-SLz866k9.js} +0 -0
  264. /package/dist/web/assets/{emacs-lisp-CEHJqI4m.js → emacs-lisp-DVVSBvYb.js} +0 -0
  265. /package/dist/web/assets/{everforest-dark-CHHLt7cq.js → everforest-dark-B3wCaZGh.js} +0 -0
  266. /package/dist/web/assets/{everforest-light-TcTbK1sM.js → everforest-light-BOv6DEcT.js} +0 -0
  267. /package/dist/web/assets/{fennel-Bh4vsA1A.js → fennel-mxeAVgSR.js} +0 -0
  268. /package/dist/web/assets/{fish-D0T0fILG.js → fish-CNPEh-7O.js} +0 -0
  269. /package/dist/web/assets/{fluent-CgXDXdyy.js → fluent-DzjF371g.js} +0 -0
  270. /package/dist/web/assets/{format-bytes-Bc6SqF7M.js → format-bytes-BxBoqnS1.js} +0 -0
  271. /package/dist/web/assets/{fortran-free-form-CUg3Xhz4.js → fortran-free-form-BwcDAA-k.js} +0 -0
  272. /package/dist/web/assets/{gdscript-Cx056p_k.js → gdscript-Dw53oyoq.js} +0 -0
  273. /package/dist/web/assets/{gdshader-Dj1qP4I5.js → gdshader-Ch4uX8TL.js} +0 -0
  274. /package/dist/web/assets/{genie-SBt15wn7.js → genie-BmyA3sav.js} +0 -0
  275. /package/dist/web/assets/{gherkin-bTJiHIrB.js → gherkin-TJfGbfw6.js} +0 -0
  276. /package/dist/web/assets/{github-dark-BOPhyugs.js → github-dark-DfjGEBZm.js} +0 -0
  277. /package/dist/web/assets/{github-dark-default-Cktqe6NF.js → github-dark-default-C05CO5WG.js} +0 -0
  278. /package/dist/web/assets/{github-dark-dimmed-CeWfII_B.js → github-dark-dimmed-tc58hIbY.js} +0 -0
  279. /package/dist/web/assets/{github-dark-high-contrast-CTx8LpdV.js → github-dark-high-contrast-Cbjouhax.js} +0 -0
  280. /package/dist/web/assets/{github-light-DVsO5Un1.js → github-light-DyPx5kxT.js} +0 -0
  281. /package/dist/web/assets/{github-light-default-BiyPxicr.js → github-light-default-CwQhvvq0.js} +0 -0
  282. /package/dist/web/assets/{github-light-high-contrast-BPlnke0a.js → github-light-high-contrast-BSEfGuGA.js} +0 -0
  283. /package/dist/web/assets/{gleam-CWSxvD0C.js → gleam-CO9BliEd.js} +0 -0
  284. /package/dist/web/assets/{gn-D7NUVJuv.js → gn-3w7c2jXR.js} +0 -0
  285. /package/dist/web/assets/{gnuplot-c5uXmJKc.js → gnuplot-B9V8Da0h.js} +0 -0
  286. /package/dist/web/assets/{go-CRsHi4Cw.js → go-DZFS3BH_.js} +0 -0
  287. /package/dist/web/assets/{groovy-DpV0RA5r.js → groovy-BoXoCYbJ.js} +0 -0
  288. /package/dist/web/assets/{gruvbox-dark-hard-DD9fguUN.js → gruvbox-dark-hard-PlwQadvn.js} +0 -0
  289. /package/dist/web/assets/{gruvbox-dark-medium-BvcwpYJ-.js → gruvbox-dark-medium-BCuSx7jF.js} +0 -0
  290. /package/dist/web/assets/{gruvbox-dark-soft-48dCxX9M.js → gruvbox-dark-soft-BxNVGg5m.js} +0 -0
  291. /package/dist/web/assets/{gruvbox-light-hard-CjJ994Ip.js → gruvbox-light-hard-Caj_mHvE.js} +0 -0
  292. /package/dist/web/assets/{gruvbox-light-medium-DQJQZ_rV.js → gruvbox-light-medium-BbWauaVM.js} +0 -0
  293. /package/dist/web/assets/{gruvbox-light-soft-AqsC9mKw.js → gruvbox-light-soft-sTtAiBhF.js} +0 -0
  294. /package/dist/web/assets/{haskell-B5V7yvmh.js → haskell-DdAcCutT.js} +0 -0
  295. /package/dist/web/assets/{haxe-LWTKfPKr.js → haxe-CAaBQSbQ.js} +0 -0
  296. /package/dist/web/assets/{hcl-QmNZdAtI.js → hcl-D1Y6h8Ni.js} +0 -0
  297. /package/dist/web/assets/{hjson-CboJsAzK.js → hjson-C7gAy4J-.js} +0 -0
  298. /package/dist/web/assets/{hlsl-Bd-DO_WL.js → hlsl-BLCpvTDs.js} +0 -0
  299. /package/dist/web/assets/{horizon-CU8Bi_ss.js → horizon-A4TcfP_V.js} +0 -0
  300. /package/dist/web/assets/{horizon-bright-iSQ3_3jP.js → horizon-bright-D4gSyLkJ.js} +0 -0
  301. /package/dist/web/assets/{houston-CTXv3Puz.js → houston-B57jZ5OJ.js} +0 -0
  302. /package/dist/web/assets/{hy-Cd4hTidD.js → hy-C-_Ikdzx.js} +0 -0
  303. /package/dist/web/assets/{image-gallery-J8h8IY0c.js → image-gallery-DZFo6X0Q.js} +0 -0
  304. /package/dist/web/assets/{imba-BipCHEY2.js → imba-BwypdGq0.js} +0 -0
  305. /package/dist/web/assets/{ini-Dd1KkMrB.js → ini-DFC2fVTV.js} +0 -0
  306. /package/dist/web/assets/{java-rGr0OQD8.js → java-K2R-OeI_.js} +0 -0
  307. /package/dist/web/assets/{javascript-DHhCH2TN.js → javascript-Dwc_x-Qy.js} +0 -0
  308. /package/dist/web/assets/{json-CMMLBCUf.js → json-BWJ0jCOR.js} +0 -0
  309. /package/dist/web/assets/{json5-mPOwTOsB.js → json5-CyjYMs2j.js} +0 -0
  310. /package/dist/web/assets/{jsonc-Bie0E6D3.js → jsonc-DpY-971T.js} +0 -0
  311. /package/dist/web/assets/{jsonl-CpqHmtC1.js → jsonl-MOid1Cv5.js} +0 -0
  312. /package/dist/web/assets/{jsonnet-D21Ms51e.js → jsonnet-C8r7u8hK.js} +0 -0
  313. /package/dist/web/assets/{jssm-BXnl1nur.js → jssm-aiVzgRKq.js} +0 -0
  314. /package/dist/web/assets/{jsx-Chnii_vB.js → jsx-BouDi2uL.js} +0 -0
  315. /package/dist/web/assets/{kanagawa-dragon-DhxR0UjL.js → kanagawa-dragon-BDBacW42.js} +0 -0
  316. /package/dist/web/assets/{kanagawa-lotus-fupRg5wp.js → kanagawa-lotus-Bjc_h4S5.js} +0 -0
  317. /package/dist/web/assets/{kanagawa-wave-DSWbRS9M.js → kanagawa-wave-h12w2GK-.js} +0 -0
  318. /package/dist/web/assets/{kdl-DirGHqUy.js → kdl-By4Gal6E.js} +0 -0
  319. /package/dist/web/assets/{kotlin-DkhUVMDC.js → kotlin-BaieUpjq.js} +0 -0
  320. /package/dist/web/assets/{kusto-DU7OpovF.js → kusto-bFewy_Sb.js} +0 -0
  321. /package/dist/web/assets/{laserwave-iLKb1ZCT.js → laserwave-DpFhqINu.js} +0 -0
  322. /package/dist/web/assets/{lean-Cuvh_QAP.js → lean-DDn2i30H.js} +0 -0
  323. /package/dist/web/assets/{less-B5tQZOdI.js → less-DtaLKtJv.js} +0 -0
  324. /package/dist/web/assets/{lib-el9rA30D.js → lib-Bss7BrXJ.js} +0 -0
  325. /package/dist/web/assets/{libesm-CdttTIAd.js → libesm-DJd6dkYL.js} +0 -0
  326. /package/dist/web/assets/{light-plus-DiHU2KL5.js → light-plus-BiMMZ8in.js} +0 -0
  327. /package/dist/web/assets/{llvm-sCBTKCKN.js → llvm-BI0xMYjk.js} +0 -0
  328. /package/dist/web/assets/{log-DtyR34Ie.js → log-BDnXCvPh.js} +0 -0
  329. /package/dist/web/assets/{logo-CP91aQyG.js → logo-DeOTbfcP.js} +0 -0
  330. /package/dist/web/assets/{luau-nfGo2ulP.js → luau-C8pWPPhP.js} +0 -0
  331. /package/dist/web/assets/{make-XbDn9GHe.js → make-Du6n4Vqb.js} +0 -0
  332. /package/dist/web/assets/{markdown-BB1_3xLr.js → markdown-CQOwzr1d.js} +0 -0
  333. /package/dist/web/assets/{material-theme-CIx_sxAy.js → material-theme-V1uvvG3T.js} +0 -0
  334. /package/dist/web/assets/{material-theme-darker-DsQeueDD.js → material-theme-darker-YOeOea0A.js} +0 -0
  335. /package/dist/web/assets/{material-theme-lighter-x_lMi74j.js → material-theme-lighter-gsPcqGZh.js} +0 -0
  336. /package/dist/web/assets/{material-theme-ocean-Bkgh25P8.js → material-theme-ocean-DXpcGhUO.js} +0 -0
  337. /package/dist/web/assets/{material-theme-palenight-CoOjdbti.js → material-theme-palenight-CuXKc4Kv.js} +0 -0
  338. /package/dist/web/assets/{matlab-D6xZas_8.js → matlab-DKfAoKWM.js} +0 -0
  339. /package/dist/web/assets/{mdx-Cl5_YNoz.js → mdx-B3lHrBfA.js} +0 -0
  340. /package/dist/web/assets/{media-url-BMeBaB0q.js → media-url-TGgkntUW.js} +0 -0
  341. /package/dist/web/assets/{mermaid-8Eow4jz_.js → mermaid-aFxjKRiq.js} +0 -0
  342. /package/dist/web/assets/{min-dark-D4DhjgRE.js → min-dark-z_K9sY1g.js} +0 -0
  343. /package/dist/web/assets/{min-light-DzAckd0t.js → min-light-CKEPOwP-.js} +0 -0
  344. /package/dist/web/assets/{mipsasm-zI_zu0tj.js → mipsasm-Czl4687V.js} +0 -0
  345. /package/dist/web/assets/{mojo-DQnGGPHf.js → mojo-XEmb6dMz.js} +0 -0
  346. /package/dist/web/assets/{monokai-CrFoD2VD.js → monokai-CeewfP-T.js} +0 -0
  347. /package/dist/web/assets/{moonbit-DdphIGs6.js → moonbit-BFs6rC9o.js} +0 -0
  348. /package/dist/web/assets/{move-BUlkn0xW.js → move-Dru-OXAq.js} +0 -0
  349. /package/dist/web/assets/{narrat-CbOBdtCn.js → narrat-C6i2yGbz.js} +0 -0
  350. /package/dist/web/assets/{nextflow-groovy-CeVLUTuQ.js → nextflow-groovy-CNbSHaJ-.js} +0 -0
  351. /package/dist/web/assets/{night-owl-Bm4LhUR1.js → night-owl-XXoqvAPs.js} +0 -0
  352. /package/dist/web/assets/{night-owl-light-DtcBiMEf.js → night-owl-light-Dm8251t1.js} +0 -0
  353. /package/dist/web/assets/{nix-DrdwQ70g.js → nix-DUvtyLsY.js} +0 -0
  354. /package/dist/web/assets/{nord-B0Head1v.js → nord-DapQODEA.js} +0 -0
  355. /package/dist/web/assets/{nushell-CmUdltKn.js → nushell-WDWgg9A2.js} +0 -0
  356. /package/dist/web/assets/{objective-c-BGDR33XN.js → objective-c-Dg6Li1Kw.js} +0 -0
  357. /package/dist/web/assets/{objective-cpp-Buc1Zhd0.js → objective-cpp-DLTQ4Pyg.js} +0 -0
  358. /package/dist/web/assets/{ocaml-xdzl9rRD.js → ocaml-gH2M-t6b.js} +0 -0
  359. /package/dist/web/assets/{odin-DiUFngnd.js → odin-BBj0SPaN.js} +0 -0
  360. /package/dist/web/assets/{one-dark-pro-BURxmIp3.js → one-dark-pro-C8irccD3.js} +0 -0
  361. /package/dist/web/assets/{one-light-BMRMInAj.js → one-light-THMntV-R.js} +0 -0
  362. /package/dist/web/assets/{openscad-DAgLA5J3.js → openscad-BEjRF8ZV.js} +0 -0
  363. /package/dist/web/assets/{pascal-CoDZxcRB.js → pascal-C7Kr1uH_.js} +0 -0
  364. /package/dist/web/assets/{pkl-DzKM6BuM.js → pkl-CBAaOrr-.js} +0 -0
  365. /package/dist/web/assets/{plastic-vF15LmNS.js → plastic-B1qtUEVU.js} +0 -0
  366. /package/dist/web/assets/{plsql-C1v07teA.js → plsql-KzVm4VQQ.js} +0 -0
  367. /package/dist/web/assets/{po-CLLC8BuA.js → po-BDthh1AB.js} +0 -0
  368. /package/dist/web/assets/{poimandres-Uq0xysxM.js → poimandres-DIsV0oVO.js} +0 -0
  369. /package/dist/web/assets/{polar-2-luY1Pc.js → polar-HfZSDZob.js} +0 -0
  370. /package/dist/web/assets/{postcss-lbFhe0rz.js → postcss-D2mpQWcD.js} +0 -0
  371. /package/dist/web/assets/{powerquery-RL8O9Wie.js → powerquery-BmWOahNZ.js} +0 -0
  372. /package/dist/web/assets/{powershell-upFWhb-b.js → powershell-DuBkKB6U.js} +0 -0
  373. /package/dist/web/assets/{prisma-DBtYaWFk.js → prisma-DMOCr8t3.js} +0 -0
  374. /package/dist/web/assets/{prolog-D8jSMykJ.js → prolog-OntlFpI5.js} +0 -0
  375. /package/dist/web/assets/{proto-BM4eadF7.js → proto-kD5tYlX3.js} +0 -0
  376. /package/dist/web/assets/{puppet-BQDQ3Snu.js → puppet-CO4XS5MF.js} +0 -0
  377. /package/dist/web/assets/{purescript-Cj2aTX4s.js → purescript-D_e2LzQx.js} +0 -0
  378. /package/dist/web/assets/{python-BYpqq6u4.js → python-BcK-Cw6k.js} +0 -0
  379. /package/dist/web/assets/{qmldir-4uiTcwAu.js → qmldir-B-9b87fC.js} +0 -0
  380. /package/dist/web/assets/{qss-D5xB-Mqo.js → qss-hWjUDAxi.js} +0 -0
  381. /package/dist/web/assets/{r-P6Ujy8rf.js → r-D0sNqudq.js} +0 -0
  382. /package/dist/web/assets/{racket-COKgCFuM.js → racket-9cjYYXcq.js} +0 -0
  383. /package/dist/web/assets/{raku-z14Q9i7K.js → raku-ntPupo_R.js} +0 -0
  384. /package/dist/web/assets/{red-ObAvgvQ5.js → red-D814sEjX.js} +0 -0
  385. /package/dist/web/assets/{reg-Qv4f0JFA.js → reg-bPzNEQh4.js} +0 -0
  386. /package/dist/web/assets/{regexp-CEOVGIzy.js → regexp-B_zg64Ge.js} +0 -0
  387. /package/dist/web/assets/{rel-cWOyTUwd.js → rel-CoB0Qjm-.js} +0 -0
  388. /package/dist/web/assets/{riscv-BZDwx-lv.js → riscv-DcVTEi_B.js} +0 -0
  389. /package/dist/web/assets/{ron-BpjosPS0.js → ron-CcAQMYzM.js} +0 -0
  390. /package/dist/web/assets/{rose-pine-dawn-BbGt9Wy_.js → rose-pine-dawn-DkSLvjDV.js} +0 -0
  391. /package/dist/web/assets/{rose-pine-DhxfJWcm.js → rose-pine-jtG38kvA.js} +0 -0
  392. /package/dist/web/assets/{rose-pine-moon-dj4Zxgik.js → rose-pine-moon-DJx8AxMs.js} +0 -0
  393. /package/dist/web/assets/{rosmsg-EciOaHo2.js → rosmsg-BnfYFiWk.js} +0 -0
  394. /package/dist/web/assets/{run-in-terminal-wHKwAnWP.js → run-in-terminal-Sb6TFU4f.js} +0 -0
  395. /package/dist/web/assets/{rust-C_eH59O_.js → rust-DxgQnpfl.js} +0 -0
  396. /package/dist/web/assets/{sass-Dos3R5lL.js → sass-DTgjjspH.js} +0 -0
  397. /package/dist/web/assets/{scala-8lVKsTvf.js → scala-xEozebyS.js} +0 -0
  398. /package/dist/web/assets/{scheme-Bd3VdaZj.js → scheme-sfgxdr_D.js} +0 -0
  399. /package/dist/web/assets/{sdbl-C4Yrjlgh.js → sdbl-BpdzD-Uv.js} +0 -0
  400. /package/dist/web/assets/{send-to-chat-BI7-fFpG.js → send-to-chat-BDws0-k0.js} +0 -0
  401. /package/dist/web/assets/{separator-W_hJcXPk.js → separator-GeVzERIl.js} +0 -0
  402. /package/dist/web/assets/{shellscript-OFZbPKZH.js → shellscript-B2o7zCrN.js} +0 -0
  403. /package/dist/web/assets/{slack-dark-aL6vlxZs.js → slack-dark-DxfgNfgJ.js} +0 -0
  404. /package/dist/web/assets/{slack-ochin-BKt1E7sL.js → slack-ochin-BMSGMkt8.js} +0 -0
  405. /package/dist/web/assets/{smalltalk-D6qVBL1U.js → smalltalk-DCb8haRt.js} +0 -0
  406. /package/dist/web/assets/{snazzy-light-BrWerT0t.js → snazzy-light-Y06j56Vj.js} +0 -0
  407. /package/dist/web/assets/{solarized-dark-CzxTJgVQ.js → solarized-dark-z1W-RVhp.js} +0 -0
  408. /package/dist/web/assets/{solarized-light-BecaDAnG.js → solarized-light-BRAGTpW5.js} +0 -0
  409. /package/dist/web/assets/{solidity-C9t7pZ84.js → solidity-CDTZVMHy.js} +0 -0
  410. /package/dist/web/assets/{splunk-CtxfFKtF.js → splunk-CFjv6-V_.js} +0 -0
  411. /package/dist/web/assets/{sql-7FE_Duz0.js → sql-Ce-1ETwT.js} +0 -0
  412. /package/dist/web/assets/{ssh-config-3Fr37ACC.js → ssh-config-Bcs3SD-x.js} +0 -0
  413. /package/dist/web/assets/{stylus-BP4mE1sO.js → stylus-Co5Var6O.js} +0 -0
  414. /package/dist/web/assets/{swift-0uqTFouD.js → swift-Irt_r7Fy.js} +0 -0
  415. /package/dist/web/assets/{synthwave-84-DQaNM3DI.js → synthwave-84-BOgCDIL-.js} +0 -0
  416. /package/dist/web/assets/{system-verilog-DUIVrZHZ.js → system-verilog-DSwfS0ci.js} +0 -0
  417. /package/dist/web/assets/{systemd-CtNo_WIh.js → systemd-C-HqVFLV.js} +0 -0
  418. /package/dist/web/assets/{talonscript-B0HXaCVT.js → talonscript-B7lshRGY.js} +0 -0
  419. /package/dist/web/assets/{tasl-Cb7RAl11.js → tasl-BZXSTCA-.js} +0 -0
  420. /package/dist/web/assets/{tcl-B79aC6l5.js → tcl-B_vaMM01.js} +0 -0
  421. /package/dist/web/assets/{terraform-75jJDjpW.js → terraform-B7kDBVtX.js} +0 -0
  422. /package/dist/web/assets/{tokyo-night-Cz9Uh9qb.js → tokyo-night-CW1uC1bG.js} +0 -0
  423. /package/dist/web/assets/{toml-CD6y9A-z.js → toml-Af6Dxufp.js} +0 -0
  424. /package/dist/web/assets/{tsv-CXJMbBrb.js → tsv-BSFZ-g3s.js} +0 -0
  425. /package/dist/web/assets/{tsx-BuYN0I2t.js → tsx-CN8kIwG_.js} +0 -0
  426. /package/dist/web/assets/{turtle-DWH-Rjse.js → turtle-BSUyR8DV.js} +0 -0
  427. /package/dist/web/assets/{typescript-BPd-hsrR.js → typescript-2AZeIhCA.js} +0 -0
  428. /package/dist/web/assets/{typespec-B0wvVykx.js → typespec-DRZ0XiHC.js} +0 -0
  429. /package/dist/web/assets/{typst-DWG2c48-.js → typst-p1gfDr4O.js} +0 -0
  430. /package/dist/web/assets/{use-blob-url-CrwoZJUJ.js → use-blob-url-BMtoAEL4.js} +0 -0
  431. /package/dist/web/assets/{use-open-team-member-CSUU7Z8N.js → use-open-team-member-C9EUqPvl.js} +0 -0
  432. /package/dist/web/assets/{v-Ch6E4Egd.js → v-B705HYgD.js} +0 -0
  433. /package/dist/web/assets/{vala-CGVKwbPx.js → vala-CyU0S4KW.js} +0 -0
  434. /package/dist/web/assets/{vb-BIEbSxyT.js → vb-DCWUzR_1.js} +0 -0
  435. /package/dist/web/assets/{vendor-xterm-YQlzIWv2.js → vendor-xterm-MrmaYoD2.js} +0 -0
  436. /package/dist/web/assets/{verilog-A-3pYPad.js → verilog-CrRE3TC7.js} +0 -0
  437. /package/dist/web/assets/{vesper-CK1naZAV.js → vesper-BH5N5eRr.js} +0 -0
  438. /package/dist/web/assets/{vhdl-CVawmgMg.js → vhdl-CT1Mz-fu.js} +0 -0
  439. /package/dist/web/assets/{viml-CiWjaqBY.js → viml-B0LtAesb.js} +0 -0
  440. /package/dist/web/assets/{vitesse-black-PYXW4-BO.js → vitesse-black-DqQvxGCJ.js} +0 -0
  441. /package/dist/web/assets/{vitesse-dark-BU5s4AuG.js → vitesse-dark-C6MRSe2N.js} +0 -0
  442. /package/dist/web/assets/{vitesse-light-DgkIT-N7.js → vitesse-light-B-8DQ5R9.js} +0 -0
  443. /package/dist/web/assets/{vyper-D8cRDPp3.js → vyper-D7YgYuMk.js} +0 -0
  444. /package/dist/web/assets/{wasm-ClFJgzmT.js → wasm-BgEp8ivq.js} +0 -0
  445. /package/dist/web/assets/{wasm-C02wlRbP.js → wasm-Dj9JHuDf.js} +0 -0
  446. /package/dist/web/assets/{wenyan-B8plxIr8.js → wenyan-CLcU30u4.js} +0 -0
  447. /package/dist/web/assets/{wgsl-CVujtm3V.js → wgsl-DEtNo0DR.js} +0 -0
  448. /package/dist/web/assets/{wikitext-CmcG9B69.js → wikitext-CXiDN9zY.js} +0 -0
  449. /package/dist/web/assets/{wit--gl2Jium.js → wit-0hROlx_P.js} +0 -0
  450. /package/dist/web/assets/{wolfram-6T_1D-NS.js → wolfram-nhKFI8Qz.js} +0 -0
  451. /package/dist/web/assets/{yaml-CIVV9uA1.js → yaml-CNoUgoPD.js} +0 -0
  452. /package/dist/web/assets/{zenscript-CoT4yNdA.js → zenscript-BgGAyJ15.js} +0 -0
  453. /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?: { priority?: 'now' | 'next' | 'later'; images?: Array<{ data: string; mediaType: string }> }): void {
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 msgContent = buildMessageParam(content, opts?.images);
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 = content;
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(message, opts?.images);
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 = message;
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(message, opts?.images),
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 ?? message;
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 ?? message;
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, " ").replace(/\\"/g, '"').trim();
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 content = contentToText(item.content);
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].slice(0, 80);
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 provider settings, writes to yaml */
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
 
@@ -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
- (provider as any).pushMessage(sessionId, parsed.content, {
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
- (provider as any).pushMessage(sessionId, instruction, { priority: "next" });
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
- yield* provider.sendMessage(sessionId, message, opts);
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
- return await provider.getMessages?.(sessionId) ?? [];
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().query(
1305
- "INSERT INTO session_metadata (session_id, migrated_to) VALUES (?, ?) " +
1306
- "ON CONFLICT(session_id) DO UPDATE SET migrated_to = excluded.migrated_to",
1307
- ).run(oldSessionId, newSessionId);
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,