@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
@@ -1,6 +1,6 @@
1
1
  import { useState, useCallback, useRef, useEffect, useMemo, startTransition } from "react";
2
2
  import { useWebSocket } from "./use-websocket";
3
- import { api, getAuthToken, projectUrl } from "@/lib/api-client";
3
+ import { api, projectUrl } from "@/lib/api-client";
4
4
  import { flattenWithExpansions, prefixPreCompactIds } from "@/lib/flatten-expansions";
5
5
  import { useStreamingStore } from "@/stores/streaming-store";
6
6
  import { usePanelStore } from "@/stores/panel-store";
@@ -188,6 +188,12 @@ export function useChat(
188
188
  const pendingMessageRef = useRef<string | null>(null);
189
189
  const sendRef = useRef<(data: string) => void>(() => {});
190
190
  const refetchRef = useRef<(() => void) | null>(null);
191
+ const historyActivityRef = useRef(0);
192
+ const historyReconciledRef = useRef(0);
193
+ const turnFinalizedRef = useRef(false);
194
+ const historyRequestRef = useRef<AbortController | null>(null);
195
+ const queuedReplayMessagesRef = useRef<MessageEvent[]>([]);
196
+ const handleMessageRef = useRef<((event: MessageEvent) => void) | null>(null);
191
197
  /** True while replaying turn_events — suppresses setPendingApproval */
192
198
  const isReplayingRef = useRef(false);
193
199
  /** toolUseIds of AskUserQuestion tool_use events. The approval_request event
@@ -712,6 +718,7 @@ export function useChat(
712
718
  const finalContent = streamingContentRef.current;
713
719
  const finalEvents = [...streamingEventsRef.current];
714
720
  const finalAccount = streamingAccountRef.current;
721
+ turnFinalizedRef.current = !!finalContent || finalEvents.length > 0;
715
722
  const doneUuid = ev.lastMessageUuid as string | undefined;
716
723
  const doneUsage = ev.usage;
717
724
  setMessages((prev) => {
@@ -765,6 +772,11 @@ export function useChat(
765
772
  // Ignore keepalive pings
766
773
  if ((data as any).type === "ping") return;
767
774
 
775
+ if (isReplayingRef.current) {
776
+ queuedReplayMessagesRef.current.push(event);
777
+ return;
778
+ }
779
+
768
780
  // file:changed, session:unread_changed and jira:* are app-wide and now arrive
769
781
  // on the global bus (`use-global-events.ts`) instead of here — a chat socket is
770
782
  // not guaranteed to exist since chat tabs mount lazily.
@@ -773,6 +785,7 @@ export function useChat(
773
785
  // bubble. The sender never receives this echo (server excludes the sender),
774
786
  // so no dedupe against the optimistic append is needed.
775
787
  if ((data as any).type === "user_message") {
788
+ historyActivityRef.current++;
776
789
  const content = (data as any).content as string;
777
790
  setMessages((prev) => {
778
791
  const last = prev[prev.length - 1];
@@ -829,22 +842,36 @@ export function useChat(
829
842
  // Handle phase transitions from BE
830
843
  if ((data as any).type === "phase_changed") {
831
844
  const p = (data as any).phase as SessionPhase;
845
+ const wasActive = phaseRef.current !== "idle";
846
+ if (!wasActive && p !== "idle") turnFinalizedRef.current = false;
847
+ if (p !== "idle") historyActivityRef.current++;
832
848
  setPhase(p);
833
849
  phaseRef.current = p;
834
850
  setConnectingElapsed(p === "connecting" ? ((data as any).elapsed ?? 0) : 0);
835
851
  // Safety: idle phase means no turn running — ensure compact indicator does not linger.
836
852
  // BE should broadcast compact_status=done too, but this is a belt-and-braces clear.
837
- if (p === "idle") setCompactStatus(null);
853
+ if (p === "idle") {
854
+ setCompactStatus(null);
855
+ setStatusMessage(null);
856
+ // Completion can arrive after lost content/done frames. Reconcile once
857
+ // the turn is idle so the answer appears without a manual reload.
858
+ if (wasActive && !turnFinalizedRef.current) refetchRef.current?.();
859
+ }
838
860
  return;
839
861
  }
840
862
 
841
863
  // Handle session state (replaces connected + status)
842
864
  if ((data as any).type === "session_state") {
843
865
  setIsConnected(true);
866
+ // A live session may have no buffered events yet, so no turn_events frame
867
+ // will follow. This acknowledgement already confirms the connection.
868
+ setIsReconnecting(false);
844
869
  setConnectedSessionId((data as any).sessionId ?? sessionIdRef.current);
845
870
  const state = data as any;
846
871
  const p = state.phase as SessionPhase;
872
+ if (p !== "idle") historyActivityRef.current++;
847
873
  const wasIdle = phaseRef.current === "idle";
874
+ if (wasIdle && p !== "idle") turnFinalizedRef.current = false;
848
875
  setPhase(p);
849
876
  phaseRef.current = p;
850
877
  if (state.sessionTitle) setSessionTitle(state.sessionTitle);
@@ -895,6 +922,7 @@ export function useChat(
895
922
 
896
923
  // Handle turn_events (reconnect sync with rAF chunking)
897
924
  if ((data as any).type === "turn_events") {
925
+ historyActivityRef.current++;
898
926
  const events = (data as any).events as unknown[];
899
927
  const userMessage = (data as any).userMessage as string | null;
900
928
  if (!events?.length && !userMessage) { setIsReconnecting(false); return; }
@@ -961,6 +989,10 @@ export function useChat(
961
989
  replayRafRef.current = 0;
962
990
  isReplayingRef.current = false;
963
991
  setIsReconnecting(false);
992
+ // Preserve websocket order: live text/done must follow the snapshot,
993
+ // even when rebuilding a large snapshot takes several frames.
994
+ const queued = queuedReplayMessagesRef.current.splice(0);
995
+ for (const message of queued) handleMessageRef.current?.(message);
964
996
  }
965
997
  };
966
998
  replayRafRef.current = requestAnimationFrame(processChunk);
@@ -970,6 +1002,7 @@ export function useChat(
970
1002
  // Route content events through processStreamEvent
971
1003
  processStreamEvent(data);
972
1004
  }, [processStreamEvent]);
1005
+ handleMessageRef.current = handleMessage;
973
1006
 
974
1007
  const wsUrl = sessionId && projectName
975
1008
  ? `/ws/project/${encodeURIComponent(projectName)}/chat/${sessionId}`
@@ -979,6 +1012,14 @@ export function useChat(
979
1012
  url: wsUrl,
980
1013
  onMessage: handleMessage,
981
1014
  autoConnect: !!sessionId && !!projectName,
1015
+ idleTimeoutMs: 45_000, // Server sends a heartbeat every 15 seconds.
1016
+ onConnectionChange: (connected) => {
1017
+ if (!connected) {
1018
+ setIsConnected(false);
1019
+ setIsReconnecting(true);
1020
+ }
1021
+ // session_state, rather than TCP open, confirms chat synchronization.
1022
+ },
982
1023
  });
983
1024
 
984
1025
  // Keep sendRef in sync so handleMessage can flush queued messages
@@ -987,6 +1028,9 @@ export function useChat(
987
1028
  // Load history and reset state when session changes
988
1029
  useEffect(() => {
989
1030
  let cancelled = false;
1031
+ const historyReconciled = historyReconciledRef.current;
1032
+ turnFinalizedRef.current = false;
1033
+ historyActivityRef.current++;
990
1034
 
991
1035
  // Keep the user's unconfirmed model/thinking picks across the draft→real transition
992
1036
  // (null → id), but drop them when switching between two existing sessions so one
@@ -1019,6 +1063,7 @@ export function useChat(
1019
1063
  if (syncRafRef.current) { clearTimeout(syncRafRef.current); syncRafRef.current = 0; }
1020
1064
  setIsConnected(false);
1021
1065
  setConnectedSessionId(null);
1066
+ setIsReconnecting(false);
1022
1067
  // Reset team state
1023
1068
  teamActivityRef.current = { teamNames: new Set(), messages: [] };
1024
1069
  teamUnreadRef.current = 0;
@@ -1060,7 +1105,7 @@ export function useChat(
1060
1105
  `${projectUrl(projectName)}/chat/sessions/${sessionId}/messages?providerId=${providerId}`,
1061
1106
  )
1062
1107
  .then((data: any) => {
1063
- if (cancelled) return;
1108
+ if (cancelled || historyReconciledRef.current !== historyReconciled) return;
1064
1109
  // Tolerate the pre-versionMap shape (a bare array): a browser running a
1065
1110
  // cached bundle from before the upgrade would otherwise render an empty
1066
1111
  // history with no error.
@@ -1093,7 +1138,9 @@ export function useChat(
1093
1138
  historyLoadedAtRef.current = Date.now();
1094
1139
  })
1095
1140
  .catch(() => {
1096
- if (!cancelled) setMessages((prev) => prev.filter((m) => !staleIds.has(m.id)));
1141
+ if (!cancelled && historyReconciledRef.current === historyReconciled) {
1142
+ setMessages((prev) => prev.filter((m) => !staleIds.has(m.id)));
1143
+ }
1097
1144
  })
1098
1145
  .finally(() => {
1099
1146
  if (!cancelled) setMessagesLoading(false);
@@ -1104,6 +1151,14 @@ export function useChat(
1104
1151
 
1105
1152
  return () => {
1106
1153
  cancelled = true;
1154
+ historyRequestRef.current?.abort();
1155
+ historyRequestRef.current = null;
1156
+ if (syncRafRef.current) clearTimeout(syncRafRef.current);
1157
+ syncRafRef.current = 0;
1158
+ if (replayRafRef.current) cancelAnimationFrame(replayRafRef.current);
1159
+ replayRafRef.current = 0;
1160
+ isReplayingRef.current = false;
1161
+ queuedReplayMessagesRef.current = [];
1107
1162
  };
1108
1163
  }, [sessionId, providerId, projectName, updateTeamActivity, loadTeamDetail]);
1109
1164
 
@@ -1112,8 +1167,10 @@ export function useChat(
1112
1167
  // An attachment-only message is legitimate now that images travel with it: the
1113
1168
  // caller may have nothing to say beyond the picture.
1114
1169
  if (!content.trim() && !opts?.images?.length) return;
1170
+ historyActivityRef.current++;
1115
1171
 
1116
1172
  const isFollowUp = phaseRef.current !== "idle";
1173
+ turnFinalizedRef.current = false;
1117
1174
 
1118
1175
  if (isFollowUp) {
1119
1176
  // Cancel pending throttled sync before finalizing
@@ -1302,30 +1359,34 @@ export function useChat(
1302
1359
  }, [wsReconnect]);
1303
1360
 
1304
1361
  const refetchMessages = useCallback(() => {
1305
- if (!sessionId || !projectName) return;
1362
+ if (!sessionId || !projectName || phaseRef.current !== "idle") return;
1363
+ historyRequestRef.current?.abort();
1364
+ const request = new AbortController();
1365
+ historyRequestRef.current = request;
1366
+ const activity = historyActivityRef.current;
1306
1367
  // No setMessagesLoading(true) here — keep current messages visible while
1307
1368
  // fetching in the background (stale-while-revalidate). The initial load
1308
1369
  // in the session-change useEffect already handles the first-time loading screen.
1309
- fetch(`${projectUrl(projectName)}/chat/sessions/${sessionId}/messages?providerId=${providerId}`, {
1310
- headers: { Authorization: `Bearer ${getAuthToken()}` },
1311
- })
1312
- .then((r) => r.json())
1313
- .then((json: any) => {
1370
+ api.get<any>(`${projectUrl(projectName)}/chat/sessions/${sessionId}/messages?providerId=${providerId}`, { signal: request.signal })
1371
+ .then((data: any) => {
1314
1372
  // A turn may have started while this fetch was in flight (e.g. edit→fork
1315
1373
  // swaps the session, session_state arrives idle and triggers this refetch,
1316
1374
  // then the queued edited message sends and moves phase off idle). The
1317
1375
  // fetched history predates that send, so replacing now would drop the
1318
1376
  // just-sent user message — leaving it missing until a manual reload.
1319
- if (phaseRef.current !== "idle") return;
1377
+ if (request.signal.aborted || historyRequestRef.current !== request
1378
+ || historyActivityRef.current !== activity || phaseRef.current !== "idle"
1379
+ || sessionIdRef.current !== sessionId || projectNameRef.current !== projectName
1380
+ || isReplayingRef.current) return;
1320
1381
  // Same back-compat unwrap as the initial load above.
1321
- const payload = json.ok
1322
- ? (Array.isArray(json.data) ? { messages: json.data, versionMap: undefined } : json.data)
1323
- : null;
1382
+ const payload = Array.isArray(data) ? { messages: data, versionMap: undefined } : data;
1324
1383
  // versionMap is refreshed independently of the length guard below: an
1325
1384
  // edit changes the branch tree without necessarily changing history
1326
1385
  // length, and the `n/m` counts must not go stale.
1327
1386
  if (payload?.versionMap) setVersionMap(payload.versionMap);
1328
1387
  if (Array.isArray(payload?.messages) && payload.messages.length > 0) {
1388
+ historyReconciledRef.current++;
1389
+ if (syncRafRef.current) { clearTimeout(syncRafRef.current); syncRafRef.current = 0; }
1329
1390
  setMessages(payload.messages);
1330
1391
  streamingContentRef.current = "";
1331
1392
  streamingEventsRef.current = [];
@@ -1,7 +1,7 @@
1
1
  import { useEffect, useRef, useCallback } from "react";
2
- import { WsClient } from "@/lib/ws-client";
2
+ import { WsClient, type WsClientOptions } from "@/lib/ws-client";
3
3
 
4
- interface UseWebSocketOptions {
4
+ interface UseWebSocketOptions extends WsClientOptions {
5
5
  url: string;
6
6
  onMessage?: (event: MessageEvent) => void;
7
7
  autoConnect?: boolean;
@@ -11,26 +11,39 @@ export function useWebSocket({
11
11
  url,
12
12
  onMessage,
13
13
  autoConnect = true,
14
+ idleTimeoutMs,
15
+ onConnectionChange,
14
16
  }: UseWebSocketOptions) {
15
17
  const clientRef = useRef<WsClient | null>(null);
18
+ const onMessageRef = useRef(onMessage);
19
+ const onConnectionChangeRef = useRef(onConnectionChange);
20
+ onMessageRef.current = onMessage;
21
+ onConnectionChangeRef.current = onConnectionChange;
16
22
 
17
23
  useEffect(() => {
18
- const client = new WsClient(url);
24
+ let active = true;
25
+ const client = new WsClient(url, {
26
+ idleTimeoutMs,
27
+ onConnectionChange: (connected) => {
28
+ if (active) onConnectionChangeRef.current?.(connected);
29
+ },
30
+ });
19
31
  clientRef.current = client;
20
32
 
21
- if (onMessage) {
22
- client.onMessage(onMessage);
23
- }
33
+ client.onMessage((event) => onMessageRef.current?.(event));
24
34
 
25
35
  if (autoConnect) {
26
36
  client.connect();
27
37
  }
28
38
 
29
39
  return () => {
40
+ // Replacing a session socket is intentional, not a connection failure.
41
+ // The old client's cleanup must not update the new session's UI.
42
+ active = false;
30
43
  client.disconnect();
31
44
  clientRef.current = null;
32
45
  };
33
- }, [url, autoConnect]); // eslint-disable-line react-hooks/exhaustive-deps
46
+ }, [url, autoConnect, idleTimeoutMs]);
34
47
 
35
48
  const send = useCallback((data: string | ArrayBuffer) => {
36
49
  clientRef.current?.send(data);
@@ -205,11 +205,14 @@ export interface AIProviderSettings {
205
205
  system_prompt?: string;
206
206
  agent_teams?: boolean;
207
207
  context_1m?: boolean;
208
+ model_context_window?: number | null;
209
+ model_auto_compact_token_limit?: number | null;
208
210
  inherit_claude_mcp?: boolean;
209
211
  }
210
212
 
211
213
  export interface AISettings {
212
214
  default_provider: string;
215
+ share_provider_context?: boolean;
213
216
  providers: Record<string, AIProviderSettings>;
214
217
  }
215
218
 
@@ -5,6 +5,12 @@ type MessageHandler = (data: MessageEvent) => void;
5
5
  const MAX_RECONNECT_DELAY = 30_000;
6
6
  const BASE_DELAY = 1_000;
7
7
 
8
+ export interface WsClientOptions {
9
+ /** Opt in only for protocols that regularly send heartbeat messages. */
10
+ idleTimeoutMs?: number;
11
+ onConnectionChange?: (connected: boolean) => void;
12
+ }
13
+
8
14
  export class WsClient {
9
15
  private ws: WebSocket | null = null;
10
16
  private url: string;
@@ -15,14 +21,18 @@ export class WsClient {
15
21
  /** Messages queued while WS is still CONNECTING — flushed on open */
16
22
  private pendingMessages: (string | ArrayBuffer)[] = [];
17
23
  private visibilityHandler: (() => void) | null = null;
24
+ private idleTimer: ReturnType<typeof setTimeout> | null = null;
25
+ private lastReceivedAt = 0;
26
+ private connected = false;
18
27
 
19
- constructor(url: string) {
28
+ constructor(url: string, private options: WsClientOptions = {}) {
20
29
  this.url = url;
21
30
  // Reconnect immediately when page becomes visible (e.g. iPad wake from sleep)
22
31
  this.visibilityHandler = () => {
23
- if (document.visibilityState === "visible" && !this.intentionalClose && this.ws?.readyState !== WebSocket.OPEN) {
24
- if (this.reconnectTimer) clearTimeout(this.reconnectTimer);
25
- this.reconnectTimer = null;
32
+ const state = this.ws?.readyState;
33
+ const stale = !!this.options.idleTimeoutMs && Date.now() - this.lastReceivedAt >= this.options.idleTimeoutMs;
34
+ if (document.visibilityState === "visible" && !this.intentionalClose
35
+ && (stale || (state !== WebSocket.OPEN && state !== WebSocket.CONNECTING))) {
26
36
  this.reconnectAttempts = 0;
27
37
  this.connect();
28
38
  }
@@ -32,6 +42,8 @@ export class WsClient {
32
42
 
33
43
  connect(): void {
34
44
  this.intentionalClose = false;
45
+ if (this.reconnectTimer) clearTimeout(this.reconnectTimer);
46
+ this.reconnectTimer = null;
35
47
  this.cleanup();
36
48
 
37
49
  const protocol = window.location.protocol === "https:" ? "wss:" : "ws:";
@@ -52,9 +64,13 @@ export class WsClient {
52
64
  }
53
65
 
54
66
  this.ws = new WebSocket(fullUrl);
67
+ this.lastReceivedAt = Date.now();
68
+ this.armIdleCheck();
55
69
 
56
70
  this.ws.onopen = () => {
57
71
  this.reconnectAttempts = 0;
72
+ this.lastReceivedAt = Date.now();
73
+ this.setConnected(true);
58
74
  // Send "ready" handshake — triggers server to send status/connected.
59
75
  // Through Cloudflare tunnels, the server's open-handler message may not
60
76
  // arrive because the end-to-end data path isn't fully established yet.
@@ -71,12 +87,15 @@ export class WsClient {
71
87
  };
72
88
 
73
89
  this.ws.onmessage = (event) => {
90
+ this.lastReceivedAt = Date.now();
74
91
  for (const handler of this.handlers) {
75
92
  handler(event);
76
93
  }
77
94
  };
78
95
 
79
96
  this.ws.onclose = () => {
97
+ this.clearIdleCheck();
98
+ this.setConnected(false);
80
99
  if (!this.intentionalClose) {
81
100
  this.scheduleReconnect();
82
101
  }
@@ -125,6 +144,8 @@ export class WsClient {
125
144
  }
126
145
 
127
146
  private cleanup(): void {
147
+ this.clearIdleCheck();
148
+ this.setConnected(false);
128
149
  if (this.ws) {
129
150
  this.ws.onopen = null;
130
151
  this.ws.onclose = null;
@@ -141,6 +162,7 @@ export class WsClient {
141
162
  }
142
163
 
143
164
  private scheduleReconnect(): void {
165
+ if (this.reconnectTimer) clearTimeout(this.reconnectTimer);
144
166
  const delay = Math.min(
145
167
  BASE_DELAY * Math.pow(2, this.reconnectAttempts),
146
168
  MAX_RECONNECT_DELAY,
@@ -148,4 +170,33 @@ export class WsClient {
148
170
  this.reconnectAttempts++;
149
171
  this.reconnectTimer = setTimeout(() => this.connect(), delay);
150
172
  }
173
+
174
+ private setConnected(connected: boolean): void {
175
+ if (this.connected === connected) return;
176
+ this.connected = connected;
177
+ this.options.onConnectionChange?.(connected);
178
+ }
179
+
180
+ private clearIdleCheck(): void {
181
+ if (this.idleTimer) clearTimeout(this.idleTimer);
182
+ this.idleTimer = null;
183
+ }
184
+
185
+ private armIdleCheck(): void {
186
+ this.clearIdleCheck();
187
+ const timeout = this.options.idleTimeoutMs;
188
+ if (!timeout || timeout <= 0 || !Number.isFinite(timeout)) return;
189
+ const remaining = Math.max(0, timeout - (Date.now() - this.lastReceivedAt));
190
+ this.idleTimer = setTimeout(() => {
191
+ this.idleTimer = null;
192
+ if (this.intentionalClose) return;
193
+ if (Date.now() - this.lastReceivedAt >= timeout) {
194
+ // An OPEN socket can have a dead downstream without firing close/error.
195
+ // A fresh handshake lets the server replay the active turn or idle history.
196
+ this.connect();
197
+ } else {
198
+ this.armIdleCheck();
199
+ }
200
+ }, remaining);
201
+ }
151
202
  }
package/.release-bin/zip DELETED
@@ -1,15 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
- while [[ "$#" -gt 0 && "$1" == -* ]]; do shift; done
4
- archive="$1"
5
- root="$2"
6
- python.exe - "$archive" "$root" <<'PY'
7
- import os, sys, zipfile
8
- archive, root = sys.argv[1:3]
9
- base = os.path.dirname(root)
10
- with zipfile.ZipFile(archive, "w", zipfile.ZIP_DEFLATED) as z:
11
- for current, _, files in os.walk(root):
12
- for filename in files:
13
- path = os.path.join(current, filename)
14
- z.write(path, os.path.relpath(path, base))
15
- PY
@@ -1,11 +0,0 @@
1
- #!/usr/bin/env bash
2
- node() {
3
- if [ "$1" = "-p" ]; then
4
- bun -e "console.log($2)"
5
- else
6
- command bun "$@"
7
- fi
8
- }
9
- export -f node
10
- export PATH="$PWD/.release-bin:$PATH"
11
- bash scripts/release.sh 0.20.5
@@ -1 +0,0 @@
1
- import{o as e}from"./rolldown-runtime-FhOqtrmT.js";import{S as t,x as n}from"./vendor-markdown-Ls5AcU91.js";import{n as r}from"./api-client-CEYCBt_0.js";import{B as i,Dr as a,G as o,H as s,Ln as c,M as l,U as u,V as d,W as f,X as p,Xn as m,Y as h,cn as g}from"./index-DYGLdCpe.js";import{getAISettings as _,updateAISettings as v}from"./api-settings-D18Q4Ocp.js";var y=e(t(),1),b=n(),x=[{value:`low`,label:`Low`},{value:`medium`,label:`Medium`},{value:`high`,label:`High`},{value:`xhigh`,label:`Extra`},{value:`max`,label:`Max`}],S=[{value:`bypassPermissions`,label:`Bypass permissions (default)`},{value:`default`,label:`Ask before edits`},{value:`acceptEdits`,label:`Edit automatically`},{value:`plan`,label:`Plan mode`}],C={claude:`Claude`,cursor:`Cursor`,codex:`Codex`,gemini:`Gemini`};function w({compact:e}={}){let[t,n]=(0,y.useState)(null),[c,m]=(0,y.useState)(``),[w,E]=(0,y.useState)([]),[D,O]=(0,y.useState)(!1),[k,A]=(0,y.useState)(!1),[j,M]=(0,y.useState)(null),[N,P]=(0,y.useState)(0);(0,y.useEffect)(()=>{_().then(e=>{n(e),m(e.default_provider??`claude`)}).catch(e=>M(e.message))},[]),(0,y.useEffect)(()=>{c&&(O(!0),r.get(`/api/settings/ai/providers/${c}/models`).then(E).catch(()=>E([])).finally(()=>O(!1)))},[c]);let F=t?Object.keys(t.providers).filter(e=>e!==`mock`).map(e=>({id:e,name:C[e]??e})):[],I=t?.providers[c],L=I?.type===`agent-sdk`||!I?.type&&c===`claude`,R=async(e,r)=>{if(t){A(!0),M(null);try{n(await v({providers:{[c]:{[e]:r}}})),P(e=>e+1)}catch(e){M(e.message)}finally{A(!1)}}},z=e?`text-[11px]`:`text-sm`,B=e?`text-xs`:`text-sm`,V=e?`space-y-2`:`space-y-4`,H=e?`space-y-1.5`:`space-y-3`,U=e?`space-y-1`:`space-y-1.5`;if(!t)return(0,b.jsxs)(`div`,{className:H,children:[(0,b.jsx)(`h3`,{className:`${B} font-medium text-text-secondary`,children:`AI Settings`}),(0,b.jsx)(`p`,{className:`${z} text-text-subtle`,children:j?`Error: ${j}`:`Loading...`})]});let W=L?w:[{value:`__default__`,label:`Auto (default)`},...w];return(0,b.jsxs)(`div`,{className:V,children:[(0,b.jsx)(`h3`,{className:`${B} font-medium text-text-secondary`,children:`AI Settings`}),F.length>1&&(0,b.jsx)(`div`,{className:`flex gap-0.5 border-b border-border/50 -mx-1 px-1`,children:F.map(e=>(0,b.jsxs)(`button`,{onClick:()=>m(e.id),className:`flex items-center gap-1 px-2 py-1 text-[11px] rounded-t transition-colors ${c===e.id?`text-primary border-b-2 border-primary font-medium`:`text-text-subtle hover:text-text-secondary`}`,children:[(0,b.jsx)(l,{providerId:e.id}),(0,b.jsx)(`span`,{className:`capitalize`,children:e.name})]},e.id))}),(0,b.jsxs)(`div`,{className:H,children:[c===`codex`&&(0,b.jsxs)(`button`,{type:`button`,onClick:()=>g(`accounts`),className:`w-full flex items-center justify-between gap-2 rounded-md border border-border px-2.5 py-2 text-left cursor-pointer hover:bg-surface-elevated transition-colors`,children:[(0,b.jsx)(`span`,{className:`${z} text-text-secondary`,children:`Codex accounts & login`}),(0,b.jsx)(a,{className:`size-3.5 text-text-subtle shrink-0`})]}),w.length>0&&(0,b.jsxs)(`div`,{className:U,children:[(0,b.jsx)(h,{htmlFor:`ai-model`,className:e?z:void 0,children:`Model`}),(0,b.jsxs)(i,{value:L?I?.model??w[0]?.value:I?.model||`__default__`,onValueChange:e=>R(`model`,e===`__default__`?void 0:e),disabled:D,children:[(0,b.jsx)(u,{id:`ai-model`,className:`w-full ${e?`h-7 text-[11px]`:``}`,children:(0,b.jsx)(f,{placeholder:D?`Loading models...`:`Select model`})}),(0,b.jsx)(d,{className:`max-h-[300px]`,children:W.map(e=>(0,b.jsx)(s,{value:e.value,children:e.label},e.value))})]})]}),L&&(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)(`div`,{className:U,children:[(0,b.jsx)(h,{htmlFor:`ai-base-url`,className:e?z:void 0,children:`Base URL`}),(0,b.jsx)(p,{id:`ai-base-url`,type:`url`,defaultValue:I?.base_url??``,placeholder:`https://api.anthropic.com (default)`,className:e?`h-7 text-[11px]`:void 0,onBlur:e=>{R(`base_url`,e.target.value.trim()||void 0)}},`baseurl-${c}-${N}`)]}),(0,b.jsxs)(`div`,{className:U,children:[(0,b.jsx)(h,{htmlFor:`ai-api-key`,className:e?z:void 0,children:`API Key / Token`}),(0,b.jsx)(p,{id:`ai-api-key`,type:`password`,defaultValue:I?.api_key??``,placeholder:`sk-ant-... (optional, overrides accounts)`,className:e?`h-7 text-[11px] font-mono`:`font-mono`,onBlur:e=>{let t=e.target.value.trim();t.startsWith(`••••`)||R(`api_key`,t||void 0)}},`apikey-${c}-${N}`),(0,b.jsx)(`p`,{className:`${e?`text-[9px]`:`text-[11px]`} text-muted-foreground`,children:`Direct API key or OAuth token. Leave empty to use connected accounts.`})]}),(0,b.jsxs)(`div`,{className:U,children:[(0,b.jsx)(h,{htmlFor:`ai-effort`,className:e?z:void 0,children:`Effort`}),(0,b.jsxs)(i,{value:I?.effort??`high`,onValueChange:e=>R(`effort`,e),children:[(0,b.jsx)(u,{id:`ai-effort`,className:`w-full ${e?`h-7 text-[11px]`:``}`,children:(0,b.jsx)(f,{})}),(0,b.jsx)(d,{children:x.map(e=>(0,b.jsx)(s,{value:e.value,children:e.label},e.value))})]})]}),(0,b.jsxs)(`div`,{className:U,children:[(0,b.jsx)(h,{htmlFor:`ai-max-turns`,className:e?z:void 0,children:`Max Turns (1-500)`}),(0,b.jsx)(p,{id:`ai-max-turns`,type:`number`,min:1,max:500,defaultValue:I?.max_turns??100,className:e?`h-7 text-[11px]`:void 0,onBlur:e=>{let t=parseInt(e.target.value);isNaN(t)||R(`max_turns`,t)}},`turns-${c}-${N}`)]}),(0,b.jsxs)(`div`,{className:U,children:[(0,b.jsx)(h,{htmlFor:`ai-budget`,className:e?z:void 0,children:`Max Budget (USD)`}),(0,b.jsx)(p,{id:`ai-budget`,type:`number`,step:.1,min:.01,max:50,defaultValue:I?.max_budget_usd??``,placeholder:`No limit`,className:e?`h-7 text-[11px]`:void 0,onBlur:e=>{let t=parseFloat(e.target.value);R(`max_budget_usd`,isNaN(t)?void 0:t)}},`budget-${c}-${N}`)]}),(0,b.jsxs)(`div`,{className:U,children:[(0,b.jsx)(h,{htmlFor:`ai-thinking`,className:e?z:void 0,children:`Thinking Budget (tokens)`}),(0,b.jsx)(p,{id:`ai-thinking`,type:`number`,min:0,defaultValue:I?.thinking_budget_tokens??``,placeholder:`Adaptive (model decides)`,className:e?`h-7 text-[11px]`:void 0,onBlur:e=>{let t=parseInt(e.target.value);R(`thinking_budget_tokens`,isNaN(t)?void 0:t)}},`thinking-${c}-${N}`)]}),(0,b.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsx)(h,{htmlFor:`ai-agent-teams`,className:e?z:void 0,children:`Agent Teams`}),(0,b.jsx)(`p`,{className:`${e?`text-[9px]`:`text-[11px]`} text-muted-foreground`,children:`Experimental. Enables multi-agent collaboration with shared tasks and messaging. Uses ~7x more tokens.`})]}),(0,b.jsx)(o,{id:`ai-agent-teams`,checked:I?.agent_teams??!1,onCheckedChange:e=>R(`agent_teams`,e)})]}),I?.agent_teams&&(0,b.jsx)(T,{compact:e}),(0,b.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsx)(h,{htmlFor:`ai-context-1m`,className:e?z:void 0,children:`1M Context Window`}),(0,b.jsx)(`p`,{className:`${e?`text-[9px]`:`text-[11px]`} text-muted-foreground`,children:`Requires an entitled account (Max/Team/Enterprise) and an Opus 4 / Sonnet 4 model. Other accounts will error.`})]}),(0,b.jsx)(o,{id:`ai-context-1m`,checked:I?.context_1m??!1,onCheckedChange:e=>R(`context_1m`,e)})]}),(0,b.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,b.jsxs)(`div`,{children:[(0,b.jsx)(h,{htmlFor:`ai-inherit-mcp`,className:e?z:void 0,children:`Inherit Claude Code MCP`}),(0,b.jsx)(`p`,{className:`${e?`text-[9px]`:`text-[11px]`} text-muted-foreground`,children:`Auto-load MCP servers from Claude Code's ~/.claude.json (global + per-project). Your own MCP servers override inherited ones.`})]}),(0,b.jsx)(o,{id:`ai-inherit-mcp`,checked:I?.inherit_claude_mcp??!0,onCheckedChange:e=>R(`inherit_claude_mcp`,e)})]})]}),(0,b.jsxs)(`div`,{className:U,children:[(0,b.jsx)(h,{htmlFor:`ai-permission-mode`,className:e?z:void 0,children:`Default Permission Mode`}),(0,b.jsxs)(i,{value:I?.permission_mode??`bypassPermissions`,onValueChange:e=>R(`permission_mode`,e),children:[(0,b.jsx)(u,{id:`ai-permission-mode`,className:`w-full ${e?`h-7 text-[11px]`:``}`,children:(0,b.jsx)(f,{})}),(0,b.jsx)(d,{children:S.map(e=>(0,b.jsx)(s,{value:e.value,children:e.label},e.value))})]})]}),(0,b.jsxs)(`div`,{className:U,children:[(0,b.jsx)(h,{htmlFor:`ai-system-prompt`,className:e?z:void 0,children:`Additional Instructions`}),(0,b.jsx)(`textarea`,{id:`ai-system-prompt`,rows:e?3:4,defaultValue:I?.system_prompt??``,placeholder:`Enter additional instructions for ${c}...`,className:`w-full rounded-md border border-input bg-background px-3 py-2 ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 ${e?`text-[11px]`:`text-sm`}`,onBlur:e=>{R(`system_prompt`,e.target.value.trim()||void 0)}},`sysprompt-${c}-${N}`)]})]}),k&&(0,b.jsx)(`p`,{className:`text-xs text-text-subtle`,children:`Saving...`}),j&&(0,b.jsx)(`p`,{className:`text-xs text-error`,children:j})]})}function T({compact:e}){let[t,n]=(0,y.useState)([]),[i,a]=(0,y.useState)(!1),[o,s]=(0,y.useState)(null),l=(0,y.useCallback)(async()=>{a(!0);try{n(await r.get(`/api/teams`)??[])}catch{}a(!1)},[]);(0,y.useEffect)(()=>{l()},[l]);let u=async e=>{try{await r.del(`/api/teams/${encodeURIComponent(e)}`),n(t=>t.filter(t=>t.name!==e)),s(null)}catch{}};return t.length===0&&!i?null:(0,b.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,b.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,b.jsxs)(h,{className:e?`text-[11px]`:void 0,children:[`Teams (`,t.length,`)`]}),(0,b.jsx)(`button`,{onClick:l,className:`text-text-subtle hover:text-foreground p-1`,"aria-label":`Refresh teams`,children:(0,b.jsx)(m,{className:`size-3 ${i?`animate-spin`:``}`})})]}),t.map(e=>(0,b.jsxs)(`div`,{className:`flex items-center justify-between p-2 rounded bg-surface-elevated text-xs`,children:[(0,b.jsxs)(`div`,{className:`min-w-0`,children:[(0,b.jsx)(`div`,{className:`font-medium truncate`,children:e.name}),e.description&&(0,b.jsx)(`div`,{className:`text-text-subtle truncate`,children:e.description}),(0,b.jsxs)(`div`,{className:`text-text-subtle`,children:[e.members?.length??e.memberCount??0,` members`,e.createdAt?` · ${new Date(e.createdAt).toLocaleDateString()}`:``]})]}),o===e.name?(0,b.jsxs)(`div`,{className:`flex gap-1 shrink-0 ml-2`,children:[(0,b.jsx)(`button`,{onClick:()=>u(e.name),className:`px-2 py-1 bg-error text-white rounded text-[10px]`,children:`Delete`}),(0,b.jsx)(`button`,{onClick:()=>s(null),className:`px-2 py-1 bg-panel-2 text-text rounded text-[10px]`,children:`Cancel`})]}):(0,b.jsx)(`button`,{onClick:()=>s(e.name),className:`shrink-0 text-text-subtle hover:text-error p-1 ml-2`,"aria-label":`Delete team ${e.name}`,children:(0,b.jsx)(c,{className:`size-3.5`})})]},e.name))]})}export{w as t};
@@ -1 +0,0 @@
1
- import{K as e}from"./vendor-mermaid-CfY1-PkA.js";export{e as createArchitectureServices};