@hienlh/ppm 0.17.14 → 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 (427) hide show
  1. package/CHANGELOG.md +14 -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/C:/Users/PC/AppData/Local/Temp/ppmbuild/index.js +0 -118043
  145. package/dist/web/assets/architecture-PBZL5I3N-CqTF9Xn6.js +0 -1
  146. package/dist/web/assets/chat-tab-C6nMDb9l.js +0 -18
  147. package/dist/web/assets/code-editor-C38IIs_y.js +0 -10
  148. package/dist/web/assets/data-grid-overlay-editor-cOzDcGkl.js +0 -1
  149. package/dist/web/assets/data-grid-types-CWHnFOc-.js +0 -1
  150. package/dist/web/assets/database-viewer-DxmL2veb.js +0 -1
  151. package/dist/web/assets/dist-B5ErTtYs.js +0 -11
  152. package/dist/web/assets/esm-DU7axMjq.js +0 -2
  153. package/dist/web/assets/gitGraph-HDMCJU4V-X12vfQ3i.js +0 -1
  154. package/dist/web/assets/glide-data-grid-BC0AHzMn.js +0 -138
  155. package/dist/web/assets/group-chat-tab-D20bF8q5.js +0 -1
  156. package/dist/web/assets/index-CMJ6whqq.css +0 -2
  157. package/dist/web/assets/info-3K5VOQVL-Bcz-Qhua.js +0 -1
  158. package/dist/web/assets/keybindings-store-TINaziU9.js +0 -1
  159. package/dist/web/assets/notification-store-DN8oDV7o.js +0 -1
  160. package/dist/web/assets/packet-RMMSAZCW-BTwjB70W.js +0 -1
  161. package/dist/web/assets/pie-UPGHQEXC-Cn-lrQYZ.js +0 -1
  162. package/dist/web/assets/postgres-viewer-pWjwP3GD.js +0 -3
  163. package/dist/web/assets/radar-KQ55EAFF-Cmppm_Ia.js +0 -1
  164. package/dist/web/assets/settings-tab-BoRuss3O.js +0 -1
  165. package/dist/web/assets/sqlite-viewer-BgewX3tM.js +0 -1
  166. package/dist/web/assets/treemap-KZPCXAKY-BLWus1wm.js +0 -1
  167. package/docs/journal/binary-self-upgrade-260724.md +0 -66
  168. package/nul/docs/claude-agent-sdk-reference.md +0 -780
  169. package/nul/docs/code-standards.md +0 -1080
  170. package/nul/docs/codebase-summary.md +0 -916
  171. package/nul/docs/deployment-guide.md +0 -702
  172. package/nul/docs/design-guidelines.md +0 -767
  173. package/nul/docs/extension-development-guide.md +0 -629
  174. package/nul/docs/journals/260414-1400-ext-git-graph-port-complete.md +0 -147
  175. package/nul/docs/journals/260414-1452-git-graph-faithful-port.md +0 -144
  176. package/nul/docs/journals/260414-1810-git-graph-ui-improvements-complete.md +0 -261
  177. package/nul/docs/journals/260414-2001-bundled-extensions.md +0 -219
  178. package/nul/docs/journals/260415-frontend-memory-optimization.md +0 -73
  179. package/nul/docs/lessons-learned.md +0 -70
  180. package/nul/docs/project-changelog.md +0 -574
  181. package/nul/docs/project-overview-pdr.md +0 -205
  182. package/nul/docs/project-roadmap.md +0 -222
  183. package/nul/docs/system-architecture.md +0 -1961
  184. package/packages/vscode-compat/node_modules/.bin/tsc.bunx +0 -0
  185. package/packages/vscode-compat/node_modules/.bin/tsc.exe +0 -0
  186. package/packages/vscode-compat/node_modules/.bin/tsserver.bunx +0 -0
  187. package/packages/vscode-compat/node_modules/.bin/tsserver.exe +0 -0
  188. package/spike-group-channel.mjs +0 -156
  189. package/spike-group-chat.mjs +0 -181
  190. /package/dist/web/assets/{abap-tkptwpsK.js → abap-BZ3J5hF3.js} +0 -0
  191. /package/dist/web/assets/{actionscript-3-Di9TMGwg.js → actionscript-3-CkyGfT-8.js} +0 -0
  192. /package/dist/web/assets/{ada-CB9F079D.js → ada-CxNLBoe7.js} +0 -0
  193. /package/dist/web/assets/{andromeeda-Dcl8jpb7.js → andromeeda-BPN5rsDz.js} +0 -0
  194. /package/dist/web/assets/{apache-D0Nk0qsH.js → apache-C1F5wHL6.js} +0 -0
  195. /package/dist/web/assets/{apex-mQIoWncD.js → apex-BaNixdO-.js} +0 -0
  196. /package/dist/web/assets/{api-themes-BdQCjXQk.js → api-themes-84MT-XqR.js} +0 -0
  197. /package/dist/web/assets/{applescript-C6ljbcsI.js → applescript-Cl_pdcch.js} +0 -0
  198. /package/dist/web/assets/{ara-WFqRPGPe.js → ara-B6UAE7M2.js} +0 -0
  199. /package/dist/web/assets/{asciidoc-bNd8w4nf.js → asciidoc-D9c9Twki.js} +0 -0
  200. /package/dist/web/assets/{asm-BQ1_F580.js → asm-CNmtv7Y9.js} +0 -0
  201. /package/dist/web/assets/{aurora-x-Ciqs_Dbu.js → aurora-x-C9z-NyzR.js} +0 -0
  202. /package/dist/web/assets/{awk-GCR-6KZV.js → awk-BfLHEnKa.js} +0 -0
  203. /package/dist/web/assets/{ayu-dark-DxJXuj99.js → ayu-dark-Bn7trkt_.js} +0 -0
  204. /package/dist/web/assets/{ayu-light-jvSyJWDV.js → ayu-light-Dpya9hPf.js} +0 -0
  205. /package/dist/web/assets/{ayu-mirage-Cg3BPO6H.js → ayu-mirage-Cc0jfABD.js} +0 -0
  206. /package/dist/web/assets/{ballerina-BPz4CrX6.js → ballerina-BtiCmN7T.js} +0 -0
  207. /package/dist/web/assets/{bat-CSTs2hIG.js → bat-tmFM76zR.js} +0 -0
  208. /package/dist/web/assets/{beancount-DMateAZX.js → beancount-BjPqRrcH.js} +0 -0
  209. /package/dist/web/assets/{berry-9lXg0GRM.js → berry-D0SQBxN2.js} +0 -0
  210. /package/dist/web/assets/{bibtex-DIbqmvFg.js → bibtex-CkjRWQKr.js} +0 -0
  211. /package/dist/web/assets/{bicep-02WGsoJ8.js → bicep-Bhq28Cxc.js} +0 -0
  212. /package/dist/web/assets/{bird2-BY0tbu3k.js → bird2-DFGInYb3.js} +0 -0
  213. /package/dist/web/assets/{c-jMBX_9Je.js → c-CP8cB4k_.js} +0 -0
  214. /package/dist/web/assets/{c3-B8JVbNjW.js → c3-oRytyeWo.js} +0 -0
  215. /package/dist/web/assets/{cadence-DUIf1tvL.js → cadence-Inf1rGb7.js} +0 -0
  216. /package/dist/web/assets/{catppuccin-frappe-FhUCVxex.js → catppuccin-frappe-DAzribQo.js} +0 -0
  217. /package/dist/web/assets/{catppuccin-latte-CzfrtmgL.js → catppuccin-latte-B6Y_mCCQ.js} +0 -0
  218. /package/dist/web/assets/{catppuccin-macchiato-6xL0lOtj.js → catppuccin-macchiato-COLbYqVL.js} +0 -0
  219. /package/dist/web/assets/{catppuccin-mocha-D39-xS3P.js → catppuccin-mocha-DKWaML1B.js} +0 -0
  220. /package/dist/web/assets/{clarity-D8TeGvoT.js → clarity-_ZLLrrsX.js} +0 -0
  221. /package/dist/web/assets/{clojure-Dx_acSX7.js → clojure-DWGVCg_P.js} +0 -0
  222. /package/dist/web/assets/{cmake-CyeYPq8o.js → cmake-Cwh3mug7.js} +0 -0
  223. /package/dist/web/assets/{codeowners-DrTI0lmI.js → codeowners-BdV6CFYi.js} +0 -0
  224. /package/dist/web/assets/{codeql-CPkFxVW-.js → codeql-NvupDIDf.js} +0 -0
  225. /package/dist/web/assets/{common-lisp-B0k-3LTj.js → common-lisp-B-vtBh5k.js} +0 -0
  226. /package/dist/web/assets/{coq-uygpo7to.js → coq-M8-FTfiZ.js} +0 -0
  227. /package/dist/web/assets/{csharp-DKUYGfSp.js → csharp-B7Ugdtd-.js} +0 -0
  228. /package/dist/web/assets/{css-DoOUp7v4.js → css-86k3Z-YA.js} +0 -0
  229. /package/dist/web/assets/{csv-B3YE13gi.js → csv-BX5XYhfH.js} +0 -0
  230. /package/dist/web/assets/{csv-parser-CB6bK93y.js → csv-parser-d56Fzpwc.js} +0 -0
  231. /package/dist/web/assets/{cue-DViO2wvn.js → cue-B7099gQa.js} +0 -0
  232. /package/dist/web/assets/{cypher-4BMCIW5N.js → cypher-D99mWVIu.js} +0 -0
  233. /package/dist/web/assets/{d-BT_sTHas.js → d-CFE8oQwh.js} +0 -0
  234. /package/dist/web/assets/{dark-plus-DVVXu-1N.js → dark-plus-BEeeDwdg.js} +0 -0
  235. /package/dist/web/assets/{dart-DHz6f6_6.js → dart-HVSWGnI5.js} +0 -0
  236. /package/dist/web/assets/{dax-ChYCjweK.js → dax-DjDgSJkh.js} +0 -0
  237. /package/dist/web/assets/{desktop-D6Lt4p04.js → desktop-B5A3i7J1.js} +0 -0
  238. /package/dist/web/assets/{diff-D8TDe4hP.js → diff-CpTrlaE9.js} +0 -0
  239. /package/dist/web/assets/{dist-D1CjMuoa.js → dist-BSCgJs-V.js} +0 -0
  240. /package/dist/web/assets/{docker-Bsp0YbPx.js → docker-xBhmJeHj.js} +0 -0
  241. /package/dist/web/assets/{dotenv-B_7giSY_.js → dotenv-DKKhLEv5.js} +0 -0
  242. /package/dist/web/assets/{dracula-TrQL2iB5.js → dracula-CVwQuzra.js} +0 -0
  243. /package/dist/web/assets/{dracula-soft-n2XOlgh-.js → dracula-soft-CG6mB-lf.js} +0 -0
  244. /package/dist/web/assets/{dream-maker-CdIEdhpT.js → dream-maker-SC-IdYY3.js} +0 -0
  245. /package/dist/web/assets/{edit-diff-preview-Cj6-iplb.js → edit-diff-preview-C50i1H63.js} +0 -0
  246. /package/dist/web/assets/{emacs-lisp-CSbixs6u.js → emacs-lisp-CIBFq6W8.js} +0 -0
  247. /package/dist/web/assets/{everforest-dark-BuZahZYp.js → everforest-dark-odRT_lec.js} +0 -0
  248. /package/dist/web/assets/{everforest-light-DPH53z5H.js → everforest-light-or1Voqjl.js} +0 -0
  249. /package/dist/web/assets/{fennel-B1-K_hlJ.js → fennel-tQd1z3iu.js} +0 -0
  250. /package/dist/web/assets/{fish-Cy12Dbua.js → fish-DSuZQG0k.js} +0 -0
  251. /package/dist/web/assets/{fluent-B_82ys8E.js → fluent-D7xI8a8e.js} +0 -0
  252. /package/dist/web/assets/{fortran-free-form-BRQdNzZF.js → fortran-free-form-BlAtcPd3.js} +0 -0
  253. /package/dist/web/assets/{gdscript-XBDmLUm9.js → gdscript-VsEQXBPm.js} +0 -0
  254. /package/dist/web/assets/{gdshader-DhVfB3u4.js → gdshader-iqHMOdwW.js} +0 -0
  255. /package/dist/web/assets/{genie-X3K29Y49.js → genie-C4XU4g1a.js} +0 -0
  256. /package/dist/web/assets/{gherkin-DKIx-6cX.js → gherkin-C4nfQzAB.js} +0 -0
  257. /package/dist/web/assets/{github-dark-Bf7zdp5s.js → github-dark-B_pbG3CC.js} +0 -0
  258. /package/dist/web/assets/{github-dark-default-DqsBBV11.js → github-dark-default-kFbx7C95.js} +0 -0
  259. /package/dist/web/assets/{github-dark-dimmed-X2gqRz6w.js → github-dark-dimmed-CpVfQEqs.js} +0 -0
  260. /package/dist/web/assets/{github-dark-high-contrast-Z7tvbGX4.js → github-dark-high-contrast-DYKqQwZh.js} +0 -0
  261. /package/dist/web/assets/{github-light-default-B0liF4d4.js → github-light-default-DVHfMPQ2.js} +0 -0
  262. /package/dist/web/assets/{github-light-BKxt-7zZ.js → github-light-gEYBmKaj.js} +0 -0
  263. /package/dist/web/assets/{github-light-high-contrast-F4encJwr.js → github-light-high-contrast-ClVJDu-q.js} +0 -0
  264. /package/dist/web/assets/{gleam-Pz2bHgBB.js → gleam-BLaPu7ft.js} +0 -0
  265. /package/dist/web/assets/{gn-CgmdNsPU.js → gn-BKgerUyI.js} +0 -0
  266. /package/dist/web/assets/{gnuplot-qLNF5yZ9.js → gnuplot-cqJuEFb-.js} +0 -0
  267. /package/dist/web/assets/{go-CSDUNhE7.js → go-B2EHdyD8.js} +0 -0
  268. /package/dist/web/assets/{groovy-B3NEnOHF.js → groovy-DdImoj8s.js} +0 -0
  269. /package/dist/web/assets/{gruvbox-dark-hard-DcoftiUX.js → gruvbox-dark-hard-DlwstAds.js} +0 -0
  270. /package/dist/web/assets/{gruvbox-dark-medium-D1wVSuD8.js → gruvbox-dark-medium-CiYEd1vd.js} +0 -0
  271. /package/dist/web/assets/{gruvbox-dark-soft-DWpunymH.js → gruvbox-dark-soft-C-wEa4h4.js} +0 -0
  272. /package/dist/web/assets/{gruvbox-light-hard-rHMvyUdS.js → gruvbox-light-hard-BqYmfna-.js} +0 -0
  273. /package/dist/web/assets/{gruvbox-light-medium-3O2KiXO7.js → gruvbox-light-medium-CxmfalT2.js} +0 -0
  274. /package/dist/web/assets/{gruvbox-light-soft-lNlXJPwH.js → gruvbox-light-soft-DGWXXMCB.js} +0 -0
  275. /package/dist/web/assets/{haskell-aaG3aC0h.js → haskell-H_C_IuVb.js} +0 -0
  276. /package/dist/web/assets/{haxe-CPcHhUDd.js → haxe-CGNSMpeZ.js} +0 -0
  277. /package/dist/web/assets/{hcl-CMQNlR_4.js → hcl-B7bSTSQf.js} +0 -0
  278. /package/dist/web/assets/{hjson-DeuklPFj.js → hjson-DlJ-glQZ.js} +0 -0
  279. /package/dist/web/assets/{hlsl-BI3hlsaM.js → hlsl-CehW5SJN.js} +0 -0
  280. /package/dist/web/assets/{horizon-C7-gOcjs.js → horizon-Beabcz2d.js} +0 -0
  281. /package/dist/web/assets/{horizon-bright-Cxt9bRW7.js → horizon-bright-BC87RXPa.js} +0 -0
  282. /package/dist/web/assets/{houston-DbF2G7iD.js → houston-Da7RFwUy.js} +0 -0
  283. /package/dist/web/assets/{hy-DRG6Hs2I.js → hy-m1H70w19.js} +0 -0
  284. /package/dist/web/assets/{imba-CxKv_2TW.js → imba-MExFsdAA.js} +0 -0
  285. /package/dist/web/assets/{ini-BiHsyCdO.js → ini-CJy_zmwy.js} +0 -0
  286. /package/dist/web/assets/{java-D3RZzgDB.js → java-DqDFvJBH.js} +0 -0
  287. /package/dist/web/assets/{javascript-4FmSqG-T.js → javascript-C3Wyv22X.js} +0 -0
  288. /package/dist/web/assets/{json-CjB236_E.js → json-DnGBw_DZ.js} +0 -0
  289. /package/dist/web/assets/{json5-bkfO-Rco.js → json5-CRN-zoN4.js} +0 -0
  290. /package/dist/web/assets/{jsonc-BwaTeLyv.js → jsonc-CKRUZNRo.js} +0 -0
  291. /package/dist/web/assets/{jsonl-CfxNSwGd.js → jsonl-CGfD6FrH.js} +0 -0
  292. /package/dist/web/assets/{jsonnet-CQETCYrp.js → jsonnet-nbFuDj0o.js} +0 -0
  293. /package/dist/web/assets/{jssm-D5o3Zzdz.js → jssm-D0ShzIqD.js} +0 -0
  294. /package/dist/web/assets/{jsx-BAMILPLo.js → jsx-D27hbRbs.js} +0 -0
  295. /package/dist/web/assets/{kanagawa-dragon-BhGVxu3R.js → kanagawa-dragon-Ov3f8K0T.js} +0 -0
  296. /package/dist/web/assets/{kanagawa-lotus-FH4Y59ro.js → kanagawa-lotus-CLyOqh-g.js} +0 -0
  297. /package/dist/web/assets/{kanagawa-wave-eilvP9MB.js → kanagawa-wave-Kj3dzabH.js} +0 -0
  298. /package/dist/web/assets/{kdl-BQ-yvXUK.js → kdl-DFF58Gu4.js} +0 -0
  299. /package/dist/web/assets/{kotlin-BuCx0-VT.js → kotlin-BM4PKaB4.js} +0 -0
  300. /package/dist/web/assets/{kusto-DAN_n_Cy.js → kusto-DrvHLCv5.js} +0 -0
  301. /package/dist/web/assets/{laserwave-Cq2BlxrT.js → laserwave-Db6i6ZkO.js} +0 -0
  302. /package/dist/web/assets/{lean-Dhq7uXKw.js → lean-D0hEjzwk.js} +0 -0
  303. /package/dist/web/assets/{less-CxaMQb8j.js → less-BEj4npGG.js} +0 -0
  304. /package/dist/web/assets/{lib-MIEszzkI.js → lib-CBdlQ75W.js} +0 -0
  305. /package/dist/web/assets/{light-plus-B4sMAend.js → light-plus-DLIIbDea.js} +0 -0
  306. /package/dist/web/assets/{llvm-DQ6-B_6Y.js → llvm-DMt6umsO.js} +0 -0
  307. /package/dist/web/assets/{log-Bb_vqvu7.js → log-BopvdtPW.js} +0 -0
  308. /package/dist/web/assets/{logo-BzfYv3A_.js → logo-CYSUFPFR.js} +0 -0
  309. /package/dist/web/assets/{luau-BnAeNR77.js → luau-XC611HNO.js} +0 -0
  310. /package/dist/web/assets/{make-B6IFuxpC.js → make-BMYZIfBj.js} +0 -0
  311. /package/dist/web/assets/{markdown-Z0xi77Fn.js → markdown-BLza5nvF.js} +0 -0
  312. /package/dist/web/assets/{material-theme-1scy1SYn.js → material-theme-Uw27UfJW.js} +0 -0
  313. /package/dist/web/assets/{material-theme-darker-G-JykXQP.js → material-theme-darker-dfqt8XBY.js} +0 -0
  314. /package/dist/web/assets/{material-theme-lighter-BtKkCMVq.js → material-theme-lighter-CPtBTblV.js} +0 -0
  315. /package/dist/web/assets/{material-theme-ocean-irrDC89L.js → material-theme-ocean-BfZgVqC-.js} +0 -0
  316. /package/dist/web/assets/{material-theme-palenight-Eq5_K4LM.js → material-theme-palenight-DAZoVYg8.js} +0 -0
  317. /package/dist/web/assets/{matlab-BE3oCXZC.js → matlab-cSzmquiW.js} +0 -0
  318. /package/dist/web/assets/{mdx-DYiuFTGw.js → mdx-Dq0kW5VM.js} +0 -0
  319. /package/dist/web/assets/{mermaid-DVlaEvtw.js → mermaid-DoIKF0yS.js} +0 -0
  320. /package/dist/web/assets/{min-dark-DSkeTpQa.js → min-dark-DyraimDU.js} +0 -0
  321. /package/dist/web/assets/{min-light-CFv2Q0uF.js → min-light-Co9cbcUv.js} +0 -0
  322. /package/dist/web/assets/{mipsasm-CiAFuZQ2.js → mipsasm-ph6cKgHn.js} +0 -0
  323. /package/dist/web/assets/{mojo-ARshcaSQ.js → mojo-BBT0XwmY.js} +0 -0
  324. /package/dist/web/assets/{monokai-CPTV-SOg.js → monokai-IP0T5Rtg.js} +0 -0
  325. /package/dist/web/assets/{moonbit-D57B0dZr.js → moonbit-B8cogNXl.js} +0 -0
  326. /package/dist/web/assets/{move-qgy3G_o9.js → move-DkY26NtM.js} +0 -0
  327. /package/dist/web/assets/{narrat-CZ3rC-oc.js → narrat-rBs3byG0.js} +0 -0
  328. /package/dist/web/assets/{nextflow-groovy-BxxIOcI4.js → nextflow-groovy-DkO9wMLP.js} +0 -0
  329. /package/dist/web/assets/{night-owl-B1ryGCda.js → night-owl-jVR4lFji.js} +0 -0
  330. /package/dist/web/assets/{night-owl-light-BZvNnvMF.js → night-owl-light-fBYJ7s3U.js} +0 -0
  331. /package/dist/web/assets/{nix-BVBQi8yv.js → nix-WX9oavu6.js} +0 -0
  332. /package/dist/web/assets/{nord-3NXw613h.js → nord-Cf7G21Pu.js} +0 -0
  333. /package/dist/web/assets/{nushell-BMOLRalb.js → nushell-DQdzcJ1H.js} +0 -0
  334. /package/dist/web/assets/{objective-c-AxruEUgh.js → objective-c-JSO2uvZ-.js} +0 -0
  335. /package/dist/web/assets/{objective-cpp-cFT0qRsD.js → objective-cpp-CZMGJ9Fb.js} +0 -0
  336. /package/dist/web/assets/{ocaml-_8JH6O8J.js → ocaml-C4S4NSDo.js} +0 -0
  337. /package/dist/web/assets/{odin-nwYvR0O6.js → odin-Y2jXCgVq.js} +0 -0
  338. /package/dist/web/assets/{one-dark-pro-C1LaYJaH.js → one-dark-pro-dVIxuoJY.js} +0 -0
  339. /package/dist/web/assets/{one-light-B7rMc__c.js → one-light-BQ1IKfD1.js} +0 -0
  340. /package/dist/web/assets/{openscad-Cwes8bKO.js → openscad-Bddw4I3z.js} +0 -0
  341. /package/dist/web/assets/{pascal-DMt-6tdZ.js → pascal-BKVXrzC1.js} +0 -0
  342. /package/dist/web/assets/{pkl-QBTyYQmB.js → pkl-BTd-YRsO.js} +0 -0
  343. /package/dist/web/assets/{plastic-BTSUp8Fk.js → plastic-eiGvBIxV.js} +0 -0
  344. /package/dist/web/assets/{plsql-DQv3IFXP.js → plsql-C290tieP.js} +0 -0
  345. /package/dist/web/assets/{po-CNwZx4tW.js → po-DyDwh0tx.js} +0 -0
  346. /package/dist/web/assets/{poimandres-8Os7Qequ.js → poimandres-B87zc_g-.js} +0 -0
  347. /package/dist/web/assets/{polar-b4yK8oD8.js → polar-Cdub1YMT.js} +0 -0
  348. /package/dist/web/assets/{postcss-sFctwpxx.js → postcss-BcI_3K0v.js} +0 -0
  349. /package/dist/web/assets/{powerquery-Cg_WrtuN.js → powerquery-OdMrkJSe.js} +0 -0
  350. /package/dist/web/assets/{powershell-C7Ifz95h.js → powershell-C8auT6xg.js} +0 -0
  351. /package/dist/web/assets/{prisma-Z52HUJzQ.js → prisma-DIbVv8PA.js} +0 -0
  352. /package/dist/web/assets/{prolog-DLqW-zR1.js → prolog-DbTOH3Ld.js} +0 -0
  353. /package/dist/web/assets/{proto-BOIzxCCJ.js → proto-C4Cq2dCD.js} +0 -0
  354. /package/dist/web/assets/{puppet-De7TjZIf.js → puppet-DJp3uqum.js} +0 -0
  355. /package/dist/web/assets/{purescript-R76ou1WT.js → purescript-CLsV4rPU.js} +0 -0
  356. /package/dist/web/assets/{python-Dprm0tNP.js → python-2gBtEza2.js} +0 -0
  357. /package/dist/web/assets/{qmldir-Clp_jpNw.js → qmldir-DfhULcua.js} +0 -0
  358. /package/dist/web/assets/{qss-eQPYYzSo.js → qss-DK--VTTV.js} +0 -0
  359. /package/dist/web/assets/{r-CCcRHIf5.js → r-BArBO2Sa.js} +0 -0
  360. /package/dist/web/assets/{racket-CzE472yp.js → racket-5mijHsVy.js} +0 -0
  361. /package/dist/web/assets/{raku-DQwXrTSi.js → raku-ir0suElk.js} +0 -0
  362. /package/dist/web/assets/{red-KCS6wyop.js → red-DSecpIOT.js} +0 -0
  363. /package/dist/web/assets/{reg-CcrAddUh.js → reg-Dp30FusS.js} +0 -0
  364. /package/dist/web/assets/{regexp-DDbud-Ri.js → regexp-DXJnEM_6.js} +0 -0
  365. /package/dist/web/assets/{rel-99GDgaHp.js → rel-Dr483ozj.js} +0 -0
  366. /package/dist/web/assets/{riscv-Dm2eNv0R.js → riscv-ZfBy5IA1.js} +0 -0
  367. /package/dist/web/assets/{ron-CzFt0ygH.js → ron-ZJ_CljGP.js} +0 -0
  368. /package/dist/web/assets/{rose-pine-Ck6lCrCP.js → rose-pine-CcW_eJ6G.js} +0 -0
  369. /package/dist/web/assets/{rose-pine-dawn-vtALRJNj.js → rose-pine-dawn-v2l_UF-j.js} +0 -0
  370. /package/dist/web/assets/{rose-pine-moon-DPto8qXw.js → rose-pine-moon-CNXkwf3D.js} +0 -0
  371. /package/dist/web/assets/{rosmsg-NtS6429H.js → rosmsg-BMYMVW84.js} +0 -0
  372. /package/dist/web/assets/{rust-BjIXvF9h.js → rust-BR-zJh5q.js} +0 -0
  373. /package/dist/web/assets/{sass-CQ23wf5E.js → sass-BukPOBFz.js} +0 -0
  374. /package/dist/web/assets/{scala-LfKLM143.js → scala-DUFY7D6D.js} +0 -0
  375. /package/dist/web/assets/{scheme-D3SLBXlF.js → scheme-Dl-dNNxQ.js} +0 -0
  376. /package/dist/web/assets/{sdbl-ODRd2rGN.js → sdbl-DdmlQhia.js} +0 -0
  377. /package/dist/web/assets/{shellscript-3KB1G_oA.js → shellscript-UyhrvGcd.js} +0 -0
  378. /package/dist/web/assets/{slack-dark-DTtyWmIy.js → slack-dark-Cv6Szr-q.js} +0 -0
  379. /package/dist/web/assets/{slack-ochin-Bu0PApk3.js → slack-ochin-V6Ii3lAm.js} +0 -0
  380. /package/dist/web/assets/{smalltalk-haMT-Sbe.js → smalltalk-BUCv5G91.js} +0 -0
  381. /package/dist/web/assets/{snazzy-light-DXJzefE9.js → snazzy-light-B67a78qi.js} +0 -0
  382. /package/dist/web/assets/{solarized-dark-B6LyYa18.js → solarized-dark-ccWnfYyA.js} +0 -0
  383. /package/dist/web/assets/{solarized-light-QLADebkv.js → solarized-light-C3WyRO5I.js} +0 -0
  384. /package/dist/web/assets/{solidity-mzfq1aDc.js → solidity-BFbRPNi_.js} +0 -0
  385. /package/dist/web/assets/{splunk-CyH4RWBp.js → splunk-zdpwCJLE.js} +0 -0
  386. /package/dist/web/assets/{sql-CWVlT5D3.js → sql-B2IPUsfz.js} +0 -0
  387. /package/dist/web/assets/{ssh-config-DNvQJ1Qx.js → ssh-config-Co4cXifq.js} +0 -0
  388. /package/dist/web/assets/{stylus-ByQQdtmf.js → stylus-CmI75XY8.js} +0 -0
  389. /package/dist/web/assets/{swift-D1cpY4ow.js → swift-Dfks9YQI.js} +0 -0
  390. /package/dist/web/assets/{synthwave-84-BDF_-QiW.js → synthwave-84-B3LERzNS.js} +0 -0
  391. /package/dist/web/assets/{system-verilog-BYrkMydC.js → system-verilog-BFvldiwl.js} +0 -0
  392. /package/dist/web/assets/{systemd-CQm3zyK0.js → systemd-Cu4Vvgbu.js} +0 -0
  393. /package/dist/web/assets/{talonscript-DMW5CzE1.js → talonscript-Bnq32pUB.js} +0 -0
  394. /package/dist/web/assets/{tasl-BhFzMCr2.js → tasl-Nwe2K3J1.js} +0 -0
  395. /package/dist/web/assets/{tcl-D7VEAF-9.js → tcl-zOnpywrl.js} +0 -0
  396. /package/dist/web/assets/{terraform-DdT5A0Vy.js → terraform-Bc9Vj-n3.js} +0 -0
  397. /package/dist/web/assets/{tokyo-night-WGLMM6Q9.js → tokyo-night-9_KyM8M2.js} +0 -0
  398. /package/dist/web/assets/{toml-CZ7ipXHZ.js → toml-ByH-fxOY.js} +0 -0
  399. /package/dist/web/assets/{tsv-B1zVvoTr.js → tsv-DrCnDClP.js} +0 -0
  400. /package/dist/web/assets/{tsx-D4HwRUBq.js → tsx-B8LafSYr.js} +0 -0
  401. /package/dist/web/assets/{turtle-B4r8KEJH.js → turtle-DuyP_QCJ.js} +0 -0
  402. /package/dist/web/assets/{typescript-BnHhxMtp.js → typescript-BTBJb5RD.js} +0 -0
  403. /package/dist/web/assets/{typespec-DP2q46GT.js → typespec-DdOFo7M5.js} +0 -0
  404. /package/dist/web/assets/{typst-DFsD_yaD.js → typst-LYvnBWQu.js} +0 -0
  405. /package/dist/web/assets/{use-blob-url-DpDVcTeK.js → use-blob-url-CpyRr7Cx.js} +0 -0
  406. /package/dist/web/assets/{v-Bji8hSVT.js → v-BuBYA1_x.js} +0 -0
  407. /package/dist/web/assets/{vala-D3TIgGmU.js → vala-vRIBYYe3.js} +0 -0
  408. /package/dist/web/assets/{vb-DvcxFS2q.js → vb-DwGi-IYM.js} +0 -0
  409. /package/dist/web/assets/{vendor-xterm-DfNMj6xt.js → vendor-xterm-i6SHFTfU.js} +0 -0
  410. /package/dist/web/assets/{verilog-Dy7cF35d.js → verilog-6B1X4G2-.js} +0 -0
  411. /package/dist/web/assets/{vesper-BzjwUv9J.js → vesper-Dw1y_Ae7.js} +0 -0
  412. /package/dist/web/assets/{vhdl-DuFnFNmW.js → vhdl-DK8JwBzJ.js} +0 -0
  413. /package/dist/web/assets/{viml-yAPgKlbz.js → viml-BTKIEIqm.js} +0 -0
  414. /package/dist/web/assets/{vitesse-black-oSSQdyIZ.js → vitesse-black-BqqolhEg.js} +0 -0
  415. /package/dist/web/assets/{vitesse-dark-BZxwPihB.js → vitesse-dark-B9JL5WQA.js} +0 -0
  416. /package/dist/web/assets/{vitesse-light-uIigycvt.js → vitesse-light-DYJKj2se.js} +0 -0
  417. /package/dist/web/assets/{vyper-CX3NAxm5.js → vyper-D-jDI3WH.js} +0 -0
  418. /package/dist/web/assets/{wasm-Coen1MOg.js → wasm-1-GlNdpk.js} +0 -0
  419. /package/dist/web/assets/{wasm-D9td37qO.js → wasm-BBW4WmT2.js} +0 -0
  420. /package/dist/web/assets/{wenyan-lwNIHgk6.js → wenyan-B6cM7sDO.js} +0 -0
  421. /package/dist/web/assets/{wgsl-DQAzCfog.js → wgsl-FaHGQgko.js} +0 -0
  422. /package/dist/web/assets/{wikitext-DTXmt5NE.js → wikitext-DtIyPUrk.js} +0 -0
  423. /package/dist/web/assets/{wit-Bdw_7WDH.js → wit-BMVRif5Y.js} +0 -0
  424. /package/dist/web/assets/{wolfram-DqyHDZ07.js → wolfram-DQsCGohn.js} +0 -0
  425. /package/dist/web/assets/{yaml-CPXhdByd.js → yaml-C-Va56Gt.js} +0 -0
  426. /package/dist/web/assets/{zenscript-6s_i5zek.js → zenscript-DdobKGI-.js} +0 -0
  427. /package/dist/web/assets/{zig-B2htezJ_.js → zig-vqDFwj6q.js} +0 -0
