@hienlh/ppm 0.17.15 → 0.17.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (426) hide show
  1. package/CHANGELOG.md +9 -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/{ai-resource-editor-DfCN7LjR.js → ai-resource-editor-CsossqDO.js} +1 -1
  6. package/dist/web/assets/{angular-html-DkR4iCth.js → angular-html-CkxY2iBQ.js} +1 -1
  7. package/dist/web/assets/{angular-ts-DcyL4Chx.js → angular-ts-BePeGkkC.js} +1 -1
  8. package/dist/web/assets/{apl-BVlrVtjt.js → apl-DBS7PWvB.js} +1 -1
  9. package/dist/web/assets/architecture-PBZL5I3N-NAS99xy0.js +1 -0
  10. package/dist/web/assets/{astro-MjJlozLj.js → astro-Clbk1k4h.js} +1 -1
  11. package/dist/web/assets/{audio-preview-DbFUkIzm.js → audio-preview-DIkokvPM.js} +1 -1
  12. package/dist/web/assets/{blade-DnJWi1fz.js → blade-BeBsBuGS.js} +1 -1
  13. package/dist/web/assets/{bsl-DCmJxSIz.js → bsl-DYigT3JZ.js} +1 -1
  14. package/dist/web/assets/{cairo-C8dDenub.js → cairo-BjpO78wI.js} +1 -1
  15. package/dist/web/assets/chat-tab-Bh6l253v.js +18 -0
  16. package/dist/web/assets/click-outside-container-DXZVmhaX.js +1 -0
  17. package/dist/web/assets/{cobol-DPx_nifl.js → cobol-CpuUx69s.js} +1 -1
  18. package/dist/web/assets/code-editor-B7F-d4DK.js +10 -0
  19. package/dist/web/assets/{coffee-DvFzqhgN.js → coffee-FoFd2Cxo.js} +1 -1
  20. package/dist/web/assets/{conflict-editor-BAAffNdj.js → conflict-editor-Dqm1bkyL.js} +3 -3
  21. package/dist/web/assets/{cpp-BLJN0umi.js → cpp-CO_nPfdr.js} +1 -1
  22. package/dist/web/assets/{crystal-BXR-9fGw.js → crystal-D-UygAAF.js} +1 -1
  23. package/dist/web/assets/{csv-preview-DzhSC0fd.js → csv-preview-CvP4xzug.js} +1 -1
  24. package/dist/web/assets/data-grid-overlay-editor-CUlFsD-D.js +1 -0
  25. package/dist/web/assets/database-viewer-5oNTPgjF.js +1 -0
  26. package/dist/web/assets/{diff-viewer-DvXxlk47.js → diff-viewer-BfWixe_z.js} +1 -1
  27. package/dist/web/assets/dist-BsziT-tR.js +11 -0
  28. package/dist/web/assets/{docx-preview-DfjH-dIr.js → docx-preview-CguUoTKe.js} +1 -1
  29. package/dist/web/assets/{edge-rWOlCmXT.js → edge-BSzxzX11.js} +1 -1
  30. package/dist/web/assets/{elixir-E7Y82okW.js → elixir-DH1-Mrep.js} +1 -1
  31. package/dist/web/assets/{elm-DTPGbc-w.js → elm-B0ln5J70.js} +1 -1
  32. package/dist/web/assets/{erb-DHqLHrE6.js → erb-GIz6NnlZ.js} +1 -1
  33. package/dist/web/assets/{erlang-Byg0nNiV.js → erlang-B8MgYhib.js} +1 -1
  34. package/dist/web/assets/esm-CjVeOTNQ.js +2 -0
  35. package/dist/web/assets/{extension-webview-wuMQ8pD7.js → extension-webview-DTpFt1eL.js} +1 -1
  36. package/dist/web/assets/{fortran-fixed-form-CY1n0Xf6.js → fortran-fixed-form-D_-TrK6U.js} +1 -1
  37. package/dist/web/assets/{fsharp-_vEDSCJz.js → fsharp-C9cLCk2b.js} +1 -1
  38. package/dist/web/assets/{gdresource-B6XT0wAC.js → gdresource-CsZ3lXwY.js} +1 -1
  39. package/dist/web/assets/{git-commit-Wk9ovq59.js → git-commit-xmq0KqrA.js} +1 -1
  40. package/dist/web/assets/{git-log-panel-SPPYmbCr.js → git-log-panel-DUX7N5tN.js} +1 -1
  41. package/dist/web/assets/{git-rebase-DSarGPvK.js → git-rebase-D3O-jsSX.js} +1 -1
  42. package/dist/web/assets/gitGraph-HDMCJU4V-B4I3L4Sf.js +1 -0
  43. package/dist/web/assets/glide-data-grid-7vB1SNne.js +138 -0
  44. package/dist/web/assets/{glimmer-js-CkYI35_P.js → glimmer-js-g74gESrC.js} +1 -1
  45. package/dist/web/assets/{glimmer-ts-BqmIZcds.js → glimmer-ts-DF4aDWHT.js} +1 -1
  46. package/dist/web/assets/{glsl-Be-yBCF5.js → glsl-D5LmfW7l.js} +1 -1
  47. package/dist/web/assets/{graphql-a5DrENHY.js → graphql-_KI4RuXL.js} +1 -1
  48. package/dist/web/assets/group-chat-tab-CNECY-zg.js +1 -0
  49. package/dist/web/assets/{hack-BLAg20aD.js → hack-B1NaTC39.js} +1 -1
  50. package/dist/web/assets/{haml-Dj6bGOQH.js → haml-DDFXadZ4.js} +1 -1
  51. package/dist/web/assets/{handlebars-dmEa36Oh.js → handlebars-Bp-Jq3K9.js} +1 -1
  52. package/dist/web/assets/{html-yacZYzSE.js → html-DyB9_5Tj.js} +1 -1
  53. package/dist/web/assets/{html-derivative-lLi3-RNT.js → html-derivative-CC60wi-3.js} +1 -1
  54. package/dist/web/assets/{http-1KaxcE4e.js → http-C-9qngH4.js} +1 -1
  55. package/dist/web/assets/{hurl-ST-dEEZR.js → hurl-BtxgpNDs.js} +1 -1
  56. package/dist/web/assets/{hxml-CpDtuq__.js → hxml-DOoOS9op.js} +1 -1
  57. package/dist/web/assets/{image-preview-D_8o6OLx.js → image-preview-CZg6FQ3w.js} +1 -1
  58. package/dist/web/assets/{index-C1Q59prB.js → index-D2G6kmTs.js} +7 -7
  59. package/dist/web/assets/index-DCmrZnq0.css +2 -0
  60. package/dist/web/assets/info-3K5VOQVL-CBbbOe3C.js +1 -0
  61. package/dist/web/assets/{jinja-Cjw-evAn.js → jinja-cN-150ao.js} +1 -1
  62. package/dist/web/assets/{jison-DfATMYoY.js → jison-CqjsqPq5.js} +1 -1
  63. package/dist/web/assets/{julia-DDCaxiqT.js → julia-C-I5m8W4.js} +1 -1
  64. package/dist/web/assets/{just-CJL529u6.js → just-CgsSW9zs.js} +1 -1
  65. package/dist/web/assets/keybindings-store-D8Cppv4w.js +1 -0
  66. package/dist/web/assets/{latex-Zc4EpLpW.js → latex-BFzR9N2d.js} +1 -1
  67. package/dist/web/assets/{liquid-B_6KMNYS.js → liquid-BWfr-_iC.js} +1 -1
  68. package/dist/web/assets/{lua-BtS2idK7.js → lua-DsXVun6g.js} +1 -1
  69. package/dist/web/assets/{markdown-renderer-DVVx3WCU.js → markdown-renderer-CiQkvWP_.js} +3 -3
  70. package/dist/web/assets/{marko-Wk6LBnck.js → marko-DWBbo09n.js} +1 -1
  71. package/dist/web/assets/{mdc-cRaXBrzL.js → mdc-CUMe9LOG.js} +1 -1
  72. package/dist/web/assets/{nextflow-Bos2wvDV.js → nextflow-CoYbADOm.js} +1 -1
  73. package/dist/web/assets/{nginx-DMlOwzdr.js → nginx-z-JRZREw.js} +1 -1
  74. package/dist/web/assets/{nim-D2dZQA88.js → nim-Ci4LHyBm.js} +1 -1
  75. package/dist/web/assets/notification-store-DOGxkWih.js +1 -0
  76. package/dist/web/assets/{number-overlay-editor-Du_UgiD3.js → number-overlay-editor-lnnuUpPI.js} +1 -1
  77. package/dist/web/assets/packet-RMMSAZCW-fr8-QSTF.js +1 -0
  78. package/dist/web/assets/{pdf-preview-HTC73FyK.js → pdf-preview-B6ZqANpw.js} +1 -1
  79. package/dist/web/assets/{perl-C5-Z6fPn.js → perl-pbDimKOO.js} +1 -1
  80. package/dist/web/assets/{php-BXNNhkMH.js → php-B003E5v7.js} +1 -1
  81. package/dist/web/assets/pie-UPGHQEXC-Biu7_Pbb.js +1 -0
  82. package/dist/web/assets/postgres-viewer-B23xTCSs.js +3 -0
  83. package/dist/web/assets/{pug-C1zf1yWy.js → pug-AoueAWJo.js} +1 -1
  84. package/dist/web/assets/{qml-OW58jGpD.js → qml-CepxioQA.js} +1 -1
  85. package/dist/web/assets/radar-KQ55EAFF-CMtNRpK6.js +1 -0
  86. package/dist/web/assets/{razor-DzjSaobM.js → razor-lIvU-Gu-.js} +1 -1
  87. package/dist/web/assets/{rst-RfuihOUW.js → rst-Dn-dwElE.js} +1 -1
  88. package/dist/web/assets/{ruby-CNO3pli1.js → ruby-DmsD1Iz5.js} +1 -1
  89. package/dist/web/assets/{sas-DZY5BtXx.js → sas-6IM2P4YP.js} +1 -1
  90. package/dist/web/assets/{scss--4g-REcN.js → scss-RgYEZQqh.js} +1 -1
  91. package/dist/web/assets/{settings-store-mWnY4Kt0.js → settings-store-BkSf4SPQ.js} +2 -2
  92. package/dist/web/assets/settings-tab-D5hAA1bY.js +1 -0
  93. package/dist/web/assets/{shaderlab-Cu4sBiVn.js → shaderlab-B0MNEwt4.js} +1 -1
  94. package/dist/web/assets/{shellsession-DWzJfEv7.js → shellsession-F8S4LrQI.js} +1 -1
  95. package/dist/web/assets/{soy-BnqE-5Ff.js → soy-DDlMbX7u.js} +1 -1
  96. package/dist/web/assets/{sparql-Ctg__NhZ.js → sparql-kthmGAAe.js} +1 -1
  97. package/dist/web/assets/{sql-query-editor-CJdpO95g.js → sql-query-editor-BYNM0RRl.js} +1 -1
  98. package/dist/web/assets/sqlite-viewer-DW9f2Hqj.js +1 -0
  99. package/dist/web/assets/{stata-Qk2h66XW.js → stata-Tfbew8La.js} +1 -1
  100. package/dist/web/assets/{surrealql-8QEX7EfH.js → surrealql-C0LIGqRx.js} +1 -1
  101. package/dist/web/assets/{svelte-D_mubC5-.js → svelte-CfTy8CGF.js} +1 -1
  102. package/dist/web/assets/{system-monitor-tab-BA9gqJRW.js → system-monitor-tab-B5f4pgdX.js} +1 -1
  103. package/dist/web/assets/{templ-C1jV0fsO.js → templ-V5H1Sbfy.js} +1 -1
  104. package/dist/web/assets/{terminal-tab-DWncjHEA.js → terminal-tab-CK3lX-0Y.js} +2 -2
  105. package/dist/web/assets/{tex-D_StFXy_.js → tex-C3H3uMZf.js} +1 -1
  106. package/dist/web/assets/treemap-KZPCXAKY-ZYVFjoaN.js +1 -0
  107. package/dist/web/assets/{ts-tags-B5m47rEm.js → ts-tags-7AXgG5YS.js} +1 -1
  108. package/dist/web/assets/{twig-C_br6GIl.js → twig-BSyS38T3.js} +1 -1
  109. package/dist/web/assets/{use-monaco-theme-Ch2jRiGj.js → use-monaco-theme-Jj2OxkAE.js} +1 -1
  110. package/dist/web/assets/{use-websocket-MvxbuTdy.js → use-websocket-DrDBgIWU.js} +1 -1
  111. package/dist/web/assets/{vendor-mermaid-DP1CEcGn.js → vendor-mermaid-DGOXKrJC.js} +193 -193
  112. package/dist/web/assets/{video-preview-rWrNCfZX.js → video-preview-BOHxkwKG.js} +1 -1
  113. package/dist/web/assets/{vue-DQwCnLdr.js → vue-C4d_br9u.js} +1 -1
  114. package/dist/web/assets/{vue-html-T_EoGpPJ.js → vue-html-CGdoz4vW.js} +1 -1
  115. package/dist/web/assets/{vue-vine-DmxLqX50.js → vue-vine-CqNolQlN.js} +1 -1
  116. package/dist/web/assets/{xml-Bs6Bw8is.js → xml-UmCmu-Od.js} +1 -1
  117. package/dist/web/assets/{xsl-f5ZNhRCc.js → xsl-DJG6USGh.js} +1 -1
  118. package/dist/web/index.html +14 -14
  119. package/dist/web/monacoeditorwork/css.worker.bundle.js +122 -122
  120. package/dist/web/monacoeditorwork/editor.worker.bundle.js +78 -78
  121. package/dist/web/monacoeditorwork/html.worker.bundle.js +110 -110
  122. package/dist/web/monacoeditorwork/json.worker.bundle.js +108 -108
  123. package/dist/web/monacoeditorwork/ts.worker.bundle.js +81 -81
  124. package/dist/web/sw.js +1 -1
  125. package/package.json +1 -1
  126. package/schemas/ppm-config.schema.json +3 -3
  127. package/src/cli/commands/init.ts +8 -5
  128. package/src/providers/claude-agent-sdk-query-options.ts +57 -0
  129. package/src/providers/claude-agent-sdk.ts +21 -9
  130. package/src/server/ws/chat.ts +91 -10
  131. package/src/services/account.service.ts +13 -7
  132. package/src/services/db.service.ts +31 -1
  133. package/src/types/api.ts +4 -2
  134. package/src/types/chat.ts +8 -0
  135. package/src/types/config.ts +4 -9
  136. package/src/web/components/chat/chat-tab.tsx +8 -0
  137. package/src/web/components/chat/message-input.tsx +27 -7
  138. package/src/web/components/chat/message-list.tsx +48 -3
  139. package/src/web/components/chat/model-thinking-selector-helpers.ts +33 -0
  140. package/src/web/components/chat/model-thinking-selector.tsx +189 -0
  141. package/src/web/components/settings/ai-settings-section.tsx +2 -0
  142. package/src/web/components/settings/proxy-test-section.tsx +3 -1
  143. package/src/web/hooks/use-chat.ts +45 -0
  144. package/dist/web/assets/architecture-PBZL5I3N-CqTF9Xn6.js +0 -1
  145. package/dist/web/assets/chat-tab-C6nMDb9l.js +0 -18
  146. package/dist/web/assets/code-editor-C38IIs_y.js +0 -10
  147. package/dist/web/assets/data-grid-overlay-editor-cOzDcGkl.js +0 -1
  148. package/dist/web/assets/data-grid-types-CWHnFOc-.js +0 -1
  149. package/dist/web/assets/database-viewer-DxmL2veb.js +0 -1
  150. package/dist/web/assets/dist-B5ErTtYs.js +0 -11
  151. package/dist/web/assets/esm-DU7axMjq.js +0 -2
  152. package/dist/web/assets/gitGraph-HDMCJU4V-X12vfQ3i.js +0 -1
  153. package/dist/web/assets/glide-data-grid-BC0AHzMn.js +0 -138
  154. package/dist/web/assets/group-chat-tab-D20bF8q5.js +0 -1
  155. package/dist/web/assets/index-CMJ6whqq.css +0 -2
  156. package/dist/web/assets/info-3K5VOQVL-Bcz-Qhua.js +0 -1
  157. package/dist/web/assets/keybindings-store-TINaziU9.js +0 -1
  158. package/dist/web/assets/notification-store-DN8oDV7o.js +0 -1
  159. package/dist/web/assets/packet-RMMSAZCW-BTwjB70W.js +0 -1
  160. package/dist/web/assets/pie-UPGHQEXC-Cn-lrQYZ.js +0 -1
  161. package/dist/web/assets/postgres-viewer-pWjwP3GD.js +0 -3
  162. package/dist/web/assets/radar-KQ55EAFF-Cmppm_Ia.js +0 -1
  163. package/dist/web/assets/settings-tab-BoRuss3O.js +0 -1
  164. package/dist/web/assets/sqlite-viewer-BgewX3tM.js +0 -1
  165. package/dist/web/assets/treemap-KZPCXAKY-BLWus1wm.js +0 -1
  166. package/docs/journal/binary-self-upgrade-260724.md +0 -66
  167. package/nul/docs/claude-agent-sdk-reference.md +0 -780
  168. package/nul/docs/code-standards.md +0 -1080
  169. package/nul/docs/codebase-summary.md +0 -916
  170. package/nul/docs/deployment-guide.md +0 -702
  171. package/nul/docs/design-guidelines.md +0 -767
  172. package/nul/docs/extension-development-guide.md +0 -629
  173. package/nul/docs/journals/260414-1400-ext-git-graph-port-complete.md +0 -147
  174. package/nul/docs/journals/260414-1452-git-graph-faithful-port.md +0 -144
  175. package/nul/docs/journals/260414-1810-git-graph-ui-improvements-complete.md +0 -261
  176. package/nul/docs/journals/260414-2001-bundled-extensions.md +0 -219
  177. package/nul/docs/journals/260415-frontend-memory-optimization.md +0 -73
  178. package/nul/docs/lessons-learned.md +0 -70
  179. package/nul/docs/project-changelog.md +0 -574
  180. package/nul/docs/project-overview-pdr.md +0 -205
  181. package/nul/docs/project-roadmap.md +0 -222
  182. package/nul/docs/system-architecture.md +0 -1961
  183. package/packages/vscode-compat/node_modules/.bin/tsc.bunx +0 -0
  184. package/packages/vscode-compat/node_modules/.bin/tsc.exe +0 -0
  185. package/packages/vscode-compat/node_modules/.bin/tsserver.bunx +0 -0
  186. package/packages/vscode-compat/node_modules/.bin/tsserver.exe +0 -0
  187. package/spike-group-channel.mjs +0 -156
  188. package/spike-group-chat.mjs +0 -181
  189. /package/dist/web/assets/{abap-tkptwpsK.js → abap-BZ3J5hF3.js} +0 -0
  190. /package/dist/web/assets/{actionscript-3-Di9TMGwg.js → actionscript-3-CkyGfT-8.js} +0 -0
  191. /package/dist/web/assets/{ada-CB9F079D.js → ada-CxNLBoe7.js} +0 -0
  192. /package/dist/web/assets/{andromeeda-Dcl8jpb7.js → andromeeda-BPN5rsDz.js} +0 -0
  193. /package/dist/web/assets/{apache-D0Nk0qsH.js → apache-C1F5wHL6.js} +0 -0
  194. /package/dist/web/assets/{apex-mQIoWncD.js → apex-BaNixdO-.js} +0 -0
  195. /package/dist/web/assets/{api-themes-BdQCjXQk.js → api-themes-84MT-XqR.js} +0 -0
  196. /package/dist/web/assets/{applescript-C6ljbcsI.js → applescript-Cl_pdcch.js} +0 -0
  197. /package/dist/web/assets/{ara-WFqRPGPe.js → ara-B6UAE7M2.js} +0 -0
  198. /package/dist/web/assets/{asciidoc-bNd8w4nf.js → asciidoc-D9c9Twki.js} +0 -0
  199. /package/dist/web/assets/{asm-BQ1_F580.js → asm-CNmtv7Y9.js} +0 -0
  200. /package/dist/web/assets/{aurora-x-Ciqs_Dbu.js → aurora-x-C9z-NyzR.js} +0 -0
  201. /package/dist/web/assets/{awk-GCR-6KZV.js → awk-BfLHEnKa.js} +0 -0
  202. /package/dist/web/assets/{ayu-dark-DxJXuj99.js → ayu-dark-Bn7trkt_.js} +0 -0
  203. /package/dist/web/assets/{ayu-light-jvSyJWDV.js → ayu-light-Dpya9hPf.js} +0 -0
  204. /package/dist/web/assets/{ayu-mirage-Cg3BPO6H.js → ayu-mirage-Cc0jfABD.js} +0 -0
  205. /package/dist/web/assets/{ballerina-BPz4CrX6.js → ballerina-BtiCmN7T.js} +0 -0
  206. /package/dist/web/assets/{bat-CSTs2hIG.js → bat-tmFM76zR.js} +0 -0
  207. /package/dist/web/assets/{beancount-DMateAZX.js → beancount-BjPqRrcH.js} +0 -0
  208. /package/dist/web/assets/{berry-9lXg0GRM.js → berry-D0SQBxN2.js} +0 -0
  209. /package/dist/web/assets/{bibtex-DIbqmvFg.js → bibtex-CkjRWQKr.js} +0 -0
  210. /package/dist/web/assets/{bicep-02WGsoJ8.js → bicep-Bhq28Cxc.js} +0 -0
  211. /package/dist/web/assets/{bird2-BY0tbu3k.js → bird2-DFGInYb3.js} +0 -0
  212. /package/dist/web/assets/{c-jMBX_9Je.js → c-CP8cB4k_.js} +0 -0
  213. /package/dist/web/assets/{c3-B8JVbNjW.js → c3-oRytyeWo.js} +0 -0
  214. /package/dist/web/assets/{cadence-DUIf1tvL.js → cadence-Inf1rGb7.js} +0 -0
  215. /package/dist/web/assets/{catppuccin-frappe-FhUCVxex.js → catppuccin-frappe-DAzribQo.js} +0 -0
  216. /package/dist/web/assets/{catppuccin-latte-CzfrtmgL.js → catppuccin-latte-B6Y_mCCQ.js} +0 -0
  217. /package/dist/web/assets/{catppuccin-macchiato-6xL0lOtj.js → catppuccin-macchiato-COLbYqVL.js} +0 -0
  218. /package/dist/web/assets/{catppuccin-mocha-D39-xS3P.js → catppuccin-mocha-DKWaML1B.js} +0 -0
  219. /package/dist/web/assets/{clarity-D8TeGvoT.js → clarity-_ZLLrrsX.js} +0 -0
  220. /package/dist/web/assets/{clojure-Dx_acSX7.js → clojure-DWGVCg_P.js} +0 -0
  221. /package/dist/web/assets/{cmake-CyeYPq8o.js → cmake-Cwh3mug7.js} +0 -0
  222. /package/dist/web/assets/{codeowners-DrTI0lmI.js → codeowners-BdV6CFYi.js} +0 -0
  223. /package/dist/web/assets/{codeql-CPkFxVW-.js → codeql-NvupDIDf.js} +0 -0
  224. /package/dist/web/assets/{common-lisp-B0k-3LTj.js → common-lisp-B-vtBh5k.js} +0 -0
  225. /package/dist/web/assets/{coq-uygpo7to.js → coq-M8-FTfiZ.js} +0 -0
  226. /package/dist/web/assets/{csharp-DKUYGfSp.js → csharp-B7Ugdtd-.js} +0 -0
  227. /package/dist/web/assets/{css-DoOUp7v4.js → css-86k3Z-YA.js} +0 -0
  228. /package/dist/web/assets/{csv-B3YE13gi.js → csv-BX5XYhfH.js} +0 -0
  229. /package/dist/web/assets/{csv-parser-CB6bK93y.js → csv-parser-d56Fzpwc.js} +0 -0
  230. /package/dist/web/assets/{cue-DViO2wvn.js → cue-B7099gQa.js} +0 -0
  231. /package/dist/web/assets/{cypher-4BMCIW5N.js → cypher-D99mWVIu.js} +0 -0
  232. /package/dist/web/assets/{d-BT_sTHas.js → d-CFE8oQwh.js} +0 -0
  233. /package/dist/web/assets/{dark-plus-DVVXu-1N.js → dark-plus-BEeeDwdg.js} +0 -0
  234. /package/dist/web/assets/{dart-DHz6f6_6.js → dart-HVSWGnI5.js} +0 -0
  235. /package/dist/web/assets/{dax-ChYCjweK.js → dax-DjDgSJkh.js} +0 -0
  236. /package/dist/web/assets/{desktop-D6Lt4p04.js → desktop-B5A3i7J1.js} +0 -0
  237. /package/dist/web/assets/{diff-D8TDe4hP.js → diff-CpTrlaE9.js} +0 -0
  238. /package/dist/web/assets/{dist-D1CjMuoa.js → dist-BSCgJs-V.js} +0 -0
  239. /package/dist/web/assets/{docker-Bsp0YbPx.js → docker-xBhmJeHj.js} +0 -0
  240. /package/dist/web/assets/{dotenv-B_7giSY_.js → dotenv-DKKhLEv5.js} +0 -0
  241. /package/dist/web/assets/{dracula-TrQL2iB5.js → dracula-CVwQuzra.js} +0 -0
  242. /package/dist/web/assets/{dracula-soft-n2XOlgh-.js → dracula-soft-CG6mB-lf.js} +0 -0
  243. /package/dist/web/assets/{dream-maker-CdIEdhpT.js → dream-maker-SC-IdYY3.js} +0 -0
  244. /package/dist/web/assets/{edit-diff-preview-Cj6-iplb.js → edit-diff-preview-C50i1H63.js} +0 -0
  245. /package/dist/web/assets/{emacs-lisp-CSbixs6u.js → emacs-lisp-CIBFq6W8.js} +0 -0
  246. /package/dist/web/assets/{everforest-dark-BuZahZYp.js → everforest-dark-odRT_lec.js} +0 -0
  247. /package/dist/web/assets/{everforest-light-DPH53z5H.js → everforest-light-or1Voqjl.js} +0 -0
  248. /package/dist/web/assets/{fennel-B1-K_hlJ.js → fennel-tQd1z3iu.js} +0 -0
  249. /package/dist/web/assets/{fish-Cy12Dbua.js → fish-DSuZQG0k.js} +0 -0
  250. /package/dist/web/assets/{fluent-B_82ys8E.js → fluent-D7xI8a8e.js} +0 -0
  251. /package/dist/web/assets/{fortran-free-form-BRQdNzZF.js → fortran-free-form-BlAtcPd3.js} +0 -0
  252. /package/dist/web/assets/{gdscript-XBDmLUm9.js → gdscript-VsEQXBPm.js} +0 -0
  253. /package/dist/web/assets/{gdshader-DhVfB3u4.js → gdshader-iqHMOdwW.js} +0 -0
  254. /package/dist/web/assets/{genie-X3K29Y49.js → genie-C4XU4g1a.js} +0 -0
  255. /package/dist/web/assets/{gherkin-DKIx-6cX.js → gherkin-C4nfQzAB.js} +0 -0
  256. /package/dist/web/assets/{github-dark-Bf7zdp5s.js → github-dark-B_pbG3CC.js} +0 -0
  257. /package/dist/web/assets/{github-dark-default-DqsBBV11.js → github-dark-default-kFbx7C95.js} +0 -0
  258. /package/dist/web/assets/{github-dark-dimmed-X2gqRz6w.js → github-dark-dimmed-CpVfQEqs.js} +0 -0
  259. /package/dist/web/assets/{github-dark-high-contrast-Z7tvbGX4.js → github-dark-high-contrast-DYKqQwZh.js} +0 -0
  260. /package/dist/web/assets/{github-light-default-B0liF4d4.js → github-light-default-DVHfMPQ2.js} +0 -0
  261. /package/dist/web/assets/{github-light-BKxt-7zZ.js → github-light-gEYBmKaj.js} +0 -0
  262. /package/dist/web/assets/{github-light-high-contrast-F4encJwr.js → github-light-high-contrast-ClVJDu-q.js} +0 -0
  263. /package/dist/web/assets/{gleam-Pz2bHgBB.js → gleam-BLaPu7ft.js} +0 -0
  264. /package/dist/web/assets/{gn-CgmdNsPU.js → gn-BKgerUyI.js} +0 -0
  265. /package/dist/web/assets/{gnuplot-qLNF5yZ9.js → gnuplot-cqJuEFb-.js} +0 -0
  266. /package/dist/web/assets/{go-CSDUNhE7.js → go-B2EHdyD8.js} +0 -0
  267. /package/dist/web/assets/{groovy-B3NEnOHF.js → groovy-DdImoj8s.js} +0 -0
  268. /package/dist/web/assets/{gruvbox-dark-hard-DcoftiUX.js → gruvbox-dark-hard-DlwstAds.js} +0 -0
  269. /package/dist/web/assets/{gruvbox-dark-medium-D1wVSuD8.js → gruvbox-dark-medium-CiYEd1vd.js} +0 -0
  270. /package/dist/web/assets/{gruvbox-dark-soft-DWpunymH.js → gruvbox-dark-soft-C-wEa4h4.js} +0 -0
  271. /package/dist/web/assets/{gruvbox-light-hard-rHMvyUdS.js → gruvbox-light-hard-BqYmfna-.js} +0 -0
  272. /package/dist/web/assets/{gruvbox-light-medium-3O2KiXO7.js → gruvbox-light-medium-CxmfalT2.js} +0 -0
  273. /package/dist/web/assets/{gruvbox-light-soft-lNlXJPwH.js → gruvbox-light-soft-DGWXXMCB.js} +0 -0
  274. /package/dist/web/assets/{haskell-aaG3aC0h.js → haskell-H_C_IuVb.js} +0 -0
  275. /package/dist/web/assets/{haxe-CPcHhUDd.js → haxe-CGNSMpeZ.js} +0 -0
  276. /package/dist/web/assets/{hcl-CMQNlR_4.js → hcl-B7bSTSQf.js} +0 -0
  277. /package/dist/web/assets/{hjson-DeuklPFj.js → hjson-DlJ-glQZ.js} +0 -0
  278. /package/dist/web/assets/{hlsl-BI3hlsaM.js → hlsl-CehW5SJN.js} +0 -0
  279. /package/dist/web/assets/{horizon-C7-gOcjs.js → horizon-Beabcz2d.js} +0 -0
  280. /package/dist/web/assets/{horizon-bright-Cxt9bRW7.js → horizon-bright-BC87RXPa.js} +0 -0
  281. /package/dist/web/assets/{houston-DbF2G7iD.js → houston-Da7RFwUy.js} +0 -0
  282. /package/dist/web/assets/{hy-DRG6Hs2I.js → hy-m1H70w19.js} +0 -0
  283. /package/dist/web/assets/{imba-CxKv_2TW.js → imba-MExFsdAA.js} +0 -0
  284. /package/dist/web/assets/{ini-BiHsyCdO.js → ini-CJy_zmwy.js} +0 -0
  285. /package/dist/web/assets/{java-D3RZzgDB.js → java-DqDFvJBH.js} +0 -0
  286. /package/dist/web/assets/{javascript-4FmSqG-T.js → javascript-C3Wyv22X.js} +0 -0
  287. /package/dist/web/assets/{json-CjB236_E.js → json-DnGBw_DZ.js} +0 -0
  288. /package/dist/web/assets/{json5-bkfO-Rco.js → json5-CRN-zoN4.js} +0 -0
  289. /package/dist/web/assets/{jsonc-BwaTeLyv.js → jsonc-CKRUZNRo.js} +0 -0
  290. /package/dist/web/assets/{jsonl-CfxNSwGd.js → jsonl-CGfD6FrH.js} +0 -0
  291. /package/dist/web/assets/{jsonnet-CQETCYrp.js → jsonnet-nbFuDj0o.js} +0 -0
  292. /package/dist/web/assets/{jssm-D5o3Zzdz.js → jssm-D0ShzIqD.js} +0 -0
  293. /package/dist/web/assets/{jsx-BAMILPLo.js → jsx-D27hbRbs.js} +0 -0
  294. /package/dist/web/assets/{kanagawa-dragon-BhGVxu3R.js → kanagawa-dragon-Ov3f8K0T.js} +0 -0
  295. /package/dist/web/assets/{kanagawa-lotus-FH4Y59ro.js → kanagawa-lotus-CLyOqh-g.js} +0 -0
  296. /package/dist/web/assets/{kanagawa-wave-eilvP9MB.js → kanagawa-wave-Kj3dzabH.js} +0 -0
  297. /package/dist/web/assets/{kdl-BQ-yvXUK.js → kdl-DFF58Gu4.js} +0 -0
  298. /package/dist/web/assets/{kotlin-BuCx0-VT.js → kotlin-BM4PKaB4.js} +0 -0
  299. /package/dist/web/assets/{kusto-DAN_n_Cy.js → kusto-DrvHLCv5.js} +0 -0
  300. /package/dist/web/assets/{laserwave-Cq2BlxrT.js → laserwave-Db6i6ZkO.js} +0 -0
  301. /package/dist/web/assets/{lean-Dhq7uXKw.js → lean-D0hEjzwk.js} +0 -0
  302. /package/dist/web/assets/{less-CxaMQb8j.js → less-BEj4npGG.js} +0 -0
  303. /package/dist/web/assets/{lib-MIEszzkI.js → lib-CBdlQ75W.js} +0 -0
  304. /package/dist/web/assets/{light-plus-B4sMAend.js → light-plus-DLIIbDea.js} +0 -0
  305. /package/dist/web/assets/{llvm-DQ6-B_6Y.js → llvm-DMt6umsO.js} +0 -0
  306. /package/dist/web/assets/{log-Bb_vqvu7.js → log-BopvdtPW.js} +0 -0
  307. /package/dist/web/assets/{logo-BzfYv3A_.js → logo-CYSUFPFR.js} +0 -0
  308. /package/dist/web/assets/{luau-BnAeNR77.js → luau-XC611HNO.js} +0 -0
  309. /package/dist/web/assets/{make-B6IFuxpC.js → make-BMYZIfBj.js} +0 -0
  310. /package/dist/web/assets/{markdown-Z0xi77Fn.js → markdown-BLza5nvF.js} +0 -0
  311. /package/dist/web/assets/{material-theme-1scy1SYn.js → material-theme-Uw27UfJW.js} +0 -0
  312. /package/dist/web/assets/{material-theme-darker-G-JykXQP.js → material-theme-darker-dfqt8XBY.js} +0 -0
  313. /package/dist/web/assets/{material-theme-lighter-BtKkCMVq.js → material-theme-lighter-CPtBTblV.js} +0 -0
  314. /package/dist/web/assets/{material-theme-ocean-irrDC89L.js → material-theme-ocean-BfZgVqC-.js} +0 -0
  315. /package/dist/web/assets/{material-theme-palenight-Eq5_K4LM.js → material-theme-palenight-DAZoVYg8.js} +0 -0
  316. /package/dist/web/assets/{matlab-BE3oCXZC.js → matlab-cSzmquiW.js} +0 -0
  317. /package/dist/web/assets/{mdx-DYiuFTGw.js → mdx-Dq0kW5VM.js} +0 -0
  318. /package/dist/web/assets/{mermaid-DVlaEvtw.js → mermaid-DoIKF0yS.js} +0 -0
  319. /package/dist/web/assets/{min-dark-DSkeTpQa.js → min-dark-DyraimDU.js} +0 -0
  320. /package/dist/web/assets/{min-light-CFv2Q0uF.js → min-light-Co9cbcUv.js} +0 -0
  321. /package/dist/web/assets/{mipsasm-CiAFuZQ2.js → mipsasm-ph6cKgHn.js} +0 -0
  322. /package/dist/web/assets/{mojo-ARshcaSQ.js → mojo-BBT0XwmY.js} +0 -0
  323. /package/dist/web/assets/{monokai-CPTV-SOg.js → monokai-IP0T5Rtg.js} +0 -0
  324. /package/dist/web/assets/{moonbit-D57B0dZr.js → moonbit-B8cogNXl.js} +0 -0
  325. /package/dist/web/assets/{move-qgy3G_o9.js → move-DkY26NtM.js} +0 -0
  326. /package/dist/web/assets/{narrat-CZ3rC-oc.js → narrat-rBs3byG0.js} +0 -0
  327. /package/dist/web/assets/{nextflow-groovy-BxxIOcI4.js → nextflow-groovy-DkO9wMLP.js} +0 -0
  328. /package/dist/web/assets/{night-owl-B1ryGCda.js → night-owl-jVR4lFji.js} +0 -0
  329. /package/dist/web/assets/{night-owl-light-BZvNnvMF.js → night-owl-light-fBYJ7s3U.js} +0 -0
  330. /package/dist/web/assets/{nix-BVBQi8yv.js → nix-WX9oavu6.js} +0 -0
  331. /package/dist/web/assets/{nord-3NXw613h.js → nord-Cf7G21Pu.js} +0 -0
  332. /package/dist/web/assets/{nushell-BMOLRalb.js → nushell-DQdzcJ1H.js} +0 -0
  333. /package/dist/web/assets/{objective-c-AxruEUgh.js → objective-c-JSO2uvZ-.js} +0 -0
  334. /package/dist/web/assets/{objective-cpp-cFT0qRsD.js → objective-cpp-CZMGJ9Fb.js} +0 -0
  335. /package/dist/web/assets/{ocaml-_8JH6O8J.js → ocaml-C4S4NSDo.js} +0 -0
  336. /package/dist/web/assets/{odin-nwYvR0O6.js → odin-Y2jXCgVq.js} +0 -0
  337. /package/dist/web/assets/{one-dark-pro-C1LaYJaH.js → one-dark-pro-dVIxuoJY.js} +0 -0
  338. /package/dist/web/assets/{one-light-B7rMc__c.js → one-light-BQ1IKfD1.js} +0 -0
  339. /package/dist/web/assets/{openscad-Cwes8bKO.js → openscad-Bddw4I3z.js} +0 -0
  340. /package/dist/web/assets/{pascal-DMt-6tdZ.js → pascal-BKVXrzC1.js} +0 -0
  341. /package/dist/web/assets/{pkl-QBTyYQmB.js → pkl-BTd-YRsO.js} +0 -0
  342. /package/dist/web/assets/{plastic-BTSUp8Fk.js → plastic-eiGvBIxV.js} +0 -0
  343. /package/dist/web/assets/{plsql-DQv3IFXP.js → plsql-C290tieP.js} +0 -0
  344. /package/dist/web/assets/{po-CNwZx4tW.js → po-DyDwh0tx.js} +0 -0
  345. /package/dist/web/assets/{poimandres-8Os7Qequ.js → poimandres-B87zc_g-.js} +0 -0
  346. /package/dist/web/assets/{polar-b4yK8oD8.js → polar-Cdub1YMT.js} +0 -0
  347. /package/dist/web/assets/{postcss-sFctwpxx.js → postcss-BcI_3K0v.js} +0 -0
  348. /package/dist/web/assets/{powerquery-Cg_WrtuN.js → powerquery-OdMrkJSe.js} +0 -0
  349. /package/dist/web/assets/{powershell-C7Ifz95h.js → powershell-C8auT6xg.js} +0 -0
  350. /package/dist/web/assets/{prisma-Z52HUJzQ.js → prisma-DIbVv8PA.js} +0 -0
  351. /package/dist/web/assets/{prolog-DLqW-zR1.js → prolog-DbTOH3Ld.js} +0 -0
  352. /package/dist/web/assets/{proto-BOIzxCCJ.js → proto-C4Cq2dCD.js} +0 -0
  353. /package/dist/web/assets/{puppet-De7TjZIf.js → puppet-DJp3uqum.js} +0 -0
  354. /package/dist/web/assets/{purescript-R76ou1WT.js → purescript-CLsV4rPU.js} +0 -0
  355. /package/dist/web/assets/{python-Dprm0tNP.js → python-2gBtEza2.js} +0 -0
  356. /package/dist/web/assets/{qmldir-Clp_jpNw.js → qmldir-DfhULcua.js} +0 -0
  357. /package/dist/web/assets/{qss-eQPYYzSo.js → qss-DK--VTTV.js} +0 -0
  358. /package/dist/web/assets/{r-CCcRHIf5.js → r-BArBO2Sa.js} +0 -0
  359. /package/dist/web/assets/{racket-CzE472yp.js → racket-5mijHsVy.js} +0 -0
  360. /package/dist/web/assets/{raku-DQwXrTSi.js → raku-ir0suElk.js} +0 -0
  361. /package/dist/web/assets/{red-KCS6wyop.js → red-DSecpIOT.js} +0 -0
  362. /package/dist/web/assets/{reg-CcrAddUh.js → reg-Dp30FusS.js} +0 -0
  363. /package/dist/web/assets/{regexp-DDbud-Ri.js → regexp-DXJnEM_6.js} +0 -0
  364. /package/dist/web/assets/{rel-99GDgaHp.js → rel-Dr483ozj.js} +0 -0
  365. /package/dist/web/assets/{riscv-Dm2eNv0R.js → riscv-ZfBy5IA1.js} +0 -0
  366. /package/dist/web/assets/{ron-CzFt0ygH.js → ron-ZJ_CljGP.js} +0 -0
  367. /package/dist/web/assets/{rose-pine-Ck6lCrCP.js → rose-pine-CcW_eJ6G.js} +0 -0
  368. /package/dist/web/assets/{rose-pine-dawn-vtALRJNj.js → rose-pine-dawn-v2l_UF-j.js} +0 -0
  369. /package/dist/web/assets/{rose-pine-moon-DPto8qXw.js → rose-pine-moon-CNXkwf3D.js} +0 -0
  370. /package/dist/web/assets/{rosmsg-NtS6429H.js → rosmsg-BMYMVW84.js} +0 -0
  371. /package/dist/web/assets/{rust-BjIXvF9h.js → rust-BR-zJh5q.js} +0 -0
  372. /package/dist/web/assets/{sass-CQ23wf5E.js → sass-BukPOBFz.js} +0 -0
  373. /package/dist/web/assets/{scala-LfKLM143.js → scala-DUFY7D6D.js} +0 -0
  374. /package/dist/web/assets/{scheme-D3SLBXlF.js → scheme-Dl-dNNxQ.js} +0 -0
  375. /package/dist/web/assets/{sdbl-ODRd2rGN.js → sdbl-DdmlQhia.js} +0 -0
  376. /package/dist/web/assets/{shellscript-3KB1G_oA.js → shellscript-UyhrvGcd.js} +0 -0
  377. /package/dist/web/assets/{slack-dark-DTtyWmIy.js → slack-dark-Cv6Szr-q.js} +0 -0
  378. /package/dist/web/assets/{slack-ochin-Bu0PApk3.js → slack-ochin-V6Ii3lAm.js} +0 -0
  379. /package/dist/web/assets/{smalltalk-haMT-Sbe.js → smalltalk-BUCv5G91.js} +0 -0
  380. /package/dist/web/assets/{snazzy-light-DXJzefE9.js → snazzy-light-B67a78qi.js} +0 -0
  381. /package/dist/web/assets/{solarized-dark-B6LyYa18.js → solarized-dark-ccWnfYyA.js} +0 -0
  382. /package/dist/web/assets/{solarized-light-QLADebkv.js → solarized-light-C3WyRO5I.js} +0 -0
  383. /package/dist/web/assets/{solidity-mzfq1aDc.js → solidity-BFbRPNi_.js} +0 -0
  384. /package/dist/web/assets/{splunk-CyH4RWBp.js → splunk-zdpwCJLE.js} +0 -0
  385. /package/dist/web/assets/{sql-CWVlT5D3.js → sql-B2IPUsfz.js} +0 -0
  386. /package/dist/web/assets/{ssh-config-DNvQJ1Qx.js → ssh-config-Co4cXifq.js} +0 -0
  387. /package/dist/web/assets/{stylus-ByQQdtmf.js → stylus-CmI75XY8.js} +0 -0
  388. /package/dist/web/assets/{swift-D1cpY4ow.js → swift-Dfks9YQI.js} +0 -0
  389. /package/dist/web/assets/{synthwave-84-BDF_-QiW.js → synthwave-84-B3LERzNS.js} +0 -0
  390. /package/dist/web/assets/{system-verilog-BYrkMydC.js → system-verilog-BFvldiwl.js} +0 -0
  391. /package/dist/web/assets/{systemd-CQm3zyK0.js → systemd-Cu4Vvgbu.js} +0 -0
  392. /package/dist/web/assets/{talonscript-DMW5CzE1.js → talonscript-Bnq32pUB.js} +0 -0
  393. /package/dist/web/assets/{tasl-BhFzMCr2.js → tasl-Nwe2K3J1.js} +0 -0
  394. /package/dist/web/assets/{tcl-D7VEAF-9.js → tcl-zOnpywrl.js} +0 -0
  395. /package/dist/web/assets/{terraform-DdT5A0Vy.js → terraform-Bc9Vj-n3.js} +0 -0
  396. /package/dist/web/assets/{tokyo-night-WGLMM6Q9.js → tokyo-night-9_KyM8M2.js} +0 -0
  397. /package/dist/web/assets/{toml-CZ7ipXHZ.js → toml-ByH-fxOY.js} +0 -0
  398. /package/dist/web/assets/{tsv-B1zVvoTr.js → tsv-DrCnDClP.js} +0 -0
  399. /package/dist/web/assets/{tsx-D4HwRUBq.js → tsx-B8LafSYr.js} +0 -0
  400. /package/dist/web/assets/{turtle-B4r8KEJH.js → turtle-DuyP_QCJ.js} +0 -0
  401. /package/dist/web/assets/{typescript-BnHhxMtp.js → typescript-BTBJb5RD.js} +0 -0
  402. /package/dist/web/assets/{typespec-DP2q46GT.js → typespec-DdOFo7M5.js} +0 -0
  403. /package/dist/web/assets/{typst-DFsD_yaD.js → typst-LYvnBWQu.js} +0 -0
  404. /package/dist/web/assets/{use-blob-url-DpDVcTeK.js → use-blob-url-CpyRr7Cx.js} +0 -0
  405. /package/dist/web/assets/{v-Bji8hSVT.js → v-BuBYA1_x.js} +0 -0
  406. /package/dist/web/assets/{vala-D3TIgGmU.js → vala-vRIBYYe3.js} +0 -0
  407. /package/dist/web/assets/{vb-DvcxFS2q.js → vb-DwGi-IYM.js} +0 -0
  408. /package/dist/web/assets/{vendor-xterm-DfNMj6xt.js → vendor-xterm-i6SHFTfU.js} +0 -0
  409. /package/dist/web/assets/{verilog-Dy7cF35d.js → verilog-6B1X4G2-.js} +0 -0
  410. /package/dist/web/assets/{vesper-BzjwUv9J.js → vesper-Dw1y_Ae7.js} +0 -0
  411. /package/dist/web/assets/{vhdl-DuFnFNmW.js → vhdl-DK8JwBzJ.js} +0 -0
  412. /package/dist/web/assets/{viml-yAPgKlbz.js → viml-BTKIEIqm.js} +0 -0
  413. /package/dist/web/assets/{vitesse-black-oSSQdyIZ.js → vitesse-black-BqqolhEg.js} +0 -0
  414. /package/dist/web/assets/{vitesse-dark-BZxwPihB.js → vitesse-dark-B9JL5WQA.js} +0 -0
  415. /package/dist/web/assets/{vitesse-light-uIigycvt.js → vitesse-light-DYJKj2se.js} +0 -0
  416. /package/dist/web/assets/{vyper-CX3NAxm5.js → vyper-D-jDI3WH.js} +0 -0
  417. /package/dist/web/assets/{wasm-Coen1MOg.js → wasm-1-GlNdpk.js} +0 -0
  418. /package/dist/web/assets/{wasm-D9td37qO.js → wasm-BBW4WmT2.js} +0 -0
  419. /package/dist/web/assets/{wenyan-lwNIHgk6.js → wenyan-B6cM7sDO.js} +0 -0
  420. /package/dist/web/assets/{wgsl-DQAzCfog.js → wgsl-FaHGQgko.js} +0 -0
  421. /package/dist/web/assets/{wikitext-DTXmt5NE.js → wikitext-DtIyPUrk.js} +0 -0
  422. /package/dist/web/assets/{wit-Bdw_7WDH.js → wit-BMVRif5Y.js} +0 -0
  423. /package/dist/web/assets/{wolfram-DqyHDZ07.js → wolfram-DQsCGohn.js} +0 -0
  424. /package/dist/web/assets/{yaml-CPXhdByd.js → yaml-C-Va56Gt.js} +0 -0
  425. /package/dist/web/assets/{zenscript-6s_i5zek.js → zenscript-DdobKGI-.js} +0 -0
  426. /package/dist/web/assets/{zig-B2htezJ_.js → zig-vqDFwj6q.js} +0 -0
