@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.
- package/CHANGELOG.md +9 -0
- package/assets/skills/ppm/SKILL.md +1 -1
- package/assets/skills/ppm/references/cli-reference.md +4 -4
- package/assets/skills/ppm/references/http-api.md +1 -1
- package/dist/web/assets/{ai-resource-editor-DfCN7LjR.js → ai-resource-editor-CsossqDO.js} +1 -1
- package/dist/web/assets/{angular-html-DkR4iCth.js → angular-html-CkxY2iBQ.js} +1 -1
- package/dist/web/assets/{angular-ts-DcyL4Chx.js → angular-ts-BePeGkkC.js} +1 -1
- package/dist/web/assets/{apl-BVlrVtjt.js → apl-DBS7PWvB.js} +1 -1
- package/dist/web/assets/architecture-PBZL5I3N-NAS99xy0.js +1 -0
- package/dist/web/assets/{astro-MjJlozLj.js → astro-Clbk1k4h.js} +1 -1
- package/dist/web/assets/{audio-preview-DbFUkIzm.js → audio-preview-DIkokvPM.js} +1 -1
- package/dist/web/assets/{blade-DnJWi1fz.js → blade-BeBsBuGS.js} +1 -1
- package/dist/web/assets/{bsl-DCmJxSIz.js → bsl-DYigT3JZ.js} +1 -1
- package/dist/web/assets/{cairo-C8dDenub.js → cairo-BjpO78wI.js} +1 -1
- package/dist/web/assets/chat-tab-Bh6l253v.js +18 -0
- package/dist/web/assets/click-outside-container-DXZVmhaX.js +1 -0
- package/dist/web/assets/{cobol-DPx_nifl.js → cobol-CpuUx69s.js} +1 -1
- package/dist/web/assets/code-editor-B7F-d4DK.js +10 -0
- package/dist/web/assets/{coffee-DvFzqhgN.js → coffee-FoFd2Cxo.js} +1 -1
- package/dist/web/assets/{conflict-editor-BAAffNdj.js → conflict-editor-Dqm1bkyL.js} +3 -3
- package/dist/web/assets/{cpp-BLJN0umi.js → cpp-CO_nPfdr.js} +1 -1
- package/dist/web/assets/{crystal-BXR-9fGw.js → crystal-D-UygAAF.js} +1 -1
- package/dist/web/assets/{csv-preview-DzhSC0fd.js → csv-preview-CvP4xzug.js} +1 -1
- package/dist/web/assets/data-grid-overlay-editor-CUlFsD-D.js +1 -0
- package/dist/web/assets/database-viewer-5oNTPgjF.js +1 -0
- package/dist/web/assets/{diff-viewer-DvXxlk47.js → diff-viewer-BfWixe_z.js} +1 -1
- package/dist/web/assets/dist-BsziT-tR.js +11 -0
- package/dist/web/assets/{docx-preview-DfjH-dIr.js → docx-preview-CguUoTKe.js} +1 -1
- package/dist/web/assets/{edge-rWOlCmXT.js → edge-BSzxzX11.js} +1 -1
- package/dist/web/assets/{elixir-E7Y82okW.js → elixir-DH1-Mrep.js} +1 -1
- package/dist/web/assets/{elm-DTPGbc-w.js → elm-B0ln5J70.js} +1 -1
- package/dist/web/assets/{erb-DHqLHrE6.js → erb-GIz6NnlZ.js} +1 -1
- package/dist/web/assets/{erlang-Byg0nNiV.js → erlang-B8MgYhib.js} +1 -1
- package/dist/web/assets/esm-CjVeOTNQ.js +2 -0
- package/dist/web/assets/{extension-webview-wuMQ8pD7.js → extension-webview-DTpFt1eL.js} +1 -1
- package/dist/web/assets/{fortran-fixed-form-CY1n0Xf6.js → fortran-fixed-form-D_-TrK6U.js} +1 -1
- package/dist/web/assets/{fsharp-_vEDSCJz.js → fsharp-C9cLCk2b.js} +1 -1
- package/dist/web/assets/{gdresource-B6XT0wAC.js → gdresource-CsZ3lXwY.js} +1 -1
- package/dist/web/assets/{git-commit-Wk9ovq59.js → git-commit-xmq0KqrA.js} +1 -1
- package/dist/web/assets/{git-log-panel-SPPYmbCr.js → git-log-panel-DUX7N5tN.js} +1 -1
- package/dist/web/assets/{git-rebase-DSarGPvK.js → git-rebase-D3O-jsSX.js} +1 -1
- package/dist/web/assets/gitGraph-HDMCJU4V-B4I3L4Sf.js +1 -0
- package/dist/web/assets/glide-data-grid-7vB1SNne.js +138 -0
- package/dist/web/assets/{glimmer-js-CkYI35_P.js → glimmer-js-g74gESrC.js} +1 -1
- package/dist/web/assets/{glimmer-ts-BqmIZcds.js → glimmer-ts-DF4aDWHT.js} +1 -1
- package/dist/web/assets/{glsl-Be-yBCF5.js → glsl-D5LmfW7l.js} +1 -1
- package/dist/web/assets/{graphql-a5DrENHY.js → graphql-_KI4RuXL.js} +1 -1
- package/dist/web/assets/group-chat-tab-CNECY-zg.js +1 -0
- package/dist/web/assets/{hack-BLAg20aD.js → hack-B1NaTC39.js} +1 -1
- package/dist/web/assets/{haml-Dj6bGOQH.js → haml-DDFXadZ4.js} +1 -1
- package/dist/web/assets/{handlebars-dmEa36Oh.js → handlebars-Bp-Jq3K9.js} +1 -1
- package/dist/web/assets/{html-yacZYzSE.js → html-DyB9_5Tj.js} +1 -1
- package/dist/web/assets/{html-derivative-lLi3-RNT.js → html-derivative-CC60wi-3.js} +1 -1
- package/dist/web/assets/{http-1KaxcE4e.js → http-C-9qngH4.js} +1 -1
- package/dist/web/assets/{hurl-ST-dEEZR.js → hurl-BtxgpNDs.js} +1 -1
- package/dist/web/assets/{hxml-CpDtuq__.js → hxml-DOoOS9op.js} +1 -1
- package/dist/web/assets/{image-preview-D_8o6OLx.js → image-preview-CZg6FQ3w.js} +1 -1
- package/dist/web/assets/{index-C1Q59prB.js → index-D2G6kmTs.js} +7 -7
- package/dist/web/assets/index-DCmrZnq0.css +2 -0
- package/dist/web/assets/info-3K5VOQVL-CBbbOe3C.js +1 -0
- package/dist/web/assets/{jinja-Cjw-evAn.js → jinja-cN-150ao.js} +1 -1
- package/dist/web/assets/{jison-DfATMYoY.js → jison-CqjsqPq5.js} +1 -1
- package/dist/web/assets/{julia-DDCaxiqT.js → julia-C-I5m8W4.js} +1 -1
- package/dist/web/assets/{just-CJL529u6.js → just-CgsSW9zs.js} +1 -1
- package/dist/web/assets/keybindings-store-D8Cppv4w.js +1 -0
- package/dist/web/assets/{latex-Zc4EpLpW.js → latex-BFzR9N2d.js} +1 -1
- package/dist/web/assets/{liquid-B_6KMNYS.js → liquid-BWfr-_iC.js} +1 -1
- package/dist/web/assets/{lua-BtS2idK7.js → lua-DsXVun6g.js} +1 -1
- package/dist/web/assets/{markdown-renderer-DVVx3WCU.js → markdown-renderer-CiQkvWP_.js} +3 -3
- package/dist/web/assets/{marko-Wk6LBnck.js → marko-DWBbo09n.js} +1 -1
- package/dist/web/assets/{mdc-cRaXBrzL.js → mdc-CUMe9LOG.js} +1 -1
- package/dist/web/assets/{nextflow-Bos2wvDV.js → nextflow-CoYbADOm.js} +1 -1
- package/dist/web/assets/{nginx-DMlOwzdr.js → nginx-z-JRZREw.js} +1 -1
- package/dist/web/assets/{nim-D2dZQA88.js → nim-Ci4LHyBm.js} +1 -1
- package/dist/web/assets/notification-store-DOGxkWih.js +1 -0
- package/dist/web/assets/{number-overlay-editor-Du_UgiD3.js → number-overlay-editor-lnnuUpPI.js} +1 -1
- package/dist/web/assets/packet-RMMSAZCW-fr8-QSTF.js +1 -0
- package/dist/web/assets/{pdf-preview-HTC73FyK.js → pdf-preview-B6ZqANpw.js} +1 -1
- package/dist/web/assets/{perl-C5-Z6fPn.js → perl-pbDimKOO.js} +1 -1
- package/dist/web/assets/{php-BXNNhkMH.js → php-B003E5v7.js} +1 -1
- package/dist/web/assets/pie-UPGHQEXC-Biu7_Pbb.js +1 -0
- package/dist/web/assets/postgres-viewer-B23xTCSs.js +3 -0
- package/dist/web/assets/{pug-C1zf1yWy.js → pug-AoueAWJo.js} +1 -1
- package/dist/web/assets/{qml-OW58jGpD.js → qml-CepxioQA.js} +1 -1
- package/dist/web/assets/radar-KQ55EAFF-CMtNRpK6.js +1 -0
- package/dist/web/assets/{razor-DzjSaobM.js → razor-lIvU-Gu-.js} +1 -1
- package/dist/web/assets/{rst-RfuihOUW.js → rst-Dn-dwElE.js} +1 -1
- package/dist/web/assets/{ruby-CNO3pli1.js → ruby-DmsD1Iz5.js} +1 -1
- package/dist/web/assets/{sas-DZY5BtXx.js → sas-6IM2P4YP.js} +1 -1
- package/dist/web/assets/{scss--4g-REcN.js → scss-RgYEZQqh.js} +1 -1
- package/dist/web/assets/{settings-store-mWnY4Kt0.js → settings-store-BkSf4SPQ.js} +2 -2
- package/dist/web/assets/settings-tab-D5hAA1bY.js +1 -0
- package/dist/web/assets/{shaderlab-Cu4sBiVn.js → shaderlab-B0MNEwt4.js} +1 -1
- package/dist/web/assets/{shellsession-DWzJfEv7.js → shellsession-F8S4LrQI.js} +1 -1
- package/dist/web/assets/{soy-BnqE-5Ff.js → soy-DDlMbX7u.js} +1 -1
- package/dist/web/assets/{sparql-Ctg__NhZ.js → sparql-kthmGAAe.js} +1 -1
- package/dist/web/assets/{sql-query-editor-CJdpO95g.js → sql-query-editor-BYNM0RRl.js} +1 -1
- package/dist/web/assets/sqlite-viewer-DW9f2Hqj.js +1 -0
- package/dist/web/assets/{stata-Qk2h66XW.js → stata-Tfbew8La.js} +1 -1
- package/dist/web/assets/{surrealql-8QEX7EfH.js → surrealql-C0LIGqRx.js} +1 -1
- package/dist/web/assets/{svelte-D_mubC5-.js → svelte-CfTy8CGF.js} +1 -1
- package/dist/web/assets/{system-monitor-tab-BA9gqJRW.js → system-monitor-tab-B5f4pgdX.js} +1 -1
- package/dist/web/assets/{templ-C1jV0fsO.js → templ-V5H1Sbfy.js} +1 -1
- package/dist/web/assets/{terminal-tab-DWncjHEA.js → terminal-tab-CK3lX-0Y.js} +2 -2
- package/dist/web/assets/{tex-D_StFXy_.js → tex-C3H3uMZf.js} +1 -1
- package/dist/web/assets/treemap-KZPCXAKY-ZYVFjoaN.js +1 -0
- package/dist/web/assets/{ts-tags-B5m47rEm.js → ts-tags-7AXgG5YS.js} +1 -1
- package/dist/web/assets/{twig-C_br6GIl.js → twig-BSyS38T3.js} +1 -1
- package/dist/web/assets/{use-monaco-theme-Ch2jRiGj.js → use-monaco-theme-Jj2OxkAE.js} +1 -1
- package/dist/web/assets/{use-websocket-MvxbuTdy.js → use-websocket-DrDBgIWU.js} +1 -1
- package/dist/web/assets/{vendor-mermaid-DP1CEcGn.js → vendor-mermaid-DGOXKrJC.js} +193 -193
- package/dist/web/assets/{video-preview-rWrNCfZX.js → video-preview-BOHxkwKG.js} +1 -1
- package/dist/web/assets/{vue-DQwCnLdr.js → vue-C4d_br9u.js} +1 -1
- package/dist/web/assets/{vue-html-T_EoGpPJ.js → vue-html-CGdoz4vW.js} +1 -1
- package/dist/web/assets/{vue-vine-DmxLqX50.js → vue-vine-CqNolQlN.js} +1 -1
- package/dist/web/assets/{xml-Bs6Bw8is.js → xml-UmCmu-Od.js} +1 -1
- package/dist/web/assets/{xsl-f5ZNhRCc.js → xsl-DJG6USGh.js} +1 -1
- package/dist/web/index.html +14 -14
- package/dist/web/monacoeditorwork/css.worker.bundle.js +122 -122
- package/dist/web/monacoeditorwork/editor.worker.bundle.js +78 -78
- package/dist/web/monacoeditorwork/html.worker.bundle.js +110 -110
- package/dist/web/monacoeditorwork/json.worker.bundle.js +108 -108
- package/dist/web/monacoeditorwork/ts.worker.bundle.js +81 -81
- package/dist/web/sw.js +1 -1
- package/package.json +1 -1
- package/schemas/ppm-config.schema.json +3 -3
- package/src/cli/commands/init.ts +8 -5
- package/src/providers/claude-agent-sdk-query-options.ts +57 -0
- package/src/providers/claude-agent-sdk.ts +21 -9
- package/src/server/ws/chat.ts +91 -10
- package/src/services/account.service.ts +13 -7
- package/src/services/db.service.ts +31 -1
- package/src/types/api.ts +4 -2
- package/src/types/chat.ts +8 -0
- package/src/types/config.ts +4 -9
- package/src/web/components/chat/chat-tab.tsx +8 -0
- package/src/web/components/chat/message-input.tsx +27 -7
- package/src/web/components/chat/message-list.tsx +48 -3
- package/src/web/components/chat/model-thinking-selector-helpers.ts +33 -0
- package/src/web/components/chat/model-thinking-selector.tsx +189 -0
- package/src/web/components/settings/ai-settings-section.tsx +2 -0
- package/src/web/components/settings/proxy-test-section.tsx +3 -1
- package/src/web/hooks/use-chat.ts +45 -0
- package/dist/web/assets/architecture-PBZL5I3N-CqTF9Xn6.js +0 -1
- package/dist/web/assets/chat-tab-C6nMDb9l.js +0 -18
- package/dist/web/assets/code-editor-C38IIs_y.js +0 -10
- package/dist/web/assets/data-grid-overlay-editor-cOzDcGkl.js +0 -1
- package/dist/web/assets/data-grid-types-CWHnFOc-.js +0 -1
- package/dist/web/assets/database-viewer-DxmL2veb.js +0 -1
- package/dist/web/assets/dist-B5ErTtYs.js +0 -11
- package/dist/web/assets/esm-DU7axMjq.js +0 -2
- package/dist/web/assets/gitGraph-HDMCJU4V-X12vfQ3i.js +0 -1
- package/dist/web/assets/glide-data-grid-BC0AHzMn.js +0 -138
- package/dist/web/assets/group-chat-tab-D20bF8q5.js +0 -1
- package/dist/web/assets/index-CMJ6whqq.css +0 -2
- package/dist/web/assets/info-3K5VOQVL-Bcz-Qhua.js +0 -1
- package/dist/web/assets/keybindings-store-TINaziU9.js +0 -1
- package/dist/web/assets/notification-store-DN8oDV7o.js +0 -1
- package/dist/web/assets/packet-RMMSAZCW-BTwjB70W.js +0 -1
- package/dist/web/assets/pie-UPGHQEXC-Cn-lrQYZ.js +0 -1
- package/dist/web/assets/postgres-viewer-pWjwP3GD.js +0 -3
- package/dist/web/assets/radar-KQ55EAFF-Cmppm_Ia.js +0 -1
- package/dist/web/assets/settings-tab-BoRuss3O.js +0 -1
- package/dist/web/assets/sqlite-viewer-BgewX3tM.js +0 -1
- package/dist/web/assets/treemap-KZPCXAKY-BLWus1wm.js +0 -1
- package/docs/journal/binary-self-upgrade-260724.md +0 -66
- package/nul/docs/claude-agent-sdk-reference.md +0 -780
- package/nul/docs/code-standards.md +0 -1080
- package/nul/docs/codebase-summary.md +0 -916
- package/nul/docs/deployment-guide.md +0 -702
- package/nul/docs/design-guidelines.md +0 -767
- package/nul/docs/extension-development-guide.md +0 -629
- package/nul/docs/journals/260414-1400-ext-git-graph-port-complete.md +0 -147
- package/nul/docs/journals/260414-1452-git-graph-faithful-port.md +0 -144
- package/nul/docs/journals/260414-1810-git-graph-ui-improvements-complete.md +0 -261
- package/nul/docs/journals/260414-2001-bundled-extensions.md +0 -219
- package/nul/docs/journals/260415-frontend-memory-optimization.md +0 -73
- package/nul/docs/lessons-learned.md +0 -70
- package/nul/docs/project-changelog.md +0 -574
- package/nul/docs/project-overview-pdr.md +0 -205
- package/nul/docs/project-roadmap.md +0 -222
- package/nul/docs/system-architecture.md +0 -1961
- package/packages/vscode-compat/node_modules/.bin/tsc.bunx +0 -0
- package/packages/vscode-compat/node_modules/.bin/tsc.exe +0 -0
- package/packages/vscode-compat/node_modules/.bin/tsserver.bunx +0 -0
- package/packages/vscode-compat/node_modules/.bin/tsserver.exe +0 -0
- package/spike-group-channel.mjs +0 -156
- package/spike-group-chat.mjs +0 -181
- /package/dist/web/assets/{abap-tkptwpsK.js → abap-BZ3J5hF3.js} +0 -0
- /package/dist/web/assets/{actionscript-3-Di9TMGwg.js → actionscript-3-CkyGfT-8.js} +0 -0
- /package/dist/web/assets/{ada-CB9F079D.js → ada-CxNLBoe7.js} +0 -0
- /package/dist/web/assets/{andromeeda-Dcl8jpb7.js → andromeeda-BPN5rsDz.js} +0 -0
- /package/dist/web/assets/{apache-D0Nk0qsH.js → apache-C1F5wHL6.js} +0 -0
- /package/dist/web/assets/{apex-mQIoWncD.js → apex-BaNixdO-.js} +0 -0
- /package/dist/web/assets/{api-themes-BdQCjXQk.js → api-themes-84MT-XqR.js} +0 -0
- /package/dist/web/assets/{applescript-C6ljbcsI.js → applescript-Cl_pdcch.js} +0 -0
- /package/dist/web/assets/{ara-WFqRPGPe.js → ara-B6UAE7M2.js} +0 -0
- /package/dist/web/assets/{asciidoc-bNd8w4nf.js → asciidoc-D9c9Twki.js} +0 -0
- /package/dist/web/assets/{asm-BQ1_F580.js → asm-CNmtv7Y9.js} +0 -0
- /package/dist/web/assets/{aurora-x-Ciqs_Dbu.js → aurora-x-C9z-NyzR.js} +0 -0
- /package/dist/web/assets/{awk-GCR-6KZV.js → awk-BfLHEnKa.js} +0 -0
- /package/dist/web/assets/{ayu-dark-DxJXuj99.js → ayu-dark-Bn7trkt_.js} +0 -0
- /package/dist/web/assets/{ayu-light-jvSyJWDV.js → ayu-light-Dpya9hPf.js} +0 -0
- /package/dist/web/assets/{ayu-mirage-Cg3BPO6H.js → ayu-mirage-Cc0jfABD.js} +0 -0
- /package/dist/web/assets/{ballerina-BPz4CrX6.js → ballerina-BtiCmN7T.js} +0 -0
- /package/dist/web/assets/{bat-CSTs2hIG.js → bat-tmFM76zR.js} +0 -0
- /package/dist/web/assets/{beancount-DMateAZX.js → beancount-BjPqRrcH.js} +0 -0
- /package/dist/web/assets/{berry-9lXg0GRM.js → berry-D0SQBxN2.js} +0 -0
- /package/dist/web/assets/{bibtex-DIbqmvFg.js → bibtex-CkjRWQKr.js} +0 -0
- /package/dist/web/assets/{bicep-02WGsoJ8.js → bicep-Bhq28Cxc.js} +0 -0
- /package/dist/web/assets/{bird2-BY0tbu3k.js → bird2-DFGInYb3.js} +0 -0
- /package/dist/web/assets/{c-jMBX_9Je.js → c-CP8cB4k_.js} +0 -0
- /package/dist/web/assets/{c3-B8JVbNjW.js → c3-oRytyeWo.js} +0 -0
- /package/dist/web/assets/{cadence-DUIf1tvL.js → cadence-Inf1rGb7.js} +0 -0
- /package/dist/web/assets/{catppuccin-frappe-FhUCVxex.js → catppuccin-frappe-DAzribQo.js} +0 -0
- /package/dist/web/assets/{catppuccin-latte-CzfrtmgL.js → catppuccin-latte-B6Y_mCCQ.js} +0 -0
- /package/dist/web/assets/{catppuccin-macchiato-6xL0lOtj.js → catppuccin-macchiato-COLbYqVL.js} +0 -0
- /package/dist/web/assets/{catppuccin-mocha-D39-xS3P.js → catppuccin-mocha-DKWaML1B.js} +0 -0
- /package/dist/web/assets/{clarity-D8TeGvoT.js → clarity-_ZLLrrsX.js} +0 -0
- /package/dist/web/assets/{clojure-Dx_acSX7.js → clojure-DWGVCg_P.js} +0 -0
- /package/dist/web/assets/{cmake-CyeYPq8o.js → cmake-Cwh3mug7.js} +0 -0
- /package/dist/web/assets/{codeowners-DrTI0lmI.js → codeowners-BdV6CFYi.js} +0 -0
- /package/dist/web/assets/{codeql-CPkFxVW-.js → codeql-NvupDIDf.js} +0 -0
- /package/dist/web/assets/{common-lisp-B0k-3LTj.js → common-lisp-B-vtBh5k.js} +0 -0
- /package/dist/web/assets/{coq-uygpo7to.js → coq-M8-FTfiZ.js} +0 -0
- /package/dist/web/assets/{csharp-DKUYGfSp.js → csharp-B7Ugdtd-.js} +0 -0
- /package/dist/web/assets/{css-DoOUp7v4.js → css-86k3Z-YA.js} +0 -0
- /package/dist/web/assets/{csv-B3YE13gi.js → csv-BX5XYhfH.js} +0 -0
- /package/dist/web/assets/{csv-parser-CB6bK93y.js → csv-parser-d56Fzpwc.js} +0 -0
- /package/dist/web/assets/{cue-DViO2wvn.js → cue-B7099gQa.js} +0 -0
- /package/dist/web/assets/{cypher-4BMCIW5N.js → cypher-D99mWVIu.js} +0 -0
- /package/dist/web/assets/{d-BT_sTHas.js → d-CFE8oQwh.js} +0 -0
- /package/dist/web/assets/{dark-plus-DVVXu-1N.js → dark-plus-BEeeDwdg.js} +0 -0
- /package/dist/web/assets/{dart-DHz6f6_6.js → dart-HVSWGnI5.js} +0 -0
- /package/dist/web/assets/{dax-ChYCjweK.js → dax-DjDgSJkh.js} +0 -0
- /package/dist/web/assets/{desktop-D6Lt4p04.js → desktop-B5A3i7J1.js} +0 -0
- /package/dist/web/assets/{diff-D8TDe4hP.js → diff-CpTrlaE9.js} +0 -0
- /package/dist/web/assets/{dist-D1CjMuoa.js → dist-BSCgJs-V.js} +0 -0
- /package/dist/web/assets/{docker-Bsp0YbPx.js → docker-xBhmJeHj.js} +0 -0
- /package/dist/web/assets/{dotenv-B_7giSY_.js → dotenv-DKKhLEv5.js} +0 -0
- /package/dist/web/assets/{dracula-TrQL2iB5.js → dracula-CVwQuzra.js} +0 -0
- /package/dist/web/assets/{dracula-soft-n2XOlgh-.js → dracula-soft-CG6mB-lf.js} +0 -0
- /package/dist/web/assets/{dream-maker-CdIEdhpT.js → dream-maker-SC-IdYY3.js} +0 -0
- /package/dist/web/assets/{edit-diff-preview-Cj6-iplb.js → edit-diff-preview-C50i1H63.js} +0 -0
- /package/dist/web/assets/{emacs-lisp-CSbixs6u.js → emacs-lisp-CIBFq6W8.js} +0 -0
- /package/dist/web/assets/{everforest-dark-BuZahZYp.js → everforest-dark-odRT_lec.js} +0 -0
- /package/dist/web/assets/{everforest-light-DPH53z5H.js → everforest-light-or1Voqjl.js} +0 -0
- /package/dist/web/assets/{fennel-B1-K_hlJ.js → fennel-tQd1z3iu.js} +0 -0
- /package/dist/web/assets/{fish-Cy12Dbua.js → fish-DSuZQG0k.js} +0 -0
- /package/dist/web/assets/{fluent-B_82ys8E.js → fluent-D7xI8a8e.js} +0 -0
- /package/dist/web/assets/{fortran-free-form-BRQdNzZF.js → fortran-free-form-BlAtcPd3.js} +0 -0
- /package/dist/web/assets/{gdscript-XBDmLUm9.js → gdscript-VsEQXBPm.js} +0 -0
- /package/dist/web/assets/{gdshader-DhVfB3u4.js → gdshader-iqHMOdwW.js} +0 -0
- /package/dist/web/assets/{genie-X3K29Y49.js → genie-C4XU4g1a.js} +0 -0
- /package/dist/web/assets/{gherkin-DKIx-6cX.js → gherkin-C4nfQzAB.js} +0 -0
- /package/dist/web/assets/{github-dark-Bf7zdp5s.js → github-dark-B_pbG3CC.js} +0 -0
- /package/dist/web/assets/{github-dark-default-DqsBBV11.js → github-dark-default-kFbx7C95.js} +0 -0
- /package/dist/web/assets/{github-dark-dimmed-X2gqRz6w.js → github-dark-dimmed-CpVfQEqs.js} +0 -0
- /package/dist/web/assets/{github-dark-high-contrast-Z7tvbGX4.js → github-dark-high-contrast-DYKqQwZh.js} +0 -0
- /package/dist/web/assets/{github-light-default-B0liF4d4.js → github-light-default-DVHfMPQ2.js} +0 -0
- /package/dist/web/assets/{github-light-BKxt-7zZ.js → github-light-gEYBmKaj.js} +0 -0
- /package/dist/web/assets/{github-light-high-contrast-F4encJwr.js → github-light-high-contrast-ClVJDu-q.js} +0 -0
- /package/dist/web/assets/{gleam-Pz2bHgBB.js → gleam-BLaPu7ft.js} +0 -0
- /package/dist/web/assets/{gn-CgmdNsPU.js → gn-BKgerUyI.js} +0 -0
- /package/dist/web/assets/{gnuplot-qLNF5yZ9.js → gnuplot-cqJuEFb-.js} +0 -0
- /package/dist/web/assets/{go-CSDUNhE7.js → go-B2EHdyD8.js} +0 -0
- /package/dist/web/assets/{groovy-B3NEnOHF.js → groovy-DdImoj8s.js} +0 -0
- /package/dist/web/assets/{gruvbox-dark-hard-DcoftiUX.js → gruvbox-dark-hard-DlwstAds.js} +0 -0
- /package/dist/web/assets/{gruvbox-dark-medium-D1wVSuD8.js → gruvbox-dark-medium-CiYEd1vd.js} +0 -0
- /package/dist/web/assets/{gruvbox-dark-soft-DWpunymH.js → gruvbox-dark-soft-C-wEa4h4.js} +0 -0
- /package/dist/web/assets/{gruvbox-light-hard-rHMvyUdS.js → gruvbox-light-hard-BqYmfna-.js} +0 -0
- /package/dist/web/assets/{gruvbox-light-medium-3O2KiXO7.js → gruvbox-light-medium-CxmfalT2.js} +0 -0
- /package/dist/web/assets/{gruvbox-light-soft-lNlXJPwH.js → gruvbox-light-soft-DGWXXMCB.js} +0 -0
- /package/dist/web/assets/{haskell-aaG3aC0h.js → haskell-H_C_IuVb.js} +0 -0
- /package/dist/web/assets/{haxe-CPcHhUDd.js → haxe-CGNSMpeZ.js} +0 -0
- /package/dist/web/assets/{hcl-CMQNlR_4.js → hcl-B7bSTSQf.js} +0 -0
- /package/dist/web/assets/{hjson-DeuklPFj.js → hjson-DlJ-glQZ.js} +0 -0
- /package/dist/web/assets/{hlsl-BI3hlsaM.js → hlsl-CehW5SJN.js} +0 -0
- /package/dist/web/assets/{horizon-C7-gOcjs.js → horizon-Beabcz2d.js} +0 -0
- /package/dist/web/assets/{horizon-bright-Cxt9bRW7.js → horizon-bright-BC87RXPa.js} +0 -0
- /package/dist/web/assets/{houston-DbF2G7iD.js → houston-Da7RFwUy.js} +0 -0
- /package/dist/web/assets/{hy-DRG6Hs2I.js → hy-m1H70w19.js} +0 -0
- /package/dist/web/assets/{imba-CxKv_2TW.js → imba-MExFsdAA.js} +0 -0
- /package/dist/web/assets/{ini-BiHsyCdO.js → ini-CJy_zmwy.js} +0 -0
- /package/dist/web/assets/{java-D3RZzgDB.js → java-DqDFvJBH.js} +0 -0
- /package/dist/web/assets/{javascript-4FmSqG-T.js → javascript-C3Wyv22X.js} +0 -0
- /package/dist/web/assets/{json-CjB236_E.js → json-DnGBw_DZ.js} +0 -0
- /package/dist/web/assets/{json5-bkfO-Rco.js → json5-CRN-zoN4.js} +0 -0
- /package/dist/web/assets/{jsonc-BwaTeLyv.js → jsonc-CKRUZNRo.js} +0 -0
- /package/dist/web/assets/{jsonl-CfxNSwGd.js → jsonl-CGfD6FrH.js} +0 -0
- /package/dist/web/assets/{jsonnet-CQETCYrp.js → jsonnet-nbFuDj0o.js} +0 -0
- /package/dist/web/assets/{jssm-D5o3Zzdz.js → jssm-D0ShzIqD.js} +0 -0
- /package/dist/web/assets/{jsx-BAMILPLo.js → jsx-D27hbRbs.js} +0 -0
- /package/dist/web/assets/{kanagawa-dragon-BhGVxu3R.js → kanagawa-dragon-Ov3f8K0T.js} +0 -0
- /package/dist/web/assets/{kanagawa-lotus-FH4Y59ro.js → kanagawa-lotus-CLyOqh-g.js} +0 -0
- /package/dist/web/assets/{kanagawa-wave-eilvP9MB.js → kanagawa-wave-Kj3dzabH.js} +0 -0
- /package/dist/web/assets/{kdl-BQ-yvXUK.js → kdl-DFF58Gu4.js} +0 -0
- /package/dist/web/assets/{kotlin-BuCx0-VT.js → kotlin-BM4PKaB4.js} +0 -0
- /package/dist/web/assets/{kusto-DAN_n_Cy.js → kusto-DrvHLCv5.js} +0 -0
- /package/dist/web/assets/{laserwave-Cq2BlxrT.js → laserwave-Db6i6ZkO.js} +0 -0
- /package/dist/web/assets/{lean-Dhq7uXKw.js → lean-D0hEjzwk.js} +0 -0
- /package/dist/web/assets/{less-CxaMQb8j.js → less-BEj4npGG.js} +0 -0
- /package/dist/web/assets/{lib-MIEszzkI.js → lib-CBdlQ75W.js} +0 -0
- /package/dist/web/assets/{light-plus-B4sMAend.js → light-plus-DLIIbDea.js} +0 -0
- /package/dist/web/assets/{llvm-DQ6-B_6Y.js → llvm-DMt6umsO.js} +0 -0
- /package/dist/web/assets/{log-Bb_vqvu7.js → log-BopvdtPW.js} +0 -0
- /package/dist/web/assets/{logo-BzfYv3A_.js → logo-CYSUFPFR.js} +0 -0
- /package/dist/web/assets/{luau-BnAeNR77.js → luau-XC611HNO.js} +0 -0
- /package/dist/web/assets/{make-B6IFuxpC.js → make-BMYZIfBj.js} +0 -0
- /package/dist/web/assets/{markdown-Z0xi77Fn.js → markdown-BLza5nvF.js} +0 -0
- /package/dist/web/assets/{material-theme-1scy1SYn.js → material-theme-Uw27UfJW.js} +0 -0
- /package/dist/web/assets/{material-theme-darker-G-JykXQP.js → material-theme-darker-dfqt8XBY.js} +0 -0
- /package/dist/web/assets/{material-theme-lighter-BtKkCMVq.js → material-theme-lighter-CPtBTblV.js} +0 -0
- /package/dist/web/assets/{material-theme-ocean-irrDC89L.js → material-theme-ocean-BfZgVqC-.js} +0 -0
- /package/dist/web/assets/{material-theme-palenight-Eq5_K4LM.js → material-theme-palenight-DAZoVYg8.js} +0 -0
- /package/dist/web/assets/{matlab-BE3oCXZC.js → matlab-cSzmquiW.js} +0 -0
- /package/dist/web/assets/{mdx-DYiuFTGw.js → mdx-Dq0kW5VM.js} +0 -0
- /package/dist/web/assets/{mermaid-DVlaEvtw.js → mermaid-DoIKF0yS.js} +0 -0
- /package/dist/web/assets/{min-dark-DSkeTpQa.js → min-dark-DyraimDU.js} +0 -0
- /package/dist/web/assets/{min-light-CFv2Q0uF.js → min-light-Co9cbcUv.js} +0 -0
- /package/dist/web/assets/{mipsasm-CiAFuZQ2.js → mipsasm-ph6cKgHn.js} +0 -0
- /package/dist/web/assets/{mojo-ARshcaSQ.js → mojo-BBT0XwmY.js} +0 -0
- /package/dist/web/assets/{monokai-CPTV-SOg.js → monokai-IP0T5Rtg.js} +0 -0
- /package/dist/web/assets/{moonbit-D57B0dZr.js → moonbit-B8cogNXl.js} +0 -0
- /package/dist/web/assets/{move-qgy3G_o9.js → move-DkY26NtM.js} +0 -0
- /package/dist/web/assets/{narrat-CZ3rC-oc.js → narrat-rBs3byG0.js} +0 -0
- /package/dist/web/assets/{nextflow-groovy-BxxIOcI4.js → nextflow-groovy-DkO9wMLP.js} +0 -0
- /package/dist/web/assets/{night-owl-B1ryGCda.js → night-owl-jVR4lFji.js} +0 -0
- /package/dist/web/assets/{night-owl-light-BZvNnvMF.js → night-owl-light-fBYJ7s3U.js} +0 -0
- /package/dist/web/assets/{nix-BVBQi8yv.js → nix-WX9oavu6.js} +0 -0
- /package/dist/web/assets/{nord-3NXw613h.js → nord-Cf7G21Pu.js} +0 -0
- /package/dist/web/assets/{nushell-BMOLRalb.js → nushell-DQdzcJ1H.js} +0 -0
- /package/dist/web/assets/{objective-c-AxruEUgh.js → objective-c-JSO2uvZ-.js} +0 -0
- /package/dist/web/assets/{objective-cpp-cFT0qRsD.js → objective-cpp-CZMGJ9Fb.js} +0 -0
- /package/dist/web/assets/{ocaml-_8JH6O8J.js → ocaml-C4S4NSDo.js} +0 -0
- /package/dist/web/assets/{odin-nwYvR0O6.js → odin-Y2jXCgVq.js} +0 -0
- /package/dist/web/assets/{one-dark-pro-C1LaYJaH.js → one-dark-pro-dVIxuoJY.js} +0 -0
- /package/dist/web/assets/{one-light-B7rMc__c.js → one-light-BQ1IKfD1.js} +0 -0
- /package/dist/web/assets/{openscad-Cwes8bKO.js → openscad-Bddw4I3z.js} +0 -0
- /package/dist/web/assets/{pascal-DMt-6tdZ.js → pascal-BKVXrzC1.js} +0 -0
- /package/dist/web/assets/{pkl-QBTyYQmB.js → pkl-BTd-YRsO.js} +0 -0
- /package/dist/web/assets/{plastic-BTSUp8Fk.js → plastic-eiGvBIxV.js} +0 -0
- /package/dist/web/assets/{plsql-DQv3IFXP.js → plsql-C290tieP.js} +0 -0
- /package/dist/web/assets/{po-CNwZx4tW.js → po-DyDwh0tx.js} +0 -0
- /package/dist/web/assets/{poimandres-8Os7Qequ.js → poimandres-B87zc_g-.js} +0 -0
- /package/dist/web/assets/{polar-b4yK8oD8.js → polar-Cdub1YMT.js} +0 -0
- /package/dist/web/assets/{postcss-sFctwpxx.js → postcss-BcI_3K0v.js} +0 -0
- /package/dist/web/assets/{powerquery-Cg_WrtuN.js → powerquery-OdMrkJSe.js} +0 -0
- /package/dist/web/assets/{powershell-C7Ifz95h.js → powershell-C8auT6xg.js} +0 -0
- /package/dist/web/assets/{prisma-Z52HUJzQ.js → prisma-DIbVv8PA.js} +0 -0
- /package/dist/web/assets/{prolog-DLqW-zR1.js → prolog-DbTOH3Ld.js} +0 -0
- /package/dist/web/assets/{proto-BOIzxCCJ.js → proto-C4Cq2dCD.js} +0 -0
- /package/dist/web/assets/{puppet-De7TjZIf.js → puppet-DJp3uqum.js} +0 -0
- /package/dist/web/assets/{purescript-R76ou1WT.js → purescript-CLsV4rPU.js} +0 -0
- /package/dist/web/assets/{python-Dprm0tNP.js → python-2gBtEza2.js} +0 -0
- /package/dist/web/assets/{qmldir-Clp_jpNw.js → qmldir-DfhULcua.js} +0 -0
- /package/dist/web/assets/{qss-eQPYYzSo.js → qss-DK--VTTV.js} +0 -0
- /package/dist/web/assets/{r-CCcRHIf5.js → r-BArBO2Sa.js} +0 -0
- /package/dist/web/assets/{racket-CzE472yp.js → racket-5mijHsVy.js} +0 -0
- /package/dist/web/assets/{raku-DQwXrTSi.js → raku-ir0suElk.js} +0 -0
- /package/dist/web/assets/{red-KCS6wyop.js → red-DSecpIOT.js} +0 -0
- /package/dist/web/assets/{reg-CcrAddUh.js → reg-Dp30FusS.js} +0 -0
- /package/dist/web/assets/{regexp-DDbud-Ri.js → regexp-DXJnEM_6.js} +0 -0
- /package/dist/web/assets/{rel-99GDgaHp.js → rel-Dr483ozj.js} +0 -0
- /package/dist/web/assets/{riscv-Dm2eNv0R.js → riscv-ZfBy5IA1.js} +0 -0
- /package/dist/web/assets/{ron-CzFt0ygH.js → ron-ZJ_CljGP.js} +0 -0
- /package/dist/web/assets/{rose-pine-Ck6lCrCP.js → rose-pine-CcW_eJ6G.js} +0 -0
- /package/dist/web/assets/{rose-pine-dawn-vtALRJNj.js → rose-pine-dawn-v2l_UF-j.js} +0 -0
- /package/dist/web/assets/{rose-pine-moon-DPto8qXw.js → rose-pine-moon-CNXkwf3D.js} +0 -0
- /package/dist/web/assets/{rosmsg-NtS6429H.js → rosmsg-BMYMVW84.js} +0 -0
- /package/dist/web/assets/{rust-BjIXvF9h.js → rust-BR-zJh5q.js} +0 -0
- /package/dist/web/assets/{sass-CQ23wf5E.js → sass-BukPOBFz.js} +0 -0
- /package/dist/web/assets/{scala-LfKLM143.js → scala-DUFY7D6D.js} +0 -0
- /package/dist/web/assets/{scheme-D3SLBXlF.js → scheme-Dl-dNNxQ.js} +0 -0
- /package/dist/web/assets/{sdbl-ODRd2rGN.js → sdbl-DdmlQhia.js} +0 -0
- /package/dist/web/assets/{shellscript-3KB1G_oA.js → shellscript-UyhrvGcd.js} +0 -0
- /package/dist/web/assets/{slack-dark-DTtyWmIy.js → slack-dark-Cv6Szr-q.js} +0 -0
- /package/dist/web/assets/{slack-ochin-Bu0PApk3.js → slack-ochin-V6Ii3lAm.js} +0 -0
- /package/dist/web/assets/{smalltalk-haMT-Sbe.js → smalltalk-BUCv5G91.js} +0 -0
- /package/dist/web/assets/{snazzy-light-DXJzefE9.js → snazzy-light-B67a78qi.js} +0 -0
- /package/dist/web/assets/{solarized-dark-B6LyYa18.js → solarized-dark-ccWnfYyA.js} +0 -0
- /package/dist/web/assets/{solarized-light-QLADebkv.js → solarized-light-C3WyRO5I.js} +0 -0
- /package/dist/web/assets/{solidity-mzfq1aDc.js → solidity-BFbRPNi_.js} +0 -0
- /package/dist/web/assets/{splunk-CyH4RWBp.js → splunk-zdpwCJLE.js} +0 -0
- /package/dist/web/assets/{sql-CWVlT5D3.js → sql-B2IPUsfz.js} +0 -0
- /package/dist/web/assets/{ssh-config-DNvQJ1Qx.js → ssh-config-Co4cXifq.js} +0 -0
- /package/dist/web/assets/{stylus-ByQQdtmf.js → stylus-CmI75XY8.js} +0 -0
- /package/dist/web/assets/{swift-D1cpY4ow.js → swift-Dfks9YQI.js} +0 -0
- /package/dist/web/assets/{synthwave-84-BDF_-QiW.js → synthwave-84-B3LERzNS.js} +0 -0
- /package/dist/web/assets/{system-verilog-BYrkMydC.js → system-verilog-BFvldiwl.js} +0 -0
- /package/dist/web/assets/{systemd-CQm3zyK0.js → systemd-Cu4Vvgbu.js} +0 -0
- /package/dist/web/assets/{talonscript-DMW5CzE1.js → talonscript-Bnq32pUB.js} +0 -0
- /package/dist/web/assets/{tasl-BhFzMCr2.js → tasl-Nwe2K3J1.js} +0 -0
- /package/dist/web/assets/{tcl-D7VEAF-9.js → tcl-zOnpywrl.js} +0 -0
- /package/dist/web/assets/{terraform-DdT5A0Vy.js → terraform-Bc9Vj-n3.js} +0 -0
- /package/dist/web/assets/{tokyo-night-WGLMM6Q9.js → tokyo-night-9_KyM8M2.js} +0 -0
- /package/dist/web/assets/{toml-CZ7ipXHZ.js → toml-ByH-fxOY.js} +0 -0
- /package/dist/web/assets/{tsv-B1zVvoTr.js → tsv-DrCnDClP.js} +0 -0
- /package/dist/web/assets/{tsx-D4HwRUBq.js → tsx-B8LafSYr.js} +0 -0
- /package/dist/web/assets/{turtle-B4r8KEJH.js → turtle-DuyP_QCJ.js} +0 -0
- /package/dist/web/assets/{typescript-BnHhxMtp.js → typescript-BTBJb5RD.js} +0 -0
- /package/dist/web/assets/{typespec-DP2q46GT.js → typespec-DdOFo7M5.js} +0 -0
- /package/dist/web/assets/{typst-DFsD_yaD.js → typst-LYvnBWQu.js} +0 -0
- /package/dist/web/assets/{use-blob-url-DpDVcTeK.js → use-blob-url-CpyRr7Cx.js} +0 -0
- /package/dist/web/assets/{v-Bji8hSVT.js → v-BuBYA1_x.js} +0 -0
- /package/dist/web/assets/{vala-D3TIgGmU.js → vala-vRIBYYe3.js} +0 -0
- /package/dist/web/assets/{vb-DvcxFS2q.js → vb-DwGi-IYM.js} +0 -0
- /package/dist/web/assets/{vendor-xterm-DfNMj6xt.js → vendor-xterm-i6SHFTfU.js} +0 -0
- /package/dist/web/assets/{verilog-Dy7cF35d.js → verilog-6B1X4G2-.js} +0 -0
- /package/dist/web/assets/{vesper-BzjwUv9J.js → vesper-Dw1y_Ae7.js} +0 -0
- /package/dist/web/assets/{vhdl-DuFnFNmW.js → vhdl-DK8JwBzJ.js} +0 -0
- /package/dist/web/assets/{viml-yAPgKlbz.js → viml-BTKIEIqm.js} +0 -0
- /package/dist/web/assets/{vitesse-black-oSSQdyIZ.js → vitesse-black-BqqolhEg.js} +0 -0
- /package/dist/web/assets/{vitesse-dark-BZxwPihB.js → vitesse-dark-B9JL5WQA.js} +0 -0
- /package/dist/web/assets/{vitesse-light-uIigycvt.js → vitesse-light-DYJKj2se.js} +0 -0
- /package/dist/web/assets/{vyper-CX3NAxm5.js → vyper-D-jDI3WH.js} +0 -0
- /package/dist/web/assets/{wasm-Coen1MOg.js → wasm-1-GlNdpk.js} +0 -0
- /package/dist/web/assets/{wasm-D9td37qO.js → wasm-BBW4WmT2.js} +0 -0
- /package/dist/web/assets/{wenyan-lwNIHgk6.js → wenyan-B6cM7sDO.js} +0 -0
- /package/dist/web/assets/{wgsl-DQAzCfog.js → wgsl-FaHGQgko.js} +0 -0
- /package/dist/web/assets/{wikitext-DTXmt5NE.js → wikitext-DtIyPUrk.js} +0 -0
- /package/dist/web/assets/{wit-Bdw_7WDH.js → wit-BMVRif5Y.js} +0 -0
- /package/dist/web/assets/{wolfram-DqyHDZ07.js → wolfram-DQsCGohn.js} +0 -0
- /package/dist/web/assets/{yaml-CPXhdByd.js → yaml-C-Va56Gt.js} +0 -0
- /package/dist/web/assets/{zenscript-6s_i5zek.js → zenscript-DdobKGI-.js} +0 -0
- /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
|