@hienlh/ppm 0.18.12 → 0.18.14
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/AGENTS.md +17 -5
- package/CHANGELOG.md +27 -0
- package/CLAUDE.md +3 -0
- package/README.md +6 -6
- 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 +19 -1
- package/dist/web/assets/{adaptive-context-menu-DGCKKeTy.js → adaptive-context-menu-DCZtgOL7.js} +1 -1
- package/dist/web/assets/{ai-resource-editor-BOHHTTe7.js → ai-resource-editor-D5CPBg06.js} +1 -1
- package/dist/web/assets/{ai-settings-section-BigC_nZR.js → ai-settings-section-DY-t1bK8.js} +1 -1
- package/dist/web/assets/{angular-html-BYPaydvh.js → angular-html-CTvM4ulF.js} +1 -1
- package/dist/web/assets/{angular-ts-Bb4AMKlk.js → angular-ts-B_vSkjco.js} +1 -1
- package/dist/web/assets/api-client-BogqsFna.js +1 -0
- package/dist/web/assets/{api-settings-Bd3M4YpI.js → api-settings-B2iNXQ0c.js} +1 -1
- package/dist/web/assets/api-settings-DRF9oYkn.js +1 -0
- package/dist/web/assets/{api-themes-Cpx419SL.js → api-themes-DrWnJbhs.js} +1 -1
- package/dist/web/assets/{apl-DB2VjFCS.js → apl-DywzTry0.js} +1 -1
- package/dist/web/assets/architecture-PBZL5I3N-nw5-j_I_.js +1 -0
- package/dist/web/assets/{astro-BeoJdVpk.js → astro-1JaRgaSb.js} +1 -1
- package/dist/web/assets/{audio-preview-BgFuTn-0.js → audio-preview-DAuGvOiK.js} +1 -1
- package/dist/web/assets/{blade-Cf2q1sPf.js → blade-CDeeJWBb.js} +1 -1
- package/dist/web/assets/{bsl-W1kOaNpu.js → bsl-BfgoPVYR.js} +1 -1
- package/dist/web/assets/{button-5zTrkEoN.js → button-tNy0ba3y.js} +1 -1
- package/dist/web/assets/{cairo-BoAZFcje.js → cairo-C26gNwWW.js} +1 -1
- package/dist/web/assets/chat-tab-IcnU3nqQ.js +15 -0
- package/dist/web/assets/{cobol-B0Nm7RXj.js → cobol-D92nBnON.js} +1 -1
- package/dist/web/assets/code-editor-Dno5Srkm.js +10 -0
- package/dist/web/assets/{coffee-BakMn3on.js → coffee-CIWH40R1.js} +1 -1
- package/dist/web/assets/{conflict-editor-BUs5k9q_.js → conflict-editor-CDp0I3mD.js} +1 -1
- package/dist/web/assets/{context-menu-Bq92km4s.js → context-menu-BO1c9jKy.js} +1 -1
- package/dist/web/assets/{cpp-BRAJQHK2.js → cpp-DOrBqXCn.js} +1 -1
- package/dist/web/assets/{crystal-kqqO3zkK.js → crystal-BNKqmHux.js} +1 -1
- package/dist/web/assets/{csv-preview-ByoDgLAZ.js → csv-preview-D4svNDAq.js} +1 -1
- package/dist/web/assets/{data-grid-overlay-editor-Brkf9z41.js → data-grid-overlay-editor-BqV0AxZg.js} +1 -1
- package/dist/web/assets/{database-viewer-Btc3h8Yu.js → database-viewer-BCvv_Bwf.js} +1 -1
- package/dist/web/assets/{dialog-DwtGlowE.js → dialog-DcLGDwaX.js} +1 -1
- package/dist/web/assets/diff-viewer-D41fCFAi.js +4 -0
- package/dist/web/assets/{docx-preview-DAD_vg59.js → docx-preview-DfaQn9v7.js} +1 -1
- package/dist/web/assets/{edge-Cq1ZKZuE.js → edge-Dbjp42Pt.js} +1 -1
- package/dist/web/assets/{edit-diff-preview-B_VE7ppQ.js → edit-diff-preview-BqcUuFCc.js} +1 -1
- package/dist/web/assets/{elixir-BM_JoJRk.js → elixir-na3b1pYy.js} +1 -1
- package/dist/web/assets/{elm-Dw7oO08Y.js → elm-_Nalil1R.js} +1 -1
- package/dist/web/assets/{erb-CfKOGAfk.js → erb-CW_7dubf.js} +1 -1
- package/dist/web/assets/{erlang-DlDmGVeE.js → erlang-DmZ7Zzb0.js} +1 -1
- package/dist/web/assets/{esm-DGAP0GFh.js → esm-CwyBetO1.js} +1 -1
- package/dist/web/assets/explorer-body-DB1L30pa.js +2 -0
- package/dist/web/assets/explorer-window-content-Cwlt3C3I.js +1 -0
- package/dist/web/assets/{extension-store-Cpfh2vMm.js → extension-store-DUaZINyC.js} +1 -1
- package/dist/web/assets/{extension-webview-B2OnjuCu.js → extension-webview-BW_mccb3.js} +1 -1
- package/dist/web/assets/{file-store-aOERIEo-.js → file-store-yReVbR8q.js} +1 -1
- package/dist/web/assets/{fortran-fixed-form-XnAhQWxS.js → fortran-fixed-form-DB2A8L4-.js} +1 -1
- package/dist/web/assets/{fsharp-CdNvy0PG.js → fsharp-BYHrti7z.js} +1 -1
- package/dist/web/assets/{gdresource-DxuG5i8i.js → gdresource-D5GBin40.js} +1 -1
- package/dist/web/assets/{git-commit-3lMonsur.js → git-commit-CUiOBoIL.js} +1 -1
- package/dist/web/assets/{git-log-panel-Co0PBPHC.js → git-log-panel-C1QDkmgl.js} +1 -1
- package/dist/web/assets/{git-rebase-N8Z9kIMf.js → git-rebase-DOxGnpdw.js} +1 -1
- package/dist/web/assets/gitGraph-HDMCJU4V-C1xf87gN.js +1 -0
- package/dist/web/assets/glide-data-grid-Dz8lx6n2.js +138 -0
- package/dist/web/assets/{glimmer-js-Dp9OXiib.js → glimmer-js-Begy4UT7.js} +1 -1
- package/dist/web/assets/{glimmer-ts-CDVKBcDj.js → glimmer-ts-rPApRY8N.js} +1 -1
- package/dist/web/assets/{glsl-DPJxI4us.js → glsl-wrbPvrBL.js} +1 -1
- package/dist/web/assets/{graphql-BrFhaQQl.js → graphql-Cu4-NR__.js} +1 -1
- package/dist/web/assets/group-chat-tab-DFwr-pig.js +1 -0
- package/dist/web/assets/{hack-BzXbDMlA.js → hack-Ddo93XKD.js} +1 -1
- package/dist/web/assets/{haml-CPpkX0s5.js → haml-BFX_1i8j.js} +1 -1
- package/dist/web/assets/{handlebars-BqrApy52.js → handlebars-5gFKA4H5.js} +1 -1
- package/dist/web/assets/{html-DmjUl-OA.js → html-C06I-zeO.js} +1 -1
- package/dist/web/assets/{html-derivative-Cnd6XFR5.js → html-derivative-e5JLAFZF.js} +1 -1
- package/dist/web/assets/{http-DMLWYun2.js → http-CrAAhSU7.js} +1 -1
- package/dist/web/assets/{hurl-CKkCVxbj.js → hurl-T1V3SX9T.js} +1 -1
- package/dist/web/assets/{hxml-CAx19TtQ.js → hxml-B056LLKN.js} +1 -1
- package/dist/web/assets/{image-preview-DHUoylQ1.js → image-preview-DWyuCYT3.js} +1 -1
- package/dist/web/assets/index-DWpNR3nB.css +2 -0
- package/dist/web/assets/index-oUKV5nIA.js +52 -0
- package/dist/web/assets/info-3K5VOQVL-C2z7FTDe.js +1 -0
- package/dist/web/assets/{input-DcEk7mA3.js → input-DouJ9Zvt.js} +1 -1
- package/dist/web/assets/{jinja-BmB9YN9l.js → jinja-DGdtRh43.js} +1 -1
- package/dist/web/assets/{jison-BaVsKKpw.js → jison-Ah6QobPS.js} +1 -1
- package/dist/web/assets/{julia-BgVBLveX.js → julia-BJeGOK0K.js} +1 -1
- package/dist/web/assets/{just-C2ENIbl9.js → just-iw9oRs7j.js} +1 -1
- package/dist/web/assets/{keybindings-store-BGIyqXHI.js → keybindings-store-0Wqfa7Qp.js} +1 -1
- package/dist/web/assets/keybindings-store-d54pv2NK.js +1 -0
- package/dist/web/assets/{latex-BiDIWxKL.js → latex-DHjj5hyN.js} +1 -1
- package/dist/web/assets/{liquid-NxpapreE.js → liquid-B-FFecDc.js} +1 -1
- package/dist/web/assets/{lua-DVepQvwH.js → lua-DDianJp_.js} +1 -1
- package/dist/web/assets/{markdown-renderer-DlcDhgrF.js → markdown-renderer-BHiUhQN8.js} +3 -3
- package/dist/web/assets/markdown-renderer-CnE36_gd.js +1 -0
- package/dist/web/assets/{marko-CJ2606Xl.js → marko-BW5SBVng.js} +1 -1
- package/dist/web/assets/{mdc-D2bjqclE.js → mdc-B9gL9bjl.js} +1 -1
- package/dist/web/assets/{media-url-H17XJF-I.js → media-url-DUK-k0bB.js} +1 -1
- package/dist/web/assets/{mobile-bottom-sheet-g-r2hCFa.js → mobile-bottom-sheet-CJ7ApOkI.js} +1 -1
- package/dist/web/assets/mobile-explorer-sheet-BzjlS1Xn.js +1 -0
- package/dist/web/assets/{nextflow-BtJwUbfF.js → nextflow-dTluY6qy.js} +1 -1
- package/dist/web/assets/{nginx-j4gyIhHE.js → nginx-DlwghGI-.js} +1 -1
- package/dist/web/assets/{nim-ClH_gjP5.js → nim-N9jddb5D.js} +1 -1
- package/dist/web/assets/notification-store-C7UBqxYP.js +1 -0
- package/dist/web/assets/{number-overlay-editor-C1EqJnWq.js → number-overlay-editor-BVXM7aAs.js} +1 -1
- package/dist/web/assets/{overview-panel-vTeeJYVZ.js → overview-panel-DCCDmtCQ.js} +1 -1
- package/dist/web/assets/packet-RMMSAZCW-DQUxN0wU.js +1 -0
- package/dist/web/assets/{panel-store-BSnkjgHt.js → panel-store-B4rijFKN.js} +1 -1
- package/dist/web/assets/{pdf-preview-CqFGRY0Z.js → pdf-preview-D7yLmAZW.js} +1 -1
- package/dist/web/assets/{perl-C9H7X7CT.js → perl-CkmpYKa_.js} +1 -1
- package/dist/web/assets/{php-Bx2U-cQ_.js → php-BwZ3KDPo.js} +1 -1
- package/dist/web/assets/pie-UPGHQEXC-BOr9ek4Q.js +1 -0
- package/dist/web/assets/{postgres-viewer-DHwcQucn.js → postgres-viewer--CRN1fvO.js} +3 -3
- package/dist/web/assets/{process-table-BGRJNlpn.js → process-table-CXC10GSy.js} +1 -1
- package/dist/web/assets/{project-store--nvQiy75.js → project-store-BuY7rxn_.js} +1 -1
- package/dist/web/assets/{pug-Cw74sKsE.js → pug-B3rBPqQo.js} +1 -1
- package/dist/web/assets/{qml-BXD94Eqz.js → qml-BfDbWFmg.js} +1 -1
- package/dist/web/assets/radar-KQ55EAFF-DSErxZFb.js +1 -0
- package/dist/web/assets/{razor-DZ0-Ge0S.js → razor-B1ww1r38.js} +1 -1
- package/dist/web/assets/{rst-Dtdh0QUj.js → rst-C0MSq6m-.js} +1 -1
- package/dist/web/assets/{ruby-BC51BW2Q.js → ruby-ClIZ1wb3.js} +1 -1
- package/dist/web/assets/{run-in-terminal-Sd3KyjN4.js → run-in-terminal-4efbW2Xv.js} +1 -1
- package/dist/web/assets/{sas-BN8i4qOU.js → sas-DR0j3o4_.js} +1 -1
- package/dist/web/assets/{scroll-area-0gljZ6lF.js → scroll-area-ZP8wcwTI.js} +1 -1
- package/dist/web/assets/{scss-H-QtA7Rz.js → scss-Vh3JLayR.js} +1 -1
- package/dist/web/assets/{send-to-chat-u6m8l-rH.js → send-to-chat-BNrEpAyC.js} +1 -1
- package/dist/web/assets/{settings-store-CHY6Kzin.js → settings-store-OLJE7dPH.js} +2 -2
- package/dist/web/assets/{settings-tab-IY6K1MiZ.js → settings-tab-B1rvHFc6.js} +1 -1
- package/dist/web/assets/settings-tab-BUlmPJ2w.js +1 -0
- package/dist/web/assets/{shaderlab-CalNsj_x.js → shaderlab-0rHRnQ18.js} +1 -1
- package/dist/web/assets/{shellsession-BFrcoR8x.js → shellsession-Dxdw6D8c.js} +1 -1
- package/dist/web/assets/{soy-CNbku7vP.js → soy-BHlSNj1y.js} +1 -1
- package/dist/web/assets/{sparql-BN_orcVp.js → sparql-B2QaPpni.js} +1 -1
- package/dist/web/assets/{sql-query-editor-C6pC3I8l.js → sql-query-editor-R_iKjPP9.js} +1 -1
- package/dist/web/assets/{sqlite-viewer-DTr5PzUb.js → sqlite-viewer-b2onA0SP.js} +1 -1
- package/dist/web/assets/{stata-C6a5Ijzq.js → stata-CwIxjsEJ.js} +1 -1
- package/dist/web/assets/{surrealql-ClplI_HY.js → surrealql-C6vo-rp-.js} +1 -1
- package/dist/web/assets/{svelte-DNm-UNXB.js → svelte-LLdJ6rlH.js} +1 -1
- package/dist/web/assets/{switch-DKvKya9y.js → switch-DV-BDjyk.js} +1 -1
- package/dist/web/assets/system-monitor-body-DPYQlBEt.js +2 -0
- package/dist/web/assets/system-monitor-tab-CPQdWv27.js +1 -0
- package/dist/web/assets/{system-monitor-window-content-BUqRsPK2.js → system-monitor-window-content-BPif0azo.js} +1 -1
- package/dist/web/assets/tab-host-window-content-BnAN6m4K.js +1 -0
- package/dist/web/assets/{tab-store-CJuJRapl.js → tab-store-tFnyPmm4.js} +1 -1
- package/dist/web/assets/team-member-sheet-Bu2wG1sm.js +2 -0
- package/dist/web/assets/{team-member-window-content-T4Q5JI-G.js → team-member-window-content-BSyU-5Uc.js} +1 -1
- package/dist/web/assets/{templ-CSdqVobu.js → templ-CJGvhEP5.js} +1 -1
- package/dist/web/assets/{terminal-tab-Bb2rZegQ.js → terminal-tab-Ncor0Rfu.js} +3 -3
- package/dist/web/assets/{tex-DzSJ4kcZ.js → tex-psXWhc4t.js} +1 -1
- package/dist/web/assets/{tool-cards-lhqhrDTT.js → tool-cards-DdVP1wrD.js} +4 -4
- package/dist/web/assets/treemap-KZPCXAKY-C17p0LQw.js +1 -0
- package/dist/web/assets/{ts-tags-C28w3bTg.js → ts-tags-D5Ar_ZCO.js} +1 -1
- package/dist/web/assets/{twig-i5jY3QXB.js → twig-vJgGC-qY.js} +1 -1
- package/dist/web/assets/{use-blob-url-Dsq9OjTh.js → use-blob-url-BOVGWg9F.js} +1 -1
- package/dist/web/assets/use-coarse-long-press-BmI_GVW5.js +1 -0
- package/dist/web/assets/use-monaco-theme-BshnLXoY.js +1 -0
- package/dist/web/assets/{use-open-team-member-DkiEjFYE.js → use-open-team-member-CY3wOdWL.js} +1 -1
- package/dist/web/assets/{use-websocket-B8R50f7f.js → use-websocket-B7xjNsyD.js} +1 -1
- package/dist/web/assets/{vendor-mermaid-By4AVvJY.js → vendor-mermaid-999ksD45.js} +1 -1
- package/dist/web/assets/video-preview-7F72sRwf.js +1 -0
- package/dist/web/assets/{vue-Ceyet_lv.js → vue-BWngFyav.js} +1 -1
- package/dist/web/assets/{vue-html-GuU7g_hg.js → vue-html-BN5ZLu-H.js} +1 -1
- package/dist/web/assets/{vue-vine-CxXoaJr2.js → vue-vine-BZHnO8yV.js} +1 -1
- package/dist/web/assets/window-pip-registry-BnYU83LE.js +1 -0
- package/dist/web/assets/{window-store-CsEW6jiE.js → window-store-CQ1lghvv.js} +1 -1
- package/dist/web/assets/{xml-CbqOVhkP.js → xml-DS2beZHp.js} +1 -1
- package/dist/web/assets/{xsl-KfAmCauy.js → xsl-Ciiku1Bq.js} +1 -1
- package/dist/web/index.html +47 -45
- package/dist/web/sw.js +1 -1
- package/docs/architecture/ai-chat-and-providers.md +309 -0
- package/docs/architecture/data-and-storage.md +356 -0
- package/docs/architecture/extensions.md +496 -0
- package/docs/architecture/integrations.md +214 -0
- package/docs/architecture/workspace-and-ui.md +399 -0
- package/docs/claude-agent-sdk-reference.md +1 -1
- package/docs/code-patterns.md +361 -0
- package/docs/code-standards.md +8 -358
- package/docs/codebase-subsystems.md +364 -0
- package/docs/codebase-summary.md +34 -379
- package/docs/deployment-guide.md +280 -490
- package/docs/design-guidelines.md +4 -3
- package/docs/lessons-learned.md +27 -10
- package/docs/project-changelog.md +18 -806
- package/docs/project-overview-pdr.md +117 -111
- package/docs/project-roadmap.md +89 -133
- package/docs/system-architecture.md +77 -1826
- package/package.json +2 -2
- package/src/cli/commands/autostart.ts +2 -2
- package/src/cli/commands/config-cmd.ts +12 -3
- package/src/cli/commands/status.ts +3 -2
- package/src/cli/commands/stop.ts +32 -4
- package/src/server/index.ts +17 -3
- package/src/server/routes/chat-unread.ts +36 -0
- package/src/server/routes/named-tunnel.ts +132 -0
- package/src/server/routes/tunnel.ts +13 -0
- package/src/server/ws/chat.ts +5 -2
- package/src/services/autostart-register.ts +47 -29
- package/src/services/cloud.service.ts +26 -1
- package/src/services/config-secret-keys.ts +48 -0
- package/src/services/config.service.ts +1 -1
- package/src/services/db.service.ts +62 -12
- package/src/services/edge-forwarder.ts +191 -191
- package/src/services/extension-rpc-handlers.ts +9 -1
- package/src/services/file-watcher/watch-tree.ts +67 -33
- package/src/services/file-watcher.service.ts +28 -10
- package/src/services/fs-credential-path-guard.ts +103 -0
- package/src/services/fs-path-guard.service.ts +14 -66
- package/src/services/named-tunnel/cloudflare-dns-api.ts +40 -0
- package/src/services/named-tunnel/cloudflare-zone-api.ts +28 -0
- package/src/services/named-tunnel/cloudflared-cert.ts +95 -0
- package/src/services/named-tunnel/cloudflared-exec.ts +50 -0
- package/src/services/named-tunnel/cloudflared-login-helpers.ts +98 -0
- package/src/services/named-tunnel/cloudflared-login.service.ts +182 -0
- package/src/services/named-tunnel/hostname-rules.ts +58 -0
- package/src/services/named-tunnel/login-output-parser.ts +36 -0
- package/src/services/named-tunnel/named-tunnel-args.ts +110 -0
- package/src/services/named-tunnel/named-tunnel-config.ts +67 -0
- package/src/services/named-tunnel/named-tunnel-probe-state.ts +95 -0
- package/src/services/named-tunnel/named-tunnel-readiness.ts +59 -0
- package/src/services/named-tunnel/named-tunnel-runtime.ts +42 -0
- package/src/services/named-tunnel/named-tunnel-setup-confirm.ts +98 -0
- package/src/services/named-tunnel/named-tunnel-setup.service.ts +191 -0
- package/src/services/supervisor-state.ts +67 -2
- package/src/services/supervisor.ts +454 -157
- package/src/services/tunnel-registry-parse.ts +27 -0
- package/src/services/tunnel-registry.service.ts +2 -15
- package/src/services/tunnel.service.ts +12 -3
- package/src/services/windows-process-tree.ts +351 -351
- package/src/types/config.ts +31 -0
- package/src/web/app.tsx +5 -0
- package/src/web/components/chat/chat-history-bar.tsx +95 -98
- package/src/web/components/chat/chat-toolbar-overflow-menu.tsx +57 -0
- package/src/web/components/chat/session-debug-dialog.tsx +35 -27
- package/src/web/components/floating-window/floating-window.tsx +8 -1
- package/src/web/components/floating-window/open-tab-in-pip.ts +78 -0
- package/src/web/components/floating-window/window-pip-registry.ts +46 -0
- package/src/web/components/layout/cloud-share-named-tunnel-row.tsx +111 -0
- package/src/web/components/layout/cloud-share-popover.tsx +56 -14
- package/src/web/components/layout/tab-pop-out-menu-item.tsx +25 -2
- package/src/web/components/shared/connection-lost-overlay.tsx +44 -5
- package/src/web/components/tunnels/named-tunnel/hostname-validation.ts +14 -0
- package/src/web/components/tunnels/named-tunnel/named-tunnel-copy.ts +96 -0
- package/src/web/components/tunnels/named-tunnel/named-tunnel-hostname-field.tsx +51 -0
- package/src/web/components/tunnels/named-tunnel/named-tunnel-login-step.tsx +105 -0
- package/src/web/components/tunnels/named-tunnel/named-tunnel-section.tsx +159 -0
- package/src/web/components/tunnels/named-tunnel/named-tunnel-setup-content.tsx +197 -0
- package/src/web/components/tunnels/named-tunnel/named-tunnel-setup-popup.tsx +57 -0
- package/src/web/components/tunnels/named-tunnel/named-tunnel-step-reducer.ts +191 -0
- package/src/web/components/tunnels/named-tunnel/use-named-tunnel-setup.ts +212 -0
- package/src/web/components/tunnels/tunnel-manager-tab.tsx +4 -0
- package/src/web/hooks/use-global-events.ts +3 -1
- package/src/web/lib/api-named-tunnel.ts +54 -0
- package/src/web/lib/last-known-local-url.ts +23 -0
- package/src/web/stores/notification-store.ts +20 -1
- package/dist/web/assets/api-client-DTZEgjBQ.js +0 -1
- package/dist/web/assets/api-settings-kd1j4iR8.js +0 -1
- package/dist/web/assets/architecture-PBZL5I3N-8dCMT9r7.js +0 -1
- package/dist/web/assets/chat-tab-E3bf_V8X.js +0 -15
- package/dist/web/assets/code-editor-BUlM2gXk.js +0 -10
- package/dist/web/assets/diff-viewer-CZaDnR4w.js +0 -4
- package/dist/web/assets/explorer-body-9aBmyVpZ.js +0 -2
- package/dist/web/assets/explorer-window-content-DRtqoSPA.js +0 -1
- package/dist/web/assets/gitGraph-HDMCJU4V-2e_8dfbs.js +0 -1
- package/dist/web/assets/glide-data-grid-C4_zIneN.js +0 -138
- package/dist/web/assets/group-chat-tab-rOd8J8GC.js +0 -1
- package/dist/web/assets/index-BImUaigO.js +0 -52
- package/dist/web/assets/index-CSfi6DSU.css +0 -2
- package/dist/web/assets/info-3K5VOQVL-BZi1Gha1.js +0 -1
- package/dist/web/assets/keybindings-store-CzV2sPls.js +0 -1
- package/dist/web/assets/markdown-renderer-CcbR33VG.js +0 -1
- package/dist/web/assets/mobile-explorer-sheet-SIwQXlwA.js +0 -1
- package/dist/web/assets/notification-store-DV5QtUTg.js +0 -1
- package/dist/web/assets/packet-RMMSAZCW-o5htEcin.js +0 -1
- package/dist/web/assets/pie-UPGHQEXC-BXAIFSAD.js +0 -1
- package/dist/web/assets/radar-KQ55EAFF-Dbt2Aebl.js +0 -1
- package/dist/web/assets/settings-tab-Dic6TKkU.js +0 -1
- package/dist/web/assets/system-monitor-body-iwGiCns9.js +0 -2
- package/dist/web/assets/system-monitor-tab-DdXQhEel.js +0 -1
- package/dist/web/assets/tab-host-window-content-BnqGPu8a.js +0 -1
- package/dist/web/assets/team-member-sheet-LkAFSCvb.js +0 -2
- package/dist/web/assets/treemap-KZPCXAKY-DUbnl9dz.js +0 -1
- package/dist/web/assets/use-monaco-theme-BZvlsoBv.js +0 -1
- package/dist/web/assets/video-preview-m0-3p7QZ.js +0 -1
- 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/dist/web/assets/{abap-C6nB04tn.js → abap-CjzrhAS2.js} +0 -0
- /package/dist/web/assets/{actionscript-3-Vx4rw2sC.js → actionscript-3-B59Kbl-9.js} +0 -0
- /package/dist/web/assets/{ada-Ccd8vM20.js → ada-B7gItKAE.js} +0 -0
- /package/dist/web/assets/{andromeeda-DnBX5xMg.js → andromeeda-Dy5zcy0Q.js} +0 -0
- /package/dist/web/assets/{apache-B-9_sx0g.js → apache-B6T9jrc0.js} +0 -0
- /package/dist/web/assets/{apex-_wPVBYoL.js → apex-CTsIxDQw.js} +0 -0
- /package/dist/web/assets/{api-client-aQb5hHE5.js → api-client-oY1tC3tM.js} +0 -0
- /package/dist/web/assets/{applescript-CcvD-qr0.js → applescript-DuycKmmb.js} +0 -0
- /package/dist/web/assets/{apply-theme-BeLRfsSu.js → apply-theme-r8tKDrCR.js} +0 -0
- /package/dist/web/assets/{ara-C40Ztoms.js → ara-CISL3599.js} +0 -0
- /package/dist/web/assets/{asciidoc-CybYkJV4.js → asciidoc-BXyE2Lpr.js} +0 -0
- /package/dist/web/assets/{asm-9eOKwzR0.js → asm-y258phtP.js} +0 -0
- /package/dist/web/assets/{aurora-x-B5ZH4t7t.js → aurora-x-Dq3Jc78M.js} +0 -0
- /package/dist/web/assets/{awk-Dqilob-2.js → awk-DxL6XSJv.js} +0 -0
- /package/dist/web/assets/{ayu-dark-CPgRhf5r.js → ayu-dark-DjoK6Evo.js} +0 -0
- /package/dist/web/assets/{ayu-light-Do06Q52f.js → ayu-light-CKKXBLMI.js} +0 -0
- /package/dist/web/assets/{ayu-mirage-_BhxcrxY.js → ayu-mirage-DGXSrrXB.js} +0 -0
- /package/dist/web/assets/{ballerina-DDwK54QW.js → ballerina-DZSXFmUf.js} +0 -0
- /package/dist/web/assets/{bat-BGyGlzGk.js → bat-BNsZk6nY.js} +0 -0
- /package/dist/web/assets/{beancount-CRWBdapI.js → beancount-cPl4gJct.js} +0 -0
- /package/dist/web/assets/{berry-DbSFn2gO.js → berry-DGAodERk.js} +0 -0
- /package/dist/web/assets/{bibtex-QpsV9gm9.js → bibtex-DftVoRif.js} +0 -0
- /package/dist/web/assets/{bicep-CxS8CUve.js → bicep-Suioyyzh.js} +0 -0
- /package/dist/web/assets/{bird2-CuZhQzYR.js → bird2-DjU24I2P.js} +0 -0
- /package/dist/web/assets/{c-9bnDqE3g.js → c-DFi8Y_nN.js} +0 -0
- /package/dist/web/assets/{c3-JMZTrOhA.js → c3-1eSHnH5V.js} +0 -0
- /package/dist/web/assets/{cadence-DsDNayJS.js → cadence-DLLsFwQP.js} +0 -0
- /package/dist/web/assets/{can-open-in-ppm-BJfpynya.js → can-open-in-ppm-in727eFQ.js} +0 -0
- /package/dist/web/assets/{catppuccin-frappe-DYIKXXBe.js → catppuccin-frappe-DDj0JEiY.js} +0 -0
- /package/dist/web/assets/{catppuccin-latte-IYYOnUJ8.js → catppuccin-latte-DPyANHyR.js} +0 -0
- /package/dist/web/assets/{catppuccin-macchiato-BrJ_7mfS.js → catppuccin-macchiato-CO-h8VTT.js} +0 -0
- /package/dist/web/assets/{catppuccin-mocha-gzSu7v7-.js → catppuccin-mocha-BCmbN2IZ.js} +0 -0
- /package/dist/web/assets/{clarity-DLzsC0Hb.js → clarity-C0pYsZjs.js} +0 -0
- /package/dist/web/assets/{clipboard-7fw0Shic.js → clipboard-DBLGKMrH.js} +0 -0
- /package/dist/web/assets/{clojure-DS1BvoTt.js → clojure-JFr6s8iZ.js} +0 -0
- /package/dist/web/assets/{cmake-CDvsJwYp.js → cmake-EEcLEgVy.js} +0 -0
- /package/dist/web/assets/{codeowners-BjsYiflJ.js → codeowners-Deh3Lx0u.js} +0 -0
- /package/dist/web/assets/{codeql-CG-7ARat.js → codeql-C317igT5.js} +0 -0
- /package/dist/web/assets/{common-lisp-DSO1Lbh9.js → common-lisp-DepbATZs.js} +0 -0
- /package/dist/web/assets/{coq-DYdh3oP_.js → coq-MxgxU5ya.js} +0 -0
- /package/dist/web/assets/{csharp-DxEBz5s0.js → csharp-eEFXdsAq.js} +0 -0
- /package/dist/web/assets/{css-dal3Q-8C.js → css-Db-syWW9.js} +0 -0
- /package/dist/web/assets/{csv-CpqjMGiA.js → csv-DHeYcbaq.js} +0 -0
- /package/dist/web/assets/{csv-parser-3umBA4NY.js → csv-parser-_JWMLGl3.js} +0 -0
- /package/dist/web/assets/{cue-DinoJ_5k.js → cue-BmUNowrt.js} +0 -0
- /package/dist/web/assets/{cypher-DzxqmkUW.js → cypher-XjXHgCNS.js} +0 -0
- /package/dist/web/assets/{d-BxNwJuEC.js → d-BWJnZtig.js} +0 -0
- /package/dist/web/assets/{dark-plus-Clmv3V-0.js → dark-plus-Db7umas1.js} +0 -0
- /package/dist/web/assets/{dart-BWVtXD35.js → dart-DSI4HYh1.js} +0 -0
- /package/dist/web/assets/{data-grid-types-B4n51Fck.js → data-grid-types-CfVHh9gv.js} +0 -0
- /package/dist/web/assets/{dax-DsImuWgJ.js → dax-yw1JsAni.js} +0 -0
- /package/dist/web/assets/{desktop-B0jJuG2r.js → desktop-C2QO4RvD.js} +0 -0
- /package/dist/web/assets/{diff-CWqAAxoE.js → diff-Drt8aEyp.js} +0 -0
- /package/dist/web/assets/{dist-B-EXdSYE.js → dist-DNRvhVdz.js} +0 -0
- /package/dist/web/assets/{dist-C0eNNfbt.js → dist-VBxOHLmN.js} +0 -0
- /package/dist/web/assets/{docker-CYFCJdIL.js → docker-ByDKbmLl.js} +0 -0
- /package/dist/web/assets/{dotenv-CKDUjURg.js → dotenv-BkfOLytR.js} +0 -0
- /package/dist/web/assets/{dracula-CSoPspHE.js → dracula-DAmrm-Un.js} +0 -0
- /package/dist/web/assets/{dracula-soft-BuFjw5L1.js → dracula-soft-BUOEnKqR.js} +0 -0
- /package/dist/web/assets/{dream-maker-B6PdDRZu.js → dream-maker-DQBIfSiO.js} +0 -0
- /package/dist/web/assets/{emacs-lisp-CMcXvD0G.js → emacs-lisp-Blh5kBD3.js} +0 -0
- /package/dist/web/assets/{everforest-dark-cU8-wYzi.js → everforest-dark-CEzhDxHq.js} +0 -0
- /package/dist/web/assets/{everforest-light-KhorllqK.js → everforest-light-CPk_5Khm.js} +0 -0
- /package/dist/web/assets/{external-link-B8BynhvY.js → external-link-B6Hl0U4X.js} +0 -0
- /package/dist/web/assets/{fennel-BCELZK87.js → fennel-B1MT_EBZ.js} +0 -0
- /package/dist/web/assets/{file-exclamation-point-CZ4DiR75.js → file-exclamation-point-JzhTU2TX.js} +0 -0
- /package/dist/web/assets/{fish-BQc0y_jy.js → fish-C_HGcewt.js} +0 -0
- /package/dist/web/assets/{fluent-BTINnwF6.js → fluent-Dp1Iclmx.js} +0 -0
- /package/dist/web/assets/{folder-symlink-B8XrtvQK.js → folder-symlink-Dx1hOk8X.js} +0 -0
- /package/dist/web/assets/{format-bytes-WVcFxJuT.js → format-bytes-53WBtyi2.js} +0 -0
- /package/dist/web/assets/{fortran-free-form-BQim9wDz.js → fortran-free-form-B_-UA4XC.js} +0 -0
- /package/dist/web/assets/{gdscript-03w5u8un.js → gdscript-Bm_JpjS_.js} +0 -0
- /package/dist/web/assets/{gdshader-Dp2daNzU.js → gdshader-C_PNmfYU.js} +0 -0
- /package/dist/web/assets/{genie-CoNcjPiD.js → genie-B5rmR2TF.js} +0 -0
- /package/dist/web/assets/{gherkin-NrPOSPQL.js → gherkin-BTJ34TJ9.js} +0 -0
- /package/dist/web/assets/{github-dark-z4RE9ZqA.js → github-dark-DOkNVj9H.js} +0 -0
- /package/dist/web/assets/{github-dark-default-DOKw-1cI.js → github-dark-default-DTsmiyVo.js} +0 -0
- /package/dist/web/assets/{github-dark-dimmed-DJRNMkEA.js → github-dark-dimmed-CjbxAe9s.js} +0 -0
- /package/dist/web/assets/{github-dark-high-contrast-Bj7jJ_Gs.js → github-dark-high-contrast-r_M8F_k7.js} +0 -0
- /package/dist/web/assets/{github-light-B4k_yMFu.js → github-light-BzfxyMyb.js} +0 -0
- /package/dist/web/assets/{github-light-default-BHc-Uzhs.js → github-light-default-BOqiBIy5.js} +0 -0
- /package/dist/web/assets/{github-light-high-contrast-CHisIywL.js → github-light-high-contrast-DQzBrDM4.js} +0 -0
- /package/dist/web/assets/{gleam-CfbypZ4q.js → gleam-BWmuAtD8.js} +0 -0
- /package/dist/web/assets/{gn-YoAjyhJa.js → gn-CNQPjiZW.js} +0 -0
- /package/dist/web/assets/{gnuplot-xVkc1f1c.js → gnuplot-BlHjcPMe.js} +0 -0
- /package/dist/web/assets/{go-GPCwP3Gu.js → go-Bn8Ba9uz.js} +0 -0
- /package/dist/web/assets/{groovy-Crh4Yww9.js → groovy-C1Y1_F4V.js} +0 -0
- /package/dist/web/assets/{gruvbox-dark-hard-BluUFuDS.js → gruvbox-dark-hard-DueOsHav.js} +0 -0
- /package/dist/web/assets/{gruvbox-dark-medium-Cxk1FWQp.js → gruvbox-dark-medium-DaQjD538.js} +0 -0
- /package/dist/web/assets/{gruvbox-dark-soft-CHXMiFmj.js → gruvbox-dark-soft-CbbX2WOm.js} +0 -0
- /package/dist/web/assets/{gruvbox-light-hard-B6eKPjAD.js → gruvbox-light-hard-E2M70ljZ.js} +0 -0
- /package/dist/web/assets/{gruvbox-light-medium-pDwMm1ut.js → gruvbox-light-medium-B_DDLY6h.js} +0 -0
- /package/dist/web/assets/{gruvbox-light-soft-Cxu6kHqK.js → gruvbox-light-soft-2SZmyC1F.js} +0 -0
- /package/dist/web/assets/{haskell-C6JKHjbK.js → haskell-D8DeoXtG.js} +0 -0
- /package/dist/web/assets/{haxe-BuBNdF0a.js → haxe-BmZm7B0W.js} +0 -0
- /package/dist/web/assets/{hcl-DZpDdGj2.js → hcl-CKnBM3ng.js} +0 -0
- /package/dist/web/assets/{hjson-CBkhYRuo.js → hjson-Ct9t4-ci.js} +0 -0
- /package/dist/web/assets/{hlsl-C5nMxnp9.js → hlsl-BZSASBqS.js} +0 -0
- /package/dist/web/assets/{horizon-VAFvA6R6.js → horizon-CzX1AZ08.js} +0 -0
- /package/dist/web/assets/{horizon-bright-BC0xn7T3.js → horizon-bright-CCVNeRIP.js} +0 -0
- /package/dist/web/assets/{houston-BxrUivmz.js → houston-DBlJN7xc.js} +0 -0
- /package/dist/web/assets/{hy-DLtOXoaH.js → hy-Dyc6h6Xb.js} +0 -0
- /package/dist/web/assets/{image-gallery-Gnf7TdCR.js → image-gallery-DujlrjOC.js} +0 -0
- /package/dist/web/assets/{imba-BdpFXM2W.js → imba-Bauru7s2.js} +0 -0
- /package/dist/web/assets/{ini-BInJO_T0.js → ini-SjdwtaTp.js} +0 -0
- /package/dist/web/assets/{java-Dxuddnkb.js → java-D2r0ocpf.js} +0 -0
- /package/dist/web/assets/{javascript-CVamJfLY.js → javascript-y-lof7iP.js} +0 -0
- /package/dist/web/assets/{json-BLZ0ozYk.js → json-DO4LSx5A.js} +0 -0
- /package/dist/web/assets/{json5-BnXzmMKs.js → json5-BEwWf-W3.js} +0 -0
- /package/dist/web/assets/{jsonc-CSgkSga7.js → jsonc-OBEFv7gP.js} +0 -0
- /package/dist/web/assets/{jsonl-CY5W2nF2.js → jsonl-DOyW4Mg3.js} +0 -0
- /package/dist/web/assets/{jsonnet-CEJYH3sF.js → jsonnet-BL5R2CpP.js} +0 -0
- /package/dist/web/assets/{jssm-CsJc7Uhk.js → jssm-ksPusAyg.js} +0 -0
- /package/dist/web/assets/{jsx-jCiRaHU7.js → jsx-B6XEu6O-.js} +0 -0
- /package/dist/web/assets/{kanagawa-dragon-DfoA_GxX.js → kanagawa-dragon-JBVe_ji_.js} +0 -0
- /package/dist/web/assets/{kanagawa-lotus-BOLYJpWd.js → kanagawa-lotus-ChprO68_.js} +0 -0
- /package/dist/web/assets/{kanagawa-wave-DfKlbT1G.js → kanagawa-wave-D_uB_R0Q.js} +0 -0
- /package/dist/web/assets/{kdl-CmssIFTi.js → kdl-pf5B8N_m.js} +0 -0
- /package/dist/web/assets/{kotlin-BRsNgp6x.js → kotlin-BdF0METC.js} +0 -0
- /package/dist/web/assets/{kusto-T8X9jUab.js → kusto-BneVP-OU.js} +0 -0
- /package/dist/web/assets/{laserwave-DkJMVJ8Z.js → laserwave-C4-UPIyG.js} +0 -0
- /package/dist/web/assets/{lean-C65KGVPq.js → lean-BN6Jdymq.js} +0 -0
- /package/dist/web/assets/{less-exIPdDlf.js → less-Cx-fdlDC.js} +0 -0
- /package/dist/web/assets/{lib-mC1NZfuw.js → lib-CMuBa85c.js} +0 -0
- /package/dist/web/assets/{libesm-DSutUtl1.js → libesm-BB74PRsH.js} +0 -0
- /package/dist/web/assets/{light-plus-DiHUXAZt.js → light-plus-DFnnn_iL.js} +0 -0
- /package/dist/web/assets/{llvm-CJBnEzFM.js → llvm-BGxtW0Nw.js} +0 -0
- /package/dist/web/assets/{loader-circle-gSPVxfvH.js → loader-circle-Dpqcv0eS.js} +0 -0
- /package/dist/web/assets/{lock-Did-87UV.js → lock-DldbT31x.js} +0 -0
- /package/dist/web/assets/{log-DxMyUMuP.js → log-kQb4eJnj.js} +0 -0
- /package/dist/web/assets/{logo-CC9NKzca.js → logo-DqAzaq7s.js} +0 -0
- /package/dist/web/assets/{luau-Bw10I6zf.js → luau-Dc2cp-zS.js} +0 -0
- /package/dist/web/assets/{make-C_6M90m6.js → make-DYg9dwaJ.js} +0 -0
- /package/dist/web/assets/{markdown-bR9_R-LF.js → markdown-O4EPpS3K.js} +0 -0
- /package/dist/web/assets/{material-theme-BUx2Qujn.js → material-theme-ClP8yfQ2.js} +0 -0
- /package/dist/web/assets/{material-theme-darker-CRJrPgKm.js → material-theme-darker-LOK55hGu.js} +0 -0
- /package/dist/web/assets/{material-theme-lighter-CUAYppPa.js → material-theme-lighter-j72tzZqi.js} +0 -0
- /package/dist/web/assets/{material-theme-ocean-DuINF1fg.js → material-theme-ocean-C19LKClA.js} +0 -0
- /package/dist/web/assets/{material-theme-palenight-W6_icGCj.js → material-theme-palenight-DJ5tN2ax.js} +0 -0
- /package/dist/web/assets/{matlab-rfqn_b3z.js → matlab-DQNZ_NU8.js} +0 -0
- /package/dist/web/assets/{mdx-Bh1B_YOJ.js → mdx-CJayB7XK.js} +0 -0
- /package/dist/web/assets/{mermaid-Dxf6Ya2k.js → mermaid-Cb0TRX92.js} +0 -0
- /package/dist/web/assets/{min-dark-CivZ2L0h.js → min-dark-CWM8Bo-m.js} +0 -0
- /package/dist/web/assets/{min-light-B1Ykqtma.js → min-light-BBR1sjS2.js} +0 -0
- /package/dist/web/assets/{mipsasm-DynHaM0d.js → mipsasm-Jc7u7YSS.js} +0 -0
- /package/dist/web/assets/{mojo-Clw5PbGH.js → mojo-CTB0cutd.js} +0 -0
- /package/dist/web/assets/{monitor-Dv8vn_6O.js → monitor-4vWfqzuN.js} +0 -0
- /package/dist/web/assets/{monokai-DFIooFZT.js → monokai-CvM_YNKx.js} +0 -0
- /package/dist/web/assets/{moonbit-DnBSZWGM.js → moonbit-CbFEfYYM.js} +0 -0
- /package/dist/web/assets/{move-CCcL2PfL.js → move-BT38p0kT.js} +0 -0
- /package/dist/web/assets/{narrat-BDarg5Lk.js → narrat-55QZ_kOG.js} +0 -0
- /package/dist/web/assets/{nextflow-groovy-DrZOeCNW.js → nextflow-groovy-Bg8peyqg.js} +0 -0
- /package/dist/web/assets/{night-owl-BnZZCK7v.js → night-owl-DzS77iPK.js} +0 -0
- /package/dist/web/assets/{night-owl-light-CEwBsVHS.js → night-owl-light-DER7fGnx.js} +0 -0
- /package/dist/web/assets/{nix-amCzOPMR.js → nix-BSI8YesN.js} +0 -0
- /package/dist/web/assets/{nord-BIs2BC6q.js → nord-9bn7iNWo.js} +0 -0
- /package/dist/web/assets/{nushell-Y02fo4yw.js → nushell-qDVZn_lw.js} +0 -0
- /package/dist/web/assets/{objective-c-7xOZtWW1.js → objective-c-Blf-ATos.js} +0 -0
- /package/dist/web/assets/{objective-cpp-eVtjUvVB.js → objective-cpp-Bz8bAq47.js} +0 -0
- /package/dist/web/assets/{ocaml-Bi6ZwqG4.js → ocaml-B9heAsc3.js} +0 -0
- /package/dist/web/assets/{odin-8xf1Y0S9.js → odin-BaFYnOwO.js} +0 -0
- /package/dist/web/assets/{one-dark-pro-hVv-_y_b.js → one-dark-pro-D6B_hSe-.js} +0 -0
- /package/dist/web/assets/{one-light-CJJ3MtHt.js → one-light-Ba-f0wyk.js} +0 -0
- /package/dist/web/assets/{openscad-B2HcywLk.js → openscad-UvYyL2MK.js} +0 -0
- /package/dist/web/assets/{pascal-C7fllV_7.js → pascal-B4-qvEoG.js} +0 -0
- /package/dist/web/assets/{pkl-qvLC1IWP.js → pkl-B146nqGx.js} +0 -0
- /package/dist/web/assets/{plastic-BT1wHZv2.js → plastic-L38t-Id3.js} +0 -0
- /package/dist/web/assets/{play-4MZi1Axp.js → play-CpCAoQRZ.js} +0 -0
- /package/dist/web/assets/{plsql-1MsmdmJD.js → plsql-ItOG5Cca.js} +0 -0
- /package/dist/web/assets/{plus-BhMZqFsN.js → plus-BR0qewJI.js} +0 -0
- /package/dist/web/assets/{po-BigskytD.js → po-imiCTaNX.js} +0 -0
- /package/dist/web/assets/{poimandres-DuklniF7.js → poimandres-Bu6sIba9.js} +0 -0
- /package/dist/web/assets/{polar-e2pjN_sp.js → polar-CTeGoFxV.js} +0 -0
- /package/dist/web/assets/{portal-container-context-Cm5HipFr.js → portal-container-context-a399Hd9F.js} +0 -0
- /package/dist/web/assets/{postcss-DtAeYjWw.js → postcss-jvFe6GNE.js} +0 -0
- /package/dist/web/assets/{powerquery-Cr2PtehI.js → powerquery-D9Dw1hJp.js} +0 -0
- /package/dist/web/assets/{powershell-BxFTGLJ4.js → powershell-CZqvYQtg.js} +0 -0
- /package/dist/web/assets/{prisma-COWJiwdZ.js → prisma-B4D2nO_7.js} +0 -0
- /package/dist/web/assets/{prolog-DFvGKRx6.js → prolog-CQbyUcCF.js} +0 -0
- /package/dist/web/assets/{proto-CcK80lFt.js → proto-Cwpo0cW1.js} +0 -0
- /package/dist/web/assets/{puppet-BF60bZ4F.js → puppet-CKxCwBod.js} +0 -0
- /package/dist/web/assets/{purescript-zL_69MzU.js → purescript-B-MyXMMp.js} +0 -0
- /package/dist/web/assets/{python-CIwKhfb_.js → python-D6QbSR2S.js} +0 -0
- /package/dist/web/assets/{qmldir-CXNe04Lo.js → qmldir-BpTSVcw_.js} +0 -0
- /package/dist/web/assets/{qss-C8lAWe6G.js → qss-DBc4gbpe.js} +0 -0
- /package/dist/web/assets/{r-CL5ZVL3_.js → r-i9jMMi0s.js} +0 -0
- /package/dist/web/assets/{racket-BBfh0uh0.js → racket-BWNaxU7C.js} +0 -0
- /package/dist/web/assets/{raku-o6E8R5Q3.js → raku-fqTZLn7L.js} +0 -0
- /package/dist/web/assets/{react-CBTnT4sY.js → react-X4jUntEf.js} +0 -0
- /package/dist/web/assets/{red-GomRF2Xp.js → red-D-JEcuzA.js} +0 -0
- /package/dist/web/assets/{refresh-cw-B06yaBrW.js → refresh-cw-B9iv7csb.js} +0 -0
- /package/dist/web/assets/{reg-_ffDIvx9.js → reg-BbirlU1S.js} +0 -0
- /package/dist/web/assets/{regexp-Bl5sF65W.js → regexp-D8VTFrtg.js} +0 -0
- /package/dist/web/assets/{rel-DgMdqDuj.js → rel-ByQGKiNM.js} +0 -0
- /package/dist/web/assets/{resolve-theme-CRt_7wpd.js → resolve-theme-Cqb9zWYc.js} +0 -0
- /package/dist/web/assets/{riscv-8b3-Ye4X.js → riscv-B5nqCfLE.js} +0 -0
- /package/dist/web/assets/{ron-DrmU1KHP.js → ron-DOVh_iZR.js} +0 -0
- /package/dist/web/assets/{rose-pine-dawn-DEfhNlFH.js → rose-pine-dawn-B7hkmmWy.js} +0 -0
- /package/dist/web/assets/{rose-pine-C_-E2tF1.js → rose-pine-jp51ZUzi.js} +0 -0
- /package/dist/web/assets/{rose-pine-moon-BdvX3gdn.js → rose-pine-moon-Ff063yLj.js} +0 -0
- /package/dist/web/assets/{rosmsg-B6GhGpd5.js → rosmsg-Cyk7Il8z.js} +0 -0
- /package/dist/web/assets/{rotate-ccw-COXu_9oj.js → rotate-ccw-DnuPzJRE.js} +0 -0
- /package/dist/web/assets/{rust-DmC97M1-.js → rust-DRNM5epF.js} +0 -0
- /package/dist/web/assets/{sass-B0tJOHLM.js → sass-D_cB0-M1.js} +0 -0
- /package/dist/web/assets/{save-CtIGOjmx.js → save-DxonD4y1.js} +0 -0
- /package/dist/web/assets/{scala-n8zaFOXv.js → scala-Crl-1kKS.js} +0 -0
- /package/dist/web/assets/{scheme-BKD9ztBU.js → scheme-DCaWyEJ0.js} +0 -0
- /package/dist/web/assets/{sdbl-D8gB5-rS.js → sdbl-BbXNqwtX.js} +0 -0
- /package/dist/web/assets/{send-BlyNJAzy.js → send-B-t5Mz26.js} +0 -0
- /package/dist/web/assets/{shallow-DYo6goJ4.js → shallow-4zAfs2KW.js} +0 -0
- /package/dist/web/assets/{shellscript-BfXlf_Ao.js → shellscript-BAgksBhW.js} +0 -0
- /package/dist/web/assets/{shield-check-B0iGUiOK.js → shield-check-CdTiK1j2.js} +0 -0
- /package/dist/web/assets/{shield-off-BNLWBhcq.js → shield-off-DuetkXKM.js} +0 -0
- /package/dist/web/assets/{slack-dark-CylEddse.js → slack-dark-GB-ElUW_.js} +0 -0
- /package/dist/web/assets/{slack-ochin-w8wg8vuC.js → slack-ochin-tU6CFD3S.js} +0 -0
- /package/dist/web/assets/{smalltalk-hiAXA64u.js → smalltalk-DSVGUbtL.js} +0 -0
- /package/dist/web/assets/{snazzy-light-BwlV3Xty.js → snazzy-light-DZhi3PoS.js} +0 -0
- /package/dist/web/assets/{solarized-dark-vmNGdykz.js → solarized-dark-D6AMCco7.js} +0 -0
- /package/dist/web/assets/{solarized-light-DGv_0JXq.js → solarized-light-DepuTWSE.js} +0 -0
- /package/dist/web/assets/{solidity-Y7QSH0B1.js → solidity-CsxN618l.js} +0 -0
- /package/dist/web/assets/{splunk-BtgpLjHi.js → splunk-CF1m0Kkv.js} +0 -0
- /package/dist/web/assets/{sql-CRHYhOia.js → sql-DvyMDgrB.js} +0 -0
- /package/dist/web/assets/{ssh-config-DOqSs3au.js → ssh-config-a8sDo-Q8.js} +0 -0
- /package/dist/web/assets/{stylus-crCAEaBT.js → stylus-DCJ-6AjT.js} +0 -0
- /package/dist/web/assets/{swift-eE3rT7TC.js → swift-c-ZFxyPP.js} +0 -0
- /package/dist/web/assets/{synthwave-84-BWy14LBX.js → synthwave-84-9NPgBcuv.js} +0 -0
- /package/dist/web/assets/{system-verilog-DC0-DZM4.js → system-verilog-DPD02IOo.js} +0 -0
- /package/dist/web/assets/{systemd-to5p6N8I.js → systemd-BUr5HRtU.js} +0 -0
- /package/dist/web/assets/{table-Bbc783ko.js → table-FLU8ei8b.js} +0 -0
- /package/dist/web/assets/{talonscript-DoTcU8wm.js → talonscript-BNBQV5YJ.js} +0 -0
- /package/dist/web/assets/{tasl-cNZvUs95.js → tasl-BETjpSyu.js} +0 -0
- /package/dist/web/assets/{tcl-mZE8sZH8.js → tcl-Clp_AZiC.js} +0 -0
- /package/dist/web/assets/{terraform-CqHPpIfu.js → terraform-B0kZ0lim.js} +0 -0
- /package/dist/web/assets/{text-wrap-CBT4Gxtg.js → text-wrap-B05VGRa-.js} +0 -0
- /package/dist/web/assets/{tokyo-night-Tp2rTIZd.js → tokyo-night-oOJ0a7Dk.js} +0 -0
- /package/dist/web/assets/{toml-CU_vscgn.js → toml-DOPCSumy.js} +0 -0
- /package/dist/web/assets/{trash-2-Bk4yYlck.js → trash-2-CTXlTflF.js} +0 -0
- /package/dist/web/assets/{triangle-alert-B8EYecpe.js → triangle-alert-BRq0VAfd.js} +0 -0
- /package/dist/web/assets/{tsv-ik7iFB9D.js → tsv-D6qUGf84.js} +0 -0
- /package/dist/web/assets/{tsx-BMvvMKiv.js → tsx-B6qYhT6O.js} +0 -0
- /package/dist/web/assets/{turtle-DBqKCq9o.js → turtle-C0Rjzw73.js} +0 -0
- /package/dist/web/assets/{typescript-DXJDmMZZ.js → typescript-BiydShEu.js} +0 -0
- /package/dist/web/assets/{typespec-CBseCMtZ.js → typespec-DjmF6Aww.js} +0 -0
- /package/dist/web/assets/{typst-4oY25U9y.js → typst-CPuscfcL.js} +0 -0
- /package/dist/web/assets/{use-is-mobile-D1weanbj.js → use-is-mobile-b94q8RvF.js} +0 -0
- /package/dist/web/assets/{utils-BNRH507E.js → utils-C9OjCrou.js} +0 -0
- /package/dist/web/assets/{v-BXaZ_1oy.js → v-DE4vpLLQ.js} +0 -0
- /package/dist/web/assets/{vala-BImWJE7z.js → vala-CmUF2pS5.js} +0 -0
- /package/dist/web/assets/{vb-CLfj2_sy.js → vb-BvcRoX4b.js} +0 -0
- /package/dist/web/assets/{vendor-xterm-_yyu5n32.js → vendor-xterm-K8kpLxdb.js} +0 -0
- /package/dist/web/assets/{verilog-BWa8Ed2b.js → verilog-BGIzyH3R.js} +0 -0
- /package/dist/web/assets/{vesper-BGj1cg6m.js → vesper-CG7IrHQQ.js} +0 -0
- /package/dist/web/assets/{vhdl-mByK7mlx.js → vhdl-DMSumomw.js} +0 -0
- /package/dist/web/assets/{viml-CugmlW5g.js → viml-Drt7AEmU.js} +0 -0
- /package/dist/web/assets/{vitesse-black-vPdpy9TL.js → vitesse-black-DmsjfN0b.js} +0 -0
- /package/dist/web/assets/{vitesse-dark-BuQK3dUh.js → vitesse-dark-Dl55_WeJ.js} +0 -0
- /package/dist/web/assets/{vitesse-light-B3nz1XL9.js → vitesse-light-Crbv9aGg.js} +0 -0
- /package/dist/web/assets/{vyper-DH_GTIHG.js → vyper-CB7psEJj.js} +0 -0
- /package/dist/web/assets/{wasm-DfVbVJlW.js → wasm-BY1tuM5m.js} +0 -0
- /package/dist/web/assets/{wasm-C-LF9GjX.js → wasm-Dck8KPgP.js} +0 -0
- /package/dist/web/assets/{wenyan-CzQkHyHx.js → wenyan-DhewQ68b.js} +0 -0
- /package/dist/web/assets/{wgsl-Du_M1DW9.js → wgsl-DlmiP456.js} +0 -0
- /package/dist/web/assets/{wikitext-BWN_w5S7.js → wikitext-cQCnqNgE.js} +0 -0
- /package/dist/web/assets/{wit-BR13v5HD.js → wit-S5MaCngB.js} +0 -0
- /package/dist/web/assets/{wolfram-BoXxp_Xl.js → wolfram-Bh8n_9zr.js} +0 -0
- /package/dist/web/assets/{x-nhriOX9o.js → x-YDu4m2Iq.js} +0 -0
- /package/dist/web/assets/{yaml-DpR_EF-d.js → yaml-BoK_17l9.js} +0 -0
- /package/dist/web/assets/{zenscript-C-EdUtUd.js → zenscript-DB3ZFwNJ.js} +0 -0
- /package/dist/web/assets/{zig-BD4eA5nU.js → zig-Bv1BWmfT.js} +0 -0
|
@@ -1,813 +1,25 @@
|
|
|
1
1
|
# PPM Project Changelog
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**The changelog lives at [`../CHANGELOG.md`](../CHANGELOG.md).** That file is the one the release
|
|
4
|
+
process updates (see the release steps in `CLAUDE.md` and `deployment-guide.md`), and the one
|
|
5
|
+
published with each npm release.
|
|
4
6
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
+
This file previously held a second, hand-maintained copy. It fell six versions behind — its last
|
|
8
|
+
entry was v0.13.0 while releases had reached v0.18.x — and it still carried an "Unreleased" section
|
|
9
|
+
listing features that had long since shipped. A changelog that disagrees with the real one is worse
|
|
10
|
+
than no changelog, so the duplicate is gone rather than being repaired.
|
|
7
11
|
|
|
8
|
-
|
|
12
|
+
The old entries remain in git history if you need them:
|
|
9
13
|
|
|
10
|
-
|
|
14
|
+
```bash
|
|
15
|
+
git log --follow -p -- docs/project-changelog.md
|
|
16
|
+
```
|
|
11
17
|
|
|
12
|
-
|
|
13
|
-
- **`ppm export skill`** — self-describe for external AI. Installs a Claude Code skill at `~/.claude/skills/ppm/` (or `<project>/.claude/skills/ppm/` with `--scope project`, or custom `--output <dir>`) so external AI agents can autonomously control PPM via its CLI, HTTP API, and SQLite config DB. Skill package contains `SKILL.md` + `references/{cli-reference,http-api,db-schema,common-tasks}.md`.
|
|
14
|
-
- **Build-time generators** (`scripts/generate-ppm-skill.ts` + `scripts/lib/`): walk the Commander tree for CLI reference and regex-scan `src/server/index.ts` + `src/server/routes/*.ts` for HTTP API reference. Zero-side-effect static introspection.
|
|
15
|
-
- **Runtime generator** (`src/services/skill-export/generate-db-schema.ts`): opens `~/.ppm/ppm.db` readonly via `bun:sqlite` and emits markdown tables per PRAGMA table_info.
|
|
16
|
-
- **Re-install safety**: existing skill files renamed to `<name>.bak-<YYYYMMDDHHmm>` before overwrite; never destructive.
|
|
17
|
-
- **`buildProgram()` export** in `src/index.ts` — the assembled Commander tree without `.parse()`, enabling build-time doc tools.
|
|
18
|
+
## Where to look
|
|
18
19
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
### Added
|
|
27
|
-
- **Native Group-Chat Engine** — Multi-agent shared-channel group chat. A leader agent + members split work, discuss over a shared message bus (sequential @mention-driven turns), and converge to a single final answer, rendered as a team chat.
|
|
28
|
-
- Data model (schema v35): `chat_groups`, `chat_group_members`, `chat_group_messages` (single-table bus keyed by `kind` + JSON `data`, monotonic `seq` for stable ordering).
|
|
29
|
-
- Provider-agnostic turn engine with windowed context + PPM-side naive rolling summary; four termination conditions (leader `DONE:`, max-turns=40, budget cap=$5.0, external Stop) — always emits exactly one `final`.
|
|
30
|
-
- Option A+ transcript archive: member session JSONLs are copied to `~/.ppm/teams/<group>/transcripts/` and the raw files deleted (copy verified before delete) to keep `~/.claude/projects` clean; "view full" reads from the archive.
|
|
31
|
-
- REST `/api/group-chat` (CRUD, feed, message, stop/resume, transcript) + WS `/ws/project/:name/group/:groupId` (live bus stream + reconnect buffer, detached loop).
|
|
32
|
-
- Stop pauses the group mid-turn (cooperative cancel); Resume re-spawns fresh member sessions and re-enters the loop seeded from the durable bus (works even after archive).
|
|
33
|
-
- **Custom Project Avatars** — Set any project's avatar to an uploaded image
|
|
34
|
-
- Upload via desktop right-click menu on project (switcher/bar) or mobile long-press (bottom-sheet) → "Change Image"
|
|
35
|
-
- Client-side resizing: canvas center-crop to square, downscale to 128×128 webp 0.85 quality, max 10MB
|
|
36
|
-
- Storage: content-addressed at `~/.ppm/avatars/<sha256>.webp` for deduplication across projects
|
|
37
|
-
- Endpoints: `POST /api/projects/:name/image` (upload), `GET /api/projects/:name/image` (stream with immutable cache), `DELETE /api/projects/:name/image` (remove)
|
|
38
|
-
- Auth: Token in URL query param enables `<img>` loads when auth enabled; path-traversal protected
|
|
39
|
-
- Rendering: Shared `ProjectAvatar` component displays custom image or fallback to color+initials everywhere (switcher, mobile-nav, bottom-sheet)
|
|
40
|
-
- Lifecycle: Preserved across project rename, cleaned up on project delete, override initialed avatar in all UIs
|
|
41
|
-
- Tests: 9 new route tests in `tests/unit/routes/projects-routes.test.ts`; all 27 pass, typecheck clean
|
|
42
|
-
- Service: `avatar-storage.service.ts` handles SHA256 dedup + disk ops; `resize-image.ts` performs client-side crop/scale
|
|
43
|
-
|
|
44
|
-
- **Chat Live Task Tracker** — Real-time monitoring of Claude's Task* tool execution within chat
|
|
45
|
-
- Backend: `TaskStatusAggregatorService` (`src/services/task-status-aggregator.ts`) — rebuilds task state from session JSONL with `aggregateTasks(messages): TaskItem[]`
|
|
46
|
-
- Backend: New endpoint `GET /api/project/:projectName/chat/sessions/:id/tasks` — returns current tasks (immune to FE pagination); reuses session JSONL path resolution + parsing
|
|
47
|
-
- Frontend: `task-tracker.tsx` component — pinned, collapsible tracker above chat scroll area (collapsed by default); auto-hides when all tasks done/stopped
|
|
48
|
-
- Frontend: `use-tasks.ts` hook — fetches endpoint on Task events (TaskCreate/TaskUpdate/TaskStop), manages fetch gating
|
|
49
|
-
- Tool cards: TaskCreate/TaskUpdate/TaskStop now render human-readable summaries (subject + status badge) instead of raw JSON
|
|
50
|
-
|
|
51
|
-
### Added
|
|
52
|
-
- **Scheduled Agents (cron scheduler)** — periodically wake Claude sessions to work unattended
|
|
53
|
-
- SQLite v31: `schedules` + `schedule_runs` tables; per-job cron expr, project, prompt, permission mode, budgets (max_turns/timeout_ms), snapshot `provider_id`
|
|
54
|
-
- `scheduler-core.ts` (tick 60s, refcounted concurrency guard, skipped-run rows) + `scheduler-runner.ts` (1 persistent session per job, resume-or-create, 32KB head+tail output buffer, wall-clock timeout via `abortQuery`, session rotation at >80% context, Telegram summary via `notificationService.broadcast` offline-gate) + `scheduler-db.service.ts` (helpers, orphan cleanup >2h, 30-day run prune at boot)
|
|
55
|
-
- CLI: `ppm schedule add|list|rm|enable|disable|run-now|runs` (run-now bypasses guard with `wasRunning` warning)
|
|
56
|
-
- REST: `/api/schedules` CRUD + `/:id/run-now` + `/:id/runs` (cron + numeric budget validation)
|
|
57
|
-
- Settings UI: "Scheduled Agents" section — mobile-first (bottom-sheet form, adaptive long-press menu, 44px targets), 10s visibility-gated polling, run history with status pills
|
|
58
|
-
- SDK contract (additive): `done` ChatEvent now carries `costUsd`; `SendMessageOpts` accepts per-call `maxTurns`
|
|
59
|
-
- 34 tests (db/runner/core/routes) + `tests/README.md` Docker bun workflow
|
|
60
|
-
- **Command Palette Filter Chips** — Filter palette results by type with toggle chips
|
|
61
|
-
- Chips appear above results when 2+ groups are available (Actions, Files, Database, Filesystem)
|
|
62
|
-
- Each chip shows group label, icon, and live result count for the current query
|
|
63
|
-
- Toggling a chip includes/excludes that group; multiple chips can be active simultaneously
|
|
64
|
-
- Chips hidden when only one group has results (no filtering value)
|
|
65
|
-
- Mobile-friendly: 44px touch targets, horizontally scrollable chip row
|
|
66
|
-
- Files: `command-palette-filter-chips.tsx` (new presentational component), `command-palette.tsx` (filter state + `availableGroups` + `groupCounts` + `displayItems` logic)
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
- **System Resource Monitor** — Real-time process monitoring with SSE streaming, sidebar status bar, and dedicated System Monitor tab
|
|
70
|
-
- Backend: `ResourceMonitorService` polls `ps` command every 3s, builds process tree from PPM root PID, categorizes processes (server/terminal/ai-tool/build/unknown), maintains 30-min ring buffer (600 snapshots)
|
|
71
|
-
- Backend: SSE streaming route at `GET /api/system/resources/stream` with client count cap (max 5), manual reconnect with exponential backoff
|
|
72
|
-
- Backend: JSON snapshot endpoint at `GET /api/system/resources` + history endpoint at `GET /api/system/resources/history`
|
|
73
|
-
- Backend: Cross-platform support (`ps` on macOS/Linux, graceful skip on Windows native)
|
|
74
|
-
- Frontend: `useResourceMonitor()` hook provides shared EventSource with ref-counted singleton pattern, auto-reconnect, history ring buffer
|
|
75
|
-
- Frontend: Compact resource status bar in sidebar footer showing CPU%/RAM/process count with color-coded CPU thresholds (green <50%, yellow 50-80%, red >80%)
|
|
76
|
-
- Frontend: Full System Monitor tab with grouped processes, collapsible rows, individual process details, canvas-based sparklines (last 200 data points = ~10min)
|
|
77
|
-
- Frontend: Chat session status badges (streaming/idle) pulled from streaming store
|
|
78
|
-
- Frontend: Mobile-responsive layout with compact sparklines, touch-friendly collapsible groups
|
|
79
|
-
- Auth: Token in URL query param for SSE EventSource (standard fetch credentials for auth)
|
|
80
|
-
- Tests: Integration + unit tests for service, routes, hook, and components
|
|
81
|
-
|
|
82
|
-
**Technical Details:**
|
|
83
|
-
- **Files Created:**
|
|
84
|
-
- `src/services/resource-monitor.service.ts` — Process polling, categorization, ring buffer
|
|
85
|
-
- `src/server/routes/resources.ts` — SSE + JSON endpoints, client count tracking
|
|
86
|
-
- `src/web/hooks/use-resource-monitor.ts` — EventSource hook with singleton ref counting
|
|
87
|
-
- `src/web/components/system/resource-status-bar.tsx` — Compact status bar widget
|
|
88
|
-
- `src/web/components/system/system-monitor-tab.tsx` — Full monitoring dashboard
|
|
89
|
-
- `src/web/components/system/sparkline-canvas.tsx` — Canvas-based sparkline renderer
|
|
90
|
-
- `tests/integration/resource-monitor.test.ts` — Service integration tests
|
|
91
|
-
- `tests/integration/resources-route.test.ts` — Route integration tests
|
|
92
|
-
- `tests/integration/use-resource-monitor.test.ts` — Hook integration tests
|
|
93
|
-
- **Files Modified:**
|
|
94
|
-
- `src/server/index.ts` — Mount resources route
|
|
95
|
-
- `src/web/components/layout/tab-content.tsx` — Lazy-load system-monitor tab
|
|
96
|
-
- `src/web/stores/tab-store.ts` — Add "system-monitor" TabType
|
|
97
|
-
- `src/web/components/layout/sidebar.tsx` — Add ResourceStatusBar to footer
|
|
98
|
-
- **Type Changes:**
|
|
99
|
-
- New: `ProcessEntry` = { pid, ppid, cpu, ramMB, command }
|
|
100
|
-
- New: `ResourceGroup` = { type, label, cpu, ramMB, processes[] }
|
|
101
|
-
- New: `ResourceSnapshot` = { timestamp, server, total, groups[] }
|
|
102
|
-
- **Breaking Changes:** None (additive feature)
|
|
103
|
-
- **Performance:** ~50KB ring buffer (negligible), 3s polling lazy-started, SSE capped at 5 concurrent clients
|
|
104
|
-
|
|
105
|
-
### Added (continued)
|
|
106
|
-
- **Draft Messages** — Auto-save chat input as drafts per session
|
|
107
|
-
- Database: Schema v26 migration creates `chat_drafts` table with (project_path, session_id, content, attachments, updated_at) composite key
|
|
108
|
-
- Service: `DraftService` with get/upsert/delete/deleteOrphaned CRUD operations; 50KB content cap with silent truncation
|
|
109
|
-
- API: GET/PUT/DELETE `/chat/drafts/:sessionId` endpoints for draft persistence
|
|
110
|
-
- Hook: `useDraft()` with debounced 1s save, attachment tracking, draft loading + clearing
|
|
111
|
-
- UI: `onContentChange` callback in message-input.tsx triggers draft auto-save when user types
|
|
112
|
-
- Session routing: Drafts stored per session + special `__new__` draft for unsaved sessions
|
|
113
|
-
- Orphan cleanup: `deleteOrphaned()` removes drafts whose sessions no longer exist
|
|
114
|
-
|
|
115
|
-
- **File Compare** — Side-by-side diff viewer for comparing two files or file versions
|
|
116
|
-
- Four triggers: (1) tab right-click "Select for Compare" / "Compare with Selected", (2) file tree right-click (same), (3) command palette "Compare Files...", (4) keyboard shortcut `Mod+Alt+D`
|
|
117
|
-
- Reuses existing `DiffViewer` component + `git-diff` tab type + `/files/compare` API — no new backend endpoints
|
|
118
|
-
- Supports dirty buffer content: unsaved editor changes captured at select-time
|
|
119
|
-
- New zustand store `useCompareStore` persists selection across reload (strips dirty content >500KB to keep localStorage fast)
|
|
120
|
-
- Auto-clears selection on project switch via store subscription
|
|
121
|
-
- New keybinding action `compare-files` with customizable default `Mod+Alt+D` in Settings > Keybindings
|
|
122
|
-
|
|
123
|
-
- **Lazy-Load File Tree + Palette Index** — Instant project opening on large codebases
|
|
124
|
-
- Backend: `GET /api/project/:name/files/list?path=<rel>` for 1-level directory listing with gitignore decoration
|
|
125
|
-
- Backend: `GET /api/project/:name/files/index` for flat full-project index (cached, watcher-invalidated)
|
|
126
|
-
- Filter model: hardcoded defaults ⊂ global config ⊂ per-project override (VS Code style)
|
|
127
|
-
- Settings API: `GET/PATCH /api/settings/files` for global `files.exclude` / `files.searchExclude` / `files.useIgnoreFiles`
|
|
128
|
-
- Project settings: `GET/PATCH /api/project/:name/settings` for per-project override (schema v21: projects.settings JSON)
|
|
129
|
-
- Frontend: File store refactored to lazy-load with AbortController pool; tree auto-expands root only, children load on-demand
|
|
130
|
-
- Command palette + chat file-picker switched from tree-flattening to `fileIndex` for instant search
|
|
131
|
-
- New Settings section: **Files & Search** — global + active-project-scoped settings, glob list editor, `useIgnoreFiles` toggle
|
|
132
|
-
- Gitignored files decorated grey in tree (when `useIgnoreFiles=true`)
|
|
133
|
-
- `/api/project/:name/files/tree` marked @deprecated (still functional)
|
|
134
|
-
|
|
135
|
-
- **Session Tagging** — Per-project tags for organizing chat sessions
|
|
136
|
-
- Database: schema v20 migration creates `project_tags` table with id, project_path, name, color, sort_order; adds `tag_id` FK to `session_metadata`
|
|
137
|
-
- Tag service: `tag.service.ts` with CRUD helpers (create, read, update, delete, bulk assign), session tag enrichment, tag counting
|
|
138
|
-
- API routes: `tag-routes.ts` with GET/POST/PATCH/DELETE endpoints for tag CRUD, default tag management
|
|
139
|
-
- Session tag assignment: PATCH/DELETE endpoints on chat routes, bulk assign endpoint for multi-session tagging
|
|
140
|
-
- Auto-tag new sessions: New sessions auto-assigned to project's default tag if configured
|
|
141
|
-
- UI: Color dots on session rows (8x8px circles showing tag color), tag filter chip bar above session list with count badges
|
|
142
|
-
- Filter bar: "All" chip plus one per tag, client-side filtering integrated with search (AND logic)
|
|
143
|
-
- Tag management: Settings panel (tag-settings-section.tsx) with create/edit/delete/reorder UI, drag-to-reorder on desktop, up/down arrows on mobile
|
|
144
|
-
- Context menu: Right-click session → "Set Tag" submenu with tag list, current tag has checkmark, "Remove tag" option
|
|
145
|
-
- Keyboard shortcuts: Keys 1-4 quickly assign top 4 project tags when history panel open and session focused
|
|
146
|
-
- Bulk operations: Select multiple sessions → floating action bar with tag assignment and bulk endpoint
|
|
147
|
-
- Responsive: Mobile-first design (44x44px touch targets), horizontal chip scroll, bottom sheet context menu, touch-friendly tag management
|
|
148
|
-
|
|
149
|
-
### Technical Details
|
|
150
|
-
- **Database:**
|
|
151
|
-
- Migration v20: Creates `project_tags(id, project_path, name, color, sort_order, created_at)` with UNIQUE(project_path, name)
|
|
152
|
-
- Alters `session_metadata` to add `tag_id INTEGER REFERENCES project_tags(id) ON DELETE SET NULL`
|
|
153
|
-
- Alters `projects` to add `default_tag_id INTEGER REFERENCES project_tags(id) ON DELETE SET NULL`
|
|
154
|
-
- Seeds 4 default tags per project on migration and on new project creation
|
|
155
|
-
- **Files Created:**
|
|
156
|
-
- `src/services/tag.service.ts` — Tag CRUD helpers, session tag enrichment, bulk operations (~150 lines)
|
|
157
|
-
- `src/server/routes/tag-routes.ts` — Tag API endpoints (GET/POST/PATCH/DELETE project tags, default tag) (~100 lines)
|
|
158
|
-
- `src/web/components/settings/tag-settings-section.tsx` — Tag management UI with CRUD, reorder, default toggle (~170 lines)
|
|
159
|
-
- `src/web/components/chat/session-context-menu.tsx` — Extracted context menu content (optional, ~80 lines)
|
|
160
|
-
- `src/web/components/chat/session-bulk-actions.tsx` — Bulk action bar (optional, ~60 lines)
|
|
161
|
-
- **Files Modified:**
|
|
162
|
-
- `src/services/db.service.ts` — Schema v20 migration, bump CURRENT_SCHEMA_VERSION
|
|
163
|
-
- `src/services/project.service.ts` — Call seedDefaultTags() on project add
|
|
164
|
-
- `src/types/chat.ts` — Add ProjectTag interface, tag field to SessionInfo
|
|
165
|
-
- `src/server/routes/chat.ts` — Session tag endpoints (PATCH/DELETE single, PATCH bulk), tag enrichment in GET /sessions, auto-tag on POST /sessions
|
|
166
|
-
- `src/web/components/chat/chat-history-bar.tsx` — Tag filter chip bar, color dots per session, context menu wrapper, keyboard shortcuts, bulk select mode
|
|
167
|
-
- `src/web/components/chat/session-picker.tsx` — Color dots per session
|
|
168
|
-
- `src/web/components/chat/chat-welcome.tsx` — Color dots per recent session
|
|
169
|
-
- `src/web/components/settings/settings-tab.tsx` — Register TagSettingsSection
|
|
170
|
-
- **Type Changes:**
|
|
171
|
-
- New: `ProjectTag` = { id, projectPath, name, color, sortOrder }
|
|
172
|
-
- New: `ChatWsServerMessage` variants for tag updates (future)
|
|
173
|
-
- Updated: `SessionInfo` includes `tag?: { id, name, color } | null`
|
|
174
|
-
- **API Changes:**
|
|
175
|
-
- GET `/projects/:path/tags` → `{ tags: ProjectTag[], counts: Record<number, number> }`
|
|
176
|
-
- POST `/projects/:path/tags` → create tag
|
|
177
|
-
- PATCH `/projects/:path/tags/:id` → update tag (name, color, sortOrder)
|
|
178
|
-
- DELETE `/projects/:path/tags/:id` → delete tag
|
|
179
|
-
- PATCH `/projects/:path/default-tag` → set project default tag
|
|
180
|
-
- PATCH `/chat/sessions/:id/tag` → assign tag to session
|
|
181
|
-
- DELETE `/chat/sessions/:id/tag` → remove tag from session
|
|
182
|
-
- PATCH `/chat/sessions/bulk-tag` → bulk assign tag to multiple sessions (limit 100 per request)
|
|
183
|
-
- **Breaking Changes:** None (additive feature, backward compatible)
|
|
184
|
-
- **Test Coverage:** Integration tests for tag CRUD, session enrichment, API validation (100+ tests)
|
|
185
|
-
|
|
186
|
-
---
|
|
187
|
-
|
|
188
|
-
## [0.11.11] — 2026-04-19
|
|
189
|
-
|
|
190
|
-
### Added
|
|
191
|
-
- **Real-Time Bash Output Streaming** — Stream bash tool output in chat UI while commands run
|
|
192
|
-
- Backend service `BashOutputSpy` monitors bash process via `/proc/PID/fd/1` (Linux/WSL2) and `lsof` (macOS); graceful no-op on native Windows
|
|
193
|
-
- Cross-platform PID discovery using `pgrep -fn` (Linux + macOS)
|
|
194
|
-
- File polling at 100ms intervals captures output lines as they're written
|
|
195
|
-
- New WebSocket message type: `bash_output` with `{ toolUseId, content, lineCount }`
|
|
196
|
-
- Frontend hook `useChat` buffers partial output per toolUseId in ref (no excessive re-renders)
|
|
197
|
-
- ToolCard component auto-expands when streaming and displays line count indicator with animated spinner
|
|
198
|
-
- StreamingBashOutput component with auto-scroll-to-bottom (respects user scroll position)
|
|
199
|
-
- Display truncated to last 200 lines for performance; 500KB frontend memory cap
|
|
200
|
-
- Partial output cleared on `tool_result` or session cleanup; no buffering in reconnect history
|
|
201
|
-
|
|
202
|
-
### Technical Details
|
|
203
|
-
- **Files Created:**
|
|
204
|
-
- `src/services/bash-output-spy.ts` — Cross-platform process monitoring with line-buffering
|
|
205
|
-
- **Files Modified:**
|
|
206
|
-
- `src/types/api.ts` — Added `bash_output` to `ChatWsServerMessage` union
|
|
207
|
-
- `src/server/ws/chat.ts` — Wire spy start/stop into tool_use/tool_result event loop
|
|
208
|
-
- `src/web/hooks/use-chat.ts` — Buffer partial output per toolUseId, expose via ref
|
|
209
|
-
- `src/web/components/chat/message-list.tsx` — Thread bashPartialOutput to ToolCard
|
|
210
|
-
- `src/web/components/chat/tool-cards.tsx` — Render StreamingBashOutput component, auto-expand on streaming
|
|
211
|
-
- **Type Changes:**
|
|
212
|
-
- New: `ChatWsServerMessage` variant = `{ type: "bash_output"; toolUseId: string; content: string; lineCount: number }`
|
|
213
|
-
- Hook return type extended with `bashPartialOutput: RefObject<Map<string, { content: string; lineCount: number }>>`
|
|
214
|
-
- **Breaking Changes:** None (additive feature, backward compatible)
|
|
215
|
-
|
|
216
|
-
---
|
|
217
|
-
|
|
218
|
-
## [Unreleased] — Jira Debug Session Redesign + Frontend Memory Optimization + Git-Graph Stash Management, Rebase, Conflict Resolution + Worktree CRUD
|
|
219
|
-
|
|
220
|
-
### Added
|
|
221
|
-
- **Jira Debug Session Redesign** — Direct Claude session debug replacing bot_task flow with concurrency queue
|
|
222
|
-
- Replaced bot_task-based debug with direct `chatService.sendMessage()` calls (simpler, faster)
|
|
223
|
-
- Concurrency queue: max 2 concurrent sessions globally, max 1 per project (prevents resource exhaustion)
|
|
224
|
-
- Manual "Start Debug" button with editable prompt in results panel (override watcher template)
|
|
225
|
-
- Unread tracking: `read_at` column on `jira_watch_results`, unread badge count in UI
|
|
226
|
-
- WS toast notifications on debug completion (`jira:debug_complete` event)
|
|
227
|
-
- Prompt override support for custom debug instructions per result
|
|
228
|
-
- Result status flow: pending → queued → running → done/failed
|
|
229
|
-
- Timeout protection: 10-minute abort-on-timeout with graceful cleanup
|
|
230
|
-
- AI summary capture: last assistant text (max 500 chars) stored in result
|
|
231
|
-
- Database schema v19: added `read_at` (nullable timestamp), `triggered_by` ("auto"|"manual")
|
|
232
|
-
- New service: `JiraDebugSessionService` with queue management + concurrency limits
|
|
233
|
-
- New component: `JiraDebugPromptDialog` for manual prompt override UI
|
|
234
|
-
- API: `POST /api/jira/results/:id/debug` to trigger debug (with optional prompt)
|
|
235
|
-
|
|
236
|
-
- **Jira Watcher Auto-Debug (v0.9.86+)** — Poll Jira Cloud per-project, auto-debug matched tickets
|
|
237
|
-
- Jira Cloud REST API integration (search, get issue, transitions, metadata discovery)
|
|
238
|
-
- Per-project config (base URL, email, AES-256 token encryption)
|
|
239
|
-
- JQL-based watchers with two modes: debug (queue session) and notify-only (Telegram notification)
|
|
240
|
-
- Configurable poll intervals (30s–60m per watcher, interval clamping)
|
|
241
|
-
- Rate limit aware (tracks Jira API quota, auto-backoff 429 responses)
|
|
242
|
-
- Result tracking (pending/queued/running/done/failed status, AI summary persistence)
|
|
243
|
-
- Prompt templating ({issue_key}, {summary}, {description}, {status}, {priority} substitution)
|
|
244
|
-
- Soft deletes (preserve result history, don't lose tracking)
|
|
245
|
-
- Frontend filter builder UI (projects, issue types, priorities, statuses, custom JQL)
|
|
246
|
-
- CLI commands: `ppm jira config {set,show,remove,test}`, `ppm jira watch {add,list,enable,disable,remove,test,pull}`
|
|
247
|
-
- API routes: /api/jira/config/*, /api/jira/{watchers,results,search,ticket,metadata}
|
|
248
|
-
- 3 SQLite tables (v18): jira_config, jira_watchers, jira_watch_results
|
|
249
|
-
- 44 tests (integration + unit, JQL builder, result sync, credential encryption, rate limiting)
|
|
250
|
-
|
|
251
|
-
- **Frontend Memory & Performance Optimizations** — Reduce re-renders, lazy-load heavy components, code splitting
|
|
252
|
-
- **useShallow pattern:** All destructured Zustand store calls now use `useShallow` (36 usage sites) to prevent re-renders on object mutations
|
|
253
|
-
- **React.memo wrapping:** 10 heavy components memoized (CodeEditor, MessageBubble, ProjectBar, ProjectAvatar, TerminalTab, PanelLayout, Sidebar, StatusBar, StatusBarEntry, TabBar, TreeNode)
|
|
254
|
-
- **Lazy loading:** MarkdownRenderer lazy-loaded from 3 sites, CodeMirror on-demand in postgres-viewer
|
|
255
|
-
- **Dynamic import:** Mermaid loaded on-demand in markdown-code-block (only when needed)
|
|
256
|
-
- **Code splitting:** 5 vendor chunks in vite.config.ts (monaco, mermaid, xterm, markdown, ui libraries) for better caching
|
|
257
|
-
- **Chat pagination:** Message history limited to 50 per page with load-more button
|
|
258
|
-
- **Message cap:** Team activity capped at 500 messages to prevent unbounded growth
|
|
259
|
-
|
|
260
|
-
### Added (Git-Graph)
|
|
261
|
-
- **Git Stash Management** — Toolbar popover for interactive stash operations
|
|
262
|
-
- List all stashes with index, hash (abbreviated), and message
|
|
263
|
-
- Apply/Pop/Drop actions per stash via context menu or action buttons
|
|
264
|
-
- "Stash Changes" button in main toolbar to stash uncommitted work
|
|
265
|
-
- Stash list persisted in RepoInfo and refreshed on uncommitted status updates
|
|
266
|
-
- Keyboard shortcuts for quick access to stash operations
|
|
267
|
-
|
|
268
|
-
- **Interactive Rebase** — Branch context menu + commit history actions
|
|
269
|
-
- "Rebase current branch onto..." option in commit context menu
|
|
270
|
-
- Confirmation dialog shows branch selection and target commit
|
|
271
|
-
- Rebase state detection and progress tracking (e.g., "3/5" for interactive rebase)
|
|
272
|
-
- Continue/Skip/Abort controls in merge state banner during rebase
|
|
273
|
-
|
|
274
|
-
- **Merge/Rebase/Cherry-Pick Conflict Detection** — Visual conflict indicators
|
|
275
|
-
- Detects merge state from .git sentinel files (MERGE_HEAD, REBASE_MERGE, CHERRY_PICK_HEAD)
|
|
276
|
-
- Parses git status UU/AA/DD/AU/UA/DU/UD codes for unmerged entries
|
|
277
|
-
- Conflicted files displayed in "Conflicts" section in uncommitted status
|
|
278
|
-
- Conflict state banner shows merge state type + progress + action buttons (Continue/Skip/Abort)
|
|
279
|
-
- Auto-detects merge state only when conflicts exist (performance optimization)
|
|
280
|
-
|
|
281
|
-
- **Inline Conflict Resolution Editor** — New conflict-editor tab type with Monaco
|
|
282
|
-
- Dedicated `conflict-editor` tab type for visual conflict resolution
|
|
283
|
-
- Monaco-based editor with syntax highlighting per file type (JS/TS/Python/etc.)
|
|
284
|
-
- Conflict regions visually highlighted: green for current, blue for incoming, gray for markers
|
|
285
|
-
- Accept buttons: Accept Current / Accept Incoming / Accept Both (with proper merging)
|
|
286
|
-
- Conflict counter in header: "N conflicts remaining" → "All conflicts resolved" on completion
|
|
287
|
-
- Automatic file save after each resolution; conflict count updates in real-time
|
|
288
|
-
- Parses 3-way conflict markers (<<<<<<, =======, >>>>>>>) and extracts labels (HEAD/branch names)
|
|
289
|
-
|
|
290
|
-
- **Worktree Management** — Full CRUD with project integration
|
|
291
|
-
- Worktree toolbar popover listing all worktrees (with path, branch, HEAD status)
|
|
292
|
-
- Create worktree from commit context menu ("Create Worktree Here...")
|
|
293
|
-
- Remove, prune, and auto-lock operations per worktree
|
|
294
|
-
- Current worktree highlighted with badge and active background
|
|
295
|
-
- Auto-add unregistered worktrees as projects via confirmation dialog
|
|
296
|
-
- Branch-already-exists dialog offers force-replace option for branch conflicts
|
|
297
|
-
- Project switcher integration: switch to worktree branches directly
|
|
298
|
-
|
|
299
|
-
- **Bundled Extensions Support** — Auto-discover extensions from packages/ext-* directories
|
|
300
|
-
- PPM discovers bundled extensions (e.g., ext-git-graph) without manual installation
|
|
301
|
-
- Bundled extensions available out-of-the-box with all PPM instances
|
|
302
|
-
- `ppm ext list` shows "Source" column (bundled/user) for transparency
|
|
303
|
-
- Bundled extension removal protection: prevents accidental deletion, suggests `ppm ext disable` instead
|
|
304
|
-
- User-installed extensions override bundled with same ID (user takes precedence)
|
|
305
|
-
- Extension paths tracked separately for bundled vs node_modules locations
|
|
306
|
-
|
|
307
|
-
- **Git-Graph UI Improvements** — 7 UX refinements + comprehensive git workflow
|
|
308
|
-
- Branch context menu: right-click for checkout/merge/rebase/delete/create operations
|
|
309
|
-
- Double-click checkout: branch labels double-click to switch branches instantly
|
|
310
|
-
- Toast notifications: replaced blocked alert() with inline webview toast elements
|
|
311
|
-
- SVG icons: replaced Unicode symbols (↻⬇🔍⚙🌲📁) with inline Lucide SVG icons
|
|
312
|
-
- Auto-fetch enhancement: added 10-second interval option to dropdown
|
|
313
|
-
- Uncommitted polling: 5-second status refresh to detect working tree changes
|
|
314
|
-
- Interactive UI elements: resizable graph column, branch filter dropdown, tree/list view toggle
|
|
315
|
-
- Git actions: stage/unstage files, commit from webview, stash/reset/clean operations
|
|
316
|
-
- Path traversal validation for security (assertSafePath in RPC handlers)
|
|
317
|
-
- Fallback guards for all tab type handling (unknown tab types safely ignored)
|
|
318
|
-
|
|
319
|
-
- **Extension Error Reporting & Logging** — Silent failure debugging & user feedback
|
|
320
|
-
- Activation error tracking: Map stores `extId → error message` in ExtensionService
|
|
321
|
-
- Error toasts on command failure: "Extension command failed: {error}" displays in UI
|
|
322
|
-
- Timeout UX improved: Fallback UI shows activation error + "Retry" button for quick recovery
|
|
323
|
-
- Breadcrumb logging with tags for debugging: `[ExtService]`, `[ExtHost]`, `[ExtWS]`, `[ext-git-graph]`
|
|
324
|
-
- Console logs track: activation start/success, command routing, failures with context
|
|
325
|
-
- Activation errors included in `contributions:update` message sent to browser on WS connect
|
|
326
|
-
|
|
327
|
-
- **Faithful SVG Graph Rendering** — Port of vscode-git-graph algorithm with deterministic layout
|
|
328
|
-
- Single SVG model with continuous branch paths using Bézier curves
|
|
329
|
-
- Deterministic lane assignment algorithm with greedy color reuse
|
|
330
|
-
- Proper HEAD/stash node rendering (hollow circle for HEAD, nested circles for stash)
|
|
331
|
-
- Shadow lines for visual depth and branch continuity
|
|
332
|
-
- Mobile SVG alignment: gridY matches 44px CSS row height
|
|
333
|
-
- XSS security fix: escHtml applied to parent hashes and file status in detail panel
|
|
334
|
-
- Regex ordering fix in formatCommitMessage for proper URL/mention detection
|
|
335
|
-
- Removed dot alignment bug that forced rows to 29px
|
|
336
|
-
|
|
337
|
-
### Technical Details
|
|
338
|
-
|
|
339
|
-
**Stash/Rebase/Conflict/Worktree Implementation:**
|
|
340
|
-
- **Files Created:**
|
|
341
|
-
- `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
|
|
342
|
-
|
|
343
|
-
- **Files Modified:**
|
|
344
|
-
- `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
|
|
345
|
-
- `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
|
|
346
|
-
- `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
|
|
347
|
-
- `src/web/stores/tab-store.ts` — Added "conflict-editor" as valid TabType
|
|
348
|
-
- `src/web/stores/panel-utils.ts` — Added conflict-editor case to deriveTabId() for metadata-driven tab ID generation
|
|
349
|
-
- `src/web/components/layout/editor-panel.tsx` — Lazy-imported ConflictEditor component with fallback
|
|
350
|
-
- `src/web/components/layout/tab-content.tsx` — Lazy-imported ConflictEditor component with fallback
|
|
351
|
-
- `src/web/components/layout/mobile-nav.tsx` — Added conflict-editor icon (conflict/warning icon)
|
|
352
|
-
- `src/web/components/layout/tab-bar.tsx` — Added conflict-editor icon (conflict/warning icon)
|
|
353
|
-
|
|
354
|
-
- **Services Modified:**
|
|
355
|
-
- `src/services/extension-manifest.ts` — Added discoverBundledManifests() to scan packages/ext-* dirs
|
|
356
|
-
- `src/services/extension.service.ts` — Added extensionPaths Map, bundledIds Set, isBundled() method; updated discover()/activate()/remove() to handle bundled extensions
|
|
357
|
-
- `src/cli/commands/ext-cmd.ts` — Added "Source" column to `ppm ext list`, calls discover() to populate bundled info
|
|
358
|
-
- `src/services/extension-rpc-handlers.ts` — Allow git operations in all registered project paths (not just CWD), improved path validation
|
|
359
|
-
- `src/services/extension-host-worker.ts` — Enhanced error logging, localHandlers check, disposed flag fix for polling race conditions
|
|
360
|
-
|
|
361
|
-
- **Type Changes:**
|
|
362
|
-
- New: `Stash` = { index, hash, message }
|
|
363
|
-
- New: `MergeState` = { type: "merge" | "rebase" | "cherry-pick", progress?, message? }
|
|
364
|
-
- New: `Worktree` = { path, branch, head, isMain, isDetached, locked, lockReason?, prunable }
|
|
365
|
-
- Updated: `FileChange.status` now includes "U" for unmerged/conflicted entries (was "A" | "M" | "D" | "R" | "C")
|
|
366
|
-
- Updated: `UncommittedData` now includes `conflicted: FileChange[]` and optional `mergeState: MergeState`
|
|
367
|
-
- Updated: `RepoInfo` now includes `stashes: Stash[]` and `currentBranch: string`
|
|
368
|
-
- Updated: `TabType` now includes "conflict-editor"
|
|
369
|
-
|
|
370
|
-
- **Git State Detection:**
|
|
371
|
-
- Merge state determined by .git sentinel files: MERGE_HEAD (merge), rebase-merge/ (interactive rebase), CHERRY_PICK_HEAD (cherry-pick)
|
|
372
|
-
- Progress tracked: "3/5" format from rebase-merge/msgnum and rebase-merge/end
|
|
373
|
-
- Conflict detection: UU/AA/DD/AU/UA/DU/UD git status codes parsed as unmerged entries
|
|
374
|
-
- Only detects merge state when conflicts exist (perf optimization)
|
|
375
|
-
|
|
376
|
-
- **Conflict Resolution Flow:**
|
|
377
|
-
- User clicks conflicted file → opens conflict-editor tab
|
|
378
|
-
- Component parses conflict markers (<<<<<<, =======, >>>>>>>) from file content
|
|
379
|
-
- Displays visual highlighting + Accept buttons above each conflict region
|
|
380
|
-
- Resolution applies edit via Monaco, saves file automatically, updates conflict counter
|
|
381
|
-
- Conflict count reflects real-time resolution progress
|
|
382
|
-
|
|
383
|
-
- **Security:** Path validation ensures extensions can only operate on registered project paths
|
|
384
|
-
- **Breaking Changes:** None (backward compatible)
|
|
385
|
-
- **Test Coverage:** All changes maintain test suite passing
|
|
386
|
-
|
|
387
|
-
---
|
|
388
|
-
|
|
389
|
-
## [0.9.72] — 2026-04-09
|
|
390
|
-
|
|
391
|
-
### Added
|
|
392
|
-
- **Account Selection Pre-flight Loop** — Intelligent account fallback during token refresh
|
|
393
|
-
- AccountSelector.next() now accepts excludeIds Set to skip previously failed accounts
|
|
394
|
-
- Pre-flight token refresh loop tries all accounts before final failure (was linear before)
|
|
395
|
-
- New AccountSelector.onPreflightFail() method handles preflight failure with 1-5min backoff
|
|
396
|
-
- Status updates streamed to UI as blockquotes during routing/refreshing/switching phases
|
|
397
|
-
- Cumulative penalty: preflight failures counted with rate-limit and auth-error retries
|
|
398
|
-
|
|
399
|
-
### Technical Details
|
|
400
|
-
- **Files Modified:**
|
|
401
|
-
- `src/providers/claude-agent-sdk.ts` — Pre-flight loop with excludeIds exclusion set
|
|
402
|
-
- `src/services/account-selector.service.ts` — excludeIds parameter, onPreflightFail() method
|
|
403
|
-
- `src/types/chat.ts` — New status_update ChatEvent type
|
|
404
|
-
- `src/web/components/chat/message-list.tsx` — Render status_update as blockquote
|
|
405
|
-
- **Type Changes:** status_update event = { type: "status_update", phase: "routing" | "refreshing" | "switching", message, accountLabel? }
|
|
406
|
-
- **Breaking Changes:** None (backward compatible)
|
|
407
|
-
|
|
408
|
-
---
|
|
409
|
-
|
|
410
|
-
## [0.9.11] — 2026-04-07
|
|
411
|
-
|
|
412
|
-
### Added
|
|
413
|
-
- **PPMBot Coordinator Redesign** — Transform from direct AI chat executor to intelligent team leader delegating to subagents
|
|
414
|
-
- Single persistent coordinator session per Telegram chat in `~/.ppm/bot/` workspace
|
|
415
|
-
- Decision framework: Answer directly if no project context needed; delegate for file access, project-specific tasks
|
|
416
|
-
- Delegation via bash: `ppm bot delegate --chat <id> --project <name> --prompt "<enriched>"` creates task
|
|
417
|
-
- Background task poller (5s interval) executes pending tasks in isolation
|
|
418
|
-
- Each task execution: Creates fresh PPM session in target project, runs async generator, captures result summary
|
|
419
|
-
- Abort/timeout handling: AbortController-based task cancellation, 900s default timeout
|
|
420
|
-
- UI: Settings panel displays delegated tasks with auto-refresh
|
|
421
|
-
- CLI expansion: `ppm bot` commands for delegation, project management, session control, status queries
|
|
422
|
-
- Telegram commands reduced: 3 public (/start, /help, /status) + 1 hidden (/restart)
|
|
423
|
-
- Coordinator identity: `~/.ppm/bot/coordinator.md` replaces per-session identity, loaded via XML context block
|
|
424
|
-
- Cross-provider support: Coordinator identity works with any provider (Claude SDK, Cursor, etc.)
|
|
425
|
-
|
|
426
|
-
### Technical Details
|
|
427
|
-
- **Database Migration (v14):**
|
|
428
|
-
- `bot_tasks` — taskId, chatId, projectName, projectPath, prompt, status, resultSummary, resultFull, error, timeoutMs, createdAt, startedAt, completedAt
|
|
429
|
-
- Indexes: `idx_bot_tasks_status`, `idx_bot_tasks_chat` for fast polling + history queries
|
|
430
|
-
- **Files Created:**
|
|
431
|
-
- `src/services/ppmbot/ppmbot-delegation.ts` — executeDelegation() function with task lifecycle management
|
|
432
|
-
- **Files Modified:**
|
|
433
|
-
- `src/services/ppmbot/ppmbot-service.ts` — Task poller loop, lifecycle management (start/stop)
|
|
434
|
-
- `src/services/ppmbot/ppmbot-session.ts` — PPMBotSessionManager with coordinator session cache
|
|
435
|
-
- `src/services/db.service.ts` — Schema v14 migration, bot_tasks CRUD functions
|
|
436
|
-
- `src/cli/commands/bot-cmd.ts` — Expanded with delegation, project, session, status, help commands
|
|
437
|
-
- `src/server/routes/settings.ts` — Bot tasks endpoints for UI refresh
|
|
438
|
-
- `src/web/components/settings/ppmbot-settings-section.tsx` — Delegated tasks panel with auto-refresh
|
|
439
|
-
- **Type Changes:**
|
|
440
|
-
- New: `BotTask`, `BotTaskStatus` ("pending" | "running" | "completed" | "failed" | "timeout")
|
|
441
|
-
- New: `PPMBotCommand` with chatId, messageId, userId
|
|
442
|
-
- **API Changes:** New endpoints for bot task management
|
|
443
|
-
- **Breaking Changes:** None (coordinator coexists with legacy ClawBot; migration transparent)
|
|
444
|
-
|
|
445
|
-
### Key Design Principles
|
|
446
|
-
- **Coordinator per chat** — Single session manages delegation, not direct chat
|
|
447
|
-
- **Project isolation** — Each delegated task spawns fresh isolated session
|
|
448
|
-
- **CLI-driven delegation** — Coordinator calls bash `ppm bot` commands (bash-safe tools only)
|
|
449
|
-
- **Background execution** — Task polling decoupled from message handler
|
|
450
|
-
- **Result capture** — Store both summary (notification) and full output (detailed review)
|
|
451
|
-
|
|
452
|
-
---
|
|
453
|
-
|
|
454
|
-
## [0.9.10] — 2026-04-06
|
|
455
|
-
|
|
456
|
-
### Added
|
|
457
|
-
- **Supervisor Always Alive Feature** — Distinguish between soft stop (server shutdown) and full shutdown (supervisor shutdown)
|
|
458
|
-
- `ppm stop` now performs SOFT STOP: kills server only, supervisor remains alive with Cloud WS + tunnel connectivity
|
|
459
|
-
- `ppm stop --kill` or `ppm down` performs FULL SHUTDOWN: kills everything (old `ppm stop` behavior)
|
|
460
|
-
- Supervisor now has new `stopped` state (in addition to running, paused, upgrading)
|
|
461
|
-
- When stopped, minimal HTML page served on the port (503 status on /api/health)
|
|
462
|
-
- `ppm start` detects existing supervisor and handles resume/upgrade scenarios
|
|
463
|
-
- Autostart now uses `__supervise__` instead of `__serve__` for consistency
|
|
464
|
-
- Cloud WS has new commands: `start`, `shutdown` (stop is now soft stop, separate from shutdown)
|
|
465
|
-
- Supervisor has uncaughtException/unhandledRejection handlers (never crashes)
|
|
466
|
-
- Supervisor logic modularized into 3 files: supervisor.ts (orchestrator), supervisor-state.ts (state machine), supervisor-stopped-page.ts (503 page)
|
|
467
|
-
|
|
468
|
-
### Technical Details
|
|
469
|
-
- **Files Created:**
|
|
470
|
-
- `src/services/supervisor-state.ts` — State machine, IPC command file handling
|
|
471
|
-
- `src/services/supervisor-stopped-page.ts` — Minimal 503 HTML response
|
|
472
|
-
- Enhanced `src/services/supervisor.ts` — Orchestrator with stopped state support
|
|
473
|
-
- **Files Modified:**
|
|
474
|
-
- `src/cli/commands/stop.ts` — Added --kill flag, soft stop default, ppm down alias
|
|
475
|
-
- `src/cli/commands/start.ts` — Resume detection for existing supervisor
|
|
476
|
-
- `src/cli/autostart-generator.ts` — Uses __supervise__ entry point
|
|
477
|
-
- Cloud WS endpoints updated with new commands
|
|
478
|
-
- **Type Changes:** SupervisorState = "running" | "paused" | "stopped" | "upgrading"
|
|
479
|
-
- **API Changes:** GET /api/health returns 503 when server stopped (supervisor still running)
|
|
480
|
-
- **Breaking Changes:** None (backward compatible, graceful fallback)
|
|
481
|
-
|
|
482
|
-
---
|
|
483
|
-
|
|
484
|
-
## [0.9.10] — 2026-04-06
|
|
485
|
-
|
|
486
|
-
### Added
|
|
487
|
-
- **ClawBot Telegram Integration** — Telegram bot service layer for AI-powered messaging
|
|
488
|
-
- Telegram long-polling: receive messages via polling (no webhooks needed for self-hosted)
|
|
489
|
-
- Session routing: chatID → PPM session mapping with per-user thread isolation
|
|
490
|
-
- Memory system: SQLite FTS5 for persistent conversation history + recall with decay/supersede
|
|
491
|
-
- Response streaming: ChatEvent → progressive Telegram message editing (1s throttle)
|
|
492
|
-
- Message formatting: Markdown → Telegram HTML with 4096-character chunking
|
|
493
|
-
- Pairing system: Code-based device pairing for security (owner approves in web UI)
|
|
494
|
-
- Message queue: Handle concurrent Telegram messages without race conditions
|
|
495
|
-
- Settings UI: Enable/disable, paired devices, default project, system prompt, display toggles, debounce config
|
|
496
|
-
- Chat history: [Claw] prefix sessions with robot icon for easy identification
|
|
497
|
-
- Cross-project memory: Auto-detect project name mentions → include that project's memories in context
|
|
498
|
-
|
|
499
|
-
### Technical Details
|
|
500
|
-
- **Database Migration (v13):**
|
|
501
|
-
- `clawbot_sessions` — chatID, sessionID, pairedAt, lastUsed
|
|
502
|
-
- `clawbot_memories` — sessionID, content, role, created, decay_factor (FTS5)
|
|
503
|
-
- `clawbot_paired_chats` — chatID, pairingCode, approvedAt, approvedBy
|
|
504
|
-
- **Files Created:**
|
|
505
|
-
- `src/services/clawbot/clawbot.service.ts` — Main orchestrator
|
|
506
|
-
- `src/services/clawbot/clawbot-telegram.ts` — Telegram API polling
|
|
507
|
-
- `src/services/clawbot/clawbot-session.ts` — Session mapping
|
|
508
|
-
- `src/services/clawbot/clawbot-memory.ts` — FTS5 memory CRUD + hybrid extraction (AI + regex)
|
|
509
|
-
- `src/services/clawbot/clawbot-formatter.ts` — Markdown → Telegram HTML
|
|
510
|
-
- `src/services/clawbot/clawbot-streamer.ts` — ChatEvent → progressive message edits
|
|
511
|
-
- `src/types/clawbot.ts` — Type definitions
|
|
512
|
-
- `src/web/components/settings/clawbot-settings-section.tsx` — Settings UI
|
|
513
|
-
- **Files Modified:**
|
|
514
|
-
- `src/services/db.service.ts` — Schema v13 migration
|
|
515
|
-
- `src/types/config.ts` — ClawBotConfig interface
|
|
516
|
-
- `src/server/index.ts` — ClawBot poller startup
|
|
517
|
-
- `src/server/routes/settings.ts` — ClawBot settings endpoints (GET/PUT)
|
|
518
|
-
- `src/web/components/settings/settings-tab.tsx` — ClawBot category
|
|
519
|
-
- `src/web/components/chat/chat-history-bar.tsx` — [Claw] prefix + icon tagging
|
|
520
|
-
|
|
521
|
-
### Key Design Principles
|
|
522
|
-
- **Long-polling over webhooks** — Simpler self-hosted setup, no public URL required
|
|
523
|
-
- **bypassPermissions by default** — Headless bot, no manual tool approvals needed
|
|
524
|
-
- **Hybrid memory extraction** — AI extraction (primary) + regex fallback (fallback)
|
|
525
|
-
- **Progressive message editing** — 1s throttle balances UX with Telegram rate limits
|
|
526
|
-
- **Message debouncing** — 2s default, configurable per session
|
|
527
|
-
- **Pairing-based security** — Replace allowlists with owner-approved pairing codes
|
|
528
|
-
|
|
529
|
-
---
|
|
530
|
-
|
|
531
|
-
## [0.9.9] — 2026-04-04
|
|
532
|
-
|
|
533
|
-
### Added
|
|
534
|
-
- **Agent Teams (experimental)** — Toggle in Settings > AI to enable multi-agent collaboration
|
|
535
|
-
- Passes `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1` to SDK subprocess when enabled
|
|
536
|
-
- Adds `TeamCreate`, `TeamDelete`, `SendMessage`, `TaskCreate`, `TaskUpdate`, `TaskList`, `TaskGet` to allowed tools
|
|
537
|
-
- Switch UI with warning about experimental status and ~7x token cost
|
|
538
|
-
- Default: off. Requires Claude Code v2.1.32+
|
|
539
|
-
- **Agent Team UI — Real-time Monitoring** — Visual collaboration dashboard for active teams
|
|
540
|
-
- Backend: REST endpoints (`GET /api/teams`, `GET /api/teams/:name`, `DELETE /api/teams/:name`) + fs.watch inbox monitor via chat WebSocket
|
|
541
|
-
- Real-time inbox events: `team_detected`, `team_inbox`, `team_updated` streamed to chat clients
|
|
542
|
-
- Frontend: Team activity button on chat input (Users icon with unread pulse dot)
|
|
543
|
-
- Desktop popover / Mobile drawer showing members (with status badges) + message timeline
|
|
544
|
-
- Settings UI: Team list in AI Settings with delete confirmation (only for inactive teams)
|
|
545
|
-
- Architecture: Type-safe types (`src/types/team.ts`), extracted team-inbox-watcher module, zero new type errors
|
|
546
|
-
- Mobile-first: Responsive popover/drawer, touch-friendly delete actions
|
|
547
|
-
|
|
548
|
-
---
|
|
549
|
-
|
|
550
|
-
## [0.9.2] — 2026-04-04
|
|
551
|
-
|
|
552
|
-
### Added
|
|
553
|
-
- **File Download Feature** — Single-file and folder-as-zip downloads with short-lived tokens
|
|
554
|
-
- Download tokens: one-time, 30s TTL, non-reusable
|
|
555
|
-
- 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
|
|
556
|
-
- Frontend: Download context menu in file tree, download button in editor toolbar
|
|
557
|
-
- Security: Tokens scoped to download paths only, path traversal protection maintained
|
|
558
|
-
- Performance: Streaming via Bun.file() and archiver, no RAM buffering for large files
|
|
559
|
-
- Testing: 30 integration tests covering auth, streaming, path traversal, zip integrity
|
|
560
|
-
|
|
561
|
-
### Technical Details
|
|
562
|
-
- **Files Created:**
|
|
563
|
-
- `src/services/download-token.service.ts` — In-memory token store with TTL cleanup
|
|
564
|
-
- `src/server/routes/file-download.ts` — Download endpoints (token + zip)
|
|
565
|
-
- `src/web/lib/file-download.ts` — Download utilities (single file + folder)
|
|
566
|
-
- `tests/integration/file-download.test.ts` — Integration tests
|
|
567
|
-
- **Files Modified:**
|
|
568
|
-
- `src/server/middleware/auth.ts` — Added dl_token fallback for downloads
|
|
569
|
-
- `src/server/routes/files.ts` — Added ?download=true mode
|
|
570
|
-
- `src/server/routes/project-scoped.ts` — Registered download routes
|
|
571
|
-
- `src/web/components/explorer/file-tree.tsx` — Added download context menu item
|
|
572
|
-
- `src/web/components/editor/editor-toolbar.tsx` — Added download button
|
|
573
|
-
- `src/web/components/editor/code-editor.tsx` — Passed filePath/projectName to toolbar
|
|
574
|
-
- `src/server/helpers/error-status.ts` — Extracted shared error helper
|
|
575
|
-
- **Dependencies:**
|
|
576
|
-
- `archiver` — Streaming zip library (well-maintained, ~500KB)
|
|
577
|
-
|
|
578
|
-
---
|
|
579
|
-
|
|
580
|
-
## [0.9.0] — 2026-04-03
|
|
581
|
-
|
|
582
|
-
### Added
|
|
583
|
-
- **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
|
|
584
|
-
- **Multi-Provider AI** — ProviderInterface, CliProvider base, CursorCliProvider with NDJSON streaming, provider selector UI
|
|
585
|
-
- **MCP Server Management** — REST API CRUD, SQLite storage, Settings UI, auto-import from ~/.claude.json, SDK integration
|
|
586
|
-
- **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
|
|
587
|
-
|
|
588
|
-
### Technical Details
|
|
589
|
-
- Extension architecture: npm packages isolated in Bun Workers, communicate via RPC, manifest-driven contribution points (commands, views, menus, configuration)
|
|
590
|
-
- Multi-provider: Tier 1 (Claude Agent SDK, full agentic), Tier 2 (Cursor CLI, agentic via own tool system)
|
|
591
|
-
- MCP: Servers passed to SDK as `mcpServers`, tools auto-allowed via `mcp__*` wildcard
|
|
592
|
-
|
|
593
|
-
---
|
|
594
|
-
|
|
595
|
-
## [0.8.77] — 2026-04-01
|
|
596
|
-
|
|
597
|
-
### Added
|
|
598
|
-
- **Deterministic Tab URLs + Backend Workspace Sync**
|
|
599
|
-
- Tab IDs now deterministic ({type}:{identifier}) instead of random (tab-xxxx)
|
|
600
|
-
- URL format changed: `/project/{name}/{tabType}/{identifier}` (e.g., `/project/ppm/editor/src/index.ts`)
|
|
601
|
-
- New `workspace_state` database table (schema v10) persists tab layout per project
|
|
602
|
-
- GET/PUT `/api/project/:name/workspace` endpoints for server-side persistence
|
|
603
|
-
- Frontend syncs workspace layout to server with 1.5s debounce
|
|
604
|
-
- Deep linking from URL auto-creates tabs if missing
|
|
605
|
-
- Latest-wins conflict resolution: server timestamp > client localStorage
|
|
606
|
-
- Tab ID patterns standardized: `editor:path`, `chat:provider/sessionId`, `terminal:index`, etc.
|
|
607
|
-
- Migration from random IDs to deterministic IDs on first load
|
|
608
|
-
|
|
609
|
-
### Technical Details
|
|
610
|
-
- **Files Created:**
|
|
611
|
-
- `src/server/routes/workspace.ts` — Workspace GET/PUT endpoints
|
|
612
|
-
- `src/web/hooks/use-workspace-sync.ts` — Server sync orchestration with debounce
|
|
613
|
-
- **Files Modified:**
|
|
614
|
-
- `src/services/db.service.ts` — Added workspace_state table (schema v10), helper functions
|
|
615
|
-
- `src/web/stores/panel-utils.ts` — Deterministic tab ID derivation logic
|
|
616
|
-
- `src/web/hooks/use-url-sync.ts` — URL parsing/building with new format
|
|
617
|
-
- `src/web/stores/panel-store.ts` — Load workspace from server on project switch
|
|
618
|
-
- `src/web/stores/tab-store.ts` — Tab interface updated with metadata
|
|
619
|
-
- **Breaking Changes:** URLs changed; old `/project/{name}/tab/{id}` URLs redirected or ignored (fallback to project root)
|
|
620
|
-
- **Migration:** Client-side: old random tab IDs migrated to deterministic format on first load
|
|
621
|
-
|
|
622
|
-
### Benefits
|
|
623
|
-
- **Shareable deep links** — URLs point to specific files/chats (e.g., `/project/ppm/editor/src/index.ts`)
|
|
624
|
-
- **Cross-device persistence** — Workspace layout saved on server, restored on any device
|
|
625
|
-
- **URL-driven navigation** — Paste URL to recreate workspace state
|
|
626
|
-
- **Conflict-free sync** — Latest timestamp wins; no manual merge dialogs
|
|
627
|
-
|
|
628
|
-
---
|
|
629
|
-
|
|
630
|
-
## [0.8.63] — 2026-03-28
|
|
631
|
-
|
|
632
|
-
### Added
|
|
633
|
-
- **MCP Server Management** — Configure Model Context Protocol servers via Settings UI
|
|
634
|
-
- REST API: GET/POST/PUT/DELETE `/api/settings/mcp`, plus import endpoints
|
|
635
|
-
- Storage: SQLite `mcp_servers` table (name, transport, config JSON)
|
|
636
|
-
- UI: Settings tab with server list, add/edit dialog, delete action
|
|
637
|
-
- Auto-import: Reads `~/.claude.json` on first access (skips existing/invalid)
|
|
638
|
-
- Validation: Name (alphanumeric, max 50 chars) + transport-specific config checks
|
|
639
|
-
- SDK integration: Servers passed to `query()` as `mcpServers`, tools auto-allowed via `mcp__*` wildcard
|
|
640
|
-
|
|
641
|
-
### Technical Details
|
|
642
|
-
- **Files Created:**
|
|
643
|
-
- `src/types/mcp.ts` — McpServerConfig types, validation functions
|
|
644
|
-
- `src/services/mcp-config.service.ts` — CRUD service + bulk import
|
|
645
|
-
- `src/server/routes/mcp.ts` — REST API endpoints
|
|
646
|
-
- `src/web/lib/api-mcp.ts` — Frontend API client
|
|
647
|
-
- `src/web/components/settings/mcp-settings-section.tsx` — Settings UI
|
|
648
|
-
- `src/web/components/settings/mcp-server-dialog.tsx` — Add/Edit dialog
|
|
649
|
-
- **Files Modified:**
|
|
650
|
-
- `src/services/db.service.ts` — Schema v8 migration (mcp_servers table)
|
|
651
|
-
- `src/server/index.ts` — Route registration
|
|
652
|
-
- `src/providers/claude-agent-sdk.ts` — mcpServers + mcp__* allowedTools
|
|
653
|
-
- `src/web/components/settings/settings-tab.tsx` — MCP category added
|
|
654
|
-
|
|
655
|
-
---
|
|
656
|
-
|
|
657
|
-
## [0.8.62] — 2026-03-26
|
|
658
|
-
|
|
659
|
-
### Added
|
|
660
|
-
- **Cmd+Shift+V shortcut** — Command palette entry for voice input
|
|
661
|
-
- **Voice input** — Web Speech API integration for chat
|
|
662
|
-
|
|
663
|
-
---
|
|
664
|
-
|
|
665
|
-
## [0.8.61] — 2026-03-26 (Beta)
|
|
666
|
-
|
|
667
|
-
### Added
|
|
668
|
-
- **Multi-Provider Architecture** — Generic AI provider system supporting Claude (SDK-based) and CLI-spawning providers
|
|
669
|
-
- `AIProvider` interface with optional capability methods (`abortQuery?`, `getMessages?`, `listSessionsByDir?`)
|
|
670
|
-
- `CliProvider` abstract base class for CLI-spawning providers (Cursor, Codex, Gemini)
|
|
671
|
-
- `CursorCliProvider` implementation — spawns `cursor-agent` with NDJSON streaming
|
|
672
|
-
- NDJSON line parser utility for TCP packet boundary handling
|
|
673
|
-
- Cursor event mapper — normalizes Cursor NDJSON → standard ChatEvent union
|
|
674
|
-
- Cursor history reader — loads sessions from `~/.cursor/chats/` SQLite DAG
|
|
675
|
-
- Provider selector UI component — users can choose provider when creating chat
|
|
676
|
-
- Async provider bootstrap — checks binary availability, registers only if available
|
|
677
|
-
- Workspace trust auto-retry — detects trust prompts, retries with `--trust` flag
|
|
678
|
-
- Process lifecycle management — SIGTERM → SIGKILL escalation, orphan cleanup
|
|
679
|
-
|
|
680
|
-
### Technical Details
|
|
681
|
-
- **Files Created:**
|
|
682
|
-
- `src/utils/ndjson-line-parser.ts` — NDJSON streaming parser
|
|
683
|
-
- `src/providers/cli-provider-base.ts` — Abstract CliProvider base class
|
|
684
|
-
- `src/providers/cursor-cli/cursor-provider.ts` — CursorCliProvider
|
|
685
|
-
- `src/providers/cursor-cli/cursor-event-mapper.ts` — Event mapping
|
|
686
|
-
- `src/providers/cursor-cli/cursor-history.ts` — SQLite history reader
|
|
687
|
-
- `src/web/components/chat/provider-selector.tsx` — Provider selection UI
|
|
688
|
-
- `tests/unit/ndjson-line-parser.test.ts` — Parser tests
|
|
689
|
-
- `tests/unit/cursor-event-mapper.test.ts` — Mapper tests
|
|
690
|
-
- `tests/integration/cursor-provider.test.ts` — Integration tests
|
|
691
|
-
- `tests/integration/chat-service-multi-provider.test.ts` — Service tests
|
|
692
|
-
- **Files Modified:**
|
|
693
|
-
- `src/types/chat.ts` — Added optional capability methods to AIProvider, added `system` event type
|
|
694
|
-
- `src/types/config.ts` — Added `"cli"` type, `cli_command` field to AIProviderConfig
|
|
695
|
-
- `src/providers/registry.ts` — Added async `bootstrapProviders()` for conditional registration
|
|
696
|
-
- `src/server/ws/chat.ts` — Removed `as any` casts, use optional chaining for capabilities
|
|
697
|
-
- `src/services/chat.service.ts` — Use optional methods instead of duck-typing
|
|
698
|
-
- `src/web/components/chat/session-picker.tsx` — Integrated provider selector
|
|
699
|
-
- **Breaking Changes:** None (backward compatible, all tests passing)
|
|
700
|
-
- **Architecture:** All phases complete (6/6), 555 tests passing
|
|
701
|
-
|
|
702
|
-
### Benefits
|
|
703
|
-
- Extensible foundation for Codex, Gemini, and future providers (~100-150 lines each)
|
|
704
|
-
- No more `as any` casts for provider methods — type-safe optional capability pattern
|
|
705
|
-
- CLI providers can override session history reading (e.g., Cursor SQLite DAG)
|
|
706
|
-
- Graceful degradation — missing CLI binary doesn't crash, logs info, skips provider
|
|
707
|
-
|
|
708
|
-
---
|
|
709
|
-
|
|
710
|
-
## [0.8.55] — 2026-03-26
|
|
711
|
-
|
|
712
|
-
### Added
|
|
713
|
-
- **Streaming Input Migration** — Persistent AsyncGenerator session model for chat
|
|
714
|
-
- Provider maintains long-lived streaming input per session (not per message)
|
|
715
|
-
- Follow-up messages push into existing generator instead of abort-and-replace
|
|
716
|
-
- Single streaming loop decoupled from WebSocket message handler
|
|
717
|
-
- Message priority support (`now`/`next`/`later`) for intelligent message ordering
|
|
718
|
-
- Image attachment support in message sending
|
|
719
|
-
- Session state persistence across FE disconnections (5-minute cleanup timeout)
|
|
720
|
-
- Event buffering on reconnect: clients receive buffered turn events after reconnection
|
|
721
|
-
- Phase transitions: `idle` → `initializing` → `connecting` → `thinking`/`streaming` → `idle`
|
|
722
|
-
|
|
723
|
-
### Technical Details
|
|
724
|
-
- **Provider Layer** (`src/providers/claude-agent-sdk.ts`): Maintains streaming session per sessionId
|
|
725
|
-
- **WebSocket Handler** (`src/server/ws/chat.ts`):
|
|
726
|
-
- `runStreamLoop()` executes independently (detached from WS scope)
|
|
727
|
-
- `activeSessions` map persists session state across FE disconnections
|
|
728
|
-
- `startSessionConsumer()` pattern replaces per-message `runStreamLoop()` calls
|
|
729
|
-
- Event buffering (turnEvents array, max 10k events) for reconnect sync
|
|
730
|
-
- Per-client ping intervals (15s keepalive)
|
|
731
|
-
- **Types** (`src/types/api.ts`, `src/types/chat.ts`):
|
|
732
|
-
- `ChatWsClientMessage` extended with `priority?: string` and optional `images`
|
|
733
|
-
- `SessionPhase` = "initializing" | "connecting" | "thinking" | "streaming" | "idle"
|
|
734
|
-
- `SessionEntry` tracks clients, abort handle, phase, pending approvals, buffered events
|
|
735
|
-
- **Frontend** (`src/web/components/chat/message-input.tsx`): PriorityToggle component (visible during streaming)
|
|
736
|
-
- **Benefits**:
|
|
737
|
-
- No SDK subprocess restarts between messages (faster context preservation)
|
|
738
|
-
- Tool approvals integrated into streaming (no query restart)
|
|
739
|
-
- Message buffering prevents loss on FE reconnection
|
|
740
|
-
- Cleaner architecture: BE owns Claude connection, FE disconnect ≠ abort
|
|
741
|
-
|
|
742
|
-
---
|
|
743
|
-
|
|
744
|
-
## [0.8.54] — 2026-03-25
|
|
745
|
-
|
|
746
|
-
### Added
|
|
747
|
-
- **Auto-upgrade feature** — Full implementation with supervisor, API, CLI, and UI components
|
|
748
|
-
- Supervisor checks npm registry every 15 minutes for new versions
|
|
749
|
-
- UI banner displays when new version available with one-click upgrade button
|
|
750
|
-
- `ppm upgrade` CLI command for headless systems (with `--check` flag to preview)
|
|
751
|
-
- Self-replace mechanism: supervisor spawns new supervisor from updated code, waits for health, then exits old
|
|
752
|
-
- Self-replace eliminates OS autostart dependency — upgrade works even on headless/containerized systems
|
|
753
|
-
- GET `/api/upgrade/status` returns current version, available version, install method (npm/bun/binary)
|
|
754
|
-
- POST `/api/upgrade/apply` installs new version and signals supervisor for restart
|
|
755
|
-
- Compiled binary installs gracefully rejected with clear message (future: GitHub releases support)
|
|
756
|
-
- Config option: `autoUpgrade` setting (default: true) allows opt-out
|
|
757
|
-
- All upgrade routes require authentication
|
|
758
|
-
|
|
759
|
-
### Technical Details
|
|
760
|
-
- **Services**: `src/services/upgrade.service.ts` handles version checking, semver comparison, install method detection, and installation
|
|
761
|
-
- **Supervisor**: Enhanced with 15-minute version check timer, available version tracking in status.json, SIGUSR1-triggered self-replace
|
|
762
|
-
- **API Routes**: `src/server/routes/upgrade.ts` with status and apply endpoints
|
|
763
|
-
- **CLI**: `src/cli/commands/upgrade.ts` with interactive upgrade and check-only mode
|
|
764
|
-
- **UI**: `src/web/components/layout/upgrade-banner.tsx` fixed-position banner with dismiss/upgrade buttons, polling every 60s
|
|
765
|
-
- Install method detection: `isCompiledBinary()` → binary, `process.execPath.includes("bun")` → bun, else → npm
|
|
766
|
-
- Semver comparison: lightweight string split (no external lib)
|
|
767
|
-
- Self-replace implementation: saves `process.argv`, spawns new supervisor, polls status.json for new PID, waits up to 30s
|
|
768
|
-
|
|
769
|
-
---
|
|
770
|
-
|
|
771
|
-
## [0.8.53] — 2026-03-18
|
|
772
|
-
|
|
773
|
-
### Fixed
|
|
774
|
-
- Keybindings: prevent command palette false trigger during IME composition
|
|
775
|
-
|
|
776
|
-
---
|
|
777
|
-
|
|
778
|
-
## [0.8.52] — 2026-03-15
|
|
779
|
-
|
|
780
|
-
### Added
|
|
781
|
-
- Process supervisor with auto-restart and tunnel resilience
|
|
782
|
-
- Supervisor spawns and monitors server + tunnel processes
|
|
783
|
-
- Auto-restart on crash with exponential backoff
|
|
784
|
-
- Health checks every 30 seconds
|
|
785
|
-
- Cloudflare tunnel auto-reconnect on failure
|
|
786
|
-
- Status file (~/.ppm/status.json) tracks PID, port, URL
|
|
787
|
-
|
|
788
|
-
---
|
|
789
|
-
|
|
790
|
-
## [0.7.x — v0.8.52] — Prior Releases
|
|
791
|
-
|
|
792
|
-
Multi-account credential management, usage tracking, mobile UX optimization, Cloudflare tunnel integration, push notifications, terminal output streaming.
|
|
793
|
-
|
|
794
|
-
---
|
|
795
|
-
|
|
796
|
-
## Categories
|
|
797
|
-
|
|
798
|
-
- **Added** — New features
|
|
799
|
-
- **Fixed** — Bug fixes
|
|
800
|
-
- **Changed** — Behavioral changes
|
|
801
|
-
- **Deprecated** — Features marked for removal
|
|
802
|
-
- **Removed** — Removed features
|
|
803
|
-
- **Security** — Security vulnerability fixes
|
|
804
|
-
|
|
805
|
-
---
|
|
806
|
-
|
|
807
|
-
## Version Scheme
|
|
808
|
-
|
|
809
|
-
PPM uses semantic versioning: MAJOR.MINOR.PATCH
|
|
810
|
-
|
|
811
|
-
- MAJOR: Breaking changes to API/CLI/config format
|
|
812
|
-
- MINOR: New features (backward compatible)
|
|
813
|
-
- PATCH: Bug fixes and small improvements
|
|
20
|
+
| Question | Source |
|
|
21
|
+
|---|---|
|
|
22
|
+
| What changed in a release? | [`CHANGELOG.md`](../CHANGELOG.md) |
|
|
23
|
+
| What is shipped vs still open? | [`project-roadmap.md`](project-roadmap.md) |
|
|
24
|
+
| Why was something built this way? | [`project-overview-pdr.md`](project-overview-pdr.md) |
|
|
25
|
+
| What trap already cost us time? | [`lessons-learned.md`](lessons-learned.md) |
|