@@ -1,574 +0,0 @@
1
- # PPM Project Changelog
2
-
3
- All notable changes to PPM are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/).
4
-
5
- **Current Version:** v0.9.86
6
-
7
- ---
8
-
9
- ## [Unreleased] — Frontend Memory Optimization + Git-Graph Stash Management, Rebase, Conflict Resolution + Worktree CRUD
10
-
11
- ### Added
12
- - **Frontend Memory & Performance Optimizations** — Reduce re-renders, lazy-load heavy components, code splitting
13
- - **useShallow pattern:** All destructured Zustand store calls now use `useShallow` (36 usage sites) to prevent re-renders on object mutations
14
- - **React.memo wrapping:** 10 heavy components memoized (CodeEditor, MessageBubble, ProjectBar, ProjectAvatar, TerminalTab, PanelLayout, Sidebar, StatusBar, StatusBarEntry, TabBar, TreeNode)
15
- - **Lazy loading:** MarkdownRenderer lazy-loaded from 3 sites, CodeMirror on-demand in postgres-viewer
16
- - **Dynamic import:** Mermaid loaded on-demand in markdown-code-block (only when needed)
17
- - **Code splitting:** 5 vendor chunks in vite.config.ts (monaco, mermaid, xterm, markdown, ui libraries) for better caching
18
- - **Chat pagination:** Message history limited to 50 per page with load-more button
19
- - **Message cap:** Team activity capped at 500 messages to prevent unbounded growth
20
-
21
- ### Added (Git-Graph)
22
- - **Git Stash Management** — Toolbar popover for interactive stash operations
23
- - List all stashes with index, hash (abbreviated), and message
24
- - Apply/Pop/Drop actions per stash via context menu or action buttons
25
- - "Stash Changes" button in main toolbar to stash uncommitted work
26
- - Stash list persisted in RepoInfo and refreshed on uncommitted status updates
27
- - Keyboard shortcuts for quick access to stash operations
28
-
29
- - **Interactive Rebase** — Branch context menu + commit history actions
30
- - "Rebase current branch onto..." option in commit context menu
31
- - Confirmation dialog shows branch selection and target commit
32
- - Rebase state detection and progress tracking (e.g., "3/5" for interactive rebase)
33
- - Continue/Skip/Abort controls in merge state banner during rebase
34
-
35
- - **Merge/Rebase/Cherry-Pick Conflict Detection** — Visual conflict indicators
36
- - Detects merge state from .git sentinel files (MERGE_HEAD, REBASE_MERGE, CHERRY_PICK_HEAD)
37
- - Parses git status UU/AA/DD/AU/UA/DU/UD codes for unmerged entries
38
- - Conflicted files displayed in "Conflicts" section in uncommitted status
39
- - Conflict state banner shows merge state type + progress + action buttons (Continue/Skip/Abort)
40
- - Auto-detects merge state only when conflicts exist (performance optimization)
41
-
42
- - **Inline Conflict Resolution Editor** — New conflict-editor tab type with Monaco
43
- - Dedicated `conflict-editor` tab type for visual conflict resolution
44
- - Monaco-based editor with syntax highlighting per file type (JS/TS/Python/etc.)
45
- - Conflict regions visually highlighted: green for current, blue for incoming, gray for markers
46
- - Accept buttons: Accept Current / Accept Incoming / Accept Both (with proper merging)
47
- - Conflict counter in header: "N conflicts remaining" → "All conflicts resolved" on completion
48
- - Automatic file save after each resolution; conflict count updates in real-time
49
- - Parses 3-way conflict markers (<<<<<<, =======, >>>>>>>) and extracts labels (HEAD/branch names)
50
-
51
- - **Worktree Management** — Full CRUD with project integration
52
- - Worktree toolbar popover listing all worktrees (with path, branch, HEAD status)
53
- - Create worktree from commit context menu ("Create Worktree Here...")
54
- - Remove, prune, and auto-lock operations per worktree
55
- - Current worktree highlighted with badge and active background
56
- - Auto-add unregistered worktrees as projects via confirmation dialog
57
- - Branch-already-exists dialog offers force-replace option for branch conflicts
58
- - Project switcher integration: switch to worktree branches directly
59
-
60
- - **Bundled Extensions Support** — Auto-discover extensions from packages/ext-* directories
61
- - PPM discovers bundled extensions (e.g., ext-git-graph) without manual installation
62
- - Bundled extensions available out-of-the-box with all PPM instances
63
- - `ppm ext list` shows "Source" column (bundled/user) for transparency
64
- - Bundled extension removal protection: prevents accidental deletion, suggests `ppm ext disable` instead
65
- - User-installed extensions override bundled with same ID (user takes precedence)
66
- - Extension paths tracked separately for bundled vs node_modules locations
67
-
68
- - **Git-Graph UI Improvements** — 7 UX refinements + comprehensive git workflow
69
- - Branch context menu: right-click for checkout/merge/rebase/delete/create operations
70
- - Double-click checkout: branch labels double-click to switch branches instantly
71
- - Toast notifications: replaced blocked alert() with inline webview toast elements
72
- - SVG icons: replaced Unicode symbols (↻⬇🔍⚙🌲📁) with inline Lucide SVG icons
73
- - Auto-fetch enhancement: added 10-second interval option to dropdown
74
- - Uncommitted polling: 5-second status refresh to detect working tree changes
75
- - Interactive UI elements: resizable graph column, branch filter dropdown, tree/list view toggle
76
- - Git actions: stage/unstage files, commit from webview, stash/reset/clean operations
77
- - Path traversal validation for security (assertSafePath in RPC handlers)
78
- - Fallback guards for all tab type handling (unknown tab types safely ignored)
79
-
80
- - **Extension Error Reporting & Logging** — Silent failure debugging & user feedback
81
- - Activation error tracking: Map stores `extId → error message` in ExtensionService
82
- - Error toasts on command failure: "Extension command failed: {error}" displays in UI
83
- - Timeout UX improved: Fallback UI shows activation error + "Retry" button for quick recovery
84
- - Breadcrumb logging with tags for debugging: `[ExtService]`, `[ExtHost]`, `[ExtWS]`, `[ext-git-graph]`
85
- - Console logs track: activation start/success, command routing, failures with context
86
- - Activation errors included in `contributions:update` message sent to browser on WS connect
87
-
88
- - **Faithful SVG Graph Rendering** — Port of vscode-git-graph algorithm with deterministic layout
89
- - Single SVG model with continuous branch paths using Bézier curves
90
- - Deterministic lane assignment algorithm with greedy color reuse
91
- - Proper HEAD/stash node rendering (hollow circle for HEAD, nested circles for stash)
92
- - Shadow lines for visual depth and branch continuity
93
- - Mobile SVG alignment: gridY matches 44px CSS row height
94
- - XSS security fix: escHtml applied to parent hashes and file status in detail panel
95
- - Regex ordering fix in formatCommitMessage for proper URL/mention detection
96
- - Removed dot alignment bug that forced rows to 29px
97
-
98
- ### Technical Details
99
-
100
- **Stash/Rebase/Conflict/Worktree Implementation:**
101
- - **Files Created:**
102
- - `src/web/components/editor/conflict-editor.tsx` — Monaco-based conflict resolution editor with visual highlighting, accept buttons, real-time conflict counter, auto-save on resolution
103
-
104
- - **Files Modified:**
105
- - `packages/ext-git-graph/src/extension.ts` — Added stash parsing, merge state detection (merge/rebase/cherry-pick), conflict file opening, worktree CRUD operations, branch context menu rebase action
106
- - `packages/ext-git-graph/src/types.ts` — Added Stash interface, MergeState interface (type, progress, message), FileChange status "U" for unmerged, Worktree interface, updated UncommittedData with conflicted field
107
- - `packages/ext-git-graph/src/webview-html.ts` — Added stash popover UI, rebase context menu item, conflict section in uncommitted panel, merge state banner with Continue/Skip/Abort, worktree popover with CRUD UI
108
- - `src/web/stores/tab-store.ts` — Added "conflict-editor" as valid TabType
109
- - `src/web/stores/panel-utils.ts` — Added conflict-editor case to deriveTabId() for metadata-driven tab ID generation
110
- - `src/web/components/layout/editor-panel.tsx` — Lazy-imported ConflictEditor component with fallback
111
- - `src/web/components/layout/tab-content.tsx` — Lazy-imported ConflictEditor component with fallback
112
- - `src/web/components/layout/mobile-nav.tsx` — Added conflict-editor icon (conflict/warning icon)
113
- - `src/web/components/layout/tab-bar.tsx` — Added conflict-editor icon (conflict/warning icon)
114
-
115
- - **Services Modified:**
116
- - `src/services/extension-manifest.ts` — Added discoverBundledManifests() to scan packages/ext-* dirs
117
- - `src/services/extension.service.ts` — Added extensionPaths Map, bundledIds Set, isBundled() method; updated discover()/activate()/remove() to handle bundled extensions
118
- - `src/cli/commands/ext-cmd.ts` — Added "Source" column to `ppm ext list`, calls discover() to populate bundled info
119
- - `src/services/extension-rpc-handlers.ts` — Allow git operations in all registered project paths (not just CWD), improved path validation
120
- - `src/services/extension-host-worker.ts` — Enhanced error logging, localHandlers check, disposed flag fix for polling race conditions
121
-
122
- - **Type Changes:**
123
- - New: `Stash` = { index, hash, message }
124
- - New: `MergeState` = { type: "merge" | "rebase" | "cherry-pick", progress?, message? }
125
- - New: `Worktree` = { path, branch, head, isMain, isDetached, locked, lockReason?, prunable }
126
- - Updated: `FileChange.status` now includes "U" for unmerged/conflicted entries (was "A" | "M" | "D" | "R" | "C")
127
- - Updated: `UncommittedData` now includes `conflicted: FileChange[]` and optional `mergeState: MergeState`
128
- - Updated: `RepoInfo` now includes `stashes: Stash[]` and `currentBranch: string`
129
- - Updated: `TabType` now includes "conflict-editor"
130
-
131
- - **Git State Detection:**
132
- - Merge state determined by .git sentinel files: MERGE_HEAD (merge), rebase-merge/ (interactive rebase), CHERRY_PICK_HEAD (cherry-pick)
133
- - Progress tracked: "3/5" format from rebase-merge/msgnum and rebase-merge/end
134
- - Conflict detection: UU/AA/DD/AU/UA/DU/UD git status codes parsed as unmerged entries
135
- - Only detects merge state when conflicts exist (perf optimization)
136
-
137
- - **Conflict Resolution Flow:**
138
- - User clicks conflicted file → opens conflict-editor tab
139
- - Component parses conflict markers (<<<<<<, =======, >>>>>>>) from file content
140
- - Displays visual highlighting + Accept buttons above each conflict region
141
- - Resolution applies edit via Monaco, saves file automatically, updates conflict counter
142
- - Conflict count reflects real-time resolution progress
143
-
144
- - **Security:** Path validation ensures extensions can only operate on registered project paths
145
- - **Breaking Changes:** None (backward compatible)
146
- - **Test Coverage:** All changes maintain test suite passing
147
-
148
- ---
149
-
150
- ## [0.9.72] — 2026-04-09
151
-
152
- ### Added
153
- - **Account Selection Pre-flight Loop** — Intelligent account fallback during token refresh
154
- - AccountSelector.next() now accepts excludeIds Set to skip previously failed accounts
155
- - Pre-flight token refresh loop tries all accounts before final failure (was linear before)
156
- - New AccountSelector.onPreflightFail() method handles preflight failure with 1-5min backoff
157
- - Status updates streamed to UI as blockquotes during routing/refreshing/switching phases
158
- - Cumulative penalty: preflight failures counted with rate-limit and auth-error retries
159
-
160
- ### Technical Details
161
- - **Files Modified:**
162
- - `src/providers/claude-agent-sdk.ts` — Pre-flight loop with excludeIds exclusion set
163
- - `src/services/account-selector.service.ts` — excludeIds parameter, onPreflightFail() method
164
- - `src/types/chat.ts` — New status_update ChatEvent type
165
- - `src/web/components/chat/message-list.tsx` — Render status_update as blockquote
166
- - **Type Changes:** status_update event = { type: "status_update", phase: "routing" | "refreshing" | "switching", message, accountLabel? }
167
- - **Breaking Changes:** None (backward compatible)
168
-
169
- ---
170
-
171
- ## [0.9.11] — 2026-04-07
172
-
173
- ### Added
174
- - **PPMBot Coordinator Redesign** — Transform from direct AI chat executor to intelligent team leader delegating to subagents
175
- - Single persistent coordinator session per Telegram chat in `~/.ppm/bot/` workspace
176
- - Decision framework: Answer directly if no project context needed; delegate for file access, project-specific tasks
177
- - Delegation via bash: `ppm bot delegate --chat <id> --project <name> --prompt "<enriched>"` creates task
178
- - Background task poller (5s interval) executes pending tasks in isolation
179
- - Each task execution: Creates fresh PPM session in target project, runs async generator, captures result summary
180
- - Abort/timeout handling: AbortController-based task cancellation, 900s default timeout
181
- - UI: Settings panel displays delegated tasks with auto-refresh
182
- - CLI expansion: `ppm bot` commands for delegation, project management, session control, status queries
183
- - Telegram commands reduced: 3 public (/start, /help, /status) + 1 hidden (/restart)
184
- - Coordinator identity: `~/.ppm/bot/coordinator.md` replaces per-session identity, loaded via XML context block
185
- - Cross-provider support: Coordinator identity works with any provider (Claude SDK, Cursor, etc.)
186
-
187
- ### Technical Details
188
- - **Database Migration (v14):**
189
- - `bot_tasks` — taskId, chatId, projectName, projectPath, prompt, status, resultSummary, resultFull, error, timeoutMs, createdAt, startedAt, completedAt
190
- - Indexes: `idx_bot_tasks_status`, `idx_bot_tasks_chat` for fast polling + history queries
191
- - **Files Created:**
192
- - `src/services/ppmbot/ppmbot-delegation.ts` — executeDelegation() function with task lifecycle management
193
- - **Files Modified:**
194
- - `src/services/ppmbot/ppmbot-service.ts` — Task poller loop, lifecycle management (start/stop)
195
- - `src/services/ppmbot/ppmbot-session.ts` — PPMBotSessionManager with coordinator session cache
196
- - `src/services/db.service.ts` — Schema v14 migration, bot_tasks CRUD functions
197
- - `src/cli/commands/bot-cmd.ts` — Expanded with delegation, project, session, status, help commands
198
- - `src/server/routes/settings.ts` — Bot tasks endpoints for UI refresh
199
- - `src/web/components/settings/ppmbot-settings-section.tsx` — Delegated tasks panel with auto-refresh
200
- - **Type Changes:**
201
- - New: `BotTask`, `BotTaskStatus` ("pending" | "running" | "completed" | "failed" | "timeout")
202
- - New: `PPMBotCommand` with chatId, messageId, userId
203
- - **API Changes:** New endpoints for bot task management
204
- - **Breaking Changes:** None (coordinator coexists with legacy ClawBot; migration transparent)
205
-
206
- ### Key Design Principles
207
- - **Coordinator per chat** — Single session manages delegation, not direct chat
208
- - **Project isolation** — Each delegated task spawns fresh isolated session
209
- - **CLI-driven delegation** — Coordinator calls bash `ppm bot` commands (bash-safe tools only)
210
- - **Background execution** — Task polling decoupled from message handler
211
- - **Result capture** — Store both summary (notification) and full output (detailed review)
212
-
213
- ---
214
-
215
- ## [0.9.10] — 2026-04-06
216
-
217
- ### Added
218
- - **Supervisor Always Alive Feature** — Distinguish between soft stop (server shutdown) and full shutdown (supervisor shutdown)
219
- - `ppm stop` now performs SOFT STOP: kills server only, supervisor remains alive with Cloud WS + tunnel connectivity
220
- - `ppm stop --kill` or `ppm down` performs FULL SHUTDOWN: kills everything (old `ppm stop` behavior)
221
- - Supervisor now has new `stopped` state (in addition to running, paused, upgrading)
222
- - When stopped, minimal HTML page served on the port (503 status on /api/health)
223
- - `ppm start` detects existing supervisor and handles resume/upgrade scenarios
224
- - Autostart now uses `__supervise__` instead of `__serve__` for consistency
225
- - Cloud WS has new commands: `start`, `shutdown` (stop is now soft stop, separate from shutdown)
226
- - Supervisor has uncaughtException/unhandledRejection handlers (never crashes)
227
- - Supervisor logic modularized into 3 files: supervisor.ts (orchestrator), supervisor-state.ts (state machine), supervisor-stopped-page.ts (503 page)
228
-
229
- ### Technical Details
230
- - **Files Created:**
231
- - `src/services/supervisor-state.ts` — State machine, IPC command file handling
232
- - `src/services/supervisor-stopped-page.ts` — Minimal 503 HTML response
233
- - Enhanced `src/services/supervisor.ts` — Orchestrator with stopped state support
234
- - **Files Modified:**
235
- - `src/cli/commands/stop.ts` — Added --kill flag, soft stop default, ppm down alias
236
- - `src/cli/commands/start.ts` — Resume detection for existing supervisor
237
- - `src/cli/autostart-generator.ts` — Uses __supervise__ entry point
238
- - Cloud WS endpoints updated with new commands
239
- - **Type Changes:** SupervisorState = "running" | "paused" | "stopped" | "upgrading"
240
- - **API Changes:** GET /api/health returns 503 when server stopped (supervisor still running)
241
- - **Breaking Changes:** None (backward compatible, graceful fallback)
242
-
243
- ---
244
-
245
- ## [0.9.10] — 2026-04-06
246
-
247
- ### Added
248
- - **ClawBot Telegram Integration** — Telegram bot service layer for AI-powered messaging
249
- - Telegram long-polling: receive messages via polling (no webhooks needed for self-hosted)
250
- - Session routing: chatID → PPM session mapping with per-user thread isolation
251
- - Memory system: SQLite FTS5 for persistent conversation history + recall with decay/supersede
252
- - Response streaming: ChatEvent → progressive Telegram message editing (1s throttle)
253
- - Message formatting: Markdown → Telegram HTML with 4096-character chunking
254
- - Pairing system: Code-based device pairing for security (owner approves in web UI)
255
- - Message queue: Handle concurrent Telegram messages without race conditions
256
- - Settings UI: Enable/disable, paired devices, default project, system prompt, display toggles, debounce config
257
- - Chat history: [Claw] prefix sessions with robot icon for easy identification
258
- - Cross-project memory: Auto-detect project name mentions → include that project's memories in context
259
-
260
- ### Technical Details
261
- - **Database Migration (v13):**
262
- - `clawbot_sessions` — chatID, sessionID, pairedAt, lastUsed
263
- - `clawbot_memories` — sessionID, content, role, created, decay_factor (FTS5)
264
- - `clawbot_paired_chats` — chatID, pairingCode, approvedAt, approvedBy
265
- - **Files Created:**
266
- - `src/services/clawbot/clawbot.service.ts` — Main orchestrator
267
- - `src/services/clawbot/clawbot-telegram.ts` — Telegram API polling
268
- - `src/services/clawbot/clawbot-session.ts` — Session mapping
269
- - `src/services/clawbot/clawbot-memory.ts` — FTS5 memory CRUD + hybrid extraction (AI + regex)
270
- - `src/services/clawbot/clawbot-formatter.ts` — Markdown → Telegram HTML
271
- - `src/services/clawbot/clawbot-streamer.ts` — ChatEvent → progressive message edits
272
- - `src/types/clawbot.ts` — Type definitions
273
- - `src/web/components/settings/clawbot-settings-section.tsx` — Settings UI
274
- - **Files Modified:**
275
- - `src/services/db.service.ts` — Schema v13 migration
276
- - `src/types/config.ts` — ClawBotConfig interface
277
- - `src/server/index.ts` — ClawBot poller startup
278
- - `src/server/routes/settings.ts` — ClawBot settings endpoints (GET/PUT)
279
- - `src/web/components/settings/settings-tab.tsx` — ClawBot category
280
- - `src/web/components/chat/chat-history-bar.tsx` — [Claw] prefix + icon tagging
281
-
282
- ### Key Design Principles
283
- - **Long-polling over webhooks** — Simpler self-hosted setup, no public URL required
284
- - **bypassPermissions by default** — Headless bot, no manual tool approvals needed
285
- - **Hybrid memory extraction** — AI extraction (primary) + regex fallback (fallback)
286
- - **Progressive message editing** — 1s throttle balances UX with Telegram rate limits
287
- - **Message debouncing** — 2s default, configurable per session
288
- - **Pairing-based security** — Replace allowlists with owner-approved pairing codes
289
-
290
- ---
291
-
292
- ## [0.9.9] — 2026-04-04
293
-
294
- ### Added
295
- - **Agent Teams (experimental)** — Toggle in Settings > AI to enable multi-agent collaboration
296
- - Passes `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1` to SDK subprocess when enabled
297
- - Adds `TeamCreate`, `TeamDelete`, `SendMessage`, `TaskCreate`, `TaskUpdate`, `TaskList`, `TaskGet` to allowed tools
298
- - Switch UI with warning about experimental status and ~7x token cost
299
- - Default: off. Requires Claude Code v2.1.32+
300
- - **Agent Team UI — Real-time Monitoring** — Visual collaboration dashboard for active teams
301
- - Backend: REST endpoints (`GET /api/teams`, `GET /api/teams/:name`, `DELETE /api/teams/:name`) + fs.watch inbox monitor via chat WebSocket
302
- - Real-time inbox events: `team_detected`, `team_inbox`, `team_updated` streamed to chat clients
303
- - Frontend: Team activity button on chat input (Users icon with unread pulse dot)
304
- - Desktop popover / Mobile drawer showing members (with status badges) + message timeline
305
- - Settings UI: Team list in AI Settings with delete confirmation (only for inactive teams)
306
- - Architecture: Type-safe types (`src/types/team.ts`), extracted team-inbox-watcher module, zero new type errors
307
- - Mobile-first: Responsive popover/drawer, touch-friendly delete actions
308
-
309
- ---
310
-
311
- ## [0.9.2] — 2026-04-04
312
-
313
- ### Added
314
- - **File Download Feature** — Single-file and folder-as-zip downloads with short-lived tokens
315
- - Download tokens: one-time, 30s TTL, non-reusable
316
- - Backend: POST `/files/download/token` for token generation, GET `/files/raw?download=true&dl_token=X` for file downloads, GET `/files/download/zip?path=X` for folder zips
317
- - Frontend: Download context menu in file tree, download button in editor toolbar
318
- - Security: Tokens scoped to download paths only, path traversal protection maintained
319
- - Performance: Streaming via Bun.file() and archiver, no RAM buffering for large files
320
- - Testing: 30 integration tests covering auth, streaming, path traversal, zip integrity
321
-
322
- ### Technical Details
323
- - **Files Created:**
324
- - `src/services/download-token.service.ts` — In-memory token store with TTL cleanup
325
- - `src/server/routes/file-download.ts` — Download endpoints (token + zip)
326
- - `src/web/lib/file-download.ts` — Download utilities (single file + folder)
327
- - `tests/integration/file-download.test.ts` — Integration tests
328
- - **Files Modified:**
329
- - `src/server/middleware/auth.ts` — Added dl_token fallback for downloads
330
- - `src/server/routes/files.ts` — Added ?download=true mode
331
- - `src/server/routes/project-scoped.ts` — Registered download routes
332
- - `src/web/components/explorer/file-tree.tsx` — Added download context menu item
333
- - `src/web/components/editor/editor-toolbar.tsx` — Added download button
334
- - `src/web/components/editor/code-editor.tsx` — Passed filePath/projectName to toolbar
335
- - `src/server/helpers/error-status.ts` — Extracted shared error helper
336
- - **Dependencies:**
337
- - `archiver` — Streaming zip library (well-maintained, ~500KB)
338
-
339
- ---
340
-
341
- ## [0.9.0] — 2026-04-03
342
-
343
- ### Added
344
- - **Extension System (Phase 1-6)** — VSCode-compatible npm extensions with Bun Worker isolation, RPC protocol, @ppm/vscode-compat API shim, UI components (TreeView, WebviewPanel, StatusBar, QuickPick, InputBox), WS bridge, ext-database demo extension, Extension Manager UI, CLI support
345
- - **Multi-Provider AI** — ProviderInterface, CliProvider base, CursorCliProvider with NDJSON streaming, provider selector UI
346
- - **MCP Server Management** — REST API CRUD, SQLite storage, Settings UI, auto-import from ~/.claude.json, SDK integration
347
- - **ext-database extension** — Connection tree with color dots/badges/actions, table viewer webview with data grid/inline editing/pagination/SQL panel, add connection via QuickPick+InputBox flow
348
-
349
- ### Technical Details
350
- - Extension architecture: npm packages isolated in Bun Workers, communicate via RPC, manifest-driven contribution points (commands, views, menus, configuration)
351
- - Multi-provider: Tier 1 (Claude Agent SDK, full agentic), Tier 2 (Cursor CLI, agentic via own tool system)
352
- - MCP: Servers passed to SDK as `mcpServers`, tools auto-allowed via `mcp__*` wildcard
353
-
354
- ---
355
-
356
- ## [0.8.77] — 2026-04-01
357
-
358
- ### Added
359
- - **Deterministic Tab URLs + Backend Workspace Sync**
360
- - Tab IDs now deterministic ({type}:{identifier}) instead of random (tab-xxxx)
361
- - URL format changed: `/project/{name}/{tabType}/{identifier}` (e.g., `/project/ppm/editor/src/index.ts`)
362
- - New `workspace_state` database table (schema v10) persists tab layout per project
363
- - GET/PUT `/api/project/:name/workspace` endpoints for server-side persistence
364
- - Frontend syncs workspace layout to server with 1.5s debounce
365
- - Deep linking from URL auto-creates tabs if missing
366
- - Latest-wins conflict resolution: server timestamp > client localStorage
367
- - Tab ID patterns standardized: `editor:path`, `chat:provider/sessionId`, `terminal:index`, etc.
368
- - Migration from random IDs to deterministic IDs on first load
369
-
370
- ### Technical Details
371
- - **Files Created:**
372
- - `src/server/routes/workspace.ts` — Workspace GET/PUT endpoints
373
- - `src/web/hooks/use-workspace-sync.ts` — Server sync orchestration with debounce
374
- - **Files Modified:**
375
- - `src/services/db.service.ts` — Added workspace_state table (schema v10), helper functions
376
- - `src/web/stores/panel-utils.ts` — Deterministic tab ID derivation logic
377
- - `src/web/hooks/use-url-sync.ts` — URL parsing/building with new format
378
- - `src/web/stores/panel-store.ts` — Load workspace from server on project switch
379
- - `src/web/stores/tab-store.ts` — Tab interface updated with metadata
380
- - **Breaking Changes:** URLs changed; old `/project/{name}/tab/{id}` URLs redirected or ignored (fallback to project root)
381
- - **Migration:** Client-side: old random tab IDs migrated to deterministic format on first load
382
-
383
- ### Benefits
384
- - **Shareable deep links** — URLs point to specific files/chats (e.g., `/project/ppm/editor/src/index.ts`)
385
- - **Cross-device persistence** — Workspace layout saved on server, restored on any device
386
- - **URL-driven navigation** — Paste URL to recreate workspace state
387
- - **Conflict-free sync** — Latest timestamp wins; no manual merge dialogs
388
-
389
- ---
390
-
391
- ## [0.8.63] — 2026-03-28
392
-
393
- ### Added
394
- - **MCP Server Management** — Configure Model Context Protocol servers via Settings UI
395
- - REST API: GET/POST/PUT/DELETE `/api/settings/mcp`, plus import endpoints
396
- - Storage: SQLite `mcp_servers` table (name, transport, config JSON)
397
- - UI: Settings tab with server list, add/edit dialog, delete action
398
- - Auto-import: Reads `~/.claude.json` on first access (skips existing/invalid)
399
- - Validation: Name (alphanumeric, max 50 chars) + transport-specific config checks
400
- - SDK integration: Servers passed to `query()` as `mcpServers`, tools auto-allowed via `mcp__*` wildcard
401
-
402
- ### Technical Details
403
- - **Files Created:**
404
- - `src/types/mcp.ts` — McpServerConfig types, validation functions
405
- - `src/services/mcp-config.service.ts` — CRUD service + bulk import
406
- - `src/server/routes/mcp.ts` — REST API endpoints
407
- - `src/web/lib/api-mcp.ts` — Frontend API client
408
- - `src/web/components/settings/mcp-settings-section.tsx` — Settings UI
409
- - `src/web/components/settings/mcp-server-dialog.tsx` — Add/Edit dialog
410
- - **Files Modified:**
411
- - `src/services/db.service.ts` — Schema v8 migration (mcp_servers table)
412
- - `src/server/index.ts` — Route registration
413
- - `src/providers/claude-agent-sdk.ts` — mcpServers + mcp__* allowedTools
414
- - `src/web/components/settings/settings-tab.tsx` — MCP category added
415
-
416
- ---
417
-
418
- ## [0.8.62] — 2026-03-26
419
-
420
- ### Added
421
- - **Cmd+Shift+V shortcut** — Command palette entry for voice input
422
- - **Voice input** — Web Speech API integration for chat
423
-
424
- ---
425
-
426
- ## [0.8.61] — 2026-03-26 (Beta)
427
-
428
- ### Added
429
- - **Multi-Provider Architecture** — Generic AI provider system supporting Claude (SDK-based) and CLI-spawning providers
430
- - `AIProvider` interface with optional capability methods (`abortQuery?`, `getMessages?`, `listSessionsByDir?`)
431
- - `CliProvider` abstract base class for CLI-spawning providers (Cursor, Codex, Gemini)
432
- - `CursorCliProvider` implementation — spawns `cursor-agent` with NDJSON streaming
433
- - NDJSON line parser utility for TCP packet boundary handling
434
- - Cursor event mapper — normalizes Cursor NDJSON → standard ChatEvent union
435
- - Cursor history reader — loads sessions from `~/.cursor/chats/` SQLite DAG
436
- - Provider selector UI component — users can choose provider when creating chat
437
- - Async provider bootstrap — checks binary availability, registers only if available
438
- - Workspace trust auto-retry — detects trust prompts, retries with `--trust` flag
439
- - Process lifecycle management — SIGTERM → SIGKILL escalation, orphan cleanup
440
-
441
- ### Technical Details
442
- - **Files Created:**
443
- - `src/utils/ndjson-line-parser.ts` — NDJSON streaming parser
444
- - `src/providers/cli-provider-base.ts` — Abstract CliProvider base class
445
- - `src/providers/cursor-cli/cursor-provider.ts` — CursorCliProvider
446
- - `src/providers/cursor-cli/cursor-event-mapper.ts` — Event mapping
447
- - `src/providers/cursor-cli/cursor-history.ts` — SQLite history reader
448
- - `src/web/components/chat/provider-selector.tsx` — Provider selection UI
449
- - `tests/unit/ndjson-line-parser.test.ts` — Parser tests
450
- - `tests/unit/cursor-event-mapper.test.ts` — Mapper tests
451
- - `tests/integration/cursor-provider.test.ts` — Integration tests
452
- - `tests/integration/chat-service-multi-provider.test.ts` — Service tests
453
- - **Files Modified:**
454
- - `src/types/chat.ts` — Added optional capability methods to AIProvider, added `system` event type
455
- - `src/types/config.ts` — Added `"cli"` type, `cli_command` field to AIProviderConfig
456
- - `src/providers/registry.ts` — Added async `bootstrapProviders()` for conditional registration
457
- - `src/server/ws/chat.ts` — Removed `as any` casts, use optional chaining for capabilities
458
- - `src/services/chat.service.ts` — Use optional methods instead of duck-typing
459
- - `src/web/components/chat/session-picker.tsx` — Integrated provider selector
460
- - **Breaking Changes:** None (backward compatible, all tests passing)
461
- - **Architecture:** All phases complete (6/6), 555 tests passing
462
-
463
- ### Benefits
464
- - Extensible foundation for Codex, Gemini, and future providers (~100-150 lines each)
465
- - No more `as any` casts for provider methods — type-safe optional capability pattern
466
- - CLI providers can override session history reading (e.g., Cursor SQLite DAG)
467
- - Graceful degradation — missing CLI binary doesn't crash, logs info, skips provider
468
-
469
- ---
470
-
471
- ## [0.8.55] — 2026-03-26
472
-
473
- ### Added
474
- - **Streaming Input Migration** — Persistent AsyncGenerator session model for chat
475
- - Provider maintains long-lived streaming input per session (not per message)
476
- - Follow-up messages push into existing generator instead of abort-and-replace
477
- - Single streaming loop decoupled from WebSocket message handler
478
- - Message priority support (`now`/`next`/`later`) for intelligent message ordering
479
- - Image attachment support in message sending
480
- - Session state persistence across FE disconnections (5-minute cleanup timeout)
481
- - Event buffering on reconnect: clients receive buffered turn events after reconnection
482
- - Phase transitions: `idle` → `initializing` → `connecting` → `thinking`/`streaming` → `idle`
483
-
484
- ### Technical Details
485
- - **Provider Layer** (`src/providers/claude-agent-sdk.ts`): Maintains streaming session per sessionId
486
- - **WebSocket Handler** (`src/server/ws/chat.ts`):
487
- - `runStreamLoop()` executes independently (detached from WS scope)
488
- - `activeSessions` map persists session state across FE disconnections
489
- - `startSessionConsumer()` pattern replaces per-message `runStreamLoop()` calls
490
- - Event buffering (turnEvents array, max 10k events) for reconnect sync
491
- - Per-client ping intervals (15s keepalive)
492
- - **Types** (`src/types/api.ts`, `src/types/chat.ts`):
493
- - `ChatWsClientMessage` extended with `priority?: string` and optional `images`
494
- - `SessionPhase` = "initializing" | "connecting" | "thinking" | "streaming" | "idle"
495
- - `SessionEntry` tracks clients, abort handle, phase, pending approvals, buffered events
496
- - **Frontend** (`src/web/components/chat/message-input.tsx`): PriorityToggle component (visible during streaming)
497
- - **Benefits**:
498
- - No SDK subprocess restarts between messages (faster context preservation)
499
- - Tool approvals integrated into streaming (no query restart)
500
- - Message buffering prevents loss on FE reconnection
501
- - Cleaner architecture: BE owns Claude connection, FE disconnect ≠ abort
502
-
503
- ---
504
-
505
- ## [0.8.54] — 2026-03-25
506
-
507
- ### Added
508
- - **Auto-upgrade feature** — Full implementation with supervisor, API, CLI, and UI components
509
- - Supervisor checks npm registry every 15 minutes for new versions
510
- - UI banner displays when new version available with one-click upgrade button
511
- - `ppm upgrade` CLI command for headless systems (with `--check` flag to preview)
512
- - Self-replace mechanism: supervisor spawns new supervisor from updated code, waits for health, then exits old
513
- - Self-replace eliminates OS autostart dependency — upgrade works even on headless/containerized systems
514
- - GET `/api/upgrade/status` returns current version, available version, install method (npm/bun/binary)
515
- - POST `/api/upgrade/apply` installs new version and signals supervisor for restart
516
- - Compiled binary installs gracefully rejected with clear message (future: GitHub releases support)
517
- - Config option: `autoUpgrade` setting (default: true) allows opt-out
518
- - All upgrade routes require authentication
519
-
520
- ### Technical Details
521
- - **Services**: `src/services/upgrade.service.ts` handles version checking, semver comparison, install method detection, and installation
522
- - **Supervisor**: Enhanced with 15-minute version check timer, available version tracking in status.json, SIGUSR1-triggered self-replace
523
- - **API Routes**: `src/server/routes/upgrade.ts` with status and apply endpoints
524
- - **CLI**: `src/cli/commands/upgrade.ts` with interactive upgrade and check-only mode
525
- - **UI**: `src/web/components/layout/upgrade-banner.tsx` fixed-position banner with dismiss/upgrade buttons, polling every 60s
526
- - Install method detection: `isCompiledBinary()` → binary, `process.execPath.includes("bun")` → bun, else → npm
527
- - Semver comparison: lightweight string split (no external lib)
528
- - Self-replace implementation: saves `process.argv`, spawns new supervisor, polls status.json for new PID, waits up to 30s
529
-
530
- ---
531
-
532
- ## [0.8.53] — 2026-03-18
533
-
534
- ### Fixed
535
- - Keybindings: prevent command palette false trigger during IME composition
536
-
537
- ---
538
-
539
- ## [0.8.52] — 2026-03-15
540
-
541
- ### Added
542
- - Process supervisor with auto-restart and tunnel resilience
543
- - Supervisor spawns and monitors server + tunnel processes
544
- - Auto-restart on crash with exponential backoff
545
- - Health checks every 30 seconds
546
- - Cloudflare tunnel auto-reconnect on failure
547
- - Status file (~/.ppm/status.json) tracks PID, port, URL
548
-
549
- ---
550
-
551
- ## [0.7.x — v0.8.52] — Prior Releases
552
-
553
- Multi-account credential management, usage tracking, mobile UX optimization, Cloudflare tunnel integration, push notifications, terminal output streaming.
554
-
555
- ---
556
-
557
- ## Categories
558
-
559
- - **Added** — New features
560
- - **Fixed** — Bug fixes
561
- - **Changed** — Behavioral changes
562
- - **Deprecated** — Features marked for removal
563
- - **Removed** — Removed features
564
- - **Security** — Security vulnerability fixes
565
-
566
- ---
567
-
568
- ## Version Scheme
569
-
570
- PPM uses semantic versioning: MAJOR.MINOR.PATCH
571
-
572
- - MAJOR: Breaking changes to API/CLI/config format
573
- - MINOR: New features (backward compatible)
574
- - PATCH: Bug fixes and small improvements