@@ -1,219 +0,0 @@
1
- # Bundled Extensions: Zero-Configuration First-Run Experience
2
-
3
- **Date**: 2026-04-14 20:01
4
- **Severity**: Medium
5
- **Component**: Extension discovery, manifest loading, CLI
6
- **Status**: Resolved
7
-
8
- ## What Happened
9
-
10
- Completed implementation of bundled extensions — making ext-git-graph available out-of-the-box on first PPM install without requiring manual `ppm ext install`. Users now see 1 extension in the extension panel immediately after launch, removing the empty-state friction.
11
-
12
- **Approach**: Dual-path discovery — scan both `packages/ext-*` (bundled) and `~/.ppm/extensions/` (user-installed) in the same extension list. No copy/symlink operations, no database coupling. Simple, discoverable.
13
-
14
- **Core changes**:
15
- - Extended `discover()` to scan bundled dir relative to extension.service.ts
16
- - Added `extensionPaths` Map to track actual disk path per extension (bundled vs user)
17
- - User-installed extensions override bundled if same id
18
- - Bundled extensions cannot be removed, only disabled
19
- - CLI ext list now shows "Source" column (bundled/user)
20
-
21
- Total LOC: ~50 across 3 files (extension-manifest.ts, extension.service.ts, ext-cmd.ts)
22
-
23
- ## The Brutal Truth
24
-
25
- This should have been trivial. It was exactly that simple in design — just scan another directory. Instead, the implementation exposed three separate bugs, all critical to correctness, which code review caught. None were obvious during development because they existed in different layers.
26
-
27
- The frustrating part: the bugs were semantic, not syntactic. TypeScript compiled cleanly. The extension service started cleanly. Tests passed. Then `ppm ext list` returned bundled extensions with undefined paths, CLI showed isBundled=false for bundled extensions, and memory leaked on shutdown. Each was a small logic error that cascaded through the system.
28
-
29
- The _dir path leak into the API response felt stupid in hindsight. We load manifests from disk, get paths back, and then... just stored them directly in the response DTO without stripping. A user installing PPM on a 15-character path like `/Users/hienlh/...` would get that path in the JSON, making the API response change every installation. This broke tests that expected stable IDs.
30
-
31
- The isBundled check was the most infuriating. We added an `isBundled()` method that consulted the `bundledIds` Set, but **never called `discover()` first**. So `bundledIds` was always empty. The CLI passed all its tests because `isBundled()` just returned false every time — technically consistent behavior. False positives would've been louder.
32
-
33
- The memory leak on shutdown was the kick in the teeth. We added state to track bundled extensions, but never cleaned it up in `terminateWorker()`. Hours later, if a process spawned/terminated multiple extensions, heap would grow. Tiny leak, but persistent.
34
-
35
- ## Technical Details
36
-
37
- ### Design: Approach A (Dual-Path Discovery)
38
-
39
- Initial proposal had two approaches:
40
- - **A**: Scan bundled dir + user dir, merge lists, track source
41
- - **B**: Copy bundled extensions to ~/.ppm/extensions/ on first run
42
-
43
- Chose A because B couples persistence to the install, requires migration logic, and wastes disk space. A is cleaner: bundled extensions live in their source tree, user extensions in their own dir, both discoverable.
44
-
45
- ### Implementation
46
-
47
- **1. Bundled directory resolution** (extension.service.ts)
48
- ```typescript
49
- import { dirname } from "path";
50
-
51
- // Find bundled extensions relative to this file's location
52
- const bundledDir = join(dirname(import.meta.dir), "../../packages");
53
-
54
- async discover() {
55
- const [bundled, user] = await Promise.all([
56
- this.scanDir(join(bundledDir, "ext-*")),
57
- this.scanDir(join(this.extensionsDir, "*")),
58
- ]);
59
-
60
- return [...bundled, ...user]; // User can override bundled
61
- }
62
- ```
63
-
64
- **2. Path tracking** (extension.service.ts)
65
- ```typescript
66
- const extensionPaths = new Map<string, string>();
67
- const bundledIds = new Set<string>();
68
-
69
- // After discovering
70
- for (const ext of bundledExts) {
71
- extensionPaths.set(ext.id, ext.path);
72
- bundledIds.add(ext.id);
73
- }
74
- ```
75
-
76
- **3. Strip _dir from API responses** (extension-manifest.ts)
77
- ```typescript
78
- export async function loadManifest(extensionPath: string): ManifestDTO {
79
- const manifest = loadJSON(join(extensionPath, "ppm.json"));
80
-
81
- // Don't expose internal disk paths in API
82
- const { _dir, ...safe } = manifest;
83
- return safe;
84
- }
85
- ```
86
-
87
- **4. CLI Source column** (ext-cmd.ts)
88
- ```typescript
89
- const source = bundledIds.has(ext.id) ? "bundled" : "user";
90
- console.log(`${ext.id}\t${source}\t${ext.version}`);
91
- ```
92
-
93
- ### Code Review Issues (All Fixed)
94
-
95
- **C1: Critical — _dir path leak into responses**
96
-
97
- Symptom: `ppm ext info git-graph` returned `{ id, version, _dir: "/Users/hienlh/Projects/ppm/packages/..." }`. Made API response unstable across installations.
98
-
99
- Root cause: `loadManifest()` returned raw manifest object with internal fields.
100
-
101
- Fix: Destructure to strip `_dir`, `_internal`, and other private fields before returning DTO.
102
-
103
- **Files**: src/services/extension-manifest.ts (~5 lines)
104
-
105
- **H2: High — isBundled() always false**
106
-
107
- Symptom: CLI listed all extensions with `source: "user"` even for ext-git-graph. The `isBundled()` method existed but code path never called `discover()`.
108
-
109
- ```typescript
110
- // Before
111
- isBundled(id: string): boolean {
112
- return this.bundledIds.has(id); // bundledIds empty because discover() never ran
113
- }
114
-
115
- // After
116
- async isBundled(id: string): boolean {
117
- await this.discover(); // Ensure bundledIds populated
118
- return this.bundledIds.has(id);
119
- }
120
- ```
121
-
122
- Root cause: Service initialization assumed `discover()` would be called by a handler. It was, but not before CLI commands tried to check `isBundled()`.
123
-
124
- Fix: Make `isBundled()` async and ensure discovery runs first. Callers must await.
125
-
126
- **Files**: src/services/extension.service.ts (~8 lines in isBundled, ~3 lines in CLI)
127
-
128
- **H3: High — Memory leak on shutdown**
129
-
130
- Symptom: Long-running process with repeated extension loads/unloads (e.g., test suite spawning 50+ worker instances). Heap grew monotonically.
131
-
132
- Root cause: `extensionPaths` and `bundledIds` Map/Set not cleared in `terminateWorker()`.
133
-
134
- ```typescript
135
- // Added to terminateWorker()
136
- extensionPaths.clear();
137
- bundledIds.clear();
138
- ```
139
-
140
- Impact: Each terminated worker orphaned extension metadata. Over 100 cycles, noticeable heap overhead.
141
-
142
- **Files**: src/services/extension.service.ts (~2 lines)
143
-
144
- ## What We Tried
145
-
146
- 1. **Copy-on-install approach** — Rejected early; adds migration complexity and disk duplication.
147
-
148
- 2. **Symlinks to bundled** — Considered for "bundled extensions appear in user dir", but cross-platform symlink support varies (Windows requires elevation). Dual-path discovery is more portable.
149
-
150
- 3. **Single merged manifest cache** — Initially tried loading all manifests upfront and caching. Changed to lazy loading per-request to avoid startup time regression.
151
-
152
- 4. **Environment variable for bundled dir** — First draft used `BUNDLED_EXTENSIONS_DIR` env var. Changed to `import.meta.dir` (Bun-specific, build-time resolved) for testability and no reliance on runtime env.
153
-
154
- ## Root Cause Analysis
155
-
156
- The bugs emerged because we added state (extensionPaths, bundledIds) without tight coupling to initialization. Services in TypeScript often have implicit initialization contracts ("discovery must run before use"), but these aren't type-checked.
157
-
158
- **Why did _dir leak through?**
159
- The manifest loading function was too permissive. We passed the raw `require("ppm.json")` result straight to the API. No explicit field allowlist. This is a pattern issue: loading functions should transform to safe DTOs, not return raw data structures.
160
-
161
- **Why was isBundled() broken?**
162
- Async state (discovering extensions) mixed with sync queries (isBundled check). The Set exists, but it's empty. This violated the principle: "if a method consults state, it should initialize that state or assume it's initialized." We did neither.
163
-
164
- **Why wasn't shutdown cleanup obvious?**
165
- The memory leak only appeared under stress (test suite with 50+ workers). In normal usage, PPM runs as a single long-lived process. Single-instance code often skips cleanup because it happens at process exit anyway. But test suites (and server reloads) spawn/terminate repeatedly, exposing the leak.
166
-
167
- ## Lessons Learned
168
-
169
- 1. **DTO transformation is explicit, not implicit** — Define a manifest loading function that returns the exact fields the API exposes. Don't pass raw object + assume API filters properly.
170
-
171
- 2. **Async initialization contracts need typing** — If a method depends on prior async setup, the type system should reflect this. Consider:
172
- ```typescript
173
- // Bad: implicit contract
174
- isBundled(id): boolean { return bundledIds.has(id); }
175
-
176
- // Better: explicit precondition
177
- async isBundled(id): Promise<boolean> {
178
- await ensureDiscovered();
179
- return bundledIds.has(id);
180
- }
181
- ```
182
-
183
- 3. **Dual-path patterns add discovery surface** — Now we scan two directories. Code must handle conflicts (user override bundled), precedence order (user first, so they win), and fallback (if user path deleted but bundled still exists). This is more correct than copy-on-install, but requires careful spec.
184
-
185
- 4. **Cleanup is not just shutdown, it's between cycles** — Test suites expose cleanup issues that production doesn't. Always clear/reset mutable state in terminateWorker(), not just at exit.
186
-
187
- 5. **Bundled != immutable** — We say "bundled extensions cannot be removed," but that's a policy, not architecture. The code still needs safeguards: `disable(id)` should check `if (isBundled) { disableOnly(); } else { uninstall(); }`. Small gate, big difference.
188
-
189
- ## Next Steps
190
-
191
- 1. **Add bundled extension e2e test** (this week) — Verify that fresh install discovers bundled extensions without user interaction. Acceptance: `ppm ext list | grep git-graph` returns "bundled" source.
192
-
193
- 2. **Expand to other bundled extensions** (v0.9.87) — Currently only ext-git-graph is bundled. Plan to bundle ext-vscode-terminal and ext-github-copilot in upcoming releases. Our infrastructure is ready.
194
-
195
- 3. **Update install docs** (today) — Release notes should call out "git-graph included by default". Users often miss this without explicit mention.
196
-
197
- 4. **Monitor memory in long-running tests** (ongoing) — Heap profiler on test suite. If other services leak state on terminateWorker(), catch early.
198
-
199
- ---
200
-
201
- **Commits**:
202
- - One focused commit on bundled discovery (clean diff, 50 LOC)
203
- - UI improvements deferred to separate commits (as noted in other journals)
204
-
205
- **Tests**: 111 extension tests pass (18 new tests added for bundled discovery)
206
- - Test: discover() returns bundled + user extensions
207
- - Test: user extension overrides bundled (same id)
208
- - Test: isBundled() returns true for bundled, false for user
209
- - Test: CLI lists source column correctly
210
- - Test: disable bundled extension doesn't remove it from list
211
-
212
- **Code Review**: Passed after fixes to all 3 issues (C1, H2, H3)
213
-
214
- **Files Modified**:
215
- - `/Users/hienlh/Projects/ppm/src/services/extension-manifest.ts`
216
- - `/Users/hienlh/Projects/ppm/src/services/extension.service.ts`
217
- - `/Users/hienlh/Projects/ppm/src/commands/ext-cmd.ts`
218
-
219
- **Unresolved Questions**: None. Approach A proven stable through first-run UX testing.
@@ -1,73 +0,0 @@
1
- # Frontend Memory Optimization: Four Phases of Rendering & Bundle Reduction
2
-
3
- **Date**: 2026-04-15 18:00
4
- **Severity**: Medium
5
- **Component**: Frontend (React, Vite bundles)
6
- **Status**: Resolved (with incident)
7
-
8
- ## What Happened
9
-
10
- Completed 4-phase memory and rendering optimization across the React codebase. Added shallow equality checks, memoization, lazy loading, and code splitting to reduce initial bundle size and re-render overhead. Process was interrupted by a critical git incident mid-session.
11
-
12
- ## The Brutal Truth
13
-
14
- This was simultaneously a win and a disaster. The optimization work itself is solid—17 files now use `useShallow` to prevent unnecessary re-renders, 11 heavy components wrapped in `React.memo`, and critical libraries (mermaid, markdown, xterm) are now lazy-loaded. But a subagent ran `git reset --hard HEAD` without warning, destroying ALL uncommitted changes. Had to re-implement everything from scratch. Incredibly frustrating because the technical work was already done—it just got erased.
15
-
16
- ## Technical Details
17
-
18
- **Phase 1 (Shallow Equality)**
19
- - Added `useShallow` to 17 files with destructured store selector calls
20
- - Prevents re-renders when store object reference changes but content doesn't
21
- - Affected: hooks, chat, sidebar, tree, editor, terminal components
22
-
23
- **Phase 2 (Chat Pagination)**
24
- - PAGE_SIZE=50 pagination with load-more button in message-list.tsx
25
- - Capped teamActivityRef at 500 messages in use-chat.ts
26
- - Prevents DOM from holding thousands of message elements
27
-
28
- **Phase 3 (Lazy Loading)**
29
- - React.lazy for MarkdownRenderer (3 call sites, 175KB bundle)
30
- - Dynamic import for mermaid in markdown-code-block.tsx with promise caching
31
- - React.lazy for CodeMirror in postgres-viewer.tsx
32
- - Fallback suspense boundaries in place
33
-
34
- **Phase 4 (Code Splitting)**
35
- - Vite manualChunks: vendor-monaco (lazy), vendor-mermaid (2.4MB lazy), vendor-xterm (344KB lazy), vendor-markdown (597KB lazy), vendor-ui (128KB shared)
36
- - React.memo on TreeNode
37
- - Initial bundle reduced to 495KB
38
-
39
- ## Code Review Fixes Applied
40
-
41
- 1. Rules of Hooks violation in MessageList—moved hooks above early returns
42
- 2. Pagination reset on every streaming tick—fixed deps to stable `messages[0]?.id`
43
- 3. onFork inline closure defeating MessageBubble memo—made stable with useCallback
44
- 4. Variable shadowing (`s` in tool-cards.tsx)—renamed to `state`
45
- 5. Mermaid import race condition—caching promise instead of module
46
-
47
- ## What We Tried
48
-
49
- Had the work implemented successfully. Subagent spawned mid-session executed `git reset --hard HEAD` as part of cleanup routine, destroying all 26 modified files in one command. Recovered by re-implementing changes from notes and code review feedback.
50
-
51
- ## Root Cause Analysis
52
-
53
- The incident happened because there was no git safety protocol when spawning subagents. The subagent was clearing uncommitted work thinking it was cleaning up, not realizing the changes hadn't been committed yet. No blocking commit before delegation meant work was vulnerable.
54
-
55
- The optimization work itself: good decisions across the board. Shallow equality catches the most common re-render patterns. Lazy loading only targets heavy libraries (mermaid is 2.4MB—absolutely needs deferral). Pagination capping is necessary given unbounded message streams. Code splitting is strategic: vendor chunks reduce main bundle pressure.
56
-
57
- ## Lessons Learned
58
-
59
- 1. **Always commit before spawning subagents.** Even exploratory work needs a safety commit. Do not delegate with uncommitted changes in working tree.
60
- 2. **Shallow equality is the most impactful optimization.** It catches destructured store selectors without requiring component restructuring. Worth doing broadly.
61
- 3. **Lazy load by file size threshold.** Mermaid (2.4MB), markdown renderer (175KB), and xterm (344KB) were obvious candidates. Sub-100KB libraries don't justify the async boundary cost.
62
- 4. **Pagination is non-negotiable for unbounded collections.** Streaming chat creates thousands of messages. Without cap, DOM pressure degrades linearly.
63
- 5. **Code review catches subtle bugs.** The Rules of Hooks violation and race condition were hard to spot in original implementation but obvious in review.
64
-
65
- ## Next Steps
66
-
67
- 1. Commit optimizations with `git commit -m "perf: frontend memory optimization — shallow equality, lazy loading, pagination"`
68
- 2. Test pagination UX on low-end devices to verify load-more doesn't feel janky
69
- 3. Monitor bundle size in CI to catch regression
70
- 4. Document code splitting strategy in `docs/performance.md`
71
-
72
- **Commits:** 26 files modified, 178 insertions, 88 deletions
73
- **Bundle impact:** Initial +0% (495KB), lazy vendor chunks defer 3.5MB to first use
@@ -1,70 +0,0 @@
1
- # Lessons Learned
2
-
3
- Knowledge and gotchas discovered during PPM development.
4
-
5
- ---
6
-
7
- ## Claude Agent SDK
8
-
9
- ### .env poisoning via project cwd
10
-
11
- **Problem**: SDK spawns a CLI process in the project's `cwd`. The CLI auto-loads `.env` via dotenv. If the project has `ANTHROPIC_API_KEY=dummy` or `ANTHROPIC_BASE_URL=http://localhost:...`, the CLI uses those instead of the user's subscription → "Invalid API key" or empty responses with no tool execution.
12
-
13
- **Symptoms**:
14
- - Model returns empty response, no text or tool_use events
15
- - `result.subtype === "error_during_execution"`
16
- - Text response: "Invalid API key · Fix external API key"
17
- - `totalCostUsd: 0` in usage
18
-
19
- **Fix**: Neutralize `ANTHROPIC_*` env vars by setting them to empty string (not deleting — dotenv won't override existing vars):
20
- ```ts
21
- env: {
22
- ...process.env,
23
- ANTHROPIC_API_KEY: "",
24
- ANTHROPIC_BASE_URL: "",
25
- ANTHROPIC_AUTH_TOKEN: "",
26
- },
27
- ```
28
-
29
- **File**: `src/providers/claude-agent-sdk.ts`
30
-
31
- ---
32
-
33
- ### Project-local Claude settings restrict tools
34
-
35
- **Problem**: Projects may have `.claude/settings.local.json` with restrictive `permissions.allow` lists (e.g., only `Bash(python:*)`, `Bash(ls:*)`). Even with `permissionMode: "bypassPermissions"`, the SDK CLI still reads these and restricts available tools.
36
-
37
- **Fix**: Override with explicit empty settings and no setting sources:
38
- ```ts
39
- settings: { permissions: { allow: [], deny: [] } },
40
- settingSources: [],
41
- ```
42
-
43
- ---
44
-
45
- ### Windows: SDK query() hangs — executable: "node" fix
46
-
47
- **Problem**: On Windows + Bun, SDK `query()` yields zero events — appears to hang forever.
48
-
49
- **Root cause**: SDK detects Bun runtime and spawns `child_process.spawn("bun", ["cli.js", ...])`. On Windows, `child_process.spawn("bun")` fails with ENOENT (can't resolve `bun` binary). The error is swallowed internally → no events → looks like a hang.
50
-
51
- **Fix**: Pass `executable: "node"` in SDK query options. Forces SDK to spawn `node cli.js` instead of `bun cli.js`. Node is always in PATH on Windows.
52
-
53
- **File**: `src/providers/claude-agent-sdk.ts` — `queryOptions` in `sendMessage()`
54
-
55
- ---
56
-
57
- ## WebSocket Chat Architecture
58
-
59
- ### Event flow: SDK → Provider → WS → Frontend
60
-
61
- 1. SDK emits: `system` → `stream_event`* → `assistant` → `rate_limit_event` → `user` (tool_result) → `result`
62
- 2. Provider extracts text from `stream_event.event.delta.text` and tool_use from `assistant.message.content`
63
- 3. Provider yields: `text`, `tool_use`, `tool_result`, `usage`, `done`
64
- 4. WS handler sends JSON to frontend
65
-
66
- Key: `stream_event` contains raw API events (`content_block_delta` with `text_delta`). The `assistant` event contains the full message with all content blocks.
67
-
68
- ### tool_result lives in `user` events
69
-
70
- SDK returns tool results as `user` type messages (not `assistant`). Provider fetches them via `getSessionMessages()` after detecting `pendingToolCount > 0`.